Warning: this documentation for the development version is under construction.
00001 // Copyright (C) 2001-2009 Vivien Mallet 00002 // 00003 // This file is part of the linear-algebra library Seldon, 00004 // http://seldon.sourceforge.net/. 00005 // 00006 // Seldon is free software; you can redistribute it and/or modify it under the 00007 // terms of the GNU Lesser General Public License as published by the Free 00008 // Software Foundation; either version 2.1 of the License, or (at your option) 00009 // any later version. 00010 // 00011 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY 00012 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00013 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 00014 // more details. 00015 // 00016 // You should have received a copy of the GNU Lesser General Public License 00017 // along with Seldon. If not, see http://www.gnu.org/licenses/. 00018 00019 00020 // To be included by Seldon.hxx 00021 00022 #ifndef SELDON_FILE_MATRIX_SPARSE_HXX 00023 00024 #include "../share/Common.hxx" 00025 #include "../share/Properties.hxx" 00026 #include "../share/Storage.hxx" 00027 #include "../share/Errors.hxx" 00028 #include "../share/Allocator.hxx" 00029 00030 namespace Seldon 00031 { 00032 00033 00035 00042 template <class T, class Prop, class Storage, 00043 class Allocator = SELDON_DEFAULT_ALLOCATOR<T> > 00044 class Matrix_Sparse: public Matrix_Base<T, Allocator> 00045 { 00046 // typedef declaration. 00047 public: 00048 typedef typename Allocator::value_type value_type; 00049 typedef typename Allocator::pointer pointer; 00050 typedef typename Allocator::const_pointer const_pointer; 00051 typedef typename Allocator::reference reference; 00052 typedef typename Allocator::const_reference const_reference; 00053 typedef value_type entry_type; 00054 typedef value_type access_type; 00055 typedef value_type const_access_type; 00056 00057 // Attributes. 00058 protected: 00059 // Number of non-zero elements. 00060 int nz_; 00061 // Index (in data_) of first element stored for each row or column. 00062 int* ptr_; 00063 // Column or row index (in the matrix) each element. 00064 int* ind_; 00065 00066 // Methods. 00067 public: 00068 // Constructors. 00069 Matrix_Sparse(); 00070 Matrix_Sparse(int i, int j); 00071 Matrix_Sparse(int i, int j, int nz); 00072 template <class Storage0, class Allocator0, 00073 class Storage1, class Allocator1, 00074 class Storage2, class Allocator2> 00075 Matrix_Sparse(int i, int j, Vector<T, Storage0, Allocator0>& values, 00076 Vector<int, Storage1, Allocator1>& ptr, 00077 Vector<int, Storage2, Allocator2>& ind); 00078 Matrix_Sparse(const Matrix_Sparse<T, Prop, Storage, Allocator>& A); 00079 00080 // Destructor. 00081 ~Matrix_Sparse(); 00082 void Clear(); 00083 00084 // Memory management. 00085 template <class Storage0, class Allocator0, 00086 class Storage1, class Allocator1, 00087 class Storage2, class Allocator2> 00088 void SetData(int i, int j, 00089 Vector<T, Storage0, Allocator0>& values, 00090 Vector<int, Storage1, Allocator1>& ptr, 00091 Vector<int, Storage2, Allocator2>& ind); 00092 void SetData(int i, int j, int nz, pointer values, int* ptr, int* ind); 00093 void Nullify(); 00094 void Reallocate(int i, int j); 00095 void Reallocate(int i, int j, int nz); 00096 void Resize(int i, int j); 00097 void Resize(int i, int j, int nz); 00098 void Copy(const Matrix_Sparse<T, Prop, Storage, Allocator>& A); 00099 00100 // Basic methods. 00101 int GetNonZeros() const; 00102 int GetDataSize() const; 00103 int* GetPtr() const; 00104 int* GetInd() const; 00105 int GetPtrSize() const; 00106 int GetIndSize() const; 00107 00108 // Element acess and affectation. 00109 value_type operator() (int i, int j) const; 00110 value_type& Val(int i, int j); 00111 value_type& Get(int i, int j); 00112 #ifndef SWIG 00113 const value_type& Val(int i, int j) const; 00114 const value_type& Get(int i, int j) const; 00115 #endif 00116 void AddInteraction(int i, int j, const T& val); 00117 void Set(int i, int j, const T& x); 00118 #ifndef SWIG 00119 Matrix_Sparse<T, Prop, Storage, Allocator>& 00120 operator= (const Matrix_Sparse<T, Prop, Storage, Allocator>& A); 00121 #endif 00122 00123 // Convenient functions. 00124 void Zero(); 00125 void SetIdentity(); 00126 void Fill(); 00127 template <class T0> 00128 void Fill(const T0& x); 00129 void FillRand(); 00130 void FillRand(int Nelement); 00131 void FillRand(int Nelement, const T& x); 00132 00133 void Print() const; 00134 void Write(string FileName) const; 00135 void Write(ostream& FileStream) const; 00136 void WriteText(string FileName) const; 00137 void WriteText(ostream& FileStream) const; 00138 void Read(string FileName); 00139 void Read(istream& FileStream); 00140 void ReadText(string FileName); 00141 void ReadText(istream& FileStream); 00142 }; 00143 00144 00146 template <class T, class Prop, class Allocator> 00147 class Matrix<T, Prop, ColSparse, Allocator>: 00148 public Matrix_Sparse<T, Prop, ColSparse, Allocator> 00149 { 00150 // typedef declaration. 00151 public: 00152 typedef typename Allocator::value_type value_type; 00153 typedef Prop property; 00154 typedef ColSparse storage; 00155 typedef Allocator allocator; 00156 00157 public: 00158 Matrix(); 00159 Matrix(int i, int j); 00160 Matrix(int i, int j, int nz); 00161 template <class Storage0, class Allocator0, 00162 class Storage1, class Allocator1, 00163 class Storage2, class Allocator2> 00164 Matrix(int i, int j, 00165 Vector<T, Storage0, Allocator0>& values, 00166 Vector<int, Storage1, Allocator1>& ptr, 00167 Vector<int, Storage2, Allocator2>& ind); 00168 }; 00169 00170 00172 template <class T, class Prop, class Allocator> 00173 class Matrix<T, Prop, RowSparse, Allocator>: 00174 public Matrix_Sparse<T, Prop, RowSparse, Allocator> 00175 { 00176 // typedef declaration. 00177 public: 00178 typedef typename Allocator::value_type value_type; 00179 typedef Prop property; 00180 typedef RowSparse storage; 00181 typedef Allocator allocator; 00182 00183 public: 00184 Matrix(); 00185 Matrix(int i, int j); 00186 Matrix(int i, int j, int nz); 00187 template <class Storage0, class Allocator0, 00188 class Storage1, class Allocator1, 00189 class Storage2, class Allocator2> 00190 Matrix(int i, int j, 00191 Vector<T, Storage0, Allocator0>& values, 00192 Vector<int, Storage1, Allocator1>& ptr, 00193 Vector<int, Storage2, Allocator2>& ind); 00194 00195 }; 00196 00197 template<class Tint, class AllocInt, class T, class Allocator> 00198 void ReadCoordinateMatrix(istream& FileStream, 00199 Vector<Tint, VectFull, AllocInt>& row_numbers, 00200 Vector<Tint, VectFull, AllocInt>& col_numbers, 00201 Vector<T, VectFull, Allocator>& values); 00202 00203 template<class Matrix1, class T> 00204 void ReadCoordinateMatrix(Matrix1& A, istream& FileStream, T& zero, 00205 int index = 1, int nnz = -1); 00206 00207 00208 } // namespace Seldon. 00209 00210 #define SELDON_FILE_MATRIX_SPARSE_HXX 00211 #endif