Skip to content

Commit e1e856c

Browse files
committed
Revert "Connections:computeActivity returns connected counts per segment"
This reverts commit 8d38633.
1 parent 0e9d108 commit e1e856c

File tree

7 files changed

+40
-24
lines changed

7 files changed

+40
-24
lines changed

bindings/py/cpp_src/bindings/algorithms/py_Connections.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ R"(Compatibility Warning: This classes API is unstable and may change without wa
101101
[](void *dataPtr) {
102102
delete reinterpret_cast<std::vector<SynapseIdx>*>(dataPtr); });
103103
// Call the C++ method.
104-
*activeConnectedSynapses = self.computeActivity(activePresynapticCells.getSparse());
104+
self.computeActivity(*activeConnectedSynapses, activePresynapticCells.getSparse());
105105
// Wrap vector in numpy array.
106106
return py::array(activeConnectedSynapses->size(),
107107
activeConnectedSynapses->data(),
@@ -124,7 +124,7 @@ R"(Returns numActiveConnectedSynapsesForSegment)");
124124
[](void *dataPtr) {
125125
delete reinterpret_cast<std::vector<SynapseIdx>*>(dataPtr); });
126126
// Call the C++ method.
127-
*activeConnectedSynapses = self.computeActivity(*activePotentialSynapses,
127+
self.computeActivity(*activeConnectedSynapses, *activePotentialSynapses,
128128
activePresynapticCells.getSparse());
129129
// Wrap vector in numpy array.
130130
return py::make_tuple(

src/htm/algorithms/Connections.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,11 @@ void Connections::reset()
391391
currentUpdates_.clear();
392392
}
393393

394-
vector<SynapseIdx> Connections::computeActivity(
394+
void Connections::computeActivity(
395+
vector<SynapseIdx> &numActiveConnectedSynapsesForSegment,
395396
const vector<CellIdx> &activePresynapticCells)
396397
{
397-
vector<SynapseIdx> numActiveConnectedSynapsesForSegment(segments_.size(), 0);
398+
NTA_ASSERT(numActiveConnectedSynapsesForSegment.size() == segments_.size());
398399

399400
if( timeseries_ ) {
400401
// Before each cycle of computation move the currentUpdates to the previous
@@ -411,30 +412,31 @@ vector<SynapseIdx> Connections::computeActivity(
411412
}
412413
}
413414
}
414-
return numActiveConnectedSynapsesForSegment;
415415
}
416416

417-
vector<SynapseIdx> Connections::computeActivity(
417+
void Connections::computeActivity(
418+
vector<SynapseIdx> &numActiveConnectedSynapsesForSegment,
418419
vector<SynapseIdx> &numActivePotentialSynapsesForSegment,
419420
const vector<CellIdx> &activePresynapticCells) {
421+
NTA_ASSERT(numActiveConnectedSynapsesForSegment.size() == segments_.size());
420422
NTA_ASSERT(numActivePotentialSynapsesForSegment.size() == segments_.size());
421423

422424
// Iterate through all connected synapses.
423-
const vector<SynapseIdx> numActiveConnectedSynapsesForSegment = computeActivity( activePresynapticCells );
425+
computeActivity(
426+
numActiveConnectedSynapsesForSegment,
427+
activePresynapticCells );
424428

425429
// Iterate through all potential synapses.
426430
std::copy( numActiveConnectedSynapsesForSegment.begin(),
427431
numActiveConnectedSynapsesForSegment.end(),
428432
numActivePotentialSynapsesForSegment.begin());
429-
430433
for (const auto& cell : activePresynapticCells) {
431434
if (potentialSegmentsForPresynapticCell_.count(cell)) {
432435
for(const auto& segment : potentialSegmentsForPresynapticCell_.at(cell)) {
433436
++numActivePotentialSynapsesForSegment[segment];
434437
}
435438
}
436439
}
437-
return numActiveConnectedSynapsesForSegment;
438440
}
439441

440442

src/htm/algorithms/Connections.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -389,20 +389,21 @@ class Connections : public Serializable
389389
* preinitialized with the length returned by
390390
* getSegmentFlatVectorLength().
391391
*
392-
* @param (optional) numActivePotentialSynapsesForSegment
392+
* @param numActiveConnectedSynapsesForSegment
393+
* An output vector for active connected synapse counts per segment.
394+
*
395+
* @param numActivePotentialSynapsesForSegment
393396
* An output vector for active potential synapse counts per segment.
394397
*
395398
* @param activePresynapticCells
396399
* Active cells in the input.
397-
*
398-
* @return numActiveConnectedSynapsesForSegment
399-
* An output vector for active connected synapse counts per segment.
400400
*/
401-
std::vector<SynapseIdx> computeActivity(
401+
void computeActivity(std::vector<SynapseIdx> &numActiveConnectedSynapsesForSegment,
402402
std::vector<SynapseIdx> &numActivePotentialSynapsesForSegment,
403403
const std::vector<CellIdx> &activePresynapticCells);
404404

405-
std::vector<SynapseIdx> computeActivity(const std::vector<CellIdx> &activePresynapticCells);
405+
void computeActivity(std::vector<SynapseIdx> &numActiveConnectedSynapsesForSegment,
406+
const std::vector<CellIdx> &activePresynapticCells);
406407

407408
/**
408409
* The primary method in charge of learning. Adapts the permanence values of

src/htm/algorithms/SpatialPooler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,8 @@ void SpatialPooler::updateBookeepingVars_(bool learn) {
814814

815815
void SpatialPooler::calculateOverlap_(const SDR &input,
816816
vector<SynapseIdx> &overlaps) {
817-
overlaps = connections_.computeActivity(input.getSparse());
817+
overlaps.assign( numColumns_, 0 );
818+
connections_.computeActivity(overlaps, input.getSparse());
818819
}
819820

820821

src/htm/algorithms/SpatialPooler.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,9 @@ class SpatialPooler : public Serializable
886886
887887
The overlap of a column is the number of synapses for that column
888888
that are connected (permanence value is greater than
889-
'_synPermConnected') to input bits which are turned on.
889+
'_synPermConnected') to input bits which are turned on. The
890+
implementation takes advantage of the SparseBinaryMatrix class to
891+
perform this calculation efficiently.
890892
891893
@param inputVector
892894
a int array of 0's and 1's that comprises the input to the spatial

src/htm/algorithms/TemporalMemory.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,9 @@ void TemporalMemory::activateDendrites(const bool learn,
512512

513513
const size_t length = connections.segmentFlatListLength();
514514

515+
numActiveConnectedSynapsesForSegment_.assign(length, 0);
515516
numActivePotentialSynapsesForSegment_.assign(length, 0);
516-
numActiveConnectedSynapsesForSegment_ = connections.computeActivity(
517+
connections.computeActivity(numActiveConnectedSynapsesForSegment_,
517518
numActivePotentialSynapsesForSegment_,
518519
activeCells_);
519520

src/test/unit/algorithms/ConnectionsTest.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ void setupSampleConnections(Connections &connections) {
7171
void computeSampleActivity(Connections &connections) {
7272
vector<UInt32> input = {50, 52, 53, 80, 81, 82, 150, 151};
7373

74+
vector<SynapseIdx> numActiveConnectedSynapsesForSegment(
75+
connections.segmentFlatListLength(), 0);
7476
vector<SynapseIdx> numActivePotentialSynapsesForSegment(
7577
connections.segmentFlatListLength(), 0);
76-
vector<SynapseIdx> numActiveConnectedSynapsesForSegment = connections.computeActivity(numActivePotentialSynapsesForSegment, input);
78+
connections.computeActivity(numActiveConnectedSynapsesForSegment,
79+
numActivePotentialSynapsesForSegment, input);
7780
}
7881

7982
/**
@@ -150,9 +153,11 @@ TEST(ConnectionsTest, testDestroySegment) {
150153
ASSERT_EQ(3ul, connections.numSegments());
151154
ASSERT_EQ(0ul, connections.numSynapses());
152155

156+
vector<SynapseIdx> numActiveConnectedSynapsesForSegment(
157+
connections.segmentFlatListLength(), 0);
153158
vector<SynapseIdx> numActivePotentialSynapsesForSegment(
154159
connections.segmentFlatListLength(), 0);
155-
vector<SynapseIdx> numActiveConnectedSynapsesForSegment = connections.computeActivity(
160+
connections.computeActivity(numActiveConnectedSynapsesForSegment,
156161
numActivePotentialSynapsesForSegment,
157162
{80, 81, 82});
158163

@@ -179,9 +184,11 @@ TEST(ConnectionsTest, testDestroySynapse) {
179184
ASSERT_EQ(2ul, connections.numSynapses());
180185
ASSERT_EQ(2ul, connections.synapsesForSegment(segment).size());
181186

187+
vector<SynapseIdx> numActiveConnectedSynapsesForSegment(
188+
connections.segmentFlatListLength(), 0);
182189
vector<SynapseIdx> numActivePotentialSynapsesForSegment(
183190
connections.segmentFlatListLength(), 0);
184-
vector<SynapseIdx> numActiveConnectedSynapsesForSegment = connections.computeActivity(
191+
connections.computeActivity(numActiveConnectedSynapsesForSegment,
185192
numActivePotentialSynapsesForSegment,
186193
{80, 81, 82});
187194

@@ -335,9 +342,11 @@ TEST(ConnectionsTest, testComputeActivity) {
335342

336343
vector<UInt32> input = {50, 52, 53, 80, 81, 82, 150, 151};
337344

345+
vector<SynapseIdx> numActiveConnectedSynapsesForSegment(
346+
connections.segmentFlatListLength(), 0);
338347
vector<SynapseIdx> numActivePotentialSynapsesForSegment(
339348
connections.segmentFlatListLength(), 0);
340-
vector<SynapseIdx> numActiveConnectedSynapsesForSegment = connections.computeActivity(
349+
connections.computeActivity(numActiveConnectedSynapsesForSegment,
341350
numActivePotentialSynapsesForSegment, input);
342351

343352
ASSERT_EQ(1ul, numActiveConnectedSynapsesForSegment[segment1_1]);
@@ -705,7 +714,7 @@ TEST(ConnectionsTest, testTimeseries) {
705714
presyn.randomize( 0.5f );
706715
vector<SynapseIdx> output( 1u );
707716
for( int i = 0; i < 10; i++ ) {
708-
output = C.computeActivity( presyn.getSparse() );
717+
C.computeActivity( output, presyn.getSparse() );
709718
C.adaptSegment( seg, presyn, 0.1f, 0.1f );
710719
}
711720
// Check that the synapse permanences did not saturate.
@@ -718,7 +727,7 @@ TEST(ConnectionsTest, testTimeseries) {
718727
// effectively turns off the timeseries parameter.
719728
for( int i = 0; i < 10; i++ ) {
720729
C.reset();
721-
output = C.computeActivity( presyn.getSparse() );
730+
C.computeActivity( output, presyn.getSparse() );
722731
C.adaptSegment( seg, presyn, 0.1f, 0.1f );
723732
}
724733
// Check that the synapse permanences staturated. This is the failure

0 commit comments

Comments
 (0)