Hi Everybody, After 2 (looooooooong) months we finally have usable NuPIC functionality in Java!
Repo: https://github.com/numenta/htm.java Wiki: https://github.com/numenta/htm.java/wiki Twitter: https://twitter.com/search?q=%23HtmJavaDevUpdates&src=typd Here's a blurb describing the goals, and future plans for the project: ====== Throughout the development of the TemporalMemory and the SpatialPooler, there was an emphasis on keeping a 1-to-1 correlation between the methods and functions implementing each algorithm in the Java and Python versions. To this end, I would say that 98% of the Python tests in each module have the *exact* same output produced within the Java unit tests and integration tests. The only place where they differ is in places where calls to an underlying RandomNumberGenerator have a significant impact - however, even in those places, every other aspect of the code output is carefully monitored to ensure that had certain initial parameters been the same, the two versions (Python and Java) would produce the exact same output. This was achieved by altering the Python tests temporarily to be initialized with the same values that the Java version was initialized with - and making sure the output produced was the same! Additionally, a utility object (ArrayUtils) was created to bridge the gap between functionality native to Python which doesn't exist in Java and there was the creation of the SparseMatrix (and its subclasses: SparseBinaryMatrix, and SparseObjectMatrix) to handle array shaping and vector math operations. There are a few architectural differences in the Java version. 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 (inspired by Chetan's Connections object) 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. Roadmap: At this point the SpatialPooler can be connected to the TemporalMemory to produce output within a given Java project - since those two classes represent the major inference functionality of NuPIC. However, in order to exactly reproduce the convenience of the Online Prediction Framework, other structures would need to be implemented - and so those are next on the list to be implemented. The anticipated roadmap is as follows: 1.) Create the BaseEncoder and derivative encoders which are currently relevant (since one or two may have become obsolete). The culmination of which should be the GEOSpatialEncoder I assume. 2.) Classifiers will then be next on the list which will complete the current hierarchy of functionality. 3.) Following this, Layer and Regional constructs will be created to coordinate and manage data flow in this hierarchy. 4.) Then we'll loop around and take a look at what "Research" sensorymotor based new development can be formally pulled in and guide the reshaping of the Java version to a form that reflects the most current theory. 5.) Then we'll do an optimization/performance pass over the entire codebase to make it at least as fast as whatever C++ version is available. (*wink*) -- *We find it hard to hear what another is saying because of how loudly "who one is", speaks...*
