📄 dlanguage.cpp
字号:
nmap[s] = neuinfo(layername, i, &inhibitor); else if( layername == "input_layer" ) nmap[s] = neuinfo(layername, i, (neuin[i % neuin.size()])); else if( layername == "output_layer" ) nmap[s] = neuinfo(layername, i, (neuout[i % neuout.size()])); else if( layername == "hidden_layer" ) { ostringstream oss; oss << i; tneuron *neu = new tneuron((synch ? "shidden(" : "dhidden(") + oss.str() + ")", synch ? sgate_sig_hv_period : dgate_sig_hv_period, synch ? sgate_thr_hv_period : dgate_thr_hv_period, a1_offset, a1_offset+(synch ? sgate_hidden_thr_raise : dgate_hidden_thr_raise) ); nmap[s] = neuinfo(layername, i, neu); neuhid.push_back(neu); } else { cout << "Unknown layer name " << layername << endl; abort(); } } ifs >> s; } else if( s == "connection" ) { string dstname; int nconn; ifs >> dstname >> nconn; if( nmap.find(dstname) == nmap.end() ) { cout << "unknown neuron " << dstname << endl; abort();} if( debug_readfile ) cout << "connection " << nconn << endl; tneuron_base *dest = nmap[dstname].ref; for( int i=0; i<nconn; i++ ) { string srcname; real weight; int idelay; ifs >> srcname >> weight >> idelay; if( nmap.find(srcname)== nmap.end() ) { cout << "unknown neuron " << srcname << endl; abort();} tneuron_base *src = nmap[srcname].ref; weight *= weight_scale; if( nmap[srcname].layername == "a1_layer" ) { tsynapse *p1, *p2, *p3 = NULL; real delay = delay1 - inhibitor_delay; if( nmap[dstname].layername == "hidden_layer" ) delay += -hidden_offset; weight += a1_offset; real inhibitor_fix = 0.0; if( ! synch ) { weight -= a1_offset; incoindet.addSynapse(p3 = new tsynapse(*dest, delay - 0.00002 - incoindet_delay - coindet_offset, ((weight < 0 ? weight : 0) - inhibitor_suppress_weight)) );// inhibitor.addSynapse(p3 = new tsynapse(*dest, delay + 0.003 - 0.00001 - incoindet_delay , 0.3)) ;// inhibitor.addSynapse(p2 = new tsynapse(*dest, delay + coindet_duration_period, 1.0 )); inhibitor_fix = ((weight < 0 ? weight : 0) - inhibitor_suppress_weight) * pow(decay_level, (delayed_gate_gap + coindet_offset) / coindet_duration_period );// cout << nmap[dstname].layername << "(" << nmap[dstname].nneuron << ") weight=" << weight << ", level=" << decay_level << ", pow=" << pow(decay_level, (delayed_gate_gap + coindet_offset) / coindet_duration_period ) << ", fix=" << inhibitor_fix << endl; weight += a1_offset; } coindet.addSynapse(p1 = new tsynapse(*dest, delay + (! synch ? -coindet_duration_period : - 0.00001), ((weight < 0 ? weight : 0) - coindet_suppress_weight)/sqrt(decay_level))); coindet.addSynapse(p2 = new tsynapse(*dest, delay, ((weight > 0 ? weight : 0) + coindet_suppress_weight)*sqrt(decay_level) - inhibitor_fix - (!synch ? delay_weight_decrease : synch_weight_decrease)));// if( nmap[dstname].layername == "output_layer" && // ( nmap[dstname].nneuron == str_to_wordid["the"] || nmap[dstname].nneuron == NWORDS + pos_det // || nmap[dstname].nneuron == str_to_wordid["girl"] || nmap[dstname].nneuron == NWORDS + pos_n ))// {// cout << "debug synapse " << nmap[srcname].nneuron << " -> " << nmap[dstname].nneuron << endl;// p1->setDeb(true);// p2->setDeb(true);// if( p3 )// p3->setDeb(true);// } } else { real delay = (nmap[srcname].layername == "input_layer" && nmap[srcname].nneuron >= neuin.size()) ? delay1 + delay_input_gap : delay1; if( nmap[srcname].layername == "hidden_layer" ) delay = hidden_offset; else if( nmap[dstname].layername == "hidden_layer" ) delay -= hidden_offset; tsynapse *p; if( weight < 0.0 ) { delay -= synch ? synch_minus_preceding : delay_minus_preceding; if( !synch ) weight /= pow(decay_level, delay_minus_preceding / coindet_duration_period ); } src->addSynapse(p = new tsynapse(*dest, delay - (! synch ? coindet_offset : 0), weight));// if( nmap[dstname].nneuron == str_to_wordid["the"] || nmap[dstname].nneuron == NWORDS + pos_det // || nmap[dstname].nneuron == str_to_wordid["girl"] || nmap[dstname].nneuron == NWORDS + pos_n )// {// cout << "debug synapse " << nmap[srcname].nneuron << " -> " << nmap[dstname].nneuron << endl;// p->setDeb(true);// } } } ifs >> s; } else break; } }}int main(int argc, char **argv){ cout << "Punnets language simulation program (c) 2003 Makino Takaki." << endl; cout << "Punnets is free software, covered by the GNU General Public License." << endl; cout << endl; const char *datafilename = "lang.dat"; const char *plotfilename = "lang.plt"; const unsigned int nexts = NWORDS + NELEMS; vector<tneuron_ext *> exts(nexts); vector<tneuron *> hidden; vector<tneuron *> sgates(nexts); vector<tneuron *> dgates(nexts); tneuron inhibitor("inhibitor", 0.0005, 0.0005, 1.0, 128.0); tneuron coindet("coindet", 0.003, 0.05, 1.0, 5.0); tneuron incoindet("incoindet", 0.003, 0.003, 1.0, 2.0); inhibitor.addSynapse(new tsynapse(coindet, inhibitor_delay, 0.67)); inhibitor.addSynapse(new tsynapse(coindet, inhibitor_delay + delayed_gate_gap, 0.67)); inhibitor.addSynapse(new tsynapse(incoindet, incoindet_delay, 1.2)); inhibitor.addSynapse(new tsynapse(incoindet, incoindet_delay + delayed_gate_gap, 1.2)); coindet.addSynapse(new tsynapse(incoindet, incoindet_delay - inhibitor_delay - 0.0015, -4)); for( unsigned int i=0; i<NWORDS; i++ ) str_to_wordid[ words[i].word ] = i; tscheduler scheduler; ofstream ofs(datafilename); cout << "Produce simulation log file '" << datafilename << "'." << endl; tlogger logger(ofs, 0.001, 0.01, test_until);// tlogger logger(ofs, 0.00001, 0.609,0.621); for( unsigned int i=0; i<nexts; i++ ) { ostringstream oss; exts[i] = new tneuron_ext("repre'" + (i < NWORDS ? words[i].word : posstrs[i-NWORDS]) + "'", 0.0045); sgates[i] = new tneuron("sgate'" + (i < NWORDS ? words[i].word : posstrs[i-NWORDS]) + "'", sgate_sig_hv_period, sgate_thr_hv_period, a1_offset, a1_offset+64 ); dgates[i] = new tneuron("dgate'" + (i < NWORDS ? words[i].word : posstrs[i-NWORDS]) + "'", dgate_sig_hv_period, dgate_thr_hv_period, a1_offset, a1_offset+64 );//if(! test_applier) {// exts[i]->addExt(new func_const(-1.3));// exts[i]->addExt(new func_sine(1.0 /* width */, 8 * 2*M_PI /* angle velo */, 0.0 /* phase */ ));// exts[i]->addExt(new func_sineshot_int(1 /* width */, 1.6 * 2*M_PI /* angle velo */ ));// inhibitor.addSynapse(new tsynapse_addfunc(*exts[i], 0.0001, new func_sineshot(-0.7, (1/0.027) * 2*M_PI, -1.0), -0.8));//} exts[i]->addExt(new func_const(-1.4));if( ! test_applier ) { exts[i]->addExt(new func_sine(1.0 /* width */, 8 * 2*M_PI /* angle velo */, 0.0 /* phase */ )); exts[i]->addExt(new func_sineshot_int(1.27 /* width */, 1.59 * 2*M_PI /* angle velo */ )); inhibitor.addSynapse(new tsynapse_addfunc(*exts[i], 0.0001, new func_sineshot(-0.7, (1/0.021) * 2*M_PI, -1.0), new func_sineshot::message_set_t0, -0.25));} exts[i]->addSynapse(new tsynapse(inhibitor, inhibitor_delay, 1.5)); exts[i]->addSynapse(new tsynapse(*exts[i], inhibitor_delay, -4.0)); exts[i]->setLoopBack(scheduler, 0.0);if( ! test_applier ) { sgates[i]->addSynapse(new tsynapse(*exts[i], gates_delay, 4.0)); dgates[i]->addSynapse(new tsynapse(*exts[i], gates_delay, 5.5));} if( i == str_to_wordid["the"] || i == NWORDS + pos_det || i == str_to_wordid["Mary"] || i == NWORDS + pos_pn3 || i == str_to_wordid["girl"] || i == NWORDS + pos_n || i == str_to_wordid["loves"] || i == NWORDS + pos_vt || i == str_to_wordid["(lover)"] || i == NWORDS + pos_vt_subj ) { real off = (i == str_to_wordid["Mary"] || i == NWORDS + pos_pn3) ? 40 : (i == str_to_wordid["(lover)"] || i == NWORDS + pos_vt_subj) ? 30 : (i == str_to_wordid["loves"] || i == NWORDS + pos_vt) ? 20 : (i == str_to_wordid["the"] || i == NWORDS + pos_det) ? 10 : 0; off += (i >= NWORDS) ? 4 : 0; logger.add(*exts[i], 0, false, false, off * 3.5 / 5); // logger.add(*sgates[i], 0, false, false, off); // logger.add(*dgates[i], 0, false, false, 1.0 + off);// exts[i]->setDeb(true);// sgates[i]->setDeb(true);// dgates[i]->setDeb(true); } }// logger.add( inhibitor, 0, false, false, -8.0 ); read_file(exts, hidden, sgates, inhibitor, inhibitor, "synch.dat", synchro_gate_delay, 0.0 , 1.0 , synchro_hidden_offset, true); read_file(exts, hidden, dgates, incoindet, coindet , "delay.dat", delayed_gate_delay, delayed_gate_gap, exp(-(M_LN2 / dgate_sig_hv_period)*(coindet_duration_period)) , delayed_hidden_offset, false ); ofstream ofs2(plotfilename); cout << "Produce GNUPLOT plotting file '" << plotfilename << "'." << endl; logger.gnuplot_def(ofs2, datafilename); logger.schedule(scheduler); scheduler.scheduleEvent( 0.61, makePulse( * exts[ str_to_wordid[ "Mary" ] ], 5.0 ) ); scheduler.scheduleEvent( 0.975, makePulse( * exts[ str_to_wordid[ "loves" ] ], 5.0 ) ); scheduler.scheduleEvent( 1.725, makePulse( * exts[ str_to_wordid[ "the" ] ], 5.0 ) ); scheduler.scheduleEvent( 2.225, makePulse( * exts[ str_to_wordid[ "girl" ] ], 5.0 ) ); scheduler.run(test_until); cout << "Simulation finished." << endl; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -