-
Notifications
You must be signed in to change notification settings - Fork 21
/
LinearDecayCorrelationModel.cpp
178 lines (151 loc) · 5.95 KB
/
LinearDecayCorrelationModel.cpp
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
//#############################################################################
//
// FILENAME: LinearDecayCorrelationModel.cpp
//
// CLASSIFICATION: Unclassified
//
// DESCRIPTION:
//
// This class is used to compute the correlation between model
// parameters in a community sensor model (CSM).
//
// LIMITATIONS: None
//
//
// SOFTWARE HISTORY:
// Date Author Comment
// ----------- ------ -------
// 20-Nov-2012 ISK Initial Release.
// 30-Oct-2012 SCM Renamed to LinearDecayCorrelationModel.h
// 17-Dec-2012 BAH Documentation updates.
// 20-Dec-2012 JPK Fixed bug in constructor.
// 18-Feb-2013 JPK Removed getNumCorrelationParameterGroups,
// now provided on base class.
// 03-Sep-2021 SCM Removed IRIX support.
// 01-Dec-2021 JPK Modified to use LinearDecayCorrelationFunction
// 12-Nov-2023 JPK Updated to allow relaxation of strictly
// monotonically decreasing correlation parameters
// for backwards compatibility.
// 21-Nov-2023 JPK Modified to use LinearDecayCorrelationFunction::
// correlationCoefficientFor() static method.
// 22-Nov-2023 JPK Modified to use LinearDecayCorrelationFunction::
// checkParameters()
// NOTES:
// Refer to LinearDecayCorrelationModel.h for more information.
//#############################################################################
#define CSM_LIBRARY
#include "LinearDecayCorrelationModel.h"
#include "LinearDecayCorrelationFunction.h"
#include "Error.h"
#include <cmath>
using std::exp;
using std::fabs;
static const std::string LDCM_NAME = "LinearDecayCorrelation";
namespace csm {
LinearDecayCorrelationModel::LinearDecayCorrelationModel(size_t numSMParams,
size_t numCPGroups)
:
CorrelationModel (LDCM_NAME,
numCPGroups),
theGroupMapping (numSMParams, -1),
theCorrParams (numCPGroups)
{}
LinearDecayCorrelationModel::~LinearDecayCorrelationModel()
{
}
size_t LinearDecayCorrelationModel::getNumSensorModelParameters() const
{
return theGroupMapping.size();
}
int LinearDecayCorrelationModel::getCorrelationParameterGroup(size_t smParamIndex) const
{
// make sure the index falls within the acceptable range
checkSensorModelParameterIndex(smParamIndex, "getCorrelationParameterGroup");
// return the correlation parameter group index by reference
return theGroupMapping[smParamIndex];
}
void LinearDecayCorrelationModel::setCorrelationParameterGroup(
size_t smParamIndex,
size_t cpGroupIndex)
{
static const std::string METHOD_NAME = "setCorrelationParameterGroup";
// make sure the indices fall within the acceptable ranges
checkSensorModelParameterIndex(smParamIndex,METHOD_NAME);
checkParameterGroupIndex(cpGroupIndex,METHOD_NAME);
// set the group index for the given model parameter
theGroupMapping[smParamIndex] = cpGroupIndex;
}
void LinearDecayCorrelationModel::setCorrelationGroupParameters(
size_t cpGroupIndex,
const std::vector<double>& initialCorrsPerSegment,
const std::vector<double>& timesPerSegment)
{
setCorrelationGroupParameters(
cpGroupIndex, Parameters(initialCorrsPerSegment, timesPerSegment) );
}
void LinearDecayCorrelationModel::setCorrelationGroupParameters(
size_t cpGroupIndex,
const Parameters& params)
{
static const std::string METHOD_NAME = "setCorrelationGroupParameters";
// make sure the index falls within the acceptable range
checkParameterGroupIndex(cpGroupIndex,METHOD_NAME);
// Check parameters using LinearDecayCorrelationFunction but do not enforce
// strict monotonicity for backward compatibility.
// If parameters are not within expected range, this will cause a csm::Error
// to be thrown.
LinearDecayCorrelationFunction::
checkParameters(params.theInitialCorrsPerSegment,
params.theTimesPerSegment,
false);
// store the correlation parameter values
theCorrParams[cpGroupIndex] = params;
}
double LinearDecayCorrelationModel::getCorrelationCoefficient(
size_t cpGroupIndex,
double deltaTime) const
{
static const std::string METHOD_NAME = "getCorrelationCoefficient";
// make sure the index falls within the acceptable range
checkParameterGroupIndex(cpGroupIndex,METHOD_NAME);
const Parameters& params = theCorrParams[cpGroupIndex];
return (LinearDecayCorrelationFunction::
correlationCoefficientFor(deltaTime,
params.theInitialCorrsPerSegment,
params.theTimesPerSegment,
0.0));
}
const LinearDecayCorrelationModel::Parameters&
LinearDecayCorrelationModel::getCorrelationGroupParameters(
size_t cpGroupIndex) const
{
static const std::string METHOD_NAME = "getCorrelationGroupParameters";
// make sure the index falls within the acceptable range
checkParameterGroupIndex(cpGroupIndex,METHOD_NAME);
return theCorrParams[cpGroupIndex];
}
void LinearDecayCorrelationModel::checkSensorModelParameterIndex(
size_t smParamIndex,
const std::string& functionName) const
{
if (smParamIndex >= theGroupMapping.size())
{
throw Error(
Error::INDEX_OUT_OF_RANGE,
"Sensor model parameter index is out of range.",
"csm::LinearDecayCorrelationModel::" + functionName);
}
}
void LinearDecayCorrelationModel::checkParameterGroupIndex(
size_t groupIndex,
const std::string& functionName) const
{
if (groupIndex >= theCorrParams.size())
{
throw Error(
Error::INDEX_OUT_OF_RANGE,
"Correlation parameter group index is out of range.",
"csm::LinearDecayCorrelationModel::" + functionName);
}
}
} // namespace csm