1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
#! /usr/bin/env python
import openturns as ot
import openturns.testing as ott
import time
print(
"Continuous univariate factories=",
ot.DistributionFactory.GetContinuousUniVariateFactories(),
)
print(
"Continuous multivariate factories=",
ot.DistributionFactory.GetContinuousMultiVariateFactories(),
)
print(
"Discrete univariate factories=",
ot.DistributionFactory.GetDiscreteUniVariateFactories(),
)
print(
"Discrete multivariate factories=",
ot.DistributionFactory.GetDiscreteMultiVariateFactories(),
)
print("Univariate factories=", ot.DistributionFactory.GetUniVariateFactories())
print("Multivariate factories=", ot.DistributionFactory.GetMultiVariateFactories())
factories = ot.DistributionFactory.GetContinuousUniVariateFactories()
factories.add(ot.DistributionFactory.GetDiscreteUniVariateFactories())
for factory in factories:
print(f"-- {factory}...")
dist = factory.build()
# check if raise on constant sample
if dist.isContinuous():
sample = ot.Sample(100, [1.0e5])
ok = False
try:
dist = factory.build(sample)
except Exception:
ok = True
print("constant:", "ok" if ok else "fail")
assert ok, str(factory) + " vs const"
# check if raises on sample with nan/inf
for weird in ["nan", "inf"]:
sample = dist.getSample(100)
sample[0, 0] = float(weird)
ok = False
try:
dist = factory.build(sample)
except Exception:
ok = True
print(weird + ":", "ok" if ok else "fail")
assert ok, str(factory) + " vs " + weird
factory = ot.DistributionFactory.GetByName("PoissonFactory")
print(factory)
assert factory.getImplementation().__class__.__name__ == "PoissonFactory", "wrong name"
# Now, test each factory for the partial estimation of any subset of its parameters
params = {
"FisherSnedecorFactory": 0.25,
"LogisticFactory": 0.025,
"ParetoFactory": 0.15,
"StudentFactory": 0.15,
"StudentFactory": 0.15,
"TrapezoidalFactory": 1.0,
"TriangularFactory": 0.025,
}
for factory in factories:
print(f"-- {factory}...")
try:
factoryName = factory.getImplementation().getClassName()
except Exception:
print("Skip", factory, "no getClassName()")
continue
# Skip HistogramFactory because it is nonparametric, so the rebuilt distribution has a number of parameters different from the reference distribution
# Skip some others because they are quite slow
distName = factoryName.replace("Factory", "")
if distName in [
"Rice",
"Student",
"Trapezoidal",
"TruncatedNormal",
"VonMises",
"Histogram",
"MeixnerDistribution",
"Pareto",
"Dirichlet",
"InverseNormal",
]:
continue
eps = params.get(factoryName, 0.05)
# Reference distribution
refDistribution = factory.build()
sample = refDistribution.getSample(10000)
# Get the ref parameter
refParameter = refDistribution.getParameter()
n = len(refParameter)
t0 = time.time()
for k in range(n):
# Generate all the combinations of known parameter
combinations = ot.Combinations(k, n).generate()
for combination in combinations:
indices = [int(x) for x in combination]
values = [refParameter[i] for i in indices]
factory.setKnownParameter(indices, values)
assert factory.getKnownParameterIndices() == indices
assert factory.getKnownParameterValues() == values
res = factory.build(sample)
resParameter = res.getParameter()
ott.assert_almost_equal(resParameter, refParameter, eps, eps)
t1 = time.time()
print(f"done in t={(t1 - t0):.3f} s")
|