From 3f7cbc4820b2d11a795719aff23423f9478e9589 Mon Sep 17 00:00:00 2001
From: Jonathan Fisher <j.fisher@jz-juelich.de>
Date: Tue, 15 Mar 2016 14:52:27 +0100
Subject: [PATCH] updated swig interface to fix issues with std::shared_ptr

---
 Core/Algorithms/inc/ISampleBuilder.h       |    4 +-
 Core/PythonAPI/libBornAgainCore.py         |  128 +-
 Core/PythonAPI/libBornAgainCore_wrap.cxx   | 1638 +-----
 Core/PythonAPI/libBornAgainCore_wrap.h     |   79 +-
 Core/Tools/inc/INamedShared.h              |   52 -
 Core/Tools/inc/IParameterizedShared.h      |  104 -
 Core/Tools/src/INamedShared.cpp            |   42 -
 Core/Tools/src/IParameterizedShared.cpp    |   88 -
 Fit/PythonAPI/libBornAgainFit.py           | 1346 ++---
 Fit/PythonAPI/libBornAgainFit_wrap.cxx     | 5412 ++++++++++----------
 Tests/PerformanceTests/customformfactor.py |    6 +-
 dev-tools/swig/extends.i                   |    4 +
 dev-tools/swig/libBornAgainCore.i          |    3 -
 dev-tools/swig/libBornAgainFit.i           |   13 +-
 dev-tools/swig/shared_pointers.i           |  156 +-
 15 files changed, 3787 insertions(+), 5288 deletions(-)
 delete mode 100644 Core/Tools/inc/INamedShared.h
 delete mode 100644 Core/Tools/inc/IParameterizedShared.h
 delete mode 100644 Core/Tools/src/INamedShared.cpp
 delete mode 100644 Core/Tools/src/IParameterizedShared.cpp

diff --git a/Core/Algorithms/inc/ISampleBuilder.h b/Core/Algorithms/inc/ISampleBuilder.h
index ba94434d1a4..f164c510f6e 100644
--- a/Core/Algorithms/inc/ISampleBuilder.h
+++ b/Core/Algorithms/inc/ISampleBuilder.h
@@ -18,7 +18,7 @@
 
 #include "ISample.h"
 #include <memory>
-#include "IParameterizedShared.h"
+#include "IParameterized.h"
 
 class IComponentService;
 
@@ -27,7 +27,7 @@ class IComponentService;
 //! @brief Interface to the class capable to build samples to simulate
 
 
-class BA_CORE_API_ ISampleBuilder : public IParameterizedShared
+class BA_CORE_API_ ISampleBuilder : public IParameterized
 {
 public:
     ISampleBuilder() { setName("SampleBuilder"); }
diff --git a/Core/PythonAPI/libBornAgainCore.py b/Core/PythonAPI/libBornAgainCore.py
index 49500e940d6..baa2f74d51b 100644
--- a/Core/PythonAPI/libBornAgainCore.py
+++ b/Core/PythonAPI/libBornAgainCore.py
@@ -1833,43 +1833,6 @@ class INamed(_object):
 INamed_swigregister = _libBornAgainCore.INamed_swigregister
 INamed_swigregister(INamed)
 
-class INamedShared(_object):
-    """Proxy of C++ INamedShared class."""
-
-    __swig_setmethods__ = {}
-    __setattr__ = lambda self, name, value: _swig_setattr(self, INamedShared, name, value)
-    __swig_getmethods__ = {}
-    __getattr__ = lambda self, name: _swig_getattr(self, INamedShared, name)
-    __repr__ = _swig_repr
-
-    def __init__(self, *args):
-        """
-        __init__(INamedShared self) -> INamedShared
-        __init__(INamedShared self, std::string name) -> INamedShared
-        """
-        if self.__class__ == INamedShared:
-            _self = None
-        else:
-            _self = self
-        this = _libBornAgainCore.new_INamedShared(_self, *args)
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-    __swig_destroy__ = _libBornAgainCore.delete_INamedShared
-    __del__ = lambda self: None
-
-    def getName(self):
-        """getName(INamedShared self) -> std::string"""
-        return _libBornAgainCore.INamedShared_getName(self)
-
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainCore.disown_INamedShared(self)
-        return weakref_proxy(self)
-INamedShared_swigregister = _libBornAgainCore.INamedShared_swigregister
-INamedShared_swigregister(INamedShared)
-
 class IParameterized(INamed):
     """
 
@@ -2030,86 +1993,6 @@ class ParameterPattern(_object):
 ParameterPattern_swigregister = _libBornAgainCore.ParameterPattern_swigregister
 ParameterPattern_swigregister(ParameterPattern)
 
-class IParameterizedShared(INamedShared):
-    """Proxy of C++ IParameterizedShared class."""
-
-    __swig_setmethods__ = {}
-    for _s in [INamedShared]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IParameterizedShared, name, value)
-    __swig_getmethods__ = {}
-    for _s in [INamedShared]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IParameterizedShared, name)
-    __repr__ = _swig_repr
-
-    def __init__(self, *args):
-        """
-        __init__(IParameterizedShared self) -> IParameterizedShared
-        __init__(IParameterizedShared self, std::string const & name) -> IParameterizedShared
-        __init__(IParameterizedShared self, IParameterizedShared other) -> IParameterizedShared
-        """
-        if self.__class__ == IParameterizedShared:
-            _self = None
-        else:
-            _self = self
-        this = _libBornAgainCore.new_IParameterizedShared(_self, *args)
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-    __swig_destroy__ = _libBornAgainCore.delete_IParameterizedShared
-    __del__ = lambda self: None
-
-    def getParameterPool(self):
-        """getParameterPool(IParameterizedShared self) -> ParameterPool"""
-        return _libBornAgainCore.IParameterizedShared_getParameterPool(self)
-
-
-    def createParameterTree(self):
-        """createParameterTree(IParameterizedShared self) -> ParameterPool"""
-        return _libBornAgainCore.IParameterizedShared_createParameterTree(self)
-
-
-    def printParameters(self):
-        """printParameters(IParameterizedShared self)"""
-        return _libBornAgainCore.IParameterizedShared_printParameters(self)
-
-
-    def setParameterValue(self, name, value):
-        """setParameterValue(IParameterizedShared self, std::string const & name, double value) -> bool"""
-        return _libBornAgainCore.IParameterizedShared_setParameterValue(self, name, value)
-
-
-    def clearParameterPool(self):
-        """clearParameterPool(IParameterizedShared self)"""
-        return _libBornAgainCore.IParameterizedShared_clearParameterPool(self)
-
-
-    def addParametersToExternalPool(self, path, external_pool, copy_number=-1):
-        """
-        addParametersToExternalPool(IParameterizedShared self, std::string path, ParameterPool external_pool, int copy_number=-1) -> std::string
-        addParametersToExternalPool(IParameterizedShared self, std::string path, ParameterPool external_pool) -> std::string
-        """
-        return _libBornAgainCore.IParameterizedShared_addParametersToExternalPool(self, path, external_pool, copy_number)
-
-
-    def _print(self, ostr):
-        """_print(IParameterizedShared self, std::ostream & ostr)"""
-        return _libBornAgainCore.IParameterizedShared__print(self, ostr)
-
-
-    def init_parameters(self):
-        """init_parameters(IParameterizedShared self)"""
-        return _libBornAgainCore.IParameterizedShared_init_parameters(self)
-
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainCore.disown_IParameterizedShared(self)
-        return weakref_proxy(self)
-IParameterizedShared_swigregister = _libBornAgainCore.IParameterizedShared_swigregister
-IParameterizedShared_swigregister(IParameterizedShared)
-
 
 def GetMajorVersionNumber():
     """
@@ -4756,7 +4639,7 @@ class swig_dummy_type_const_isample_vector(_object):
 swig_dummy_type_const_isample_vector_swigregister = _libBornAgainCore.swig_dummy_type_const_isample_vector_swigregister
 swig_dummy_type_const_isample_vector_swigregister(swig_dummy_type_const_isample_vector)
 
-class ISampleBuilder(IParameterizedShared):
+class ISampleBuilder(IParameterized):
     """
 
 
@@ -4767,11 +4650,11 @@ class ISampleBuilder(IParameterizedShared):
     """
 
     __swig_setmethods__ = {}
-    for _s in [IParameterizedShared]:
+    for _s in [IParameterized]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
     __setattr__ = lambda self, name, value: _swig_setattr(self, ISampleBuilder, name, value)
     __swig_getmethods__ = {}
-    for _s in [IParameterizedShared]:
+    for _s in [IParameterized]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
     __getattr__ = lambda self, name: _swig_getattr(self, ISampleBuilder, name)
     __repr__ = _swig_repr
@@ -4822,6 +4705,11 @@ class ISampleBuilder(IParameterizedShared):
         """
         return _libBornAgainCore.ISampleBuilder_registerParameter(self, *args)
 
+
+    def setParameterValue(self, name, value):
+        """setParameterValue(ISampleBuilder self, std::string const & name, double value) -> bool"""
+        return _libBornAgainCore.ISampleBuilder_setParameterValue(self, name, value)
+
     def __disown__(self):
         self.this.disown()
         _libBornAgainCore.disown_ISampleBuilder(self)
diff --git a/Core/PythonAPI/libBornAgainCore_wrap.cxx b/Core/PythonAPI/libBornAgainCore_wrap.cxx
index 2683af48015..6e38a1b27a7 100644
--- a/Core/PythonAPI/libBornAgainCore_wrap.cxx
+++ b/Core/PythonAPI/libBornAgainCore_wrap.cxx
@@ -3568,138 +3568,130 @@ namespace Swig {
 #define SWIGTYPE_p_ILayout swig_types[111]
 #define SWIGTYPE_p_IMaterial swig_types[112]
 #define SWIGTYPE_p_INamed swig_types[113]
-#define SWIGTYPE_p_INamedShared swig_types[114]
-#define SWIGTYPE_p_IObservable swig_types[115]
-#define SWIGTYPE_p_IObserver swig_types[116]
-#define SWIGTYPE_p_IParameterized swig_types[117]
-#define SWIGTYPE_p_IParameterizedShared swig_types[118]
-#define SWIGTYPE_p_IParticle swig_types[119]
-#define SWIGTYPE_p_IPixelMap swig_types[120]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[121]
-#define SWIGTYPE_p_IRotation swig_types[122]
-#define SWIGTYPE_p_IRoughness swig_types[123]
-#define SWIGTYPE_p_ISample swig_types[124]
-#define SWIGTYPE_p_ISampleBuilder swig_types[125]
-#define SWIGTYPE_p_ISampleVisitor swig_types[126]
-#define SWIGTYPE_p_ISelectionRule swig_types[127]
-#define SWIGTYPE_p_Instrument swig_types[128]
-#define SWIGTYPE_p_IntensityDataFunctions swig_types[129]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[130]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[131]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[132]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[133]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[134]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[135]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[136]
-#define SWIGTYPE_p_KVectorContainer swig_types[137]
-#define SWIGTYPE_p_Lattice swig_types[138]
-#define SWIGTYPE_p_Lattice1DParameters swig_types[139]
-#define SWIGTYPE_p_Lattice2DParameters swig_types[140]
-#define SWIGTYPE_p_Layer swig_types[141]
-#define SWIGTYPE_p_LayerDWBASimulation swig_types[142]
-#define SWIGTYPE_p_LayerInterface swig_types[143]
-#define SWIGTYPE_p_LayerRTCoefficients_t swig_types[144]
-#define SWIGTYPE_p_LayerRoughness swig_types[145]
-#define SWIGTYPE_p_MSG__Logger swig_types[146]
-#define SWIGTYPE_p_Mask swig_types[147]
-#define SWIGTYPE_p_MesoCrystal swig_types[148]
-#define SWIGTYPE_p_MultiLayer swig_types[149]
-#define SWIGTYPE_p_MultiLayerDWBASimulation swig_types[150]
-#define SWIGTYPE_p_MultiLayerRTCoefficients_t swig_types[151]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[152]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[153]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[154]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[155]
-#define SWIGTYPE_p_OutputDataT_std__complexT_double_t_t swig_types[156]
-#define SWIGTYPE_p_ParameterDistribution swig_types[157]
-#define SWIGTYPE_p_ParameterPattern swig_types[158]
-#define SWIGTYPE_p_ParameterPool swig_types[159]
-#define SWIGTYPE_p_Particle swig_types[160]
-#define SWIGTYPE_p_ParticleComposition swig_types[161]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[162]
-#define SWIGTYPE_p_ParticleDistribution swig_types[163]
-#define SWIGTYPE_p_ParticleLayout swig_types[164]
-#define SWIGTYPE_p_ProgramOptions swig_types[165]
-#define SWIGTYPE_p_RealParameterWrapper swig_types[166]
-#define SWIGTYPE_p_RectPixelMap swig_types[167]
-#define SWIGTYPE_p_RectangularDetector swig_types[168]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[169]
-#define SWIGTYPE_p_RotationEuler swig_types[170]
-#define SWIGTYPE_p_RotationX swig_types[171]
-#define SWIGTYPE_p_RotationY swig_types[172]
-#define SWIGTYPE_p_RotationZ swig_types[173]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_const_t swig_types[174]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[175]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[176]
-#define SWIGTYPE_p_Simulation swig_types[177]
-#define SWIGTYPE_p_SimulationParameters swig_types[178]
-#define SWIGTYPE_p_SimulationRegistry swig_types[179]
-#define SWIGTYPE_p_SpecularSimulation swig_types[180]
-#define SWIGTYPE_p_SphericalDetector swig_types[181]
-#define SWIGTYPE_p_ThreadInfo swig_types[182]
-#define SWIGTYPE_p_VariableBinAxis swig_types[183]
-#define SWIGTYPE_p_WavevectorInfo swig_types[184]
-#define SWIGTYPE_p__object swig_types[185]
-#define SWIGTYPE_p_allocator_type swig_types[186]
-#define SWIGTYPE_p_char swig_types[187]
-#define SWIGTYPE_p_const_iterator swig_types[188]
-#define SWIGTYPE_p_const_reference swig_types[189]
-#define SWIGTYPE_p_difference_type swig_types[190]
-#define SWIGTYPE_p_double swig_types[191]
-#define SWIGTYPE_p_int swig_types[192]
-#define SWIGTYPE_p_iterator swig_types[193]
-#define SWIGTYPE_p_observer_t swig_types[194]
-#define SWIGTYPE_p_observerlist_t swig_types[195]
-#define SWIGTYPE_p_p__object swig_types[196]
-#define SWIGTYPE_p_parameter_t swig_types[197]
-#define SWIGTYPE_p_parametermap_t swig_types[198]
-#define SWIGTYPE_p_reference swig_types[199]
-#define SWIGTYPE_p_size_type swig_types[200]
-#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_double_t_t swig_types[201]
-#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t swig_types[202]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[203]
-#define SWIGTYPE_p_std__allocatorT_ISample_const_p_t swig_types[204]
-#define SWIGTYPE_p_std__allocatorT_ISample_p_t swig_types[205]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[206]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[207]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[208]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[209]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[210]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[211]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[212]
-#define SWIGTYPE_p_std__invalid_argument swig_types[213]
-#define SWIGTYPE_p_std__ostream swig_types[214]
-#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[215]
-#define SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t swig_types[216]
-#define SWIGTYPE_p_std__shared_ptrT_INamedShared_t swig_types[217]
-#define SWIGTYPE_p_std__shared_ptrT_INamedTemplateT_IShareable_t_t swig_types[218]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[219]
-#define SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t swig_types[220]
-#define SWIGTYPE_p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t swig_types[221]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[222]
-#define SWIGTYPE_p_std__shared_ptrT_LayerRTCoefficients_t_t swig_types[223]
-#define SWIGTYPE_p_std__shared_ptrT_ProgressHandler_t_t swig_types[224]
-#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t swig_types[225]
-#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t swig_types[226]
-#define SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t swig_types[227]
-#define SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t swig_types[228]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[229]
-#define SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t swig_types[230]
-#define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[231]
-#define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[232]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[233]
-#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[234]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[235]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[236]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[237]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[238]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[239]
-#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[240]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[241]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[242]
-#define SWIGTYPE_p_value_type swig_types[243]
-static swig_type_info *swig_types[245];
-static swig_module_info swig_module = {swig_types, 244, 0, 0, 0, 0};
+#define SWIGTYPE_p_IObservable swig_types[114]
+#define SWIGTYPE_p_IObserver swig_types[115]
+#define SWIGTYPE_p_IParameterized swig_types[116]
+#define SWIGTYPE_p_IParticle swig_types[117]
+#define SWIGTYPE_p_IPixelMap swig_types[118]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[119]
+#define SWIGTYPE_p_IRotation swig_types[120]
+#define SWIGTYPE_p_IRoughness swig_types[121]
+#define SWIGTYPE_p_ISample swig_types[122]
+#define SWIGTYPE_p_ISampleBuilder swig_types[123]
+#define SWIGTYPE_p_ISampleVisitor swig_types[124]
+#define SWIGTYPE_p_ISelectionRule swig_types[125]
+#define SWIGTYPE_p_Instrument swig_types[126]
+#define SWIGTYPE_p_IntensityDataFunctions swig_types[127]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[128]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[129]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[130]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[131]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[132]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[133]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[134]
+#define SWIGTYPE_p_KVectorContainer swig_types[135]
+#define SWIGTYPE_p_Lattice swig_types[136]
+#define SWIGTYPE_p_Lattice1DParameters swig_types[137]
+#define SWIGTYPE_p_Lattice2DParameters swig_types[138]
+#define SWIGTYPE_p_Layer swig_types[139]
+#define SWIGTYPE_p_LayerDWBASimulation swig_types[140]
+#define SWIGTYPE_p_LayerInterface swig_types[141]
+#define SWIGTYPE_p_LayerRTCoefficients_t swig_types[142]
+#define SWIGTYPE_p_LayerRoughness swig_types[143]
+#define SWIGTYPE_p_MSG__Logger swig_types[144]
+#define SWIGTYPE_p_Mask swig_types[145]
+#define SWIGTYPE_p_MesoCrystal swig_types[146]
+#define SWIGTYPE_p_MultiLayer swig_types[147]
+#define SWIGTYPE_p_MultiLayerDWBASimulation swig_types[148]
+#define SWIGTYPE_p_MultiLayerRTCoefficients_t swig_types[149]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[150]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[151]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[152]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[153]
+#define SWIGTYPE_p_OutputDataT_std__complexT_double_t_t swig_types[154]
+#define SWIGTYPE_p_ParameterDistribution swig_types[155]
+#define SWIGTYPE_p_ParameterPattern swig_types[156]
+#define SWIGTYPE_p_ParameterPool swig_types[157]
+#define SWIGTYPE_p_Particle swig_types[158]
+#define SWIGTYPE_p_ParticleComposition swig_types[159]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[160]
+#define SWIGTYPE_p_ParticleDistribution swig_types[161]
+#define SWIGTYPE_p_ParticleLayout swig_types[162]
+#define SWIGTYPE_p_ProgramOptions swig_types[163]
+#define SWIGTYPE_p_RealParameterWrapper swig_types[164]
+#define SWIGTYPE_p_RectPixelMap swig_types[165]
+#define SWIGTYPE_p_RectangularDetector swig_types[166]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[167]
+#define SWIGTYPE_p_RotationEuler swig_types[168]
+#define SWIGTYPE_p_RotationX swig_types[169]
+#define SWIGTYPE_p_RotationY swig_types[170]
+#define SWIGTYPE_p_RotationZ swig_types[171]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_const_t swig_types[172]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[173]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[174]
+#define SWIGTYPE_p_Simulation swig_types[175]
+#define SWIGTYPE_p_SimulationParameters swig_types[176]
+#define SWIGTYPE_p_SimulationRegistry swig_types[177]
+#define SWIGTYPE_p_SpecularSimulation swig_types[178]
+#define SWIGTYPE_p_SphericalDetector swig_types[179]
+#define SWIGTYPE_p_ThreadInfo swig_types[180]
+#define SWIGTYPE_p_VariableBinAxis swig_types[181]
+#define SWIGTYPE_p_WavevectorInfo swig_types[182]
+#define SWIGTYPE_p__object swig_types[183]
+#define SWIGTYPE_p_allocator_type swig_types[184]
+#define SWIGTYPE_p_char swig_types[185]
+#define SWIGTYPE_p_const_iterator swig_types[186]
+#define SWIGTYPE_p_const_reference swig_types[187]
+#define SWIGTYPE_p_difference_type swig_types[188]
+#define SWIGTYPE_p_double swig_types[189]
+#define SWIGTYPE_p_int swig_types[190]
+#define SWIGTYPE_p_iterator swig_types[191]
+#define SWIGTYPE_p_observer_t swig_types[192]
+#define SWIGTYPE_p_observerlist_t swig_types[193]
+#define SWIGTYPE_p_p__object swig_types[194]
+#define SWIGTYPE_p_parameter_t swig_types[195]
+#define SWIGTYPE_p_parametermap_t swig_types[196]
+#define SWIGTYPE_p_reference swig_types[197]
+#define SWIGTYPE_p_size_type swig_types[198]
+#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_double_t_t swig_types[199]
+#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t swig_types[200]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[201]
+#define SWIGTYPE_p_std__allocatorT_ISample_const_p_t swig_types[202]
+#define SWIGTYPE_p_std__allocatorT_ISample_p_t swig_types[203]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[204]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[205]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[206]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[207]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[208]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[209]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[210]
+#define SWIGTYPE_p_std__invalid_argument swig_types[211]
+#define SWIGTYPE_p_std__ostream swig_types[212]
+#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[213]
+#define SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t swig_types[214]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[215]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[216]
+#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t swig_types[217]
+#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t swig_types[218]
+#define SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t swig_types[219]
+#define SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t swig_types[220]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[221]
+#define SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t swig_types[222]
+#define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[223]
+#define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[224]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[225]
+#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[226]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[227]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[228]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[229]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[230]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[231]
+#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[232]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[233]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[234]
+#define SWIGTYPE_p_value_type swig_types[235]
+static swig_type_info *swig_types[237];
+static swig_module_info swig_module = {swig_types, 236, 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)
 
@@ -6349,7 +6341,6 @@ SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::st
 #include "IMaterial.h"
 #include "IObserver.h"
 #include "IParameterized.h"
-#include "IParameterizedShared.h"
 #include "IParticle.h"
 #include "IResolutionFunction2D.h"
 #include "Rotations.h"
@@ -6430,19 +6421,6 @@ SWIG_AsVal_bool (PyObject *obj, bool *val)
   return SWIG_OK;
 }
 
-
-struct SWIG_null_deleter {
-  void operator() (void const *) const {
-  }
-};
-#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter()
-#define SWIG_NO_NULL_DELETER_1
-#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW
-#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN
-
-
-#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT
-
 SWIGINTERN void IParameterized_registerParameter__SWIG_2(IParameterized *self,std::string const &name,long parpointer,AttLimits const &limits=AttLimits::limitless()){
         return (*(self)).registerParameter(name, (double*)parpointer, limits);
     }
@@ -6905,9 +6883,25 @@ SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_con
 SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_const_Sm__Sg__erase__SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator first,std::vector< ISample const * >::iterator last){ return self->erase(first, last); }
 SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_0(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator pos,std::vector< ISample const * >::value_type x){ return self->insert(pos, x); }
 SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator pos,std::vector< ISample const * >::size_type n,std::vector< ISample const * >::value_type x){ self->insert(pos, n, x); }
+
+struct SWIG_null_deleter {
+  void operator() (void const *) const {
+  }
+};
+#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter()
+#define SWIG_NO_NULL_DELETER_1
+#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW
+#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN
+
+
+#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT
+
 SWIGINTERN void ISampleBuilder_registerParameter__SWIG_0(ISampleBuilder *self,std::string const &name,long parpointer,AttLimits const &limits=AttLimits::limitless()){
         return (*(self)).registerParameter(name, (double*)parpointer, limits);
     }
+SWIGINTERN bool ISampleBuilder_setParameterValue(ISampleBuilder *self,std::string const &name,double value){
+        return dynamic_cast<IParameterized*>(self)->setParameterValue(name, value);
+    }
 SWIGINTERN double FixedBinAxis___getitem__(FixedBinAxis *self,unsigned int i){
         return (*(self))[i];
     }
@@ -7058,23 +7052,6 @@ SwigDirector_INamed::SwigDirector_INamed(PyObject *self, std::string name): INam
 SwigDirector_INamed::~SwigDirector_INamed() {
 }
 
-SwigDirector_INamedShared::SwigDirector_INamedShared(PyObject *self): INamedShared(), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((INamedShared *)this, this); 
-}
-
-
-
-
-SwigDirector_INamedShared::SwigDirector_INamedShared(PyObject *self, std::string name): INamedShared(name), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((INamedShared *)this, this); 
-}
-
-
-
-
-SwigDirector_INamedShared::~SwigDirector_INamedShared() {
-}
-
 SwigDirector_IParameterized::SwigDirector_IParameterized(PyObject *self): IParameterized(), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((IParameterized *)this, this); 
 }
@@ -7152,114 +7129,6 @@ void SwigDirector_IParameterized::init_parameters() {
 }
 
 
-SwigDirector_IParameterizedShared::SwigDirector_IParameterizedShared(PyObject *self): IParameterizedShared(), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((IParameterizedShared *)this, this); 
-}
-
-
-
-
-SwigDirector_IParameterizedShared::SwigDirector_IParameterizedShared(PyObject *self, std::string const &name): IParameterizedShared(name), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((IParameterizedShared *)this, this); 
-}
-
-
-
-
-SwigDirector_IParameterizedShared::SwigDirector_IParameterizedShared(PyObject *self, IParameterizedShared const &other): IParameterizedShared(other), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((IParameterizedShared *)this, this); 
-}
-
-
-
-
-SwigDirector_IParameterizedShared::~SwigDirector_IParameterizedShared() {
-}
-
-std::string SwigDirector_IParameterizedShared::addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number) const {
-  std::string c_result;
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_From_std_string(static_cast< std::string >(path));
-  swig::SwigVar_PyObject obj1;
-  obj1 = SWIG_NewPointerObj(SWIG_as_voidptr(external_pool), SWIGTYPE_p_ParameterPool,  0 );
-  swig::SwigVar_PyObject obj2;
-  obj2 = SWIG_From_int(static_cast< int >(copy_number));
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IParameterizedShared.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 0;
-  const char * const swig_method_name = "addParametersToExternalPool";
-  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2);
-#else
-  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"addParametersToExternalPool", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    if (error) {
-      Swig::DirectorMethodException::raise("Error detected when calling 'IParameterizedShared.addParametersToExternalPool'");
-    }
-  }
-  std::string *swig_optr = 0;
-  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
-  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
-  }
-  c_result = *swig_optr;
-  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
-  return (std::string) c_result;
-}
-
-
-void SwigDirector_IParameterizedShared::print(std::ostream &ostr) const {
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
-  swig_set_inner("print", true);
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IParameterizedShared.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 2;
-  const char * const swig_method_name = "_print";
-  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
-#else
-  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
-#endif
-  swig_set_inner("print", false);
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    if (error) {
-      Swig::DirectorMethodException::raise("Error detected when calling 'IParameterizedShared._print'");
-    }
-  }
-}
-
-
-void SwigDirector_IParameterizedShared::init_parameters() {
-  swig_set_inner("init_parameters", true);
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IParameterizedShared.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 3;
-  const char * const swig_method_name = "init_parameters";
-  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
-#else
-  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "init_parameters", NULL);
-#endif
-  swig_set_inner("init_parameters", false);
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    if (error) {
-      Swig::DirectorMethodException::raise("Error detected when calling 'IParameterizedShared.init_parameters'");
-    }
-  }
-}
-
-
 SwigDirector_ISample::SwigDirector_ISample(PyObject *self): ISample(), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((ISample *)this, this); 
 }
@@ -7588,38 +7457,7 @@ SwigDirector_ISampleBuilder::~SwigDirector_ISampleBuilder() {
 }
 
 std::string SwigDirector_ISampleBuilder::addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number) const {
-  std::string c_result;
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_From_std_string(static_cast< std::string >(path));
-  swig::SwigVar_PyObject obj1;
-  obj1 = SWIG_NewPointerObj(SWIG_as_voidptr(external_pool), SWIGTYPE_p_ParameterPool,  0 );
-  swig::SwigVar_PyObject obj2;
-  obj2 = SWIG_From_int(static_cast< int >(copy_number));
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISampleBuilder.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 0;
-  const char * const swig_method_name = "addParametersToExternalPool";
-  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2);
-#else
-  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"addParametersToExternalPool", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    if (error) {
-      Swig::DirectorMethodException::raise("Error detected when calling 'ISampleBuilder.addParametersToExternalPool'");
-    }
-  }
-  std::string *swig_optr = 0;
-  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
-  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
-  }
-  c_result = *swig_optr;
-  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
-  return (std::string) c_result;
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
 }
 
 
@@ -7631,7 +7469,7 @@ void SwigDirector_ISampleBuilder::print(std::ostream &ostr) const {
     Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISampleBuilder.__init__.");
   }
 #if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 2;
+  const size_t swig_method_index = 0;
   const char * const swig_method_name = "_print";
   PyObject* method = swig_get_method(swig_method_index, swig_method_name);
   swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
@@ -7654,7 +7492,7 @@ void SwigDirector_ISampleBuilder::init_parameters() {
     Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISampleBuilder.__init__.");
   }
 #if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 3;
+  const size_t swig_method_index = 1;
   const char * const swig_method_name = "init_parameters";
   PyObject* method = swig_get_method(swig_method_index, swig_method_name);
   swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
@@ -7681,7 +7519,7 @@ ISample *SwigDirector_ISampleBuilder::buildSample() const {
     Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISampleBuilder.__init__.");
   }
 #if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 4;
+  const size_t swig_method_index = 2;
   const char * const swig_method_name = "buildSample";
   PyObject* method = swig_get_method(swig_method_index, swig_method_name);
   swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
@@ -7711,7 +7549,7 @@ void SwigDirector_ISampleBuilder::init_from(IComponentService const *arg0) {
     Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISampleBuilder.__init__.");
   }
 #if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 5;
+  const size_t swig_method_index = 3;
   const char * const swig_method_name = "init_from";
   PyObject* method = swig_get_method(swig_method_index, swig_method_name);
   swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
@@ -22022,218 +21860,6 @@ SWIGINTERN PyObject *INamed_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObjec
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_INamedShared__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  PyObject * obj0 = 0 ;
-  INamedShared *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:new_INamedShared",&obj0)) SWIG_fail;
-  arg1 = obj0;
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (INamedShared *)new SwigDirector_INamedShared(arg1); 
-  } else {
-    result = (INamedShared *)new INamedShared(); 
-  }
-  
-  {
-    std::shared_ptr<  INamedShared > *smartresult = result ? new std::shared_ptr<  INamedShared >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_INamedShared_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
-  }
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_INamedShared__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  std::string arg2 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  INamedShared *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_INamedShared",&obj0,&obj1)) SWIG_fail;
-  arg1 = obj0;
-  {
-    std::string *ptr = (std::string *)0;
-    int res = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_INamedShared" "', argument " "2"" of type '" "std::string""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
-  }
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (INamedShared *)new SwigDirector_INamedShared(arg1,arg2); 
-  } else {
-    result = (INamedShared *)new INamedShared(arg2); 
-  }
-  
-  {
-    std::shared_ptr<  INamedShared > *smartresult = result ? new std::shared_ptr<  INamedShared >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_INamedShared_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
-  }
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_INamedShared(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      return _wrap_new_INamedShared__SWIG_0(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_INamedShared__SWIG_1(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_INamedShared'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    INamedShared::INamedShared()\n"
-    "    INamedShared::INamedShared(PyObject *,std::string)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_INamedShared(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  INamedShared *arg1 = (INamedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< INamedShared > tempshared1 ;
-  std::shared_ptr< INamedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_INamedShared",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_INamedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_INamedShared" "', argument " "1"" of type '" "INamedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  (void)arg1; delete smartarg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_INamedShared_getName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  INamedShared *arg1 = (INamedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< INamedShared const > tempshared1 ;
-  std::shared_ptr< INamedShared const > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  std::string result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:INamedShared_getName",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_INamedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INamedShared_getName" "', argument " "1"" of type '" "INamedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const INamedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  result = ((INamedShared const *)arg1)->getName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_disown_INamedShared(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  INamedShared *arg1 = (INamedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< INamedShared > tempshared1 ;
-  std::shared_ptr< INamedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:disown_INamedShared",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_INamedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_INamedShared" "', argument " "1"" of type '" "INamedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  INamedShared > * >(argp1);
-      arg1 = const_cast< INamedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
-  }
-  
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *INamedShared_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_INamedShared_t, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
 SWIGINTERN PyObject *_wrap_new_IParameterized__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
@@ -23156,758 +22782,6 @@ SWIGINTERN PyObject *ParameterPattern_swigregister(PyObject *SWIGUNUSEDPARM(self
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_IParameterizedShared__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  PyObject * obj0 = 0 ;
-  IParameterizedShared *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:new_IParameterizedShared",&obj0)) SWIG_fail;
-  arg1 = obj0;
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IParameterizedShared *)new SwigDirector_IParameterizedShared(arg1); 
-  } else {
-    result = (IParameterizedShared *)new IParameterizedShared(); 
-  }
-  
-  {
-    std::shared_ptr<  IParameterizedShared > *smartresult = result ? new std::shared_ptr<  IParameterizedShared >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
-  }
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IParameterizedShared__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  std::string *arg2 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IParameterizedShared *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_IParameterizedShared",&obj0,&obj1)) SWIG_fail;
-  arg1 = obj0;
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IParameterizedShared" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IParameterizedShared" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IParameterizedShared *)new SwigDirector_IParameterizedShared(arg1,(std::string const &)*arg2); 
-  } else {
-    result = (IParameterizedShared *)new IParameterizedShared((std::string const &)*arg2); 
-  }
-  
-  {
-    std::shared_ptr<  IParameterizedShared > *smartresult = result ? new std::shared_ptr<  IParameterizedShared >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
-  }
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IParameterizedShared__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  IParameterizedShared *arg2 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared2 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IParameterizedShared *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_IParameterizedShared",&obj0,&obj1)) SWIG_fail;
-  arg1 = obj0;
-  {
-    int newmem = 0;
-    res2 = SWIG_ConvertPtrAndOwn(obj1, &argp2, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t,  0 , &newmem);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IParameterizedShared" "', argument " "2"" of type '" "IParameterizedShared const &""'"); 
-    }
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IParameterizedShared" "', argument " "2"" of type '" "IParameterizedShared const &""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared2 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp2);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp2);
-      arg2 = const_cast< IParameterizedShared * >(tempshared2.get());
-    } else {
-      arg2 = const_cast< IParameterizedShared * >(reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp2)->get());
-    }
-  }
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IParameterizedShared *)new SwigDirector_IParameterizedShared(arg1,(IParameterizedShared const &)*arg2); 
-  } else {
-    result = (IParameterizedShared *)new IParameterizedShared((IParameterizedShared const &)*arg2); 
-  }
-  
-  {
-    std::shared_ptr<  IParameterizedShared > *smartresult = result ? new std::shared_ptr<  IParameterizedShared >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
-  }
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IParameterizedShared(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      return _wrap_new_IParameterizedShared__SWIG_0(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_IParameterizedShared__SWIG_2(self, args);
-      }
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_IParameterizedShared__SWIG_1(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IParameterizedShared'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IParameterizedShared::IParameterizedShared()\n"
-    "    IParameterizedShared::IParameterizedShared(std::string const &)\n"
-    "    IParameterizedShared::IParameterizedShared(PyObject *,IParameterizedShared const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_IParameterizedShared(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared > tempshared1 ;
-  std::shared_ptr< IParameterizedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IParameterizedShared",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IParameterizedShared" "', argument " "1"" of type '" "IParameterizedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  (void)arg1; delete smartarg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_getParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  ParameterPool *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IParameterizedShared_getParameterPool",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_getParameterPool" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  result = (ParameterPool *)((IParameterizedShared const *)arg1)->getParameterPool();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_createParameterTree(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  ParameterPool *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IParameterizedShared_createParameterTree",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_createParameterTree" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  result = (ParameterPool *)((IParameterizedShared const *)arg1)->createParameterTree();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_printParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IParameterizedShared_printParameters",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_printParameters" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  ((IParameterizedShared const *)arg1)->printParameters();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_setParameterValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  std::string *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared > tempshared1 ;
-  std::shared_ptr< IParameterizedShared > *smartarg1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:IParameterizedShared_setParameterValue",&obj0,&obj1,&obj2)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_setParameterValue" "', argument " "1"" of type '" "IParameterizedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterizedShared_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterizedShared_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IParameterizedShared_setParameterValue" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (bool)(arg1)->setParameterValue((std::string const &)*arg2,arg3);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_clearParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared > tempshared1 ;
-  std::shared_ptr< IParameterizedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IParameterizedShared_clearParameterPool",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_clearParameterPool" "', argument " "1"" of type '" "IParameterizedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  (arg1)->clearParameterPool();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_addParametersToExternalPool__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  std::string arg2 ;
-  ParameterPool *arg3 = (ParameterPool *) 0 ;
-  int arg4 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  int val4 ;
-  int ecode4 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  PyObject * obj3 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  std::string result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOOO:IParameterizedShared_addParametersToExternalPool",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    int res = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "2"" of type '" "std::string""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
-  }
-  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ParameterPool, 0 |  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "3"" of type '" "ParameterPool *""'"); 
-  }
-  arg3 = reinterpret_cast< ParameterPool * >(argp3);
-  ecode4 = SWIG_AsVal_int(obj3, &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "4"" of type '" "int""'");
-  } 
-  arg4 = static_cast< int >(val4);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    if (upcall) {
-      result = ((IParameterizedShared const *)arg1)->IParameterizedShared::addParametersToExternalPool(arg2,arg3,arg4);
-    } else {
-      result = ((IParameterizedShared const *)arg1)->addParametersToExternalPool(arg2,arg3,arg4);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_addParametersToExternalPool__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  std::string arg2 ;
-  ParameterPool *arg3 = (ParameterPool *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  std::string result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:IParameterizedShared_addParametersToExternalPool",&obj0,&obj1,&obj2)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    int res = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "2"" of type '" "std::string""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
-  }
-  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ParameterPool, 0 |  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IParameterizedShared_addParametersToExternalPool" "', argument " "3"" of type '" "ParameterPool *""'"); 
-  }
-  arg3 = reinterpret_cast< ParameterPool * >(argp3);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    if (upcall) {
-      result = ((IParameterizedShared const *)arg1)->IParameterizedShared::addParametersToExternalPool(arg2,arg3);
-    } else {
-      result = ((IParameterizedShared const *)arg1)->addParametersToExternalPool(arg2,arg3);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_addParametersToExternalPool(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[5] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 3) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        void *vptr = 0;
-        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ParameterPool, 0);
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_IParameterizedShared_addParametersToExternalPool__SWIG_1(self, args);
-        }
-      }
-    }
-  }
-  if (argc == 4) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        void *vptr = 0;
-        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ParameterPool, 0);
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          {
-            int res = SWIG_AsVal_int(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            return _wrap_IParameterizedShared_addParametersToExternalPool__SWIG_0(self, args);
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IParameterizedShared_addParametersToExternalPool'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IParameterizedShared::addParametersToExternalPool(std::string,ParameterPool *,int) const\n"
-    "    IParameterizedShared::addParametersToExternalPool(std::string,ParameterPool *) const\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  std::ostream *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared const > tempshared1 ;
-  std::shared_ptr< IParameterizedShared const > *smartarg1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  SwigDirector_IParameterizedShared *darg = 0;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterizedShared__print",&obj0,&obj1)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared__print" "', argument " "1"" of type '" "IParameterizedShared const *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr< const IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterizedShared__print" "', argument " "2"" of type '" "std::ostream &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterizedShared__print" "', argument " "2"" of type '" "std::ostream &""'"); 
-  }
-  arg2 = reinterpret_cast< std::ostream * >(argp2);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  if (!director || !(director->swig_get_inner("print"))) {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
-    SWIG_fail;
-  }
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    darg = dynamic_cast<SwigDirector_IParameterizedShared *>(arg1);
-    if (upcall) {
-      ((SwigDirector_IParameterizedShared const *)darg)->printSwigPublic(*arg2);
-    } else {
-      ((SwigDirector_IParameterizedShared const *)darg)->print(*arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IParameterizedShared_init_parameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared > tempshared1 ;
-  std::shared_ptr< IParameterizedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  SwigDirector_IParameterizedShared *darg = 0;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IParameterizedShared_init_parameters",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterizedShared_init_parameters" "', argument " "1"" of type '" "IParameterizedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  if (!director || !(director->swig_get_inner("init_parameters"))) {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member init_parameters");
-    SWIG_fail;
-  }
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    darg = dynamic_cast<SwigDirector_IParameterizedShared *>(arg1);
-    if (upcall) {
-      (darg)->init_parametersSwigPublic();
-    } else {
-      (darg)->init_parameters();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_disown_IParameterizedShared(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IParameterizedShared *arg1 = (IParameterizedShared *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IParameterizedShared > tempshared1 ;
-  std::shared_ptr< IParameterizedShared > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:disown_IParameterizedShared",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IParameterizedShared" "', argument " "1"" of type '" "IParameterizedShared *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IParameterizedShared > * >(argp1);
-      arg1 = const_cast< IParameterizedShared * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
-  }
-  
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IParameterizedShared_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
 SWIGINTERN int Swig_var_major_version_number_set(PyObject *) {
   SWIG_Error(SWIG_AttributeError,"Variable major_version_number is read-only.");
   return 1;
@@ -37344,6 +36218,65 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_ISampleBuilder_setParameterValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleBuilder *arg1 = (ISampleBuilder *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< ISampleBuilder > tempshared1 ;
+  std::shared_ptr< ISampleBuilder > *smartarg1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ISampleBuilder_setParameterValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleBuilder_setParameterValue" "', argument " "1"" of type '" "ISampleBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  ISampleBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  ISampleBuilder > * >(argp1);
+      arg1 = const_cast< ISampleBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  ISampleBuilder > * >(argp1);
+      arg1 = const_cast< ISampleBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleBuilder_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ISampleBuilder_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISampleBuilder_setParameterValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)ISampleBuilder_setParameterValue(arg1,(std::string const &)*arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_disown_ISampleBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ISampleBuilder *arg1 = (ISampleBuilder *) 0 ;
@@ -89727,14 +88660,6 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"INamed_getName", _wrap_INamed_getName, METH_VARARGS, (char *)"INamed_getName(INamed self) -> std::string"},
 	 { (char *)"disown_INamed", _wrap_disown_INamed, METH_VARARGS, NULL},
 	 { (char *)"INamed_swigregister", INamed_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_INamedShared", _wrap_new_INamedShared, METH_VARARGS, (char *)"\n"
-		"INamedShared()\n"
-		"new_INamedShared(PyObject * arg2, std::string name) -> INamedShared\n"
-		""},
-	 { (char *)"delete_INamedShared", _wrap_delete_INamedShared, METH_VARARGS, (char *)"delete_INamedShared(INamedShared self)"},
-	 { (char *)"INamedShared_getName", _wrap_INamedShared_getName, METH_VARARGS, (char *)"INamedShared_getName(INamedShared self) -> std::string"},
-	 { (char *)"disown_INamedShared", _wrap_disown_INamedShared, METH_VARARGS, NULL},
-	 { (char *)"INamedShared_swigregister", INamedShared_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_IParameterized", _wrap_new_IParameterized, METH_VARARGS, (char *)"\n"
 		"IParameterized()\n"
 		"IParameterized(std::string const & name)\n"
@@ -89790,25 +88715,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { (char *)"delete_ParameterPattern", _wrap_delete_ParameterPattern, METH_VARARGS, (char *)"delete_ParameterPattern(ParameterPattern self)"},
 	 { (char *)"ParameterPattern_swigregister", ParameterPattern_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_IParameterizedShared", _wrap_new_IParameterizedShared, METH_VARARGS, (char *)"\n"
-		"IParameterizedShared()\n"
-		"IParameterizedShared(std::string const & name)\n"
-		"new_IParameterizedShared(PyObject * arg2, IParameterizedShared other) -> IParameterizedShared\n"
-		""},
-	 { (char *)"delete_IParameterizedShared", _wrap_delete_IParameterizedShared, METH_VARARGS, (char *)"delete_IParameterizedShared(IParameterizedShared self)"},
-	 { (char *)"IParameterizedShared_getParameterPool", _wrap_IParameterizedShared_getParameterPool, METH_VARARGS, (char *)"IParameterizedShared_getParameterPool(IParameterizedShared self) -> ParameterPool"},
-	 { (char *)"IParameterizedShared_createParameterTree", _wrap_IParameterizedShared_createParameterTree, METH_VARARGS, (char *)"IParameterizedShared_createParameterTree(IParameterizedShared self) -> ParameterPool"},
-	 { (char *)"IParameterizedShared_printParameters", _wrap_IParameterizedShared_printParameters, METH_VARARGS, (char *)"IParameterizedShared_printParameters(IParameterizedShared self)"},
-	 { (char *)"IParameterizedShared_setParameterValue", _wrap_IParameterizedShared_setParameterValue, METH_VARARGS, (char *)"IParameterizedShared_setParameterValue(IParameterizedShared self, std::string const & name, double value) -> bool"},
-	 { (char *)"IParameterizedShared_clearParameterPool", _wrap_IParameterizedShared_clearParameterPool, METH_VARARGS, (char *)"IParameterizedShared_clearParameterPool(IParameterizedShared self)"},
-	 { (char *)"IParameterizedShared_addParametersToExternalPool", _wrap_IParameterizedShared_addParametersToExternalPool, METH_VARARGS, (char *)"\n"
-		"addParametersToExternalPool(std::string path, ParameterPool external_pool, int copy_number=-1) -> std::string\n"
-		"IParameterizedShared_addParametersToExternalPool(IParameterizedShared self, std::string path, ParameterPool external_pool) -> std::string\n"
-		""},
-	 { (char *)"IParameterizedShared__print", _wrap_IParameterizedShared__print, METH_VARARGS, (char *)"IParameterizedShared__print(IParameterizedShared self, std::ostream & ostr)"},
-	 { (char *)"IParameterizedShared_init_parameters", _wrap_IParameterizedShared_init_parameters, METH_VARARGS, (char *)"IParameterizedShared_init_parameters(IParameterizedShared self)"},
-	 { (char *)"disown_IParameterizedShared", _wrap_disown_IParameterizedShared, METH_VARARGS, NULL},
-	 { (char *)"IParameterizedShared_swigregister", IParameterizedShared_swigregister, METH_VARARGS, NULL},
 	 { (char *)"GetMajorVersionNumber", _wrap_GetMajorVersionNumber, METH_VARARGS, (char *)"\n"
 		"GetMajorVersionNumber() -> int\n"
 		"\n"
@@ -91079,6 +89985,7 @@ static PyMethodDef SwigMethods[] = {
 		"registerParameter(std::string const & name, long parpointer, AttLimits limits)\n"
 		"ISampleBuilder_registerParameter(ISampleBuilder self, std::string const & name, long parpointer)\n"
 		""},
+	 { (char *)"ISampleBuilder_setParameterValue", _wrap_ISampleBuilder_setParameterValue, METH_VARARGS, (char *)"ISampleBuilder_setParameterValue(ISampleBuilder self, std::string const & name, double value) -> bool"},
 	 { (char *)"disown_ISampleBuilder", _wrap_disown_ISampleBuilder, METH_VARARGS, NULL},
 	 { (char *)"ISampleBuilder__print", _wrap_ISampleBuilder__print, METH_VARARGS, (char *)"ISampleBuilder__print(ISampleBuilder self, std::ostream & ostr)"},
 	 { (char *)"ISampleBuilder_init_parameters", _wrap_ISampleBuilder_init_parameters, METH_VARARGS, (char *)"ISampleBuilder_init_parameters(ISampleBuilder self)"},
@@ -100878,12 +99785,12 @@ static void *_p_IDetector2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_InterferenceFunctionNoneTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
 }
-static void *_p_ILayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((ILayout *) x));
-}
 static void *_p_FormFactorHemiEllipsoidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
 }
+static void *_p_ILayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((ILayout *) x));
+}
 static void *_p_ParticleLayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
 }
@@ -101001,6 +99908,9 @@ static void *_p_IFormFactorBornTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(
 static void *_p_IClusteredParticlesTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
 }
+static void *_p_ISampleBuilderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((ISampleBuilder *) x));
+}
 static void *_p_IAbstractParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
 }
@@ -101163,18 +100073,6 @@ static void *_p_FTDistribution1DTriangleTo_p_IParameterized(void *x, int *SWIGUN
 static void *_p_RotationEulerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationEuler *) x));
 }
-static void *_p_std__shared_ptrT_ISampleBuilder_tTo_p_std__shared_ptrT_IParameterizedShared_t(void *x, int *newmemory) {
-    *newmemory = SWIG_CAST_NEW_MEMORY;
-    return (void *) new std::shared_ptr< IParameterizedShared >(*(std::shared_ptr< ISampleBuilder > *)x);
-}
-static void *_p_std__shared_ptrT_IParameterizedShared_tTo_p_std__shared_ptrT_INamedShared_t(void *x, int *newmemory) {
-    *newmemory = SWIG_CAST_NEW_MEMORY;
-    return (void *) new std::shared_ptr< INamedShared >(*(std::shared_ptr< IParameterizedShared > *)x);
-}
-static void *_p_std__shared_ptrT_ISampleBuilder_tTo_p_std__shared_ptrT_INamedShared_t(void *x, int *newmemory) {
-    *newmemory = SWIG_CAST_NEW_MEMORY;
-    return (void *) new std::shared_ptr< INamedShared >(*(std::shared_ptr< ISampleBuilder > *)x);
-}
 static void *_p_Histogram2DTo_p_IHistogram(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IHistogram *)  ((Histogram2D *) x));
 }
@@ -101595,6 +100493,9 @@ static void *_p_IDetectorResolutionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IClusteredParticlesTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
 }
+static void *_p_ISampleBuilderTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((ISampleBuilder *) x));
+}
 static void *_p_IAbstractParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
 }
@@ -101625,9 +100526,6 @@ static void *_p_FormFactorConeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory
 static void *_p_LayerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((Layer *) x));
 }
-static void *_p_HomogeneousMagneticMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IMaterial *)(HomogeneousMaterial *) ((HomogeneousMagneticMaterial *) x));
-}
 static void *_p_HomogeneousMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IMaterial *) ((HomogeneousMaterial *) x));
 }
@@ -101637,6 +100535,9 @@ static void *_p_IMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_FormFactorRipple1To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
 }
+static void *_p_HomogeneousMagneticMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IMaterial *)(HomogeneousMaterial *) ((HomogeneousMagneticMaterial *) x));
+}
 static void *_p_FormFactorPyramidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPyramid *) x));
 }
@@ -101679,12 +100580,12 @@ static void *_p_FTDistribution1DCosineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_FTDistribution1DGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DGate *) x));
 }
-static void *_p_FTDecayFunction2DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction2D *) ((FTDecayFunction2DVoigt *) x));
-}
 static void *_p_FTDistribution2DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DVoigt *) x));
 }
+static void *_p_FTDecayFunction2DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction2D *) ((FTDecayFunction2DVoigt *) x));
+}
 static void *_p_FTDecayFunction1DCauchyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IFTDecayFunction1D *) ((FTDecayFunction1DCauchy *) x));
 }
@@ -101769,15 +100670,6 @@ static void *_p_FTDistribution1DTriangleTo_p_INamed(void *x, int *SWIGUNUSEDPARM
 static void *_p_RotationEulerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationEuler *) x));
 }
-static void *_p_ISampleBuilderTo_p_INamedShared(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamedShared *) (IParameterizedShared *) ((ISampleBuilder *) x));
-}
-static void *_p_IParameterizedSharedTo_p_INamedShared(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamedShared *)  ((IParameterizedShared *) x));
-}
-static void *_p_ISampleBuilderTo_p_IParameterizedShared(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterizedShared *)  ((ISampleBuilder *) x));
-}
 static void *_p_CrystalTo_p_IClusteredParticles(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IClusteredParticles *)  ((Crystal *) x));
 }
@@ -101922,24 +100814,6 @@ static void *_p_CustomBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_FixedBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IAxis *)  ((FixedBinAxis *) x));
 }
-static void *_p_FTDistribution1DCauchyTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCauchy *) x));
-}
-static void *_p_FTDistribution1DCosineTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCosine *) x));
-}
-static void *_p_FTDistribution1DGaussTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGauss *) x));
-}
-static void *_p_FTDistribution1DGateTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGate *) x));
-}
-static void *_p_FTDistribution1DTriangleTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DTriangle *) x));
-}
-static void *_p_FTDistribution1DVoigtTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDistribution1D *)  ((FTDistribution1DVoigt *) x));
-}
 static void *_p_DistributionCosineTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IDistribution1D *)  ((DistributionCosine *) x));
 }
@@ -101967,6 +100841,24 @@ static void *_p_FTDecayFunction1DTriangleTo_p_IFTDecayFunction1D(void *x, int *S
 static void *_p_FTDecayFunction1DVoigtTo_p_IFTDecayFunction1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFTDecayFunction1D *)  ((FTDecayFunction1DVoigt *) x));
 }
+static void *_p_FTDistribution1DCauchyTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCauchy *) x));
+}
+static void *_p_FTDistribution1DCosineTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCosine *) x));
+}
+static void *_p_FTDistribution1DGaussTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGauss *) x));
+}
+static void *_p_FTDistribution1DGateTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGate *) x));
+}
+static void *_p_FTDistribution1DTriangleTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DTriangle *) x));
+}
+static void *_p_FTDistribution1DVoigtTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DVoigt *) x));
+}
 static void *_p_AngularPixelMapTo_p_IPixelMap(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IPixelMap *)  ((AngularPixelMap *) x));
 }
@@ -102216,6 +101108,15 @@ static void *_p_ParticleCoreShellTo_p_ICompositeSample(void *x, int *SWIGUNUSEDP
 static void *_p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IResolutionFunction2D *)  ((ResolutionFunction2DGaussian *) x));
 }
+static void *_p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DCauchy *) x));
+}
+static void *_p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DGauss *) x));
+}
+static void *_p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DVoigt *) x));
+}
 static void *_p_FTDistribution2DCauchyTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFTDistribution2D *)  ((FTDistribution2DCauchy *) x));
 }
@@ -102231,15 +101132,6 @@ static void *_p_FTDistribution2DGateTo_p_IFTDistribution2D(void *x, int *SWIGUNU
 static void *_p_FTDistribution2DConeTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFTDistribution2D *)  ((FTDistribution2DCone *) x));
 }
-static void *_p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DCauchy *) x));
-}
-static void *_p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DGauss *) x));
-}
-static void *_p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DVoigt *) x));
-}
 static swig_type_info _swigt__p_AngularPixelMap = {"_p_AngularPixelMap", "AngularPixelMap *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_AttLimits = {"_p_AttLimits", "AttLimits *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Beam = {"_p_Beam", "Beam *", 0, 0, (void*)0, 0};
@@ -102354,11 +101246,9 @@ static swig_type_info _swigt__p_ILayerRTCoefficients = {"_p_ILayerRTCoefficients
 static swig_type_info _swigt__p_ILayout = {"_p_ILayout", "ILayout *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IMaterial = {"_p_IMaterial", "IMaterial *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_INamed = {"_p_INamed", "INamed *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_INamedShared = {"_p_INamedShared", "INamedShared *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IObservable = {"_p_IObservable", "IObservable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IObserver = {"_p_IObserver", "IObserver *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IParameterized = {"_p_IParameterized", "IParameterized *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IParameterizedShared = {"_p_IParameterizedShared", "IParameterizedShared *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IParticle = {"_p_IParticle", "IParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IPixelMap = {"_p_IPixelMap", "IPixelMap *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IResolutionFunction2D = {"_p_IResolutionFunction2D", "IResolutionFunction2D *", 0, 0, (void*)0, 0};
@@ -102457,14 +101347,8 @@ static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argume
 static swig_type_info _swigt__p_std__ostream = {"_p_std__ostream", "std::ostream *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_IFitObserver_t = {"_p_std__shared_ptrT_IFitObserver_t", "std::shared_ptr< IFitObserver > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t = {"_p_std__shared_ptrT_ILayerRTCoefficients_const_t", "std::shared_ptr< ILayerRTCoefficients const > *|SpecularSimulation::LayerRTCoefficients_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_INamedShared_t = {"_p_std__shared_ptrT_INamedShared_t", "std::shared_ptr< INamedShared > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t = {"_p_std__shared_ptrT_INamedTemplateT_IShareable_t_t", "std::shared_ptr< INamedTemplate< IShareable > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_IObserver_t = {"_p_std__shared_ptrT_IObserver_t", "std::shared_ptr< IObserver > *|IObservable::observer_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_IParameterizedShared_t = {"_p_std__shared_ptrT_IParameterizedShared_t", "std::shared_ptr< IParameterizedShared > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t = {"_p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t", "std::shared_ptr< IParameterizedTemplate< IShareable > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_ISampleBuilder_t = {"_p_std__shared_ptrT_ISampleBuilder_t", "std::shared_ptr< ISampleBuilder > *|SampleBuilder_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t = {"_p_std__shared_ptrT_LayerRTCoefficients_t_t", "std::shared_ptr< LayerRTCoefficients_t > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_ProgressHandler_t_t = {"_p_std__shared_ptrT_ProgressHandler_t_t", "std::shared_ptr< ProgressHandler_t > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t = {"_p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t", "std::vector< Geometry::BasicVector3D< double > > *|std::vector< Geometry::BasicVector3D< double >,std::allocator< Geometry::BasicVector3D< double > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t = {"_p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t", "std::vector< Geometry::BasicVector3D< std::complex< double > > > *|std::vector< Geometry::BasicVector3D< std::complex< double > >,std::allocator< Geometry::BasicVector3D< std::complex< double > > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t = {"_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t", "std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > > *|std::vector< enum IDetector2D::EAxesUnits,std::allocator< enum IDetector2D::EAxesUnits > > *", 0, 0, (void*)0, 0};
@@ -102600,11 +101484,9 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_ILayout,
   &_swigt__p_IMaterial,
   &_swigt__p_INamed,
-  &_swigt__p_INamedShared,
   &_swigt__p_IObservable,
   &_swigt__p_IObserver,
   &_swigt__p_IParameterized,
-  &_swigt__p_IParameterizedShared,
   &_swigt__p_IParticle,
   &_swigt__p_IPixelMap,
   &_swigt__p_IResolutionFunction2D,
@@ -102703,14 +101585,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__ostream,
   &_swigt__p_std__shared_ptrT_IFitObserver_t,
   &_swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t,
-  &_swigt__p_std__shared_ptrT_INamedShared_t,
-  &_swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t,
   &_swigt__p_std__shared_ptrT_IObserver_t,
-  &_swigt__p_std__shared_ptrT_IParameterizedShared_t,
-  &_swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t,
   &_swigt__p_std__shared_ptrT_ISampleBuilder_t,
-  &_swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t,
-  &_swigt__p_std__shared_ptrT_ProgressHandler_t_t,
   &_swigt__p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t,
   &_swigt__p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t,
   &_swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t,
@@ -102845,12 +101721,10 @@ static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_IInterf
 static swig_cast_info _swigc__p_ILayerRTCoefficients[] = {  {&_swigt__p_ILayerRTCoefficients, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ILayout, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMaterial[] = {  {&_swigt__p_IMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_IMaterial, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_IMaterial, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INamed, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INamed, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INamedShared[] = {  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_INamedShared, 0, 0},  {&_swigt__p_INamedShared, 0, 0, 0},  {&_swigt__p_IParameterizedShared, _p_IParameterizedSharedTo_p_INamedShared, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_INamed, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INamed, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INamed, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterizedShared[] = {  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterizedShared, 0, 0},  {&_swigt__p_IParameterizedShared, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPixelMap[] = {  {&_swigt__p_IPixelMap, 0, 0, 0},  {&_swigt__p_AngularPixelMap, _p_AngularPixelMapTo_p_IPixelMap, 0, 0},  {&_swigt__p_RectPixelMap, _p_RectPixelMapTo_p_IPixelMap, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
@@ -102949,14 +101823,8 @@ static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__in
 static swig_cast_info _swigc__p_std__ostream[] = {  {&_swigt__p_std__ostream, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_IFitObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IFitObserver_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_ILayerRTCoefficients_const_t[] = {  {&_swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_INamedShared_t[] = {  {&_swigt__p_std__shared_ptrT_INamedShared_t, 0, 0, 0},  {&_swigt__p_std__shared_ptrT_IParameterizedShared_t, _p_std__shared_ptrT_IParameterizedShared_tTo_p_std__shared_ptrT_INamedShared_t, 0, 0},  {&_swigt__p_std__shared_ptrT_ISampleBuilder_t, _p_std__shared_ptrT_ISampleBuilder_tTo_p_std__shared_ptrT_INamedShared_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t[] = {  {&_swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_IObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IObserver_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_IParameterizedShared_t[] = {  {&_swigt__p_std__shared_ptrT_IParameterizedShared_t, 0, 0, 0},  {&_swigt__p_std__shared_ptrT_ISampleBuilder_t, _p_std__shared_ptrT_ISampleBuilder_tTo_p_std__shared_ptrT_IParameterizedShared_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t[] = {  {&_swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_ISampleBuilder_t[] = {  {&_swigt__p_std__shared_ptrT_ISampleBuilder_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_LayerRTCoefficients_t_t[] = {  {&_swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_ProgressHandler_t_t[] = {  {&_swigt__p_std__shared_ptrT_ProgressHandler_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t[] = {  {&_swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -103092,11 +101960,9 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_ILayout,
   _swigc__p_IMaterial,
   _swigc__p_INamed,
-  _swigc__p_INamedShared,
   _swigc__p_IObservable,
   _swigc__p_IObserver,
   _swigc__p_IParameterized,
-  _swigc__p_IParameterizedShared,
   _swigc__p_IParticle,
   _swigc__p_IPixelMap,
   _swigc__p_IResolutionFunction2D,
@@ -103195,14 +102061,8 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__ostream,
   _swigc__p_std__shared_ptrT_IFitObserver_t,
   _swigc__p_std__shared_ptrT_ILayerRTCoefficients_const_t,
-  _swigc__p_std__shared_ptrT_INamedShared_t,
-  _swigc__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t,
   _swigc__p_std__shared_ptrT_IObserver_t,
-  _swigc__p_std__shared_ptrT_IParameterizedShared_t,
-  _swigc__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t,
   _swigc__p_std__shared_ptrT_ISampleBuilder_t,
-  _swigc__p_std__shared_ptrT_LayerRTCoefficients_t_t,
-  _swigc__p_std__shared_ptrT_ProgressHandler_t_t,
   _swigc__p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t,
   _swigc__p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t,
   _swigc__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t,
diff --git a/Core/PythonAPI/libBornAgainCore_wrap.h b/Core/PythonAPI/libBornAgainCore_wrap.h
index b65f701ae82..4db81768304 100644
--- a/Core/PythonAPI/libBornAgainCore_wrap.h
+++ b/Core/PythonAPI/libBornAgainCore_wrap.h
@@ -36,27 +36,6 @@ private:
 };
 
 
-class SwigDirector_INamedShared : public INamedShared, public Swig::Director {
-
-public:
-    SwigDirector_INamedShared(PyObject *self);
-    SwigDirector_INamedShared(PyObject *self, std::string name);
-    virtual ~SwigDirector_INamedShared();
-
-/* Internal director utilities */
-public:
-    bool swig_get_inner(const char *swig_protected_method_name) const {
-      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
-      return (iv != swig_inner.end() ? iv->second : false);
-    }
-    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
-      swig_inner[swig_protected_method_name] = swig_val;
-    }
-private:
-    mutable std::map<std::string, bool> swig_inner;
-};
-
-
 class SwigDirector_IParameterized : public IParameterized, public Swig::Director {
 
 public:
@@ -109,58 +88,6 @@ private:
 };
 
 
-class SwigDirector_IParameterizedShared : public IParameterizedShared, public Swig::Director {
-
-public:
-    SwigDirector_IParameterizedShared(PyObject *self);
-    SwigDirector_IParameterizedShared(PyObject *self, std::string const &name);
-    SwigDirector_IParameterizedShared(PyObject *self, IParameterizedShared const &other);
-    virtual ~SwigDirector_IParameterizedShared();
-    virtual std::string addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number = -1) const;
-    virtual void print(std::ostream &ostr) const;
-    virtual void printSwigPublic(std::ostream &ostr) const {
-      IParameterizedShared::print(ostr);
-    }
-    virtual void init_parameters();
-    virtual void init_parametersSwigPublic() {
-      IParameterizedShared::init_parameters();
-    }
-
-/* Internal director utilities */
-public:
-    bool swig_get_inner(const char *swig_protected_method_name) const {
-      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
-      return (iv != swig_inner.end() ? iv->second : false);
-    }
-    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
-      swig_inner[swig_protected_method_name] = swig_val;
-    }
-private:
-    mutable std::map<std::string, bool> swig_inner;
-
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-/* VTable implementation */
-    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
-      PyObject *method = vtable[method_index];
-      if (!method) {
-        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
-        method = PyObject_GetAttr(swig_get_self(), name);
-        if (!method) {
-          std::string msg = "Method in class IParameterizedShared doesn't exist, undefined ";
-          msg += method_name;
-          Swig::DirectorMethodException::raise(msg.c_str());
-        }
-        vtable[method_index] = method;
-      }
-      return method;
-    }
-private:
-    mutable swig::SwigVar_PyObject vtable[4];
-#endif
-
-};
-
-
 class SwigDirector_ISample : public ISample, public Swig::Director {
 
 public:
@@ -228,11 +155,11 @@ public:
     virtual std::string addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number = -1) const;
     virtual void print(std::ostream &ostr) const;
     virtual void printSwigPublic(std::ostream &ostr) const {
-      IParameterizedShared::print(ostr);
+      IParameterized::print(ostr);
     }
     virtual void init_parameters();
     virtual void init_parametersSwigPublic() {
-      IParameterizedShared::init_parameters();
+      IParameterized::init_parameters();
     }
     virtual ISample *buildSample() const;
     virtual void init_from(IComponentService const *arg0);
@@ -266,7 +193,7 @@ private:
       return method;
     }
 private:
-    mutable swig::SwigVar_PyObject vtable[6];
+    mutable swig::SwigVar_PyObject vtable[4];
 #endif
 
 };
diff --git a/Core/Tools/inc/INamedShared.h b/Core/Tools/inc/INamedShared.h
deleted file mode 100644
index 49d997c7065..00000000000
--- a/Core/Tools/inc/INamedShared.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Tools/inc/INamedShared.h
-//! @brief     Defines and implements the standard mix-in INamedShared.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#ifndef INAMEDSHARED_H
-#define INAMEDSHARED_H
-
-#include "WinDllMacros.h"
-#include <string>
-
-//! @class INamedShared
-//! @ingroup tools_internal
-//! @brief Interface for named objects.
-
-class BA_CORE_API_ INamedShared
-{
-public:
-    //! Default constructor, setting name="".
-    INamedShared();
-
-    //! Constructor that sets the _name_.
-    INamedShared(std::string name);
-
-    //! Destructor.
-    virtual ~INamedShared();
-
-    //! Returns the name.
-    std::string getName() const;
-
-protected:
-    //! Sets the _name_.
-    void setName(std::string name);
-
-private:
-    //! The name of this object.
-    std::string m_name;
-};
-
-#endif // INAMED_H
-
-
diff --git a/Core/Tools/inc/IParameterizedShared.h b/Core/Tools/inc/IParameterizedShared.h
deleted file mode 100644
index 60cdfe4f530..00000000000
--- a/Core/Tools/inc/IParameterizedShared.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Tools/inc/IParameterizedShared.h
-//! @brief     Defines class IParameterizedShared.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#ifndef IPARAMETERIZEDSHARED_H_
-#define IPARAMETERIZEDSHARED_H_
-
-#include "INamedShared.h"
-#include "ParameterPool.h"
-#include "IParameterized.h"
-
-class AttLimits;
-
-//! @class IParameterized
-//! @ingroup tools_internal
-//! @brief Manage a local parameter pool, and a tree of child pools.
-
-class BA_CORE_API_ IParameterizedShared : public INamedShared
-{
-public:
-    IParameterizedShared() : m_parameters() {}
-    IParameterizedShared(const std::string &name) : INamedShared(name), m_parameters() {}
-    IParameterizedShared(const IParameterizedShared &other) : INamedShared(other), m_parameters() {}
-    IParameterizedShared &operator=(const IParameterizedShared &other);
-
-    virtual ~IParameterizedShared() {}
-
-    //! Returns pointer to the parameter pool.
-    const ParameterPool* getParameterPool() const;
-
-    //! Creates new parameter pool, with all local parameters and those of its children.
-    ParameterPool* createParameterTree() const;
-
-    void printParameters() const;
-
-    //! Register parameter address in the parameter pool
-    void registerParameter(const std::string &name, double *parpointer,
-                           const AttLimits &limits = AttLimits::limitless());
-
-    //! Sets the value of the parameter with the given name; returns true in the case of success.
-    bool setParameterValue(const std::string &name, double value);
-
-    //! Clears the parameter pool.
-    void clearParameterPool();
-
-    friend std::ostream& operator<<(std::ostream& ostr, const IParameterizedShared& m);
-
-    //! Adds parameters from local pool to external pool and recursively calls its direct children.
-    virtual std::string addParametersToExternalPool(std::string path, ParameterPool *external_pool,
-                                                    int copy_number = -1) const;
-
-protected:
-    //! Prints a representation of this IParameterizedShared object to the given output stream.
-    //! default implementation prints "IParameterizedShared:" and the parameter pool
-    virtual void print(std::ostream& ostr) const;
-
-    //! Registers class parameters in the parameter pool
-    //! Needs to be implemented by subclasses.
-    virtual void init_parameters();
-
-    ParameterPool m_parameters; //!< parameter pool
-};
-
-//! @class ParameterPattern
-//! @ingroup tools_internal
-//! @brief Helper class for constructing parameter patterns.
-
-
-inline const ParameterPool *IParameterizedShared::getParameterPool() const
-{
-    return& m_parameters;
-}
-
-inline void IParameterizedShared::registerParameter(const std::string &name, double *parpointer,
-                                              const AttLimits &limits)
-{
-    m_parameters.registerParameter(name, parpointer, limits);
-}
-
-inline void IParameterizedShared::clearParameterPool()
-{
-    m_parameters.clear();
-}
-
-inline std::ostream& operator<<(std::ostream &ostr, const IParameterizedShared &m)
-{
-    m.print(ostr);
-    return ostr;
-}
-
-#endif /* IPARAMETERIZED_H_ */
-
-
diff --git a/Core/Tools/src/INamedShared.cpp b/Core/Tools/src/INamedShared.cpp
deleted file mode 100644
index f2329151aa2..00000000000
--- a/Core/Tools/src/INamedShared.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Tools/inc/INamedShared.cpp
-//! @brief     Implements INamedShared interface.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-
-#include "INamedShared.h"
-#include <utility>
-
-INamedShared::INamedShared()
-    : m_name {}
-{
-}
-
-INamedShared::INamedShared(std::string name)
-    : m_name ( std::move(name) )
-{
-}
-
-INamedShared::~INamedShared()
-{
-}
-
-void INamedShared::setName(std::string name)
-{
-    m_name = std::move(name);
-}
-
-std::string INamedShared::getName() const
-{
-    return m_name;
-}
diff --git a/Core/Tools/src/IParameterizedShared.cpp b/Core/Tools/src/IParameterizedShared.cpp
deleted file mode 100644
index c8a8d49d657..00000000000
--- a/Core/Tools/src/IParameterizedShared.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Tools/src/IParameterizedShared.cpp
-//! @brief     Implements class IParameterizedShared,
-//!               mainly by including IParameterizedShared.h.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#include "IParameterized.h"
-#include "IParameterizedShared.h"
-
-#include "Utils.h"
-#include <iostream>
-#include <memory>
-
-IParameterizedShared& IParameterizedShared::operator=(const IParameterizedShared& other)
-{
-    if( this !=& other)
-    {
-        INamedShared::operator=(other);
-        // parameters are not copied
-    }
-    return *this;
-}
-
-ParameterPool *IParameterizedShared::createParameterTree() const
-{
-    std::unique_ptr<ParameterPool> P_new_pool { new ParameterPool };
-    std::string path("/");
-    addParametersToExternalPool(path, P_new_pool.get());
-    return P_new_pool.release();
-}
-
-std::string IParameterizedShared::addParametersToExternalPool(
-    std::string path, ParameterPool *external_pool, int copy_number) const
-{
-    // adding trailing slash, if it is not already there
-    if( path[path.length()-1] != '/' ) path += "/";
-
-    // constructing new path, using object name and copy number
-    std::ostringstream osCopyNumber;
-    if(copy_number >=0) osCopyNumber << copy_number;
-    path =  path + getName() + osCopyNumber.str() + "/";
-
-    // copy local parameter to external pool
-    m_parameters.copyToExternalPool(path, external_pool);
-
-    return path;
-}
-
-bool IParameterizedShared::setParameterValue(const std::string &name, double value)
-{
-    if(name.find('*') == std::string::npos && name.find('/') == std::string::npos) {
-        return m_parameters.setParameterValue(name, value);
-    }
-    std::unique_ptr<ParameterPool> P_pool { createParameterTree() };
-    if(name.find('*') != std::string::npos) {
-        return P_pool->setMatchedParametersValue(name, value);
-    } else {
-        return P_pool->setParameterValue(name, value);
-    }
-}
-
-void IParameterizedShared::printParameters() const
-{
-    std::unique_ptr<ParameterPool> P_pool { createParameterTree() };
-    std::cout << *P_pool << std::endl;
-}
-
-void IParameterizedShared::init_parameters()
-{
-    throw NotImplementedException("IParameterizedShared::init_parameters() -> "
-                                  "Error! Method is not implemented");
-}
-
-void IParameterizedShared::print(std::ostream& ostr) const
-{
-    ostr << "IParameterizedShared:" << getName() << " " << m_parameters;
-}
-
diff --git a/Fit/PythonAPI/libBornAgainFit.py b/Fit/PythonAPI/libBornAgainFit.py
index 34ec0d200ff..330015dbfca 100644
--- a/Fit/PythonAPI/libBornAgainFit.py
+++ b/Fit/PythonAPI/libBornAgainFit.py
@@ -1441,959 +1441,959 @@ vector_string_t_swigregister(vector_string_t)
 _libBornAgainFit.GCCXML_SKIP_THIS_swigconstant(_libBornAgainFit)
 GCCXML_SKIP_THIS = _libBornAgainFit.GCCXML_SKIP_THIS
 import libBornAgainCore
-class IChiSquaredModule(libBornAgainCore.ICloneable):
-    """Proxy of C++ IChiSquaredModule class."""
+class IMinimizer(_object):
+    """
+
+
+    Common interface for all kind minimizer's.
+
+    C++ includes: IMinimizer.h
+
+    """
 
     __swig_setmethods__ = {}
-    for _s in [libBornAgainCore.ICloneable]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IChiSquaredModule, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IMinimizer, name, value)
     __swig_getmethods__ = {}
-    for _s in [libBornAgainCore.ICloneable]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IChiSquaredModule, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, IMinimizer, name)
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IChiSquaredModule
+    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
     __del__ = lambda self: None
 
-    def clone(self):
-        """clone(IChiSquaredModule self) -> IChiSquaredModule"""
-        return _libBornAgainFit.IChiSquaredModule_clone(self)
-
+    def minimize(self):
+        """
+        minimize(IMinimizer self)
 
-    def getSquaredFunction(self):
-        """getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction"""
-        return _libBornAgainFit.IChiSquaredModule_getSquaredFunction(self)
+        virtual void IMinimizer::minimize()=0
 
+        run minimization 
 
-    def setChiSquaredFunction(self, *args):
-        """
-        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
-        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
         """
-        return _libBornAgainFit.IChiSquaredModule_setChiSquaredFunction(self, *args)
+        return _libBornAgainFit.IMinimizer_minimize(self)
 
 
-    def getIntensityNormalizer(self, *args):
-        """
-        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
-        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
+    def setParameter(self, index, par):
         """
-        return _libBornAgainFit.IChiSquaredModule_getIntensityNormalizer(self, *args)
-
+        setParameter(IMinimizer self, size_t index, FitParameter par)
 
-    def setIntensityNormalizer(self, data_normalizer):
-        """setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)"""
-        return _libBornAgainFit.IChiSquaredModule_setIntensityNormalizer(self, data_normalizer)
+        void IMinimizer::setParameter(size_t index, const FitParameter *par)
 
+        Sets internal minimizer parameter. 
 
-    def getIntensityFunction(self):
-        """getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction"""
-        return _libBornAgainFit.IChiSquaredModule_getIntensityFunction(self)
+        """
+        return _libBornAgainFit.IMinimizer_setParameter(self, index, par)
 
 
-    def setIntensityFunction(self, intensity_function):
-        """setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)"""
-        return _libBornAgainFit.IChiSquaredModule_setIntensityFunction(self, intensity_function)
+    def setParameters(self, parameters):
+        """
+        setParameters(IMinimizer self, FitSuiteParameters parameters)
 
+        void IMinimizer::setParameters(const FitSuiteParameters &parameters)
 
-    def processFitElements(self, arg2, arg3):
-        """processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg2, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3)"""
-        return _libBornAgainFit.IChiSquaredModule_processFitElements(self, arg2, arg3)
+        Sets internal minimizer parameters using external parameter list. 
 
-IChiSquaredModule_swigregister = _libBornAgainFit.IChiSquaredModule_swigregister
-IChiSquaredModule_swigregister(IChiSquaredModule)
+        """
+        return _libBornAgainFit.IMinimizer_setParameters(self, parameters)
 
-class IFitObserver(libBornAgainCore.IObserver):
-    """
 
+    def setChiSquaredFunction(self, fun_chi2, nparameters):
+        """
+        setChiSquaredFunction(IMinimizer self, IMinimizer::function_chi2_t fun_chi2, size_t nparameters)
 
-    Base class for all fit observers. Calls update method in following cases: first iteration, every n-th iteration, last iteration and when fit strategy has changed.
+        void IMinimizer::setChiSquaredFunction(function_chi2_t fun_chi2, size_t nparameters)
 
-    C++ includes: IFitObserver.h
+        Sets chi squared function to minimize. 
 
-    """
+        """
+        return _libBornAgainFit.IMinimizer_setChiSquaredFunction(self, fun_chi2, nparameters)
 
-    __swig_setmethods__ = {}
-    for _s in [libBornAgainCore.IObserver]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitObserver, name, value)
-    __swig_getmethods__ = {}
-    for _s in [libBornAgainCore.IObserver]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IFitObserver, name)
-    __repr__ = _swig_repr
 
-    def __init__(self, update_every_nth):
+    def setGradientFunction(self, fun_gradient, nparameters, ndatasize):
         """
-        __init__(IFitObserver self, int update_every_nth) -> IFitObserver
+        setGradientFunction(IMinimizer self, IMinimizer::function_gradient_t fun_gradient, size_t nparameters, size_t ndatasize)
 
-        IFitObserver::IFitObserver(int update_every_nth)
+        void IMinimizer::setGradientFunction(function_gradient_t fun_gradient, size_t nparameters, size_t ndatasize)
+
+        Sets gradient function to minimize. 
 
         """
-        if self.__class__ == IFitObserver:
-            _self = None
-        else:
-            _self = self
-        this = _libBornAgainFit.new_IFitObserver(_self, update_every_nth)
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
+        return _libBornAgainFit.IMinimizer_setGradientFunction(self, fun_gradient, nparameters, ndatasize)
 
-    def notify(self, subject):
+
+    def getNumberOfVariables(self):
         """
-        notify(IFitObserver self, IObservable subject)
+        getNumberOfVariables(IMinimizer self) -> size_t
 
-        void IFitObserver::notify(IObservable *subject)
+        size_t IMinimizer::getNumberOfVariables() const
 
-        The method used by Ovservable when he wants to be observed by this. 
+        Returns number of variables to fit. 
 
         """
-        return _libBornAgainFit.IFitObserver_notify(self, subject)
+        return _libBornAgainFit.IMinimizer_getNumberOfVariables(self)
 
 
-    def update(self, fit_suite):
+    def getMinValue(self):
         """
-        update(IFitObserver self, FitSuite fit_suite)
+        getMinValue(IMinimizer self) -> double
 
-        void IFitObserver::update(FitSuite *fit_suite)
+        double IMinimizer::getMinValue() const
 
-        Here Onserver will do actuall job when he thinks that it is a right moment. 
+        Returns minimum function value. 
 
         """
-        return _libBornAgainFit.IFitObserver_update(self, fit_suite)
+        return _libBornAgainFit.IMinimizer_getMinValue(self)
 
-    __swig_destroy__ = _libBornAgainFit.delete_IFitObserver
-    __del__ = lambda self: None
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainFit.disown_IFitObserver(self)
-        return weakref_proxy(self)
-IFitObserver_swigregister = _libBornAgainFit.IFitObserver_swigregister
-IFitObserver_swigregister(IFitObserver)
 
-class IFitStrategy(libBornAgainCore.INamed):
-    """
+    def getValueOfVariableAtMinimum(self, index):
+        """
+        getValueOfVariableAtMinimum(IMinimizer self, size_t index) -> double
 
+        double IMinimizer::getValueOfVariableAtMinimum(size_t index) const
 
-    Interface to concrete fit strategy.
+        Returns value of the parameter at the minimum. 
 
-    Concrete implementation should manipulate with fit parameters/data and then call minimizer.
+        """
+        return _libBornAgainFit.IMinimizer_getValueOfVariableAtMinimum(self, index)
 
-    C++ includes: IFitStrategy.h
 
-    """
+    def getValueOfVariablesAtMinimum(self):
+        """
+        getValueOfVariablesAtMinimum(IMinimizer self) -> vdouble1d_t
 
-    __swig_setmethods__ = {}
-    for _s in [libBornAgainCore.INamed]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitStrategy, name, value)
-    __swig_getmethods__ = {}
-    for _s in [libBornAgainCore.INamed]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IFitStrategy, name)
+        std::vector< double > IMinimizer::getValueOfVariablesAtMinimum() const
 
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
+        Returns values of parameters at the minimum. 
 
-    def clone(self):
         """
-        clone(IFitStrategy self) -> IFitStrategy
+        return _libBornAgainFit.IMinimizer_getValueOfVariablesAtMinimum(self)
 
-        virtual IFitStrategy* IFitStrategy::clone() const =0
 
+    def getErrorOfVariable(self, index):
         """
-        return _libBornAgainFit.IFitStrategy_clone(self)
+        getErrorOfVariable(IMinimizer self, size_t index) -> double
 
-    __swig_destroy__ = _libBornAgainFit.delete_IFitStrategy
-    __del__ = lambda self: None
+        double IMinimizer::getErrorOfVariable(size_t index) const
+
+        Returns error of variable at minimum. 
 
-    def init(self, fit_suite):
         """
-        init(IFitStrategy self, FitKernel * fit_suite)
+        return _libBornAgainFit.IMinimizer_getErrorOfVariable(self, index)
 
-        void IFitStrategy::init(FitKernel *fit_suite)
 
+    def getErrorOfVariables(self):
         """
-        return _libBornAgainFit.IFitStrategy_init(self, fit_suite)
+        getErrorOfVariables(IMinimizer self) -> vdouble1d_t
 
+        std::vector< double > IMinimizer::getErrorOfVariables() const
+
+        Returns errors of variables at minimum. 
 
-    def execute(self):
         """
-        execute(IFitStrategy self)
+        return _libBornAgainFit.IMinimizer_getErrorOfVariables(self)
 
-        virtual void IFitStrategy::execute()=0
 
+    def clear(self):
         """
-        return _libBornAgainFit.IFitStrategy_execute(self)
+        clear(IMinimizer self)
 
-IFitStrategy_swigregister = _libBornAgainFit.IFitStrategy_swigregister
-IFitStrategy_swigregister(IFitStrategy)
+        void IMinimizer::clear()
 
-class FitStrategyDefault(IFitStrategy):
-    """
+        clear resources (parameters) for consecutives minimizations 
 
+        """
+        return _libBornAgainFit.IMinimizer_clear(self)
 
-    Default fit strategy just let  FitSuite to run it's minimization round.
 
-    C++ includes: IFitStrategy.h
+    def printResults(self):
+        """
+        printResults(IMinimizer self)
 
-    """
+        void IMinimizer::printResults() const
 
-    __swig_setmethods__ = {}
-    for _s in [IFitStrategy]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, FitStrategyDefault, name, value)
-    __swig_getmethods__ = {}
-    for _s in [IFitStrategy]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, FitStrategyDefault, name)
-    __repr__ = _swig_repr
+        Prints fit results. 
 
-    def __init__(self):
         """
-        __init__(FitStrategyDefault self) -> FitStrategyDefault
+        return _libBornAgainFit.IMinimizer_printResults(self)
 
-        FitStrategyDefault::FitStrategyDefault()
 
+    def getNCalls(self):
         """
-        this = _libBornAgainFit.new_FitStrategyDefault()
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
+        getNCalls(IMinimizer self) -> size_t
 
-    def clone(self):
-        """
-        clone(FitStrategyDefault self) -> IFitStrategy
+        size_t IMinimizer::getNCalls() const
 
-        IFitStrategy * FitStrategyDefault::clone() const 
+        Returns number of calls of minimized function. 
 
         """
-        return _libBornAgainFit.FitStrategyDefault_clone(self)
+        return _libBornAgainFit.IMinimizer_getNCalls(self)
 
 
-    def execute(self):
+    def getOptions(self, *args):
         """
-        execute(FitStrategyDefault self)
+        getOptions(IMinimizer self) -> MinimizerOptions
+        getOptions(IMinimizer self) -> MinimizerOptions
 
-        void FitStrategyDefault::execute()
+        const MinimizerOptions * IMinimizer::getOptions() const 
 
         """
-        return _libBornAgainFit.FitStrategyDefault_execute(self)
+        return _libBornAgainFit.IMinimizer_getOptions(self, *args)
 
-    __swig_destroy__ = _libBornAgainFit.delete_FitStrategyDefault
-    __del__ = lambda self: None
-FitStrategyDefault_swigregister = _libBornAgainFit.FitStrategyDefault_swigregister
-FitStrategyDefault_swigregister(FitStrategyDefault)
 
-class IIntensityFunction(_object):
-    """Proxy of C++ IIntensityFunction class."""
+    def setOptions(self, options):
+        """
+        setOptions(IMinimizer self, MinimizerOptions options)
 
-    __swig_setmethods__ = {}
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityFunction, name, value)
-    __swig_getmethods__ = {}
-    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityFunction, name)
+        void IMinimizer::setOptions(const MinimizerOptions &options)
 
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IIntensityFunction
-    __del__ = lambda self: None
+        set minimizer options 
 
-    def clone(self):
-        """clone(IIntensityFunction self) -> IIntensityFunction"""
-        return _libBornAgainFit.IIntensityFunction_clone(self)
+        """
+        return _libBornAgainFit.IMinimizer_setOptions(self, options)
 
 
-    def evaluate(self, value):
-        """evaluate(IIntensityFunction self, double value) -> double"""
-        return _libBornAgainFit.IIntensityFunction_evaluate(self, value)
+    def setOptionString(self, options):
+        """
+        setOptionString(IMinimizer self, std::string const & options)
 
-IIntensityFunction_swigregister = _libBornAgainFit.IIntensityFunction_swigregister
-IIntensityFunction_swigregister(IIntensityFunction)
+        void IMinimizer::setOptionString(const std::string &options)
 
-class IntensityFunctionLog(IIntensityFunction):
-    """Proxy of C++ IntensityFunctionLog class."""
+        set minimizer option string 
 
-    __swig_setmethods__ = {}
-    for _s in [IIntensityFunction]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionLog, name, value)
-    __swig_getmethods__ = {}
-    for _s in [IIntensityFunction]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionLog, name)
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IntensityFunctionLog
-    __del__ = lambda self: None
+        """
+        return _libBornAgainFit.IMinimizer_setOptionString(self, options)
 
-    def clone(self):
-        """clone(IntensityFunctionLog self) -> IntensityFunctionLog"""
-        return _libBornAgainFit.IntensityFunctionLog_clone(self)
 
+    def isGradientBasedAgorithm(self):
+        """
+        isGradientBasedAgorithm(IMinimizer self) -> bool
 
-    def evaluate(self, value):
-        """evaluate(IntensityFunctionLog self, double value) -> double"""
-        return _libBornAgainFit.IntensityFunctionLog_evaluate(self, value)
+        bool IMinimizer::isGradientBasedAgorithm()
 
+        Checks if type of algorithm is Levenberg-Marquardt or similar. 
 
-    def __init__(self):
-        """__init__(IntensityFunctionLog self) -> IntensityFunctionLog"""
-        this = _libBornAgainFit.new_IntensityFunctionLog()
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-IntensityFunctionLog_swigregister = _libBornAgainFit.IntensityFunctionLog_swigregister
-IntensityFunctionLog_swigregister(IntensityFunctionLog)
+        """
+        return _libBornAgainFit.IMinimizer_isGradientBasedAgorithm(self)
 
-class IntensityFunctionSqrt(IIntensityFunction):
-    """Proxy of C++ IntensityFunctionSqrt class."""
 
-    __swig_setmethods__ = {}
-    for _s in [IIntensityFunction]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionSqrt, name, value)
-    __swig_getmethods__ = {}
-    for _s in [IIntensityFunction]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionSqrt, name)
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IntensityFunctionSqrt
-    __del__ = lambda self: None
+    def getMinimizerName(self):
+        """
+        getMinimizerName(IMinimizer self) -> std::string
 
-    def clone(self):
-        """clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"""
-        return _libBornAgainFit.IntensityFunctionSqrt_clone(self)
+        std::string IMinimizer::getMinimizerName() const
 
+        return name of the minimizer 
 
-    def evaluate(self, value):
-        """evaluate(IntensityFunctionSqrt self, double value) -> double"""
-        return _libBornAgainFit.IntensityFunctionSqrt_evaluate(self, value)
+        """
+        return _libBornAgainFit.IMinimizer_getMinimizerName(self)
 
 
-    def __init__(self):
-        """__init__(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"""
-        this = _libBornAgainFit.new_IntensityFunctionSqrt()
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-IntensityFunctionSqrt_swigregister = _libBornAgainFit.IntensityFunctionSqrt_swigregister
-IntensityFunctionSqrt_swigregister(IntensityFunctionSqrt)
+    def getAlgorithmName(self):
+        """
+        getAlgorithmName(IMinimizer self) -> std::string
 
-class IIntensityNormalizer(libBornAgainCore.IParameterized):
-    """Proxy of C++ IIntensityNormalizer class."""
+        std::string IMinimizer::getAlgorithmName() const
+
+        return name of the minimization algorithm 
+
+        """
+        return _libBornAgainFit.IMinimizer_getAlgorithmName(self)
+
+IMinimizer_swigregister = _libBornAgainFit.IMinimizer_swigregister
+IMinimizer_swigregister(IMinimizer)
+
+class IChiSquaredModule(libBornAgainCore.ICloneable):
+    """Proxy of C++ IChiSquaredModule class."""
 
     __swig_setmethods__ = {}
-    for _s in [libBornAgainCore.IParameterized]:
+    for _s in [libBornAgainCore.ICloneable]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityNormalizer, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IChiSquaredModule, name, value)
     __swig_getmethods__ = {}
-    for _s in [libBornAgainCore.IParameterized]:
+    for _s in [libBornAgainCore.ICloneable]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityNormalizer, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, IChiSquaredModule, name)
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IIntensityNormalizer
+    __swig_destroy__ = _libBornAgainFit.delete_IChiSquaredModule
     __del__ = lambda self: None
 
     def clone(self):
-        """clone(IIntensityNormalizer self) -> IIntensityNormalizer"""
-        return _libBornAgainFit.IIntensityNormalizer_clone(self)
+        """clone(IChiSquaredModule self) -> IChiSquaredModule"""
+        return _libBornAgainFit.IChiSquaredModule_clone(self)
 
 
-    def createNormalizedData(self, data):
-        """createNormalizedData(IIntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"""
-        return _libBornAgainFit.IIntensityNormalizer_createNormalizedData(self, data)
+    def getSquaredFunction(self):
+        """getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction"""
+        return _libBornAgainFit.IChiSquaredModule_getSquaredFunction(self)
 
 
-    def apply(self, data):
-        """apply(IIntensityNormalizer self, OutputData< double > & data)"""
-        return _libBornAgainFit.IIntensityNormalizer_apply(self, data)
+    def setChiSquaredFunction(self, *args):
+        """
+        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
+        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
+        """
+        return _libBornAgainFit.IChiSquaredModule_setChiSquaredFunction(self, *args)
 
 
-    def setMaximumIntensity(self, arg2):
-        """setMaximumIntensity(IIntensityNormalizer self, double arg2)"""
-        return _libBornAgainFit.IIntensityNormalizer_setMaximumIntensity(self, arg2)
+    def getIntensityNormalizer(self, *args):
+        """
+        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
+        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
+        """
+        return _libBornAgainFit.IChiSquaredModule_getIntensityNormalizer(self, *args)
 
-IIntensityNormalizer_swigregister = _libBornAgainFit.IIntensityNormalizer_swigregister
-IIntensityNormalizer_swigregister(IIntensityNormalizer)
 
-class IntensityNormalizer(IIntensityNormalizer):
-    """Proxy of C++ IntensityNormalizer class."""
+    def setIntensityNormalizer(self, data_normalizer):
+        """setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)"""
+        return _libBornAgainFit.IChiSquaredModule_setIntensityNormalizer(self, data_normalizer)
 
-    __swig_setmethods__ = {}
-    for _s in [IIntensityNormalizer]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityNormalizer, name, value)
-    __swig_getmethods__ = {}
-    for _s in [IIntensityNormalizer]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IntensityNormalizer, name)
-    __repr__ = _swig_repr
 
-    def __init__(self, scale=1.0, shift=0.0):
-        """
-        __init__(IntensityNormalizer self, double scale=1.0, double shift=0.0) -> IntensityNormalizer
-        __init__(IntensityNormalizer self, double scale=1.0) -> IntensityNormalizer
-        __init__(IntensityNormalizer self) -> IntensityNormalizer
-        """
-        this = _libBornAgainFit.new_IntensityNormalizer(scale, shift)
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-    __swig_destroy__ = _libBornAgainFit.delete_IntensityNormalizer
-    __del__ = lambda self: None
+    def getIntensityFunction(self):
+        """getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction"""
+        return _libBornAgainFit.IChiSquaredModule_getIntensityFunction(self)
 
-    def clone(self):
-        """clone(IntensityNormalizer self) -> IntensityNormalizer"""
-        return _libBornAgainFit.IntensityNormalizer_clone(self)
 
+    def setIntensityFunction(self, intensity_function):
+        """setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)"""
+        return _libBornAgainFit.IChiSquaredModule_setIntensityFunction(self, intensity_function)
 
-    def createNormalizedData(self, data):
-        """createNormalizedData(IntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"""
-        return _libBornAgainFit.IntensityNormalizer_createNormalizedData(self, data)
 
+    def processFitElements(self, arg2, arg3):
+        """processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg2, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3)"""
+        return _libBornAgainFit.IChiSquaredModule_processFitElements(self, arg2, arg3)
+
+IChiSquaredModule_swigregister = _libBornAgainFit.IChiSquaredModule_swigregister
+IChiSquaredModule_swigregister(IChiSquaredModule)
 
-    def apply(self, data):
-        """apply(IntensityNormalizer self, OutputData< double > & data)"""
-        return _libBornAgainFit.IntensityNormalizer_apply(self, data)
+class IFitObserver(libBornAgainCore.IObserver):
+    """
 
 
-    def setMaximumIntensity(self, max_intensity):
-        """setMaximumIntensity(IntensityNormalizer self, double max_intensity)"""
-        return _libBornAgainFit.IntensityNormalizer_setMaximumIntensity(self, max_intensity)
+    Base class for all fit observers. Calls update method in following cases: first iteration, every n-th iteration, last iteration and when fit strategy has changed.
 
-IntensityNormalizer_swigregister = _libBornAgainFit.IntensityNormalizer_swigregister
-IntensityNormalizer_swigregister(IntensityNormalizer)
+    C++ includes: IFitObserver.h
 
-class IntensityScaleAndShiftNormalizer(IntensityNormalizer):
-    """Proxy of C++ IntensityScaleAndShiftNormalizer class."""
+    """
 
     __swig_setmethods__ = {}
-    for _s in [IntensityNormalizer]:
+    for _s in [libBornAgainCore.IObserver]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityScaleAndShiftNormalizer, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitObserver, name, value)
     __swig_getmethods__ = {}
-    for _s in [IntensityNormalizer]:
+    for _s in [libBornAgainCore.IObserver]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IntensityScaleAndShiftNormalizer, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, IFitObserver, name)
     __repr__ = _swig_repr
 
-    def __init__(self, scale=1.0, shift=0.0):
+    def __init__(self, update_every_nth):
         """
-        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0, double shift=0.0) -> IntensityScaleAndShiftNormalizer
-        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0) -> IntensityScaleAndShiftNormalizer
-        __init__(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer
+        __init__(IFitObserver self, int update_every_nth) -> IFitObserver
+
+        IFitObserver::IFitObserver(int update_every_nth)
+
         """
-        this = _libBornAgainFit.new_IntensityScaleAndShiftNormalizer(scale, shift)
+        if self.__class__ == IFitObserver:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainFit.new_IFitObserver(_self, update_every_nth)
         try:
             self.this.append(this)
         except Exception:
             self.this = this
-    __swig_destroy__ = _libBornAgainFit.delete_IntensityScaleAndShiftNormalizer
-    __del__ = lambda self: None
 
-    def setMaximumIntensity(self, max_intensity):
-        """setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double max_intensity)"""
-        return _libBornAgainFit.IntensityScaleAndShiftNormalizer_setMaximumIntensity(self, max_intensity)
+    def notify(self, subject):
+        """
+        notify(IFitObserver self, IObservable subject)
 
+        void IFitObserver::notify(IObservable *subject)
 
-    def clone(self):
-        """clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer"""
-        return _libBornAgainFit.IntensityScaleAndShiftNormalizer_clone(self)
+        The method used by Ovservable when he wants to be observed by this. 
 
-IntensityScaleAndShiftNormalizer_swigregister = _libBornAgainFit.IntensityScaleAndShiftNormalizer_swigregister
-IntensityScaleAndShiftNormalizer_swigregister(IntensityScaleAndShiftNormalizer)
+        """
+        return _libBornAgainFit.IFitObserver_notify(self, subject)
 
-class ISquaredFunction(_object):
-    """Proxy of C++ ISquaredFunction class."""
+
+    def update(self, fit_suite):
+        """
+        update(IFitObserver self, FitSuite fit_suite)
+
+        void IFitObserver::update(FitSuite *fit_suite)
+
+        Here Onserver will do actuall job when he thinks that it is a right moment. 
+
+        """
+        return _libBornAgainFit.IFitObserver_update(self, fit_suite)
+
+    __swig_destroy__ = _libBornAgainFit.delete_IFitObserver
+    __del__ = lambda self: None
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainFit.disown_IFitObserver(self)
+        return weakref_proxy(self)
+IFitObserver_swigregister = _libBornAgainFit.IFitObserver_swigregister
+IFitObserver_swigregister(IFitObserver)
+
+class IFitStrategy(libBornAgainCore.INamed):
+    """
+
+
+    Interface to concrete fit strategy.
+
+    Concrete implementation should manipulate with fit parameters/data and then call minimizer.
+
+    C++ includes: IFitStrategy.h
+
+    """
 
     __swig_setmethods__ = {}
-    __setattr__ = lambda self, name, value: _swig_setattr(self, ISquaredFunction, name, value)
+    for _s in [libBornAgainCore.INamed]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitStrategy, name, value)
     __swig_getmethods__ = {}
-    __getattr__ = lambda self, name: _swig_getattr(self, ISquaredFunction, name)
+    for _s in [libBornAgainCore.INamed]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFitStrategy, name)
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_ISquaredFunction
-    __del__ = lambda self: None
 
     def clone(self):
-        """clone(ISquaredFunction self) -> ISquaredFunction"""
-        return _libBornAgainFit.ISquaredFunction_clone(self)
+        """
+        clone(IFitStrategy self) -> IFitStrategy
 
+        virtual IFitStrategy* IFitStrategy::clone() const =0
 
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.ISquaredFunction_calculateSquaredDifference(self, real_value, simulated_value)
+        """
+        return _libBornAgainFit.IFitStrategy_clone(self)
 
+    __swig_destroy__ = _libBornAgainFit.delete_IFitStrategy
+    __del__ = lambda self: None
 
-    def calculateSquaredError(self, real_value, simulated_value=0.0):
+    def init(self, fit_suite):
         """
-        calculateSquaredError(ISquaredFunction self, double real_value, double simulated_value=0.0) -> double
-        calculateSquaredError(ISquaredFunction self, double real_value) -> double
+        init(IFitStrategy self, FitKernel * fit_suite)
+
+        void IFitStrategy::init(FitKernel *fit_suite)
+
         """
-        return _libBornAgainFit.ISquaredFunction_calculateSquaredError(self, real_value, simulated_value)
+        return _libBornAgainFit.IFitStrategy_init(self, fit_suite)
 
-ISquaredFunction_swigregister = _libBornAgainFit.ISquaredFunction_swigregister
-ISquaredFunction_swigregister(ISquaredFunction)
 
-class SquaredFunctionDefault(ISquaredFunction):
-    """Proxy of C++ SquaredFunctionDefault class."""
+    def execute(self):
+        """
+        execute(IFitStrategy self)
+
+        virtual void IFitStrategy::execute()=0
+
+        """
+        return _libBornAgainFit.IFitStrategy_execute(self)
+
+IFitStrategy_swigregister = _libBornAgainFit.IFitStrategy_swigregister
+IFitStrategy_swigregister(IFitStrategy)
+
+class FitStrategyDefault(IFitStrategy):
+    """
+
+
+    Default fit strategy just let  FitSuite to run it's minimization round.
+
+    C++ includes: IFitStrategy.h
+
+    """
 
     __swig_setmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IFitStrategy]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionDefault, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitStrategyDefault, name, value)
     __swig_getmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IFitStrategy]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionDefault, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, FitStrategyDefault, name)
     __repr__ = _swig_repr
 
     def __init__(self):
-        """__init__(SquaredFunctionDefault self) -> SquaredFunctionDefault"""
-        this = _libBornAgainFit.new_SquaredFunctionDefault()
+        """
+        __init__(FitStrategyDefault self) -> FitStrategyDefault
+
+        FitStrategyDefault::FitStrategyDefault()
+
+        """
+        this = _libBornAgainFit.new_FitStrategyDefault()
         try:
             self.this.append(this)
         except Exception:
             self.this = this
-    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionDefault
-    __del__ = lambda self: None
 
     def clone(self):
-        """clone(SquaredFunctionDefault self) -> SquaredFunctionDefault"""
-        return _libBornAgainFit.SquaredFunctionDefault_clone(self)
+        """
+        clone(FitStrategyDefault self) -> IFitStrategy
 
+        IFitStrategy * FitStrategyDefault::clone() const 
 
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionDefault_calculateSquaredDifference(self, real_value, simulated_value)
+        """
+        return _libBornAgainFit.FitStrategyDefault_clone(self)
 
 
-    def calculateSquaredError(self, real_value, simulated_value=0):
+    def execute(self):
         """
-        calculateSquaredError(SquaredFunctionDefault self, double real_value, double simulated_value=0) -> double
-        calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double
+        execute(FitStrategyDefault self)
+
+        void FitStrategyDefault::execute()
+
         """
-        return _libBornAgainFit.SquaredFunctionDefault_calculateSquaredError(self, real_value, simulated_value)
+        return _libBornAgainFit.FitStrategyDefault_execute(self)
 
-SquaredFunctionDefault_swigregister = _libBornAgainFit.SquaredFunctionDefault_swigregister
-SquaredFunctionDefault_swigregister(SquaredFunctionDefault)
+    __swig_destroy__ = _libBornAgainFit.delete_FitStrategyDefault
+    __del__ = lambda self: None
+FitStrategyDefault_swigregister = _libBornAgainFit.FitStrategyDefault_swigregister
+FitStrategyDefault_swigregister(FitStrategyDefault)
 
-class SquaredFunctionSimError(ISquaredFunction):
-    """Proxy of C++ SquaredFunctionSimError class."""
+class IIntensityFunction(_object):
+    """Proxy of C++ IIntensityFunction class."""
 
     __swig_setmethods__ = {}
-    for _s in [ISquaredFunction]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSimError, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityFunction, name, value)
     __swig_getmethods__ = {}
-    for _s in [ISquaredFunction]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSimError, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityFunction, name)
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionSimError
+    __swig_destroy__ = _libBornAgainFit.delete_IIntensityFunction
     __del__ = lambda self: None
 
     def clone(self):
-        """clone(SquaredFunctionSimError self) -> SquaredFunctionSimError"""
-        return _libBornAgainFit.SquaredFunctionSimError_clone(self)
-
-
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionSimError_calculateSquaredDifference(self, real_value, simulated_value)
+        """clone(IIntensityFunction self) -> IIntensityFunction"""
+        return _libBornAgainFit.IIntensityFunction_clone(self)
 
 
-    def calculateSquaredError(self, real_value, simulated_value):
-        """calculateSquaredError(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionSimError_calculateSquaredError(self, real_value, simulated_value)
+    def evaluate(self, value):
+        """evaluate(IIntensityFunction self, double value) -> double"""
+        return _libBornAgainFit.IIntensityFunction_evaluate(self, value)
 
-SquaredFunctionSimError_swigregister = _libBornAgainFit.SquaredFunctionSimError_swigregister
-SquaredFunctionSimError_swigregister(SquaredFunctionSimError)
+IIntensityFunction_swigregister = _libBornAgainFit.IIntensityFunction_swigregister
+IIntensityFunction_swigregister(IIntensityFunction)
 
-class SquaredFunctionMeanSquaredError(ISquaredFunction):
-    """Proxy of C++ SquaredFunctionMeanSquaredError class."""
+class IntensityFunctionLog(IIntensityFunction):
+    """Proxy of C++ IntensityFunctionLog class."""
 
     __swig_setmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IIntensityFunction]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionMeanSquaredError, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionLog, name, value)
     __swig_getmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IIntensityFunction]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionMeanSquaredError, name)
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionLog, name)
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionMeanSquaredError
+    __swig_destroy__ = _libBornAgainFit.delete_IntensityFunctionLog
     __del__ = lambda self: None
 
     def clone(self):
-        """clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError"""
-        return _libBornAgainFit.SquaredFunctionMeanSquaredError_clone(self)
-
+        """clone(IntensityFunctionLog self) -> IntensityFunctionLog"""
+        return _libBornAgainFit.IntensityFunctionLog_clone(self)
 
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionMeanSquaredError_calculateSquaredDifference(self, real_value, simulated_value)
 
+    def evaluate(self, value):
+        """evaluate(IntensityFunctionLog self, double value) -> double"""
+        return _libBornAgainFit.IntensityFunctionLog_evaluate(self, value)
 
-    def calculateSquaredError(self, real_value, simulated_value):
-        """calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionMeanSquaredError_calculateSquaredError(self, real_value, simulated_value)
 
-SquaredFunctionMeanSquaredError_swigregister = _libBornAgainFit.SquaredFunctionMeanSquaredError_swigregister
-SquaredFunctionMeanSquaredError_swigregister(SquaredFunctionMeanSquaredError)
+    def __init__(self):
+        """__init__(IntensityFunctionLog self) -> IntensityFunctionLog"""
+        this = _libBornAgainFit.new_IntensityFunctionLog()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+IntensityFunctionLog_swigregister = _libBornAgainFit.IntensityFunctionLog_swigregister
+IntensityFunctionLog_swigregister(IntensityFunctionLog)
 
-class SquaredFunctionSystematicError(ISquaredFunction):
-    """Proxy of C++ SquaredFunctionSystematicError class."""
+class IntensityFunctionSqrt(IIntensityFunction):
+    """Proxy of C++ IntensityFunctionSqrt class."""
 
     __swig_setmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IIntensityFunction]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSystematicError, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionSqrt, name, value)
     __swig_getmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [IIntensityFunction]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSystematicError, name)
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionSqrt, name)
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionSystematicError
+    __swig_destroy__ = _libBornAgainFit.delete_IntensityFunctionSqrt
     __del__ = lambda self: None
 
     def clone(self):
-        """clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError"""
-        return _libBornAgainFit.SquaredFunctionSystematicError_clone(self)
-
+        """clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"""
+        return _libBornAgainFit.IntensityFunctionSqrt_clone(self)
 
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionSystematicError_calculateSquaredDifference(self, real_value, simulated_value)
 
+    def evaluate(self, value):
+        """evaluate(IntensityFunctionSqrt self, double value) -> double"""
+        return _libBornAgainFit.IntensityFunctionSqrt_evaluate(self, value)
 
-    def calculateSquaredError(self, real_value, simulated_value):
-        """calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionSystematicError_calculateSquaredError(self, real_value, simulated_value)
 
-SquaredFunctionSystematicError_swigregister = _libBornAgainFit.SquaredFunctionSystematicError_swigregister
-SquaredFunctionSystematicError_swigregister(SquaredFunctionSystematicError)
+    def __init__(self):
+        """__init__(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"""
+        this = _libBornAgainFit.new_IntensityFunctionSqrt()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+IntensityFunctionSqrt_swigregister = _libBornAgainFit.IntensityFunctionSqrt_swigregister
+IntensityFunctionSqrt_swigregister(IntensityFunctionSqrt)
 
-class SquaredFunctionGaussianError(ISquaredFunction):
-    """Proxy of C++ SquaredFunctionGaussianError class."""
+class IIntensityNormalizer(libBornAgainCore.IParameterized):
+    """Proxy of C++ IIntensityNormalizer class."""
 
     __swig_setmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [libBornAgainCore.IParameterized]:
         __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionGaussianError, name, value)
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityNormalizer, name, value)
     __swig_getmethods__ = {}
-    for _s in [ISquaredFunction]:
+    for _s in [libBornAgainCore.IParameterized]:
         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionGaussianError, name)
+    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityNormalizer, name)
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionGaussianError
+    __swig_destroy__ = _libBornAgainFit.delete_IIntensityNormalizer
     __del__ = lambda self: None
 
     def clone(self):
-        """clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError"""
-        return _libBornAgainFit.SquaredFunctionGaussianError_clone(self)
-
-
-    def calculateSquaredDifference(self, real_value, simulated_value):
-        """calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double"""
-        return _libBornAgainFit.SquaredFunctionGaussianError_calculateSquaredDifference(self, real_value, simulated_value)
+        """clone(IIntensityNormalizer self) -> IIntensityNormalizer"""
+        return _libBornAgainFit.IIntensityNormalizer_clone(self)
 
 
-    def calculateSquaredError(self, arg2, arg3):
-        """calculateSquaredError(SquaredFunctionGaussianError self, double arg2, double arg3) -> double"""
-        return _libBornAgainFit.SquaredFunctionGaussianError_calculateSquaredError(self, arg2, arg3)
+    def createNormalizedData(self, data):
+        """createNormalizedData(IIntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"""
+        return _libBornAgainFit.IIntensityNormalizer_createNormalizedData(self, data)
 
-SquaredFunctionGaussianError_swigregister = _libBornAgainFit.SquaredFunctionGaussianError_swigregister
-SquaredFunctionGaussianError_swigregister(SquaredFunctionGaussianError)
 
-class IMinimizer(_object):
-    """
+    def apply(self, data):
+        """apply(IIntensityNormalizer self, OutputData< double > & data)"""
+        return _libBornAgainFit.IIntensityNormalizer_apply(self, data)
 
 
-    Common interface for all kind minimizer's.
+    def setMaximumIntensity(self, arg2):
+        """setMaximumIntensity(IIntensityNormalizer self, double arg2)"""
+        return _libBornAgainFit.IIntensityNormalizer_setMaximumIntensity(self, arg2)
 
-    C++ includes: IMinimizer.h
+IIntensityNormalizer_swigregister = _libBornAgainFit.IIntensityNormalizer_swigregister
+IIntensityNormalizer_swigregister(IIntensityNormalizer)
 
-    """
+class IntensityNormalizer(IIntensityNormalizer):
+    """Proxy of C++ IntensityNormalizer class."""
 
     __swig_setmethods__ = {}
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IMinimizer, name, value)
+    for _s in [IIntensityNormalizer]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityNormalizer, name, value)
     __swig_getmethods__ = {}
-    __getattr__ = lambda self, name: _swig_getattr(self, IMinimizer, name)
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
+    for _s in [IIntensityNormalizer]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityNormalizer, name)
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
-    __del__ = lambda self: None
-
-    def minimize(self):
-        """
-        minimize(IMinimizer self)
-
-        virtual void IMinimizer::minimize()=0
-
-        run minimization 
-
-        """
-        return _libBornAgainFit.IMinimizer_minimize(self)
-
 
-    def setParameter(self, index, par):
-        """
-        setParameter(IMinimizer self, size_t index, FitParameter par)
-
-        void IMinimizer::setParameter(size_t index, const FitParameter *par)
-
-        Sets internal minimizer parameter. 
-
-        """
-        return _libBornAgainFit.IMinimizer_setParameter(self, index, par)
-
-
-    def setParameters(self, parameters):
-        """
-        setParameters(IMinimizer self, FitSuiteParameters parameters)
-
-        void IMinimizer::setParameters(const FitSuiteParameters &parameters)
-
-        Sets internal minimizer parameters using external parameter list. 
-
-        """
-        return _libBornAgainFit.IMinimizer_setParameters(self, parameters)
-
-
-    def setChiSquaredFunction(self, fun_chi2, nparameters):
+    def __init__(self, scale=1.0, shift=0.0):
         """
-        setChiSquaredFunction(IMinimizer self, IMinimizer::function_chi2_t fun_chi2, size_t nparameters)
-
-        void IMinimizer::setChiSquaredFunction(function_chi2_t fun_chi2, size_t nparameters)
-
-        Sets chi squared function to minimize. 
-
+        __init__(IntensityNormalizer self, double scale=1.0, double shift=0.0) -> IntensityNormalizer
+        __init__(IntensityNormalizer self, double scale=1.0) -> IntensityNormalizer
+        __init__(IntensityNormalizer self) -> IntensityNormalizer
         """
-        return _libBornAgainFit.IMinimizer_setChiSquaredFunction(self, fun_chi2, nparameters)
-
+        this = _libBornAgainFit.new_IntensityNormalizer(scale, shift)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_IntensityNormalizer
+    __del__ = lambda self: None
 
-    def setGradientFunction(self, fun_gradient, nparameters, ndatasize):
-        """
-        setGradientFunction(IMinimizer self, IMinimizer::function_gradient_t fun_gradient, size_t nparameters, size_t ndatasize)
+    def clone(self):
+        """clone(IntensityNormalizer self) -> IntensityNormalizer"""
+        return _libBornAgainFit.IntensityNormalizer_clone(self)
 
-        void IMinimizer::setGradientFunction(function_gradient_t fun_gradient, size_t nparameters, size_t ndatasize)
 
-        Sets gradient function to minimize. 
+    def createNormalizedData(self, data):
+        """createNormalizedData(IntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"""
+        return _libBornAgainFit.IntensityNormalizer_createNormalizedData(self, data)
 
-        """
-        return _libBornAgainFit.IMinimizer_setGradientFunction(self, fun_gradient, nparameters, ndatasize)
 
+    def apply(self, data):
+        """apply(IntensityNormalizer self, OutputData< double > & data)"""
+        return _libBornAgainFit.IntensityNormalizer_apply(self, data)
 
-    def getNumberOfVariables(self):
-        """
-        getNumberOfVariables(IMinimizer self) -> size_t
 
-        size_t IMinimizer::getNumberOfVariables() const
+    def setMaximumIntensity(self, max_intensity):
+        """setMaximumIntensity(IntensityNormalizer self, double max_intensity)"""
+        return _libBornAgainFit.IntensityNormalizer_setMaximumIntensity(self, max_intensity)
 
-        Returns number of variables to fit. 
+IntensityNormalizer_swigregister = _libBornAgainFit.IntensityNormalizer_swigregister
+IntensityNormalizer_swigregister(IntensityNormalizer)
 
-        """
-        return _libBornAgainFit.IMinimizer_getNumberOfVariables(self)
+class IntensityScaleAndShiftNormalizer(IntensityNormalizer):
+    """Proxy of C++ IntensityScaleAndShiftNormalizer class."""
 
+    __swig_setmethods__ = {}
+    for _s in [IntensityNormalizer]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityScaleAndShiftNormalizer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IntensityNormalizer]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityScaleAndShiftNormalizer, name)
+    __repr__ = _swig_repr
 
-    def getMinValue(self):
+    def __init__(self, scale=1.0, shift=0.0):
         """
-        getMinValue(IMinimizer self) -> double
-
-        double IMinimizer::getMinValue() const
-
-        Returns minimum function value. 
-
+        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0, double shift=0.0) -> IntensityScaleAndShiftNormalizer
+        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0) -> IntensityScaleAndShiftNormalizer
+        __init__(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer
         """
-        return _libBornAgainFit.IMinimizer_getMinValue(self)
+        this = _libBornAgainFit.new_IntensityScaleAndShiftNormalizer(scale, shift)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_IntensityScaleAndShiftNormalizer
+    __del__ = lambda self: None
 
+    def setMaximumIntensity(self, max_intensity):
+        """setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double max_intensity)"""
+        return _libBornAgainFit.IntensityScaleAndShiftNormalizer_setMaximumIntensity(self, max_intensity)
 
-    def getValueOfVariableAtMinimum(self, index):
-        """
-        getValueOfVariableAtMinimum(IMinimizer self, size_t index) -> double
 
-        double IMinimizer::getValueOfVariableAtMinimum(size_t index) const
+    def clone(self):
+        """clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer"""
+        return _libBornAgainFit.IntensityScaleAndShiftNormalizer_clone(self)
 
-        Returns value of the parameter at the minimum. 
+IntensityScaleAndShiftNormalizer_swigregister = _libBornAgainFit.IntensityScaleAndShiftNormalizer_swigregister
+IntensityScaleAndShiftNormalizer_swigregister(IntensityScaleAndShiftNormalizer)
 
-        """
-        return _libBornAgainFit.IMinimizer_getValueOfVariableAtMinimum(self, index)
+class ISquaredFunction(_object):
+    """Proxy of C++ ISquaredFunction class."""
 
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ISquaredFunction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ISquaredFunction, name)
 
-    def getValueOfVariablesAtMinimum(self):
-        """
-        getValueOfVariablesAtMinimum(IMinimizer self) -> vdouble1d_t
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_ISquaredFunction
+    __del__ = lambda self: None
 
-        std::vector< double > IMinimizer::getValueOfVariablesAtMinimum() const
+    def clone(self):
+        """clone(ISquaredFunction self) -> ISquaredFunction"""
+        return _libBornAgainFit.ISquaredFunction_clone(self)
 
-        Returns values of parameters at the minimum. 
 
-        """
-        return _libBornAgainFit.IMinimizer_getValueOfVariablesAtMinimum(self)
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.ISquaredFunction_calculateSquaredDifference(self, real_value, simulated_value)
 
 
-    def getErrorOfVariable(self, index):
+    def calculateSquaredError(self, real_value, simulated_value=0.0):
         """
-        getErrorOfVariable(IMinimizer self, size_t index) -> double
-
-        double IMinimizer::getErrorOfVariable(size_t index) const
-
-        Returns error of variable at minimum. 
-
+        calculateSquaredError(ISquaredFunction self, double real_value, double simulated_value=0.0) -> double
+        calculateSquaredError(ISquaredFunction self, double real_value) -> double
         """
-        return _libBornAgainFit.IMinimizer_getErrorOfVariable(self, index)
-
+        return _libBornAgainFit.ISquaredFunction_calculateSquaredError(self, real_value, simulated_value)
 
-    def getErrorOfVariables(self):
-        """
-        getErrorOfVariables(IMinimizer self) -> vdouble1d_t
+ISquaredFunction_swigregister = _libBornAgainFit.ISquaredFunction_swigregister
+ISquaredFunction_swigregister(ISquaredFunction)
 
-        std::vector< double > IMinimizer::getErrorOfVariables() const
+class SquaredFunctionDefault(ISquaredFunction):
+    """Proxy of C++ SquaredFunctionDefault class."""
 
-        Returns errors of variables at minimum. 
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionDefault, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionDefault, name)
+    __repr__ = _swig_repr
 
-        """
-        return _libBornAgainFit.IMinimizer_getErrorOfVariables(self)
+    def __init__(self):
+        """__init__(SquaredFunctionDefault self) -> SquaredFunctionDefault"""
+        this = _libBornAgainFit.new_SquaredFunctionDefault()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionDefault
+    __del__ = lambda self: None
 
+    def clone(self):
+        """clone(SquaredFunctionDefault self) -> SquaredFunctionDefault"""
+        return _libBornAgainFit.SquaredFunctionDefault_clone(self)
 
-    def clear(self):
-        """
-        clear(IMinimizer self)
 
-        void IMinimizer::clear()
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionDefault_calculateSquaredDifference(self, real_value, simulated_value)
 
-        clear resources (parameters) for consecutives minimizations 
 
+    def calculateSquaredError(self, real_value, simulated_value=0):
         """
-        return _libBornAgainFit.IMinimizer_clear(self)
-
-
-    def printResults(self):
+        calculateSquaredError(SquaredFunctionDefault self, double real_value, double simulated_value=0) -> double
+        calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double
         """
-        printResults(IMinimizer self)
-
-        void IMinimizer::printResults() const
+        return _libBornAgainFit.SquaredFunctionDefault_calculateSquaredError(self, real_value, simulated_value)
 
-        Prints fit results. 
+SquaredFunctionDefault_swigregister = _libBornAgainFit.SquaredFunctionDefault_swigregister
+SquaredFunctionDefault_swigregister(SquaredFunctionDefault)
 
-        """
-        return _libBornAgainFit.IMinimizer_printResults(self)
+class SquaredFunctionSimError(ISquaredFunction):
+    """Proxy of C++ SquaredFunctionSimError class."""
 
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSimError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSimError, name)
 
-    def getNCalls(self):
-        """
-        getNCalls(IMinimizer self) -> size_t
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionSimError
+    __del__ = lambda self: None
 
-        size_t IMinimizer::getNCalls() const
+    def clone(self):
+        """clone(SquaredFunctionSimError self) -> SquaredFunctionSimError"""
+        return _libBornAgainFit.SquaredFunctionSimError_clone(self)
 
-        Returns number of calls of minimized function. 
 
-        """
-        return _libBornAgainFit.IMinimizer_getNCalls(self)
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionSimError_calculateSquaredDifference(self, real_value, simulated_value)
 
 
-    def getOptions(self, *args):
-        """
-        getOptions(IMinimizer self) -> MinimizerOptions
-        getOptions(IMinimizer self) -> MinimizerOptions
+    def calculateSquaredError(self, real_value, simulated_value):
+        """calculateSquaredError(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionSimError_calculateSquaredError(self, real_value, simulated_value)
 
-        const MinimizerOptions * IMinimizer::getOptions() const 
+SquaredFunctionSimError_swigregister = _libBornAgainFit.SquaredFunctionSimError_swigregister
+SquaredFunctionSimError_swigregister(SquaredFunctionSimError)
 
-        """
-        return _libBornAgainFit.IMinimizer_getOptions(self, *args)
+class SquaredFunctionMeanSquaredError(ISquaredFunction):
+    """Proxy of C++ SquaredFunctionMeanSquaredError class."""
 
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionMeanSquaredError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionMeanSquaredError, name)
 
-    def setOptions(self, options):
-        """
-        setOptions(IMinimizer self, MinimizerOptions options)
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionMeanSquaredError
+    __del__ = lambda self: None
 
-        void IMinimizer::setOptions(const MinimizerOptions &options)
+    def clone(self):
+        """clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError"""
+        return _libBornAgainFit.SquaredFunctionMeanSquaredError_clone(self)
 
-        set minimizer options 
 
-        """
-        return _libBornAgainFit.IMinimizer_setOptions(self, options)
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionMeanSquaredError_calculateSquaredDifference(self, real_value, simulated_value)
 
 
-    def setOptionString(self, options):
-        """
-        setOptionString(IMinimizer self, std::string const & options)
+    def calculateSquaredError(self, real_value, simulated_value):
+        """calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionMeanSquaredError_calculateSquaredError(self, real_value, simulated_value)
 
-        void IMinimizer::setOptionString(const std::string &options)
+SquaredFunctionMeanSquaredError_swigregister = _libBornAgainFit.SquaredFunctionMeanSquaredError_swigregister
+SquaredFunctionMeanSquaredError_swigregister(SquaredFunctionMeanSquaredError)
 
-        set minimizer option string 
+class SquaredFunctionSystematicError(ISquaredFunction):
+    """Proxy of C++ SquaredFunctionSystematicError class."""
 
-        """
-        return _libBornAgainFit.IMinimizer_setOptionString(self, options)
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSystematicError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSystematicError, name)
 
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionSystematicError
+    __del__ = lambda self: None
 
-    def isGradientBasedAgorithm(self):
-        """
-        isGradientBasedAgorithm(IMinimizer self) -> bool
+    def clone(self):
+        """clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError"""
+        return _libBornAgainFit.SquaredFunctionSystematicError_clone(self)
 
-        bool IMinimizer::isGradientBasedAgorithm()
 
-        Checks if type of algorithm is Levenberg-Marquardt or similar. 
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionSystematicError_calculateSquaredDifference(self, real_value, simulated_value)
 
-        """
-        return _libBornAgainFit.IMinimizer_isGradientBasedAgorithm(self)
 
+    def calculateSquaredError(self, real_value, simulated_value):
+        """calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionSystematicError_calculateSquaredError(self, real_value, simulated_value)
 
-    def getMinimizerName(self):
-        """
-        getMinimizerName(IMinimizer self) -> std::string
+SquaredFunctionSystematicError_swigregister = _libBornAgainFit.SquaredFunctionSystematicError_swigregister
+SquaredFunctionSystematicError_swigregister(SquaredFunctionSystematicError)
 
-        std::string IMinimizer::getMinimizerName() const
+class SquaredFunctionGaussianError(ISquaredFunction):
+    """Proxy of C++ SquaredFunctionGaussianError class."""
 
-        return name of the minimizer 
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionGaussianError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionGaussianError, name)
 
-        """
-        return _libBornAgainFit.IMinimizer_getMinimizerName(self)
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_SquaredFunctionGaussianError
+    __del__ = lambda self: None
 
+    def clone(self):
+        """clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError"""
+        return _libBornAgainFit.SquaredFunctionGaussianError_clone(self)
 
-    def getAlgorithmName(self):
-        """
-        getAlgorithmName(IMinimizer self) -> std::string
 
-        std::string IMinimizer::getAlgorithmName() const
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double"""
+        return _libBornAgainFit.SquaredFunctionGaussianError_calculateSquaredDifference(self, real_value, simulated_value)
 
-        return name of the minimization algorithm 
 
-        """
-        return _libBornAgainFit.IMinimizer_getAlgorithmName(self)
+    def calculateSquaredError(self, arg2, arg3):
+        """calculateSquaredError(SquaredFunctionGaussianError self, double arg2, double arg3) -> double"""
+        return _libBornAgainFit.SquaredFunctionGaussianError_calculateSquaredError(self, arg2, arg3)
 
-IMinimizer_swigregister = _libBornAgainFit.IMinimizer_swigregister
-IMinimizer_swigregister(IMinimizer)
+SquaredFunctionGaussianError_swigregister = _libBornAgainFit.SquaredFunctionGaussianError_swigregister
+SquaredFunctionGaussianError_swigregister(SquaredFunctionGaussianError)
 
 class ChiSquaredModule(IChiSquaredModule):
     """Proxy of C++ ChiSquaredModule class."""
@@ -3735,77 +3735,6 @@ def isnan(x):
 def isinf(x):
     """isinf(double x) -> bool"""
     return _libBornAgainFit.isinf(x)
-class MinimizerFactory(_object):
-    """
-
-
-    Factory to create minimizers.
-
-    C++ includes: MinimizerFactory.h
-
-    """
-
-    __swig_setmethods__ = {}
-    __setattr__ = lambda self, name, value: _swig_setattr(self, MinimizerFactory, name, value)
-    __swig_getmethods__ = {}
-    __getattr__ = lambda self, name: _swig_getattr(self, MinimizerFactory, name)
-    __repr__ = _swig_repr
-
-    def printCatalogue():
-        """printCatalogue()"""
-        return _libBornAgainFit.MinimizerFactory_printCatalogue()
-
-    if _newclass:
-        printCatalogue = staticmethod(printCatalogue)
-    __swig_getmethods__["printCatalogue"] = lambda x: printCatalogue
-
-    def createMinimizer(*args):
-        """
-        createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer
-        createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer
-        createMinimizer(std::string const & minimizer) -> IMinimizer
-        createMinimizer(IMinimizer minimizer) -> IMinimizer
-        """
-        return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
-
-    if _newclass:
-        createMinimizer = staticmethod(createMinimizer)
-    __swig_getmethods__["createMinimizer"] = lambda x: createMinimizer
-
-    def __init__(self):
-        """
-        __init__(MinimizerFactory self) -> MinimizerFactory
-
-
-
-        Factory to create minimizers.
-
-        C++ includes: MinimizerFactory.h
-
-        """
-        this = _libBornAgainFit.new_MinimizerFactory()
-        try:
-            self.this.append(this)
-        except Exception:
-            self.this = this
-    __swig_destroy__ = _libBornAgainFit.delete_MinimizerFactory
-    __del__ = lambda self: None
-MinimizerFactory_swigregister = _libBornAgainFit.MinimizerFactory_swigregister
-MinimizerFactory_swigregister(MinimizerFactory)
-
-def MinimizerFactory_printCatalogue():
-    """MinimizerFactory_printCatalogue()"""
-    return _libBornAgainFit.MinimizerFactory_printCatalogue()
-
-def MinimizerFactory_createMinimizer(*args):
-    """
-    createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer
-    createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer
-    createMinimizer(std::string const & minimizer) -> IMinimizer
-    MinimizerFactory_createMinimizer(IMinimizer minimizer) -> IMinimizer
-    """
-    return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
-
 class MinimizerOptions(_object):
     """
 
@@ -4037,6 +3966,77 @@ class MinimizerOptions(_object):
 MinimizerOptions_swigregister = _libBornAgainFit.MinimizerOptions_swigregister
 MinimizerOptions_swigregister(MinimizerOptions)
 
+class MinimizerFactory(_object):
+    """
+
+
+    Factory to create minimizers.
+
+    C++ includes: MinimizerFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, MinimizerFactory, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, MinimizerFactory, name)
+    __repr__ = _swig_repr
+
+    def printCatalogue():
+        """printCatalogue()"""
+        return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+    if _newclass:
+        printCatalogue = staticmethod(printCatalogue)
+    __swig_getmethods__["printCatalogue"] = lambda x: printCatalogue
+
+    def createMinimizer(*args):
+        """
+        createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer
+        createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer
+        createMinimizer(std::string const & minimizer) -> IMinimizer
+        createMinimizer(IMinimizer minimizer) -> IMinimizer
+        """
+        return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
+    if _newclass:
+        createMinimizer = staticmethod(createMinimizer)
+    __swig_getmethods__["createMinimizer"] = lambda x: createMinimizer
+
+    def __init__(self):
+        """
+        __init__(MinimizerFactory self) -> MinimizerFactory
+
+
+
+        Factory to create minimizers.
+
+        C++ includes: MinimizerFactory.h
+
+        """
+        this = _libBornAgainFit.new_MinimizerFactory()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerFactory
+    __del__ = lambda self: None
+MinimizerFactory_swigregister = _libBornAgainFit.MinimizerFactory_swigregister
+MinimizerFactory_swigregister(MinimizerFactory)
+
+def MinimizerFactory_printCatalogue():
+    """MinimizerFactory_printCatalogue()"""
+    return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+def MinimizerFactory_createMinimizer(*args):
+    """
+    createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer
+    createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer
+    createMinimizer(std::string const & minimizer) -> IMinimizer
+    MinimizerFactory_createMinimizer(IMinimizer minimizer) -> IMinimizer
+    """
+    return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
 class FitStrategyAdjustMinimizer(IFitStrategy):
     """
 
diff --git a/Fit/PythonAPI/libBornAgainFit_wrap.cxx b/Fit/PythonAPI/libBornAgainFit_wrap.cxx
index 3c2a8d48f12..f09671e2554 100644
--- a/Fit/PythonAPI/libBornAgainFit_wrap.cxx
+++ b/Fit/PythonAPI/libBornAgainFit_wrap.cxx
@@ -3519,31 +3519,25 @@ namespace Swig {
 #define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[62]
 #define SWIGTYPE_p_std__invalid_argument swig_types[63]
 #define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[64]
-#define SWIGTYPE_p_std__shared_ptrT_INamedShared_t swig_types[65]
-#define SWIGTYPE_p_std__shared_ptrT_INamedTemplateT_IShareable_t_t swig_types[66]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[67]
-#define SWIGTYPE_p_std__shared_ptrT_IParameterizedShared_t swig_types[68]
-#define SWIGTYPE_p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t swig_types[69]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[70]
-#define SWIGTYPE_p_std__shared_ptrT_LayerRTCoefficients_t_t swig_types[71]
-#define SWIGTYPE_p_std__shared_ptrT_ProgressHandler_t_t swig_types[72]
-#define SWIGTYPE_p_std__string swig_types[73]
-#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t swig_types[74]
-#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator swig_types[75]
-#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator swig_types[76]
-#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator swig_types[77]
-#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator swig_types[78]
-#define SWIGTYPE_p_std__vectorT_complex_t_std__allocatorT_complex_t_t_t swig_types[79]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[80]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[81]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[82]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[83]
-#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[84]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[85]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[86]
-#define SWIGTYPE_p_value_type swig_types[87]
-static swig_type_info *swig_types[89];
-static swig_module_info swig_module = {swig_types, 88, 0, 0, 0, 0};
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[65]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[66]
+#define SWIGTYPE_p_std__string swig_types[67]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t swig_types[68]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator swig_types[69]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator swig_types[70]
+#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator swig_types[71]
+#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator swig_types[72]
+#define SWIGTYPE_p_std__vectorT_complex_t_std__allocatorT_complex_t_t_t swig_types[73]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[74]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[75]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[76]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[77]
+#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[78]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[79]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[80]
+#define SWIGTYPE_p_value_type swig_types[81]
+static swig_type_info *swig_types[83];
+static swig_module_info swig_module = {swig_types, 82, 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)
 
@@ -18696,19 +18690,19 @@ SWIGINTERN PyObject *GCCXML_SKIP_THIS_swigconstant(PyObject *SWIGUNUSEDPARM(self
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_IChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IChiSquaredModule",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IMinimizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IChiSquaredModule" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMinimizer" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -18717,54 +18711,70 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IChiSquaredModule *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_minimize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_clone" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  result = (IChiSquaredModule *)((IChiSquaredModule const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->minimize();
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_getSquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  size_t arg2 ;
+  FitParameter *arg3 = (FitParameter *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
   PyObject * obj0 = 0 ;
-  ISquaredFunction *result = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getSquaredFunction",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IMinimizer_setParameter",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setParameter" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  result = (ISquaredFunction *)((IChiSquaredModule const *)arg1)->getSquaredFunction();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_setParameter" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_setParameter" "', argument " "3"" of type '" "FitParameter const *""'"); 
+  }
+  arg3 = reinterpret_cast< FitParameter * >(argp3);
+  (arg1)->setParameter(arg2,(FitParameter const *)arg3);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
-  ISquaredFunction *arg2 = (ISquaredFunction *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitSuiteParameters *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -18772,18 +18782,21 @@ SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(PyObj
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setParameters",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setParameters" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_FitSuiteParameters,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitSuiteParameters const &""'"); 
   }
-  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
-  (arg1)->setChiSquaredFunction(arg2);
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitSuiteParameters const &""'"); 
+  }
+  arg2 = reinterpret_cast< FitSuiteParameters * >(argp2);
+  (arg1)->setParameters((FitSuiteParameters const &)*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -18791,32 +18804,46 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setChiSquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
-  ISquaredFunction *arg2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  IMinimizer::function_chi2_t arg2 ;
+  size_t arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
+  void *argp2 ;
   int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IMinimizer_setChiSquaredFunction",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
-  }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISquaredFunction,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_boost__functionT_double_fdouble_const_pF_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "2"" of type '" "IMinimizer::function_chi2_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "2"" of type '" "IMinimizer::function_chi2_t""'");
+    } else {
+      IMinimizer::function_chi2_t * temp = reinterpret_cast< IMinimizer::function_chi2_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
   }
-  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
-  (arg1)->setChiSquaredFunction((ISquaredFunction const &)*arg2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  (arg1)->setChiSquaredFunction(arg2,arg3);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -18824,275 +18851,226 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_IMinimizer_setGradientFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  IMinimizer::function_gradient_t arg2 ;
+  size_t arg3 ;
+  size_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IMinimizer_setGradientFunction",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setGradientFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_ISquaredFunction, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(self, args);
-      }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_boost__functionT_double_fdouble_const_p_unsigned_int_double_pF_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "IMinimizer::function_gradient_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "IMinimizer::function_gradient_t""'");
+    } else {
+      IMinimizer::function_gradient_t * temp = reinterpret_cast< IMinimizer::function_gradient_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMinimizer_setGradientFunction" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IMinimizer_setGradientFunction" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  (arg1)->setGradientFunction(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_setChiSquaredFunction'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction *)\n"
-    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction const &)\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getNumberOfVariables(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IIntensityNormalizer *result = 0 ;
+  size_t result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getNumberOfVariables",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getNumberOfVariables" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  result = (IIntensityNormalizer *)((IChiSquaredModule const *)arg1)->getIntensityNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getNumberOfVariables();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IIntensityNormalizer *result = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getMinValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getMinValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  result = (IIntensityNormalizer *)(arg1)->getIntensityNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (double)((IMinimizer const *)arg1)->getMinValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[2] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_IMinimizer_getValueOfVariableAtMinimum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(self, args);
-    }
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(self, args);
-    }
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_getValueOfVariableAtMinimum",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getValueOfVariableAtMinimum" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_getValueOfVariableAtMinimum" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IMinimizer const *)arg1)->getValueOfVariableAtMinimum(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_getIntensityNormalizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IChiSquaredModule::getIntensityNormalizer() const\n"
-    "    IChiSquaredModule::getIntensityNormalizer()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getValueOfVariablesAtMinimum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
-  IIntensityNormalizer *arg2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
+  std::vector< double,std::allocator< double > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityNormalizer",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getValueOfVariablesAtMinimum",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
-  }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityNormalizer,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getValueOfVariablesAtMinimum" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg2 = reinterpret_cast< IIntensityNormalizer * >(argp2);
-  (arg1)->setIntensityNormalizer((IIntensityNormalizer const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getValueOfVariablesAtMinimum();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getErrorOfVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  size_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  IIntensityFunction *result = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityFunction",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_getErrorOfVariable",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getErrorOfVariable" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  result = (IIntensityFunction *)((IChiSquaredModule const *)arg1)->getIntensityFunction();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_getErrorOfVariable" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IMinimizer const *)arg1)->getErrorOfVariable(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getErrorOfVariables(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
-  IIntensityFunction *arg2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
+  std::vector< double,std::allocator< double > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityFunction",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getErrorOfVariables",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
-  }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityFunction,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getErrorOfVariables" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg2 = reinterpret_cast< IIntensityFunction * >(argp2);
-  (arg1)->setIntensityFunction((IIntensityFunction const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getErrorOfVariables();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IChiSquaredModule_processFitElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
-  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg2 ;
-  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg3 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:IChiSquaredModule_processFitElements",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_processFitElements" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
-  }
-  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
-    } else {
-      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  {
-    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
-    } else {
-      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  (arg1)->processFitElements(arg2,arg3);
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->clear();
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19100,403 +19078,364 @@ fail:
 }
 
 
-SWIGINTERN PyObject *IChiSquaredModule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IChiSquaredModule, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_new_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_printResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  int arg2 ;
-  int val2 ;
-  int ecode2 = 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IFitObserver *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_IFitObserver",&obj0,&obj1)) SWIG_fail;
-  arg1 = obj0;
-  ecode2 = SWIG_AsVal_int(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IFitObserver" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IFitObserver *)new SwigDirector_IFitObserver(arg1,arg2); 
-  } else {
-    result = (IFitObserver *)new IFitObserver(arg2); 
-  }
   
-  {
-    std::shared_ptr<  IFitObserver > *smartresult = result ? new std::shared_ptr<  IFitObserver >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_printResults",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_printResults" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  ((IMinimizer const *)arg1)->printResults();
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IFitObserver_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getNCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitObserver *arg1 = (IFitObserver *) 0 ;
-  IObservable *arg2 = (IObservable *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::shared_ptr< IFitObserver > tempshared1 ;
-  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
+  size_t result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_notify",&obj0,&obj1)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_notify" "', argument " "1"" of type '" "IFitObserver *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IObservable, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_notify" "', argument " "2"" of type '" "IObservable *""'"); 
-  }
-  arg2 = reinterpret_cast< IObservable * >(argp2);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    if (upcall) {
-      (arg1)->IFitObserver::notify(arg2);
-    } else {
-      (arg1)->notify(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getNCalls",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getNCalls" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getNCalls();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IFitObserver_update(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitObserver *arg1 = (IFitObserver *) 0 ;
-  FitSuite *arg2 = (FitSuite *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::shared_ptr< IFitObserver > tempshared1 ;
-  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
+  MinimizerOptions *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_update",&obj0,&obj1)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_update" "', argument " "1"" of type '" "IFitObserver *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
-    }
-  }
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitSuite, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_update" "', argument " "2"" of type '" "FitSuite *""'"); 
-  }
-  arg2 = reinterpret_cast< FitSuite * >(argp2);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==obj0));
-  try {
-    if (upcall) {
-      (arg1)->IFitObserver::update(arg2);
-    } else {
-      (arg1)->update(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (MinimizerOptions *)(arg1)->getOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::shared_ptr< IFitObserver > tempshared1 ;
-  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
   PyObject * obj0 = 0 ;
+  MinimizerOptions *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitObserver",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getOptions" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  (void)arg1; delete smartarg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (MinimizerOptions *)((IMinimizer const *)arg1)->getOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_disown_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IFitObserver *arg1 = (IFitObserver *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  std::shared_ptr< IFitObserver > tempshared1 ;
-  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
-  PyObject * obj0 = 0 ;
+SWIGINTERN PyObject *_wrap_IMinimizer_getOptions(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:disown_IFitObserver",&obj0)) SWIG_fail;
-  {
-    int newmem = 0;
-    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
-    }
-    if (newmem & SWIG_CAST_NEW_MEMORY) {
-      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >(tempshared1.get());
-    } else {
-      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
-      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IMinimizer_getOptions__SWIG_0(self, args);
     }
   }
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IMinimizer_getOptions__SWIG_1(self, args);
+    }
   }
   
-  resultobj = SWIG_Py_Void();
-  return resultobj;
 fail:
-  return NULL;
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IMinimizer_getOptions'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IMinimizer::getOptions()\n"
+    "    IMinimizer::getOptions() const\n");
+  return 0;
 }
 
 
-SWIGINTERN PyObject *IFitObserver_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_IFitStrategy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  MinimizerOptions *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  IFitStrategy *result = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setOptions",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_clone" "', argument " "1"" of type '" "IFitStrategy const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
-  result = (IFitStrategy *)((IFitStrategy const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_MinimizerOptions,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "MinimizerOptions const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "MinimizerOptions const &""'"); 
+  }
+  arg2 = reinterpret_cast< MinimizerOptions * >(argp2);
+  (arg1)->setOptions((MinimizerOptions const &)*arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_IFitStrategy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_setOptionString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitStrategy",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setOptionString",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitStrategy" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptionString" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptionString" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptionString" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setOptionString((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_IFitStrategy_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_isGradientBasedAgorithm(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
-  FitKernel *arg2 = (FitKernel *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IFitStrategy_init",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_isGradientBasedAgorithm",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_init" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_isGradientBasedAgorithm" "', argument " "1"" of type '" "IMinimizer *""'"); 
   }
-  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitKernel, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitStrategy_init" "', argument " "2"" of type '" "FitKernel *""'"); 
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (bool)(arg1)->isGradientBasedAgorithm();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_getMinimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getMinimizerName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getMinimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg2 = reinterpret_cast< FitKernel * >(argp2);
-  (arg1)->init(arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getMinimizerName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IFitStrategy_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IMinimizer_getAlgorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
+  std::string result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_execute",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getAlgorithmName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_execute" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getAlgorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
-  (arg1)->execute();
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->getAlgorithmName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IFitStrategy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IMinimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IFitStrategy, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IMinimizer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FitStrategyDefault *result = 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_FitStrategyDefault")) SWIG_fail;
-  result = (FitStrategyDefault *)new FitStrategyDefault();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IChiSquaredModule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IChiSquaredModule" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_FitStrategyDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IFitStrategy *result = 0 ;
+  IChiSquaredModule *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_clone" "', argument " "1"" of type '" "FitStrategyDefault const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_clone" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
   }
-  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
-  result = (IFitStrategy *)((FitStrategyDefault const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IChiSquaredModule *)((IChiSquaredModule const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_FitStrategyDefault_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getSquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
+  ISquaredFunction *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_execute",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getSquaredFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_execute" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
   }
-  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
-  (arg1)->execute();
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (ISquaredFunction *)((IChiSquaredModule const *)arg1)->getSquaredFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  ISquaredFunction *arg2 = (ISquaredFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitStrategyDefault",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitStrategyDefault" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
   }
-  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction *""'"); 
+  }
+  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
+  (arg1)->setChiSquaredFunction(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19504,27 +19443,32 @@ fail:
 }
 
 
-SWIGINTERN PyObject *FitStrategyDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_FitStrategyDefault, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_delete_IIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  ISquaredFunction *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityFunction",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityFunction" "', argument " "1"" of type '" "IIntensityFunction *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
   }
-  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISquaredFunction,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+  }
+  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
+  (arg1)->setChiSquaredFunction((ISquaredFunction const &)*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19532,80 +19476,165 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_ISquaredFunction, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_setChiSquaredFunction'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction *)\n"
+    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IIntensityFunction *result = 0 ;
+  IIntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityFunction_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_clone" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
   }
-  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
-  result = (IIntensityFunction *)((IIntensityFunction const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityNormalizer *)((IChiSquaredModule const *)arg1)->getIntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityFunction_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
-  double arg2 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
+  IIntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityFunction_evaluate",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_evaluate" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
   }
-  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityFunction_evaluate" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)((IIntensityFunction const *)arg1)->evaluate(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityNormalizer *)(arg1)->getIntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IIntensityFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityFunction, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_getIntensityNormalizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IChiSquaredModule::getIntensityNormalizer() const\n"
+    "    IChiSquaredModule::getIntensityNormalizer()\n");
+  return 0;
 }
 
-SWIGINTERN PyObject *_wrap_delete_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IIntensityNormalizer *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionLog",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityNormalizer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionLog" "', argument " "1"" of type '" "IntensityFunctionLog *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityNormalizer,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
+  }
+  arg2 = reinterpret_cast< IIntensityNormalizer * >(argp2);
+  (arg1)->setIntensityNormalizer((IIntensityNormalizer const &)*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19613,187 +19642,291 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityFunctionLog_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IntensityFunctionLog *result = 0 ;
+  IIntensityFunction *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionLog_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_clone" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
-  result = (IntensityFunctionLog *)((IntensityFunctionLog const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityFunction *)((IChiSquaredModule const *)arg1)->getIntensityFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityFunctionLog_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
-  double arg2 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IIntensityFunction *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionLog_evaluate",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_evaluate" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionLog_evaluate" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)((IntensityFunctionLog const *)arg1)->evaluate(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityFunction,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
+  }
+  arg2 = reinterpret_cast< IIntensityFunction * >(argp2);
+  (arg1)->setIntensityFunction((IIntensityFunction const &)*arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_processFitElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionLog *result = 0 ;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg2 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionLog")) SWIG_fail;
-  result = (IntensityFunctionLog *)new IntensityFunctionLog();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IChiSquaredModule_processFitElements",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_processFitElements" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  (arg1)->processFitElements(arg2,arg3);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IntensityFunctionLog_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IChiSquaredModule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionLog, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IChiSquaredModule, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  PyObject *arg1 = (PyObject *) 0 ;
+  int arg2 ;
+  int val2 ;
+  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IFitObserver *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionSqrt",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionSqrt" "', argument " "1"" of type '" "IntensityFunctionSqrt *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IFitObserver",&obj0,&obj1)) SWIG_fail;
+  arg1 = obj0;
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IFitObserver" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IFitObserver *)new SwigDirector_IFitObserver(arg1,arg2); 
+  } else {
+    result = (IFitObserver *)new IFitObserver(arg2); 
   }
-  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IntensityFunctionSqrt *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionSqrt_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_clone" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
+  {
+    std::shared_ptr<  IFitObserver > *smartresult = result ? new std::shared_ptr<  IFitObserver >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
   }
-  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
-  result = (IntensityFunctionSqrt *)((IntensityFunctionSqrt const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFitObserver_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
-  double arg2 ;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  IObservable *arg2 = (IObservable *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  double result;
+  Swig::Director *director = 0;
+  bool upcall = false;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionSqrt_evaluate",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)((IntensityFunctionSqrt const *)arg1)->evaluate(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_notify",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_notify" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_notify" "', argument " "2"" of type '" "IObservable *""'"); 
+  }
+  arg2 = reinterpret_cast< IObservable * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFitObserver::notify(arg2);
+    } else {
+      (arg1)->notify(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFitObserver_update(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityFunctionSqrt *result = 0 ;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  FitSuite *arg2 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionSqrt")) SWIG_fail;
-  result = (IntensityFunctionSqrt *)new IntensityFunctionSqrt();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_update",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_update" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_update" "', argument " "2"" of type '" "FitSuite *""'"); 
+  }
+  arg2 = reinterpret_cast< FitSuite * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFitObserver::update(arg2);
+    } else {
+      (arg1)->update(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IntensityFunctionSqrt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionSqrt, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_delete_IIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityNormalizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityNormalizer" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitObserver",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
   }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  delete arg1;
+  (void)arg1; delete smartarg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19801,88 +19934,86 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_disown_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
   PyObject * obj0 = 0 ;
-  IIntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityNormalizer_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_clone" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IFitObserver",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
   }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  result = (IIntensityNormalizer *)((IIntensityNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IFitObserver_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IFitStrategy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  OutputData< double > *result = 0 ;
+  IFitStrategy *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_clone" "', argument " "1"" of type '" "IFitStrategy const *""'"); 
   }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  result = (OutputData< double > *)((IIntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  result = (IFitStrategy *)((IFitStrategy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitStrategy, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IFitStrategy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitStrategy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_apply" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitStrategy" "', argument " "1"" of type '" "IFitStrategy *""'"); 
   }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  ((IIntensityNormalizer const *)arg1)->apply(*arg2);
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19890,29 +20021,29 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFitStrategy_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  double arg2 ;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  FitKernel *arg2 = (FitKernel *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitStrategy_init",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_init" "', argument " "1"" of type '" "IFitStrategy *""'"); 
   }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitKernel, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitStrategy_init" "', argument " "2"" of type '" "FitKernel *""'"); 
+  }
+  arg2 = reinterpret_cast< FitKernel * >(argp2);
+  (arg1)->init(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -19920,145 +20051,83 @@ fail:
 }
 
 
-SWIGINTERN PyObject *IIntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityNormalizer, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFitStrategy_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityNormalizer",&obj0,&obj1)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityNormalizer" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (IntensityNormalizer *)new IntensityNormalizer(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_execute",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_execute" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  (arg1)->execute();
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IntensityNormalizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityNormalizer",&obj0)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (IntensityNormalizer *)new IntensityNormalizer(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
+SWIGINTERN PyObject *IFitStrategy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFitStrategy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
 }
 
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *result = 0 ;
+  FitStrategyDefault *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_IntensityNormalizer")) SWIG_fail;
-  result = (IntensityNormalizer *)new IntensityNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)":new_FitStrategyDefault")) SWIG_fail;
+  result = (FitStrategyDefault *)new FitStrategyDefault();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_FitStrategyDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFitStrategy *result = 0 ;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 0) {
-    return _wrap_new_IntensityNormalizer__SWIG_2(self, args);
-  }
-  if (argc == 1) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      return _wrap_new_IntensityNormalizer__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_new_IntensityNormalizer__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_clone" "', argument " "1"" of type '" "FitStrategyDefault const *""'"); 
   }
-  
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  result = (IFitStrategy *)((FitStrategyDefault const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityNormalizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IntensityNormalizer::IntensityNormalizer(double,double)\n"
-    "    IntensityNormalizer::IntensityNormalizer(double)\n"
-    "    IntensityNormalizer::IntensityNormalizer()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_IntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FitStrategyDefault_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityNormalizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_execute",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityNormalizer" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_execute" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  (arg1)->execute();
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -20066,98 +20135,80 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IntensityNormalizer_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitStrategyDefault",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_clone" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitStrategyDefault" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  result = (IntensityNormalizer *)((IntensityNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *FitStrategyDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitStrategyDefault, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  OutputData< double > *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityFunction" "', argument " "1"" of type '" "IIntensityFunction *""'"); 
   }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  result = (OutputData< double > *)((IntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
+  IIntensityFunction *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityFunction_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_apply" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_clone" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
   }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  ((IntensityNormalizer const *)arg1)->apply(*arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
+  result = (IIntensityFunction *)((IIntensityFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityFunction_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -20165,175 +20216,80 @@ SWIGINTERN PyObject *_wrap_IntensityNormalizer_setMaximumIntensity(PyObject *SWI
   int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityFunction_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_evaluate" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityFunction_evaluate" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
-  resultobj = SWIG_Py_Void();
+  result = (double)((IIntensityFunction const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IIntensityFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityNormalizer, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityFunction, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityScaleAndShiftNormalizer",&obj0,&obj1)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_IntensityScaleAndShiftNormalizer")) SWIG_fail;
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionLog",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionLog" "', argument " "1"" of type '" "IntensityFunctionLog *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 0) {
-    return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(self, args);
-  }
-  if (argc == 1) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityScaleAndShiftNormalizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double,double)\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double)\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_IntensityScaleAndShiftNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityFunctionLog_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
+  IntensityFunctionLog *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionLog_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_clone" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
+  result = (IntensityFunctionLog *)((IntensityFunctionLog const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityFunctionLog_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -20341,68 +20297,60 @@ SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity(
   int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityScaleAndShiftNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionLog_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_evaluate" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
   }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionLog_evaluate" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
-  resultobj = SWIG_Py_Void();
+  result = (double)((IntensityFunctionLog const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
+  IntensityFunctionLog *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IntensityScaleAndShiftNormalizer_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_clone" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  result = (IntensityScaleAndShiftNormalizer *)((IntensityScaleAndShiftNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionLog")) SWIG_fail;
+  result = (IntensityFunctionLog *)new IntensityFunctionLog();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IntensityScaleAndShiftNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IntensityFunctionLog_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionLog, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_ISquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISquaredFunction",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionSqrt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISquaredFunction" "', argument " "1"" of type '" "ISquaredFunction *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionSqrt" "', argument " "1"" of type '" "IntensityFunctionSqrt *""'"); 
   }
-  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -20411,61 +20359,52 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ISquaredFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  ISquaredFunction *result = 0 ;
+  IntensityFunctionSqrt *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:ISquaredFunction_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionSqrt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_clone" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_clone" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
   }
-  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
-  result = (ISquaredFunction *)((ISquaredFunction const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
+  result = (IntensityFunctionSqrt *)((IntensityFunctionSqrt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
   double arg2 ;
-  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionSqrt_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
   }
-  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  result = (double)((IntensityFunctionSqrt const *)arg1)->evaluate(arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -20473,387 +20412,304 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
-  double arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
+  IntensityFunctionSqrt *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionSqrt")) SWIG_fail;
+  result = (IntensityFunctionSqrt *)new IntensityFunctionSqrt();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IntensityFunctionSqrt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionSqrt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
-  double arg2 ;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:ISquaredFunction_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityNormalizer" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_ISquaredFunction_calculateSquaredError__SWIG_1(self, args);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_ISquaredFunction_calculateSquaredError__SWIG_0(self, args);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ISquaredFunction_calculateSquaredError'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    ISquaredFunction::calculateSquaredError(double,double) const\n"
-    "    ISquaredFunction::calculateSquaredError(double) const\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *ISquaredFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_ISquaredFunction, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_new_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *result = 0 ;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)":new_SquaredFunctionDefault")) SWIG_fail;
-  result = (SquaredFunctionDefault *)new SquaredFunctionDefault();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_NEW |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_clone" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  result = (IIntensityNormalizer *)((IIntensityNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionDefault",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionDefault" "', argument " "1"" of type '" "SquaredFunctionDefault *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *)((IIntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  SquaredFunctionDefault *result = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionDefault_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_clone" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_apply" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
-  result = (SquaredFunctionDefault *)((SquaredFunctionDefault const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IIntensityNormalizer const *)arg1)->apply(*arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
   double arg2 ;
-  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredDifference(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IIntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityNormalizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  double arg1 ;
   double arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
+  IntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
-  }
-  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityNormalizer",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityNormalizer" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  result = (IntensityNormalizer *)new IntensityNormalizer(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
+  IntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
-  }
-  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityNormalizer",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
   } 
-  arg2 = static_cast< double >(val2);
-  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = static_cast< double >(val1);
+  result = (IntensityNormalizer *)new IntensityNormalizer(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityNormalizer")) SWIG_fail;
+  result = (IntensityNormalizer *)new IntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[4] = {
+  PyObject *argv[3] = {
     0
   };
   Py_ssize_t ii;
   
   if (!PyTuple_Check(args)) SWIG_fail;
   argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
     argv[ii] = PyTuple_GET_ITEM(args,ii);
   }
-  if (argc == 2) {
+  if (argc == 0) {
+    return _wrap_new_IntensityNormalizer__SWIG_2(self, args);
+  }
+  if (argc == 1) {
     int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
-    _v = SWIG_CheckState(res);
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
     if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(self, args);
-      }
+      return _wrap_new_IntensityNormalizer__SWIG_1(self, args);
     }
   }
-  if (argc == 3) {
+  if (argc == 2) {
     int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
-    _v = SWIG_CheckState(res);
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
     if (_v) {
       {
         int res = SWIG_AsVal_double(argv[1], NULL);
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(self, args);
-        }
+        return _wrap_new_IntensityNormalizer__SWIG_0(self, args);
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SquaredFunctionDefault_calculateSquaredError'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityNormalizer'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SquaredFunctionDefault::calculateSquaredError(double,double) const\n"
-    "    SquaredFunctionDefault::calculateSquaredError(double) const\n");
+    "    IntensityNormalizer::IntensityNormalizer(double,double)\n"
+    "    IntensityNormalizer::IntensityNormalizer(double)\n"
+    "    IntensityNormalizer::IntensityNormalizer()\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *SquaredFunctionDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionDefault, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSimError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSimError",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSimError" "', argument " "1"" of type '" "SquaredFunctionSimError *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityNormalizer" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -20862,258 +20718,343 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  SquaredFunctionSimError *result = 0 ;
+  IntensityNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSimError_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_clone" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_clone" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
-  result = (SquaredFunctionSimError *)((SquaredFunctionSimError const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  result = (IntensityNormalizer *)((IntensityNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
-  double arg2 ;
-  double arg3 ;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
+  OutputData< double > *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredDifference(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *)((IntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_apply" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IntensityNormalizer const *)arg1)->apply(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
   double arg2 ;
-  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredError(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *SquaredFunctionSimError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSimError, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityNormalizer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_SquaredFunctionMeanSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionMeanSquaredError",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionMeanSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError *""'"); 
-  }
-  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityScaleAndShiftNormalizer",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityScaleAndShiftNormalizer")) SWIG_fail;
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityScaleAndShiftNormalizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double,double)\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double)\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntensityScaleAndShiftNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  SquaredFunctionMeanSquaredError *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionMeanSquaredError_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_clone" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
-  result = (SquaredFunctionMeanSquaredError *)((SquaredFunctionMeanSquaredError const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
   double arg2 ;
-  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityScaleAndShiftNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredDifference(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
-  double arg2 ;
-  double arg3 ;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  double result;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityScaleAndShiftNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_clone" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredError(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  result = (IntensityScaleAndShiftNormalizer *)((IntensityScaleAndShiftNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *SquaredFunctionMeanSquaredError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IntensityScaleAndShiftNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSystematicError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_ISquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSystematicError",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISquaredFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSystematicError" "', argument " "1"" of type '" "SquaredFunctionSystematicError *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISquaredFunction" "', argument " "1"" of type '" "ISquaredFunction *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -21122,31 +21063,31 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ISquaredFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  SquaredFunctionSystematicError *result = 0 ;
+  ISquaredFunction *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSystematicError_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:ISquaredFunction_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_clone" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_clone" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
-  result = (SquaredFunctionSystematicError *)((SquaredFunctionSystematicError const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  result = (ISquaredFunction *)((ISquaredFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -21160,23 +21101,23 @@ SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredDiffer
   PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(obj2, &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredDifference(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21184,9 +21125,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -21200,23 +21141,23 @@ SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredError(
   PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(obj2, &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredError(arg2,arg3);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21224,26 +21165,128 @@ fail:
 }
 
 
-SWIGINTERN PyObject *SquaredFunctionSystematicError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISquaredFunction_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ISquaredFunction_calculateSquaredError__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_ISquaredFunction_calculateSquaredError__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ISquaredFunction_calculateSquaredError'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ISquaredFunction::calculateSquaredError(double,double) const\n"
+    "    ISquaredFunction::calculateSquaredError(double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *ISquaredFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_ISquaredFunction, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_SquaredFunctionGaussianError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  SquaredFunctionDefault *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SquaredFunctionDefault")) SWIG_fail;
+  result = (SquaredFunctionDefault *)new SquaredFunctionDefault();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionGaussianError",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionDefault",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionGaussianError" "', argument " "1"" of type '" "SquaredFunctionGaussianError *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionDefault" "', argument " "1"" of type '" "SquaredFunctionDefault *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -21252,31 +21295,31 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  SquaredFunctionGaussianError *result = 0 ;
+  SquaredFunctionDefault *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionGaussianError_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionDefault_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_clone" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_clone" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
-  result = (SquaredFunctionGaussianError *)((SquaredFunctionGaussianError const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  result = (SquaredFunctionDefault *)((SquaredFunctionDefault const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -21290,23 +21333,23 @@ SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredDifferen
   PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(obj2, &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredDifference(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21314,9 +21357,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -21330,23 +21373,23 @@ SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredError(Py
   PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
   }
-  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(obj2, &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredError(arg2,arg3);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21354,87 +21397,116 @@ fail:
 }
 
 
-SWIGINTERN PyObject *SquaredFunctionGaussianError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IMinimizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 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 '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_minimize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_minimize",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  (arg1)->minimize();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IMinimizer_setParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  size_t arg2 ;
-  FitParameter *arg3 = (FitParameter *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SquaredFunctionDefault_calculateSquaredError'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SquaredFunctionDefault::calculateSquaredError(double,double) const\n"
+    "    SquaredFunctionDefault::calculateSquaredError(double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionDefault, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSimError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:IMinimizer_setParameter",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSimError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setParameter" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_setParameter" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_FitParameter, 0 |  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IMinimizer_setParameter" "', argument " "3"" of type '" "FitParameter const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSimError" "', argument " "1"" of type '" "SquaredFunctionSimError *""'"); 
   }
-  arg3 = reinterpret_cast< FitParameter * >(argp3);
-  (arg1)->setParameter(arg2,(FitParameter const *)arg3);
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -21442,210 +21514,191 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  FitSuiteParameters *arg2 = 0 ;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
+  SquaredFunctionSimError *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setParameters",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSimError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setParameters" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_FitSuiteParameters,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitSuiteParameters const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitSuiteParameters const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_clone" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
   }
-  arg2 = reinterpret_cast< FitSuiteParameters * >(argp2);
-  (arg1)->setParameters((FitSuiteParameters const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  result = (SquaredFunctionSimError *)((SquaredFunctionSimError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setChiSquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  IMinimizer::function_chi2_t arg2 ;
-  size_t arg3 ;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  size_t val3 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
   int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:IMinimizer_setChiSquaredFunction",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_boost__functionT_double_fdouble_const_pF_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "2"" of type '" "IMinimizer::function_chi2_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "2"" of type '" "IMinimizer::function_chi2_t""'");
-    } else {
-      IMinimizer::function_chi2_t * temp = reinterpret_cast< IMinimizer::function_chi2_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
   }
-  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMinimizer_setChiSquaredFunction" "', argument " "3"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
   } 
-  arg3 = static_cast< size_t >(val3);
-  (arg1)->setChiSquaredFunction(arg2,arg3);
-  resultobj = SWIG_Py_Void();
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setGradientFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  IMinimizer::function_gradient_t arg2 ;
-  size_t arg3 ;
-  size_t arg4 ;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  size_t val3 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
   int ecode3 = 0 ;
-  size_t val4 ;
-  int ecode4 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
-  PyObject * obj3 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOOO:IMinimizer_setGradientFunction",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setGradientFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_boost__functionT_double_fdouble_const_p_unsigned_int_double_pF_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "IMinimizer::function_gradient_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "IMinimizer::function_gradient_t""'");
-    } else {
-      IMinimizer::function_gradient_t * temp = reinterpret_cast< IMinimizer::function_gradient_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
   }
-  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMinimizer_setGradientFunction" "', argument " "3"" of type '" "size_t""'");
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
   } 
-  arg3 = static_cast< size_t >(val3);
-  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IMinimizer_setGradientFunction" "', argument " "4"" of type '" "size_t""'");
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
   } 
-  arg4 = static_cast< size_t >(val4);
-  (arg1)->setGradientFunction(arg2,arg3,arg4);
-  resultobj = SWIG_Py_Void();
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getNumberOfVariables(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquaredFunctionSimError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSimError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionMeanSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  size_t result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getNumberOfVariables",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionMeanSquaredError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getNumberOfVariables" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionMeanSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getNumberOfVariables();
-  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  double result;
+  SquaredFunctionMeanSquaredError *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getMinValue",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionMeanSquaredError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getMinValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_clone" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (double)((IMinimizer const *)arg1)->getMinValue();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  result = (SquaredFunctionMeanSquaredError *)((SquaredFunctionMeanSquaredError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getValueOfVariableAtMinimum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  size_t arg2 ;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  size_t val2 ;
+  double val2 ;
   int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_getValueOfVariableAtMinimum",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getValueOfVariableAtMinimum" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_getValueOfVariableAtMinimum" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
   } 
-  arg2 = static_cast< size_t >(val2);
-  result = (double)((IMinimizer const *)arg1)->getValueOfVariableAtMinimum(arg2);
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredDifference(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21653,52 +21706,39 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getValueOfVariablesAtMinimum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  std::vector< double,std::allocator< double > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getValueOfVariablesAtMinimum",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getValueOfVariablesAtMinimum" "', argument " "1"" of type '" "IMinimizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getValueOfVariablesAtMinimum();
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IMinimizer_getErrorOfVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  size_t arg2 ;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  size_t val2 ;
+  double val2 ;
   int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_getErrorOfVariable",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getErrorOfVariable" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IMinimizer_getErrorOfVariable" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
   } 
-  arg2 = static_cast< size_t >(val2);
-  result = (double)((IMinimizer const *)arg1)->getErrorOfVariable(arg2);
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredError(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -21706,316 +21746,270 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getErrorOfVariables(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquaredFunctionMeanSquaredError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSystematicError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  std::vector< double,std::allocator< double > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getErrorOfVariables",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSystematicError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getErrorOfVariables" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSystematicError" "', argument " "1"" of type '" "SquaredFunctionSystematicError *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getErrorOfVariables();
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
+  SquaredFunctionSystematicError *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_clear",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSystematicError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_clone" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  (arg1)->clear();
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  result = (SquaredFunctionSystematicError *)((SquaredFunctionSystematicError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_printResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_printResults",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_printResults" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  ((IMinimizer const *)arg1)->printResults();
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getNCalls(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
-  size_t result;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getNCalls",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getNCalls" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getNCalls();
-  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquaredFunctionSystematicError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionGaussianError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  MinimizerOptions *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getOptions",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionGaussianError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionGaussianError" "', argument " "1"" of type '" "SquaredFunctionGaussianError *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (MinimizerOptions *)(arg1)->getOptions();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  MinimizerOptions *result = 0 ;
+  SquaredFunctionGaussianError *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getOptions",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionGaussianError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getOptions" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_clone" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (MinimizerOptions *)((IMinimizer const *)arg1)->getOptions();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  result = (SquaredFunctionGaussianError *)((SquaredFunctionGaussianError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_getOptions(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[2] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_IMinimizer_getOptions__SWIG_0(self, args);
-    }
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_IMinimizer_getOptions__SWIG_1(self, args);
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IMinimizer_getOptions'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IMinimizer::getOptions()\n"
-    "    IMinimizer::getOptions() const\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  MinimizerOptions *arg2 = 0 ;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setOptions",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_MinimizerOptions,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "MinimizerOptions const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "MinimizerOptions const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
   }
-  arg2 = reinterpret_cast< MinimizerOptions * >(argp2);
-  (arg1)->setOptions((MinimizerOptions const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IMinimizer_setOptionString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  std::string *arg2 = 0 ;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  double arg2 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setOptionString",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptionString" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptionString" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptionString" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  (arg1)->setOptionString((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_IMinimizer_isGradientBasedAgorithm(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_isGradientBasedAgorithm",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_isGradientBasedAgorithm" "', argument " "1"" of type '" "IMinimizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (bool)(arg1)->isGradientBasedAgorithm();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IMinimizer_getMinimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  std::string result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getMinimizerName",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getMinimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getMinimizerName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IMinimizer_getAlgorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  std::string result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_getAlgorithmName",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_getAlgorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
   }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = ((IMinimizer const *)arg1)->getAlgorithmName();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IMinimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquaredFunctionGaussianError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IMinimizer, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
@@ -28153,320 +28147,41 @@ SWIGINTERN PyObject *_wrap_isnan(PyObject *SWIGUNUSEDPARM(self), PyObject *args)
   bool result;
   
   if (!PyArg_ParseTuple(args,(char *)"O:isnan",&obj0)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "isnan" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (bool)MathFunctions::isnan(arg1);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_isinf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:isinf",&obj0)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "isinf" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (bool)MathFunctions::isinf(arg1);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
-  std::string *arg2 = 0 ;
-  std::string *arg3 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
-  int res2 = SWIG_OLDOBJ ;
-  int res3 = SWIG_OLDOBJ ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  IMinimizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerFactory_createMinimizer",&obj0,&obj1,&obj2)) SWIG_fail;
-  {
-    std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
-  std::string *arg2 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  IMinimizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerFactory_createMinimizer",&obj0,&obj1)) SWIG_fail;
-  {
-    std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::string *arg1 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
-  PyObject * obj0 = 0 ;
-  IMinimizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerFactory_createMinimizer",&obj0)) SWIG_fail;
-  {
-    std::string *ptr = (std::string *)0;
-    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_printCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  
-  if (!PyArg_ParseTuple(args,(char *)":MinimizerFactory_printCatalogue")) SWIG_fail;
-  MinimizerFactory::printCatalogue();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IMinimizer *arg1 = (IMinimizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IMinimizer *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerFactory_createMinimizer",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "IMinimizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IMinimizer * >(argp1);
-  result = (IMinimizer *)MinimizerFactory::createMinimizer((IMinimizer const *)arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_MinimizerFactory_createMinimizer__SWIG_3(self, args);
-    }
-  }
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_MinimizerFactory_createMinimizer__SWIG_2(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_MinimizerFactory_createMinimizer__SWIG_1(self, args);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_MinimizerFactory_createMinimizer__SWIG_0(self, args);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerFactory_createMinimizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &,std::string const &)\n"
-    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &)\n"
-    "    MinimizerFactory::createMinimizer(std::string const &)\n"
-    "    MinimizerFactory::createMinimizer(IMinimizer const *)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  MinimizerFactory *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)":new_MinimizerFactory")) SWIG_fail;
-  result = (MinimizerFactory *)new MinimizerFactory();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_NEW |  0 );
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "isnan" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (bool)MathFunctions::isnan(arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_isinf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerFactory *arg1 = (MinimizerFactory *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
   PyObject * obj0 = 0 ;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_MinimizerFactory",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  if (!PyArg_ParseTuple(args,(char *)"O:isinf",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "isinf" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (bool)MathFunctions::isinf(arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *MinimizerFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerFactory, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
 SWIGINTERN PyObject *_wrap_new_MinimizerOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *result = 0 ;
@@ -28951,7 +28666,230 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_setValue(PyObject *self, PyObject *a
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_MinimizerOptions_setValue__SWIG_0(self, args);
+          return _wrap_MinimizerOptions_setValue__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 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_MinimizerOptions_setValue__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_setValue'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MinimizerOptions::setValue(std::string const &,double)\n"
+    "    MinimizerOptions::setValue(std::string const &,int)\n"
+    "    MinimizerOptions::setValue(std::string const &,std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  std::string *arg2 = 0 ;
+  int *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_int,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "int &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "int &""'"); 
+  }
+  arg3 = reinterpret_cast< int * >(argp3);
+  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  std::string *arg2 = 0 ;
+  double *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "double &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "double &""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__string,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "std::string &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "std::string &""'"); 
+  }
+  arg3 = reinterpret_cast< std::string * >(argp3);
+  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_int, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_MinimizerOptions_getValue__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_double, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_MinimizerOptions_getValue__SWIG_1(self, args);
         }
       }
     }
@@ -28965,65 +28903,63 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_setValue(PyObject *self, PyObject *a
       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));
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__string, 0);
         _v = SWIG_CheckState(res);
         if (_v) {
-          return _wrap_MinimizerOptions_setValue__SWIG_2(self, args);
+          return _wrap_MinimizerOptions_getValue__SWIG_2(self, args);
         }
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_setValue'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_getValue'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    MinimizerOptions::setValue(std::string const &,double)\n"
-    "    MinimizerOptions::setValue(std::string const &,int)\n"
-    "    MinimizerOptions::setValue(std::string const &,std::string const &)\n");
+    "    MinimizerOptions::getValue(std::string const &,int &)\n"
+    "    MinimizerOptions::getValue(std::string const &,double &)\n"
+    "    MinimizerOptions::getValue(std::string const &,std::string &)\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
   std::string *arg2 = 0 ;
-  int *arg3 = 0 ;
+  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
   }
   arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_int,  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "int &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "int &""'"); 
-  }
-  arg3 = reinterpret_cast< int * >(argp3);
-  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->addValue((std::string const &)*arg2,arg3);
   resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -29033,46 +28969,43 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
   std::string *arg2 = 0 ;
-  double *arg3 = 0 ;
+  int arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
   }
   arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_double,  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "double &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "double &""'"); 
-  }
-  arg3 = reinterpret_cast< double * >(argp3);
-  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  (arg1)->addValue((std::string const &)*arg2,arg3);
   resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -29082,7 +29015,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
   std::string *arg2 = 0 ;
@@ -29090,48 +29023,52 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue__SWIG_2(PyObject *SWIGUNUSE
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_getValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
   }
   arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__string,  0 );
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "std::string &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getValue" "', argument " "3"" of type '" "std::string &""'"); 
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
   }
-  arg3 = reinterpret_cast< std::string * >(argp3);
-  (arg1)->getValue((std::string const &)*arg2,*arg3);
+  (arg1)->addValue((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_MinimizerOptions_getValue(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
     0
@@ -29152,11 +29089,12 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue(PyObject *self, PyObject *a
       int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
       _v = SWIG_CheckState(res);
       if (_v) {
-        void *vptr = 0;
-        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_int, 0);
-        _v = SWIG_CheckState(res);
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
         if (_v) {
-          return _wrap_MinimizerOptions_getValue__SWIG_0(self, args);
+          return _wrap_MinimizerOptions_addValue__SWIG_1(self, args);
         }
       }
     }
@@ -29170,11 +29108,12 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue(PyObject *self, PyObject *a
       int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
       _v = SWIG_CheckState(res);
       if (_v) {
-        void *vptr = 0;
-        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_double, 0);
-        _v = SWIG_CheckState(res);
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
         if (_v) {
-          return _wrap_MinimizerOptions_getValue__SWIG_1(self, args);
+          return _wrap_MinimizerOptions_addValue__SWIG_0(self, args);
         }
       }
     }
@@ -29188,64 +29127,55 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_getValue(PyObject *self, PyObject *a
       int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
       _v = SWIG_CheckState(res);
       if (_v) {
-        void *vptr = 0;
-        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__string, 0);
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          return _wrap_MinimizerOptions_getValue__SWIG_2(self, args);
+          return _wrap_MinimizerOptions_addValue__SWIG_2(self, args);
         }
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_getValue'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_addValue'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    MinimizerOptions::getValue(std::string const &,int &)\n"
-    "    MinimizerOptions::getValue(std::string const &,double &)\n"
-    "    MinimizerOptions::getValue(std::string const &,std::string &)\n");
+    "    MinimizerOptions::addValue(std::string const &,double)\n"
+    "    MinimizerOptions::addValue(std::string const &,int)\n"
+    "    MinimizerOptions::addValue(std::string const &,std::string const &)\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getIntValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
   std::string *arg2 = 0 ;
-  double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
+  int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getIntValue",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getIntValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
   }
   arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getIntValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getIntValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->addValue((std::string const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
+  result = (int)(arg1)->getIntValue((std::string const &)*arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
@@ -29254,79 +29184,143 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getRealValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
   std::string *arg2 = 0 ;
-  int arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 = SWIG_OLDOBJ ;
-  int val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getRealValue",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getRealValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
   }
   arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getRealValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getRealValue" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
-  ecode3 = SWIG_AsVal_int(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "int""'");
-  } 
-  arg3 = static_cast< int >(val3);
-  (arg1)->addValue((std::string const &)*arg2,arg3);
+  result = (double)(arg1)->getRealValue((std::string const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions_getNamedValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getNamedValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getNamedValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getNamedValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getNamedValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->getNamedValue((std::string const &)*arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerOptions__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerOptions__print",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions__print" "', argument " "1"" of type '" "MinimizerOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  ((MinimizerOptions const *)arg1)->print();
   resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MinimizerOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerOptions, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  std::string *arg1 = 0 ;
   std::string *arg2 = 0 ;
   std::string *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
   int res3 = SWIG_OLDOBJ ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
+  IMinimizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerOptions_addValue",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_addValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerFactory_createMinimizer",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
   }
-  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     res2 = SWIG_AsPtr_std_string(obj1, &ptr);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
     arg2 = ptr;
   }
@@ -29334,231 +29328,231 @@ SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue__SWIG_2(PyObject *SWIGUNUSE
     std::string *ptr = (std::string *)0;
     res3 = SWIG_AsPtr_std_string(obj2, &ptr);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_addValue" "', argument " "3"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
     }
     arg3 = ptr;
   }
-  (arg1)->addValue((std::string const &)*arg2,(std::string const &)*arg3);
-  resultobj = SWIG_Py_Void();
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_addValue(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IMinimizer *result = 0 ;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 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_AsVal_int(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_MinimizerOptions_addValue__SWIG_1(self, args);
-        }
-      }
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerFactory_createMinimizer",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
     }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 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_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_MinimizerOptions_addValue__SWIG_0(self, args);
-        }
-      }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
     }
+    arg1 = ptr;
   }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MinimizerOptions, 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_MinimizerOptions_addValue__SWIG_2(self, args);
-        }
-      }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
     }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
   }
-  
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerOptions_addValue'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    MinimizerOptions::addValue(std::string const &,double)\n"
-    "    MinimizerOptions::addValue(std::string const &,int)\n"
-    "    MinimizerOptions::addValue(std::string const &,std::string const &)\n");
-  return 0;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getIntValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
-  std::string *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
+  IMinimizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getIntValue",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getIntValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
+  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerFactory_createMinimizer",&obj0)) SWIG_fail;
   {
     std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getIntValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getIntValue" "', argument " "2"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
     }
-    arg2 = ptr;
+    arg1 = ptr;
   }
-  result = (int)(arg1)->getIntValue((std::string const &)*arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res1)) delete arg1;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getRealValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MinimizerFactory_printCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
-  std::string *arg2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":MinimizerFactory_printCatalogue")) SWIG_fail;
+  MinimizerFactory::printCatalogue();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
+  IMinimizer *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getRealValue",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerFactory_createMinimizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getRealValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "IMinimizer const *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getRealValue" "', argument " "2"" of type '" "std::string const &""'"); 
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((IMinimizer const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IMinimizer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_MinimizerFactory_createMinimizer__SWIG_3(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_MinimizerFactory_createMinimizer__SWIG_2(self, args);
     }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getRealValue" "', argument " "2"" of type '" "std::string const &""'"); 
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_MinimizerFactory_createMinimizer__SWIG_1(self, args);
+      }
     }
-    arg2 = ptr;
   }
-  result = (double)(arg1)->getRealValue((std::string const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return resultobj;
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_MinimizerFactory_createMinimizer__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
-  return NULL;
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerFactory_createMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(IMinimizer const *)\n");
+  return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions_getNamedValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
-  std::string *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int res2 = SWIG_OLDOBJ ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  std::string result;
+  MinimizerFactory *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerOptions_getNamedValue",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions_getNamedValue" "', argument " "1"" of type '" "MinimizerOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
-  {
-    std::string *ptr = (std::string *)0;
-    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerOptions_getNamedValue" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerOptions_getNamedValue" "', argument " "2"" of type '" "std::string const &""'"); 
-    }
-    arg2 = ptr;
-  }
-  result = (arg1)->getNamedValue((std::string const &)*arg2);
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (!PyArg_ParseTuple(args,(char *)":new_MinimizerFactory")) SWIG_fail;
+  result = (MinimizerFactory *)new MinimizerFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_MinimizerOptions__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  MinimizerOptions *arg1 = (MinimizerOptions *) 0 ;
+  MinimizerFactory *arg1 = (MinimizerFactory *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerOptions__print",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerOptions, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_MinimizerFactory",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerOptions__print" "', argument " "1"" of type '" "MinimizerOptions const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
   }
-  arg1 = reinterpret_cast< MinimizerOptions * >(argp1);
-  ((MinimizerOptions const *)arg1)->print();
+  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
+  delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -29566,10 +29560,10 @@ fail:
 }
 
 
-SWIGINTERN PyObject *MinimizerOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MinimizerFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerOptions, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerFactory, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
@@ -30548,195 +30542,32 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"vector_string_t_get_allocator", _wrap_vector_string_t_get_allocator, METH_VARARGS, (char *)"vector_string_t_get_allocator(vector_string_t self) -> std::vector< std::string >::allocator_type"},
 	 { (char *)"vector_string_t_pop_back", _wrap_vector_string_t_pop_back, METH_VARARGS, (char *)"vector_string_t_pop_back(vector_string_t self)"},
 	 { (char *)"vector_string_t_erase", _wrap_vector_string_t_erase, METH_VARARGS, (char *)"\n"
-		"erase(std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator\n"
-		"vector_string_t_erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator\n"
-		""},
-	 { (char *)"new_vector_string_t", _wrap_new_vector_string_t, METH_VARARGS, (char *)"\n"
-		"vector_string_t()\n"
-		"vector_string_t(vector_string_t arg2)\n"
-		"vector_string_t(std::vector< std::string >::size_type size)\n"
-		"new_vector_string_t(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t\n"
-		""},
-	 { (char *)"vector_string_t_push_back", _wrap_vector_string_t_push_back, METH_VARARGS, (char *)"vector_string_t_push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"},
-	 { (char *)"vector_string_t_front", _wrap_vector_string_t_front, METH_VARARGS, (char *)"vector_string_t_front(vector_string_t self) -> std::vector< std::string >::value_type const &"},
-	 { (char *)"vector_string_t_back", _wrap_vector_string_t_back, METH_VARARGS, (char *)"vector_string_t_back(vector_string_t self) -> std::vector< std::string >::value_type const &"},
-	 { (char *)"vector_string_t_assign", _wrap_vector_string_t_assign, METH_VARARGS, (char *)"vector_string_t_assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"},
-	 { (char *)"vector_string_t_resize", _wrap_vector_string_t_resize, METH_VARARGS, (char *)"\n"
-		"resize(std::vector< std::string >::size_type new_size)\n"
-		"vector_string_t_resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)\n"
-		""},
-	 { (char *)"vector_string_t_insert", _wrap_vector_string_t_insert, METH_VARARGS, (char *)"\n"
-		"insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator\n"
-		"vector_string_t_insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)\n"
-		""},
-	 { (char *)"vector_string_t_reserve", _wrap_vector_string_t_reserve, METH_VARARGS, (char *)"vector_string_t_reserve(vector_string_t self, std::vector< std::string >::size_type n)"},
-	 { (char *)"vector_string_t_capacity", _wrap_vector_string_t_capacity, METH_VARARGS, (char *)"vector_string_t_capacity(vector_string_t self) -> std::vector< std::string >::size_type"},
-	 { (char *)"delete_vector_string_t", _wrap_delete_vector_string_t, METH_VARARGS, (char *)"delete_vector_string_t(vector_string_t self)"},
-	 { (char *)"vector_string_t_swigregister", vector_string_t_swigregister, METH_VARARGS, NULL},
-	 { (char *)"GCCXML_SKIP_THIS_swigconstant", GCCXML_SKIP_THIS_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"delete_IChiSquaredModule", _wrap_delete_IChiSquaredModule, METH_VARARGS, (char *)"delete_IChiSquaredModule(IChiSquaredModule self)"},
-	 { (char *)"IChiSquaredModule_clone", _wrap_IChiSquaredModule_clone, METH_VARARGS, (char *)"IChiSquaredModule_clone(IChiSquaredModule self) -> IChiSquaredModule"},
-	 { (char *)"IChiSquaredModule_getSquaredFunction", _wrap_IChiSquaredModule_getSquaredFunction, METH_VARARGS, (char *)"IChiSquaredModule_getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction"},
-	 { (char *)"IChiSquaredModule_setChiSquaredFunction", _wrap_IChiSquaredModule_setChiSquaredFunction, METH_VARARGS, (char *)"\n"
-		"setChiSquaredFunction(ISquaredFunction squared_function)\n"
-		"IChiSquaredModule_setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)\n"
-		""},
-	 { (char *)"IChiSquaredModule_getIntensityNormalizer", _wrap_IChiSquaredModule_getIntensityNormalizer, METH_VARARGS, (char *)"\n"
-		"getIntensityNormalizer() -> IIntensityNormalizer\n"
-		"IChiSquaredModule_getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer\n"
-		""},
-	 { (char *)"IChiSquaredModule_setIntensityNormalizer", _wrap_IChiSquaredModule_setIntensityNormalizer, METH_VARARGS, (char *)"IChiSquaredModule_setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)"},
-	 { (char *)"IChiSquaredModule_getIntensityFunction", _wrap_IChiSquaredModule_getIntensityFunction, METH_VARARGS, (char *)"IChiSquaredModule_getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction"},
-	 { (char *)"IChiSquaredModule_setIntensityFunction", _wrap_IChiSquaredModule_setIntensityFunction, METH_VARARGS, (char *)"IChiSquaredModule_setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)"},
-	 { (char *)"IChiSquaredModule_processFitElements", _wrap_IChiSquaredModule_processFitElements, METH_VARARGS, (char *)"IChiSquaredModule_processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3, std::vector< FitElement,std::allocator< FitElement > >::iterator arg4)"},
-	 { (char *)"IChiSquaredModule_swigregister", IChiSquaredModule_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_IFitObserver", _wrap_new_IFitObserver, METH_VARARGS, (char *)"\n"
-		"new_IFitObserver(PyObject * arg2, int update_every_nth) -> IFitObserver\n"
-		"\n"
-		"IFitObserver::IFitObserver(int update_every_nth)\n"
-		"\n"
-		""},
-	 { (char *)"IFitObserver_notify", _wrap_IFitObserver_notify, METH_VARARGS, (char *)"\n"
-		"IFitObserver_notify(IFitObserver self, IObservable subject)\n"
-		"\n"
-		"void IFitObserver::notify(IObservable *subject)\n"
-		"\n"
-		"The method used by Ovservable when he wants to be observed by this. \n"
-		"\n"
-		""},
-	 { (char *)"IFitObserver_update", _wrap_IFitObserver_update, METH_VARARGS, (char *)"\n"
-		"IFitObserver_update(IFitObserver self, FitSuite fit_suite)\n"
-		"\n"
-		"void IFitObserver::update(FitSuite *fit_suite)\n"
-		"\n"
-		"Here Onserver will do actuall job when he thinks that it is a right moment. \n"
-		"\n"
-		""},
-	 { (char *)"delete_IFitObserver", _wrap_delete_IFitObserver, METH_VARARGS, (char *)"delete_IFitObserver(IFitObserver self)"},
-	 { (char *)"disown_IFitObserver", _wrap_disown_IFitObserver, METH_VARARGS, NULL},
-	 { (char *)"IFitObserver_swigregister", IFitObserver_swigregister, METH_VARARGS, NULL},
-	 { (char *)"IFitStrategy_clone", _wrap_IFitStrategy_clone, METH_VARARGS, (char *)"\n"
-		"IFitStrategy_clone(IFitStrategy self) -> IFitStrategy\n"
-		"\n"
-		"virtual IFitStrategy* IFitStrategy::clone() const =0\n"
-		"\n"
-		""},
-	 { (char *)"delete_IFitStrategy", _wrap_delete_IFitStrategy, METH_VARARGS, (char *)"\n"
-		"delete_IFitStrategy(IFitStrategy self)\n"
-		"\n"
-		"IFitStrategy::~IFitStrategy()\n"
-		"\n"
-		""},
-	 { (char *)"IFitStrategy_init", _wrap_IFitStrategy_init, METH_VARARGS, (char *)"\n"
-		"IFitStrategy_init(IFitStrategy self, FitKernel * fit_suite)\n"
-		"\n"
-		"void IFitStrategy::init(FitKernel *fit_suite)\n"
-		"\n"
-		""},
-	 { (char *)"IFitStrategy_execute", _wrap_IFitStrategy_execute, METH_VARARGS, (char *)"\n"
-		"IFitStrategy_execute(IFitStrategy self)\n"
-		"\n"
-		"virtual void IFitStrategy::execute()=0\n"
-		"\n"
-		""},
-	 { (char *)"IFitStrategy_swigregister", IFitStrategy_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_FitStrategyDefault", _wrap_new_FitStrategyDefault, METH_VARARGS, (char *)"\n"
-		"new_FitStrategyDefault() -> FitStrategyDefault\n"
-		"\n"
-		"FitStrategyDefault::FitStrategyDefault()\n"
-		"\n"
-		""},
-	 { (char *)"FitStrategyDefault_clone", _wrap_FitStrategyDefault_clone, METH_VARARGS, (char *)"\n"
-		"FitStrategyDefault_clone(FitStrategyDefault self) -> IFitStrategy\n"
-		"\n"
-		"IFitStrategy * FitStrategyDefault::clone() const \n"
-		"\n"
-		""},
-	 { (char *)"FitStrategyDefault_execute", _wrap_FitStrategyDefault_execute, METH_VARARGS, (char *)"\n"
-		"FitStrategyDefault_execute(FitStrategyDefault self)\n"
-		"\n"
-		"void FitStrategyDefault::execute()\n"
-		"\n"
-		""},
-	 { (char *)"delete_FitStrategyDefault", _wrap_delete_FitStrategyDefault, METH_VARARGS, (char *)"delete_FitStrategyDefault(FitStrategyDefault self)"},
-	 { (char *)"FitStrategyDefault_swigregister", FitStrategyDefault_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_IIntensityFunction", _wrap_delete_IIntensityFunction, METH_VARARGS, (char *)"delete_IIntensityFunction(IIntensityFunction self)"},
-	 { (char *)"IIntensityFunction_clone", _wrap_IIntensityFunction_clone, METH_VARARGS, (char *)"IIntensityFunction_clone(IIntensityFunction self) -> IIntensityFunction"},
-	 { (char *)"IIntensityFunction_evaluate", _wrap_IIntensityFunction_evaluate, METH_VARARGS, (char *)"IIntensityFunction_evaluate(IIntensityFunction self, double value) -> double"},
-	 { (char *)"IIntensityFunction_swigregister", IIntensityFunction_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_IntensityFunctionLog", _wrap_delete_IntensityFunctionLog, METH_VARARGS, (char *)"delete_IntensityFunctionLog(IntensityFunctionLog self)"},
-	 { (char *)"IntensityFunctionLog_clone", _wrap_IntensityFunctionLog_clone, METH_VARARGS, (char *)"IntensityFunctionLog_clone(IntensityFunctionLog self) -> IntensityFunctionLog"},
-	 { (char *)"IntensityFunctionLog_evaluate", _wrap_IntensityFunctionLog_evaluate, METH_VARARGS, (char *)"IntensityFunctionLog_evaluate(IntensityFunctionLog self, double value) -> double"},
-	 { (char *)"new_IntensityFunctionLog", _wrap_new_IntensityFunctionLog, METH_VARARGS, (char *)"new_IntensityFunctionLog() -> IntensityFunctionLog"},
-	 { (char *)"IntensityFunctionLog_swigregister", IntensityFunctionLog_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_IntensityFunctionSqrt", _wrap_delete_IntensityFunctionSqrt, METH_VARARGS, (char *)"delete_IntensityFunctionSqrt(IntensityFunctionSqrt self)"},
-	 { (char *)"IntensityFunctionSqrt_clone", _wrap_IntensityFunctionSqrt_clone, METH_VARARGS, (char *)"IntensityFunctionSqrt_clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"},
-	 { (char *)"IntensityFunctionSqrt_evaluate", _wrap_IntensityFunctionSqrt_evaluate, METH_VARARGS, (char *)"IntensityFunctionSqrt_evaluate(IntensityFunctionSqrt self, double value) -> double"},
-	 { (char *)"new_IntensityFunctionSqrt", _wrap_new_IntensityFunctionSqrt, METH_VARARGS, (char *)"new_IntensityFunctionSqrt() -> IntensityFunctionSqrt"},
-	 { (char *)"IntensityFunctionSqrt_swigregister", IntensityFunctionSqrt_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_IIntensityNormalizer", _wrap_delete_IIntensityNormalizer, METH_VARARGS, (char *)"delete_IIntensityNormalizer(IIntensityNormalizer self)"},
-	 { (char *)"IIntensityNormalizer_clone", _wrap_IIntensityNormalizer_clone, METH_VARARGS, (char *)"IIntensityNormalizer_clone(IIntensityNormalizer self) -> IIntensityNormalizer"},
-	 { (char *)"IIntensityNormalizer_createNormalizedData", _wrap_IIntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"IIntensityNormalizer_createNormalizedData(IIntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"},
-	 { (char *)"IIntensityNormalizer_apply", _wrap_IIntensityNormalizer_apply, METH_VARARGS, (char *)"IIntensityNormalizer_apply(IIntensityNormalizer self, OutputData< double > & data)"},
-	 { (char *)"IIntensityNormalizer_setMaximumIntensity", _wrap_IIntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IIntensityNormalizer_setMaximumIntensity(IIntensityNormalizer self, double arg3)"},
-	 { (char *)"IIntensityNormalizer_swigregister", IIntensityNormalizer_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_IntensityNormalizer", _wrap_new_IntensityNormalizer, METH_VARARGS, (char *)"\n"
-		"IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
-		"IntensityNormalizer(double scale=1.0)\n"
-		"new_IntensityNormalizer() -> IntensityNormalizer\n"
-		""},
-	 { (char *)"delete_IntensityNormalizer", _wrap_delete_IntensityNormalizer, METH_VARARGS, (char *)"delete_IntensityNormalizer(IntensityNormalizer self)"},
-	 { (char *)"IntensityNormalizer_clone", _wrap_IntensityNormalizer_clone, METH_VARARGS, (char *)"IntensityNormalizer_clone(IntensityNormalizer self) -> IntensityNormalizer"},
-	 { (char *)"IntensityNormalizer_createNormalizedData", _wrap_IntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"IntensityNormalizer_createNormalizedData(IntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"},
-	 { (char *)"IntensityNormalizer_apply", _wrap_IntensityNormalizer_apply, METH_VARARGS, (char *)"IntensityNormalizer_apply(IntensityNormalizer self, OutputData< double > & data)"},
-	 { (char *)"IntensityNormalizer_setMaximumIntensity", _wrap_IntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IntensityNormalizer_setMaximumIntensity(IntensityNormalizer self, double max_intensity)"},
-	 { (char *)"IntensityNormalizer_swigregister", IntensityNormalizer_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_IntensityScaleAndShiftNormalizer", _wrap_new_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"\n"
-		"IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
-		"IntensityScaleAndShiftNormalizer(double scale=1.0)\n"
-		"new_IntensityScaleAndShiftNormalizer() -> IntensityScaleAndShiftNormalizer\n"
-		""},
-	 { (char *)"delete_IntensityScaleAndShiftNormalizer", _wrap_delete_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"delete_IntensityScaleAndShiftNormalizer(IntensityScaleAndShiftNormalizer self)"},
-	 { (char *)"IntensityScaleAndShiftNormalizer_setMaximumIntensity", _wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IntensityScaleAndShiftNormalizer_setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double max_intensity)"},
-	 { (char *)"IntensityScaleAndShiftNormalizer_clone", _wrap_IntensityScaleAndShiftNormalizer_clone, METH_VARARGS, (char *)"IntensityScaleAndShiftNormalizer_clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer"},
-	 { (char *)"IntensityScaleAndShiftNormalizer_swigregister", IntensityScaleAndShiftNormalizer_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_ISquaredFunction", _wrap_delete_ISquaredFunction, METH_VARARGS, (char *)"delete_ISquaredFunction(ISquaredFunction self)"},
-	 { (char *)"ISquaredFunction_clone", _wrap_ISquaredFunction_clone, METH_VARARGS, (char *)"ISquaredFunction_clone(ISquaredFunction self) -> ISquaredFunction"},
-	 { (char *)"ISquaredFunction_calculateSquaredDifference", _wrap_ISquaredFunction_calculateSquaredDifference, METH_VARARGS, (char *)"ISquaredFunction_calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double"},
-	 { (char *)"ISquaredFunction_calculateSquaredError", _wrap_ISquaredFunction_calculateSquaredError, METH_VARARGS, (char *)"\n"
-		"calculateSquaredError(double real_value, double simulated_value=0.0) -> double\n"
-		"ISquaredFunction_calculateSquaredError(ISquaredFunction self, double real_value) -> double\n"
+		"erase(std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator\n"
 		""},
-	 { (char *)"ISquaredFunction_swigregister", ISquaredFunction_swigregister, METH_VARARGS, NULL},
-	 { (char *)"new_SquaredFunctionDefault", _wrap_new_SquaredFunctionDefault, METH_VARARGS, (char *)"new_SquaredFunctionDefault() -> SquaredFunctionDefault"},
-	 { (char *)"delete_SquaredFunctionDefault", _wrap_delete_SquaredFunctionDefault, METH_VARARGS, (char *)"delete_SquaredFunctionDefault(SquaredFunctionDefault self)"},
-	 { (char *)"SquaredFunctionDefault_clone", _wrap_SquaredFunctionDefault_clone, METH_VARARGS, (char *)"SquaredFunctionDefault_clone(SquaredFunctionDefault self) -> SquaredFunctionDefault"},
-	 { (char *)"SquaredFunctionDefault_calculateSquaredDifference", _wrap_SquaredFunctionDefault_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionDefault_calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionDefault_calculateSquaredError", _wrap_SquaredFunctionDefault_calculateSquaredError, METH_VARARGS, (char *)"\n"
-		"calculateSquaredError(double real_value, double simulated_value=0) -> double\n"
-		"SquaredFunctionDefault_calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double\n"
+	 { (char *)"new_vector_string_t", _wrap_new_vector_string_t, METH_VARARGS, (char *)"\n"
+		"vector_string_t()\n"
+		"vector_string_t(vector_string_t arg2)\n"
+		"vector_string_t(std::vector< std::string >::size_type size)\n"
+		"new_vector_string_t(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t\n"
 		""},
-	 { (char *)"SquaredFunctionDefault_swigregister", SquaredFunctionDefault_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_SquaredFunctionSimError", _wrap_delete_SquaredFunctionSimError, METH_VARARGS, (char *)"delete_SquaredFunctionSimError(SquaredFunctionSimError self)"},
-	 { (char *)"SquaredFunctionSimError_clone", _wrap_SquaredFunctionSimError_clone, METH_VARARGS, (char *)"SquaredFunctionSimError_clone(SquaredFunctionSimError self) -> SquaredFunctionSimError"},
-	 { (char *)"SquaredFunctionSimError_calculateSquaredDifference", _wrap_SquaredFunctionSimError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionSimError_calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionSimError_calculateSquaredError", _wrap_SquaredFunctionSimError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionSimError_calculateSquaredError(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionSimError_swigregister", SquaredFunctionSimError_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_SquaredFunctionMeanSquaredError", _wrap_delete_SquaredFunctionMeanSquaredError, METH_VARARGS, (char *)"delete_SquaredFunctionMeanSquaredError(SquaredFunctionMeanSquaredError self)"},
-	 { (char *)"SquaredFunctionMeanSquaredError_clone", _wrap_SquaredFunctionMeanSquaredError_clone, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError"},
-	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredDifference", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredError", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionMeanSquaredError_swigregister", SquaredFunctionMeanSquaredError_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_SquaredFunctionSystematicError", _wrap_delete_SquaredFunctionSystematicError, METH_VARARGS, (char *)"delete_SquaredFunctionSystematicError(SquaredFunctionSystematicError self)"},
-	 { (char *)"SquaredFunctionSystematicError_clone", _wrap_SquaredFunctionSystematicError_clone, METH_VARARGS, (char *)"SquaredFunctionSystematicError_clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError"},
-	 { (char *)"SquaredFunctionSystematicError_calculateSquaredDifference", _wrap_SquaredFunctionSystematicError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionSystematicError_calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionSystematicError_calculateSquaredError", _wrap_SquaredFunctionSystematicError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionSystematicError_calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionSystematicError_swigregister", SquaredFunctionSystematicError_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_SquaredFunctionGaussianError", _wrap_delete_SquaredFunctionGaussianError, METH_VARARGS, (char *)"delete_SquaredFunctionGaussianError(SquaredFunctionGaussianError self)"},
-	 { (char *)"SquaredFunctionGaussianError_clone", _wrap_SquaredFunctionGaussianError_clone, METH_VARARGS, (char *)"SquaredFunctionGaussianError_clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError"},
-	 { (char *)"SquaredFunctionGaussianError_calculateSquaredDifference", _wrap_SquaredFunctionGaussianError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionGaussianError_calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double"},
-	 { (char *)"SquaredFunctionGaussianError_calculateSquaredError", _wrap_SquaredFunctionGaussianError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionGaussianError_calculateSquaredError(SquaredFunctionGaussianError self, double arg3, double arg4) -> double"},
-	 { (char *)"SquaredFunctionGaussianError_swigregister", SquaredFunctionGaussianError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_string_t_push_back", _wrap_vector_string_t_push_back, METH_VARARGS, (char *)"vector_string_t_push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_front", _wrap_vector_string_t_front, METH_VARARGS, (char *)"vector_string_t_front(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_back", _wrap_vector_string_t_back, METH_VARARGS, (char *)"vector_string_t_back(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_assign", _wrap_vector_string_t_assign, METH_VARARGS, (char *)"vector_string_t_assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_resize", _wrap_vector_string_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::string >::size_type new_size)\n"
+		"vector_string_t_resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_insert", _wrap_vector_string_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_reserve", _wrap_vector_string_t_reserve, METH_VARARGS, (char *)"vector_string_t_reserve(vector_string_t self, std::vector< std::string >::size_type n)"},
+	 { (char *)"vector_string_t_capacity", _wrap_vector_string_t_capacity, METH_VARARGS, (char *)"vector_string_t_capacity(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"delete_vector_string_t", _wrap_delete_vector_string_t, METH_VARARGS, (char *)"delete_vector_string_t(vector_string_t self)"},
+	 { (char *)"vector_string_t_swigregister", vector_string_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"GCCXML_SKIP_THIS_swigconstant", GCCXML_SKIP_THIS_swigconstant, METH_VARARGS, NULL},
 	 { (char *)"delete_IMinimizer", _wrap_delete_IMinimizer, METH_VARARGS, (char *)"\n"
 		"delete_IMinimizer(IMinimizer self)\n"
 		"\n"
@@ -30903,6 +30734,169 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"IMinimizer_swigregister", IMinimizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IChiSquaredModule", _wrap_delete_IChiSquaredModule, METH_VARARGS, (char *)"delete_IChiSquaredModule(IChiSquaredModule self)"},
+	 { (char *)"IChiSquaredModule_clone", _wrap_IChiSquaredModule_clone, METH_VARARGS, (char *)"IChiSquaredModule_clone(IChiSquaredModule self) -> IChiSquaredModule"},
+	 { (char *)"IChiSquaredModule_getSquaredFunction", _wrap_IChiSquaredModule_getSquaredFunction, METH_VARARGS, (char *)"IChiSquaredModule_getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction"},
+	 { (char *)"IChiSquaredModule_setChiSquaredFunction", _wrap_IChiSquaredModule_setChiSquaredFunction, METH_VARARGS, (char *)"\n"
+		"setChiSquaredFunction(ISquaredFunction squared_function)\n"
+		"IChiSquaredModule_setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)\n"
+		""},
+	 { (char *)"IChiSquaredModule_getIntensityNormalizer", _wrap_IChiSquaredModule_getIntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"getIntensityNormalizer() -> IIntensityNormalizer\n"
+		"IChiSquaredModule_getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer\n"
+		""},
+	 { (char *)"IChiSquaredModule_setIntensityNormalizer", _wrap_IChiSquaredModule_setIntensityNormalizer, METH_VARARGS, (char *)"IChiSquaredModule_setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)"},
+	 { (char *)"IChiSquaredModule_getIntensityFunction", _wrap_IChiSquaredModule_getIntensityFunction, METH_VARARGS, (char *)"IChiSquaredModule_getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction"},
+	 { (char *)"IChiSquaredModule_setIntensityFunction", _wrap_IChiSquaredModule_setIntensityFunction, METH_VARARGS, (char *)"IChiSquaredModule_setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)"},
+	 { (char *)"IChiSquaredModule_processFitElements", _wrap_IChiSquaredModule_processFitElements, METH_VARARGS, (char *)"IChiSquaredModule_processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3, std::vector< FitElement,std::allocator< FitElement > >::iterator arg4)"},
+	 { (char *)"IChiSquaredModule_swigregister", IChiSquaredModule_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IFitObserver", _wrap_new_IFitObserver, METH_VARARGS, (char *)"\n"
+		"new_IFitObserver(PyObject * arg2, int update_every_nth) -> IFitObserver\n"
+		"\n"
+		"IFitObserver::IFitObserver(int update_every_nth)\n"
+		"\n"
+		""},
+	 { (char *)"IFitObserver_notify", _wrap_IFitObserver_notify, METH_VARARGS, (char *)"\n"
+		"IFitObserver_notify(IFitObserver self, IObservable subject)\n"
+		"\n"
+		"void IFitObserver::notify(IObservable *subject)\n"
+		"\n"
+		"The method used by Ovservable when he wants to be observed by this. \n"
+		"\n"
+		""},
+	 { (char *)"IFitObserver_update", _wrap_IFitObserver_update, METH_VARARGS, (char *)"\n"
+		"IFitObserver_update(IFitObserver self, FitSuite fit_suite)\n"
+		"\n"
+		"void IFitObserver::update(FitSuite *fit_suite)\n"
+		"\n"
+		"Here Onserver will do actuall job when he thinks that it is a right moment. \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFitObserver", _wrap_delete_IFitObserver, METH_VARARGS, (char *)"delete_IFitObserver(IFitObserver self)"},
+	 { (char *)"disown_IFitObserver", _wrap_disown_IFitObserver, METH_VARARGS, NULL},
+	 { (char *)"IFitObserver_swigregister", IFitObserver_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IFitStrategy_clone", _wrap_IFitStrategy_clone, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_clone(IFitStrategy self) -> IFitStrategy\n"
+		"\n"
+		"virtual IFitStrategy* IFitStrategy::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"delete_IFitStrategy", _wrap_delete_IFitStrategy, METH_VARARGS, (char *)"\n"
+		"delete_IFitStrategy(IFitStrategy self)\n"
+		"\n"
+		"IFitStrategy::~IFitStrategy()\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_init", _wrap_IFitStrategy_init, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_init(IFitStrategy self, FitKernel * fit_suite)\n"
+		"\n"
+		"void IFitStrategy::init(FitKernel *fit_suite)\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_execute", _wrap_IFitStrategy_execute, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_execute(IFitStrategy self)\n"
+		"\n"
+		"virtual void IFitStrategy::execute()=0\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_swigregister", IFitStrategy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitStrategyDefault", _wrap_new_FitStrategyDefault, METH_VARARGS, (char *)"\n"
+		"new_FitStrategyDefault() -> FitStrategyDefault\n"
+		"\n"
+		"FitStrategyDefault::FitStrategyDefault()\n"
+		"\n"
+		""},
+	 { (char *)"FitStrategyDefault_clone", _wrap_FitStrategyDefault_clone, METH_VARARGS, (char *)"\n"
+		"FitStrategyDefault_clone(FitStrategyDefault self) -> IFitStrategy\n"
+		"\n"
+		"IFitStrategy * FitStrategyDefault::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FitStrategyDefault_execute", _wrap_FitStrategyDefault_execute, METH_VARARGS, (char *)"\n"
+		"FitStrategyDefault_execute(FitStrategyDefault self)\n"
+		"\n"
+		"void FitStrategyDefault::execute()\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitStrategyDefault", _wrap_delete_FitStrategyDefault, METH_VARARGS, (char *)"delete_FitStrategyDefault(FitStrategyDefault self)"},
+	 { (char *)"FitStrategyDefault_swigregister", FitStrategyDefault_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IIntensityFunction", _wrap_delete_IIntensityFunction, METH_VARARGS, (char *)"delete_IIntensityFunction(IIntensityFunction self)"},
+	 { (char *)"IIntensityFunction_clone", _wrap_IIntensityFunction_clone, METH_VARARGS, (char *)"IIntensityFunction_clone(IIntensityFunction self) -> IIntensityFunction"},
+	 { (char *)"IIntensityFunction_evaluate", _wrap_IIntensityFunction_evaluate, METH_VARARGS, (char *)"IIntensityFunction_evaluate(IIntensityFunction self, double value) -> double"},
+	 { (char *)"IIntensityFunction_swigregister", IIntensityFunction_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IntensityFunctionLog", _wrap_delete_IntensityFunctionLog, METH_VARARGS, (char *)"delete_IntensityFunctionLog(IntensityFunctionLog self)"},
+	 { (char *)"IntensityFunctionLog_clone", _wrap_IntensityFunctionLog_clone, METH_VARARGS, (char *)"IntensityFunctionLog_clone(IntensityFunctionLog self) -> IntensityFunctionLog"},
+	 { (char *)"IntensityFunctionLog_evaluate", _wrap_IntensityFunctionLog_evaluate, METH_VARARGS, (char *)"IntensityFunctionLog_evaluate(IntensityFunctionLog self, double value) -> double"},
+	 { (char *)"new_IntensityFunctionLog", _wrap_new_IntensityFunctionLog, METH_VARARGS, (char *)"new_IntensityFunctionLog() -> IntensityFunctionLog"},
+	 { (char *)"IntensityFunctionLog_swigregister", IntensityFunctionLog_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IntensityFunctionSqrt", _wrap_delete_IntensityFunctionSqrt, METH_VARARGS, (char *)"delete_IntensityFunctionSqrt(IntensityFunctionSqrt self)"},
+	 { (char *)"IntensityFunctionSqrt_clone", _wrap_IntensityFunctionSqrt_clone, METH_VARARGS, (char *)"IntensityFunctionSqrt_clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt"},
+	 { (char *)"IntensityFunctionSqrt_evaluate", _wrap_IntensityFunctionSqrt_evaluate, METH_VARARGS, (char *)"IntensityFunctionSqrt_evaluate(IntensityFunctionSqrt self, double value) -> double"},
+	 { (char *)"new_IntensityFunctionSqrt", _wrap_new_IntensityFunctionSqrt, METH_VARARGS, (char *)"new_IntensityFunctionSqrt() -> IntensityFunctionSqrt"},
+	 { (char *)"IntensityFunctionSqrt_swigregister", IntensityFunctionSqrt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IIntensityNormalizer", _wrap_delete_IIntensityNormalizer, METH_VARARGS, (char *)"delete_IIntensityNormalizer(IIntensityNormalizer self)"},
+	 { (char *)"IIntensityNormalizer_clone", _wrap_IIntensityNormalizer_clone, METH_VARARGS, (char *)"IIntensityNormalizer_clone(IIntensityNormalizer self) -> IIntensityNormalizer"},
+	 { (char *)"IIntensityNormalizer_createNormalizedData", _wrap_IIntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"IIntensityNormalizer_createNormalizedData(IIntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"},
+	 { (char *)"IIntensityNormalizer_apply", _wrap_IIntensityNormalizer_apply, METH_VARARGS, (char *)"IIntensityNormalizer_apply(IIntensityNormalizer self, OutputData< double > & data)"},
+	 { (char *)"IIntensityNormalizer_setMaximumIntensity", _wrap_IIntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IIntensityNormalizer_setMaximumIntensity(IIntensityNormalizer self, double arg3)"},
+	 { (char *)"IIntensityNormalizer_swigregister", IIntensityNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IntensityNormalizer", _wrap_new_IntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
+		"IntensityNormalizer(double scale=1.0)\n"
+		"new_IntensityNormalizer() -> IntensityNormalizer\n"
+		""},
+	 { (char *)"delete_IntensityNormalizer", _wrap_delete_IntensityNormalizer, METH_VARARGS, (char *)"delete_IntensityNormalizer(IntensityNormalizer self)"},
+	 { (char *)"IntensityNormalizer_clone", _wrap_IntensityNormalizer_clone, METH_VARARGS, (char *)"IntensityNormalizer_clone(IntensityNormalizer self) -> IntensityNormalizer"},
+	 { (char *)"IntensityNormalizer_createNormalizedData", _wrap_IntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"IntensityNormalizer_createNormalizedData(IntensityNormalizer self, OutputData< double > const & data) -> OutputData< double > *"},
+	 { (char *)"IntensityNormalizer_apply", _wrap_IntensityNormalizer_apply, METH_VARARGS, (char *)"IntensityNormalizer_apply(IntensityNormalizer self, OutputData< double > & data)"},
+	 { (char *)"IntensityNormalizer_setMaximumIntensity", _wrap_IntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IntensityNormalizer_setMaximumIntensity(IntensityNormalizer self, double max_intensity)"},
+	 { (char *)"IntensityNormalizer_swigregister", IntensityNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IntensityScaleAndShiftNormalizer", _wrap_new_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"\n"
+		"IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
+		"IntensityScaleAndShiftNormalizer(double scale=1.0)\n"
+		"new_IntensityScaleAndShiftNormalizer() -> IntensityScaleAndShiftNormalizer\n"
+		""},
+	 { (char *)"delete_IntensityScaleAndShiftNormalizer", _wrap_delete_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"delete_IntensityScaleAndShiftNormalizer(IntensityScaleAndShiftNormalizer self)"},
+	 { (char *)"IntensityScaleAndShiftNormalizer_setMaximumIntensity", _wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"IntensityScaleAndShiftNormalizer_setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double max_intensity)"},
+	 { (char *)"IntensityScaleAndShiftNormalizer_clone", _wrap_IntensityScaleAndShiftNormalizer_clone, METH_VARARGS, (char *)"IntensityScaleAndShiftNormalizer_clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer"},
+	 { (char *)"IntensityScaleAndShiftNormalizer_swigregister", IntensityScaleAndShiftNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_ISquaredFunction", _wrap_delete_ISquaredFunction, METH_VARARGS, (char *)"delete_ISquaredFunction(ISquaredFunction self)"},
+	 { (char *)"ISquaredFunction_clone", _wrap_ISquaredFunction_clone, METH_VARARGS, (char *)"ISquaredFunction_clone(ISquaredFunction self) -> ISquaredFunction"},
+	 { (char *)"ISquaredFunction_calculateSquaredDifference", _wrap_ISquaredFunction_calculateSquaredDifference, METH_VARARGS, (char *)"ISquaredFunction_calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double"},
+	 { (char *)"ISquaredFunction_calculateSquaredError", _wrap_ISquaredFunction_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"calculateSquaredError(double real_value, double simulated_value=0.0) -> double\n"
+		"ISquaredFunction_calculateSquaredError(ISquaredFunction self, double real_value) -> double\n"
+		""},
+	 { (char *)"ISquaredFunction_swigregister", ISquaredFunction_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SquaredFunctionDefault", _wrap_new_SquaredFunctionDefault, METH_VARARGS, (char *)"new_SquaredFunctionDefault() -> SquaredFunctionDefault"},
+	 { (char *)"delete_SquaredFunctionDefault", _wrap_delete_SquaredFunctionDefault, METH_VARARGS, (char *)"delete_SquaredFunctionDefault(SquaredFunctionDefault self)"},
+	 { (char *)"SquaredFunctionDefault_clone", _wrap_SquaredFunctionDefault_clone, METH_VARARGS, (char *)"SquaredFunctionDefault_clone(SquaredFunctionDefault self) -> SquaredFunctionDefault"},
+	 { (char *)"SquaredFunctionDefault_calculateSquaredDifference", _wrap_SquaredFunctionDefault_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionDefault_calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionDefault_calculateSquaredError", _wrap_SquaredFunctionDefault_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"calculateSquaredError(double real_value, double simulated_value=0) -> double\n"
+		"SquaredFunctionDefault_calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double\n"
+		""},
+	 { (char *)"SquaredFunctionDefault_swigregister", SquaredFunctionDefault_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionSimError", _wrap_delete_SquaredFunctionSimError, METH_VARARGS, (char *)"delete_SquaredFunctionSimError(SquaredFunctionSimError self)"},
+	 { (char *)"SquaredFunctionSimError_clone", _wrap_SquaredFunctionSimError_clone, METH_VARARGS, (char *)"SquaredFunctionSimError_clone(SquaredFunctionSimError self) -> SquaredFunctionSimError"},
+	 { (char *)"SquaredFunctionSimError_calculateSquaredDifference", _wrap_SquaredFunctionSimError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionSimError_calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionSimError_calculateSquaredError", _wrap_SquaredFunctionSimError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionSimError_calculateSquaredError(SquaredFunctionSimError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionSimError_swigregister", SquaredFunctionSimError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionMeanSquaredError", _wrap_delete_SquaredFunctionMeanSquaredError, METH_VARARGS, (char *)"delete_SquaredFunctionMeanSquaredError(SquaredFunctionMeanSquaredError self)"},
+	 { (char *)"SquaredFunctionMeanSquaredError_clone", _wrap_SquaredFunctionMeanSquaredError_clone, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError"},
+	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredDifference", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredError", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionMeanSquaredError_calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionMeanSquaredError_swigregister", SquaredFunctionMeanSquaredError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionSystematicError", _wrap_delete_SquaredFunctionSystematicError, METH_VARARGS, (char *)"delete_SquaredFunctionSystematicError(SquaredFunctionSystematicError self)"},
+	 { (char *)"SquaredFunctionSystematicError_clone", _wrap_SquaredFunctionSystematicError_clone, METH_VARARGS, (char *)"SquaredFunctionSystematicError_clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError"},
+	 { (char *)"SquaredFunctionSystematicError_calculateSquaredDifference", _wrap_SquaredFunctionSystematicError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionSystematicError_calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionSystematicError_calculateSquaredError", _wrap_SquaredFunctionSystematicError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionSystematicError_calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionSystematicError_swigregister", SquaredFunctionSystematicError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionGaussianError", _wrap_delete_SquaredFunctionGaussianError, METH_VARARGS, (char *)"delete_SquaredFunctionGaussianError(SquaredFunctionGaussianError self)"},
+	 { (char *)"SquaredFunctionGaussianError_clone", _wrap_SquaredFunctionGaussianError_clone, METH_VARARGS, (char *)"SquaredFunctionGaussianError_clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError"},
+	 { (char *)"SquaredFunctionGaussianError_calculateSquaredDifference", _wrap_SquaredFunctionGaussianError_calculateSquaredDifference, METH_VARARGS, (char *)"SquaredFunctionGaussianError_calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double"},
+	 { (char *)"SquaredFunctionGaussianError_calculateSquaredError", _wrap_SquaredFunctionGaussianError_calculateSquaredError, METH_VARARGS, (char *)"SquaredFunctionGaussianError_calculateSquaredError(SquaredFunctionGaussianError self, double arg3, double arg4) -> double"},
+	 { (char *)"SquaredFunctionGaussianError_swigregister", SquaredFunctionGaussianError_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_ChiSquaredModule", _wrap_new_ChiSquaredModule, METH_VARARGS, (char *)"\n"
 		"ChiSquaredModule()\n"
 		"new_ChiSquaredModule(ChiSquaredModule other) -> ChiSquaredModule\n"
@@ -31709,25 +31703,6 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"GenerateNormalRandom", _wrap_GenerateNormalRandom, METH_VARARGS, (char *)"GenerateNormalRandom(double average, double std_dev) -> double"},
 	 { (char *)"isnan", _wrap_isnan, METH_VARARGS, (char *)"isnan(double x) -> bool"},
 	 { (char *)"isinf", _wrap_isinf, METH_VARARGS, (char *)"isinf(double x) -> bool"},
-	 { (char *)"MinimizerFactory_printCatalogue", _wrap_MinimizerFactory_printCatalogue, METH_VARARGS, (char *)"MinimizerFactory_printCatalogue()"},
-	 { (char *)"MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, (char *)"\n"
-		"createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer\n"
-		"createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer\n"
-		"createMinimizer(std::string const & minimizer) -> IMinimizer\n"
-		"MinimizerFactory_createMinimizer(IMinimizer minimizer) -> IMinimizer\n"
-		""},
-	 { (char *)"new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_VARARGS, (char *)"\n"
-		"new_MinimizerFactory() -> MinimizerFactory\n"
-		"\n"
-		"\n"
-		"\n"
-		"Factory to create minimizers.\n"
-		"\n"
-		"C++ includes: MinimizerFactory.h\n"
-		"\n"
-		""},
-	 { (char *)"delete_MinimizerFactory", _wrap_delete_MinimizerFactory, METH_VARARGS, (char *)"delete_MinimizerFactory(MinimizerFactory self)"},
-	 { (char *)"MinimizerFactory_swigregister", MinimizerFactory_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_MinimizerOptions", _wrap_new_MinimizerOptions, METH_VARARGS, (char *)"\n"
 		"new_MinimizerOptions() -> MinimizerOptions\n"
 		"\n"
@@ -31869,6 +31844,25 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"MinimizerOptions_swigregister", MinimizerOptions_swigregister, METH_VARARGS, NULL},
+	 { (char *)"MinimizerFactory_printCatalogue", _wrap_MinimizerFactory_printCatalogue, METH_VARARGS, (char *)"MinimizerFactory_printCatalogue()"},
+	 { (char *)"MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, (char *)"\n"
+		"createMinimizer(std::string const & minimizer, std::string const & algorithm, std::string const & options) -> IMinimizer\n"
+		"createMinimizer(std::string const & minimizer, std::string const & algorithm) -> IMinimizer\n"
+		"createMinimizer(std::string const & minimizer) -> IMinimizer\n"
+		"MinimizerFactory_createMinimizer(IMinimizer minimizer) -> IMinimizer\n"
+		""},
+	 { (char *)"new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_VARARGS, (char *)"\n"
+		"new_MinimizerFactory() -> MinimizerFactory\n"
+		"\n"
+		"\n"
+		"\n"
+		"Factory to create minimizers.\n"
+		"\n"
+		"C++ includes: MinimizerFactory.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_MinimizerFactory", _wrap_delete_MinimizerFactory, METH_VARARGS, (char *)"delete_MinimizerFactory(MinimizerFactory self)"},
+	 { (char *)"MinimizerFactory_swigregister", MinimizerFactory_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_FitStrategyAdjustMinimizer", _wrap_new_FitStrategyAdjustMinimizer, METH_VARARGS, (char *)"\n"
 		"FitStrategyAdjustMinimizer()\n"
 		"FitStrategyAdjustMinimizer(std::string const & minimizer_name, std::string const & algorithm_name, std::string const & minimizer_options)\n"
@@ -31936,10 +31930,6 @@ static void *_p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer(void *x
 static void *_p_ChiSquaredModuleTo_p_IChiSquaredModule(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IChiSquaredModule *)  ((ChiSquaredModule *) x));
 }
-static void *_p_std__shared_ptrT_IParameterizedShared_tTo_p_std__shared_ptrT_INamedShared_t(void *x, int *newmemory) {
-    *newmemory = SWIG_CAST_NEW_MEMORY;
-    return (void *) new std::shared_ptr< INamedShared >(*(std::shared_ptr< IParameterizedShared > *)x);
-}
 static void *_p_std__shared_ptrT_IFitObserver_tTo_p_std__shared_ptrT_IObserver_t(void *x, int *newmemory) {
     *newmemory = SWIG_CAST_NEW_MEMORY;
     return (void *) new std::shared_ptr< IObserver >(*(std::shared_ptr< IFitObserver > *)x);
@@ -32096,14 +32086,8 @@ static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocat
 static swig_type_info _swigt__p_std__allocatorT_unsigned_long_t = {"_p_std__allocatorT_unsigned_long_t", "std::vector< unsigned long >::allocator_type *|std::allocator< unsigned long > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_IFitObserver_t = {"_p_std__shared_ptrT_IFitObserver_t", "std::shared_ptr< IFitObserver > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_INamedShared_t = {"_p_std__shared_ptrT_INamedShared_t", "std::shared_ptr< INamedShared > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t = {"_p_std__shared_ptrT_INamedTemplateT_IShareable_t_t", "std::shared_ptr< INamedTemplate< IShareable > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_IObserver_t = {"_p_std__shared_ptrT_IObserver_t", "std::shared_ptr< IObserver > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_IParameterizedShared_t = {"_p_std__shared_ptrT_IParameterizedShared_t", "std::shared_ptr< IParameterizedShared > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t = {"_p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t", "std::shared_ptr< IParameterizedTemplate< IShareable > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_ISampleBuilder_t = {"_p_std__shared_ptrT_ISampleBuilder_t", "std::shared_ptr< ISampleBuilder > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t = {"_p_std__shared_ptrT_LayerRTCoefficients_t_t", "std::shared_ptr< LayerRTCoefficients_t > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__shared_ptrT_ProgressHandler_t_t = {"_p_std__shared_ptrT_ProgressHandler_t_t", "std::shared_ptr< ProgressHandler_t > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__string = {"_p_std__string", "std::string *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t = {"_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t", "std::vector< FitElement,std::allocator< FitElement > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator = {"_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator", "std::vector< FitElement,std::allocator< FitElement > >::const_iterator *", 0, 0, (void*)0, 0};
@@ -32186,14 +32170,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__allocatorT_unsigned_long_t,
   &_swigt__p_std__invalid_argument,
   &_swigt__p_std__shared_ptrT_IFitObserver_t,
-  &_swigt__p_std__shared_ptrT_INamedShared_t,
-  &_swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t,
   &_swigt__p_std__shared_ptrT_IObserver_t,
-  &_swigt__p_std__shared_ptrT_IParameterizedShared_t,
-  &_swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t,
   &_swigt__p_std__shared_ptrT_ISampleBuilder_t,
-  &_swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t,
-  &_swigt__p_std__shared_ptrT_ProgressHandler_t_t,
   &_swigt__p_std__string,
   &_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,
   &_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,
@@ -32276,14 +32254,8 @@ static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocat
 static swig_cast_info _swigc__p_std__allocatorT_unsigned_long_t[] = {  {&_swigt__p_std__allocatorT_unsigned_long_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_IFitObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IFitObserver_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_INamedShared_t[] = {  {&_swigt__p_std__shared_ptrT_INamedShared_t, 0, 0, 0},  {&_swigt__p_std__shared_ptrT_IParameterizedShared_t, _p_std__shared_ptrT_IParameterizedShared_tTo_p_std__shared_ptrT_INamedShared_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t[] = {  {&_swigt__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_IObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IObserver_t, 0, 0, 0},  {&_swigt__p_std__shared_ptrT_IFitObserver_t, _p_std__shared_ptrT_IFitObserver_tTo_p_std__shared_ptrT_IObserver_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_IParameterizedShared_t[] = {  {&_swigt__p_std__shared_ptrT_IParameterizedShared_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t[] = {  {&_swigt__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_ISampleBuilder_t[] = {  {&_swigt__p_std__shared_ptrT_ISampleBuilder_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_LayerRTCoefficients_t_t[] = {  {&_swigt__p_std__shared_ptrT_LayerRTCoefficients_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__shared_ptrT_ProgressHandler_t_t[] = {  {&_swigt__p_std__shared_ptrT_ProgressHandler_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__string[] = {  {&_swigt__p_std__string, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t[] = {  {&_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator[] = {  {&_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator, 0, 0, 0},{0, 0, 0, 0}};
@@ -32366,14 +32338,8 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__allocatorT_unsigned_long_t,
   _swigc__p_std__invalid_argument,
   _swigc__p_std__shared_ptrT_IFitObserver_t,
-  _swigc__p_std__shared_ptrT_INamedShared_t,
-  _swigc__p_std__shared_ptrT_INamedTemplateT_IShareable_t_t,
   _swigc__p_std__shared_ptrT_IObserver_t,
-  _swigc__p_std__shared_ptrT_IParameterizedShared_t,
-  _swigc__p_std__shared_ptrT_IParameterizedTemplateT_IShareable_t_t,
   _swigc__p_std__shared_ptrT_ISampleBuilder_t,
-  _swigc__p_std__shared_ptrT_LayerRTCoefficients_t_t,
-  _swigc__p_std__shared_ptrT_ProgressHandler_t_t,
   _swigc__p_std__string,
   _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,
   _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,
diff --git a/Tests/PerformanceTests/customformfactor.py b/Tests/PerformanceTests/customformfactor.py
index a64a8e0cc46..fb60d879b22 100644
--- a/Tests/PerformanceTests/customformfactor.py
+++ b/Tests/PerformanceTests/customformfactor.py
@@ -28,7 +28,7 @@ import resource
 
 from libBornAgainCore import *
 
-nrepetitions = 100
+nrepetitions = 50
 
 
 
@@ -126,9 +126,9 @@ def run_test():
     real_time = (end_time_real - start_time_real)
     user_time = (end_time_real - start_time_real)
 
-    print("time after %d repetitions:" % nrepetitions)
+    print("\ntime after %d repetitions:" % nrepetitions)
     print("real time: %.4f" % real_time)
-    print("user time: %.4f" % user_time)
+    print("user time: %.4f\n" % user_time)
 
 
 
diff --git a/dev-tools/swig/extends.i b/dev-tools/swig/extends.i
index 8083ce41f2f..e8d602d174d 100644
--- a/dev-tools/swig/extends.i
+++ b/dev-tools/swig/extends.i
@@ -107,6 +107,10 @@ namespace Geometry {
       {
       return (*($self)).registerParameter(name, (double*)parpointer, limits);
       }*/
+    virtual bool setParameterValue(const std::string &name, double value)
+    {
+        return dynamic_cast<IParameterized*>($self)->setParameterValue(name, value);
+    }
 };
 
 /* %extend ISampleBuilder {
diff --git a/dev-tools/swig/libBornAgainCore.i b/dev-tools/swig/libBornAgainCore.i
index e6913b25d9d..e4e2b449772 100644
--- a/dev-tools/swig/libBornAgainCore.i
+++ b/dev-tools/swig/libBornAgainCore.i
@@ -147,7 +147,6 @@
 #include "IMaterial.h"
 #include "IObserver.h"
 #include "IParameterized.h"
-#include "IParameterizedShared.h"
 #include "IParticle.h"
 #include "IResolutionFunction2D.h"
 #include "Rotations.h"
@@ -225,7 +224,6 @@
 %include "ICloneable.h"
 
 %include "INamed.h"
-%include "INamedShared.h"
 
 
 //typedef INamedTemplate<void> INamed;
@@ -234,7 +232,6 @@
  //%include "INamedShared.h"
 
 %include "IParameterized.h"
-%include "IParameterizedShared.h"
 
 
 
diff --git a/dev-tools/swig/libBornAgainFit.i b/dev-tools/swig/libBornAgainFit.i
index 5b45a5d566f..c3057c3d544 100644
--- a/dev-tools/swig/libBornAgainFit.i
+++ b/dev-tools/swig/libBornAgainFit.i
@@ -173,13 +173,11 @@ import_array();
 %import(module="libBornAgainCore") "AttLimits.h"
 %import(module="libBornAgainCore") "ICloneable.h"
 %import(module="libBornAgainCore") "INamed.h"
-%import(module="libBornAgainCore") "INamedShared.h"
 %import(module="libBornAgainCore") "IParameterized.h"
-%import(module="libBornAgainCore") "IParameterizedShared.h"
 %import(module="libBornAgainCore") "IObserver.h"
 
 
-
+%include "IMinimizer.h"
 
 %include "IChiSquaredModule.h"
 %include "IFitObserver.h"
@@ -189,8 +187,6 @@ import_array();
 
 %include "ISquaredFunction.h"
 
-%include "IMinimizer.h"
-
 
 %include "ChiSquaredModule.h"
 %include "FitObject.h"
@@ -201,12 +197,11 @@ import_array();
 %include "FitSuiteObjects.h"
 %include "FitSuiteParameters.h"
 
-
-
-
 %include "MathFunctions.h"
-%include "MinimizerFactory.h"
+
 %include "MinimizerOptions.h"
+%include "MinimizerFactory.h"
+
 
 %include "FitStrategyAdjustMinimizer.h"
 
diff --git a/dev-tools/swig/shared_pointers.i b/dev-tools/swig/shared_pointers.i
index be1683596a6..f5e70331083 100644
--- a/dev-tools/swig/shared_pointers.i
+++ b/dev-tools/swig/shared_pointers.i
@@ -1,8 +1,10 @@
 %shared_ptr(ISampleBuilder)
-%shared_ptr(IParameterizedShared)
-%shared_ptr(IParameterizedTemplate<IShareable>)
-%shared_ptr(INamedShared)
-%shared_ptr(INamedTemplate<IShareable>)
+%shared_ptr(IObserver)
+%shared_ptr(IFitObserver)
+
+ /*
+%shared_ptr(IParameterized)
+%shared_ptr(INamed)
 %shared_ptr(LayerRTCoefficients_t)
 %shared_ptr(ProgressHandler_t)
 %shared_ptr(IObserver)
@@ -13,3 +15,149 @@
 %shared_ptr(ProgressHandler_t)
 %shared_ptr(IObserver)
 %shared_ptr(IFitObserver)
+
+ // added becasue the smart-pointer property propagates
+%shared_ptr(IParameterized)
+%shared_ptr(IFitStrategy)
+%shared_ptr(FitStrategyDefault)
+%shared_ptr(IIntensityNormalizer)
+%shared_ptr(IntensityNormalizer)
+%shared_ptr(IntensityScaleAndShiftNormalizer)
+%shared_ptr(FitObject)
+%shared_ptr(FitParameter)
+%shared_ptr(FitSuiteObjects)
+%shared_ptr(FitStrategyAdjustMinimizer)
+
+%shared_ptr(IParameterized)
+%shared_ptr(Beam)
+%shared_ptr(ISample)
+%shared_ptr(IParameterized)
+%shared_ptr(ICompositeSample)
+%shared_ptr(IClusteredParticles)
+%shared_ptr(Crystal)
+%shared_ptr(IDistribution1D)
+%shared_ptr(DistributionGate)
+%shared_ptr(DistributionLorentz)
+%shared_ptr(DistributionGaussian)
+%shared_ptr(DistributionLogNormal)
+%shared_ptr(DistributionCosine)
+%shared_ptr(IFTDecayFunction1D)
+%shared_ptr(FTDecayFunction1DCauchy)
+%shared_ptr(FTDecayFunction1DGauss)
+%shared_ptr(FTDecayFunction1DTriangle)
+%shared_ptr(FTDecayFunction1DVoigt)
+%shared_ptr(IFTDecayFunction2D)
+%shared_ptr(FTDecayFunction2DCauchy)
+%shared_ptr(FTDecayFunction2DGauss)
+%shared_ptr(FTDecayFunction2DVoigt)
+%shared_ptr(IFTDistribution1D)
+%shared_ptr(FTDistribution1DCauchy)
+%shared_ptr(FTDistribution1DGauss)
+%shared_ptr(FTDistribution1DGate)
+%shared_ptr(FTDistribution1DTriangle)
+%shared_ptr(FTDistribution1DCosine)
+%shared_ptr(FTDistribution1DVoigt)
+%shared_ptr(IFTDistribution2D)
+%shared_ptr(FTDistribution2DCauchy)
+%shared_ptr(FTDistribution2DGauss)
+%shared_ptr(FTDistribution2DGate)
+%shared_ptr(FTDistribution2DCone)
+%shared_ptr(FTDistribution2DVoigt)
+%shared_ptr(IFormFactor)
+%shared_ptr(IFormFactorBorn)
+%shared_ptr(IFormFactorDecorator)
+%shared_ptr(FormFactorAnisoPyramid)
+%shared_ptr(FormFactorBox)
+%shared_ptr(FormFactorCone)
+%shared_ptr(FormFactorCone6)
+%shared_ptr(FormFactorCrystal)
+%shared_ptr(FormFactorCuboctahedron)
+%shared_ptr(FormFactorCylinder)
+%shared_ptr(FormFactorDecoratorDebyeWaller)
+%shared_ptr(FormFactorEllipsoidalCylinder)
+%shared_ptr(FormFactorFullSphere)
+%shared_ptr(FormFactorFullSpheroid)
+%shared_ptr(FormFactorGauss)
+%shared_ptr(FormFactorHemiEllipsoid)
+%shared_ptr(FormFactorLongBoxGauss)
+%shared_ptr(FormFactorLongBoxLorentz)
+%shared_ptr(FormFactorLorentz)
+%shared_ptr(FormFactorPrism3)
+%shared_ptr(FormFactorPrism6)
+%shared_ptr(FormFactorPyramid)
+%shared_ptr(FormFactorRipple1)
+%shared_ptr(FormFactorRipple2)
+%shared_ptr(FormFactorLongRipple2Gauss)
+%shared_ptr(FormFactorLongRipple2Lorentz)
+%shared_ptr(FormFactorSphereGaussianRadius)
+%shared_ptr(FormFactorSphereLogNormalRadius)
+%shared_ptr(FormFactorSphereUniformRadius)
+%shared_ptr(FormFactorTetrahedron)
+%shared_ptr(FormFactorTrivial)
+%shared_ptr(FormFactorTruncatedCube)
+%shared_ptr(FormFactorTruncatedSphere)
+%shared_ptr(FormFactorTruncatedSpheroid)
+%shared_ptr(FormFactorWeighted)
+%shared_ptr(Simulation)
+%shared_ptr(GISASSimulation)
+%shared_ptr(IMaterial)
+%shared_ptr(HomogeneousMaterial)
+%shared_ptr(HomogeneousMagneticMaterial)
+%shared_ptr(IDetector2D)
+%shared_ptr(IDetectorResolution)
+%shared_ptr(IInterferenceFunction)
+%shared_ptr(ILayout)
+%shared_ptr(IAbstractParticle)
+%shared_ptr(IParticle)
+%shared_ptr(IResolutionFunction2D)
+%shared_ptr(IRotation)
+%shared_ptr(RotationX)
+%shared_ptr(RotationY)
+%shared_ptr(RotationZ)
+%shared_ptr(RotationEuler)
+%shared_ptr(Instrument)
+%shared_ptr(InterferenceFunction1DLattice)
+%shared_ptr(InterferenceFunctionRadialParaCrystal)
+%shared_ptr(InterferenceFunction2DLattice)
+%shared_ptr(InterferenceFunction2DParaCrystal)
+%shared_ptr(InterferenceFunctionNone)
+%shared_ptr(SphericalDetector)
+%shared_ptr(IsGISAXSDetector)
+%shared_ptr(Layer)
+%shared_ptr(IRoughness)
+%shared_ptr(LayerRoughness)
+%shared_ptr(MesoCrystal)
+%shared_ptr(MultiLayer)
+%shared_ptr(OffSpecSimulation)
+%shared_ptr(ParameterDistribution)
+%shared_ptr(Particle)
+%shared_ptr(ParticleComposition)
+%shared_ptr(ParticleCoreShell)
+%shared_ptr(ParticleDistribution)
+%shared_ptr(ParticleLayout)
+%shared_ptr(RectangularDetector)
+%shared_ptr(ResolutionFunction2DGaussian)
+%shared_ptr(SpecularSimulation)
+%shared_ptr(ICloneable)
+%shared_ptr(IChiSquaredModule)
+%shared_ptr(ChiSquaredModule)
+%shared_ptr(AttLimits)
+
+%shared_ptr(IShape2D)
+%shared_ptr(Ellipse)
+%shared_ptr(Line)
+%shared_ptr(VerticalLine)
+%shared_ptr(HorizontalLine)
+%shared_ptr(ParameterPool)
+%shared_ptr(Polygon)
+%shared_ptr(Rectangle)
+
+%shared_ptr(Geometry::IShape2D)
+%shared_ptr(Geometry::Ellipse)
+%shared_ptr(Geometry::Line)
+%shared_ptr(Geometry::VerticalLine)
+%shared_ptr(Geometry::HorizontalLine)
+%shared_ptr(Geometry::ParameterPool)
+%shared_ptr(Geometry::Polygon)
+%shared_ptr(Geometry::Rectangle)
+/**/
-- 
GitLab