Bug reports

If you find any bug or misbehaviour of Gmm++, please send a mail with a full report to Yves.Renard@insa-lyon.fr.

Known bugs

Gmm++ Faq

GMM++ seems to crash frequently, is it bugged ?

Remember that you have to CATCH ERRORS in your main procedure. GMM++ uses "throw" when an error occurs such as uncompatible dimensions. See the documentation.

In a function such as mult(A, B, C), is the dimensions of the result (C) adapted to the dimensions of the input parameters ?
No, You have to declare C with the right dimensions. This is the case for all the algorithms in GMM++. The reason is that C could be a reference such as a sub matrix, a sub vector or a line of a matrix for instance. With last version 1.6 of GMM++ you can use resize(C, ..) or reshape(C, ..) to change the size of a vector or the dimensions of a matrix, but of course only if it is not a reference.
How do I release the memory used by a vector or matrix ? resize(0) does not work.
If the object cannot be destroyed, the usual way is to swap its content with the content of a short-lived empty object:
     std::vector<double> v(100000000);
     ...
     { 
       dense_vector<double> w; 
       v.swap(w); // or swap(v,w)
     } // w is destroyed, and v.capacity() == 0
      
How does Gmm++ compare with other c++ linear algebra libraries (MTL, Pooma, uBlas, ..) ?

The main difference is that Gmm++ primary aim is not to be a standalone linear algebra library, but is more aimed at interoperability between several linear algebra packages. It started as a glue code between the several vector and matrix classes used in getfem++.

Its code size is kept as small as possible, and no attempt has been made (for now) to parallelize it.

Why GMM++ defines add, mult, scale procedures instead of overloaded operator +, *, - ...
This is a big discussion. The choice in GMM++ is to be able to have reasonably optimized operations in all mixed cases (operations mixing sparse, skyline and dense matrices and vectors), to accept various format (for instance for spares matrices) and finally to be able to interface already existing matrix and vector types. This seems not to be possible with overloaded operator (since it is not possible to overload operator = outside of a class), and in our opinion this does not offer a big advantage (but a big complexity !).
How can I interface a CSC or CSR matrix coming form a Fortran or C code ?
An interface exists in the file "gmm_interface.h". The usage is
      gmm::csc_matrix_ref<PT1, PT2, PT3, shift>  M1(pr, ir, jc, nrows, ncols)
      gmm::csr_matrix_ref<PT1, PT2, PT3, shift>  M2(pr, ir, jc, nrows, ncols)
      
where PT1 is the type of pointer to the data (double * for instance), PT1 and PT2 the types of pointers to the indices (int * for instance) and shift is 1 for matrices coming from Fortran codes and 0 for the ones coming from C or MATLAB codes. This is a read_only reference. If you want to modify your matrix you have to copy it first in a writable matrix such as gmm::col_matrix<gmm::rsvector<T> >.