feectools 0.6.0__tar.gz → 0.7.0__tar.gz
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.
- {feectools-0.6.0/feectools.egg-info → feectools-0.7.0}/PKG-INFO +1 -1
- {feectools-0.6.0 → feectools-0.7.0}/feectools/accelerate/compile_psydac.mk +1 -1
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/fem_bilinear_form.py +2 -2
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/fem_common.py +1 -1
- {feectools-0.6.0 → feectools-0.7.0}/feectools/feec/derivatives.py +15 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/basic.py +26 -18
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kron.py +682 -82
- feectools-0.7.0/feectools/linalg/tests/test_kron_stencil_matrix.py +526 -0
- {feectools-0.6.0 → feectools-0.7.0/feectools.egg-info}/PKG-INFO +1 -1
- {feectools-0.6.0 → feectools-0.7.0}/pyproject.toml +1 -1
- feectools-0.6.0/feectools/linalg/tests/test_kron_stencil_matrix.py +0 -115
- {feectools-0.6.0 → feectools-0.7.0}/AUTHORS +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/LICENSE +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/README.md +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/accelerate/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/accelerate/accelerate.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/essential_bc.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/fem_sum_form.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/api/settings.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/bsplines.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/bsplines_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/field_evaluation_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/tests/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/tests/test_bsplines.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/tests/test_bsplines_kernel.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/core/tests/test_bsplines_pyccel.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/basic.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/blocking_data_exchanger.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/cart.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/interface_data_exchanger.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/nonblocking_data_exchanger.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/partition.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/petsc.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_cart_1d.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_cart_2d.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_cart_3d.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_coarsen.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_device_binding.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_multicart_2d.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/tests/test_partition.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/ddm/utilities.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/feec/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/feec/dof_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/feec/global_geometric_projectors.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/feec/hodge.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/basic.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/grid.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/lst_preconditioner.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/partitioning.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/projectors.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/splines.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tensor.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/analytical_profiles_1d.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/analytical_profiles_base.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/splines_error_bounds.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_dirichlet_projectors.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_spline_histopolation.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_spline_interpolation.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_splines.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_splines_par.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_tensor.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/test_vector_spaces.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/tests/utilities.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/fem/vector.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/block.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/direct_solvers.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/fft.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/matvec_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil2IJV_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil2coo_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_1d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_1d/stencil_axpy_1d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_1d/stencil_axpy_1d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_2d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_2d/stencil_axpy_2d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_2d/stencil_axpy_2d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_3d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_3d/stencil_axpy_3d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_axpy_3d/stencil_axpy_3d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_1d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_1d/stencil_dot_1d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_1d/stencil_dot_1d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_2d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_2d/stencil_dot_2d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_2d/stencil_dot_2d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_3d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_3d/stencil_dot_3d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_dot_3d/stencil_dot_3d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_1d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_1d/stencil_inner_1d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_1d/stencil_inner_1d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_2d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_2d/stencil_inner_2d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_2d/stencil_inner_2d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_3d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_3d/stencil_inner_3d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_inner_3d/stencil_inner_3d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_1d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_1d/stencil_transpose_1d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_1d/stencil_transpose_1d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_2d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_2d/stencil_transpose_2d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_2d/stencil_transpose_2d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_3d/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_3d/stencil_transpose_3d_cuda.cu +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/stencil_transpose_3d/stencil_transpose_3d_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/kernels/transpose_kernels.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/memory.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/solvers.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/sparse.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/stencil.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/cuda_parity_cases.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/inner_on_device_child.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/kernel_test_args.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_axpy_ghost_sync.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_block.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_cuda_emulation.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_cuda_parity.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_device_matvec.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_fft.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_inner_on_device.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_kron_device_solve.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_linalg.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_matrix_free.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_mpi_device.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_solvers.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_stencil_interface_matrix.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_stencil_vector.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_stencil_vector_space.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/test_toarray.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/tests/utilities.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/topetsc.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/linalg/utilities.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/utilities/__init__.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/utilities/quadratures.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/utilities/utils.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools/version.py +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools.egg-info/SOURCES.txt +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools.egg-info/dependency_links.txt +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools.egg-info/entry_points.txt +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools.egg-info/requires.txt +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/feectools.egg-info/top_level.txt +0 -0
- {feectools-0.6.0 → feectools-0.7.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: feectools
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Slimmed-down fork of Psydac (https://github.com/pyccel/psydac) with less functionality and fewer dependencies.
|
|
5
5
|
Author-email: Psydac development team <psydac@googlegroups.com>
|
|
6
6
|
Maintainer-email: Stefan Possanner <stefan.possanner@ipp.mpg.de>, Max Lindqvist <max.lindqvist@ipp.mpg.de>, Yaman Güçlü <yaman.guclu@gmail.com>, Martin Campos Pinto <martin.campos-pinto@ipp.mpg.de>, Ahmed Ratnani <ratnaniahmed@gmail.com>
|
|
@@ -594,9 +594,9 @@ class DiscreteBilinearForm:
|
|
|
594
594
|
if is_conformal:
|
|
595
595
|
matrix[k1, k2] = global_mats[k1, k2]
|
|
596
596
|
elif use_restriction:
|
|
597
|
-
matrix.
|
|
597
|
+
matrix.multiplicands[-1][k1, k2] = global_mats[k1, k2]
|
|
598
598
|
elif use_prolongation:
|
|
599
|
-
matrix.
|
|
599
|
+
matrix.multiplicands[0][k1, k2] = global_mats[k1, k2]
|
|
600
600
|
|
|
601
601
|
else: # case of scalar equation
|
|
602
602
|
if is_broken: # multi-patch
|
|
@@ -277,7 +277,7 @@ def extract_stencil_mats(mats):
|
|
|
277
277
|
if isinstance(M, (StencilInterfaceMatrix, StencilMatrix)):
|
|
278
278
|
new_mats.append(M)
|
|
279
279
|
elif isinstance(M, ComposedLinearOperator):
|
|
280
|
-
new_mats += [i for i in M.
|
|
280
|
+
new_mats += [i for i in M.multiplicands if isinstance(i, (StencilInterfaceMatrix, StencilMatrix))]
|
|
281
281
|
return new_mats
|
|
282
282
|
|
|
283
283
|
#==============================================================================
|
|
@@ -136,6 +136,21 @@ class DirectionalDerivativeOperator(LinearOperator):
|
|
|
136
136
|
def dtype( self ):
|
|
137
137
|
return self.domain.dtype
|
|
138
138
|
|
|
139
|
+
@property
|
|
140
|
+
def diffdir(self) -> int:
|
|
141
|
+
"""Direction (axis) of the derivative."""
|
|
142
|
+
return self._diffdir
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def negative(self) -> bool:
|
|
146
|
+
"""Whether the operator is the negative derivative."""
|
|
147
|
+
return self._negative
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def transposed(self) -> bool:
|
|
151
|
+
"""Whether the operator is the transposed derivative."""
|
|
152
|
+
return self._transposed
|
|
153
|
+
|
|
139
154
|
def __truediv__(self, a):
|
|
140
155
|
""" Divide by scalar. """
|
|
141
156
|
return self * (1.0 / a)
|
|
@@ -8,6 +8,7 @@ provides the fundamental classes for linear algebra operations.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import itertools
|
|
11
|
+
import warnings
|
|
11
12
|
from abc import ABC, abstractmethod
|
|
12
13
|
from types import LambdaType
|
|
13
14
|
from inspect import signature
|
|
@@ -1057,27 +1058,27 @@ class ComposedLinearOperator(LinearOperator):
|
|
|
1057
1058
|
for i in range(len(args)-1):
|
|
1058
1059
|
assert args[i].domain == args[i+1].codomain
|
|
1059
1060
|
|
|
1060
|
-
|
|
1061
|
+
multiplicands = ()
|
|
1061
1062
|
tmp_vectors = []
|
|
1062
1063
|
for a in args[:-1]:
|
|
1063
1064
|
if isinstance(a, ComposedLinearOperator):
|
|
1064
|
-
|
|
1065
|
+
multiplicands = (*multiplicands, *a.multiplicands)
|
|
1065
1066
|
tmp_vectors.extend(a.tmp_vectors)
|
|
1066
1067
|
tmp_vectors.append(a.domain.zeros())
|
|
1067
1068
|
else:
|
|
1068
|
-
|
|
1069
|
+
multiplicands = (*multiplicands, a)
|
|
1069
1070
|
tmp_vectors.append(a.domain.zeros())
|
|
1070
1071
|
|
|
1071
1072
|
last = args[-1]
|
|
1072
1073
|
if isinstance(last, ComposedLinearOperator):
|
|
1073
|
-
|
|
1074
|
+
multiplicands = (*multiplicands, *last.multiplicands)
|
|
1074
1075
|
tmp_vectors.extend(last.tmp_vectors)
|
|
1075
1076
|
else:
|
|
1076
|
-
|
|
1077
|
+
multiplicands = (*multiplicands, last)
|
|
1077
1078
|
|
|
1078
1079
|
self._domain = domain
|
|
1079
1080
|
self._codomain = codomain
|
|
1080
|
-
self.
|
|
1081
|
+
self._multiplicands = multiplicands
|
|
1081
1082
|
self._tmp_vectors = tuple(tmp_vectors)
|
|
1082
1083
|
|
|
1083
1084
|
@property
|
|
@@ -1098,34 +1099,41 @@ class ComposedLinearOperator(LinearOperator):
|
|
|
1098
1099
|
return self._codomain
|
|
1099
1100
|
|
|
1100
1101
|
@property
|
|
1101
|
-
def
|
|
1102
|
+
def multiplicands(self):
|
|
1102
1103
|
r"""
|
|
1103
|
-
A tuple $(A_1,\dots,A_n)$ containing the
|
|
1104
|
+
A tuple $(A_1,\dots,A_n)$ containing the multiplicands of the linear operator
|
|
1104
1105
|
$self = A_n\circ\dots\circ A_1$.
|
|
1105
1106
|
|
|
1106
1107
|
"""
|
|
1107
|
-
return self.
|
|
1108
|
+
return self._multiplicands
|
|
1109
|
+
|
|
1110
|
+
@property
|
|
1111
|
+
def multiplicants(self):
|
|
1112
|
+
"""Deprecated alias of ``multiplicands``."""
|
|
1113
|
+
warnings.warn("ComposedLinearOperator.multiplicants is deprecated, use multiplicands instead.",
|
|
1114
|
+
DeprecationWarning, stacklevel=2)
|
|
1115
|
+
return self._multiplicands
|
|
1108
1116
|
|
|
1109
1117
|
@property
|
|
1110
1118
|
def dtype(self):
|
|
1111
1119
|
return None
|
|
1112
1120
|
|
|
1113
1121
|
def tosparse(self):
|
|
1114
|
-
mats = [M.tosparse() for M in self.
|
|
1122
|
+
mats = [M.tosparse() for M in self._multiplicands]
|
|
1115
1123
|
M = mats[0]
|
|
1116
1124
|
for Mi in mats[1:]:
|
|
1117
1125
|
M = M @ Mi
|
|
1118
1126
|
return coo_matrix(M)
|
|
1119
1127
|
|
|
1120
1128
|
def transpose(self, conjugate=False):
|
|
1121
|
-
|
|
1122
|
-
for a in self.
|
|
1123
|
-
|
|
1129
|
+
t_multiplicands = ()
|
|
1130
|
+
for a in self._multiplicands:
|
|
1131
|
+
t_multiplicands = (a.transpose(conjugate=conjugate), *t_multiplicands)
|
|
1124
1132
|
new_dom = self.codomain
|
|
1125
1133
|
new_cod = self.domain
|
|
1126
1134
|
assert isinstance(new_dom, VectorSpace)
|
|
1127
1135
|
assert isinstance(new_cod, VectorSpace)
|
|
1128
|
-
return ComposedLinearOperator(self.codomain, self.domain, *
|
|
1136
|
+
return ComposedLinearOperator(self.codomain, self.domain, *t_multiplicands)
|
|
1129
1137
|
|
|
1130
1138
|
def dot(self, v, out=None):
|
|
1131
1139
|
assert isinstance(v, Vector)
|
|
@@ -1137,11 +1145,11 @@ class ComposedLinearOperator(LinearOperator):
|
|
|
1137
1145
|
x = v
|
|
1138
1146
|
for i in range(len(self._tmp_vectors)):
|
|
1139
1147
|
y = self._tmp_vectors[-1-i]
|
|
1140
|
-
A = self.
|
|
1148
|
+
A = self._multiplicands[-1-i]
|
|
1141
1149
|
A.dot(x, out=y)
|
|
1142
1150
|
x = y
|
|
1143
1151
|
|
|
1144
|
-
A = self.
|
|
1152
|
+
A = self._multiplicands[0]
|
|
1145
1153
|
if out is not None:
|
|
1146
1154
|
|
|
1147
1155
|
A.dot(x, out=out)
|
|
@@ -1150,11 +1158,11 @@ class ComposedLinearOperator(LinearOperator):
|
|
|
1150
1158
|
return out
|
|
1151
1159
|
|
|
1152
1160
|
def exchange_assembly_data(self):
|
|
1153
|
-
for op in self.
|
|
1161
|
+
for op in self._multiplicands:
|
|
1154
1162
|
op.exchange_assembly_data()
|
|
1155
1163
|
|
|
1156
1164
|
def set_backend(self, backend, precompiled=False):
|
|
1157
|
-
for op in self.
|
|
1165
|
+
for op in self._multiplicands:
|
|
1158
1166
|
op.set_backend(backend)
|
|
1159
1167
|
|
|
1160
1168
|
#===============================================================================
|