Categories
dev

Installing MultiNEAT

import MultiNEAT as NEAT

need to install MultiNEAT.

Tried to install
using these instructions
https://github.com/peter-ch/MultiNEAT

it said success despite this:

byte-compiling build/bdist.linux-x86_64/egg/MultiNEAT/init.py to init.pyc
File "build/bdist.linux-x86_64/egg/MultiNEAT/init.py", line 45
t = {**traits, 'w':w}
^
SyntaxError: invalid syntax


Installed /usr/local/lib/python2.7/dist-packages/multineat-0.5-py2.7-linux-x86_64.egg
Processing dependencies for multineat==0.5
Finished processing dependencies for multineat==0.5


then tried
pip install .
https://stackoverflow.com/questions/1471994/what-is-setup-py
It gets these errors:

/usr/bin/ld: cannot find -lboost_python36
/usr/bin/ld: cannot find -lboost_numpy36

boost libs missing. Apparently it has a conda install, but I don’t entirely understand whether conda and pip will play nicely together. conda also a big install and the Chromebook is not big on space. Ok Miniconda is smaller.

https://anaconda.org/conda-forge/multineat

To install this package with conda run one of the following:
conda install -c conda-forge multineat
conda install -c conda-forge/label/cf201901 multineat
conda install -c conda-forge/label/cf202003 multineat

apt-get install libboost-all-dev
...already installed

https://stackoverflow.com/questions/36881958/c-program-cannot-find-boost possible solution.

ah…

/usr/local/lib/python2.7/dist-packages

root@chrx:/opt/MultiNEAT# ls -l /usr/local/lib/python2.7/dist-packages
total 7312
-rw-r–r– 1 root staff 39 Apr 8 21:50 easy-install.pth
-rw-r–r– 1 root staff 7482106 Apr 8 21:50 multineat-0.5-py2.7-linux-x86_64.egg

so it’s compiling with python2.

I’m gonna go with conda instead.

conda install MultiNEAT

https://anaconda.org/conda-forge/multineat

https://docs.conda.io/en/latest/miniconda.html#linux-installers

you need to chmod 755 the install file, and don’t forget to add to $PATH.

echo “PATH=$PATH:/opt/miniconda3/bin” >> ~/.bashrc

then close window and open new bash window, to refresh envs. (envs are environment variables, if someone is actually reading this)

conda install -c conda-forge multineat

(base) root@chrx:~# conda install -c conda-forge multineat
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: | 
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
failed                                                                          

UnsatisfiableError: The following specifications were found
to be incompatible with the existing python installation in your environment:

Specifications:

  - multineat -> python[version='>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.5,<3.6.0a0']

Your python: python=3.7

If python is on the left-most side of the chain, that's the version you've asked for.
When python appears to the right, that indicates that the thing on the left is somehow
not available for the python version you are constrained to. Note that conda will not
change your python version to a different minor version unless you explicitly specify
that.

ok…

root@chrx:~# conda info

     active environment : base
    active env location : /opt/miniconda3
            shell level : 1
       user config file : /root/.condarc
 populated config files : /root/.condarc
          conda version : 4.8.2
    conda-build version : not installed
         python version : 3.7.6.final.0
       virtual packages : __glibc=2.27
       base environment : /opt/miniconda3  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /opt/miniconda3/pkgs
                          /root/.conda/pkgs
       envs directories : /opt/miniconda3/envs
                          /root/.conda/envs
               platform : linux-64
             user-agent : conda/4.8.2 requests/2.22.0 CPython/3.7.6 Linux/4.16.18-galliumos galliumos/3.1 glibc/2.27
                UID:GID : 0:0
             netrc file : None
           offline mode : False


ok let’s go back to compiling boost from source cause conda don’t like 3.7. Which seems like I should do a –force or something, cause wtf. So here’s the theory of C++ linking (fml):

https://stackoverflow.com/questions/16710047/usr-bin-ld-cannot-find-lnameofthelibrary

here’s more relevant

https://askubuntu.com/questions/944035/installing-libboost-python-dev-for-python3-without-installing-python2-7

https://stackoverflow.com/questions/12578499/how-to-install-boost-on-ubuntu

Here’s some Dockerfile on it:

RUN cd /usr/src && \
 wget --no-verbose https://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_65_1.tar.gz && \
 tar xzf boost_1_65_1.tar.gz && \
 cd boost_1_65_1 && \
 ln -s /usr/local/include/python3.6m /usr/local/include/python3.6 && \
 ./bootstrap.sh --with-python=$(which python3) && \
 ./b2 install && \
 rm /usr/local/include/python3.6 && \
 ldconfig && \
 cd / && rm -rf /usr/src/*

I’m doing the steps one by one, ./b2 made it compile. it’s taking like a good few mins now.

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

    /opt/boost_1_65_1

The following directory should be added to linker library paths:

    /opt/boost_1_65_1/stage/lib

ok let’s try again…

/usr/bin/ld: cannot find -lboost_python36
/usr/bin/ld: cannot find -lboost_numpy36

ldconfig

nope ok where is the library?

# find | grep boost_python

(there's all the boost libs i built under /opt, and also these:)

./usr/lib/x86_64-linux-gnu/libboost_python-py36.so
./usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1
./usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.65.1
./usr/lib/x86_64-linux-gnu/libboost_python3-py36.so
./usr/lib/x86_64-linux-gnu/libboost_python-py27.a
./usr/lib/x86_64-linux-gnu/libboost_python-py36.a
./usr/lib/x86_64-linux-gnu/libboost_python.so
./usr/lib/x86_64-linux-gnu/libboost_python3.a
./usr/lib/x86_64-linux-gnu/libboost_python-py27.so
./usr/lib/x86_64-linux-gnu/libboost_python3.so
./usr/lib/x86_64-linux-gnu/libboost_python3-py36.a
./usr/lib/x86_64-linux-gnu/libboost_python.a

Ok ./usr/lib/x86_64-linux-gnu/ is where the .so is.

https://stackoverflow.com/questions/3808775/cmake-doesnt-find-boost

https://askubuntu.com/questions/449348/why-are-boost-package-libs-installed-to-usr-lib-x86-64-linux-gnu

https://stackoverflow.com/questions/36881958/c-program-cannot-find-boost

the last one had the sauce that worked for someone for something similar

So I’m changing this bit of setup.py

        include_dirs = ['/opt/boost_1_65_1']
        library_dirs = ['/opt/boost_1_65_1/stage/lib']
        extra.extend(['-DUSE_BOOST_PYTHON', '-DUSE_BOOST_RANDOM', #'-O0',
                      #'-DVDEBUG',
                      ])
        exx = Extension('MultiNEAT._MultiNEAT',
                        sources,
                        libraries=libs,
                        library_dirs=library_dirs,
                        include_dirs=include_dirs,
                        extra_compile_args=extra)

nope

https://unix.stackexchange.com/questions/423821/gcc-usr-bin-ld-cannot-find-lglut32-lopengl32-lglu32-lfreegut-but-these

So we need to use LD somehow.

You need:

  1. To actually have the library in your computer
  2. Help gcc/the linker to find the library by providing the path to the library
    • You can add -Ldir-name to the gcc command
    • You can the library location to the LD_LIBRARY_PATH environment variable
  3. Update the “Dynamic Linker“:sudo ldconfig

Let’s see what it’s running…

x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/src/PythonBindings.o build/temp.linux-x86_64-3.6/src/Genome.o build/temp.linux-x86_64-3.6/src/Innovation.o build/temp.linux-x86_64-3.6/src/NeuralNetwork.o build/temp.linux-x86_64-3.6/src/Parameters.o build/temp.linux-x86_64-3.6/src/PhenotypeBehavior.o build/temp.linux-x86_64-3.6/src/Population.o build/temp.linux-x86_64-3.6/src/Random.o build/temp.linux-x86_64-3.6/src/Species.o build/temp.linux-x86_64-3.6/src/Substrate.o build/temp.linux-x86_64-3.6/src/Utils.o -L/opt/boost_1_65_1/stage/lib -lboost_system -lboost_serialization -lboost_python36 -lboost_numpy36 -o build/lib.linux-x86_64-3.6/MultiNEAT/_MultiNEAT.cpython-36m-x86_64-linux-gnu.so

ok and indeed there doesn’t seem to be anything under /opt/boost_1_65_1/stage/lib with python in the name. We found it in /usr/lib/x86_64-linux-gnu/ earlier.

nope nope nope

https://stackoverflow.com/questions/24173330/cmake-is-not-able-to-find-boost-libraries

SET (BOOST_ROOT "/opt/boost_1_65_1")
SET (BOOST_INCLUDEDIR "/opt/boost_1_65_1/boost")
SET (BOOST_LIBRARYDIR "/opt/boost_1_65_1/libs")

ok so I think it’s just that the Boost.Python package isn’t here. It’s in usr/lib … hmm more later

Here’s something promising: https://github.com/andrewssobral/bgslibrary/issues/96

#:/usr/lib/x86_64-linux-gnu# find | grep boost_python
./libboost_python-py36.so
./libboost_python3-py36.so.1.65.1
./libboost_python-py27.so.1.65.1
./libboost_python3-py36.so
./libboost_python-py27.a
./libboost_python-py36.a
./libboost_python.so
./libboost_python3.a
./libboost_python-py27.so
./libboost_python3.so
./libboost_python3-py36.a
./libboost_python.a

Hmm the answer doesn’t make sense here. Half of those are already symlinks. Let’s go back and make sure we compiled correctly.

./bootstrap.sh --with-libraries=python --with-python=python3.6

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH

nope. ok what is cmake doing?

It calls Find.Boost,

dies on :

No header defined for python36; skipping header check

No header defined for numpy36; skipping header check

so, ok i worked it out

I changed the CMakeList.txt line to -lboost_python3 -lboost_numpy3

Installed /usr/local/lib/python3.6/dist-packages/multineat-0.5-py3.6-linux-x86_64.egg
Processing dependencies for multineat==0.5
Finished processing dependencies for multineat==0.5

ok but when i try run a python boi in the examples folder,

Boost.Python.ArgumentError: Python argument types in
Genome.init(Genome, int, int, int, int, bool, ActivationFunction, ActivationFunction, int, Parameters, int)
did not match C++ signature:
init(_object*, unsigned int, unsigned int, unsigned int, unsigned int, bool, NEAT::ActivationFunction, NEAT::ActivationFunction, int, NEAT::Parameters, unsigned int, unsigned int)

ok fuck it, github, help me.

https://github.com/peter-ch/MultiNEAT/issues

Ok so the guy pointed out that the constructor changed. It works fine now, after adding a field.