source: cpp/gdk/neurotest.cpp @ 94

Last change on this file since 94 was 70, checked in by Maciej Komosinski, 14 years ago

compiles under vs2008

  • Property svn:eol-style set to native
File size: 3.6 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 "geno.h"
6#include "stdiofile.h"
7#include "sstringutils.h"
8#include "defgenoconv.h"
9#include "neuroimpl.h"
10#include "neurofactory.h"
11#include "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 "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 "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::setImplementation();
83NeuroNetImpl *nn=new NeuroNetImpl(m);
84int i; Neuro *n;
85if (!nn->getErrorCount()) printf(" no errors\n");
86else
87        {
88        printf(" %d errors:",nn->getErrorCount());
89        int no_impl=0; SString no_impl_names;
90        int init_err=0; SString init_err_names;
91        for(i=0;i<m.getNeuroCount();i++)
92                {
93                n=m.getNeuro(i);
94                NeuroImpl *ni=NeuroNetImpl::getImpl(n);
95                if (!ni)
96                        {
97                        if (no_impl) no_impl_names+=',';
98                        sprintf(no_impl_names.directAppend(100),"#%d.%s",
99                                i,(const char*)n->getClassName());
100                        no_impl_names.endAppend();
101                        no_impl++;
102                        }
103                else if (ni->status==NeuroImpl::InitError)
104                        {
105                        if (init_err) init_err_names+=',';
106                        sprintf(init_err_names.directAppend(100),"#%d.%s",
107                                i,(const char*)n->getClassName());
108                        init_err_names.endAppend();
109                        init_err++;
110                        }
111                }
112        printf("\n");
113        if (no_impl) printf("%d x missing implementation (%s)\n",no_impl,(const char*)no_impl_names);
114        if (init_err) printf("%d x failed initialization (%s)\n",init_err,(const char*)init_err_names);
115        }
116int steps=1;
117if (argc>2) steps=atol(argv[2]);
118int st;
119printf("step");
120for(i=0;i<m.getNeuroCount();i++)
121        {
122        n=m.getNeuro(i);
123        printf("\t#%d.%s",i,(const char*)n->getClassName());
124        }
125printf("\n");
126for(st=0;st<=steps;st++)
127        {
128#ifdef VEYETEST
129  veyeStep(m,st);
130#endif
131        printf("%d",st);
132        for(i=0;i<m.getNeuroCount();i++)
133                {
134                n=m.getNeuro(i);
135                printf("\t%g",n->state);
136                }
137        printf("\n");
138        nn->simulateNeuroNet();
139        }
140NeuroFactory::freeImplementation();
141}
Note: See TracBrowser for help on using the repository browser.