00001
00002
00003 #ifndef _DENSEMATRIXARITH_H__
00004 #define _DENSEMATRIXARITH_H__
00005
00006 #include "MathTracer.h"
00007 #include "Array.h"
00008
00009 DSS_NAMESPASE_BEGIN
00010
00011 enum ePreferedDecomposition
00012 {
00013 eLDL_decomposition,
00014 eLL_decomposition
00015 };
00016
00017
00018 class DenseMatrixArithmetics
00019 {
00020 public:
00021 long bn;
00022 long bnbn;
00023 long bn1;
00024 static long zero_pivots;
00025
00026 ePreferedDecomposition prefered_decomposition;
00027 MathTracer MT;
00028 MathTracer* eMT;
00029
00030 private:
00031 double tmp;
00032 double* p;
00033
00034 public:
00035 DenseMatrixArithmetics(long bn);
00036
00037 virtual ~DenseMatrixArithmetics();
00038
00039 static DenseMatrixArithmetics* NewArithmetics(long block_size);
00040
00041
00042 virtual void AddMultBlockByVectorSym(double* B,double* x, double* b, long bi_bn, long bj_bn);
00043
00044
00045 virtual void SubMultBlockByVector(double* B,double* x, double* b);
00046
00047
00048 virtual void SubMultTBlockByVector(double* B,double* x, double* b);
00049
00050
00051 virtual void MultDiagonalBlockByVector(double* B,double* x, double* b);
00052
00053
00054
00055 virtual void SubATBproduct(double* pC,double* pA,double* pB);
00056
00057
00058
00059
00060
00061
00062
00063 virtual void Cholesky_Decomposition(double* pC,double* &p);
00064
00065
00066
00067
00068
00069
00070 virtual void Cholesky_Solve(double *pC,double* p,double* b,double* x);
00071
00072 virtual void Cholesky_Linv(double* pC,double* p);
00073
00074 virtual void ComputeInversionByCholesky(double *C,double* Inv);
00075
00076
00077
00078
00079
00080
00081 virtual void LL_Decomposition(double* pC);
00082
00083
00084
00085
00086
00087 virtual void LL_Solve(double *pC,double* b,double* x);
00088
00089
00090
00091
00092
00093 virtual void L_BlockSolve(double *C,double* B);
00094
00095 virtual void SubstSolveL(double *pC,double* x);
00096
00097 virtual void SubstSolveLT(double *pC,double* x);
00098
00099 virtual void LU_Decomposition(double* C);
00100
00101 void LU_Solve(double* C,double* b);
00102
00103
00104
00105 void ULT_BlockSolve(double* C,double* B);
00106
00107 void LDL_Decomposition(double* A);
00108
00109 void LDL_Solve(double* A,double* b,const long startIndex = 0);
00110
00111
00112
00113 virtual void SubstSolveBlock(double* A,double* B);
00114
00115 virtual void FactorizeBlock(double* A);
00116
00117
00118 virtual void SubstSolve(double* A,double* b);
00119
00120 void ComputeInversionByLDL(double *C,double* Inv);
00121
00122 virtual void GetInversion(double* C,double* blockA);
00123
00124 virtual bool GaussElimination(double* C,double* blockA);
00125 };
00126
00127 class DenseMatrixArithmetics1x1 : public DenseMatrixArithmetics
00128 {
00129 public:
00130 DenseMatrixArithmetics1x1(long n):DenseMatrixArithmetics(n){}
00131
00132 void SubATBproduct(double* pC,double* pA,double* pB);
00133 void GetInversion(double* pC,double* pA);
00134 virtual void FactorizeBlock(double* A);
00135 virtual void SubstSolveBlock(double* A,double* B);
00136 virtual void SubstSolve(double* A,double* b);
00137 };
00138
00139 class DenseMatrixArithmetics2x2 : public DenseMatrixArithmetics
00140 {
00141 public:
00142 DenseMatrixArithmetics2x2(long n):DenseMatrixArithmetics(n){}
00143 void SubATBproduct(double* pC,double* pa,double* pb);
00144 void GetInversion(double* C,double* pA);
00145 };
00146
00147 class DenseMatrixArithmetics3x3 : public DenseMatrixArithmetics
00148 {
00149 public:
00150 DenseMatrixArithmetics3x3(long n):DenseMatrixArithmetics(n){}
00151 void SubATBproduct(double* pC,double* pa,double* pb);
00152 };
00153
00154 class DenseMatrixArithmetics4x4 : public DenseMatrixArithmetics
00155 {
00156 public:
00157 DenseMatrixArithmetics4x4(long n):DenseMatrixArithmetics(n) {}
00158 void SubATBproduct(double* pC,double* pa,double* pb);
00159 };
00160
00161 class DenseMatrixArithmetics5x5 : public DenseMatrixArithmetics
00162 {
00163 public:
00164 DenseMatrixArithmetics5x5(long n):DenseMatrixArithmetics(n) {}
00165 void SubATBproduct(double* pC,double* pA,double* pB);
00166 };
00167
00168 class DenseMatrixArithmetics6x6 : public DenseMatrixArithmetics
00169 {
00170 public:
00171 DenseMatrixArithmetics6x6(long n):DenseMatrixArithmetics(n){}
00172
00173 void SubATBproduct(double* pC,double* pA,double* pB);
00174 };
00175
00176 class DenseMatrixArithmetics_Fake : public DenseMatrixArithmetics
00177 {
00178 public:
00179 DenseMatrixArithmetics_Fake(long n):DenseMatrixArithmetics(n){}
00180 void SubATBproduct(double*C,double* blockA,double* blockB);
00181 };
00182
00183 DSS_NAMESPASE_END
00184
00185 #endif //_DENSEMATRIXARITH_H__
00186