mrpro.operators.ConvSynthesisDictionaryOp
- class mrpro.operators.ConvSynthesisDictionaryOp[source]
Bases:
LinearOperatorConvolutional Synthesis Dictionary Operator.
- __init__(kernel: Tensor, pad_mode: Literal['constant', 'reflect', 'replicate', 'circular'] = 'circular') None[source]
Convolutional Synthesis Dictionary Operator class.
For convolutional filters \(d_1, \ldots, d_K\) and input tensor \(s=[s_1,\ldots,s_K]^T\), the operator is defined by
\(Ds:=\sum_{k=1}^K d_k \ast s_k.\)
- Thereby, for each \(k\), the operation is defined as
- \(d_k \ast s_k :=\)
\(\mathrm{conv}(\mathrm{Re}(s_k), \mathrm{Re}(d_k))\) \(- \mathrm{conv}(\mathrm{Im}(s_k), \mathrm{Im}(d_k))\) \(+ \mathrm{i} \cdot \big(\mathrm{conv}(\mathrm{Re}(s_k), \mathrm{Im}(d_k))\) \(+ \mathrm{conv}(\mathrm{Im}(s_k), \mathrm{Re}(d_k))\big)\),
where \(\mathrm{conv}(\cdot, \cdot)\) denotes the convolution operation. Thus, if the filter is real-valued and the input complex-valued, the same filter is applied to real and the imaginary part of the input. Note that \(\mathrm{conv}\) actually performs a cross-correlation matching torch’s convolution implementation.
- Parameters:
kernel (
Tensor) – Convolutional filter of shape (n_filters, *spatial_dims). The filter filter dimension is specified by the number of dimension in the *spatial_dims. Example: for 2D filters, the shape is (n_filters, ky, kx), for 3D filters, (n_filters, kz, ky, kx). Note that, typically, odd spatial dimensions are used for the kernels to avoid spatial pixel-shift artifacts in the result of the composition of the adjoint and the forward operator.pad_mode (
Literal['constant','reflect','replicate','circular'], default:'circular') – the mode to use for padding.
- property H: LinearOperator[source]
Adjoint operator.
Obtains the adjoint of an instance of this operator as an
AdjointLinearOperator, which itself is a anLinearOperatorthat can be applied to tensors.Note:
linear_operator.H.H == linear_operator
- property gram: LinearOperator[source]
Gram operator.
For a LinearOperator \(A\), the self-adjoint Gram operator is defined as \(A^H A\).
Note
This is the inherited default implementation.
- __call__(x: Tensor) tuple[Tensor][source]
Apply the convolutional synthesis dictionary transform.
This functions first appropriately reshapes the input tensor, then appropriately pads it and performs the convolution. Finally, it undoes the reshaping to maintain the original spatial dimensions.
- Parameters:
x (
Tensor) – Input tensor.- Returns:
The result of the convolutional synthesis dictionary applied to the input.
- adjoint(x: Tensor) tuple[Tensor][source]
Apply the adjoint of the convolutional synthesis dictionary transform.
- Parameters:
x (
Tensor) – Input tensor.- Returns:
The transformed input tensor.
- forward(x: Tensor) tuple[Tensor][source]
Apply forward of the convolutional synthesis dictionary.
Note
Prefer calling the instance of the ConvSynthesisDictionaryOp operator as
operator(x)over directly calling this method. See this PyTorch discussion.
- operator_norm(initial_value: Tensor, dim: Sequence[int] | None, max_iterations: int = 20, relative_tolerance: float = 1e-4, absolute_tolerance: float = 1e-5, callback: Callable[[Tensor], None] | None = None) Tensor[source]
Power iteration for computing the operator norm of the operator.
- Parameters:
initial_value (
Tensor) – initial value to start the iteration; must be element of the domain. if the initial value contains a zero-vector for one of the considered problems, the function throws anValueError.The dimensions of the tensors on which the operator operates. The choice of
dimdetermines how the operator norm is inperpreted. For example, for a matrix-vector multiplication with a batched matrix tensor of shape(batch1, batch2, row, column)and a batched input tensor of shape(batch1, batch2, row):If
dim=None, the operator is considered as a block diagonal matrix with batch1*batch2 blocks and the result is a tensor containing a single norm value (shape(1, 1, 1)).If
dim=(-1),batch1*batch2matrices are considered, and for each a separate operator norm is computed.If
dim=(-2,-1),batch1matrices withbatch2blocks are considered, and for each matrix a separate operator norm is computed.
Thus, the choice of
dimdetermines implicitly determines the domain of the operator.max_iterations (
int, default:20) – maximum number of iterationsrelative_tolerance (
float, default:1e-4) – absolute tolerance for the change of the operator-norm at each iteration; if set to zero, the maximal number of iterations is the only stopping criterion used to stop the power iteration.absolute_tolerance (
float, default:1e-5) – absolute tolerance for the change of the operator-norm at each iteration; if set to zero, the maximal number of iterations is the only stopping criterion used to stop the power iteration.callback (
Callable[[Tensor],None] |None, default:None) – user-provided function to be called at each iteration
- Returns:
An estimaton of the operator norm. Shape corresponds to the shape of the input tensor
initial_valuewith the dimensions specified indimreduced to a single value. The pointwise multiplication ofinitial_valuewith the result of the operator norm will always be well-defined.
- __add__(other: LinearOperator | Tensor | complex) LinearOperator[source]
- __add__(other: Operator[Tensor, tuple[Tensor]]) Operator[Tensor, tuple[Tensor]]
Operator addition.
Returns
lambda x: self(x) + other(x)if other is a operator,lambda x: self(x) + otherif other is a tensor
- __matmul__(other: LinearOperator) LinearOperator[source]
- __matmul__(other: Operator[Unpack[Tin2], tuple[Tensor]] | Operator[Unpack[Tin2], tuple[Tensor, ...]]) Operator[Unpack[Tin2], tuple[Tensor]]
Operator composition.
Returns
lambda x: self(other(x))
- __mul__(other: Tensor | complex) LinearOperator[source]
Operator elementwise left multiplication with tensor/scalar.
Returns
lambda x: self(x*other)
- __or__(other: LinearOperator) LinearOperatorMatrix[source]
Horizontal stacking of two LinearOperators.
A|Bis aLinearOperatorMatrixwith two columns, with(A|B)(x1,x2) == A(x1) + B(x2). Seemrpro.operators.LinearOperatorMatrixfor more information.
- __radd__(other: Tensor | complex) LinearOperator[source]
Operator addition.
Returns
lambda x: self(x) + other*x
- __rmul__(other: Tensor | complex) LinearOperator[source]
Operator elementwise right multiplication with tensor/scalar.
Returns
lambda x: other*self(x)