Ignore:
Timestamp:
07/03/20 00:32:23 (4 years ago)
Author:
Maciej Komosinski
Message:
  • separate "0" and "0s" formats (for SHAPE_BALL_AND_STICK and SHAPE_SOLIDS, respectively)
  • converting to format list (Geno::F0_FORMAT_LIST = "0,0s")
  • (optional) declaring Model as SHAPE_BALL_AND_STICK or SHAPE_SOLIDS (or SHAPE_UNKNOWN)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/model/model.cpp

    r955 r972  
    11// This file is a part of Framsticks SDK.  http://www.framsticks.com/
    2 // Copyright (C) 1999-2019  Maciej Komosinski and Szymon Ulatowski.
     2// Copyright (C) 1999-2020  Maciej Komosinski and Szymon Ulatowski.
    33// See LICENSE.txt for details.
    44
     
    1111#define F0_CHECKPOINT_LINE "checkpoint:"
    1212
    13 Model::Model()
     13Model::Model(ShapeType sh)
    1414{
    1515        autobuildmaps = false;
    16         init();
    17 }
    18 
    19 void Model::init()
     16        init(sh);
     17}
     18
     19void Model::init(ShapeType sh)
    2020{
    2121        partmappingchanged = 0;
     
    3030        f0genoknown = 1;
    3131        shape = SHAPE_UNKNOWN;
     32        declared_shape = sh;
     33}
     34
     35void Model::declareShapeType(ShapeType sh)
     36{
     37        declared_shape = sh;
    3238}
    3339
     
    5157        f0genoknown = 0;
    5258        shape = mod.shape;
     59        declared_shape = mod.declared_shape;
    5360        startenergy = mod.startenergy;
    5461        modelfromgenotype = mod.modelfromgenotype;
     
    93100
    94101
    95 Model::Model(const Geno &src, bool buildmaps, bool _using_checkpoints, bool _is_checkpoint)
     102Model::Model(const Geno &src, ShapeType st, bool buildmaps, bool _using_checkpoints, bool _is_checkpoint)
    96103        :autobuildmaps(buildmaps)
    97104{
    98         init(src, _using_checkpoints, _is_checkpoint);
     105        init(src, st, _using_checkpoints, _is_checkpoint);
    99106}
    100107
     
    110117        :autobuildmaps(buildmaps)
    111118{
    112         init();
     119        init(mod.declared_shape);
    113120        open(_using_checkpoints, _is_checkpoint);
    114121        internalCopy(mod);
     
    123130}
    124131
    125 void Model::init(const Geno &src, bool _using_checkpoints, bool _is_checkpoint)
    126 {
    127         init();
     132void Model::init(const Geno &src, ShapeType sh, bool _using_checkpoints, bool _is_checkpoint)
     133{
     134        init(sh);
    128135        using_checkpoints = _using_checkpoints;
    129136        is_checkpoint = _is_checkpoint;
     
    162169        delMap();
    163170        delF0Map();
    164         init();
     171        init(declared_shape);
    165172        geno = Geno();
    166173        f0geno = Geno();
     
    333340        f0warnposition = -1;
    334341        MultiMap *convmap = autobuildmaps ? new MultiMap() : NULL;
    335         f0geno = (geno.getFormat() == "0") ? geno : geno.getConverted("0", convmap, using_checkpoints);
     342        if (declared_shape == SHAPE_UNKNOWN)
     343                f0geno = geno.getConverted(Geno::F0_FORMAT_LIST, convmap, using_checkpoints);
     344        else
     345                f0geno = geno.getConverted(genoFormatForShapeType(declared_shape), convmap, using_checkpoints);
    336346        f0genoknown = 1;
    337347        if (f0geno.isInvalid())
     
    467477        modelparam.select(this);
    468478        modelparam.saveSingleLine(mod_props, handle_defaults ? &defaultmodel : NULL, true, !handle_defaults);
    469         if (mod_props.len() > 1) //are there any non-default values? ("\n" is empty)
     479        if (mod_props.length() > 1) //are there any non-default values? ("\n" is empty)
    470480        {
    471481                gen += "m:";
     
    476486        {
    477487                partparam.select(p);
    478                 len = gen.len();
     488                len = gen.length();
    479489                gen += "p:";
    480490                partparam.saveSingleLine(gen, handle_defaults ? &defaultpart : NULL, true, !handle_defaults);
    481491                if (map)
    482                         map->add(len, gen.len() - 1, partToMap(i));
     492                        map->add(len, gen.length() - 1, partToMap(i));
    483493        }
    484494        for (i = 0; j = (Joint *)joints(i); i++)
    485495        {
    486496                jointparam.select(j);
    487                 len = gen.len();
     497                len = gen.length();
    488498                jointparam.setParamTab(j->usedelta ? f0_joint_paramtab : f0_nodeltajoint_paramtab);
    489499                gen += "j:";
    490500                jointparam.saveSingleLine(gen, handle_defaults ? &defaultjoint : NULL, true, !handle_defaults);
    491501                if (map)
    492                         map->add(len, gen.len() - 1, jointToMap(i));
     502                        map->add(len, gen.length() - 1, jointToMap(i));
    493503        }
    494504        for (i = 0; n = (Neuro *)neurons(i); i++)
    495505        {
    496506                neuroparam.select(n);
    497                 len = gen.len();
     507                len = gen.length();
    498508                gen += "n:";
    499509                neuroparam.saveSingleLine(gen, handle_defaults ? &defaultneuro : NULL, true, !handle_defaults);
    500510                if (map)
    501                         map->add(len, gen.len() - 1, neuroToMap(i));
     511                        map->add(len, gen.length() - 1, neuroToMap(i));
    502512        }
    503513        for (a = 0; a < neurons.size(); a++)
     
    526536                                nc.info = **s;
    527537                        connparam.select(&nc);
    528                         len = gen.len();
     538                        len = gen.length();
    529539                        gen += "c:";
    530540                        connparam.saveSingleLine(gen, handle_defaults ? &defaultconn : NULL, true, !handle_defaults);
    531541                        if (map)
    532                                 map->add(len, gen.len() - 1, neuroToMap(n->refno));
     542                                map->add(len, gen.length() - 1, neuroToMap(n->refno));
    533543                }
    534544        }
     
    541551        }
    542552
    543         g = Geno(gen.c_str(), '0');
     553        g = Geno(gen.c_str(), genoFormatForShapeType(getShapeType()), "", "");
     554}
     555
     556SString Model::genoFormatForShapeType(ShapeType st)
     557{
     558        switch (st)
     559        {
     560        case SHAPE_BALL_AND_STICK:
     561                return "0";
     562        case SHAPE_SOLIDS:
     563                return "0s";
     564        default:
     565                return Geno::INVALID_FORMAT;
     566        }
     567}
     568
     569Model::ShapeType Model::shapeTypeForGenoFormat(const SString& format)
     570{
     571        if (format == "0")
     572                return SHAPE_BALL_AND_STICK;
     573        else if (format == "0s")
     574                return SHAPE_SOLIDS;
     575        else
     576                return SHAPE_UNKNOWN;
     577
     578}
     579
     580const char* Model::getShapeTypeName(ShapeType sh)
     581{
     582        switch (sh)
     583        {
     584        case SHAPE_BALL_AND_STICK: return "ball-and-stick";
     585        case SHAPE_SOLIDS: return "solid shapes";
     586        case SHAPE_UNKNOWN: return "unknown";
     587
     588        case SHAPE_ILLEGAL:
     589        default:
     590                return "illegal";
     591        }
    544592}
    545593
     
    653701        if (result < 0)
    654702        {
    655                 if (error_message.len() == 0) // generic error when no detailed message is available
     703                if (error_message.length() == 0) // generic error when no detailed message is available
    656704                        error_message = "Invalid f0 code";
    657705                if (line_num > 0)
     
    731779                {
    732780                        // default class for unparented units: standard neuron
    733                         if (nu->getClassName().len() == 0) nu->setClassName("N");
     781                        if (nu->getClassName().length() == 0) nu->setClassName("N");
    734782                }
    735783                /*
     
    832880SString Model::nameForErrors() const
    833881{
    834         if (geno.getName().len() > 0)
     882        if (geno.getName().length() > 0)
    835883                return SString::sprintf(" in '%s'", geno.getName().c_str());
    836884        return SString::empty();
     
    10611109        if (shape == SHAPE_ILLEGAL)
    10621110                ret = 0;
     1111        else if ((declared_shape != SHAPE_UNKNOWN) && (declared_shape != shape))
     1112        {
     1113                logPrintf("Model", "internalCheck", LOG_ERROR, "Model shape type '%s' does not match the declared type '%s'", getShapeTypeName(shape), getShapeTypeName(declared_shape));
     1114                ret = 0;
     1115        }
     1116
    10631117        return ret;
    10641118}
Note: See TracChangeset for help on using the changeset viewer.