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

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