Changeset 667 for cpp/frams/genetics
- Timestamp:
- 06/07/17 12:01:16 (7 years ago)
- Location:
- cpp/frams/genetics/fF
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/genetics/fF/conv_fF.cpp
r544 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 10 10 GenoConv_fF0::GenoConv_fF0() 11 11 { 12 name = " 7-valueForaminifera encoding";12 name = "10-parameter Foraminifera encoding"; 13 13 in_format = 'F'; 14 14 out_format = '0'; … … 42 42 return ""; //so we return an invalid f0 genotype 43 43 44 double div_radius_length = 1; //div_radius_length=1 or kx=ky=kz=145 double radius = 1;46 47 44 Model m; 48 45 m.open(); … … 52 49 fF_chamber3d **chambers = new fF_chamber3d*[gp.number_of_chambers]; 53 50 for (int i = 0; i < gp.number_of_chambers; i++) 54 createSphere(i, chambers, radius, div_radius_length, gp.translation, gp.angle1, gp.angle2, gp.scalex, gp.scaley, gp.scalez);51 createSphere(i, chambers, gp.radius0x, gp.radius0y, gp.radius0z, gp.translation, gp.angle1, gp.angle2, gp.scalex, gp.scaley, gp.scalez); 55 52 56 53 Part *p1 = addNewPart(&m, chambers[0]); 54 p1->scale = Pt3D(gp.radius0x, gp.radius0y, gp.radius0z); //size of the initial chamber 57 55 for (int i = 1; i < gp.number_of_chambers; i++) 58 56 { … … 71 69 } 72 70 73 void GenoConv_fF0::createSphere(int which, fF_chamber3d **chambers, double radius_, double div_radius_length_, double div_vector_length_, 74 double alpha_, double gamma_, double kx_, double ky_, double kz_) 75 { 76 chambers[which] = new fF_chamber3d(0.0f, 0.0f, 0.0f, 77 (float)radius_, (float)radius_ * (float)kx_, 0.0f, 0.0f, 78 (float)(radius_ * div_vector_length_), 0.0f, 0.0f, 0.0f, 0.0f); 71 void GenoConv_fF0::createSphere(int which, fF_chamber3d **chambers, double radius0x, double radius0y, double radius0z, double translation, double alpha_, double gamma_, double kx_, double ky_, double kz_) 72 { 73 chambers[which] = new fF_chamber3d(0.0, 0.0, 0.0, 74 radius0x, radius0y, radius0z, radius0x * kx_, 0.0, 0.0, 75 radius0x * translation, 0.0, 0.0, 0.0, 0.0); 79 76 if (which == 0) 80 chambers[which]->points = generate_points(chambers[which], which, kx_, ky_, kz_); 81 if (which > 0) { 82 /* old radius */ 83 double radiusOld, radius; 84 radiusOld = chambers[which - 1]->radius; 85 radius = div_radius_length_ * radiusOld; 77 chambers[which]->points = generate_points(chambers[which]); 78 if (which > 0) 79 { 80 chambers[which]->radius_x = get_radius(chambers[which - 1]->radius_x, kx_, chambers[0]->radius_x); 81 chambers[which]->radius_y = get_radius(chambers[which - 1]->radius_y, ky_, chambers[0]->radius_y); 82 chambers[which]->radius_z = get_radius(chambers[which - 1]->radius_z, kz_, chambers[0]->radius_z); 83 86 84 /* new growth vector length */ 87 double len = radius * div_vector_length_; 88 if (radius < fF_TOO_LITTLE) { 89 radius = fF_TOO_LITTLE; 90 if (fabs(len) > (fF_TOO_MUCH * radius)) { 91 len = ((len < 0) ? (-1) : 1) * fF_TOO_MUCH * radius; 92 } 93 } 94 if (len == 0) { 85 double len = chambers[which]->radius_y * translation; 86 double max_radius = fF_TOO_MUCH * chambers[which]->radius_y; 87 if (fabs(len) > (max_radius)) 88 len = ((len < 0) ? (-1) : 1) * max_radius; 89 if (len == 0) 95 90 len = -0.0000001; 96 }97 91 98 92 /* aperture of the previous chamber */ … … 131 125 double alpha = angle - alpha_; 132 126 133 134 127 double gamma = chambers[which - 1]->phi + gamma_; 135 128 136 /* x */137 129 double wx = len * cos(alpha); 138 /* y */139 130 double wy = len * sin(alpha); 140 /* y */141 131 double wz = len * sin(alpha) * sin(gamma); 142 132 … … 146 136 double z = pzz + wz; 147 137 148 chambers[which]->centerX = (float)x; 149 chambers[which]->centerY = (float)y; 150 chambers[which]->centerZ = (float)z; 151 chambers[which]->radius = (float)radius; 152 chambers[which]->vectorTfX = (float)wx; 153 chambers[which]->vectorTfY = (float)wy; 154 chambers[which]->vectorTfZ = (float)wz; 155 chambers[which]->beta = (float)alpha; 156 chambers[which]->phi = (float)gamma; 157 158 chambers[which]->points = generate_points(chambers[which], which, kx_, ky_, kz_); 159 search_hid(which, chambers, kx_, ky_, kz_); 138 chambers[which]->centerX = x; 139 chambers[which]->centerY = y; 140 chambers[which]->centerZ = z; 141 chambers[which]->vectorTfX = wx; 142 chambers[which]->vectorTfY = wy; 143 chambers[which]->vectorTfZ = wz; 144 chambers[which]->beta = alpha; 145 chambers[which]->phi = gamma; 146 147 chambers[which]->points = generate_points(chambers[which]); 148 search_hid(which, chambers); 160 149 int pun; 161 pun = find_hole(which, pzx, pzy, pzz, chambers, kx_, ky_, kz_); 162 163 chambers[which]->holeX = (float)chambers[which]->points[pun].x; 164 chambers[which]->holeY = (float)chambers[which]->points[pun].y; 165 chambers[which]->holeZ = (float)chambers[which]->points[pun].z; 166 } 150 pun = find_hole(which, pzx, pzy, pzz, chambers); 151 if (pun < 0) //should never happen 152 { 153 logPrintf("GenoConv_fF0", "createSphere", LOG_ERROR, "find_hole(%d) returned %d", which, pun); 154 pun = 0; 155 } 156 chambers[which]->holeX = chambers[which]->points[pun].x; 157 chambers[which]->holeY = chambers[which]->points[pun].y; 158 chambers[which]->holeZ = chambers[which]->points[pun].z; 159 } 160 } 161 162 double GenoConv_fF0::get_radius(double prev_radius, double scale, double start_radius) 163 { 164 double radius = prev_radius * scale; 165 double min_radius = fF_TOO_LITTLE*start_radius; 166 if (radius < min_radius) { 167 radius = min_radius; 168 } 169 170 return radius; 167 171 } 168 172 169 173 void GenoConv_fF0::precompute_cos_and_sin() 170 174 { 171 int i; 172 double pi = acos(-1.0); 173 double angle = pi / (((double)fF_LATITUDE_NUM)*0.5); 174 for (i = 0; i < fF_LATITUDE_NUM; i++) 175 { 176 cosines[i] = cos((double)i * angle); 177 sines[i] = sin((double)i * angle); 178 } 179 } 180 181 fF_point* GenoConv_fF0::generate_points(fF_chamber3d *chamber, int which, double kx_, double ky_, double kz_) 182 { 183 float radius = chamber->radius; 184 float cenx = chamber->centerX; 185 float ceny = chamber->centerY; 186 float cenz = chamber->centerZ; 187 188 double maxX = 0; 189 double maxY = 0; 190 double minX = 0; 191 double minY = 0; 192 double minZ = 0; 193 194 double kx = 1; 195 double ky = 1; 196 double kz = 1; 197 198 if (which > 0) 199 { 200 for (int kt = 1; kt < (which + 1); kt++) 201 { 202 kx = kx * kx_; 203 ky = ky * ky_; 204 kz = kz * kz_; 205 } 206 } 207 208 bool all_k_ones = kx_ == 1 && ky_ == 1 && kz_ == 1; 209 210 double rx = all_k_ones ? radius : kx; 211 double ry = all_k_ones ? radius : ky; 212 double rz = all_k_ones ? radius : kz; 175 double angle = M_PI * 2 / fF_LATITUDE_NUM; 176 for (int i = 0; i < fF_LATITUDE_NUM; i++) 177 { 178 cosines[i] = cos(i * angle); 179 sines[i] = sin(i * angle); 180 } 181 } 182 183 fF_point* GenoConv_fF0::generate_points(fF_chamber3d *chamber) 184 { 185 double cenx = chamber->centerX; 186 double ceny = chamber->centerY; 187 double cenz = chamber->centerZ; 188 189 double rx = chamber->radius_x; 190 double ry = chamber->radius_y; 191 double rz = chamber->radius_z; 213 192 214 193 fF_point *points = new fF_point[fF_SIZE]; … … 227 206 p.z = z; 228 207 p.inside = false; 229 230 if (x < minX) minX = x;231 if (x > maxX) maxX = x;232 if (y < minY) minY = y;233 if (y > maxY) maxY = y;234 235 if (z < minZ) minZ = z;236 208 } 237 209 } … … 240 212 } 241 213 214 template<typename T> T Square(T x) { return x * x; } 215 242 216 double GenoConv_fF0::dist(double x1, double y1, double z1, double x2, double y2, double z2) 243 217 { 244 return sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1) + (z2 - z1)*(z2 - z1)); 245 } 246 247 void GenoConv_fF0::search_hid(int nr, fF_chamber3d **spheres, double kx_, double ky_, double kz_) 248 { 249 double kxsq = kx_*kx_; 250 double kysq = ky_*ky_; 251 double kzsq = kz_*kz_; 252 218 return sqrt(Square(x2 - x1) + Square(y2 - y1) + Square(z2 - z1)); 219 } 220 221 void GenoConv_fF0::search_hid(int nr, fF_chamber3d **chambers) 222 { 253 223 for (int i = 0; i < nr; i++) 254 224 { 255 double srX0 = spheres[i]->centerX; 256 double srY0 = spheres[i]->centerY; 257 double srZ0 = spheres[i]->centerZ; 258 259 double radsq = spheres[i]->radius * spheres[i]->radius; 260 261 double a2 = kx_ != 1 ? kxsq : radsq; 262 double b2 = ky_ != 1 ? kysq : radsq; 263 double c2 = kzsq * radsq; 225 fF_chamber3d *chamber = chambers[i]; 226 227 double rx_sq = Square(chamber->radius_x); 228 double ry_sq = Square(chamber->radius_y); 229 double rz_sq = Square(chamber->radius_z); 264 230 265 231 for (int j = 0; j < fF_AMOUNT; j++) 266 232 { 267 fF_point &p = spheres[nr]->points[j];268 269 double up 1 = (p.x - srX0) * (p.x - srX0);270 double up 2 = (p.y - srY0) * (p.y - srY0);271 double up 3 = (p.z - srZ0) * (p.z - srZ0);272 273 double exp 1 = up1 / a2;274 double exp 2 = up2 / b2;275 double exp 3 = up3 / c2;276 277 double result = exp 1 + exp2 + exp3;233 fF_point &p = chambers[nr]->points[j]; 234 235 double upx = Square(p.x - chamber->centerX); 236 double upy = Square(p.y - chamber->centerY); 237 double upz = Square(p.z - chamber->centerZ); 238 239 double expx = upx / rx_sq; 240 double expy = upy / ry_sq; 241 double expz = upz / rz_sq; 242 243 double result = expx + expy + expz; 278 244 279 245 if (result < fF_THICK_RATIO) … … 285 251 } 286 252 287 int GenoConv_fF0::find_hole(int which, double x, double y, double z, fF_chamber3d **chambers , double kx_, double ky_, double kz_)253 int GenoConv_fF0::find_hole(int which, double x, double y, double z, fF_chamber3d **chambers) 288 254 { 289 255 int found = -1; 290 256 double distsq_found; 291 257 292 double kxsq = kx_*kx_;293 double kysq = ky_*ky_;294 double kzsq = kz_*kz_;295 296 258 for (int i = 0; i < fF_AMOUNT; i++) 297 259 { … … 299 261 if (!p.inside) //it is not inside another chamber 300 262 { 301 double distancesq = (p.x - x)*(p.x - x) + (p.y - y)*(p.y - y) + (p.z - z)*(p.z - z);263 double distancesq = Square(p.x - x) + Square(p.y - y) + Square(p.z - z); 302 264 if (found < 0) 303 265 { … … 312 274 for (int j = 0; j < which && good; j++) 313 275 { 314 double srX0 = chambers[j]->centerX; 315 double srY0 = chambers[j]->centerY; 316 double srZ0 = chambers[j]->centerZ; 317 318 double radsq = chambers[j]->radius * chambers[j]->radius; 319 320 double a2 = kxsq * radsq; 321 double b2 = kysq * radsq; 322 double c2 = kzsq * radsq; 323 324 double up1 = (p.x - srX0) * (p.x - srX0); 325 double up2 = (p.y - srY0) * (p.y - srY0); 326 double up3 = (p.z - srZ0) * (p.z - srZ0); 327 328 double exp1 = up1 / a2; 329 double exp2 = up2 / b2; 330 double exp3 = up3 / c2; 331 332 double result = exp1 + exp2 + exp3; 276 fF_chamber3d *chamber = chambers[j]; 277 278 double rx_sq = Square(chamber->radius_x); 279 double ry_sq = Square(chamber->radius_y); 280 double rz_sq = Square(chamber->radius_z); 281 282 double upx = Square(p.x - chamber->centerX); 283 double upy = Square(p.y - chamber->centerY); 284 double upz = Square(p.z - chamber->centerZ); 285 286 double expx = upx / rx_sq; 287 double expy = upy / ry_sq; 288 double expz = upz / rz_sq; 289 290 double result = expx + expy + expz; 333 291 if (result < 1.0) 334 292 { -
cpp/frams/genetics/fF/conv_fF.h
r286 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 9 9 #define fF_TOO_LITTLE 0.10 10 10 11 #define fF_HOLE_RADIUS 0.05 f11 #define fF_HOLE_RADIUS 0.05 12 12 #define fF_LONGITUDE_NUM 69 13 13 … … 43 43 44 44 protected: 45 void createSphere(int ktora, fF_chamber3d **chambers, double radius, double div_radius_length, double div_vector_length, 46 double alpha, double gamma, double kx, double ky, double kz); 47 fF_point* generate_points(fF_chamber3d *chamber, int which, double kx, double ky, double kz); 45 void createSphere(int ktora, fF_chamber3d **chambers, double radius0x, double radius0y, double radius0z, double translation, double alpha, double gamma, double kx, double ky, double kz); 46 fF_point* generate_points(fF_chamber3d *chamber); 48 47 double dist(double x1, double y1, double z1, double x2, double y2, double z2); 49 void search_hid(int nr, fF_chamber3d **spheres , double kx_, double ky_, double kz_);50 int find_hole(int which, double x, double y, double z, fF_chamber3d **chambers , double kx_, double ky_, double kz_);51 48 void search_hid(int nr, fF_chamber3d **spheres); 49 int find_hole(int which, double x, double y, double z, fF_chamber3d **chambers); 50 double get_radius(double prev_radius, double scale, double radius0); 52 51 private: 53 52 double* cosines; -
cpp/frams/genetics/fF/fF_chamber3d.cpp
r286 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 7 7 #include <iostream> 8 8 9 fF_chamber3d::fF_chamber3d( float centerX, float centerY, floatcenterZ,10 float radius, float holeX, float holeY, floatholeZ,11 float vectorTfX, float vectorTfY, float vectorTfZ, float beta, floatphi)9 fF_chamber3d::fF_chamber3d(double centerX, double centerY, double centerZ, 10 double radius_x, double radius_y, double radius_z, double holeX, double holeY, double holeZ, 11 double vectorTfX, double vectorTfY, double vectorTfZ, double beta, double phi) 12 12 { 13 13 points = NULL; … … 15 15 this->centerY = centerY; 16 16 this->centerZ = centerZ; 17 this->radius = radius; 17 this->radius_x = radius_x; 18 this->radius_y = radius_y; 19 this->radius_z = radius_z; 18 20 this->holeX = holeX; 19 21 this->holeY = holeY; -
cpp/frams/genetics/fF/fF_chamber3d.h
r286 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 12 12 { 13 13 public: 14 float centerX; 15 float centerY; 16 float centerZ; 17 float radius; 18 float holeX; 19 float holeY; 20 float holeZ; 21 float vectorTfX; 22 float vectorTfY; 23 float vectorTfZ; 24 float beta; 25 float phi; 14 double centerX; 15 double centerY; 16 double centerZ; 17 double radius_x; 18 double radius_y; 19 double radius_z; 20 double holeX; 21 double holeY; 22 double holeZ; 23 double vectorTfX; 24 double vectorTfY; 25 double vectorTfZ; 26 double beta; 27 double phi; 28 26 29 fF_point *points; 27 30 28 fF_chamber3d( float centerX, float centerY, floatcenterZ,29 float radius, float holeX, float holeY, floatholeZ,30 float vectorTfX, float vectorTfY, float vectorTfZ, float beta, floatphi);31 fF_chamber3d(double centerX, double centerY, double centerZ, 32 double radius_x, double radius_y, double radius_z, double holeX, double holeY, double holeZ, 33 double vectorTfX, double vectorTfY, double vectorTfZ, double beta, double phi); 31 34 ~fF_chamber3d(); 32 35 }; -
cpp/frams/genetics/fF/fF_genotype.cpp
r286 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 8 8 ParamEntry fF_growth_params::paramtab[] = 9 9 { 10 { "fF", 1, 7, "fF" }, 10 //on changes synchronize with fF_PROPS_TO_MUTATE from .h 11 12 { "fF", 1, 10, "fF" }, 11 13 { "n", 0, PARAM_CANOMITNAME, "number of chambers", "d 1 15 6", FIELD(number_of_chambers), }, 14 15 { "rad0x", 0, PARAM_CANOMITNAME, "radius0 x", "f 0.01 2.0 1.0", FIELD(radius0x), }, 16 { "rad0y", 0, PARAM_CANOMITNAME, "radius0 y", "f 0.01 2.0 1.0", FIELD(radius0y), }, 17 { "rad0z", 0, PARAM_CANOMITNAME, "radius0 z", "f 0.01 2.0 1.0", FIELD(radius0z), }, 18 12 19 { "sx", 0, PARAM_CANOMITNAME, "scale x", "f 1.0 1.1 1.05", FIELD(scalex), }, 13 20 { "sy", 0, PARAM_CANOMITNAME, "scale y", "f 1.0 1.1 1.05", FIELD(scaley), }, 14 21 { "sz", 0, PARAM_CANOMITNAME, "scale z", "f 1.0 1.1 1.05", FIELD(scalez), }, 22 15 23 { "tr", 0, PARAM_CANOMITNAME, "translation factor", "f -1 1 0", FIELD(translation), }, 16 24 { "a1", 0, PARAM_CANOMITNAME, "angle 1", "f -3.1415926 3.1415926 0", FIELD(angle1), }, 17 25 { "a2", 0, PARAM_CANOMITNAME, "angle 2", "f -3.1415926 3.1415926 0", FIELD(angle2), }, 26 18 27 { 0, 0, 0, }, 19 28 }; -
cpp/frams/genetics/fF/fF_genotype.h
r348 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 14 14 { 15 15 int number_of_chambers; 16 double scalex, scaley, scalez; 16 double radius0x, radius0y, radius0z; //radius of 0th (initial) chamber 17 double scalex, scaley, scalez; //(cumulative) scaling of consecutive chambers 17 18 double translation; 18 19 double angle1, angle2; 20 #define fF_PROPS_TO_MUTATE {0,4,5,6,7,8,9} //indexes of properties from paramtab; keep synchronized with fF_genotype.cpp 19 21 20 22 static ParamEntry paramtab[]; 21 23 Param param; 22 24 23 fF_growth_params() 24 :param(paramtab, this) 25 fF_growth_params() :param(paramtab, this) 25 26 { 26 27 reset(); … … 36 37 SString s = serialized; 37 38 int p = 0; //position in string 38 return ((param.load2(s, p) == 7) && (p == s.len()));39 return ((param.load2(s, p) == param.getPropCount()) && (p == s.len())); 39 40 } 40 41 -
cpp/frams/genetics/fF/oper_fF.cpp
r513 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 48 48 fF_growth_params par; 49 49 par.load(gene); 50 int which = randomN(par.param.getPropCount()); 51 bool mutated_ok = GenoOperators::mutatePropertyNaive(par.param, which); 50 static const int propsToMutate[] = fF_PROPS_TO_MUTATE; 51 int which = randomN(ARRAY_LENGTH(propsToMutate)); 52 bool mutated_ok = GenoOperators::mutatePropertyNaive(par.param, propsToMutate[which]); 52 53 if (mutated_ok) 53 54 { -
cpp/frams/genetics/fF/oper_fF.h
r513 r667 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 18 18 int crossOver(char *&g1, char *&g2, float& chg1, float& chg2); 19 19 uint32_t style(const char *g, int pos); 20 const char* getSimplest() { return "6, "/*"1, 1, 1, "*/"1.05, 1.05, 1.05, 0, 0, 0"; }20 const char* getSimplest() { return "6, 1, 1, 1, 1.05, 1.05, 1.05, 0, 0, 0"; } 21 21 22 22 double xover_proportion;
Note: See TracChangeset
for help on using the changeset viewer.