Skip to content

Commit 1118666

Browse files
authored
Clamp probabilities passed to binomial distribution to $[0.0, 1.0]$. (#86)
* Clamp probabilities passed to binomial distribution to $[0.0, 1.0]$. When the probability is computed based on chunk and cell sizes which are equal, floating point inaccuracies may lead to probabilities greater than 1.0. * Fix compilation. * Use spaces instead of tabs. * Fix erroneous upper bound in one of the clamp calls.
1 parent e00a227 commit 1118666

File tree

5 files changed

+17
-6
lines changed

5 files changed

+17
-6
lines changed

kagen/generators/geometric/geometric_2d.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "libmorton/morton2D.h"
2020
#include <tuple>
2121
#include <vector>
22+
#include <algorithm>
2223

2324
namespace kagen {
2425
class Geometric2D : public virtual Generator, private EdgeListOnlyGenerator {
@@ -206,7 +207,8 @@ class Geometric2D : public virtual Generator, private EdgeListOnlyGenerator {
206207
for (SInt i = 0; i < cells_per_chunk_; ++i) {
207208
seed = config_.seed + chunk_id * cells_per_chunk_ + i + total_chunks_ * cells_per_chunk_;
208209
SInt h = sampling::Spooky::hash(seed);
209-
SInt cell_vertices = rng_.GenerateBinomial(h, n, cell_area / total_area);
210+
// due to potential floating point inaccuracies clamp probability
211+
SInt cell_vertices = rng_.GenerateBinomial(h, n, std::clamp(cell_area / total_area, 0.0, 1.0));
210212
LPFloat cell_start_x = std::get<1>(chunk) + (i / cells_per_dim_) * cell_size_;
211213
LPFloat cell_start_y = std::get<2>(chunk) + (i % cells_per_dim_) * cell_size_;
212214
if (cell_vertices != 0) {

kagen/generators/geometric/geometric_3d.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "libmorton/morton3D.h"
2020
#include <tuple>
2121
#include <vector>
22+
#include <algorithm>
2223

2324
namespace kagen {
2425
class Geometric3D : public virtual Generator, private EdgeListOnlyGenerator {
@@ -247,7 +248,7 @@ class Geometric3D : public virtual Generator, private EdgeListOnlyGenerator {
247248
for (SInt i = 0; i < cells_per_chunk_; ++i) {
248249
seed = config_.seed + chunk_id * cells_per_chunk_ + i + total_chunks_ * cells_per_chunk_;
249250
SInt h = sampling::Spooky::hash(seed);
250-
SInt cell_vertices = rng_.GenerateBinomial(h, n, cell_area / total_area);
251+
SInt cell_vertices = rng_.GenerateBinomial(h, n, std::clamp(cell_area / total_area, 0.0, 1.0));
251252
LPFloat cell_start_x = std::get<1>(chunk) + ((i / cells_per_dim_) % cells_per_dim_) * cell_size_;
252253
LPFloat cell_start_y = std::get<2>(chunk) + (i % cells_per_dim_) * cell_size_;
253254
LPFloat cell_start_z = std::get<3>(chunk) + (i / (cells_per_dim_ * cells_per_dim_)) * cell_size_;

kagen/generators/geometric/rgg/rgg_2d.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "kagen/generators/geometric/rgg/rgg_2d.h"
22

3+
#include <algorithm>
4+
35
#include "kagen/tools/geometry.h"
46

57
namespace kagen {
@@ -152,7 +154,8 @@ void RGG2D::GenerateCells(const SInt chunk_id) {
152154
for (SInt i = 0; i < cells_per_chunk_; ++i) {
153155
seed = config_.seed + chunk_id * cells_per_chunk_ + i + total_chunks_ * cells_per_chunk_;
154156
SInt h = sampling::Spooky::hash(seed);
155-
SInt cell_vertices = rng_.GenerateBinomial(h, n, cell_area / total_area);
157+
// due to potential floating point inaccuracies clamp probability
158+
SInt cell_vertices = rng_.GenerateBinomial(h, n, std::clamp(cell_area / total_area, 0.0, 1.0));
156159
LPFloat cell_start_x = std::get<1>(chunk) + (i / cells_per_dim_) * cell_size_;
157160
LPFloat cell_start_y = std::get<2>(chunk) + (i % cells_per_dim_) * cell_size_;
158161

kagen/generators/geometric/rgg/rgg_3d.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "kagen/generators/geometric/rgg/rgg_3d.h"
22

3+
#include <algorithm>
4+
35
namespace kagen {
46
RGG3D::RGG3D(const PGeneratorConfig& config, const PEID rank, const PEID size) : Geometric3D(config, rank, size) {
57
// Chunk variables
@@ -176,7 +178,8 @@ void RGG3D::GenerateCells(const SInt chunk_id) {
176178
for (SInt i = 0; i < cells_per_chunk_; ++i) {
177179
seed = config_.seed + chunk_id * cells_per_chunk_ + i + total_chunks_ * cells_per_chunk_;
178180
SInt h = sampling::Spooky::hash(seed);
179-
SInt cell_vertices = rng_.GenerateBinomial(h, n, cell_area / total_area);
181+
// due to potential floating point inaccuracies clamp probability
182+
SInt cell_vertices = rng_.GenerateBinomial(h, n, std::clamp(cell_area / total_area, 0.0, 1.0));
180183
LPFloat cell_start_x = std::get<1>(chunk) + ((i / cells_per_dim_) % cells_per_dim_) * cell_size_;
181184
LPFloat cell_start_y = std::get<2>(chunk) + (i % cells_per_dim_) * cell_size_;
182185
LPFloat cell_start_z = std::get<3>(chunk) + (i / (cells_per_dim_ * cells_per_dim_)) * cell_size_;

kagen/generators/hyperbolic/hyperbolic.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "kagen/tools/postprocessor.h"
88

99
#include <iostream>
10+
#include <algorithm>
1011

1112
namespace kagen {
1213
PGeneratorConfig
@@ -188,7 +189,8 @@ void Hyperbolic<Double>::ComputeAnnuli(const SInt chunk_id) {
188189

189190
// Variate
190191
SInt h = sampling::Spooky::hash(config_.seed + total_annuli_ * config_.k + chunk_id * total_annuli_ + i);
191-
SInt n_annulus = rng_.GenerateBinomial(h, n, ring_area / total_area);
192+
// due to potential floating point inaccuracies clamp probability
193+
SInt n_annulus = rng_.GenerateBinomial(h, n, std::clamp(ring_area / total_area, Double {0.0}, Double{1.0}));
192194

193195
// Push annuli_
194196
annuli_[ComputeGlobalChunkId(i - 1, chunk_id)] = std::make_tuple(n_annulus, min_r, max_r, false, offset);
@@ -294,7 +296,7 @@ void Hyperbolic<Double>::GenerateCells(const SInt annulus_id, SInt chunk_id) {
294296
if (!clique)
295297
seed = config_.seed + annulus_id * config_.k + chunk_id + i + config_.n;
296298
SInt h = sampling::Spooky::hash(seed);
297-
SInt n_cell = rng_.GenerateBinomial(h, n, grid_phi / total_phi);
299+
SInt n_cell = rng_.GenerateBinomial(h, n, std::clamp(grid_phi / total_phi, Double{0.0}, Double{1.0}));
298300

299301
SInt global_cell_id = ComputeGlobalCellId(annulus_id, chunk_id, i);
300302
cells_[global_cell_id] =

0 commit comments

Comments
 (0)