3333#include < assert.h>
3434#include < time.h>
3535#include < chrono>
36-
36+ #include < typeinfo>
37+ #include < type_traits>
3738// command line
3839#include < tclap/CmdLine.h>
3940
4041// hydra
4142#include < hydra/host/System.h>
4243#include < hydra/device/System.h>
4344#include < hydra/Lambda.h>
44- #include < hydra/multivector.h>
4545#include < hydra/Parameter.h>
46-
46+ # include < hydra/FunctorArithmetic.h >
4747#include < hydra/functions/Gaussian.h>
48- #include < hydra/functions/Exponential.h>
49- #include < hydra/functions/BifurcatedGaussian.h>
50- #include < hydra/functions/BreitWignerNR.h>
51- #include < hydra/functions/ChiSquare.h>
52- #include < hydra/functions/Chebychev.h>
53- #include < hydra/functions/JohnsonSUShape.h>
54- #include < hydra/functions/LogNormal.h>
55- #include < hydra/functions/UniformShape.h>
56- #include < hydra/functions/TriangularShape.h>
57- #include < hydra/functions/TrapezoidalShape.h>
48+
49+
5850
5951#include < hydra/detail/external/hydra_thrust/random.h>
6052
7062
7163using namespace hydra ::arguments;
7264
73- declarg (xvar, double )
65+ declarg (_u, double )
66+ declarg(_v, double )
67+ declarg(_x, double )
68+ declarg(_y, double )
69+
7470
7571int main(int argv, char ** argc)
7672{
@@ -93,147 +89,71 @@ int main(int argv, char** argc)
9389 }
9490
9591
96- auto data = hydra::device::vector< double >(10 , .0 );
97-
98- // Gaussian distribution
99- // Parameters
100- auto mean = hydra::Parameter::Create (" mean" ).Value (0.0 );
101- auto sigma = hydra::Parameter::Create (" sigma" ).Value (0.25 );
102-
103- auto gauss = hydra::Gaussian<xvar>(mean, sigma);
104-
105- for (auto x: data)
106- std::cout << gauss (x) << std::endl;
92+ auto data = hydra::device::vector< double >(10 , .0 );
10793
108- // LogNormal distribution
109- auto lognormal = hydra::LogNormal<xvar>(mean, sigma);
11094
111-
112- // BifurcatedGaussian distribution
11395 // Parameters
114- auto sigma_left = hydra::Parameter::Create (" sigma left" ).Value (2.0 );
115- auto sigma_rigt = hydra::Parameter::Create (" sigma rigt" ).Value (1.0 );
116-
117- auto bigauss = hydra::BifurcatedGaussian<xvar>(mean, sigma_left, sigma_rigt);
118-
119- // Exponential distribution
120- auto tau = hydra::Parameter::Create (" mean" ).Value (1.0 );
121-
122- auto exp = hydra::Exponential<xvar>(tau);
123-
124- // Breit-Wigner
125- auto mass = hydra::Parameter::Create ().Name (" mass" ).Value (5.0 );
126- auto width = hydra::Parameter::Create ().Name (" width" ).Value (0.5 );
127-
128- auto bw = hydra::BreitWignerNR<xvar>(mass, width );
129-
130- // ChiSquare
131- auto ndof = hydra::Parameter::Create ().Name (" ndof" ).Value (2.0 );
132-
133- auto chi2 = hydra::ChiSquare<xvar>(ndof);
134-
135- // JohnsonSU
136- auto delta = hydra::Parameter::Create ().Name (" delta" ).Value (2.0 );
137- auto lambda = hydra::Parameter::Create ().Name (" lambda" ).Value (1.5 );
138- auto gamma = hydra::Parameter::Create ().Name (" gamma" ).Value (3.0 );
139- auto xi = hydra::Parameter::Create ().Name (" xi" ).Value (1.1 );
140-
141- auto johnson_su = hydra::JohnsonSU<xvar>(gamma, delta, xi, lambda);
142-
143- // Uniform
144- auto A = hydra::Parameter::Create ().Name (" A" ).Value (-5.0 );
145- auto B = hydra::Parameter::Create ().Name (" B" ).Value (-1.5 );
146- auto C = hydra::Parameter::Create ().Name (" C" ).Value ( 1.5 );
147- auto D = hydra::Parameter::Create ().Name (" D" ).Value ( 5.0 );
148-
149- auto uniform = hydra::UniformShape<xvar>(A,D);
150- auto triangle = hydra::TriangularShape<xvar>(A,B,D);
151- auto trapezoid = hydra::TrapezoidalShape<xvar>(A,B,C,D);
152-
153- hydra_thrust::default_random_engine engine;
154-
155- #ifdef _ROOT_AVAILABLE_
156-
157- TH1D hist_gauss (" hist_gauss" , " hydra::Gaussian<xvar>" , 100 ,-8.0 , 8.0 );
158- TH1D hist_lognormal (" hist_lognormal" , " hydra::LogNormal<xvar>" , 100 ,0.0 , 2.5 );
159- TH1D hist_bigauss (" hist_bigauss" , " hydra::BifurcatedGaussian<xvar>" , 100 ,-8.0 , 8.0 );
160- TH1D hist_exp (" hist_exp" , " hydra::Exponential<xvar>" , 100 , 0.0 , 10.0 );
161- TH1D hist_bw (" hist_bw" , " hydra::BreitWignerNR<xvar>" , 100 , 0.0 , 10.0 );
162- TH1D hist_chi (" hist_chi" , " hydra::ChiSquare<xvar>" , 100 , 0.0 , 10.0 );
163- TH1D hist_johnson_su (" hist_su" , " hydra::JohnsonSU<xvar>" , 100 , -5.0 , 1.0 );
164- TH1D hist_uniform (" hist_uniform" , " hydra::UniformShape<xvar>" , 100 , -6.0 , 6.0 );
165- hist_uniform.SetMinimum (0.0 );
166- TH1D hist_triangle (" hist_triangle" , " hydra::TriangularShape<xvar>" , 100 , -6.0 , 6.0 );
167- TH1D hist_trapezoid (" hist_trapezoid" , " hydra::TrapezoidalShape<xvar>" , 100 , -6.0 , 6.0 );
168-
169-
170- for (size_t i=0 ; i<nentries; i++)
96+ auto mean_x = hydra::Parameter::Create (" mean_x" ).Value (-0.5 );
97+ auto mean_y = hydra::Parameter::Create (" mean_y" ).Value (0.6 );
98+ auto mean_u = hydra::Parameter::Create (" mean_u" ).Value (-0.5 );
99+ auto mean_v = hydra::Parameter::Create (" mean_v" ).Value (0.6 );
100+ auto sigma = hydra::Parameter::Create (" sigma" ).Value (1.0 );
101+ auto exponent = hydra::Parameter::Create (" exponent" ).Value (2.0 );
102+
103+ // build the expression
104+ // [ ( G(x)-G(y) ) / ( G(x) + G(y) ) + ( G(u)-G(v) ) / ( G(u) + G(v) ) ]^z
105+ // using symbolic mathematics
106+
107+ // Gaussian distributions
108+ auto Gx = hydra::Gaussian<_x>(mean_x, sigma);
109+ auto Gy = hydra::Gaussian<_y>(mean_y, sigma);
110+ auto Gu = hydra::Gaussian<_u>(mean_u, sigma);
111+ auto Gv = hydra::Gaussian<_v>(mean_v, sigma);
112+
113+ auto Axy = (Gx - Gy)/(Gx + Gy);
114+ auto Auv = (Gu - Gv)/(Gu + Gv);
115+ auto A = Axy + Auv;
116+
117+ auto powerz = hydra::wrap_lambda ( [] __hydra_dual__ (unsigned int npar, const hydra::Parameter* params, double x )
171118 {
172- auto gauss_dist = hydra::Distribution<hydra::Gaussian<xvar>>();
173- auto lognormal_dist = hydra::Distribution<hydra::LogNormal<xvar>>();
174- auto bigauss_dist = hydra::Distribution<hydra::BifurcatedGaussian<xvar>>();
175- auto exp_dist = hydra::Distribution<hydra::Exponential<xvar>>();
176- auto bw_dist = hydra::Distribution<hydra::BreitWignerNR<xvar>>();
177- auto chi2_dist = hydra::Distribution<hydra::ChiSquare<xvar>>();
178- auto johnson_su_dist = hydra::Distribution<hydra::JohnsonSU<xvar>>();
179- auto uniform_dist = hydra::Distribution<hydra::UniformShape<xvar>>();
180- auto triangle_dist = hydra::Distribution<hydra::TriangularShape<xvar>>();
181- auto trapezoid_dist = hydra::Distribution<hydra::TrapezoidalShape<xvar>>();
182-
183- hist_gauss.Fill ( gauss_dist (engine, {0.0 , 1.5 } ));
184- hist_lognormal.Fill ( lognormal_dist (engine, lognormal ));
185- hist_bigauss.Fill ( bigauss_dist (engine, bigauss));
186- hist_exp.Fill ( exp_dist (engine, exp));
187- hist_bw.Fill ( bw_dist (engine, bw));
188- hist_chi.Fill ( chi2_dist (engine, chi2));
189- hist_johnson_su.Fill ( johnson_su_dist (engine, johnson_su ));
190- hist_uniform.Fill ( uniform_dist (engine, uniform));
191- hist_triangle.Fill (triangle_dist (engine,triangle));
192- hist_trapezoid.Fill (trapezoid_dist (engine,trapezoid));
193119
194- }
195-
196- TApplication *myapp=new TApplication (" myapp" ,0 ,0 );
197-
198- // draw histograms
199- TCanvas canvas_gauss (" canvas_gauss" ," hydra::Gaussian" , 500 , 500 );
200- hist_gauss.Draw (" hist" );
201-
202- TCanvas canvas_lognormal (" canvas_lognormal" ," hydra::LogNormal" , 500 , 500 );
203- hist_lognormal.Draw (" hist" );
204-
205- TCanvas canvas_bigauss (" canvas_bigauss" ," hydra::BifurcatedGaussian" , 500 , 500 );
206- hist_bigauss.Draw (" hist" );
120+ return ::pow (x, params[0 ]);
207121
208- TCanvas canvas_exp (" canvas_exp" ," hydra::Exponential" , 500 , 500 );
209- hist_exp.Draw (" hist" );
122+ }, exponent );
210123
211- TCanvas canvas_bw (" canvas_bw" ," hydra::BreitWignerNR" , 500 , 500 );
212- hist_bw.Draw (" hist" );
124+ auto Total = hydra::compose (powerz, A );
213125
214- TCanvas canvas_chi ( " canvas_chi " , " hydra::ChiSquare " , 500 , 500 );
215- hist_chi. Draw ( " hist " );
126+ // print parameters
127+ Total. PrintRegisteredParameters ( );
216128
217- TCanvas canvas_johnson_su (" canvas_chi" ," hydra::JohnsonSU" , 500 , 500 );
218- hist_johnson_su.Draw (" hist" );
129+ // evaluate using named function arguments
130+ std::cout << Total ( _x (1.0 ), _y (-1.0 ), _v (1.0 ), _u (-1.0 )) << std::endl;
131+ // evaluate using named function arguments (changed order)
132+ std::cout << Total ( _y (-1.0 ), _x (1.0 ), _u (-1.0 ), _v (1.0 )) << std::endl;
133+ // evaluate using tuple of unamed arguments (risky!!!)
134+ std::cout << Total ( hydra::make_tuple (1.0 , -1.0 , 1.0 , -1.0 )) << std::endl;
135+ // evaluate using tuple of unamed arguments (risky!!!)
136+ std::cout << Total ( hydra::make_tuple (-1.0 , 1.0 , -1.0 , 1.0 )) << std::endl;
137+ // evaluate using tuple of unamed arguments (risky!!!)
138+ std::cout << Total ( hydra::make_tuple (1.0 , -1.0 , -1.0 , 1.0 )) << std::endl;
139+ // evaluate using tuple of named arguments ()
140+ std::cout << Total ( hydra::make_tuple ( _x (1.0 ), _y (-1.0 ), _v (1.0 ), _u (-1.0 ))) << std::endl;
219141
220- TCanvas canvas_uniform (" canvas_uniform" ," hydra::UniformShape" , 500 , 500 );
221- hist_uniform.Draw (" hist" );
222142
223- TCanvas canvas_triangle (" canvas_triangle" ," hydra::TriangularShape" , 500 , 500 );
224- hist_triangle.Draw (" hist" );
143+ auto myfunc = hydra::wrap_lambda ( [] __hydra_dual__ (unsigned int npar, const hydra::Parameter* params, _x x, _y y) {
225144
226- TCanvas canvas_trapezoid (" canvas_trapezoid" ," hydra::TrapezoidalShape" , 500 , 500 );
227- hist_trapezoid.Draw (" hist" );
145+ return x + params[0 ]*y;
228146
147+ }, exponent);
229148
149+ auto mycombination = Gx + myfunc * Gy;
230150
231- myapp->Run ();
232-
233- #endif // _ROOT_AVAILABLE_
234-
235-
151+ std::cout << " mycombination: " << mycombination (_x (-1.0 ), _y (1.0 )) << std::endl;
236152
153+ // What is the type of the natural signature of Total?
154+ // uncomment this
155+ // typename decltype(mycombination)::argument_type test{};
156+ // std::cout << test.dummy << '\n';
237157
238158 return 0 ;
239159}
0 commit comments