From ba0895b5299512e5028429e9e0111ab9944899cc Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Tue, 26 Apr 2016 16:45:33 +0200
Subject: Add SIRT plugin

---
 python/astra/__init__.py         |  1 +
 python/astra/plugins/__init__.py | 28 +++++++++++++
 python/astra/plugins/sirt.py     | 90 ++++++++++++++++++++++++++++++++++++++++
 python/builder.py                |  2 +-
 4 files changed, 120 insertions(+), 1 deletion(-)
 create mode 100644 python/astra/plugins/__init__.py
 create mode 100644 python/astra/plugins/sirt.py

(limited to 'python')

diff --git a/python/astra/__init__.py b/python/astra/__init__.py
index 515d9a2..f4f5fe8 100644
--- a/python/astra/__init__.py
+++ b/python/astra/__init__.py
@@ -35,6 +35,7 @@ from . import projector
 from . import projector3d
 from . import matrix
 from . import plugin
+from . import plugins
 from . import log
 from .optomo import OpTomo
 
diff --git a/python/astra/plugins/__init__.py b/python/astra/plugins/__init__.py
new file mode 100644
index 0000000..a24b04d
--- /dev/null
+++ b/python/astra/plugins/__init__.py
@@ -0,0 +1,28 @@
+# -----------------------------------------------------------------------
+# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp
+#            2013-2016, CWI, Amsterdam
+#
+# Contact: astra@uantwerpen.be
+# Website: http://sf.net/projects/astra-toolbox
+#
+# This file is part of the ASTRA Toolbox.
+#
+#
+# The ASTRA Toolbox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# The ASTRA Toolbox is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------
+
+
+from .sirt import SIRTPlugin
+
diff --git a/python/astra/plugins/sirt.py b/python/astra/plugins/sirt.py
new file mode 100644
index 0000000..a0f1230
--- /dev/null
+++ b/python/astra/plugins/sirt.py
@@ -0,0 +1,90 @@
+# -----------------------------------------------------------------------
+# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp
+#            2013-2016, CWI, Amsterdam
+#
+# Contact: astra@uantwerpen.be
+# Website: http://sf.net/projects/astra-toolbox
+#
+# This file is part of the ASTRA Toolbox.
+#
+#
+# The ASTRA Toolbox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# The ASTRA Toolbox is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------
+
+
+import astra
+import numpy as np
+import six
+
+class SIRTPlugin(astra.plugin.base):
+    """SIRT.
+
+    Options:
+
+    'Relaxation': relaxation factor (optional)
+    'MinConstraint': constrain values to at least this (optional)
+    'MaxConstraint': constrain values to at most this (optional)
+    """
+
+    astra_name = "SIRT-PLUGIN"
+
+    def initialize(self,cfg, Relaxation = 1, MinConstraint = None, MaxConstraint = None):
+        self.W = astra.OpTomo(cfg['ProjectorId'])
+        self.vid = cfg['ReconstructionDataId']
+        self.sid = cfg['ProjectionDataId']
+        self.min_constraint = MinConstraint
+        self.max_constraint = MaxConstraint
+
+        try:
+            v = astra.data2d.get_shared(self.vid)
+            s = astra.data2d.get_shared(self.sid)
+            self.data_mod = astra.data2d
+        except Exception:
+            v = astra.data3d.get_shared(self.vid)
+            s = astra.data3d.get_shared(self.sid)
+            self.data_mod = astra.data3d
+
+        self.R = self.W * np.ones(v.shape,dtype=np.float32).ravel();
+        self.R[self.R < 0.000001] = np.Inf
+        self.R = 1 / self.R
+        self.R = self.R.reshape(s.shape)
+
+        self.mrC = self.W.T * np.ones(s.shape,dtype=np.float32).ravel();
+        self.mrC[self.mrC < 0.000001] = np.Inf
+        self.mrC = -Relaxation / self.mrC
+        self.mrC = self.mrC.reshape(v.shape)
+        
+
+    def run(self, its):
+        v = self.data_mod.get_shared(self.vid)
+        s = self.data_mod.get_shared(self.sid)
+        tv = np.zeros(v.shape, dtype=np.float32)
+        ts = np.zeros(s.shape, dtype=np.float32)
+        W = self.W
+        mrC = self.mrC
+        R = self.R
+        for i in range(its):
+            W.FP(v,out=ts)
+            ts -= s
+            ts *= R # ts = R * (W*v - s)
+
+            W.BP(ts,out=tv)
+            tv *= mrC
+
+            v += tv # v = v - rel * C * W' * ts
+
+            if self.min_constraint is not None or self.max_constraint is not None:
+                v.clip(min=self.min_constraint, max=self.max_constraint, out=v)
+
diff --git a/python/builder.py b/python/builder.py
index dcd62d8..243888b 100644
--- a/python/builder.py
+++ b/python/builder.py
@@ -87,6 +87,6 @@ setup (name = 'PyASTRAToolbox',
        include_dirs=[np.get_include()],
        cmdclass = cmdclass,
        #ext_modules = [Extension("astra","astra/astra.pyx")],
-       packages=['astra'],
+       packages=['astra', 'astra.plugins'],
        requires=["numpy"],
 	)
-- 
cgit v1.2.3


From 4843e28a6666b9557dc7550a9fc056adee4c21c8 Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Mon, 29 Aug 2016 14:07:20 +0200
Subject: Add CGLS plugin

---
 python/astra/plugins/__init__.py |  1 +
 python/astra/plugins/cgls.py     | 99 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+)
 create mode 100644 python/astra/plugins/cgls.py

(limited to 'python')

diff --git a/python/astra/plugins/__init__.py b/python/astra/plugins/__init__.py
index a24b04d..71e9b64 100644
--- a/python/astra/plugins/__init__.py
+++ b/python/astra/plugins/__init__.py
@@ -25,4 +25,5 @@
 
 
 from .sirt import SIRTPlugin
+from .cgls import CGLSPlugin
 
diff --git a/python/astra/plugins/cgls.py b/python/astra/plugins/cgls.py
new file mode 100644
index 0000000..2f4970b
--- /dev/null
+++ b/python/astra/plugins/cgls.py
@@ -0,0 +1,99 @@
+# -----------------------------------------------------------------------
+# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp
+#            2013-2016, CWI, Amsterdam
+#
+# Contact: astra@uantwerpen.be
+# Website: http://sf.net/projects/astra-toolbox
+#
+# This file is part of the ASTRA Toolbox.
+#
+#
+# The ASTRA Toolbox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# The ASTRA Toolbox is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------
+
+
+import astra
+import numpy as np
+import six
+
+class CGLSPlugin(astra.plugin.base):
+    """CGLS."""
+
+    astra_name = "CGLS-PLUGIN"
+
+    def initialize(self,cfg):
+        self.W = astra.OpTomo(cfg['ProjectorId'])
+        self.vid = cfg['ReconstructionDataId']
+        self.sid = cfg['ProjectionDataId']
+
+        try:
+            v = astra.data2d.get_shared(self.vid)
+            s = astra.data2d.get_shared(self.sid)
+            self.data_mod = astra.data2d
+        except Exception:
+            v = astra.data3d.get_shared(self.vid)
+            s = astra.data3d.get_shared(self.sid)
+            self.data_mod = astra.data3d
+
+    def run(self, its):
+        v = self.data_mod.get_shared(self.vid)
+        s = self.data_mod.get_shared(self.sid)
+        z = np.zeros(v.shape, dtype=np.float32)
+        p = np.zeros(v.shape, dtype=np.float32)
+        r = np.zeros(s.shape, dtype=np.float32)
+        w = np.zeros(s.shape, dtype=np.float32)
+        W = self.W
+
+        # r = s - W*v
+        W.FP(v, out=w)
+        r[:] = s
+        r -= w
+
+        # p = W'*r
+        W.BP(r, out=p)
+
+        # gamma = <p,p>
+        gamma = np.dot(p.ravel(), p.ravel())
+
+        for i in range(its):
+            # w = W * p
+            W.FP(p, out=w)
+
+            # alpha = gamma / <w,w>
+            alpha = gamma / np.dot(w.ravel(), w.ravel())
+
+            # v += alpha * p
+            z[:] = p
+            z *= alpha
+            v += z
+
+            # r -= alpha * w
+            w *= -alpha;
+            r += w
+
+            # z = W' * r
+            W.BP(r, out=z)
+
+            # beta = <z,z> / gamma
+            newgamma = np.dot(z.ravel(), z.ravel())
+            beta = newgamma / gamma
+
+            # gamma = <z,z>
+            gamma = newgamma
+
+            # p = z + beta * p
+            p *= beta
+            p += z
+
-- 
cgit v1.2.3