From 263a1a3704b60c49f5ff9ee64b19a532aa8e0467 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Mon, 6 Jul 2020 21:46:41 +0200
Subject: [PATCH] Fit/CMake: simplify, and regenerate bindings

---
 Core/CMakeLists.txt                |    1 -
 Fit/CMakeLists.txt                 |   67 +-
 Wrap/swig/libBornAgainFit.i        |   26 +-
 auto/Wrap/libBornAgainFit.py       |  470 +++---
 auto/Wrap/libBornAgainFit_wrap.cpp | 2230 ++++++++++++++--------------
 5 files changed, 1395 insertions(+), 1399 deletions(-)

diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
index fc4242e2c66..8ea2e9bbf82 100644
--- a/Core/CMakeLists.txt
+++ b/Core/CMakeLists.txt
@@ -25,7 +25,6 @@ set(include_dirs
     ${BUILD_INC_DIR}
     ${CMAKE_SOURCE_DIR}/Wrap
     ${CORE_SOURCE_DIRS}
-    ${BornAgainFit_INCLUDE_DIRS}
     )
 
 file(GLOB source_files "*/*.cpp")
diff --git a/Fit/CMakeLists.txt b/Fit/CMakeLists.txt
index b5e3ec97154..7b6234b5d6c 100644
--- a/Fit/CMakeLists.txt
+++ b/Fit/CMakeLists.txt
@@ -2,7 +2,7 @@
 # CMakeLists.txt file for building libBornAgainFit library
 ############################################################################
 
-set(library_name BornAgainFit)
+set(lib BornAgainFit)
 
 # --- source and include files ------
 set(FIT_SOURCE_DIRS
@@ -21,10 +21,6 @@ if(BORNAGAIN_PYTHON)
 
     set(AUTO_DIR ${CMAKE_SOURCE_DIR}/auto/Wrap)
     file(MAKE_DIRECTORY ${AUTO_DIR})
-    include_directories(${AUTO_DIR})
-
-    set(swig_include_dirs ${CMAKE_SOURCE_DIR}/Wrap ${FIT_SOURCE_DIRS})
-    include_directories(${swig_include_dirs})
 
     if(BORNAGAIN_GENERATE_BINDINGS)
 
@@ -47,12 +43,10 @@ if(BORNAGAIN_PYTHON)
                 message(FATAL_ERROR "Could NOT find SWIG input ${FNAM}")
             endif()
         endforeach()
-        set(swig_dependencies ${swig_dependencies} ${AUTO_DIR}/doxygen_fit.i)
+        list(APPEND swig_dependencies ${AUTO_DIR}/doxygen_fit.i)
 
-        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainFit_wrap.cpp;-outdir;${TMP_DIR}")
-        foreach(dir ${swig_include_dirs})
-            list(APPEND SWIG_FLAGS "-I${dir}")
-        endforeach(dir)
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainFit_wrap.cpp;-outdir;${TMP_DIR}"
+            ";-I${CMAKE_SOURCE_DIR}")
 
         add_custom_command (
             OUTPUT ${AUTO_DIR}/libBornAgainFit.py
@@ -72,7 +66,7 @@ if(BORNAGAIN_PYTHON)
     endif(BORNAGAIN_GENERATE_BINDINGS)
 
     add_custom_target (
-        ${library_name}_python
+        ${lib}_python
         COMMAND ${CMAKE_COMMAND} -E copy ${AUTO_DIR}/libBornAgainFit.py
              ${CMAKE_BINARY_DIR}/lib/libBornAgainFit.py
         COMMAND ${CMAKE_COMMAND} -E copy ${AUTO_DIR}/libBornAgainFit.py
@@ -97,45 +91,46 @@ if(WIN32)
 endif()
 
 # --- making library ---------
-add_library(${library_name} SHARED ${source_files})
-set_target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
-set(${library_name}_LIBRARY_TYPE SHARED)
+add_library(${lib} SHARED ${source_files})
+set_target_properties(${lib} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${lib}_LIBRARY_TYPE SHARED)
 
 if(BORNAGAIN_PYTHON)
-    add_dependencies(${library_name} ${library_name}_python)
+    add_dependencies(${lib} ${lib}_python)
 endif()
 
 # exposing library name and list of include directories outside
-set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
-set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+set(${lib}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${lib}_LIBRARY ${lib} PARENT_SCOPE)
 
 # --- dependencies ---------
-target_include_directories(${library_name} PUBLIC ${RootMinimizers_INCLUDE_DIRS})
-target_include_directories(${library_name} PUBLIC ${CMAKE_SOURCE_DIR})
-target_link_libraries(${library_name} ${RootMinimizers_LIBRARY} ${Boost_LIBRARIES})
+target_include_directories(${lib}
+    PUBLIC ${RootMinimizers_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR})
+target_link_libraries(${lib} ${RootMinimizers_LIBRARY} ${Boost_LIBRARIES})
 
 if(BORNAGAIN_PYTHON)
-    include_directories(${Python_INCLUDE_DIRS} ${Python_NumPy_INCLUDE_DIRS})
-    target_link_libraries(${library_name} ${Python_LIBRARIES})
+    target_include_directories(${lib}
+        PUBLIC ${Python_INCLUDE_DIRS} ${Python_NumPy_INCLUDE_DIRS})
+    target_link_libraries(${lib} ${Python_LIBRARIES})
 endif()
 
 # --- custom actions
 # python in windows required .pyd extention for the library name
 if(WIN32 AND BORNAGAIN_PYTHON)
     ADD_CUSTOM_COMMAND(
-        TARGET ${library_name}
+        TARGET ${lib}
         POST_BUILD
         COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
-        ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+        ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+        ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
         )
     # for functional tests
     ADD_CUSTOM_COMMAND(
-        TARGET ${library_name}
+        TARGET ${lib}
         POST_BUILD
         COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
-        ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}${libsuffix}
+        ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+        ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
         )
 
 endif()
@@ -143,27 +138,29 @@ endif()
 if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
     #    set(link_flags "-Wl,-rpath,@loader_path/../..")
     set(link_flags "-Wl,-rpath,@loader_path/../../Frameworks")
-    set_target_properties(${library_name} PROPERTIES LINK_FLAGS ${link_flags})
+    set_target_properties(${lib} PROPERTIES LINK_FLAGS ${link_flags})
 endif()
 
 # -----------------------------------------------
 # installation
 # -----------------------------------------------
-install (TARGETS ${library_name} DESTINATION ${destination_lib} COMPONENT Libraries)
+install (TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
 install (FILES ${fitkernel_include_files} DESTINATION ${destination_include}  COMPONENT Headers)
-install (FILES ${CMAKE_BINARY_DIR}/lib/lib${library_name}.py DESTINATION ${destination_lib} COMPONENT Libraries) # required by SWIG
+install (FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
+    DESTINATION ${destination_lib} COMPONENT Libraries) # required by SWIG
 install (FILES ${include_files} DESTINATION ${destination_include} COMPONENT Headers)
 
 if(WIN32)
     if(BORNAGAIN_PYTHON)
         ADD_CUSTOM_COMMAND(
-            TARGET ${library_name}
+            TARGET ${lib}
             POST_BUILD
             COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
             )
 
-        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd DESTINATION ${destination_lib} COMPONENT Libraries)
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
+            DESTINATION ${destination_lib} COMPONENT Libraries)
     endif()
 endif()
diff --git a/Wrap/swig/libBornAgainFit.i b/Wrap/swig/libBornAgainFit.i
index ffc854e8047..9dc8fed0cdf 100644
--- a/Wrap/swig/libBornAgainFit.i
+++ b/Wrap/swig/libBornAgainFit.i
@@ -31,7 +31,8 @@
 %include "ignores.i"
 %include "renameFit.i"
 %include "directors.i"
-%include "../../auto/Wrap/doxygen_fit.i"
+
+%include "auto/Wrap/doxygen_fit.i"
 
 %template(vdouble1d_t) std::vector<double>;
 %template(vdouble2d_t) std::vector< std::vector<double> >;
@@ -56,7 +57,7 @@ import_array();
 #define BORNAGAIN_PYTHON
 #endif
 
-%import "WinDllMacros.h"
+%import "Wrap/WinDllMacros.h"
 
 %{
 #include "Fit/Tools/RealLimits.h"
@@ -75,16 +76,15 @@ import_array();
 // The following goes verbatim from libBornAgainFit.i to libBornAgainFit_wrap.cxx.
 // Note that the order matters, as base classes must be included before derived classes.
 
-%include "RealLimits.h"
-%include "AttLimits.h"
-%include "Parameter.h"
-%include "Parameters.h"
-%include "IMinimizer.h"
-%include "MinimizerCatalogue.h"
-%include "MinimizerFactory.h"
-
-%include "PyCallback.h"
-%include "MinimizerResult.h"
-%include "Minimizer.h"
+%include "Fit/Tools/RealLimits.h"
+%include "Fit/Tools/AttLimits.h"
+%include "Fit/Kernel/Parameter.h"
+%include "Fit/Kernel/Parameters.h"
+%include "Fit/Kernel/PyCallback.h"
+%include "Fit/Kernel/MinimizerResult.h"
+%include "Fit/Kernel/Minimizer.h"
+%include "Fit/Minimizer/IMinimizer.h"
+%include "Fit/Minimizer/MinimizerCatalogue.h"
+%include "Fit/Minimizer/MinimizerFactory.h"
 
 %include "extendFit.i"
diff --git a/auto/Wrap/libBornAgainFit.py b/auto/Wrap/libBornAgainFit.py
index 804284749c3..47fefc9f14c 100644
--- a/auto/Wrap/libBornAgainFit.py
+++ b/auto/Wrap/libBornAgainFit.py
@@ -1837,241 +1837,6 @@ class Parameters(object):
 # Register Parameters in _libBornAgainFit:
 _libBornAgainFit.Parameters_swigregister(Parameters)
 
-class IMinimizer(object):
-    r"""
-
-
-    Pure virtual interface for all kind minimizers.
-
-    C++ includes: IMinimizer.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
-
-    def minimizerName(self):
-        r"""
-        minimizerName(IMinimizer self) -> std::string
-        virtual std::string IMinimizer::minimizerName() const =0
-
-        return name of the minimizer 
-
-        """
-        return _libBornAgainFit.IMinimizer_minimizerName(self)
-
-    def algorithmName(self):
-        r"""
-        algorithmName(IMinimizer self) -> std::string
-        virtual std::string IMinimizer::algorithmName() const =0
-
-        return name of the minimization algorithm 
-
-        """
-        return _libBornAgainFit.IMinimizer_algorithmName(self)
-
-    def minimize_scalar(self, arg2, arg3):
-        r"""
-        minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult
-        Fit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, Fit::Parameters)
-
-        run minimization 
-
-        """
-        return _libBornAgainFit.IMinimizer_minimize_scalar(self, arg2, arg3)
-
-    def minimize_residual(self, arg2, arg3):
-        r"""
-        minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult
-        Fit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, Fit::Parameters)
-
-        """
-        return _libBornAgainFit.IMinimizer_minimize_residual(self, arg2, arg3)
-
-    def clear(self):
-        r"""
-        clear(IMinimizer self)
-        virtual void IMinimizer::clear()
-
-        clear resources (parameters) for consecutives minimizations 
-
-        """
-        return _libBornAgainFit.IMinimizer_clear(self)
-
-    def minValue(self):
-        r"""
-        minValue(IMinimizer self) -> double
-        double IMinimizer::minValue() const
-
-        Returns minimum function value. 
-
-        """
-        return _libBornAgainFit.IMinimizer_minValue(self)
-
-    def setOptions(self, options):
-        r"""
-        setOptions(IMinimizer self, std::string const & options)
-        void IMinimizer::setOptions(const std::string &options)
-
-        Sets option string to the minimizer. 
-
-        """
-        return _libBornAgainFit.IMinimizer_setOptions(self, options)
-
-# Register IMinimizer in _libBornAgainFit:
-_libBornAgainFit.IMinimizer_swigregister(IMinimizer)
-
-class MinimizerCatalogue(object):
-    r"""
-
-
-    Hard-coded information about all minimizers available.
-
-    C++ includes: MinimizerCatalogue.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self):
-        r"""
-        __init__(MinimizerCatalogue self) -> MinimizerCatalogue
-        MinimizerCatalogue::MinimizerCatalogue()
-
-        """
-        _libBornAgainFit.MinimizerCatalogue_swiginit(self, _libBornAgainFit.new_MinimizerCatalogue())
-
-    def toString(self):
-        r"""
-        toString(MinimizerCatalogue self) -> std::string
-        std::string MinimizerCatalogue::toString() const
-
-        Returns multiline string representing catalogue content. 
-
-        """
-        return _libBornAgainFit.MinimizerCatalogue_toString(self)
-
-    def minimizerNames(self):
-        r"""
-        minimizerNames(MinimizerCatalogue self) -> vector_string_t
-        std::vector< std::string > MinimizerCatalogue::minimizerNames() const
-
-        """
-        return _libBornAgainFit.MinimizerCatalogue_minimizerNames(self)
-
-    def algorithmNames(self, minimizerName):
-        r"""
-        algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
-        std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const
-
-        Returns list of algorithms defined for the minimizer with a given name. 
-
-        """
-        return _libBornAgainFit.MinimizerCatalogue_algorithmNames(self, minimizerName)
-
-    def algorithmDescriptions(self, minimizerName):
-        r"""
-        algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
-        std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const
-
-        Returns list of algorithm's descriptions for the minimizer with a given name . 
-
-        """
-        return _libBornAgainFit.MinimizerCatalogue_algorithmDescriptions(self, minimizerName)
-
-    def minimizerInfo(self, minimizerName):
-        r"""
-        minimizerInfo(MinimizerCatalogue self, std::string const & minimizerName) -> MinimizerInfo const &
-        const MinimizerInfo & MinimizerCatalogue::minimizerInfo(const std::string &minimizerName) const
-
-        Returns info for minimizer with given name. 
-
-        """
-        return _libBornAgainFit.MinimizerCatalogue_minimizerInfo(self, minimizerName)
-    __swig_destroy__ = _libBornAgainFit.delete_MinimizerCatalogue
-
-# Register MinimizerCatalogue in _libBornAgainFit:
-_libBornAgainFit.MinimizerCatalogue_swigregister(MinimizerCatalogue)
-
-class MinimizerFactory(object):
-    r"""
-
-
-    Factory to create minimizers.
-
-    C++ includes: MinimizerFactory.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    @staticmethod
-    def createMinimizer(*args):
-        r"""createMinimizer(std::string const & minimizerName, std::string const & algorithmType="", std::string const & optionString="") -> IMinimizer"""
-        return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
-
-    @staticmethod
-    def printCatalogue():
-        r"""printCatalogue()"""
-        return _libBornAgainFit.MinimizerFactory_printCatalogue()
-
-    @staticmethod
-    def catalogueToString():
-        r"""catalogueToString() -> std::string"""
-        return _libBornAgainFit.MinimizerFactory_catalogueToString()
-
-    @staticmethod
-    def catalogueDetailsToString():
-        r"""catalogueDetailsToString() -> std::string"""
-        return _libBornAgainFit.MinimizerFactory_catalogueDetailsToString()
-
-    @staticmethod
-    def catalogue():
-        r"""catalogue() -> MinimizerCatalogue"""
-        return _libBornAgainFit.MinimizerFactory_catalogue()
-
-    def __init__(self):
-        r"""
-        __init__(MinimizerFactory self) -> MinimizerFactory
-
-
-        Factory to create minimizers.
-
-        C++ includes: MinimizerFactory.h
-
-        """
-        _libBornAgainFit.MinimizerFactory_swiginit(self, _libBornAgainFit.new_MinimizerFactory())
-    __swig_destroy__ = _libBornAgainFit.delete_MinimizerFactory
-
-# Register MinimizerFactory in _libBornAgainFit:
-_libBornAgainFit.MinimizerFactory_swigregister(MinimizerFactory)
-
-def MinimizerFactory_createMinimizer(*args):
-    r"""MinimizerFactory_createMinimizer(std::string const & minimizerName, std::string const & algorithmType="", std::string const & optionString="") -> IMinimizer"""
-    return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
-
-def MinimizerFactory_printCatalogue():
-    r"""MinimizerFactory_printCatalogue()"""
-    return _libBornAgainFit.MinimizerFactory_printCatalogue()
-
-def MinimizerFactory_catalogueToString():
-    r"""MinimizerFactory_catalogueToString() -> std::string"""
-    return _libBornAgainFit.MinimizerFactory_catalogueToString()
-
-def MinimizerFactory_catalogueDetailsToString():
-    r"""MinimizerFactory_catalogueDetailsToString() -> std::string"""
-    return _libBornAgainFit.MinimizerFactory_catalogueDetailsToString()
-
-def MinimizerFactory_catalogue():
-    r"""MinimizerFactory_catalogue() -> MinimizerCatalogue"""
-    return _libBornAgainFit.MinimizerFactory_catalogue()
-
 class PyCallback(object):
     r"""
 
@@ -2316,6 +2081,241 @@ class Minimizer(object):
 # Register Minimizer in _libBornAgainFit:
 _libBornAgainFit.Minimizer_swigregister(Minimizer)
 
+class IMinimizer(object):
+    r"""
+
+
+    Pure virtual interface for all kind minimizers.
+
+    C++ includes: IMinimizer.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
+
+    def minimizerName(self):
+        r"""
+        minimizerName(IMinimizer self) -> std::string
+        virtual std::string IMinimizer::minimizerName() const =0
+
+        return name of the minimizer 
+
+        """
+        return _libBornAgainFit.IMinimizer_minimizerName(self)
+
+    def algorithmName(self):
+        r"""
+        algorithmName(IMinimizer self) -> std::string
+        virtual std::string IMinimizer::algorithmName() const =0
+
+        return name of the minimization algorithm 
+
+        """
+        return _libBornAgainFit.IMinimizer_algorithmName(self)
+
+    def minimize_scalar(self, arg2, arg3):
+        r"""
+        minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult
+        Fit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, Fit::Parameters)
+
+        run minimization 
+
+        """
+        return _libBornAgainFit.IMinimizer_minimize_scalar(self, arg2, arg3)
+
+    def minimize_residual(self, arg2, arg3):
+        r"""
+        minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult
+        Fit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, Fit::Parameters)
+
+        """
+        return _libBornAgainFit.IMinimizer_minimize_residual(self, arg2, arg3)
+
+    def clear(self):
+        r"""
+        clear(IMinimizer self)
+        virtual void IMinimizer::clear()
+
+        clear resources (parameters) for consecutives minimizations 
+
+        """
+        return _libBornAgainFit.IMinimizer_clear(self)
+
+    def minValue(self):
+        r"""
+        minValue(IMinimizer self) -> double
+        double IMinimizer::minValue() const
+
+        Returns minimum function value. 
+
+        """
+        return _libBornAgainFit.IMinimizer_minValue(self)
+
+    def setOptions(self, options):
+        r"""
+        setOptions(IMinimizer self, std::string const & options)
+        void IMinimizer::setOptions(const std::string &options)
+
+        Sets option string to the minimizer. 
+
+        """
+        return _libBornAgainFit.IMinimizer_setOptions(self, options)
+
+# Register IMinimizer in _libBornAgainFit:
+_libBornAgainFit.IMinimizer_swigregister(IMinimizer)
+
+class MinimizerCatalogue(object):
+    r"""
+
+
+    Hard-coded information about all minimizers available.
+
+    C++ includes: MinimizerCatalogue.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        r"""
+        __init__(MinimizerCatalogue self) -> MinimizerCatalogue
+        MinimizerCatalogue::MinimizerCatalogue()
+
+        """
+        _libBornAgainFit.MinimizerCatalogue_swiginit(self, _libBornAgainFit.new_MinimizerCatalogue())
+
+    def toString(self):
+        r"""
+        toString(MinimizerCatalogue self) -> std::string
+        std::string MinimizerCatalogue::toString() const
+
+        Returns multiline string representing catalogue content. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_toString(self)
+
+    def minimizerNames(self):
+        r"""
+        minimizerNames(MinimizerCatalogue self) -> vector_string_t
+        std::vector< std::string > MinimizerCatalogue::minimizerNames() const
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_minimizerNames(self)
+
+    def algorithmNames(self, minimizerName):
+        r"""
+        algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
+        std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const
+
+        Returns list of algorithms defined for the minimizer with a given name. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_algorithmNames(self, minimizerName)
+
+    def algorithmDescriptions(self, minimizerName):
+        r"""
+        algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
+        std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const
+
+        Returns list of algorithm's descriptions for the minimizer with a given name . 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_algorithmDescriptions(self, minimizerName)
+
+    def minimizerInfo(self, minimizerName):
+        r"""
+        minimizerInfo(MinimizerCatalogue self, std::string const & minimizerName) -> MinimizerInfo const &
+        const MinimizerInfo & MinimizerCatalogue::minimizerInfo(const std::string &minimizerName) const
+
+        Returns info for minimizer with given name. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_minimizerInfo(self, minimizerName)
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerCatalogue
+
+# Register MinimizerCatalogue in _libBornAgainFit:
+_libBornAgainFit.MinimizerCatalogue_swigregister(MinimizerCatalogue)
+
+class MinimizerFactory(object):
+    r"""
+
+
+    Factory to create minimizers.
+
+    C++ includes: MinimizerFactory.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    @staticmethod
+    def createMinimizer(*args):
+        r"""createMinimizer(std::string const & minimizerName, std::string const & algorithmType="", std::string const & optionString="") -> IMinimizer"""
+        return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
+    @staticmethod
+    def printCatalogue():
+        r"""printCatalogue()"""
+        return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+    @staticmethod
+    def catalogueToString():
+        r"""catalogueToString() -> std::string"""
+        return _libBornAgainFit.MinimizerFactory_catalogueToString()
+
+    @staticmethod
+    def catalogueDetailsToString():
+        r"""catalogueDetailsToString() -> std::string"""
+        return _libBornAgainFit.MinimizerFactory_catalogueDetailsToString()
+
+    @staticmethod
+    def catalogue():
+        r"""catalogue() -> MinimizerCatalogue"""
+        return _libBornAgainFit.MinimizerFactory_catalogue()
+
+    def __init__(self):
+        r"""
+        __init__(MinimizerFactory self) -> MinimizerFactory
+
+
+        Factory to create minimizers.
+
+        C++ includes: MinimizerFactory.h
+
+        """
+        _libBornAgainFit.MinimizerFactory_swiginit(self, _libBornAgainFit.new_MinimizerFactory())
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerFactory
+
+# Register MinimizerFactory in _libBornAgainFit:
+_libBornAgainFit.MinimizerFactory_swigregister(MinimizerFactory)
+
+def MinimizerFactory_createMinimizer(*args):
+    r"""MinimizerFactory_createMinimizer(std::string const & minimizerName, std::string const & algorithmType="", std::string const & optionString="") -> IMinimizer"""
+    return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
+def MinimizerFactory_printCatalogue():
+    r"""MinimizerFactory_printCatalogue()"""
+    return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+def MinimizerFactory_catalogueToString():
+    r"""MinimizerFactory_catalogueToString() -> std::string"""
+    return _libBornAgainFit.MinimizerFactory_catalogueToString()
+
+def MinimizerFactory_catalogueDetailsToString():
+    r"""MinimizerFactory_catalogueDetailsToString() -> std::string"""
+    return _libBornAgainFit.MinimizerFactory_catalogueDetailsToString()
+
+def MinimizerFactory_catalogue():
+    r"""MinimizerFactory_catalogue() -> MinimizerCatalogue"""
+    return _libBornAgainFit.MinimizerFactory_catalogue()
+
 
 class ParametersIterator(object):
 
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index b271c28638a..9355e2dffbc 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -20076,197 +20076,258 @@ SWIGINTERN PyObject *Parameters_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObjec
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_PyCallback__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyCallback::CallbackType arg2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyCallback *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMinimizer" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  arg1 = swig_obj[0];
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_PyCallback" "', argument " "2"" of type '" "PyCallback::CallbackType""'");
+  } 
+  arg2 = static_cast< PyCallback::CallbackType >(val2);
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (PyCallback *)new SwigDirector_PyCallback(arg1,arg2); 
+  } else {
+    result = (PyCallback *)new PyCallback(arg2); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PyCallback, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_PyCallback__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyCallback *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  arg1 = swig_obj[0];
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (PyCallback *)new SwigDirector_PyCallback(arg1); 
+  } else {
+    result = (PyCallback *)new PyCallback(); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PyCallback, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PyCallback(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_PyCallback", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      return _wrap_new_PyCallback__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_PyCallback__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_PyCallback'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    PyCallback::PyCallback(PyCallback::CallbackType)\n"
+    "    PyCallback::PyCallback(PyObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_PyCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyCallback *arg1 = (PyCallback *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::string result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PyCallback" "', argument " "1"" of type '" "PyCallback *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->minimizerName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< PyCallback * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_algorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_PyCallback_callback_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  PyCallback *arg1 = (PyCallback *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::string result;
+  PyCallback::CallbackType result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_algorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_callback_type" "', argument " "1"" of type '" "PyCallback const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->algorithmName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< PyCallback * >(argp1);
+  result = (PyCallback::CallbackType)((PyCallback const *)arg1)->callback_type();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimize_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_PyCallback_call_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  fcn_scalar_t arg2 ;
-  Fit::Parameters arg3 ;
+  PyCallback *arg1 = (PyCallback *) 0 ;
+  Fit::Parameters arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 ;
   int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  Fit::MinimizerResult result;
+  PyObject *swig_obj[2] ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_minimize_scalar", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "PyCallback_call_scalar", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_scalar" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_call_scalar" "', argument " "1"" of type '" "PyCallback *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  arg1 = reinterpret_cast< PyCallback * >(argp1);
   {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_fcn_scalar_t,  0  | 0);
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_minimize_scalar" "', argument " "2"" of type '" "fcn_scalar_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "Fit::Parameters""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "2"" of type '" "fcn_scalar_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "Fit::Parameters""'");
     } else {
-      fcn_scalar_t * temp = reinterpret_cast< fcn_scalar_t * >(argp2);
+      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp2);
       arg2 = *temp;
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "Fit::Parameters""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "Fit::Parameters""'");
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (double)(arg1)->PyCallback::call_scalar(arg2);
     } else {
-      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
+      result = (double)(arg1)->call_scalar(arg2);
     }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
   }
-  result = (arg1)->minimize_scalar(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimize_residual(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_PyCallback_call_residuals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  fcn_residual_t arg2 ;
-  Fit::Parameters arg3 ;
+  PyCallback *arg1 = (PyCallback *) 0 ;
+  Fit::Parameters arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 ;
   int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  Fit::MinimizerResult result;
+  PyObject *swig_obj[2] ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  std::vector< double,std::allocator< double > > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_minimize_residual", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "PyCallback_call_residuals", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_residual" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_call_residuals" "', argument " "1"" of type '" "PyCallback *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  arg1 = reinterpret_cast< PyCallback * >(argp1);
   {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_fcn_residual_t,  0  | 0);
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_minimize_residual" "', argument " "2"" of type '" "fcn_residual_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "Fit::Parameters""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "2"" of type '" "fcn_residual_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "Fit::Parameters""'");
     } else {
-      fcn_residual_t * temp = reinterpret_cast< fcn_residual_t * >(argp2);
+      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp2);
       arg2 = *temp;
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "Fit::Parameters""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "Fit::Parameters""'");
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (arg1)->PyCallback::call_residuals(arg2);
     } else {
-      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
+      result = (arg1)->call_residuals(arg2);
     }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
   }
-  result = (arg1)->minimize_residual(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_disown_PyCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  PyCallback *arg1 = (PyCallback *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_PyCallback" "', argument " "1"" of type '" "PyCallback *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  (arg1)->clear();
+  arg1 = reinterpret_cast< PyCallback * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -20274,197 +20335,188 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *PyCallback_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_PyCallback, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *PyCallback_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
+  Fit::MinimizerResult *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (double)((IMinimizer const *)arg1)->minValue();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerResult", 0, 0, 0)) SWIG_fail;
+  result = (Fit::MinimizerResult *)new Fit::MinimizerResult();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  std::string *arg2 = 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  Fit::Parameters *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_setOptions", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setParameters", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setParameters" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "Fit::Parameters const &""'"); 
   }
-  (arg1)->setOptions((std::string const &)*arg2);
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "Fit::Parameters const &""'"); 
+  }
+  arg2 = reinterpret_cast< Fit::Parameters * >(argp2);
+  (arg1)->setParameters((Fit::Parameters const &)*arg2);
   resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IMinimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IMinimizer, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_new_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_parameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *result = 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  Fit::Parameters result;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerCatalogue", 0, 0, 0)) SWIG_fail;
-  result = (MinimizerCatalogue *)new MinimizerCatalogue();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_NEW |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_parameters" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  result = ((Fit::MinimizerResult const *)arg1)->parameters();
+  resultobj = SWIG_NewPointerObj((new Fit::Parameters(static_cast< const Fit::Parameters& >(result))), SWIGTYPE_p_Fit__Parameters, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalogue_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::string result;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setMinValue", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_toString" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setMinValue" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
-  result = ((MinimizerCatalogue const *)arg1)->toString();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setMinValue" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setMinValue(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalogue_minimizerNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::vector< std::string,std::allocator< std::string > > result;
+  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_minimizerNames" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_minValue" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
-  result = ((MinimizerCatalogue const *)arg1)->minimizerNames();
-  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  result = (double)((Fit::MinimizerResult const *)arg1)->minValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
-  std::string *arg2 = 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject *swig_obj[2] ;
-  std::vector< std::string,std::allocator< std::string > > result;
+  PyObject *swig_obj[1] ;
+  std::string result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_algorithmNames", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_toString" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
   }
-  result = ((MinimizerCatalogue const *)arg1)->algorithmNames((std::string const &)*arg2);
-  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  result = ((Fit::MinimizerResult const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmDescriptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setReport(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
   std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
-  std::vector< std::string,std::allocator< std::string > > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_algorithmDescriptions", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setReport", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setReport" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  result = ((MinimizerCatalogue const *)arg1)->algorithmDescriptions((std::string const &)*arg2);
-  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  (arg1)->setReport((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
@@ -20473,58 +20525,57 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalogue_minimizerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setDuration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
-  std::string *arg2 = 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  MinimizerInfo *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_minimizerInfo", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setDuration", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setDuration" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
   }
-  result = (MinimizerInfo *) &((MinimizerCatalogue const *)arg1)->minimizerInfo((std::string const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerInfo, 0 |  0 );
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setDuration" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setDuration(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  int arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfCalls", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerCatalogue" "', argument " "1"" of type '" "MinimizerCatalogue *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfCalls(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -20532,47 +20583,129 @@ fail:
 }
 
 
-SWIGINTERN PyObject *MinimizerCatalogue_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerCatalogue, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *MinimizerCatalogue_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfGradientCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfGradientCalls", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfGradientCalls(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerResult" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MinimizerResult_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Fit__MinimizerResult, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *MinimizerResult_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
+  Fit::Minimizer *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_Minimizer", 0, 0, 0)) SWIG_fail;
+  result = (Fit::Minimizer *)new Fit::Minimizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Fit__Minimizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Minimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
   std::string *arg2 = 0 ;
   std::string *arg3 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
+  std::string *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
   int res3 = SWIG_OLDOBJ ;
-  IMinimizer *result = 0 ;
+  int res4 = SWIG_OLDOBJ ;
   
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  {
-    std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    arg1 = ptr;
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
   }
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
@@ -20580,232 +20713,144 @@ SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SW
     std::string *ptr = (std::string *)0;
     res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     arg3 = ptr;
   }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Minimizer_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
   std::string *arg2 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  IMinimizer *result = 0 ;
+  int res3 = SWIG_OLDOBJ ;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
   {
     std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
-    arg1 = ptr;
+    arg2 = ptr;
   }
   {
     std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
-    arg2 = ptr;
+    arg3 = ptr;
   }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
-  IMinimizer *result = 0 ;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
   {
     std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
-    arg1 = ptr;
+    arg2 = ptr;
   }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
+  (arg1)->setMinimizer((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  IMinimizer *arg2 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "MinimizerFactory_createMinimizer", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_MinimizerFactory_createMinimizer__SWIG_2(self, argc, argv);
-    }
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
   }
-  if (argc == 2) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_MinimizerFactory_createMinimizer__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_MinimizerFactory_createMinimizer__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'MinimizerFactory_createMinimizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &,std::string const &)\n"
-    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &)\n"
-    "    MinimizerFactory::createMinimizer(std::string const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_printCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_printCatalogue", 0, 0, 0)) SWIG_fail;
-  MinimizerFactory::printCatalogue();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogueToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::string result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogueToString", 0, 0, 0)) SWIG_fail;
-  result = MinimizerFactory::catalogueToString();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogueDetailsToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::string result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogueDetailsToString", 0, 0, 0)) SWIG_fail;
-  result = MinimizerFactory::catalogueDetailsToString();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerCatalogue *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogue", 0, 0, 0)) SWIG_fail;
-  result = (MinimizerCatalogue *) &MinimizerFactory::catalogue();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerFactory *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerFactory", 0, 0, 0)) SWIG_fail;
-  result = (MinimizerFactory *)new MinimizerFactory();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerFactory *arg1 = (MinimizerFactory *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
-  delete arg1;
+  arg2 = reinterpret_cast< IMinimizer * >(argp2);
+  (arg1)->setMinimizer(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -20813,377 +20858,161 @@ fail:
 }
 
 
-SWIGINTERN PyObject *MinimizerFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerFactory, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *MinimizerFactory_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_new_PyCallback__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  PyCallback::CallbackType arg2 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  PyCallback *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  arg1 = swig_obj[0];
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_PyCallback" "', argument " "2"" of type '" "PyCallback::CallbackType""'");
-  } 
-  arg2 = static_cast< PyCallback::CallbackType >(val2);
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (PyCallback *)new SwigDirector_PyCallback(arg1,arg2); 
-  } else {
-    result = (PyCallback *)new PyCallback(arg2); 
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PyCallback, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PyCallback__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  PyCallback *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  arg1 = swig_obj[0];
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (PyCallback *)new SwigDirector_PyCallback(arg1); 
-  } else {
-    result = (PyCallback *)new PyCallback(); 
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PyCallback, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PyCallback(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[3] = {
+  PyObject *argv[5] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_PyCallback", 0, 2, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "Minimizer_setMinimizer", 0, 4, argv))) SWIG_fail;
   --argc;
-  if (argc == 1) {
+  if (argc == 2) {
     int _v;
-    _v = (argv[0] != 0);
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_new_PyCallback__SWIG_1(self, argc, argv);
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IMinimizer, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_Minimizer_setMinimizer__SWIG_3(self, argc, argv);
+      }
     }
   }
   if (argc == 2) {
     int _v;
-    _v = (argv[0] != 0);
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    _v = SWIG_CheckState(res);
     if (_v) {
-      {
-        int res = SWIG_AsVal_int(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_new_PyCallback__SWIG_0(self, argc, argv);
+        return _wrap_Minimizer_setMinimizer__SWIG_2(self, argc, argv);
       }
     }
   }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_PyCallback'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    PyCallback::PyCallback(PyCallback::CallbackType)\n"
-    "    PyCallback::PyCallback(PyObject *)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_PyCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PyCallback" "', argument " "1"" of type '" "PyCallback *""'"); 
-  }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PyCallback_callback_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  PyCallback::CallbackType result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_callback_type" "', argument " "1"" of type '" "PyCallback const *""'"); 
-  }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  result = (PyCallback::CallbackType)((PyCallback const *)arg1)->callback_type();
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PyCallback_call_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  Fit::Parameters arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PyCallback_call_scalar", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_call_scalar" "', argument " "1"" of type '" "PyCallback *""'"); 
-  }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "Fit::Parameters""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "Fit::Parameters""'");
-    } else {
-      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)(arg1)->PyCallback::call_scalar(arg2);
-    } else {
-      result = (double)(arg1)->call_scalar(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PyCallback_call_residuals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  Fit::Parameters arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  std::vector< double,std::allocator< double > > result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PyCallback_call_residuals", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PyCallback_call_residuals" "', argument " "1"" of type '" "PyCallback *""'"); 
-  }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "Fit::Parameters""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "Fit::Parameters""'");
-    } else {
-      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (arg1)->PyCallback::call_residuals(arg2);
-    } else {
-      result = (arg1)->call_residuals(arg2);
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_Minimizer_setMinimizer__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_Minimizer_setMinimizer__SWIG_0(self, argc, argv);
+          }
+        }
+      }
     }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
   }
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_disown_PyCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_PyCallback" "', argument " "1"" of type '" "PyCallback *""'"); 
-  }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
-  }
-  
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *PyCallback_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_PyCallback, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *PyCallback_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_new_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Fit::MinimizerResult *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerResult", 0, 0, 0)) SWIG_fail;
-  result = (Fit::MinimizerResult *)new Fit::MinimizerResult();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_NEW |  0 );
-  return resultobj;
 fail:
-  return NULL;
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Minimizer_setMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Fit::Minimizer::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    Fit::Minimizer::setMinimizer(std::string const &,std::string const &)\n"
+    "    Fit::Minimizer::setMinimizer(std::string const &)\n"
+    "    Fit::Minimizer::setMinimizer(IMinimizer *)\n");
+  return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_minimize_cpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  Fit::Parameters *arg2 = 0 ;
+  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  PyCallback *arg2 = 0 ;
+  Fit::Parameters *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  PyObject *swig_obj[2] ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  Fit::MinimizerResult result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setParameters", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Minimizer_minimize_cpp", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setParameters" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_minimize_cpp" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Fit__Parameters,  0  | 0);
+  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_PyCallback,  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "Fit::Parameters const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_minimize_cpp" "', argument " "2"" of type '" "PyCallback &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "Fit::Parameters const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "2"" of type '" "PyCallback &""'"); 
   }
-  arg2 = reinterpret_cast< Fit::Parameters * >(argp2);
-  (arg1)->setParameters((Fit::Parameters const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  arg2 = reinterpret_cast< PyCallback * >(argp2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "Fit::Parameters const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "Fit::Parameters const &""'"); 
+  }
+  arg3 = reinterpret_cast< Fit::Parameters * >(argp3);
+  result = (arg1)->minimize(*arg2,(Fit::Parameters const &)*arg3);
+  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_parameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  Fit::Parameters result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_parameters" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
-  }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  result = ((Fit::MinimizerResult const *)arg1)->parameters();
-  resultobj = SWIG_NewPointerObj((new Fit::Parameters(static_cast< const Fit::Parameters& >(result))), SWIGTYPE_p_Fit__Parameters, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
+SWIGINTERN PyObject *Minimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Fit__Minimizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
 }
 
+SWIGINTERN PyObject *Minimizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  double arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  PyObject *swig_obj[1] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setMinValue", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setMinValue" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMinimizer" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setMinValue" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setMinValue(arg2);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -21191,32 +21020,32 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  double result;
+  std::string result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_minValue" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  result = (double)((Fit::MinimizerResult const *)arg1)->minValue();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->minimizerName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_algorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -21224,12 +21053,12 @@ SWIGINTERN PyObject *_wrap_MinimizerResult_toString(PyObject *SWIGUNUSEDPARM(sel
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_toString" "', argument " "1"" of type '" "Fit::MinimizerResult const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_algorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  result = ((Fit::MinimizerResult const *)arg1)->toString();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->algorithmName();
   resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
@@ -21237,93 +21066,129 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setReport(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  std::string *arg2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  fcn_scalar_t arg2 ;
+  Fit::Parameters arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject *swig_obj[2] ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  Fit::MinimizerResult result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setReport", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_minimize_scalar", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setReport" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_scalar" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
   {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_fcn_scalar_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_minimize_scalar" "', argument " "2"" of type '" "fcn_scalar_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "2"" of type '" "fcn_scalar_t""'");
+    } else {
+      fcn_scalar_t * temp = reinterpret_cast< fcn_scalar_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
     }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
+  }
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "Fit::Parameters""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "Fit::Parameters""'");
+    } else {
+      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
     }
-    arg2 = ptr;
   }
-  (arg1)->setReport((std::string const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  result = (arg1)->minimize_scalar(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setDuration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize_residual(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  double arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  fcn_residual_t arg2 ;
+  Fit::Parameters arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  Fit::MinimizerResult result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setDuration", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_minimize_residual", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setDuration" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_residual" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setDuration" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setDuration(arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_fcn_residual_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_minimize_residual" "', argument " "2"" of type '" "fcn_residual_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "2"" of type '" "fcn_residual_t""'");
+    } else {
+      fcn_residual_t * temp = reinterpret_cast< fcn_residual_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "Fit::Parameters""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "Fit::Parameters""'");
+    } else {
+      Fit::Parameters * temp = reinterpret_cast< Fit::Parameters * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (arg1)->minimize_residual(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  int arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  PyObject *swig_obj[1] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfCalls", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  (arg1)->setNumberOfCalls(arg2);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->clear();
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -21331,192 +21196,305 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfGradientCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
-  int arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  PyObject *swig_obj[1] ;
+  double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfGradientCalls", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  (arg1)->setNumberOfGradientCalls(arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (double)((IMinimizer const *)arg1)->minValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::MinimizerResult *arg1 = (Fit::MinimizerResult *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IMinimizer_setOptions", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerResult" "', argument " "1"" of type '" "Fit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::MinimizerResult * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setOptions((std::string const &)*arg2);
   resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *MinimizerResult_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IMinimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_Fit__MinimizerResult, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IMinimizer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *MinimizerResult_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
+SWIGINTERN PyObject *_wrap_new_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerCatalogue", 0, 0, 0)) SWIG_fail;
+  result = (MinimizerCatalogue *)new MinimizerCatalogue();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
 }
 
-SWIGINTERN PyObject *_wrap_new_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *result = 0 ;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string result;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_Minimizer", 0, 0, 0)) SWIG_fail;
-  result = (Fit::Minimizer *)new Fit::Minimizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Fit__Minimizer, SWIG_POINTER_NEW |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_toString" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  result = ((MinimizerCatalogue const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_minimizerNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  std::vector< std::string,std::allocator< std::string > > result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Minimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_minimizerNames" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  result = ((MinimizerCatalogue const *)arg1)->minimizerNames();
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
   std::string *arg2 = 0 ;
-  std::string *arg3 = 0 ;
-  std::string *arg4 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  int res3 = SWIG_OLDOBJ ;
-  int res4 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::vector< std::string,std::allocator< std::string > > result;
   
-  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_algorithmNames", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
   }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
+  result = ((MinimizerCatalogue const *)arg1)->algorithmNames((std::string const &)*arg2);
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmDescriptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::vector< std::string,std::allocator< std::string > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_algorithmDescriptions", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
   {
     std::string *ptr = (std::string *)0;
-    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
     }
-    arg3 = ptr;
+    arg2 = ptr;
+  }
+  result = ((MinimizerCatalogue const *)arg1)->algorithmDescriptions((std::string const &)*arg2);
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_minimizerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  MinimizerInfo *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalogue_minimizerInfo", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
   }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
   {
     std::string *ptr = (std::string *)0;
-    res4 = SWIG_AsPtr_std_string(swig_obj[3], &ptr);
-    if (!SWIG_IsOK(res4)) {
-      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Minimizer_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
     }
-    arg4 = ptr;
+    arg2 = ptr;
   }
-  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3,(std::string const &)*arg4);
-  resultobj = SWIG_Py_Void();
+  result = (MinimizerInfo *) &((MinimizerCatalogue const *)arg1)->minimizerInfo((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerInfo, 0 |  0 );
   if (SWIG_IsNewObj(res2)) delete arg2;
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  if (SWIG_IsNewObj(res4)) delete arg4;
   return resultobj;
 fail:
   if (SWIG_IsNewObj(res2)) delete arg2;
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  if (SWIG_IsNewObj(res4)) delete arg4;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_delete_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerCatalogue" "', argument " "1"" of type '" "MinimizerCatalogue *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MinimizerCatalogue_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerCatalogue, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *MinimizerCatalogue_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  std::string *arg1 = 0 ;
   std::string *arg2 = 0 ;
   std::string *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
   int res3 = SWIG_OLDOBJ ;
+  IMinimizer *result = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
   }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
@@ -21524,144 +21502,129 @@ SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPA
     std::string *ptr = (std::string *)0;
     res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     arg3 = ptr;
   }
-  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3);
-  resultobj = SWIG_Py_Void();
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
+  std::string *arg1 = 0 ;
   std::string *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
+  IMinimizer *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
   }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  (arg1)->setMinimizer((std::string const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
-  IMinimizer *arg2 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  IMinimizer *result = 0 ;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "IMinimizer *""'"); 
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
   }
-  arg2 = reinterpret_cast< IMinimizer * >(argp2);
-  (arg1)->setMinimizer(arg2);
-  resultobj = SWIG_Py_Void();
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[5] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "Minimizer_setMinimizer", 0, 4, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "MinimizerFactory_createMinimizer", 0, 3, argv))) SWIG_fail;
   --argc;
-  if (argc == 2) {
+  if (argc == 1) {
     int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
     _v = SWIG_CheckState(res);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IMinimizer, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_Minimizer_setMinimizer__SWIG_3(self, argc, argv);
-      }
+      return _wrap_MinimizerFactory_createMinimizer__SWIG_2(self, argc, argv);
     }
   }
   if (argc == 2) {
     int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_Minimizer_setMinimizer__SWIG_2(self, argc, argv);
+        return _wrap_MinimizerFactory_createMinimizer__SWIG_1(self, argc, argv);
       }
     }
   }
   if (argc == 3) {
     int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_Minimizer_setMinimizer__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 4) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Fit__Minimizer, 0);
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
@@ -21670,79 +21633,116 @@ SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer(PyObject *self, PyObject *args
         int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
-          _v = SWIG_CheckState(res);
-          if (_v) {
-            return _wrap_Minimizer_setMinimizer__SWIG_0(self, argc, argv);
-          }
+          return _wrap_MinimizerFactory_createMinimizer__SWIG_0(self, argc, argv);
         }
       }
     }
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Minimizer_setMinimizer'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'MinimizerFactory_createMinimizer'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    Fit::Minimizer::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
-    "    Fit::Minimizer::setMinimizer(std::string const &,std::string const &)\n"
-    "    Fit::Minimizer::setMinimizer(std::string const &)\n"
-    "    Fit::Minimizer::setMinimizer(IMinimizer *)\n");
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &)\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_minimize_cpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_printCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Fit::Minimizer *arg1 = (Fit::Minimizer *) 0 ;
-  PyCallback *arg2 = 0 ;
-  Fit::Parameters *arg3 = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_printCatalogue", 0, 0, 0)) SWIG_fail;
+  MinimizerFactory::printCatalogue();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogueToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogueToString", 0, 0, 0)) SWIG_fail;
+  result = MinimizerFactory::catalogueToString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogueDetailsToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogueDetailsToString", 0, 0, 0)) SWIG_fail;
+  result = MinimizerFactory::catalogueDetailsToString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerFactory_catalogue", 0, 0, 0)) SWIG_fail;
+  result = (MinimizerCatalogue *) &MinimizerFactory::catalogue();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerFactory *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerFactory", 0, 0, 0)) SWIG_fail;
+  result = (MinimizerFactory *)new MinimizerFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerFactory *arg1 = (MinimizerFactory *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  Fit::MinimizerResult result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "Minimizer_minimize_cpp", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Fit__Minimizer, 0 |  0 );
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_minimize_cpp" "', argument " "1"" of type '" "Fit::Minimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< Fit::Minimizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_PyCallback,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Minimizer_minimize_cpp" "', argument " "2"" of type '" "PyCallback &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "2"" of type '" "PyCallback &""'"); 
-  }
-  arg2 = reinterpret_cast< PyCallback * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Fit__Parameters,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "Fit::Parameters const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "Fit::Parameters const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
   }
-  arg3 = reinterpret_cast< Fit::Parameters * >(argp3);
-  result = (arg1)->minimize(*arg2,(Fit::Parameters const &)*arg3);
-  resultobj = SWIG_NewPointerObj((new Fit::MinimizerResult(static_cast< const Fit::MinimizerResult& >(result))), SWIGTYPE_p_Fit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *Minimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MinimizerFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_Fit__Minimizer, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerFactory, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *Minimizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MinimizerFactory_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -22475,117 +22475,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_Parameters", _wrap_delete_Parameters, METH_O, "delete_Parameters(Parameters self)"},
 	 { "Parameters_swigregister", Parameters_swigregister, METH_O, NULL},
 	 { "Parameters_swiginit", Parameters_swiginit, METH_VARARGS, NULL},
-	 { "delete_IMinimizer", _wrap_delete_IMinimizer, METH_O, "\n"
-		"delete_IMinimizer(IMinimizer self)\n"
-		"IMinimizer::~IMinimizer()\n"
-		"\n"
-		""},
-	 { "IMinimizer_minimizerName", _wrap_IMinimizer_minimizerName, METH_O, "\n"
-		"IMinimizer_minimizerName(IMinimizer self) -> std::string\n"
-		"virtual std::string IMinimizer::minimizerName() const =0\n"
-		"\n"
-		"return name of the minimizer \n"
-		"\n"
-		""},
-	 { "IMinimizer_algorithmName", _wrap_IMinimizer_algorithmName, METH_O, "\n"
-		"IMinimizer_algorithmName(IMinimizer self) -> std::string\n"
-		"virtual std::string IMinimizer::algorithmName() const =0\n"
-		"\n"
-		"return name of the minimization algorithm \n"
-		"\n"
-		""},
-	 { "IMinimizer_minimize_scalar", _wrap_IMinimizer_minimize_scalar, METH_VARARGS, "\n"
-		"IMinimizer_minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult\n"
-		"Fit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, Fit::Parameters)\n"
-		"\n"
-		"run minimization \n"
-		"\n"
-		""},
-	 { "IMinimizer_minimize_residual", _wrap_IMinimizer_minimize_residual, METH_VARARGS, "\n"
-		"IMinimizer_minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult\n"
-		"Fit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, Fit::Parameters)\n"
-		"\n"
-		""},
-	 { "IMinimizer_clear", _wrap_IMinimizer_clear, METH_O, "\n"
-		"IMinimizer_clear(IMinimizer self)\n"
-		"virtual void IMinimizer::clear()\n"
-		"\n"
-		"clear resources (parameters) for consecutives minimizations \n"
-		"\n"
-		""},
-	 { "IMinimizer_minValue", _wrap_IMinimizer_minValue, METH_O, "\n"
-		"IMinimizer_minValue(IMinimizer self) -> double\n"
-		"double IMinimizer::minValue() const\n"
-		"\n"
-		"Returns minimum function value. \n"
-		"\n"
-		""},
-	 { "IMinimizer_setOptions", _wrap_IMinimizer_setOptions, METH_VARARGS, "\n"
-		"IMinimizer_setOptions(IMinimizer self, std::string const & options)\n"
-		"void IMinimizer::setOptions(const std::string &options)\n"
-		"\n"
-		"Sets option string to the minimizer. \n"
-		"\n"
-		""},
-	 { "IMinimizer_swigregister", IMinimizer_swigregister, METH_O, NULL},
-	 { "new_MinimizerCatalogue", _wrap_new_MinimizerCatalogue, METH_NOARGS, "\n"
-		"new_MinimizerCatalogue() -> MinimizerCatalogue\n"
-		"MinimizerCatalogue::MinimizerCatalogue()\n"
-		"\n"
-		""},
-	 { "MinimizerCatalogue_toString", _wrap_MinimizerCatalogue_toString, METH_O, "\n"
-		"MinimizerCatalogue_toString(MinimizerCatalogue self) -> std::string\n"
-		"std::string MinimizerCatalogue::toString() const\n"
-		"\n"
-		"Returns multiline string representing catalogue content. \n"
-		"\n"
-		""},
-	 { "MinimizerCatalogue_minimizerNames", _wrap_MinimizerCatalogue_minimizerNames, METH_O, "\n"
-		"MinimizerCatalogue_minimizerNames(MinimizerCatalogue self) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalogue::minimizerNames() const\n"
-		"\n"
-		""},
-	 { "MinimizerCatalogue_algorithmNames", _wrap_MinimizerCatalogue_algorithmNames, METH_VARARGS, "\n"
-		"MinimizerCatalogue_algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const\n"
-		"\n"
-		"Returns list of algorithms defined for the minimizer with a given name. \n"
-		"\n"
-		""},
-	 { "MinimizerCatalogue_algorithmDescriptions", _wrap_MinimizerCatalogue_algorithmDescriptions, METH_VARARGS, "\n"
-		"MinimizerCatalogue_algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const\n"
-		"\n"
-		"Returns list of algorithm's descriptions for the minimizer with a given name . \n"
-		"\n"
-		""},
-	 { "MinimizerCatalogue_minimizerInfo", _wrap_MinimizerCatalogue_minimizerInfo, METH_VARARGS, "\n"
-		"MinimizerCatalogue_minimizerInfo(MinimizerCatalogue self, std::string const & minimizerName) -> MinimizerInfo const &\n"
-		"const MinimizerInfo & MinimizerCatalogue::minimizerInfo(const std::string &minimizerName) const\n"
-		"\n"
-		"Returns info for minimizer with given name. \n"
-		"\n"
-		""},
-	 { "delete_MinimizerCatalogue", _wrap_delete_MinimizerCatalogue, METH_O, "delete_MinimizerCatalogue(MinimizerCatalogue self)"},
-	 { "MinimizerCatalogue_swigregister", MinimizerCatalogue_swigregister, METH_O, NULL},
-	 { "MinimizerCatalogue_swiginit", MinimizerCatalogue_swiginit, METH_VARARGS, NULL},
-	 { "MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, "MinimizerFactory_createMinimizer(std::string const & minimizerName, std::string const & algorithmType=\"\", std::string const & optionString=\"\") -> IMinimizer"},
-	 { "MinimizerFactory_printCatalogue", _wrap_MinimizerFactory_printCatalogue, METH_NOARGS, "MinimizerFactory_printCatalogue()"},
-	 { "MinimizerFactory_catalogueToString", _wrap_MinimizerFactory_catalogueToString, METH_NOARGS, "MinimizerFactory_catalogueToString() -> std::string"},
-	 { "MinimizerFactory_catalogueDetailsToString", _wrap_MinimizerFactory_catalogueDetailsToString, METH_NOARGS, "MinimizerFactory_catalogueDetailsToString() -> std::string"},
-	 { "MinimizerFactory_catalogue", _wrap_MinimizerFactory_catalogue, METH_NOARGS, "MinimizerFactory_catalogue() -> MinimizerCatalogue"},
-	 { "new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_NOARGS, "\n"
-		"new_MinimizerFactory() -> MinimizerFactory\n"
-		"\n"
-		"\n"
-		"Factory to create minimizers.\n"
-		"\n"
-		"C++ includes: MinimizerFactory.h\n"
-		"\n"
-		""},
-	 { "delete_MinimizerFactory", _wrap_delete_MinimizerFactory, METH_O, "delete_MinimizerFactory(MinimizerFactory self)"},
-	 { "MinimizerFactory_swigregister", MinimizerFactory_swigregister, METH_O, NULL},
-	 { "MinimizerFactory_swiginit", MinimizerFactory_swiginit, METH_VARARGS, NULL},
 	 { "new_PyCallback", _wrap_new_PyCallback, METH_VARARGS, "\n"
 		"PyCallback(PyCallback::CallbackType callback_type=SCALAR)\n"
 		"PyCallback::PyCallback(CallbackType callback_type=SCALAR)\n"
@@ -22716,6 +22605,117 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "Minimizer_swigregister", Minimizer_swigregister, METH_O, NULL},
 	 { "Minimizer_swiginit", Minimizer_swiginit, METH_VARARGS, NULL},
+	 { "delete_IMinimizer", _wrap_delete_IMinimizer, METH_O, "\n"
+		"delete_IMinimizer(IMinimizer self)\n"
+		"IMinimizer::~IMinimizer()\n"
+		"\n"
+		""},
+	 { "IMinimizer_minimizerName", _wrap_IMinimizer_minimizerName, METH_O, "\n"
+		"IMinimizer_minimizerName(IMinimizer self) -> std::string\n"
+		"virtual std::string IMinimizer::minimizerName() const =0\n"
+		"\n"
+		"return name of the minimizer \n"
+		"\n"
+		""},
+	 { "IMinimizer_algorithmName", _wrap_IMinimizer_algorithmName, METH_O, "\n"
+		"IMinimizer_algorithmName(IMinimizer self) -> std::string\n"
+		"virtual std::string IMinimizer::algorithmName() const =0\n"
+		"\n"
+		"return name of the minimization algorithm \n"
+		"\n"
+		""},
+	 { "IMinimizer_minimize_scalar", _wrap_IMinimizer_minimize_scalar, METH_VARARGS, "\n"
+		"IMinimizer_minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult\n"
+		"Fit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, Fit::Parameters)\n"
+		"\n"
+		"run minimization \n"
+		"\n"
+		""},
+	 { "IMinimizer_minimize_residual", _wrap_IMinimizer_minimize_residual, METH_VARARGS, "\n"
+		"IMinimizer_minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult\n"
+		"Fit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, Fit::Parameters)\n"
+		"\n"
+		""},
+	 { "IMinimizer_clear", _wrap_IMinimizer_clear, METH_O, "\n"
+		"IMinimizer_clear(IMinimizer self)\n"
+		"virtual void IMinimizer::clear()\n"
+		"\n"
+		"clear resources (parameters) for consecutives minimizations \n"
+		"\n"
+		""},
+	 { "IMinimizer_minValue", _wrap_IMinimizer_minValue, METH_O, "\n"
+		"IMinimizer_minValue(IMinimizer self) -> double\n"
+		"double IMinimizer::minValue() const\n"
+		"\n"
+		"Returns minimum function value. \n"
+		"\n"
+		""},
+	 { "IMinimizer_setOptions", _wrap_IMinimizer_setOptions, METH_VARARGS, "\n"
+		"IMinimizer_setOptions(IMinimizer self, std::string const & options)\n"
+		"void IMinimizer::setOptions(const std::string &options)\n"
+		"\n"
+		"Sets option string to the minimizer. \n"
+		"\n"
+		""},
+	 { "IMinimizer_swigregister", IMinimizer_swigregister, METH_O, NULL},
+	 { "new_MinimizerCatalogue", _wrap_new_MinimizerCatalogue, METH_NOARGS, "\n"
+		"new_MinimizerCatalogue() -> MinimizerCatalogue\n"
+		"MinimizerCatalogue::MinimizerCatalogue()\n"
+		"\n"
+		""},
+	 { "MinimizerCatalogue_toString", _wrap_MinimizerCatalogue_toString, METH_O, "\n"
+		"MinimizerCatalogue_toString(MinimizerCatalogue self) -> std::string\n"
+		"std::string MinimizerCatalogue::toString() const\n"
+		"\n"
+		"Returns multiline string representing catalogue content. \n"
+		"\n"
+		""},
+	 { "MinimizerCatalogue_minimizerNames", _wrap_MinimizerCatalogue_minimizerNames, METH_O, "\n"
+		"MinimizerCatalogue_minimizerNames(MinimizerCatalogue self) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalogue::minimizerNames() const\n"
+		"\n"
+		""},
+	 { "MinimizerCatalogue_algorithmNames", _wrap_MinimizerCatalogue_algorithmNames, METH_VARARGS, "\n"
+		"MinimizerCatalogue_algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithms defined for the minimizer with a given name. \n"
+		"\n"
+		""},
+	 { "MinimizerCatalogue_algorithmDescriptions", _wrap_MinimizerCatalogue_algorithmDescriptions, METH_VARARGS, "\n"
+		"MinimizerCatalogue_algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithm's descriptions for the minimizer with a given name . \n"
+		"\n"
+		""},
+	 { "MinimizerCatalogue_minimizerInfo", _wrap_MinimizerCatalogue_minimizerInfo, METH_VARARGS, "\n"
+		"MinimizerCatalogue_minimizerInfo(MinimizerCatalogue self, std::string const & minimizerName) -> MinimizerInfo const &\n"
+		"const MinimizerInfo & MinimizerCatalogue::minimizerInfo(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns info for minimizer with given name. \n"
+		"\n"
+		""},
+	 { "delete_MinimizerCatalogue", _wrap_delete_MinimizerCatalogue, METH_O, "delete_MinimizerCatalogue(MinimizerCatalogue self)"},
+	 { "MinimizerCatalogue_swigregister", MinimizerCatalogue_swigregister, METH_O, NULL},
+	 { "MinimizerCatalogue_swiginit", MinimizerCatalogue_swiginit, METH_VARARGS, NULL},
+	 { "MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, "MinimizerFactory_createMinimizer(std::string const & minimizerName, std::string const & algorithmType=\"\", std::string const & optionString=\"\") -> IMinimizer"},
+	 { "MinimizerFactory_printCatalogue", _wrap_MinimizerFactory_printCatalogue, METH_NOARGS, "MinimizerFactory_printCatalogue()"},
+	 { "MinimizerFactory_catalogueToString", _wrap_MinimizerFactory_catalogueToString, METH_NOARGS, "MinimizerFactory_catalogueToString() -> std::string"},
+	 { "MinimizerFactory_catalogueDetailsToString", _wrap_MinimizerFactory_catalogueDetailsToString, METH_NOARGS, "MinimizerFactory_catalogueDetailsToString() -> std::string"},
+	 { "MinimizerFactory_catalogue", _wrap_MinimizerFactory_catalogue, METH_NOARGS, "MinimizerFactory_catalogue() -> MinimizerCatalogue"},
+	 { "new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_NOARGS, "\n"
+		"new_MinimizerFactory() -> MinimizerFactory\n"
+		"\n"
+		"\n"
+		"Factory to create minimizers.\n"
+		"\n"
+		"C++ includes: MinimizerFactory.h\n"
+		"\n"
+		""},
+	 { "delete_MinimizerFactory", _wrap_delete_MinimizerFactory, METH_O, "delete_MinimizerFactory(MinimizerFactory self)"},
+	 { "MinimizerFactory_swigregister", MinimizerFactory_swigregister, METH_O, NULL},
+	 { "MinimizerFactory_swiginit", MinimizerFactory_swiginit, METH_VARARGS, NULL},
 	 { NULL, NULL, 0, NULL }
 };
 
-- 
GitLab