Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Handle single Tabular case in combine_distributions
  • Loading branch information
paulromano committed Jan 21, 2026
commit a9621399ab57b7356957dcec8ad60877001cc0cb
13 changes: 9 additions & 4 deletions openmc/stats/univariate.py
Original file line number Diff line number Diff line change
Expand Up @@ -1921,12 +1921,12 @@ def combine_distributions(
for i, dist in enumerate(dists):
cv.check_type(f'dists[{i}]', dist, (Discrete, Tabular))
cv.check_type(f'probs[{i}]', probs[i], Real)
cv.check_greater_than(f'probs[{i}]', probs[i], 0.0)
cv.check_greater_than(f'probs[{i}]', probs[i], 0.0)

# Get list of discrete/continuous distribution indices
discrete_index = [i for i, d in enumerate(dists) if isinstance(d, Discrete)]
cont_index = [i for i, d in enumerate(dists) if isinstance(d, Tabular)]

cont_dists = [dists[i] for i in cont_index]
cont_probs = [probs[i] for i in cont_index]

Expand All @@ -1936,11 +1936,16 @@ def combine_distributions(
discrete_probs = [probs[i] for i in discrete_index]
combined_dist = Discrete.merge(dist_discrete, discrete_probs)
if cont_index:
return Mixture(cont_probs+[1.0], cont_dists+[combined_dist])
return Mixture(cont_probs + [1.0], cont_dists + [combined_dist])
else:
return combined_dist
else:
return Mixture(cont_probs, cont_dists)
if len(cont_dists) == 1:
dist = cont_dists[0]
return Tabular(dist.x, dist.p * cont_probs[0],
dist.interpolation, bias=dist.bias)
else:
return Mixture(cont_probs, cont_dists)


def check_bias_support(parent: Univariate, bias: Univariate | None):
Expand Down
17 changes: 16 additions & 1 deletion tests/unit_tests/test_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -633,12 +633,27 @@ def test_combine_distributions():
assert len(mixed.distribution) == 2
assert len(mixed.probability) == 2

# Single tabular returns a tabular distribution with scaled probabilities
t_single = openmc.stats.Tabular([0.0, 1.0], [2.0, 0.0])
scaled = openmc.stats.combine_distributions([t_single], [0.25])
assert isinstance(scaled, openmc.stats.Tabular)
assert scaled.p == pytest.approx([0.5, 0.0])

# Mixture with biased tabular should preserve unbiased mean via weights
bias = openmc.stats.Tabular([0.0, 1.0], [2.0, 0.0])
t_biased = openmc.stats.Tabular([0.0, 1.0], [1.0, 1.0], bias=bias)
d1 = openmc.stats.delta_function(0.0)
mixed = openmc.stats.combine_distributions([t_biased, d1], [0.5, 0.5])
assert isinstance(mixed, openmc.stats.Mixture)
samples, weights = mixed.sample(10_000)
assert_sample_mean(samples*weights, 0.25)

# Combine 1 discrete and 2 tabular -- the tabular distributions should
# combine to produce a uniform distribution with mean 0.5. The combined
# distribution should have a mean of 0.25.
t1 = openmc.stats.Tabular([0., 1.], [2.0, 0.0])
t2 = openmc.stats.Tabular([0., 1.], [0.0, 2.0])
d1 = openmc.stats.Discrete([0.0], [1.0])
d1 = openmc.stats.delta_function(0.0)
combined = openmc.stats.combine_distributions([t1, t2, d1], [0.25, 0.25, 0.5])
assert combined.integral() == pytest.approx(1.0)

Expand Down
Loading