Ignore:
Timestamp:
08/24/15 19:57:12 (9 years ago)
Author:
oriona
Message:

new species added, hibernation added, morphology changed to more realistic, parameters in .show changed, refactoring

File:
1 edited

Legend:

Unmodified
Added
Removed
  • experiments/frams/foraminifera/data/scripts/foraminifera.inc

    r421 r422  
    22//real proportions
    33
    4 // -------------------------------- step begin --------------------------------
    5 
    6 function reproduce_haploid(parent, parent2)
    7 {
    8         var number = parent.user2["Va"] / ExpParams.energy0d + parent2.user2["Va"] / ExpParams.energy0d;
     4function init_chambers()
     5{
     6        colors = ["1.0,1.0,0.0","1.0,0.5,0.0"];
     7        chambers = [ ["//0\np:sh=1,",
     8        "p:0.98089325428009, 0.00591040402650833, 0.00389722990803421,",
     9        "p:1.90962779521942, -0.256769120693207, -0.16194811463356,",
     10        "p:2.63965249061584, -0.727959632873535, -0.609036147594452,",
     11        "p:3.17575979232788, -1.34843015670776, -1.14828503131866,",
     12        "p:3.55273032188416, -2.22369408607483, -1.3917418718338,",
     13        "p:3.64916682243347, -3.11888360977173, -1.01666414737701,",
     14        "p:3.50461649894714, -3.84039807319641, -0.377427101135254,",
     15        "p:3.15921688079834, -4.50001525878906, 0.261153399944305,",
     16        "p:2.51528453826904, -5.16421365737915, 0.59241509437561,"],
     17        ["//0\np:sh=1,",
     18        "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
     19        "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
     20        "p:0.615013539791107, 0.778662621974945, 0.535521030426025,",
     21        "p:0.488581955432892, 0.826426684856415, -0.381044268608093,",
     22        "p:0.732419908046722, -0.0084995785728097, -1.02214300632477,",
     23        "p:1.35288727283478, 0.875738024711609, -1.03719782829285,",
     24        "p:0.342692613601685, 0.938660383224487, -1.45657968521118,",
     25        "p:1.0958571434021, 0.316927701234818, -1.813929438591,",
     26        "p:0.903768002986908, 1.11856341362, -2.53161096572876,",
     27        "p:0.21014116704464, 0.295340299606323, -2.45328187942505,"] ];
     28}
     29
     30function createForamGenotype(gen, species, chamber_num)
     31{
     32        var rad = getProperty(gen, "chamber_proculus");
     33        var geno = chambers[species][0] + "sx=" + rad + ",sy=" + rad + ",sz=" + rad + ", rz=3.14159265358979,vr=" + colors[gen];
     34
     35        chamber_num = Math.min(chamber_num, chambers[species].size - 1);
     36
     37        for (var i = 0; i < chamber_num; i++)
     38        {
     39                rad = getProperty(gen, "chamber_proculus") + getProperty(gen, "chamber_difference") * (i + 1);
     40                geno += "\n" +  chambers[species][i+1] + "sh=1,sx=" + rad + ",sy=" + rad + ",sz=" + rad + ",vr=" + colors[gen];
     41        }
     42
     43        for (var i = 0; i < chamber_num; i++)
     44        {
     45                geno += "\n" +  "j:"+ i +", "+ (i+1) +", sh=1";
     46        }
     47        if (species == 1) geno += "\nn:p=0,d=\"S\"";
     48
     49        return geno;
     50}
     51
     52function setGenotype(mode)
     53{
     54        if (mode["opt"] == 0) //initial
     55        {
     56                mode["cr"].user1 = {"min_repro_energies" : [getProperty(0, "min_repro_energ"), getProperty(1, "min_repro_energ")], "hibernation" : 1 - mode["species"]};
     57                mode["cr"].user2 = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0,  "hibernated" : 0, "species" : mode["species"], "reproduce" : 0};
     58        }
     59        else if (mode["opt"]  == 1) //child
     60        {
     61                mode["cr"].user2 = {"max_energy_level" : getProperty(1 - mode["parent_user2"]["gen"],"energies0"), "gen" : 1 - mode["parent_user2"]["gen"],  "hibernated" : 0, "species" : mode["parent_user2"]["species"], "reproduce" : 0};
     62                mode["cr"].user1 = mode["parent_user1"];
     63        }
     64        else //grow
     65        {
     66                mode["cr"].user1 = mode["parent_user1"];
     67                mode["cr"].user2 = mode["parent_user2"];
     68        }
     69}
     70
     71function reproduce_haploid(parent, parent2, clone)
     72{       
     73        var number, energy0, new_user1, gen;
     74        if (clone == 1)
     75        {
     76                energy0 = getProperty(0,"energies0");
     77                number = getProperty(1, "e_repro_cost") * parent.energy / energy0;
     78                new_user1 = parent.user1;
     79                parent.user2["gen"] = 1 - parent.user2["gen"]; //because of reversal of "gen" in createOffspring function
     80                gen = parent.user2["gen"];
     81        }
     82        else
     83        {
     84                energy0 = getProperty(1,"energies0");
     85                number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0 + getProperty(parent.user2["gen"], "e_repro_cost") * parent2.energy / energy0;
     86                new_user1 = [parent.user1, parent2.user1];
     87                gen = 1 - parent.user2["gen"];
     88        }
     89
     90        Simulator.print("number of offspring: " + number);
    991
    1092        for (var j = 0; j < number; j++)
    1193        {
    12                 createOffspring(ExpParams.gend, ExpParams.energy0d, [parent.user1, parent2.user1], {"Va" : ExpParams.energy0d, "gen" : 1 , "growth_step" : ExpParams.growth_step, "rsize": ExpParams.rads[1], "vinit": ExpParams.energy0d}); //TODO genes from both generations in user1
     94                createOffspring(createForamGenotype(gen, parent.user2["species"], 0), energy0, new_user1, parent.user2);
    1395        }
    1496}
     
    1698function reproduce_diploid(parent)
    1799{
    18         var number = parent.user2["Va"] / ExpParams.energy0h;
     100        var energy0 = getProperty(0,"energies0");
     101        var number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0;
     102
     103        Simulator.print("number of offspring: " + number);
     104
    19105        for (var j = 0; j < number / 2; j++)
    20106        {
     
    23109                if (Math.rnd01 < ExpParams.crossprob)
    24110                {
    25                         crossover(parent, "minenergy");
     111                        crossover(parent, "min_repro_energies");
    26112                        crossed = 1;
    27113                }
     
    29115                for (var k = 0; k < 2; k++)
    30116                {
    31                         createOffspring(ExpParams.genh, ExpParams.energy0h, {"minenergy" : ExpParams.minenerg[0], "minage": ExpParams.minage[0]}, {"Va" : ExpParams.energy0h, "gen" : 0 , "growth_step" : ExpParams.growth_step, "rsize" : ExpParams.rads[0], "vinit": ExpParams.energy0h}); //TODO different vamin and amin for haploids and diploids?
     117                        createOffspring(createForamGenotype(1 - parent.user2["gen"], parent.user2["species"], 0), energy0, parent.user1[0], parent.user2);
    32118                }
    33119
     
    35121                if (crossed == 1)
    36122                {
    37                         crossover(parent, "minenergy");
     123                        crossover(parent, "min_repro_energies");
    38124                        crossed = 0;
    39125                }
     
    42128}
    43129
    44 function crossover(parent, gene)
    45 {
    46         var tmp = parent.user1[0][gene];
    47         parent.user1[0][gene] = parent.user1[1][gene];
    48         parent.user1[1][gene] = tmp;
    49 }
    50 
    51 
    52 function createOffspring(geno, energy, new_user1, new_user2)
    53 {
    54         var cr = Populations[0].add(geno);
    55         cr.energy0 = energy;
    56         cr.energy = cr.energy0;
    57         setGenotype(cr, new_user1, new_user2);
    58         placeRandomlyNotColliding(cr);
    59 }
    60 
    61 function onStep()
    62 {
    63 
    64         if (ExpParams.logging == 1)
    65         {
    66                 createStatistics();
    67         }
    68 
    69         //nutrient growth ---------------------------------------------
    70         nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate;
    71         if (nutrientenergywaiting > ExpParams.feede0)
    72         {
    73                 for (var i = 0; i < ExpParams.nutrientPop; i++)
    74                 {
    75                         addNutrient();
    76                 }
    77 
    78                 nutrientenergywaiting = 0.0;
    79                 Simulator.checkpoint();
    80         }
    81 
    82         //reproduction --------------------------------------------
    83         reprocounter += 1;
    84         if (reprocounter > ExpParams.repro_time)
    85         {
    86                 reprocounter = 0;
     130function reproduce_parents(species)
     131{
    87132                var parent1 = null;
    88133                var parent2 = null;
     
    90135                for (var i = pop.size-1; i >= 0; i--)
    91136                {
    92                         if (pop[i].signals.size > 0)
     137                        if (pop[i].user2["reproduce"] == 1 && pop[i].user2["species"] == species)
    93138                        {
    94                                 if (pop[i].user2["gen"]==1)
    95                                 {
    96                                         reproduce_diploid(pop[i]);
    97                                         pop.kill(i);
     139                                if ((pop[i].user2["gen"]==1) || ((pop[i].user2["gen"]==0) && ExpParams.stress == 0))
     140                                {
     141                                        continue;
    98142                                }
    99143                                else if (parent1 == null)
     
    107151                                else
    108152                                {
    109                                         reproduce_haploid(parent1, parent2);
     153                                        reproduce_haploid(parent1, parent2, 0);
     154                                        print_repro_info(parent1);
     155                                        print_repro_info(parent2);
    110156                                        pop.kill(parent1);
    111157                                        pop.kill(parent2);
     
    116162                        }
    117163                }
    118         }
    119 
    120         //check for death -----------------------------------------------
    121         if (Populations[0].size == 0)
    122         {
    123                 if (ExpParams.autorestart)
    124                 {
    125                         Simulator.print("no more creatures, restarting...");
    126                         onExpInit();
    127                 }
    128                 else
    129                 {
    130                         Simulator.print("no more creatures, stopped.");
    131                         Simulator.stop();
    132                 }
    133         }
    134 }
    135 
    136 function createStatistics()
    137 {
    138         var haploids = 0;
    139         var diploids = 0;
    140         var e_inc_h = 0.0;
    141         var e_inc_d = 0.0;
    142         var e_nut = 0.0;
    143         var size_h = 0.0;
    144         var size_d = 0.0;
    145         var vmin_h = 0.0;
    146         var vmin_d = 0.0;
    147 
    148         for (var i = 0; i < Populations[0].size; i++)
    149         {
    150                 var cr = Populations[0].get(i);
    151                 if (cr.user2["gen"] == 0)
    152                 {
    153                         haploids += 1;
    154                         e_inc_h += cr.energy;
    155                         size_h += ExpParams.rads[0]; //TODO change of size dependent on gene
    156                         vmin_h += cr.user1["minenergy"];
    157                 }
    158                 else if (cr.user2["gen"] == 1)
    159                 {
    160                         diploids += 1;
    161                         e_inc_d += cr.energy;
    162                         size_d += ExpParams.rads[1]; //TODO change of size dependent on gene
    163                         vmin_d += cr.user1[0]["minenergy"];
    164                 }
    165         }
    166 
    167         for (var i = 0; i < Populations[1].size; i++)
    168         {
    169                 var cr = Populations[1].get(i);
    170                 e_nut += cr.energy;
    171         }
    172 
    173         var l1 = [haploids, diploids, Populations[1].size];
    174         var l2 = [e_inc_h, e_inc_d, e_nut];
    175         var dp = diploids;
    176         var hp = haploids;
    177         if (dp == 0) dp = 0.000001;
    178         if (hp == 0) hp = 0.000001;
    179         var l3 = [size_h / hp, vmin_h / hp, size_d / dp, vmin_d / dp];
    180 
    181         log(l1, "log_sizes.txt");
    182         log(l2, "log_energy.txt");
    183         log(l3, "log_sizes_v.txt");
    184 }
    185 // -------------------------------- step end --------------------------------
     164}
     165
     166function readyToRepro(cr)
     167{
     168        var reproduced = 1;
     169       
     170       
     171        if (cr.user2["gen"] == 1)
     172        {
     173                reproduce_diploid(cr);
     174        }
     175
     176        else if (ExpParams.stress == 0)
     177        {
     178                reproduce_haploid(cr, null, 1);
     179        }
     180
     181        else
     182        {
     183                if (cr.signals.size == 0)
     184                {
     185                        cr.signals.add("repro"+cr.user2["species"]);
     186                        cr.signals[0].power = 1;
     187                }
     188                reproduced = 0;
     189                cr.user2["reproduce"] = 1;
     190        }
     191
     192        if (reproduced == 1)
     193        {
     194                print_repro_info(cr);
     195                Populations[0].kill(cr);
     196        }
     197
     198        return reproduced;
     199}
     200
     201function print_repro_info(cr)
     202{
     203        Simulator.print("Reproduced " + cr.user2["gen"] + " of species " + cr.user2["species"] + " energy: " + cr.energy);
     204}
     205
     206function foramReproduce(cr)
     207{
     208        var properEnergy = 0;
     209        var reproduced = 0;
     210
     211        if (cr.user2["gen"] == 0)
     212        {
     213                properEnergy = ( cr.energy >= cr.user1["min_repro_energies"][cr.user2["gen"]] );
     214        }
     215        else
     216        {
     217                properEnergy = ( cr.energy >= cr.user1[0]["min_repro_energies"][cr.user2["gen"]] ); //TODO gene selection
     218        }
     219
     220        //if creature has proper energy
     221        if ( properEnergy && cr.signals.size == 0)
     222        {
     223                //reproduce with probability repro_prob
     224                if (Math.rnd01 <= ExpParams.repro_prob) //TODO env trigger
     225                {
     226                        reproduced = readyToRepro(cr);
     227                }
     228                else if (cr.signals.receive("repro"+cr.user2["species"]) > 0)
     229                {
     230                        reproduced = readyToRepro(cr);
     231                }
     232                if (reproduced == 1)
     233                                return;
     234        }
     235
     236        else if (!properEnergy)
     237        {
     238                cr.signals.clear();
     239                cr.user2["reproduce"] = 0;
     240        }
     241}
     242
     243function crossover(parent, gene)
     244{
     245        var tmp = parent.user1[0][gene];
     246        parent.user1[0][gene] = parent.user1[1][gene];
     247        parent.user1[1][gene] = tmp;
     248}
     249
     250function createOffspring(geno, energy, parent_user1, parent_user2)
     251{
     252        var cr = Populations[0].add(geno);
     253        cr.energy0 = energy;
     254        cr.energy = cr.energy0;
     255        setGenotype({"cr" : cr, "parent_user1" : parent_user1, "parent_user2" : parent_user2, "opt" : 1});
     256        placeRandomlyNotColliding(cr);
     257}
Note: See TracChangeset for help on using the changeset viewer.