Reproducibility

From OpenCog
Jump to: navigation, search

Reproducibility makes a number of things easier, like hunting a bug or comparing performances before and after a change.

Random Generator

OpenCog relies on a random generator defined in the cogutil library. It has a singleton factory

    randGen()

that one should call to perform all randomization. For now it inherits

    std::mt19937

One can set its random seed as follows

    randGen().seed(<SEED>);

Often, using the same random seed may be enough to reproduce the behavior.

This random generator also has scheme bindings, thus one can use it in his/her scheme code, set the seed, etc.

Set compile flag to enforce a more reproducible AtomSpace

You may directly uncomment the following line

    #define REPRODUCIBLE_ATOMSPACE

in file

opencog/atoms/base/Handle.h

which will have effects such as indexing atoms by content instead of memory addresses.

Logger

Set the logger to work synchronously

    logger().setSyncFlag(true);

Address Space Layout Randomization

If all the above still doesn't produce something deterministic you may try the following. Beware that this is somewhat dangerous. See the comment in the end.

One can ask the OS to assign memory addresses deterministically. In Linux the following command should work

    sudo sysctl -w kernel.randomize_va_space=0

WARNING: This should never be done on a server, and certainly not for very long on a client machine (your laptop, desktop, etc) since this opens up your machine to malicious code delivered from web pages, email attachments and the like. The risk is fairly low, if you are not surfing the web on the same machine.

Dealing with multithreading

Of course in order for the above to work well, memory allocation must also run deterministically. Multithreads can create such indeterminism, either directly, by for instance creating atoms in different orders, or indirectly by performing memory allocation on the same memory space. One can however minimize or in some cases eliminate these effects, see below.