34#ifndef _NL_FITTING_TOOL_H_
35#define _NL_FITTING_TOOL_H_
56namespace Geom {
namespace NL {
60template<
typename ModelT>
123template<
typename ModelT,
typename ValueType =
typename ModelT::value_type>
130template<
typename ModelT>
141 using base_type::m_model;
142 using base_type::m_psdinv_matrix;
143 using base_type::total_samples;
147 size_t forecasted_samples)
149 , m_solution(_model.
size())
152 template<
typename VectorT >
155 assert(sample_values.size() == total_samples());
157 m_solution = (*m_psdinv_matrix) * sv;
166 template<
typename VectorT >
168 VectorT
const& new_sample_values )
170 assert(old_sample_values.size() == total_samples());
171 assert(new_sample_values.size() == total_samples());
172 Vector diff(total_samples());
173 for (
size_t i = 0; i < diff.
size(); ++i)
175 diff[i] = new_sample_values[i] - old_sample_values[i];
177 Vector column(m_model.size());
179 for (
size_t i = 0; i < diff.
size(); ++i)
183 column = m_psdinv_matrix->column_view(i);
184 column.
scale(diff[i]);
205template<
typename ModelT>
216 using base_type::m_model;
217 using base_type::m_psdinv_matrix;
218 using base_type::total_samples;
222 size_t forecasted_samples)
224 , m_solution(_model.
size(), 2)
229 assert(sample_values.size() == total_samples());
230 Matrix svm(total_samples(), 2);
231 for (
size_t i = 0; i < total_samples(); ++i)
233 svm(i,
X) = sample_values[i][
X];
234 svm(i,
Y) = sample_values[i][
Y];
236 m_solution = (*m_psdinv_matrix) * svm;
246 std::vector<Point>
const& new_sample_values )
248 assert(old_sample_values.size() == total_samples());
249 assert(new_sample_values.size() == total_samples());
250 Matrix diff(total_samples(), 2);
251 for (
size_t i = 0; i < total_samples(); ++i)
253 diff(i,
X) = new_sample_values[i][
X] - old_sample_values[i][
X];
254 diff(i,
Y) = new_sample_values[i][
Y] - old_sample_values[i][
Y];
256 Vector column(m_model.size());
260 for (
size_t i = 0; i < total_samples(); ++i)
264 column = m_psdinv_matrix->column_view(i);
270 column = m_psdinv_matrix->column_view(i);
292template<
typename ModelT,
293 bool WITH_FIXED_TERMS = ModelT::WITH_FIXED_TERMS >
300template<
typename ModelT>
311 using base_type::total_samples;
312 using base_type::is_full;
313 using base_type::m_matrix;
314 using base_type::m_total_samples;
315 using base_type::m_model;
319 size_t forecasted_samples)
326 VectorView row = m_matrix.row_view(total_samples());
327 m_model.feed(row, sample_parameter);
334 assert(sample_index < total_samples());
335 VectorView dest_row = m_matrix.row_view(total_samples());
336 VectorView source_row = m_matrix.row_view(sample_index);
337 dest_row = source_row;
345template<
typename ModelT>
356 using base_type::total_samples;
357 using base_type::is_full;
358 using base_type::m_matrix;
359 using base_type::m_total_samples;
360 using base_type::m_model;
364 size_t forecasted_samples)
366 , m_vector(forecasted_samples)
367 , m_vector_view(nullptr)
373 VectorView row = m_matrix.row_view(total_samples());
374 m_model.feed(row, m_vector[total_samples()], sample_parameter);
381 assert(sample_index < total_samples());
382 VectorView dest_row = m_matrix.row_view(total_samples());
383 VectorView source_row = m_matrix.row_view(sample_index);
384 dest_row = source_row;
385 m_vector[total_samples()] = m_vector[sample_index];
392 if (total_samples() == 0)
return;
393 if (m_vector_view != NULL)
395 delete m_vector_view;
397 m_vector_view =
new VectorView(m_vector, base_type::total_samples());
398 assert(m_vector_view != NULL);
405 delete m_vector_view;
420template<
typename ModelT,
421 typename ValueType =
typename ModelT::value_type,
422 bool WITH_FIXED_TERMS = ModelT::WITH_FIXED_TERMS >
428template<
typename ModelT,
typename ValueType >
441 size_t forecasted_samples)
446template<
typename ModelT>
457 using base_type::m_vector_view;
460 std::vector<Point>
const& new_sample_values )
462 return base_type::result(old_sample_values, new_sample_values);
467 return base_type::result();
472 size_t forecasted_samples)
476 template<
typename VectorT >
479 assert(sample_values.size() == m_vector_view->size());
480 Vector sv(sample_values.size());
481 for (
size_t i = 0; i < sv.
size(); ++i)
482 sv[i] = sample_values[i] - (*m_vector_view)[i];
483 return base_type::result(sv);
489template<
typename ModelT>
500 using base_type::m_vector_view;
503 std::vector<Point>
const& new_sample_values )
505 return base_type::result(old_sample_values, new_sample_values);
510 return base_type::result();
516 size_t forecasted_samples)
522 assert(sample_values.size() == m_vector_view->size());
524 for (
size_t i = 0; i < sample_values.size(); ++i)
526 sv(i,
X) = sample_values[i][
X] - (*m_vector_view)[i];
527 sv(i,
Y) = sample_values[i][
Y] - (*m_vector_view)[i];
529 return base_type::result(sv);
Cartesian point / 2D vector and related operations.
const model_type & m_model
lsf_base(model_type const &_model, size_t forecasted_samples)
size_t total_samples() const
model_type::parameter_type parameter_type
model_type::value_type value_type
solution_type & result(std::vector< Point > const &old_sample_values, std::vector< Point > const &new_sample_values)
solution_type & result(std::vector< Point > const &sample_values)
lsf_solution(model_type const &_model, size_t forecasted_samples)
model_type::parameter_type parameter_type
lsf_base< model_type > base_type
model_type::value_type value_type
lsf_solution(model_type const &_model, size_t forecasted_samples)
model_type::value_type value_type
solution_type & result(VectorT const &sample_values)
solution_type & result(VectorT const &old_sample_values, VectorT const &new_sample_values)
model_type::parameter_type parameter_type
lsf_base< model_type > base_type
base_type::solution_type solution_type
lsf_solution< model_type > base_type
void append_copy(size_t sample_index)
void append(parameter_type const &sample_parameter)
model_type::value_type value_type
lsf_with_fixed_terms(model_type const &_model, size_t forecasted_samples)
model_type::parameter_type parameter_type
model_type::value_type value_type
void append(parameter_type const &sample_parameter)
VectorView * m_vector_view
~lsf_with_fixed_terms() override
void append_copy(size_t sample_index)
lsf_with_fixed_terms(model_type const &_model, size_t forecasted_samples)
base_type::solution_type solution_type
lsf_solution< model_type > base_type
model_type::parameter_type parameter_type
solution_type & result(std::vector< Point > const &sample_values)
least_squeares_fitter(model_type const &_model, size_t forecasted_samples)
base_type::value_type value_type
base_type::solution_type solution_type
base_type::parameter_type parameter_type
detail::lsf_with_fixed_terms< model_type > base_type
solution_type & result(std::vector< Point > const &old_sample_values, std::vector< Point > const &new_sample_values)
detail::lsf_with_fixed_terms< model_type > base_type
base_type::value_type value_type
base_type::parameter_type parameter_type
least_squeares_fitter(model_type const &_model, size_t forecasted_samples)
base_type::solution_type solution_type
least_squeares_fitter(model_type const &_model, size_t forecasted_samples)
base_type::parameter_type parameter_type
base_type::solution_type solution_type
base_type::value_type value_type
solution_type & result(std::vector< Point > const &old_sample_values, std::vector< Point > const &new_sample_values)
detail::lsf_with_fixed_terms< model_type > base_type
solution_type & result(VectorT const &sample_values)
Two-dimensional point that doubles as a vector.
Matrix pseudo_inverse(detail::BaseMatrixImpl const &A)
Various utility functions.