@@ -397,7 +397,7 @@ def from_xml_element(cls, elem: ET.Element):
397397 def merge (
398398 cls ,
399399 dists : Sequence [Discrete ],
400- probs : Sequence [int ]
400+ probs : Sequence [float ]
401401 ):
402402 """Merge multiple discrete distributions into a single distribution
403403
@@ -1897,7 +1897,7 @@ def clip(self, tolerance: float = 1e-6, inplace: bool = False) -> Mixture:
18971897
18981898
18991899def combine_distributions (
1900- dists : Sequence [Univariate ],
1900+ dists : Sequence [Discrete | Tabular ],
19011901 probs : Sequence [float ]
19021902):
19031903 """Combine distributions with specified probabilities
@@ -1912,41 +1912,40 @@ def combine_distributions(
19121912
19131913 Parameters
19141914 ----------
1915- dists : iterable of openmc.stats.Univariate
1915+ dists : sequence of openmc.stats.Discrete or openmc.stats.Tabular
19161916 Distributions to combine
1917- probs : iterable of float
1917+ probs : sequence of float
19181918 Probability (or intensity) of each distribution
19191919
19201920 """
1921- # Get copy of distribution list so as not to modify the argument
1922- dist_list = deepcopy (dists )
1921+ for i , dist in enumerate (dists ):
1922+ cv .check_type (f'dists[{ i } ]' , dist , (Discrete , Tabular ))
1923+ cv .check_type (f'probs[{ i } ]' , probs [i ], Real )
1924+ cv .check_greater_than (f'probs[{ i } ]' , probs [i ], 0.0 )
19231925
19241926 # Get list of discrete/continuous distribution indices
1925- discrete_index = [i for i , d in enumerate (dist_list ) if isinstance (d , Discrete )]
1926- cont_index = [i for i , d in enumerate (dist_list ) if isinstance (d , Tabular )]
1927+ discrete_index = [i for i , d in enumerate (dists ) if isinstance (d , Discrete )]
1928+ cont_index = [i for i , d in enumerate (dists ) if isinstance (d , Tabular )]
19271929
1928- # Apply probabilites to continuous distributions
1929- for i in cont_index :
1930- dist = dist_list [i ]
1931- dist ._p *= probs [i ]
1930+ cont_dists = [dists [i ] for i in cont_index ]
1931+ cont_probs = [probs [i ] for i in cont_index ]
19321932
19331933 if discrete_index :
19341934 # Create combined discrete distribution
1935- dist_discrete = [dist_list [i ] for i in discrete_index ]
1935+ dist_discrete = [dists [i ] for i in discrete_index ]
19361936 discrete_probs = [probs [i ] for i in discrete_index ]
19371937 combined_dist = Discrete .merge (dist_discrete , discrete_probs )
1938-
1939- # Replace multiple discrete distributions with merged
1940- for idx in reversed (discrete_index ):
1941- dist_list .pop (idx )
1942- dist_list .append (combined_dist )
1943-
1944- # Combine discrete and continuous if present
1945- if len (dist_list ) > 1 :
1946- probs = [1.0 ]* len (dist_list )
1947- dist_list [:] = [Mixture (probs , dist_list .copy ())]
1948-
1949- return dist_list [0 ]
1938+ if cont_index :
1939+ return Mixture (cont_probs + [1.0 ], cont_dists + [combined_dist ])
1940+ else :
1941+ return combined_dist
1942+ else :
1943+ if len (cont_dists ) == 1 :
1944+ dist = cont_dists [0 ]
1945+ return Tabular (dist .x , dist .p * cont_probs [0 ],
1946+ dist .interpolation , bias = dist .bias )
1947+ else :
1948+ return Mixture (cont_probs , cont_dists )
19501949
19511950
19521951def check_bias_support (parent : Univariate , bias : Univariate | None ):
0 commit comments