Based on work and research done by Numenta and the HTM Community!. Other work/experimentation done in this area using Elixir also includes Elixir_NE and others.
This is a second attempt for me at implementing Numenta's HTM in Elixir, using OTP
All application logic lives in the \lib directory.
https://elixir-lang.org/getting-started/introduction.html
- Clone locally, then navigate into ELIXIRHTM directory.
- Assuming that Elixir >=1.4 is installed on your system, type:
mix deps.get
# install "mix" if requested.
iex -S mix
In development: JSON API
- Hit the local http server at port 4000, letting it know our input encodings will be 100 bits long.
curl http://localhost:4000/pool/start/100
curl http://localhost:4000/SDR/10010100101001010010100101001010010100101001010010100101001010010100101001010010100101111100000
curl http://localhost:4000/pool/state/
Startup for 10k columns takes about 30 seconds, and passing in encodings, letting all columns update and strengthen, currently takes around 32ms with a 7th gen i7, which launches 8 schedulers for the BEAM vm. Adding bursting later for TM likely won't add much to this, though we're currently not weakening connections either. Planning to enable that to happen with a 10% chance each turn, rather than each turn.
Looking forward to testing it on a threadripper with its 32 cores.
Currently can only startup a single pool, but I plan to allow multiple pools for simulating geographically different areas of the brain devoted to special functions.
- Better format responses from http server. Current it's concatenating and clamping off output.
TM part of HTM. Just need to add bursting handler for handle_cast for columns to choose other columns connections at random.--> DONE!- Write some basic tests. That would be nice.
- Create some nicer abstractions: ..* such as ability to spawn multiple pools. ..* JSON-based API calls. ..* better WebUI. ..* wxGUI for local operation.
Including native functions (where existing Erlang functions aren't speedy enough): http://blog.techdominator.com/article/using-cpp-elixir-nifs.html
For example, to store connections as matrices instead of lists of bits. Early research is leaning me towards: https://github.com/versilov/matrex
As I'm trying to get anyone and everyone involved to start using and breaking this, it only seems right to provide a list of resources on Elixir itself. If you have some familarity with Ruby, Elm, or even Erlang, Elixir itself isn't too difficult to parse and pick up.
"Joy of Elixir" --> Free tutorial progressively going from basic to intermediate level.
"Learn with Me: Elixir" --> quite a few tutorials, stretching from beginner to more advanced.
"Elixir School" --> Covers from basic all the way to advanced usage, including some OTP concepts.
"Getting Started" pages on elixir-lang.org. Beginner to advanced.
The "Docs", same domain
"The Soul of Erlang and Elixir" HIGHLY RECOMMENDED!!! Talk by Saša Jurić, shows use of BEAM in live setting.
"Developing with Elixir/OTP" course is worth every penny and taught very well.
"Elixir in Action", book by Saša Jurić --> Focuses on real-world applications
"The Little Elixir & OTP Guidebook", book by Benjamin Tan Wei Hao --> provides more development path and examples with OTP.
The technology that makes this possible at at all is the BEAM virtual machine. How any why it works is a good study for any thought on distributed processing in general.