示例#1
0
void TestNeuralNetwork::testFreeElements() {
	bool destroyedNeuron1 = false;
	bool destroyedNeuron2 = false;

	NeuronAdapter *neuron1 = new NeuronAdapter("Neuron1", TransferFunctionAdapter("TF1", 0.0, 1.0), 
							ActivationFunctionAdapter("AF1"), &destroyedNeuron1);

	NeuronAdapter *neuron2 = new NeuronAdapter("Neuron2", TransferFunctionAdapter("TF1", 0.0, 1.0), 
							ActivationFunctionAdapter("AF1"), &destroyedNeuron2);

	NeuralNetwork *net = new NeuralNetwork();

	InterfaceValue *inputValue = new InterfaceValue("/", "Test1");
	InterfaceValue *outputValue = new InterfaceValue("/", "Test1");
	ControlInterfaceAdapter *controller = new ControlInterfaceAdapter();
	controller->mInputValues.append(inputValue);
	controller->mOutputValues.append(outputValue);



	//free elements(false)

	QVERIFY(net->addNeuron(neuron1) == true);
	QVERIFY(net->addNeuron(neuron2) == true);

	net->setControlInterface(controller);

	QCOMPARE(net->getNeurons().size(), 2);
	QVERIFY(net->getNeurons().contains(neuron1));
	QVERIFY(net->getNeurons().contains(neuron2));

	net->freeElements(false);

	QCOMPARE(net->getNeurons().size(), 0);
	QVERIFY(destroyedNeuron1 == false);
	QVERIFY(destroyedNeuron2 == false);

	//free elements(true)

	QVERIFY(net->addNeuron(neuron1) == true);
	QVERIFY(net->addNeuron(neuron2) == true);

	net->setControlInterface(controller);

	QCOMPARE(net->getNeurons().size(), 2);
	QVERIFY(net->getNeurons().contains(neuron1));
	QVERIFY(net->getNeurons().contains(neuron2));

	net->freeElements(true);

	QCOMPARE(net->getNeurons().size(), 0);
	QVERIFY(destroyedNeuron1 == true);
	QVERIFY(destroyedNeuron2 == true);
}
示例#2
0
int main()
{
    NeuralNetwork nn;
    InputNeuron *in1 = new InputNeuron(2);
    InputNeuron *in2 = new InputNeuron(3);
    OutputNeuron *out1 = new OutputNeuron(1);
    nn.addNeuron(in1);
    nn.addNeuron(in2);
    nn.addOutputNeuron(out1);
    out1->setExpectedOutput(1);
    if(nn.connectNeurons(0, 2) &&  nn.connectNeurons(1, 2))
    {
        nn.optimize();
        std::cout << out1->evaluate() << std::endl;
    }
    return 0;
}
示例#3
0
// Chris
void TestNeuralNetwork::testDuplicationAndEquals() {
	TransferFunctionAdapter tfa("TFA", -0.5, 0.5);
	ActivationFunctionAdapter afa("AFA");
	SynapseFunctionAdapter sfa("SFA");

	NeuralNetwork *net = new NeuralNetwork(afa, tfa, sfa);

	ControlInterfaceAdapter controlInterface;
	net->setControlInterface(&controlInterface);

	QVERIFY(net->getControlInterface() == &controlInterface);

	Neuron *neuron1 = new Neuron("Neuron1", tfa, afa, 2001);
	Neuron *neuron2 = new Neuron("Neuron1", tfa, afa, 2002);
	Neuron *neuron3 = new Neuron("Neuron1", tfa, afa, 2003);

	neuron1->setProperty(Neuron::NEURON_TYPE_INPUT);
	neuron3->setProperty(Neuron::NEURON_TYPE_OUTPUT);

	Synapse *synapse1 = Synapse::createSynapse(neuron1, neuron2, 0.5, sfa, 3001);
	Synapse *synapse2 = Synapse::createSynapse(neuron2, neuron3, 1.5, sfa, 3002);
	Synapse *synapse3 = Synapse::createSynapse(neuron3, synapse1, 0.1, sfa, 3003);

	net->addNeuron(neuron1);
	net->addNeuron(neuron2);
	net->addNeuron(neuron3);

	QCOMPARE(net->getNeurons().size(), 3);
	QVERIFY(net->getNeurons().contains(neuron1));
	QVERIFY(net->getNeurons().contains(neuron2));
	QVERIFY(net->getNeurons().contains(neuron3));

	QCOMPARE(net->getSynapses().size(), 3);
	QVERIFY(net->getSynapses().contains(synapse1));
	QVERIFY(net->getSynapses().contains(synapse2));
	QVERIFY(net->getSynapses().contains(synapse3));
	
	
	NeuralNetwork *copy = net->createCopy();

	//control interface is NOT copied.
	QVERIFY(copy->getControlInterface() == 0);

	QCOMPARE(copy->getNeurons().size(), 3);
	QVERIFY(!copy->getNeurons().contains(neuron1));
	QVERIFY(!copy->getNeurons().contains(neuron2));
	QVERIFY(!copy->getNeurons().contains(neuron3));

	QCOMPARE(copy->getSynapses().size(), 3);
	QVERIFY(!copy->getSynapses().contains(synapse1));
	QVERIFY(!copy->getSynapses().contains(synapse2));
	QVERIFY(!copy->getSynapses().contains(synapse3));

	Neuron *cNeuron1 = NeuralNetwork::selectNeuronById(neuron1->getId(), copy->getNeurons());
	Neuron *cNeuron2 = NeuralNetwork::selectNeuronById(neuron2->getId(), copy->getNeurons());
	Neuron *cNeuron3 = NeuralNetwork::selectNeuronById(neuron3->getId(), copy->getNeurons());

	Synapse *cSynapse1 = NeuralNetwork::selectSynapseById(synapse1->getId(), copy->getSynapses());
	Synapse *cSynapse2 = NeuralNetwork::selectSynapseById(synapse2->getId(), copy->getSynapses());
	Synapse *cSynapse3 = NeuralNetwork::selectSynapseById(synapse3->getId(), copy->getSynapses());
	
	QVERIFY(cNeuron1 != 0);
	QVERIFY(cNeuron2 != 0);
	QVERIFY(cNeuron3 != 0);

	QVERIFY(cNeuron1->equals(neuron1));
	QVERIFY(cNeuron2->equals(neuron2));
	QVERIFY(cNeuron3->equals(neuron3));

	QCOMPARE(cNeuron1->getId(), (qulonglong) 2001);
	QCOMPARE(cNeuron2->getId(), (qulonglong) 2002);
	QCOMPARE(cNeuron3->getId(), (qulonglong) 2003);

	QVERIFY(net->getInputNeurons().size() == 1);
	QVERIFY(copy->getInputNeurons().size() == 1);
	QVERIFY(net->getInputNeurons().at(0) == neuron1);
	QVERIFY(copy->getInputNeurons().at(0) == cNeuron1);
	QVERIFY(net->getOutputNeurons().size() == 1);
	QVERIFY(copy->getOutputNeurons().size() == 1);
	QVERIFY(net->getOutputNeurons().at(0) == neuron3);
	QVERIFY(copy->getOutputNeurons().at(0) == cNeuron3);

	QVERIFY(cSynapse1 != 0);
	QVERIFY(cSynapse2 != 0);
	QVERIFY(cSynapse3 != 0);

	QVERIFY(cSynapse1->equals(synapse1));
	QVERIFY(cSynapse2->equals(synapse2));
	QVERIFY(cSynapse3->equals(synapse3));

	QCOMPARE(cSynapse1->getId(), (qulonglong) 3001);
	QCOMPARE(cSynapse2->getId(), (qulonglong) 3002);
	QCOMPARE(cSynapse3->getId(), (qulonglong) 3003);

	QVERIFY(cSynapse1->getSource() == cNeuron1);
	QVERIFY(cSynapse2->getSource() == cNeuron2);
	QVERIFY(cSynapse3->getSource() == cNeuron3);
	QVERIFY(cSynapse1->getTarget() == cNeuron2);
	QVERIFY(cSynapse2->getTarget() == cNeuron3);
	QVERIFY(cSynapse3->getTarget() == cSynapse1);

	QVERIFY(net->equals(copy));

	//apply changes

	//change properties
	net->setProperty("TestP", "Test");
	QVERIFY(net->equals(copy) == false);
	copy->setProperty("TestP", "Test");
	QVERIFY(net->equals(copy) == true);

	//neuron bias
	neuron1->getBiasValue().set(0.001);
	QVERIFY(net->equals(copy) == false);
	cNeuron1->getBiasValue().set(0.001);
	QVERIFY(net->equals(copy) == true);

	//synapse target
	synapse3->setTarget(synapse2);
	QVERIFY(net->equals(copy) == false);
	cSynapse3->setTarget(cSynapse2);
	QVERIFY(net->equals(copy) == true);

	//default functions
	net->setDefaultActivationFunction(ActivationFunctionAdapter("Afa1"));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultActivationFunction(ActivationFunctionAdapter("WrongName"));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultActivationFunction(ActivationFunctionAdapter("Afa1"));
	QVERIFY(net->equals(copy) == true);

	net->setDefaultSynapseFunction(SynapseFunctionAdapter("Afa1"));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultSynapseFunction(SynapseFunctionAdapter("WrongName"));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultSynapseFunction(SynapseFunctionAdapter("Afa1"));
	QVERIFY(net->equals(copy) == true);

	net->setDefaultTransferFunction(TransferFunctionAdapter("Afa1", 0.1, 0.5));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultTransferFunction(TransferFunctionAdapter("WrongName", 0.1, 0.5));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultTransferFunction(TransferFunctionAdapter("Afa1", 0.3, 0.5));
	QVERIFY(net->equals(copy) == false);
	copy->setDefaultTransferFunction(TransferFunctionAdapter("Afa1", 0.1, 0.5));
	QVERIFY(net->equals(copy) == true);

	//input / output neurons
	neuron1->removeProperty(Neuron::NEURON_TYPE_INPUT);
	QVERIFY(net->equals(copy) == false);
	cNeuron1->removeProperty(Neuron::NEURON_TYPE_INPUT);
	QVERIFY(net->equals(copy) == true);	
	
	delete net;
	delete copy;
}
void NetworkAgentControlParser::connectNetworksToInterfaces() {
	NeuralNetworkManager *nnm = Neuro::getNeuralNetworkManager();
	bool addedNetwork = false;

	QStringList params = mNetLoaderArgument->getParameters();

	int numberOfEntries = mNetLoaderArgument->getNumberOfEntries();

	for(int i = 0; i < numberOfEntries; ++i) {
		QStringList paramSet;
		if(params.size() > i) {
			paramSet = params.at(i).split(" ");
		}
		if(paramSet.size() > 2) {
			Core::log("NetworkAgentControlParser: Could not interpret command line argument. ");
			continue;
		}
		QString agentName = "";
		QString networkFile = "";
		
		if(paramSet.size() > 0) {
			if(paramSet.at(0).trimmed() == "c") {
				networkFile = "c";
			}
			else {
				agentName = paramSet.at(0);
			}
		}
		
		if(paramSet.size() > 1) {
			networkFile = paramSet.at(1);
		}
		
		if(networkFile.trimmed() == "c") {
			networkFile = "";
			//use most recent network from the editor for this agent. 
			QString filePrefix = Core::getInstance()->getConfigDirectoryPath() + "/properties";
			QFile file(filePrefix + "/recentNetworks.txt");
			if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
				QTextStream input(&file);
				if(!input.atEnd()) {
					networkFile = input.readLine();
				}
			}
			file.close();
		}
		
		PhysicsManager *pm = Physics::getPhysicsManager();

		SimObjectGroup *agent = 0;
		if(agentName == "" && !pm->getSimObjectGroups().empty()) {
			agent = pm->getSimObjectGroups().at(0);
		}
		else {
			agent = pm->getSimObjectGroup(agentName);
		}

		if(agent == 0) {
			Core::log(QString("NetworkAgentControlParser: Could not find an agent with name [")
					.append(agentName).append("]! [Skipping]"));
			continue;
		}
		
		QString errorMessage;
		QList<QString> messages;

		NeuralNetwork *net = 0;

		//check if there is already a network that can be reused.
		QList<NeuralNetwork*> networks = nnm->getNeuralNetworks();
		if(networks.size() > i) {
			net = networks.at(i);
		}

		if(net == 0) {
			if(networkFile == "") {
				//create standard network with matching number of input/output neurons.
	
				net = new ModularNeuralNetwork();
				int numberOfInputs = agent->getOutputValues().size();
				int numberOfOutputs = agent->getInputValues().size();
	
				for(int i = 0; i < numberOfInputs; ++i) {
					Neuron *neuron = new Neuron("Neuron" + QString::number(i),
											*net->getDefaultTransferFunction(),
											*net->getDefaultActivationFunction());
					neuron->setProperty(Neuron::NEURON_TYPE_INPUT);
					net->addNeuron(neuron);
				}
				for(int i = 0; i < numberOfOutputs; ++i) {
					Neuron *neuron = new Neuron("Neuron" + QString::number(i),
											*net->getDefaultTransferFunction(),
											*net->getDefaultActivationFunction());
					neuron->setProperty(Neuron::NEURON_TYPE_OUTPUT);
					net->addNeuron(neuron);
				}
		
			}
			else {
				net = NeuralNetworkIO::createNetworkFromFile(
								networkFile, &errorMessage, &messages);
			}
		}

		if(!messages.empty()) {
			Core::log(QString("NetworkAgentControlParser: ").append(errorMessage));
			for(int i = 0; i < messages.size(); ++i) {
				Core::log(QString("NetworkAgentControlParser: ").append(messages.at(i)));
			}
		}

		if(net == 0) {
			Core::log(QString("NetworkAgentControlParser: Could not load network from file [")
					.append(networkFile).append("]! [Skipping]"));
			continue;
		}

		agent->setController(net);
		
		
		nnm->addNeuralNetwork(net); 
		addedNetwork = true;
		
		net->reset();

		Core::log(QString("NetworkAgentControlParser: Loaded network from file [")
					.append(networkFile).append("] to control agent [")
					.append(agentName).append("]!"));
	}

	if(addedNetwork) {
		nnm->triggerCurrentNetworksReplacedEvent();
	}
}