There are several ways to install the library. They are all equivalent, and only differ in a level of control over the process.
It is easiest to install directly from github:
$ python -m pip install git+https://github.com/ev-br/mc_lib.git@master
Under the hood we use meson and PEP517 as a build
system, but this is well hidden and need not be a concern.
Now test your fresh install:
$ pytest --pyargs mc_lib -v
Alternatively, clone the repository from GitHub and run pip on the local clone:
$ git clone https://github.com/ev-br/mc_lib.git
$ cd mc_lib
$ python -m pip install .
This is needed if you plan to develop the library. First, get meson itself,
together with other build dependencies:
$ python -m pip install -r requirements.txt
Then, clone the source repository
$ git clone https://github.com/ev-br/mc_lib.git
$ cd mc_lib
Meson uses a configure and a build stage. We configure it to use
build/ for a working directory and place a local install into the
installdir/ directory:
$ meson setup build --prefix=$PWD/installdir
$ meson install -C build
Finally, make the installdir/ visible to python:
$ export PYTHONPATH=$PWD/installdir/lib/python{Your python version}/site-packages
Now the installation is usable and tests should pass:
$ pytest mc_lib -v --pyargs
See the dev.sh shell script, which does these steps in order.
>>> from mc_lib.lattice import get_neighbors # for sc and other lattices
and
%% cython --cplus
from mc_lib cimport RealObservable # for statistics
from mc_lib.rndm cimport RndmWrapper # For rndm.uniform in Cython
See examples/cy_ising.pyx for a usage example.
You may need to tell Jupyter where to find the library. To do this,
run (in a python cell), import mc_lib; print(mc_lib.get_include()), and
paste the output into the -I parameter of the %%cython magic:
In [7]: %%cython --I<copy-paste the path here>
...: from mc_lib.rndm cimport RndmWrapper
...: cdef RndmWrapper rndm = RndmWrapper((123, 0))
...: print(rndm.uniform())
-
Generally you will need
cython,numpy >= 1.19.5(becauseRndmWrapperwrapsnp.random.Generator) andpytestfor testing. -
On Apple M1, the numpy requirement is
numpy >= 1.21.0(which is the first numpy version to support this hardware). -
Since
RealObservableuses C++, you'll need to compile your client Cython code to C++ not C. E.g. in a Jupyter notebook, use
%%cython --cplus
from mc_lib cimport RealObservable
- On MacOS you may need to tell cython to use C++11, via the
-std=C++11switch or some such. This is due to the fact that by default, xcode selects an older C++ dialect. As an example of using this in a Jupyter notebook, seeexamples/frustrated_2d_ising.ipynb. For command-line usage, seemeson.buildfiles in the mainmc_librepository.
Here are several common problems:
-
Compilation prints something about
numpy deprecated API. This is harmless, safe to ignore. -
Compilations warns out
tp_printbeing deprecated on python 3.9 and above. This is harmless, safe to ignore. -
Compilation fails with errors suggesting that
std::tieshould bestd::time. You are probably on a MacOS, and your C++ compiler does not use C++11. Add to your compile step a C++ flag-std=C++11or-std=C++17. -
Trying to compile Cython code fails because it does not find
numpy/random/bitgen.hheader. Either your numpy is too old (you need at least1.19.5), or you need to add a.get_include()path to the cython compile step.
If you face an issue with either building or using the library, do not hesitate to open an issue at our tracker, https://github.com/ev-br/mc_lib/issues.