41Fang2017filter::Fang2017filter() {}
42Fang2017filter::Fang2017filter(
int _Nsamples)
58 return timeVector(timeStepI);
65 return timeVector(_timeStepI);
93 observations = _observations;
101 M_Assert(_endTime > _startTime,
"endTime must be bigger than startTime");
102 startTime = _startTime;
103 deltaTime = _deltaTime;
105 Ntimes = (endTime - startTime) / deltaTime;
106 Foam::Info <<
"startTime = " << startTime << endl;
107 Foam::Info <<
"endTime = " << endTime << endl;
108 Foam::Info <<
"deltaTime = " << deltaTime << endl;
109 Foam::Info <<
"Ntimes = " << Ntimes << endl;
110 timeVector = Eigen::VectorXd::LinSpaced(Ntimes + 1, startTime, endTime);
116 int _observationDelta)
118 M_Assert(timeVector.size() > 0,
119 "Setup the timeVector before setting up the observations vector");
120 M_Assert(_observationStart > 0,
"First observation timestep can't be 0");
121 observationStart = _observationStart;
122 observationDelta = _observationDelta;
123 Foam::Info <<
"First observation at time = " << timeVector(observationStart) <<
" s"
125 Foam::Info <<
"Observations taken every " << observationDelta <<
" timesteps" << endl;
126 observationBoolVec = Eigen::VectorXi::Zero(timeVector.size() - 1);
128 for (
int i = observationStart - 1; i < Ntimes; i += observationDelta)
130 observationBoolVec(i) = 1;
138 M_Assert(stateSize > 0,
"Set the stateSize before setting up the model error");
139 Eigen::VectorXd modelError_mu;
140 Eigen::MatrixXd modelError_cov;
144 modelError_mu = Eigen::VectorXd::Zero(1);
145 modelError_cov = Eigen::MatrixXd::Identity(1,
150 modelError_mu = Eigen::VectorXd::Zero(stateSize);
151 modelError_cov = Eigen::MatrixXd::Identity(stateSize,
164 M_Assert(observationSize > 0,
165 "Read measurements before setting up the measurement noise");
166 Eigen::VectorXd measNoise_mu = Eigen::VectorXd::Zero(observationSize);
167 Eigen::MatrixXd measNoise_cov = Eigen::MatrixXd::Identity(observationSize,
168 observationSize) * cov;
171 measurementNoiseFlag = 1;
177 Eigen::MatrixXd _cov)
181 stateSize = _mean.size();
185 std::string message =
"State has size = " + std::to_string(stateSize)
186 +
" while input mean vector has size = "
187 + std::to_string(_mean.size());
188 M_Assert(stateSize == _mean.size(), message.c_str());
191 M_Assert(_cov.rows() == stateSize
192 && _cov.cols() == stateSize,
193 "To initialize the state ensemble use mean and cov with same dimentions");
194 initialStateDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
195 initialStateFlag = 1;
202 M_Assert(initialStateFlag == 1,
203 "Initialize the initial state density before sampling it");
210 Eigen::MatrixXd _cov)
212 if (parameterSize == 0)
214 parameterSize = _mean.size();
218 std::string message =
"The input mean has size = " + std::to_string(
220 +
" but the parameterSize is "
221 + std::to_string(parameterSize);
222 M_Assert(parameterSize == _mean.size(), message.c_str());
225 M_Assert(_cov.rows() == parameterSize
226 && _cov.cols() == parameterSize,
"Use mean and cov with same dimentions");
227 parameterPriorMean = _mean;
228 parameterPriorCov = _cov;
229 parameterPriorDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
230 parameterPriorFlag = 1;
237 M_Assert(parameterPriorFlag == 1,
"Set up the parameter prior density");
245 std::shared_ptr<muq::Modeling::Gaussian> _density)
247 M_Assert(Nsamples > 0,
"Number of samples not set up correctly");
248 Eigen::MatrixXd output(_density->Sample().size(), Nsamples);
250 for (
int i = 0; i < Nsamples; i++)
252 output.col(i) = _density->Sample();
262 Eigen::MatrixXd stateSamps =
stateEns.getSamples();
264 M_Assert(stateSamps.cols() == paramSamps.cols(),
265 "State and parameter ensambles must have same number of samples");
266 Eigen::MatrixXd temp(stateSamps.rows() + paramSamps.rows(), stateSamps.cols());
274void Fang2017filter::setObservationSize(
int _size)
276 observationSize = _size;
277 Foam::Info <<
"Observation size = " << observationSize << Foam::endl;
282void Fang2017filter::setStateSize(
int _size)
285 Foam::Info <<
"State size = " << stateSize << Foam::endl;
290int Fang2017filter::getStateSize()
297void Fang2017filter::setParameterSize(
int _size)
299 parameterSize = _size;
300 Foam::Info <<
"Parameter size = " << parameterSize << Foam::endl;
305int Fang2017filter::getParameterSize()
307 return parameterSize;
312void Fang2017filter::updateJointEns(Eigen::VectorXd _observation)
314 M_Assert(_observation.size() == observationSize,
315 "Observation has wrong dimentions");
335 for (
int i = 0; i < ensSize; i++)
337 Eigen::VectorXd newSamp =
jointEns.getSample(i) + crossCov * autoCovInverse *
347 M_Assert(initialStateFlag == 1,
"Set up the initial state density");
348 M_Assert(parameterPriorFlag == 1,
"Set up the parameter prior density");
349 M_Assert(modelErrorFlag == 1,
"Set up the model error");
350 M_Assert(measurementNoiseFlag == 1,
"Set up the measurement noise");
351 M_Assert(stateSize > 0,
"Set state size");
352 M_Assert(observationSize > 0,
"Set observation size");
353 M_Assert(parameterSize > 0,
"Set parameter size");
356 stateMean.resize(stateSize, Ntimes);
361 parameterMean.resize(parameterSize, Ntimes);
363 while (timeStepI < Ntimes)
365 Foam::Info <<
"timeStep " << timeStepI << Foam::endl;
369 while (innerLoopI < innerLoopMax)
371 Foam::Info <<
"Inner loop " << innerLoopI << Foam::endl;
384 parameterMean.col(timeStepI - 1), parameterPriorCov);
388 Foam::Info <<
"\ndebug : parameterPriorMean = " <<
389 parameterPriorMean << Foam::endl;
390 Foam::Info <<
"\ndebug : parameterMean.col(" << timeStepI <<
") =\n" <<
391 parameterMean.col(timeStepI) << Foam::endl;
395 Foam::Info <<
"\ndebug : parameterMean before loop =\n" <<
396 parameterMean.col(timeStepI) << Foam::endl;
399 Foam::Info <<
"\ndebug : parameterMean after loop =\n" <<
400 parameterMean.col(timeStepI) << Foam::endl;
406 if (observationBoolVec(timeStepI) == 1)
410 Foam::Info <<
"\ndebug : observation =\n" <<
411 observations.col(observationBoolVec.head(timeStepI + 1).sum() - 1) <<
415 observationBoolVec.head(timeStepI + 1).sum() - 1));
418 parameterMean.col(timeStepI) =
jointEns.mean().tail(parameterSize);
424 stateMean.col(timeStepI) =
jointEns.mean().head(stateSize);
Header file of the Fang2017filter class.
std::shared_ptr< muq::Modeling::Gaussian > modelErrorDensity
Model noise density.
int getNumberOfSamples()
Return number of samples per ensamble.
void sampleParameterDist()
Create parameter ensemble.
ensemble observationEns
Observation ensemble.
void setMeasNoise(double cov)
Setup of the measurement noise distribution.
void sampleInitialState()
Create initial state ensemble.
Eigen::MatrixXd state_maxConf
State maximum confidence level.
Eigen::MatrixXd getStateMean()
Return state mean.
void setInitialStateDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov)
Create initial state ensemble.
Eigen::MatrixXd state_minConf
State minimum confidence level.
void setParameterPriorDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov)
Create parameter ensemble.
void buildJointEns()
Concatenate state and parameter ensambles to create the joint ensamble.
int getTimeStep()
Return timestep.
void setModelError(double cov, bool univariate=0)
Setup of the model error distribution.
double getTime()
Return time.
void setTime(double _startTime, double _deltaTime, double _endTime)
Setup the time vector.
Eigen::MatrixXd parameter_minConf
parameter minimum confidence level
ensemble oldStateEns
Old state ensemble.
Eigen::MatrixXd ensembleFromDensity(std::shared_ptr< muq::Modeling::Gaussian > _density)
General class to sample from an input density.
Eigen::MatrixXd parameter_maxConf
parameter maximum confidence level
ensemble jointEns
Joint state and parameter ensemble.
Eigen::VectorXd getTimeVector()
Return time vector.
void setObservationTime(int _observationStart, int _observationDelta)
Setup the observation vector.
ensemble parameterEns
Parameter ensemble.
void setObservations(Eigen::MatrixXd _observations)
Set the observations matrix.
std::shared_ptr< muq::Modeling::Gaussian > measNoiseDensity
Measurement noise density.
ensemble stateEns
State ensemble.
void run(int innerLoopMax, word outputFolder)
Run the filtering.
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 ...