File indexing completed on 2025-01-18 09:58:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #ifndef G4ErrorMatrix_hh
0036 #define G4ErrorMatrix_hh
0037
0038 #include <vector>
0039 #include "G4Types.hh"
0040
0041 class G4ErrorSymMatrix;
0042
0043 typedef std::vector<G4double>::iterator G4ErrorMatrixIter;
0044 typedef std::vector<G4double>::const_iterator G4ErrorMatrixConstIter;
0045
0046 class G4ErrorMatrix
0047 {
0048 public:
0049 G4ErrorMatrix();
0050
0051
0052
0053 G4ErrorMatrix(G4int p, G4int q);
0054
0055
0056 G4ErrorMatrix(G4int p, G4int q, G4int i);
0057
0058
0059
0060
0061 G4ErrorMatrix(const G4ErrorMatrix& m1);
0062 G4ErrorMatrix(G4ErrorMatrix&&) = default;
0063
0064
0065 G4ErrorMatrix(const G4ErrorSymMatrix& m1);
0066
0067
0068 virtual ~G4ErrorMatrix();
0069
0070
0071 inline virtual G4int num_row() const;
0072
0073
0074 inline virtual G4int num_col() const;
0075
0076
0077 inline virtual const G4double& operator()(G4int row, G4int col) const;
0078 inline virtual G4double& operator()(G4int row, G4int col);
0079
0080
0081
0082 G4ErrorMatrix& operator*=(G4double t);
0083
0084
0085 G4ErrorMatrix& operator/=(G4double t);
0086
0087
0088 G4ErrorMatrix& operator+=(const G4ErrorMatrix& m2);
0089 G4ErrorMatrix& operator+=(const G4ErrorSymMatrix& m2);
0090 G4ErrorMatrix& operator-=(const G4ErrorMatrix& m2);
0091 G4ErrorMatrix& operator-=(const G4ErrorSymMatrix& m2);
0092
0093
0094
0095 G4ErrorMatrix& operator=(const G4ErrorMatrix& m2);
0096 G4ErrorMatrix& operator=(const G4ErrorSymMatrix& m2);
0097 G4ErrorMatrix& operator=(G4ErrorMatrix&&) = default;
0098
0099
0100 G4ErrorMatrix operator-() const;
0101
0102
0103 G4ErrorMatrix apply(G4double (*f)(G4double, G4int, G4int)) const;
0104
0105
0106 G4ErrorMatrix T() const;
0107
0108
0109 G4ErrorMatrix sub(G4int min_row, G4int max_row, G4int min_col,
0110 G4int max_col) const;
0111
0112
0113
0114 void sub(G4int row, G4int col, const G4ErrorMatrix& m1);
0115
0116
0117
0118 inline G4ErrorMatrix inverse(G4int& ierr) const;
0119
0120
0121
0122 virtual void invert(G4int& ierr);
0123
0124
0125
0126
0127
0128 G4double determinant() const;
0129
0130
0131 G4double trace() const;
0132
0133
0134 class G4ErrorMatrix_row
0135 {
0136 typedef std::vector<G4double>::const_iterator G4ErrorMatrixConstIter;
0137
0138 public:
0139 inline G4ErrorMatrix_row(G4ErrorMatrix&, G4int);
0140 G4double& operator[](G4int);
0141
0142 private:
0143 G4ErrorMatrix& _a;
0144 G4int _r;
0145 };
0146 class G4ErrorMatrix_row_const
0147 {
0148 public:
0149 inline G4ErrorMatrix_row_const(const G4ErrorMatrix&, G4int);
0150 const G4double& operator[](G4int) const;
0151
0152 private:
0153 const G4ErrorMatrix& _a;
0154 G4int _r;
0155 };
0156
0157
0158 inline G4ErrorMatrix_row operator[](G4int);
0159 inline const G4ErrorMatrix_row_const operator[](G4int) const;
0160
0161
0162
0163
0164 protected:
0165 virtual inline G4int num_size() const;
0166 virtual void invertHaywood4(G4int& ierr);
0167 virtual void invertHaywood5(G4int& ierr);
0168 virtual void invertHaywood6(G4int& ierr);
0169
0170 public:
0171 static void error(const char* s);
0172
0173 private:
0174 friend class G4ErrorMatrix_row;
0175 friend class G4ErrorMatrix_row_const;
0176 friend class G4ErrorSymMatrix;
0177
0178
0179 friend G4ErrorMatrix operator+(const G4ErrorMatrix& m1,
0180 const G4ErrorMatrix& m2);
0181 friend G4ErrorMatrix operator-(const G4ErrorMatrix& m1,
0182 const G4ErrorMatrix& m2);
0183 friend G4ErrorMatrix operator*(const G4ErrorMatrix& m1,
0184 const G4ErrorMatrix& m2);
0185 friend G4ErrorMatrix operator*(const G4ErrorMatrix& m1,
0186 const G4ErrorSymMatrix& m2);
0187 friend G4ErrorMatrix operator*(const G4ErrorSymMatrix& m1,
0188 const G4ErrorMatrix& m2);
0189 friend G4ErrorMatrix operator*(const G4ErrorSymMatrix& m1,
0190 const G4ErrorSymMatrix& m2);
0191
0192
0193
0194
0195 friend G4ErrorMatrix qr_solve(G4ErrorMatrix*, const G4ErrorMatrix& b);
0196 friend void tridiagonal(G4ErrorSymMatrix* a, G4ErrorMatrix* hsm);
0197 friend void row_house(G4ErrorMatrix*, const G4ErrorMatrix&, G4double, G4int,
0198 G4int, G4int, G4int);
0199 friend void back_solve(const G4ErrorMatrix& R, G4ErrorMatrix* b);
0200 friend void col_givens(G4ErrorMatrix* A, G4double c, G4double s, G4int k1,
0201 G4int k2, G4int rowmin, G4int rowmax);
0202
0203
0204 friend void row_givens(G4ErrorMatrix* A, G4double c, G4double s, G4int k1,
0205 G4int k2, G4int colmin, G4int colmax);
0206 friend void col_house(G4ErrorMatrix*, const G4ErrorMatrix&, G4double, G4int,
0207 G4int, G4int, G4int);
0208 friend void house_with_update(G4ErrorMatrix* a, G4int row, G4int col);
0209 friend void house_with_update(G4ErrorMatrix* a, G4ErrorMatrix* v, G4int row,
0210 G4int col);
0211 friend void house_with_update2(G4ErrorSymMatrix* a, G4ErrorMatrix* v,
0212 G4int row, G4int col);
0213
0214 G4int dfact_matrix(G4double& det, G4int* ir);
0215
0216
0217
0218
0219 G4int dfinv_matrix(G4int* ir);
0220
0221
0222 std::vector<G4double> m;
0223
0224 G4int nrow, ncol;
0225 G4int size;
0226 };
0227
0228
0229
0230 G4ErrorMatrix operator*(const G4ErrorMatrix& m1, const G4ErrorMatrix& m2);
0231 G4ErrorMatrix operator*(G4double t, const G4ErrorMatrix& m1);
0232 G4ErrorMatrix operator*(const G4ErrorMatrix& m1, G4double t);
0233
0234
0235
0236 G4ErrorMatrix operator/(const G4ErrorMatrix& m1, G4double t);
0237
0238
0239 G4ErrorMatrix operator+(const G4ErrorMatrix& m1, const G4ErrorMatrix& m2);
0240
0241
0242
0243 G4ErrorMatrix operator-(const G4ErrorMatrix& m1, const G4ErrorMatrix& m2);
0244
0245
0246
0247 G4ErrorMatrix dsum(const G4ErrorMatrix&, const G4ErrorMatrix&);
0248
0249
0250
0251
0252 std::ostream& operator<<(std::ostream& s, const G4ErrorMatrix& q);
0253
0254
0255
0256
0257
0258
0259 G4ErrorMatrix qr_solve(const G4ErrorMatrix& A, const G4ErrorMatrix& b);
0260 G4ErrorMatrix qr_solve(G4ErrorMatrix* A, const G4ErrorMatrix& b);
0261
0262
0263
0264 G4ErrorMatrix qr_inverse(const G4ErrorMatrix& A);
0265 G4ErrorMatrix qr_inverse(G4ErrorMatrix* A);
0266
0267
0268
0269
0270 void qr_decomp(G4ErrorMatrix* A, G4ErrorMatrix* hsm);
0271 G4ErrorMatrix qr_decomp(G4ErrorMatrix* A);
0272
0273
0274 void back_solve(const G4ErrorMatrix& R, G4ErrorMatrix* b);
0275
0276
0277
0278
0279 void col_house(G4ErrorMatrix* a, const G4ErrorMatrix& v, G4double vnormsq,
0280 G4int row, G4int col, G4int row_start, G4int col_start);
0281 void col_house(G4ErrorMatrix* a, const G4ErrorMatrix& v, G4int row, G4int col,
0282 G4int row_start, G4int col_start);
0283
0284
0285 void col_givens(G4ErrorMatrix* A, G4double c, G4double s, G4int k1, G4int k2,
0286 G4int row_min = 1, G4int row_max = 0);
0287
0288
0289 void row_givens(G4ErrorMatrix* A, G4double c, G4double s, G4int k1, G4int k2,
0290 G4int col_min = 1, G4int col_max = 0);
0291
0292
0293
0294
0295
0296
0297
0298 void house_with_update(G4ErrorMatrix* a, G4int row = 1, G4int col = 1);
0299 void house_with_update(G4ErrorMatrix* a, G4ErrorMatrix* v, G4int row = 1,
0300 G4int col = 1);
0301
0302
0303 void row_house(G4ErrorMatrix* a, const G4ErrorMatrix& v, G4double vnormsq,
0304 G4int row, G4int col, G4int row_start, G4int col_start);
0305 void row_house(G4ErrorMatrix* a, const G4ErrorMatrix& v, G4int row, G4int col,
0306 G4int row_start, G4int col_start);
0307
0308
0309 #include "G4ErrorMatrix.icc"
0310
0311 #endif