From 7f11e6b295c81bef480ba9dfecfd896cb4e69dbf Mon Sep 17 00:00:00 2001 From: Amira Abdel-Rahman <aabdelrahman@gsd.harvard.edu> Date: Wed, 26 Jun 2019 13:30:46 -0400 Subject: [PATCH] parametric and tree order search together --- cpp_frep/frep.cpp | 3 +- cpp_frep/frep_tree.cpp | 298 +++++++++++++++++------------------------ cpp_frep/main.cpp | 126 +++++++++++------ cpp_frep/nelder_mead.h | 8 +- 4 files changed, 211 insertions(+), 224 deletions(-) diff --git a/cpp_frep/frep.cpp b/cpp_frep/frep.cpp index 5d3657c..29d8077 100755 --- a/cpp_frep/frep.cpp +++ b/cpp_frep/frep.cpp @@ -350,7 +350,8 @@ namespace cpp_frep { return (weight*shape1->eval()+(1-weight)*shape2->eval()); } - std::string to_string_with_precision(const scalar a_value, const int n = 3){ + std::string to_string_with_precision(const scalar a_value, const int n = 2) + { std::ostringstream out; out.precision(n); out << std::fixed << a_value; diff --git a/cpp_frep/frep_tree.cpp b/cpp_frep/frep_tree.cpp index 051c796..e34901f 100644 --- a/cpp_frep/frep_tree.cpp +++ b/cpp_frep/frep_tree.cpp @@ -7,20 +7,25 @@ namespace cpp_frep { using scalar=float; class Frep_tree { public: + bool parametric=false; + Frep_tree(){ X=0.0f; Y=0.0f; }; - Frep_tree(std::vector<std::vector<scalar>> genome_,bool smooth_) { + Frep_tree(std::vector<std::vector<scalar>> genome_,bool smooth_,bool parametric_,scalar bound_) { X=0.0f; Y=0.0f; - updateGenome( genome_, smooth_); - }; - void updateGenome(std::vector<std::vector<scalar>> genome_,bool smooth_){ - smooth=smooth_; + parametric=parametric_; + bound=bound_; + + updateGenome( genome_); + }; + + void updateGenome(std::vector<std::vector<scalar>> genome_){ counterAdd =0; counterSubtract =0; @@ -39,7 +44,6 @@ namespace cpp_frep { constraintGenome(); addPrimitives(); - smooth=smooth_; if(!smooth){ parseTree(); @@ -75,23 +79,40 @@ namespace cpp_frep { return genome.size()-numPrimitives;//numPrimitives number of primitives } + int dimensions(){ + + int n=3; + if(parametric)n=5; + + return numNodes()*n; + } + void printGenome(){ - for (int i =0; i<genome.size()-numPrimitives;++i){ - std::cout<< genome[i][0]<<","<<genome[i][1]<<","<<genome[i][2]<<" "; - } + // for (unsigned int i =0; i<genome.size()-numPrimitives;++i){ + // if(parametric)std::cout<< genome[i][0]<<","<<genome[i][1]<<","<<genome[i][2]<<","<<genome[i][3]<<","<<genome[i][4]<<" "; + // else std::cout<< genome[i][0]<<","<<genome[i][1]<<","<<genome[i][2]<<" "; + // } + std::cout<<getPrintedGenome(); std::cout<<"\n"; } std::string getPrintedGenome(){ - - std::string g="Genome: "; - for (int i =0; i<genome.size()-numPrimitives;++i){ - g+=to_string_with_precision(genome[i][0],2); + int n=2; + if (parametric) n=1; + std::string g=""; + for (unsigned int i =0; i<genome.size()-numPrimitives;++i){ + g+=to_string_with_precision(genome[i][0],n); g+="/"; - g+=to_string_with_precision(genome[i][1],2); + g+=to_string_with_precision(genome[i][1],n); g+="/"; - g+=to_string_with_precision(genome[i][2],2); + g+=to_string_with_precision(genome[i][2],n); + if(parametric){ + g+="/"; + g+=to_string_with_precision(genome[i][3],n); + g+="/"; + g+=to_string_with_precision(genome[i][4],n); + } g+=" "; } return g; @@ -99,7 +120,7 @@ namespace cpp_frep { } std::string getPrintedFrep(){ - std::string f="Frep: "+parsedTree->getPrintedName(); + std::string f=""+parsedTree->getPrintedName(); return f; } @@ -114,8 +135,9 @@ namespace cpp_frep { scalar X; scalar Y; Frep* parsedTree; - scalar nodeLength=12.0f; + const scalar nodeLength=12.0f; + static const int numPrimitives=2; static const int storageSpace=20; Add ArrayAdd [storageSpace]; @@ -144,14 +166,20 @@ namespace cpp_frep { int counterCircle =0; int counterRectangle =0; - int numPrimitives=2; bool smooth=false; + scalar bound=3.0f; + void addPrimitives(){ + //TODO: PARAMETERS FOR PRIMITIVES + //TODO: TRIANGLES? OTHER PRIMITIVES std::vector<scalar> g,g1; g.push_back(10.0f/nodeLength); + // g.push_back(10.0f/nodeLength); g1.push_back(11.0f/nodeLength); + // g1.push_back(11.0f/nodeLength); + // g1.push_back(11.0f/nodeLength); genome.push_back(g); genome.push_back(g1); maxLength=genome.size(); @@ -159,8 +187,7 @@ namespace cpp_frep { void parseTree(){ printGenome(); - parsedTree=getNode(0); - // parsedTree=morphNodes(0); + parsedTree=getNode(0,0); std::cout<<"\n"; parsedTree->printName(); std::cout<<"\n"; @@ -168,147 +195,12 @@ namespace cpp_frep { void parseTreeSmooth(){ printGenome(); - // parsedTree=getNode(0); parsedTree=morphNodes(0); std::cout<<"\n"; parsedTree->printName(); std::cout<<"\n"; } - Frep* getNode(int index){ - - int nodeIndex=(int)(genome[index][0]*nodeLength); - int shape1Index,shape2Index,shapeIndex; - shape1Index=index+(int)ceilf(genome[index][1]* (maxLength-1-index)); - shape2Index=index+(int)ceilf(genome[index][2]* (maxLength-1-index)); - shapeIndex =index+(int)ceilf(genome[index][1]* (maxLength-1-index)); - - //0 add, 1 subtract, 2 intersect, 3 morph, 4 translate, 5 scale, 6 rotate, 7 linearArrayX, 8 linearArrayX, 9 polar array - //TODO: Add parameters - switch (nodeIndex) - { - case 0: { - // Add f; - int n=counterAdd; - std::cout<<"Add("; - counterAdd++; - ArrayAdd[n].setShape1(getNode(shape1Index)); - std::cout<<","; - ArrayAdd[n].setShape2(getNode(shape2Index)); - std::cout<<")"; - return &ArrayAdd[n]; - } - case 1: { - - // Subtract f; - int n=counterSubtract; - std::cout<<"Subtract("; - counterSubtract++; - ArraySubtract[n].setShape1(getNode(shape1Index)); - std::cout<<","; - ArraySubtract[n].setShape2(getNode(shape2Index)); - std::cout<<")"; - return &ArraySubtract[n]; - } - case 2: { - // Intersect f; - int n=counterIntersect; - std::cout<<"Intersect("; - counterIntersect++; - ArrayIntersect[n].setShape1(getNode(shape1Index)); - std::cout<<","; - ArrayIntersect[n].setShape2(getNode(shape2Index)); - std::cout<<")"; - return &ArrayIntersect[n]; - } - case 3: { - // Morph f; - int n=counterMorph; - std::cout<<"Morph("; - counterMorph++; - ArrayMorph[n].setShape1(getNode(shape1Index)); - std::cout<<","; - ArrayMorph[n].setShape2(getNode(shape2Index)); - std::cout<<")"; - return &ArrayMorph[n]; - } - case 4: { - // Translate f; - int n=counterTranslate; - std::cout<<"Translate("; - counterTranslate++; - ArrayTranslate[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayTranslate[n]; - } - case 5: { - // Scale f; - int n=counterScale; - std::cout<<"Scale("; - counterScale++; - ArrayScale[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayScale[n]; - } - case 6: { - //Rotate f; - int n=counterRotate; - std::cout<<"Rotate("; - counterRotate++; - ArrayRotate[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayRotate[n]; - } - case 7: { - // LinearArrayX f; - int n=counterLinearArrayX; - std::cout<<"LinearArrayX("; - counterLinearArrayX++; - ArrayLinearArrayX[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayLinearArrayX[n]; - } - case 8: { - // LinearArrayY f; - int n=counterLinearArrayY; - std::cout<<"LinearArrayY("; - counterLinearArrayY++; - ArrayLinearArrayY[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayLinearArrayY[n]; - } - case 9: { - // PolarArray f; - int n=counterPolarArray; - std::cout<<"PolarArray("; - counterPolarArray++; - ArrayPolarArray[n].setShape(getNode(shapeIndex)); - std::cout<<")"; - return &ArrayPolarArray[n]; - } - case 10: { - // Circle f(1.0f,0.0f,0.0f); - int n=counterCircle; - counterCircle++; - std::cout<<"Circle"; - return &ArrayCircle[n]; - } - case 11: { - // Rectangle f(-1.0f,1.0f,-1.0f,1.0f); - int n=counterRectangle; - counterRectangle++; - std::cout<<"Rectangle"; - return &ArrayRectangle[n]; - } - default: { - int n=counterRectangle; - counterRectangle++; - std::cout<<"REECCC"; - return &ArrayRectangle[n]; - } - } - } - Frep* morphNodes(int index){ int nodeIndex1,nodeIndex2; @@ -321,9 +213,9 @@ namespace cpp_frep { ArrayMorph[n].weight=1.0f-weight; std::cout<<"Morph("; counterMorph++; - ArrayMorph[n].setShape1(getNodeSmooth( index ,nodeIndex1)); + ArrayMorph[n].setShape1(getNode( index ,nodeIndex1)); std::cout<<","; - ArrayMorph[n].setShape2(getNodeSmooth( index ,nodeIndex2)); + ArrayMorph[n].setShape2(getNode( index ,nodeIndex2)); std::cout<<","<<1.0f-weight<<")"; return &ArrayMorph[n]; @@ -331,7 +223,9 @@ namespace cpp_frep { } - Frep* getNodeSmooth(int index, int nodeIndex){ + Frep* getNode(int index, int nodeIndex){ + + if(!smooth) nodeIndex=(int)(genome[index][0]*nodeLength); int shape1Index,shape2Index,shapeIndex; shape1Index=index+(int)ceilf(genome[index][1]* (maxLength-1-index)); @@ -339,7 +233,6 @@ namespace cpp_frep { shapeIndex =index+(int)ceilf(genome[index][1]* (maxLength-1-index)); //0 add, 1 subtract, 2 intersect, 3 morph, 4 translate, 5 scale, 6 rotate, 7 linearArrayX, 8 linearArrayX, 9 polar array - //TODO: Add parameters switch (nodeIndex) { case 0: { @@ -347,9 +240,11 @@ namespace cpp_frep { int n=counterAdd; std::cout<<"Add("; counterAdd++; - ArrayAdd[n].setShape1(morphNodes(shape1Index)); + if (smooth) ArrayAdd[n].setShape1(morphNodes(shape1Index)); + else ArrayAdd[n].setShape1(getNode(shape1Index,0)); std::cout<<","; - ArrayAdd[n].setShape2(morphNodes(shape2Index)); + if (smooth) ArrayAdd[n].setShape2(morphNodes(shape2Index)); + else ArrayAdd[n].setShape2(getNode(shape2Index,0)); std::cout<<")"; return &ArrayAdd[n]; } @@ -359,9 +254,11 @@ namespace cpp_frep { int n=counterSubtract; std::cout<<"Subtract("; counterSubtract++; - ArraySubtract[n].setShape1(morphNodes(shape1Index)); + if (smooth) ArraySubtract[n].setShape1(morphNodes(shape1Index)); + else ArraySubtract[n].setShape1(getNode(shape1Index,0)); std::cout<<","; - ArraySubtract[n].setShape2(morphNodes(shape2Index)); + if (smooth) ArraySubtract[n].setShape2(morphNodes(shape2Index)); + else ArraySubtract[n].setShape2(getNode(shape2Index,0)); std::cout<<")"; return &ArraySubtract[n]; } @@ -370,9 +267,11 @@ namespace cpp_frep { int n=counterIntersect; std::cout<<"Intersect("; counterIntersect++; - ArrayIntersect[n].setShape1(morphNodes(shape1Index)); + if (smooth) ArrayIntersect[n].setShape1(morphNodes(shape1Index)); + else ArrayIntersect[n].setShape1(getNode(shape1Index,0)); std::cout<<","; - ArrayIntersect[n].setShape2(morphNodes(shape2Index)); + if (smooth) ArrayIntersect[n].setShape2(morphNodes(shape2Index)); + else ArrayIntersect[n].setShape2(getNode(shape2Index,0)); std::cout<<")"; return &ArrayIntersect[n]; } @@ -381,11 +280,14 @@ namespace cpp_frep { int n=counterMorph; std::cout<<"Morph("; counterMorph++; - ArrayMorph[n].setShape1(morphNodes(shape1Index)); + if (smooth) ArrayMorph[n].setShape1(morphNodes(shape1Index)); + else ArrayMorph[n].setShape1(getNode(shape1Index,0)); std::cout<<","; - ArrayMorph[n].setShape2(morphNodes(shape2Index)); + if (smooth) ArrayMorph[n].setShape2(morphNodes(shape2Index)); + else ArrayMorph[n].setShape2(getNode(shape2Index,0)); std::cout<<")"; ArrayMorph[n].weight=0.5; + if (parametric) ArrayMorph[n].weight=genome[index][3]; return &ArrayMorph[n]; } case 4: { @@ -393,8 +295,13 @@ namespace cpp_frep { int n=counterTranslate; std::cout<<"Translate("; counterTranslate++; - ArrayTranslate[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayTranslate[n].setShape(morphNodes(shapeIndex)); + else ArrayTranslate[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) { + ArrayTranslate[n].dx=genome[index][3]*bound*2.0f-bound; + ArrayTranslate[n].dy=genome[index][4]*bound*2.0f-bound; + } return &ArrayTranslate[n]; } case 5: { @@ -402,8 +309,13 @@ namespace cpp_frep { int n=counterScale; std::cout<<"Scale("; counterScale++; - ArrayScale[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayScale[n].setShape(morphNodes(shapeIndex)); + else ArrayScale[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) { + ArrayScale[n].sx=genome[index][3]*bound*0.75f+0.5f; + ArrayScale[n].sy=genome[index][4]*bound*0.75f+0.5f; + } return &ArrayScale[n]; } case 6: { @@ -411,8 +323,10 @@ namespace cpp_frep { int n=counterRotate; std::cout<<"Rotate("; counterRotate++; - ArrayRotate[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayRotate[n].setShape(morphNodes(shapeIndex)); + else ArrayRotate[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) ArrayRotate[n].angle=genome[index][3]*360.0; return &ArrayRotate[n]; } case 7: { @@ -420,8 +334,14 @@ namespace cpp_frep { int n=counterLinearArrayX; std::cout<<"LinearArrayX("; counterLinearArrayX++; - ArrayLinearArrayX[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayLinearArrayX[n].setShape(morphNodes(shapeIndex)); + else ArrayLinearArrayX[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) { + // ArrayLinearArrayX[n].size=genome[index][3]*bound; + ArrayLinearArrayX[n].spacing=genome[index][3]*bound/2.0f; + ArrayLinearArrayX[n].number=(int)(genome[index][4]*bound); + } return &ArrayLinearArrayX[n]; } case 8: { @@ -429,8 +349,14 @@ namespace cpp_frep { int n=counterLinearArrayY; std::cout<<"LinearArrayY("; counterLinearArrayY++; - ArrayLinearArrayY[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayLinearArrayY[n].setShape(morphNodes(shapeIndex)); + else ArrayLinearArrayY[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) { + ArrayLinearArrayY[n].size=genome[index][3]*bound; + ArrayLinearArrayY[n].spacing=ArrayLinearArrayY[n].size/2; + ArrayLinearArrayY[n].number=(int)(genome[index][4]*bound); + } return &ArrayLinearArrayY[n]; } case 9: { @@ -438,8 +364,13 @@ namespace cpp_frep { int n=counterPolarArray; std::cout<<"PolarArray("; counterPolarArray++; - ArrayPolarArray[n].setShape(morphNodes(shapeIndex)); + if (smooth) ArrayPolarArray[n].setShape(morphNodes(shapeIndex)); + else ArrayPolarArray[n].setShape(getNode(shapeIndex,0)); std::cout<<")"; + if (parametric) { + ArrayPolarArray[n].angle=genome[index][3]*360.0f; + ArrayPolarArray[n].radius=genome[index][4]*bound*0.75f+0.5f; + } return &ArrayPolarArray[n]; } case 10: { @@ -447,6 +378,7 @@ namespace cpp_frep { int n=counterCircle; counterCircle++; std::cout<<"Circle"; + // if (parametric) ArrayCircle[n].radius=genome[index][3]*bound; return &ArrayCircle[n]; } case 11: { @@ -454,22 +386,38 @@ namespace cpp_frep { int n=counterRectangle; counterRectangle++; std::cout<<"Rectangle"; + // if (parametric) { + // ArrayTranslate[n].xmin=-genome[index][3]*bound/2.0f; + // ArrayTranslate[n].xmax= genome[index][3]*bound/2.0f; + // ArrayTranslate[n].ymin=-genome[index][4]*bound/2.0f; + // ArrayTranslate[n].ymax= genome[index][4]*bound/2.0f; + // } return &ArrayRectangle[n]; } default: { int n=counterRectangle; counterRectangle++; std::cout<<"REECCC"; + // if (parametric) { + // ArrayTranslate[n].xmin=-genome[index][3]*bound/2.0f; + // ArrayTranslate[n].xmax= genome[index][3]*bound/2.0f; + // ArrayTranslate[n].ymin=-genome[index][4]*bound/2.0f; + // ArrayTranslate[n].ymax= genome[index][4]*bound/2.0f; + // } return &ArrayRectangle[n]; } } } void constraintGenome(){ - for (int i =0; i<genome.size();++i){ + for (unsigned int i =0; i<genome.size();++i){ genome[i][0]=constraint(genome[i][0]); genome[i][1]=constraint(genome[i][1]); genome[i][2]=constraint(genome[i][2]); + if(parametric){ + genome[i][3]=constraint(genome[i][3]); + genome[i][4]=constraint(genome[i][4]); + } } } @@ -480,7 +428,7 @@ namespace cpp_frep { return num; } - std::string to_string_with_precision(const scalar a_value, const int n = 3){ + std::string to_string_with_precision(const scalar a_value, const int n = 2){ std::ostringstream out; out.precision(n); out << std::fixed << a_value; diff --git a/cpp_frep/main.cpp b/cpp_frep/main.cpp index d0f5a2c..1fac4dc 100755 --- a/cpp_frep/main.cpp +++ b/cpp_frep/main.cpp @@ -13,7 +13,6 @@ using scalar=float; //-------------------------------------------------------------------------------------------------- std::vector<std::string> insert_newlines(const std::string &in, const size_t every_n){ std::vector<std::string> outStrings; - // out.reserve(in.size() + in.size() / every_n); int count=0; outStrings.push_back(""); for(std::string::size_type i = 0; i < in.size(); i++) { @@ -69,7 +68,7 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca int height=(int)((maxX-minX)/dx); int width=(int)((maxY-minY)/dy); - int size=height*width*4; + const int size=height*width*4; @@ -114,11 +113,11 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca cv::Scalar(0,0,0), // BGR Color 1); // Line Thickness (Optional) - y+=15; + y+=20; //print frep auto strings=insert_newlines(frep.getPrintedFrep(),120); - for (int i=0;i<strings.size();i++){ + for (unsigned int i=0;i<strings.size();i++){ cv::putText(image, strings[i], cv::Point(10,y), // Coordinates @@ -145,7 +144,7 @@ void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar int height=(int)((maxX-minX)/dx); int width=(int)((maxY-minY)/dy); - int size=height*width*4; + const int size=height*width*4; @@ -177,12 +176,15 @@ void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar } // std::cout << '\n'; + float scale=0.3; + int y=20; + cv::Mat image = cv::Mat(width, height, CV_8UC4, pix); cv::putText(image, frep->getPrintedName(), - cv::Point(10,10), // Coordinates + cv::Point(10,y), // Coordinates cv::FONT_HERSHEY_SIMPLEX, // Font - 0.25, // Scale. 2.0 = 2x bigger + scale, // Scale. 2.0 = 2x bigger cv::Scalar(0,0,0), // BGR Color 1); // Line Thickness (Optional) @@ -197,11 +199,11 @@ void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar } //compare between a target frep and target frep tree -float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy,std::string name,bool smooth){ +float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy,std::string name){ int height=(int)((maxX-minX)/dx); int width=(int)((maxY-minY)/dy); - int size=height*width*4; + const int size=height*width*4; std::string fileName=name+".jpg"; @@ -211,13 +213,25 @@ float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar max std::vector<std::vector<scalar>> g= frep_tree->getGenome(); - for (int i =0; i<frep_tree->numNodes();++i){ - g[i][0]=(v.at(i*3+0)); - g[i][1]=(v.at(i*3+1)); - g[i][2]=(v.at(i*3+2)); + if (frep_tree->parametric){ + for (int i =0; i<frep_tree->numNodes();++i){ + g[i][0]=(v.at(i*5+0)); + g[i][1]=(v.at(i*5+1)); + g[i][2]=(v.at(i*5+2)); + g[i][3]=(v.at(i*5+3)); + g[i][4]=(v.at(i*5+4)); + } + }else{ + for (int i =0; i<frep_tree->numNodes();++i){ + g[i][0]=(v.at(i*3+0)); + g[i][1]=(v.at(i*3+1)); + g[i][2]=(v.at(i*3+2)); + } + } + - frep_tree->updateGenome(g,smooth); + frep_tree->updateGenome(g); for(scalar i=minX;i<maxX-dx;i+=dx){ @@ -269,11 +283,11 @@ float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar max cv::Scalar(0,0,0), // BGR Color 1); // Line Thickness (Optional) - y+=15; + y+=20; //print frep auto strings=insert_newlines(frep_tree->getPrintedFrep(),120); - for (int i=0;i<strings.size();i++){ + for (unsigned int i=0;i<strings.size();i++){ cv::putText(image, strings[i], cv::Point(10,y), // Coordinates @@ -297,25 +311,40 @@ float getRandom(){//between 0 and 1 } //get random genome -Vector getRandomGenome(int n){ +Vector getRandomGenome(int n, bool parametric){ std::vector<float> v; - for(int i=0;i<n*3;++i){ - v.push_back(getRandom()); + if(parametric){ + for(int i=0;i<n*5;++i){ + v.push_back(getRandom()); + } + }else{ + for(int i=0;i<n*3;++i){ + v.push_back(getRandom()); + } } + return Vector(v); } int main(int const, char const**) { - scalar minX=-3.0f; - scalar maxX=3.0f; - scalar minY=-3.0f; - scalar maxY=3.0f; - scalar dx=0.01f; - scalar dy=0.01f; + scalar res=0.01f; + scalar bound =3.0f; + + bool smooth=true; + bool parametric=true; + + float precision = 0.01; + + scalar minX=-bound; + scalar maxX=bound; + scalar minY=-bound; + scalar maxY=bound; + scalar dx=res; + scalar dy=res; std::vector<std::vector<scalar>> genome; @@ -323,68 +352,77 @@ int main(int const, char const**) { node1.push_back(0.34); node1.push_back(0.1); node1.push_back(0.95); + if (parametric){ + node1.push_back(0.5024); + node1.push_back(0.7475); + } genome.push_back(node1); std::vector<scalar> node2; node2.push_back(0.48); node2.push_back(0.3); node2.push_back(0.9); + if (parametric){ + node2.push_back(0.17); + node2.push_back(0.227); + } genome.push_back(node2); // std::vector<scalar> node3; // node3.push_back(0.2472); // node3.push_back(0.452); // node3.push_back(0.727); + // if (parametric){ + // node3.push_back(0.17); + // node3.push_back(0.227); + // } // genome.push_back(node3); - Frep_tree tree(genome,smooth); + Frep_tree tree(genome,smooth,parametric,bound); // genome[0][0]=0.1; - // tree.updateGenome(genome,false); + // tree.updateGenome(genome); // drawFrep(tree,minX, maxX, minY, maxY, dx, dy,"image22",true); - float precision = 0.001; - int dimension = 3; + + int dimension = tree.dimensions(); NelderMeadOptimizer o(dimension, precision); // request a simplex to start with int n =tree.numNodes(); - Vector v=getRandomGenome(n); + Vector v=getRandomGenome(n,parametric); o.insert(v); - o.insert(getRandomGenome(n)); - o.insert(getRandomGenome(n)); - - // Vector v(0.6,0.1,0.7667); - // o.insert(v); - // o.insert(Vector(0.3,0.1,0.7)); - // o.insert(Vector(0.8,0.4,0.9)); + o.insert(getRandomGenome(n,parametric)); + o.insert(getRandomGenome(n,parametric)); Circle c(1.0f,0.0f,0.0f); Rectangle r(-1.0f,1.0f,-1.0f,1.0f); Subtract s(&r,&c); PolarArray pa(&r,0.0f, 0.0f, 45.0f,-1.0f); - drawFrep(&s,minX, maxX, minY, maxY, dx, dy,"target",false); + drawFrep(&pa,minX, maxX, minY, maxY, dx, dy,"target",false); int count=0; float score=0.0f; - while ( !o.done(score)) { - if(count>50||o.done()){ + int maxSteps=100; + while ( !o.done(score)&&count<maxSteps) { + // while ( !o.done(score)) { + if(count>maxSteps||o.done()){ count=0; - std::cout<<"Counld't find solution, reset with random values!\n"; + std::cout<<"Counld't find solution, reset with random values!!!!!!!!!!!!!!!!!!!\n"; o.reset(); o.insert(v); - o.insert(getRandomGenome(n)); - o.insert(getRandomGenome(n)); + o.insert(getRandomGenome(n,parametric)); + o.insert(getRandomGenome(n,parametric)); } std::cout<<"Step:"<<count<<"\n"; std::string name1 = "i"; std::string name=name1+std::to_string(count); - score=compareL1( v, &s, &tree, minX, maxX, minY, maxY, dx, dy, name,smooth); + score=compareL1( v, &s, &tree, minX, maxX, minY, maxY, dx, dy, name); v = o.step(v,score ); count++; } diff --git a/cpp_frep/nelder_mead.h b/cpp_frep/nelder_mead.h index e5c5ce0..d04580d 100644 --- a/cpp_frep/nelder_mead.h +++ b/cpp_frep/nelder_mead.h @@ -160,7 +160,7 @@ class NelderMeadOptimizer { // termination criteria: each pair of vectors in the simplex has to // have a distance of at most `termination_distance` bool done() { - if (vectors.size() < dimension) { + if ((int)vectors.size() < dimension) { return false; } for (int i=0; i<dimension+1; i++) { @@ -187,7 +187,7 @@ class NelderMeadOptimizer { } void insert(Vector vec) { - if (vectors.size() < dimension+1) { + if ((int)vectors.size() < dimension+1) { vectors.push_back(vec); } } @@ -195,12 +195,12 @@ class NelderMeadOptimizer { Vector step(Vector vec, float score) { db.insert(vec, score); try { - if (vectors.size() < dimension+1) { + if ((int)vectors.size() < dimension+1) { vectors.push_back(vec); } // otherwise: optimize! - if (vectors.size() == dimension+1) { + if ((int)vectors.size() == dimension+1) { while(!done(score)) { sort(vectors.begin(), vectors.end(), *this); Vector cog; // center of gravity -- GitLab