41Fang2017filter_wDF::Fang2017filter_wDF() {}
42Fang2017filter_wDF::Fang2017filter_wDF(
int _Nsamples)
58 return timeVector(timeStepI);
65 return timeVector(_timeStepI);
114 observations = _observations;
122 M_Assert(_endTime > _startTime,
"endTime must be bigger than startTime");
123 startTime = _startTime;
124 deltaTime = _deltaTime;
126 Ntimes = (endTime - startTime) / deltaTime;
127 Foam::Info <<
"startTime = " << startTime << Foam::endl;
128 Foam::Info <<
"endTime = " << endTime << Foam::endl;
129 Foam::Info <<
"deltaTime = " << deltaTime << Foam::endl;
130 Foam::Info <<
"Ntimes = " << Ntimes << Foam::endl;
131 timeVector = Eigen::VectorXd::LinSpaced(Ntimes + 1, startTime, endTime);
137 int _observationDelta)
139 M_Assert(timeVector.size() > 0,
140 "Setup the timeVector before setting up the observations vector");
141 M_Assert(_observationStart > 0,
"First observation timestep can't be 0");
142 observationStart = _observationStart;
143 observationDelta = _observationDelta;
144 Foam::Info <<
"First observation at time = " << timeVector(observationStart) <<
" s"
146 Foam::Info <<
"Observations taken every " << observationDelta <<
" timesteps" << Foam::endl;
147 observationBoolVec = Eigen::VectorXi::Zero(timeVector.size() - 1);
149 for (
int i = observationStart - 1; i < Ntimes; i += observationDelta)
151 observationBoolVec(i) = 1;
159 M_Assert(stateSize > 0,
"Set the stateSize before setting up the model error");
160 Eigen::VectorXd modelError_mu;
161 Eigen::MatrixXd modelError_cov;
165 modelError_mu = Eigen::VectorXd::Zero(1);
166 modelError_cov = Eigen::MatrixXd::Identity(1, 1) * cov;
170 modelError_mu = Eigen::VectorXd::Zero(stateSize);
171 modelError_cov = Eigen::MatrixXd::Identity(stateSize, stateSize) * cov;
183 M_Assert(observationSize > 0,
184 "Read measurements before setting up the measurement noise");
185 Eigen::VectorXd measNoise_mu = Eigen::VectorXd::Zero(observationSize);
186 Eigen::MatrixXd measNoise_cov = Eigen::MatrixXd::Identity(observationSize,
187 observationSize) * cov;
190 measurementNoiseFlag = 1;
196 Eigen::MatrixXd _cov,
bool _univariateFlag)
198 M_Assert(!(stateSize == 0 && _univariateFlag),
199 "If stateSize is not set you cannot use univariate InitialStateDensity");
201 if (_univariateFlag == 0)
205 stateSize = _mean.size();
209 std::string message =
"State has size = " + std::to_string(
210 stateSize) +
" while input mean vector has size = " + std::to_string(
212 M_Assert(stateSize == _mean.size(), message.c_str());
215 M_Assert(_cov.rows() == stateSize
216 && _cov.cols() == stateSize,
217 "To initialize the state ensemble use mean and cov with same dimentions");
221 univariateInitStateDensFlag = 1;
222 M_Assert(_mean.size() == 1,
223 "If univariateInitStateDensFlag is 1 mean size is 1");
224 M_Assert(_cov.size() == 1,
"If univariateInitStateDensFlag is 1 cov size is 1");
227 initialStateDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
228 initialStateFlag = 1;
235 Foam::Info <<
"Setting initial state ensamble" << Foam::endl;
236 M_Assert(initialStateFlag == 1,
237 "Initialize the initial state density before sampling it");
239 if (univariateInitStateDensFlag)
241 M_Assert(stateSize > 0,
"Set stateSize before sampleInitialState");
242 M_Assert(Nsamples > 0,
"Set Nsamples before sampleInitialState");
243 Eigen::MatrixXd _stateEns(stateSize, Nsamples);
245 for (
int i = 0; i < Nsamples; i++)
247 for (
int j = 0; j < stateSize; j++)
249 _stateEns(j, i) = initialStateDensity->Sample()(0, 0);
260 Foam::Info <<
"debug: State ensamble size = " <<
stateEns.getSize() << Foam::endl;
266 Eigen::MatrixXd _cov)
268 if (parameterSize == 0)
270 parameterSize = _mean.size();
274 std::string message =
"The input mean has size = " + std::to_string(
275 _mean.size()) +
" but the parameterSize is " + std::to_string(parameterSize);
276 M_Assert(parameterSize == _mean.size(), message.c_str());
279 M_Assert(_cov.rows() == parameterSize
280 && _cov.cols() == parameterSize,
"Use mean and cov with same dimentions");
281 parameterPriorMean = _mean;
282 parameterPriorCov = _cov;
283 parameterPriorDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
284 parameterPriorFlag = 1;
291 M_Assert(parameterPriorFlag == 1,
"Set up the parameter prior density");
299 std::shared_ptr<muq::Modeling::Gaussian> _density)
301 M_Assert(Nsamples > 0,
"Number of samples not set up correctly");
302 Eigen::MatrixXd output(_density->Sample().size(), Nsamples);
304 for (
int i = 0; i < Nsamples; i++)
306 output.col(i) = _density->Sample();
317 Eigen::MatrixXd stateSamps =
stateEns.getSamples();
319 M_Assert(stateSamps.cols() == paramSamps.cols(),
320 "State and parameter ensambles must have same number of samples");
321 Eigen::MatrixXd temp(stateSamps.rows() + paramSamps.rows(), stateSamps.cols());
329void Fang2017filter_wDF::setObservationSize(
int _size)
331 observationSize = _size;
332 Foam::Info <<
"Observation size = " << observationSize << Foam::endl;
337void Fang2017filter_wDF::setStateSize(
int _size)
340 Foam::Info <<
"State size = " << stateSize << Foam::endl;
345int Fang2017filter_wDF::getStateSize()
352void Fang2017filter_wDF::setParameterSize(
int _size)
354 parameterSize = _size;
355 Foam::Info <<
"Parameter size = " << parameterSize << Foam::endl;
360int Fang2017filter_wDF::getParameterSize()
362 return parameterSize;
367void Fang2017filter_wDF::updateJointEns(Eigen::VectorXd _observation)
369 M_Assert(_observation.size() == observationSize,
370 "Observation has wrong dimentions");
376 for (
int i = 0; i < ensSize; i++)
378 Eigen::VectorXd newSamp =
jointEns.getSample(i) + crossCov * autoCovInverse *
387 Eigen::MatrixXd kalmanGain = crossCov *
391 std::ofstream outputFileAutoCovInverse(
"condNumberAutoCovInverse.txt",
393 std::ofstream outputFileCrossCov(
"condNumberCrossCov.txt", std::ios::app);
394 std::ofstream outputKalmanGain(
"condNumberKalmanGain.txt", std::ios::app);
396 outputFileAutoCovInverse << condAutoCovInverse <<
"\n";
397 outputFileCrossCov << condCrossCov <<
"\n";
398 outputKalmanGain << condKalmanGain <<
"\n";
400 outputFileAutoCovInverse.close();
401 outputFileCrossCov.close();
402 outputKalmanGain.close();
411 M_Assert(initialStateFlag == 1,
"Set up the initial state density");
412 M_Assert(parameterPriorFlag == 1,
"Set up the parameter prior density");
413 M_Assert(modelErrorFlag == 1,
"Set up the model error");
414 M_Assert(measurementNoiseFlag == 1,
"Set up the measurement noise");
415 M_Assert(stateSize > 0,
"Set state size");
416 M_Assert(observationSize > 0,
"Set observation size");
417 M_Assert(parameterSize > 0,
"Set parameter size");
420 stateMean.resize(stateSize, Ntimes);
425 parameterMean.resize(parameterSize, Ntimes);
427 while (timeStepI < Ntimes)
429 Foam::Info <<
"timeStep " << timeStepI << Foam::endl;
434 Foam::Info <<
"debugInside: parameterPriorMean = " << parameterPriorMean << Foam::endl;
445 if (observationBoolVec(timeStepI) ==
450 while (innerLoopI < innerLoopMax)
452 Foam::Info <<
"Inner loop " << innerLoopI << Foam::endl;
453 Foam::Info <<
"debug: param mean =\n" <<
parameterEns.mean() << Foam::endl;
459 Foam::Info <<
"\ndebug : parameterMean after loop =\n" << parameterMean.col(
460 timeStepI) << Foam::endl;
465 updateJointEns( observations.col(observationBoolVec.head(
466 timeStepI + 1).sum() - 1));
467 parameterMean.col(timeStepI) =
jointEns.mean().tail(parameterSize);
472 std::string WeightPosterior =
"heatFlux_weightsPosterior";
473 std::string saveFileName = WeightPosterior;
474 std::string folderName =
"HFWposterior" + std::to_string(timeStepI);
475 std::string folderPath =
"ITHACAoutput/projection/" + folderName;
478 Eigen::Matrix < double, -1,
479 -1 > matrixKabirPost =
jointEns.getSamples().bottomRows(parameterSize);
491 parameterMean.col(timeStepI) =
jointEns.mean().tail(
493 stateMean.col(timeStepI) =
jointEns.mean().head(
525 static_cast<Eigen::MatrixXd
>(
jointEns.getSamples().bottomRows(parameterSize)),
528 static_cast<Eigen::MatrixXd
>(
jointEns.getSamples().bottomRows(parameterSize)),
531 static_cast<Eigen::MatrixXd
>(
jointEns.getSamples().topRows(stateSize)), 0.95);
533 static_cast<Eigen::MatrixXd
>(
jointEns.getSamples().topRows(stateSize)), 0.05);
Header file of the Fang2017filter_wDF class.
Eigen::MatrixXd parameter_minConf
parameter minimum confidence level
void setObservations(Eigen::MatrixXd _observations)
Set the observations matrix.
Eigen::MatrixXd parameter_maxConf
parameter maximum confidence level
void setMeasNoise(double cov)
Setup of the measurement noise distribution.
void run(int innerLoopMax, word outputFolder)
Run the filtering.
ensemble stateEns
State ensemble.
Eigen::MatrixXd getStateMean()
Return state mean.
Eigen::MatrixXd getParameterMaxConf()
Return parameter Max Confidence.
void setModelError(double cov, bool univariate=0)
Setup of the model error distribution.
void sampleInitialState()
Create initial state ensemble.
void setObservationTime(int _observationStart, int _observationDelta)
Setup the observation vector.
Eigen::MatrixXd getParameterMinConf()
Return parameter Min Confidence.
double getTime()
Return time.
std::shared_ptr< muq::Modeling::Gaussian > measNoiseDensity
Measurement noise density.
ensemble jointEns
Joint state and parameter ensemble.
int getTimeStep()
Return timestep.
std::shared_ptr< muq::Modeling::Gaussian > modelErrorDensity
Model noise density.
void setParameterPriorDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov)
Create parameter ensemble.
Eigen::MatrixXd ensembleFromDensity(std::shared_ptr< muq::Modeling::Gaussian > _density)
General class to sample from an input density.
void buildJointEns()
Concatenate state and parameter ensambles to create the joint ensamble.
ensemble parameterEns
Parameter ensemble.
Eigen::MatrixXd state_minConf
State minimum confidence level.
int getNumberOfSamples()
Return number of samples per ensamble.
void setInitialStateDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov, bool _univariateFlag=0)
Create initial state ensemble.
void sampleParameterDist()
Create parameter ensemble.
Eigen::MatrixXd getParameterMean()
Return parameter mean.
ensemble observationEns
Observation ensemble.
void setTime(double _startTime, double _deltaTime, double _endTime)
Setup the time vector.
Eigen::MatrixXd state_maxConf
State maximum confidence level.
Eigen::VectorXd getTimeVector()
Return time vector.
T condNumber(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &A)
Conditioning number of a dense matrix.
void exportMatrix(Eigen::Matrix< T, -1, dim > &matrix, word Name, word type, word folder)
Export the reduced matrices in numpy (type=python), matlab (type=matlab) and txt (type=eigen) format ...