lsst.gauss2d.fit g199a45376c+5e234f8357
 
Loading...
Searching...
No Matches
transforms.h
1#ifndef LSST_GAUSS2D_FIT_TRANSFORMS_H
2#define LSST_GAUSS2D_FIT_TRANSFORMS_H
3
4#include <cmath>
5#include <iostream>
6#include <memory>
7
8#include "lsst/modelfit/parameters.h"
9
10namespace lsst::gauss2d::fit {
11#pragma GCC diagnostic push
12#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
13
14namespace parameters = lsst::modelfit::parameters;
15typedef parameters::Transform<double> Transform;
16
17struct InverseTransform : public Transform {
18 std::string description() const override { return "Inverse transform"; }
19 std::string repr(bool name_keywords = false,
20 const std::string_view& namespace_separator
21 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
22 return parameters::type_name_str<InverseTransform>(false, namespace_separator) + "()";
23 }
24 std::string str() const override { return parameters::type_name_str<InverseTransform>(true) + "()"; }
25
26 inline double derivative(double x) const override { return 1 / (x * x); }
27 inline double forward(double x) const override { return 1 / x; }
28 inline double reverse(double x) const override { return 1 / x; }
29};
30
31struct JanskyToABMagTransform : public Transform {
32 static inline const double f_nu_0 = 3630.780547701002879554236770479;
33
34 std::string description() const override { return "jansky to AB magnitude transform"; }
35 std::string repr(bool name_keywords = false,
36 const std::string_view& namespace_separator
37 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
38 return parameters::type_name_str<JanskyToABMagTransform>(false, namespace_separator) + "()";
39 }
40 std::string str() const override {
41 return parameters::type_name_str<JanskyToABMagTransform>(true) + "()";
42 }
43
44 inline double derivative(double x) const override {
45 return -1.08573620475812959718098227313021197915 / x;
46 }
47 inline double forward(double x) const override { return -2.5 * log10(x / f_nu_0); }
48 inline double reverse(double x) const override { return f_nu_0 * pow(10.0, -0.4 * x); }
49};
50
52 std::string description() const override { return "nanojansky to AB magnitude transform"; }
53 std::string repr(bool name_keywords = false,
54 const std::string_view& namespace_separator
55 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
56 return parameters::type_name_str<NanojanskyToABMagTransform>(false, namespace_separator) + "()";
57 }
58 std::string str() const override {
59 return parameters::type_name_str<NanojanskyToABMagTransform>(true) + "()";
60 }
61
62 inline double derivative(double x) const override { return JanskyToABMagTransform::derivative(x); }
63 inline double forward(double x) const override { return JanskyToABMagTransform::forward(x * 1e-9); }
64 inline double reverse(double x) const override { return 1e9 * JanskyToABMagTransform::reverse(x); }
65};
66
67struct LogTransform : public Transform {
68 std::string description() const override { return "Natural (base e) logarithmic transform"; }
69 std::string repr(bool name_keywords = false,
70 const std::string_view& namespace_separator
71 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
72 return parameters::type_name_str<LogTransform>(false, namespace_separator) + "()";
73 }
74 std::string str() const override { return parameters::type_name_str<LogTransform>(true) + "()"; }
75
76 inline double derivative(double x) const override { return 1 / x; }
77 inline double forward(double x) const override { return log(x); }
78 inline double reverse(double x) const override { return exp(x); }
79};
80
81struct Log10Transform : public Transform {
82 std::string description() const override { return "Base 10 logarithmic transform"; }
83 std::string repr(bool name_keywords = false,
84 const std::string_view& namespace_separator
85 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
86 return parameters::type_name_str<Log10Transform>(false, namespace_separator) + "()";
87 }
88 std::string str() const override { return parameters::type_name_str<Log10Transform>(true) + "()"; }
89
90 inline double derivative(double x) const override {
91 return 0.434294481903251827651128918916605082294397 / x;
92 }
93 inline double forward(double x) const override { return log10(x); }
94 inline double reverse(double x) const override { return pow(10., x); }
95};
96
97struct LogitTransform : public Transform {
98 std::string description() const override { return "Logit transform"; }
99 std::string repr(bool name_keywords = false,
100 const std::string_view& namespace_separator
101 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
102 return parameters::type_name_str<LogitTransform>(false, namespace_separator) + "()";
103 }
104 std::string str() const override { return parameters::type_name_str<LogitTransform>(true) + "()"; }
105
106 inline double derivative(double x) const override { return 1 / x + 1 / (1 - x); }
107 inline double forward(double x) const override { return log(x / (1 - x)); }
108 inline double reverse(double x) const override { return 1 / (1 + exp(-x)); }
109};
110
111class LogitLimitedTransform : public Transform {
112public:
113 explicit LogitLimitedTransform(std::shared_ptr<parameters::Limits<double>> limits, double factor = 1) {
114 set_limits(std::move(limits));
115 set_factor(factor);
116 _set_range();
117 }
118
119 std::string description() const override { return "Logit limited (to finite range) transform"; }
120 std::string repr(bool name_keywords = false,
121 const std::string_view& namespace_separator
122 = parameters::Object::CC_NAMESPACE_SEPARATOR) const override {
123 return parameters::type_name_str<LogitLimitedTransform>(false, namespace_separator) + "("
124 + (name_keywords ? "limits=" : "") + _limits->repr(name_keywords, namespace_separator) + ", "
125 + (name_keywords ? "factor=" : "") + std::to_string(_factor) + ")";
126 }
127 std::string str() const override {
128 return parameters::type_name_str<LogitLimitedTransform>(true) + "(limits=" + _limits->str()
129 + ", factor=" + std::to_string(_factor) + ")";
130 }
131
132 double get_factor() const { return _factor; }
133 parameters::Limits<double>& get_limits() const { return *_limits; }
134
135 double derivative(double x) const override;
136 double forward(double x) const override;
137 double reverse(double x) const override;
138
139 void set_factor(double factor) {
140 if (!(factor > 0))
141 throw std::invalid_argument("LogitLimitedTransform factor=" + std::to_string(factor) + " !>0");
142 _factor = factor;
143 }
144
145 void set_limits(std::shared_ptr<parameters::Limits<double>> limits) {
146 _limits = (limits == nullptr) ? std::make_shared<parameters::Limits<double>>() : std::move(limits);
147 _set_range();
148 }
149
150private:
151 std::shared_ptr<parameters::Limits<double>> _limits;
152 double _factor;
153 double _range;
154
155 inline void _set_range() { _range = _limits->get_max() - _limits->get_min(); }
156};
157
158template <class T>
159std::shared_ptr<T> get_transform_default() {
160 static T transform_default{};
161 static std::shared_ptr<T> ptr{std::shared_ptr<T>{}, &transform_default};
162 return ptr;
163}
164#pragma GCC diagnostic pop
165} // namespace lsst::gauss2d::fit
166
167#endif // LSST_GAUSS2D_FIT_TRANSFORMS_H
Definition transforms.h:17
Definition transforms.h:81
Definition transforms.h:67
Definition transforms.h:97