@@ -2065,31 +2065,48 @@ def clip(self, tolerance: float = 1e-6, inplace: bool = False) -> Mixture:
20652065
20662066
20672067def combine_distributions (
2068- dists : Sequence [Discrete | Tabular ],
2068+ dists : Sequence [Discrete | Tabular | Mixture ],
20692069 probs : Sequence [float ]
20702070):
20712071 """Combine distributions with specified probabilities
20722072
20732073 This function can be used to combine multiple instances of
2074- :class:`~openmc.stats.Discrete` and `~openmc.stats.Tabular`. Multiple
2075- discrete distributions are merged into a single distribution and the
2076- remainder of the distributions are put into a :class:`~openmc.stats.Mixture`
2077- distribution.
2074+ :class:`~openmc.stats.Discrete`, :class: `~openmc.stats.Tabular` and
2075+ :class:`~openmc.stats.Mixture` of them. Multiple discrete distributions are
2076+ merged into a single distribution and the remainder of the distributions are
2077+ put into a :class:`~openmc.stats.Mixture` distribution.
20782078
20792079 .. versionadded:: 0.13.1
20802080
20812081 Parameters
20822082 ----------
2083- dists : sequence of openmc.stats.Discrete or openmc.stats.Tabular
2083+ dists : sequence of openmc.stats.Discrete, openmc.stats.Tabular, or openmc.stats.Mixture
20842084 Distributions to combine
20852085 probs : sequence of float
20862086 Probability (or intensity) of each distribution
20872087
20882088 """
2089+ new_probs = []
2090+ new_dists = []
20892091 for i , dist in enumerate (dists ):
2090- cv .check_type (f'dists[{ i } ]' , dist , (Discrete , Tabular ))
2092+ cv .check_type (f'dists[{ i } ]' , dist , (Discrete , Tabular , Mixture ))
20912093 cv .check_type (f'probs[{ i } ]' , probs [i ], Real )
20922094 cv .check_greater_than (f'probs[{ i } ]' , probs [i ], 0.0 )
2095+ if isinstance (dist , Mixture ):
2096+ if dist .bias is not None :
2097+ warn ("A Mixture distribution with a bias specified was passed "
2098+ "to combine_distributions. The bias will be discarded "
2099+ "during flattening." )
2100+ for j , d in enumerate (dist .distribution ):
2101+ cv .check_type (f'dists[{ i } ].distribution[{ j } ]' , d , (Discrete , Tabular ))
2102+ new_probs .append (probs [i ]* dist .probability [j ])
2103+ new_dists .append (d )
2104+ else :
2105+ new_probs .append (probs [i ])
2106+ new_dists .append (dist )
2107+
2108+ probs = new_probs
2109+ dists = new_dists
20932110
20942111 # Get list of discrete/continuous distribution indices
20952112 discrete_index = [i for i , d in enumerate (dists ) if isinstance (d , Discrete )]
0 commit comments