source: experiments/frams/foraminifera/data/scripts/forams_repro.inc @ 401

Last change on this file since 401 was 401, checked in by Maciej Komosinski, 9 years ago

Extended Foraminifera simulation - physical collisions; visible haplo/diplo generations; growing; and much more

File size: 6.5 KB
Line 
1//size versus energy
2//real proportions
3
4// -------------------------------- step begin --------------------------------
5
6function reproduce_haploid(repro_list, number)
7{
8        var len = repro_list.size;
9        if (len % 2 != 0) len = repro_list.size - 1;
10
11        for (var i = 0; i < len - 2 ; i = i + 2)
12        {
13                var parent = Populations[0].get(repro_list[i]);
14                var parent2 = Populations[0].get(repro_list[i + 1]);
15
16                number = parent.user2["Va"] / ExpParams.ofnumd + parent2.user2["Va"] / ExpParams.ofnumd;
17                for (var j = 0; j < number; j++)
18                {
19                        //size
20                        var rsize = (parent.user1["delta_d"] + ExpParams.diplo_rad);
21                        if (Math.rnd01 < 0.5)
22                        {
23                                rsize = parent2.user1["delta_d"] + ExpParams.diplo_rad;
24                        }
25
26                        var deltas = parent.user1["delta_d"];
27                        //mutation
28                        if (Math.rnd01 < ExpParams.mutationprob)
29                        {
30                                var diff = delta_change * deltas;
31                                if (Math.rnd01 < 0.5)
32                                {
33                                        deltas -= diff;
34                                }
35                                else
36                                {
37                                        deltas += diff;
38                                }
39                                rsize = ExpParams.diplo_rad + deltas;
40                        }
41
42                        var cr = Populations[0].add("//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979");
43                        cr.energ0 = ExpParams.ofnumd;
44                        cr.energy = cr.energ0;
45                        var dsize =  ExpParams.diplo_rad * ExpParams.delta_rate + ExpParams.diplo_rad;
46                        cr.user1 = [ {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent.user1["amin"], "delta_h" : parent.user1["delta_h"], "delta_d" : deltas }, {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent2.user1["amin"], "delta_h" : parent2.user1["delta_h"], "delta_d" : deltas }];
47                        cr.user2 = { "Va" : cr.energ0, "gen" : 1 , "growth_step" : ExpParams.growth_step, "rsize": rsize, "vinit": cr.energ0};
48                        placeRandomlyNotColliding(cr);
49                }
50        }
51
52        for (var j = 0; j < repro_list.size; j++)
53        {
54                Populations[0].kill(repro_list[j]);
55        }
56}
57
58function reproduce_diploid(repro_list, number)
59{
60        for (var i = 0; i < repro_list.size; i++)
61        {
62                var parent = Populations[0].get(repro_list[i]);
63
64                if (parent.user2["gen"] == 1)
65                {
66
67                        var number = parent.user2["Va"] / ExpParams.ofnumh;
68
69
70                        for (var j = 0; j < number / 2; j++)
71                        {
72                                var crossed = 0;
73                                //crossover
74                                if (Math.rnd01 < ExpParams.crossprob)
75                                {
76                                        var tmp = parent.user1[0]["vamin"];
77                                        parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
78                                        parent.user1[1]["vamin"] = tmp;
79                                        crossed = 1;
80                                }
81
82                                for (var k = 0; k < 2; k++)
83                                {
84                                        var rsize = parent.user1[k]["delta_h"]  + ExpParams.haplo_rad;
85                                        var vamin = parent.user1[k]["vamin"];
86                                        var deltas =  parent.user1[k]["delta_h"];
87
88
89                                        if (Math.rnd01 < ExpParams.mutationprob)
90                                        {
91                                                var diff = delta_change * deltas;
92                                                if (Math.rnd01 < 0.5)
93                                                {
94                                                        deltas -= diff;
95                                                }
96                                                else
97                                                {
98                                                        deltas += diff;
99                                                }
100                                                rsize = ExpParams.diplo_rad + deltas;
101                                        }
102
103                                        var geno = "//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979";
104                                        geno += "\nn:p=0,d=\"S\""; //TODO is this the only difference with haploid code? TODO why initial genotypes are not used as defined in ExpParams?
105                                        var cr = Populations[0].add(geno);
106                                        cr.energ0 = ExpParams.ofnumh;
107                                        cr.energy = cr.energ0;
108                                        //vamin depends on rsize
109                                        var hsize = ExpParams.haplo_rad * ExpParams.delta_rate + ExpParams.haplo_rad;
110                                        cr.user1 = {"vamin" : (rsize / hsize) * ExpParams.v_min_h, "amin": ExpParams.age_min_d, "delta_h" : deltas, "delta_d" : parent.user1[0]["delta_d"]};
111                                        cr.user2 = { "Va" : cr.energ0, "gen" : 0 , "growth_step" : ExpParams.growth_step, "rsize" : rsize, "vinit": cr.energ0};
112                                        placeRandomlyNotColliding(cr);
113                                }
114
115                                //reverse of crossover for fossilization
116                                if (crossed == 1)
117                                {
118                                        var tmp = parent.user1[0]["vamin"];
119                                        parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
120                                        parent.user1[1]["vamin"] = tmp;
121                                        crossed = 0;
122                                }
123
124                        }
125                }
126        }
127        for (var j = 0; j < repro_list.size; j++)
128        {
129                Populations[0].kill(repro_list[j]);
130        }
131}
132
133
134function onStep()
135{
136        var haploids = 0;
137        var diploids = 0;
138        var e_inc_h = 0.0;
139        var e_inc_d = 0.0;
140        var e_nut = 0.0;
141        var size_h = 0.0;
142        var size_d = 0.0;
143        var vmin_h = 0.0;
144        var vmin_d = 0.0;
145
146        for (var i = 0; i < Populations[0].size; i++)
147        {
148                var cr = Populations[0].get(i);
149                if (cr.user2["gen"] == 0)
150                {
151                        haploids += 1;
152                        e_inc_h += cr.energy;
153                        size_h += cr.user1["delta_h"] + ExpParams.haplo_rad;
154                        vmin_h += cr.user1["vamin"];
155                }
156                else if (cr.user2["gen"] == 1)
157                {
158                        diploids += 1;
159                        e_inc_d += cr.energy;
160                        size_d += cr.user1[0]["delta_d"] + ExpParams.diplo_rad;
161                        vmin_d += cr.user1[0]["vamin"];
162                }
163        }
164
165        for (var i = 0; i < Populations[1].size; i++)
166        {
167                var cr = Populations[1].get(i);
168                e_nut += cr.energy;
169        }
170
171        if (haploids < 2 && diploids == 0)
172        {
173                Simulator.print("no more creatures, stopped.");
174                Simulator.stop();
175        }
176
177        var l1 = [haploids, diploids, Populations[1].size];
178        var l2 = [e_inc_h, e_inc_d, e_nut];
179        var dp = diploids;
180        var hp = haploids;
181        if (dp == 0) dp = 0.000001;
182        if (hp == 0) hp = 0.000001;
183        var l3 = [size_h / hp, vmin_h / hp, size_d / dp, vmin_d / dp];
184
185        if (ExpParams.logging == 1)
186        {
187                log(l1, "log.txt");
188                log(l2, "log2.txt");
189                log(l3, "log3.txt");
190        }
191        //food growth ---------------------------------------------
192        foodenergywaiting = foodenergywaiting + ExpParams.feedrate;
193        if (foodenergywaiting > ExpParams.feede0)
194        {
195                for (var i = 0; i < ExpParams.foodPop; i++)
196                {
197                        addfood();
198                }
199
200                foodenergywaiting = 0.0;
201                Simulator.checkpoint();
202        }
203
204        //reproduction --------------------------------------------
205        reprocounter += 1;
206        if (reprocounter > ExpParams.repro_time)
207        {
208                reprocounter = 0;
209                var to_repro_h = [];
210                var to_repro_d = [];
211                for (var i = 0; i < Populations[0].size; i++)
212                {
213                        var cr = Populations[0].get(i);
214                        if (cr.signals.size > 0)
215                        {
216                                if (cr.user2["gen"] == 0)
217                                {
218                                        to_repro_h.add(i);
219                                }
220                                else if (cr.user2["gen"] == 1)
221                                {
222                                        to_repro_d.add(i);
223                                }
224                        }
225                }
226                if (to_repro_h.size > 1)
227                {
228                        reproduce_haploid(to_repro_h, ExpParams.ofnumh);
229                }
230                if (to_repro_d.size > 0)
231                {
232                        reproduce_diploid(to_repro_d, ExpParams.ofnumd);
233                }
234        }
235
236        //check for death -----------------------------------------------
237        if (Populations[0].size == 0)
238        {
239                if (ExpParams.autorestart)
240                {
241                        Simulator.print("no more creatures, restarting...");
242                        onExpInit();
243                }
244                else
245                {
246                        Simulator.print("no more creatures, stopped.");
247                        Simulator.stop();
248                }
249        }
250}
251
252// -------------------------------- step end --------------------------------
Note: See TracBrowser for help on using the repository browser.