import numpy as np
from numpy import zeros
from proxtoolbox.proxoperators.proxoperator import ProxOperator
from proxtoolbox import proxoperators
from proxtoolbox.utils.cell import Cell, isCell
from proxtoolbox.utils.size import size_matlab
[docs]class Prox_product_space(ProxOperator):
"""
Prox operator that projects onto constraints arranged
in a product space.
Based on Matlab code written by Russell Luke (Inst. Fuer
Numerische und Angewandte Mathematik, Universitaet
Gottingen) on Oct 26, 2017.
"""
def __init__(self, experiment):
# instantiate product prox operators
self.proxOps = []
for prox_item in experiment.productProxOperators:
if isinstance(prox_item, str):
proxClass = getattr(proxoperators, prox_item)
else:
proxClass = prox_item
prox = proxClass(experiment)
self.proxOps.append(prox)
[docs] def eval(self, u, prox_index = None):
"""
Projection subroutine onto constraints arranged in a product space.
Parameters
----------
u : ndarray or a list of ndarray objects
Input data to be projected
prox_idx : int, optional
Index of this prox operator
Returns
-------
u_new : ndarray or a list of ndarray objects
The projection, in the product space.
"""
K = len(self.proxOps) # the size of the product space
if isCell(u):
u_new = Cell(len(u))
k = 0
for prox_k in self.proxOps:
u_new[k] = prox_k.eval(u[k], k)
k += 1
else:
m, n, p, q = size_matlab(u)
if n == K:
u_new = zeros((m,K), dtype = u.dtype)
for k in range(K):
u_new[:,k] = self.proxOps[k].eval(u[:,k], k)
elif p == K:
u_new = zeros((m,n,K), dtype = u.dtype)
for k in range(K):
u_new[:,:,k] = self.proxOps[k].eval(u[:,:,k], k)
elif q == K:
u_new = zeros((m,n,p,K), dtype = u.dtype)
for k in range(K):
u_new[:,:,:,k] = self.proxOps[k].eval(u[:,:,:,k], k)
return u_new