@@ -81,10 +81,10 @@ public Mixture(double[] weights, IUnivariateDistribution[] distributions)
8181
8282 private double [ ] _weights ;
8383 private UnivariateDistributionBase [ ] _distributions ;
84- private EmpiricalDistribution _inverseCDF ;
84+ private EmpiricalDistribution _empiricalCDF ;
8585 private bool _momentsComputed = false ;
8686 private double u1 , u2 , u3 , u4 ;
87- private bool _inverseCDFCreated = false ;
87+ private bool _empiricalCDFCreated = false ;
8888
8989 /// <summary>
9090 /// Returns the array of distribution weights.
@@ -408,7 +408,7 @@ public void SetParameters(double[] weights, UnivariateDistributionBase[] distrib
408408 _weights = weights ;
409409 _distributions = distributions ;
410410 _momentsComputed = false ;
411- _inverseCDFCreated = false ;
411+ _empiricalCDFCreated = false ;
412412 }
413413
414414 /// <summary>
@@ -430,7 +430,7 @@ public void SetParameters(double[] weights, IUnivariateDistribution[] distributi
430430 _distributions [ i ] = ( UnivariateDistributionBase ) distributions [ i ] ;
431431 }
432432 _momentsComputed = false ;
433- _inverseCDFCreated = false ;
433+ _empiricalCDFCreated = false ;
434434 }
435435
436436 /// <summary>
@@ -463,7 +463,7 @@ public void SetParameters(double[] weights, double[] parameters)
463463 t += Distributions [ i ] . NumberOfParameters ;
464464 }
465465 _momentsComputed = false ;
466- _inverseCDFCreated = false ;
466+ _empiricalCDFCreated = false ;
467467 }
468468
469469 /// <inheritdoc/>
@@ -496,7 +496,7 @@ public override void SetParameters(IList<double> parameters)
496496 // Validate parameters
497497 _parametersValid = ValidateParameters ( parameters , false ) is null ;
498498 _momentsComputed = false ;
499- _inverseCDFCreated = false ;
499+ _empiricalCDFCreated = false ;
500500 }
501501
502502 /// <summary>
@@ -576,7 +576,7 @@ public void SetParameters(ref double[] parameters)
576576 // Validate parameters
577577 _parametersValid = ValidateParameters ( parameters , false ) is null ;
578578 _momentsComputed = false ;
579- _inverseCDFCreated = false ;
579+ _empiricalCDFCreated = false ;
580580 }
581581
582582 /// <inheritdoc/>
@@ -919,35 +919,42 @@ public override double InverseCDF(double probability)
919919 return Distributions [ 0 ] . InverseCDF ( probability ) ;
920920 }
921921
922- // Otherwise use a root finder to solve the inverse CDF
923- var xVals = Distributions . Select ( d => d . InverseCDF ( probability ) ) ;
924- double minX = xVals . Min ( ) ;
925- double maxX = xVals . Max ( ) ;
926922 double x = 0 ;
927- try
923+ if ( _empiricalCDFCreated == true )
928924 {
929- if ( IsZeroInflated )
930- {
931- Brent . Bracket ( ( y ) => { return probability - CDF ( y ) ; } , ref minX , ref maxX , out var f1 , out var f2 ) ;
932- }
933- x = Brent . Solve ( ( y ) => { return probability - CDF ( y ) ; } , minX , maxX , 1E-6 , 100 , true ) ;
925+ x = _empiricalCDF . InverseCDF ( probability ) ;
934926 }
935- catch ( Exception )
927+ else
936928 {
937- // If the root finder fails, create an empirical inverse CDF
938- if ( _inverseCDFCreated == false )
939- CreateInverseCDF ( ) ;
940- x = _inverseCDF . InverseCDF ( probability ) ;
929+ // Use a root finder to solve the inverse CDF
930+ var xVals = Distributions . Select ( d => d . InverseCDF ( probability ) ) ;
931+ double minX = xVals . Min ( ) ;
932+ double maxX = xVals . Max ( ) ;
933+ try
934+ {
935+ if ( IsZeroInflated )
936+ {
937+ Brent . Bracket ( ( y ) => { return probability - CDF ( y ) ; } , ref minX , ref maxX , out var f1 , out var f2 ) ;
938+ }
939+ x = Brent . Solve ( ( y ) => { return probability - CDF ( y ) ; } , minX , maxX , 1E-6 , 100 , true ) ;
940+ }
941+ catch ( Exception )
942+ {
943+ // If the root finder fails, create an empirical CDF
944+ if ( _empiricalCDFCreated == false )
945+ CreateEmpiricalCDF ( ) ;
946+ x = _empiricalCDF . InverseCDF ( probability ) ;
947+ }
941948 }
942949 double min = Minimum ;
943950 double max = Maximum ;
944951 return x < min ? min : x > max ? max : x ;
945952 }
946953
947954 /// <summary>
948- /// Create empirical distribution for the inverse CDF.
955+ /// Create empirical distribution for the CDF.
949956 /// </summary>
950- private void CreateInverseCDF ( )
957+ public void CreateEmpiricalCDF ( )
951958 {
952959 // Get min & max
953960 double minP = 1E-16 ;
@@ -986,8 +993,8 @@ private void CreateInverseCDF()
986993 xValues . Add ( x ) ;
987994 pValues . Add ( p ) ;
988995 }
989- _inverseCDF = new EmpiricalDistribution ( xValues , pValues ) { XTransform = XTransform , ProbabilityTransform = ProbabilityTransform } ;
990- _inverseCDFCreated = true ;
996+ _empiricalCDF = new EmpiricalDistribution ( xValues , pValues ) { XTransform = XTransform , ProbabilityTransform = ProbabilityTransform } ;
997+ _empiricalCDFCreated = true ;
991998 }
992999
9931000 /// <inheritdoc/>
0 commit comments