| 1 | // This may look like C code, but it is really -*- C++ -*- | 
|---|
| 2 | // This code is part of the SOPHYA library | 
|---|
| 3 | //  (C) Univ. Paris-Sud   (C) LAL-IN2P3/CNRS   (C) IRFU-CEA | 
|---|
| 4 | //  (C) R. Ansari, C.Magneville    2009-2010 | 
|---|
| 5 |  | 
|---|
| 6 | #ifndef SPESQMTX_H_SEEN | 
|---|
| 7 | #define SPESQMTX_H_SEEN | 
|---|
| 8 |  | 
|---|
| 9 | #include "ndatablock.h" | 
|---|
| 10 | #include "pexceptions.h" | 
|---|
| 11 | #include "utilarr.h" | 
|---|
| 12 | #include "tmatrix.h" | 
|---|
| 13 |  | 
|---|
| 14 |  | 
|---|
| 15 | namespace SOPHYA { | 
|---|
| 16 |  | 
|---|
| 17 | //--- enum definissant le type de matrice carre | 
|---|
| 18 | //! enum definition for the differents special square matrix types (or flavours) | 
|---|
| 19 | enum SpSqMtxType { | 
|---|
| 20 | C_UndefinedMatrix = 0,        //!< Base type | 
|---|
| 21 | C_DiagonalMatrix = 1,         //!< Diagonal Matrix | 
|---|
| 22 | C_SymmetricMatrix = 4,        //!< Symmetric Matrix | 
|---|
| 23 | C_LowerTriangularMatrix = 8,  //!< Lower Triangular Matrix | 
|---|
| 24 | C_UpperTriangularMatrix = 9   //!< Upper Triangular Matrix | 
|---|
| 25 | }; | 
|---|
| 26 |  | 
|---|
| 27 | //-- forward declaration for the PPF handler | 
|---|
| 28 | template <class T> class FIO_SpecialSquareMatrix; | 
|---|
| 29 |  | 
|---|
| 30 | template <class T> | 
|---|
| 31 | class SpecialSquareMatrix : public AnyDataObj { | 
|---|
| 32 | public : | 
|---|
| 33 |  | 
|---|
| 34 |  | 
|---|
| 35 | // Constructor - size 0, SetSize() should be called before the object is used | 
|---|
| 36 | explicit SpecialSquareMatrix(SpSqMtxType typ=C_UndefinedMatrix); | 
|---|
| 37 |  | 
|---|
| 38 | // Constructeur avec specification du nombre de lignes | 
|---|
| 39 | explicit SpecialSquareMatrix(sa_size_t rowSize, SpSqMtxType typ); | 
|---|
| 40 |  | 
|---|
| 41 | // Constructor de copy (avec partage de reference de NDataBlock) | 
|---|
| 42 | SpecialSquareMatrix(SpecialSquareMatrix<T> const & a,  bool share=true); | 
|---|
| 43 |  | 
|---|
| 44 | // Allocation / changement de taille - Doit etre redefinie par les classes derivees | 
|---|
| 45 | virtual void SetSize(sa_size_t rowSize); | 
|---|
| 46 |  | 
|---|
| 47 | //! Alias for SetSize() | 
|---|
| 48 | inline void ReSize(sa_size_t rowSize) | 
|---|
| 49 | { | 
|---|
| 50 | return SetSize(rowSize); | 
|---|
| 51 | } | 
|---|
| 52 |  | 
|---|
| 53 | //! Alias for SetSize() | 
|---|
| 54 | inline void ReSizeRow(sa_size_t rowSize) | 
|---|
| 55 | { | 
|---|
| 56 | return SetSize(rowSize); | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | // Retourne l'objet sous forme d'une TMatrix<T> | 
|---|
| 60 | virtual TMatrix<T> ConvertToStdMatrix() const; | 
|---|
| 61 |  | 
|---|
| 62 | // Clone : duplique l'objet et ses donnees | 
|---|
| 63 | virtual void Clone(SpecialSquareMatrix<T> const & a); | 
|---|
| 64 |  | 
|---|
| 65 | // Share : recopie l'objet a avec partage des donnees des elements | 
|---|
| 66 | virtual void Share(SpecialSquareMatrix<T> const & a); | 
|---|
| 67 |  | 
|---|
| 68 | // Operation de Share() si objet temporaire, Clone() sinon | 
|---|
| 69 | virtual void CloneOrShare(SpecialSquareMatrix<T> const & a); | 
|---|
| 70 |  | 
|---|
| 71 | //! Flags the associated NDataBlock as temporary if \b fgtmp==true | 
|---|
| 72 | inline void SetTemp(bool fgtmp=false) const  { mElems.SetTemp(fgtmp); } | 
|---|
| 73 |  | 
|---|
| 74 | //! Return the matrix type (Diagonal, Triangular ...) | 
|---|
| 75 | inline SpSqMtxType MtxType() const { return mType; } | 
|---|
| 76 | //! Return number of rows | 
|---|
| 77 | inline  sa_size_t NRows() const {return (int_4)mNrows;} | 
|---|
| 78 | //! Return number of colums ( = NRows()) | 
|---|
| 79 | inline  sa_size_t NCols() const {return (int_4)mNrows;} | 
|---|
| 80 |  | 
|---|
| 81 | //! Return the total number of non zero elements | 
|---|
| 82 | inline sa_size_t Size() const { return mElems.Size();} | 
|---|
| 83 |  | 
|---|
| 84 | //! Return reference to datablock containg matrix elements NDataBlock | 
|---|
| 85 | inline NDataBlock<T>& DataBlock()   { return mElems; } | 
|---|
| 86 | //! Return reference to datablock containg matrix elements NDataBlock | 
|---|
| 87 | inline const NDataBlock<T>& DataBlock() const  { return mElems; } | 
|---|
| 88 |  | 
|---|
| 89 | //! Return a reference to the associated DVList object | 
|---|
| 90 | inline DVList& Info() | 
|---|
| 91 | { if (mInfo==NULL)  mInfo = new DVList;  return (*mInfo); } | 
|---|
| 92 |  | 
|---|
| 93 | // Pour mettre tous les elements a la valeur a | 
|---|
| 94 | virtual SpecialSquareMatrix<T>& SetCst(T a); | 
|---|
| 95 |  | 
|---|
| 96 | //! Alias for SetT(a) - Set all matrix elements to the value \b a | 
|---|
| 97 | inline SpecialSquareMatrix<T>& SetT(T a) | 
|---|
| 98 | { return SetCst(a); } | 
|---|
| 99 |  | 
|---|
| 100 | //  Egalite/Recopie element par element | 
|---|
| 101 | virtual SpecialSquareMatrix<T>& Set(SpecialSquareMatrix<T> const & a); | 
|---|
| 102 |  | 
|---|
| 103 | //  Remplissage avec une sequence de valeurs | 
|---|
| 104 | virtual SpecialSquareMatrix<T>& SetSeq(Sequence const & seq); | 
|---|
| 105 |  | 
|---|
| 106 | // Ajout de la constante "b: a  tous les elements | 
|---|
| 107 | virtual SpecialSquareMatrix<T>& AddCst(T b); | 
|---|
| 108 |  | 
|---|
| 109 | // Soustrait "b" a  tous les elements - fginv==true -> elem = b-elem | 
|---|
| 110 | virtual SpecialSquareMatrix<T>& SubCst(T b, bool fginv=false); | 
|---|
| 111 |  | 
|---|
| 112 | // Multiplie "b" a tous les elements | 
|---|
| 113 | virtual SpecialSquareMatrix<T>& MulCst(T b); | 
|---|
| 114 |  | 
|---|
| 115 | // Divise tous les elements par "b". fginv==true elem = b / elem | 
|---|
| 116 | virtual SpecialSquareMatrix<T>& DivCst(T b, bool fginv=false); | 
|---|
| 117 |  | 
|---|
| 118 | // Addition element par element:  elem(l,c) = elem(l,c) + b.elem(l,c) | 
|---|
| 119 | virtual SpecialSquareMatrix<T>& AddElt(SpecialSquareMatrix<T> const& b); | 
|---|
| 120 |  | 
|---|
| 121 | // Soustraction element par element : elem(l,c) = elem(l,c) - b.elem(l,c) | 
|---|
| 122 | virtual SpecialSquareMatrix<T>& SubElt(SpecialSquareMatrix<T> const& b); | 
|---|
| 123 |  | 
|---|
| 124 | // Multiplication element par element : elem(l,c) = elem(l,c) * b.elem(l,c) | 
|---|
| 125 | virtual SpecialSquareMatrix<T>& MulElt(SpecialSquareMatrix<T> const& b); | 
|---|
| 126 |  | 
|---|
| 127 | // Division element par element : elem(l,c) = elem(l,c) / b.elem(l,c) | 
|---|
| 128 | virtual SpecialSquareMatrix<T>& DivElt(SpecialSquareMatrix<T> const& b); | 
|---|
| 129 |  | 
|---|
| 130 | //--- Operateurs = (T b) , = (SpecialSquareMatrix<T> b) | 
|---|
| 131 | //! operator = a , to set all elements to the value \b a | 
|---|
| 132 | inline SpecialSquareMatrix<T>& operator = (T a) | 
|---|
| 133 | {  return SetCst(a);  } | 
|---|
| 134 | //! operator = SpecialSquareMatrix<T> a , element by element copy operator | 
|---|
| 135 | inline SpecialSquareMatrix<T>& operator = (SpecialSquareMatrix<T> const & a) | 
|---|
| 136 | {  return Set(a); } | 
|---|
| 137 | //! operator = Sequence seq , | 
|---|
| 138 | inline SpecialSquareMatrix<T>& operator = (Sequence const & seq) | 
|---|
| 139 | {  return SetSeq(seq); } | 
|---|
| 140 |  | 
|---|
| 141 | //--- Operateur += -= *= /= (T b) | 
|---|
| 142 | //! operator += b , Add a constant value \b b to all elements | 
|---|
| 143 | inline SpecialSquareMatrix<T>& operator += (T b) | 
|---|
| 144 | { return AddCst(b); } | 
|---|
| 145 | //! operator -= b , subtract a constant value \b b from all elements | 
|---|
| 146 | inline SpecialSquareMatrix<T>& operator -= (T b) | 
|---|
| 147 | { return SubCst(b); } | 
|---|
| 148 | //! operator *= b , multiply all elements by  a constant value \b b | 
|---|
| 149 | inline SpecialSquareMatrix<T>& operator *= (T b) | 
|---|
| 150 | { return MulCst(b); } | 
|---|
| 151 | //! operator /= b , divide all elements by  a constant value \b b | 
|---|
| 152 | inline SpecialSquareMatrix<T>& operator /= (T b) | 
|---|
| 153 | { return DivCst(b); } | 
|---|
| 154 |  | 
|---|
| 155 | //! Element access operator (R/W): access to the element at position \b index - No bound checking | 
|---|
| 156 | inline T& operator[](sa_size_t index) | 
|---|
| 157 | { return  mElems(index); } | 
|---|
| 158 | //! Element access operator (RO): access to the element at position \b index - No bound checking | 
|---|
| 159 | inline T operator[](sa_size_t index) const | 
|---|
| 160 | { return  mElems(index); } | 
|---|
| 161 |  | 
|---|
| 162 | // Valeur min et max des elements (sauf tableaux complexes -> exception) | 
|---|
| 163 | virtual void MinMax(T& min, T& max) const ; | 
|---|
| 164 |  | 
|---|
| 165 | // Impression / representation texte sur le flot os | 
|---|
| 166 | virtual ostream& Show(ostream& os) const; | 
|---|
| 167 |  | 
|---|
| 168 | friend class FIO_SpecialSquareMatrix<T>; | 
|---|
| 169 | //.............. | 
|---|
| 170 | protected: | 
|---|
| 171 | SpSqMtxType mType;        //!< Type of the square matrix (diagonal, symmetric, triangular) | 
|---|
| 172 | sa_size_t mNrows;         //!< size of the square matrix | 
|---|
| 173 | NDataBlock<T> mElems;     //!< Data block | 
|---|
| 174 | DVList* mInfo;            //!< Associated DVList structure | 
|---|
| 175 | }; | 
|---|
| 176 |  | 
|---|
| 177 | //! print (ascii representation) operator | 
|---|
| 178 | template <class T> | 
|---|
| 179 | inline ostream& operator << (ostream& os, const SpecialSquareMatrix<T>& a) | 
|---|
| 180 | { a.Show(os);    return(os);    } | 
|---|
| 181 |  | 
|---|
| 182 | //////////////////////////////////////////////////////////////// | 
|---|
| 183 | // Surcharge d'operateurs A (+,-,*,/) (T) x | 
|---|
| 184 |  | 
|---|
| 185 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,T) | 
|---|
| 186 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + constant */ | 
|---|
| 187 | template <class T> inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a, T b) | 
|---|
| 188 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 189 | result.SetTemp(true);  result.AddCst(b); return result; } | 
|---|
| 190 |  | 
|---|
| 191 | /*! \ingroup TArray \fn operator+(T,const SpecialSquareMatrix<T>&) | 
|---|
| 192 | \brief Operator SpecialSquareMatrix = constant + SpecialSquareMatrix */ | 
|---|
| 193 | template <class T> inline SpecialSquareMatrix<T> operator + (T b,const SpecialSquareMatrix<T>& a) | 
|---|
| 194 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 195 | result.SetTemp(true);  result.AddCst(b); return result; } | 
|---|
| 196 |  | 
|---|
| 197 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,T) | 
|---|
| 198 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - constant */ | 
|---|
| 199 | template <class T> inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a, T b) | 
|---|
| 200 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 201 | result.SetTemp(true);  result.SubCst(b); return result; } | 
|---|
| 202 |  | 
|---|
| 203 | /*! \ingroup TArray \fn operator-(T,const SpecialSquareMatrix<T>&) | 
|---|
| 204 | \brief Operator SpecialSquareMatrix = constant - SpecialSquareMatrix */ | 
|---|
| 205 | template <class T> inline SpecialSquareMatrix<T> operator - (T b,const SpecialSquareMatrix<T>& a) | 
|---|
| 206 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 207 | result.SetTemp(true);  result.SubCst(b, true); return result; } | 
|---|
| 208 |  | 
|---|
| 209 | /*! \ingroup TArray \fn operator*(const SpecialSquareMatrix<T>&,T) | 
|---|
| 210 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix * constant */ | 
|---|
| 211 | template <class T> inline SpecialSquareMatrix<T> operator * (const SpecialSquareMatrix<T>& a, T b) | 
|---|
| 212 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 213 | result.SetTemp(true);  result.MulCst(b); return result; } | 
|---|
| 214 |  | 
|---|
| 215 | /*! \ingroup TArray \fn operator*(T,const SpecialSquareMatrix<T>&) | 
|---|
| 216 | \brief Operator SpecialSquareMatrix = constant * SpecialSquareMatrix */ | 
|---|
| 217 | template <class T> inline SpecialSquareMatrix<T> operator * (T b,const SpecialSquareMatrix<T>& a) | 
|---|
| 218 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 219 | result.SetTemp(true);  result.MulCst(b); return result; } | 
|---|
| 220 |  | 
|---|
| 221 | /*! \ingroup TArray \fn operator/(const SpecialSquareMatrix<T>&,T) | 
|---|
| 222 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix / constant */ | 
|---|
| 223 | template <class T> inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a, T b) | 
|---|
| 224 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 225 | result.SetTemp(true);  result.DivCst(b); return result; } | 
|---|
| 226 |  | 
|---|
| 227 | /*! \ingroup TArray \fn operator/(T,const SpecialSquareMatrix<T>&) | 
|---|
| 228 | \brief Operator SpecialSquareMatrix = constant / SpecialSquareMatrix  */ | 
|---|
| 229 | template <class T> inline SpecialSquareMatrix<T> operator / (T b, const SpecialSquareMatrix<T>& a) | 
|---|
| 230 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 231 | result.SetTemp(true);  result.DivCst(b, true); return result; } | 
|---|
| 232 |  | 
|---|
| 233 |  | 
|---|
| 234 | //////////////////////////////////////////////////////////////// | 
|---|
| 235 | // Surcharge d'operateurs C = A (+,-,&&,/) B | 
|---|
| 236 |  | 
|---|
| 237 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&) | 
|---|
| 238 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + SpecialSquareMatrix (element by element addition) */ | 
|---|
| 239 | template <class T> | 
|---|
| 240 | inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b) | 
|---|
| 241 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 242 | result.SetTemp(true);  result.AddElt(b); return result; } | 
|---|
| 243 |  | 
|---|
| 244 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&) | 
|---|
| 245 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - SpecialSquareMatrix (element by element subtraction) */ | 
|---|
| 246 | template <class T> | 
|---|
| 247 | inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b) | 
|---|
| 248 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 249 | result.SetTemp(true);  result.SubElt(b); return result; } | 
|---|
| 250 |  | 
|---|
| 251 | /*! \ingroup TArray \fn operator && (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&) | 
|---|
| 252 | \brief Element by element multiplication of two arrays SpecialSquareMatrix = SpecialSquareMatrix * SpecialSquareMatrix */ | 
|---|
| 253 |  | 
|---|
| 254 | template <class T> | 
|---|
| 255 | inline SpecialSquareMatrix<T> operator && (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b) | 
|---|
| 256 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 257 | result.SetTemp(true);  result.MulElt(b); return result; } | 
|---|
| 258 |  | 
|---|
| 259 | /*! \ingroup TArray \fn operator / (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&) | 
|---|
| 260 | \brief Element by element division of two arrays SpecialSquareMatrix = SpecialSquareMatrix / SpecialSquareMatrix */ | 
|---|
| 261 | template <class T> | 
|---|
| 262 | inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b) | 
|---|
| 263 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a); | 
|---|
| 264 | result.SetTemp(true);  result.DivElt(b); return result; } | 
|---|
| 265 |  | 
|---|
| 266 | //--------- extern template declarations (if needed) ----------- | 
|---|
| 267 | #if defined ( NEED_EXT_DECL_TEMP ) && !defined( SPESQMTX_CC_BFILE ) | 
|---|
| 268 | extern template class SpecialSquareMatrix<uint_1>; | 
|---|
| 269 | extern template class SpecialSquareMatrix<uint_2>; | 
|---|
| 270 | extern template class SpecialSquareMatrix<uint_4>; | 
|---|
| 271 | extern template class SpecialSquareMatrix<uint_8>; | 
|---|
| 272 | extern template class SpecialSquareMatrix<int_1>; | 
|---|
| 273 | extern template class SpecialSquareMatrix<int_2>; | 
|---|
| 274 | extern template class SpecialSquareMatrix<int_4>; | 
|---|
| 275 | extern template class SpecialSquareMatrix<int_8>; | 
|---|
| 276 | extern template class SpecialSquareMatrix<r_4>; | 
|---|
| 277 | extern template class SpecialSquareMatrix<r_8>; | 
|---|
| 278 | extern template class SpecialSquareMatrix< complex<r_4> >; | 
|---|
| 279 | extern template class SpecialSquareMatrix< complex<r_8> >; | 
|---|
| 280 | #ifdef SO_LDBLE128 | 
|---|
| 281 | extern template class SpecialSquareMatrix<r_16>; | 
|---|
| 282 | extern template class SpecialSquareMatrix< complex<r_16> >; | 
|---|
| 283 | #endif | 
|---|
| 284 | #endif  // Fin de if defined ( NEED_EXT_DECL_TEMP ) | 
|---|
| 285 |  | 
|---|
| 286 | }   // namespace SOPHYA | 
|---|
| 287 |  | 
|---|
| 288 | #endif | 
|---|