Пример #1
0
nemo::Network*
construct(unsigned ncount, unsigned scount, unsigned dmax, bool stdp)
{
	rng_t rng;
	/* Neuron parameters and weights are partially randomised */
	urng_t randomParameter(rng, boost::uniform_real<double>(0, 1));
	uirng_t randomTarget(rng, boost::uniform_int<>(0, ncount-1));
	uirng_t randomDelay(rng, boost::uniform_int<>(1, dmax));

	nemo::Network* net = new nemo::Network();

	for(unsigned nidx=0; nidx < ncount; ++nidx) {
		if(nidx < (ncount * 4) / 5) { // excitatory
			addExcitatoryNeuron(net, nidx, randomParameter);
			for(unsigned s = 0; s < scount; ++s) {
				net->addSynapse(nidx, randomTarget(), randomDelay(), 0.5f * float(randomParameter()), stdp);
			}
		} else { // inhibitory
			addInhibitoryNeuron(net, nidx, randomParameter);
			for(unsigned s = 0; s < scount; ++s) {
				net->addSynapse(nidx, randomTarget(), 1U, float(-randomParameter()), 0);
			}
		}
	}
	return net;
}
Пример #2
0
nemo::Network* constructWattsStrogatz(unsigned k, unsigned p, unsigned ncount, unsigned dmax, bool stdp) {
	rng_t rng;
	/* Neuron parameters and weights are partially randomised */
	urng_t randomParameter(rng, boost::uniform_real<double>(0, 1));
	uirng_t randomDelay(rng, boost::uniform_int<>(1, dmax));

	std::vector<std::vector<unsigned> > matrix(ncount, std::vector<unsigned>(ncount));
	networkWattsStrogatz(matrix, ncount, k, p);

	nemo::Network* net = new nemo::Network();

	for ( unsigned nidx = 0; nidx < ncount; ++nidx ) {
		if ( nidx < (ncount * 4) / 5 ) { // excitatory
			addExcitatoryNeuron(net, nidx, randomParameter);
			for ( unsigned j = 0; j < ncount; ++j ) {
				if ( matrix[nidx][j] == 1 )
					net->addSynapse(nidx, j, randomDelay(), 0.5f * float(randomParameter()), stdp);
			}
		}
		else { // inhibitory
			addInhibitoryNeuron(net, nidx, randomParameter);
			for ( unsigned j = 0; j < ncount; ++j ) {
				if ( matrix[nidx][j] == 1 )
					net->addSynapse(nidx, j, 1U, float(-randomParameter()), 0);
			}
		}
	}
	return net;
}
Пример #3
0
/* Used to demonstrate the optimal network for MPI simulations */
nemo::Network* constructSemiRandom(unsigned ncount, unsigned scount, unsigned dmax, bool stdp, unsigned workers, float ratio) {
	rng_t rng;
	/* Neuron parameters and weights are partially randomised */
	urng_t randomParameter(rng, boost::uniform_real<double>(0, 1));
	uirng_t randomDelay(rng, boost::uniform_int<>(1, dmax));

	nemo::Network* net = new nemo::Network();

	/* Firstly, add ncount neurons to the network.
	 * Properties: 80% excitatory, 20% inhibitory.
	 */
	for ( unsigned nidx = 0; nidx < ncount; ++nidx ) {
		if ( nidx < (ncount * 4) / 5 ) { // excitatory
			addExcitatoryNeuron(net, nidx, randomParameter);
		}
		else { // inhibitory
			addInhibitoryNeuron(net, nidx, randomParameter);
		}
	}

	/* Initialize partition counters */
	float avgNeurons = ceil(((float) ncount) / ((float) workers));
	std::vector<unsigned> counters(workers, avgNeurons);
	counters.back() = ncount - (workers - 1) * avgNeurons;

	std::vector<std::pair<nidx_t, nidx_t> > ranges;

	/* Make index ranges for each partition */
	for ( unsigned r = 0; r < workers; r++ ) {
		unsigned start = r * avgNeurons;
		std::pair<unsigned, unsigned> range(start, start + counters[r] - 1);
		ranges.push_back(range);
	}

	for ( unsigned i = 0; i < workers; i++ ) {
		uirng_t randomLocalNeuron(rng, boost::uniform_int<>(ranges[i].first, ranges[i].second));
		unsigned partitionSynapses = counters[i] * scount;
		unsigned globalSynapses = ratio * partitionSynapses;
		unsigned localSynapses = partitionSynapses - globalSynapses;

//		std::cout << "partitionSynapses: " << partitionSynapses << std::endl;
//		std::cout << "localSynapses: " << localSynapses << std::endl;
//		std::cout << "globalSynapses: " << globalSynapses << std::endl;
//		std::cout << std::endl;

		for ( unsigned j = 0; j < localSynapses; j++ ) {
			unsigned source;
			unsigned target;
			while (true) {
				source = randomLocalNeuron();
				target = randomLocalNeuron();
				if ( source != target )
					break;
			}

			if ( randomLocalNeuron() < (ncount * 4) / 5 )
				net->addSynapse(source, target, randomDelay(), 0.5f * float(randomParameter()), stdp);
			else
				net->addSynapse(source, target, 1U, float(-randomParameter()), stdp);
		}

		for ( unsigned j = 0; j < globalSynapses; j++ ) {

			uirng_t randomWorker(rng, boost::uniform_int<>(0, workers - 1));
			unsigned randomNeighbour;
			while (true) {
				randomNeighbour = randomWorker();
				if ( randomNeighbour != i )
					break;
			}

			uirng_t randomGlobalNeuron(rng,
					boost::uniform_int<>(ranges[randomNeighbour].first, ranges[randomNeighbour].second));

			if ( randomLocalNeuron() < (ncount * 4) / 5 )
				net->addSynapse(randomLocalNeuron(), randomGlobalNeuron(), randomDelay(), 0.5f * float(randomParameter()), stdp);
			else
				net->addSynapse(randomLocalNeuron(), randomGlobalNeuron(), 1U, float(-randomParameter()), stdp);

		}
	}

//	std::cout << "net->neuronCount: " << net->neuronCount() << std::endl;
//	std::cout << "net->synapseCount: " << net->synapseCount() << std::endl;
	return net;
}
Пример #4
0
/* Used for debugging */
nemo::Network* simpleNet(unsigned ncount, unsigned dmax, bool stdp) {
	rng_t rng;
	/* Neuron parameters and weights are partially randomised */
	urng_t randomParameter(rng, boost::uniform_real<double>(0, 1));
	uirng_t randomDelay(rng, boost::uniform_int<>(1, dmax));
	nemo::Network* net = new nemo::Network();
	for ( unsigned nidx = 0; nidx < ncount; ++nidx ) {
		if ( nidx < (ncount * 4) / 5 ) { // excitatory
			nemo::random::addExcitatoryNeuron(net, nidx, randomParameter);
			if ( nidx == 0 ) {
				net->addSynapse(nidx, 1, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 6, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 11, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(2, nidx, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(3, nidx, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(4, nidx, randomDelay(), 0.5f * float(randomParameter()), stdp);
			}
			if ( nidx == 8 ) {
				net->addSynapse(nidx, 2, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 7, randomDelay(), 0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 14, randomDelay(), 0.5f * float(randomParameter()), stdp);
			}
		}
		else { // inhibitory
			nemo::random::addInhibitoryNeuron(net, nidx, randomParameter);
			if ( nidx == 13 ) {
				net->addSynapse(nidx, 3, randomDelay(), -0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 8, randomDelay(), -0.5f * float(randomParameter()), stdp);
				net->addSynapse(nidx, 14, randomDelay(), -0.5f * float(randomParameter()), stdp);
			}
		}
	}
	return net;
}