Skip to content
Snippets Groups Projects
Commit c57fbb33 authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

Methods in FitObjective to access fit results

parent b2f5bbd2
No related branches found
No related tags found
No related merge requests found
......@@ -112,6 +112,21 @@ size_t FitObjective::numberOfIterations() const
return m_iteration_count;
}
SimulationResult FitObjective::simulationResult(size_t i_item) const
{
return m_fit_objects[check_index(i_item)]->simulationResult();
}
SimulationResult FitObjective::experimentalData(size_t i_item) const
{
return m_fit_objects[check_index(i_item)]->experimentalData();
}
SimulationResult FitObjective::relativeDifference(size_t i_item) const
{
return m_fit_objects[check_index(i_item)]->relativeDifference();
}
void FitObjective::run_simulations(const Fit::Parameters& params)
{
if (m_fit_objects.empty())
......@@ -132,3 +147,10 @@ double FitObjective::residual(double a, double b, double weight) const
{
return m_chi2_module->residual(a, b, weight);
}
size_t FitObjective::check_index(size_t index) const
{
if (index >= m_fit_objects.size())
throw std::runtime_error("FitObjective::check_index() -> Index outside of range");
return index;
}
......@@ -65,9 +65,22 @@ public:
//! Returns current number of simulation runs.
size_t numberOfIterations() const;
//! Returns simulation result.
//! @param i_item: the index of fit pair
SimulationResult simulationResult(size_t i_item = 0) const;
//! Returns experimental data.
//! @param i_item: the index of fit pair
SimulationResult experimentalData(size_t i_item = 0) const;
//! Returns relative difference between simulation and experimental data.
//! @param i_item: the index of fit pair
SimulationResult relativeDifference(size_t i_item = 0) const;
private:
void run_simulations(const Fit::Parameters& params);
double residual(double a, double b, double weight) const;
size_t check_index(size_t index) const;
std::vector<double> m_experimental_array;
std::vector<double> m_simulation_array;
......
......@@ -15,6 +15,8 @@
#include "SimDataPair.h"
#include "Simulation.h"
#include "IntensityDataFunctions.h"
#include "UnitConverterUtils.h"
#include "Numeric.h"
static_assert(std::is_copy_constructible<SimDataPair>::value == false,
"SimDataPair should not be copy constructable");
......@@ -68,6 +70,23 @@ SimulationResult SimDataPair::experimentalData() const
return m_experimental_data;
}
//! Returns relative difference between simulation and experimental data.
SimulationResult SimDataPair::relativeDifference() const
{
auto converter = UnitConverterUtils::createConverter(*m_simulation);
auto roi_data = UnitConverterUtils::createOutputData(*converter.get(), converter->defaultUnits());
auto detector = m_simulation->getInstrument().getDetector();
detector->iterate([&](IDetector::const_iterator it){
const size_t index = it.roiIndex();
(*roi_data)[index] = Numeric::get_relative_difference(
m_simulation_result[index], m_experimental_data[index]);
});
return SimulationResult(*roi_data, *converter);
}
SimDataPair::~SimDataPair() = default;
void SimDataPair::runSimulation(const Fit::Parameters& params)
......
......@@ -39,6 +39,8 @@ public:
SimulationResult experimentalData() const;
SimulationResult relativeDifference() const;
void runSimulation(const Fit::Parameters& params);
std::vector<double> experimental_array() const;
......
......@@ -7609,6 +7609,35 @@ class FitObjective(_object):
return _libBornAgainCore.FitObjective_simulation_array(self)
 
 
def numberOfIterations(self):
"""numberOfIterations(FitObjective self) -> size_t"""
return _libBornAgainCore.FitObjective_numberOfIterations(self)
def simulationResult(self, i_item=0):
"""
simulationResult(FitObjective self, size_t i_item=0) -> SimulationResult
simulationResult(FitObjective self) -> SimulationResult
"""
return _libBornAgainCore.FitObjective_simulationResult(self, i_item)
def experimentalData(self, i_item=0):
"""
experimentalData(FitObjective self, size_t i_item=0) -> SimulationResult
experimentalData(FitObjective self) -> SimulationResult
"""
return _libBornAgainCore.FitObjective_experimentalData(self, i_item)
def relativeDifference(self, i_item=0):
"""
relativeDifference(FitObjective self, size_t i_item=0) -> SimulationResult
relativeDifference(FitObjective self) -> SimulationResult
"""
return _libBornAgainCore.FitObjective_relativeDifference(self, i_item)
def addSimulationAndData(self, callback, data, weight):
self.wrp = SimulationBuilderWrapper(callback)
return self.addSimulationAndData_cpp(self.wrp, data, weight)
......
......@@ -50946,6 +50946,325 @@ fail:
}
 
 
SWIGINTERN PyObject *_wrap_FitObjective_numberOfIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
size_t result;
if (!PyArg_ParseTuple(args,(char *)"O:FitObjective_numberOfIterations",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_numberOfIterations" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
result = ((FitObjective const *)arg1)->numberOfIterations();
resultobj = SWIG_From_size_t(static_cast< size_t >(result));
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_simulationResult__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
size_t arg2 ;
void *argp1 = 0 ;
int res1 = 0 ;
size_t val2 ;
int ecode2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"OO:FitObjective_simulationResult",&obj0,&obj1)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_simulationResult" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
ecode2 = SWIG_AsVal_size_t(obj1, &val2);
if (!SWIG_IsOK(ecode2)) {
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitObjective_simulationResult" "', argument " "2"" of type '" "size_t""'");
}
arg2 = static_cast< size_t >(val2);
result = ((FitObjective const *)arg1)->simulationResult(arg2);
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_simulationResult__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"O:FitObjective_simulationResult",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_simulationResult" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
result = ((FitObjective const *)arg1)->simulationResult();
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_simulationResult(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;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
return _wrap_FitObjective_simulationResult__SWIG_1(self, args);
}
}
if (argc == 2) {
int _v;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
{
int res = SWIG_AsVal_size_t(argv[1], NULL);
_v = SWIG_CheckState(res);
}
if (_v) {
return _wrap_FitObjective_simulationResult__SWIG_0(self, args);
}
}
}
fail:
SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitObjective_simulationResult'.\n"
" Possible C/C++ prototypes are:\n"
" FitObjective::simulationResult(size_t) const\n"
" FitObjective::simulationResult() const\n");
return 0;
}
SWIGINTERN PyObject *_wrap_FitObjective_experimentalData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
size_t arg2 ;
void *argp1 = 0 ;
int res1 = 0 ;
size_t val2 ;
int ecode2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"OO:FitObjective_experimentalData",&obj0,&obj1)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_experimentalData" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
ecode2 = SWIG_AsVal_size_t(obj1, &val2);
if (!SWIG_IsOK(ecode2)) {
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitObjective_experimentalData" "', argument " "2"" of type '" "size_t""'");
}
arg2 = static_cast< size_t >(val2);
result = ((FitObjective const *)arg1)->experimentalData(arg2);
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_experimentalData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"O:FitObjective_experimentalData",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_experimentalData" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
result = ((FitObjective const *)arg1)->experimentalData();
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_experimentalData(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;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
return _wrap_FitObjective_experimentalData__SWIG_1(self, args);
}
}
if (argc == 2) {
int _v;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
{
int res = SWIG_AsVal_size_t(argv[1], NULL);
_v = SWIG_CheckState(res);
}
if (_v) {
return _wrap_FitObjective_experimentalData__SWIG_0(self, args);
}
}
}
fail:
SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitObjective_experimentalData'.\n"
" Possible C/C++ prototypes are:\n"
" FitObjective::experimentalData(size_t) const\n"
" FitObjective::experimentalData() const\n");
return 0;
}
SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
size_t arg2 ;
void *argp1 = 0 ;
int res1 = 0 ;
size_t val2 ;
int ecode2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"OO:FitObjective_relativeDifference",&obj0,&obj1)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_relativeDifference" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
ecode2 = SWIG_AsVal_size_t(obj1, &val2);
if (!SWIG_IsOK(ecode2)) {
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitObjective_relativeDifference" "', argument " "2"" of type '" "size_t""'");
}
arg2 = static_cast< size_t >(val2);
result = ((FitObjective const *)arg1)->relativeDifference(arg2);
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
FitObjective *arg1 = (FitObjective *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
SimulationResult result;
if (!PyArg_ParseTuple(args,(char *)"O:FitObjective_relativeDifference",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObjective, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObjective_relativeDifference" "', argument " "1"" of type '" "FitObjective const *""'");
}
arg1 = reinterpret_cast< FitObjective * >(argp1);
result = ((FitObjective const *)arg1)->relativeDifference();
resultobj = SWIG_NewPointerObj((new SimulationResult(static_cast< const SimulationResult& >(result))), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference(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;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
return _wrap_FitObjective_relativeDifference__SWIG_1(self, args);
}
}
if (argc == 2) {
int _v;
void *vptr = 0;
int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObjective, 0);
_v = SWIG_CheckState(res);
if (_v) {
{
int res = SWIG_AsVal_size_t(argv[1], NULL);
_v = SWIG_CheckState(res);
}
if (_v) {
return _wrap_FitObjective_relativeDifference__SWIG_0(self, args);
}
}
}
fail:
SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitObjective_relativeDifference'.\n"
" Possible C/C++ prototypes are:\n"
" FitObjective::relativeDifference(size_t) const\n"
" FitObjective::relativeDifference() const\n");
return 0;
}
SWIGINTERN PyObject *FitObjective_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
......@@ -124326,6 +124645,19 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"FitObjective_numberOfFitElements", _wrap_FitObjective_numberOfFitElements, METH_VARARGS, (char *)"FitObjective_numberOfFitElements(FitObjective self) -> size_t"},
{ (char *)"FitObjective_experimental_array", _wrap_FitObjective_experimental_array, METH_VARARGS, (char *)"FitObjective_experimental_array(FitObjective self) -> vdouble1d_t"},
{ (char *)"FitObjective_simulation_array", _wrap_FitObjective_simulation_array, METH_VARARGS, (char *)"FitObjective_simulation_array(FitObjective self) -> vdouble1d_t"},
{ (char *)"FitObjective_numberOfIterations", _wrap_FitObjective_numberOfIterations, METH_VARARGS, (char *)"FitObjective_numberOfIterations(FitObjective self) -> size_t"},
{ (char *)"FitObjective_simulationResult", _wrap_FitObjective_simulationResult, METH_VARARGS, (char *)"\n"
"simulationResult(size_t i_item=0) -> SimulationResult\n"
"FitObjective_simulationResult(FitObjective self) -> SimulationResult\n"
""},
{ (char *)"FitObjective_experimentalData", _wrap_FitObjective_experimentalData, METH_VARARGS, (char *)"\n"
"experimentalData(size_t i_item=0) -> SimulationResult\n"
"FitObjective_experimentalData(FitObjective self) -> SimulationResult\n"
""},
{ (char *)"FitObjective_relativeDifference", _wrap_FitObjective_relativeDifference, METH_VARARGS, (char *)"\n"
"relativeDifference(size_t i_item=0) -> SimulationResult\n"
"FitObjective_relativeDifference(FitObjective self) -> SimulationResult\n"
""},
{ (char *)"FitObjective_swigregister", FitObjective_swigregister, METH_VARARGS, NULL},
{ (char *)"StandardNormal", _wrap_StandardNormal, METH_VARARGS, (char *)"\n"
"StandardNormal(double x) -> double\n"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment