From d537b121bdd5381862c2e0c8afeaf60ce2bedfff Mon Sep 17 00:00:00 2001 From: Amira Abdel-Rahman <aabdelrahman@gsd.harvard.edu> Date: Wed, 26 Jun 2019 11:04:49 -0400 Subject: [PATCH] cleanup and added printed Genome --- README.md | 1 + cpp_frep/frep.cpp | 3 +- cpp_frep/frep_tree.cpp | 214 +++++++++++++++++++++++------------------ cpp_frep/main.cpp | 90 ++++++++--------- 4 files changed, 168 insertions(+), 140 deletions(-) diff --git a/README.md b/README.md index f68799e..2c73108 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Similar to [cpp_starter](https://gitlab.cba.mit.edu/erik/cpp_starter/tree/master - a modern C++ compiler (i.e. one that supports C++17 features, ex. gcc 7+) - cmake 3.13 or newer - Eigen3 (installable via apt, yum, or homebrew) +- openCV (installable via apt, yum, or homebrew) ## Building diff --git a/cpp_frep/frep.cpp b/cpp_frep/frep.cpp index 0a84ea1..5d3657c 100755 --- a/cpp_frep/frep.cpp +++ b/cpp_frep/frep.cpp @@ -350,8 +350,7 @@ 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 = 3){ 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 3f3d56f..051c796 100644 --- a/cpp_frep/frep_tree.cpp +++ b/cpp_frep/frep_tree.cpp @@ -7,33 +7,20 @@ namespace cpp_frep { using scalar=float; class Frep_tree { public: - - std::vector<std::vector<scalar>> genome; - - Frep_tree(){ X=0.0f; Y=0.0f; }; - Frep_tree(std::vector<std::vector<scalar>> genome_,bool smooth) { - // inputs=inputs_; - genome=genome_; + Frep_tree(std::vector<std::vector<scalar>> genome_,bool smooth_) { X=0.0f; Y=0.0f; - nodeLength; - addPrimitives(); - if(!smooth){ - parseTree(); - }else{ - parseTreeSmooth(); - } - - + updateGenome( genome_, smooth_); }; void updateGenome(std::vector<std::vector<scalar>> genome_,bool smooth_){ - genome=genome_; + + smooth=smooth_; counterAdd =0; counterSubtract =0; @@ -48,8 +35,12 @@ namespace cpp_frep { counterCircle =0; counterRectangle =0; + genome=genome_; + constraintGenome(); + addPrimitives(); smooth=smooth_; + if(!smooth){ parseTree(); }else{ @@ -57,30 +48,115 @@ namespace cpp_frep { } } - - void addPrimitives(){ - std::vector<scalar> g,g1; - g.push_back(10.0f/nodeLength); - g1.push_back(11.0f/nodeLength); - genome.push_back(g); - genome.push_back(g1); - maxLength=genome.size(); - } - + std::vector<std::vector<scalar>> getGenome(){ auto g= genome; for(int i=0; i<numPrimitives;i++){ g.pop_back(); - } return g; } - Frep_tree get(){ return *this; } + void setXY(scalar X_,scalar Y_){ + X=X_; + Y=Y_; + } + + scalar eval(){ + parsedTree->setXY(X,Y); + return parsedTree->eval(); + } + + int numNodes(){ + return genome.size()-numPrimitives;//numPrimitives number of primitives + } + + void printGenome(){ + for (int i =0; i<genome.size()-numPrimitives;++i){ + std::cout<< genome[i][0]<<","<<genome[i][1]<<","<<genome[i][2]<<" "; + } + 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); + g+="/"; + g+=to_string_with_precision(genome[i][1],2); + g+="/"; + g+=to_string_with_precision(genome[i][2],2); + g+=" "; + } + return g; + + } + + std::string getPrintedFrep(){ + std::string f="Frep: "+parsedTree->getPrintedName(); + return f; + + } + + virtual ~Frep_tree() {} + + private: + int maxLength; + + std::vector<std::vector<scalar>> genome; + + scalar X; + scalar Y; + Frep* parsedTree; + scalar nodeLength=12.0f; + + static const int storageSpace=20; + + Add ArrayAdd [storageSpace]; + Subtract ArraySubtract [storageSpace]; + Intersect ArrayIntersect [storageSpace]; + Scale ArrayScale [storageSpace]; + Morph ArrayMorph [storageSpace*20]; + Translate ArrayTranslate [storageSpace]; + Rotate ArrayRotate [storageSpace]; + LinearArrayX ArrayLinearArrayX [storageSpace]; + LinearArrayY ArrayLinearArrayY [storageSpace]; + PolarArray ArrayPolarArray [storageSpace]; + Circle ArrayCircle [storageSpace]; + Rectangle ArrayRectangle [storageSpace]; + + int counterAdd =0; + int counterSubtract =0; + int counterIntersect =0; + int counterScale =0; + int counterMorph =0; + int counterTranslate =0; + int counterRotate =0; + int counterLinearArrayX =0; + int counterLinearArrayY =0; + int counterPolarArray =0; + int counterCircle =0; + int counterRectangle =0; + + int numPrimitives=2; + + bool smooth=false; + + void addPrimitives(){ + std::vector<scalar> g,g1; + g.push_back(10.0f/nodeLength); + g1.push_back(11.0f/nodeLength); + genome.push_back(g); + genome.push_back(g1); + maxLength=genome.size(); + } + void parseTree(){ printGenome(); parsedTree=getNode(0); @@ -389,75 +465,27 @@ namespace cpp_frep { } } - void setXY(scalar X_,scalar Y_){ - X=X_; - Y=Y_; - } - - scalar eval(){ - parsedTree->setXY(X,Y); - return parsedTree->eval(); - } - - int numNodes(){ - return genome.size()-numPrimitives;//numPrimitives number of primitives - } - - void printGenome(){ - for (int i =0; i<genome.size()-numPrimitives;++i){ - std::cout<< genome[i][0]<<","<<genome[i][1]<<","<<genome[i][2]<<" "; + void constraintGenome(){ + for (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]); } - std::cout<<"\n"; - - } - - std::string getPrintedGenome(){ - return parsedTree->getPrintedName(); - } - virtual ~Frep_tree() {} - - private: - int maxLength; - - scalar X; - scalar Y; - Frep* parsedTree; - scalar nodeLength=12.0f; - - static const int storageSpace=20; - - Add ArrayAdd [storageSpace]; - Subtract ArraySubtract [storageSpace]; - Intersect ArrayIntersect [storageSpace]; - Scale ArrayScale [storageSpace]; - Morph ArrayMorph [storageSpace*20]; - Translate ArrayTranslate [storageSpace]; - Rotate ArrayRotate [storageSpace]; - LinearArrayX ArrayLinearArrayX [storageSpace]; - LinearArrayY ArrayLinearArrayY [storageSpace]; - PolarArray ArrayPolarArray [storageSpace]; - Circle ArrayCircle [storageSpace]; - Rectangle ArrayRectangle [storageSpace]; - - int counterAdd =0; - int counterSubtract =0; - int counterIntersect =0; - int counterScale =0; - int counterMorph =0; - int counterTranslate =0; - int counterRotate =0; - int counterLinearArrayX =0; - int counterLinearArrayY =0; - int counterPolarArray =0; - int counterCircle =0; - int counterRectangle =0; - - int numPrimitives=2; + scalar constraint(scalar num){ + num=num>0.99999f?0.99999f:num; + num=num<0.0001f?0.000001f:num; + return num; + } - bool smooth=false; + std::string to_string_with_precision(const scalar a_value, const int n = 3){ + std::ostringstream out; + out.precision(n); + out << std::fixed << a_value; + return out.str(); + } }; } \ No newline at end of file diff --git a/cpp_frep/main.cpp b/cpp_frep/main.cpp index 0a0c364..d0f5a2c 100755 --- a/cpp_frep/main.cpp +++ b/cpp_frep/main.cpp @@ -26,7 +26,7 @@ std::vector<std::string> insert_newlines(const std::string &in, const size_t eve } return outStrings; } - +//original for frep in the command line void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy){ for(scalar i=minX;i<maxX;i+=dx){ for(scalar j=minY;j<maxY;j+=dy){ @@ -45,6 +45,7 @@ void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar } +//for frep trees in the command line void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy){ for(scalar i=minX;i<maxX;i+=dx){ for(scalar j=minY;j<maxY;j+=dy){ @@ -63,6 +64,7 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca } +//for frep save and visualize void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy,std::string name,bool preview){ int height=(int)((maxX-minX)/dx); @@ -100,10 +102,22 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca // std::cout << '\n'; cv::Mat image = cv::Mat(width, height, CV_8UC4, pix); - - auto strings=insert_newlines(frep.getPrintedGenome(),120); + float scale=0.3; int y=20; + //print genome + cv::putText(image, + frep.getPrintedGenome(), + cv::Point(10,y), // Coordinates + cv::FONT_HERSHEY_SIMPLEX, // Font + scale, // Scale. 2.0 = 2x bigger + cv::Scalar(0,0,0), // BGR Color + 1); // Line Thickness (Optional) + + y+=15; + + //print frep + auto strings=insert_newlines(frep.getPrintedFrep(),120); for (int i=0;i<strings.size();i++){ cv::putText(image, strings[i], @@ -116,14 +130,6 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca } - // cv::putText(image, - // frep.getPrintedGenome(), - // cv::Point(10,10), // Coordinates - // cv::FONT_HERSHEY_SIMPLEX, // Font - // 0.25, // Scale. 2.0 = 2x bigger - // cv::Scalar(0,0,0), // BGR Color - // 1); // Line Thickness (Optional) - std::string fileName=name+".jpg"; cv::imwrite( fileName, image ); if(preview){ @@ -134,6 +140,7 @@ void drawFrep(Frep_tree frep,scalar minX,scalar maxX,scalar minY,scalar maxY,sca } } +//for frep trees save and visualize void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar dx,scalar dy,std::string name,bool preview){ int height=(int)((maxX-minX)/dx); @@ -189,44 +196,27 @@ void drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scalar } } -float constraint(float num){ - num=num>0.99999f?0.99999f:num; - num=num<0.0001f?0.000001f:num; - return num; -} - +//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){ int height=(int)((maxX-minX)/dx); int width=(int)((maxY-minY)/dy); int size=height*width*4; - // int x,y,pixel; std::string fileName=name+".jpg"; - // const char* c = fileName.c_str(); - - int stride=0; unsigned char pix[size]; int same=0; - // std::cout<< constraint(v.at(0))<<","<<constraint(v.at(1))<<","<<constraint(v.at(2))<<"\n"; - std::vector<std::vector<scalar>> g= frep_tree->getGenome(); for (int i =0; i<frep_tree->numNodes();++i){ - g[i][0]=constraint(v.at(i*3+0)); - g[i][1]=constraint(v.at(i*3+1)); - g[i][2]=constraint(v.at(i*3+2)); + 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->genome[0][0]=constraint(v.at(0)); - // frep_tree->genome[0][1]=constraint(v.at(1)); - // frep_tree->genome[0][2]=constraint(v.at(2)); - // frep_tree->updateGenome(frep_tree->genome,false); - - frep_tree->updateGenome(g,smooth); @@ -266,9 +256,23 @@ float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar max std::cout<<result <<"\n"; cv::Mat image = cv::Mat(width, height, CV_8UC4, pix); - auto strings=insert_newlines(frep_tree->getPrintedGenome(),120); + float scale=0.3; int y=20; + + //print genome + cv::putText(image, + frep_tree->getPrintedGenome(), + cv::Point(10,y), // Coordinates + cv::FONT_HERSHEY_SIMPLEX, // Font + scale, // Scale. 2.0 = 2x bigger + cv::Scalar(0,0,0), // BGR Color + 1); // Line Thickness (Optional) + + y+=15; + + //print frep + auto strings=insert_newlines(frep_tree->getPrintedFrep(),120); for (int i=0;i<strings.size();i++){ cv::putText(image, strings[i], @@ -287,10 +291,12 @@ float compareL1(Vector v, Frep* frep,Frep_tree* frep_tree,scalar minX,scalar max } +//get random float between 0 and 1 float getRandom(){//between 0 and 1 return ((float) rand() / (RAND_MAX)); } +//get random genome Vector getRandomGenome(int n){ std::vector<float> v; for(int i=0;i<n*3;++i){ @@ -308,7 +314,7 @@ int main(int const, char const**) { scalar maxY=3.0f; scalar dx=0.01f; scalar dy=0.01f; - bool smooth=false; + bool smooth=true; std::vector<std::vector<scalar>> genome; @@ -325,11 +331,11 @@ int main(int const, char const**) { node2.push_back(0.9); genome.push_back(node2); - std::vector<scalar> node3; - node3.push_back(0.2472); - node3.push_back(0.452); - node3.push_back(0.727); - genome.push_back(node3); + // std::vector<scalar> node3; + // node3.push_back(0.2472); + // node3.push_back(0.452); + // node3.push_back(0.727); + // genome.push_back(node3); Frep_tree tree(genome,smooth); // genome[0][0]=0.1; @@ -363,9 +369,6 @@ int main(int const, char const**) { drawFrep(&s,minX, maxX, minY, maxY, dx, dy,"target",false); int count=0; - - // dx=0.1f; - // dy=0.1f; float score=0.0f; while ( !o.done(score)) { @@ -432,9 +435,6 @@ int main(int const, char const**) { //0 add, 1 subtract, 2 intersect, 3 morph, 4 translate, 5 scale, 6 rotate, 7 linearArray, 8 polar array - - - return 0; } -- GitLab