Ignore:
Timestamp:
03/15/18 22:55:05 (7 years ago)
Author:
Maciej Komosinski
Message:
  • added support for new API for neuron types and their properties
  • added support for checkpoints
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/genetics/f4/conv_f4.cpp

    r736 r760  
    44
    55// Copyright (C) 1999,2000  Adam Rotaru-Varga (adam_rotaru@yahoo.com), GNU LGPL
     6// Copyright (C) since 2001 Maciej Komosinski
     7// 2018, Grzegorz Latosinski, added support for new API for neuron types and their properties
    68
    79#include "conv_f4.h"
     
    2729        int res;
    2830        f4_Model * model = new f4_Model();
    29         res = model->buildFromF4(in);
     31        res = model->buildFromF4(in, using_checkpoints);
    3032        if (GENOPER_OK != res) return SString();  // oops
    3133        if (NULL != map)
     
    5254        int res;
    5355        f4_Model * model = new f4_Model();
    54         res = model->buildFromF4(in);
     56        res = model->buildFromF4(in, using_checkpoints);
    5557        if (GENOPER_OK != res) return SString();  // oops
    5658        SString out;
     
    7173}
    7274
    73 int f4_Model::buildFromF4(SString &geno)
     75int f4_Model::buildFromF4(SString &geno, bool using_checkpoints)
    7476{
    7577        int i;
     
    101103                cells->C[i]->recProcessedFlag = 0;
    102104
    103         open(); // begin model build
     105        open(using_checkpoints); // begin model build
    104106
    105107        // process every cell
     
    184186                        partidx = addFromString(PartType, tmpLine, &range);
    185187                        if (partidx < 0) return -1;
     188                        this->checkpoint();
    186189                        jj_p1_refno = partidx;
    187190                }
     
    200203                partidx = addFromString(PartType, tmpLine, &range);
    201204                if (partidx < 0) return -2;
     205                this->checkpoint();
    202206                C->p2_refno = partidx;
    203207
     
    220224                partidx = addFromString(JointType, tmpLine, &range);
    221225                if (partidx < 0) return -13;
     226                this->checkpoint();
    222227                C->joint_refno = partidx;
    223228        }
     
    225230        if (C->type == T_NEURON4) ///<this case was updated by MacKo
    226231        {
    227                 // new neuron object
    228                 // it is linked to a part (not a joint!)
    229                 int p_refno = C->dadlink->p2_refno;
    230                 if ((p_refno < 0) || (p_refno >= getPartCount())) return -21;
    231                 // joint_refno is currently not used
    232                 sprintf(tmpLine, "p=%ld,d=\"N:in=%g,fo=%g,si=%g\"",
    233                         p_refno,
    234                         C->inertia, C->force, C->sigmo);
    235                 partidx = addFromString(NeuronType, tmpLine, &range);
    236                 if (partidx < 0) return -22;
     232                const char * nclass = C->neuclass->name.c_str();
     233                int partno, jointno;
     234                if (C->neuclass->getPreferredLocation() == 0)
     235                {
     236                        if (strcmp(nclass, "N") == 0)
     237                        {
     238                                partno = C->dadlink->p2_refno;
     239                                if ((partno < 0) || (partno >= getPartCount())) return -21;
     240                                else sprintf(tmpLine, "p=%ld,d=\"N:in=%g,fo=%g,si=%g\"", partno, C->inertia, C->force, C->sigmo);
     241                        }
     242                        else
     243                        {
     244                                sprintf(tmpLine, "d=\"%s\"", nclass);
     245                        }
     246                        partidx = addFromString(NeuronType, tmpLine, &range);
     247                        if (partidx < 0) return -22;
     248                        this->checkpoint();
     249                        C->neuro_refno = partidx;
     250                }
     251                else if (C->neuclass->getPreferredLocation() == 1) // attached to Part or have no required attachment - also part
     252                {
     253                        partno = C->dadlink->p2_refno;
     254                        if ((partno < 0) || (partno >= getPartCount())) return -21;
     255                        if (strcmp(nclass, "N") == 0)
     256                        {
     257                                sprintf(tmpLine, "d=\"N:in=%g,fo=%g,si=%g\"", partno, C->inertia, C->force, C->sigmo);
     258                        }
     259                        else
     260                        {
     261                                sprintf(tmpLine, "p=%ld,d=\"%s\"", partno, nclass);
     262                        }
     263                        partidx = addFromString(NeuronType, tmpLine, &range);
     264                        if (partidx < 0) return -22;
     265                        this->checkpoint();
     266                        C->neuro_refno = partidx;
     267                }
     268                else // attached to Joint
     269                {
     270                        jointno = C->dadlink->joint_refno;
     271                        sprintf(tmpLine, "n:j=%d,d=\"%s\"", jointno, nclass);
     272                        partidx = addFromString(NeuronType, tmpLine, &range);
     273                        if (partidx < 0) return -32;
     274                        this->checkpoint();
     275                }
    237276                C->neuro_refno = partidx;
    238277                int n_refno = C->neuro_refno;
    239278
    240                 if (C->ctrl)
     279                if ((strcmp(nclass,"N") == 0) && C->ctrl)
    241280                {
    242281                        if (1 == C->ctrl)
     
    248287                        sprintf(tmpLine, "%d,%d", partidx, n_refno);
    249288                        if (addFromString(NeuronConnectionType, tmpLine, &range) < 0) return -33;
     289                        this->checkpoint();
    250290                }
    251291
     
    256296
    257297                        tmpLine[0] = 0;
    258                         if (1 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"*\"", p_refno);
    259                         if (2 == C->links[j]->t) sprintf(tmpLine, "j=%d,d=\"G\"", C->dadlink->joint_refno);
    260                         if (3 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"T\"", p_refno);
    261                         if (4 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"S\"", p_refno);
     298                        if (C->links[j]->from == NULL)
     299                        {
     300                                const char * nclass = C->links[j]->t.c_str();
     301                                char * temp = (char*)C->links[j]->t.c_str();
     302                                NeuroClass * sensortest = GenoOperators::parseNeuroClass(temp);
     303                                //backward compatibility for G*TS
     304                                if (C->links[j]->t == "*" || C->links[j]->t == "S" || C->links[j]->t == "T")
     305                                {
     306                                        sprintf(tmpLine, "p=%d,d=\"%s\"", partno, nclass);
     307                                }
     308                                else if (C->links[j]->t == "G")
     309                                {
     310                                        jointno = C->dadlink->joint_refno;
     311                                        sprintf(tmpLine, "j=%d,d=\"%s\"", jointno, nclass);
     312                                }                               
     313                                else if (sensortest->getPreferredLocation() == 0)
     314                                {
     315                                        sprintf(tmpLine, "d=\"%s\"",nclass);
     316                                }
     317                                else if (sensortest->getPreferredLocation() == 1)
     318                                {
     319                                        sprintf(tmpLine, "p=%d,d=\"%s\"", partno, nclass);
     320                                }
     321                                else
     322                                {
     323                                        jointno = C->dadlink->joint_refno;
     324                                        sprintf(tmpLine, "j=%d,d=\"%s\"", jointno, nclass);
     325                                }
     326
     327                        }
    262328                        int from = -1;
    263329                        if (tmpLine[0]) //input from receptor
     
    265331                                from = addFromString(NeuronType, tmpLine, &range);
    266332                                if (from < 0) return -34;
     333                                this->checkpoint();
    267334                        } /*could be 'else'...*/
     335
    268336                        if (NULL != C->links[j]->from) // input from another neuron
    269337                                from = C->links[j]->from->neuro_refno;
     
    272340                                sprintf(tmpLine, "%d,%d,%g", n_refno, from, C->links[j]->w);
    273341                                if (addFromString(NeuronConnectionType, tmpLine, &range) < 0) return -35;
     342                                this->checkpoint();
    274343                        }
    275344                }
Note: See TracChangeset for help on using the changeset viewer.