From 8406b312ee18f8089f33e3b665ab5ba216aa36a5 Mon Sep 17 00:00:00 2001
From: guille <guillermopolito@gmail.com>
Date: Fri, 28 Oct 2016 11:57:13 +0200
Subject: [PATCH] Renamed ExternalConnectionPolicy into ConnectionPolicy

---
 .../n2s3/features/builder/ConnectionRef.scala |  4 +-
 .../features/builder/NeuronGroupRef.scala     |  6 +-
 .../n2s3/features/builder/NeuronLayer.scala   |  2 +-
 ...y.scala => AbstractConnectionPolicy.scala} | 19 ++----
 .../types/ConvolutionalConnection.scala       |  4 +-
 .../connection/types/FullConnection.scala     |  4 +-
 .../types/FullExceptSelfConnection.scala      |  4 +-
 .../connection/types/ManualConnection.scala   |  4 +-
 .../types/MaxPoolingConnection.scala          |  4 +-
 .../connection/types/OneToOneConnection.scala |  4 +-
 .../connection/types/RandomConnection.scala   |  4 +-
 .../types/WinnerTakeAllConnection.scala       |  4 +-
 .../builder/convolutional/LayerBuilder.scala  | 10 +--
 .../combinatorial/GeneticAlgorithm.scala      | 66 -------------------
 .../integration/TestIntegrationN2S3.scala     |  4 +-
 .../n2s3/apps/bio/SupervisedXOR.scala         |  4 +-
 16 files changed, 35 insertions(+), 112 deletions(-)
 rename n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/{ConnectionPolicy.scala => AbstractConnectionPolicy.scala} (78%)
 delete mode 100644 n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala

diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
index 5000ac94..e3c72447 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
@@ -1,6 +1,6 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ConnectionPolicy}
 
 /**
   * Models a connection between two neuron groups.
@@ -8,7 +8,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connecti
   * @param to [[NeuronGroupRef]]  destination of the connection
   * @param connectionType the kind of connection used
   */
-class ConnectionRef(from: NeuronGroupRef, to: NeuronGroupRef, connectionType: ExternalConnectionPolicy) {
+class ConnectionRef(from: NeuronGroupRef, to: NeuronGroupRef, connectionType: ConnectionPolicy) {
 
   var deployed = false
   def isDeployed = this.deployed
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
index 47604935..1e679e5f 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 import fr.univ_lille.cristal.emeraude.n2s3.core.Neuron.SetSynchronizer
 import fr.univ_lille.cristal.emeraude.n2s3.core._
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.ExternalConnectionPolicy
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.ConnectionPolicy
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types.FullConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.models.qbg.FixedParameter
@@ -91,11 +91,11 @@ class NeuronGroupRef(n2s3: N2S3) extends NetworkEntityRef {
     this
   }
 
-  def connectToItselfUsing(connectionType: ExternalConnectionPolicy = new FullConnection) : ConnectionRef = {
+  def connectToItselfUsing(connectionType: ConnectionPolicy = new FullConnection) : ConnectionRef = {
     this.connectTo(this, connectionType)
   }
 
-  def connectTo(layer: NeuronGroupRef, connectionType: ExternalConnectionPolicy = new FullConnection) : ConnectionRef = {
+  def connectTo(layer: NeuronGroupRef, connectionType: ConnectionPolicy = new FullConnection) : ConnectionRef = {
     val ref = new ConnectionRef(this, layer, connectionType)
     this.connections += ref
     ref
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
index be583efb..d2594311 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
@@ -1,7 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.{NetworkEntityPath, NeuronConnection}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ExternalConnectionPolicy, InternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ConnectionPolicy, InternalConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.{BackPropagationMethod, DefaultBackPropagationMethod}
 
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
similarity index 78%
rename from n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala
rename to n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
index 434c58f5..e6fde115 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
@@ -22,7 +22,7 @@ class ConnectionSet(list : Traversable[(NetworkEntityPath, NetworkEntityPath)])
   def size = list.size
 }
 
-trait ConnectionPolicy {
+trait AbstractConnectionPolicy {
 
   var defaultConnectionConstructor : Option[() => NeuronConnection] = None
 
@@ -45,7 +45,7 @@ trait ConnectionPolicy {
   }
 }
 
-trait ExternalConnectionPolicy extends ConnectionPolicy {
+trait ConnectionPolicy extends AbstractConnectionPolicy {
 
   final def create(from : NeuronGroupRef, to : NeuronGroupRef) : ConnectionSet = {
     construct(generate(from, to))
@@ -65,7 +65,8 @@ trait ExternalConnectionPolicy extends ConnectionPolicy {
  def connects(aNeuron: NeuronRef, anotherNeuron: NeuronRef): Boolean
 }
 
-trait InternalConnectionPolicy extends ConnectionPolicy {
+@deprecated("Use [[ExternalConnectionPolicyInstead]]", "4/8/2016")
+trait InternalConnectionPolicy extends AbstractConnectionPolicy {
   final def create(layer : NeuronGroupRef) : ConnectionSet = {
     construct(generate(layer))
   }
@@ -76,16 +77,4 @@ trait InternalConnectionPolicy extends ConnectionPolicy {
 
   def generate(layer : NeuronGroupRef) : Traversable[Connection]
   def generate(layer : NeuronIterable) : Traversable[Connection]
-}
-
-object NoConnection extends ExternalConnectionPolicy {
-  def generate(from : NeuronIterable, to : NeuronIterable) = None
-
-  override def generate(from: NeuronGroupRef, to: NeuronGroupRef): Traversable[Connection] = None
-
- /********************************************************************************************************************
-  * Testing
-  ******************************************************************************************************************/
-
-  override def connects(aNeuron: NeuronRef, anotherNeuron: NeuronRef): Boolean = false
 }
\ No newline at end of file
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
index 850e9bc4..20e99285 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
@@ -2,7 +2,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.models.convolutional.SharedNeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.convolutional.Filter2D
 
 import scala.collection.mutable
@@ -10,7 +10,7 @@ import scala.collection.mutable
 /**
   * Created by falezp on 23/05/16.
   */
-class ConvolutionalConnection[A](filters : Traversable[Filter2D], connectionConstructor : A => SharedNeuronConnection[A], sharedObjConstructor : () => A) extends ExternalConnectionPolicy {
+class ConvolutionalConnection[A](filters : Traversable[Filter2D], connectionConstructor : A => SharedNeuronConnection[A], sharedObjConstructor : () => A) extends ConnectionPolicy {
 
   def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
     assert(from.shape.dimensionNumber == 2 && to.shape.dimensionNumber == 3)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
index 97dcad50..45eae491 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class FullConnection(neuronConnectionConstructor : Option[() => NeuronConnection]) extends ExternalConnectionPolicy {
+class FullConnection(neuronConnectionConstructor : Option[() => NeuronConnection]) extends ConnectionPolicy {
 
   def this(){
     this(None)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
index e6acebc6..97ef7f9b 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
@@ -1,12 +1,12 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class FullExceptSelfConnection extends ExternalConnectionPolicy {
+class FullExceptSelfConnection extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     assert(from.size == to.size)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
index bde2c0b2..39060307 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{InternalConnectionPolicy, Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{InternalConnectionPolicy, Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 14/10/16.
   */
-class ManualConnection(connections : Traversable[(Int, Int, Option[NeuronConnection])]) extends ExternalConnectionPolicy {
+class ManualConnection(connections : Traversable[(Int, Int, Option[NeuronConnection])]) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     throw new UnsupportedOperationException
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
index 8460715d..9b810404 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
@@ -1,13 +1,13 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 
 /**
   * Created by falezp on 27/05/16.
   */
-class MaxPoolingConnection(reduceFactors : Int*) extends ExternalConnectionPolicy {
+class MaxPoolingConnection(reduceFactors : Int*) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) : Traversable[Connection] = {
     assert(from.shape.dimensionNumber == to.shape.dimensionNumber && to.shape.dimensions.zip(reduceFactors).map(e => e._1*e._2) == from.shape)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
index 4d2e7b07..7fce1516 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
@@ -5,9 +5,9 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
-class OneToOneConnection extends ExternalConnectionPolicy {
+class OneToOneConnection extends ConnectionPolicy {
 	def generate(from : NeuronIterable, to : NeuronIterable) = {
 		assert(from.size == to.size)
 		from.toSeq.zip(to.toSeq).map{ case (in, out) => Connection(in, out)}
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
index 8c4026a0..695ce76f 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
@@ -2,14 +2,14 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 import scala.util.Random
 
 /**
   * Created by falezp on 07/07/16.
   */
-class RandomConnection(connectionRate : Float, connectionConstructor : () => NeuronConnection) extends ExternalConnectionPolicy {
+class RandomConnection(connectionRate : Float, connectionConstructor : () => NeuronConnection) extends ConnectionPolicy {
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       in <- from
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
index a1143e9e..121d7789 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class WinnerTakeAllConnection(inhibitoryConnection : () => NeuronConnection) extends ExternalConnectionPolicy {
+class WinnerTakeAllConnection(inhibitoryConnection : () => NeuronConnection) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     new OneToOneConnection().generate(from, to)++
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
index a9aa5456..762d680b 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.convolutional
 import fr.univ_lille.cristal.emeraude.n2s3.core._
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder._
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types.FullConnection
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ExternalConnectionPolicy, InternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionPolicy, InternalConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.{BackPropagationMethod, DefaultBackPropagationMethod}
 
@@ -27,8 +27,8 @@ abstract class LayerBuilder extends NetworkBuilder {
 
   var flatHierarchy = false
   var shape = Shape()
-  var connectionPolicy : Option[ExternalConnectionPolicy] = None
-  var layerConnectionPolicy : Option[ExternalConnectionPolicy] = None
+  var connectionPolicy : Option[ConnectionPolicy] = None
+  var layerConnectionPolicy : Option[ConnectionPolicy] = None
   var layerRootConstructor : () => NetworkContainer = defaultContainerConstructor
 
   val internalConnections = mutable.ArrayBuffer[InternalConnectionPolicy]()
@@ -106,12 +106,12 @@ abstract class LayerBuilder extends NetworkBuilder {
     this
   }
 
-  def setConnectionPolicy(connectionPolicy : ExternalConnectionPolicy) : this.type = {
+  def setConnectionPolicy(connectionPolicy : ConnectionPolicy) : this.type = {
     this.connectionPolicy = Some(connectionPolicy)
     this
   }
 
-  protected def setDefaultLayerConnectionPolicy(connectionPolicy : ExternalConnectionPolicy) : this.type = {
+  protected def setDefaultLayerConnectionPolicy(connectionPolicy : ConnectionPolicy) : this.type = {
     this.layerConnectionPolicy = Some(connectionPolicy)
     this
   }
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala
deleted file mode 100644
index 3f2efe3e..00000000
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala
+++ /dev/null
@@ -1,66 +0,0 @@
-package fr.univ_lille.cristal.emeraude.n2s3.features.combinatorial
-
-import scala.annotation.tailrec
-import scala.util.Random
-
-/**
-  * Created by falezp on 12/04/16.
-  */
-trait Candidate {
-
-  def evaluate() : Int
-
-}
-
-class GeneticAlgorithm[CandidateType <: Candidate](populationSize : Int, generationNumber : Int, crossOverNumber : Int, mutationNumber : Int,
-                                                   crossOverFunction : (CandidateType, CandidateType) => CandidateType, mutationFunction : CandidateType => CandidateType, maximize : Boolean = true) {
-
-  val unknownScore = -1
-
-  def execute(initialPopulation : Seq[CandidateType]) : (CandidateType, Int) = {
-
-    val rand = Random
-
-    @tailrec
-    def innerExecute(population : Map[CandidateType, Int], generation : Int) : (CandidateType, Int) = {
-      if(generation < generationNumber) {
-        println("[Genetic Algorithm] Generation " + (generation + 1))
-
-        val populationCrossOver = scala.collection.mutable.ArrayBuffer[CandidateType]()
-        for (crossOver <- 0 until crossOverNumber) {
-          val parentIndex1 = rand.nextInt(population.size)
-
-          val parentIndex2Raw = rand.nextInt(population.size - 1)
-          val parentIndex2 = if (parentIndex2Raw < parentIndex1) parentIndex2Raw else parentIndex2Raw + 1
-
-          populationCrossOver += crossOverFunction(population.toList(parentIndex1)._1, population.toList(parentIndex2)._1)
-        }
-
-        val populationMutation = scala.collection.mutable.ArrayBuffer[CandidateType]()
-        for (mutation <- 0 until mutationNumber) {
-          populationMutation += mutationFunction(population.toList(rand.nextInt(population.size))._1)
-        }
-
-        val populationFinal = population ++ populationCrossOver.map(candidate => (candidate, unknownScore)) ++ populationMutation.map(candidate => (candidate, unknownScore))
-
-        val sortedPopulation = populationFinal.map { case (candidate, score) =>
-          (candidate, if (score == unknownScore) candidate.evaluate() else score)
-        }.toSeq.sortBy(_._2)
-
-        println("### Score Generation "+generation+" ###")
-        sortedPopulation.zipWithIndex.foreach{ case(entry, index) => println("#"+index+" : "+entry._2) }
-
-        val best = if(maximize) sortedPopulation.maxBy(_._2) else sortedPopulation.minBy(_._2)
-        println("Best Solution : "+best._2)
-        println(best._1.toString)
-
-        innerExecute(if(maximize) sortedPopulation.reverse.take(populationSize).toMap else sortedPopulation.take(populationSize).toMap, generation+1)
-      }
-      else {
-        if(maximize) population.maxBy(_._2) else population.minBy(_._2)
-      }
-    }
-    innerExecute(Map(initialPopulation.map(candidate => (candidate, unknownScore)):_*), 0)
-  }
-
-}
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
index 90872cb5..5b602066 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
@@ -4,7 +4,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.UnitSpec
 import fr.univ_lille.cristal.emeraude.n2s3.core.MockNeuron
 import fr.univ_lille.cristal.emeraude.n2s3.core.exceptions.N2S3Exception
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder._
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input._
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorPerNeuronGroupPolicy, LocalActorDeploymentStrategy}
@@ -96,7 +96,7 @@ class TestIntegrationN2S3 extends UnitSpec {
       .setNeuronModel(MockNeuron)
 
     var called = 0
-    inputLayer.connectTo(rbmLayer, new ExternalConnectionPolicy{
+    inputLayer.connectTo(rbmLayer, new ConnectionPolicy{
       override def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
         called = called + 1
         List()
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
index 01de0dd6..0322e05a 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.apps.bio
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.ShapelessSpike
 import fr.univ_lille.cristal.emeraude.n2s3.core.models.properties.MembraneThresholdFloat
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{N2S3, NeuronGroupRef, NeuronIterable, NeuronRef}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input._
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.SpikeProp
@@ -52,7 +52,7 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
   override def atEnd(): Boolean = cursor >= limit
 }
 
-class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ExternalConnectionPolicy {
+class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ConnectionPolicy {
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       (in, in_index) <- from.toSeq.zipWithIndex
-- 
GitLab