14 template<
class ObserveMethodType>
17 return std::abs(variable_a - variable_b);
20 template<
class ObserveMethodType>
24 for (
int dimension_index = 0; dimension_index < variable_a.size(); ++dimension_index)
25 distance = std::pow(std::abs(variable_a[dimension_index] - variable_b[dimension_index]), 2);
26 return std::pow(distance, 0.5);
29 template<
class ObserveMethodType>
34 for (
int dimension_index_i = 0; dimension_index_i != variable_a.size(); ++dimension_index_i)
35 for (
int dimension_index_j = 0; dimension_index_j != variable_a.size(); ++dimension_index_j)
36 distance = std::pow(std::abs(variable_a[dimension_index_i][dimension_index_j] - variable_b[dimension_index_i][dimension_index_j]), 2);
37 return std::pow(distance, 0.5);
40 template<
class ObserveMethodType>
42 (DoubleVec<VariableType> dataset_a_, DoubleVec<VariableType> dataset_b_)
46 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
49 int a_length = dataset_a_[observation_index].size();
50 int b_length = dataset_b_[observation_index].size();
52 DoubleVec<Real> local_dtw_distance(a_length,
StdVec<Real>(b_length, 0));
53 local_dtw_distance[0][0] = calculatePNorm(dataset_a_[observation_index][0], dataset_b_[observation_index][0]);
54 for (
int index_i = 1; index_i < a_length; ++index_i)
55 local_dtw_distance[index_i][0] = local_dtw_distance[index_i - 1][0] + calculatePNorm(dataset_a_[observation_index][index_i], dataset_b_[observation_index][0]);
56 for (
int index_j = 1; index_j < b_length; ++index_j)
57 local_dtw_distance[0][index_j] = local_dtw_distance[0][index_j - 1] + calculatePNorm(dataset_a_[observation_index][0], dataset_b_[observation_index][index_j]);
60 window_size_ = SMAX(window_size_, ABS(a_length - b_length));
61 for (
int index_i = 1; index_i != a_length; ++index_i)
62 for (
int index_j = SMAX(1, index_i - window_size_); index_j != SMIN(b_length, index_i + window_size_); ++index_j)
63 local_dtw_distance[index_i][index_j] = calculatePNorm(dataset_a_[observation_index][index_i], dataset_b_[observation_index][index_j]) +
64 SMIN(local_dtw_distance[index_i - 1][index_j], local_dtw_distance[index_i][index_j - 1], local_dtw_distance[index_i - 1][index_j - 1]);
65 dtw_distance.push_back(local_dtw_distance[a_length - 1][b_length - 1]);
70 template<
class ObserveMethodType>
73 this->snapshot_ = this->current_result_.size();
74 this->observation_ = this->current_result_[0].size();
77 dtw_distance_ = dtw_distance_temp_;
78 dtw_distance_new_ = dtw_distance_;
80 if ((this->number_of_run_ > 1) && (!fs::exists(dtw_distance_filefullpath_)))
82 std::cout <<
"\n Error: the input file:" << dtw_distance_filefullpath_ <<
" is not exists" << std::endl;
83 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
88 template<
class ObserveMethodType>
91 if (this->number_of_run_ > 1)
93 dtw_distance_xml_engine_in_.loadXmlFile(dtw_distance_filefullpath_);
94 SimTK::Xml::Element element_name_dtw_distance_ = dtw_distance_xml_engine_in_.root_element_;
95 SimTK::Xml::element_iterator ele_ite = element_name_dtw_distance_.element_begin();
96 for (; ele_ite != element_name_dtw_distance_.element_end(); ++ele_ite)
97 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
99 std::string attribute_name_ = this->quantity_name_ +
"_" + std::to_string(observation_index);
100 dtw_distance_xml_engine_in_.getRequiredAttributeValue<Real>(ele_ite, attribute_name_, dtw_distance_[observation_index]);
105 template<
class ObserveMethodType>
108 if (this->number_of_run_ > 1)
110 StdVec<Real> dtw_distance_local_(this->observation_, 0);
111 dtw_distance_local_ = calculateDTWDistance(this->current_result_trans_, this->result_in_);
112 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
114 dtw_distance_new_[observation_index] = SMAX(dtw_distance_local_[observation_index], dtw_distance_[observation_index], dtw_distance_new_[observation_index]);
116 this->result_in_.clear();
120 template<
class ObserveMethodType>
123 SimTK::Xml::Element DTWElement = dtw_distance_xml_engine_out_.root_element_;
124 dtw_distance_xml_engine_out_.addChildToElement(DTWElement,
"DTWDistance");
125 SimTK::Xml::element_iterator ele_ite = DTWElement.element_begin();
126 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
128 std::string attribute_name_ = this->quantity_name_ +
"_" + std::to_string(observation_index);
129 dtw_distance_xml_engine_out_.setAttributeToElement(ele_ite, attribute_name_, dtw_distance_new_[observation_index]);
131 dtw_distance_xml_engine_out_.writeToXmlFile(dtw_distance_filefullpath_);
134 template<
class ObserveMethodType>
137 if (this->number_of_run_ > 1)
139 int count_not_converged_ = 0;
140 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
142 if (std::abs(dtw_distance_[observation_index] - dtw_distance_new_[observation_index]) > threshold_value)
144 count_not_converged_++;
145 std::cout <<
"The DTW distance of " << this->quantity_name_ <<
" [" << observation_index <<
"] is not converged." << endl;
146 std::cout <<
"The old DTW distance is " << dtw_distance_[observation_index] <<
", and the new DTW distance is " << dtw_distance_new_[observation_index] <<
"." << endl;
150 if (count_not_converged_ == 0)
152 if (this->label_for_repeat_ == 4)
154 this->converged =
"true";
155 std::cout <<
"The DTW distance of " << this->quantity_name_ <<
" are converged enough times, and rum will stop now." << endl;
160 this->converged =
"false";
161 this->label_for_repeat_++;
162 std::cout <<
"The DTW distance of " << this->quantity_name_ <<
" are converged, and this is the " << this->label_for_repeat_
163 <<
" times. They should be converged more times to be stable." << endl;
166 else if (count_not_converged_ != 0)
168 this->converged =
"false";
169 this->label_for_repeat_ = 0;
176 template<
class ObserveMethodType>
177 void RegressionTestDynamicTimeWarping<ObserveMethodType>::resultTest()
181 dtw_distance_current_ = calculateDTWDistance(this->result_in_, this->current_result_trans_);
182 for (
int observation_index = 0; observation_index != this->observation_; ++observation_index)
184 if (dtw_distance_current_[observation_index] > 1.01 * dtw_distance_[observation_index])
186 std::cout <<
"The maximum distance of " << this->quantity_name_ <<
"[" << observation_index <<
"] is " << dtw_distance_[observation_index]
187 <<
", and the current distance is " << dtw_distance_current_[observation_index] <<
"." << endl;
193 std::cout <<
"The DTW distance of " << this->quantity_name_ <<
" between current result and this previous local result is within exception!" << endl;
197 std::cout <<
"The DTW distance of " << this->quantity_name_ <<
" between current result and this previous local result is beyond exception!" << endl;
198 std::cout <<
"Please try again. If it still post this sentence, the result is not correct!" << endl;
void readDTWDistanceFromXml()
Definition: dynamic_time_warping_method.hpp:89
Classes for the comparison between validated and tested results with dynamic time warping method...
StdVec< Real > calculateDTWDistance(DoubleVec< VariableType > dataset_a_, DoubleVec< VariableType > dataset_b_)
Definition: dynamic_time_warping_method.hpp:42
void updateDTWDistance()
Definition: dynamic_time_warping_method.hpp:106
void writeDTWDistanceToXml()
Definition: dynamic_time_warping_method.hpp:121
the regression test is based on the dynamic time warping.
Definition: dynamic_time_warping_method.h:40
Real calculatePNorm(Real variable_a, Real variable_b)
Definition: dynamic_time_warping_method.hpp:15
Definition: solid_body_supplementary.cpp:9