Ignore:
Timestamp:
09/08/15 01:03:24 (9 years ago)
Author:
oriona
Message:

new reticulopodia range implemented, visualization of reticulopodia

File:
1 edited

Legend:

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

    r429 r430  
    1313max_energy_level - maximum energy level reached so far
    1414gen - generation: 0 haploid, 1 diploid
    15 species - species: 0 not hibernating 1 hibernating
     15species - species: 0 hibernating 1 not hibernating
    1616hibernated - 0/1 foram isn't/is hibernated
    1717reproduce - 0/1 foram isn't/is ready for reproduction
     
    3535global o;
    3636global max_chamber_energ;
    37 
     37global dir_change;
    3838
    3939@include "foraminifera.inc"
     
    6969        //pop.othermask = 0x10002;
    7070
     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       
    7181        //world
    7282        SignalView.mode = 1;
    73         ExpParams.world_size = 100;
    74         World.wrldwat = ExpParams.world_size;
     83        ExpParams.world_size = scale(40000);
     84        World.wrldwat = 200;
    7585        World.wrldsiz = ExpParams.world_size;
    7686        World.wrldbnd = 1;
     
    8292
    8393        //reproduction
    84         ExpParams.foramPop = 3;
     94        ExpParams.foramPop = 10;       
    8595        ExpParams.crossprob = 0.4;
    8696        ExpParams.mutationprob = 0.2;
     
    8999
    90100        //morphology
     101        dir_change = 500;
     102        ExpParams.zone1_range = scale(5000);
     103        ExpParams.zone2_range = scale(8000);
    91104        init_chambers();
    92         ExpParams.chamber_proculus_haplo = scale(60);
     105        ExpParams.chamber_proculus_haplo = scale(50);
    93106        ExpParams.chamber_difference_haplo = 0.0;
    94107        ExpParams.chamber_proculus_diplo = scale(20);
     
    100113                {
    101114                        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);
    102 
    103115                }                                 
    104116        }
    105         ExpParams.zone1_range = scale(250);
    106         ExpParams.zone2_range = scale(5000);
    107117
    108118        //energetics
    109         ExpParams.min_repro_energ_haplo = max_chamber_energ[0][2];
    110         ExpParams.min_repro_energ_diplo = max_chamber_energ[1][8];
    111         ExpParams.e_meta = 0.00003 * max_chamber_energ[0][0];
    112         ExpParams.energy_hib = 0.00003 * max_chamber_energ[0][0];
    113         ExpParams.energy_move = 0.0003 * max_chamber_energ[0][0];
    114         ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.1*max_chamber_energ[0][0];
    115         ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.1*max_chamber_energ[1][0];
    116         ExpParams.feedtrans = 0.05;
    117         ExpParams.e_repro_cost_haplo = 0.5;
     119        ExpParams.min_repro_energ_haplo = 4;
     120        ExpParams.min_repro_energ_diplo = 6;
     121
     122        ExpParams.e_meta = 0.0002;
     123        ExpParams.energy_hib = 0.0001;
     124        ExpParams.energy_move = 0.00025;
     125
     126        ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0];
     127        ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0];
     128        ExpParams.feedtrans = 0.5;
     129        ExpParams.e_repro_cost_haplo = 0.7;
    118130        ExpParams.e_repro_cost_diplo = 0.3;
    119131
     
    121133        ExpParams.nutrientsize = scale(10);
    122134        ExpParams.energy_nut = 100 * Math.pow(ExpParams.nutrientsize, 3);
    123         ExpParams.nutrientPop = 10;
    124         ExpParams.feedrate = 0.0025;
     135        ExpParams.nutrientPop = 1;
     136        ExpParams.feedrate = 0.1;
    125137        nutrientenergywaiting = ExpParams.energy_nut;
    126138        ExpState.totaltestedcr = 0;
     
    157169        Populations[0].clear();
    158170        Populations[1].clear();
     171        Populations[2].clear();
    159172
    160173        for (var i = 0; i < ExpParams.foramPop; i++)
     
    223236        ExpState.nutrient = tmpvec;
    224237        File.writeObject(sim_params.*);
    225         ExpState.nutrient = null; //vectors are only created for saving and then discarded
     238        ExpState.nutrient = null; //vectors are only created for saving and then discardedsetForam
    226239
    227240        for (var cr in Populations[0])
     
    233246// -------------------------------- foram begin -----------------------------------
    234247
     248function setForamMeta(cr, gen)
     249{
     250        cr.idleen = ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)];
     251}
     252
     253function lastChamberNum(cr)
     254{
     255        return cr.numparts-1;
     256}
     257
    235258function onForamsBorn(cr)
    236259{
    237         cr.idleen = ExpParams.e_meta;
     260        setForamMeta(cr, 1);
     261        if (ExpParams.showRet == 1)
     262        {
     263                var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57");
     264                cr.user3 = ret;
     265        }
    238266}
    239267
     
    253281function foramGrow(cr, chamber_num)
    254282{
    255         var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num);
     283        var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
    256284        var cr2 = Populations[0].add(geno);
    257285
     
    261289        setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2});
    262290        cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
    263 
     291        setForamMeta(cr2, cr2.user2["gen"]);
     292
     293        if (ExpParams.showRet == 1)
     294        {
     295                Populations[2].delete(cr.user3);
     296        }
    264297        Populations[0].delete(cr);
    265298}
     
    279312                var mindist = 100000000000;
    280313                var mindistvec = null;
     314                var eating = 0;
    281315
    282316                for (i = 0; i < n.size; i++)
    283317                {
    284                         mp = n[i].value;
     318                        mp = n[i].value.getMechPart(0);
    285319                        distvec.set(mp.pos);
    286320                        distvec.sub(p.pos);
    287321                        dist = distvec.length;
    288                         if (dist < mindist)
     322                        if (dist < ExpParams.zone1_range)
     323                        {
     324                                if (n[i].value != null)
     325                                {
     326                                        energyTransfer(cr, n[i].value);
     327                                        eating = 1;
     328                                }
     329                        }
     330                        else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist)
    289331                        {
    290332                                mindist = dist;
     
    293335                }
    294336
    295                 mindistvec.normalize();
    296                 mindistvec.scale(-0.08);
    297                 cr.localDrive = mindistvec;
     337                if (!eating && cr.user2["hibernated"] == 0)
     338                {
     339                        mindistvec.normalize();
     340                        mindistvec.scale(-0.08);
     341                        cr.localDrive = mindistvec;
     342                        moveEnergyDec(cr);
     343                }
     344
    298345                return 1;
    299346        }
     
    305352function moveEnergyDec(cr)
    306353{
    307         if (cr.user2["hibernated"] == 1)
    308         {
    309                 cr.energy_m += ExpParams.energy_hib;
    310         }
    311         else
    312         {
    313                 cr.energy_m += ExpParams.energy_move;
     354        if (cr.user2["hibernated"] == 0)
     355        {
     356                cr.energy_m += ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)];
    314357        }
    315358}
     
    320363
    321364        //adjustment in z axis
    322         cr.moveAbs(cr.pos_x, cr.pos_y, 0.5);
    323 
    324         //are there any nutrients in zone 1?
    325         if (cr.boundingBoxCollisions() == 2)
    326         {
    327                 if (cr.user2["hibernated"] == 1)
    328                         cr.user2["hibernated"] = 0;
    329                 return;
    330         }
    331 
    332         else if (cr.user2["hibernated"] == 1)
    333         {
    334                 moveEnergyDec(cr);
    335                 return;
    336         }
    337 
    338         //are there any nutrients in zone 2?
    339         else
     365        cr.moveAbs(cr.pos_x, cr.pos_y, 0);
     366
     367        //are there any nutrients in zone 1 or 2?
    340368        {
    341369                var moved = stepToNearest(ExpParams.zone2_range); //TODO weighted sum of distance and energy
    342370                if (moved==1)
    343                 {
    344                         moveEnergyDec(cr);
     371                {
    345372                        return;
    346373                }
     
    348375
    349376        //no nutrients in zone 2
    350 
    351377        var hibernation = 0;
    352378        if (cr.user2["gen"] == 0) hibernation =  cr.user1["hibernation"];
     
    355381        if (hibernation == 1)
    356382        {
     383                reverseHib(cr);
     384                cr.localDrive = XYZ.new(0,0,0);
     385        }
     386        //random move
     387        else if (cr.lifespan%dir_change == 0)
     388        {
     389                var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0);//(0.1 * Math.rnd01, 0.1 * Math.rnd01, 0);       
     390                dir.normalize();
     391                dir.scale(-0.08);
     392                cr.localDrive = dir;
    357393                moveEnergyDec(cr);
    358                 cr.user2["hibernated"] = 1;
    359                 cr.localDrive = XYZ.new(0,0,0);
    360         }
    361         //random move
     394        }
     395}
     396
     397function energyTransfer(cr1, cr2)
     398{
     399        cr1.localDrive = XYZ.new(0,0,0);
     400        var e = cr2.getPart(0).ing * ExpParams.feedtrans; //TODO efficiency dependent on age
     401        e = Math.min(cr2.energy, e) + 0.0000001;
     402        //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")");
     403        cr2.energy_m = cr2.energy_m + e;
     404        cr1.energy_p = cr1.energy_p + e;
     405        if (cr1.user2["hibernated"] == 1)
     406        {
     407                reverseHib(cr1);
     408        }
     409}
     410
     411function reverseHib(cr)
     412{
     413        if (cr.user2["hibernated"] == 1)
     414        {
     415                setForamMeta(cr, cr.user2["gen"]); //unhibernate
     416        }
    362417        else
    363418        {
    364                 cr.localDrive = (0.1 * Math.rnd01, 0.1 * Math.rnd01, 0);
    365                 moveEnergyDec(cr);
    366         }
    367 }
    368 
    369 function onForamsCollision()
    370 {
    371         if (Collision.Creature1.user2 != null)
    372         {
    373                 Collision.Creature1.localDrive = XYZ.new(0,0,0);
    374                 var e = Collision.Part2.ing * ExpParams.feedtrans; //TODO efficiency dependent on age
    375                 //Simulator.print("transferring "+e+" to "+Collision.Creature1.name+" from "+Collision.Creature2.name+" ("+Collision.Creature2.energy+")");
    376                 Collision.Creature2.energy_m = Collision.Creature2.energy_m + e;
    377                 Collision.Creature1.energy_p = Collision.Creature1.energy_p + e;
    378                 Collision.Creature1.user2["hibernated"] = 0;
    379         }
     419                cr.idleen = ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; //hibernate
     420        }
     421        cr.user2["hibernated"] = 1 - cr.user2["hibernated"];
    380422}
    381423
     
    383425{
    384426        cr.getMechPart(0).orient.set(o);
     427        if (ExpParams.showRet == 1)
     428                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"));
    385429
    386430        if (deathConditions(cr) == 1)
     
    392436        foramMove(cr);
    393437
     438        var repro = foramReproduce(cr);
     439        if (repro == 1)
     440        {
     441                return;
     442        }
     443
    394444        cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
    395         if  (cr.numparts <= chambers[0].size)
    396         {
    397                 if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][cr.numparts-1]))       
     445        if  (lastChamberNum(cr) <= chambers[0].size-1)
     446        {
     447                if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
    398448                {
    399                         foramGrow(cr, cr.numparts);
    400                         return;
     449                        foramGrow(cr, lastChamberNum(cr));
    401450                }       
    402         }
    403 
    404         foramReproduce(cr);     
     451        }       
    405452}
    406453
     
    415462function onForamsDied(cr)
    416463{
     464        if (ExpParams.showRet == 1)
     465        {
     466                Populations[2].delete(cr.user3);
     467        }
    417468        //fossilization
    418469        var geno = GenePools[0].add(cr.genotype);
     
    429480function createNutrientGenotype(nutrientsize, zone1_range)
    430481{
    431         return "//0\np:sh=3,sx="+nutrientsize+",sy="+(zone1_range + nutrientsize)+",sz="+(zone1_range+nutrientsize)+",ry=1.5,vr=0.0,1.0,0.0";
     482        return "//0\np:sh=3,sx="+(nutrientsize+25)+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
    432483}
    433484
     
    447498        cr.signals.add("nutrient");
    448499
    449         cr.signals[0].value = cr.getMechPart(0);
     500        cr.signals[0].value = cr;
    450501
    451502        placeCreatureRandomly(cr, 0, 0);
     
    503554                }
    504555        }
     556        if (Simulator.stepNumber == 150000)
     557                Simulator.stop();
    505558}
    506559
    507560function createStatistics()
    508561{       
    509         var number_ploidy = [0, 0];
    510         var number_species = [0, 0];
    511         var e_inc = [0.0, 0.0];
     562        var number = [[0, 0],[0,0]]; // [species][gen]
     563        var e_inc = [[0, 0],[0,0]];
    512564        var e_nut = 0.0;
    513565
     
    516568                var cr = Populations[0].get(i);
    517569                var gen = cr.user2["gen"];
    518                 number_ploidy[gen] = number_ploidy[gen] + 1;
    519570                var species = cr.user2["species"];
    520                 number_species[species] = number_species[species] + 1;
    521                 e_inc[gen] = e_inc[gen] + cr.energy;
     571
     572                number[species][gen] = number[species][gen] + 1;
     573                e_inc[species][gen] = e_inc[species][gen] + cr.energy;
    522574        }
    523575
     
    528580        }
    529581
    530         var log_numbers = [number_ploidy[0], number_ploidy[1], Populations[1].size];
    531         var log_species = [number_species[0], number_species[1]];
    532         var log_energy = [e_inc[0], e_inc[1], e_nut];
    533 
    534         log(log_numbers, "log_sizes.txt");
    535         log(log_species, "log_species.txt");
    536         log(log_energy, "log_energy.txt");
     582        var log_numbers = [number[0][0], number[0][1], number[1][0], number[1][1], Populations[1].size];
     583        var log_energies = [e_inc[0][0], e_inc[0][1], e_inc[1][0], e_inc[1][1], e_nut];
     584
     585        log(log_numbers, "forams_log.txt");
     586        log(log_energies, "energies_log.txt");
    537587}
    538588
    539589function log(tolog, fname)
    540590{
    541         var f = File.appendDirect(fname, "forams data");
     591        var f = File.appendDirect(fname, "forams data"); 
    542592        f.writeString("" + Simulator.stepNumber);
    543593        for (var  i = 0; i < tolog.size; i++)
     
    554604
    555605~
     606
     607prop:
     608id:showRet
     609name:Show reticulopodia
     610type:d 0 1 0
     611group:Foraminifera
    556612
    557613prop:
     
    734790id:world_size
    735791name:World size
    736 type:d 10 1000 20
     792type:d 10 10000 20
    737793group:World
    738794
Note: See TracChangeset for help on using the changeset viewer.