22 lines
2.7 KiB
C++
22 lines
2.7 KiB
C++
#include <knp/backends/altai/backend.h>
|
|
#include <knp/devices/altai_npu.h>
|
|
#include <knp/framework/model_executor.h>
|
|
#include <knp/framework/network.h>
|
|
#include <iostream>
|
|
using N=knp::neuron_traits::neuron_parameters<knp::neuron_traits::AltAILIF>;
|
|
using P=knp::core::Population<knp::neuron_traits::AltAILIF>;
|
|
using R=knp::core::Projection<knp::synapse_traits::DeltaSynapse>;
|
|
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<knp::devices::altai::AltAI_GM*>(d.get())){std::cout<<"DEVICE "<<d->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<R::Synapse>{return R::Synapse{{float(weight),1,knp::synapse_traits::OutputType::EXCITATORY},0,0};},1);
|
|
R read(h,o,[](size_t)->std::optional<R::Synapse>{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<static_cast<size_t>(input_ticks)?knp::core::messaging::SpikeData(dups,0):knp::core::messaging::SpikeData{};}}});exec.start([steps](size_t s){return s<static_cast<size_t>(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<<" "<<m.header_.send_time_;std::cout<<"\n";}
|
|
}catch(const std::exception&e){std::cerr<<"ERROR "<<e.what()<<"\n";return 1;}
|