Skip to content

Commit 426a209

Browse files
committed
stripped_tuple traits for functor signature composing...
2 parents 0b20ab0 + 5f5f397 commit 426a209

File tree

8 files changed

+105
-197
lines changed

8 files changed

+105
-197
lines changed

examples/misc/quick_test.inl

Lines changed: 17 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,11 @@
4141
#include <hydra/host/System.h>
4242
#include <hydra/device/System.h>
4343
#include <hydra/Lambda.h>
44-
#include <hydra/multivector.h>
4544
#include <hydra/Parameter.h>
46-
45+
#include <hydra/detail/Compose.h>
4746
#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>
5447
#include <hydra/functions/LogNormal.h>
55-
#include <hydra/functions/UniformShape.h>
56-
#include <hydra/functions/TriangularShape.h>
57-
#include <hydra/functions/TrapezoidalShape.h>
48+
5849

5950
#include <hydra/detail/external/hydra_thrust/random.h>
6051

@@ -71,6 +62,7 @@
7162
using namespace hydra::arguments;
7263

7364
declarg(xvar, double)
65+
declarg(yvar, double)
7466

7567
int main(int argv, char** argc)
7668
{
@@ -93,147 +85,29 @@ int main(int argv, char** argc)
9385
}
9486

9587

96-
auto data = hydra::device::vector< double>(10, .0);
88+
auto data = hydra::device::vector< double>(10, .0);
9789

98-
//Gaussian distribution
9990
//Parameters
100-
auto mean = hydra::Parameter::Create("mean" ).Value(0.0);
101-
auto sigma = hydra::Parameter::Create("sigma").Value(0.25);
91+
auto mean = hydra::Parameter::Create("mean" ).Value(0.0);
92+
auto sigma = hydra::Parameter::Create("sigma" ).Value(1.0);
93+
auto factor = hydra::Parameter::Create("factor").Value(1.0);
10294

95+
//Gaussian distribution
10396
auto gauss = hydra::Gaussian<xvar>(mean, sigma);
104-
105-
for(auto x: data)
106-
std::cout << gauss(x) << std::endl;
107-
10897
//LogNormal distribution
109-
auto lognormal = hydra::LogNormal<xvar>(mean, sigma);
110-
111-
112-
//BifurcatedGaussian distribution
113-
//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);
98+
auto lognormal = hydra::LogNormal<yvar>(mean, sigma);
99+
//
123100

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++)
171-
{
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));
193-
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");
207-
208-
TCanvas canvas_exp("canvas_exp" ,"hydra::Exponential", 500, 500);
209-
hist_exp.Draw("hist");
210-
211-
TCanvas canvas_bw("canvas_bw" ,"hydra::BreitWignerNR", 500, 500);
212-
hist_bw.Draw("hist");
213-
214-
TCanvas canvas_chi("canvas_chi" ,"hydra::ChiSquare", 500, 500);
215-
hist_chi.Draw("hist");
216-
217-
TCanvas canvas_johnson_su("canvas_chi" ,"hydra::JohnsonSU", 500, 500);
218-
hist_johnson_su.Draw("hist");
219-
220-
TCanvas canvas_uniform("canvas_uniform" ,"hydra::UniformShape", 500, 500);
221-
hist_uniform.Draw("hist");
222-
223-
TCanvas canvas_triangle("canvas_triangle" ,"hydra::TriangularShape", 500, 500);
224-
hist_triangle.Draw("hist");
225-
226-
TCanvas canvas_trapezoid("canvas_trapezoid" ,"hydra::TrapezoidalShape", 500, 500);
227-
hist_trapezoid.Draw("hist");
228-
229-
230-
231-
myapp->Run();
232-
233-
#endif //_ROOT_AVAILABLE_
101+
auto combiner = hydra::wrap_lambda( [] __hydra_dual__ (unsigned int npar, const hydra::Parameter* params, double x, double y) {
234102

103+
printf("gauss %f , log-gauss %f\n", x, y );
104+
return x + params[0]*y;
105+
}, factor);
235106

107+
auto fcomposed = hydra::compose( combiner, gauss, lognormal);
236108

109+
for(size_t i=0; i< data.size(); ++i)
110+
fcomposed(xvar(1.0), yvar(1.0));
237111

238112
return 0;
239113
}

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

hydra/Vegas.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,11 @@
4040
#include <hydra/Integrator.h>
4141
#include <utility>
4242
#include <hydra/detail/external/hydra_thrust/random.h>
43+
#include <hydra/Random.h>
4344

4445
namespace hydra {
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 Vegas ;
4849

4950
/**

hydra/detail/Compose.h

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,80 +29,88 @@
2929
#ifndef COMPOSE_H_
3030
#define COMPOSE_H_
3131

32-
33-
3432
#include <hydra/detail/Config.h>
3533
#include <hydra/Types.h>
3634
#include <hydra/detail/TypeTraits.h>
3735
#include <hydra/detail/utility/Utility_Tuple.h>
3836
#include <hydra/detail/base_functor.h>
3937
#include <hydra/detail/Constant.h>
40-
#include <hydra/detail/CompositeBase.h>
38+
//#include <hydra/detail/CompositeBase.h>
4139
#include <hydra/detail/FunctorTraits.h>
4240
#include <hydra/detail/CompositeTraits.h>
4341
#include <hydra/Parameter.h>
4442
#include <hydra/Tuple.h>
45-
#include <type_traits>
43+
#include <hydra/detail/BaseCompositeFunctor.h>
44+
#include <hydra/detail/TupleUtility.h>
45+
4646

4747
namespace hydra {
4848

4949

50+
namespace detail {
51+
52+
namespace compose_signature {
53+
54+
55+
56+
} // namespace compose_signature
57+
58+
} // namespace detail
59+
60+
5061
template<typename F0, typename F1, typename... Fs >
51-
class Compose: public detail::CompositeBase<F0, F1, Fs...>
62+
class Compose: public BaseCompositeFunctor<
63+
Compose<F0, F1,Fs...>,
64+
hydra_thrust::tuple<F0, F1, Fs...>,
65+
typename detail::merged_tuple<
66+
hydra_thrust::tuple<typename F0::return_type>,
67+
typename F1::argument_type, typename Fs::argument_type ... >::type >
5268
{
5369

5470

71+
typedef BaseCompositeFunctor<
72+
Compose<F0, F1,Fs...>,
73+
hydra_thrust::tuple<F0, F1, Fs...>,
74+
typename detail::merged_tuple< hydra_thrust::tuple<typename F0::return_type>,
75+
typename F1::argument_type, typename Fs::argument_type ... >::type > super_type;
5576

56-
public:
57-
//tag
58-
59-
typedef typename F0::return_type return_type;
6077

61-
typedef typename hydra_thrust::tuple<
62-
typename F1::return_type,
63-
typename Fs::return_type...> argument_type;
6478

79+
public:
6580

6681

6782
Compose()=delete;
6883

6984
Compose(F0 const& f0, F1 const& f1, Fs const& ...fs):
70-
detail::CompositeBase<F0, F1, Fs...>( f0, f1,fs...)
85+
super_type( f0, f1,fs...)
7186
{ }
7287

7388
__hydra_host__ __hydra_device__
7489
inline Compose(Compose<F0,F1,Fs...> const& other):
75-
detail::CompositeBase<F0, F1, Fs...>( other)
90+
super_type( other)
7691
{ }
7792

7893
__hydra_host__ __hydra_device__
7994
inline Compose<F0,F1,Fs...>& operator=(Compose<F0,F1,Fs...> const& other)
8095
{
8196
if(this==&other) return *this;
82-
detail::CompositeBase<F0, F1, Fs...>::operator=( other);
97+
super_type::operator=( other);
8398

8499
return *this;
85100
}
86101

87102
template<typename ...T>
88103
__hydra_host__ __hydra_device__
89-
inline std::enable_if<
90-
detail::is_valid_type_pack< argument_type, T...>::value,
91-
return_type>::type
92-
operator()( T... x ) const
104+
inline typename super_type::return_type Evaluate(T... x ) const
93105
{
94106

95-
static_assert( std::is_convertible< hydra::tuple<T...>, argument_type>::value, ">>>>>>>");
96-
97-
//evaluating f(g_1(x), g_2(x), ..., g_n(x))
98-
99-
auto g = detail::dropFirst(this->fFtorTuple);
107+
auto g = detail::dropFirst(this->GetFunctors());
100108

101-
auto f = hydra::get<0>(this->fFtorTuple);
109+
auto f = hydra::get<0>(this->GetFunctors());
102110

103111
typedef decltype(g) G_tuple ;
104112

105-
return f(detail::invoke<G_tuple, hydra::tuple<T&...>>(hydra::tie(x...), g ));
113+
return f(detail::invoke<G_tuple, hydra_thrust::tuple<T...>>( hydra_thrust::tie(x...), g ));
106114
}
107115

108116

hydra/detail/FunctorTraits.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ typedef hydra_thrust::tuple<typename std::decay<Args>::type...> argument_type;
6363
enum {arity=sizeof...(Args)};
6464
};
6565

66+
template<typename R, typename...Args>
67+
struct signature_traits< hydra_thrust::tuple<R,Args...>>
68+
{
69+
typedef typename std::decay<R>::type return_type;
70+
typedef hydra_thrust::tuple<typename std::decay<Args>::type...> argument_type;
71+
enum {arity=sizeof...(Args)};
72+
};
73+
6674

6775
template <typename T>
6876
struct functor_traits:

0 commit comments

Comments
 (0)