diff --git a/libraries/README.md b/libraries/README.md
index 7970c0e99e..f0484ec710 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -26,6 +26,7 @@
- [A Guide to Apache Commons DbUtils](http://www.baeldung.com/apache-commons-dbutils)
- [Introduction to Awaitility](http://www.baeldung.com/awaitlity-testing)
- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog)
+- [Introduction to Neuroph](http://www.baeldung.com/intro-to-neuroph)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/pom.xml b/libraries/pom.xml
index d80c9ffdae..c5e1f64594 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -7,7 +7,6 @@
1.0.0-SNAPSHOT
4.0.0
-
libraries
libraries
@@ -71,9 +70,51 @@
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.0.2
+
+
+ **/log4j.properties
+
+
+
+ com.baeldung.neuroph.NeurophXOR
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.18.1
+
+
+ test
+ test
+
+ test
+
+
+
+ test/java/com/baeldung/neuroph/XORTest.java
+
+
+
+
+
+
+
+
+ org.beykery
+ neuroph
+ ${neuroph.version}
+
cglib
@@ -327,7 +368,6 @@
quartz
2.3.0
-
one.util
streamex
@@ -432,6 +472,7 @@
2.5
1.2.0
2.8.5
+ 2.92
1.4.0
1.24.0
1.1.3-rc.5
diff --git a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java b/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java
new file mode 100644
index 0000000000..fb6a01d4c1
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java
@@ -0,0 +1,73 @@
+package com.baeldung.neuroph;
+
+import org.neuroph.core.Layer;
+import org.neuroph.core.NeuralNetwork;
+import org.neuroph.core.Neuron;
+import org.neuroph.core.data.DataSet;
+import org.neuroph.core.data.DataSetRow;
+import org.neuroph.nnet.learning.BackPropagation;
+import org.neuroph.util.ConnectionFactory;
+import org.neuroph.util.NeuralNetworkType;
+
+public class NeurophXOR {
+
+ public static NeuralNetwork assembleNeuralNetwork() {
+
+ Layer inputLayer = new Layer();
+ inputLayer.addNeuron(new Neuron());
+ inputLayer.addNeuron(new Neuron());
+
+ Layer hiddenLayerOne = new Layer();
+ hiddenLayerOne.addNeuron(new Neuron());
+ hiddenLayerOne.addNeuron(new Neuron());
+ hiddenLayerOne.addNeuron(new Neuron());
+ hiddenLayerOne.addNeuron(new Neuron());
+
+ Layer hiddenLayerTwo = new Layer();
+ hiddenLayerTwo.addNeuron(new Neuron());
+ hiddenLayerTwo.addNeuron(new Neuron());
+ hiddenLayerTwo.addNeuron(new Neuron());
+ hiddenLayerTwo.addNeuron(new Neuron());
+
+ Layer outputLayer = new Layer();
+ outputLayer.addNeuron(new Neuron());
+
+ NeuralNetwork ann = new NeuralNetwork();
+
+ ann.addLayer(0, inputLayer);
+ ann.addLayer(1, hiddenLayerOne);
+ ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
+ ann.addLayer(2, hiddenLayerTwo);
+ ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2));
+ ann.addLayer(3, outputLayer);
+ ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3));
+ ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(ann.getLayersCount()-1), false);
+
+ ann.setInputNeurons(inputLayer.getNeurons());
+ ann.setOutputNeurons(outputLayer.getNeurons());
+
+ ann.setNetworkType(NeuralNetworkType.MULTI_LAYER_PERCEPTRON);
+ return ann;
+ }
+
+ public static NeuralNetwork trainNeuralNetwork(NeuralNetwork ann) {
+ int inputSize = 2;
+ int outputSize = 1;
+ DataSet ds = new DataSet(inputSize, outputSize);
+
+ DataSetRow rOne = new DataSetRow(new double[] {0, 1}, new double[] {1});
+ ds.addRow(rOne);
+ DataSetRow rTwo = new DataSetRow(new double[] {1, 1}, new double[] {0});
+ ds.addRow(rTwo);
+ DataSetRow rThree = new DataSetRow(new double[] {0, 0}, new double[] {0});
+ ds.addRow(rThree);
+ DataSetRow rFour = new DataSetRow(new double[] {1, 0}, new double[] {1});
+ ds.addRow(rFour);
+
+ BackPropagation backPropagation = new BackPropagation();
+ backPropagation.setMaxIterations(1000);
+
+ ann.learn(ds, backPropagation);
+ return ann;
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/neuroph/XORTest.java b/libraries/src/test/java/com/baeldung/neuroph/XORTest.java
new file mode 100644
index 0000000000..063c57195b
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/neuroph/XORTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.neuroph;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.neuroph.core.NeuralNetwork;
+
+import static org.junit.Assert.*;
+
+public class XORTest {
+ private NeuralNetwork ann = null;
+
+ @Before
+ public void annInit() {
+ ann = NeurophXOR.trainNeuralNetwork(NeurophXOR.assembleNeuralNetwork());
+ }
+
+ @Test
+ public void leftDisjunctTest() {
+ ann.setInput(0, 1);
+ ann.calculate();
+ assertEquals(ann.getOutput()[0], 1.0,0.0);
+ }
+
+ @Test
+ public void rightDisjunctTest() {
+ ann.setInput(1, 0);
+ ann.calculate();
+ assertEquals(ann.getOutput()[0], 1.0,0.0);
+ }
+
+ @Test
+ public void bothFalseConjunctTest() {
+ ann.setInput(0, 0);
+ ann.calculate();
+ assertEquals(ann.getOutput()[0], 0.0,0.0);
+ }
+
+ @Test
+ public void bothTrueConjunctTest() {
+ ann.setInput(1, 1);
+ ann.calculate();
+ assertEquals(ann.getOutput()[0], 0.0,0.0);
+ }
+
+ @After
+ public void annClose() {
+ ann = null;
+ }
+}