I think the reason the temperature logic was so confused in the old code is because the Java code has a class `Temperature` that is used for graphical display *and* two variables in `formulas` that are used for most of the actual math. But somewhere along the line, some of the code in `formulas.java` started reading from `Temperature.value` as well. So the Python code was just faithfully copying that confusion. The actual abstraction here is a very simple "temperature" object with a stored value. It can be "clamped" to 100.0 for a given period. The only complication is that one of the codelets (the rule-transformer codelet) wants to get access to the "actual value" of the temperature even when it is clamped. The Python rule-transformer codelet also had a bug: it was accidentally setting `temperature.value` on the `temperature` module instead of on the `temperature.temperature` object! This turned some of its behavior into a no-op, for whatever that's worth. Lastly, the calculation of `finalTemperature` in the main program can now report 100.0 if the answer is found while the temperature is clamped. I don't fully understand why this didn't happen in the old code. I've hacked around it with `temperature.last_unclamped_value` for now, but I should TODO FIXME.
co.py.cat
An implementation of Douglas Hofstadter's copycat algorithm. The copycat algorithm is explained on Wikipedia, and that page has many links for deeper reading.
This implementation is a copycat of Scott Boland's Java implementation, but re-written into Python. It's not a direct translation - but based on his code. I did not carry over the GUI, as this version can more usefully be run from command line, or imported for use by other Python scripts.
In cases where I could not grok the Java implementation easily I took ideas from the LISP implementation, or directly from Melanie Mitchell's "Analogy-Making as Perception"
I also tried to make the code more pythonic.
Installation
There are no particular installation instructions, just clone and run, e.g.
$ git clone https://github.com/jalanb/co.py.cat.git
$ cd co.py.cat/copycat
$ python main.py abc abd ijk
Running
The script takes three arguments. The first two are a pair of triplets with some change, for example "abc" and "abd". The third is a triplet which the script should try to change analogously
For example the following invocation will probably display "ijl"
$ python main.py abc abd ijk