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