41Pagani2016filter::Pagani2016filter() {}
42Pagani2016filter::Pagani2016filter(
int _Nseeds)
57 return trueObservations.rows();
63 return timeVector(timeStepI);
70 return timeVector(_timeStepI);
105 Info <<
"debug : stateMean.cols() = " << stateMean.cols() << endl;
106 Info <<
"debug : _index = " << _index << endl;
107 stateMean.col(_index) =
stateEns.mean();
128 return observationStart + observationDelta * _timeSampleI;
135 trueObservations = _observations;
136 Info <<
"trueObservations = \n" << trueObservations << endl;
138 for (
int colI = 0; colI < trueObservations.cols(); colI++)
143 Info <<
"trueObservations w. error = \n" << trueObservations << endl;
151 M_Assert(_endTime > _startTime,
"endTime must be bigger than startTime");
152 startTime = _startTime;
153 deltaTime = _deltaTime;
155 Ntimes = round((endTime - startTime) / deltaTime);
156 Info <<
"startTime = " << startTime << endl;
157 Info <<
"endTime = " << endTime << endl;
158 Info <<
"deltaTime = " << deltaTime << endl;
159 Info <<
"Ntimes = " << Ntimes << endl;
160 timeVector = Eigen::VectorXd::LinSpaced(Ntimes + 1, startTime, endTime);
166 int _observationDelta)
168 M_Assert(timeVector.size() > 0,
169 "Setup the timeVector before setting up the observations vector");
170 M_Assert(_observationStart > 0,
"First observation timestep can't be 0");
171 observationStart = _observationStart;
172 observationDelta = _observationDelta;
173 Info <<
"First observation at time = " << timeVector(observationStart) <<
" s"
175 Info <<
"Observations taken every " << observationDelta <<
" timesteps" << endl;
176 observationBoolVec = Eigen::VectorXi::Zero(timeVector.size() - 1);
178 for (
int i = observationStart - 1; i < Ntimes; i += observationDelta)
180 observationBoolVec(i) = 1;
188 M_Assert(observationSize > 0,
189 "Read measurements before setting up the measurement noise");
190 Eigen::VectorXd measNoise_mu = Eigen::VectorXd::Zero(observationSize);
191 Eigen::MatrixXd measNoise_cov = Eigen::MatrixXd::Identity(observationSize,
192 observationSize) * cov;
195 measurementNoiseFlag = 1;
202 M_Assert(parameterSize > 0,
203 "Set parameter size before setting up the parameter error");
204 Eigen::VectorXd parameterError_mu = Eigen::VectorXd::Zero(parameterSize);
205 Eigen::MatrixXd parameterError_cov = Eigen::MatrixXd::Identity(parameterSize,
206 parameterSize) * cov;
215 Eigen::MatrixXd _cov)
219 stateSize = _mean.size();
223 std::string message =
"State has size = " + std::to_string(stateSize)
224 +
" while input mean vector has size = "
225 + std::to_string(_mean.size());
226 M_Assert(stateSize == _mean.size(), message.c_str());
229 M_Assert(_cov.rows() == stateSize
230 && _cov.cols() == stateSize,
231 "To initialize the state ensemble use mean and cov with same dimentions");
232 initialStateDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
233 initialStateFlag = 1;
240 M_Assert(initialStateFlag == 1,
241 "Initialize the initial state density before sampling it");
249 M_Assert(parameterPriorFlag == 1,
250 "Initialize the initial parameter density before sampling it");
257 Eigen::MatrixXd _cov)
259 if (parameterSize == 0)
261 parameterSize = _mean.size();
265 std::string message =
"The input mean has size = " + std::to_string(
267 +
" but the parameterSize is "
268 + std::to_string(parameterSize);
269 M_Assert(parameterSize == _mean.size(), message.c_str());
272 M_Assert(_cov.rows() == parameterSize
273 && _cov.cols() == parameterSize,
"Use mean and cov with same dimentions");
274 parameterPriorMean = _mean;
275 parameterPriorCov = _cov;
276 parameterPriorDensity = std::make_shared<muq::Modeling::Gaussian>(_mean, _cov);
277 parameterPriorFlag = 1;
283 std::shared_ptr<muq::Modeling::Gaussian> _density)
285 M_Assert(Nseeds > 0,
"Number of samples not set up correctly");
286 Eigen::MatrixXd output(_density->Sample().size(), Nseeds);
288 for (
int i = 0; i < Nseeds; i++)
290 output.col(i) = _density->Sample();
298void Pagani2016filter::setObservationSize(
int _size)
300 observationSize = _size;
301 Info <<
"Observation size = " << observationSize << endl;
306void Pagani2016filter::setStateSize(
int _size)
309 Info <<
"State size = " << stateSize << endl;
314int Pagani2016filter::getStateSize()
321void Pagani2016filter::setParameterSize(
int _size)
323 parameterSize = _size;
324 Info <<
"Parameter size = " << parameterSize << endl;
329int Pagani2016filter::getParameterSize()
331 return parameterSize;
338 Eigen::MatrixXd parameterObservation_crossCov =
340 Eigen::MatrixXd stateObservation_crossCov =
344 Eigen::MatrixXd::Identity(observationSize, observationSize));
345 P += observation_Cov;
346 Info <<
"debug : P = \n" << P << endl;
348 Info <<
"debug : P inverse = \n" << P << endl;
349 Eigen::MatrixXd parameterUpdateMat = parameterObservation_crossCov * P;
350 Eigen::MatrixXd stateUpdateMat = stateObservation_crossCov * P;
352 for (
int seedI = 0; seedI < Nseeds; seedI++)
354 Eigen::VectorXd observationDelta =
355 trueObservations.col(timeSampI) -
observationEns.getSample(seedI);
357 parameterEns.getSample(seedI) + parameterUpdateMat * observationDelta);
359 stateEns.getSample(seedI) + stateUpdateMat * observationDelta);
362 Info <<
"debug : parameterEns.mean() =\n" <<
parameterEns.mean() << endl;
363 Info <<
"debug : stateEns.mean() =\n" <<
stateEns.mean() << endl;
370 M_Assert(initialStateFlag == 1,
"Set up the initial state density");
371 M_Assert(parameterPriorFlag == 1,
"Set up the parameter prior density");
372 M_Assert(measurementNoiseFlag == 1,
"Set up the measurement noise");
373 M_Assert(stateSize > 0,
"Set state size");
374 M_Assert(observationSize > 0,
"Set observation size");
375 M_Assert(parameterSize > 0,
"Set parameter size");
379 int NtimeObservations = observationBoolVec.sum();
380 stateMean.resize(stateSize, Ntimes);
385 parameterMean.resize(parameterSize, Ntimes);
387 for (timeSampI = 0; timeSampI < NtimeObservations; timeSampI++)
389 Info <<
"timeSamp " << timeSampI << endl;
402 Info <<
"\n*****************************************************" << endl;
403 Info <<
"Kalman filter run ENDED" << endl;
404 Info <<
"\n*****************************************************" << endl;
Header file of the Pagani2016filter class.
Eigen::MatrixXd getParameterMean()
Return parameter mean.
void setTime(double _startTime, double _deltaTime, double _endTime)
Setup the time vector.
int getTimeStep()
Return timestep.
void update()
Perform Kalman filter update.
void setParameterPriorDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov)
Create parameter ensemble.
void setMeasNoise(double cov)
Setup of the measurement noise distribution.
int getObservationTimestep(int _timeSampleI)
Return timestep at corresponding to the input observation step.
Eigen::VectorXd getTimeVector()
Return time vector.
void sampleInitialState()
Create initial state ensemble.
void setObservationTime(int _observationStart, int _observationDelta)
Setup the observation vector.
ensemble observationEns
Observation ensemble.
Eigen::MatrixXd parameter_minConf
parameter minimum confidence level
std::shared_ptr< muq::Modeling::Gaussian > measNoiseDensity
Measurement noise density.
int getObservationCounter()
Return.
void computeStateMean(int _index)
Compute state mean.
std::shared_ptr< muq::Modeling::Gaussian > parameterErrorDensity
Parameter error density.
void setParameterError(double cov)
Setup of the parameter error distribution.
Eigen::MatrixXd state_maxConf
State maximum confidence level.
Eigen::MatrixXd ensembleFromDensity(std::shared_ptr< muq::Modeling::Gaussian > _density)
General class to sample from an input density.
int getObservationSize()
Return the size of the observation vector.
Eigen::MatrixXd state_minConf
State minimum confidence level.
ensemble parameterEns
Parameter ensemble.
double getTime()
Return time.
void computeParameterMean(int _index)
Compute parameter mean.
int getNumberOfSamples()
Return number of samples per ensamble.
virtual void stateProjection()=0
Project the state in between two sampling steps and fills the state and parameter mean and confidence...
Eigen::MatrixXd getStateMean()
Return state mean.
void setTrueObservations(Eigen::MatrixXd _observations)
Set the observations matrix.
ensemble oldStateEns
Old state ensemble.
void run(word outputFolder)
Run the filtering.
void setInitialStateDensity(Eigen::VectorXd _mean, Eigen::MatrixXd _cov)
Create initial state ensemble.
void sampleInitialParameter()
Create initial parameter ensemble.
Eigen::MatrixXd parameter_maxConf
parameter maximum confidence level
ensemble stateEns
State ensemble.
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 ...