From 451fbb995fc6f96a8495fe6b51ee7554537898b0 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (l)" <j.wuttke@fz-juelich.de>
Date: Tue, 24 Nov 2020 17:19:03 +0100
Subject: [PATCH] move one include from Core to Fit.i

---
 Wrap/swig/libBornAgainCore.i        |    3 -
 Wrap/swig/libBornAgainFit.i         |   23 +-
 auto/Wrap/libBornAgainCore.py       |   38 +-
 auto/Wrap/libBornAgainCore_wrap.cpp |  364 ++---
 auto/Wrap/libBornAgainFit.py        |  471 +++---
 auto/Wrap/libBornAgainFit_wrap.cpp  | 2223 +++++++++++++++------------
 6 files changed, 1583 insertions(+), 1539 deletions(-)

diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
index 6520b9d9486..3b9a105195f 100644
--- a/Wrap/swig/libBornAgainCore.i
+++ b/Wrap/swig/libBornAgainCore.i
@@ -73,7 +73,6 @@
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SimulationFactory.h"
 #include "Core/Simulation/SpecularSimulation.h"
-#include "Fit/Kernel/FitOptions.h"
 %}
 
 // The following goes verbatim from libBornAgainCore.i to libBornAgainCore_wrap.cxx.
@@ -101,8 +100,6 @@
 
 %include "BAVersion.h"
 
-%include "Fit/Kernel/FitOptions.h"
-
 %include "Core/Fitting/IObserver.h"
 %include "Core/Fitting/IterationInfo.h"
 %include "Core/Fitting/PyFittingCallbacks.h"
diff --git a/Wrap/swig/libBornAgainFit.i b/Wrap/swig/libBornAgainFit.i
index 36622f39294..73527e4e2a3 100644
--- a/Wrap/swig/libBornAgainFit.i
+++ b/Wrap/swig/libBornAgainFit.i
@@ -27,17 +27,17 @@
 %feature("director") PyCallback;         // used in extendFit.i
 
 %{
-#include "Fit/Param/RealLimits.h"
-#include "Fit/Param/AttLimits.h"
-#include "Fit/Param/Parameter.h"
-#include "Fit/Param/Parameters.h"
-#include "Fit/Minimizer/IMinimizer.h"
-#include "Fit/Minimizer/MinimizerCatalog.h"
+#include "Fit/Kernel/FitOptions.h"
+#include "Fit/Kernel/Minimizer.h"
 #include "Fit/Kernel/MinimizerFactory.h"
-
 #include "Fit/Kernel/PyCallback.h"
+#include "Fit/Minimizer/IMinimizer.h"
+#include "Fit/Minimizer/MinimizerCatalog.h"
 #include "Fit/Minimizer/MinimizerResult.h"
-#include "Fit/Kernel/Minimizer.h"
+#include "Fit/Param/AttLimits.h"
+#include "Fit/Param/Parameter.h"
+#include "Fit/Param/Parameters.h"
+#include "Fit/Param/RealLimits.h"
 %}
 
 // The following goes verbatim from libBornAgainFit.i to libBornAgainFit_wrap.cxx.
@@ -47,12 +47,13 @@
 %include "Fit/Param/AttLimits.h"
 %include "Fit/Param/Parameter.h"
 %include "Fit/Param/Parameters.h"
-%include "Fit/Kernel/PyCallback.h"
-%include "Fit/Minimizer/MinimizerResult.h"
-%include "Fit/Kernel/Minimizer.h"
 %include "Fit/Minimizer/IMinimizer.h"
 %include "Fit/Minimizer/MinimizerCatalog.h"
+%include "Fit/Minimizer/MinimizerResult.h"
+%include "Fit/Kernel/FitOptions.h"
+%include "Fit/Kernel/Minimizer.h"
 %include "Fit/Kernel/MinimizerFactory.h"
+%include "Fit/Kernel/PyCallback.h"
 
 %pythoncode %{
 class ParametersIterator(object):
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index ac402b388a4..16366a5959f 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -3137,40 +3137,6 @@ def GetName():
 def GetVersionNumber():
     r"""GetVersionNumber() -> std::string"""
     return _libBornAgainCore.GetVersionNumber()
-class FitOptions(object):
-    r"""Proxy of C++ FitOptions class."""
-
-    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__(FitOptions self) -> FitOptions"""
-        _libBornAgainCore.FitOptions_swiginit(self, _libBornAgainCore.new_FitOptions())
-
-    def derivEpsilon(self):
-        r"""derivEpsilon(FitOptions self) -> double"""
-        return _libBornAgainCore.FitOptions_derivEpsilon(self)
-
-    def setDerivEpsilon(self, deriv_epsilon):
-        r"""setDerivEpsilon(FitOptions self, double deriv_epsilon)"""
-        return _libBornAgainCore.FitOptions_setDerivEpsilon(self, deriv_epsilon)
-
-    def stepFactor(self):
-        r"""stepFactor(FitOptions self) -> double"""
-        return _libBornAgainCore.FitOptions_stepFactor(self)
-
-    def setStepFactor(self, step_factor):
-        r"""setStepFactor(FitOptions self, double step_factor)"""
-        return _libBornAgainCore.FitOptions_setStepFactor(self, step_factor)
-    __swig_destroy__ = _libBornAgainCore.delete_FitOptions
-
-# Register FitOptions in _libBornAgainCore:
-_libBornAgainCore.FitOptions_swigregister(FitOptions)
-cvar = _libBornAgainCore.cvar
-major_version_number = cvar.major_version_number
-minor_version_number = cvar.minor_version_number
-patch_version_number = cvar.patch_version_number
-
 class IObserver(object):
     r"""
 
@@ -3200,6 +3166,10 @@ class IObserver(object):
 
 # Register IObserver in _libBornAgainCore:
 _libBornAgainCore.IObserver_swigregister(IObserver)
+cvar = _libBornAgainCore.cvar
+major_version_number = cvar.major_version_number
+minor_version_number = cvar.minor_version_number
+patch_version_number = cvar.patch_version_number
 
 class IObservable(object):
     r"""
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index c5f6fa383cd..8b478395858 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3108,107 +3108,106 @@ namespace Swig {
 #define SWIGTYPE_p_DepthProbeSimulation swig_types[8]
 #define SWIGTYPE_p_DistributionHandler swig_types[9]
 #define SWIGTYPE_p_FitObjective swig_types[10]
-#define SWIGTYPE_p_FitOptions swig_types[11]
-#define SWIGTYPE_p_GISASSimulation swig_types[12]
-#define SWIGTYPE_p_IAxis swig_types[13]
-#define SWIGTYPE_p_IBackground swig_types[14]
-#define SWIGTYPE_p_IBornFF swig_types[15]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[16]
-#define SWIGTYPE_p_ICloneable swig_types[17]
-#define SWIGTYPE_p_IDetector2D swig_types[18]
-#define SWIGTYPE_p_IDistribution1D swig_types[19]
-#define SWIGTYPE_p_IFactoryT_std__string_ISimulation_t swig_types[20]
-#define SWIGTYPE_p_IFootprintFactor swig_types[21]
-#define SWIGTYPE_p_IFormFactor swig_types[22]
-#define SWIGTYPE_p_INode swig_types[23]
-#define SWIGTYPE_p_INodeVisitor swig_types[24]
-#define SWIGTYPE_p_IObservable swig_types[25]
-#define SWIGTYPE_p_IObserver swig_types[26]
-#define SWIGTYPE_p_IParameterized swig_types[27]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[28]
-#define SWIGTYPE_p_ISample swig_types[29]
-#define SWIGTYPE_p_IShape2D swig_types[30]
-#define SWIGTYPE_p_ISimulation swig_types[31]
-#define SWIGTYPE_p_ISimulation2D swig_types[32]
-#define SWIGTYPE_p_ISpecularScan swig_types[33]
-#define SWIGTYPE_p_Instrument swig_types[34]
-#define SWIGTYPE_p_IterationInfo swig_types[35]
-#define SWIGTYPE_p_MultiLayer swig_types[36]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[37]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[38]
-#define SWIGTYPE_p_ParameterDistribution swig_types[39]
-#define SWIGTYPE_p_ParameterPool swig_types[40]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[41]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[42]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[43]
-#define SWIGTYPE_p_PyObserverCallback swig_types[44]
-#define SWIGTYPE_p_QSpecScan swig_types[45]
-#define SWIGTYPE_p_RangedDistribution swig_types[46]
-#define SWIGTYPE_p_RealLimits swig_types[47]
-#define SWIGTYPE_p_ScanResolution swig_types[48]
-#define SWIGTYPE_p_SimulationFactory swig_types[49]
-#define SWIGTYPE_p_SimulationOptions swig_types[50]
-#define SWIGTYPE_p_SimulationResult swig_types[51]
-#define SWIGTYPE_p_SpecularSimulation swig_types[52]
-#define SWIGTYPE_p_allocator_type swig_types[53]
-#define SWIGTYPE_p_char swig_types[54]
-#define SWIGTYPE_p_difference_type swig_types[55]
-#define SWIGTYPE_p_first_type swig_types[56]
-#define SWIGTYPE_p_int swig_types[57]
-#define SWIGTYPE_p_key_type swig_types[58]
-#define SWIGTYPE_p_long_long swig_types[59]
-#define SWIGTYPE_p_mapped_type swig_types[60]
-#define SWIGTYPE_p_mumufit__MinimizerResult swig_types[61]
-#define SWIGTYPE_p_mumufit__Parameters swig_types[62]
-#define SWIGTYPE_p_observer_t swig_types[63]
-#define SWIGTYPE_p_p_PyObject swig_types[64]
-#define SWIGTYPE_p_second_type swig_types[65]
-#define SWIGTYPE_p_short swig_types[66]
-#define SWIGTYPE_p_signed_char swig_types[67]
-#define SWIGTYPE_p_size_type swig_types[68]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[69]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[70]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[71]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[72]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[73]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[74]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[75]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[76]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[77]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[78]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[79]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[80]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[81]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[82]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[83]
-#define SWIGTYPE_p_std__functionT_ISimulation_pfF_t swig_types[84]
-#define SWIGTYPE_p_std__invalid_argument swig_types[85]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[86]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[87]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[88]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[89]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[90]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[91]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[92]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[93]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[94]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[95]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[96]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[97]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[98]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[99]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[100]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[101]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[102]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[103]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[104]
-#define SWIGTYPE_p_unsigned_char swig_types[105]
-#define SWIGTYPE_p_unsigned_int swig_types[106]
-#define SWIGTYPE_p_unsigned_long_long swig_types[107]
-#define SWIGTYPE_p_unsigned_short swig_types[108]
-#define SWIGTYPE_p_value_type swig_types[109]
-static swig_type_info *swig_types[111];
-static swig_module_info swig_module = {swig_types, 110, 0, 0, 0, 0};
+#define SWIGTYPE_p_GISASSimulation swig_types[11]
+#define SWIGTYPE_p_IAxis swig_types[12]
+#define SWIGTYPE_p_IBackground swig_types[13]
+#define SWIGTYPE_p_IBornFF swig_types[14]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[15]
+#define SWIGTYPE_p_ICloneable swig_types[16]
+#define SWIGTYPE_p_IDetector2D swig_types[17]
+#define SWIGTYPE_p_IDistribution1D swig_types[18]
+#define SWIGTYPE_p_IFactoryT_std__string_ISimulation_t swig_types[19]
+#define SWIGTYPE_p_IFootprintFactor swig_types[20]
+#define SWIGTYPE_p_IFormFactor swig_types[21]
+#define SWIGTYPE_p_INode swig_types[22]
+#define SWIGTYPE_p_INodeVisitor swig_types[23]
+#define SWIGTYPE_p_IObservable swig_types[24]
+#define SWIGTYPE_p_IObserver swig_types[25]
+#define SWIGTYPE_p_IParameterized swig_types[26]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[27]
+#define SWIGTYPE_p_ISample swig_types[28]
+#define SWIGTYPE_p_IShape2D swig_types[29]
+#define SWIGTYPE_p_ISimulation swig_types[30]
+#define SWIGTYPE_p_ISimulation2D swig_types[31]
+#define SWIGTYPE_p_ISpecularScan swig_types[32]
+#define SWIGTYPE_p_Instrument swig_types[33]
+#define SWIGTYPE_p_IterationInfo swig_types[34]
+#define SWIGTYPE_p_MultiLayer swig_types[35]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[36]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[37]
+#define SWIGTYPE_p_ParameterDistribution swig_types[38]
+#define SWIGTYPE_p_ParameterPool swig_types[39]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[40]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[41]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[42]
+#define SWIGTYPE_p_PyObserverCallback swig_types[43]
+#define SWIGTYPE_p_QSpecScan swig_types[44]
+#define SWIGTYPE_p_RangedDistribution swig_types[45]
+#define SWIGTYPE_p_RealLimits swig_types[46]
+#define SWIGTYPE_p_ScanResolution swig_types[47]
+#define SWIGTYPE_p_SimulationFactory swig_types[48]
+#define SWIGTYPE_p_SimulationOptions swig_types[49]
+#define SWIGTYPE_p_SimulationResult swig_types[50]
+#define SWIGTYPE_p_SpecularSimulation swig_types[51]
+#define SWIGTYPE_p_allocator_type swig_types[52]
+#define SWIGTYPE_p_char swig_types[53]
+#define SWIGTYPE_p_difference_type swig_types[54]
+#define SWIGTYPE_p_first_type swig_types[55]
+#define SWIGTYPE_p_int swig_types[56]
+#define SWIGTYPE_p_key_type swig_types[57]
+#define SWIGTYPE_p_long_long swig_types[58]
+#define SWIGTYPE_p_mapped_type swig_types[59]
+#define SWIGTYPE_p_mumufit__MinimizerResult swig_types[60]
+#define SWIGTYPE_p_mumufit__Parameters swig_types[61]
+#define SWIGTYPE_p_observer_t swig_types[62]
+#define SWIGTYPE_p_p_PyObject swig_types[63]
+#define SWIGTYPE_p_second_type swig_types[64]
+#define SWIGTYPE_p_short swig_types[65]
+#define SWIGTYPE_p_signed_char swig_types[66]
+#define SWIGTYPE_p_size_type swig_types[67]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[68]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[69]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[70]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[71]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[72]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[73]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[74]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[75]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[76]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[77]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[78]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[79]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[80]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[81]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[82]
+#define SWIGTYPE_p_std__functionT_ISimulation_pfF_t swig_types[83]
+#define SWIGTYPE_p_std__invalid_argument swig_types[84]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[85]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[86]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[87]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[88]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[89]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[90]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[91]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[92]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[93]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[94]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[95]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[96]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[97]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[98]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[99]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[100]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[101]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[102]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[103]
+#define SWIGTYPE_p_unsigned_char swig_types[104]
+#define SWIGTYPE_p_unsigned_int swig_types[105]
+#define SWIGTYPE_p_unsigned_long_long swig_types[106]
+#define SWIGTYPE_p_unsigned_short swig_types[107]
+#define SWIGTYPE_p_value_type swig_types[108]
+static swig_type_info *swig_types[110];
+static swig_module_info swig_module = {swig_types, 109, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6719,7 +6718,6 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SimulationFactory.h"
 #include "Core/Simulation/SpecularSimulation.h"
-#include "Fit/Kernel/FitOptions.h"
 
 SWIGINTERN BasicVector3D< double > BasicVector3D_Sl_double_Sg____add__(BasicVector3D< double > const *self,BasicVector3D< double > const &rhs){
         return *(self) + rhs; }
@@ -37043,156 +37041,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_FitOptions", 0, 0, 0)) SWIG_fail;
-  result = (FitOptions *)new FitOptions();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitOptions, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FitOptions_derivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *arg1 = (FitOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_derivEpsilon" "', argument " "1"" of type '" "FitOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< FitOptions * >(argp1);
-  result = (double)((FitOptions const *)arg1)->derivEpsilon();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FitOptions_setDerivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *arg1 = (FitOptions *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "FitOptions_setDerivEpsilon", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_setDerivEpsilon" "', argument " "1"" of type '" "FitOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< FitOptions * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setDerivEpsilon" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setDerivEpsilon(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FitOptions_stepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *arg1 = (FitOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_stepFactor" "', argument " "1"" of type '" "FitOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< FitOptions * >(argp1);
-  result = (double)((FitOptions const *)arg1)->stepFactor();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FitOptions_setStepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *arg1 = (FitOptions *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "FitOptions_setStepFactor", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_setStepFactor" "', argument " "1"" of type '" "FitOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< FitOptions * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setStepFactor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setStepFactor(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FitOptions *arg1 = (FitOptions *) 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_FitOptions, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitOptions" "', argument " "1"" of type '" "FitOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< FitOptions * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *FitOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_FitOptions, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *FitOptions_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_delete_IObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IObserver *arg1 = (IObserver *) 0 ;
@@ -43662,14 +43510,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "GetPatchVersionNumber", _wrap_GetPatchVersionNumber, METH_NOARGS, "GetPatchVersionNumber() -> int"},
 	 { "GetName", _wrap_GetName, METH_NOARGS, "GetName() -> std::string"},
 	 { "GetVersionNumber", _wrap_GetVersionNumber, METH_NOARGS, "GetVersionNumber() -> std::string"},
-	 { "new_FitOptions", _wrap_new_FitOptions, METH_NOARGS, "new_FitOptions() -> FitOptions"},
-	 { "FitOptions_derivEpsilon", _wrap_FitOptions_derivEpsilon, METH_O, "FitOptions_derivEpsilon(FitOptions self) -> double"},
-	 { "FitOptions_setDerivEpsilon", _wrap_FitOptions_setDerivEpsilon, METH_VARARGS, "FitOptions_setDerivEpsilon(FitOptions self, double deriv_epsilon)"},
-	 { "FitOptions_stepFactor", _wrap_FitOptions_stepFactor, METH_O, "FitOptions_stepFactor(FitOptions self) -> double"},
-	 { "FitOptions_setStepFactor", _wrap_FitOptions_setStepFactor, METH_VARARGS, "FitOptions_setStepFactor(FitOptions self, double step_factor)"},
-	 { "delete_FitOptions", _wrap_delete_FitOptions, METH_O, "delete_FitOptions(FitOptions self)"},
-	 { "FitOptions_swigregister", FitOptions_swigregister, METH_O, NULL},
-	 { "FitOptions_swiginit", FitOptions_swiginit, METH_VARARGS, NULL},
 	 { "delete_IObserver", _wrap_delete_IObserver, METH_O, "\n"
 		"delete_IObserver(IObserver self)\n"
 		"IObserver::~IObserver()\n"
@@ -44664,7 +44504,6 @@ static swig_type_info _swigt__p_CreateItemCallback = {"_p_CreateItemCallback", "
 static swig_type_info _swigt__p_DepthProbeSimulation = {"_p_DepthProbeSimulation", "DepthProbeSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_DistributionHandler = {"_p_DistributionHandler", "DistributionHandler *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FitObjective = {"_p_FitObjective", "FitObjective *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_FitOptions = {"_p_FitOptions", "FitOptions *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GISASSimulation = {"_p_GISASSimulation", "GISASSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBackground = {"_p_IBackground", "IBackground *", 0, 0, (void*)0, 0};
@@ -44776,7 +44615,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_DepthProbeSimulation,
   &_swigt__p_DistributionHandler,
   &_swigt__p_FitObjective,
-  &_swigt__p_FitOptions,
   &_swigt__p_GISASSimulation,
   &_swigt__p_IAxis,
   &_swigt__p_IBackground,
@@ -44888,7 +44726,6 @@ static swig_cast_info _swigc__p_CreateItemCallback[] = {  {&_swigt__p_CreateItem
 static swig_cast_info _swigc__p_DepthProbeSimulation[] = {  {&_swigt__p_DepthProbeSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_DistributionHandler[] = {  {&_swigt__p_DistributionHandler, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FitObjective[] = {  {&_swigt__p_FitObjective, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_FitOptions[] = {  {&_swigt__p_FitOptions, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GISASSimulation[] = {  {&_swigt__p_GISASSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBackground[] = {  {&_swigt__p_IBackground, 0, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IBackground, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IBackground, 0, 0},{0, 0, 0, 0}};
@@ -45000,7 +44837,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_DepthProbeSimulation,
   _swigc__p_DistributionHandler,
   _swigc__p_FitObjective,
-  _swigc__p_FitOptions,
   _swigc__p_GISASSimulation,
   _swigc__p_IAxis,
   _swigc__p_IBackground,
diff --git a/auto/Wrap/libBornAgainFit.py b/auto/Wrap/libBornAgainFit.py
index f395df026e6..d7b0b9649e2 100644
--- a/auto/Wrap/libBornAgainFit.py
+++ b/auto/Wrap/libBornAgainFit.py
@@ -2370,86 +2370,166 @@ class Parameters(object):
 # Register Parameters in _libBornAgainFit:
 _libBornAgainFit.Parameters_swigregister(Parameters)
 
-class PyCallback(object):
+class IMinimizer(object):
     r"""
 
 
-    Base class to wrap Python callable and pass it to C++. Used in swig interface file, intended to be overloaded from Python.
+    Abstract base class for all kind minimizers.
 
-    C++ includes: PyCallback.h
+    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
-    SCALAR = _libBornAgainFit.PyCallback_SCALAR
-    
-    RESIDUAL = _libBornAgainFit.PyCallback_RESIDUAL
-    
+    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
 
-    def __init__(self, *args):
+    def minimizerName(self):
         r"""
-        __init__(PyCallback self, PyCallback::CallbackType callback_type=SCALAR) -> PyCallback
-        PyCallback::PyCallback(CallbackType callback_type=SCALAR)
+        minimizerName(IMinimizer self) -> std::string
+        virtual std::string IMinimizer::minimizerName() const =0
+
+        return name of the minimizer 
 
         """
-        if self.__class__ == PyCallback:
-            _self = None
-        else:
-            _self = self
-        _libBornAgainFit.PyCallback_swiginit(self, _libBornAgainFit.new_PyCallback(_self, *args))
-    __swig_destroy__ = _libBornAgainFit.delete_PyCallback
+        return _libBornAgainFit.IMinimizer_minimizerName(self)
 
-    def callback_type(self):
+    def algorithmName(self):
         r"""
-        callback_type(PyCallback self) -> PyCallback::CallbackType
-        PyCallback::CallbackType PyCallback::callback_type() const
+        algorithmName(IMinimizer self) -> std::string
+        virtual std::string IMinimizer::algorithmName() const =0
+
+        return name of the minimization algorithm 
 
         """
-        return _libBornAgainFit.PyCallback_callback_type(self)
+        return _libBornAgainFit.IMinimizer_algorithmName(self)
 
-    def call_scalar(self, pars):
+    def minimize_scalar(self, arg2, arg3):
         r"""
-        call_scalar(PyCallback self, Parameters pars) -> double
-        double PyCallback::call_scalar(mumufit::Parameters pars)
+        minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult
+        mumufit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, mumufit::Parameters)
 
-        Call Python callable and returns its result. Intended to be overloaded in Python.
+        run minimization 
 
-        Parameters:
-        -----------
+        """
+        return _libBornAgainFit.IMinimizer_minimize_scalar(self, arg2, arg3)
 
-        pars: 
-        Fit parameters object (intentionally passed by value).
+    def minimize_residual(self, arg2, arg3):
+        r"""
+        minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult
+        mumufit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, mumufit::Parameters)
 
-        value of objective function. 
+        """
+        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.PyCallback_call_scalar(self, pars)
+        return _libBornAgainFit.IMinimizer_clear(self)
 
-    def call_residuals(self, pars):
+    def minValue(self):
         r"""
-        call_residuals(PyCallback self, Parameters pars) -> vdouble1d_t
-        std::vector< double > PyCallback::call_residuals(mumufit::Parameters pars)
+        minValue(IMinimizer self) -> double
+        double IMinimizer::minValue() const
 
-        Call Python callable and returns its result. Intended to be overloaded in Python.
+        Returns minimum function value. 
 
-        Parameters:
-        -----------
+        """
+        return _libBornAgainFit.IMinimizer_minValue(self)
 
-        pars: 
-        Fit parameters object (intentionally passed by value).
+    def setOptions(self, options):
+        r"""
+        setOptions(IMinimizer self, std::string const & options)
+        void IMinimizer::setOptions(const std::string &options)
 
-        vector of residuals 
+        Sets option string to the minimizer. 
 
         """
-        return _libBornAgainFit.PyCallback_call_residuals(self, pars)
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainFit.disown_PyCallback(self)
-        return weakref.proxy(self)
+        return _libBornAgainFit.IMinimizer_setOptions(self, options)
 
-# Register PyCallback in _libBornAgainFit:
-_libBornAgainFit.PyCallback_swigregister(PyCallback)
+# Register IMinimizer in _libBornAgainFit:
+_libBornAgainFit.IMinimizer_swigregister(IMinimizer)
+
+class MinimizerCatalog(object):
+    r"""
+
+
+    Hard-coded information about all minimizers available.
+
+    C++ includes: MinimizerCatalog.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__(MinimizerCatalog self) -> MinimizerCatalog
+        MinimizerCatalog::MinimizerCatalog()
+
+        """
+        _libBornAgainFit.MinimizerCatalog_swiginit(self, _libBornAgainFit.new_MinimizerCatalog())
+
+    def toString(self):
+        r"""
+        toString(MinimizerCatalog self) -> std::string
+        std::string MinimizerCatalog::toString() const
+
+        Returns multiline string representing catalog content. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalog_toString(self)
+
+    def minimizerNames(self):
+        r"""
+        minimizerNames(MinimizerCatalog self) -> vector_string_t
+        std::vector< std::string > MinimizerCatalog::minimizerNames() const
+
+        """
+        return _libBornAgainFit.MinimizerCatalog_minimizerNames(self)
+
+    def algorithmNames(self, minimizerName):
+        r"""
+        algorithmNames(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t
+        std::vector< std::string > MinimizerCatalog::algorithmNames(const std::string &minimizerName) const
+
+        Returns list of algorithms defined for the minimizer with a given name. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalog_algorithmNames(self, minimizerName)
+
+    def algorithmDescriptions(self, minimizerName):
+        r"""
+        algorithmDescriptions(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t
+        std::vector< std::string > MinimizerCatalog::algorithmDescriptions(const std::string &minimizerName) const
+
+        Returns list of algorithm's descriptions for the minimizer with a given name . 
+
+        """
+        return _libBornAgainFit.MinimizerCatalog_algorithmDescriptions(self, minimizerName)
+
+    def minimizerInfo(self, minimizerName):
+        r"""
+        minimizerInfo(MinimizerCatalog self, std::string const & minimizerName) -> MinimizerInfo const &
+        const MinimizerInfo & MinimizerCatalog::minimizerInfo(const std::string &minimizerName) const
+
+        Returns info for minimizer with given name. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalog_minimizerInfo(self, minimizerName)
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerCatalog
+
+# Register MinimizerCatalog in _libBornAgainFit:
+_libBornAgainFit.MinimizerCatalog_swigregister(MinimizerCatalog)
 
 class MinimizerResult(object):
     r"""
@@ -2552,13 +2632,13 @@ class MinimizerResult(object):
 # Register MinimizerResult in _libBornAgainFit:
 _libBornAgainFit.MinimizerResult_swigregister(MinimizerResult)
 
-class Minimizer(object):
+class FitOptions(object):
     r"""
 
 
-    A main class to run fitting.
+    General fitting options.
 
-    C++ includes: Minimizer.h
+    C++ includes: FitOptions.h
 
     """
 
@@ -2567,148 +2647,55 @@ class Minimizer(object):
 
     def __init__(self):
         r"""
-        __init__(Minimizer self) -> Minimizer
-        Minimizer::Minimizer()
-
-        """
-        _libBornAgainFit.Minimizer_swiginit(self, _libBornAgainFit.new_Minimizer())
-    __swig_destroy__ = _libBornAgainFit.delete_Minimizer
-
-    def setMinimizer(self, *args):
-        r"""
-        setMinimizer(Minimizer self, std::string const & minimizerName, std::string const & algorithmName="", std::string const & options="")
-        setMinimizer(Minimizer self, IMinimizer minimizer)
-        void Minimizer::setMinimizer(IMinimizer *minimizer)
-
-        """
-        return _libBornAgainFit.Minimizer_setMinimizer(self, *args)
-
-    def minimize_cpp(self, callback, parameters):
-        r"""
-        minimize_cpp(Minimizer self, PyCallback callback, Parameters parameters) -> MinimizerResult
-        MinimizerResult Minimizer::minimize(PyCallback &callback, const Parameters &parameters)
-
-        Finds minimum of user objective function (to be called from Python). 
-
-        """
-        return _libBornAgainFit.Minimizer_minimize_cpp(self, callback, parameters)
-
-    def minimize(self, callback, pars):
-        if not callable(callback):
-            raise Exception("Not a Python callable")
-
-    # single call to callback to check return type
-        result = callback(pars)
-
-        if isinstance(result, float):
-            wrp = CallableWrapper(callback, PyCallback.SCALAR)
-            return self.minimize_cpp(wrp, pars)
-        elif hasattr(result, '__len__'):
-            wrp = CallableWrapper(callback, PyCallback.RESIDUAL)
-            return self.minimize_cpp(wrp, pars)
-        else:
-            raise Exception("Wrong callable type")
-
-
-
-# Register Minimizer in _libBornAgainFit:
-_libBornAgainFit.Minimizer_swigregister(Minimizer)
-
-class IMinimizer(object):
-    r"""
-
-
-    Abstract base class 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
-        mumufit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, mumufit::Parameters)
-
-        run minimization 
+        __init__(FitOptions self) -> FitOptions
+        FitOptions::FitOptions()
 
         """
-        return _libBornAgainFit.IMinimizer_minimize_scalar(self, arg2, arg3)
+        _libBornAgainFit.FitOptions_swiginit(self, _libBornAgainFit.new_FitOptions())
 
-    def minimize_residual(self, arg2, arg3):
+    def derivEpsilon(self):
         r"""
-        minimize_residual(IMinimizer self, fcn_residual_t arg2, Parameters arg3) -> MinimizerResult
-        mumufit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, mumufit::Parameters)
+        derivEpsilon(FitOptions self) -> double
+        double FitOptions::derivEpsilon() const
 
         """
-        return _libBornAgainFit.IMinimizer_minimize_residual(self, arg2, arg3)
+        return _libBornAgainFit.FitOptions_derivEpsilon(self)
 
-    def clear(self):
+    def setDerivEpsilon(self, deriv_epsilon):
         r"""
-        clear(IMinimizer self)
-        virtual void IMinimizer::clear()
-
-        clear resources (parameters) for consecutives minimizations 
+        setDerivEpsilon(FitOptions self, double deriv_epsilon)
+        void FitOptions::setDerivEpsilon(double deriv_epsilon)
 
         """
-        return _libBornAgainFit.IMinimizer_clear(self)
+        return _libBornAgainFit.FitOptions_setDerivEpsilon(self, deriv_epsilon)
 
-    def minValue(self):
+    def stepFactor(self):
         r"""
-        minValue(IMinimizer self) -> double
-        double IMinimizer::minValue() const
-
-        Returns minimum function value. 
+        stepFactor(FitOptions self) -> double
+        double FitOptions::stepFactor() const
 
         """
-        return _libBornAgainFit.IMinimizer_minValue(self)
+        return _libBornAgainFit.FitOptions_stepFactor(self)
 
-    def setOptions(self, options):
+    def setStepFactor(self, step_factor):
         r"""
-        setOptions(IMinimizer self, std::string const & options)
-        void IMinimizer::setOptions(const std::string &options)
-
-        Sets option string to the minimizer. 
+        setStepFactor(FitOptions self, double step_factor)
+        void FitOptions::setStepFactor(double step_factor)
 
         """
-        return _libBornAgainFit.IMinimizer_setOptions(self, options)
+        return _libBornAgainFit.FitOptions_setStepFactor(self, step_factor)
+    __swig_destroy__ = _libBornAgainFit.delete_FitOptions
 
-# Register IMinimizer in _libBornAgainFit:
-_libBornAgainFit.IMinimizer_swigregister(IMinimizer)
+# Register FitOptions in _libBornAgainFit:
+_libBornAgainFit.FitOptions_swigregister(FitOptions)
 
-class MinimizerCatalog(object):
+class Minimizer(object):
     r"""
 
 
-    Hard-coded information about all minimizers available.
+    A main class to run fitting.
 
-    C++ includes: MinimizerCatalog.h
+    C++ includes: Minimizer.h
 
     """
 
@@ -2717,63 +2704,52 @@ class MinimizerCatalog(object):
 
     def __init__(self):
         r"""
-        __init__(MinimizerCatalog self) -> MinimizerCatalog
-        MinimizerCatalog::MinimizerCatalog()
-
-        """
-        _libBornAgainFit.MinimizerCatalog_swiginit(self, _libBornAgainFit.new_MinimizerCatalog())
-
-    def toString(self):
-        r"""
-        toString(MinimizerCatalog self) -> std::string
-        std::string MinimizerCatalog::toString() const
-
-        Returns multiline string representing catalog content. 
+        __init__(Minimizer self) -> Minimizer
+        Minimizer::Minimizer()
 
         """
-        return _libBornAgainFit.MinimizerCatalog_toString(self)
+        _libBornAgainFit.Minimizer_swiginit(self, _libBornAgainFit.new_Minimizer())
+    __swig_destroy__ = _libBornAgainFit.delete_Minimizer
 
-    def minimizerNames(self):
+    def setMinimizer(self, *args):
         r"""
-        minimizerNames(MinimizerCatalog self) -> vector_string_t
-        std::vector< std::string > MinimizerCatalog::minimizerNames() const
+        setMinimizer(Minimizer self, std::string const & minimizerName, std::string const & algorithmName="", std::string const & options="")
+        setMinimizer(Minimizer self, IMinimizer minimizer)
+        void Minimizer::setMinimizer(IMinimizer *minimizer)
 
         """
-        return _libBornAgainFit.MinimizerCatalog_minimizerNames(self)
+        return _libBornAgainFit.Minimizer_setMinimizer(self, *args)
 
-    def algorithmNames(self, minimizerName):
+    def minimize_cpp(self, callback, parameters):
         r"""
-        algorithmNames(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t
-        std::vector< std::string > MinimizerCatalog::algorithmNames(const std::string &minimizerName) const
+        minimize_cpp(Minimizer self, PyCallback callback, Parameters parameters) -> MinimizerResult
+        MinimizerResult Minimizer::minimize(PyCallback &callback, const Parameters &parameters)
 
-        Returns list of algorithms defined for the minimizer with a given name. 
+        Finds minimum of user objective function (to be called from Python). 
 
         """
-        return _libBornAgainFit.MinimizerCatalog_algorithmNames(self, minimizerName)
-
-    def algorithmDescriptions(self, minimizerName):
-        r"""
-        algorithmDescriptions(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t
-        std::vector< std::string > MinimizerCatalog::algorithmDescriptions(const std::string &minimizerName) const
+        return _libBornAgainFit.Minimizer_minimize_cpp(self, callback, parameters)
 
-        Returns list of algorithm's descriptions for the minimizer with a given name . 
+    def minimize(self, callback, pars):
+        if not callable(callback):
+            raise Exception("Not a Python callable")
 
-        """
-        return _libBornAgainFit.MinimizerCatalog_algorithmDescriptions(self, minimizerName)
+    # single call to callback to check return type
+        result = callback(pars)
 
-    def minimizerInfo(self, minimizerName):
-        r"""
-        minimizerInfo(MinimizerCatalog self, std::string const & minimizerName) -> MinimizerInfo const &
-        const MinimizerInfo & MinimizerCatalog::minimizerInfo(const std::string &minimizerName) const
+        if isinstance(result, float):
+            wrp = CallableWrapper(callback, PyCallback.SCALAR)
+            return self.minimize_cpp(wrp, pars)
+        elif hasattr(result, '__len__'):
+            wrp = CallableWrapper(callback, PyCallback.RESIDUAL)
+            return self.minimize_cpp(wrp, pars)
+        else:
+            raise Exception("Wrong callable type")
 
-        Returns info for minimizer with given name. 
 
-        """
-        return _libBornAgainFit.MinimizerCatalog_minimizerInfo(self, minimizerName)
-    __swig_destroy__ = _libBornAgainFit.delete_MinimizerCatalog
 
-# Register MinimizerCatalog in _libBornAgainFit:
-_libBornAgainFit.MinimizerCatalog_swigregister(MinimizerCatalog)
+# Register Minimizer in _libBornAgainFit:
+_libBornAgainFit.Minimizer_swigregister(Minimizer)
 
 class MinimizerFactory(object):
     r"""
@@ -2849,6 +2825,87 @@ def MinimizerFactory_catalog():
     r"""MinimizerFactory_catalog() -> MinimizerCatalog"""
     return _libBornAgainFit.MinimizerFactory_catalog()
 
+class PyCallback(object):
+    r"""
+
+
+    Base class to wrap Python callable and pass it to C++. Used in swig interface file, intended to be overloaded from Python.
+
+    C++ includes: PyCallback.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+    SCALAR = _libBornAgainFit.PyCallback_SCALAR
+    
+    RESIDUAL = _libBornAgainFit.PyCallback_RESIDUAL
+    
+
+    def __init__(self, *args):
+        r"""
+        __init__(PyCallback self, PyCallback::CallbackType callback_type=SCALAR) -> PyCallback
+        PyCallback::PyCallback(CallbackType callback_type=SCALAR)
+
+        """
+        if self.__class__ == PyCallback:
+            _self = None
+        else:
+            _self = self
+        _libBornAgainFit.PyCallback_swiginit(self, _libBornAgainFit.new_PyCallback(_self, *args))
+    __swig_destroy__ = _libBornAgainFit.delete_PyCallback
+
+    def callback_type(self):
+        r"""
+        callback_type(PyCallback self) -> PyCallback::CallbackType
+        PyCallback::CallbackType PyCallback::callback_type() const
+
+        """
+        return _libBornAgainFit.PyCallback_callback_type(self)
+
+    def call_scalar(self, pars):
+        r"""
+        call_scalar(PyCallback self, Parameters pars) -> double
+        double PyCallback::call_scalar(mumufit::Parameters pars)
+
+        Call Python callable and returns its result. Intended to be overloaded in Python.
+
+        Parameters:
+        -----------
+
+        pars: 
+        Fit parameters object (intentionally passed by value).
+
+        value of objective function. 
+
+        """
+        return _libBornAgainFit.PyCallback_call_scalar(self, pars)
+
+    def call_residuals(self, pars):
+        r"""
+        call_residuals(PyCallback self, Parameters pars) -> vdouble1d_t
+        std::vector< double > PyCallback::call_residuals(mumufit::Parameters pars)
+
+        Call Python callable and returns its result. Intended to be overloaded in Python.
+
+        Parameters:
+        -----------
+
+        pars: 
+        Fit parameters object (intentionally passed by value).
+
+        vector of residuals 
+
+        """
+        return _libBornAgainFit.PyCallback_call_residuals(self, pars)
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainFit.disown_PyCallback(self)
+        return weakref.proxy(self)
+
+# Register PyCallback in _libBornAgainFit:
+_libBornAgainFit.PyCallback_swigregister(PyCallback)
+
 
 class ParametersIterator(object):
 
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index 50767559992..b2618aab2b8 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -3098,66 +3098,67 @@ namespace Swig {
 /* -------- TYPES TABLE (BEGIN) -------- */
 
 #define SWIGTYPE_p_AttLimits swig_types[0]
-#define SWIGTYPE_p_IMinimizer swig_types[1]
-#define SWIGTYPE_p_MinimizerCatalog swig_types[2]
-#define SWIGTYPE_p_MinimizerFactory swig_types[3]
-#define SWIGTYPE_p_MinimizerInfo swig_types[4]
-#define SWIGTYPE_p_PyCallback swig_types[5]
-#define SWIGTYPE_p_RealLimits swig_types[6]
-#define SWIGTYPE_p_allocator_type swig_types[7]
-#define SWIGTYPE_p_char swig_types[8]
-#define SWIGTYPE_p_const_iterator swig_types[9]
-#define SWIGTYPE_p_corr_matrix_t swig_types[10]
-#define SWIGTYPE_p_difference_type swig_types[11]
-#define SWIGTYPE_p_fcn_residual_t swig_types[12]
-#define SWIGTYPE_p_fcn_scalar_t swig_types[13]
-#define SWIGTYPE_p_first_type swig_types[14]
-#define SWIGTYPE_p_int swig_types[15]
-#define SWIGTYPE_p_iterator swig_types[16]
-#define SWIGTYPE_p_key_type swig_types[17]
-#define SWIGTYPE_p_long_long swig_types[18]
-#define SWIGTYPE_p_mapped_type swig_types[19]
-#define SWIGTYPE_p_mumufit__Minimizer swig_types[20]
-#define SWIGTYPE_p_mumufit__MinimizerResult swig_types[21]
-#define SWIGTYPE_p_mumufit__Parameter swig_types[22]
-#define SWIGTYPE_p_mumufit__Parameters swig_types[23]
-#define SWIGTYPE_p_p_PyObject swig_types[24]
-#define SWIGTYPE_p_parameters_t swig_types[25]
-#define SWIGTYPE_p_second_type swig_types[26]
-#define SWIGTYPE_p_short swig_types[27]
-#define SWIGTYPE_p_signed_char swig_types[28]
-#define SWIGTYPE_p_size_type swig_types[29]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[30]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[31]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[32]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[33]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[34]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[35]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[36]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[37]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[38]
-#define SWIGTYPE_p_std__invalid_argument swig_types[39]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[40]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[41]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[42]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[43]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[44]
-#define SWIGTYPE_p_std__vectorT_mumufit__Parameter_std__allocatorT_mumufit__Parameter_t_t__const_iterator swig_types[45]
-#define SWIGTYPE_p_std__vectorT_mumufit__Parameter_std__allocatorT_mumufit__Parameter_t_t__iterator swig_types[46]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[47]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[48]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[49]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[50]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[51]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[52]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[53]
-#define SWIGTYPE_p_unsigned_char swig_types[54]
-#define SWIGTYPE_p_unsigned_int swig_types[55]
-#define SWIGTYPE_p_unsigned_long_long swig_types[56]
-#define SWIGTYPE_p_unsigned_short swig_types[57]
-#define SWIGTYPE_p_value_type swig_types[58]
-static swig_type_info *swig_types[60];
-static swig_module_info swig_module = {swig_types, 59, 0, 0, 0, 0};
+#define SWIGTYPE_p_FitOptions swig_types[1]
+#define SWIGTYPE_p_IMinimizer swig_types[2]
+#define SWIGTYPE_p_MinimizerCatalog swig_types[3]
+#define SWIGTYPE_p_MinimizerFactory swig_types[4]
+#define SWIGTYPE_p_MinimizerInfo swig_types[5]
+#define SWIGTYPE_p_PyCallback swig_types[6]
+#define SWIGTYPE_p_RealLimits swig_types[7]
+#define SWIGTYPE_p_allocator_type swig_types[8]
+#define SWIGTYPE_p_char swig_types[9]
+#define SWIGTYPE_p_const_iterator swig_types[10]
+#define SWIGTYPE_p_corr_matrix_t swig_types[11]
+#define SWIGTYPE_p_difference_type swig_types[12]
+#define SWIGTYPE_p_fcn_residual_t swig_types[13]
+#define SWIGTYPE_p_fcn_scalar_t swig_types[14]
+#define SWIGTYPE_p_first_type swig_types[15]
+#define SWIGTYPE_p_int swig_types[16]
+#define SWIGTYPE_p_iterator swig_types[17]
+#define SWIGTYPE_p_key_type swig_types[18]
+#define SWIGTYPE_p_long_long swig_types[19]
+#define SWIGTYPE_p_mapped_type swig_types[20]
+#define SWIGTYPE_p_mumufit__Minimizer swig_types[21]
+#define SWIGTYPE_p_mumufit__MinimizerResult swig_types[22]
+#define SWIGTYPE_p_mumufit__Parameter swig_types[23]
+#define SWIGTYPE_p_mumufit__Parameters swig_types[24]
+#define SWIGTYPE_p_p_PyObject swig_types[25]
+#define SWIGTYPE_p_parameters_t swig_types[26]
+#define SWIGTYPE_p_second_type swig_types[27]
+#define SWIGTYPE_p_short swig_types[28]
+#define SWIGTYPE_p_signed_char swig_types[29]
+#define SWIGTYPE_p_size_type swig_types[30]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[31]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[32]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[33]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[34]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[35]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[36]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[37]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[38]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[39]
+#define SWIGTYPE_p_std__invalid_argument swig_types[40]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[41]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[42]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[43]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[44]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[45]
+#define SWIGTYPE_p_std__vectorT_mumufit__Parameter_std__allocatorT_mumufit__Parameter_t_t__const_iterator swig_types[46]
+#define SWIGTYPE_p_std__vectorT_mumufit__Parameter_std__allocatorT_mumufit__Parameter_t_t__iterator swig_types[47]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[48]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[49]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[50]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[51]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[52]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[53]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[54]
+#define SWIGTYPE_p_unsigned_char swig_types[55]
+#define SWIGTYPE_p_unsigned_int swig_types[56]
+#define SWIGTYPE_p_unsigned_long_long swig_types[57]
+#define SWIGTYPE_p_unsigned_short swig_types[58]
+#define SWIGTYPE_p_value_type swig_types[59]
+static swig_type_info *swig_types[61];
+static swig_module_info swig_module = {swig_types, 60, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6650,17 +6651,17 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_0(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::value_type const &x){ return self->insert(pos, x); }
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
-#include "Fit/Param/RealLimits.h"
-#include "Fit/Param/AttLimits.h"
-#include "Fit/Param/Parameter.h"
-#include "Fit/Param/Parameters.h"
-#include "Fit/Minimizer/IMinimizer.h"
-#include "Fit/Minimizer/MinimizerCatalog.h"
+#include "Fit/Kernel/FitOptions.h"
+#include "Fit/Kernel/Minimizer.h"
 #include "Fit/Kernel/MinimizerFactory.h"
-
 #include "Fit/Kernel/PyCallback.h"
+#include "Fit/Minimizer/IMinimizer.h"
+#include "Fit/Minimizer/MinimizerCatalog.h"
 #include "Fit/Minimizer/MinimizerResult.h"
-#include "Fit/Kernel/Minimizer.h"
+#include "Fit/Param/AttLimits.h"
+#include "Fit/Param/Parameter.h"
+#include "Fit/Param/Parameters.h"
+#include "Fit/Param/RealLimits.h"
 
 
 SWIGINTERN int
@@ -25926,258 +25927,197 @@ SWIGINTERN PyObject *Parameters_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObjec
   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) {
+SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  PyCallback *result = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
   
-  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(); 
+  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 *""'"); 
   }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PyCallback, SWIG_POINTER_NEW |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   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) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 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_PyCallback, SWIG_POINTER_DISOWN |  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 '" "delete_PyCallback" "', argument " "1"" of type '" "PyCallback *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  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_PyCallback_callback_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_algorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  PyCallback::CallbackType result;
+  std::string result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PyCallback, 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 '" "PyCallback_callback_type" "', argument " "1"" of type '" "PyCallback const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_algorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
-  result = (PyCallback::CallbackType)((PyCallback const *)arg1)->callback_type();
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->algorithmName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_PyCallback_call_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  mumufit::Parameters arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  fcn_scalar_t arg2 ;
+  mumufit::Parameters arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 ;
   int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  double result;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  mumufit::MinimizerResult 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_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 '" "PyCallback_call_scalar" "', argument " "1"" of type '" "PyCallback *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_scalar" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
   {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
+    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 '" "PyCallback_call_scalar" "', argument " "2"" of type '" "mumufit::Parameters""'"); 
+      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 '" "PyCallback_call_scalar" "', argument " "2"" of type '" "mumufit::Parameters""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "2"" of type '" "fcn_scalar_t""'");
     } else {
-      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp2);
+      fcn_scalar_t * temp = reinterpret_cast< fcn_scalar_t * >(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);
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "mumufit::Parameters""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "mumufit::Parameters""'");
     } else {
-      result = (double)(arg1)->call_scalar(arg2);
+      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
     }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
   }
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  result = (arg1)->minimize_scalar(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_PyCallback_call_residuals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize_residual(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
-  mumufit::Parameters arg2 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  fcn_residual_t arg2 ;
+  mumufit::Parameters arg3 ;
   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;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  mumufit::MinimizerResult 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_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 '" "PyCallback_call_residuals" "', argument " "1"" of type '" "PyCallback *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_residual" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< PyCallback * >(argp1);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
   {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
+    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 '" "PyCallback_call_residuals" "', argument " "2"" of type '" "mumufit::Parameters""'"); 
+      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 '" "PyCallback_call_residuals" "', argument " "2"" of type '" "mumufit::Parameters""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "2"" of type '" "fcn_residual_t""'");
     } else {
-      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp2);
+      fcn_residual_t * temp = reinterpret_cast< fcn_residual_t * >(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);
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "mumufit::Parameters""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "mumufit::Parameters""'");
     } else {
-      result = (arg1)->call_residuals(arg2);
+      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
     }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
   }
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  result = (arg1)->minimize_residual(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_disown_PyCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyCallback *arg1 = (PyCallback *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 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 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, 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();
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->clear();
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -26185,188 +26125,160 @@ fail:
 }
 
 
-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) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *result = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerResult", 0, 0, 0)) SWIG_fail;
-  result = (mumufit::MinimizerResult *)new mumufit::MinimizerResult();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_NEW |  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));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  mumufit::Parameters *arg2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setParameters", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  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 '" "MinimizerResult_setParameters" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "mumufit::Parameters const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "mumufit::Parameters const &""'"); 
+  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;
   }
-  arg2 = reinterpret_cast< mumufit::Parameters * >(argp2);
-  (arg1)->setParameters((mumufit::Parameters const &)*arg2);
+  (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 *_wrap_MinimizerResult_parameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  mumufit::Parameters result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_parameters" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
-  result = ((mumufit::MinimizerResult const *)arg1)->parameters();
-  resultobj = SWIG_NewPointerObj((new mumufit::Parameters(static_cast< const mumufit::Parameters& >(result))), SWIGTYPE_p_mumufit__Parameters, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  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_MinimizerResult_setMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_MinimizerCatalog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  MinimizerCatalog *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setMinValue", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setMinValue" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::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();
+  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerCatalog", 0, 0, 0)) SWIG_fail;
+  result = (MinimizerCatalog *)new MinimizerCatalog();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalog, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalog_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 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_mumufit__MinimizerResult, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_minValue" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_toString" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
-  result = (double)((mumufit::MinimizerResult const *)arg1)->minValue();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
+  result = ((MinimizerCatalog const *)arg1)->toString();
+  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_MinimizerCatalog_minimizerNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::string result;
+  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_mumufit__MinimizerResult, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_toString" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_minimizerNames" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
-  result = ((mumufit::MinimizerResult const *)arg1)->toString();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
+  result = ((MinimizerCatalog 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_MinimizerResult_setReport(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalog_algorithmNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 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, "MinimizerResult_setReport", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalog_algorithmNames", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setReport" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_algorithmNames" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
+  arg1 = reinterpret_cast< MinimizerCatalog * >(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 '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalog_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setReport" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalog_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  (arg1)->setReport((std::string const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  result = ((MinimizerCatalog 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:
@@ -26375,86 +26287,151 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setDuration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalog_algorithmDescriptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  double arg2 ;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
+  std::vector< std::string,std::allocator< std::string > > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setDuration", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalog_algorithmDescriptions", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setDuration" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_algorithmDescriptions" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::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< MinimizerCatalog * >(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 '" "MinimizerCatalog_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalog_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((MinimizerCatalog 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_MinimizerResult_setNumberOfCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerCatalog_minimizerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  int arg2 ;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
+  MinimizerInfo *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfCalls", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalog_minimizerInfo", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_minimizerInfo" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::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();
+  arg1 = reinterpret_cast< MinimizerCatalog * >(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 '" "MinimizerCatalog_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalog_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (MinimizerInfo *) &((MinimizerCatalog 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;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfGradientCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_MinimizerCatalog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalog *arg1 = (MinimizerCatalog *) 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_MinimizerCatalog, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerCatalog" "', argument " "1"" of type '" "MinimizerCatalog *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MinimizerCatalog_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerCatalog, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *MinimizerCatalog_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  mumufit::MinimizerResult *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerResult", 0, 0, 0)) SWIG_fail;
+  result = (mumufit::MinimizerResult *)new mumufit::MinimizerResult();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerResult_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
-  int arg2 ;
+  mumufit::Parameters *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfGradientCalls", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setParameters", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setParameters" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
   arg1 = reinterpret_cast< mumufit::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);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "mumufit::Parameters const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerResult_setParameters" "', argument " "2"" of type '" "mumufit::Parameters const &""'"); 
+  }
+  arg2 = reinterpret_cast< mumufit::Parameters * >(argp2);
+  (arg1)->setParameters((mumufit::Parameters const &)*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -26462,245 +26439,191 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_parameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  mumufit::Parameters result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerResult" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_parameters" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
   }
   arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  result = ((mumufit::MinimizerResult const *)arg1)->parameters();
+  resultobj = SWIG_NewPointerObj((new mumufit::Parameters(static_cast< const mumufit::Parameters& >(result))), SWIGTYPE_p_mumufit__Parameters, SWIG_POINTER_OWN |  0 );
   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_mumufit__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_new_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_setMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *result = 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_Minimizer", 0, 0, 0)) SWIG_fail;
-  result = (mumufit::Minimizer *)new mumufit::Minimizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_mumufit__Minimizer, SWIG_POINTER_NEW |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setMinValue", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setMinValue" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
+  }
+  arg1 = reinterpret_cast< mumufit::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_delete_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerResult_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Minimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_minValue" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::Minimizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
+  result = (double)((mumufit::MinimizerResult const *)arg1)->minValue();
+  resultobj = SWIG_From_double(static_cast< double >(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_MinimizerResult_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
-  std::string *arg2 = 0 ;
-  std::string *arg3 = 0 ;
-  std::string *arg4 = 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  int res3 = SWIG_OLDOBJ ;
-  int res4 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[1] ;
+  std::string result;
   
-  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::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 &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  {
-    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 &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  {
-    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;
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_toString" "', argument " "1"" of type '" "mumufit::MinimizerResult const *""'"); 
   }
-  (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;
+  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
+  result = ((mumufit::MinimizerResult const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   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_MinimizerResult_setReport(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
   std::string *arg2 = 0 ;
-  std::string *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  int res3 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
   
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setReport", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setReport" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::Minimizer * >(argp1);
+  arg1 = reinterpret_cast< mumufit::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 '" "Minimizer_setMinimizer" "', 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 '" "Minimizer_setMinimizer" "', 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;
   }
-  {
-    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 &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3);
+  (arg1)->setReport((std::string const &)*arg2);
   resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
-  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
   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_MinimizerResult_setDuration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
-  std::string *arg2 = 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setDuration", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setDuration" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
-  arg1 = reinterpret_cast< mumufit::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 &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  (arg1)->setMinimizer((std::string const &)*arg2);
+  arg1 = reinterpret_cast< mumufit::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();
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
-  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_MinimizerResult_setNumberOfCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
-  IMinimizer *arg2 = (IMinimizer *) 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  int arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfCalls", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::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 *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfCalls" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
-  arg2 = reinterpret_cast< IMinimizer * >(argp2);
-  (arg1)->setMinimizer(arg2);
+  arg1 = reinterpret_cast< mumufit::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:
@@ -26708,498 +26631,395 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[5] = {
-    0
-  };
+SWIGINTERN PyObject *_wrap_MinimizerResult_setNumberOfGradientCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "Minimizer_setMinimizer", 0, 4, argv))) SWIG_fail;
-  --argc;
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__Minimizer, 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);
-      }
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__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) {
-        return _wrap_Minimizer_setMinimizer__SWIG_2(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__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_mumufit__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);
-          }
-        }
-      }
-    }
+  if (!SWIG_Python_UnpackTuple(args, "MinimizerResult_setNumberOfGradientCalls", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerResult_setNumberOfGradientCalls" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
-  
+  arg1 = reinterpret_cast< mumufit::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:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Minimizer_setMinimizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    mumufit::Minimizer::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
-    "    mumufit::Minimizer::setMinimizer(std::string const &,std::string const &)\n"
-    "    mumufit::Minimizer::setMinimizer(std::string const &)\n"
-    "    mumufit::Minimizer::setMinimizer(IMinimizer *)\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Minimizer_minimize_cpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_MinimizerResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
-  PyCallback *arg2 = 0 ;
-  mumufit::Parameters *arg3 = 0 ;
+  mumufit::MinimizerResult *arg1 = (mumufit::MinimizerResult *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  mumufit::MinimizerResult result;
+  PyObject *swig_obj[1] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "Minimizer_minimize_cpp", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_minimize_cpp" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< mumufit::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_mumufit__Parameters,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "mumufit::Parameters const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "mumufit::Parameters const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerResult" "', argument " "1"" of type '" "mumufit::MinimizerResult *""'"); 
   }
-  arg3 = reinterpret_cast< mumufit::Parameters * >(argp3);
-  result = (arg1)->minimize(*arg2,(mumufit::Parameters const &)*arg3);
-  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< mumufit::MinimizerResult * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *Minimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+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_mumufit__Minimizer, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_mumufit__MinimizerResult, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *Minimizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MinimizerResult_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitOptions *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_FitOptions", 0, 0, 0)) SWIG_fail;
+  result = (FitOptions *)new FitOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitOptions, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitOptions_derivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMinimizer" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_derivEpsilon" "', argument " "1"" of type '" "FitOptions const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  result = (double)((FitOptions const *)arg1)->derivEpsilon();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FitOptions_setDerivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitOptions *arg1 = (FitOptions *) 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_IMinimizer, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "FitOptions_setDerivEpsilon", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  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 '" "FitOptions_setDerivEpsilon" "', argument " "1"" of type '" "FitOptions *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->minimizerName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setDerivEpsilon" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setDerivEpsilon(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_algorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FitOptions_stepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitOptions *arg1 = (FitOptions *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::string result;
+  double 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_FitOptions, 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 '" "FitOptions_stepFactor" "', argument " "1"" of type '" "FitOptions const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->algorithmName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  result = (double)((FitOptions const *)arg1)->stepFactor();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimize_scalar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FitOptions_setStepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  fcn_scalar_t arg2 ;
-  mumufit::Parameters arg3 ;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  mumufit::MinimizerResult 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 );
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "FitOptions_setStepFactor", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_scalar" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  {
-    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 '" "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;
-    }
-  }
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_mumufit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "mumufit::Parameters""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_scalar" "', argument " "3"" of type '" "mumufit::Parameters""'");
-    } else {
-      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_setStepFactor" "', argument " "1"" of type '" "FitOptions *""'"); 
   }
-  result = (arg1)->minimize_scalar(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setStepFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setStepFactor(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimize_residual(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  fcn_residual_t arg2 ;
-  mumufit::Parameters arg3 ;
+  FitOptions *arg1 = (FitOptions *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  mumufit::MinimizerResult result;
+  PyObject *swig_obj[1] ;
   
-  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 (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitOptions, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize_residual" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  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_mumufit__Parameters,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "mumufit::Parameters""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_minimize_residual" "', argument " "3"" of type '" "mumufit::Parameters""'");
-    } else {
-      mumufit::Parameters * temp = reinterpret_cast< mumufit::Parameters * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitOptions" "', argument " "1"" of type '" "FitOptions *""'"); 
   }
-  result = (arg1)->minimize_residual(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *FitOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitOptions, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *FitOptions_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
+  mumufit::Minimizer *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_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  (arg1)->clear();
-  resultobj = SWIG_Py_Void();
+  if (!SWIG_Python_UnpackTuple(args, "new_Minimizer", 0, 0, 0)) SWIG_fail;
+  result = (mumufit::Minimizer *)new mumufit::Minimizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_mumufit__Minimizer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_Minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  double 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_mumufit__Minimizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Minimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (double)((IMinimizer const *)arg1)->minValue();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< mumufit::Minimizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
   std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  std::string *arg4 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  PyObject *swig_obj[2] ;
+  int res3 = SWIG_OLDOBJ ;
+  int res4 = SWIG_OLDOBJ ;
   
-  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 ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 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 '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  arg1 = reinterpret_cast< mumufit::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 '" "IMinimizer_setOptions" "', 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 '" "IMinimizer_setOptions" "', 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;
   }
-  (arg1)->setOptions((std::string const &)*arg2);
+  {
+    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 &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  {
+    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(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
   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_MinimizerCatalog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerCatalog *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_MinimizerCatalog", 0, 0, 0)) SWIG_fail;
-  result = (MinimizerCatalog *)new MinimizerCatalog();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalog, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerCatalog_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::string result;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_toString" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
-  result = ((MinimizerCatalog const *)arg1)->toString();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< mumufit::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 &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    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 &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (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(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalog_minimizerNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::vector< std::string,std::allocator< std::string > > result;
+  int res2 = SWIG_OLDOBJ ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_minimizerNames" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
-  result = ((MinimizerCatalog 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_MinimizerCatalog_algorithmNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 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, "MinimizerCatalog_algorithmNames", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_algorithmNames" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
+  arg1 = reinterpret_cast< mumufit::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 '" "MinimizerCatalog_algorithmNames" "', 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 '" "MinimizerCatalog_algorithmNames" "', 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;
   }
-  result = ((MinimizerCatalog const *)arg1)->algorithmNames((std::string const &)*arg2);
-  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  (arg1)->setMinimizer((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
@@ -27208,110 +27028,171 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalog_algorithmDescriptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
-  std::string *arg2 = 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  IMinimizer *arg2 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject *swig_obj[2] ;
-  std::vector< std::string,std::allocator< std::string > > result;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalog_algorithmDescriptions", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_algorithmDescriptions" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_setMinimizer" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(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 '" "MinimizerCatalog_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalog_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
+  arg1 = reinterpret_cast< mumufit::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 *""'"); 
   }
-  result = ((MinimizerCatalog 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;
+  arg2 = reinterpret_cast< IMinimizer * >(argp2);
+  (arg1)->setMinimizer(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerCatalog_minimizerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
-  std::string *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject *swig_obj[2] ;
-  MinimizerInfo *result = 0 ;
+SWIGINTERN PyObject *_wrap_Minimizer_setMinimizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
   
-  if (!SWIG_Python_UnpackTuple(args, "MinimizerCatalog_minimizerInfo", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalog_minimizerInfo" "', argument " "1"" of type '" "MinimizerCatalog const *""'"); 
+  if (!(argc = SWIG_Python_UnpackTuple(args, "Minimizer_setMinimizer", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__Minimizer, 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);
+      }
+    }
   }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(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 '" "MinimizerCatalog_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__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) {
+        return _wrap_Minimizer_setMinimizer__SWIG_2(self, argc, argv);
+      }
     }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalog_minimizerInfo" "', argument " "2"" of type '" "std::string const &""'"); 
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__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);
+        }
+      }
     }
-    arg2 = ptr;
   }
-  result = (MinimizerInfo *) &((MinimizerCatalog 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;
-  return resultobj;
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_mumufit__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);
+          }
+        }
+      }
+    }
+  }
+  
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return NULL;
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Minimizer_setMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    mumufit::Minimizer::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    mumufit::Minimizer::setMinimizer(std::string const &,std::string const &)\n"
+    "    mumufit::Minimizer::setMinimizer(std::string const &)\n"
+    "    mumufit::Minimizer::setMinimizer(IMinimizer *)\n");
+  return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_MinimizerCatalog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Minimizer_minimize_cpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerCatalog *arg1 = (MinimizerCatalog *) 0 ;
+  mumufit::Minimizer *arg1 = (mumufit::Minimizer *) 0 ;
+  PyCallback *arg2 = 0 ;
+  mumufit::Parameters *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  mumufit::MinimizerResult result;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MinimizerCatalog, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Minimizer_minimize_cpp", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_mumufit__Minimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerCatalog" "', argument " "1"" of type '" "MinimizerCatalog *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Minimizer_minimize_cpp" "', argument " "1"" of type '" "mumufit::Minimizer *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerCatalog * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< mumufit::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_mumufit__Parameters,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "mumufit::Parameters const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Minimizer_minimize_cpp" "', argument " "3"" of type '" "mumufit::Parameters const &""'"); 
+  }
+  arg3 = reinterpret_cast< mumufit::Parameters * >(argp3);
+  result = (arg1)->minimize(*arg2,(mumufit::Parameters const &)*arg3);
+  resultobj = SWIG_NewPointerObj((new mumufit::MinimizerResult(static_cast< const mumufit::MinimizerResult& >(result))), SWIGTYPE_p_mumufit__MinimizerResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *MinimizerCatalog_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+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_MinimizerCatalog, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_mumufit__Minimizer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *MinimizerCatalog_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *Minimizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -27576,8 +27457,278 @@ SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self
   if (!SWIG_IsOK(res1)) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+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) {
+  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] ;
+  
+  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 ;
+  mumufit::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_mumufit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "mumufit::Parameters""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_scalar" "', argument " "2"" of type '" "mumufit::Parameters""'");
+    } else {
+      mumufit::Parameters * temp = reinterpret_cast< mumufit::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 ;
+  mumufit::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_mumufit__Parameters,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "mumufit::Parameters""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PyCallback_call_residuals" "', argument " "2"" of type '" "mumufit::Parameters""'");
+    } else {
+      mumufit::Parameters * temp = reinterpret_cast< mumufit::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);
+    }
+  } 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:
@@ -27585,14 +27736,14 @@ fail:
 }
 
 
-SWIGINTERN PyObject *MinimizerFactory_swigregister(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_MinimizerFactory, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_PyCallback, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *MinimizerFactory_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *PyCallback_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -28505,54 +28656,100 @@ 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},
-	 { "new_PyCallback", _wrap_new_PyCallback, METH_VARARGS, "\n"
-		"PyCallback(PyCallback::CallbackType callback_type=SCALAR)\n"
-		"PyCallback::PyCallback(CallbackType callback_type=SCALAR)\n"
+	 { "delete_IMinimizer", _wrap_delete_IMinimizer, METH_O, "\n"
+		"delete_IMinimizer(IMinimizer self)\n"
+		"IMinimizer::~IMinimizer()\n"
 		"\n"
 		""},
-	 { "delete_PyCallback", _wrap_delete_PyCallback, METH_O, "\n"
-		"delete_PyCallback(PyCallback self)\n"
-		"PyCallback::~PyCallback()\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"
 		""},
-	 { "PyCallback_callback_type", _wrap_PyCallback_callback_type, METH_O, "\n"
-		"PyCallback_callback_type(PyCallback self) -> PyCallback::CallbackType\n"
-		"PyCallback::CallbackType PyCallback::callback_type() const\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"
 		""},
-	 { "PyCallback_call_scalar", _wrap_PyCallback_call_scalar, METH_VARARGS, "\n"
-		"PyCallback_call_scalar(PyCallback self, Parameters pars) -> double\n"
-		"double PyCallback::call_scalar(mumufit::Parameters pars)\n"
+	 { "IMinimizer_minimize_scalar", _wrap_IMinimizer_minimize_scalar, METH_VARARGS, "\n"
+		"IMinimizer_minimize_scalar(IMinimizer self, fcn_scalar_t arg2, Parameters arg3) -> MinimizerResult\n"
+		"mumufit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, mumufit::Parameters)\n"
 		"\n"
-		"Call Python callable and returns its result. Intended to be overloaded in Python.\n"
+		"run minimization \n"
 		"\n"
-		"Parameters:\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"
+		"mumufit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, mumufit::Parameters)\n"
 		"\n"
-		"pars: \n"
-		"Fit parameters object (intentionally passed by value).\n"
+		""},
+	 { "IMinimizer_clear", _wrap_IMinimizer_clear, METH_O, "\n"
+		"IMinimizer_clear(IMinimizer self)\n"
+		"virtual void IMinimizer::clear()\n"
 		"\n"
-		"value of objective function. \n"
+		"clear resources (parameters) for consecutives minimizations \n"
 		"\n"
 		""},
-	 { "PyCallback_call_residuals", _wrap_PyCallback_call_residuals, METH_VARARGS, "\n"
-		"PyCallback_call_residuals(PyCallback self, Parameters pars) -> vdouble1d_t\n"
-		"std::vector< double > PyCallback::call_residuals(mumufit::Parameters pars)\n"
+	 { "IMinimizer_minValue", _wrap_IMinimizer_minValue, METH_O, "\n"
+		"IMinimizer_minValue(IMinimizer self) -> double\n"
+		"double IMinimizer::minValue() const\n"
 		"\n"
-		"Call Python callable and returns its result. Intended to be overloaded in Python.\n"
+		"Returns minimum function value. \n"
 		"\n"
-		"Parameters:\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"
-		"pars: \n"
-		"Fit parameters object (intentionally passed by value).\n"
+		"Sets option string to the minimizer. \n"
 		"\n"
-		"vector of residuals \n"
+		""},
+	 { "IMinimizer_swigregister", IMinimizer_swigregister, METH_O, NULL},
+	 { "new_MinimizerCatalog", _wrap_new_MinimizerCatalog, METH_NOARGS, "\n"
+		"new_MinimizerCatalog() -> MinimizerCatalog\n"
+		"MinimizerCatalog::MinimizerCatalog()\n"
 		"\n"
 		""},
-	 { "disown_PyCallback", _wrap_disown_PyCallback, METH_O, NULL},
-	 { "PyCallback_swigregister", PyCallback_swigregister, METH_O, NULL},
-	 { "PyCallback_swiginit", PyCallback_swiginit, METH_VARARGS, NULL},
+	 { "MinimizerCatalog_toString", _wrap_MinimizerCatalog_toString, METH_O, "\n"
+		"MinimizerCatalog_toString(MinimizerCatalog self) -> std::string\n"
+		"std::string MinimizerCatalog::toString() const\n"
+		"\n"
+		"Returns multiline string representing catalog content. \n"
+		"\n"
+		""},
+	 { "MinimizerCatalog_minimizerNames", _wrap_MinimizerCatalog_minimizerNames, METH_O, "\n"
+		"MinimizerCatalog_minimizerNames(MinimizerCatalog self) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalog::minimizerNames() const\n"
+		"\n"
+		""},
+	 { "MinimizerCatalog_algorithmNames", _wrap_MinimizerCatalog_algorithmNames, METH_VARARGS, "\n"
+		"MinimizerCatalog_algorithmNames(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalog::algorithmNames(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithms defined for the minimizer with a given name. \n"
+		"\n"
+		""},
+	 { "MinimizerCatalog_algorithmDescriptions", _wrap_MinimizerCatalog_algorithmDescriptions, METH_VARARGS, "\n"
+		"MinimizerCatalog_algorithmDescriptions(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t\n"
+		"std::vector< std::string > MinimizerCatalog::algorithmDescriptions(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithm's descriptions for the minimizer with a given name . \n"
+		"\n"
+		""},
+	 { "MinimizerCatalog_minimizerInfo", _wrap_MinimizerCatalog_minimizerInfo, METH_VARARGS, "\n"
+		"MinimizerCatalog_minimizerInfo(MinimizerCatalog self, std::string const & minimizerName) -> MinimizerInfo const &\n"
+		"const MinimizerInfo & MinimizerCatalog::minimizerInfo(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns info for minimizer with given name. \n"
+		"\n"
+		""},
+	 { "delete_MinimizerCatalog", _wrap_delete_MinimizerCatalog, METH_O, "delete_MinimizerCatalog(MinimizerCatalog self)"},
+	 { "MinimizerCatalog_swigregister", MinimizerCatalog_swigregister, METH_O, NULL},
+	 { "MinimizerCatalog_swiginit", MinimizerCatalog_swiginit, METH_VARARGS, NULL},
 	 { "new_MinimizerResult", _wrap_new_MinimizerResult, METH_NOARGS, "\n"
 		"new_MinimizerResult() -> MinimizerResult\n"
 		"MinimizerResult::MinimizerResult()\n"
@@ -28610,6 +28807,34 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_MinimizerResult", _wrap_delete_MinimizerResult, METH_O, "delete_MinimizerResult(MinimizerResult self)"},
 	 { "MinimizerResult_swigregister", MinimizerResult_swigregister, METH_O, NULL},
 	 { "MinimizerResult_swiginit", MinimizerResult_swiginit, METH_VARARGS, NULL},
+	 { "new_FitOptions", _wrap_new_FitOptions, METH_NOARGS, "\n"
+		"new_FitOptions() -> FitOptions\n"
+		"FitOptions::FitOptions()\n"
+		"\n"
+		""},
+	 { "FitOptions_derivEpsilon", _wrap_FitOptions_derivEpsilon, METH_O, "\n"
+		"FitOptions_derivEpsilon(FitOptions self) -> double\n"
+		"double FitOptions::derivEpsilon() const\n"
+		"\n"
+		""},
+	 { "FitOptions_setDerivEpsilon", _wrap_FitOptions_setDerivEpsilon, METH_VARARGS, "\n"
+		"FitOptions_setDerivEpsilon(FitOptions self, double deriv_epsilon)\n"
+		"void FitOptions::setDerivEpsilon(double deriv_epsilon)\n"
+		"\n"
+		""},
+	 { "FitOptions_stepFactor", _wrap_FitOptions_stepFactor, METH_O, "\n"
+		"FitOptions_stepFactor(FitOptions self) -> double\n"
+		"double FitOptions::stepFactor() const\n"
+		"\n"
+		""},
+	 { "FitOptions_setStepFactor", _wrap_FitOptions_setStepFactor, METH_VARARGS, "\n"
+		"FitOptions_setStepFactor(FitOptions self, double step_factor)\n"
+		"void FitOptions::setStepFactor(double step_factor)\n"
+		"\n"
+		""},
+	 { "delete_FitOptions", _wrap_delete_FitOptions, METH_O, "delete_FitOptions(FitOptions self)"},
+	 { "FitOptions_swigregister", FitOptions_swigregister, METH_O, NULL},
+	 { "FitOptions_swiginit", FitOptions_swiginit, METH_VARARGS, NULL},
 	 { "new_Minimizer", _wrap_new_Minimizer, METH_NOARGS, "\n"
 		"new_Minimizer() -> Minimizer\n"
 		"Minimizer::Minimizer()\n"
@@ -28635,117 +28860,71 @@ 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"
-		"mumufit::MinimizerResult IMinimizer::minimize_scalar(fcn_scalar_t, mumufit::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"
-		"mumufit::MinimizerResult IMinimizer::minimize_residual(fcn_residual_t, mumufit::Parameters)\n"
-		"\n"
-		""},
-	 { "IMinimizer_clear", _wrap_IMinimizer_clear, METH_O, "\n"
-		"IMinimizer_clear(IMinimizer self)\n"
-		"virtual void IMinimizer::clear()\n"
+	 { "MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, "MinimizerFactory_createMinimizer(std::string const & minimizerName, std::string const & algorithmType=\"\", std::string const & optionString=\"\") -> IMinimizer"},
+	 { "MinimizerFactory_printCatalog", _wrap_MinimizerFactory_printCatalog, METH_NOARGS, "MinimizerFactory_printCatalog()"},
+	 { "MinimizerFactory_catalogToString", _wrap_MinimizerFactory_catalogToString, METH_NOARGS, "MinimizerFactory_catalogToString() -> std::string"},
+	 { "MinimizerFactory_catalogDetailsToString", _wrap_MinimizerFactory_catalogDetailsToString, METH_NOARGS, "MinimizerFactory_catalogDetailsToString() -> std::string"},
+	 { "MinimizerFactory_catalog", _wrap_MinimizerFactory_catalog, METH_NOARGS, "MinimizerFactory_catalog() -> MinimizerCatalog"},
+	 { "new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_NOARGS, "\n"
+		"new_MinimizerFactory() -> MinimizerFactory\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"
+		"Factory to create minimizers.\n"
 		"\n"
-		"Returns minimum function value. \n"
+		"C++ includes: MinimizerFactory.h\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"
+	 { "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"
 		"\n"
 		""},
-	 { "IMinimizer_swigregister", IMinimizer_swigregister, METH_O, NULL},
-	 { "new_MinimizerCatalog", _wrap_new_MinimizerCatalog, METH_NOARGS, "\n"
-		"new_MinimizerCatalog() -> MinimizerCatalog\n"
-		"MinimizerCatalog::MinimizerCatalog()\n"
+	 { "delete_PyCallback", _wrap_delete_PyCallback, METH_O, "\n"
+		"delete_PyCallback(PyCallback self)\n"
+		"PyCallback::~PyCallback()\n"
 		"\n"
 		""},
-	 { "MinimizerCatalog_toString", _wrap_MinimizerCatalog_toString, METH_O, "\n"
-		"MinimizerCatalog_toString(MinimizerCatalog self) -> std::string\n"
-		"std::string MinimizerCatalog::toString() const\n"
-		"\n"
-		"Returns multiline string representing catalog content. \n"
+	 { "PyCallback_callback_type", _wrap_PyCallback_callback_type, METH_O, "\n"
+		"PyCallback_callback_type(PyCallback self) -> PyCallback::CallbackType\n"
+		"PyCallback::CallbackType PyCallback::callback_type() const\n"
 		"\n"
 		""},
-	 { "MinimizerCatalog_minimizerNames", _wrap_MinimizerCatalog_minimizerNames, METH_O, "\n"
-		"MinimizerCatalog_minimizerNames(MinimizerCatalog self) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalog::minimizerNames() const\n"
+	 { "PyCallback_call_scalar", _wrap_PyCallback_call_scalar, METH_VARARGS, "\n"
+		"PyCallback_call_scalar(PyCallback self, Parameters pars) -> double\n"
+		"double PyCallback::call_scalar(mumufit::Parameters pars)\n"
 		"\n"
-		""},
-	 { "MinimizerCatalog_algorithmNames", _wrap_MinimizerCatalog_algorithmNames, METH_VARARGS, "\n"
-		"MinimizerCatalog_algorithmNames(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalog::algorithmNames(const std::string &minimizerName) const\n"
+		"Call Python callable and returns its result. Intended to be overloaded in Python.\n"
 		"\n"
-		"Returns list of algorithms defined for the minimizer with a given name. \n"
+		"Parameters:\n"
+		"-----------\n"
 		"\n"
-		""},
-	 { "MinimizerCatalog_algorithmDescriptions", _wrap_MinimizerCatalog_algorithmDescriptions, METH_VARARGS, "\n"
-		"MinimizerCatalog_algorithmDescriptions(MinimizerCatalog self, std::string const & minimizerName) -> vector_string_t\n"
-		"std::vector< std::string > MinimizerCatalog::algorithmDescriptions(const std::string &minimizerName) const\n"
+		"pars: \n"
+		"Fit parameters object (intentionally passed by value).\n"
 		"\n"
-		"Returns list of algorithm's descriptions for the minimizer with a given name . \n"
+		"value of objective function. \n"
 		"\n"
 		""},
-	 { "MinimizerCatalog_minimizerInfo", _wrap_MinimizerCatalog_minimizerInfo, METH_VARARGS, "\n"
-		"MinimizerCatalog_minimizerInfo(MinimizerCatalog self, std::string const & minimizerName) -> MinimizerInfo const &\n"
-		"const MinimizerInfo & MinimizerCatalog::minimizerInfo(const std::string &minimizerName) const\n"
-		"\n"
-		"Returns info for minimizer with given name. \n"
+	 { "PyCallback_call_residuals", _wrap_PyCallback_call_residuals, METH_VARARGS, "\n"
+		"PyCallback_call_residuals(PyCallback self, Parameters pars) -> vdouble1d_t\n"
+		"std::vector< double > PyCallback::call_residuals(mumufit::Parameters pars)\n"
 		"\n"
-		""},
-	 { "delete_MinimizerCatalog", _wrap_delete_MinimizerCatalog, METH_O, "delete_MinimizerCatalog(MinimizerCatalog self)"},
-	 { "MinimizerCatalog_swigregister", MinimizerCatalog_swigregister, METH_O, NULL},
-	 { "MinimizerCatalog_swiginit", MinimizerCatalog_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_printCatalog", _wrap_MinimizerFactory_printCatalog, METH_NOARGS, "MinimizerFactory_printCatalog()"},
-	 { "MinimizerFactory_catalogToString", _wrap_MinimizerFactory_catalogToString, METH_NOARGS, "MinimizerFactory_catalogToString() -> std::string"},
-	 { "MinimizerFactory_catalogDetailsToString", _wrap_MinimizerFactory_catalogDetailsToString, METH_NOARGS, "MinimizerFactory_catalogDetailsToString() -> std::string"},
-	 { "MinimizerFactory_catalog", _wrap_MinimizerFactory_catalog, METH_NOARGS, "MinimizerFactory_catalog() -> MinimizerCatalog"},
-	 { "new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_NOARGS, "\n"
-		"new_MinimizerFactory() -> MinimizerFactory\n"
+		"Call Python callable and returns its result. Intended to be overloaded in Python.\n"
 		"\n"
+		"Parameters:\n"
+		"-----------\n"
 		"\n"
-		"Factory to create minimizers.\n"
+		"pars: \n"
+		"Fit parameters object (intentionally passed by value).\n"
 		"\n"
-		"C++ includes: MinimizerFactory.h\n"
+		"vector of residuals \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},
+	 { "disown_PyCallback", _wrap_disown_PyCallback, METH_O, NULL},
+	 { "PyCallback_swigregister", PyCallback_swigregister, METH_O, NULL},
+	 { "PyCallback_swiginit", PyCallback_swiginit, METH_VARARGS, NULL},
 	 { NULL, NULL, 0, NULL }
 };
 
@@ -28757,6 +28936,7 @@ static PyMethodDef SwigMethods_proxydocs[] = {
 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
 
 static swig_type_info _swigt__p_AttLimits = {"_p_AttLimits", "AttLimits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitOptions = {"_p_FitOptions", "FitOptions *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IMinimizer = {"_p_IMinimizer", "IMinimizer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MinimizerCatalog = {"_p_MinimizerCatalog", "MinimizerCatalog *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MinimizerFactory = {"_p_MinimizerFactory", "MinimizerFactory *", 0, 0, (void*)0, 0};
@@ -28818,6 +28998,7 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_AttLimits,
+  &_swigt__p_FitOptions,
   &_swigt__p_IMinimizer,
   &_swigt__p_MinimizerCatalog,
   &_swigt__p_MinimizerFactory,
@@ -28879,6 +29060,7 @@ static swig_type_info *swig_type_initial[] = {
 };
 
 static swig_cast_info _swigc__p_AttLimits[] = {  {&_swigt__p_AttLimits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitOptions[] = {  {&_swigt__p_FitOptions, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMinimizer[] = {  {&_swigt__p_IMinimizer, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MinimizerCatalog[] = {  {&_swigt__p_MinimizerCatalog, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MinimizerFactory[] = {  {&_swigt__p_MinimizerFactory, 0, 0, 0},{0, 0, 0, 0}};
@@ -28940,6 +29122,7 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_AttLimits,
+  _swigc__p_FitOptions,
   _swigc__p_IMinimizer,
   _swigc__p_MinimizerCatalog,
   _swigc__p_MinimizerFactory,
-- 
GitLab