Skip to content

Commit c7c9e2b

Browse files
PR AB
1 parent 61e625c commit c7c9e2b

4 files changed

Lines changed: 73 additions & 34 deletions

File tree

include/geode/stochastic/sampling/direct/double_sampler.hpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,6 @@ namespace geode
3535

3636
namespace geode
3737
{
38-
struct opengeode_stochastic_stochastic_api DistributionDescription
39-
{
40-
std::string name;
41-
DistributionType distribution_type;
42-
43-
double min_value{};
44-
double max_value{};
45-
std::optional< double > mean{};
46-
std::optional< double > standard_deviation{};
47-
};
4838

4939
struct opengeode_stochastic_stochastic_api DoubleSampler
5040
{
@@ -53,6 +43,17 @@ namespace geode
5343
Gaussian,
5444
TruncatedGaussian >;
5545

46+
struct DistributionDescription
47+
{
48+
std::string name{ "default_distribution" };
49+
DistributionType distribution_type;
50+
51+
std::optional< double > min_value;
52+
std::optional< double > max_value;
53+
std::optional< double > mean;
54+
std::optional< double > standard_deviation;
55+
};
56+
5657
static Distribution create_distribution(
5758
const DistributionDescription& desc );
5859

src/geode/stochastic/sampling/direct/double_sampler.cpp

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,45 @@
2525

2626
#include <geode/stochastic/common.hpp>
2727
#include <geode/stochastic/sampling/random_engine.hpp>
28+
namespace
29+
{
30+
struct DistributionParams
31+
{
32+
double min;
33+
double max;
34+
double mean;
35+
double std;
36+
};
2837

38+
DistributionParams complete_distribution_params(
39+
const geode::DoubleSampler::DistributionDescription& d )
40+
{
41+
DistributionParams p{};
42+
43+
if( d.min_value && d.max_value )
44+
{
45+
p.min = *d.min_value;
46+
p.max = *d.max_value;
47+
p.mean = ( p.min + p.max ) / 2.0;
48+
p.std = ( p.max - p.min ) / std::sqrt( 12.0 );
49+
return p;
50+
}
51+
52+
if( d.mean && d.standard_deviation )
53+
{
54+
p.mean = *d.mean;
55+
p.std = *d.standard_deviation;
56+
p.min = p.mean - std::sqrt( 3.0 ) * p.std;
57+
p.max = p.mean + std::sqrt( 3.0 ) * p.std;
58+
return p;
59+
}
60+
61+
throw geode::OpenGeodeException(
62+
"[DistributionDescripption] Incomplete distribution description: "
63+
"need at least (min,max) or (mean,std)." );
64+
return p;
65+
}
66+
} // namespace
2967
namespace geode
3068
{
3169
struct DistributionTypeHasher
@@ -38,47 +76,47 @@ namespace geode
3876
};
3977

4078
using DistributionFactory = std::function< DoubleSampler::Distribution(
41-
const DistributionDescription& ) >;
79+
const DoubleSampler::DistributionDescription& ) >;
4280

4381
static absl::flat_hash_map< DistributionType, // key type
4482
DistributionFactory, // value type
4583
DistributionTypeHasher // custom hasher
4684
>
4785
distribution_registry = {
4886
{ UniformClosed< double >::distribution_type_static(),
49-
[]( const DistributionDescription& d ) {
87+
[]( const DoubleSampler::DistributionDescription& d ) {
88+
auto p = complete_distribution_params( d );
5089
UniformClosed< double > dist;
51-
dist.min_value = d.min_value;
52-
dist.max_value = d.max_value;
90+
dist.min_value = p.min;
91+
dist.max_value = p.max;
5392
return dist;
5493
} },
5594
{ UniformClosedOpen< double >::distribution_type_static(),
56-
[]( const DistributionDescription& d ) {
95+
[]( const DoubleSampler::DistributionDescription& d ) {
96+
auto p = complete_distribution_params( d );
5797
UniformClosedOpen< double > dist;
58-
dist.min_value = d.min_value;
59-
dist.max_value = d.max_value;
98+
dist.min_value = p.min;
99+
dist.max_value = p.max;
60100
return dist;
61101
} },
62102
{ Gaussian::distribution_type_static(),
63-
[]( const DistributionDescription& d ) {
103+
[]( const DoubleSampler::DistributionDescription& d ) {
104+
auto p = complete_distribution_params( d );
64105
Gaussian dist;
65-
dist.mean =
66-
d.mean.value_or( ( d.max_value - d.min_value ) / 2.0 );
67-
dist.standard_deviation = d.standard_deviation.value_or(
68-
( d.max_value - d.min_value ) / 6.0 );
106+
dist.mean = p.mean;
107+
dist.standard_deviation = p.std;
69108
return dist;
70109
} },
71110
{ TruncatedGaussian::distribution_type_static(),
72-
[]( const DistributionDescription& d ) {
111+
[]( const DoubleSampler::DistributionDescription& d ) {
112+
auto p = complete_distribution_params( d );
73113
TruncatedGaussian dist;
74-
dist.mean =
75-
d.mean.value_or( ( d.max_value - d.min_value ) / 2.0 );
76-
dist.standard_deviation = d.standard_deviation.value_or(
77-
( d.max_value - d.min_value ) / 6.0 );
78-
dist.min_value = d.min_value;
79-
dist.max_value = d.max_value;
114+
dist.mean = p.mean;
115+
dist.standard_deviation = p.std;
116+
dist.min_value = p.min;
117+
dist.max_value = p.max;
80118
return dist;
81-
} }
119+
} },
82120
};
83121

84122
DoubleSampler::Distribution DoubleSampler::create_distribution(

tests/stochastic/sampling/direct/test-double-sampler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void test_double_sampler( geode::RandomEngine& engine )
7272
// Test function: create a uniform closed distribution from description
7373
void test_create_uniform_closed( geode::RandomEngine& engine )
7474
{
75-
geode::DistributionDescription desc;
75+
geode::DoubleSampler::DistributionDescription desc;
7676
desc.name = "uniform_closed";
7777
desc.distribution_type =
7878
geode::UniformClosed< double >::distribution_type_static();
@@ -88,7 +88,7 @@ void test_create_uniform_closed( geode::RandomEngine& engine )
8888
// Test function: create a truncated Gaussian distribution from description
8989
void test_create_truncated_gaussian( geode::RandomEngine& engine )
9090
{
91-
geode::DistributionDescription desc;
91+
geode::DoubleSampler::DistributionDescription desc;
9292
desc.name = "truncated_gaussian";
9393
desc.distribution_type =
9494
geode::TruncatedGaussian::distribution_type_static();

tests/stochastic/sampling/mcmc/test-mh-fractures.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ namespace
3838
{
3939
std::string name;
4040

41-
geode::DistributionDescription length;
42-
geode::DistributionDescription azimuth;
41+
geode::DoubleSampler::DistributionDescription length;
42+
geode::DoubleSampler::DistributionDescription azimuth;
4343

4444
// positionning
4545
double p20;

0 commit comments

Comments
 (0)