Skip to content

Commit 0401f5e

Browse files
authored
Merge pull request #103 from MultithreadCorner/develop-hydra3
merging some bug fixes and updating call interfaces connected with composite objects
2 parents bc6481a + c718810 commit 0401f5e

File tree

22 files changed

+569
-352
lines changed

22 files changed

+569
-352
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Bug fixes:
1212

1313
2) Covering composite of composites (https://github.com/MultithreadCorner/Hydra/issues/100)
1414

15+
3) Covering caching for parameterless functors.
16+
1517

1618
### Hydra 3.2.1
1719

examples/misc/quick_test.inl

Lines changed: 59 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -33,28 +33,20 @@
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

@@ -70,7 +62,11 @@
7062

7163
using 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

7571
int 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
}

examples/numerical_integration/plain_mc.inl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@
6060
#include <hydra/device/System.h>
6161

6262

63+
declarg(AxisX, double)
64+
declarg(AxisY, double)
6365

66+
using namespace hydra::arguments;
6467

6568
int main(int argv, char** argc)
6669
{
@@ -104,7 +107,7 @@ int main(int argv, char** argc)
104107
}
105108

106109
// create functor using C++11 lambda
107-
auto GAUSSIAN = [=] __hydra_dual__ ( double x, double y ){
110+
auto GAUSSIAN = [=] __hydra_dual__ ( AxisX x, AxisY y ){
108111

109112
double g = 1.0;
110113
double f = 0.0;

hydra/Lambda.h

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,16 @@ template<typename LambdaType, size_t NPARAM>
302302
class Lambda : public detail::Parameters<NPARAM>
303303
{
304304

305-
typedef typename detail::lambda_traits<LambdaType>::argument_rvalue_type argument_rvalue_type;
305+
typedef typename detail::trimmed_lambda_signature<typename detail::lambda_traits<LambdaType>::argument_rvalue_type>::type argument_rvalue_type;
306306

307307
public:
308308

309309
typedef void hydra_lambda_type;
310310

311311
typedef typename detail::lambda_traits<LambdaType>::return_type return_type;
312-
typedef typename detail::lambda_traits<LambdaType>::argument_type argument_type;
312+
typedef typename detail::trimmed_lambda_signature<typename detail::lambda_traits<LambdaType>::argument_type>::type argument_type;
313313

314-
enum {arity=detail::lambda_traits<LambdaType>::arity};
314+
enum {arity=detail::lambda_traits<LambdaType>::arity-2};
315315

316316

317317
explicit Lambda()=delete;
@@ -391,8 +391,7 @@ class Lambda : public detail::Parameters<NPARAM>
391391
template<typename ...T>
392392
__hydra_host__ __hydra_device__
393393
inline typename std::enable_if<
394-
(!detail::is_valid_type_pack<argument_type, size_t,
395-
const hydra::Parameter*, T...>::value),
394+
(!detail::is_valid_type_pack<argument_type, T...>::value),
396395
return_type>::type
397396
operator()(T...x) const
398397
{
@@ -413,8 +412,7 @@ class Lambda : public detail::Parameters<NPARAM>
413412
template<typename ...T>
414413
__hydra_host__ __hydra_device__
415414
inline typename std::enable_if<
416-
(detail::is_valid_type_pack<argument_type, size_t,
417-
const hydra::Parameter*, T...>::value),
415+
(detail::is_valid_type_pack<argument_type, T...>::value),
418416
return_type>::type
419417
operator()(T...x) const
420418
{
@@ -426,13 +424,7 @@ class Lambda : public detail::Parameters<NPARAM>
426424
inline typename std::enable_if<
427425
( detail::is_tuple_type< typename std::decay<T>::type >::value ) &&
428426
(!detail::is_tuple_of_function_arguments< typename std::decay<T>::type >::value) &&
429-
( std::is_convertible<
430-
typename detail::tuple_cat_type<
431-
hydra::tuple<size_t, const Parameter*>,
432-
typename std::decay<T>::type
433-
>::type,
434-
argument_rvalue_type
435-
>::value ),
427+
( std::is_convertible<typename std::decay<T>::type, argument_rvalue_type>::value ),
436428
return_type >::type
437429
operator()( T x ) const
438430
{
@@ -500,30 +492,30 @@ class Lambda : public detail::Parameters<NPARAM>
500492

501493
return fLambda(this->GetNumberOfParameters(), this->GetParameters(),
502494
detail::get_tuple_element<
503-
typename hydra_thrust::tuple_element<I+2,argument_rvalue_type>::type >(x)...);
495+
typename hydra_thrust::tuple_element<I,argument_rvalue_type>::type >(x)...);
504496
}
505497

506498
template<typename T>
507499
__hydra_host__ __hydra_device__
508500
inline return_type call(T x) const
509501
{
510-
return call_helper(x, detail::make_index_sequence<arity-2>{});
502+
return call_helper(x, detail::make_index_sequence<arity>{});
511503
}
512504

513505
template<typename T, size_t ...I>
514506
__hydra_host__ __hydra_device__
515507
inline return_type raw_call_helper(T x, detail::index_sequence<I...> ) const
516508
{
517509
return fLambda(this->GetNumberOfParameters(), this->GetParameters(),
518-
static_cast<typename hydra_thrust::tuple_element<I+2,argument_rvalue_type>::type>(
510+
static_cast<typename hydra_thrust::tuple_element<I,argument_rvalue_type>::type>(
519511
hydra_thrust::get<I>(x))...);
520512
}
521513

522514
template<typename T>
523515
__hydra_host__ __hydra_device__
524516
inline return_type raw_call(T x) const
525517
{
526-
return raw_call_helper(x, detail::make_index_sequence<arity-2>{});
518+
return raw_call_helper(x, detail::make_index_sequence<arity>{});
527519
}
528520

529521

hydra/PhaseSpaceIntegrator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,15 @@
3636
#include <hydra/PhaseSpace.h>
3737
#include <hydra/detail/Print.h>
3838
#include <tuple>
39+
#include <hydra/Random.h>
3940

4041
namespace hydra {
4142

4243
/**
4344
* \ingroup phsp
4445
*
4546
*/
46-
template <size_t N, typename Backend, typename GRND=hydra_thrust::random::default_random_engine>
47+
template <size_t N, typename Backend, typename GRND=hydra::default_random_engine>
4748
class PhaseSpaceIntegrator;
4849

4950
/**

hydra/Plain.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@
4242
#include <hydra/detail/functors/ProcessCallsPlain.h>
4343
#include <utility>
4444
#include <vector>
45-
46-
#include <hydra/detail/external/hydra_thrust/random.h>
45+
#include <hydra/Integrator.h>
46+
#include <hydra/Random.h>
4747

4848
namespace hydra {
4949

50-
template<size_t N, typename BACKEND, typename GRND=hydra_thrust::random::default_random_engine>
50+
template<size_t N, typename BACKEND, typename GRND=hydra::default_random_engine>
5151
struct Plain;
5252

5353

0 commit comments

Comments
 (0)