📄 test1-natural.cpp
字号:
#include "stdafx.h"#include "aine.h"#include "ne-neuron.h"#include "ne-data.h"using namespace aine;extern ofstream tron;namespace Natural{ int TestAdjust( const string ) { Neuron N[10]; // Create a very simple neural network net... we have only connection to dendrites. // All threshold values are 1 // All dendrite learning ratios are 1 for( int i = 0 ; i < 4 ; i++ ) for( int j = 0 ; j < 3 ; j++ ) { N[i].ConnectWith( &N[4 + j] ); for( int k = 0 ; k < 3 ; k++ ) N[4 + j].ConnectWith( &N[7 + k] ); } IOListData data1; // INPUT | OUTPUT // I1 I2 I3 I4 | O1 O2 O3 data1.push_back( IOData( 4 , 3 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ) ); data1.push_back( IOData( 4 , 3 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 ) ); data1.push_back( IOData( 4 , 3 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 ) ); data1.push_back( IOData( 4 , 3 , 0.0 , 0.0 , 0.0 , 1.0 , 1.0 , 0.0 , 0.0 ) ); bool POK = true; const double Epsilon = 0.2; int cnt = 0; for( vector<IOData>::iterator it = data1.begin() ; it != data1.end() ; ) { for( int i = 0 ; i < (int)it->input.size() ; i++ ) N[i].SetInputValue( it->input[i] ); for( int i = 0 ; i < (int)it->input.size() ; i++ ) N[i].Depolarization(); bool IOOK = false; while( !IOOK ) { IOOK = true; for( int i = 0 ; i < (int)it->output.size() ; i++ ) { const double v1 = it->output[i]; const double v2 = N[4 + i].GetResult(); if( fabs( v1 - v2 ) > Epsilon ) { N[4 + i].Adjust( it->output[i] ); IOOK = false; } } cout << ++cnt << ") " << POK << endl; } for( int i = 0 ; i < 10 ; i++ ) N[i].Refractory(); if( !IOOK ) it = data1.begin(); else ++it; } tron << endl << "after a small adjustment on " << cnt << " turns"; for( int i = 0 ; i < 7 ; i++ ) N[i].Trace( &tron ); tron << endl << "TEST all IO data just for sure..." << endl; for( vector<IOData>::iterator it = data1.begin() ; it != data1.end() ; ++it ) { tron << "INPUT: "; SaveEach( it->input.begin() , it->input.end() , ostream_iterator<double>( tron , " " ) ); for( int i = 0 ; i < (int)it->input.size() ; i++ ) N[i].SetInputValue( it->input[i] ); for( int i = 0 ; i < (int)it->input.size() ; i++ ) N[i].Depolarization(); tron << endl << " OUTPUT: " << endl; for( int i = 0 ; i < (int)it->output.size() ; i++ ) tron << "\t( " << N[4 + i].GetResult() << " ) " << string( N[4 +i].ActionPotential() ? " T " : " F " ) << " [" << it->output[i] << "] , "; tron << endl; for( int i = 0 ; i < 10 ; i++ ) N[i].Refractory(); } return 0; } int TestInverse( const string ) { Neuron in; Neuron inv; in.ConnectTo( &inv ); cout << "Tracing NOT:" << endl; tron << "Tracing NOT:" << endl; for( int i = 0 ; i < 40 ; i++ ) { inv.SetInputValue( 1.0 ); const double v = (double)((int)Random( 0 , 2 , true ) == 0 ? 0.0 : 1.0); in.SetInputValue( v ); in.Depolarization(); cout << i << ") " << " NOT " << v << " ---> " << (int)(inv.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << " NOT " << v << " ---> " << (int)(inv.ActionPotential() ? 1 : 0); if( inv.ActionPotential() ) if( v == 1.0 ) tron << " **** ERROR *** "; tron << endl; } return 0; } int EORTest( const string ) { cout << "create a sample meural Process of EOR Natural method" << endl; tron << "create a sample meural Process of EOR Natural method" << endl; double in[4][2] = { { 0.0 , 0.0 } , { 1.0 , 0.0 } , { 0.0 , 1.0 } , { 1.0 , 1.0 } }; Neuron n1 , n2 , inv , kn; n1.ConnectWith( &n2 ); SynapticKnob *sk = n2.ConnectTo( &inv ); kn.SetInputValue( 1.0 ); kn.ConnectTo( sk ); kn.ConnectWith( &kn ); cout << "Tracing EOR:" << endl; tron << "Tracing EOR:" << endl; for( int i = 0 ; i < 4 ; i++ ) { const int at = i >= 4 ? (int)Random( 0 , 4 , true ) : i; n1.SetInputValue( in[at][0] ); n2.SetInputValue( in[at][1] ); cout << i << ") " << in[at][0] << " EOR " << in[at][1] << " : " ; tron << i << ") " << in[at][0] << " EOR " << in[at][1] << " : " ; n1.Depolarization(); inv.SetInputValue( 1.0 ); tron << " --> " << " (n2 = " << n2.GetResult() <<" ) --> "; n2.Depolarization(); cout << (int)(inv.ActionPotential() ? 1 : 0) << endl; tron << (int)(inv.ActionPotential() ? 1 : 0); if( inv.ActionPotential() ) if( in[at][0] == in[at][1] ) tron << " **** ERROR *** "; tron << endl; } return 0; } int BoolTest( const string ) { cout << "create a sample meural Process of boolean operators with less neurons and flexible threshold" << endl; tron << "\n\ncreate a sample meural Process of boolean operators with less neurons and flexible threshold" << endl; Neuron n1 , n2 , thv; double in[4][2] = { { 0.0 , 0.0 } , { 1.0 , 0.0 } , { 0.0 , 1.0 } , { 1.0 , 1.0 } }; n1.ConnectWith( &n2 );// n2.ConnectWith( &n2 ); thv.ConnectTo( &n2 ); thv.ConnectWith( &thv ); cout << "Tracing OR:" << endl; tron << "Tracing OR:" << endl; for( int i = 0 ; i < 40 ; i++ ) { thv.SetInputValue( 0 ); thv.Depolarization(); const int at = i >= 4 ? (int)Random( 0 , 4 , true ) : i; n1.SetInputValue( in[at][0] ); n2.SetInputValue( in[at][1] ); n1.Depolarization(); cout << i << ") " << in[at][0] << " OR " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << in[at][0] << " OR " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0); if( n2.ActionPotential() ) if( !(in[at][0] || in[at][1]) ) tron << " **** ERROR *** "; tron << endl; } cout << endl; tron << endl; cout << "Tracing AND:" << endl; tron << "Tracing AND:" << endl; for( int i = 0 ; i < 40 ; i++ ) { thv.SetInputValue( 1.0 ); thv.Depolarization(); const int at = i >= 4 ? (int)Random( 0 , 4 , true ) : i; n1.SetInputValue( in[at][0] ); n2.SetInputValue( in[at][1] ); n1.Depolarization(); cout << i << ") " << in[at][0] << " AND " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << in[at][0] << " AND " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0); if( n2.ActionPotential() ) if( !(in[at][0] && in[at][1]) ) tron << " **** ERROR *** "; tron << endl; } cout << endl; tron << endl; Neuron inv; n2.ConnectTo( &inv ); cout << "Tracing NOR:" << endl; tron << "Tracing NOR:" << endl; for( int i = 0 ; i < 40 ; i++ ) { thv.SetInputValue( 0 ); thv.Depolarization(); const int at = i >= 4 ? (int)Random( 0 , 4 , true ) : i; n1.SetInputValue( in[at][0] ); n2.SetInputValue( in[at][1] ); n1.Depolarization(); inv.SetInputValue( 1.0 ); n2.Depolarization(); cout << i << ") " << in[at][0] << " NOR " << in[at][1] << " ---> " << (int)(inv.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << in[at][0] << " NOR " << in[at][1] << " ---> " << (int)(inv.ActionPotential() ? 1 : 0); if( inv.ActionPotential() ) if( in[at][0] || in[at][1] ) tron << " **** ERROR *** "; tron << endl; } cout << endl; tron << endl; cout << "Tracing NAND:" << endl; tron << "Tracing NAND:" << endl; for( int i = 0 ; i < 40 ; i++ ) { thv.SetInputValue( 1.0 ); thv.Depolarization(); const int at = i >= 4 ? (int)Random( 0 , 4 , true ) : i; n1.SetInputValue( in[at][0] ); n2.SetInputValue( in[at][1] ); n1.Depolarization(); cout << i << ") " << in[at][0] << " AND " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << in[at][0] << " AND " << in[at][1] << " ---> " << (int)(n2.ActionPotential() ? 1 : 0); if( n2.ActionPotential() ) if( !(in[at][0] && in[at][1]) ) tron << " **** ERROR *** "; tron << "\t"; inv.SetInputValue( 1.0 ); n2.Depolarization(); cout << i << ") " << in[at][0] << " NAND " << in[at][1] << " ---> " << (int)(inv.ActionPotential() ? 1 : 0) << endl; tron << i << ") " << in[at][0] << " NAND " << in[at][1] << " ---> " << (int)(inv.ActionPotential() ? 1 : 0); if( inv.ActionPotential() ) if( (in[at][0] && in[at][1]) ) tron << " **** ERROR *** "; tron << endl; } cout << endl; tron << endl; return 0; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -