Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
NIFTy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
10
Issues
10
List
Boards
Labels
Service Desk
Milestones
Merge Requests
8
Merge Requests
8
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ift
NIFTy
Commits
85b3b288
Commit
85b3b288
authored
Aug 02, 2018
by
Martin Reinecke
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Operators can no longer be chained by '*'; you need to use '.chain()' or '@' (in Python3)
parent
b44405a4
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
79 additions
and
74 deletions
+79
-74
demos/Wiener_Filter.ipynb
demos/Wiener_Filter.ipynb
+2
-2
demos/getting_started_1.py
demos/getting_started_1.py
+4
-3
demos/getting_started_2.py
demos/getting_started_2.py
+1
-1
nifty5/energies/energy_adapter.py
nifty5/energies/energy_adapter.py
+1
-1
nifty5/library/amplitude_model.py
nifty5/library/amplitude_model.py
+1
-1
nifty5/linearization.py
nifty5/linearization.py
+16
-14
nifty5/multi/block_diagonal_operator.py
nifty5/multi/block_diagonal_operator.py
+1
-1
nifty5/operators/harmonic_smoothing_operator.py
nifty5/operators/harmonic_smoothing_operator.py
+1
-1
nifty5/operators/linear_operator.py
nifty5/operators/linear_operator.py
+33
-5
nifty5/operators/sandwich_operator.py
nifty5/operators/sandwich_operator.py
+2
-2
nifty5/operators/smoothness_operator.py
nifty5/operators/smoothness_operator.py
+1
-1
test/test_field.py
test/test_field.py
+2
-2
test/test_models/test_model_gradients.py
test/test_models/test_model_gradients.py
+7
-34
test/test_multi_field.py
test/test_multi_field.py
+1
-1
test/test_operators/test_adjoint.py
test/test_operators/test_adjoint.py
+1
-1
test/test_operators/test_composed_operator.py
test/test_operators/test_composed_operator.py
+5
-4
No files found.
demos/Wiener_Filter.ipynb
View file @
85b3b288
...
...
@@ -429,7 +429,7 @@
"mask[l:h] = 0\n",
"mask = ift.Field.from_global_data(s_space, mask)\n",
"\n",
"R = ift.DiagonalOperator(mask)
*HT
\n",
"R = ift.DiagonalOperator(mask)
.chain(HT)
\n",
"n = n.to_global_data().copy()\n",
"n[l:h] = 0\n",
"n = ift.Field.from_global_data(s_space, n)\n",
...
...
@@ -585,7 +585,7 @@
"mask[l:h,l:h] = 0.\n",
"mask = ift.Field.from_global_data(s_space, mask)\n",
"\n",
"R = ift.DiagonalOperator(mask)
*HT
\n",
"R = ift.DiagonalOperator(mask)
.chain(HT)
\n",
"n = n.to_global_data().copy()\n",
"n[l:h, l:h] = 0\n",
"n = ift.Field.from_global_data(s_space, n)\n",
...
...
demos/getting_started_1.py
View file @
85b3b288
...
...
@@ -78,7 +78,7 @@ if __name__ == '__main__':
GR
=
ift
.
GeometryRemover
(
position_space
)
mask
=
ift
.
Field
.
from_global_data
(
position_space
,
mask
)
Mask
=
ift
.
DiagonalOperator
(
mask
)
R
=
GR
*
Mask
*
HT
R
=
GR
.
chain
(
Mask
).
chain
(
HT
)
data_space
=
GR
.
target
...
...
@@ -93,7 +93,7 @@ if __name__ == '__main__':
# Build propagator D and information source j
j
=
R
.
adjoint_times
(
N
.
inverse_times
(
data
))
D_inv
=
R
.
adjoint
*
N
.
inverse
*
R
+
S
.
inverse
D_inv
=
R
.
adjoint
.
chain
(
N
.
inverse
).
chain
(
R
)
+
S
.
inverse
# Make it invertible
IC
=
ift
.
GradientNormController
(
iteration_limit
=
500
,
tol_abs_gradnorm
=
1e-3
)
D
=
ift
.
InversionEnabler
(
D_inv
,
IC
,
approximation
=
S
.
inverse
).
inverse
...
...
@@ -112,7 +112,8 @@ if __name__ == '__main__':
title
=
"getting_started_1"
)
else
:
ift
.
plot
(
HT
(
MOCK_SIGNAL
),
title
=
'Mock Signal'
)
ift
.
plot
(
mask_to_nan
(
mask
,
(
GR
*
Mask
).
adjoint
(
data
)),
title
=
'Data'
)
ift
.
plot
(
mask_to_nan
(
mask
,
(
GR
.
chain
(
Mask
)).
adjoint
(
data
)),
title
=
'Data'
)
ift
.
plot
(
HT
(
m
),
title
=
'Reconstruction'
)
ift
.
plot
(
mask_to_nan
(
mask
,
HT
(
m
-
MOCK_SIGNAL
)))
ift
.
plot_finish
(
nx
=
2
,
ny
=
2
,
xsize
=
10
,
ysize
=
10
,
...
...
demos/getting_started_2.py
View file @
85b3b288
...
...
@@ -75,7 +75,7 @@ if __name__ == '__main__':
M
=
ift
.
DiagonalOperator
(
exposure
)
GR
=
ift
.
GeometryRemover
(
position_space
)
# Set up instrumental response
R
=
GR
*
M
R
=
GR
.
chain
(
M
)
# Generate mock data
d_space
=
R
.
target
[
0
]
...
...
nifty5/energies/energy_adapter.py
View file @
85b3b288
...
...
@@ -23,7 +23,7 @@ class EnergyAdapter(Energy):
@
property
def
value
(
self
):
if
self
.
_val
is
None
:
self
.
_val
=
self
.
_op
(
self
.
_position
)
self
.
_val
=
self
.
_op
(
self
.
_position
)
return
self
.
_val
@
property
...
...
nifty5/library/amplitude_model.py
View file @
85b3b288
...
...
@@ -130,7 +130,7 @@ class AmplitudeModel(Operator):
cepstrum
=
create_cepstrum_amplitude_field
(
dof_space
,
kern
)
ceps
=
makeOp
(
sqrt
(
cepstrum
))
self
.
_smooth_op
=
sym
*
qht
*
ceps
self
.
_smooth_op
=
sym
.
chain
(
qht
).
chain
(
ceps
)
self
.
_keys
=
tuple
(
keys
)
@
property
...
...
nifty5/linearization.py
View file @
85b3b288
...
...
@@ -47,8 +47,8 @@ class Linearization(object):
def
__neg__
(
self
):
return
Linearization
(
-
self
.
_val
,
self
.
_jac
*
(
-
1
),
None
if
self
.
_metric
is
None
else
self
.
_metric
*
(
-
1
))
-
self
.
_val
,
self
.
_jac
.
chain
(
-
1
),
None
if
self
.
_metric
is
None
else
self
.
_metric
.
chain
(
-
1
))
def
__add__
(
self
,
other
):
if
isinstance
(
other
,
Linearization
):
...
...
@@ -79,47 +79,49 @@ class Linearization(object):
d2
=
makeOp
(
other
.
_val
)
return
Linearization
(
self
.
_val
*
other
.
_val
,
RelaxedSumOperator
((
d2
*
self
.
_jac
,
d1
*
other
.
_jac
)))
RelaxedSumOperator
((
d2
.
chain
(
self
.
_jac
),
d1
.
chain
(
other
.
_jac
))))
if
isinstance
(
other
,
(
int
,
float
,
complex
)):
# if other == 0:
# return ...
met
=
None
if
self
.
_metric
is
None
else
self
.
_metric
*
other
return
Linearization
(
self
.
_val
*
other
,
self
.
_jac
*
other
,
met
)
met
=
None
if
self
.
_metric
is
None
else
self
.
_metric
.
chain
(
other
)
return
Linearization
(
self
.
_val
*
other
,
self
.
_jac
.
chain
(
other
)
,
met
)
if
isinstance
(
other
,
(
Field
,
MultiField
)):
d2
=
makeOp
(
other
)
return
Linearization
(
self
.
_val
*
other
,
d2
*
self
.
_jac
)
return
Linearization
(
self
.
_val
*
other
,
d2
.
chain
(
self
.
_jac
)
)
raise
TypeError
def
__rmul__
(
self
,
other
):
from
.sugar
import
makeOp
if
isinstance
(
other
,
(
int
,
float
,
complex
)):
return
Linearization
(
self
.
_val
*
other
,
self
.
_jac
*
other
)
return
Linearization
(
self
.
_val
*
other
,
self
.
_jac
.
chain
(
other
)
)
if
isinstance
(
other
,
(
Field
,
MultiField
)):
d1
=
makeOp
(
other
)
return
Linearization
(
self
.
_val
*
other
,
d1
*
self
.
_jac
)
return
Linearization
(
self
.
_val
*
other
,
d1
.
chain
(
self
.
_jac
)
)
def
sum
(
self
):
from
.sugar
import
full
from
.operators.vdot_operator
import
VdotOperator
return
Linearization
(
full
((),
self
.
_val
.
sum
()),
VdotOperator
(
full
(
self
.
_jac
.
target
,
1
))
*
self
.
_jac
)
return
Linearization
(
full
((),
self
.
_val
.
sum
()),
VdotOperator
(
full
(
self
.
_jac
.
target
,
1
)).
chain
(
self
.
_jac
))
def
exp
(
self
):
tmp
=
self
.
_val
.
exp
()
return
Linearization
(
tmp
,
makeOp
(
tmp
)
*
self
.
_jac
)
return
Linearization
(
tmp
,
makeOp
(
tmp
)
.
chain
(
self
.
_jac
)
)
def
log
(
self
):
tmp
=
self
.
_val
.
log
()
return
Linearization
(
tmp
,
makeOp
(
1.
/
self
.
_val
)
*
self
.
_jac
)
return
Linearization
(
tmp
,
makeOp
(
1.
/
self
.
_val
)
.
chain
(
self
.
_jac
)
)
def
tanh
(
self
):
tmp
=
self
.
_val
.
tanh
()
return
Linearization
(
tmp
,
makeOp
(
1.
-
tmp
**
2
)
*
self
.
_jac
)
return
Linearization
(
tmp
,
makeOp
(
1.
-
tmp
**
2
)
.
chain
(
self
.
_jac
)
)
def
positive_tanh
(
self
):
tmp
=
self
.
_val
.
tanh
()
tmp2
=
0.5
*
(
1.
+
tmp
)
return
Linearization
(
tmp2
,
makeOp
(
0.5
*
(
1.
-
tmp
**
2
))
*
self
.
_jac
)
return
Linearization
(
tmp2
,
makeOp
(
0.5
*
(
1.
-
tmp
**
2
))
.
chain
(
self
.
_jac
)
)
def
add_metric
(
self
,
metric
):
return
Linearization
(
self
.
_val
,
self
.
_jac
,
metric
)
...
...
nifty5/multi/block_diagonal_operator.py
View file @
85b3b288
...
...
@@ -68,7 +68,7 @@ class BlockDiagonalOperator(EndomorphicOperator):
def
_combine_chain
(
self
,
op
):
if
self
.
_domain
is
not
op
.
_domain
:
raise
ValueError
(
"domain mismatch"
)
res
=
tuple
(
v1
*
v2
for
v1
,
v2
in
zip
(
self
.
_ops
,
op
.
_ops
))
res
=
tuple
(
v1
.
chain
(
v2
)
for
v1
,
v2
in
zip
(
self
.
_ops
,
op
.
_ops
))
return
BlockDiagonalOperator
(
self
.
_domain
,
res
)
def
_combine_sum
(
self
,
op
,
selfneg
,
opneg
):
...
...
nifty5/operators/harmonic_smoothing_operator.py
View file @
85b3b288
...
...
@@ -67,4 +67,4 @@ def HarmonicSmoothingOperator(domain, sigma, space=None):
ddom
=
list
(
domain
)
ddom
[
space
]
=
codomain
diag
=
DiagonalOperator
(
kernel
,
ddom
,
space
)
return
Hartley
.
inverse
*
diag
*
Hartley
return
Hartley
.
inverse
.
chain
(
diag
).
chain
(
Hartley
)
nifty5/operators/linear_operator.py
View file @
85b3b288
...
...
@@ -117,18 +117,46 @@ class LinearOperator(Operator):
def
__mul__
(
self
,
other
):
from
.chain_operator
import
ChainOperator
if
np
.
isscalar
(
other
)
and
other
==
1.
:
if
not
np
.
isscalar
(
other
):
return
Operator
.
__mul__
(
self
,
other
)
if
other
==
1.
:
return
self
other
=
self
.
_toOperator
(
other
,
self
.
domain
)
from
.scaling_operator
import
ScalingOperator
other
=
ScalingOperator
(
other
,
self
.
domain
)
return
ChainOperator
.
make
([
self
,
other
])
def
__rmul__
(
self
,
other
):
from
.chain_operator
import
ChainOperator
if
np
.
isscalar
(
other
)
and
other
==
1.
:
if
not
np
.
isscalar
(
other
):
return
Operator
.
__rmul__
(
self
,
other
)
if
other
==
1.
:
return
self
other
=
self
.
_toOperator
(
other
,
self
.
target
)
from
.scaling_operator
import
ScalingOperator
other
=
ScalingOperator
(
other
,
self
.
target
)
return
ChainOperator
.
make
([
other
,
self
])
def
__matmul__
(
self
,
other
):
if
np
.
isscalar
(
other
)
and
other
==
1.
:
return
self
other2
=
self
.
_toOperator
(
other
,
self
.
domain
)
if
other2
==
NotImplemented
:
return
Operator
.
__matmul__
(
self
,
other
)
from
.chain_operator
import
ChainOperator
return
ChainOperator
.
make
([
self
,
other2
])
def
chain
(
self
,
other
):
return
self
.
__matmul__
(
other
)
def
__rmatmul__
(
self
,
other
):
if
np
.
isscalar
(
other
)
and
other
==
1.
:
return
self
other2
=
self
.
_toOperator
(
other
,
self
.
target
)
if
other2
==
NotImplemented
:
from
.chain_operator
import
ChainOperator
return
Operator
.
__rmatmul__
(
self
,
other
)
from
.chain_operator
import
ChainOperator
return
ChainOperator
.
make
([
other2
,
self
])
def
__add__
(
self
,
other
):
from
.sum_operator
import
SumOperator
if
np
.
isscalar
(
other
)
and
other
==
0.
:
...
...
@@ -190,7 +218,7 @@ class LinearOperator(Operator):
"""Same as :meth:`times`"""
from
..linearization
import
Linearization
if
isinstance
(
x
,
Linearization
):
return
Linearization
(
self
(
x
.
_val
),
self
*
x
.
_jac
)
return
Linearization
(
self
(
x
.
_val
),
self
.
chain
(
x
.
_jac
)
)
return
self
.
apply
(
x
,
self
.
TIMES
)
def
times
(
self
,
x
):
...
...
nifty5/operators/sandwich_operator.py
View file @
85b3b288
...
...
@@ -56,9 +56,9 @@ class SandwichOperator(EndomorphicOperator):
raise
TypeError
(
"cheese must be a linear operator"
)
if
cheese
is
None
:
cheese
=
ScalingOperator
(
1.
,
bun
.
target
)
op
=
bun
.
adjoint
*
bun
op
=
bun
.
adjoint
.
chain
(
bun
)
else
:
op
=
bun
.
adjoint
*
cheese
*
bun
op
=
bun
.
adjoint
.
chain
(
cheese
).
chain
(
bun
)
# if our sandwich is diagonal, we can return immediately
if
isinstance
(
op
,
(
ScalingOperator
,
DiagonalOperator
)):
...
...
nifty5/operators/smoothness_operator.py
View file @
85b3b288
...
...
@@ -54,4 +54,4 @@ def SmoothnessOperator(domain, strength=1., logarithmic=True, space=None):
if
strength
==
0.
:
return
ScalingOperator
(
0.
,
domain
)
laplace
=
LaplaceOperator
(
domain
,
logarithmic
=
logarithmic
,
space
=
space
)
return
(
strength
**
2
)
*
laplace
.
adjoint
*
laplace
return
(
strength
**
2
)
*
laplace
.
adjoint
.
chain
(
laplace
)
test/test_field.py
View file @
85b3b288
...
...
@@ -66,7 +66,7 @@ class Test_Functionality(unittest.TestCase):
op1
=
ift
.
create_power_operator
((
space1
,
space2
),
_spec1
,
0
)
op2
=
ift
.
create_power_operator
((
space1
,
space2
),
_spec2
,
1
)
opfull
=
op2
*
op1
opfull
=
op2
.
chain
(
op1
)
samples
=
500
sc1
=
ift
.
StatCalculator
()
...
...
@@ -94,7 +94,7 @@ class Test_Functionality(unittest.TestCase):
S_1
=
ift
.
create_power_operator
((
space1
,
space2
),
_spec1
,
0
)
S_2
=
ift
.
create_power_operator
((
space1
,
space2
),
_spec2
,
1
)
S_full
=
S_2
*
S_1
S_full
=
S_2
.
chain
(
S_1
)
samples
=
500
sc1
=
ift
.
StatCalculator
()
...
...
test/test_models/test_model_gradients.py
View file @
85b3b288
...
...
@@ -36,33 +36,6 @@ class Model_Tests(unittest.TestCase):
return
ift
.
Linearization
.
make_var
(
s
)
raise
ValueError
(
'unknown type passed'
)
def
make_model
(
self
,
type
,
**
kwargs
):
if
type
==
'Constant'
:
np
.
random
.
seed
(
kwargs
[
'seed'
])
S
=
ift
.
ScalingOperator
(
1.
,
kwargs
[
'space'
])
s
=
S
.
draw_sample
()
return
ift
.
Constant
(
ift
.
MultiField
.
from_dict
({
kwargs
[
'space_key'
]:
s
}),
ift
.
MultiField
.
from_dict
({
kwargs
[
'space_key'
]:
s
}))
elif
type
==
'Variable'
:
np
.
random
.
seed
(
kwargs
[
'seed'
])
S
=
ift
.
ScalingOperator
(
1.
,
kwargs
[
'space'
])
s
=
S
.
draw_sample
()
return
ift
.
Variable
(
ift
.
MultiField
.
from_dict
({
kwargs
[
'space_key'
]:
s
}))
elif
type
==
'LinearModel'
:
return
ift
.
LinearModel
(
inp
=
kwargs
[
'model'
],
lin_op
=
kwargs
[
'lin_op'
])
else
:
raise
ValueError
(
'unknown type passed'
)
def
make_linear_operator
(
self
,
type
,
**
kwargs
):
if
type
==
'ScalingOperator'
:
lin_op
=
ift
.
ScalingOperator
(
1.
,
kwargs
[
'space'
])
else
:
raise
ValueError
(
'unknown type passed'
)
return
lin_op
@
expand
(
product
(
[
ift
.
GLSpace
(
15
),
ift
.
RGSpace
(
64
,
distances
=
.
789
),
...
...
@@ -71,7 +44,7 @@ class Model_Tests(unittest.TestCase):
))
def
testBasics
(
self
,
space
,
seed
):
var
=
self
.
make_linearization
(
"Variable"
,
space
,
seed
)
model
=
lambda
inp
:
inp
model
=
ift
.
ScalingOperator
(
6.
,
var
.
target
)
ift
.
extra
.
check_value_gradient_consistency
(
model
,
var
.
val
)
@
expand
(
product
(
...
...
@@ -89,17 +62,17 @@ class Model_Tests(unittest.TestCase):
lin2
=
self
.
make_linearization
(
type2
,
dom2
,
seed
)
dom
=
ift
.
MultiDomain
.
union
((
dom1
,
dom2
))
model
=
lambda
inp
:
inp
[
"s1"
]
*
inp
[
"s2"
]
model
=
ift
.
FieldAdapter
(
dom
,
"s1"
)
*
ift
.
FieldAdapter
(
dom
,
"s2"
)
pos
=
ift
.
from_random
(
"normal"
,
dom
)
ift
.
extra
.
check_value_gradient_consistency
(
model
,
pos
)
model
=
lambda
inp
:
inp
[
"s1"
]
+
inp
[
"s2"
]
model
=
ift
.
FieldAdapter
(
dom
,
"s1"
)
+
ift
.
FieldAdapter
(
dom
,
"s2"
)
pos
=
ift
.
from_random
(
"normal"
,
dom
)
ift
.
extra
.
check_value_gradient_consistency
(
model
,
pos
)
model
=
lambda
inp
:
inp
[
"s1"
]
*
3.
pos
=
ift
.
from_random
(
"normal"
,
dom
1
)
model
=
ift
.
FieldAdapter
(
dom
,
"s1"
)
*
3.
pos
=
ift
.
from_random
(
"normal"
,
dom
)
ift
.
extra
.
check_value_gradient_consistency
(
model
,
pos
)
model
=
lambda
inp
:
ift
.
ScalingOperator
(
2.456
,
space
)
(
i
np
[
"s1"
]
*
inp
[
"s2"
]
)
model
=
ift
.
ScalingOperator
(
2.456
,
space
).
chain
(
i
ft
.
FieldAdapter
(
dom
,
"s1"
)
*
ift
.
FieldAdapter
(
dom
,
"s2"
)
)
pos
=
ift
.
from_random
(
"normal"
,
dom
)
ift
.
extra
.
check_value_gradient_consistency
(
model
,
pos
)
model
=
lambda
inp
:
ift
.
ScalingOperator
(
2.456
,
space
)(
...
...
test/test_multi_field.py
View file @
85b3b288
...
...
@@ -40,7 +40,7 @@ class Test_Functionality(unittest.TestCase):
def
test_blockdiagonal
(
self
):
op
=
ift
.
BlockDiagonalOperator
(
dom
,
(
ift
.
ScalingOperator
(
20.
,
dom
[
"d1"
]),))
op2
=
op
*
op
op2
=
op
.
chain
(
op
)
ift
.
extra
.
consistency_check
(
op2
)
assert_equal
(
type
(
op2
),
ift
.
BlockDiagonalOperator
)
f1
=
op2
(
ift
.
full
(
dom
,
1
))
...
...
test/test_operators/test_adjoint.py
View file @
85b3b288
...
...
@@ -53,7 +53,7 @@ class Consistency_Tests(unittest.TestCase):
dtype
=
dtype
))
op
=
ift
.
SandwichOperator
.
make
(
a
,
b
)
ift
.
extra
.
consistency_check
(
op
,
dtype
,
dtype
)
op
=
a
*
b
op
=
a
.
chain
(
b
)
ift
.
extra
.
consistency_check
(
op
,
dtype
,
dtype
)
op
=
a
+
b
ift
.
extra
.
consistency_check
(
op
,
dtype
,
dtype
)
...
...
test/test_operators/test_composed_operator.py
View file @
85b3b288
...
...
@@ -37,7 +37,7 @@ class ComposedOperator_Tests(unittest.TestCase):
op1
=
ift
.
DiagonalOperator
(
diag1
,
cspace
,
spaces
=
(
0
,))
op2
=
ift
.
DiagonalOperator
(
diag2
,
cspace
,
spaces
=
(
1
,))
op
=
op2
*
op1
op
=
op2
.
chain
(
op1
)
rand1
=
ift
.
Field
.
from_random
(
'normal'
,
domain
=
(
space1
,
space2
))
rand2
=
ift
.
Field
.
from_random
(
'normal'
,
domain
=
(
space1
,
space2
))
...
...
@@ -54,7 +54,7 @@ class ComposedOperator_Tests(unittest.TestCase):
op1
=
ift
.
DiagonalOperator
(
diag1
,
cspace
,
spaces
=
(
0
,))
op2
=
ift
.
DiagonalOperator
(
diag2
,
cspace
,
spaces
=
(
1
,))
op
=
op2
*
op1
op
=
op2
.
chain
(
op1
)
rand1
=
ift
.
Field
.
from_random
(
'normal'
,
domain
=
(
space1
,
space2
))
tt1
=
op
.
inverse_times
(
op
.
times
(
rand1
))
...
...
@@ -75,7 +75,8 @@ class ComposedOperator_Tests(unittest.TestCase):
def
test_chain
(
self
,
space
):
op1
=
ift
.
makeOp
(
ift
.
Field
.
full
(
space
,
2.
))
op2
=
3.
full_op
=
op1
*
op2
*
(
op2
*
op1
)
*
op1
*
op1
*
op2
full_op
=
(
op1
.
chain
(
op2
).
chain
(
op2
).
chain
(
op1
).
chain
(
op1
).
chain
(
op1
).
chain
(
op2
))
x
=
ift
.
Field
.
full
(
space
,
1.
)
res
=
full_op
(
x
)
assert_equal
(
isinstance
(
full_op
,
ift
.
DiagonalOperator
),
True
)
...
...
@@ -85,7 +86,7 @@ class ComposedOperator_Tests(unittest.TestCase):
def
test_mix
(
self
,
space
):
op1
=
ift
.
makeOp
(
ift
.
Field
.
full
(
space
,
2.
))
op2
=
3.
full_op
=
op1
*
(
op2
+
op2
)
*
op1
*
op1
-
op1
*
op2
full_op
=
op1
.
chain
(
op2
+
op2
).
chain
(
op1
).
chain
(
op1
)
-
op1
.
chain
(
op2
)
x
=
ift
.
Field
.
full
(
space
,
1.
)
res
=
full_op
(
x
)
assert_equal
(
isinstance
(
full_op
,
ift
.
DiagonalOperator
),
True
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment