diff options
author | epapoutsellis <epapoutsellis@gmail.com> | 2019-04-11 16:55:20 +0100 |
---|---|---|
committer | epapoutsellis <epapoutsellis@gmail.com> | 2019-04-11 16:55:20 +0100 |
commit | 41b536a3f2a33d5e527d8b7ada63b47b1abbbca8 (patch) | |
tree | 146d31e84f2ac1f055863a10108cd93804bf4aa0 | |
parent | 38c81a68b995a6cf841be0625fd0bb6d8a053cb9 (diff) | |
download | framework-41b536a3f2a33d5e527d8b7ada63b47b1abbbca8.tar.gz framework-41b536a3f2a33d5e527d8b7ada63b47b1abbbca8.tar.bz2 framework-41b536a3f2a33d5e527d8b7ada63b47b1abbbca8.tar.xz framework-41b536a3f2a33d5e527d8b7ada63b47b1abbbca8.zip |
changes for memopt option
-rwxr-xr-x | Wrappers/Python/ccpi/framework/BlockDataContainer.py | 35 | ||||
-rwxr-xr-x | Wrappers/Python/ccpi/framework/framework.py | 2 | ||||
-rw-r--r-- | Wrappers/Python/ccpi/optimisation/algorithms/PDHG.py | 22 | ||||
-rwxr-xr-x | Wrappers/Python/ccpi/optimisation/functions/MixedL21Norm.py | 40 | ||||
-rwxr-xr-x | Wrappers/Python/wip/pdhg_TV_denoising.py | 13 | ||||
-rw-r--r-- | Wrappers/Python/wip/pdhg_TV_tomography2D.py | 31 |
6 files changed, 93 insertions, 50 deletions
diff --git a/Wrappers/Python/ccpi/framework/BlockDataContainer.py b/Wrappers/Python/ccpi/framework/BlockDataContainer.py index 69b6931..8934f49 100755 --- a/Wrappers/Python/ccpi/framework/BlockDataContainer.py +++ b/Wrappers/Python/ccpi/framework/BlockDataContainer.py @@ -53,9 +53,9 @@ class BlockDataContainer(object): def is_compatible(self, other):
'''basic check if the size of the 2 objects fit'''
- for i in range(len(self.containers)):
- if type(self.containers[i])==type(self):
- self = self.containers[i]
+# for i in range(len(self.containers)):
+# if type(self.containers[i])==type(self):
+# self = self.containers[i]
if isinstance(other, Number):
return True
@@ -341,3 +341,32 @@ class BlockDataContainer(object): '''Inline truedivision'''
return self.__idiv__(other)
+if __name__ == '__main__':
+
+ M, N, K = 2,3,5
+ from ccpi.framework import ImageGeometry, BlockGeometry, BlockDataContainer
+
+ ig = ImageGeometry(N, M)
+ u = ig.allocate('random_int')
+
+ BG = BlockGeometry(ig, ig)
+ U = BG.allocate('random_int')
+
+ U_nested = BlockDataContainer(BlockDataContainer(u, u), u)
+
+
+ res1 = U + u
+ res2 = U_nested + u
+# res2 = u + U
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/Wrappers/Python/ccpi/framework/framework.py b/Wrappers/Python/ccpi/framework/framework.py index 07c2ead..e03a29c 100755 --- a/Wrappers/Python/ccpi/framework/framework.py +++ b/Wrappers/Python/ccpi/framework/framework.py @@ -1109,6 +1109,7 @@ class AcquisitionData(DataContainer): class DataProcessor(object): + '''Defines a generic DataContainer processor accepts DataContainer as inputs and @@ -1154,6 +1155,7 @@ class DataProcessor(object): raise NotImplementedError('Implement basic checks for input DataContainer') def get_output(self, out=None): + for k,v in self.__dict__.items(): if v is None and k != 'output': raise ValueError('Key {0} is None'.format(k)) diff --git a/Wrappers/Python/ccpi/optimisation/algorithms/PDHG.py b/Wrappers/Python/ccpi/optimisation/algorithms/PDHG.py index 2a69857..5323e76 100644 --- a/Wrappers/Python/ccpi/optimisation/algorithms/PDHG.py +++ b/Wrappers/Python/ccpi/optimisation/algorithms/PDHG.py @@ -161,18 +161,20 @@ def PDHG_old(f, g, operator, tau = None, sigma = None, opt = None, **kwargs): if not memopt: - y_tmp = y_old + sigma * operator.direct(xbar) - y = f.proximal_conjugate(y_tmp, sigma) + y_old += sigma * operator.direct(xbar) + y = f.proximal_conjugate(y_old, sigma) - x_tmp = x_old - tau * operator.adjoint(y) - x = g.proximal(x_tmp, tau) - - xbar = x + theta * (x - x_old) + x_old -= tau*operator.adjoint(y) + x = g.proximal(x_old, tau) + + xbar.fill(x) + xbar -= x_old + xbar *= theta + xbar += x - x_old = x - y_old = y - - + x_old.fill(x) + y_old.fill(y) + else: operator.direct(xbar, out = y_tmp) diff --git a/Wrappers/Python/ccpi/optimisation/functions/MixedL21Norm.py b/Wrappers/Python/ccpi/optimisation/functions/MixedL21Norm.py index 0ce7d8a..0c658a4 100755 --- a/Wrappers/Python/ccpi/optimisation/functions/MixedL21Norm.py +++ b/Wrappers/Python/ccpi/optimisation/functions/MixedL21Norm.py @@ -77,9 +77,7 @@ class MixedL21Norm(Function): pass def proximal_conjugate(self, x, tau, out=None): - - - + if self.SymTensor: param = [1]*x.shape[0] @@ -91,38 +89,22 @@ class MixedL21Norm(Function): return res else: -# pass - -# # tmp2 = np.sqrt(x.as_array()[0]**2 + x.as_array()[1]**2 + 2*x.as_array()[2]**2)/self.alpha -# # res = x.divide(ImageData(tmp2).maximum(1.0)) + if out is None: - tmp = [ el*el for el in x] - res = (sum(tmp).sqrt()).maximum(1.0) - frac = [x[i]/res for i in range(x.shape[0])] - res = BlockDataContainer(*frac) - - return res + tmp = [ el*el for el in x.containers] + res = (sum(tmp).sqrt()).maximum(1.0) + return x/res else: - - tmp = [ el*el for el in x] - res = (sum(tmp).sqrt()).maximum(1.0) - out.fill(x/res) - - - - # tmp = [ el*el for el in x] - # res = (sum(tmp).sqrt()).maximum(1.0) - # #frac = [x[i]/res for i in range(x.shape[0])] - # for i in range(x.shape[0]): - # a = out.get_item(i) - # b = x.get_item(i) - # b /= res - # a.fill( b ) + + res = (sum(x**2).sqrt()).maximum(1.0) + out.fill(x/res) + + + - def __rmul__(self, scalar): return ScaledFunction(self, scalar) diff --git a/Wrappers/Python/wip/pdhg_TV_denoising.py b/Wrappers/Python/wip/pdhg_TV_denoising.py index 598acb0..22fee90 100755 --- a/Wrappers/Python/wip/pdhg_TV_denoising.py +++ b/Wrappers/Python/wip/pdhg_TV_denoising.py @@ -23,11 +23,13 @@ from timeit import default_timer as timer def dt(steps): return steps[-1] - steps[-2] +#%% + # ############################################################################ # Create phantom for TV denoising -N = 100 +N = 200 data = np.zeros((N,N)) data[round(N/4):round(3*N/4),round(N/4):round(3*N/4)] = 0.5 @@ -62,8 +64,8 @@ if method == '0': #### Create functions - f1 = MixedL21Norm() - f2 = L2NormSquared(b = noisy_data) + f1 = alpha * MixedL21Norm() + f2 = 0.5 * L2NormSquared(b = noisy_data) f = BlockFunction(f1, f2) g = ZeroFun() @@ -88,15 +90,18 @@ print ("normK", normK) sigma = 1 tau = 1/(sigma*normK**2) -<<<<<<< HEAD opt = {'niter':100} opt1 = {'niter':100, 'memopt': True} +t1 = timer() res, time, primal, dual, pdgap = PDHG_old(f, g, operator, tau = tau, sigma = sigma, opt = opt) +print(timer()-t1) print("with memopt \n") +t2 = timer() res1, time1, primal1, dual1, pdgap1 = PDHG_old(f, g, operator, tau = tau, sigma = sigma, opt = opt1) +print(timer()-t2) plt.figure(figsize=(5,5)) plt.imshow(res.as_array()) diff --git a/Wrappers/Python/wip/pdhg_TV_tomography2D.py b/Wrappers/Python/wip/pdhg_TV_tomography2D.py index f06f166..159f2ea 100644 --- a/Wrappers/Python/wip/pdhg_TV_tomography2D.py +++ b/Wrappers/Python/wip/pdhg_TV_tomography2D.py @@ -21,6 +21,7 @@ from ccpi.optimisation.functions import ZeroFun, L2NormSquared, \ from ccpi.astra.ops import AstraProjectorSimple from skimage.util import random_noise +from timeit import default_timer as timer #%%############################################################################### @@ -118,15 +119,37 @@ else: # #pdhg.run(5000) -opt = {'niter':2000} -# +opt = {'niter':300} +opt1 = {'niter':300, 'memopt': True} + + +t1 = timer() res, time, primal, dual, pdgap = PDHG_old(f, g, operator, tau = tau, sigma = sigma, opt = opt) +print(timer()-t1) plt.figure(figsize=(5,5)) plt.imshow(res.as_array()) plt.colorbar() -plt.show() - +plt.show() + +#%% +print("with memopt \n") +# +t2 = timer() +res1, time1, primal1, dual1, pdgap1 = PDHG_old(f, g, operator, tau = tau, sigma = sigma, opt = opt1) +#print(timer()-t2) +# +# +plt.figure(figsize=(5,5)) +plt.imshow(res1.as_array()) +plt.colorbar() +plt.show() +# +#%% +plt.figure(figsize=(5,5)) +plt.imshow(np.abs(res1.as_array()-res.as_array())) +plt.colorbar() +plt.show() #%% #sol = pdhg.get_output().as_array() #fig = plt.figure() |