Warning: this documentation for the development version is under construction.
00001 // Copyright (C) 2010 INRIA 00002 // Author(s): Marc Fragu 00003 // 00004 // This file is part of the linear-algebra library Seldon, 00005 // http://seldon.sourceforge.net/. 00006 // 00007 // Seldon is free software; you can redistribute it and/or modify it under the 00008 // terms of the GNU Lesser General Public License as published by the Free 00009 // Software Foundation; either version 2.1 of the License, or (at your option) 00010 // any later version. 00011 // 00012 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY 00013 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00014 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 00015 // more details. 00016 // 00017 // You should have received a copy of the GNU Lesser General Public License 00018 // along with Seldon. If not, see http://www.gnu.org/licenses/. 00019 00020 00021 #ifndef SELDON_FILE_HETEROGENEOUS_MATRIX_COLLECTION_HXX 00022 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 00039 template <class Prop0, class Storage0, 00040 class Prop1, class Storage1, 00041 template <class U> class Allocator> 00042 class HeterogeneousMatrixCollection: 00043 public Matrix_Base<double, Allocator<double> > 00044 { 00045 00046 // Typedef declarations. 00047 public: 00048 typedef Matrix<float, Prop0, Storage0, Allocator<float> > float_dense_m; 00049 typedef Matrix<float, Prop1, Storage1, Allocator<float> > float_sparse_m; 00050 typedef Matrix<double, Prop0, Storage0, Allocator<double> > 00051 double_dense_m; 00052 typedef Matrix<double, Prop1, Storage1, Allocator<double> > 00053 double_sparse_m; 00054 00055 typedef Matrix<float_dense_m, General, RowMajorCollection, 00056 NewAlloc<float_dense_m> > float_dense_c; 00057 typedef Matrix<float_sparse_m, General, RowMajorCollection, 00058 NewAlloc<float_sparse_m> > float_sparse_c; 00059 typedef Matrix<double_dense_m, General, RowMajorCollection, 00060 NewAlloc<double_dense_m> > double_dense_c; 00061 typedef Matrix<double_sparse_m, General, RowMajorCollection, 00062 NewAlloc<double_sparse_m> > double_sparse_c; 00063 00064 // Attributes. 00065 protected: 00067 int nz_; 00069 int Mmatrix_; 00071 int Nmatrix_; 00073 Vector<int, VectFull, CallocAlloc<int> > Mlocal_; 00075 Vector<int, VectFull, CallocAlloc<int> > Mlocal_sum_; 00077 Vector<int, VectFull, CallocAlloc<int> > Nlocal_; 00079 Vector<int, VectFull, CallocAlloc<int> > Nlocal_sum_; 00080 00082 00088 Matrix<int, General, RowMajor, CallocAlloc<int> > collection_; 00089 00091 float_dense_c float_dense_c_; 00093 float_sparse_c float_sparse_c_; 00095 double_dense_c double_dense_c_; 00097 double_sparse_c double_sparse_c_; 00098 00099 00100 // Methods. 00101 public: 00102 // Constructor. 00103 HeterogeneousMatrixCollection(); 00104 HeterogeneousMatrixCollection(int i, int j); 00105 HeterogeneousMatrixCollection 00106 (const HeterogeneousMatrixCollection<Prop0, Storage0, Prop1, 00107 Storage1, Allocator>& A); 00108 00109 // Destructor. 00110 ~HeterogeneousMatrixCollection(); 00111 void Clear(); 00112 void Nullify(); 00113 void Nullify(int i, int j); 00114 void Deallocate(); 00115 00116 // Basic methods. 00117 int GetM() const; 00118 int GetMmatrix() const; 00119 int GetM(int i) const; 00120 int GetN() const; 00121 int GetNmatrix() const; 00122 int GetN(int j) const; 00123 int GetSize() const; 00124 int GetDataSize() const; 00125 int GetType(int i, int j) const; 00126 00127 float_dense_c& GetFloatDense(); 00128 const float_dense_c& GetFloatDense() const; 00129 float_sparse_c& GetFloatSparse(); 00130 const float_sparse_c& GetFloatSparse() const; 00131 double_dense_c& GetDoubleDense(); 00132 const double_dense_c& GetDoubleDense() const; 00133 double_sparse_c& GetDoubleSparse(); 00134 const double_sparse_c& GetDoubleSparse() const; 00135 00136 // Memory management. 00137 void Reallocate(int i, int j); 00138 00139 // Management of the matrices. 00140 void SetMatrix(int m, int n, const float_dense_m&); 00141 void SetMatrix(int m, int n, const float_sparse_m&); 00142 void SetMatrix(int m, int n, const double_dense_m&); 00143 void SetMatrix(int m, int n, const double_sparse_m&); 00144 00145 // Element access and affectation. 00146 void GetMatrix(int m, int n, float_dense_m&) const; 00147 void GetMatrix(int m, int n, float_sparse_m&) const; 00148 void GetMatrix(int m, int n, double_dense_m&) const; 00149 void GetMatrix(int m, int n, double_sparse_m&) const; 00150 00151 00152 double operator() (int i, int j) const; 00153 00154 HeterogeneousMatrixCollection<Prop0, Storage0, Prop1, 00155 Storage1, Allocator>& 00156 operator= (const HeterogeneousMatrixCollection<Prop0, Storage0, 00157 Prop1, Storage1, Allocator>& A); 00158 00159 void Copy(const HeterogeneousMatrixCollection<Prop0, Storage0, 00160 Prop1, Storage1, Allocator>& A); 00161 00162 // Convenient functions. 00163 void Print() const; 00164 00165 // Input/output functions. 00166 void Write(string FileName, bool with_size) const; 00167 void Write(ostream& FileStream, bool with_size) const; 00168 void WriteText(string FileName) const; 00169 void WriteText(ostream& FileStream) const; 00170 00171 void Read(string FileName); 00172 void Read(istream& FileStream); 00173 00174 }; 00175 00176 00178 template <template <class U> class Allocator> 00179 class Matrix<FloatDouble, General, 00180 DenseSparseCollection, Allocator<double> >: 00181 public HeterogeneousMatrixCollection<General, RowMajor, General, 00182 RowSparse, Allocator > 00183 { 00184 // typedef declaration. 00185 public: 00186 typedef General property; 00187 typedef DenseSparseCollection storage; 00188 typedef Allocator<double> allocator; 00189 00190 public: 00191 Matrix(); 00192 Matrix(int i, int j); 00193 }; 00194 00195 00196 } // namespace Seldon. 00197 00198 00199 #define SELDON_FILE_HETEROGENEOUS_MATRIX_COLLECTION_HXX 00200 #endif