pygeoinf 1.3.1__py3-none-any.whl → 1.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pygeoinf/auxiliary.py +29 -0
- pygeoinf/checks/linear_operators.py +108 -35
- pygeoinf/checks/nonlinear_operators.py +63 -19
- {pygeoinf-1.3.1.dist-info → pygeoinf-1.3.2.dist-info}/METADATA +1 -1
- {pygeoinf-1.3.1.dist-info → pygeoinf-1.3.2.dist-info}/RECORD +7 -6
- {pygeoinf-1.3.1.dist-info → pygeoinf-1.3.2.dist-info}/WHEEL +0 -0
- {pygeoinf-1.3.1.dist-info → pygeoinf-1.3.2.dist-info}/licenses/LICENSE +0 -0
pygeoinf/auxiliary.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from .gaussian_measure import GaussianMeasure
|
|
2
|
+
|
|
3
|
+
def empirical_data_error_measure(model_measure, forward_operator, n_samples=10, scale_factor=1.0):
|
|
4
|
+
"""
|
|
5
|
+
Generate an empirical data error measure based on samples from a measure on the model space. Useful for when you need
|
|
6
|
+
to define a reasonable data error measure for synthetic testing, and need the covariance matrix to be easily accessible.
|
|
7
|
+
|
|
8
|
+
Args:
|
|
9
|
+
model_measure: The measure on the model space used as a basis for the error measure (e.g., the model prior measure)
|
|
10
|
+
forward_operator: Linear operator mapping from model space to data space (e.g., operator B)
|
|
11
|
+
n_samples: Number of samples to generate for computing statistics (default: 10)
|
|
12
|
+
scale_factor: Scaling factor for the standard deviations (default: 1.0)
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
inf.GaussianMeasure: Data error measure with empirically determined covariance
|
|
16
|
+
"""
|
|
17
|
+
# Generate samples in data space by pushing forward model samples
|
|
18
|
+
data_samples = model_measure.affine_mapping(operator=forward_operator).samples(n_samples)
|
|
19
|
+
data_space = forward_operator.codomain
|
|
20
|
+
|
|
21
|
+
# Remove the mean from each sample
|
|
22
|
+
total = data_space.zero
|
|
23
|
+
for sample in data_samples:
|
|
24
|
+
total = data_space.add(total, sample)
|
|
25
|
+
mean = data_space.multiply(1.0 / n_samples, total)
|
|
26
|
+
zeroed_samples = [data_space.multiply(scale_factor, data_space.subtract(data_sample, mean)) for data_sample in data_samples]
|
|
27
|
+
|
|
28
|
+
# Create and return the Gaussian measure from the zeroed samples
|
|
29
|
+
return GaussianMeasure.from_samples(forward_operator.codomain, zeroed_samples)
|
|
@@ -12,6 +12,7 @@ from .nonlinear_operators import NonLinearOperatorAxiomChecks
|
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
14
|
from ..hilbert_space import Vector
|
|
15
|
+
from ..linear_forms import LinearForm
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class LinearOperatorAxiomChecks(NonLinearOperatorAxiomChecks):
|
|
@@ -22,7 +23,15 @@ class LinearOperatorAxiomChecks(NonLinearOperatorAxiomChecks):
|
|
|
22
23
|
checks for linearity and the adjoint identity.
|
|
23
24
|
"""
|
|
24
25
|
|
|
25
|
-
def _check_linearity(
|
|
26
|
+
def _check_linearity(
|
|
27
|
+
self,
|
|
28
|
+
x: Vector,
|
|
29
|
+
y: Vector,
|
|
30
|
+
a: float,
|
|
31
|
+
b: float,
|
|
32
|
+
check_rtol: float = 1e-5,
|
|
33
|
+
check_atol: float = 1e-8,
|
|
34
|
+
):
|
|
26
35
|
"""Verifies the linearity property: L(ax + by) = a*L(x) + b*L(y)"""
|
|
27
36
|
ax_plus_by = self.domain.add(
|
|
28
37
|
self.domain.multiply(a, x), self.domain.multiply(b, y)
|
|
@@ -38,72 +47,130 @@ class LinearOperatorAxiomChecks(NonLinearOperatorAxiomChecks):
|
|
|
38
47
|
rhs_norm = self.codomain.norm(rhs)
|
|
39
48
|
relative_error = diff_norm / (rhs_norm + 1e-12)
|
|
40
49
|
|
|
41
|
-
if relative_error >
|
|
50
|
+
if relative_error > check_rtol and diff_norm > check_atol:
|
|
42
51
|
raise AssertionError(
|
|
43
|
-
f"Linearity check failed: L(ax+by) != aL(x)+bL(y).
|
|
52
|
+
f"Linearity check failed: L(ax+by) != aL(x)+bL(y). "
|
|
53
|
+
f"Relative error: {relative_error:.2e} (Tol: {check_rtol:.2e}), "
|
|
54
|
+
f"Absolute error: {diff_norm:.2e} (Tol: {check_atol:.2e})"
|
|
44
55
|
)
|
|
45
56
|
|
|
46
|
-
def _check_adjoint_definition(
|
|
57
|
+
def _check_adjoint_definition(
|
|
58
|
+
self,
|
|
59
|
+
x: Vector,
|
|
60
|
+
y: Vector,
|
|
61
|
+
check_rtol: float = 1e-5,
|
|
62
|
+
check_atol: float = 1e-8,
|
|
63
|
+
):
|
|
47
64
|
"""Verifies the adjoint identity: <L(x), y> = <x, L*(y)>"""
|
|
48
65
|
lhs = self.codomain.inner_product(self(x), y)
|
|
49
66
|
rhs = self.domain.inner_product(x, self.adjoint(y))
|
|
50
67
|
|
|
51
|
-
if not np.isclose(lhs, rhs):
|
|
68
|
+
if not np.isclose(lhs, rhs, rtol=check_rtol, atol=check_atol):
|
|
52
69
|
raise AssertionError(
|
|
53
|
-
f"Adjoint definition failed: <L(x),y> = {lhs:.4e},
|
|
70
|
+
f"Adjoint definition failed: <L(x),y> = {lhs:.4e}, "
|
|
71
|
+
f"but <x,L*(y)> = {rhs:.4e} (RelTol: {check_rtol:.2e}, AbsTol: {check_atol:.2e})"
|
|
54
72
|
)
|
|
55
73
|
|
|
56
|
-
def _check_algebraic_identities(
|
|
74
|
+
def _check_algebraic_identities(
|
|
75
|
+
self,
|
|
76
|
+
op1,
|
|
77
|
+
op2,
|
|
78
|
+
x,
|
|
79
|
+
y,
|
|
80
|
+
a,
|
|
81
|
+
check_rtol: float = 1e-5,
|
|
82
|
+
check_atol: float = 1e-8,
|
|
83
|
+
):
|
|
57
84
|
"""
|
|
58
85
|
Verifies the algebraic properties of the adjoint and dual operators.
|
|
59
86
|
Requires a second compatible operator (op2).
|
|
60
87
|
"""
|
|
88
|
+
|
|
89
|
+
def _check_norm_based(res1, res2, space, axiom_name):
|
|
90
|
+
"""Helper to perform norm-based comparison."""
|
|
91
|
+
diff_norm = space.norm(space.subtract(res1, res2))
|
|
92
|
+
norm_res2 = space.norm(res2)
|
|
93
|
+
if diff_norm > check_atol and diff_norm > check_rtol * (norm_res2 + 1e-12):
|
|
94
|
+
raise AssertionError(
|
|
95
|
+
f"Axiom failed: {axiom_name}. "
|
|
96
|
+
f"Absolute error: {diff_norm:.2e}, Relative error: {diff_norm / (norm_res2 + 1e-12):.2e}"
|
|
97
|
+
)
|
|
98
|
+
|
|
61
99
|
# --- Adjoint Identities ---
|
|
62
100
|
# (A+B)* = A* + B*
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if op1.domain.norm(diff) > 1e-9:
|
|
67
|
-
raise AssertionError("Axiom failed: (A+B)* != A* + B*")
|
|
101
|
+
res1 = (op1 + op2).adjoint(y)
|
|
102
|
+
res2 = (op1.adjoint + op2.adjoint)(y)
|
|
103
|
+
_check_norm_based(res1, res2, op1.domain, "(A+B)* != A* + B*")
|
|
68
104
|
|
|
69
105
|
# (a*A)* = a*A*
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if op1.domain.norm(diff) > 1e-9:
|
|
74
|
-
raise AssertionError("Axiom failed: (a*A)* != a*A*")
|
|
106
|
+
res1 = (a * op1).adjoint(y)
|
|
107
|
+
res2 = (a * op1.adjoint)(y)
|
|
108
|
+
_check_norm_based(res1, res2, op1.domain, "(a*A)* != a*A*")
|
|
75
109
|
|
|
76
110
|
# (A*)* = A
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
raise AssertionError("Axiom failed: (A*)* != A")
|
|
111
|
+
res1 = op1.adjoint.adjoint(x)
|
|
112
|
+
res2 = op1(x)
|
|
113
|
+
_check_norm_based(res1, res2, op1.codomain, "(A*)* != A")
|
|
81
114
|
|
|
82
115
|
# (A@B)* = B*@A*
|
|
83
116
|
if op1.domain == op2.codomain:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if op2.domain.norm(diff) > 1e-9:
|
|
88
|
-
raise AssertionError("Axiom failed: (A@B)* != B*@A*")
|
|
117
|
+
res1 = (op1 @ op2).adjoint(y)
|
|
118
|
+
res2 = (op2.adjoint @ op1.adjoint)(y)
|
|
119
|
+
_check_norm_based(res1, res2, op2.domain, "(A@B)* != B*@A*")
|
|
89
120
|
|
|
90
121
|
# --- Dual Identities ---
|
|
91
122
|
# (A+B)' = A' + B'
|
|
92
123
|
op_sum_dual = (op1 + op2).dual
|
|
93
124
|
dual_sum = op1.dual + op2.dual
|
|
94
125
|
y_dual = op1.codomain.to_dual(y)
|
|
95
|
-
# The result of applying a dual operator is a LinearForm, which supports subtraction
|
|
96
|
-
diff_dual = op_sum_dual(y_dual) - dual_sum(y_dual)
|
|
97
|
-
if op1.domain.dual.norm(diff_dual) > 1e-9:
|
|
98
|
-
raise AssertionError("Axiom failed: (A+B)' != A' + B'")
|
|
99
126
|
|
|
100
|
-
|
|
127
|
+
# The result of applying a dual operator is a LinearForm
|
|
128
|
+
res1_form: LinearForm = op_sum_dual(y_dual)
|
|
129
|
+
res2_form: LinearForm = dual_sum(y_dual)
|
|
130
|
+
|
|
131
|
+
# CORRECTED: Use LinearForm subtraction and dual space norm
|
|
132
|
+
# (This assumes LinearForm overloads __sub__)
|
|
133
|
+
try:
|
|
134
|
+
diff_form = res1_form - res2_form
|
|
135
|
+
diff_norm = op1.domain.dual.norm(diff_form)
|
|
136
|
+
norm_res2 = op1.domain.dual.norm(res2_form)
|
|
137
|
+
|
|
138
|
+
if diff_norm > check_atol and diff_norm > check_rtol * (norm_res2 + 1e-12):
|
|
139
|
+
raise AssertionError(
|
|
140
|
+
f"Axiom failed: (A+B)' != A' + B'. "
|
|
141
|
+
f"Absolute error: {diff_norm:.2e}, Relative error: {diff_norm / (norm_res2 + 1e-12):.2e}"
|
|
142
|
+
)
|
|
143
|
+
except (AttributeError, TypeError):
|
|
144
|
+
# Fallback if LinearForm doesn't support subtraction or norm
|
|
145
|
+
if not np.allclose(
|
|
146
|
+
res1_form.components,
|
|
147
|
+
res2_form.components,
|
|
148
|
+
rtol=check_rtol,
|
|
149
|
+
atol=check_atol,
|
|
150
|
+
):
|
|
151
|
+
raise AssertionError(
|
|
152
|
+
"Axiom failed: (A+B)' != A' + B' (component check)."
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
def check(
|
|
156
|
+
self,
|
|
157
|
+
n_checks: int = 5,
|
|
158
|
+
op2=None,
|
|
159
|
+
check_rtol: float = 1e-5,
|
|
160
|
+
check_atol: float = 1e-8,
|
|
161
|
+
) -> None:
|
|
101
162
|
"""
|
|
102
163
|
Runs all checks for the LinearOperator, including non-linear checks
|
|
103
164
|
and algebraic identities.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
n_checks: The number of randomized trials to perform.
|
|
168
|
+
op2: An optional second operator for testing algebraic rules.
|
|
169
|
+
check_rtol: The relative tolerance for numerical checks.
|
|
170
|
+
check_atol: The absolute tolerance for numerical checks.
|
|
104
171
|
"""
|
|
105
172
|
# First, run the parent (non-linear) checks from the base class
|
|
106
|
-
super().check(n_checks, op2=op2)
|
|
173
|
+
super().check(n_checks, op2=op2, check_rtol=check_rtol, check_atol=check_atol)
|
|
107
174
|
|
|
108
175
|
# Now, run the linear-specific checks
|
|
109
176
|
print(
|
|
@@ -115,10 +182,16 @@ class LinearOperatorAxiomChecks(NonLinearOperatorAxiomChecks):
|
|
|
115
182
|
y = self.codomain.random()
|
|
116
183
|
a, b = np.random.randn(), np.random.randn()
|
|
117
184
|
|
|
118
|
-
self._check_linearity(
|
|
119
|
-
|
|
185
|
+
self._check_linearity(
|
|
186
|
+
x1, x2, a, b, check_rtol=check_rtol, check_atol=check_atol
|
|
187
|
+
)
|
|
188
|
+
self._check_adjoint_definition(
|
|
189
|
+
x1, y, check_rtol=check_rtol, check_atol=check_atol
|
|
190
|
+
)
|
|
120
191
|
|
|
121
192
|
if op2:
|
|
122
|
-
self._check_algebraic_identities(
|
|
193
|
+
self._check_algebraic_identities(
|
|
194
|
+
self, op2, x1, y, a, check_rtol=check_rtol, check_atol=check_atol
|
|
195
|
+
)
|
|
123
196
|
|
|
124
197
|
print(f"✅ All {n_checks} linear operator checks passed successfully.")
|
|
@@ -13,7 +13,9 @@ if TYPE_CHECKING:
|
|
|
13
13
|
class NonLinearOperatorAxiomChecks:
|
|
14
14
|
"""A mixin for checking the properties of a NonLinearOperator."""
|
|
15
15
|
|
|
16
|
-
def _check_derivative_finite_difference(
|
|
16
|
+
def _check_derivative_finite_difference(
|
|
17
|
+
self, x, v, h=1e-7, check_rtol: float = 1e-5, check_atol: float = 1e-8
|
|
18
|
+
):
|
|
17
19
|
"""
|
|
18
20
|
Verifies the derivative using the finite difference formula:
|
|
19
21
|
D[F](x) @ v ≈ (F(x + h*v) - F(x)) / h
|
|
@@ -49,12 +51,20 @@ class NonLinearOperatorAxiomChecks:
|
|
|
49
51
|
analytic_norm = self.codomain.norm(analytic_result)
|
|
50
52
|
relative_error = diff_norm / (analytic_norm + 1e-12)
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
# The finite difference method itself has an error, so we use
|
|
55
|
+
# the max of the requested rtol and a default 1e-4.
|
|
56
|
+
effective_rtol = max(check_rtol, 1e-4)
|
|
57
|
+
|
|
58
|
+
if relative_error > effective_rtol and diff_norm > check_atol:
|
|
53
59
|
raise AssertionError(
|
|
54
|
-
f"Finite difference check failed. Relative error: {relative_error:.2e}"
|
|
60
|
+
f"Finite difference check failed. Relative error: {relative_error:.2e} "
|
|
61
|
+
f"(Tolerance: {effective_rtol:.2e}), "
|
|
62
|
+
f"Absolute error: {diff_norm:.2e} (Tol: {check_atol:.2e})"
|
|
55
63
|
)
|
|
56
64
|
|
|
57
|
-
def _check_add_derivative(
|
|
65
|
+
def _check_add_derivative(
|
|
66
|
+
self, op1, op2, x, v, check_rtol: float = 1e-5, check_atol: float = 1e-8
|
|
67
|
+
):
|
|
58
68
|
"""Verifies the sum rule for derivatives: (F+G)' = F' + G'"""
|
|
59
69
|
if not (op1.has_derivative and op2.has_derivative):
|
|
60
70
|
return # Skip if derivatives aren't defined
|
|
@@ -70,11 +80,19 @@ class NonLinearOperatorAxiomChecks:
|
|
|
70
80
|
res1 = derivative_of_sum(v)
|
|
71
81
|
res2 = sum_of_derivatives(v)
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
83
|
+
# CORRECTED: Use norm-based comparison, not np.allclose
|
|
84
|
+
diff_norm = op1.codomain.norm(op1.codomain.subtract(res1, res2))
|
|
85
|
+
norm_res2 = op1.codomain.norm(res2)
|
|
86
|
+
|
|
87
|
+
if diff_norm > check_atol and diff_norm > check_rtol * (norm_res2 + 1e-12):
|
|
88
|
+
raise AssertionError(
|
|
89
|
+
f"Axiom failed: Derivative of sum is incorrect. "
|
|
90
|
+
f"Absolute error: {diff_norm:.2e}, Relative error: {diff_norm / (norm_res2 + 1e-12):.2e}"
|
|
91
|
+
)
|
|
76
92
|
|
|
77
|
-
def _check_scalar_mul_derivative(
|
|
93
|
+
def _check_scalar_mul_derivative(
|
|
94
|
+
self, op, x, v, a, check_rtol: float = 1e-5, check_atol: float = 1e-8
|
|
95
|
+
):
|
|
78
96
|
"""Verifies the scalar multiple rule: (a*F)' = a*F'"""
|
|
79
97
|
if not op.has_derivative:
|
|
80
98
|
return
|
|
@@ -90,13 +108,19 @@ class NonLinearOperatorAxiomChecks:
|
|
|
90
108
|
res1 = derivative_of_scaled(v)
|
|
91
109
|
res2 = scaled_derivative(v)
|
|
92
110
|
|
|
93
|
-
|
|
94
|
-
|
|
111
|
+
# CORRECTED: Use norm-based comparison
|
|
112
|
+
diff_norm = op.codomain.norm(op.codomain.subtract(res1, res2))
|
|
113
|
+
norm_res2 = op.codomain.norm(res2)
|
|
114
|
+
|
|
115
|
+
if diff_norm > check_atol and diff_norm > check_rtol * (norm_res2 + 1e-12):
|
|
95
116
|
raise AssertionError(
|
|
96
|
-
"Axiom failed: Derivative of scalar multiple is incorrect."
|
|
117
|
+
f"Axiom failed: Derivative of scalar multiple is incorrect. "
|
|
118
|
+
f"Absolute error: {diff_norm:.2e}, Relative error: {diff_norm / (norm_res2 + 1e-12):.2e}"
|
|
97
119
|
)
|
|
98
120
|
|
|
99
|
-
def _check_matmul_derivative(
|
|
121
|
+
def _check_matmul_derivative(
|
|
122
|
+
self, op1, op2, x, v, check_rtol: float = 1e-5, check_atol: float = 1e-8
|
|
123
|
+
):
|
|
100
124
|
"""Verifies the chain rule for derivatives: (F o G)'(x) = F'(G(x)) @ G'(x)"""
|
|
101
125
|
if not (op1.has_derivative and op2.has_derivative):
|
|
102
126
|
return
|
|
@@ -115,13 +139,23 @@ class NonLinearOperatorAxiomChecks:
|
|
|
115
139
|
res1 = derivative_of_composed(v)
|
|
116
140
|
res2 = chain_rule_derivative(v)
|
|
117
141
|
|
|
142
|
+
# CORRECTED: Use norm-based comparison
|
|
118
143
|
diff_norm = op1.codomain.norm(op1.codomain.subtract(res1, res2))
|
|
119
|
-
|
|
144
|
+
norm_res2 = op1.codomain.norm(res2)
|
|
145
|
+
|
|
146
|
+
if diff_norm > check_atol and diff_norm > check_rtol * (norm_res2 + 1e-12):
|
|
120
147
|
raise AssertionError(
|
|
121
|
-
"Axiom failed: Chain rule for derivatives is incorrect."
|
|
148
|
+
f"Axiom failed: Chain rule for derivatives is incorrect. "
|
|
149
|
+
f"Absolute error: {diff_norm:.2e}, Relative error: {diff_norm / (norm_res2 + 1e-12):.2e}"
|
|
122
150
|
)
|
|
123
151
|
|
|
124
|
-
def check(
|
|
152
|
+
def check(
|
|
153
|
+
self,
|
|
154
|
+
n_checks: int = 5,
|
|
155
|
+
op2=None,
|
|
156
|
+
check_rtol: float = 1e-5,
|
|
157
|
+
check_atol: float = 1e-8,
|
|
158
|
+
) -> None:
|
|
125
159
|
"""
|
|
126
160
|
Runs randomized checks to validate the operator's derivative and
|
|
127
161
|
its algebraic properties.
|
|
@@ -129,6 +163,8 @@ class NonLinearOperatorAxiomChecks:
|
|
|
129
163
|
Args:
|
|
130
164
|
n_checks: The number of randomized trials to perform.
|
|
131
165
|
op2: An optional second operator for testing algebraic rules.
|
|
166
|
+
check_rtol: The relative tolerance for numerical checks.
|
|
167
|
+
check_atol: The absolute tolerance for numerical checks.
|
|
132
168
|
"""
|
|
133
169
|
print(
|
|
134
170
|
f"\nRunning {n_checks} randomized checks for {self.__class__.__name__}..."
|
|
@@ -143,12 +179,20 @@ class NonLinearOperatorAxiomChecks:
|
|
|
143
179
|
v = self.domain.random()
|
|
144
180
|
|
|
145
181
|
# Original check
|
|
146
|
-
self._check_derivative_finite_difference(
|
|
182
|
+
self._check_derivative_finite_difference(
|
|
183
|
+
x, v, check_rtol=check_rtol, check_atol=check_atol
|
|
184
|
+
)
|
|
147
185
|
|
|
148
186
|
# New algebraic checks
|
|
149
|
-
self._check_scalar_mul_derivative(
|
|
187
|
+
self._check_scalar_mul_derivative(
|
|
188
|
+
self, x, v, a, check_rtol=check_rtol, check_atol=check_atol
|
|
189
|
+
)
|
|
150
190
|
if op2:
|
|
151
|
-
self._check_add_derivative(
|
|
152
|
-
|
|
191
|
+
self._check_add_derivative(
|
|
192
|
+
self, op2, x, v, check_rtol=check_rtol, check_atol=check_atol
|
|
193
|
+
)
|
|
194
|
+
self._check_matmul_derivative(
|
|
195
|
+
self, op2, x, v, check_rtol=check_rtol, check_atol=check_atol
|
|
196
|
+
)
|
|
153
197
|
|
|
154
198
|
print(f"✅ All {n_checks} non-linear operator checks passed successfully.")
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
pygeoinf/__init__.py,sha256=vAoI6Kw2EL5koHn0EP0kbLvhtWV9gxA439PowiqkQHU,3246
|
|
2
|
+
pygeoinf/auxiliary.py,sha256=lfoTt9ZH4y8SAV8dKZi5EWx1oF_JtxtBMSmlFYqJYfE,1610
|
|
2
3
|
pygeoinf/backus_gilbert.py,sha256=eFi4blSwOCsg_NuH6WD4gcgjvzvu5g5WpWahGobSBdM,3694
|
|
3
4
|
pygeoinf/checks/hilbert_space.py,sha256=07AZ6fx44PgSPjo_bjRJlVWTta1k1hhIX0TTTwMRdm8,8665
|
|
4
|
-
pygeoinf/checks/linear_operators.py,sha256=
|
|
5
|
-
pygeoinf/checks/nonlinear_operators.py,sha256=
|
|
5
|
+
pygeoinf/checks/linear_operators.py,sha256=LjC7X3RRimsyoLu062RNdhj1KEau3CBhBTZ4m3ZRmjI,7042
|
|
6
|
+
pygeoinf/checks/nonlinear_operators.py,sha256=CoINs_Pm0lzo8nR3H70bo8Osvauiy03CA-b99MnCPjw,7532
|
|
6
7
|
pygeoinf/direct_sum.py,sha256=7V0qrwFGj0GN-p_zzffefPrIB0dPu5dshLTxem1mQGE,19274
|
|
7
8
|
pygeoinf/forward_problem.py,sha256=NnqWp7iMfkhHa9d-jBHzYHClaAfhKmO5D058AcJLLYg,10724
|
|
8
9
|
pygeoinf/gaussian_measure.py,sha256=bBh64xHgmLFl27krn9hkf8qDQjop_39x69cyhJgUHN8,26219
|
|
@@ -23,7 +24,7 @@ pygeoinf/symmetric_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
23
24
|
pygeoinf/symmetric_space/circle.py,sha256=GuwVmLdHGTMxMrZfyXIPP3pz_y971ntlD5pl42lKJZ0,18796
|
|
24
25
|
pygeoinf/symmetric_space/sphere.py,sha256=SYeGa70fKzasXxwPoVk3tNBtlP0QwLQe5jwW7o3AmcU,23376
|
|
25
26
|
pygeoinf/symmetric_space/symmetric_space.py,sha256=pEIZZYWsdegrYCwUs3bo86JTz3d2LsXFWdRYFa0syFs,17963
|
|
26
|
-
pygeoinf-1.3.
|
|
27
|
-
pygeoinf-1.3.
|
|
28
|
-
pygeoinf-1.3.
|
|
29
|
-
pygeoinf-1.3.
|
|
27
|
+
pygeoinf-1.3.2.dist-info/METADATA,sha256=VCh-zC2vcghWe8Ja34MCFu7xj7qZgsZmpBPqCXQhwOU,16365
|
|
28
|
+
pygeoinf-1.3.2.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
29
|
+
pygeoinf-1.3.2.dist-info/licenses/LICENSE,sha256=GrTQnKJemVi69FSbHprq60KN0OJGsOSR-joQoTq-oD8,1501
|
|
30
|
+
pygeoinf-1.3.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|