Solver

Module holding the classes for different numerical Optimizer.

class pyqmri.solver.CGSolver(par, NScan=1, trafo=1, SMS=0)

Conjugate Gradient Optimization Algorithm.

This Class performs a CG reconstruction on single precission complex input data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • NScan (int) – Number of Scan which should be used internally. Do not need to be the same number as in par[“NScan”]
  • trafo (bool) – Switch between radial (1) and Cartesian (0) fft.
  • SMS (bool) – Simultaneouos Multi Slice. Switch between noraml (0) and slice accelerated (1) reconstruction.
eval_fwd_kspace_cg(y, x, wait_for=None)

Apply forward operator for image reconstruction. :param y: The result of the computation :type y: PyOpenCL.Array :param x: The input array :type x: PyOpenCL.Array :param wait_for: A List of PyOpenCL events to wait for. :type wait_for: list of PyopenCL.Event, None

Returns:A PyOpenCL.Event to wait for.
Return type:PyOpenCL.Event
run(data, iters=30, lambd=1e-05, tol=1e-08, guess=None, scan_offset=0)

Start the CG reconstruction.

All attributes after data are considered keyword only.

Parameters:
  • data (numpy.array) – The complex k-space data which serves as the basis for the images.
  • iters (int) – Maximum number of CG iterations
  • lambd (float) – Weighting parameter for the Tikhonov regularization
  • tol (float) – Termination criterion. If the energy decreases below this threshold the algorithm is terminated.
  • guess (numpy.array) – An optional initial guess for the images. If None, zeros is used.
Returns:

The result of the image reconstruction.

Return type:

numpy.Array

class pyqmri.solver.CGSolver_H1(prg, queue, par, irgn_par, coils, linops)

Conjugate Gradient Optimization Algorithm.

This Class performs a CG reconstruction on single precission complex input data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • prg (PyOpenCL Program A PyOpenCL Program containing the) – kernels for optimization.
  • linops (PyQMRI Operator The operator to traverse from) – parameter to data space.
  • coils (PyOpenCL Buffer or empty list) – coil buffer, empty list if image based fitting is used.
power_iteration(x, num_simulations=50)
power_iteration_grad(x, num_simulations=50)
run(guess, data, iters=30)

Start the CG reconstruction.

All attributes after data are considered keyword only.

Parameters:
  • guess (numpy.array) – An optional initial guess for the images. If None, zeros is used.
  • data (numpy.array) – The complex k-space data which serves as the basis for the images.
  • iters (int) – Maximum number of CG iterations
Returns:

The result of the fitting.

Return type:

dict of numpy.Array

setFvalInit(fval)

Set the initial value of the cost function.

Parameters:fval (float) – The initial cost of the optimization problem
updateRegPar(irgn_par)

Update the regularization parameters.

Performs an update of the regularization parameters as these usually vary from one to another Gauss-Newton step.
Parameters:(dic) (irgn_par) –
update_box(outp, inp, par, idx=0, idxq=0, bound_cond=0, wait_for=None)

Primal update of the x variable in the Primal-Dual Algorithm.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

class pyqmri.solver.PDBaseSolver(par, irgn_par, queue, tau, fval, prg, coil, model, DTYPE=<class 'numpy.complex64'>, DTYPE_real=<class 'numpy.float32'>)

Primal Dual splitting optimization.

This Class performs a primal-dual variable splitting based reconstruction on single precission complex input data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimate of the initial step size based on the operator norm of the linear operator.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL Program A PyOpenCL Program containing the) – kernels for optimization.
  • reg_type (string String to choose between "TV" and "TGV") – optimization.
  • data_operator (PyQMRI Operator The operator to traverse from) – parameter to data space.
  • coil (PyOpenCL Buffer or empty list) – coil buffer, empty list if image based fitting is used.
  • model (PyQMRI.Model) – Instance of a PyQMRI.Model to perform plotting
delta

Regularization parameter for L2 penalty on linearization point.

Type:float
omega

Not used. Should be set to 0

Type:float
lambd

Regularization parameter in front of data fidelity term.

Type:float
tol

Relative toleraze to stop iterating

Type:float
stag

Stagnation detection parameter

Type:float
display_iterations

Switch between plotting (true) of intermediate results

Type:bool
mu

Strong convecity parameter (inverse of delta).

Type:float
tau

Estimated step size based on operator norm of regularization.

Type:float
beta_line

Ratio between dual and primal step size

Type:float
theta_line

Line search parameter

Type:float
unknwons_TGV

Number of T(G)V unknowns

Type:int
unknowns_H1

Number of H1 unknowns (should be 0 for now)

Type:int
unknowns

Total number of unknowns (T(G)V+H1)

Type:int
num_dev

Total number of compute devices

Type:int
dz

Ratio between 3rd dimension and isotropic 1st and 2nd image dimension.

Type:float
model

The model which should be fitted

Type:PyQMRI.Model
modelgrad

The partial derivatives evaluated at the linearization point. This variable is set in the PyQMRI.irgn Class.

Type:PyOpenCL.Array or numpy.Array
min_const

list of minimal values, one for each unknown

Type:list of float
max_const

list of maximal values, one for each unknown

Type:list of float
real_const

list if a unknown is constrained to real values only. (1 True, 0 False)

Type:list of int
static factory(prg, queue, par, irgn_par, init_fval, coils, linops, model, reg_type='TGV', SMS=False, streamed=False, imagespace=False, DTYPE=<class 'numpy.complex64'>, DTYPE_real=<class 'numpy.float32'>)

Generate a PDSolver object.

Parameters:
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • init_fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • model (PyQMRI.Model) – The model which should be fitted
  • reg_type (string, "TGV") – String to choose between “TV” and “TGV” optimization.
  • SMS (bool, false) – Switch between standard (false) and SMS (True) fitting.
  • streamed (bool, false) – Switch between streamed (1) and normal (0) reconstruction.
  • imagespace (bool, false) – Switch between k-space (false) and imagespace based fitting (true).
  • DTYPE (numpy.dtype, numpy.complex64) – Complex working precission.
  • DTYPE_real (numpy.dtype, numpy.float32) – Real working precission.
run(inp, data, iters)

Optimization with 3D T(G)V regularization.

Parameters:
  • (numpy.array) (x) – Initial guess for the unknown parameters
  • (numpy.array) – The complex valued data to fit.
  • iters (int) – Number of primal-dual iterations to run
Returns:

A tupel of all primal variables (x,v in the Paper). If no streaming is used, the two entries are opf class PyOpenCL.Array, otherwise Numpy.Array.

Return type:

tupel

setFvalInit(fval)

Set the initial value of the cost function.

Parameters:fval (float) – The initial cost of the optimization problem
updateRegPar(irgn_par)

Update the regularization parameters.

Performs an update of the regularization parameters as these usually vary from one to another Gauss-Newton step.
Parameters:(dic) (irgn_par) –
update_Kyk2(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Precompute the v-part of the Adjoint Linear operator.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_primal(outp, inp, par, idx=0, idxq=0, bound_cond=0, wait_for=None)

Primal update of the x variable in the Primal-Dual Algorithm.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_r(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Update the data dual variable r.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_v(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Primal update of the v variable in Primal-Dual Algorithm.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_z1(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Dual update of the z1 variable in Primal-Dual Algorithm for TGV.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_z1_tv(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Dual update of the z1 variable in Primal-Dual Algorithm for TV.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

update_z2(outp, inp, par=None, idx=0, idxq=0, bound_cond=0, wait_for=None)

Dual update of the z2 variable in Primal-Dual Algorithm for TGV.

Parameters:
  • outp (PyOpenCL.Array) – The result of the update step
  • inp (PyOpenCL.Array) – The previous values of x
  • par (list) – List of necessary parameters for the update
  • idx (int) – Index of the device to use
  • idxq (int) – Index of the queue to use
  • bound_cond (int) – Apply boundary condition (1) or not (0).
  • wait_for (list of PyOpenCL.Events, None) – A optional list for PyOpenCL.Events to wait for
Returns:

A PyOpenCL.Event to wait for.

Return type:

PyOpenCL.Event

class pyqmri.solver.PDSolverStreamed(par, irgn_par, queue, tau, fval, prg, coils, model, imagespace=False, **kwargs)

Streamed version of the PD Solver.

This class is the base class for the streamed array optimization.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
  • imagespace (bool, false) – Switch between imagespace (True) and k-space (false) based fitting.
unknown_shape

Size of the unknown array

Type:tuple of int
model_deriv_shape

Size of the partial derivative array of the unknowns

Type:tuple of int
grad_shape

Size of the finite difference based gradient

Type:tuple of int
symgrad_shape

Size of the finite difference based symmetrized gradient. Defaults to None in TV based optimization.

Type:tuple of int, None
data_shape

Size of the data to be fitted

Type:tuple of int
data_trans_axes

Order of transpose of data axis, requried for streaming

Type:list of int
data_shape_T

Size of transposed data.

Type:tuple of int
class pyqmri.solver.PDSolverStreamedTGV(par, irgn_par, queue, tau, fval, prg, linop, coils, model, imagespace=False, SMS=False, **kwargs)

Streamed TGV optimization.

This class performes streamd TGV optimization.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
  • imagespace (bool, false) – Switch between imagespace (True) and k-space (false) based fitting.
  • SMS (bool, false) – Switch between SMS (True) and standard (false) reconstruction.
alpha

alpha0 parameter for TGV regularization weight

Type:float
beta

alpha1 parameter for TGV regularization weight

Type:float
symgrad_shape

Size of the symmetrized gradient

Type:tuple of int
class pyqmri.solver.PDSolverStreamedTGVSMS(par, irgn_par, queue, tau, fval, prg, linop, coils, model, imagespace=False, **kwargs)

Streamed TGV optimization for SMS data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
  • imagespace (bool, false) – Switch between imagespace (True) and k-space (false) based fitting.
  • SMS (bool, false) – Switch between SMS (True) and standard (false) reconstruction.
alpha

alpha0 parameter for TGV regularization weight

Type:float
beta

alpha1 parameter for TGV regularization weight

Type:float
symgrad_shape

Size of the symmetrized gradient

Type:tuple of int
class pyqmri.solver.PDSolverStreamedTV(par, irgn_par, queue, tau, fval, prg, linop, coils, model, imagespace=False, SMS=False, **kwargs)

Streamed TV optimization.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
  • imagespace (bool, false) – Switch between imagespace (True) and k-space (false) based fitting.
  • SMS (bool, false) – Switch between SMS (True) and standard (false) reconstruction.
alpha

alpha0 parameter for TGV regularization weight

Type:float
symgrad_shape

Size of the symmetrized gradient

Type:tuple of int
class pyqmri.solver.PDSolverStreamedTVSMS(par, irgn_par, queue, tau, fval, prg, linop, coils, model, imagespace=False, **kwargs)

Streamed TV optimization for SMS data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
  • imagespace (bool, false) – Switch between imagespace (True) and k-space (false) based fitting.
alpha

alpha0 parameter for TGV regularization weight

Type:float
symgrad_shape

Size of the symmetrized gradient

Type:tuple of int
class pyqmri.solver.PDSolverTGV(par, irgn_par, queue, tau, fval, prg, linop, coils, model, **kwargs)

TGV Primal Dual splitting optimization.

This Class performs a primal-dual variable splitting based reconstruction on single precission complex input data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
alpha

alpha0 parameter for TGV regularization weight

Type:float
beta

alpha1 parameter for TGV regularization weight

Type:float
class pyqmri.solver.PDSolverTV(par, irgn_par, queue, tau, fval, prg, linop, coils, model, **kwargs)

Primal Dual splitting optimization for TV.

This Class performs a primal-dual variable splitting based reconstruction on single precission complex input data.

Parameters:
  • par (dict) – A python dict containing the necessary information to setup the object. Needs to contain the number of slices (NSlice), number of scans (NScan), image dimensions (dimX, dimY), number of coils (NC), sampling points (N) and read outs (NProj) a PyOpenCL queue (queue) and the complex coil sensitivities (C).
  • irgn_par (dict) – A python dict containing the regularization parameters for a given gauss newton step.
  • queue (list of PyOpenCL.Queues) – A list of PyOpenCL queues to perform the optimization.
  • tau (float) – Estimated step size based on operator norm of regularization.
  • fval (float) – Estimate of the initial cost function value to scale the displayed values.
  • prg (PyOpenCL.Program) – A PyOpenCL Program containing the kernels for optimization.
  • linops (list of PyQMRI Operator) – The linear operators used for fitting.
  • coils (PyOpenCL Buffer or empty list) – The coils used for reconstruction.
  • model (PyQMRI.Model) – The model which should be fitted
alpha

TV regularization weight

Type:float