Code Monkey home page Code Monkey logo

minieigen's Introduction

This is miniEigen, small wrapper for the http://eigen.tuxfamily.org library.
Home of this project is at http://www.launchpad.net/minieigen/. The code is
licensed under the LGPLv3. The author is Václav Šmilauer <[email protected]>.

Documentation is uploaded to http://eudoxos.github.io/minieigen.

Run `python setup.py install` to build & install this module. You will need the
boost_python library to be installed, and Eigen (in /usr/include/eigen3, or
somewhere where the compiler finds it).

Windows is experimentally supported, but paths must be tweaked in setup.py
to match your system. Suggestions for a better way are welcome.

To compile by hand under Linux, run something like

	g++ -ansi src/miniEigen.cpp src/double-conversion/*.cc -o minieigen.so -shared -fPIC `pkg-config python --cflags` -lboost_python -I/usr/include/eigen3

Enjoy.

minieigen's People

Contributors

chrisidefix avatar cosurgi avatar donttouchthis avatar eudoxos avatar jbcolli2 avatar ofloveandhate avatar peeweep avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

minieigen's Issues

unable to compile and install with opensuse15.0

the new operating system Opensuse leap 15.0 uses some news boost library (1.66) coupled with python 3.6. this new configuration makes the python setup.py install not able to compile all the cpp file
How to update the setup.py file?

Support for Eigen::Block<> ?

Any idea to extend miniegen to support eigen blocks? I am wrapping some methods that returns blocks, thus I was wondering if a Block wrapper could be difficult to implement.. (?) or if maybe there could be some simple workaround within eigen itself...

cheers
luca

cannot find -lboost_python-py37 Error

I am trying to install minieigen in Anaconda with pip install minieigen, but it is showing the following error.

ERROR: Complete output from command /home/zorawar/anaconda3/bin/python -u -c 'import setuptools, tokenize;__file__='"'"'/tmp/pip-install-t633kxgf/minieigen/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-cczc7k_r --python-tag cp37:
  ERROR: running bdist_wheel
  running build
  running build_ext
  building 'minieigen' extension
  creating build
  creating build/temp.linux-x86_64-3.7
  creating build/temp.linux-x86_64-3.7/src
  creating build/temp.linux-x86_64-3.7/src/double-conversion
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/minieigen.cpp -o build/temp.linux-x86_64-3.7/src/minieigen.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-boxes.cpp -o build/temp.linux-x86_64-3.7/src/expose-boxes.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-complex.cpp -o build/temp.linux-x86_64-3.7/src/expose-complex.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-converters.cpp -o build/temp.linux-x86_64-3.7/src/expose-converters.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-matrices.cpp -o build/temp.linux-x86_64-3.7/src/expose-matrices.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-quaternion.cpp -o build/temp.linux-x86_64-3.7/src/expose-quaternion.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/expose-vectors.cpp -o build/temp.linux-x86_64-3.7/src/expose-vectors.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/bignum.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/bignum.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/bignum-dtoa.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/bignum-dtoa.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/cached-powers.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/cached-powers.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/diy-fp.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/diy-fp.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/double-conversion.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/double-conversion.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/fast-dtoa.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/fast-dtoa.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/fixed-dtoa.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/fixed-dtoa.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -B /home/zorawar/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DEIGEN_DONT_ALIGN -Isrc -I/usr/include/eigen3 -I/usr/local/include/eigen3 -Iminieigen -I/home/zorawar/anaconda3/include/python3.7m -c src/double-conversion/strtod.cc -o build/temp.linux-x86_64-3.7/src/double-conversion/strtod.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  src/double-conversion/strtod.cc: In function ‘float double_conversion::Strtof(double_conversion::Vector<const char>, int)’:
  src/double-conversion/strtod.cc:509:9: warning: unused variable ‘f2’ [-Wunused-variable]
     float f2 = float_guess;
           ^~
  creating build/lib.linux-x86_64-3.7
  g++ -pthread -shared -B /home/zorawar/anaconda3/compiler_compat -L/home/zorawar/anaconda3/lib -Wl,-rpath=/home/zorawar/anaconda3/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.7/src/minieigen.o build/temp.linux-x86_64-3.7/src/expose-boxes.o build/temp.linux-x86_64-3.7/src/expose-complex.o build/temp.linux-x86_64-3.7/src/expose-converters.o build/temp.linux-x86_64-3.7/src/expose-matrices.o build/temp.linux-x86_64-3.7/src/expose-quaternion.o build/temp.linux-x86_64-3.7/src/expose-vectors.o build/temp.linux-x86_64-3.7/src/double-conversion/bignum.o build/temp.linux-x86_64-3.7/src/double-conversion/bignum-dtoa.o build/temp.linux-x86_64-3.7/src/double-conversion/cached-powers.o build/temp.linux-x86_64-3.7/src/double-conversion/diy-fp.o build/temp.linux-x86_64-3.7/src/double-conversion/double-conversion.o build/temp.linux-x86_64-3.7/src/double-conversion/fast-dtoa.o build/temp.linux-x86_64-3.7/src/double-conversion/fixed-dtoa.o build/temp.linux-x86_64-3.7/src/double-conversion/strtod.o -lboost_python-py37 -o build/lib.linux-x86_64-3.7/minieigen.cpython-37m-x86_64-linux-gnu.so
  /home/zorawar/anaconda3/compiler_compat/ld: cannot find -lboost_python-py37
  collect2: error: ld returned 1 exit status
  error: command 'g++' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for minieigen

Proper unit tests with good coverage of functionality

Pieces of e-mail discussion with another user:

There are already two tests that are failing - on purpose.

  • The test "Check intersection of AlignedBox3" fails because of numerical rounding errors, but "assertAlmostEqual" is not supported here.
  • The test "Matrix3-Vector3 multiplication" should - in my opinion - not fail, mat3 * vec3 should be different from vec3 * mat3, am I right? Or is there a problem with importing the multiplication operators into Python?

...

I am very much in favor for letting it fail. So errors are much easier to locate. Moreover, it is simple to add a missing "transpose".
Actially not so simple. We have to wrap the type returned by transpose, which a row-vector. And there are no row-vector in minieigen (now). The questions is if we need them (I'd say not really), they essentially double the number of types we wrap (Vector3, Vector3i, Vector3c -- there you go for Vector3_, Vector3i_, Vector3c_ or whatever you call row vectors), and those are many already.

For that reason, there is e.g.
v.outer(w) which would be v_w.transpose() in c++ (and v.dot(w), which
also exists in Eigen, for v.transpose()_w).

Ok, I prefer very much "v.transpose()*w" for clarity, but "self.assertAlmostEqual(vec3.transpose() * mat3, Vector3(24, 30, 36))" does not work, either. Can we make that work?
We can't really modify (unless we moneky-patch it) assertAlmostEqual, but can create other function, which will detect vector types and call MatrixBase::isApprox (not wrapped, but trivial to do), and forward the call to assertAlmostEqual for non-minieigen types.

Declaring operators is OK in Python, though there were some tricky
parts (they had to be declared in some order so that boost::python
would resolve the overloads as expected IIRC).
Oh, ok. How do you find out, what is the correct order?
I don't remember, but I discovered it with some of the original tests.
So perhaps in the end just writing unittests which will test all the
possible features and misfeatures would be better.
Good, can we setup a list or continue extending the tests?
Let's do it over here at github so that we have a better record of changes. Work on you branch and I will merge your changed, and you can merge mine.

Discuss what is the scope of minieigen

Do we want transposed (row) vector types? Document also differences from Eigen in c++ where they don't map to Python, and how we handle those in Python, so that minieigen is consistent with itself. Which Eigen modules we further wrap?

Could you release a tutorial for beginners?

I have never used C++ and Eigen. I want to use this package for my scientific computation.
Will you release some tutorials for beginners?
I think it will benefit you to develop this package.

Sincerely,
Lu

Cant install 'minieigen'

Hello,

I'm trying to install minieigen but with no success.
For that reason I can't use your evaluation and training code.

The error I get is:
"Eigen/Core: No such file or directory" (more details in the figure)

figure1

If you have any ideas how can I solve it, it would be great!

Thanks!

__getitem__ demands a Python long integer

When trying to get an item out of a VectorXmp, __getitem__ demands a Python long integer. It doesn't actually affect functionality and it can be worked around in code with long(str(index)).

sage: y_end[1]
---------------------------------------------------------------------------
ArgumentError                             Traceback (most recent call last)
<ipython-input-53-4e4a51777556> in <module>()
----> 1 y_end[Integer(1)]

ArgumentError: Python argument types in
    VectorXmp.__getitem__(VectorXmp, Integer)
did not match C++ signature:
    __getitem__(Eigen::Matrix<bertini::complex, -1, 1, 0, -1, 1>, long)
sage: y_end[1L]
(0.0000000000000000e+00, 0.0000000000000000e+00)

The same behavior occurs with VectorXd. I found that Python's ints are implemented using longs (here), so there is kind of a disconnect between what Python might pass as an int and what C++ can accept as an int.

Unable to compile on recent Archlinux

Using recent version of python (3.7.1), clang++ (7.0.0), eigen (3.3.5) and boost (1.68.0), I am unable to compile minieigen, instead I have an error related to MPL_ASSERT (see attached file bellow). Despite some research, I still don't understand where the error come from. Any ideas?
minieigen.log

change return type for `get_item`

the return type for VectorVisitor's get_item is as in this line of code:

static Scalar get_item(const VectorT& self, Index ix){ IDX_CHECK(ix,dyn()?(Index)self.size():(Index)Dim); return self[ix]; }

However, for numeric types which need heap allocation (multiprecision types), this causes the return of a brand-new object. But the problem is not limited to the heap allocation, which could possibly be benign. In my case, the contents of the vectors for multiprecision types are in fact of variable precision. Observe:

import pybertini
pybertini.default_precision() # gives 16
v = pybertini.multiprec.Vector(2) # make a vector of default-constructed multiprecision complex numbers (0's)
pybertini.default_precision(20) # change precision of future-made objects.  does not affect current objects.
v[0].precision() # erroneously gives 20, should give 16

So, if I make a vector of multiprecision numbers at one precision, then change the default precision to something else, and then get an element of that same vector -- which has not changed precision -- i get

  1. a new copy of that entry
  2. at the wrong precision (doesn't actually match the internal precision of the vector).

I hence propose a modification to the VectorVisitor's get_item -- that it return an internal reference. However, perhaps this is not the desired behaviour -- should I modify minieigen so that the decision of internal reference vs copy is a policy?

Pull request will be incoming..

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.