source: experiments/frams/foraminifera/data/scripts/foraminifera.expdef @ 432

Last change on this file since 432 was 432, checked in by oriona, 9 years ago

Minor corrections, hibernation gene value changed to 1, param for stopping simulation added

File size: 19.2 KB
RevLine 
[380]1expdef:
[406]2name:Reproduction of benthic foraminifera
[380]3info:~
4Genes and parameter values which control reproduction are stored in user1 and user2 fields.
5
6user1:
[402]7genes which are not encoded in Ff genotype:
[422]8min_repro_energy - Minimum energy necessary for reproduction
9hibernation - Defines foram behavior in the case of no nutrients
[380]10
11user2:
12Physiological parameters of foraminifera:
[422]13max_energy_level - maximum energy level reached so far
[380]14gen - generation: 0 haploid, 1 diploid
[432]15species - species: 0 not hibernating 1 hibernating
16hibernated - 0/1 foram is/isn't hibernated
[422]17reproduce - 0/1 foram isn't/is ready for reproduction
[380]18~
19code:~
20
[401]21/*
22changes 2015-06-24:
23- xxx.get(...) changed to xxx[...]
24- xxx.set(...,...) changed to xxx[...]=...
[421]25- function placeRandomlyNotColliding(cr) explicitly called when adding a new creature, and removed collision checking from onForamsBorn() which is also called when "growing" (since "growing" is implemented as creating a new creature in place of the old one, so onForamsBorn() is also called)
[401]26- use creature's center (not the bbox corner) when growing
27- added "S" receptor to visualize the difference between diplo and haplo generations
28- signal.value is a MechPart (a reference) so it does not have to be updated after changing the object location
29*/
30
[421]31global nutrientenergywaiting;
[380]32global reprocounter;
[422]33global colors;
34global chambers;
35global o;
36global max_chamber_energ;
[430]37global dir_change;
[380]38
[406]39@include "foraminifera.inc"
[401]40
[380]41// -------------------------------- experiment begin --------------------------------
42
43function onExpDefLoad()
44{
45        // define genotype and creature groups
46        GenePools.clear();
47        Populations.clear();
48        GenePools[0].name = "Unused";
49
50        var pop = Populations[0];
[421]51        pop.name = "Forams";
[380]52        pop.en_assim = 0;
[404]53        pop.nnsim = 0;
[380]54        pop.enableperf = 1;
55        pop.death = 1;
56        pop.energy = 1;
57        pop.selfmask = 0x10001;
[401]58        pop.othermask = 0x20001;
59        //pop.selfmask = 0x20002; pop.othermask = 0x10002;
[422]60        pop.perfperiod = 25;
[380]61
[421]62        pop = Populations.addGroup("Nutrients");
[380]63        pop.nnsim = 0;
64        pop.enableperf = 0;
65        pop.death = 1;
66        pop.energy = 1;
67        pop.selfmask = 0x20002;
[401]68        pop.othermask = 0x10000;
[422]69        //pop.othermask = 0x10002;
[380]70
[430]71        //ExpParams.showRet = 1; //uncomment to show reticulopodia
72
73        pop = Populations.addGroup("Reticulopodia");
74        pop.nnsim = 0;
75        pop.enableperf = 0;
76        pop.death = 0;
77        pop.energy = 0;
78        pop.selfmask = 0x20002;
79        pop.othermask = 0x10000;
80       
[422]81        //world
82        SignalView.mode = 1;
[430]83        World.wrldwat = 200;
[432]84        World.wrldsiz = scale(40000);
[422]85        World.wrldbnd = 1;
86        ExpParams.stress = 1;
[421]87        ExpParams.creath = -0.99; //just above the bottom
[380]88        ExpParams.autorestart = 0;
[422]89
[411]90        //ExpParams.logging = 1; //uncomment to enable logging simulation parameters to log files
[401]91
[422]92        //reproduction
[430]93        ExpParams.foramPop = 10;       
[401]94        ExpParams.crossprob = 0.4;
95        ExpParams.mutationprob = 0.2;
[422]96        ExpParams.repro_time = 20;
97        reprocounter = 0;
[380]98
[422]99        //morphology
[430]100        dir_change = 500;
101        ExpParams.zone1_range = scale(5000);
102        ExpParams.zone2_range = scale(8000);
[422]103        init_chambers();
[430]104        ExpParams.chamber_proculus_haplo = scale(50);
[422]105        ExpParams.chamber_difference_haplo = 0.0;
106        ExpParams.chamber_proculus_diplo = scale(20);
107        ExpParams.chamber_difference_diplo = 0.2;
108        max_chamber_energ = [Vector.new(), Vector.new()];
109        for (var j = 0; j < 2; j++)
110        {
111                for (var i = 0; i < chambers[0].size; i++)
112                {
113                        max_chamber_energ[j].add(((Math.pow(getProperty(j, "chamber_proculus"),3) + Math.pow(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference"),3))*(i+1))/2);
114                }                                 
115        }
116
117        //energetics
[430]118        ExpParams.min_repro_energ_haplo = 4;
119        ExpParams.min_repro_energ_diplo = 6;
120
121        ExpParams.e_meta = 0.0002;
122        ExpParams.energy_hib = 0.0001;
123        ExpParams.energy_move = 0.00025;
124
125        ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0];
126        ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0];
127        ExpParams.feedtrans = 0.5;
128        ExpParams.e_repro_cost_haplo = 0.7;
[422]129        ExpParams.e_repro_cost_diplo = 0.3;
130
131        //nutrients
132        ExpParams.nutrientsize = scale(10);
133        ExpParams.energy_nut = 100 * Math.pow(ExpParams.nutrientsize, 3);
[430]134        ExpParams.nutrientPop = 1;
135        ExpParams.feedrate = 0.1;
[422]136        nutrientenergywaiting = ExpParams.energy_nut;
[380]137        ExpState.totaltestedcr = 0;
[421]138        ExpState.nutrient = "";
[432]139
140        ExpParams.iter = 0;
[380]141}
142
143@include "standard_placement.inc"
144
[422]145function scale(x)
146{
147        return x*0.025;
148}
149
150function getProperty(gen, prop_id)
151{
152        var ploid = "haplo";
153        if (gen == 1) ploid = "diplo";
154        return ExpParams.[prop_id + "_" + ploid];
155}
156
157function addInitialForam(species, i)
158{
159        var geno = createForamGenotype(0, species, 0);
160        var cr = Populations[0].add(geno);
161        cr.name = "Initial creature" + species + "_" + i;
162        placeCreatureRandomly(cr, 0, 0);
163        cr.energy0 = getProperty(0, "energies0");
164        cr.energy = cr.energy0;
165        setGenotype({"opt" : 0, "cr" : cr, "species" : species});
166}
167
[380]168function onExpInit()
169{
170        Populations[0].clear();
171        Populations[1].clear();
[430]172        Populations[2].clear();
[380]173
[422]174        for (var i = 0; i < ExpParams.foramPop; i++)
[380]175        {
[422]176                addInitialForam(0, i); 
177                addInitialForam(1, i);
[380]178        }
[422]179        o = Populations[0][0].getMechPart(0).orient.clone();
[380]180        ExpState.totaltestedcr = 0;
[422]181        nutrientenergywaiting = ExpParams.energy_nut;
[380]182}
183
184function onExpLoad()
185{
186        for (var pop in Populations)
187                pop.clear();
188
189        Loader.addClass(sim_params.*);
190        Loader.setBreakLabel(Loader.BeforeUnknown, "onExpLoad_Unknown");
191        Loader.run();
192
[421]193        Simulator.print("Loaded " + Populations[0].size + " Forams and " + Populations[1].size + " nutrient objects");
[380]194}
195
196function onExpLoad_Unknown()
197{
198        if (Loader.objectName == "org") // saved by the old expdef
199        {
200                var g = Genotype.newFromString("");
201                Loader.currentObject = g;
202                Interface.makeFrom(g).setAllDefault();
203                Loader.loadObject();
204                var cr = Populations[0].add(g);
205                if (cr != null)
206                {
[401]207                        //cr.rotate(0,0,Math.rnd01*Math.twopi);
[380]208                        if ((typeof(g.user1) == "Vector") && (g.user1.size >= 3))
[401]209                        {
210                                // [x,y,energy]
[380]211                                cr.move(g.user1[0] - cr.center_x, g.user1[1] - cr.center_y, 0);
212                                cr.energy = g.user1[2];
213                        }
214                        else
215                        {
[401]216                                cr.move(Math.rnd01 * World.wrldsiz - cr.center_x, Math.rnd01 * World.wrldsiz - cr.center_y, 0);
[380]217                        }
218                }
219        }
220        else if (Loader.objectName == "Creature")
221        {
222                Loader.currentObject = CreatureSnapshot.new();
223                Loader.loadObject();
224                Populations[0].add(Loader.currentObject);
225        }
226}
227
228function onExpSave()
229{
230        File.writeComment("saved by '%s.expdef'" % Simulator.expdef);
231
[401]232        var tmpvec = [], i;
[380]233
[401]234        for(var cr in Populations[1])
[380]235                tmpvec.add([cr.center_x, cr.center_y, cr.energy]);
236
[421]237        ExpState.nutrient = tmpvec;
[380]238        File.writeObject(sim_params.*);
[432]239        ExpState.nutrient = null; //vectors are only created for saving and then discarded
[380]240
241        for (var cr in Populations[0])
242                File.writeObject(cr);
243}
244
245// -------------------------------- experiment end --------------------------------
246
[421]247// -------------------------------- foram begin -----------------------------------
[380]248
[430]249function setForamMeta(cr, gen)
250{
251        cr.idleen = ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)];
252}
253
254function lastChamberNum(cr)
255{
256        return cr.numparts-1;
257}
258
[421]259function onForamsBorn(cr)
260{
[430]261        setForamMeta(cr, 1);
262        if (ExpParams.showRet == 1)
263        {
264                var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57");
265                cr.user3 = ret;
266        }
[380]267}
268
[401]269function placeRandomlyNotColliding(cr)
270{
271        var retry = 100; //try 100 times
272        while (retry--)
273        {
274                placeCreatureRandomly(cr, 0, 0);
275                if (!cr.boundingBoxCollisions(0))
276                        return cr;
277        }
278
279        Populations[0].delete(cr);
280}
281
[422]282function foramGrow(cr, chamber_num)
[380]283{
[430]284        var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
[422]285        var cr2 = Populations[0].add(geno);
286
287        cr2.energy0 = cr.energy;
288        cr2.energy = cr2.energy0;
289
290        setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2});
291        cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
[430]292        setForamMeta(cr2, cr2.user2["gen"]);
[422]293
[430]294        if (ExpParams.showRet == 1)
295        {
296                Populations[2].delete(cr.user3);
297        }
[422]298        Populations[0].delete(cr);
[380]299}
300
[422]301function stepToNearest(cr, range)
[380]302{
303        var p = cr.getMechPart(0);
[422]304        var n = cr.signals.receiveSet("nutrient", ExpParams.zone2_range);
[380]305
[401]306        //if signals are received find the source of the nearest
[380]307        if (n.size > 0)
308        {
309                var i;
310                var mp;
311                var distvec = XYZ.new(0, 0, 0);
312                var dist;
313                var mindist = 100000000000;
314                var mindistvec = null;
[430]315                var eating = 0;
[380]316
[401]317                for (i = 0; i < n.size; i++)
[380]318                {
[430]319                        mp = n[i].value.getMechPart(0);
[401]320                        distvec.set(mp.pos);
321                        distvec.sub(p.pos);
322                        dist = distvec.length;
[430]323                        if (dist < ExpParams.zone1_range)
[380]324                        {
[430]325                                if (n[i].value != null)
326                                {
327                                        energyTransfer(cr, n[i].value);
328                                        eating = 1;
329                                }
330                        }
331                        else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist)
332                        {
[401]333                                mindist = dist;
334                                mindistvec = distvec.clone();
[380]335                        }
336                }
337
[430]338                if (!eating && cr.user2["hibernated"] == 0)
339                {
340                        mindistvec.normalize();
341                        mindistvec.scale(-0.08);
342                        cr.localDrive = mindistvec;
343                        moveEnergyDec(cr);
344                }
345
[422]346                return 1;
[380]347        }
[422]348       
349        else
350                return 0;
351}
[401]352
[422]353function moveEnergyDec(cr)
354{
[430]355        if (cr.user2["hibernated"] == 0)
[422]356        {
[430]357                cr.energy_m += ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)];
[422]358        }
[421]359}
[380]360
[422]361function foramMove(cr)
[421]362{
[422]363        //TODO moving inside sediment?
[421]364
[422]365        //adjustment in z axis
[430]366        cr.moveAbs(cr.pos_x, cr.pos_y, 0);
[421]367
[430]368        //are there any nutrients in zone 1 or 2?
[401]369        {
[422]370                var moved = stepToNearest(ExpParams.zone2_range); //TODO weighted sum of distance and energy
371                if (moved==1)
[430]372                {
[422]373                        return;
374                }
[401]375        }
376
[422]377        //no nutrients in zone 2
378        var hibernation = 0;
379        if (cr.user2["gen"] == 0) hibernation =  cr.user1["hibernation"];
380        else hibernation =  cr.user1[0]["hibernation"];
381        //hibernation
382        if (hibernation == 1)
[401]383        {
[430]384                reverseHib(cr);
[422]385                cr.localDrive = XYZ.new(0,0,0);
[380]386        }
[422]387        //random move
[430]388        else if (cr.lifespan%dir_change == 0)
[380]389        {
[432]390                var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0); 
[430]391                dir.normalize();
392                dir.scale(-0.08);
393                cr.localDrive = dir;
[422]394                moveEnergyDec(cr);
395        }
396}
[401]397
[430]398function energyTransfer(cr1, cr2)
[422]399{
[430]400        cr1.localDrive = XYZ.new(0,0,0);
401        var e = cr2.getPart(0).ing * ExpParams.feedtrans; //TODO efficiency dependent on age
402        e = Math.min(cr2.energy, e) + 0.0000001;
403        //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")");
404        cr2.energy_m = cr2.energy_m + e;
405        cr1.energy_p = cr1.energy_p + e;
406        if (cr1.user2["hibernated"] == 1)
[422]407        {
[430]408                reverseHib(cr1);
[422]409        }
410}
[401]411
[430]412function reverseHib(cr)
413{
414        if (cr.user2["hibernated"] == 1)
415        {
416                setForamMeta(cr, cr.user2["gen"]); //unhibernate
417        }
418        else
419        {
420                cr.idleen = ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; //hibernate
421        }
422        cr.user2["hibernated"] = 1 - cr.user2["hibernated"];
423}
424
[422]425function onForamsStep(cr)
426{
427        cr.getMechPart(0).orient.set(o);
[430]428        if (ExpParams.showRet == 1)
429                cr.user3.moveAbs(cr.center_x-ExpParams.zone1_range, cr.center_y-ExpParams.zone1_range, cr.center_z-ExpParams.zone1_range-getProperty(cr.user2["gen"], "chamber_proculus"));
[422]430
431        if (deathConditions(cr) == 1)
432        {
433                Populations[0].kill(cr);
434                return;
435        }
436
437        foramMove(cr);
438
[430]439        var repro = foramReproduce(cr);
440        if (repro == 1)
441        {
442                return;
443        }
444
[422]445        cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
[430]446        if  (lastChamberNum(cr) <= chambers[0].size-1)
[422]447        {
[430]448                if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
[401]449                {
[430]450                        foramGrow(cr, lastChamberNum(cr));
[422]451                }       
[430]452        }       
[380]453}
454
[422]455function deathConditions(cr)
456{
457        if ((cr.energy <= ExpParams.e_death_level) || (Math.rnd01 < ExpParams.hunted_prob))
458                return 1;
459        else
460                return 0;
461}
462
[421]463function onForamsDied(cr)
[380]464{
[430]465        if (ExpParams.showRet == 1)
466        {
467                Populations[2].delete(cr.user3);
468        }
[380]469        //fossilization
470        var geno = GenePools[0].add(cr.genotype);
471        geno.user1 = cr.user1;
472        geno.user2 = cr.user2;
[418]473        if (ExpParams.logging == 1) Simulator.print("\"" + cr.name + "\" died...");
[380]474        ExpState.totaltestedcr++;
475}
476
[421]477// --------------------------------foram end -------------------------------------
[380]478
[421]479// -------------------------------- nutrient begin --------------------------------
[380]480
[422]481function createNutrientGenotype(nutrientsize, zone1_range)
482{
[430]483        return "//0\np:sh=3,sx="+(nutrientsize+25)+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
[422]484}
485
[421]486function onNutrientsStep(cr)
[380]487{
[432]488        cr.moveAbs(cr.pos_x % World.wrldsiz, cr.pos_y % World.wrldsiz, -ExpParams.zone1_range+0.5);
[380]489}
490
[421]491function addNutrient()
[380]492{
[422]493        var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientsize, ExpParams.zone1_range));
[380]494
[421]495        cr.name = "Nutrients";
[380]496        cr.idleen = 0;
[422]497        cr.energy0 = ExpParams.energy_nut;
[416]498        cr.energy = cr.energy0;
[421]499        cr.signals.add("nutrient");
[380]500
[430]501        cr.signals[0].value = cr;
[380]502
[422]503        placeCreatureRandomly(cr, 0, 0);
[380]504}
505
[422]506function nutrientGrowth()
[380]507{
[422]508        nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate;
509        if (nutrientenergywaiting > ExpParams.energy_nut)
[380]510        {
[422]511                for (var i = 0; i < ExpParams.nutrientPop; i++)
[432]512                {   
[422]513                        addNutrient();
514                }
515
516                nutrientenergywaiting = 0.0;
517                Simulator.checkpoint();
[380]518        }
519}
520
[421]521// -------------------------------- nutrient end --------------------------------
[380]522
[422]523// -------------------------------- step begin --------------------------------
[380]524
[422]525function onStep()
526{
[432]527
528        nutrientGrowth();
[422]529        if (ExpParams.logging == 1)
530        {
531                createStatistics();
532        }
533
534        //reproduction --------------------------------------------
535        reprocounter += 1;
536        if (reprocounter > ExpParams.repro_time)
537        {
538                reprocounter = 0;
539                reproduce_parents(0);
540                reproduce_parents(1);
541        }
542
543        //check for extinction -----------------------------------------------
544        if (Populations[0].size == 0)
545        {
546                if (ExpParams.autorestart)
547                {
548                        Simulator.print("no more creatures, restarting...");
549                        onExpInit();
550                }
551                else
552                {
553                        Simulator.print("no more creatures, stopped.");
554                        Simulator.stop();
555                }
556        }
[432]557        if (ExpParams.stopping == 1)
558        {
559                if (Simulator.stepNumber == 150000)
560                        Simulator.stop();
561        }
[422]562}
563
564function createStatistics()
565{       
[430]566        var number = [[0, 0],[0,0]]; // [species][gen]
567        var e_inc = [[0, 0],[0,0]];
[422]568        var e_nut = 0.0;
569
570        for (var i = 0; i < Populations[0].size; i++)
571        {
572                var cr = Populations[0].get(i);
573                var gen = cr.user2["gen"];
574                var species = cr.user2["species"];
[430]575
576                number[species][gen] = number[species][gen] + 1;
577                e_inc[species][gen] = e_inc[species][gen] + cr.energy;
[422]578        }
579
580        for (var i = 0; i < Populations[1].size; i++)
581        {
582                var cr = Populations[1].get(i);
583                e_nut += cr.energy;
584        }
585
[432]586        var log_numbers = [number[1][0], number[1][1], number[0][0], number[0][1], Populations[1].size];
587        var log_energies = [e_inc[1][0], e_inc[1][1], e_inc[0][0], e_inc[0][1], e_nut];
[422]588
[430]589        log(log_numbers, "forams_log.txt");
[432]590        log(log_energies,  "energies_log.txt");
[422]591}
592
[380]593function log(tolog, fname)
594{
[430]595        var f = File.appendDirect(fname, "forams data");
[380]596        f.writeString("" + Simulator.stepNumber);
[401]597        for (var  i = 0; i < tolog.size; i++)
[380]598        {
599                f.writeString(";" + tolog[i]);
600        }
601        f.writeString("\n");
602        f.close();
603}
604
[422]605// -------------------------------- step end --------------------------------
[380]606
[401]607@include "standard_events.inc"
[380]608
[401]609~
[380]610
[401]611prop:
[430]612id:showRet
613name:Show reticulopodia
614type:d 0 1 0
615group:Foraminifera
616
617prop:
[432]618id:iter
619name:Iteration number
620type:d
621
622prop:
623id:stopping
624name:Stop after the given number of simulation steps
625type:d 0 1 0
626
627prop:
[422]628id:e_repro_cost_haplo
[423]629name:Cost of reproduction
[422]630type:f 0.1 0.9 0.5
[421]631group:Foraminifera
[380]632
[401]633prop:
[422]634id:e_repro_cost_diplo
[423]635name:Cost of reproduction
[422]636type:f 0.1 0.9 0.3
637group:Foraminifera
[380]638
[401]639prop:
[422]640id:chamber_proculus_haplo
[423]641name:Size of proculus
[422]642type:f
[421]643group:Foraminifera
[380]644
[401]645prop:
[422]646id:chamber_proculus_diplo
[423]647name:Size of proculus
[422]648type:f
[380]649group:Foraminifera
650
651prop:
[422]652id:chamber_difference_haplo
[423]653name:Difference in size between subsequent chambers
[422]654type:f
[380]655group:Foraminifera
656
657prop:
[422]658id:chamber_difference_diplo
[423]659name:Difference in size between subsequent chambers
[422]660type:f
[380]661group:Foraminifera
662
663prop:
[422]664id:hunted_prob
665name:Probability of being hunted
666type:f 0 1 0
667group:Forminifera
[380]668
669prop:
[422]670id:zone1_range
671name:Zone 1 range
672type:f 0 200
673group:Foraminifera
[380]674
675prop:
[422]676id:zone2_range
677name:Zone 2 range
678type:f 0 3000
[421]679group:Foraminifera
[380]680
681prop:
[422]682id:colors
683name:Haploid and diploid colors
684type:x
[380]685group:Foraminifera
686
687prop:
[422]688id:min_repro_energ_haplo
689name:Min reproduction energy of forams
690type:f
[380]691group:Foraminifera
692
693prop:
[422]694id:min_repro_energ_diplo
695name:Min reproduction energy of forams
696type:f
697group:Foraminifera
698
699prop:
[380]700id:repro_prob
[401]701name:Probability of reproduction
[422]702type:f 0 1 0.8
[421]703group:Foraminifera
[380]704
705prop:
[422]706id:energies0_haplo
707name:Energy of offspring from diploid forams
708type:f
709group:Foraminifera
710
711prop:
712id:energies0_diplo
713name:Energy of offspring from diploid forams
714type:f
715group:Foraminifera
716
717prop:
718id:energy_hib
719name:Energy used for hibernation during one step
720type:f 0 1 0.001
721group:Foraminifera
722
723prop:
724id:energy_move
725name:Energy used for movement during one step
726type:f 0 20 0.001
727group:Foraminifera
728
729prop:
730id:min_vol
731name:Minimal volume for reproduction
732type:f 100 900 100
733group:Foraminifera
734
735prop:
736id:max_size
737name:Maximal size
738type:d 1 10 5
739group:Foraminifera
740
741prop:
742id:foramPop
743name:Initial forams population size
744type:d 1 1000 100
745group:Foraminifera
746
747prop:
[380]748id:crossprob
[401]749name:Crossover probability
750type:f 0 1 0
[421]751group:Foraminifera
[380]752
753prop:
[401]754id:mutationprob
755name:Mutation probability
756type:f 0 1 0
[421]757group:Foraminifera
[401]758
759prop:
[422]760id:e_death_level
[423]761name:Minimal level of energy to sustain life
762type:f 0 20 0
[380]763group:Foraminifera
764
765prop:
766id:e_meta
767name:Idle metabolism
768type:f 0 1
769group:Energy
770help:Each stick consumes this amount of energy in one time step
771
772prop:
773id:feedrate
774name:Feeding rate
775type:f 0 100
776group:Energy
777help:How fast energy is created in the world
778
779prop:
[422]780id:energy_nut
[428]781name:Nutrient energy
[422]782type:f 0 1000
[380]783group:Energy
784
785prop:
786id:feedtrans
787name:Ingestion multiplier
[422]788type:f 0 100
[380]789group:Energy
[422]790
791prop:
792id:nutrientsize
[428]793name:Nutrient size
[423]794type:f 0.1 0.9 0.1
[422]795group:Energy
796
797prop:
[421]798id:nutrientPop
[428]799name:Nutrient population size
[421]800group:Energy
801type:d 1 1000 10
802
[422]803prop:
804id:stress
805name:Environmental stress
806type:d 0 1 1
807group:World
808
809prop:
810id:repro_trigger
811name:Reproduction trigger
812type:d 0 1 1
813group:World
814
815prop:
816id:repro_time
817name:Time before reproduction
818type:d 0 1000
819
820prop:
821id:creath
822name:Creation height
823type:f -1 50
824help:~
825Vertical position (above the surface) where new Forams are revived.
826Negative values are only used in the water area:
827  0   = at the surface
828-0.5 = half depth
829-1   = just above the bottom~
830
[421]831state:
832id:nutrient
[428]833name:Nutrient locations
[421]834help:vector of vectors [x,y,energy]
835type:x
836flags:32
837
838prop:
[380]839id:autorestart
840name:Restart after extinction
841help:Restart automatically this experiment after the last creature has died?
842type:d 0 1
843
844state:
845id:notes
846name:Notes
847type:s 1
848help:~
849You can write anything here
850(it will be saved to the experiment file)~
851
852state:
853id:totaltestedcr
[421]854name:Evaluated Forams
855help:Total number of the Forams evaluated in the experiment
[380]856type:d
857flags:16
858
[404]859prop:
[421]860id:logging
861name:Log statistics to file
862type:d 0 1 0
Note: See TracBrowser for help on using the repository browser.