diff options
author | Willem Jan Palenstijn <wjp@usecode.org> | 2018-10-23 12:20:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-23 12:20:18 +0200 |
commit | eb97daad97596d54e0da8987ef1c5b1dd91c124f (patch) | |
tree | e0f98656f13716b42898c6aefd8abbcc7353d4bc | |
parent | 6730face204f40c57c3e8fe58ea9749494d669a6 (diff) | |
parent | 03ff113ac48f21956247b164a83000b5f6ab311d (diff) | |
download | astra-eb97daad97596d54e0da8987ef1c5b1dd91c124f.tar.gz astra-eb97daad97596d54e0da8987ef1c5b1dd91c124f.tar.bz2 astra-eb97daad97596d54e0da8987ef1c5b1dd91c124f.tar.xz astra-eb97daad97596d54e0da8987ef1c5b1dd91c124f.zip |
Merge pull request #170 from wjp/feature_flags
Add support for checking features at run-time
-rw-r--r-- | astra_vc14.vcxproj | 2 | ||||
-rw-r--r-- | astra_vc14.vcxproj.filters | 6 | ||||
-rw-r--r-- | build/linux/Makefile.in | 1 | ||||
-rw-r--r-- | build/msvc/gen.py | 2 | ||||
-rw-r--r-- | include/astra/Features.h | 52 | ||||
-rw-r--r-- | matlab/mex/astra_mex_algorithm_c.cpp | 2 | ||||
-rw-r--r-- | matlab/mex/astra_mex_c.cpp | 38 | ||||
-rw-r--r-- | matlab/mex/astra_mex_data3d_c.cpp | 2 | ||||
-rw-r--r-- | matlab/mex/astra_mex_direct_c.cpp | 2 | ||||
-rw-r--r-- | matlab/mex/mexDataManagerHelpFunctions.cpp | 2 | ||||
-rw-r--r-- | matlab/mex/mexHelpFunctions.h | 6 | ||||
-rw-r--r-- | python/astra/__init__.py | 2 | ||||
-rw-r--r-- | python/astra/astra.py | 14 | ||||
-rw-r--r-- | python/astra/astra_c.pyx | 8 | ||||
-rw-r--r-- | src/Features.cpp | 41 |
15 files changed, 167 insertions, 13 deletions
diff --git a/astra_vc14.vcxproj b/astra_vc14.vcxproj index 6c19c41..d281179 100644 --- a/astra_vc14.vcxproj +++ b/astra_vc14.vcxproj @@ -508,6 +508,7 @@ <ClCompile Include="src\FanFlatBeamStripKernelProjector2D.cpp" /> <ClCompile Include="src\FanFlatProjectionGeometry2D.cpp" /> <ClCompile Include="src\FanFlatVecProjectionGeometry2D.cpp" /> + <ClCompile Include="src\Features.cpp" /> <ClCompile Include="src\FilteredBackProjectionAlgorithm.cpp" /> <ClCompile Include="src\Filters.cpp" /> <ClCompile Include="src\Float32Data.cpp" /> @@ -596,6 +597,7 @@ <ClInclude Include="include\astra\FanFlatBeamStripKernelProjector2D.h" /> <ClInclude Include="include\astra\FanFlatProjectionGeometry2D.h" /> <ClInclude Include="include\astra\FanFlatVecProjectionGeometry2D.h" /> + <ClInclude Include="include\astra\Features.h" /> <ClInclude Include="include\astra\FilteredBackProjectionAlgorithm.h" /> <ClInclude Include="include\astra\Filters.h" /> <ClInclude Include="include\astra\Float32Data.h" /> diff --git a/astra_vc14.vcxproj.filters b/astra_vc14.vcxproj.filters index 226068e..cb3622d 100644 --- a/astra_vc14.vcxproj.filters +++ b/astra_vc14.vcxproj.filters @@ -168,6 +168,9 @@ <ClCompile Include="src\Config.cpp"> <Filter>Global & Other\source</Filter> </ClCompile> + <ClCompile Include="src\Features.cpp"> + <Filter>Global & Other\source</Filter> + </ClCompile> <ClCompile Include="src\Filters.cpp"> <Filter>Global & Other\source</Filter> </ClCompile> @@ -437,6 +440,9 @@ <ClInclude Include="include\astra\Config.h"> <Filter>Global & Other\headers</Filter> </ClInclude> + <ClInclude Include="include\astra\Features.h"> + <Filter>Global & Other\headers</Filter> + </ClInclude> <ClInclude Include="include\astra\Filters.h"> <Filter>Global & Other\headers</Filter> </ClInclude> diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in index 2ec3851..f4c5c20 100644 --- a/build/linux/Makefile.in +++ b/build/linux/Makefile.in @@ -141,6 +141,7 @@ BASE_OBJECTS=\ src/FanFlatBeamStripKernelProjector2D.lo \ src/FanFlatProjectionGeometry2D.lo \ src/FanFlatVecProjectionGeometry2D.lo \ + src/Features.lo \ src/FilteredBackProjectionAlgorithm.lo \ src/Filters.lo \ src/Float32Data2D.lo \ diff --git a/build/msvc/gen.py b/build/msvc/gen.py index a42d8e5..42d0e0e 100644 --- a/build/msvc/gen.py +++ b/build/msvc/gen.py @@ -214,6 +214,7 @@ P_astra["filters"]["Global & Other\\source"] = [ "src\\AstraObjectManager.cpp", "src\\CompositeGeometryManager.cpp", "src\\Config.cpp", +"src\\Features.cpp", "src\\Filters.cpp", "src\\Fourier.cpp", "src\\Globals.cpp", @@ -354,6 +355,7 @@ P_astra["filters"]["Global & Other\\headers"] = [ "include\\astra\\clog.h", "include\\astra\\CompositeGeometryManager.h", "include\\astra\\Config.h", +"include\\astra\\Features.h", "include\\astra\\Filters.h", "include\\astra\\Fourier.h", "include\\astra\\Globals.h", diff --git a/include/astra/Features.h b/include/astra/Features.h new file mode 100644 index 0000000..d88ae71 --- /dev/null +++ b/include/astra/Features.h @@ -0,0 +1,52 @@ +/* +----------------------------------------------------------------------- +Copyright: 2010-2018, imec Vision Lab, University of Antwerp + 2014-2018, CWI, Amsterdam + +Contact: astra@astra-toolbox.com +Website: http://www.astra-toolbox.com/ + +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/>. + +----------------------------------------------------------------------- +*/ + +#ifndef _INC_ASTRA_FEATURES +#define _INC_ASTRA_FEATURES + +#include "astra/Globals.h" + +namespace astra { +_AstraExport bool hasFeature(const std::string &feature); +} + +/* + +FEATURES: + +cuda: is cuda support compiled in? + NB: To check if there is also actually a usable GPU, use cudaAvailable() + +mex_link: is there support for the matlab command astra_mex_data3d('link')? + +For future backward-incompatible changes, extra features will be added here + + +*/ + + +#endif diff --git a/matlab/mex/astra_mex_algorithm_c.cpp b/matlab/mex/astra_mex_algorithm_c.cpp index 80c0424..7804eeb 100644 --- a/matlab/mex/astra_mex_algorithm_c.cpp +++ b/matlab/mex/astra_mex_algorithm_c.cpp @@ -34,8 +34,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "mexInitFunctions.h" #include "astra/Globals.h" -#define USE_MATLAB_UNDOCUMENTED - #ifdef USE_MATLAB_UNDOCUMENTED extern "C" { bool utIsInterruptPending(); } diff --git a/matlab/mex/astra_mex_c.cpp b/matlab/mex/astra_mex_c.cpp index f494ce6..43c438e 100644 --- a/matlab/mex/astra_mex_c.cpp +++ b/matlab/mex/astra_mex_c.cpp @@ -35,6 +35,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "mexInitFunctions.h" #include "astra/Globals.h" +#include "astra/Features.h" #include "astra/AstraObjectManager.h" #ifdef ASTRA_CUDA @@ -132,6 +133,7 @@ void astra_mex_set_gpu_index(int nlhs, mxArray* plhs[], int nrhs, const mxArray* #endif } +//----------------------------------------------------------------------------------------- /** get_gpu_info = astra_mex('get_gpu_info'); * * Get GPU info @@ -149,6 +151,38 @@ void astra_mex_get_gpu_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray* //----------------------------------------------------------------------------------------- +/** has_feature = astra_mex('has_feature'); + * + * Check a feature flag. See include/astra/Features.h. + */ +void astra_mex_has_feature(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) +{ + if (2 > nrhs) { + mexErrMsgTxt("Usage: astra_mex('has_feature', feature);\n"); + return; + } + + string sMode = mexToString(prhs[0]); + bool ret = false; + + // NB: When adding features here, also document them centrally in + // include/astra/Features.h + if (sMode == "mex_link") { +#ifdef USE_MATLAB_UNDOCUMENTED + ret = true; +#else + ret = false; +#endif + } else { + ret = astra::hasFeature(sMode); + } + + plhs[0] = mxCreateDoubleScalar(ret ? 1 : 0); +} + + + +//----------------------------------------------------------------------------------------- /** version_number = astra_mex('version'); * * Fetch the version number of the toolbox. @@ -208,7 +242,7 @@ void astra_mex_delete(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] static void printHelp() { mexPrintf("Please specify a mode of operation.\n"); - mexPrintf(" Valid modes: version, use_cuda, credits, set_gpu_index, info, delete\n"); + mexPrintf(" Valid modes: version, use_cuda, credits, set_gpu_index, has_feature, info, delete\n"); } //----------------------------------------------------------------------------------------- @@ -241,6 +275,8 @@ void mexFunction(int nlhs, mxArray* plhs[], astra_mex_set_gpu_index(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("get_gpu_info")) { astra_mex_get_gpu_info(nlhs, plhs, nrhs, prhs); + } else if (sMode == std::string("has_feature")) { + astra_mex_has_feature(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("info")) { astra_mex_info(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("delete")) { diff --git a/matlab/mex/astra_mex_data3d_c.cpp b/matlab/mex/astra_mex_data3d_c.cpp index 5504955..4642693 100644 --- a/matlab/mex/astra_mex_data3d_c.cpp +++ b/matlab/mex/astra_mex_data3d_c.cpp @@ -55,8 +55,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. using namespace std; using namespace astra; -#define USE_MATLAB_UNDOCUMENTED - //----------------------------------------------------------------------------------------- /** * id = astra_mex_io_data('create', datatype, geometry, data); diff --git a/matlab/mex/astra_mex_direct_c.cpp b/matlab/mex/astra_mex_direct_c.cpp index 1a129f4..0090d13 100644 --- a/matlab/mex/astra_mex_direct_c.cpp +++ b/matlab/mex/astra_mex_direct_c.cpp @@ -54,8 +54,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. using namespace std; using namespace astra; -#define USE_MATLAB_UNDOCUMENTED - class CFloat32CustomMemory_simple : public astra::CFloat32CustomMemory { public: diff --git a/matlab/mex/mexDataManagerHelpFunctions.cpp b/matlab/mex/mexDataManagerHelpFunctions.cpp index a71928b..dc225ac 100644 --- a/matlab/mex/mexDataManagerHelpFunctions.cpp +++ b/matlab/mex/mexDataManagerHelpFunctions.cpp @@ -36,8 +36,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "astra/Float32VolumeData3DMemory.h" #include "astra/Float32ProjectionData3DMemory.h" -#define USE_MATLAB_UNDOCUMENTED - #ifdef USE_MATLAB_UNDOCUMENTED extern "C" { mxArray *mxCreateSharedDataCopy(const mxArray *pr); diff --git a/matlab/mex/mexHelpFunctions.h b/matlab/mex/mexHelpFunctions.h index bf22929..56994dc 100644 --- a/matlab/mex/mexHelpFunctions.h +++ b/matlab/mex/mexHelpFunctions.h @@ -28,6 +28,10 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #ifndef _INC_ASTRA_MEX_HELPFUNCTIONS #define _INC_ASTRA_MEX_HELPFUNCTIONS + +#define USE_MATLAB_UNDOCUMENTED + + #include <string> #include <list> #include <iostream> @@ -66,6 +70,4 @@ mxArray* XMLNodeToStruct(astra::XMLNode xml); mxArray* stringToMxArray(std::string input); mxArray* buildStruct(std::map<std::string, mxArray*> mInput); - - #endif diff --git a/python/astra/__init__.py b/python/astra/__init__.py index 1a7f444..ae35316 100644 --- a/python/astra/__init__.py +++ b/python/astra/__init__.py @@ -27,7 +27,7 @@ from . import matlab as m from .creators import astra_dict,create_vol_geom, create_proj_geom, create_backprojection, create_sino, create_reconstruction, create_projector,create_sino3d_gpu, create_backprojection3d_gpu from .functions import data_op, add_noise_to_sino, clear, move_vol_geom, geom_size, geom_2vec, geom_postalignment from .extrautils import clipCircle -from .astra import set_gpu_index, get_gpu_info, use_cuda +from .astra import set_gpu_index, get_gpu_info, use_cuda, has_feature from . import data2d from . import astra from . import data3d diff --git a/python/astra/astra.py b/python/astra/astra.py index ef46db1..e74d29a 100644 --- a/python/astra/astra.py +++ b/python/astra/astra.py @@ -54,6 +54,20 @@ def get_gpu_info(idx=-1): """ return a.get_gpu_info(idx) +def has_feature(feature): + """Check a feature flag. + + These are used to check if certain functionality has been + enabled at compile time, if new functionality is present, or if + a backward-incompatible change is present. + + See include/astra/Features.h for a list. + + :param feature: The name of the feature + :type feature: :class:`str` + :returns: :class:`bool` -- The presence of the feature + """ + return a.has_feature(feature) def delete(ids): """Delete an astra object. diff --git a/python/astra/astra_c.pyx b/python/astra/astra_c.pyx index 65dbf28..69909b5 100644 --- a/python/astra/astra_c.pyx +++ b/python/astra/astra_c.pyx @@ -28,7 +28,7 @@ include "config.pxi" import six -from .utils import wrap_from_bytes +from .utils import wrap_from_bytes, wrap_to_bytes from libcpp.string cimport string from libcpp.vector cimport vector @@ -40,6 +40,9 @@ cdef extern from "astra/Globals.h" namespace "astra": bool cudaEnabled() bool cudaAvailable() +cdef extern from "astra/Features.h" namespace "astra": + bool hasFeature(string) + IF HAVE_CUDA==True: cdef extern from "astra/cuda/2d/astra.h" namespace "astraCUDA": bool setGPUIndex(int) @@ -120,3 +123,6 @@ def info(ids): if ptr: s = ptr.getType() + six.b("\t") + ptr.getInfo(i) six.print_(wrap_from_bytes(s)) + +def has_feature(feature): + return hasFeature(wrap_to_bytes(feature)) diff --git a/src/Features.cpp b/src/Features.cpp new file mode 100644 index 0000000..9114131 --- /dev/null +++ b/src/Features.cpp @@ -0,0 +1,41 @@ +/* +----------------------------------------------------------------------- +Copyright: 2010-2018, imec Vision Lab, University of Antwerp + 2014-2018, CWI, Amsterdam + +Contact: astra@astra-toolbox.com +Website: http://www.astra-toolbox.com/ + +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/>. + +----------------------------------------------------------------------- +*/ + +#include "astra/Features.h" +#include "astra/Globals.h" + +namespace astra { + +_AstraExport bool hasFeature(const std::string &flag) { + if (flag == "cuda") { + return cudaEnabled(); + } + + return false; +} + +} |