-
Notifications
You must be signed in to change notification settings - Fork 0
/
SemiMarkovModel.h
111 lines (72 loc) · 2.64 KB
/
SemiMarkovModel.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#ifndef SEMIMARKOVMODEL
#define SEMIMARKOVMODEL
#define DEBUG_MODEL
#include "DebugTools.h"
#include "JaggedMatrix.h"
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/function.hpp>
using namespace boost::numeric::ublas;
class SemiMarkovModel
{
public:
friend static double SemiMarkovModel::IntegralCallback(double x, void* cargo);
friend class SMPMonteCarlo;
public:
SemiMarkovModel() { _model = NULL; _kernelHandler = NULL;}
JaggedMatrix* _model;
size_t StateCount;
double dt;
int N;
double MissionTime;
vector<matrix<double>> phi;
vector<matrix<double>> C;
vector<matrix<double>> W;
vector<matrix<double>> helper;
vector<vector<double>> w;
int timeStep ; //For thread to display progress
void DisplayTimeStep(); //thread handler to display updates
boost::function<matrix<double> (double)> _kernelHandler;
boost::function<vector<double> (double)> _waitingHandler;
boost::function<void (SemiMarkovModel*)> _timeStepCallBack;
bool bContinue;
bool bWasForcefullyTerminated;
vector<double> ones;
inline vector<double> Trapz2Points(int t, const vector<vector<double>>& f);
public:
SemiMarkovModel(JaggedMatrix* model);
~SemiMarkovModel();
void SetModelInput(double mission, int steps);
void ComputeStateProbabilities(boost::function<void (SemiMarkovModel*)> TimeStepCallBack = NULL);
void SetupMatrices();
void KernelMatrix(double t, matrix<double>& C );
vector<double> KernelRow(double t, int r);
double KernelElement(double t, int r, int c);
void WaitingTimeMatrix(double t, matrix<double>& C, vector<double>& v);
double StateWaitingTime(int t, int state);
matrix<double> MeanWaitingTime();
void NoWaitingTedious(int t, vector<matrix<double>>& W, const vector<vector<double>>& w );
void NoWaitingPolyWbl(double t, matrix<double>& W);
void RegisterHandlers(boost::function<matrix<double> (double)> kernelHandler,
boost::function<vector<double> (double)> waitingHandler);
//Utilities
vector<double> GetStateProbability(int initState, int targetState);
vector<vector<double>> GetStateProbabilities(int initState );
bool PathExists(int fromState, int toState);
double SampleTimeSpent(int inState, int toState, double p);
vector<double> GetTimeVector();
static double IntegralCallback(double x, void* cargo);
//Diagnostics
void IntegralSystemEquations(std::string filepath);
double TestValidity(double t, int init);
};
class IntegralHelper
{
public:
SemiMarkovModel* model;
size_t row;
size_t column;
IntegralHelper(SemiMarkovModel* smpmodel) : model(smpmodel) { }
};
#endif