# HG changeset patch # User Dmitriy Morozov <dmitriy@mrzv.org> # Date 1336690012 25200 # Node ID 45589223382c54c14e7812aa4709c19c9952b3d8 # Parent ad3aefb5a0e037270aec5b8ca7d292b5b243ec37 Inlcuded munkres.cpp from munkres.h + matrix.cpp -> matrix.hpp diff -r ad3aefb5a0e0 -r 45589223382c bindings/python/CMakeLists.txt --- a/bindings/python/CMakeLists.txt Thu May 10 15:42:21 2012 -0700 +++ b/bindings/python/CMakeLists.txt Thu May 10 15:46:52 2012 -0700 @@ -18,7 +18,6 @@ cohomology-persistence.cpp rips.cpp distances.cpp - ../../include/utilities/munkres/munkres.cpp ) set (bindings_libraries ${libraries}) diff -r ad3aefb5a0e0 -r 45589223382c include/utilities/munkres/matrix.cpp --- a/include/utilities/munkres/matrix.cpp Thu May 10 15:42:21 2012 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2007 John Weaver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "matrix.h" - -#include <cassert> -#include <cstdlib> -#include <algorithm> - -/*export*/ template <class T> -Matrix<T>::Matrix() { - m_rows = 0; - m_columns = 0; - m_matrix = NULL; -} - -/*export*/ template <class T> -Matrix<T>::Matrix(const Matrix<T> &other) { - if ( other.m_matrix != NULL ) { - // copy arrays - m_matrix = NULL; - resize(other.m_rows, other.m_columns); - for ( int i = 0 ; i < m_rows ; i++ ) - for ( int j = 0 ; j < m_columns ; j++ ) - m_matrix[i][j] = other.m_matrix[i][j]; - } else { - m_matrix = NULL; - m_rows = 0; - m_columns = 0; - } -} - -/*export*/ template <class T> -Matrix<T>::Matrix(int rows, int columns) { - m_matrix = NULL; - resize(rows, columns); -} - -/*export*/ template <class T> -Matrix<T> & -Matrix<T>::operator= (const Matrix<T> &other) { - if ( other.m_matrix != NULL ) { - // copy arrays - resize(other.m_rows, other.m_columns); - for ( int i = 0 ; i < m_rows ; i++ ) - for ( int j = 0 ; j < m_columns ; j++ ) - m_matrix[i][j] = other.m_matrix[i][j]; - } else { - // free arrays - for ( int i = 0 ; i < m_columns ; i++ ) - delete [] m_matrix[i]; - - delete [] m_matrix; - - m_matrix = NULL; - m_rows = 0; - m_columns = 0; - } - - return *this; -} - -/*export*/ template <class T> -Matrix<T>::~Matrix() { - if ( m_matrix != NULL ) { - // free arrays - for ( int i = 0 ; i < m_rows ; i++ ) - delete [] m_matrix[i]; - - delete [] m_matrix; - } - m_matrix = NULL; -} - -/*export*/ template <class T> -void -Matrix<T>::resize(int rows, int columns) { - if ( m_matrix == NULL ) { - // alloc arrays - m_matrix = new T*[rows]; // rows - for ( int i = 0 ; i < rows ; i++ ) - m_matrix[i] = new T[columns]; // columns - - m_rows = rows; - m_columns = columns; - clear(); - } else { - // save array pointer - T **new_matrix; - // alloc new arrays - new_matrix = new T*[rows]; // rows - for ( int i = 0 ; i < rows ; i++ ) { - new_matrix[i] = new T[columns]; // columns - for ( int j = 0 ; j < columns ; j++ ) - new_matrix[i][j] = 0; - } - - // copy data from saved pointer to new arrays - int minrows = std::min<int>(rows, m_rows); - int mincols = std::min<int>(columns, m_columns); - for ( int x = 0 ; x < minrows ; x++ ) - for ( int y = 0 ; y < mincols ; y++ ) - new_matrix[x][y] = m_matrix[x][y]; - - // delete old arrays - if ( m_matrix != NULL ) { - for ( int i = 0 ; i < m_rows ; i++ ) - delete [] m_matrix[i]; - - delete [] m_matrix; - } - - m_matrix = new_matrix; - } - - m_rows = rows; - m_columns = columns; -} - -/*export*/ template <class T> -void -Matrix<T>::identity() { - assert( m_matrix != NULL ); - - clear(); - - int x = std::min<int>(m_rows, m_columns); - for ( int i = 0 ; i < x ; i++ ) - m_matrix[i][i] = 1; -} - -/*export*/ template <class T> -void -Matrix<T>::clear() { - assert( m_matrix != NULL ); - - for ( int i = 0 ; i < m_rows ; i++ ) - for ( int j = 0 ; j < m_columns ; j++ ) - m_matrix[i][j] = 0; -} - -/*export*/ template <class T> -T -Matrix<T>::trace() { - assert( m_matrix != NULL ); - - T value = 0; - - int x = std::min<int>(m_rows, m_columns); - for ( int i = 0 ; i < x ; i++ ) - value += m_matrix[i][i]; - - return value; -} - -/*export*/ template <class T> -Matrix<T>& -Matrix<T>::transpose() { - assert( m_rows > 0 ); - assert( m_columns > 0 ); - - int new_rows = m_columns; - int new_columns = m_rows; - - if ( m_rows != m_columns ) { - // expand matrix - int m = std::max<int>(m_rows, m_columns); - resize(m,m); - } - - for ( int i = 0 ; i < m_rows ; i++ ) { - for ( int j = i+1 ; j < m_columns ; j++ ) { - T tmp = m_matrix[i][j]; - m_matrix[i][j] = m_matrix[j][i]; - m_matrix[j][i] = tmp; - } - } - - if ( new_columns != new_rows ) { - // trim off excess. - resize(new_rows, new_columns); - } - - return *this; -} - -/*export*/ template <class T> -Matrix<T> -Matrix<T>::product(Matrix<T> &other) { - assert( m_matrix != NULL ); - assert( other.m_matrix != NULL ); - assert ( m_columns == other.m_rows ); - - Matrix<T> out(m_rows, other.m_columns); - - for ( int i = 0 ; i < out.m_rows ; i++ ) { - for ( int j = 0 ; j < out.m_columns ; j++ ) { - for ( int x = 0 ; x < m_columns ; x++ ) { - out(i,j) += m_matrix[i][x] * other.m_matrix[x][j]; - } - } - } - - return out; -} - -/*export*/ template <class T> -T& -Matrix<T>::operator ()(int x, int y) { - assert ( x >= 0 ); - assert ( y >= 0 ); - assert ( x < m_rows ); - assert ( y < m_columns ); - assert ( m_matrix != NULL ); - return m_matrix[x][y]; -} diff -r ad3aefb5a0e0 -r 45589223382c include/utilities/munkres/matrix.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/utilities/munkres/matrix.hpp Thu May 10 15:46:52 2012 -0700 @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2007 John Weaver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "matrix.h" + +#include <cassert> +#include <cstdlib> +#include <algorithm> + +/*export*/ template <class T> +Matrix<T>::Matrix() { + m_rows = 0; + m_columns = 0; + m_matrix = NULL; +} + +/*export*/ template <class T> +Matrix<T>::Matrix(const Matrix<T> &other) { + if ( other.m_matrix != NULL ) { + // copy arrays + m_matrix = NULL; + resize(other.m_rows, other.m_columns); + for ( int i = 0 ; i < m_rows ; i++ ) + for ( int j = 0 ; j < m_columns ; j++ ) + m_matrix[i][j] = other.m_matrix[i][j]; + } else { + m_matrix = NULL; + m_rows = 0; + m_columns = 0; + } +} + +/*export*/ template <class T> +Matrix<T>::Matrix(int rows, int columns) { + m_matrix = NULL; + resize(rows, columns); +} + +/*export*/ template <class T> +Matrix<T> & +Matrix<T>::operator= (const Matrix<T> &other) { + if ( other.m_matrix != NULL ) { + // copy arrays + resize(other.m_rows, other.m_columns); + for ( int i = 0 ; i < m_rows ; i++ ) + for ( int j = 0 ; j < m_columns ; j++ ) + m_matrix[i][j] = other.m_matrix[i][j]; + } else { + // free arrays + for ( int i = 0 ; i < m_columns ; i++ ) + delete [] m_matrix[i]; + + delete [] m_matrix; + + m_matrix = NULL; + m_rows = 0; + m_columns = 0; + } + + return *this; +} + +/*export*/ template <class T> +Matrix<T>::~Matrix() { + if ( m_matrix != NULL ) { + // free arrays + for ( int i = 0 ; i < m_rows ; i++ ) + delete [] m_matrix[i]; + + delete [] m_matrix; + } + m_matrix = NULL; +} + +/*export*/ template <class T> +void +Matrix<T>::resize(int rows, int columns) { + if ( m_matrix == NULL ) { + // alloc arrays + m_matrix = new T*[rows]; // rows + for ( int i = 0 ; i < rows ; i++ ) + m_matrix[i] = new T[columns]; // columns + + m_rows = rows; + m_columns = columns; + clear(); + } else { + // save array pointer + T **new_matrix; + // alloc new arrays + new_matrix = new T*[rows]; // rows + for ( int i = 0 ; i < rows ; i++ ) { + new_matrix[i] = new T[columns]; // columns + for ( int j = 0 ; j < columns ; j++ ) + new_matrix[i][j] = 0; + } + + // copy data from saved pointer to new arrays + int minrows = std::min<int>(rows, m_rows); + int mincols = std::min<int>(columns, m_columns); + for ( int x = 0 ; x < minrows ; x++ ) + for ( int y = 0 ; y < mincols ; y++ ) + new_matrix[x][y] = m_matrix[x][y]; + + // delete old arrays + if ( m_matrix != NULL ) { + for ( int i = 0 ; i < m_rows ; i++ ) + delete [] m_matrix[i]; + + delete [] m_matrix; + } + + m_matrix = new_matrix; + } + + m_rows = rows; + m_columns = columns; +} + +/*export*/ template <class T> +void +Matrix<T>::identity() { + assert( m_matrix != NULL ); + + clear(); + + int x = std::min<int>(m_rows, m_columns); + for ( int i = 0 ; i < x ; i++ ) + m_matrix[i][i] = 1; +} + +/*export*/ template <class T> +void +Matrix<T>::clear() { + assert( m_matrix != NULL ); + + for ( int i = 0 ; i < m_rows ; i++ ) + for ( int j = 0 ; j < m_columns ; j++ ) + m_matrix[i][j] = 0; +} + +/*export*/ template <class T> +T +Matrix<T>::trace() { + assert( m_matrix != NULL ); + + T value = 0; + + int x = std::min<int>(m_rows, m_columns); + for ( int i = 0 ; i < x ; i++ ) + value += m_matrix[i][i]; + + return value; +} + +/*export*/ template <class T> +Matrix<T>& +Matrix<T>::transpose() { + assert( m_rows > 0 ); + assert( m_columns > 0 ); + + int new_rows = m_columns; + int new_columns = m_rows; + + if ( m_rows != m_columns ) { + // expand matrix + int m = std::max<int>(m_rows, m_columns); + resize(m,m); + } + + for ( int i = 0 ; i < m_rows ; i++ ) { + for ( int j = i+1 ; j < m_columns ; j++ ) { + T tmp = m_matrix[i][j]; + m_matrix[i][j] = m_matrix[j][i]; + m_matrix[j][i] = tmp; + } + } + + if ( new_columns != new_rows ) { + // trim off excess. + resize(new_rows, new_columns); + } + + return *this; +} + +/*export*/ template <class T> +Matrix<T> +Matrix<T>::product(Matrix<T> &other) { + assert( m_matrix != NULL ); + assert( other.m_matrix != NULL ); + assert ( m_columns == other.m_rows ); + + Matrix<T> out(m_rows, other.m_columns); + + for ( int i = 0 ; i < out.m_rows ; i++ ) { + for ( int j = 0 ; j < out.m_columns ; j++ ) { + for ( int x = 0 ; x < m_columns ; x++ ) { + out(i,j) += m_matrix[i][x] * other.m_matrix[x][j]; + } + } + } + + return out; +} + +/*export*/ template <class T> +T& +Matrix<T>::operator ()(int x, int y) { + assert ( x >= 0 ); + assert ( y >= 0 ); + assert ( x < m_rows ); + assert ( y < m_columns ); + assert ( m_matrix != NULL ); + return m_matrix[x][y]; +} diff -r ad3aefb5a0e0 -r 45589223382c include/utilities/munkres/munkres.h --- a/include/utilities/munkres/munkres.h Thu May 10 15:42:21 2012 -0700 +++ b/include/utilities/munkres/munkres.h Thu May 10 15:46:52 2012 -0700 @@ -46,4 +46,7 @@ int saverow, savecol; }; +// DM: This is dangerous, but will do for now +#include "munkres.cpp" + #endif /* !defined(_MUNKRES_H_) */