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

Last change on this file since 109 was 109, checked in by sz, 7 years ago

source reorganization (see README)
new feature added: part/joint shapes (see frams/_demos/part_shapes.cpp)

  • Property svn:eol-style set to native
File size: 3.7 KB
Line 
1// This file is a part of the Framsticks GDK library.
2// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ for further information.
4
5#include <frams/genetic/geno.h>
6#include <frams/virtfile/stdiofile.h>
7#include <frams/util/sstringutils.h>
8#include <frams/genetic/defgenoconv.h>
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
18StdoutErrorHandler err; //redirect model-related errors to stdout
19DefaultGenoConvManager gcm; //without this object the application would only handle "format 0" genotypes
20
21#ifndef GDK_WITHOUT_FRAMS
22#include <frams/mech/creatmechobj.h>
23int CreatMechObject::modeltags_id=0;
24int CreatMechObject::mechtags_id=0;
25#endif
26
27ParamEntry creature_paramtab[]={0};
28
29#ifdef VEYETEST
30#include <frams/neuro/impl/neuroimpl-vectoreye.h>
31
32#define N_VEye 0
33#define N_VMotor 1
34#define N_Mode 2
35#define N_Fitness 3
36#define LEARNINGSTEPS 50
37
38void veyeStep(Model &m,int step)
39{
40  static float angle=0;
41
42  NeuroNetImpl::getImpl(m.getNeuro(N_Mode))->setState(step>=LEARNINGSTEPS); //0 (learning) or 1 (normal)
43
44        NeuroImpl *ni=NeuroNetImpl::getImpl(m.getNeuro(N_VEye));
45  ((NI_VectorEye*)ni)->relpos.y=0;
46  ((NI_VectorEye*)ni)->relpos.z=0;
47  if (NeuroNetImpl::getImpl(m.getNeuro(N_Mode))->getNewState()<0.5)
48  { //learning
49    ((NI_VectorEye*)ni)->relpos.x=5.0*sin(2*M_PI*step/LEARNINGSTEPS);
50  }
51  else
52  { //VMotor controls location of VEye
53    angle+=NeuroNetImpl::getImpl(m.getNeuro(N_VMotor))->getState();
54    angle=fmod((double)angle,M_PI*2.0);
55    ((NI_VectorEye*)ni)->relpos.x=5*sin(angle);
56  }
57
58  NeuroNetImpl::getImpl(m.getNeuro(N_Fitness))->setState(angle); //wymaga poprawy
59  //oraz trzeba przemyslec kolejnosc get/set'ow neuronow zeby sygnal sie dobrze propagowal.
60}
61#endif
62
63int main(int argc,char*argv[])
64{
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.