Changeset 476


Ignore:
Timestamp:
03/13/16 02:45:09 (6 years ago)
Author:
sz
Message:
  • use arrow syntax (dict->key instead of dictkey?)
  • use creature/genotype.data instead of user1/2/3 (user1=>genes, user2->lifeparams, user3=reticulopodiacreature)
Location:
experiments/frams/foraminifera/data/scripts
Files:
2 edited

Legend:

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

    r475 r476  
    66
    77Technical information:
    8 Genes and parameter values which control reproduction are stored in user1 and user2 fields.
    9 
    10 user1:
     8Genes and parameter values which control reproduction are stored in data->genes and data->lifeparams fields.
     9
     10genes:
    1111genes which are not encoded in Ff genotype:
    1212min_repro_energy - Minimum energy necessary for reproduction
    1313hibernation - Defines foram behavior in the case of no nutrients
    1414
    15 user2:
     15lifeparams:
    1616Physiological parameters of foraminifera:
    1717max_energy_level - maximum energy level reached so far
     
    220220                {
    221221                        //cr.rotate(0,0,Math.rnd01*Math.twopi);
    222                         if ((typeof(g.user1) == "Vector") && (g.user1.size >= 3))
     222                        if ((typeof(g.data->genes) == "Vector") && (g.data->genes.size >= 3))
    223223                        {
    224224                                // [x,y,energy]
    225                                 cr.move(g.user1[0] - cr.center_x, g.user1[1] - cr.center_y, 0);
    226                                 cr.energy = g.user1[2];
     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];
    227227                        }
    228228                        else
     
    278278        {
    279279                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.user3 = ret;
     280                cr.data->reticulopodiacreature = ret;
    281281        }
    282282}
     
    299299        var has_ret = 0;
    300300
    301         if (cr.user3 != null)
    302         {
    303                 if (Populations[2].findUID(cr.user3.uid) != null)
     301        if (cr.data->reticulopodiacreature != null)
     302        {
     303                if (Populations[2].findUID(cr.data->reticulopodiacreature.uid) != null)
    304304                {
    305305                        has_ret = 1;
     
    312312function foramGrow(cr, chamber_num)
    313313{
    314         if ((chamber_num+1) < chambers[cr.user2["species"]].size)
    315         {
    316                 var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
     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);
    317317                var cr2 = Populations[0].add(geno);
    318318
     
    320320                cr2.energy = cr2.energy0;
    321321
    322                 setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2});
     322                setGenotype({"cr" : cr2, "parent_genes" : cr.data->genes, "parent_lifeparams" : cr.data->lifeparams, "opt" : 2});
    323323                cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
    324                 setForamMeta(cr2, cr2.user2["gen"]);
     324                setForamMeta(cr2, cr2.data->lifeparams->gen);
    325325
    326326                if (visualization(cr))
    327327                {
    328                         Populations[2].delete(cr.user3);
     328                        Populations[2].delete(cr.data->reticulopodiacreature);
    329329                }
    330330                Populations[0].delete(cr);
     
    362362                                }
    363363                        }
    364                         else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist)
     364                        else if (eating == 0 && cr.data->lifeparams->hibernated == 0 && dist < mindist)
    365365                        {
    366366                                mindist = dist;
     
    369369                }
    370370
    371                 if (!eating && cr.user2["hibernated"] == 0)
     371                if (!eating && cr.data->lifeparams->hibernated == 0)
    372372                {
    373373                        mindistvec.normalize();
     
    388388function moveEnergyDec(cr)
    389389{
    390         if (cr.user2["hibernated"] == 0)
    391         {
    392                 //cr.energy_m += (ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)])*ExpParams.secPerStep;
     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;
    393393                cr.energy_m += (ExpParams.energy_move * cr.energy)*ExpParams.secPerStep;
    394394        }
     
    413413        //no nutrients in zone 2
    414414        var hibernation = 0;
    415         if (cr.user2["gen"] == 0) hibernation =  cr.user1["hibernation"];
    416         else hibernation =  cr.user1[0]["hibernation"];
     415        if (cr.data->lifeparams->gen == 0) hibernation =  cr.data->genes->hibernation;
     416        else hibernation =  cr.data->genes[0]->hibernation;
    417417        //hibernation
    418418        if (hibernation == 1)
     
    424424        else if (cr.lifespan%(dir_change/ExpParams.secPerStep) == 0)
    425425        {
    426                 cr.user2["dir"] = randomDir();
    427                 cr.localDrive = cr.user2["dir"];
     426                cr.data->lifeparams->dir = randomDir();
     427                cr.localDrive = cr.data->lifeparams->dir;
    428428                moveEnergyDec(cr);
    429429        }
    430430        else
    431431        {
    432                 cr.localDrive = cr.user2["dir"];
     432                cr.localDrive = cr.data->lifeparams->dir;
    433433        }
    434434}
     
    450450        cr2.energy_m = cr2.energy_m + e;
    451451        cr1.energy_p = cr1.energy_p + e;
    452         if (cr1.user2["hibernated"] == 1)
     452        if (cr1.data->lifeparams->hibernated == 1)
    453453        {
    454454                reverseHib(cr1);
     
    458458function reverseHib(cr)
    459459{
    460         if (cr.user2["hibernated"] == 1)
    461         {
    462                 setForamMeta(cr, cr.user2["gen"]); //unhibernate
     460        if (cr.data->lifeparams->hibernated == 1)
     461        {
     462                setForamMeta(cr, cr.data->lifeparams->gen); //unhibernate
    463463        }
    464464        else
    465465        {
    466                 //cr.idleen = (ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)])*ExpParams.secPerStep; //hibernate
     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
    467467                cr.idleen = (ExpParams.energy_hib * cr.energy)*ExpParams.secPerStep; //hibernate
    468468        }
    469         cr.user2["hibernated"] = 1 - cr.user2["hibernated"];
     469        cr.data->lifeparams->hibernated = 1 - cr.data->lifeparams->hibernated;
    470470}
    471471
     
    475475        if (visualization(cr))
    476476        {
    477                 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"));
     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"));
    478478        }
    479479
     
    492492        }
    493493
    494         cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
     494        cr.data->lifeparams->max_energy_level = Math.max(cr.energy, cr.data->lifeparams->max_energy_level);
    495495        if  (lastChamberNum(cr) <= chambers[0].size-1)
    496496        {
    497                 if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
     497                if ((cr.data->lifeparams->max_energy_level >= max_chamber_energ[cr.data->lifeparams->gen][lastChamberNum(cr)]))         
    498498                {
    499499                        foramGrow(cr, lastChamberNum(cr));
     
    504504function deathConditions(cr)
    505505{
    506         if ((cr.energy <= getProperty(cr.user2["species"],"e_death_level")) || (Math.rnd01 < ExpParams.hunted_prob))
     506        if ((cr.energy <= getProperty(cr.data->lifeparams->species,"e_death_level")) || (Math.rnd01 < ExpParams.hunted_prob))
    507507                return 1;
    508508        else
     
    514514        if (visualization(cr))
    515515        {
    516                 Populations[2].delete(cr.user3);
     516                Populations[2].delete(cr.data->reticulopodiacreature);
    517517        }
    518518        //fossilization
    519519        var geno = GenePools[0].add(cr.genotype);
    520         geno.user1 = cr.user1;
    521         geno.user2 = cr.user2;
     520        geno.data->genes = cr.data->genes;
     521        geno.data->lifeparams = cr.data->lifeparams;
    522522        if (ExpParams.logging == 1) Simulator.print("\"" + cr.name + "\" died...");
    523523        ExpState.totaltestedcr++;
     
    555555                var nutsize = ExpParams.nutrientsize*10;
    556556                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.user3 = nut;
     557                cr.data->reticulopodiacreature = nut;
    558558                nut.moveAbs(cr.pos_x-1.5*nutsize, cr.pos_y-1.5*nutsize, 0.5);
    559559        }
     
    564564        if (visualization(cr))
    565565        {
    566                 Populations[2].delete(cr.user3);
     566                Populations[2].delete(cr.data->reticulopodiacreature);
    567567        }
    568568}
     
    635635        {
    636636                var cr = Populations[0].get(i);
    637                 var gen = cr.user2["gen"];
    638                 var species = cr.user2["species"];
     637                var gen = cr.data->lifeparams->gen;
     638                var species = cr.data->lifeparams->species;
    639639
    640640                number[species][gen] = number[species][gen] + 1;
  • experiments/frams/foraminifera/data/scripts/foraminifera.inc

    r474 r476  
    5353function setGenotype(mode)
    5454{
    55         if (mode["opt"] == 0) //initial
    56         {
    57                 mode["cr"].user1 = {"min_repro_energies" : [max_chamber_energ[0][getProperty(0, "min_repro_energ")], max_chamber_energ[1][getProperty(1, "min_repro_energ")]], "hibernation" : mode["species"]};
    58                 mode["cr"].user2 = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0,  "hibernated" : 0, "species" : mode["species"], "reproduce" : 0, "dir" : randomDir()};
    59         }
    60         else if (mode["opt"]  == 1) //child
    61         {
    62                 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, "dir" : randomDir()};
    63                 mode["cr"].user1 = mode["parent_user1"];
     55        if (mode->opt == 0) //initial
     56        {
     57                mode->cr.data->genes = {"min_repro_energies" : [max_chamber_energ[0][getProperty(0, "min_repro_energ")], max_chamber_energ[1][getProperty(1, "min_repro_energ")]], "hibernation" : mode->species};
     58                mode->cr.data->lifeparams = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0,  "hibernated" : 0, "species" : mode->species, "reproduce" : 0, "dir" : randomDir()};
     59        }
     60        else if (mode->opt  == 1) //child
     61        {
     62                mode->cr.data->lifeparams = {"max_energy_level" : getProperty(1 - mode->parent_lifeparams->gen,"energies0"), "gen" : 1 - mode->parent_lifeparams->gen,  "hibernated" : 0, "species" : mode->parent_lifeparams->species, "reproduce" : 0, "dir" : randomDir()};
     63                mode->cr.data->genes = mode->parent_genes;
    6464        }
    6565        else //grow
    6666        {
    67                 mode["cr"].user1 = mode["parent_user1"];
    68                 mode["cr"].user2 = mode["parent_user2"];
     67                mode->cr.data->genes = mode->parent_genes;
     68                mode->cr.data->lifeparams = mode->parent_lifeparams;
    6969        }
    7070}
     
    7272function reproduce_haploid(parent, parent2, clone)
    7373{       
    74         var number, energy0, new_user1, gen;
     74        var number, energy0, new_genes, gen;
    7575        if (clone == 1)
    7676        {
    7777                energy0 = getProperty(0,"energies0");
    7878                number = (( 1 - getProperty(1, "e_repro_cost")) * parent.energy) / energy0;
    79                 new_user1 = parent.user1;
    80                 parent.user2["gen"] = 1 - parent.user2["gen"]; //because of reversal of "gen" in createOffspring function
    81                 gen = parent.user2["gen"];
     79                new_genes = parent.data->genes;
     80                parent.data->lifeparams->gen = 1 - parent.data->lifeparams->gen; //because of reversal of "gen" in createOffspring function
     81                gen = parent.data->lifeparams->gen;
    8282        }
    8383        else
    8484        {
    8585                energy0 = getProperty(1,"energies0");
    86                 number = (((1 - getProperty(parent.user2["gen"], "e_repro_cost")) * parent.energy) + ((1 -(getProperty(parent.user2["gen"], "e_repro_cost"))) * parent2.energy)) / energy0;
    87                 new_user1 = [parent.user1, parent2.user1];
    88                 gen = 1 - parent.user2["gen"];
     86                number = (((1 - getProperty(parent.data->lifeparams->gen, "e_repro_cost")) * parent.energy) + ((1 -(getProperty(parent.data->lifeparams->gen, "e_repro_cost"))) * parent2.energy)) / energy0;
     87                new_genes = [parent.data->genes, parent2.data->genes];
     88                gen = 1 - parent.data->lifeparams->gen;
    8989        }
    9090
     
    9393        for (var j = 0; j < number; j++)
    9494        {
    95                 createOffspring(createForamGenotype(gen, parent.user2["species"], 0), energy0, new_user1, parent.user2);
     95                createOffspring(createForamGenotype(gen, parent.data->lifeparams->species, 0), energy0, new_genes, parent.data->lifeparams);
    9696        }
    9797}
     
    100100{
    101101        var energy0 = getProperty(0,"energies0");
    102         var number = ((1 - (getProperty(parent.user2["gen"], "e_repro_cost"))) * parent.energy) / energy0;
     102        var number = ((1 - (getProperty(parent.data->lifeparams->gen, "e_repro_cost"))) * parent.energy) / energy0;
    103103
    104104        Simulator.print("diploid number of offspring: " + number+ " energ0: " + energy0);
     
    116116                for (var k = 0; k < 2; k++)
    117117                {
    118                         createOffspring(createForamGenotype(1 - parent.user2["gen"], parent.user2["species"], 0), energy0, parent.user1[0], parent.user2);
     118                        createOffspring(createForamGenotype(1 - parent.data->lifeparams->gen, parent.data->lifeparams->species, 0), energy0, parent.data->genes[0], parent.data->lifeparams);
    119119                }
    120120
     
    136136                for (var i = pop.size-1; i >= 0; i--)
    137137                {
    138                         if (pop[i].user2["reproduce"] == 1 && pop[i].user2["species"] == species)
     138                        if (pop[i].data->lifeparams->reproduce == 1 && pop[i].data->lifeparams->species == species)
    139139                        {
    140                                 if ((pop[i].user2["gen"]==1) || ((pop[i].user2["gen"]==0) && ExpParams.stress == 0))
     140                                if ((pop[i].data->lifeparams->gen==1) || ((pop[i].data->lifeparams->gen==0) && ExpParams.stress == 0))
    141141                                {
    142142                                        continue;
     
    169169       
    170170       
    171         if (cr.user2["gen"] == 1)
     171        if (cr.data->lifeparams->gen == 1)
    172172        {
    173173                reproduce_diploid(cr);
     
    183183                if (cr.signals.size == 0)
    184184                {
    185                         cr.signals.add("repro"+cr.user2["species"]);
     185                        cr.signals.add("repro"+cr.data->lifeparams->species);
    186186                        cr.signals[0].power = 1;
    187187                }
    188188                reproduced = 0;
    189                 cr.user2["reproduce"] = 1;
     189                cr.data->lifeparams->reproduce = 1;
    190190        }
    191191
     
    201201function print_repro_info(cr)
    202202{
    203         Simulator.print("Reproduced " + cr.user2["gen"] + " of species " + cr.user2["species"] + " energy: " + cr.energy);
     203        Simulator.print("Reproduced " + cr.data->lifeparams->gen + " of species " + cr.data->lifeparams->species + " energy: " + cr.energy);
    204204}
    205205
     
    211211        var reproduced = 0;
    212212
    213         if (cr.user2["gen"] == 0)
    214         {
    215                 properEnergy = ( cr.energy >= cr.user1["min_repro_energies"][cr.user2["gen"]] );
     213        if (cr.data->lifeparams->gen == 0)
     214        {
     215                properEnergy = ( cr.energy >= cr.data->genes->min_repro_energies[cr.data->lifeparams->gen] );
    216216        }
    217217        else
    218218        {
    219                 properEnergy = ( cr.energy >= cr.user1[0]["min_repro_energies"][cr.user2["gen"]] ); //TODO gene selection
     219                properEnergy = ( cr.energy >= cr.data->genes[0]->min_repro_energies[cr.data->lifeparams->gen] ); //TODO gene selection
    220220        }
    221221
     
    228228                        reproduced = readyToRepro(cr);
    229229                }
    230                 else if (cr.signals.receive("repro"+cr.user2["species"]) > 0)
     230                else if (cr.signals.receive("repro"+cr.data->lifeparams->species) > 0)
    231231                {
    232232                        reproduced = readyToRepro(cr);
     
    239239        {
    240240                cr.signals.clear();
    241                 cr.user2["reproduce"] = 0;
     241                cr.data->lifeparams->reproduce = 0;
    242242        }
    243243
     
    247247function crossover(parent, gene)
    248248{
    249         var tmp = parent.user1[0][gene];
    250         parent.user1[0][gene] = parent.user1[1][gene];
    251         parent.user1[1][gene] = tmp;
    252 }
    253 
    254 function createOffspring(geno, energy, parent_user1, parent_user2)
     249        var tmp = parent.data->genes[0][gene];
     250        parent.data->genes[0][gene] = parent.data->genes[1][gene];
     251        parent.data->genes[1][gene] = tmp;
     252}
     253
     254function createOffspring(geno, energy, parent_genes, parent_lifeparams)
    255255{
    256256        var cr = Populations[0].add(geno);
    257257        cr.energy0 = energy;
    258258        cr.energy = cr.energy0;
    259         setGenotype({"cr" : cr, "parent_user1" : parent_user1, "parent_user2" : parent_user2, "opt" : 1});
     259        setGenotype({"cr" : cr, "parent_genes" : parent_genes, "parent_lifeparams" : parent_lifeparams, "opt" : 1});
    260260        placeRandomlyNotColliding(cr);
    261261}
Note: See TracChangeset for help on using the changeset viewer.