lsst.gauss2d.fit g199a45376c+5e234f8357
 
Loading...
Searching...
No Matches
fractionalintegralmodel.h
1#ifndef LSST_GAUSS2D_FIT_FRACTIONALINTEGRALMODEL_H
2#define LSST_GAUSS2D_FIT_FRACTIONALINTEGRALMODEL_H
3
4#include <map>
5#include <memory>
6#include <optional>
7#include <vector>
8
9#include "component.h"
10#include "param_defs.h"
11#include "param_filter.h"
12#include "parameters.h"
13#include "integralmodel.h"
14
15namespace lsst::gauss2d::fit {
30class FractionalIntegralModel : public IntegralModel {
31public:
32 typedef std::pair<std::reference_wrapper<const Channel>, std::shared_ptr<ProperFractionParameterD>>
33 ChannelIntegralParameterD;
34 typedef std::vector<ChannelIntegralParameterD> Data;
35
36 explicit FractionalIntegralModel(const FractionalIntegralModel&) = delete;
37 FractionalIntegralModel& operator=(const FractionalIntegralModel&) = delete;
38
39 ~FractionalIntegralModel();
40
41 std::shared_ptr<ProperFractionParameterD> at(const Channel& channel);
42 std::shared_ptr<const ProperFractionParameterD> at(const Channel& channel) const;
43
44 typename Data::iterator begin() noexcept;
45 typename Data::const_iterator cbegin() const noexcept;
46
47 typename Data::iterator end() noexcept;
48 typename Data::const_iterator cend() const noexcept;
49
56 static std::shared_ptr<FractionalIntegralModel> find_model(const IntegralModel& model) {
57 const auto found = _registry_rev.find(model);
58 return (found == _registry_rev.end()) ? nullptr : (*found).second.lock();
59 }
60
61 std::vector<std::reference_wrapper<const Channel>> get_channels() const override;
62 const IntegralModel& get_parent_model() const;
63 double get_integral(const Channel& channel) const override;
64 std::vector<std::pair<ParamBaseCRef, ExtraParamFactorValues>> get_integral_derivative_factors(
65 const Channel& channel) const override;
66 double get_integral_remainder(const Channel& channel) const;
67
68 ProperFractionParameterD& get_parameter_frac(const Channel& channel) const;
69 ParamRefs& get_parameters(ParamRefs& params, ParamFilter* filter = nullptr) const override;
70 ParamCRefs& get_parameters_const(ParamCRefs& params, ParamFilter* filter = nullptr) const override;
71
72 bool is_final() const;
73
86 static std::shared_ptr<FractionalIntegralModel> make(std::optional<const Data> data,
87 std::shared_ptr<const IntegralModel> model,
88 bool is_final = false);
89 static const std::shared_ptr<const FractionalIntegralModel> make_const(
90 std::optional<const Data> data, std::shared_ptr<const IntegralModel> model,
91 bool is_final = false);
92
93 size_t size() const;
94
95 std::string repr(bool name_keywords = false,
96 std::string_view namespace_separator = Object::CC_NAMESPACE_SEPARATOR) const override;
97 std::string str() const override;
98
99private:
100 Data _data = {};
101 // This could be unordered, but std::hash<std::string> won't take const strings
102 // (see also linearintegralmodel.h)
103 std::map<std::reference_wrapper<const Channel>, std::shared_ptr<ProperFractionParameterD>> _map = {};
104
105 // TODO: See if all raw pointers can be changed to reference_wrappers or weak_ptrs
106 std::shared_ptr<const FractionalIntegralModel> _find_parent(std::shared_ptr<const IntegralModel> model);
107 const std::shared_ptr<const IntegralModel> _model;
108 std::shared_ptr<const FractionalIntegralModel> _parent;
109 static inline std::map<std::reference_wrapper<const FractionalIntegralModel>,
110 std::reference_wrapper<const IntegralModel>>
111 _registry = {};
112 static inline std::map<std::reference_wrapper<const IntegralModel>,
113 std::weak_ptr<FractionalIntegralModel>>
114 _registry_rev = {};
115
116 struct Shared_enabler;
117
118 bool _is_final;
119
120 // not giving a nullptr default data_in because the map needs to match the model's channels
121 FractionalIntegralModel(std::optional<const Data> data, std::shared_ptr<const IntegralModel> model,
122 bool is_final);
123};
124
125} // namespace lsst::gauss2d::fit
126
127#endif
An observational channel, usually representing some range of wavelengths of light.
Definition channel.h:29
A list of Observation instances that can be modelled.
Definition data.h:32
static std::shared_ptr< FractionalIntegralModel > find_model(const IntegralModel &model)
Definition fractionalintegralmodel.h:56
ParamCRefs & get_parameters_const(ParamCRefs &params, ParamFilter *filter=nullptr) const override
Same as get_parameters(), but for const refs.
Definition fractionalintegralmodel.cc:184
std::vector< std::pair< ParamBaseCRef, ExtraParamFactorValues > > get_integral_derivative_factors(const Channel &channel) const override
Return the partial derivative of the model w.r.t. each metaparameter.
Definition fractionalintegralmodel.cc:120
ParamRefs & get_parameters(ParamRefs &params, ParamFilter *filter=nullptr) const override
Definition fractionalintegralmodel.cc:172
std::vector< std::reference_wrapper< const Channel > > get_channels() const override
Get the set of channels this instance is applicable for.
Definition fractionalintegralmodel.cc:102
double get_integral(const Channel &channel) const override
Get the value of the integral in a single Channel.
Definition fractionalintegralmodel.cc:115
static std::shared_ptr< FractionalIntegralModel > make(std::optional< const Data > data, std::shared_ptr< const IntegralModel > model, bool is_final=false)
Definition fractionalintegralmodel.cc:230
A Parametric model for the integral of a 2D distribution.
Definition integralmodel.h:23
Definition fractionalintegralmodel.cc:83
Definition param_filter.h:17