| 253 | } |
| 254 | |
| 255 | TVector<double> SolveLower(const TVector<TVector<double>>& decompositionMatrix, |
| 256 | const TVector<double>& decompositionTrace, |
| 257 | const TVector<double>& olsVector) { |
| 258 | const size_t featuresCount = olsVector.size(); |
| 259 | |
| 260 | TVector<double> solution(featuresCount); |
| 261 | for (size_t featureNumber = 0; featureNumber < featuresCount; ++featureNumber) { |
| 262 | double& solutionElement = solution[featureNumber]; |
| 263 | solutionElement = olsVector[featureNumber]; |
| 264 | |
| 265 | const TVector<double>& decompositionRow = decompositionMatrix[featureNumber]; |
| 266 | for (size_t i = 0; i < featureNumber; ++i) { |
| 267 | solutionElement -= solution[i] * decompositionRow[i]; |
| 268 | } |
| 269 | } |
| 270 | |
| 271 | for (size_t featureNumber = 0; featureNumber < featuresCount; ++featureNumber) { |
| 272 | solution[featureNumber] /= decompositionTrace[featureNumber]; |
| 273 | } |
| 274 | |
| 275 | return solution; |
| 276 | } |
| 277 | |
| 278 | TVector<double> SolveUpper(const TVector<TVector<double>>& decompositionMatrix, |
| 279 | const TVector<double>& lowerSolution) { |