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

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

Removed unused param

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