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

Last change on this file since 201 was 197, checked in by Maciej Komosinski, 11 years ago

GDK used by developers since 1999, distributed on the web since 2002

  • Property svn:eol-style set to native
File size: 3.7 KB
RevLine 
[121]1// This file is a part of the Framsticks GDK.
[197]2// Copyright (C) 1999-2014  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
[109]3// Refer to http://www.framsticks.com/ for further information.
4
[121]5#include <frams/genetics/geno.h>
[109]6#include <frams/virtfile/stdiofile.h>
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>
11#include <frams/errmgr/stdouterr.h>
12
13/**
14 @file
15 Sample code: Neural network tester (can run your custom neurons)
16*/
17
18#ifndef GDK_WITHOUT_FRAMS
19#include <frams/mech/creatmechobj.h>
20int CreatMechObject::modeltags_id=0;
21int CreatMechObject::mechtags_id=0;
22#endif
23
24ParamEntry creature_paramtab[]={0};
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
35void veyeStep(Model &m,int step)
36{
37  static float angle=0;
38
39  NeuroNetImpl::getImpl(m.getNeuro(N_Mode))->setState(step>=LEARNINGSTEPS); //0 (learning) or 1 (normal)
40
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  }
54
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.
57}
58#endif
59
60int main(int argc,char*argv[])
61{
[145]62StdoutErrorHandler err;//the default ErrorHandler constructor automatically registers this object to receive framsg messages (and in this case, redirect them to standard output)
63PreconfiguredGenetics genetics;
64
[109]65if (argc<=1)
66        {
67                puts("Parameters: <genotype> [number of simulation steps]");
68          return 10;
69        }
70SString gen(argv[1]);
71if (!strcmp(gen,"-"))
72        {
73        gen=0;
74        StdioFILEDontClose in(stdin);
75        loadSString(&in,gen);
76        }
77Geno g(gen);
78if (!g.isValid()) {puts("invalid genotype");return 5;}
79Model m(g);
80if (!m.getNeuroCount()) {puts("no neural network");return 1;}
81printf("%d neurons,",m.getNeuroCount());
82NeuroFactory neurofac;
83neurofac.setStandardImplementation();
84NeuroNetConfig nn_config(&neurofac);
85NeuroNetImpl *nn=new NeuroNetImpl(m,nn_config);
86int i; Neuro *n;
87if (!nn->getErrorCount()) printf(" no errors\n");
88else
89        {
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++)
94                {
95                n=m.getNeuro(i);
96                NeuroImpl *ni=NeuroNetImpl::getImpl(n);
97                if (!ni)
98                        {
99                        if (no_impl) no_impl_names+=',';
100                        no_impl_names+=SString::sprintf("#%d.%s",i,(const char*)n->getClassName());
101                        no_impl++;
102                        }
103                else if (ni->status==NeuroImpl::InitError)
104                        {
105                        if (init_err) init_err_names+=',';
106                        init_err_names+=SString::sprintf("#%d.%s",i,(const char*)n->getClassName());
107                        init_err++;
108                        }
109                }
110        printf("\n");
111        if (no_impl) printf("%d x missing implementation (%s)\n",no_impl,(const char*)no_impl_names);
112        if (init_err) printf("%d x failed initialization (%s)\n",init_err,(const char*)init_err_names);
113        }
114int steps=1;
115if (argc>2) steps=atol(argv[2]);
116int st;
117printf("step");
118for(i=0;i<m.getNeuroCount();i++)
119        {
120        n=m.getNeuro(i);
121        printf("\t#%d.%s",i,(const char*)n->getClassName());
122        }
123printf("\n");
124for(st=0;st<=steps;st++)
125        {
126#ifdef VEYETEST
127  veyeStep(m,st);
128#endif
129        printf("%d",st);
130        for(i=0;i<m.getNeuroCount();i++)
131                {
132                n=m.getNeuro(i);
133                printf("\t%g",n->state);
134                }
135        printf("\n");
136        nn->simulateNeuroNet();
137        }
138neurofac.freeImplementation();
139}
Note: See TracBrowser for help on using the repository browser.