From df840e99cf011098b39321bb13d16eeb770b379c Mon Sep 17 00:00:00 2001 From: amirabdelrahman <amira-rahman@aucegypt.edu> Date: Mon, 11 May 2020 10:55:29 -0400 Subject: [PATCH] documentation and voxel,df,dnn search done --- README.md | 51 +- Representation Comparison.xlsx | Bin 13911 -> 14295 bytes cpp_dft/main.cpp | 287 +++++-- cpp_dnn/cmaes_initials.par | 116 +++ cpp_dnn/cmaes_signals.par | 77 ++ cpp_dnn/dnn.cpp | 25 +- cpp_dnn/image.cpp | 20 +- cpp_dnn/main.cpp | 1474 ++++++++++++++++++++++++++------ cpp_voxel/main.cpp | 104 +-- img/df/1.png | Bin 0 -> 717 bytes img/df/2.png | Bin 0 -> 757 bytes img/df/3.png | Bin 0 -> 1152 bytes img/df/4.png | Bin 0 -> 767 bytes img/df/5.png | Bin 0 -> 817 bytes img/dft/1.png | Bin 0 -> 490 bytes img/dft/2.png | Bin 0 -> 454 bytes img/dnn_cmaes/1.png | Bin 0 -> 709 bytes img/dnn_cmaes/2.png | Bin 0 -> 582 bytes img/dnn_cmaes/3.png | Bin 0 -> 1020 bytes img/dnn_cmaes/4.png | Bin 0 -> 783 bytes img/dnn_cmaes/5.png | Bin 0 -> 711 bytes img/dnn_sgd/1.png | Bin 0 -> 663 bytes img/dnn_sgd/2.png | Bin 0 -> 568 bytes img/dnn_sgd/3.png | Bin 0 -> 1043 bytes img/dnn_sgd/4.png | Bin 0 -> 761 bytes img/dnn_sgd/5.png | Bin 0 -> 761 bytes img/voxel/1.png | Bin 0 -> 667 bytes img/voxel/2.png | Bin 0 -> 580 bytes img/voxel/3.png | Bin 0 -> 1090 bytes img/voxel/4.png | Bin 0 -> 764 bytes img/voxel/5.png | Bin 0 -> 752 bytes 31 files changed, 1719 insertions(+), 435 deletions(-) create mode 100644 cpp_dnn/cmaes_initials.par create mode 100644 cpp_dnn/cmaes_signals.par create mode 100644 img/df/1.png create mode 100644 img/df/2.png create mode 100644 img/df/3.png create mode 100644 img/df/4.png create mode 100644 img/df/5.png create mode 100644 img/dft/1.png create mode 100644 img/dft/2.png create mode 100644 img/dnn_cmaes/1.png create mode 100644 img/dnn_cmaes/2.png create mode 100644 img/dnn_cmaes/3.png create mode 100644 img/dnn_cmaes/4.png create mode 100644 img/dnn_cmaes/5.png create mode 100644 img/dnn_sgd/1.png create mode 100644 img/dnn_sgd/2.png create mode 100644 img/dnn_sgd/3.png create mode 100644 img/dnn_sgd/4.png create mode 100644 img/dnn_sgd/5.png create mode 100644 img/voxel/1.png create mode 100644 img/voxel/2.png create mode 100644 img/voxel/3.png create mode 100644 img/voxel/4.png create mode 100644 img/voxel/5.png diff --git a/README.md b/README.md index 50ab961..466338e 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,52 @@ Search methods used: nelder mead, gradient descent, EM and CMAES. All target Images are 100*100 -<img src="img/circle_target.png" alt="drawing" width="200"/> -<img src="img/rectange_target.png" alt="drawing" width="200"/> -<img src="img/gear_target.png" alt="drawing" width="200"/> -<img src="img/blob_target.png" alt="drawing" width="200"/> -<img src="img/hole_target.png" alt="drawing" width="200"/> +<img src="img/circle_target.png" width="200"> +<img src="img/rectange_target.png" width="200"> +<img src="img/gear_target.png" width="200"> +<img src="img/blob_target.png" width="200"> +<img src="img/hole_target.png" width="200"> + +---- + +### Example Best Results + +- parametric frep (~ 5 parameters) +- frep trees (~ 10 parameters) +- dft (~ 20 parameters) +- DNN/DMN (~ 300 parameters) + - cmaes + +<img src="img/dnn_cmaes/1.png" width="200"> +<img src="img/dnn_cmaes/2.png" width="200"> +<img src="img/dnn_cmaes/3.png" width="200"> +<img src="img/dnn_cmaes/4.png" width="200"> +<img src="img/dnn_cmaes/5.png" width="200"> + + - sgd + +<img src="img/dnn_sgd/1.png" width="200"> +<img src="img/dnn_sgd/2.png" width="200"> +<img src="img/dnn_sgd/3.png" width="200"> +<img src="img/dnn_sgd/4.png" width="200"> +<img src="img/dnn_sgd/5.png" width="200"> + +- distance fields (~ 400 parameters) + +<img src="img/df/1.png" width="200"> +<img src="img/df/2.png" width="200"> +<img src="img/df/3.png" width="200"> +<img src="img/df/4.png" width="200"> +<img src="img/df/5.png" width="200"> + +- point cloud/mesh (~ 1,000 parameters) +- voxel search (~ 10,000 parameters) + +<img src="img/voxel/1.png" width="200"> +<img src="img/voxel/2.png" width="200"> +<img src="img/voxel/3.png" width="200"> +<img src="img/voxel/4.png" width="200"> +<img src="img/voxel/5.png" width="200"> --- ### dft progress diff --git a/Representation Comparison.xlsx b/Representation Comparison.xlsx index 893ab9689f6dc18cab4344f1d6192955040ee9b0..2484358bc85a05b62badb7c6a58cb9da4bd0232a 100644 GIT binary patch delta 7581 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 JwpbI8BmlXt{&@fZ delta 7175 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 A!~g&Q diff --git a/cpp_dft/main.cpp b/cpp_dft/main.cpp index 76f8361..d6a7939 100644 --- a/cpp_dft/main.cpp +++ b/cpp_dft/main.cpp @@ -81,7 +81,7 @@ cv::Mat drawFrep(Frep* frep,scalar minX,scalar maxX,scalar minY,scalar maxY,scal // cv::Scalar(0,0,0), // BGR Color // 1); // Line Thickness (Optional) - std::string fileName="img/"+name+".png"; + std::string fileName="img_dft/"+name+".png"; cv::imwrite( fileName, image ); if(preview){ cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE ); @@ -310,7 +310,7 @@ cv::Mat dft(int w, int h, const int resolution, std::vector<scalar> mag,std::vec cv::Scalar( 0, 0, 0 ), lineType ); - std::string fileName="img/"+name+".png"; + std::string fileName="img_dft/"+name+".png"; cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); if(save){ cv::imwrite ( fileName, img ); @@ -368,97 +368,84 @@ scalar compareToTarget(int width,int height,const int resolution,Vector v, cv::M int main(int const, char const**) { - scalar res=0.01f; - scalar bound =3.0f; float precision = 0.001f; + scalar res=0.05f; + scalar bound =2.5f; + + + scalar minX=-bound; scalar maxX=bound; scalar minY=-bound; scalar maxY=bound; scalar dx=res; scalar dy=res; - int height=(int)((maxX-minX)/dx); int width=(int)((maxY-minY)/dy); - // defines the complex number: (10 + 2i) - // std::complex<scalar> mycomplex(10.0f, 2.0f); - // std::complex<scalar> mycomplex =polar (1.0f, 0.927295f) ; - // std::complex<scalar> j; - // j=-1.0f; - // j=sqrt(j); + cout<<"width: "<<width<<", height: "<<height <<std::endl; - // std::complex<scalar> trial = mycomplex * exp (-1.0f*PI_F*j*1.0f); - // std::complex<scalar> trial = exp (-1.0f*PI_F*j*1.0f); - - // // prints the real part using the real function - // cout << "Real part: " << real(trial) << endl; - // cout << "Imaginary part: " << imag(trial) << endl; - // cout << "The complex whose magnitude is " << 5.0; - // cout << " and phase angle is " << 0.927295; - - // // use of polar() - // cout << " is " << polar (5.0, 0.927295) << endl; + const int resolution=19; - // // defines the complex number: (3.0+4.0i) - // std::complex<double> mycomplex (3.0, 4.0); - - // // prints the absolute value of the complex number - // cout << "The absolute value of " << mycomplex << " is: "; - // cout << abs(mycomplex) << endl; //magnitude - - // // prints the argument of the complex number - // cout << "The argument of " << mycomplex << " is: "; - // cout << arg(mycomplex) << endl; //phase + cpp_frep::Circle c(1.5f,0.0f,0.0f); + // std::vector<unsigned char> targ1 =drawFrep(&c,minX, maxX, minY, maxY, dx, dy,"circle_target",false); + cv::Mat targ1 =drawFrep(&c,minX, maxX, minY, maxY, dx, dy,"dft_circle",false); + cpp_frep::Rectangle r(-1.5f,1.5f,-1.0f,1.0f); + cpp_frep::Rotate rot1 (&r,0.0f,0.0f,90.0f); + // std::vector<unsigned char> targ2 =drawFrep(&rot1,minX, maxX, minY, maxY, dx, dy,"rectange_target",false); + cv::Mat targ2 =drawFrep(&rot1,minX, maxX, minY, maxY, dx, dy,"dft_reactangle",false); - + cpp_frep::InvoluteGear gear( 1.0f, 1.0f, 1.1f, 20.0f, 8.0f) ; + cpp_frep::Rotate rot (&gear,0.0f,0.0f,15.0f); + cpp_frep::Scale sc1(&rot,0.0f,0.0f,0.5f,0.5f); + cpp_frep::Add target(&sc1,&c); + // std::vector<unsigned char> targ3 =drawFrep(&target,minX, maxX, minY, maxY, dx, dy,"gear_target",false); + cv::Mat targ3 =drawFrep(&target,minX, maxX, minY, maxY, dx, dy,"dft_gear",false); - // std::vector<scalar> mag ={0.0f,0.5f, 0.25f,0.1f,0.05f}; - // std::vector<scalar> ampl={0.0f,0.0f,PI_F/2.0f,0.0f,0.0f}; - const int resolution=19; + cpp_frep::Circle c1(0.9f,-0.5f,0.8f); + cpp_frep::Circle c2(0.8f,0.2f,-0.2f); + cpp_frep::Circle c3(0.9f,1.5f,0.0f); + cpp_frep::Circle c4(0.9f,1.7f,-1.1f); + // Subtract ss(&rot1,&c1); + + // Subtract sss(&ss,&c2); + cpp_frep::Add aa(&c1,&c3); + cpp_frep::Add aaa(&aa,&c2); + cpp_frep::Add a(&aaa,&c4); + cpp_frep::Morph m (&a,&target,0.6f); + cpp_frep::Rotate rot2 (&m,0.3f,0.0f,-90.0f); + // Scale scc (&m,0.0f,0.0f,1.0,1.0); + // std::vector<unsigned char> targ4 =drawFrep(&rot2,minX, maxX, minY, maxY, dx, dy,"blob_target",false); + cv::Mat targ4 =drawFrep(&rot2,minX, maxX, minY, maxY, dx, dy,"dft_blob",false); - // std::vector<scalar> mag ={0.0f, 1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f, 0.05f}; - // std::vector<scalar> ampl={0.0f, 0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f, 0.0f}; - // cv::Mat d = dft(width, height, resolution, mag , ampl,"dft",true,true); + cpp_frep::Circle c5(0.5f,0.0f,0.0f); + cpp_frep::Subtract ss(&c,&c5); + // std::vector<unsigned char> targ5 =drawFrep(&ss,minX, maxX, minY, maxY, dx, dy,"hole_target",false); + cv::Mat targ5 =drawFrep(&ss,minX, maxX, minY, maxY, dx, dy,"dft_hole",false); - // mag=getRandomMag(resolution); - // ampl=getRandomAmpl(resolution); - // cv::Mat d = dft(width, height, resolution, mag,ampl,"dft",true); - // cv::cvtColor(d, d, cv::COLOR_BGR2GRAY); - // cv::cvtColor(targ, targ, cv::COLOR_BGR2GRAY); - // cv::Mat diff= d-targ; - // cout<< "nonzero: "<<countNonZero(diff)<<endl; - // cout<< "size: "<<width*height<<endl; - // cout<< "norm l2: "<<cv::norm(d, targ, cv::NORM_L2)<<endl; - // cout<< "norm l1: "<<cv::norm(d, targ, cv::NORM_L1)<<endl; - // cout<< "norm NORM_HAMMING: "<<cv::norm(d, targ,cv::NORM_HAMMING )<<endl; - // cout<< "norm NORM_HAMMING2: "<<cv::norm(d, targ,cv::NORM_HAMMING2 )<<endl; - // cout<< "norm NORM_L2SQR: "<<cv::norm(d, targ,cv::NORM_L2SQR )<<endl; - // cout<< "norm: "<<cv::norm(d, targ)<<endl; - - // cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE ); - // cv::imshow("Display Image", diff); - // cv::waitKey(0); - Circle c(1.2f,0.0f,0.0f); - InvoluteGear gear( 1.0f, 1.0f, 1.1f, 20.0f, 8.0f) ; - Rotate rot (&gear,0.0f,0.0f,15.0f); - Scale sc1(&rot,0.0f,0.0f,0.3f,0.3f); - Add target(&sc1,&c); - cv::Mat targ =drawFrep(&target,minX, maxX, minY, maxY, dx, dy,"dft_target",false); + // Circle c(1.2f,0.0f,0.0f); + // InvoluteGear gear( 1.0f, 1.0f, 1.1f, 20.0f, 8.0f) ; + // Rotate rot (&gear,0.0f,0.0f,15.0f); + // Scale sc1(&rot,0.0f,0.0f,0.3f,0.3f); + // Add target(&sc1,&c); + cv::Mat targ; // Circle c(1.0f,0.0f,0.0f); // cv::Mat targ =drawFrep(&c,minX, maxX, minY, maxY, dx, dy,"dft_target",false); - cv::cvtColor(targ, targ, cv::COLOR_BGR2GRAY); + cv::cvtColor(targ3, targ, cv::COLOR_BGR2GRAY); + + + ///neldermead @@ -484,7 +471,7 @@ int main(int const, char const**) { int count2=0; int maxSteps=10000; int maxSteps1=10000; - int saveEvery=10; + int saveEvery=25; scalar score=0.0f; std::string name1 = "ii"; @@ -503,6 +490,7 @@ int main(int const, char const**) { if(count2>=saveEvery){ //save score=compareToTarget( width, height,resolution,v, targ ,name,true,false); + std::cout<<"Step:"<<count<<", total:"<< count1<<", score:"<<-score<<"\n"; count2=0; }else{ @@ -511,7 +499,7 @@ int main(int const, char const**) { } - std::cout<<"Step:"<<count<<", total:"<< count1<<", score:"<<-score<<"\n"; + v = o.step(v, score); count++; count1++; @@ -538,3 +526,170 @@ int main(int const, char const**) { } +///target1 + // Step:25, total:25, score:44004 + // Step:51, total:51, score:40950 + // Step:77, total:77, score:26444 + // Step:103, total:103, score:23756 + // Step:129, total:129, score:16948 + // Step:155, total:155, score:14380 + // Step:181, total:181, score:13500 + // Step:207, total:207, score:12524 + // Step:233, total:233, score:13532 + // Step:259, total:259, score:12020 + // Step:285, total:285, score:12356 + // Step:311, total:311, score:11908 + // Step:337, total:337, score:11772 + // Step:363, total:363, score:12788 + // Step:389, total:389, score:11564 + // Step:415, total:415, score:12196 + // Step:441, total:441, score:11636 + // Step:467, total:467, score:12268 + // Step:493, total:493, score:11724 + // Step:519, total:519, score:11796 + // Step:545, total:545, score:11932 + // Step:571, total:571, score:12180 + // Step:597, total:597, score:11740 + // Step:623, total:623, score:11812 + // Step:649, total:649, score:12172 + // Step:675, total:675, score:11764 + // Step:701, total:701, score:11972 + // Step:727, total:727, score:11836 + // Step:753, total:753, score:11740 + // Step:779, total:779, score:11716 + // Step:805, total:805, score:11732 + // Step:831, total:831, score:11812 + // Step:857, total:857, score:11788 + // Step:883, total:883, score:11740 + // Step:909, total:909, score:11860 + // Step:935, total:935, score:11908 + // Step:961, total:961, score:11748 + // Step:987, total:987, score:11948 + // Step:1013, total:1013, score:11676 + // Step:1039, total:1039, score:12260 + // Step:1065, total:1065, score:11764 + // Step:1091, total:1091, score:11772 + // Step:1117, total:1117, score:11764 + // Step:1143, total:1143, score:11788 + // Step:1169, total:1169, score:11972 + // Step:1195, total:1195, score:11804 + // Step:1221, total:1221, score:11884 + // Step:1247, total:1247, score:11900 + // Step:1273, total:1273, score:11868 + // Step:1299, total:1299, score:12260 + // Step:1325, total:1325, score:11732 + // Step:1351, total:1351, score:11740 + // Step:1377, total:1377, score:11900 + // Step:1403, total:1403, score:11796 + // Step:1429, total:1429, score:11740 + // Step:1455, total:1455, score:11788 + // Step:1481, total:1481, score:12236 + +//target 2 + + // Step:25, total:25, score:28356 + // Step:51, total:51, score:23300 + // Step:77, total:77, score:24778 + // Step:103, total:103, score:18426 + // Step:129, total:129, score:16386 + // Step:155, total:155, score:14418 + // Step:181, total:181, score:13234 + // Step:207, total:207, score:12794 + // Step:233, total:233, score:12426 + // Step:259, total:259, score:12746 + // Step:285, total:285, score:11562 + // Step:311, total:311, score:11978 + // Step:337, total:337, score:11786 + // Step:363, total:363, score:11282 + // Step:389, total:389, score:12162 + // Step:415, total:415, score:12074 + // Step:441, total:441, score:12218 + // Step:467, total:467, score:11530 + // Step:493, total:493, score:11754 + // Step:519, total:519, score:11994 + // Step:545, total:545, score:11810 + // Step:571, total:571, score:11658 + // Step:597, total:597, score:11218 + // Step:623, total:623, score:11898 + // Step:649, total:649, score:11506 + // Step:675, total:675, score:11442 + // Step:701, total:701, score:11474 + // Step:727, total:727, score:11970 + // Step:753, total:753, score:12042 + // Step:779, total:779, score:11594 + // Step:805, total:805, score:11986 + // Step:831, total:831, score:11450 + // Step:857, total:857, score:11762 + // Step:883, total:883, score:11522 + // Step:909, total:909, score:11442 + // Step:935, total:935, score:11890 + // Step:961, total:961, score:11490 + // Step:987, total:987, score:11986 + // Step:1013, total:1013, score:11706 + // Step:1039, total:1039, score:12186 + // Step:1065, total:1065, score:11610 + // Step:1091, total:1091, score:11866 + // Step:1117, total:1117, score:11626 + // Step:1143, total:1143, score:12106 + // Step:1169, total:1169, score:11386 + // Step:1195, total:1195, score:11450 + // Step:1221, total:1221, score:11586 + // Step:1247, total:1247, score:11418 + // Step:1273, total:1273, score:11450 + // Step:1299, total:1299, score:11610 + // Step:1325, total:1325, score:11898 + // Step:1351, total:1351, score:11658 + // Step:1377, total:1377, score:11658 + // Step:1403, total:1403, score:11746 + // Step:1429, total:1429, score:11818 + // Step:1455, total:1455, score:11730 + // Step:1481, total:1481, score:11442 + // Step:1507, total:1507, score:11786 + // Step:1533, total:1533, score:11442 + // Step:1559, total:1559, score:11874 + // Step:1585, total:1585, score:11714 + // Step:1611, total:1611, score:11626 + // Step:1637, total:1637, score:11458 + // Step:1663, total:1663, score:11178 + // Step:1689, total:1689, score:12146 + // Step:1715, total:1715, score:11634 + // Step:1741, total:1741, score:12178 + // Step:1767, total:1767, score:11850 + // Step:1793, total:1793, score:11698 + // Step:1819, total:1819, score:11634 + // Step:1845, total:1845, score:11570 + // Step:1871, total:1871, score:12026 + // Step:1897, total:1897, score:11610 + // Step:1923, total:1923, score:11490 + // Step:1949, total:1949, score:12122 + // Step:1975, total:1975, score:11914 + // Step:2001, total:2001, score:11522 + // Step:2027, total:2027, score:12314 + // Step:2053, total:2053, score:11594 + // Step:2079, total:2079, score:11866 + // Step:2105, total:2105, score:11538 + // Step:2131, total:2131, score:11362 + // Step:2157, total:2157, score:11514 + // Step:2183, total:2183, score:11650 + // Step:2209, total:2209, score:11514 + // Step:2235, total:2235, score:11554 + // Step:2261, total:2261, score:11474 + // Step:2287, total:2287, score:11954 + // Step:2313, total:2313, score:11594 + // Step:2339, total:2339, score:12098 + // Step:2365, total:2365, score:11930 + // Step:2391, total:2391, score:11746 + // Step:2417, total:2417, score:11226 + // Step:2443, total:2443, score:11506 + // Step:2469, total:2469, score:11714 + // Step:2495, total:2495, score:11786 + // Step:2521, total:2521, score:12338 + // Step:2547, total:2547, score:11618 + +// target3 + +// target4 + + +// target5 + diff --git a/cpp_dnn/cmaes_initials.par b/cpp_dnn/cmaes_initials.par new file mode 100644 index 0000000..c3609a9 --- /dev/null +++ b/cpp_dnn/cmaes_initials.par @@ -0,0 +1,116 @@ +function number 1 2 5 6 8 23 # the first number is read by example_restarts.c, see there. +restarts 0 # read by example_restarts.c, remark that restarts + # with the same initialX might be sub-optimal +# +# Input parameter file for cmaes_t. +# Comments start with '#' or '%' until end of line. +# Actual recent parameter setting is written to file actparcmaes.par. +# + +## --- OBLIGATORY SETTINGS +# these settings, if read, overwrite the input values to cmaes_init + + N 3 # Problem dimension, overwrites parameter in cmaes_init + initialX 10: # Initial search point. Syntax: 1==read one number, see also end of file. + 0.5 + 1.1 + 1.1 +# 0.1 +# 0.9 +# 0.1 +# 0.1 +# 0.4 +# 0.15 +# 0.1 +# 0.6 +# 2.8 + typicalX 1: # Typical search point (useful for restarts, cave: boundaries), overwritten by initialX + 0.0 # these are the read value(s) + initialStandardDeviations 1: # 1==read only one number for all coordinates + 0.1 # numbers should not differ by orders of magnitude + # should be roughly 1/4 of the search interval + # this number essentially influences the global + # search ability (ie. the horizon where to search + # at all) on multimodal functions + +## --- OPTIONAL SETTINGS + +# stop-Parameters can be changed online via cmaes_signals.par + +stopMaxFunEvals 1e4 # max number of f-evaluations, 900*(N+3)*(N+3) is default +# fac*maxFunEvals 1e0 # multiplies stopMaxFunEvals by read number, default is 1 +# stopMaxIter 1e3 # max number of iterations (generations), inf is default +stopMaxIter 3 # max number of iterations (generations), inf is default + + +stopFitness -500 # stop if function value is smaller than stopFitness + # commented == never stop on function value (default) +stopTolFun 1e-1 # stop if function value differences are + # smaller than stopTolFun, default=1e-12 +stopTolFunHist 1e-1 # stop if function value differences of best values are + # smaller than stopTolFunHist, default was 0 +stopTolX 1e-2 # stop if step sizes/steps in x-space are + # smaller than TolX, default=0 +stopTolUpXFactor 1e3 # stop if std dev increases more than by TolUpXFactor, default 1e3 + +seed 0 # 0 == by time, also regard maxTimeFractionForEigendecomposition + # below, as for values smaller than one the outcome might not be + # exactly reproducible even with the same seed + +# diffMinChange 1 # Minimal coordinate wise standard deviation. Syntax see below. +# 1e-299 # Interferes with stopTolX termination criterion! default=0 + + +## --- internal CPU-time related settings + +maxTimeFractionForEigendecompostion 1 # maximal CPU-time fraction for eigensystem + # decomposition. Large values (up to one) are better + # w.r.t. the number of function evaluations to reach a + # certain function value. Only >=1 yields exactly + # reproducible results. + # 0.2==20% should often be faster than larger values + # w.r.t. the CPU-time to reach a certain function value. + +# updatecov 1 # default is updating the eigensystem after + # every 1/ccov/N/10-th generation. +# fac*updatecov 3 # multiplier for updatecov + +# resume allcmaes.dat # reads restart distribution from given file + + +## --- Strategy internal parameter --- +## default values are set in cmaes_readpara_SupplementDefaults() +## -- Selection related parameters +lambda 5 # number of offspring == samplesize was 12 +# mu +# weights log # possible values: log (==default), + # lin (==linearely decreasing), or equal + +## -- Adaptation (distribution estimation) related parameters +# diagonalCovarianceMatrix -1 # number of iterations, 1<==>always, -1<==>2+100*N/sqrt(lambda) +# fac*damp 1 # increase or decrease damping for step size control. +# ccumcov 1 # default is 4/(N+4), 1 means no cumulation for p_c. +# mucov 1 # 1 means only rank 1 update of C +# fac*ccov 1 # multiplier for default learning rate for cov. matrix + + +## --- Syntax for input vectors xstart, sigma, mincoorstddev +# +# N 7 # dimension must be defined before +# xstart 3 : # read 3 numbers from next lines, the colon is superfluous +# 0.2 0.3 +# 0.4 0.5 0.6 +# 0.7 +# +# reads the first three numbers starting from the +# line following the keyword "xstart" and recycles +# these numbers (or cut them) to length N, resulting in +# xstart=[0.2 0.3 0.4 0.2 0.3 0.4 0.2] +# No comments are allowed between the numbers. I.e. +# +# xstart 3 22 anything here is ok, 22 is disregarded # still ok +# 0.2 0.3 # this comment fails, if >2 numbers to be read +# 0.4 0.5 0.6 +# +# would fail due to the comment between second and third number to +# be read. diff --git a/cpp_dnn/cmaes_signals.par b/cpp_dnn/cmaes_signals.par new file mode 100644 index 0000000..e6536fb --- /dev/null +++ b/cpp_dnn/cmaes_signals.par @@ -0,0 +1,77 @@ +# +# Comment characters are '%' and '#' to end of line. +# Uncomment one or more rows (and/or add an uncommented line) +# and save this file to induce an action. +# +# Function cmaes_ReadSignals reads and interprets the syntax +# as given in this file +# + +## --- modify termination condition, see also initials.par for more docu +# stop now # manual stop as soon as signals.par is parsed +# stopMaxFunEvals 4.5e6 # stop after given number of function evaluations +# stopMaxIter 3e3 # stop after given number of iterations (generations) +# stopFitness 1e-6 # stop if function value is smaller than stopFitness +# stopTolFun 1e-12 # stop if function value differences are small +# stopTolFunHist 1e-12 # stop if f-value differences between best values are small +# stopTolX 1e-1 # stop if step-sizes/steps in x-space are small +# stopTolUpXFactor 1e3 # stop if std dev increases more than by TolUpXFactor + +# checkeigen 1 # number > 0 switches checking on, Check_Eigen() is O(n^3)! +# maxTimeFractionForEigendecompostion 0.2 + +# write resume allcmaes.dat # write data for restart + +## --- print data to stdout +## syntax (in one row): +## print <keyword for cmaes_WriteToFilePtr()>[+<another keyword>] +## [<seconds>] +## After the first iteration ONLY the action with the smallest +## seconds value will take place. +## For more info see write data below. + +# print gen+fitness 5 +## "few" prints Fevals Fval Sigma Max&MinCoorDev AxisRatio MinOfD +# print fewinfo 30 # print every n seconds +# print few+clock 2 # clock: used processor time since start + print few 2 +# print fitness+xmean 3 +# print gen+few 20 +# print gen+few+few(diag(D)) 0 +# print few(diag(D)) +# print all 100 + +## --- write data to file (example2.c can also write into data file) +## syntax (in one row): +## write <keyword for cmaes_WriteToFilePtr()>[+<another keyword>] +## [<filename>] [<seconds>] +## After the first iteration ONLY the action with the smallest +## seconds value will take place. + +## Default filename is tmpcmaes.dat. Default is seconds=1, +## and during the first second or so it is 0 with a smooth +## writing gap transition until up to one second. For +## seconds=0 writing takes place every generation. For seconds < 0 +## writing is blocked after the first key where seconds < 0 was +## written. Blocking lasts until all values for seconds are >=0 +## again. For keywords compare cmaes_interface.h and function +## cmaes_WriteToFilePtr in cmaes.c. + +## KEYWORD(s) FILE SECONDS to wait until next writing +# write with default format for plotting +write iter+eval+sigma+axisratio+fbestever+fitness+fmedian+fworst+mindii+idxmaxSD+maxSD+idxminSD+minSD outcmaesfit.dat +write iter+eval+sigma+axisratio+stddevratio+diag(D) outcmaesaxlen.dat +write iter+eval+sigma+idxmaxSD+idxminSD+stddev outcmaesstddev.dat +write iter+eval+sigma+0+0+xmean outcmaesxmean.dat +write iter+eval+sigma+0+fitness+xbest outcmaesxrecentbest.dat + +## KEYWORD(s) FILE SECONDS to wait until next writing + +# write few+few(diag(D)) rescmaes.dat 0 # writes every generation +# write few+diag(D) tmp.dat 0 # writes every generation +# write few+few(diag(D)) rescmaes.dat # writes once per second +# write few+few(diag(D)) rescmaes.dat -1 # writes once, blocks further writing +# write gen+xbest xcmaes.dat 2 +# write B allcmaes.dat 100 # writes every 100 seconds +# write all allcmaes.dat 100 +# write gen+arfitness tmpcmaes.dat 0 diff --git a/cpp_dnn/dnn.cpp b/cpp_dnn/dnn.cpp index bd396fb..2f62ff2 100644 --- a/cpp_dnn/dnn.cpp +++ b/cpp_dnn/dnn.cpp @@ -474,30 +474,9 @@ namespace cpp_dnn { this->sgd_step(lrate); } - std::cout<<"Loss: "<< sum_loss<<std::endl; + // std::cout<<"Loss: "<< sum_loss<<std::endl; - // for(var i=0; i < iters; i++){ - // var j= getRandomInt(N); - // var Xt = X.slice([0,j], [D,1]); - // var Yt = Y.slice([0,j], [D,1]); - // var Ypred = this.forward(Xt); - // sum_loss.add(sum_loss, this.loss.forward(Ypred, Yt)); - // var err = this.loss.backward(); - // this.backward(err); - // this.sgd_step(lrate); - - // } - // D, N = X.shape - // for it in range(iters): - // j = np.random.randint(N) - // Xt = X[:,j:j+1]; Yt = Y[:,j:j+1] - // print(Xt) - // Ypred=self.forward( Xt) - // l=self.loss.forward(Ypred, Yt) - // delta=self.loss.backward() - // b=self.backward( delta) - // s=self.sgd_step( lrate) - // } + } // private: diff --git a/cpp_dnn/image.cpp b/cpp_dnn/image.cpp index 0bb6dbe..21d060c 100644 --- a/cpp_dnn/image.cpp +++ b/cpp_dnn/image.cpp @@ -18,8 +18,8 @@ namespace cpp_dnn { class Image { public: - scalar res=0.01; - scalar bound =3.0; + scalar res=0.05; + scalar bound =2.5; scalar minX; scalar maxX; scalar minY; @@ -31,7 +31,7 @@ namespace cpp_dnn { int height; int width; - Image():res(0.01),bound(3.0){ + Image():res(0.05),bound(2.5){ minX=-bound; maxX=bound; minY=-bound; @@ -99,11 +99,23 @@ namespace cpp_dnn { saveImage(predict(target.t()) ,"Target_"+ name); return target.t(); } + + int getHamming(const MatrixXI& Ypred,const MatrixXI& YY){ + int d=0; + for(unsigned i=0;i<Ypred.size();i++){ + if((Ypred(i)>0.0 && YY(i)>0.0 )||(Ypred(i)<=0.0 && YY(i)<=0.0)){ + }else{ + d++; + } + } + return d; + } void saveImage(const MatrixXI& Ypred,std::string name){ const int size=height*width*4; int stride=0; unsigned char pix[size]; + for(unsigned i=0;i<Ypred.size();i++){ if(Ypred(i)>0.0){ @@ -123,7 +135,7 @@ namespace cpp_dnn { ////////////////create image and save it////////////////////////// cv::Mat image = cv::Mat(width, height, CV_8UC4, pix); - std::string fileName="img/"+name+".jpg"; + std::string fileName="img_dnn/"+name+".png"; cv::imwrite( fileName, image ); bool preview=false; if(preview){ diff --git a/cpp_dnn/main.cpp b/cpp_dnn/main.cpp index badd39b..f2c6ac0 100644 --- a/cpp_dnn/main.cpp +++ b/cpp_dnn/main.cpp @@ -13,6 +13,8 @@ using namespace cpp_dnn; using scalar=double; +int COUNT=0; + scalar getRandom(){//between 0 and 1 return ((scalar) rand() / (RAND_MAX)); } @@ -45,333 +47,1235 @@ std::vector<scalar> pointerToVector(double const *x, int N){ // /* the objective (fitness) function to be minimized */ double fitfun(double const *x, int N,MatrixX X,MatrixX Y,Sequential seq) { /* function "cigtab" */ + Image Im; + MatrixX XX=Im.getLocMatrix(); seq.setWeights( pointerToVector(x, N)); - seq.step(X,Y); - return seq.sumLoss(); + auto Ypred=seq.step(X,Y); + auto YY=Im.predict(Y); + double res=(double) Im.getHamming(Ypred,YY); + if(COUNT%100==0){ + Im.saveImage(Ypred,std::to_string(COUNT)); //test + cout<<"iter:"<<COUNT<<" score:"<<res<<endl; + + } + COUNT++; + + + return res; } //-------------------------------------------------------------------------------------------------- int main(int const, char const**) { - // //Create network - // std::vector<Node*> network; - - // Linear l1(2, 12); - // Tanh a1; - - // Linear l2(12, 12); - // Tanh a2; - - // Linear l3(12, 6); - // Tanh a3; - - // Linear l4(6, 6); - // Tanh a4; - - // Linear l5(6, 2); - // SoftMax a5; - - // NLL l; - // network.push_back( &l1); - // network.push_back( &a1); - // network.push_back( &l2); - // network.push_back( &a2); - // network.push_back( &l3); - // network.push_back( &a3); - // network.push_back( &l4); - // network.push_back( &a4); - // network.push_back( &l5); - // network.push_back( &a5); - - // Sequential seq(network, &l); - - // Linear linear_1(2,3); - // scalar lrate = 0.005; - // // arma::Mat<double> a=arma::randu(2,2); - - - // arma::Mat<scalar> X; - // arma::Mat<scalar> Y; - // X<< 2<< 3<< 9<< 12<<arma::endr - // << 5<< 2<< 6<< 5<<arma::endr; - // Y<<0<< 1<< 0<< 1<<arma::endr - // <<1<< 0<< 1<< 0<<arma::endr; - // // arma::Mat<scalar> dL_dz1; - // // dL_dz1<< 1.69467553e-09<<-1.33530535e-06<< 0.00000000e+00<<-0.00000000e+00<<arma::endr - // // <<-5.24547376e-07<< 5.82459519e-04<< -3.84805202e-10<< 1.47943038e-09<<arma::endr - // // <<-3.47063705e-02<< 2.55611604e-01<< -1.83538094e-02<< 1.11838432e-04<<arma::endr; - - // // std::cout << linear_1.forward(X) << '\n'; - // // std::cout << linear_1.backward(dL_dz1) << '\n'; - // // linear_1.sgd_step(lrate); - // // std::cout << linear_1._W << '\n'; - // // std::cout << linear_1._W0 << '\n'; + scalar res=0.05f; + scalar bound =2.5f; - - // std::cout << arma::index_max(Y,0) << '\n'; - // std::vector<Node*> network; - // Linear l1(2, 3); - // ReLU t; - // Linear l2(3, 2); - // SoftMax s; - // NLL l; - // network.push_back( &l1); - // network.push_back( &t); - // network.push_back( &l2); - // network.push_back( &s); - - // arma::Mat<scalar> z_1 = l1.forward(X); - - // std::cout << z_1 << '\n'; - - // arma::Mat<scalar> a_1 = t.forward(z_1); - - // std::cout << a_1 << '\n'; - - // arma::Mat<scalar> z_2; - - // // z_2 <<0.40837833<<0.53900088<< 0.56956001<< 0.57209377<<arma::endr - // // << -0.66368766<< 0.65353931<< 0.96361427<< 0.98919526<<arma::endr; - - - // z_2<<5.28714248<< 3.64078533<< 10.92235599<< 12.36410102<<arma::endr - // << 0.78906625<< 0.80620366<< 2.41861097<<4.44170662<<arma::endr; - // // arma::Mat<scalar> z_2 = l2.forward(a_1); + scalar minX=-bound; + scalar maxX=bound; + scalar minY=-bound; + scalar maxY=bound; + scalar dx=res; + scalar dy=res; + int height=(int)((maxX-minX)/dx); + int width=(int)((maxY-minY)/dy); - // // std::cout << z_2 << '\n'; + cout<<"width: "<<width<<", height: "<<height <<std::endl; - // arma::Mat<scalar> a_2 = s.forward(z_2); + //Create Image + Image Im; + MatrixX X=Im.getLocMatrix(); - // std::cout << a_2 << '\n'; - - // arma::Mat<scalar> loss = l.forward(a_2, Y); - - // std::cout << loss<< '\n'; - - // arma::Mat<scalar> dloss = l.backward(); - - // std::cout << dloss<< '\n'; - - // arma::Mat<scalar> dL_dz2 = s.backward(dloss); - - // std::cout << dL_dz2<< '\n'; - - // arma::Mat<scalar> dL_da1; - - // // dL_da1<<0.47375374<< -0.3361494<< 0.25611147<<-0.38332583<<arma::endr - // // <<-0.2210031<< 0.15681155<< -0.11947437<< 0.17881905<<arma::endr - // // <<-0.56355604<< 0.39986813<< -0.30465863<< 0.45598708<<arma::endr; - - // dL_da1<< 6.28919807e-01<< -3.52832568e-02<< 6.35791049e-01<< -2.30458563e-04<<arma::endr - // <<-2.93387075e-01<< 1.64594141e-02<< -2.96592466e-01<< 1.07507449e-04<<arma::endr - // <<-7.48134578e-01<< 4.19713676e-02<< -7.56308297e-01<< 2.74143091e-04<<arma::endr; - - // std::cout << dL_da1<< '\n'; - - // // dL_da1 = linear_2.backward(dL_dz2) + cpp_frep::Circle c(1.5f,0.0f,0.0f); + // std::vector<unsigned char> targ1 =drawFrep(&c,minX, maxX, minY, maxY, dx, dy,"circle_target",false); + MatrixX targ1=Im.getTarget( &c,"circle"); + + cpp_frep::Rectangle r(-1.5f,1.5f,-1.0f,1.0f); + cpp_frep::Rotate rot1 (&r,0.0f,0.0f,90.0f); + // std::vector<unsigned char> targ2 =drawFrep(&rot1,minX, maxX, minY, maxY, dx, dy,"rectange_target",false); + MatrixX targ2=Im.getTarget( &rot1,"rectange"); + + cpp_frep::InvoluteGear gear( 1.0f, 1.0f, 1.1f, 20.0f, 8.0f) ; + cpp_frep::Rotate rot (&gear,0.0f,0.0f,15.0f); + cpp_frep::Scale sc1(&rot,0.0f,0.0f,0.5f,0.5f); + cpp_frep::Add target(&sc1,&c); + // std::vector<unsigned char> targ3 =drawFrep(&target,minX, maxX, minY, maxY, dx, dy,"gear_target",false); + MatrixX targ3=Im.getTarget( &target,"gear"); + + + cpp_frep::Circle c1(0.9f,-0.5f,0.8f); + cpp_frep::Circle c2(0.8f,0.2f,-0.2f); + cpp_frep::Circle c3(0.9f,1.5f,0.0f); + cpp_frep::Circle c4(0.9f,1.7f,-1.1f); + // Subtract ss(&rot1,&c1); + // Subtract sss(&ss,&c2); + cpp_frep::Add aa(&c1,&c3); + cpp_frep::Add aaa(&aa,&c2); + cpp_frep::Add a(&aaa,&c4); + cpp_frep::Morph m (&a,&target,0.6f); + cpp_frep::Rotate rot2 (&m,0.3f,0.0f,-90.0f); + // Scale scc (&m,0.0f,0.0f,1.0,1.0); + // std::vector<unsigned char> targ4 =drawFrep(&rot2,minX, maxX, minY, maxY, dx, dy,"blob_target",false); + MatrixX targ4=Im.getTarget( &rot2,"blob"); + + cpp_frep::Circle c5(0.5f,0.0f,0.0f); + cpp_frep::Subtract ss(&c,&c5); + // std::vector<unsigned char> targ5 =drawFrep(&ss,minX, maxX, minY, maxY, dx, dy,"hole_target",false); + MatrixX targ5=Im.getTarget( &ss,"hole"); + + //////////////////////////////////////////////////// + + //Create network + std::vector<Node*> network; - // arma::Mat<scalar> dL_dz1 = t.backward(dL_da1); - - // std::cout << dL_dz1<< '\n'; - - // arma::Mat<scalar> dL_dX = l1.backward(dL_dz1); - - // std::cout << dL_dX<< '\n'; - - // l1.sgd_step(lrate); - // std::cout << l1._W << '\n'; - // std::cout << l1._W0 << '\n'; - - // l1.sgd_step(lrate); - // std::cout << l1._W << '\n'; - // std::cout << l1._W0 << '\n'; - - // dL_dX = linear_1.backward(dL_dz1) - // unit_test('dL_dX', test_values['dL_dX'], dL_dX) - - // Sequential seq(network, &l); - // std::cout <<seq.getWeightsNum()<<'\n'; - // std::cout <<seq.step(X,Y)<< '\n'; - + Linear l1(2, 12); + Tanh a1; - // std::vector<Node*> network; - // Linear l1(2, 3); - // Sigmoid r; - // Linear l2(3, 3); - // Tanh t; - // Tanh t1; - // Linear l3(3, 2); - // SoftMax s; - // NLL l; - // network.push_back( &l1); - // network.push_back( &r); - // // network.push_back( &l2); - // // network.push_back( &t1); - // network.push_back( &l3); - // network.push_back( &s); + Linear l2(12, 12); + ReLU a2; - // Sequential seq(network, &l); - // std::cout <<seq.getWeightsNum()<<'\n'; - // std::cout <<seq.step(X,Y)<< '\n'; - arma::Mat<scalar> X; - arma::Mat<scalar> Y; + Linear l3(12, 6); + ReLU a3; - X <<-0.23390341<< 1.18151883<< -2.46493986<< 1.55322202<< 1.27621763<< 2.39710997<< -1.3440304<< -0.46903436<< -0.64673502<< -1.44029872<< - -1.37537243<< 1.05994811<< -0.93311512<< 1.02735575<< -0.84138778<<-2.22585412<< -0.42591102<< 1.03561105<< 0.91125595<< -2.26550369<<arma::endr << - -0.92254932<< -1.1030963<< -2.41956036<< -1.15509002<< -1.04805327<< 0.08717325<< 0.8184725<< -0.75171045<< 0.60664705<< 0.80410947<< - -0.11600488<< 1.03747218<< -0.67210575<< 0.99944446<< -0.65559838<<-0.40744784<< -0.58367642<< 1.0597278<< -0.95991874<< -1.41720255<<arma::endr; + Linear l4(6, 6); + Tanh a4; - Y <<1.<< 1.<< 0.<< 1.<< 1.<< 1.<< 0.<< 0.<< 0.<< 0.<< 0.<< 1.<< 1.<< 1.<< 0.<< 0.<< 0.<< 1.<< 1.<< 0.<<arma::endr - <<0.<< 0.<< 1.<< 0.<< 0.<< 0.<< 1.<< 1.<< 1.<< 1.<< 1.<< 0.<< 0.<< 0.<< 1.<< 1.<< 1.<< 0.<< 0.<< 1.<<arma::endr; + Linear l5(6, 2); + SoftMax a5; - std::vector<Node*> network; - Linear l1(2, 10); - ReLU r1; - Linear l2(10, 10); - ReLU r2; - Linear l3(10, 2); - SoftMax s; NLL l; network.push_back( &l1); - network.push_back( &r1); + network.push_back( &a1); network.push_back( &l2); - network.push_back( &r2); + network.push_back( &a2); network.push_back( &l3); - network.push_back( &s); + network.push_back( &a3); + network.push_back( &l4); + network.push_back( &a4); + network.push_back( &l5); + network.push_back( &a5); - Sequential nn(network, &l); + Sequential seq(network, &l); - // Sequential([Linear(2, 10), ReLU(), Linear(10, 10), ReLU(), Linear(10,2), SoftMax()], NLL()) + ///////TARGET///// + MatrixX Y=targ5; /////////////////////////////////////////////target + Im.saveImage(seq.step(X,Y),"trial"); //test + std::cout<<"Number of Weights:"<<(int)seq.getWeightsNum()<<std::endl; + + // ///////////////////////////// //Optimize neldermead + // unsigned numWeights=seq.getWeightsNum(); + auto YY=Im.predict(Y); + + + ///////SGD///// + + // unsigned epoch=2500; + // unsigned it=1000;//10000 + // scalar lrate = 0.005; + // for (unsigned i=0;i<epoch;i++){ + // if(i%25==0){ + // auto Ypred=seq.step(X,Y); + // Im.saveImage(Ypred,std::to_string(i)); //test + // std::cout<<"iter:"<<i<<" score:"<<Im.getHamming(Ypred,YY)<<std::endl; + // } + // seq.sgd(X, Y, it, lrate); + // } - unsigned it=10000; - unsigned D= X.n_rows; - unsigned N= X.n_cols; - unsigned O= Y.n_rows; - scalar lrate = 0.005; + // Modifies the weights and biases - nn.sgd(X, Y, it, lrate); - - // Draw it... - cout<<nn.predict(nn.forward(X))<<endl; + ////cmaes// + cmaes_t evo; /* an CMA-ES type struct or "object" */ + double *arFunvals, *const*pop, *xfinal; + int i; + arFunvals = cmaes_init(&evo, 5, NULL, NULL, 0, 0, "cpp_dnn/cmaes_initials.par"); + printf("%s\n", cmaes_SayHello(&evo)); + + cmaes_ReadSignals(&evo, "cmaes_signals.par"); /* write header and initial values */ + + /* Iterate until stop criterion holds */ + while(!cmaes_TestForTermination(&evo)) + { + /* generate lambda new search points, sample population */ + pop = cmaes_SamplePopulation(&evo); /* do not change content of pop */ + + /* Here we may resample each solution point pop[i] until it + becomes feasible. function is_feasible(...) needs to be + user-defined. + Assumptions: the feasible domain is convex, the optimum is + not on (or very close to) the domain boundary, initialX is + feasible and initialStandardDeviations are sufficiently small + to prevent quasi-infinite looping. */ + /* for (i = 0; i < cmaes_Get(&evo, "popsize"); ++i) + while (!is_feasible(pop[i])) + cmaes_ReSampleSingle(&evo, i); + */ + + /* evaluate the new search points using fitfun */ + for (i = 0; i < cmaes_Get(&evo, "lambda"); ++i) { + arFunvals[i] = fitfun(pop[i], (int) cmaes_Get(&evo, "dim"),X,Y,seq); + } + + /* update the search distribution used for cmaes_SamplePopulation() */ + cmaes_UpdateDistribution(&evo, arFunvals); + + /* read instructions for printing output or changing termination conditions */ + cmaes_ReadSignals(&evo, "cmaes_signals.par"); + fflush(stdout); /* useful in MinGW */ + } + printf("Stop:\n%s\n", cmaes_TestForTermination(&evo)); /* print termination reason */ + cmaes_WriteToFile(&evo, "all", "allcmaes.dat"); /* write final results */ - cout<<"hereeee "<<endl; + /* get best estimator for the optimum, xmean */ + xfinal = cmaes_GetNew(&evo, "xmean"); /* "xbestever" might be used as well */ + cmaes_exit(&evo); /* release memory */ + /* do something with final solution and finally release memory */ + std::cout<<*xfinal<<'\n'; - // X = np.array([[2, 3, 9, 12], - // [5, 1, 6, 5]]) - - // y = np.array([[1, 0, 1, 0]]) - // return X, for_softmax(y) + free(xfinal); + seq.setWeights( pointerToVector(pop[0], (int) cmaes_Get(&evo, "dim"))); + Im.saveImage(seq.step(X,Y),"trialll"); + + + return 0; } -// void oldCode(){ -// //Create Image -// Image Im; -// MatrixX X=Im.getLocMatrix(); -// cpp_frep::Circle frep(1.5f,0.0f,0.0f); -// MatrixX Y=Im.getTarget( &frep ,"Circle"); -// // Im.saveImage(seq.step(X,Y),"trial"); //test - -// ///////////////////////////// //Optimize neldermead -// unsigned numWeights=seq.getWeightsNum(); - -// // std::vector<scalar> v=getRandomWeights(numWeights); -// // std::cout << seq.sumLoss()<< '\n'; -// // seq.setWeights(v); -// // Im.saveImage(seq.step(X,Y),"trial1"); //test -// // std::cout << seq.sumLoss()<< '\n'; - - -// // float precision = 0.001; -// // int dimension = (int)numWeights; -// // unsigned maxSteps=1000; -// // NelderMeadOptimizer o(dimension, precision); -// // std::cout << dimension<< '\n'; - -// // request a simplex to start with -// // Vector v(getRandomWeights(numWeights)); -// // Vector v1(getRandomWeights(numWeights)); -// // Vector v2(getRandomWeights(numWeights)); -// // o.insert(v); -// // o.insert(v1); -// // o.insert(v2); -// // unsigned count=0; - -// // while (!o.done() && count<maxSteps) { -// // seq.setWeights(v.get()); -// // Im.saveImage(seq.step(X,Y),"trial"+std::to_string(count)); -// // v = o.step(v, -seq.sumLoss()); //later change f(v) -// // count++; - -// // } - -// ///////////////////////////// //Optimize CMAES -// cmaes_t evo; /* an CMA-ES type struct or "object" */ -// double *arFunvals, *const*pop, *xfinal; -// int i; -// arFunvals = cmaes_init(&evo, 5, NULL, NULL, 0, 0, "cpp_dnn/cmaes_initials.par"); -// printf("%s\n", cmaes_SayHello(&evo)); - -// cmaes_ReadSignals(&evo, "cmaes_signals.par"); /* write header and initial values */ - -// /* Iterate until stop criterion holds */ -// while(!cmaes_TestForTermination(&evo)) -// { -// /* generate lambda new search points, sample population */ -// pop = cmaes_SamplePopulation(&evo); /* do not change content of pop */ - -// /* Here we may resample each solution point pop[i] until it -// becomes feasible. function is_feasible(...) needs to be -// user-defined. -// Assumptions: the feasible domain is convex, the optimum is -// not on (or very close to) the domain boundary, initialX is -// feasible and initialStandardDeviations are sufficiently small -// to prevent quasi-infinite looping. */ -// /* for (i = 0; i < cmaes_Get(&evo, "popsize"); ++i) -// while (!is_feasible(pop[i])) -// cmaes_ReSampleSingle(&evo, i); -// */ - -// /* evaluate the new search points using fitfun */ -// for (i = 0; i < cmaes_Get(&evo, "lambda"); ++i) { -// arFunvals[i] = fitfun(pop[i], (int) cmaes_Get(&evo, "dim"),X,Y,seq); -// } - -// /* update the search distribution used for cmaes_SamplePopulation() */ -// cmaes_UpdateDistribution(&evo, arFunvals); - -// /* read instructions for printing output or changing termination conditions */ -// cmaes_ReadSignals(&evo, "cmaes_signals.par"); -// fflush(stdout); /* useful in MinGW */ -// } -// printf("Stop:\n%s\n", cmaes_TestForTermination(&evo)); /* print termination reason */ -// cmaes_WriteToFile(&evo, "all", "allcmaes.dat"); /* write final results */ - -// /* get best estimator for the optimum, xmean */ -// xfinal = cmaes_GetNew(&evo, "xmean"); /* "xbestever" might be used as well */ -// cmaes_exit(&evo); /* release memory */ - -// /* do something with final solution and finally release memory */ -// std::cout<<*xfinal<<'\n'; - -// free(xfinal); -// seq.setWeights( pointerToVector(pop[0], (int) cmaes_Get(&evo, "dim"))); -// Im.saveImage(seq.step(X,Y),"trialll"); - -// } +//dnn_sgd target 1 + // iter:0 score:7266 + // iter:25 score:286 + // iter:50 score:302 + // iter:75 score:182 + // iter:100 score:264 + // iter:125 score:390 + // iter:150 score:83 + // iter:175 score:125 + // iter:200 score:187 + // iter:225 score:189 + // iter:250 score:188 + // iter:275 score:164 + // iter:300 score:151 + // iter:325 score:98 + // iter:350 score:74 + // iter:375 score:118 + // iter:400 score:175 + // iter:425 score:59 + // iter:450 score:103 + // iter:475 score:126 + // iter:500 score:88 + // iter:525 score:79 + // iter:550 score:110 + // iter:575 score:98 + // iter:600 score:126 + // iter:625 score:153 + // iter:650 score:149 + // iter:675 score:76 + // iter:700 score:65 + // iter:725 score:70 + // iter:750 score:76 + // iter:775 score:50 + // iter:800 score:68 + // iter:825 score:89 + // iter:850 score:141 + // iter:875 score:142 + // iter:900 score:154 + // iter:925 score:47 + // iter:950 score:75 + // iter:975 score:108 + // iter:1000 score:53 + // iter:1025 score:69 + // iter:1050 score:120 + // iter:1075 score:62 + // iter:1100 score:70 + // iter:1125 score:59 + // iter:1150 score:122 + // iter:1175 score:107 + // iter:1200 score:84 + // iter:1225 score:77 + // iter:1250 score:67 + // iter:1275 score:86 + // iter:1300 score:76 + // iter:1325 score:139 + // iter:1350 score:43 + // iter:1375 score:119 + // iter:1400 score:113 + // iter:1425 score:68 + // iter:1450 score:63 + // iter:1475 score:44 + // iter:1500 score:163 + // iter:1525 score:50 + // iter:1550 score:118 + // iter:1575 score:65 + // iter:1600 score:72 + // iter:1625 score:93 + // iter:1650 score:33 + // iter:1675 score:44 + // iter:1700 score:52 + // iter:1725 score:107 + // iter:1750 score:67 + // iter:1775 score:34 + // iter:1800 score:66 + // iter:1825 score:81 + // iter:1850 score:47 + // iter:1875 score:43 + // iter:1900 score:63 + // iter:1925 score:45 + // iter:1950 score:43 + // iter:1975 score:79 + // iter:2000 score:53 + // iter:2025 score:63 + // iter:2050 score:52 + // iter:2075 score:83 + // iter:2100 score:62 + // iter:2125 score:90 + // iter:2150 score:61 + // iter:2175 score:95 + // iter:2200 score:77 + // iter:2225 score:79 + // iter:2250 score:85 + // iter:2275 score:57 + // iter:2300 score:89 + // iter:2325 score:36 + // iter:2350 score:56 + // iter:2375 score:30 + // iter:2400 score:54 + // iter:2425 score:140 + // iter:2450 score:52 + // iter:2475 score:69 +//dnn_sgd target 2 + // Number of Weights:326 + // iter:0 score:7760 + // iter:25 score:459 + // iter:50 score:270 + // iter:75 score:344 + // iter:100 score:142 + // iter:125 score:138 + // iter:150 score:203 + // iter:175 score:264 + // iter:200 score:137 + // iter:225 score:98 + // iter:250 score:84 + // iter:275 score:202 + // iter:300 score:134 + // iter:325 score:106 + // iter:350 score:62 + // iter:375 score:88 + // iter:400 score:133 + // iter:425 score:106 + // iter:450 score:91 + // iter:475 score:227 + // iter:500 score:201 + // iter:525 score:141 + // iter:550 score:90 + // iter:575 score:36 + // iter:600 score:105 + // iter:625 score:106 + // iter:650 score:80 + // iter:675 score:67 + // iter:700 score:26 + // iter:725 score:59 + // iter:750 score:69 + // iter:775 score:45 + // iter:800 score:85 + // iter:825 score:97 + // iter:850 score:32 + // iter:875 score:42 + // iter:900 score:109 + // iter:925 score:43 + // iter:950 score:77 + // iter:975 score:59 + // iter:1000 score:73 + // iter:1025 score:68 + // iter:1050 score:101 + // iter:1075 score:105 + // iter:1100 score:46 + // iter:1125 score:19 + // iter:1150 score:96 + // iter:1175 score:36 + // iter:1200 score:56 + // iter:1225 score:35 + // iter:1250 score:32 + // iter:1275 score:64 + // iter:1300 score:70 + // iter:1325 score:33 + // iter:1350 score:20 + // iter:1375 score:43 + // iter:1400 score:35 + // iter:1425 score:19 + // iter:1450 score:33 + // iter:1475 score:27 + // iter:1500 score:18 + // iter:1525 score:47 + // iter:1550 score:16 + // iter:1575 score:19 + // iter:1600 score:6 + // iter:1625 score:32 + // iter:1650 score:16 + // iter:1675 score:61 + // iter:1700 score:22 + // iter:1725 score:8 + // iter:1750 score:15 + // iter:1775 score:23 + // iter:1800 score:10 + // iter:1825 score:6 + // iter:1850 score:29 + // iter:1875 score:21 + // iter:1900 score:10 + // iter:1925 score:9 + // iter:1950 score:4 + // iter:1975 score:5 + // iter:2000 score:23 + // iter:2025 score:67 + // iter:2050 score:111 + // iter:2075 score:34 + // iter:2100 score:6 + // iter:2125 score:29 + // iter:2150 score:18 + // iter:2175 score:48 + // iter:2200 score:5 + // iter:2225 score:12 + // iter:2250 score:10 + // iter:2275 score:24 + // iter:2300 score:14 + // iter:2325 score:1 + // iter:2350 score:8 + // iter:2375 score:2 + // iter:2400 score:17 + // iter:2425 score:20 + // iter:2450 score:3 + // iter:2475 score:5 +//dnn_sgd target 3 + // Number of Weights:326 + // iter:0 score:5168 + // iter:25 score:1175 + // iter:50 score:1110 + // iter:75 score:1031 + // iter:100 score:1106 + // iter:125 score:872 + // iter:150 score:989 + // iter:175 score:745 + // iter:200 score:905 + // iter:225 score:825 + // iter:250 score:665 + // iter:275 score:694 + // iter:300 score:903 + // iter:325 score:692 + // iter:350 score:792 + // iter:375 score:767 + // iter:400 score:695 + // iter:425 score:633 + // iter:450 score:699 + // iter:475 score:719 + // iter:500 score:642 + // iter:525 score:704 + // iter:550 score:634 + // iter:575 score:547 + // iter:600 score:581 + // iter:625 score:541 + // iter:650 score:723 + // iter:675 score:610 + // iter:700 score:658 + // iter:725 score:595 + // iter:750 score:595 + // iter:775 score:669 + // iter:800 score:672 + // iter:825 score:723 + // iter:850 score:834 + // iter:875 score:593 + // iter:900 score:609 + // iter:925 score:582 + // iter:950 score:592 + // iter:975 score:511 + // iter:1000 score:579 + // iter:1025 score:537 + // iter:1050 score:536 + // iter:1075 score:512 + // iter:1100 score:606 + // iter:1125 score:571 + // iter:1150 score:532 + // iter:1175 score:607 + // iter:1200 score:606 + // iter:1225 score:496 + // iter:1250 score:492 + // iter:1275 score:583 + // iter:1300 score:621 + // iter:1325 score:521 + // iter:1350 score:672 + // iter:1375 score:643 + // iter:1400 score:607 + // iter:1425 score:551 + // iter:1450 score:540 + // iter:1475 score:573 + // iter:1500 score:622 + // iter:1525 score:499 + // iter:1550 score:510 + // iter:1575 score:584 + // iter:1600 score:542 + // iter:1625 score:541 + // iter:1650 score:573 + // iter:1675 score:607 + // iter:1700 score:546 + // iter:1725 score:661 + // iter:1750 score:548 + // iter:1775 score:533 + // iter:1800 score:695 + // iter:1825 score:592 + // iter:1850 score:553 + // iter:1875 score:557 + // iter:1900 score:590 + // iter:1925 score:515 + // iter:1950 score:559 + // iter:1975 score:514 + // iter:2000 score:490 + // iter:2025 score:539 + // iter:2050 score:591 + // iter:2075 score:517 + // iter:2100 score:547 + // iter:2125 score:560 + // iter:2150 score:554 + // iter:2175 score:468 + // iter:2200 score:547 + // iter:2225 score:559 + // iter:2250 score:551 + // iter:2275 score:651 + // iter:2300 score:582 + // iter:2325 score:617 + // iter:2350 score:606 + // iter:2375 score:550 + // iter:2400 score:506 + // iter:2425 score:837 + // iter:2450 score:534 + // iter:2475 score:566 +//dnn_sgd target 4 + // width: 99, height: 99 + // Number of Weights:326 + // iter:0 score:6479 + // iter:25 score:484 + // iter:50 score:220 + // iter:75 score:244 + // iter:100 score:350 + // iter:125 score:325 + // iter:150 score:374 + // iter:175 score:303 + // iter:200 score:425 + // iter:225 score:184 + // iter:250 score:248 + // iter:275 score:229 + // iter:300 score:197 + // iter:325 score:252 + // iter:350 score:316 + // iter:375 score:222 + // iter:400 score:194 + // iter:425 score:134 + // iter:450 score:201 + // iter:475 score:146 + // iter:500 score:166 + // iter:525 score:187 + // iter:550 score:198 + // iter:575 score:237 + // iter:600 score:185 + // iter:625 score:154 + // iter:650 score:173 + // iter:675 score:364 + // iter:700 score:155 + // iter:725 score:381 + // iter:750 score:165 + // iter:775 score:224 + // iter:800 score:169 + // iter:825 score:157 + // iter:850 score:182 + // iter:875 score:163 + // iter:900 score:154 + // iter:925 score:143 + // iter:950 score:201 + // iter:975 score:291 + // iter:1000 score:198 + // iter:1025 score:161 + // iter:1050 score:131 + // iter:1075 score:188 + // iter:1100 score:185 + // iter:1125 score:132 + // iter:1150 score:144 + // iter:1175 score:217 + // iter:1200 score:210 + // iter:1225 score:160 + // iter:1250 score:183 + // iter:1275 score:202 + // iter:1300 score:257 + // iter:1325 score:210 + // iter:1350 score:163 + // iter:1375 score:118 + // iter:1400 score:197 + // iter:1425 score:160 + // iter:1450 score:158 + // iter:1475 score:166 + // iter:1500 score:154 + // iter:1525 score:162 + // iter:1550 score:211 + // iter:1575 score:150 + // iter:1600 score:164 + // iter:1625 score:193 + // iter:1650 score:123 + // iter:1675 score:146 + // iter:1700 score:105 + // iter:1725 score:185 + // iter:1750 score:234 + // iter:1775 score:101 + // iter:1800 score:136 + // iter:1825 score:122 + // iter:1850 score:115 + // iter:1875 score:199 + // iter:1900 score:121 + // iter:1925 score:130 + // iter:1950 score:180 + // iter:1975 score:85 + // iter:2000 score:154 + // iter:2025 score:154 + // iter:2050 score:155 + // iter:2075 score:161 + // iter:2100 score:169 + // iter:2125 score:132 + // iter:2150 score:165 + // iter:2175 score:126 + // iter:2200 score:123 + // iter:2225 score:115 + // iter:2250 score:143 + // iter:2275 score:145 + // iter:2300 score:166 + // iter:2325 score:119 + // iter:2350 score:252 + // iter:2375 score:85 + // iter:2400 score:128 + // iter:2425 score:151 + // iter:2450 score:160 + // iter:2475 score:119 +//dnn_sgd target 5 + // Number of Weights:326 + // iter:0 score:7535 + // iter:25 score:516 + // iter:50 score:376 + // iter:75 score:350 + // iter:100 score:295 + // iter:125 score:301 + // iter:150 score:218 + // iter:175 score:255 + // iter:200 score:196 + // iter:225 score:249 + // iter:250 score:195 + // iter:275 score:164 + // iter:300 score:176 + // iter:325 score:209 + // iter:350 score:225 + // iter:375 score:157 + // iter:400 score:183 + // iter:425 score:188 + // iter:450 score:182 + // iter:475 score:244 + // iter:500 score:81 + // iter:525 score:84 + // iter:550 score:122 + // iter:575 score:121 + // iter:600 score:150 + // iter:625 score:162 + // iter:650 score:209 + // iter:675 score:244 + // iter:700 score:135 + // iter:725 score:93 + // iter:750 score:117 + // iter:775 score:78 + // iter:800 score:114 + // iter:825 score:112 + // iter:850 score:131 + // iter:875 score:183 + // iter:900 score:145 + // iter:925 score:113 + // iter:950 score:96 + // iter:975 score:87 + // iter:1000 score:88 + // iter:1025 score:112 + // iter:1050 score:104 + // iter:1075 score:110 + // iter:1100 score:92 + // iter:1125 score:131 + // iter:1150 score:97 + // iter:1175 score:176 + // iter:1200 score:110 + // iter:1225 score:93 + // iter:1250 score:114 + // iter:1275 score:73 + // iter:1300 score:90 + // iter:1325 score:117 + // iter:1350 score:97 + // iter:1375 score:163 + // iter:1400 score:166 + // iter:1425 score:111 + // iter:1450 score:102 + // iter:1475 score:117 + // iter:1500 score:88 + // iter:1525 score:78 + // iter:1550 score:119 + // iter:1575 score:92 + // iter:1600 score:115 + // iter:1625 score:169 + // iter:1650 score:71 + // iter:1675 score:77 + // iter:1700 score:92 + // iter:1725 score:100 + // iter:1750 score:117 + // iter:1775 score:81 + // iter:1800 score:97 + // iter:1825 score:93 + // iter:1850 score:79 + // iter:1875 score:84 + // iter:1900 score:82 + // iter:1925 score:86 + // iter:1950 score:87 + // iter:1975 score:119 + // iter:2000 score:106 + // iter:2025 score:124 + // iter:2050 score:90 + // iter:2075 score:111 + // iter:2100 score:132 + // iter:2125 score:78 + // iter:2150 score:68 + // iter:2175 score:98 + // iter:2200 score:102 + // iter:2225 score:86 + // iter:2250 score:91 + // iter:2275 score:84 + // iter:2300 score:95 + // iter:2325 score:78 + // iter:2350 score:105 + // iter:2375 score:68 + // iter:2400 score:152 + // iter:2425 score:82 + // iter:2450 score:83 + // iter:2475 score:103 + + +//dnn_cmaes target 1 + // iter:0 score:7191 + // iter:100 score:2809 + // iter:200 score:2809 + // iter:300 score:3091 + // iter:400 score:3515 + // iter:500 score:2859 + // iter:600 score:2629 + // iter:700 score:1527 + // iter:800 score:1445 + // iter:900 score:1498 + // iter:1000 score:2193 + // iter:1100 score:2199 + // iter:1200 score:1046 + // iter:1300 score:1008 + // iter:1400 score:1141 + // iter:1500 score:1034 + // iter:1600 score:1113 + // iter:1700 score:908 + // iter:1800 score:1668 + // iter:1900 score:1101 + // iter:2000 score:870 + // iter:2100 score:652 + // iter:2200 score:1490 + // iter:2300 score:1479 + // iter:2400 score:725 + // iter:2500 score:797 + // iter:2600 score:744 + // iter:2700 score:556 + // iter:2800 score:849 + // iter:2900 score:1052 + // iter:3000 score:2033 + // iter:3100 score:889 + // iter:3200 score:949 + // iter:3300 score:1250 + // iter:3400 score:649 + // iter:3500 score:862 + // iter:3600 score:1601 + // iter:3700 score:503 + // iter:3800 score:453 + // iter:3900 score:456 + // iter:4000 score:555 + // iter:4100 score:915 + // iter:4200 score:616 + // iter:4300 score:561 + // iter:4400 score:1006 + // iter:4500 score:480 + // iter:4600 score:541 + // iter:4700 score:442 + // iter:4800 score:433 + // iter:4900 score:535 + // iter:5000 score:1155 + // iter:5100 score:445 + // iter:5200 score:505 + // iter:5300 score:523 + // iter:5400 score:560 + // iter:5500 score:489 + // iter:5600 score:569 + // iter:5700 score:425 + // iter:5800 score:958 + // iter:5900 score:543 + // iter:6000 score:422 + // iter:6100 score:464 + // iter:6200 score:551 + // iter:6300 score:628 + // iter:6400 score:543 + // iter:6500 score:585 + // iter:6600 score:436 + // iter:6700 score:382 + // iter:6800 score:385 + // iter:6900 score:353 + // iter:7000 score:512 + // iter:7100 score:412 + // iter:7200 score:519 + // iter:7300 score:268 + // iter:7400 score:2101 + // iter:7500 score:426 + // iter:7600 score:361 + // iter:7700 score:301 + // iter:7800 score:414 + // iter:7900 score:335 + // iter:8000 score:507 + // iter:8100 score:317 + // iter:8200 score:387 + // iter:8300 score:325 + // iter:8400 score:245 + // iter:8500 score:394 + // iter:8600 score:408 + // iter:8700 score:285 + // iter:8800 score:246 + // iter:8900 score:769 + // iter:9000 score:365 + // iter:9100 score:281 + // iter:9200 score:254 + // iter:9300 score:325 + // iter:9400 score:388 + // iter:9500 score:380 + // iter:9600 score:219 + // iter:9700 score:291 + // iter:9800 score:273 + // iter:9900 score:333 + +//dnn_cmaes target 2 + // iter:0 score:7667 + // iter:100 score:2333 + // iter:200 score:3545 + // iter:300 score:2288 + // iter:400 score:2677 + // iter:500 score:2320 + // iter:600 score:2012 + // iter:700 score:2441 + // iter:800 score:1645 + // iter:900 score:2071 + // iter:1000 score:2333 + // iter:1100 score:3033 + // iter:1200 score:1211 + // iter:1300 score:1150 + // iter:1400 score:1299 + // iter:1500 score:618 + // iter:1600 score:7659 + // iter:1700 score:1016 + // iter:1800 score:1656 + // iter:1900 score:1206 + // iter:2000 score:1612 + // iter:2100 score:1639 + // iter:2200 score:1738 + // iter:2300 score:957 + // iter:2400 score:2271 + // iter:2500 score:845 + // iter:2600 score:1154 + // iter:2700 score:2330 + // iter:2800 score:1548 + // iter:2900 score:842 + // iter:3000 score:1151 + // iter:3100 score:743 + // iter:3200 score:2299 + // iter:3300 score:567 + // iter:3400 score:708 + // iter:3500 score:540 + // iter:3600 score:1110 + // iter:3700 score:850 + // iter:3800 score:488 + // iter:3900 score:625 + // iter:4000 score:644 + // iter:4100 score:923 + // iter:4200 score:1773 + // iter:4300 score:389 + // iter:4400 score:1115 + // iter:4500 score:564 + // iter:4600 score:487 + // iter:4700 score:748 + // iter:4800 score:755 + // iter:4900 score:817 + // iter:5000 score:718 + // iter:5100 score:602 + // iter:5200 score:590 + // iter:5300 score:571 + // iter:5400 score:863 + // iter:5500 score:580 + // iter:5600 score:410 + // iter:5700 score:420 + // iter:5800 score:1180 + // iter:5900 score:683 + // iter:6000 score:405 + // iter:6100 score:294 + // iter:6200 score:594 + // iter:6300 score:265 + // iter:6400 score:473 + // iter:6500 score:561 + // iter:6600 score:321 + // iter:6700 score:506 + // iter:6800 score:382 + // iter:6900 score:253 + // iter:7000 score:213 + // iter:7100 score:571 + // iter:7200 score:447 + // iter:7300 score:403 + // iter:7400 score:828 + // iter:7500 score:183 + // iter:7600 score:292 + // iter:7700 score:385 + // iter:7800 score:335 + // iter:7900 score:863 + // iter:8000 score:7475 + // iter:8100 score:358 + // iter:8200 score:339 + // iter:8300 score:296 + // iter:8400 score:193 + // iter:8500 score:223 + // iter:8600 score:150 + // iter:8700 score:231 + // iter:8800 score:347 + // iter:8900 score:238 + // iter:9000 score:564 + // iter:9100 score:1489 + // iter:9200 score:583 + // iter:9300 score:287 + // iter:9400 score:144 + // iter:9500 score:214 + // iter:9600 score:844 + // iter:9700 score:244 + // iter:9800 score:205 + // iter:9900 score:293 + +//dnn_cmaes target 3 + // iter:0 score:4978 + // iter:100 score:4505 + // iter:200 score:3940 + // iter:300 score:4155 + // iter:400 score:3182 + // iter:500 score:4082 + // iter:600 score:3220 + // iter:700 score:3862 + // iter:800 score:2531 + // iter:900 score:2587 + // iter:1000 score:2382 + // iter:1100 score:2284 + // iter:1200 score:3236 + // iter:1300 score:2925 + // iter:1400 score:3395 + // iter:1500 score:2708 + // iter:1600 score:2866 + // iter:1700 score:2339 + // iter:1800 score:3431 + // iter:1900 score:2518 + // iter:2000 score:2686 + // iter:2100 score:2005 + // iter:2200 score:2502 + // iter:2300 score:2039 + // iter:2400 score:2573 + // iter:2500 score:2158 + // iter:2600 score:2220 + // iter:2700 score:3201 + // iter:2800 score:2396 + // iter:2900 score:2666 + // iter:3000 score:2115 + // iter:3100 score:2310 + // iter:3200 score:2642 + // iter:3300 score:2457 + // iter:3400 score:2469 + // iter:3500 score:2318 + // iter:3600 score:2487 + // iter:3700 score:2140 + // iter:3800 score:2007 + // iter:3900 score:2665 + // iter:4000 score:2054 + // iter:4100 score:1915 + // iter:4200 score:2116 + // iter:4300 score:2198 + // iter:4400 score:2009 + // iter:4500 score:2228 + // iter:4600 score:2975 + // iter:4700 score:2802 + // iter:4800 score:1998 + // iter:4900 score:2767 + // iter:5000 score:1869 + // iter:5100 score:2063 + // iter:5200 score:1799 + // iter:5300 score:2035 + // iter:5400 score:1827 + // iter:5500 score:1649 + // iter:5600 score:1709 + // iter:5700 score:2662 + // iter:5800 score:1669 + // iter:5900 score:1738 + // iter:6000 score:1524 + // iter:6100 score:1636 + // iter:6200 score:1774 + // iter:6300 score:1601 + // iter:6400 score:1594 + // iter:6500 score:1496 + // iter:6600 score:1514 + // iter:6700 score:1195 + // iter:6800 score:1391 + // iter:6900 score:1420 + // iter:7000 score:1356 + // iter:7100 score:1385 + // iter:7200 score:1117 + // iter:7300 score:1182 + // iter:7400 score:1266 + // iter:7500 score:1985 + // iter:7600 score:1427 + // iter:7700 score:1465 + // iter:7800 score:1162 + // iter:7900 score:1212 + // iter:8000 score:1171 + // iter:8100 score:1269 + // iter:8200 score:1363 + // iter:8300 score:1244 + // iter:8400 score:1288 + // iter:8500 score:1084 + // iter:8600 score:1005 + // iter:8700 score:1335 + // iter:8800 score:1179 + // iter:8900 score:967 + // iter:9000 score:1049 + // iter:9100 score:1043 + // iter:9200 score:1015 + // iter:9300 score:927 + // iter:9400 score:1060 + // iter:9500 score:973 + // iter:9600 score:953 + // iter:9700 score:915 + // iter:9800 score:1064 + // iter:9900 score:1032 + +//dnn_cmaes target 4 + // iter:0 score:3654 + // iter:100 score:3662 + // iter:200 score:3761 + // iter:300 score:2381 + // iter:400 score:3166 + // iter:500 score:2930 + // iter:600 score:3159 + // iter:700 score:3242 + // iter:800 score:1955 + // iter:900 score:2193 + // iter:1000 score:2459 + // iter:1100 score:1792 + // iter:1200 score:1677 + // iter:1300 score:2123 + // iter:1400 score:1566 + // iter:1500 score:2084 + // iter:1600 score:1739 + // iter:1700 score:1559 + // iter:1800 score:2688 + // iter:1900 score:3921 + // iter:2000 score:1308 + // iter:2100 score:2527 + // iter:2200 score:1826 + // iter:2300 score:1617 + // iter:2400 score:1653 + // iter:2500 score:2763 + // iter:2600 score:1414 + // iter:2700 score:1603 + // iter:2800 score:1159 + // iter:2900 score:1680 + // iter:3000 score:1256 + // iter:3100 score:1563 + // iter:3200 score:1615 + // iter:3300 score:1537 + // iter:3400 score:2101 + // iter:3500 score:1629 + // iter:3600 score:1231 + // iter:3700 score:1288 + // iter:3800 score:2119 + // iter:3900 score:794 + // iter:4000 score:888 + // iter:4100 score:874 + // iter:4200 score:1019 + // iter:4300 score:1890 + // iter:4400 score:1564 + // iter:4500 score:1140 + // iter:4600 score:1536 + // iter:4700 score:1118 + // iter:4800 score:1006 + // iter:4900 score:1492 + // iter:5000 score:1186 + // iter:5100 score:980 + // iter:5200 score:1271 + // iter:5300 score:918 + // iter:5400 score:769 + // iter:5500 score:765 + // iter:5600 score:886 + // iter:5700 score:952 + // iter:5800 score:1087 + // iter:5900 score:1911 + // iter:6000 score:954 + // iter:6100 score:2255 + // iter:6200 score:903 + // iter:6300 score:674 + // iter:6400 score:1305 + // iter:6500 score:755 + // iter:6600 score:696 + // iter:6700 score:1306 + // iter:6800 score:636 + // iter:6900 score:660 + // iter:7000 score:644 + // iter:7100 score:786 + // iter:7200 score:675 + // iter:7300 score:708 + // iter:7400 score:689 + // iter:7500 score:1006 + // iter:7600 score:563 + // iter:7700 score:1100 + // iter:7800 score:802 + // iter:7900 score:753 + // iter:8000 score:2403 + // iter:8100 score:1479 + // iter:8200 score:683 + // iter:8300 score:736 + // iter:8400 score:919 + // iter:8500 score:1132 + // iter:8600 score:1125 + // iter:8700 score:763 + // iter:8800 score:679 + // iter:8900 score:2588 + // iter:9000 score:637 + // iter:9100 score:547 + // iter:9200 score:660 + // iter:9300 score:598 + // iter:9400 score:499 + // iter:9500 score:648 + // iter:9600 score:805 + // iter:9700 score:589 + // iter:9800 score:577 + // iter:9900 score:426 + + +//dnn_cmaes target 5 + // iter:0 score:2496 + // iter:100 score:7168 + // iter:200 score:3541 + // iter:300 score:2496 + // iter:400 score:2496 + // iter:500 score:6930 + // iter:600 score:2602 + // iter:700 score:2182 + // iter:800 score:2555 + // iter:900 score:2200 + // iter:1000 score:3032 + // iter:1100 score:2509 + // iter:1200 score:1907 + // iter:1300 score:1459 + // iter:1400 score:2356 + // iter:1500 score:1897 + // iter:1600 score:1724 + // iter:1700 score:1491 + // iter:1800 score:1731 + // iter:1900 score:997 + // iter:2000 score:1302 + // iter:2100 score:1409 + // iter:2200 score:1380 + // iter:2300 score:1426 + // iter:2400 score:1360 + // iter:2500 score:978 + // iter:2600 score:1006 + // iter:2700 score:1147 + // iter:2800 score:1110 + // iter:2900 score:1251 + // iter:3000 score:1530 + // iter:3100 score:1143 + // iter:3200 score:1082 + // iter:3300 score:1072 + // iter:3400 score:804 + // iter:3500 score:877 + // iter:3600 score:768 + // iter:3700 score:1062 + // iter:3800 score:771 + // iter:3900 score:945 + // iter:4000 score:1151 + // iter:4100 score:957 + // iter:4200 score:1349 + // iter:4300 score:805 + // iter:4400 score:965 + // iter:4500 score:898 + // iter:4600 score:817 + // iter:4700 score:1461 + // iter:4800 score:910 + // iter:4900 score:1547 + // iter:5000 score:7044 + // iter:5100 score:850 + // iter:5200 score:1996 + // iter:5300 score:910 + // iter:5400 score:1347 + // iter:5500 score:803 + // iter:5600 score:854 + // iter:5700 score:725 + // iter:5800 score:803 + // iter:5900 score:805 + // iter:6000 score:744 + // iter:6100 score:922 + // iter:6200 score:879 + // iter:6300 score:701 + // iter:6400 score:760 + // iter:6500 score:1082 + // iter:6600 score:1482 + // iter:6700 score:821 + // iter:6800 score:667 + // iter:6900 score:843 + // iter:7000 score:893 + // iter:7100 score:1179 + // iter:7200 score:852 + // iter:7300 score:728 + // iter:7400 score:777 + // iter:7500 score:638 + // iter:7600 score:716 + // iter:7700 score:1334 + // iter:7800 score:669 + // iter:7900 score:633 + // iter:8000 score:673 + // iter:8100 score:545 + // iter:8200 score:589 + // iter:8300 score:602 + // iter:8400 score:644 + // iter:8500 score:787 + // iter:8600 score:580 + // iter:8700 score:751 + // iter:8800 score:678 + // iter:8900 score:551 + // iter:9000 score:608 + // iter:9100 score:699 + // iter:9200 score:5326 + // iter:9300 score:745 + // iter:9400 score:682 + // iter:9500 score:576 + // iter:9600 score:975 + // iter:9700 score:1511 + // iter:9800 score:662 + // iter:9900 score:683 + + diff --git a/cpp_voxel/main.cpp b/cpp_voxel/main.cpp index 173f1a0..b2b933c 100644 --- a/cpp_voxel/main.cpp +++ b/cpp_voxel/main.cpp @@ -476,10 +476,10 @@ int main(int const, char const**) { std::vector<unsigned char> targ5 =drawFrep(&ss,minX, maxX, minY, maxY, dx, dy,"hole_target",false); - // EM( width, height, targ5); + EM( width, height, targ3); - EM_df( width, height, targ5); + // EM_df( width, height, targ5); @@ -596,56 +596,56 @@ int main(int const, char const**) { // itr:50, distance:6 //voxel target 3 - // itr:2500, distance:4848 - // itr:2450, distance:4619 - // itr:2400, distance:4413 - // itr:2350, distance:4181 - // itr:2300, distance:3988 - // itr:2250, distance:3774 - // itr:2200, distance:3571 - // itr:2150, distance:3360 - // itr:2100, distance:3155 - // itr:2050, distance:2976 - // itr:2000, distance:2783 - // itr:1950, distance:2550 - // itr:1900, distance:2404 - // itr:1850, distance:2217 - // itr:1800, distance:2101 - // itr:1750, distance:1909 - // itr:1700, distance:1753 - // itr:1650, distance:1609 - // itr:1600, distance:1456 - // itr:1550, distance:1308 - // itr:1500, distance:1191 - // itr:1450, distance:1050 - // itr:1400, distance:941 - // itr:1350, distance:804 - // itr:1300, distance:720 - // itr:1250, distance:622 - // itr:1200, distance:515 - // itr:1150, distance:451 - // itr:1100, distance:372 - // itr:1050, distance:287 - // itr:1000, distance:219 - // itr:950, distance:165 - // itr:900, distance:124 - // itr:850, distance:80 - // itr:800, distance:47 - // itr:750, distance:26 - // itr:700, distance:12 - // itr:650, distance:6 - // itr:600, distance:6 - // itr:550, distance:6 - // itr:500, distance:6 - // itr:450, distance:6 - // itr:400, distance:6 - // itr:350, distance:6 - // itr:300, distance:6 - // itr:250, distance:6 - // itr:200, distance:6 - // itr:150, distance:6 - // itr:100, distance:6 - // itr:50, distance:6 + // itr:2500, distance:4875 + // itr:2450, distance:4634 + // itr:2400, distance:4407 + // itr:2350, distance:4196 + // itr:2300, distance:3976 + // itr:2250, distance:3803 + // itr:2200, distance:3578 + // itr:2150, distance:3374 + // itr:2100, distance:3151 + // itr:2050, distance:2964 + // itr:2000, distance:2762 + // itr:1950, distance:2554 + // itr:1900, distance:2399 + // itr:1850, distance:2205 + // itr:1800, distance:2060 + // itr:1750, distance:1885 + // itr:1700, distance:1746 + // itr:1650, distance:1563 + // itr:1600, distance:1447 + // itr:1550, distance:1288 + // itr:1500, distance:1122 + // itr:1450, distance:1020 + // itr:1400, distance:938 + // itr:1350, distance:813 + // itr:1300, distance:683 + // itr:1250, distance:593 + // itr:1200, distance:514 + // itr:1150, distance:427 + // itr:1100, distance:343 + // itr:1050, distance:272 + // itr:1000, distance:206 + // itr:950, distance:152 + // itr:900, distance:105 + // itr:850, distance:66 + // itr:800, distance:39 + // itr:750, distance:15 + // itr:700, distance:2 + // itr:650, distance:0 + // itr:600, distance:0 + // itr:550, distance:0 + // itr:500, distance:0 + // itr:450, distance:0 + // itr:400, distance:0 + // itr:350, distance:0 + // itr:300, distance:0 + // itr:250, distance:0 + // itr:200, distance:0 + // itr:150, distance:0 + // itr:100, distance:0 + // itr:50, distance:0 //voxel target 4 // itr:2500, distance:4875 diff --git a/img/df/1.png b/img/df/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba9fa10962308b0d3992623502322e2ee2bd3cf GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCrg*wIhEy=VJ?NPC)J=rt z;F{m^yXJ7~vN#%VNHqI-W504xVb8>_<em_j<Ry<JltqtAth6}han#UFtIv=KsXZP? z%tfU=k9xcO3HZn^xT>NvWRJ@ceXY8VA3-05R#tR&#D~-fe{?>|z2p(Al3s{mfEHUv zg~L&Wl@$R;4r{e}9CcP|TOpw!%HJum?2+Tj3XdZRqUPR5nU&%eJaSuE;c&z|<c^A{ zd3VLcuGvc-xe4lr6gG$4QF*jfD{n$qtCCsZ#t1F3jvE0-omNIDBn69hFG*_b@D0_O z)Wxb~7Pip=BpGp(X=Q{;Qm`oZlB9_py`eEWqTMbztCAW+bc8mp>|zbt=y7D3mYBy; zCBfONA`~zsk7?;m>ta>1b2!=>R5-DNKcsMC$RB?}`E`$&R_<^((!OekhnAku$3`u^ zNnPBoH50nHmp*b5lwb15Y2}WHBkU`7L}=-WePo1~VisPwF+@jT<Ib+`rAW?M^C$_) zk-nii6S`cL%tApv=)4hv;saig_n>~y6Z#k=YVL8gS1E4UBej(~B0&MB0Sd6rF6pI@ z7zLX{Z4^ZLJ0w;;QUryrfhfP%(PpK#6%`R$a$+ClLj=WFS43#Bb^hq?(if}`bp69E z%Dm*!Ql)<j9*GAY4Om&RvLilZPl#5W&ZF5~;@(G3yVk6%*hpq_0VlG@^4%*|eg4q% S?>z$p1B0ilpUXO@geCxh?jE!N literal 0 HcmV?d00001 diff --git a/img/df/2.png b/img/df/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b63acfa12b64f16c67d754430caee69b0b7d9c79 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC_ISEDhEy=VJ?QACV<EzF zaLsS|U25Vw0jp>8UpA{c)aP;3)J<!hVNhZ3#IEd~keK8pkEE1EuS=}lag1`Qvx~Z3 z&kx!d8Di)VVi=-j)*WzEO>k9((j&*C+<`~+y^p2|@@wr=T=m20h`Q)}mpuU=6&^Vs z)%QB;Ca51$qv#~6?_v}9QSlMCXjjF;N8(G87I%ni&FiRG^k{O2qL!G)Q8&TvP{G3? zdo)F7yT~ki#Jlo_$|D2Oe2=4Qg6u0Rg0;*#EL@H%t&GrkBp}+oG-+aob4bpFE><PJ zz>S_-Vx1N)N7+_Js60{tNiOU-9HKL+>!=c6@J0uaPM@Q*gEmGSY1Fzm1tu!iZQ*m2 z38W=JlzT~1V@GqS&IFKT&_)j}v2F{Gqe?4pD1a<mk~F!)eqGYSkQ||p$3u0dbona% z+tJk;w9)g3eE7xykoh2&!4z)<Sq?S{WVu+EMF`09fFlb*mb)tPg?(HWq9ahaqstuZ z3y`g?N@lBm2pBqm{HOD%euYxpiXSSE+E;a$hvrP^;#I0!@W}ayuqeM$-GZ(kPDk52 z)V0h!j<N~f5BaF@$nj`%hdfA2g}_J8qiUdVlh>Np@ngxO&W`+50Y|t+`IYQe-cS*p z4T=HZz@y?y`#`bdc$8aEUdzn$=t3pCkU!2L8w0i0<#%eCdC?#l9jo8J{@&*!Yc*do QFfcH9y85}Sb4q9e0NE}%O#lD@ literal 0 HcmV?d00001 diff --git a/img/df/3.png b/img/df/3.png new file mode 100644 index 0000000000000000000000000000000000000000..5e45ceb35884e06d8c0a4723d2903369da4c5efc GIT binary patch literal 1152 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_uX+&x_!Ln;{G9^~#@?ZLou zaLsS|U1ncX*6N(LUm!h0QYom=vNz<9px`Qtl_7r^1^Ko7)I`}kw914&x*g?QlH@MP zucg-gW5J_@l{Y+(aEl7N)&vx82zjIMsJE+AX<tC$f)F3EkB&!O1mjm&1Zb&s{Rld$ zBFG&gqaZ5msuN)7dBjQ7+6yEU>Law#>8M|jVc-!b(Pq~*0UH;G_=s!_I?4c2t|BVz z$`i0L;0Ti_yZ2ES!R8PhfsGDF4+a@V9$^rT?}}LPhy}z}5S4dX19E|nn4!l}c0uhB z86DBdt~@~>-Hv#Hw5A9)hwKs9=y>#C(8lHtN3D4sH=vGB5H%N+4wcamweGf9*~Pr{ zk%FLl@W#LvEitd7jY@vYlA1fLMdQKj6-lif`XM$GyO>?)gdBAej9*cqB+A}pv9U|v zMJME=f+&0E4@QX5j#_pd0Y?=C?LChA9#If22RUSJSFcjtjIP-oj#}@QJaRlDEvoJM z$3e79V#y;%t#>Xp3zHUh$gk;=Sn#Mb<WA>}1x|wdeMAi%jtZ~b(Ya$!h$~OPM;EO; zCB5AsYt03xztoBYnV!0;%RH!1xNzp8N8BKlJfRyMK*|n>=uGLF-Emq#RC~!IwMRxS zN4Zw+5dP>QT3ER%sUgIsLo2Rh$Dd%s0Ijf&ACI-zypMVb)<+yoSQ(+YszTr+dkD|8 zu7gT-JG(f83?q){hZ{O-sdfA~s-@;}ltplV%+Z9EGgKalua?jeo$T_5QM7qU(xeXi zB}t1ze1tx>hw4n}@>J6Mzxs!QsIW`Sy;T(xx<r-Uh1}`fQ4><AF3Rn?C%`pkUs&Pf zu2v;I=THq%Zr7N$RRLOJ9Xoi!7l!Bv6wX}abyQqQFF17N4~0iYu~WPFmGmx$uB=dg z^vVCIw4ipVhG@P^%!&wwN6lUAD=U<en!DHq?E{W-34-H@T~IpIrsGGWR#;a>z(*%7 zIhQpdAKi}d2X72I(%dB;^wH&rlW2U$4@E7rt{p2YltuMjbOJUy961^KMgzijI>H(H zMn^Os6f;XZCa<(`(7M<0!|5m+D1mGasZo5?*~O^jw<5`XrA1>0uU1^gjRi^S5cWL~ zn|-B4XNRbk9hBYJF%^j|s<lsGW8l%0l@<|4yhP)>ZmdXJ6e6RMw6u#=iEYIU6;bxC zh?PkTJ9@R$JdZjmg{`=ukks7e8C2NN(W=GPabrbNQ^*^gq}DD+C9@SX6hy7NBUU7B z=$HzMpFX9q6%sm0OS?FOHg4`{)l%z-SO`;oP)TgX3{YwZ33c#ml}+ekcF_qj^gJRh zYVC2<5hShhsI_bEl1C1L@vCNNJaRnR7gWe3m=DU{ejv7x;Hn>sK_$e029|htK|j?= Svl$o|7(8A5T-G@yGywo!$;7_^ literal 0 HcmV?d00001 diff --git a/img/df/4.png b/img/df/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca8c9ae44ca980a5446651d7fb9b4198ba4f5f1 GIT binary patch literal 767 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCj(NH`hEy=VJ$SL`QG^J~ z!B_wPzqrR`@AKwJf`h`z>n~E4CFv-OCQGiAIPGyX!cFU#QIO%ZiCr6eLV8k{5SFrt zY|%OvAGEQ#Lp-!ce`SU9k=a_uribj&NKzMV22tsv;?ugsU1XL#S`@U=@d&4uo`$G@ zmxbq1)}@acJ0^$51ZeFO{Mf9erzU#8<A<ZD_~b5WC9!})#g#i0lLSS@CxW;^g^VkI zxE)!fWf!3Jt|KDm=zo`-kc|x?cLWOsMeTJ&`CVdMj`DjQl@$~Z`q&)wvA2VJ)el9G zme$ZYI-=$-F)>F^1{FFVS@6gOBziP-j)v&{jvYI?gqJ?*>*!u>;i)Cpv13Em<Ry<9 zL0m^IxekdC868po4vBazzDZr`E<O69?4Cy_E3qL_Y=X^Q%uAA*J3cN=N?&<HA*p8N zjYuuCE{Xb(H!7miu08uh-YAGlyY$q9X#Xw=^Uya6qWmsByS2(DbXhAM3)Z?f1w>!g zx(DWiX?CS!&Z7BVM<**C+YXZNRXS!5qQzZ%AT-FlJ&GXnXM^<hDjkaz)%Q5cCipm0 zR2t-*jh;s*gF?F^>L}aF8yZPAAsYj=?ul${)_TMovPVJGx~n4SsI1`rkfYo|g%diY zwamJHsA|Pc>1uWr%?E|=?4Xa_t~v{n+*kfMs#NE3^jy%#)2?&YJYrb+<EfHgSYbm* zO+&}z5E&Iwd4)$Rpb%m2u<$(U81zw5$uFRALP*Vuj=7;S8lv(#N$#TTUPoD7-Yj_J zuyV(Y4snoha|gQ?-?Xle?nih<)jf{>a1SZmgeSrMXJGnw>hlKg$7dNB7#KWV{an^L HB{Ts5Cfqi! literal 0 HcmV?d00001 diff --git a/img/df/5.png b/img/df/5.png new file mode 100644 index 0000000000000000000000000000000000000000..988bc3bad4ec3966bff643b65ff0151237e0b47d GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCet5b#hEy=VJ?PkX*G+`w z;F{m^yXJ7~+Of%bCx2C*?c%=V(G54PzFhLDrHi`QJ&$s`)~u*#2(j@A`Pkc`uO+7- z$}jkF;iGt$n#D=UD=Qj0@<aXzePq`%o6^PWQWLna<NgYzx)n*vD|bX5Ijdzhp-b8| zXF(G4${n6Z+_dthb<K9kS@I}t<qpRqX&|n&OU{Z%ZXoV6Exl=7-L5tcM~?;-ZtQ4Z zu_HiBPvoP6sJO>bS0%Z1Nda1Iu6sO=P6*-Ys+ifOxKcvoqmig{kfF+>R;{)rNghXB zS9NfQ@OU1b(7_$@N2su|i*codkl~s~-5uN^I@7uo1)H_@2^y|R+8DyqArbOXTJW%z znAg#U4n|RX5yK@(3qisGAMIUuRzzrsGAoI#{xM&PEktKZ*HI9gTaX!~JV~%SL`P_2 z#8Ib}5h_Uw!EzBQqTDVzA%-BnYtTlIBTgXgt0GiHyIpmHHU=C?6761+<ZwhuwA)1| zY@>%(n~P4+$LS!$Cv_<ba)<tD?KlcDd_u=jtvZb)kE2d2B|vt_cSwY7jL>Rx;aTy6 zUr>BSgpR1QQd?+E#}1F9Nh>9U3MXnkauV%cn&fe$I~43i{ZK;%QD>#NRY?w7Z7zF4 zjy8nwbXLslas&mJkm%u{!p4sF)e_UXxLs{Rj&2Bv(Rq}pr8fZ-@IFUbg9@8L0q>!e zC$e#47x&UfX@b%#cX(>$iEZrck_K~E?1<FL6D!=@#k(YlS<rmN4G%3dfsYFxIUnH< zsp<H!D9Lzb#e|OgD=Jom*aRFg*OJo`<rn?vdbD}zqk~FzAvO_OaSE#{c7({>_Bgt+ dmt?A*A?P?aQ*=`UF9QPugQu&X%Q~loCIH*0OgsPp literal 0 HcmV?d00001 diff --git a/img/dft/1.png b/img/dft/1.png new file mode 100644 index 0000000000000000000000000000000000000000..473598ae345e38659e226f4f1d20bfa875c15fa4 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4h9AWhS1Ja9SjVN8$DedLo!&m9%SshV!&{~ z;rIW3GY^G>rIStGY8fA^BobOPZ9HD#_^(U$7~fCbe-r*6v3)%6kLdoB{Dr4?DF0_U z;a_-shvI+kon6w$X8jTPq<F2z^rnFKu}N<_RFgfo9qHPrRGoA*VxsTHgf%CYMHr;1 zqy+0oB!7zDr2VW%uu|(;4`Zbcl<@x)b4F7B$<!H!b|<V26Jt(h8>YmZtTs%765>e* zc1+Sg(om=x-@*9UYo7q~v8gqRY(3gP-D-^NPKZC6{Lyir!2BNnPf<J)%%8$QL{N`} z@+ZF@3Fl94Jd(+uoIpfOkEHOYh#pDfPa!>$!Jh(pB#S?J_(*Vna`BPS{^Z~z;k`*; zt;h7HnD8;)o1((UWN(THAJe@lEPTxNrl9dLwwnUR$M|-N1|O4)?6ypvyyi&LM&D&g zM=RXyj?VfxCFTh4W6ht6d6NAn?Kd8*aQxSyOI%RzXL!ZCf{}9_p8+TmJzf1=);T3K F0RYy(+(ZBX literal 0 HcmV?d00001 diff --git a/img/dft/2.png b/img/dft/2.png new file mode 100644 index 0000000000000000000000000000000000000000..7a451daeaa658a71f6f1797d96bc5eeb36e196de GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4h9AWhS1Ja9SjVNy`C<PAsMV&4?0d-;vjIq z;P?OjZ|73=0|HE3ypGu<&oewfBmIo=Gs(|Al?1rOpVXi1uQ*cSA@+##v0!93dyo2) zpd3m56TLSKzdZ@dk+9w*{Jn?wW_R>4+e(!@iR(|;3s3G)+TW>tjP++|jKQ@h<r~v< zPD*b~S#!dAW0KB^=#2?;PF5GD%{jqdm?m>ly)X%xFfUAzIcZ*)GUtSOVFD6yQoS%? z4iX_=m@?-im|!nV(m7FGn6&0ZHi(EWOw&2(4I->JCagIry)kLcN$!m)F%#w=omJ>s zCnDbC{i%CLO3dW;N7D-3=XF#c)2&o^C%OGe<Bs$@llOv%wKojjoeay7_@1I|*28<V zlQ-Er?`Ypfb@Qat6%Kkw=Y5=_bA<Vr_9yjuhQx&6p8Bgna~UtO9;^gKkf*Dk%Q~lo FCIHtb&<X$m literal 0 HcmV?d00001 diff --git a/img/dnn_cmaes/1.png b/img/dnn_cmaes/1.png new file mode 100644 index 0000000000000000000000000000000000000000..c6908202e4246aadac0548894934b7f224c7e9a3 GIT binary patch literal 709 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCdOTemLn;{G9t@l&YA(WZ zaLr%+U32E!**$1<d{rK;p(J`;V&#rw9!E{xwAL9074}Z-%I*n?NnY|uN*Sk=t5Qhe zf{;B9NBBczR74NE)+~I)uu?+jk$K3T2(7lRAIrMLy^cBva)<2k&}!?9So4TA$k63T znrQRVq=pXmP@XAW{M|nqx)OsvItt2%8M<iw3pnB*^2gzbfvEhnE_;!}30?f2N0|iM zS5`!5iFH~89CZ%b7;t2vmYMg_BtiC7H*`d$U1XLeZ4Sv1DxA^P8?@2!NTZgS*U==w z_Ek4DM7v#N)+H?t(Ge=#(WURQ;*t5%q=_AeLu(XQ{b&o(5&9^;;)i_TQS&893p);n z{&5NU=({pP<57X=Y=}tCq^?#azVMBnT4LQ65l7WlM(8|B07-7_Xb#Pp)O8dj=?IdH zIm)*3hQgx+QRyW~%^=AMUA#(sVH+K_%sMP0kR&H}G>7U;>+%IjMrfIJT0|U8T6sg| zQG#gq(j=&4uM%JA#t1F5E{hP5q{gEFkmTYHXOPabN_-(8$!?1PkfhEd1CX7YJDNjs zCUu=v;tSjusAbk|;czr<Wrf3$?ob;AQT~pKm0j&i9x)2)2Y=iUVx#cLRm%=6+zAR^ zXQj5)KNf`41RN0ng?gfrT!^8IR-8gobC+Y##~{J|3m(}o>PieMoX}CfvSK2kG=V3% dz@&b#_h+p7Jbi{PHv<C$gQu&X%Q~loCIBIBA=v-` literal 0 HcmV?d00001 diff --git a/img/dnn_cmaes/2.png b/img/dnn_cmaes/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c62de67ccd50ca68566bc9f2f3eeb6821eb60d8e GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCcs*SlLn;{G9(0@}U?{+R z@X~*I-B%|BlX710mZxc5lUNy%yd<f2Vwb5Kl{tEyKe$Evy^pF2{tr0HKfTLascu5o ze;v{3E;b7uO$dn*`Z%MDKd8|2NV1ll$5B<m{*^xzK$6QIH6uwnYuR}nWd%uUh>E+| zEPJ##Bu3!ljIREmLPwBJN+c5n`B(kW5N&t0S@x(QL`Ll6j4tM&!iXcuT6`Wy69xNM zS}2es=_ts*%0fYu9c1i;5E+q=GrF9E3IjmKdLDHI8LNURnXh$C-utMOvS@Zs$Qr|- fjmJD_!HEx=W%l{#)Pw2_3=9mOu6{1-oD!M<3gzVJ literal 0 HcmV?d00001 diff --git a/img/dnn_cmaes/3.png b/img/dnn_cmaes/3.png new file mode 100644 index 0000000000000000000000000000000000000000..7f205e82bbe26c8b5181d963f729f78dbc4affda GIT binary patch literal 1020 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC4|}>ehEy=VJs4ed+k=7S z;H%&AyS86j$RFj{Rl&<HHeqI0cUMJ#VWgIx)+5KGDJyp@=*ZVn^FDgi#U>CWs`jX} z>ts-&qM&|=&$O=2MP2-z6$_I#h4_es);JuI78PEaw1^{=M`WYJQJ0l7R33RBRS@J3 z^_kMeskCpUghJB7uFfDs$0Nd`>|GHHlNN>e2z+ernyVDHYKDfWu*;snje$qlK!!AR zuxf>M-B<xuvN7N&m!LGnl&}>M3Q5bmI6v+0;#3M-^~3Q9qn4eH)5;kNNsGJkmH2`_ zDhl$0tl$%kSK<pXj5s2^a)!dAC0cBq6$`zNvIwe&7H;S;UlrmbP#7f2-Wjm~r1#Mh zt+K9&6_32N)H*CycJ(TSt*DsL#i``CCaJZ9S4(b5Qd5WU>IkqMAj3OD|0pE2cd0|z zHi8?2k8*>od7`z?MP|vP)(y@_-2}x$J~n?~6y;aaTk)tjL~#2;EisQ)rM$x-Iup9| z1-Bm#)tS=8F1Y=0$eIaV>PmULL)J{`5?9Kb9g;JlOWx&9*vcCkqWLa&?yb6^Da!47 zXWl9c2d%J<9e<ZTQdk+G`RJSb(Z-;Sjz^A$%IJt%yTk+>WmtJb^HGu(o5xW`CA}p{ z4IwfrkCZ^%gGzNfyBLECH+00WOKJ$=5%}00$}^$MQK@cYSM$=O2_5n49yzR(P<h0p z#W$(TQAuynBZid{3Xht!$~=x9RMK0Mv>0U8H}|7#D=i$3yww-gUYgY2aobx|dr8vb zj@!|q+)I;|cHGVq&0mtVu;aF#sJ+KgX^_|UOaOVwImBin$cxUQHIuvYmGa~RKPrgw zE9J?DFAULmWais?=&i}Bg4;_UIXv7JbyVTuHm{=&D}Sgx`WAB30pwN3qillzXLL0N z83rD)Uy`&S#7FF7{|X5W(aElVl(pErj;08*ulgZWxB#Ri@`#_PzKaY**+%E1OoG;- zJX5+(Dw(Z{P)urvC}9(ocF74b4A4^RzOf*wy<;lG6zxzMg`}ljjzNZzN4OwqbV7)a z*v5dP41(ODJd?UkDv7O-(0SAgQNkoD4@$pa<<g?^A|IWODy*EL^N3wk7?fW;wA8wP zI39Ho<kw>JJene?A2P?`$aIKSVNrFVg{aIzCP98JKaEuqDx&HF9~V4oS=8ki1QyiO m5LFjk*wyWI^sUK1=8gWlg|05y*u=oVz~JfX=d#Wzp$Pz2b&jt9 literal 0 HcmV?d00001 diff --git a/img/dnn_cmaes/4.png b/img/dnn_cmaes/4.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a47a90caa78e776b95675e09c81df0cf6e0815 GIT binary patch literal 783 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCu6epRhEy=VJs3UdQG^J~ z!4rS=t<-buZY^70!7<@Mkkz}D5~n?mM!0DmGYT@CHnD4CPe@Pdk|Z5v(PT-iQja_Z zS4r&lI4Z34ZiNKD=h0>*xd1~m5IrxzFwg5Kvr=4$p&p1X3oxwnILfS47G(HuQdh51 zS(xEJkE3pa>?<XfBsF(5ht7%7GV7>l?h^Js$|jf}Qs}gDhw>w4Ek8BUa+ey9qn%40 z^>y&C-l6Oy8m}c<?xM5cQCA1I);<rdyp9NuqyJs*1b$=<Ds(>5q$TokL6_^&M{OPP ztC9>??ofQhq9rz=OIpcq(WApbg|0_VhSUUTt?RIu*~Ra5R8&ws<fG!s9ZHXuXxS-< zhP%uOIm*7|QB%j{)fJmVVgw9VR4hiK{)K*2Te(9a=}+KCHWYg4qXaNNpl|_5dEE+& z04==^3Gq-F713~)o^CC^30>Ms$6Q6(J&uYBK3>%|7v#di(4&1INAFmb<i2u;V$z+E zjgv#}2pZ<Cy5Xp0)*)dYx<^A)+O=o3R@{^>b{7ymp^F{Fp9kj8)|xk^t5@k*tf;@& zQ8vNk$zAG8AN6%?^gPNPROo)>#*#;@D|aX-<ph0f3ds>L%v)6vs3j+2Shu1gP-~uu z;lI$0%^`0T9v#sto6t4ab&k(bzM#Sd9r5du)K^wCgThaJWyR)>_$5i|D}OBL&=1?V zI7CO`5qIbt4bkq-A3~zmUPlipiG^<598%NRaWv$Oj%d7E5~HZK_tEKHKPGfBFL@;1 zQLz|IcUClm=;>V+4o4k>3Yi40S6X;z`Kdi(6=nB4>gj5;;*rBj36~sD0QT&6i3u!R o5Yp4F^l$N_1guF9o+^K^e^_|w^NuYSK*^oK)78&qol`;+0J>R5aR2}S literal 0 HcmV?d00001 diff --git a/img/dnn_cmaes/5.png b/img/dnn_cmaes/5.png new file mode 100644 index 0000000000000000000000000000000000000000..33ca4e3c4b5398ae5d6728279ac8ede716e6efe1 GIT binary patch literal 711 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC`aE46Ln;{G9yDBZ$4rFf z;Jn}RRd){Z%beKshV|rjmQ_K8Jrlc<dqQNAmpqbC7CkPp(&CuMQA0PaK0_j;_Jkbi z@6w;pHNEpkYuCe|k3xd=3zAlZ)NJhdzc6V*NX^0y{!pIDUHU>BBaRBJl+b&WB+9%b zX+?*0sEv;3VHcYfj}%u*C?rkjVqfyeQP4T`j*cjQ#}6S<bI+r`O8Y{N@&*-d>=0kE zBSK40=%bUUxaUzPLFpAc9JItbZ+IL{S{b2|<Sg2~B&o5(H&ka*7psz4=td7Mv5p%d zN0nAaC?o~rl>8BJ<d~M2=h1d0v#^aGT6Q8EH+H!OeO%bl3o?k`HD^uI#E=?|q-4?V zC6Am1rB_F&h{|`}h&ZaW5~h_&aQ3PQ713^&oE1qELv%zo&g^mx+8A-9pUZU**nXWP zWsq(r!PzS!R7Ax)Z#W!PTDc?O$Z3!j+^&0KK-`EU-5{>C3s}z%&m*Tpbf$DkyY6v0 znzV99;1TYS7zI$E1c7|tthCSLXlsz6!;u0}aqpu7pdeEaJ?z30R5&?=N5s(KXm60A z#}NThbFgHHje@AN3s1nu2_ZZ}9~X47FHM@!!5(6xBg*W0XU(I;l@eNy)I^z=JmPlw z<94*a<Nt!Bj*yy(D<1K?{ORs;4EmTP_<uptjF6h0D;}9E{aco_AS6d+m4ue4zDQ`z fOw!ZLM{yptRiF0?%Y-m6Ffe$!`njxgN@xNA^Aj9A literal 0 HcmV?d00001 diff --git a/img/dnn_sgd/1.png b/img/dnn_sgd/1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef016e17578484dc8106964e8bf4e2ece76522f GIT binary patch literal 663 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC;yhg(Ln;{G9z2+M#6aM% z!-oHhB&SShUlM(LmgiAZH?4JsL4~~&yRv&iVv?6Ul2R7EF0pdQF%OcY8kPR7e54rk zkwLIKglB5kLM5}+5-Ot1t}-Ep4q9xTKPGm`dmm*GbPoCBp;f1mw4h7g<7mGNPgr4u z7GHNoM^|%DVZf2YAu^M?oR#EOJem+9BlIyqlzqvghK}~tH*`d2yY6u~nzr(W&LdSV zGq0m=g8D%l1GUV$DrR>125s~_!X273smoU>ZdFoqNRGhABvI)lNzEP8S4ZfGO1tcd zIhwRGLgx{)mYDa^BtiLrjS*U6-9H+-js|UvIKm#HGp*~WlHH=Dg&{g(9|c9ZmnLoO z=wA_`A=>R)<8ssqq*Yl<%nPJ7aAN>SYe!crNUM8@&J;|o{3{T)-cWe-6l5!#pnmwq z2raYDij5#!J&$;Y=1l17Rf<~ya<IrpBhlGQk~VjUue_lG@~g*DwUrhMk61x|RTSh8 z+Zd_E*Hy8i>ntdkm_ubIbRAZbTk>c^$RCFz%po#Uy5u`0);!t}@+abmfvEk2E=DD` z6+ae+@Cbf%7PX(&m8itGT0%k8*)=E3&_k=OJ7PuBiV&NCBle*-E|f;U{f>=wpQC;V S1u!r$FnGH9xvX<aXaWGsd<rB0 literal 0 HcmV?d00001 diff --git a/img/dnn_sgd/2.png b/img/dnn_sgd/2.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8d96fd29dab22a541223aba17928a1c17b09ab GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_ts|9iSPhEy=VJ$R6p*@5S< zLFNC2vAGxAgB1?6`W%f^7ESLBnPVDMc+G?Qoad`KLjMG6$%z;)ND9zubG2DCN}&Y7 vpB0ZBS6XB*d9-F?*Jd}Zb5d02)G%CUGW)Epw5^AMfq}u()z4*}Q$iB}hq~IW literal 0 HcmV?d00001 diff --git a/img/dnn_sgd/3.png b/img/dnn_sgd/3.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0e82704372d82e516c85c943b2570d62da98e3 GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCZ+W^nhEy=VJ;<2%*o}eZ z;Jp9#RhKw>9152h?~Kt)?Fe1@LqX6wL}yADzu?B;qfRS-2nbq-g17>P3z8Ow=!kq= zkkr`0D9XJwX<~=CmY)bjSYV^$(G<aEEitd7OoGy(J|c!IK&k~cIv-^bWCxiy*_CI7 zg~p?XuGXN!O&yG)?5;8a8w0fb#0*y?1srh{<zD(IMUXv&r^5oIbB@lVhAu`yc97Mq zN_;DBC?+*^wFYf;IKn7u?cxK{DF#y6+~EnaQ#j<0LeeCN5*E>V0mHzfPAel+lA5~2 zmDE;6Xoz;Z_ym3QJ(2=(d8gJsmpM=mb%UJOs#G_zt66E^$_gb>Zr49bqRdKWD=H>* z9aXC9?CMow3#suunk2a2<tV=r->LvDvF;zPTJt()EOA;Hq4P+5WraXtla^?=>z#kg zy^cBwZePACBuC(*(@{3T?aQ^Mbg>I=f2t*tH+}UFp}gs<Dg^STul%8QXWHrt#XHkh z{b(+TUX;{aU>$mt?_pV27vn>-*rN+VYC3oDuC~w+^>?{rwt9wwsC~x{+fc(mEwip2 ze^)1M3gPMakszw>ag<R|e#Ik}l`|9`HHXYm5S{E&)6pfoBxz9xe?VbVh>zGuMlCh( zqbY*&i;@<BxQ<$Co*?eBq^1xbk&h3x*p?<O>bPyMRpxb61>{^akE4!)+s|snc^qBP zaa&Q8KWJm{k=$KcqSCH+{HAuvyWE-Pag<wd`%+MNz7+!by?SMrg{Rg&mpk)TRVXG+ z3ekA<E##=1Ap4RokefA<mV-p(MJK!DOyF|8^KbDZ7D4?bkGzk#h~9Vk!z9Y>V&ieN zxuaR@pTZ;Y6%iWstAD5^1sr7)%wLzZF{DP=a6wXghk4k>2(5V?H$cfndUXUSVE!yf zn$%$)vM~Up(feqp(mkJ}PAe;f1@l)VO$^!7+0m@E50qFuwC;ftj=qabz(z3JPgL5K zXH|rXsCf5{g-Odhn6<<_jviGiTOlD}xFV@BBt|1?d6%OgSeR9bEtIEABBXFrNQ^>K zz)?m)W-Y&IUED4_t1J|f9FCq0Ds1d<6lHgP16SfGXdOC7M^wB+BEZn|h@Yss*HKrc zvQ;xwl9qP~FMXsWXdUV!vM~^(bz+CCmLDkhoD3?2us=3;v4YsWT7DuQosKH4+~IMA z4HQHxB6LK>JAXJHW%oSls<baea8*FaN5`PTi7Os`Tfd*-L-1~+e>}{R3=9kmp00i_ I>zopr0N+!Xc>n+a literal 0 HcmV?d00001 diff --git a/img/dnn_sgd/4.png b/img/dnn_sgd/4.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6eb410ac35c009d6a573bffa1676ac7d5daebd GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC4tTmahEy=VJs4Q@I81=$ z;H%&AyJ8pi^WN5;B)~DD|4_=ZBpqeZWXY8hr#+5FxM>|T3NoBFv1?;bNKfh#!crBD z9oAZGD=VCiG-~PTh+4bOS@394&_`!M^;J7og!~COa#BlAL)2d2qmroj<SzM+iius_ zo=4pT^}`AkSKiQgbW}@EMO4~lkLOX>C65|A%vbH`2(c0P=q4&YvCCRXETE8a<qqW} zMp5wzUD8ToK_B%6twVJ*M9p3P6p3<s9_1Aj58T)gaz~)hP&9u^m$Z`JibuXdAA38v zS64KL)F?lCq!p(lYVHyfbCi4OqqYvmquomo)W@ZdSc3}Pk1T*tKY|K3h1duf?hBct zA<FO4qc5uNb(Br;vG-BWppA}4egqXx3ds=xNh^p-yY|>?@lEUMRXQdw%I<yCP4Kb3 z7T**QKVFM(5;DDAi*Evm52JlW{k=fymvyNxO<LSh7=BbZXk*}!9jhO4uDqd<bSLy< z3&<L|RW~$2*0gJtft4@pnj7?yS@7{XWZGHq@v^SDK^vWq{0KYhxAKN!QqAh5<solG z4F3gf4Az<_VEAuw(((`+&7?np8-um@gbE8q{XLF)D*apjsIh||WK~T^M{B5!rl`D1 zQXt4>?41z-M;U`YCMt;q7dC{{%;;zhkx>zq*GLi+W%oSV-c_-=i+SmzX4gG|M;n7a zK2*B5;8DWLAF4`mD?oIrl3!S1Q^=nnLG_guj#_#Oj}%1JJ&(4!*sOe{vU10Q4p}X~ vDP7&&Hx@ifSt(KPQnUCGE1nehkMVxWzR&#O#=9997#KWV{an^LB{Ts5m7O<U literal 0 HcmV?d00001 diff --git a/img/dnn_sgd/5.png b/img/dnn_sgd/5.png new file mode 100644 index 0000000000000000000000000000000000000000..8f325bbd4f7c6c1b76f998942b86e151bcbdbab1 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC4tTmahEy=VJ!rU1#8ZI9 zvH!Qc)iqWXk!k*6{@?Z(c^}>CrnSyAsBrDXuI%2BnCvBwqLf9iORd~-&4XyEJt0T* zMfZ39So(-H=%bS0{}o9qL-sfvVHE9NlC-j;Jw#_hSE`cTf=7pgHo6>P5|y9S#i}H> z@<&5RO~er=QGV~E?Jhdu9~XqwI2`c~u~8A_@2;5H#lGZ`qo97s$A%Cal}AUl_`HuY zEA4YQ>bSDP;fVMO3k}hB*P4l4&OwC{N5ofJsED$=)-3E|4l49GGJTbWf@r%-&Bm_8 zl@=<GHgv@+$%Po|h_buL1bt)|Y!Bt}KFTP_9`dKPqgjh>>7#}YM^Sr`LXV>hLSzIC zS3Ht;kqI!=5M_7aSt%i4xF#t;tId^Xm4uMt3j9nF!zC~U_?Ubh5<!M4NdXY+mLz!` zS<vOU(n29A;3&u?%|V3@M;3I|i-2wB>yQZh=qz|xs}1B%X01Afq==&%LS%#rJ&yht zDD(icKQ?sTcaaGLc@Y{20Y}8af#6y*6BH)UAmZ=%Atc(q<PoD_{DMad;NjY=6u0Wp zh7cQ#N3B|N6S~@6_jnw24*JL_s2>1|6ptfGpg3Z8)d~5?xH3W^sj-XS>!^^Re8|Vd zl@ThB5=Fh2BrWVXtToN^Xp-Pzt!Z9Ixn2LXc8L?8fN&?f{|xKTT>GpWCAFD>fq}u( L)z4*}Q$iB}0um@X literal 0 HcmV?d00001 diff --git a/img/voxel/1.png b/img/voxel/1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e69a7a5034d61dc58035fe1006533e2203e70c6 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCl001;Ln;{G9&F^jV<5nM zF!jHyakQfV%cOrf*=nNKC06b@=5f^2O>3QDP+{-HuI!$WnB*moq?AdLYVY{rFUmim z>!6a@Y6&gT!!9yGh8|jMofd17Izo5^J|>IWPwSHJmRR(tJ?NvdpmXRS2dz4Vq#a#{ zg9;;#IETng>1tMzTlQ!|h>Xz308#cOk0x}mufCxp%I;zlb2M$`4V_1-T4r8H(**Sc zHwJ2%bydvl@(tSPdBi(3XF`{+QrxPf=8znrk3pi+OOl#9rmv3B5tVk?6LU0a<qd^L zPqoCnk0uGq2W|||66^la(bXEXG2)1Oh|ZL*qe^y*k`{*Oh<y|k<zAY!v7>)QgobFh zYmLiMr<D;pkDRr{Jc-x(qkF|8dAKQP4qy}158oJ}W!71-vWpkP?IItIL}xEa+T1aH z#SIP7*{*wBj=HV1P<ZrE%gp<zq9A|R#z-x`&WaUX%t3_#M-GR`OzJwUB)90%f{;HB zM+!vSmp*b=YFqWAG2~Cc5d%^CNnMOeb!#3S4>I&Pk|^rDBxy#6vlg4@(FDQnP@bt> ou=o=1(2~<5DW);g$1(YHK~0}OeQo^8z`(%Z>FVdQ&MBb@0KqL1F#rGn literal 0 HcmV?d00001 diff --git a/img/voxel/2.png b/img/voxel/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a87dab609a85c41e96c8585eb2c743727e85ff GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCxIJAQLn;{G9(2rNao}M- zc<sOZ+AoIFTU#ZPB*K?IS~Ib0vzyjAsg)MlOK8LCSn-HI$WZ5zqNp>yD0vsrc(0=y zI@&{cJSn1T1VU>xMGq^<1sSRkq&_ZP@u)e3r@O-A=mgTKIi^8{*F26!DvPG~h9Efo o9a>`E7^3@KM4!i#9AEa6FS&ibB_I8ofq{X+)78&qol`;+05Ept4FCWD literal 0 HcmV?d00001 diff --git a/img/voxel/3.png b/img/voxel/3.png new file mode 100644 index 0000000000000000000000000000000000000000..6943013991b8ea6159b99308bd7a3ba910eeb7fb GIT binary patch literal 1090 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_uXI6Yk)Ln;{G9*oX=?7_ft zaLsS|U1l3Ev@ckgy76X>M3ReE-t>uGw^Nrq;&!zOiE+`|=W#?@RNd>Sr&37agbx0Y zISQie-4OvB7k7wi@lES$cKNd?iCs`TR7OYCx;tWF(xMJVQFia6eM)R0K0<~I9wn^2 z5qM-lSFaKqSV@;e$VL#qd1;cnpma!%fZ+;=5;jq37oJrX5n5$p8y$}}bnt>qpX-_v zV5pGP+||4^DP2%Hgs0;M*u=;qY@*CcY@u@$M6J7TtVmkg;V7!^ag<TXY(<1-lEYEY zpu!0qj-uMGYeEVag~+HR1svrPWY+SV(#7l=6LR!qP~nCS?o}3%T7CkBilX8Zx+c5C zxE$qEiVOLpAgbQEV?r0Nl3mC~1yS{`9TU131+_zTJdS!Q>8*OiEZD3Sx8xCvpm_L4 zw<Bz#`XHn17bQ6!VG;EY`l$5CSybEQkD;i)lG@6ONnPrK%vyDVAKgO*tyffd9G%?Z zD4Oqb=U?E*30>_SoLX^Uwu&gfpm3<hqiri5d1}ci<+ZP@nAp|caa&PKY>AWLc4v^I zx^}!>_oz3-#^p{~;KxP~y=+y4qNu)7p0k#j$I+&a+v~N|ypHlK<>iO^OzDbuxg!Rm zrz++BUp+%ZRM@p<VpnI7VdRnND`sejPIj&7MCDHG@+2(#wq8_wNz$f{+l#u)L8{-b z?P6UyL+8=A)m`E%Z)iL+Tk^<LE39jWZ|K618jVNWy1AA<5*OTlH*{r%@}sg2Em8Z9 z9kR>3K(0;Hn$jgMxZPE>YsLzvl@)@8zuk{^cW`P==~4%Y+IL8Ve4NmwE@-_%>EDX3 zco!Z}@O5{1YRv<MuC_}JD6HaKd;&HqJnCOz5uhdJk`wUJ?Z{D3D&tmS3$0Ojv`EWu zLYKVDnt+W#M~;TfQ4zK8_z`fFO;9|juqkAZ;73rx6%Q<I3W;$!(i$S8BPuRX=qSqW zb(Ga5CgiANP~oNyMp6F2qtb%ST6`0_CcCZ)*%)+WK^OCqM=pZQT47x`79^#wwD3H# zplhm<*{U0XT7E)?E0P?Ju!&lG9pzLqTOlE^(eY?sP+?OCuNIq2PQb>+A#*^<nNd(W z<c)@?dWS^FMn{lx&!e15Y@s<I<$fULj-t}8JgaVaYWWEmu1H$k;V5biRszmbN$M*t z9FH_~bt;9e09h)qG3Y3tQe9wS1IYB&E?HL{P>A>meQfM%c3JU=Wu-;r5oytQB~fvq jj{zT3g9>-|{AcLxU>B57ENy0BU|{fc^>bP0l+XkK2f3w_ literal 0 HcmV?d00001 diff --git a/img/voxel/4.png b/img/voxel/4.png new file mode 100644 index 0000000000000000000000000000000000000000..81bc966f205904e8637abcbff33ba0d9276a9f40 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vC4tu&dhEy=VJs3FYR)mPl z!QkKVC1*ST74*Cn6XQ6zxYRh<aN5MKjXfbfsY{Y{ltq&zS4y1rI2z%mb<8M;u+$!p zBmYBs?k{=Ns`M|waNm+g3p!-AL_YR*b$cIeR+0;Fty%o&P|(MQj>#c0AzJT53O99e zdmWWkid*t1DX6f$Lwx0q86j^(J|>BZPwJ9Yy0_qwQ_x1|BeO$dT(tfvKI+xdQxg3z z@X<|Fd}5ch(!Dj0l!6MKk0@#V6DVx&YF+xMt)n$W&_7_~jF6m;9SvQsOOl+Aw1(`7 z)G~94@i{8JG|Bl0Yv>+N5I5wgG*~utPXve?bCeq-yWo*)&_>0ifR9QmcYr7+B&uem zMWoh0#iW43O(Aat3|CkLYL#{E*wH1tG^xGA@n~nz#^57Af(n~L?r1)Gq~$lE%i5(! zU(|mZh>q8qry*+X+Ot2z##5`TOQL>d#iWooB8K}yKeDX6p_x>(`Vl8c|BaBs0FeA_ zEk3WKeuBxtM;$@ZcR~ssK*HvsG84MyDjo9`Wnc1$4<yaFa)<Mg8zAX-0)~03Dgw0L zi5QxN+GvQDcS+3FlAF@S?$VPF;`4)T4bbB2kl4SnB0!6;OJaYBjfSW{$SVq>{z4mr zkIE~Vg$Q=9wonk2S4t`bS<>vHv+B`;keUe{uAwqhy7+}R&gfG2INIJB;c;~Gl1I$0 zItw0k27O$pbZ^C@lR+O3g5r#2<qt+sl&Y-!p$MW`R{ls-idz7ZcXpk#<Ppot9UUF& zD=a*<^wb_XimH1Zb#=Y7@KMT2370zoADQr{xF7tDOs777U$g810|Nttr>mdKI;Vst E00;g;DgXcg literal 0 HcmV?d00001 diff --git a/img/voxel/5.png b/img/voxel/5.png new file mode 100644 index 0000000000000000000000000000000000000000..ec347a49cf36b2e7cc5b82de0b42447884f3f051 GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_vCwtKobhEy=VJ=i!=#*>Hn zVAFrM$ETa7mmHt>G^Zp@Yn^FO;o6B^*}Wk#*-IWpDT`j0TDjwz$I-2BBuVKDesmVq zpU`zwsV!7zYFDa~T+l`jEwRpuh@(O)BNQGT*0R$Pl^5ISa+H1PBWI;)t9~?u)Hoa| z66N<kdRQrL(Idx|6#++1huEly@^@CO>|$T?NKsHftS~}LPT*saX#3Jf8#?p@3j?(H zx_=0XvM+tKphG{n&_j!_^GA><`;tc!I`l&e9pK!C4*hUL9Z_}{nUIg{g6yF@-bWb) z+e7{=?Qqs=TbdMcgi+L9q|o8$f)Ji=iv^FwmD)miypC?@NEF>KVz?$LK&#D_XO)DI z;R>ReB8DrHJV@2H`p43aMA7CTL!CzrUGW_fVIS=mb?u+hl_<y_@+aU3qiAzbp~DeI z(f=Bc8oCl!S|~hP&}H9Yu_7r#i?5?1K=k7Rkf_Qd?@*ZuUCv7TLXI-7w19G(mG=1@ zRa|MIvPx;6%TdRb7CMi-Lu96OvAgVvIhwe#!sAGHsLZskc9%UNN11~@F6fxPvcf}4 zPVA$QD8JWHb{C!Sj~ha2JdOm3%1`Lx?}}LV$T?`E!;$vTnh1Ejsy$K^?Ou|!u_IB` xd+8%prMeZ5Sc5*YF6x@@O=<!{OLiaS7YSYa+<$QLS_TFN22WQ%mvv4FO#mhYEBF8a literal 0 HcmV?d00001 -- GitLab