source: cpp/frams/_demos/neuro_test.cpp @ 980

Last change on this file since 980 was 972, checked in by Maciej Komosinski, 4 years ago
  • 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)
  • Property svn:eol-style set to native
File size: 3.7 KB
RevLine 
[286]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
[972]2// Copyright (C) 1999-2020  Maciej Komosinski and Szymon Ulatowski.
[286]3// See LICENSE.txt for details.
[109]4
[121]5#include <frams/genetics/geno.h>
[382]6#include <common/virtfile/stdiofile.h>
[109]7#include <frams/util/sstringutils.h>
[145]8#include <frams/genetics/preconfigured.h>
[109]9#include <frams/neuro/neuroimpl.h>
10#include <frams/neuro/neurofactory.h>
[391]11#include <common/loggers/loggertostdout.h>
[109]12
13/**
14 @file
15 Sample code: Neural network tester (can run your custom neurons)
16*/
17
[288]18#ifndef SDK_WITHOUT_FRAMS
[109]19#include <frams/mech/creatmechobj.h>
[972]20int CreatMechObject::modeltags_id = 0;
21int CreatMechObject::mechtags_id = 0;
[109]22#endif
23
[972]24ParamEntry creature_paramtab[] = { 0 };
[109]25
26#ifdef VEYETEST
27#include <frams/neuro/impl/neuroimpl-vectoreye.h>
28
29#define N_VEye 0
30#define N_VMotor 1
31#define N_Mode 2
32#define N_Fitness 3
33#define LEARNINGSTEPS 50
34
[972]35void veyeStep(Model &m, int step)
[109]36{
[972]37        static float angle = 0;
[109]38
[972]39        NeuroNetImpl::getImpl(m.getNeuro(N_Mode))->setState(step >= LEARNINGSTEPS); //0 (learning) or 1 (normal)
[109]40
[972]41        NeuroImpl *ni = NeuroNetImpl::getImpl(m.getNeuro(N_VEye));
42        ((NI_VectorEye*)ni)->relpos.y = 0;
43        ((NI_VectorEye*)ni)->relpos.z = 0;
44        if (NeuroNetImpl::getImpl(m.getNeuro(N_Mode))->getNewState() < 0.5)
45        { //learning
46                ((NI_VectorEye*)ni)->relpos.x = 5.0 * sin(2 * M_PI * step / LEARNINGSTEPS);
47        }
48        else
49        { //VMotor controls location of VEye
50                angle += NeuroNetImpl::getImpl(m.getNeuro(N_VMotor))->getState();
51                angle = fmod((double)angle, M_PI * 2.0);
52                ((NI_VectorEye*)ni)->relpos.x = 5 * sin(angle);
53        }
[109]54
[972]55        NeuroNetImpl::getImpl(m.getNeuro(N_Fitness))->setState(angle); //wymaga poprawy
56        //oraz trzeba przemyslec kolejnosc get/set'ow neuronow zeby sygnal sie dobrze propagowal.
[109]57}
58#endif
59
[972]60int main(int argc, char*argv[])
[109]61{
[972]62        LoggerToStdout messages_to_stdout(LoggerBase::Enable);
63        PreconfiguredGenetics genetics;
[145]64
[972]65        if (argc <= 1)
[109]66        {
67                puts("Parameters: <genotype> [number of simulation steps]");
[972]68                return 10;
[109]69        }
[972]70        SString gen(argv[1]);
71        if (!strcmp(gen.c_str(), "-"))
[109]72        {
[972]73                gen = 0;
74                StdioFILEDontClose in(stdin);
75                loadSString(&in, gen);
[109]76        }
[972]77        Geno g(gen);
78        if (!g.isValid()) { puts("invalid genotype"); return 5; }
79        Model m(g, Model::SHAPE_UNKNOWN);
80        if (!m.getNeuroCount()) { puts("no neural network"); return 1; }
81        printf("%d neurons,", m.getNeuroCount());
82        NeuroFactory neurofac;
83        neurofac.setStandardImplementation();
84        NeuroNetConfig nn_config(&neurofac);
85        NeuroNetImpl *nn = new NeuroNetImpl(m, nn_config);
86        int i; Neuro *n;
87        if (!nn->getErrorCount()) printf(" no errors\n");
88        else
[109]89        {
[972]90                printf(" %d errors:", nn->getErrorCount());
91                int no_impl = 0; SString no_impl_names;
92                int init_err = 0; SString init_err_names;
93                for (i = 0; i < m.getNeuroCount(); i++)
[109]94                {
[972]95                        n = m.getNeuro(i);
96                        NeuroImpl *ni = NeuroNetImpl::getImpl(n);
97                        if (!ni)
[109]98                        {
[972]99                                if (no_impl) no_impl_names += ',';
100                                no_impl_names += SString::sprintf("#%d.%s", i, n->getClassName().c_str());
101                                no_impl++;
[109]102                        }
[972]103                        else if (ni->status == NeuroImpl::InitError)
[109]104                        {
[972]105                                if (init_err) init_err_names += ',';
106                                init_err_names += SString::sprintf("#%d.%s", i, n->getClassName().c_str());
107                                init_err++;
[109]108                        }
109                }
[972]110                printf("\n");
111                if (no_impl) printf("%d x missing implementation (%s)\n", no_impl, no_impl_names.c_str());
112                if (init_err) printf("%d x failed initialization (%s)\n", init_err, init_err_names.c_str());
[109]113        }
[972]114        int steps = 1;
115        if (argc > 2) steps = atol(argv[2]);
116        int st;
117        printf("step");
118        for (i = 0; i < m.getNeuroCount(); i++)
[109]119        {
[972]120                n = m.getNeuro(i);
121                printf("\t#%d.%s", i, n->getClassName().c_str());
[109]122        }
[972]123        printf("\n");
124        for (st = 0; st <= steps; st++)
[109]125        {
126#ifdef VEYETEST
[972]127                veyeStep(m, st);
[109]128#endif
[972]129                printf("%d", st);
130                for (i = 0; i < m.getNeuroCount(); i++)
[109]131                {
[972]132                        n = m.getNeuro(i);
133                        printf("\t%g", n->state);
[109]134                }
[972]135                printf("\n");
136                nn->simulateNeuroNet();
[109]137        }
[972]138        neurofac.freeImplementation();
[109]139}
Note: See TracBrowser for help on using the repository browser.