- Timestamp:
- 08/24/15 19:57:12 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
experiments/frams/foraminifera/data/scripts/foraminifera.inc
r421 r422 2 2 //real proportions 3 3 4 // -------------------------------- step begin -------------------------------- 5 6 function reproduce_haploid(parent, parent2) 7 { 8 var number = parent.user2["Va"] / ExpParams.energy0d + parent2.user2["Va"] / ExpParams.energy0d; 4 function init_chambers() 5 { 6 colors = ["1.0,1.0,0.0","1.0,0.5,0.0"]; 7 chambers = [ ["//0\np:sh=1,", 8 "p:0.98089325428009, 0.00591040402650833, 0.00389722990803421,", 9 "p:1.90962779521942, -0.256769120693207, -0.16194811463356,", 10 "p:2.63965249061584, -0.727959632873535, -0.609036147594452,", 11 "p:3.17575979232788, -1.34843015670776, -1.14828503131866,", 12 "p:3.55273032188416, -2.22369408607483, -1.3917418718338,", 13 "p:3.64916682243347, -3.11888360977173, -1.01666414737701,", 14 "p:3.50461649894714, -3.84039807319641, -0.377427101135254,", 15 "p:3.15921688079834, -4.50001525878906, 0.261153399944305,", 16 "p:2.51528453826904, -5.16421365737915, 0.59241509437561,"], 17 ["//0\np:sh=1,", 18 "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,", 19 "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,", 20 "p:0.615013539791107, 0.778662621974945, 0.535521030426025,", 21 "p:0.488581955432892, 0.826426684856415, -0.381044268608093,", 22 "p:0.732419908046722, -0.0084995785728097, -1.02214300632477,", 23 "p:1.35288727283478, 0.875738024711609, -1.03719782829285,", 24 "p:0.342692613601685, 0.938660383224487, -1.45657968521118,", 25 "p:1.0958571434021, 0.316927701234818, -1.813929438591,", 26 "p:0.903768002986908, 1.11856341362, -2.53161096572876,", 27 "p:0.21014116704464, 0.295340299606323, -2.45328187942505,"] ]; 28 } 29 30 function createForamGenotype(gen, species, chamber_num) 31 { 32 var rad = getProperty(gen, "chamber_proculus"); 33 var geno = chambers[species][0] + "sx=" + rad + ",sy=" + rad + ",sz=" + rad + ", rz=3.14159265358979,vr=" + colors[gen]; 34 35 chamber_num = Math.min(chamber_num, chambers[species].size - 1); 36 37 for (var i = 0; i < chamber_num; i++) 38 { 39 rad = getProperty(gen, "chamber_proculus") + getProperty(gen, "chamber_difference") * (i + 1); 40 geno += "\n" + chambers[species][i+1] + "sh=1,sx=" + rad + ",sy=" + rad + ",sz=" + rad + ",vr=" + colors[gen]; 41 } 42 43 for (var i = 0; i < chamber_num; i++) 44 { 45 geno += "\n" + "j:"+ i +", "+ (i+1) +", sh=1"; 46 } 47 if (species == 1) geno += "\nn:p=0,d=\"S\""; 48 49 return geno; 50 } 51 52 function setGenotype(mode) 53 { 54 if (mode["opt"] == 0) //initial 55 { 56 mode["cr"].user1 = {"min_repro_energies" : [getProperty(0, "min_repro_energ"), getProperty(1, "min_repro_energ")], "hibernation" : 1 - mode["species"]}; 57 mode["cr"].user2 = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0, "hibernated" : 0, "species" : mode["species"], "reproduce" : 0}; 58 } 59 else if (mode["opt"] == 1) //child 60 { 61 mode["cr"].user2 = {"max_energy_level" : getProperty(1 - mode["parent_user2"]["gen"],"energies0"), "gen" : 1 - mode["parent_user2"]["gen"], "hibernated" : 0, "species" : mode["parent_user2"]["species"], "reproduce" : 0}; 62 mode["cr"].user1 = mode["parent_user1"]; 63 } 64 else //grow 65 { 66 mode["cr"].user1 = mode["parent_user1"]; 67 mode["cr"].user2 = mode["parent_user2"]; 68 } 69 } 70 71 function reproduce_haploid(parent, parent2, clone) 72 { 73 var number, energy0, new_user1, gen; 74 if (clone == 1) 75 { 76 energy0 = getProperty(0,"energies0"); 77 number = getProperty(1, "e_repro_cost") * parent.energy / energy0; 78 new_user1 = parent.user1; 79 parent.user2["gen"] = 1 - parent.user2["gen"]; //because of reversal of "gen" in createOffspring function 80 gen = parent.user2["gen"]; 81 } 82 else 83 { 84 energy0 = getProperty(1,"energies0"); 85 number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0 + getProperty(parent.user2["gen"], "e_repro_cost") * parent2.energy / energy0; 86 new_user1 = [parent.user1, parent2.user1]; 87 gen = 1 - parent.user2["gen"]; 88 } 89 90 Simulator.print("number of offspring: " + number); 9 91 10 92 for (var j = 0; j < number; j++) 11 93 { 12 createOffspring( ExpParams.gend, ExpParams.energy0d, [parent.user1, parent2.user1], {"Va" : ExpParams.energy0d, "gen" : 1 , "growth_step" : ExpParams.growth_step, "rsize": ExpParams.rads[1], "vinit": ExpParams.energy0d}); //TODO genes from both generations in user194 createOffspring(createForamGenotype(gen, parent.user2["species"], 0), energy0, new_user1, parent.user2); 13 95 } 14 96 } … … 16 98 function reproduce_diploid(parent) 17 99 { 18 var number = parent.user2["Va"] / ExpParams.energy0h; 100 var energy0 = getProperty(0,"energies0"); 101 var number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0; 102 103 Simulator.print("number of offspring: " + number); 104 19 105 for (var j = 0; j < number / 2; j++) 20 106 { … … 23 109 if (Math.rnd01 < ExpParams.crossprob) 24 110 { 25 crossover(parent, "min energy");111 crossover(parent, "min_repro_energies"); 26 112 crossed = 1; 27 113 } … … 29 115 for (var k = 0; k < 2; k++) 30 116 { 31 createOffspring( ExpParams.genh, ExpParams.energy0h, {"minenergy" : ExpParams.minenerg[0], "minage": ExpParams.minage[0]}, {"Va" : ExpParams.energy0h, "gen" : 0 , "growth_step" : ExpParams.growth_step, "rsize" : ExpParams.rads[0], "vinit": ExpParams.energy0h}); //TODO different vamin and amin for haploids and diploids?117 createOffspring(createForamGenotype(1 - parent.user2["gen"], parent.user2["species"], 0), energy0, parent.user1[0], parent.user2); 32 118 } 33 119 … … 35 121 if (crossed == 1) 36 122 { 37 crossover(parent, "min energy");123 crossover(parent, "min_repro_energies"); 38 124 crossed = 0; 39 125 } … … 42 128 } 43 129 44 function crossover(parent, gene) 45 { 46 var tmp = parent.user1[0][gene]; 47 parent.user1[0][gene] = parent.user1[1][gene]; 48 parent.user1[1][gene] = tmp; 49 } 50 51 52 function createOffspring(geno, energy, new_user1, new_user2) 53 { 54 var cr = Populations[0].add(geno); 55 cr.energy0 = energy; 56 cr.energy = cr.energy0; 57 setGenotype(cr, new_user1, new_user2); 58 placeRandomlyNotColliding(cr); 59 } 60 61 function onStep() 62 { 63 64 if (ExpParams.logging == 1) 65 { 66 createStatistics(); 67 } 68 69 //nutrient growth --------------------------------------------- 70 nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate; 71 if (nutrientenergywaiting > ExpParams.feede0) 72 { 73 for (var i = 0; i < ExpParams.nutrientPop; i++) 74 { 75 addNutrient(); 76 } 77 78 nutrientenergywaiting = 0.0; 79 Simulator.checkpoint(); 80 } 81 82 //reproduction -------------------------------------------- 83 reprocounter += 1; 84 if (reprocounter > ExpParams.repro_time) 85 { 86 reprocounter = 0; 130 function reproduce_parents(species) 131 { 87 132 var parent1 = null; 88 133 var parent2 = null; … … 90 135 for (var i = pop.size-1; i >= 0; i--) 91 136 { 92 if (pop[i]. signals.size > 0)137 if (pop[i].user2["reproduce"] == 1 && pop[i].user2["species"] == species) 93 138 { 94 if (pop[i].user2["gen"]==1) 95 { 96 reproduce_diploid(pop[i]); 97 pop.kill(i); 139 if ((pop[i].user2["gen"]==1) || ((pop[i].user2["gen"]==0) && ExpParams.stress == 0)) 140 { 141 continue; 98 142 } 99 143 else if (parent1 == null) … … 107 151 else 108 152 { 109 reproduce_haploid(parent1, parent2); 153 reproduce_haploid(parent1, parent2, 0); 154 print_repro_info(parent1); 155 print_repro_info(parent2); 110 156 pop.kill(parent1); 111 157 pop.kill(parent2); … … 116 162 } 117 163 } 118 } 119 120 //check for death ----------------------------------------------- 121 if (Populations[0].size == 0) 122 { 123 if (ExpParams.autorestart) 124 { 125 Simulator.print("no more creatures, restarting..."); 126 onExpInit(); 127 } 128 else 129 { 130 Simulator.print("no more creatures, stopped."); 131 Simulator.stop(); 132 } 133 } 134 } 135 136 function createStatistics() 137 { 138 var haploids = 0; 139 var diploids = 0; 140 var e_inc_h = 0.0; 141 var e_inc_d = 0.0; 142 var e_nut = 0.0; 143 var size_h = 0.0; 144 var size_d = 0.0; 145 var vmin_h = 0.0; 146 var vmin_d = 0.0; 147 148 for (var i = 0; i < Populations[0].size; i++) 149 { 150 var cr = Populations[0].get(i); 151 if (cr.user2["gen"] == 0) 152 { 153 haploids += 1; 154 e_inc_h += cr.energy; 155 size_h += ExpParams.rads[0]; //TODO change of size dependent on gene 156 vmin_h += cr.user1["minenergy"]; 157 } 158 else if (cr.user2["gen"] == 1) 159 { 160 diploids += 1; 161 e_inc_d += cr.energy; 162 size_d += ExpParams.rads[1]; //TODO change of size dependent on gene 163 vmin_d += cr.user1[0]["minenergy"]; 164 } 165 } 166 167 for (var i = 0; i < Populations[1].size; i++) 168 { 169 var cr = Populations[1].get(i); 170 e_nut += cr.energy; 171 } 172 173 var l1 = [haploids, diploids, Populations[1].size]; 174 var l2 = [e_inc_h, e_inc_d, e_nut]; 175 var dp = diploids; 176 var hp = haploids; 177 if (dp == 0) dp = 0.000001; 178 if (hp == 0) hp = 0.000001; 179 var l3 = [size_h / hp, vmin_h / hp, size_d / dp, vmin_d / dp]; 180 181 log(l1, "log_sizes.txt"); 182 log(l2, "log_energy.txt"); 183 log(l3, "log_sizes_v.txt"); 184 } 185 // -------------------------------- step end -------------------------------- 164 } 165 166 function readyToRepro(cr) 167 { 168 var reproduced = 1; 169 170 171 if (cr.user2["gen"] == 1) 172 { 173 reproduce_diploid(cr); 174 } 175 176 else if (ExpParams.stress == 0) 177 { 178 reproduce_haploid(cr, null, 1); 179 } 180 181 else 182 { 183 if (cr.signals.size == 0) 184 { 185 cr.signals.add("repro"+cr.user2["species"]); 186 cr.signals[0].power = 1; 187 } 188 reproduced = 0; 189 cr.user2["reproduce"] = 1; 190 } 191 192 if (reproduced == 1) 193 { 194 print_repro_info(cr); 195 Populations[0].kill(cr); 196 } 197 198 return reproduced; 199 } 200 201 function print_repro_info(cr) 202 { 203 Simulator.print("Reproduced " + cr.user2["gen"] + " of species " + cr.user2["species"] + " energy: " + cr.energy); 204 } 205 206 function foramReproduce(cr) 207 { 208 var properEnergy = 0; 209 var reproduced = 0; 210 211 if (cr.user2["gen"] == 0) 212 { 213 properEnergy = ( cr.energy >= cr.user1["min_repro_energies"][cr.user2["gen"]] ); 214 } 215 else 216 { 217 properEnergy = ( cr.energy >= cr.user1[0]["min_repro_energies"][cr.user2["gen"]] ); //TODO gene selection 218 } 219 220 //if creature has proper energy 221 if ( properEnergy && cr.signals.size == 0) 222 { 223 //reproduce with probability repro_prob 224 if (Math.rnd01 <= ExpParams.repro_prob) //TODO env trigger 225 { 226 reproduced = readyToRepro(cr); 227 } 228 else if (cr.signals.receive("repro"+cr.user2["species"]) > 0) 229 { 230 reproduced = readyToRepro(cr); 231 } 232 if (reproduced == 1) 233 return; 234 } 235 236 else if (!properEnergy) 237 { 238 cr.signals.clear(); 239 cr.user2["reproduce"] = 0; 240 } 241 } 242 243 function crossover(parent, gene) 244 { 245 var tmp = parent.user1[0][gene]; 246 parent.user1[0][gene] = parent.user1[1][gene]; 247 parent.user1[1][gene] = tmp; 248 } 249 250 function createOffspring(geno, energy, parent_user1, parent_user2) 251 { 252 var cr = Populations[0].add(geno); 253 cr.energy0 = energy; 254 cr.energy = cr.energy0; 255 setGenotype({"cr" : cr, "parent_user1" : parent_user1, "parent_user2" : parent_user2, "opt" : 1}); 256 placeRandomlyNotColliding(cr); 257 }
Note: See TracChangeset
for help on using the changeset viewer.