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