#include #include #include #include #include using N=knp::neuron_traits::neuron_parameters; using P=knp::core::Population; using R=knp::core::Projection; int main(int argc,char**argv)try{ if(argc<10)throw std::runtime_error("thr weight duplicates input_ticks initial diff reset leak steps [negthr]"); int thr=std::stoi(argv[1]),weight=std::stoi(argv[2]),dups=std::stoi(argv[3]),input_ticks=std::stoi(argv[4]),initial=std::stoi(argv[5]),diff=std::stoi(argv[6]),reset=std::stoi(argv[7]),leak=std::stoi(argv[8]),steps=std::stoi(argv[9]),neg=argc>10?std::stoi(argv[10]):0; auto backend=knp::backends::altai::AltAIBackend::create();auto devices=backend->get_devices();bool selected=false; for(auto &d:devices)if(dynamic_cast(d.get())){std::cout<<"DEVICE "<get_name()<<"\n";backend->select_device(std::move(d));selected=true;break;} if(!selected)throw std::runtime_error("GM missing"); N hp;hp.activation_threshold_=thr;hp.potential_=initial;hp.negative_activation_threshold_=neg;hp.is_diff_=diff;hp.is_reset_=reset;hp.potential_leak_=leak;hp.saturate_=true; P hidden([hp](size_t){return hp;},1),output([](size_t){N n;n.activation_threshold_=1;n.negative_activation_threshold_=0;n.is_reset_=true;return n;},1); auto h=hidden.get_uid(),o=output.get_uid();R inp(knp::core::UID{false},h,[weight](size_t)->std::optional{return R::Synapse{{float(weight),1,knp::synapse_traits::OutputType::EXCITATORY},0,0};},1); R read(h,o,[](size_t)->std::optional{return R::Synapse{{1,1,knp::synapse_traits::OutputType::EXCITATORY},0,0};},1);auto iid=inp.get_uid(); knp::framework::Network net;net.add_population(std::move(hidden));net.add_population(std::move(output));net.add_projection(std::move(inp));net.add_projection(std::move(read));knp::framework::Model model(std::move(net));knp::core::UID in,ho,oo;model.add_input_channel(in,iid);model.add_output_channel(ho,h);model.add_output_channel(oo,o); knp::framework::ModelExecutor exec(model,backend,{{in,[dups,input_ticks](knp::core::Step s){return s(input_ticks)?knp::core::messaging::SpikeData(dups,0):knp::core::messaging::SpikeData{};}}});exec.start([steps](size_t s){return s(steps);}); for(auto channel:{ho,oo}){auto spikes=exec.get_loader().get_output_channel(channel).update();std::cout<<"RESULT "<<(channel==ho?"H":"O");for(auto&m:spikes)for(auto i:m.neuron_indexes_)std::cout<<" "<