11package htm ;
22
33import java .util .ArrayList ;
4+ import java .util .Collections ;
5+ import java .util .HashSet ;
46import java .util .List ;
57import java .util .Set ;
68
@@ -23,13 +25,54 @@ public class Segment {
2325 private int _predictionSteps ;
2426 private final float _segActiveThreshold ;
2527
28+ private boolean _isActive ;
29+ private boolean _wasActive ;
30+ private Set <Synapse > _activeSynapses ;
31+ private Set <Synapse > _prevSynapses ;
32+
2633 /**
2734 * Initialize a new Segment with the specified segment activation threshold.
2835 */
2936 Segment (int segActiveThreshold ) {
3037 _synapses = new ArrayList <Synapse >();
3138 _isSequence = false ;
3239 _segActiveThreshold = segActiveThreshold ;
40+ _isActive = false ;
41+ _wasActive = false ;
42+ _activeSynapses = new HashSet <Synapse >();
43+ _prevSynapses = new HashSet <Synapse >();
44+ }
45+
46+ /**
47+ * Advance this segment to the next time step. The current state of this
48+ * segment (active, number of synapes) will be set as the previous state and
49+ * the current state will be reset to no cell activity by default until it
50+ * can be determined.
51+ */
52+ void nextTimeStep () {
53+ _wasActive = _isActive ;
54+ _isActive = false ;
55+ _prevSynapses .clear ();
56+ _prevSynapses .addAll (_activeSynapses );
57+ _activeSynapses .clear ();
58+ }
59+
60+ /**
61+ * Process this segment for the current time step. Processing will determine
62+ * the set of active synapses on this segment for this time step. From there
63+ * we will determine if this segment is active if enough active synapses
64+ * are present. This information is then cached for the remainder of the
65+ * Region's processing for the time step. When a new time step occurs, the
66+ * Region will call nextTimeStep() on all cells/segments to cache the
67+ * information as what was previously active.
68+ */
69+ public void processSegment () {
70+ _activeSynapses .clear ();
71+ for (Synapse syn : _synapses ) {
72+ if (syn .isActive ())
73+ _activeSynapses .add (syn );
74+ }
75+ _isActive = _activeSynapses .size () >= _segActiveThreshold ;
3376 }
3477
3578 /**
@@ -40,7 +83,7 @@ public class Segment {
4083 * (something that will eventually happen).
4184 * @param sequence true to make the segment a sequence segment, false not.
4285 */
43- public void setSequence (boolean sequence ) {
86+ private void setSequence (boolean sequence ) {
4487 _isSequence = sequence ;
4588 }
4689
@@ -140,15 +183,11 @@ public void getSynapseCells(Set<Cell> cells) {
140183 }
141184
142185 /**
143- * Populate the set with all the currently active (firing) synapses on
144- * this segment.
145- * @param connectedOnly: only consider if active if a synapse is connected.
186+ * Return the set of all the currently active (connected and firing)
187+ * synapses on this segment.
146188 */
147- public void getActiveSynapses (Set <Synapse > syns ) {
148- for (Synapse syn : _synapses ) {
149- if (syn .isActive ())
150- syns .add (syn );
151- }
189+ public Set <Synapse > getActiveSynapses () {
190+ return Collections .unmodifiableSet (_activeSynapses );
152191 }
153192
154193 /**
@@ -166,6 +205,9 @@ public int getActiveSynapseCount() {
166205 * synapses which are currently connected.
167206 */
168207 public int getActiveSynapseCount (boolean connectedOnly ) {
208+ if (connectedOnly )
209+ return _activeSynapses .size ();
210+
169211 int c =0 ;
170212 for (Synapse syn : _synapses ) {
171213 if (syn .isActive (connectedOnly ))
@@ -175,15 +217,11 @@ public int getActiveSynapseCount(boolean connectedOnly) {
175217 }
176218
177219 /**
178- * Populate the set with all the previously active (firing) synapses on
220+ * Return the set of all the previously active (firing) synapses on
179221 * this segment.
180- * @param connectedOnly: only consider if active if a synapse is connected.
181222 */
182- public void getPrevActiveSynapses (Set <Synapse > syns ) {
183- for (Synapse syn : _synapses ) {
184- if (syn .wasActive ())
185- syns .add (syn );
186- }
223+ public Set <Synapse > getPrevActiveSynapses () {
224+ return Collections .unmodifiableSet (_prevSynapses );
187225 }
188226
189227 /**
@@ -201,6 +239,9 @@ public int getPrevActiveSynapseCount() {
201239 * synapses which are currently connected.
202240 */
203241 public int getPrevActiveSynapseCount (boolean connectedOnly ) {
242+ if (connectedOnly )
243+ return _prevSynapses .size ();
244+
204245 int c =0 ;
205246 for (Synapse syn : _synapses ) {
206247 if (syn .wasActive (connectedOnly ))
@@ -264,20 +305,15 @@ public void decreasePermanences(Set<Synapse> activeSynapses) {
264305 * that are active due to active states at time t is greater than activationThreshold.
265306 */
266307 public boolean isActive () {
267- int c =0 ;
268- for (Synapse syn : _synapses ) {
269- if (syn .isActive ())
270- ++c ;
271- }
272- return c >= _segActiveThreshold ;
308+ return _isActive ;
273309 }
274310
275311 /**
276312 * This routine returns true if the number of connected synapses on this segment
277313 * that were active due to active states at time t-1 is greater than activationThreshold.
278314 */
279315 public boolean wasActive () {
280- return getPrevActiveSynapseCount () >= _segActiveThreshold ;
316+ return _wasActive ;
281317 }
282318
283319 /**
0 commit comments