From 18b6d25f7e4f0943b3592f3bb4f6ca5ed9c285d3 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Fri, 19 Jun 2015 22:28:06 +0200
Subject: Add support for Python algorithm plugins

---
 matlab/mex/astra_mex_plugin_c.cpp | 139 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 139 insertions(+)
 create mode 100644 matlab/mex/astra_mex_plugin_c.cpp

(limited to 'matlab')

diff --git a/matlab/mex/astra_mex_plugin_c.cpp b/matlab/mex/astra_mex_plugin_c.cpp
new file mode 100644
index 0000000..2d9b9a0
--- /dev/null
+++ b/matlab/mex/astra_mex_plugin_c.cpp
@@ -0,0 +1,139 @@
+/*
+-----------------------------------------------------------------------
+Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+           2014-2015, 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/>.
+
+-----------------------------------------------------------------------
+$Id$
+*/
+
+/** \file astra_mex_plugin_c.cpp
+ *
+ *  \brief Manages Python plugins.
+ */
+
+#include <mex.h>
+#include "mexHelpFunctions.h"
+#include "mexInitFunctions.h"
+
+#include "astra/PluginAlgorithm.h"
+
+#include "Python.h"
+#include "bytesobject.h"
+
+using namespace std;
+using namespace astra;
+
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_plugin('get_registered');
+ *
+ * Print registered plugins.
+ */
+void astra_mex_plugin_get_registered(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+    astra::CPluginAlgorithmFactory *fact = astra::CPluginAlgorithmFactory::getSingletonPtr();
+    PyObject *dict = fact->getRegistered();
+    PyObject *key, *value;
+    Py_ssize_t pos = 0;
+    while (PyDict_Next(dict, &pos, &key, &value)) {
+        mexPrintf("%s: %s\n",PyBytes_AsString(key),PyBytes_AsString(value));
+    }
+    Py_DECREF(dict);
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_plugin('register', name, class_name);
+ *
+ * Register plugin.
+ */
+void astra_mex_plugin_register(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+    if (3 <= nrhs) {
+        string name = mexToString(prhs[1]);
+        string class_name = mexToString(prhs[2]);
+        astra::CPluginAlgorithmFactory *fact = astra::CPluginAlgorithmFactory::getSingletonPtr();
+        fact->registerPlugin(name, class_name);
+    }else{
+        mexPrintf("astra_mex_plugin('register', name, class_name);\n");
+    }
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_plugin('get_help', name);
+ *
+ * Get help about plugin.
+ */
+void astra_mex_plugin_get_help(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+    if (2 <= nrhs) {
+        string name = mexToString(prhs[1]);
+        astra::CPluginAlgorithmFactory *fact = astra::CPluginAlgorithmFactory::getSingletonPtr();
+        mexPrintf((fact->getHelp(name)+"\n").c_str());
+    }else{
+        mexPrintf("astra_mex_plugin('get_help', name);\n");
+    }
+}
+
+
+//-----------------------------------------------------------------------------------------
+
+static void printHelp()
+{
+	mexPrintf("Please specify a mode of operation.\n");
+	mexPrintf("   Valid modes: register, get_registered, get_help\n");
+}
+
+//-----------------------------------------------------------------------------------------
+/**
+ * ... = astra_mex(type,...);
+ */
+void mexFunction(int nlhs, mxArray* plhs[],
+				 int nrhs, const mxArray* prhs[])
+{
+
+	// INPUT0: Mode
+	string sMode = "";
+	if (1 <= nrhs) {
+		sMode = mexToString(prhs[0]);	
+	} else {
+		printHelp();
+		return;
+	}
+
+	initASTRAMex();
+
+	// SWITCH (MODE)
+	if (sMode ==  std::string("get_registered")) { 
+		astra_mex_plugin_get_registered(nlhs, plhs, nrhs, prhs); 
+    }else if (sMode ==  std::string("get_help")) { 
+        astra_mex_plugin_get_help(nlhs, plhs, nrhs, prhs); 
+    }else if (sMode ==  std::string("register")) { 
+		astra_mex_plugin_register(nlhs, plhs, nrhs, prhs); 
+	} else {
+		printHelp();
+	}
+
+	return;
+}
+
+
-- 
cgit v1.2.3


From 3d136b7c819b0b142ad056bf01c8c1191eea9ba0 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Fri, 17 Jul 2015 16:22:05 +0200
Subject: Fix numpy lapack loading when running in Matlab

---
 matlab/mex/mexInitFunctions.cpp | 3 +++
 1 file changed, 3 insertions(+)

(limited to 'matlab')

diff --git a/matlab/mex/mexInitFunctions.cpp b/matlab/mex/mexInitFunctions.cpp
index d8a50d7..c11c7d5 100644
--- a/matlab/mex/mexInitFunctions.cpp
+++ b/matlab/mex/mexInitFunctions.cpp
@@ -17,6 +17,9 @@ void logCallBack(const char *msg, size_t len){
  */
 void initASTRAMex(){
     if(mexIsInitialized) return;
+
+    astra::running_in_matlab=true;
+
     if(!astra::CLogger::setCallbackScreen(&logCallBack)){
         mexErrMsgTxt("Error initializing mex functions.");
     }
-- 
cgit v1.2.3


From d91b51f6d58003de84a9d6dd8189fceba0e81a5a Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Mon, 20 Jul 2015 14:07:21 +0200
Subject: Allow registering plugins without explicit name, and fix exception
 handling when running in Matlab

---
 matlab/mex/astra_mex_plugin_c.cpp | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

(limited to 'matlab')

diff --git a/matlab/mex/astra_mex_plugin_c.cpp b/matlab/mex/astra_mex_plugin_c.cpp
index 2d9b9a0..177fcf4 100644
--- a/matlab/mex/astra_mex_plugin_c.cpp
+++ b/matlab/mex/astra_mex_plugin_c.cpp
@@ -37,9 +37,6 @@ $Id$
 
 #include "astra/PluginAlgorithm.h"
 
-#include "Python.h"
-#include "bytesobject.h"
-
 using namespace std;
 using namespace astra;
 
@@ -52,29 +49,25 @@ using namespace astra;
 void astra_mex_plugin_get_registered(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
 {
     astra::CPluginAlgorithmFactory *fact = astra::CPluginAlgorithmFactory::getSingletonPtr();
-    PyObject *dict = fact->getRegistered();
-    PyObject *key, *value;
-    Py_ssize_t pos = 0;
-    while (PyDict_Next(dict, &pos, &key, &value)) {
-        mexPrintf("%s: %s\n",PyBytes_AsString(key),PyBytes_AsString(value));
+    std::map<std::string, std::string> mp = fact->getRegisteredMap();
+    for(std::map<std::string,std::string>::iterator it=mp.begin();it!=mp.end();it++){
+        mexPrintf("%s: %s\n",it->first.c_str(), it->second.c_str());
     }
-    Py_DECREF(dict);
 }
 
 //-----------------------------------------------------------------------------------------
-/** astra_mex_plugin('register', name, class_name);
+/** astra_mex_plugin('register', class_name);
  *
  * Register plugin.
  */
 void astra_mex_plugin_register(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
 {
-    if (3 <= nrhs) {
-        string name = mexToString(prhs[1]);
-        string class_name = mexToString(prhs[2]);
+    if (2 <= nrhs) {
+        string class_name = mexToString(prhs[1]);
         astra::CPluginAlgorithmFactory *fact = astra::CPluginAlgorithmFactory::getSingletonPtr();
-        fact->registerPlugin(name, class_name);
+        fact->registerPlugin(class_name);
     }else{
-        mexPrintf("astra_mex_plugin('register', name, class_name);\n");
+        mexPrintf("astra_mex_plugin('register', class_name);\n");
     }
 }
 
-- 
cgit v1.2.3


From db8587475efd44bc728caa79cd7ae7120eaf045b Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Tue, 21 Jul 2015 15:15:08 +0200
Subject: Add matlab plugin .m file

---
 matlab/tools/astra_mex_plugin.m | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 matlab/tools/astra_mex_plugin.m

(limited to 'matlab')

diff --git a/matlab/tools/astra_mex_plugin.m b/matlab/tools/astra_mex_plugin.m
new file mode 100644
index 0000000..4159365
--- /dev/null
+++ b/matlab/tools/astra_mex_plugin.m
@@ -0,0 +1,24 @@
+function [varargout] = astra_mex_plugin(varargin)
+%------------------------------------------------------------------------
+% Reference page in Help browser
+%    <a href="matlab:docsearch('astra_mex_plugin' )">astra_mex_plugin</a>.
+%------------------------------------------------------------------------
+%------------------------------------------------------------------------
+% This file is part of the ASTRA Toolbox
+% 
+% Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+%            2014-2015, CWI, Amsterdam
+% License: Open Source under GPLv3
+% Contact: astra@uantwerpen.be
+% Website: http://sf.net/projects/astra-toolbox
+%------------------------------------------------------------------------
+% $Id$
+if nargout == 0
+    astra_mex_plugin_c(varargin{:});
+    if exist('ans','var')
+        varargout{1} = ans;
+    end
+else
+    varargout = cell(1,nargout);
+    [varargout{:}] = astra_mex_plugin_c(varargin{:});
+end
\ No newline at end of file
-- 
cgit v1.2.3