File: t_DistributionFactory_std.py

package info (click to toggle)
openturns 1.26-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 67,708 kB
  • sloc: cpp: 261,605; python: 67,030; ansic: 4,378; javascript: 406; sh: 185; xml: 164; makefile: 101
file content (115 lines) | stat: -rwxr-xr-x 3,835 bytes parent folder | download
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")