Skip to content

Commit

Permalink
[operators.block] add a check for parametric COO matrices
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim Keil committed Dec 5, 2022
1 parent 7d6320a commit 8397c4d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
4 changes: 4 additions & 0 deletions src/pymor/parameters/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from numbers import Number

import numpy as np
import sparse

from pymor.core.base import ImmutableObject
from pymor.tools.floatcmp import float_cmp_all
Expand Down Expand Up @@ -77,6 +78,9 @@ def traverse(obj):
elif isinstance(obj, np.ndarray) and obj.dtype == object:
for o in obj.flat:
traverse(o)
elif isinstance(obj, sparse.COO) and obj.dtype == object:
for o in obj.data:
traverse(o)

for arg in args:
traverse(arg)
Expand Down
23 changes: 13 additions & 10 deletions src/pymortests/operators/block.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,19 +123,22 @@ def test_sparse():
for I in range(3):
op[I, I] = NumpyMatrixOperator(np.eye(20))
op[3, 3] = NumpyMatrixOperator(np.eye(10))
op[0, 2] = NumpyMatrixOperator(4 * np.eye(20))
from pymor.parameters.functionals import ProjectionParameterFunctional
op[0, 2] = ProjectionParameterFunctional('mu', 1, 0) * NumpyMatrixOperator(4 * np.eye(20))
block_op = BlockOperator(op, make_sparse=True)
assert block_op.parametric
mu = block_op.parameters.parse([1])
ones = block_op.range.ones()
block_op.apply(ones)
block_op.apply_adjoint(ones)
block_op.assemble()
block_op.apply(ones, mu=mu)
block_op.apply_adjoint(ones, mu=mu)
block_op.assemble(mu=mu)
block_op.d_mu('something')
dense_block_op = block_op.to_dense()
dense_block_op.assemble()
a = dense_block_op.as_source_array().to_numpy()
b = block_op.as_source_array().to_numpy()
dense_block_op.assemble(mu=mu)
a = dense_block_op.as_source_array(mu=mu).to_numpy()
b = block_op.as_source_array(mu=mu).to_numpy()
assert np.allclose(a, b)
a = dense_block_op.as_range_array().to_numpy()
b = block_op.as_range_array().to_numpy()
a = dense_block_op.as_range_array(mu=mu).to_numpy()
b = block_op.as_range_array(mu=mu).to_numpy()
assert np.allclose(a, b)
assert block_op.apply2(ones, ones) == dense_block_op.apply2(ones, ones)
assert block_op.apply2(ones, ones, mu=mu) == dense_block_op.apply2(ones, ones, mu=mu)

0 comments on commit 8397c4d

Please sign in to comment.