Changeset 972 for cpp/frams/model


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)
Location:
cpp/frams/model
Files:
5 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}
  • cpp/frams/model/model.h

    r935 r972  
    102102protected:
    103103        ShapeType shape;
     104        ShapeType declared_shape;
    104105
    105106        SString nameForErrors() const;
    106107        int internalcheck(CheckType check);
    107108
    108         void init(const Geno &srcgen, bool _using_checkpoints, bool _is_checkpoint);
    109         void init();
     109        void init(const Geno &srcgen, ShapeType sh, bool _using_checkpoints, bool _is_checkpoint);
     110        void init(ShapeType sh);
    110111
    111112        void delMap();
     
    136137        bool isUsingCheckpoints() const { return using_checkpoints; }
    137138        bool isCheckpoint() const { return is_checkpoint; }
     139        static SString genoFormatForShapeType(ShapeType st);
     140        static ShapeType shapeTypeForGenoFormat(const SString& format);
     141        static const char* getShapeTypeName(ShapeType sh);
    138142
    139143        void updateRefno(); // set ::refno for all elements
     
    150154        ModelUserTags userdata;
    151155
    152         /// Create empty model with invalid empty genotype
    153         Model();
     156        /// Create empty model with invalid empty genotype, declaring the shape type for later operations
     157        Model(ShapeType sh = SHAPE_UNKNOWN);
     158
     159        /// Change the declared shape type of the Model
     160        void declareShapeType(ShapeType sh);
    154161
    155162        /** Create a model based on provided genotype
     
    158165           @see getMap()
    159166           */
    160         Model(const Geno &src, bool buildmaps = false, bool _using_checkpoints = false, bool _is_checkpoint = false);
     167        Model(const Geno &src, ShapeType sh, bool buildmaps = false, bool _using_checkpoints = false, bool _is_checkpoint = false);
    161168        Model(const Model &mod, bool buildmaps = false, bool _using_checkpoints = false, bool _is_checkpoint = false);
    162169        /** duplicate the model.
  • cpp/frams/model/modelobj.cpp

    r732 r972  
    5858void ModelObj::p_newfromstring(ExtValue *args, ExtValue *ret)
    5959{
    60         *ret = makeDynamicObject(new Model(Geno(args[0].getString())));
     60        *ret = makeDynamicObject(new Model(Geno(args[0].getString()), Model::SHAPE_UNKNOWN));
    6161}
    6262
     
    6565        Geno *g = GenoObj::fromObject(args[0].getObject());
    6666        if (g)
    67                 *ret = makeDynamicObject(new Model(*g));
     67                *ret = makeDynamicObject(new Model(*g, Model::SHAPE_UNKNOWN));
    6868        else
    6969                ret->setEmpty();
     
    7474        Model *m = NULL;
    7575        if (args[0].getType() == TString)
    76                 m = new Model(Geno(args[0].getString()), false, true);
     76                m = new Model(Geno(args[0].getString()), Model::SHAPE_UNKNOWN, false, true);
    7777        else
    7878        {
    7979                Geno *g = GenoObj::fromObject(args[0].getObject(), false);
    8080                if (g)
    81                         m = new Model(*g, false, true);
     81                        m = new Model(*g, Model::SHAPE_UNKNOWN, false, true);
    8282                else
    8383                        logPrintf("Model", "newWithCheckpoints", LOG_ERROR, "Geno or string expected, %s found", args[0].typeDescription().c_str());
  • cpp/frams/model/modelparts.h

    r952 r972  
    3434{
    3535public:
    36         enum ShapeType { SHAPE_BALL_AND_STICK, SHAPE_SOLIDS, SHAPE_UNKNOWN, SHAPE_ILLEGAL };
     36        enum ShapeType { SHAPE_BALL_AND_STICK = 0, SHAPE_SOLIDS = 1, SHAPE_UNKNOWN, SHAPE_ILLEGAL }; ///< 0 and 1 have special significance - these values allow for bit operations.
    3737};
    3838
  • cpp/frams/model/similarity/simil_model.cpp

    r877 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
     
    122122
    123123        // assign matching function
    124         int (ModelSimil::* pfMatchingFunction) () = NULL;
     124        int (ModelSimil:: * pfMatchingFunction) () = NULL;
    125125
    126126        pfMatchingFunction = &ModelSimil::MatchPartsGeometry;
     
    534534                return NULL;
    535535        }
    536         Model *m = new Model(*g);
     536        Model *m = new Model(*g, Model::SHAPE_UNKNOWN);
    537537        if (!m->isValid())
    538538        {
     
    20582058                        {
    20592059                                if (geo)
    2060                                         dist[i*bigger + j] += m_adFactors[3] * m_aPositions[1 - m_iSmaller][i].length();
     2060                                        dist[i * bigger + j] += m_adFactors[3] * m_aPositions[1 - m_iSmaller][i].length();
    20612061                                else
    2062                                         dist[i*bigger + j] = m_adFactors[1] * m_aDegrees[1 - m_iSmaller][i][DEGREE] + m_adFactors[2] * m_aDegrees[1 - m_iSmaller][i][NEURONS];
     2062                                        dist[i * bigger + j] = m_adFactors[1] * m_aDegrees[1 - m_iSmaller][i][DEGREE] + m_adFactors[2] * m_aDegrees[1 - m_iSmaller][i][NEURONS];
    20632063                        }
    20642064                        // compute distance between parts
     
    20662066                        {
    20672067                                if (geo)
    2068                                         dist[i*bigger + j] += m_adFactors[3] * m_aPositions[1 - m_iSmaller][i].distanceTo(m_aPositions[m_iSmaller][j]);
     2068                                        dist[i * bigger + j] += m_adFactors[3] * m_aPositions[1 - m_iSmaller][i].distanceTo(m_aPositions[m_iSmaller][j]);
    20692069                                else
    2070                                         dist[i*bigger + j] = m_adFactors[1] * abs(m_aDegrees[1 - m_iSmaller][i][DEGREE] - m_aDegrees[m_iSmaller][j][DEGREE])
     2070                                        dist[i * bigger + j] = m_adFactors[1] * abs(m_aDegrees[1 - m_iSmaller][i][DEGREE] - m_aDegrees[m_iSmaller][j][DEGREE])
    20712071                                        + m_adFactors[2] * abs(m_aDegrees[1 - m_iSmaller][i][NEURONS] - m_aDegrees[m_iSmaller][j][NEURONS]);
    20722072                        }
     
    21042104        int nBigger = m_Mod[1 - m_iSmaller]->getPartCount();
    21052105
    2106         double* partsDistances = new double[nBigger*nBigger]();
     2106        double* partsDistances = new double[nBigger * nBigger]();
    21072107        FillPartsDistances(partsDistances, nBigger, nSmaller, false);
    21082108        int *assignment = new int[nBigger]();
     
    21382138                        // - models (m_Mod) exist and are available
    21392139                        // - all properties are created and available (m_aDegrees and m_aPositions)
    2140                         double* tmpPartsDistances = new double[nBigger*nBigger]();
     2140                        double* tmpPartsDistances = new double[nBigger * nBigger]();
    21412141                        std::copy(partsDistances, partsDistances + nBigger * nBigger, tmpPartsDistances);
    21422142                        // recompute geometric properties according to the transformation iTransform
Note: See TracChangeset for help on using the changeset viewer.