Skip to content
David Ray edited this page Aug 26, 2015 · 12 revisions

Absolutely no algorithmic divergence - but some architectural differences

There are a few small differences between the Python and Java versions. One is the abstraction of objects represented in the Python version as arrays and array containers into formal Objects in the Java version. Another is that all methods in the Java version are "functional" in that the data they operate on is passed in, and no state is kept in either the TemporalMemory or the SpatialPooler classes. The "Connections" class acts like an isolated memory - containing all state. This means that two distinct Connections objects (memories) could be passed to the TM or SP, manipulating two entirely different layers concurrently or in parallel.

So what's this "functional" data separation stuff?

Basically, the architecture is separated into:

  1. Structure - These are: Columns, Cells, ProximalDendrites

  2. Data - These are: DistalDendrites, Pools, Synapses and all the values. (i.e. permanences, thresholds etc.)

  3. Operations - Algorithms such as the methods on SpatialPooler, TemporalMemory, SparseBinaryMatrix etc.

Additionally, the Connections class acts as the "memory" that is passed in to the methods of the SpatialPooler and TemporalMemory. Currently, the Connections (memory object) contains both the "Structure" and the "Data", but the "structure" can (and probably will in the future) be separated out such that 1 or more identical structures (structures containing the same topology) can be used independently by "Operations" using any arbitrary collection of "Data" that is appropriate for a given structure's topology.

The above separation will allow total freedom of reuse, elimination of redundancy with multiple hierarchies, memory conservation, serialization/persistence, and isolation for the purposes of adding concurrency or parallelism later.

Next: Network Intro