From 52561a870b4f9a3c8ad04c795a730100531c8fb6 Mon Sep 17 00:00:00 2001
From: guille <guillermopolito@gmail.com>
Date: Fri, 28 Oct 2016 15:10:12 +0200
Subject: [PATCH] Collapsing N2S3InputStream and InputStream

---
 .../features/io/input/AERInputStream.scala    |  9 +---
 .../io/input/DigitalHexInputStream.scala      |  4 +-
 .../io/input/EndStageOnStreamEnd.scala        | 26 -----------
 .../features/io/input/FontInputStream.scala   |  7 ++-
 .../n2s3/features/io/input/LFWReader.scala    |  6 +--
 .../io/input/MnistFileInputStream.scala       |  4 +-
 .../features/io/input/N2S3InputStream.scala   | 44 +++----------------
 .../features/io/input/SeventSegment.scala     |  4 +-
 .../features/io/input/StreamSupport.scala     |  9 ++--
 .../emeraude/n2s3/core/TestInput.scala        |  4 +-
 .../n2s3/features/io/TestAERInputStream.scala | 11 -----
 .../integration/TestIntegrationN2S3.scala     | 17 +++----
 .../emeraude/n2s3/apps/bio/Masquelier.scala   |  6 +--
 .../n2s3/apps/bio/SmallReservoir.scala        |  4 +-
 .../n2s3/apps/bio/SupervisedDelay.scala       |  8 ++--
 .../n2s3/apps/bio/SupervisedXOR.scala         |  8 ++--
 .../n2s3/apps/ternary/BitStream.scala         |  6 +--
 .../n2s3/apps/ternary/PatternStart.scala      |  6 +--
 .../n2s3/apps/ternary/SmallReservoir.scala    |  4 +-
 19 files changed, 48 insertions(+), 139 deletions(-)
 delete mode 100644 n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala

diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
index aee00288..e374002a 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
@@ -4,7 +4,7 @@ import java.io.{EOFException, File}
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.ShapelessSpike
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, N2S3Input, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import net.sf.jaer.aemonitor.AEPacketRaw
 import net.sf.jaer.eventio.AEFileInputStream
 
@@ -92,17 +92,14 @@ case class AERInput(timestamp: Timestamp, address : Int) extends Input {
  * @param filename: String, the name of the file to read from
  */
 //TODO: expliquer la relation entre AERInputStream AERInput
-class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends N2S3InputStream[InputSeq[AERInput]] with StreamTimestampsManager {
+class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends InputStream[InputSeq[AERInput]] with StreamTimestampsManager {
 
   val aeis = new AEFileInputStream(new File(filename))
   val startTime = aeis.getFirstTimestamp
   val numberImage = aeis.size().toInt
   var peekEvent: Option[Seq[AERInput]] = None
-
   var lastPrint = 0
 
-  this.stageStrategy = new EndStageOnStreamEnd
-
   aeis.mark()
 
   /**
@@ -110,7 +107,6 @@ class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends
    */
   override def reset() : Unit = {
     maxPrefix()
-    this.stageStrategy.streamFinished()
     this.peekEvent = None
     aeis.rewind() }
 
@@ -142,7 +138,6 @@ class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends
    */
   def readAllEvents() = eventsFromAEPacket(aeis.readPacketByNumber(aeis.size().toInt))
 
-  override def shape: Shape = s
   override def next() = this.innerNext(chunkSize)
 
   def innerNext(n: Int): InputSeq[AERInput] = {
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
index bfd38230..9a0117b8 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
@@ -1,5 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
   * Factory for [[DigitalHexInputStream]].
   */
@@ -12,7 +14,7 @@ object DigitalHexEntry {
   * An input stream that generates hexadecimal chars in a 3x5 picture of binary pixels.
   * This stream is generated in memory.
   */
-class DigitalHexInputStream extends N2S3InputStream[SampleInput] {
+class DigitalHexInputStream extends InputStream[SampleInput] {
 
 
   val characters = List(
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala
deleted file mode 100644
index 197b58a3..00000000
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
-
-import fr.univ_lille.cristal.emeraude.n2s3.core.InputLayer
-
-/**
-  * Created by guille on 6/10/16.
-  */
-
-abstract class InputStageStrategy() {
-  var inputLayer: Option[InputLayer] = None
-  protected def doEndOfStage() = this.inputLayer match{
-    case Some(layer) =>
-    case None =>
-  }
-
-  def streamFinished() = { this.doEndOfStage() }
-  def itemProcessed()
-}
-
-class EndStageOnItemProcessed() extends InputStageStrategy {
-  override def itemProcessed(): Unit = { this.doEndOfStage() }
-}
-
-class EndStageOnStreamEnd() extends InputStageStrategy {
-  override def itemProcessed(): Unit = { /*Do Nothing*/ }
-}
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
index ff8e9845..5ca5f6b2 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
@@ -2,6 +2,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
 import java.io.File
 import javax.imageio.ImageIO
+
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
 /*
 object FontInput {
 
@@ -17,8 +19,7 @@ object FontInput {
 /**
   * Created by falezp on 20/04/16.
   */
-class FontInputStream(filename : String, characterWidth : Int, characterHeight : Int, labels : List[String]) extends
-N2S3InputStream[SampleInput]{
+class FontInputStream(filename : String, characterWidth : Int, characterHeight : Int, labels : List[String]) extends InputStream[SampleInput]{
 
   val image = ImageIO.read(new File(filename))
   val characters = labels.zipWithIndex.map{ case (name, c) =>
@@ -45,6 +46,4 @@ N2S3InputStream[SampleInput]{
   def reset() = {
     cursor = 0
   }
-
-  override def shape: Shape = Shape(characterWidth, characterHeight)
 }
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
index 8ff3178e..6dc60b64 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
@@ -3,6 +3,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 import java.io.File
 import javax.imageio.ImageIO
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 import scala.util.Random
 /**
   * Created by falezp on 18/08/16.
@@ -14,12 +16,10 @@ object LFWEntry {
   def apply() = new StreamEntry[SampleInput](Shape(width, height))
 }
 
-class LFWReader(directoryPath : String) extends N2S3InputStream[SampleInput] {
+class LFWReader(directoryPath : String) extends InputStream[SampleInput] {
 
   val mainDirectory = new File(directoryPath)
 
-  override def shape: Shape = Shape(LFWEntry.width, LFWEntry.height)
-
   override def next(): SampleInput = {
 
     val subDirectories = mainDirectory.listFiles()
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
index e3ad522d..d326c0a0 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
@@ -2,6 +2,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
 import java.io.{DataInputStream, FileInputStream, IOException}
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
  * Class Reader for mnist file
  */
@@ -10,7 +12,7 @@ object MnistEntry {
   def apply() = new StreamEntry[SampleInput](Shape(28, 28))
 }
 
-class MnistFileInputStream(val imageFile: String, val labelFile: String, val sizeOfChunk: Int  = 64) extends N2S3InputStream[SampleInput] {
+class MnistFileInputStream(val imageFile: String, val labelFile: String, val sizeOfChunk: Int  = 64) extends InputStream[SampleInput] {
 
 
   //Magic number
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
index f9bf5b3b..bedcb62f 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
@@ -1,39 +1,18 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
-import fr.univ_lille.cristal.emeraude.n2s3.core.InputLayer
 import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStreamCombinators._
 import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
-/**
-  * Created by guille on 6/3/16.
-  */
-
-abstract class N2S3InputStream[T] extends InputStream[T]{
-
-  def shape : Shape
-
-  var stageStrategy: InputStageStrategy = new EndStageOnItemProcessed()
-  def getStageManagementStrategy() = this.stageStrategy
-
-  def labelChange(label : String) = {
-    //stageStrategy.inputLayer.get.labelChange(label)
-  }
-
-  def setContainer(container : InputLayer) : Unit = {
-    stageStrategy.inputLayer = Some(container)
-  }
-}
-
 abstract class StreamConverter[I <: InputSeq[_], O <: InputSeq[_]] {
 
-  private var inputStream : N2S3InputStream[I] = _
+  private var inputStream : InputStream[I] = _
   protected var shape = Shape()
 
   def setShape(shape : Shape) : Unit = {
     this.shape = shape
   }
 
-  def setStream(inputStream : N2S3InputStream[I]) = {
+  def setStream(inputStream : InputStream[I]) = {
     this.inputStream = inputStream
   }
   def atEnd() = inputStream.atEnd()
@@ -52,27 +31,17 @@ abstract class StreamConverter[I <: InputSeq[_], O <: InputSeq[_]] {
 }
 
 object N2S3InputStreamCombinators{
-  implicit def streamCombinator[T](stream: N2S3InputStream[T]): N2S3InputStreamCombinator[T, T] = {
+  implicit def streamCombinator[T](stream: InputStream[T]): N2S3InputStreamCombinator[T, T] = {
     new N2S3InputStreamCombinator(stream)
   }
 }
 
-class N2S3InputStreamCombinator[T, T2](originalStream: N2S3InputStream[T], combinedStream: InputStream[T2]) extends N2S3InputStream[T2] {
+class N2S3InputStreamCombinator[T, T2](originalStream: InputStream[T], combinedStream: InputStream[T2]) extends InputStream[T2] {
 
-  def this(stream: N2S3InputStream[T]) {
+  def this(stream: InputStream[T]) {
     this(stream, stream.asInstanceOf[InputStream[T2]])
   }
 
-  override def setContainer(container : InputLayer) : Unit = {
-    super.setContainer(container)
-    originalStream.setContainer(container)
-
-    combinedStream match {
-      case value: N2S3InputStream[_] => value.setContainer(container)
-      case _ =>
-    }
-  }
-
   def take(i: Int) = {
     val newCombinedStream = combinedStream.take(i)
     new N2S3InputStreamCombinator(originalStream, newCombinedStream)
@@ -103,9 +72,6 @@ class N2S3InputStreamCombinator[T, T2](originalStream: N2S3InputStream[T], combi
     new N2S3InputStreamCombinator(originalStream, newCombinedStream)
   }
 
-  override def shape : Shape = originalStream.shape
-  override def getStageManagementStrategy() = originalStream.getStageManagementStrategy()
-
   override def next(): T2 = combinedStream.next()
   override def atEnd(): Boolean = combinedStream.atEnd()
   override def reset(): Unit = combinedStream.reset()
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
index da6c375a..7e9778b8 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
@@ -1,5 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
   * Created by falezp on 31/08/16.
   */
@@ -8,7 +10,7 @@ object SevenSegmentEntry {
   def apply() = new StreamEntry[SampleInput](Shape(7, 2))
 }
 
-class SevenSegmentInputStream extends N2S3InputStream[SampleInput] {
+class SevenSegmentInputStream extends InputStream[SampleInput] {
 
 
   val characters = List(
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
index 5f23bfe6..156b9cd4 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 import java.io.EOFException
 
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, N2S3Input}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, InputStream, N2S3Input}
 
 import scala.collection.mutable.ArrayBuffer
 
@@ -82,7 +82,7 @@ class StreamSupport[I <: InputSeq[_ <: Input], O <: InputSeq[_  <: Input]](val s
       output.innerProcess(outputConverter.dataConverter(data))
   }
 
-  def append(stream : N2S3InputStream[I]) : Unit = {
+  def append(stream : InputStream[I]) : Unit = {
     input.append(stream)
   }
 
@@ -97,15 +97,14 @@ class StreamSupport[I <: InputSeq[_ <: Input], O <: InputSeq[_  <: Input]](val s
 
 class StreamEntry[I <: InputSeq[_ <: Input]](shape : Shape) extends StreamSupport[I, I](shape) {
 
-  private val entryStreams = new ArrayBuffer[N2S3InputStream[I]]
+  private val entryStreams = new ArrayBuffer[InputStream[I]]
   private var entryCursor = 0
 
   override def getEntry : StreamEntry[I] = {
     this
   }
 
-  override def append(stream : N2S3InputStream[I]) : Unit = {
-    assert(stream.shape == this.shape)
+  override def append(stream : InputStream[I]) : Unit = {
     entryStreams += stream
   }
 
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
index 394ce772..28038789 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
@@ -13,7 +13,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.io._
   * Created by falezp on 03/05/16.
   */
 
-class MockStream(numberOfInput : Int, timeLength : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MockStream(numberOfInput : Int, timeLength : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   var currentTimestamp : Timestamp = 0
 
@@ -27,8 +27,6 @@ class MockStream(numberOfInput : Int, timeLength : Int) extends N2S3InputStream[
   def reset() : Unit = {
     currentTimestamp = 0
   }
-
-  override def shape: Shape = Shape(numberOfInput)
 }
 
 class TestInput extends UnitActorSpec {
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
index 65f963cc..17e8a61a 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
@@ -46,17 +46,6 @@ class TestAERInputStream extends UnitSpec {
     inputStream.numberImage shouldBe 6505992
   }
 
-  "AERInputStream" should "know number of rows per image" in {
-    val inputStream = new AERInputStream(filename, Shape(128, 128))
-    inputStream.shape(0) shouldBe 128
-  }
-
-  "AERInputStream" should "know number of columns per image" in {
-    val inputStream = new AERInputStream(filename, Shape(128, 128))
-    inputStream.shape(1) shouldBe 128
-  }
-
-
   "AERInputStream next" should "be able to read all images without throwing an exception" in {
     val inputStream = new AERInputStream(filename, Shape(128, 128), 1)
     for (i <- 0 until inputStream.numberImage) {
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 5b602066..a996d8dc 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
@@ -8,7 +8,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connecti
 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}
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.SequenceInputStream
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputStream, SequenceInputStream}
 
 
 
@@ -22,8 +22,8 @@ class TestIntegrationN2S3 extends UnitSpec {
     stream >> new SampleToSpikeTrainConverter(0, 23, 150 MilliSecond, 350 MilliSecond)
   }
 
-  def newTestInputStream: N2S3InputStream[SampleInput] = {
-    new N2S3InputStream[SampleInput] {
+  def newTestInputStream: InputStream[SampleInput] = {
+    new InputStream[SampleInput] {
       val stream = new SequenceInputStream[SampleInput](List(SampleInput(label = "label", sample = List(SampleUnitInput(1, 0, 1), SampleUnitInput(1, 0, 1)))))
 
       override def next(): SampleInput = stream.next()
@@ -31,8 +31,6 @@ class TestIntegrationN2S3 extends UnitSpec {
       override def atEnd(): Boolean = stream.atEnd()
 
       override def reset(): Unit = stream.reset()
-
-      override def shape: Shape = Shape(1, 2)
     }
   }
 
@@ -61,6 +59,9 @@ class TestIntegrationN2S3 extends UnitSpec {
     val inputStream = this.newTestStreamEntry()
 
     val inputLayer = n2s3.createInput(inputStream)
+    n2s3
+      .createNeuronGroup("group", 2)
+      .setNeuronModel(MockNeuron)
     n2s3.run()
 
     val actorBeforeSecondStart = inputLayer.actorPath.get.actor
@@ -97,11 +98,6 @@ class TestIntegrationN2S3 extends UnitSpec {
 
     var called = 0
     inputLayer.connectTo(rbmLayer, new ConnectionPolicy{
-      override def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
-        called = called + 1
-        List()
-      }
-
       override def generate(from: NeuronGroupRef, to: NeuronGroupRef): Traversable[Connection] = {
         called = called + 1
         List()
@@ -159,6 +155,7 @@ class TestIntegrationN2S3 extends UnitSpec {
   "Change input stream" should "change stream in actor if already deployed" in {
     val n2s3 = new N2S3()
     val inputStream = this.newTestStreamEntry()
+    n2s3.createInput(inputStream)
     n2s3.createNeuronGroup("group", 2)
         .setNeuronModel(MockNeuron)
     n2s3.run()
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
index ba662d7e..6e319625 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
@@ -20,13 +20,13 @@ import fr.univ_lille.cristal.emeraude.n2s3.models.qbg.NeuronPotentialEvent
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import fr.univ_lille.cristal.emeraude.n2s3.support.{InputDistribution, Time}
 
 import scala.concurrent.Await
 import scala.util.Random
 
-class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends InputStream[InputSeq[N2S3Input]] {
 
   private val pattern = (0 until entryNumber/2).map { _ =>
     InputDistribution.poisson(Random, 0, patternDuration.timestamp, patternDuration.asSecond*spikeFrequency)
@@ -85,8 +85,6 @@ class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFreq
     writer.close()
   }
 
-  override def shape: Shape = Shape(entryNumber)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
index 04bac8e6..5091b25a 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
@@ -29,7 +29,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MoveEntry extends InputStream[InputSeq[N2S3Input]] {
 
   val entrySize = 10
   val velocity = 2 MilliSecond // per entry point
@@ -61,8 +61,6 @@ class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
     }.sortBy(_._1)
   }
 
-  override def shape: Shape = Shape(entrySize)
-
   override def next(): InputSeq[N2S3Input] = {
    /* val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
index 5f90beef..cfcb86cd 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
@@ -3,24 +3,22 @@ package fr.univ_lille.cristal.emeraude.n2s3.apps.bio
 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.N2S3
-import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.{N2S3InputStream, Shape, StreamEntry}
+import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.{Shape, StreamEntry}
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.SpikeProp
 import fr.univ_lille.cristal.emeraude.n2s3.models.bio.{FixedSynapse, SRM2Neuron}
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputLabel, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.util.Random
 /**
   * Created by falezp on 21/10/16.
   */
 
-class DelayEntry(n : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class DelayEntry(n : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   val inputInterval = 50 MilliSecond
   var cursor = 0
 
-  override def shape: Shape = Shape(1)
-
   override def next(): InputSeq[N2S3Input] = {
     cursor += 1
     new InputSeq(Seq(N2S3InputSpike(ShapelessSpike, inputInterval.timestamp*(cursor-1), Seq(0)),
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 0322e05a..bb7d8361 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
@@ -11,14 +11,14 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.logging.ExportNetworkTopolog
 import fr.univ_lille.cristal.emeraude.n2s3.models.bio._
 import fr.univ_lille.cristal.emeraude.n2s3.support.Time
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputLabel, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.util.Random
 /**
   * Created by falezp on 19/10/16.
   */
 
-class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class XOREntry(val limit : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   val inputDelay = 6 MilliSecond
   val inputInterval = 50 MilliSecond
@@ -31,8 +31,6 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
       Seq(1.0, 1.0, 0.0) -> "0"
   )
 
-  override def shape: Shape = Shape(3)
-
   override def next(): InputSeq[N2S3Input] = {
     val currData = data(Random.nextInt(data.size))
 
@@ -53,7 +51,7 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
 }
 
 class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ConnectionPolicy {
-  def generate(from : NeuronIterable, to : NeuronIterable) = {
+  override def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       (in, in_index) <- from.toSeq.zipWithIndex
       (out, out_index) <- to.toSeq.zipWithIndex
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
index 76b4b4bc..ff4a1266 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
@@ -19,7 +19,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.collection.mutable.ListBuffer
 import scala.concurrent.Await
@@ -28,7 +28,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class BitStreamEntry(pattern : Seq[Boolean]) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class BitStreamEntry(pattern : Seq[Boolean]) extends InputStream[InputSeq[N2S3Input]] {
 
   var inputData = Seq[Float]()
   var labelTimestamps = ListBuffer[Timestamp]()
@@ -48,8 +48,6 @@ class BitStreamEntry(pattern : Seq[Boolean]) extends N2S3InputStream[InputSeq[N2
 
   var currentTimestamp : Timestamp = 0L
 
-  override def shape: Shape = Shape(1)
-
   override def next(): InputSeq[N2S3Input] = {
     while(currentTimestamp.toInt < inputData.size && inputData(currentTimestamp.toInt) != 1f)
       currentTimestamp += 1
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
index 93602a30..ea6439cb 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
@@ -20,13 +20,13 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import fr.univ_lille.cristal.emeraude.n2s3.support.{InputDistribution, Time}
 
 import scala.concurrent.Await
 import scala.util.Random
 
-class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends InputStream[InputSeq[N2S3Input]] {
 
   private val pattern = (0 until entryNumber/2).map { _ =>
     InputDistribution.poisson(Random, 0, patternDuration.timestamp, patternDuration.asSecond*spikeFrequency)
@@ -77,8 +77,6 @@ class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFreq
     writer.close()
   }
 
-  override def shape: Shape = Shape(entryNumber)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
index a3936bf9..4350a259 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
@@ -23,7 +23,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MoveEntry extends InputStream[InputSeq[N2S3Input]] {
 
   val entrySize = 10
   val velocity = 10 MicroSecond // per entry point
@@ -52,8 +52,6 @@ class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
     }.sortBy(_._1)
   }
 
-  override def shape: Shape = Shape(entrySize)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64
 
-- 
GitLab