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
Line 
1expdef:
2name:Reproduction of benthic foraminifera
3info:~
4Genes and parameter values which control reproduction are stored in user1 and user2 fields.
5
6user1:
7genes which are not encoded in Ff genotype:
8min_repro_energy - Minimum energy necessary for reproduction
9hibernation - Defines foram behavior in the case of no nutrients
10
11user2:
12Physiological parameters of foraminifera:
13max_energy_level - maximum energy level reached so far
14gen - generation: 0 haploid, 1 diploid
15species - species: 0 not hibernating 1 hibernating
16hibernated - 0/1 foram is/isn't hibernated
17reproduce - 0/1 foram isn't/is ready for reproduction
18~
19code:~
20
21/*
22changes 2015-06-24:
23- xxx.get(...) changed to xxx[...]
24- xxx.set(...,...) changed to xxx[...]=...
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)
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
31global nutrientenergywaiting;
32global reprocounter;
33global colors;
34global chambers;
35global o;
36global max_chamber_energ;
37global dir_change;
38
39@include "foraminifera.inc"
40
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];
51        pop.name = "Forams";
52        pop.en_assim = 0;
53        pop.nnsim = 0;
54        pop.enableperf = 1;
55        pop.death = 1;
56        pop.energy = 1;
57        pop.selfmask = 0x10001;
58        pop.othermask = 0x20001;
59        //pop.selfmask = 0x20002; pop.othermask = 0x10002;
60        pop.perfperiod = 25;
61
62        pop = Populations.addGroup("Nutrients");
63        pop.nnsim = 0;
64        pop.enableperf = 0;
65        pop.death = 1;
66        pop.energy = 1;
67        pop.selfmask = 0x20002;
68        pop.othermask = 0x10000;
69        //pop.othermask = 0x10002;
70
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       
81        //world
82        SignalView.mode = 1;
83        World.wrldwat = 200;
84        World.wrldsiz = scale(40000);
85        World.wrldbnd = 1;
86        ExpParams.stress = 1;
87        ExpParams.creath = -0.99; //just above the bottom
88        ExpParams.autorestart = 0;
89
90        //ExpParams.logging = 1; //uncomment to enable logging simulation parameters to log files
91
92        //reproduction
93        ExpParams.foramPop = 10;       
94        ExpParams.crossprob = 0.4;
95        ExpParams.mutationprob = 0.2;
96        ExpParams.repro_time = 20;
97        reprocounter = 0;
98
99        //morphology
100        dir_change = 500;
101        ExpParams.zone1_range = scale(5000);
102        ExpParams.zone2_range = scale(8000);
103        init_chambers();
104        ExpParams.chamber_proculus_haplo = scale(50);
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
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;
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);
134        ExpParams.nutrientPop = 1;
135        ExpParams.feedrate = 0.1;
136        nutrientenergywaiting = ExpParams.energy_nut;
137        ExpState.totaltestedcr = 0;
138        ExpState.nutrient = "";
139
140        ExpParams.iter = 0;
141}
142
143@include "standard_placement.inc"
144
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
168function onExpInit()
169{
170        Populations[0].clear();
171        Populations[1].clear();
172        Populations[2].clear();
173
174        for (var i = 0; i < ExpParams.foramPop; i++)
175        {
176                addInitialForam(0, i); 
177                addInitialForam(1, i);
178        }
179        o = Populations[0][0].getMechPart(0).orient.clone();
180        ExpState.totaltestedcr = 0;
181        nutrientenergywaiting = ExpParams.energy_nut;
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
193        Simulator.print("Loaded " + Populations[0].size + " Forams and " + Populations[1].size + " nutrient objects");
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                {
207                        //cr.rotate(0,0,Math.rnd01*Math.twopi);
208                        if ((typeof(g.user1) == "Vector") && (g.user1.size >= 3))
209                        {
210                                // [x,y,energy]
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                        {
216                                cr.move(Math.rnd01 * World.wrldsiz - cr.center_x, Math.rnd01 * World.wrldsiz - cr.center_y, 0);
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
232        var tmpvec = [], i;
233
234        for(var cr in Populations[1])
235                tmpvec.add([cr.center_x, cr.center_y, cr.energy]);
236
237        ExpState.nutrient = tmpvec;
238        File.writeObject(sim_params.*);
239        ExpState.nutrient = null; //vectors are only created for saving and then discarded
240
241        for (var cr in Populations[0])
242                File.writeObject(cr);
243}
244
245// -------------------------------- experiment end --------------------------------
246
247// -------------------------------- foram begin -----------------------------------
248
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
259function onForamsBorn(cr)
260{
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        }
267}
268
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
282function foramGrow(cr, chamber_num)
283{
284        var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
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);
292        setForamMeta(cr2, cr2.user2["gen"]);
293
294        if (ExpParams.showRet == 1)
295        {
296                Populations[2].delete(cr.user3);
297        }
298        Populations[0].delete(cr);
299}
300
301function stepToNearest(cr, range)
302{
303        var p = cr.getMechPart(0);
304        var n = cr.signals.receiveSet("nutrient", ExpParams.zone2_range);
305
306        //if signals are received find the source of the nearest
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;
315                var eating = 0;
316
317                for (i = 0; i < n.size; i++)
318                {
319                        mp = n[i].value.getMechPart(0);
320                        distvec.set(mp.pos);
321                        distvec.sub(p.pos);
322                        dist = distvec.length;
323                        if (dist < ExpParams.zone1_range)
324                        {
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                        {
333                                mindist = dist;
334                                mindistvec = distvec.clone();
335                        }
336                }
337
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
346                return 1;
347        }
348       
349        else
350                return 0;
351}
352
353function moveEnergyDec(cr)
354{
355        if (cr.user2["hibernated"] == 0)
356        {
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)];
358        }
359}
360
361function foramMove(cr)
362{
363        //TODO moving inside sediment?
364
365        //adjustment in z axis
366        cr.moveAbs(cr.pos_x, cr.pos_y, 0);
367
368        //are there any nutrients in zone 1 or 2?
369        {
370                var moved = stepToNearest(ExpParams.zone2_range); //TODO weighted sum of distance and energy
371                if (moved==1)
372                {
373                        return;
374                }
375        }
376
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)
383        {
384                reverseHib(cr);
385                cr.localDrive = XYZ.new(0,0,0);
386        }
387        //random move
388        else if (cr.lifespan%dir_change == 0)
389        {
390                var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0); 
391                dir.normalize();
392                dir.scale(-0.08);
393                cr.localDrive = dir;
394                moveEnergyDec(cr);
395        }
396}
397
398function energyTransfer(cr1, cr2)
399{
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)
407        {
408                reverseHib(cr1);
409        }
410}
411
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
425function onForamsStep(cr)
426{
427        cr.getMechPart(0).orient.set(o);
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"));
430
431        if (deathConditions(cr) == 1)
432        {
433                Populations[0].kill(cr);
434                return;
435        }
436
437        foramMove(cr);
438
439        var repro = foramReproduce(cr);
440        if (repro == 1)
441        {
442                return;
443        }
444
445        cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
446        if  (lastChamberNum(cr) <= chambers[0].size-1)
447        {
448                if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
449                {
450                        foramGrow(cr, lastChamberNum(cr));
451                }       
452        }       
453}
454
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
463function onForamsDied(cr)
464{
465        if (ExpParams.showRet == 1)
466        {
467                Populations[2].delete(cr.user3);
468        }
469        //fossilization
470        var geno = GenePools[0].add(cr.genotype);
471        geno.user1 = cr.user1;
472        geno.user2 = cr.user2;
473        if (ExpParams.logging == 1) Simulator.print("\"" + cr.name + "\" died...");
474        ExpState.totaltestedcr++;
475}
476
477// --------------------------------foram end -------------------------------------
478
479// -------------------------------- nutrient begin --------------------------------
480
481function createNutrientGenotype(nutrientsize, zone1_range)
482{
483        return "//0\np:sh=3,sx="+(nutrientsize+25)+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
484}
485
486function onNutrientsStep(cr)
487{
488        cr.moveAbs(cr.pos_x % World.wrldsiz, cr.pos_y % World.wrldsiz, -ExpParams.zone1_range+0.5);
489}
490
491function addNutrient()
492{
493        var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientsize, ExpParams.zone1_range));
494
495        cr.name = "Nutrients";
496        cr.idleen = 0;
497        cr.energy0 = ExpParams.energy_nut;
498        cr.energy = cr.energy0;
499        cr.signals.add("nutrient");
500
501        cr.signals[0].value = cr;
502
503        placeCreatureRandomly(cr, 0, 0);
504}
505
506function nutrientGrowth()
507{
508        nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate;
509        if (nutrientenergywaiting > ExpParams.energy_nut)
510        {
511                for (var i = 0; i < ExpParams.nutrientPop; i++)
512                {   
513                        addNutrient();
514                }
515
516                nutrientenergywaiting = 0.0;
517                Simulator.checkpoint();
518        }
519}
520
521// -------------------------------- nutrient end --------------------------------
522
523// -------------------------------- step begin --------------------------------
524
525function onStep()
526{
527
528        nutrientGrowth();
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        }
557        if (ExpParams.stopping == 1)
558        {
559                if (Simulator.stepNumber == 150000)
560                        Simulator.stop();
561        }
562}
563
564function createStatistics()
565{       
566        var number = [[0, 0],[0,0]]; // [species][gen]
567        var e_inc = [[0, 0],[0,0]];
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"];
575
576                number[species][gen] = number[species][gen] + 1;
577                e_inc[species][gen] = e_inc[species][gen] + cr.energy;
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
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];
588
589        log(log_numbers, "forams_log.txt");
590        log(log_energies,  "energies_log.txt");
591}
592
593function log(tolog, fname)
594{
595        var f = File.appendDirect(fname, "forams data");
596        f.writeString("" + Simulator.stepNumber);
597        for (var  i = 0; i < tolog.size; i++)
598        {
599                f.writeString(";" + tolog[i]);
600        }
601        f.writeString("\n");
602        f.close();
603}
604
605// -------------------------------- step end --------------------------------
606
607@include "standard_events.inc"
608
609~
610
611prop:
612id:showRet
613name:Show reticulopodia
614type:d 0 1 0
615group:Foraminifera
616
617prop:
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:
628id:e_repro_cost_haplo
629name:Cost of reproduction
630type:f 0.1 0.9 0.5
631group:Foraminifera
632
633prop:
634id:e_repro_cost_diplo
635name:Cost of reproduction
636type:f 0.1 0.9 0.3
637group:Foraminifera
638
639prop:
640id:chamber_proculus_haplo
641name:Size of proculus
642type:f
643group:Foraminifera
644
645prop:
646id:chamber_proculus_diplo
647name:Size of proculus
648type:f
649group:Foraminifera
650
651prop:
652id:chamber_difference_haplo
653name:Difference in size between subsequent chambers
654type:f
655group:Foraminifera
656
657prop:
658id:chamber_difference_diplo
659name:Difference in size between subsequent chambers
660type:f
661group:Foraminifera
662
663prop:
664id:hunted_prob
665name:Probability of being hunted
666type:f 0 1 0
667group:Forminifera
668
669prop:
670id:zone1_range
671name:Zone 1 range
672type:f 0 200
673group:Foraminifera
674
675prop:
676id:zone2_range
677name:Zone 2 range
678type:f 0 3000
679group:Foraminifera
680
681prop:
682id:colors
683name:Haploid and diploid colors
684type:x
685group:Foraminifera
686
687prop:
688id:min_repro_energ_haplo
689name:Min reproduction energy of forams
690type:f
691group:Foraminifera
692
693prop:
694id:min_repro_energ_diplo
695name:Min reproduction energy of forams
696type:f
697group:Foraminifera
698
699prop:
700id:repro_prob
701name:Probability of reproduction
702type:f 0 1 0.8
703group:Foraminifera
704
705prop:
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:
748id:crossprob
749name:Crossover probability
750type:f 0 1 0
751group:Foraminifera
752
753prop:
754id:mutationprob
755name:Mutation probability
756type:f 0 1 0
757group:Foraminifera
758
759prop:
760id:e_death_level
761name:Minimal level of energy to sustain life
762type:f 0 20 0
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:
780id:energy_nut
781name:Nutrient energy
782type:f 0 1000
783group:Energy
784
785prop:
786id:feedtrans
787name:Ingestion multiplier
788type:f 0 100
789group:Energy
790
791prop:
792id:nutrientsize
793name:Nutrient size
794type:f 0.1 0.9 0.1
795group:Energy
796
797prop:
798id:nutrientPop
799name:Nutrient population size
800group:Energy
801type:d 1 1000 10
802
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
831state:
832id:nutrient
833name:Nutrient locations
834help:vector of vectors [x,y,energy]
835type:x
836flags:32
837
838prop:
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
854name:Evaluated Forams
855help:Total number of the Forams evaluated in the experiment
856type:d
857flags:16
858
859prop:
860id:logging
861name:Log statistics to file
862type:d 0 1 0
Note: See TracBrowser for help on using the repository browser.