Skip to content

Commit

Permalink
Re #4158. Fixed tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mantid-roman committed Apr 2, 2012
1 parent f97ef8f commit 59187a3
Show file tree
Hide file tree
Showing 36 changed files with 272 additions and 161 deletions.
1 change: 0 additions & 1 deletion Code/Mantid/Framework/API/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ set ( SRC_FILES
)

set ( SRC_UNITY_IGNORE_FILES src/CompositeFunction.cpp
src/CompositeFunctionMW.cpp
src/IDataFileChecker.cpp
src/MatrixWorkspace.cpp
src/IEventWorkspace.cpp
Expand Down
47 changes: 40 additions & 7 deletions Code/Mantid/Framework/API/inc/MantidAPI/FunctionDomain1D.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,54 @@ namespace API
class MANTID_API_DLL FunctionDomain1D: public FunctionDomain
{
public:
FunctionDomain1D(const double x);
FunctionDomain1D(const double startX, const double endX, const size_t n);
FunctionDomain1D(const std::vector<double>& xvalues);
FunctionDomain1D(std::vector<double>::const_iterator from, std::vector<double>::const_iterator to);
/// Return the number of arguments in the domain
virtual size_t size() const {return m_X.size();}
virtual size_t size() const {return m_n;}
/// Get an x value.
/// @param i :: Index
double operator[](size_t i) const {return m_X.at(i);}
double operator[](size_t i) const {return m_data[i];}
/// Get a pointer to i-th value
const double* getPointerAt(size_t i) const {return &m_X.at(i);}
const double* getPointerAt(size_t i) const {return m_data + i;}
protected:
/// Protected constructor, shouldn't be created directly. Use FunctionDomain1DView instead.
FunctionDomain1D(const double* x, size_t n):m_data(x),m_n(n){}
/// Reset the pointer and size of the domain
void reset(const double* x, size_t n)
{
m_data = x;
m_n = n;
}
private:
FunctionDomain1D(const FunctionDomain1D& right);
FunctionDomain1D& operator=(const FunctionDomain1D&);
const double *m_data;///< pointer to the start of the domain data
size_t m_n; ///< size of the data
};

class MANTID_API_DLL FunctionDomain1DVector: public FunctionDomain1D
{
public:
FunctionDomain1DVector(const double x);
FunctionDomain1DVector(const double startX, const double endX, const size_t n);
FunctionDomain1DVector(const std::vector<double>& xvalues);
FunctionDomain1DVector(std::vector<double>::const_iterator from, std::vector<double>::const_iterator to);
FunctionDomain1DVector(const FunctionDomain1DVector&);
FunctionDomain1DVector& operator=(const FunctionDomain1DVector&);
protected:
std::vector<double> m_X; ///< vector of function arguments
};

/**
* 1D domain - a wrapper around an array of doubles.
*/
class MANTID_API_DLL FunctionDomain1DView: public FunctionDomain1D
{
public:
FunctionDomain1DView(const double* x, size_t n):FunctionDomain1D(x,n){}
private:
FunctionDomain1DView(const FunctionDomain1DView&);
FunctionDomain1DView& operator=(const FunctionDomain1DView&);
};

/// typedef for a shared pointer to a FunctionDomain1D
typedef boost::shared_ptr<FunctionDomain1D> FunctionDomain1D_sptr;
typedef boost::shared_ptr<const FunctionDomain1D> FunctionDomain1D_const_sptr;
Expand Down
41 changes: 37 additions & 4 deletions Code/Mantid/Framework/API/src/FunctionDomain1D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,30 @@ namespace API
* Create a domain form a vector.
* @param xvalues :: Points
*/
FunctionDomain1D::FunctionDomain1D(const std::vector<double>& xvalues)
FunctionDomain1DVector::FunctionDomain1DVector(const std::vector<double>& xvalues):
FunctionDomain1D(NULL,0)
{
if (xvalues.empty())
{
throw std::invalid_argument("FunctionDomain1D cannot have zero size.");
}
m_X.assign(xvalues.begin(),xvalues.end());
reset(&m_X[0],m_X.size());
}

FunctionDomain1D::FunctionDomain1D(std::vector<double>::const_iterator from, std::vector<double>::const_iterator to)
FunctionDomain1DVector::FunctionDomain1DVector(std::vector<double>::const_iterator from, std::vector<double>::const_iterator to):
FunctionDomain1D(NULL,0)
{
if (from == to)
{
throw std::invalid_argument("FunctionDomain1D cannot have zero size.");
}
m_X.assign(from,to);
reset(&m_X[0],m_X.size());
}

FunctionDomain1D::FunctionDomain1D(const double startX, const double endX, const size_t n)
FunctionDomain1DVector::FunctionDomain1DVector(const double startX, const double endX, const size_t n):
FunctionDomain1D(NULL,0)
{
if (n == 0)
{
Expand All @@ -50,12 +55,40 @@ FunctionDomain1D::FunctionDomain1D(const double startX, const double endX, const
m_X[i] = startX + dx * i;
}
}
reset(&m_X[0],m_X.size());
}

FunctionDomain1D::FunctionDomain1D(const double x)
FunctionDomain1DVector::FunctionDomain1DVector(const double x):
FunctionDomain1D(NULL,0)
{
m_X.resize(1);
m_X[0] = x;
reset(&m_X[0],m_X.size());
}

/**
* Copy constructor.
* @param right :: The other domain.
*/
FunctionDomain1DVector::FunctionDomain1DVector(const FunctionDomain1DVector& right):
FunctionDomain1D(NULL,0)
{
*this = right;
}

/**
* Copy assignment operator.
* @param right :: The other domain.
*/
FunctionDomain1DVector& FunctionDomain1DVector::operator=(const FunctionDomain1DVector& right)
{
if (right.m_X.empty())
{
throw std::invalid_argument("FunctionDomain1D cannot have zero size.");
}
m_X.assign(right.m_X.begin(),right.m_X.end());
reset(&m_X[0],m_X.size());
return *this;
}

} // namespace API
Expand Down
6 changes: 4 additions & 2 deletions Code/Mantid/Framework/API/src/IFunction1D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ void IFunction1D::functionDeriv(const FunctionDomain& domain, Jacobian& jacobian
with respect to the fit parameters. If this method is not reimplemented the derivative free simplex minimization
algorithm is used.
*/
void IFunction1D::functionDeriv1D(Jacobian*, const double*, const size_t)
void IFunction1D::functionDeriv1D(Jacobian* jacobian, const double* xValues, const size_t nData)
{
throw Kernel::Exception::NotImplementedError("No derivative IFunction1D provided");
//throw Kernel::Exception::NotImplementedError("No derivative IFunction1D provided");
FunctionDomain1DView domain(xValues,nData);
this->calNumericalDeriv(domain,*jacobian);
}

} // namespace API
Expand Down
2 changes: 1 addition & 1 deletion Code/Mantid/Framework/API/test/FunctionDomainTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class FunctionDomainTest : public CxxTest::TestSuite
{
x[i] = 1.0 + 0.1 * i;
}
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
TS_ASSERT_EQUALS(domain.size(), x.size());
for(size_t i = 0; i < x.size(); ++i)
{
Expand Down
10 changes: 5 additions & 5 deletions Code/Mantid/Framework/API/test/FunctionValuesTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class FunctionValuesTest : public CxxTest::TestSuite

void testCalculatedValues()
{
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
FunctionValues values(domain);
TS_ASSERT_EQUALS(values.size(),domain.size());
for(size_t i = 0; i < values.size(); ++i)
Expand All @@ -42,7 +42,7 @@ class FunctionValuesTest : public CxxTest::TestSuite

void testPlusOperator()
{
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
FunctionValues values1(domain);
FunctionValues values2(domain);

Expand All @@ -60,15 +60,15 @@ class FunctionValuesTest : public CxxTest::TestSuite
}

std::vector<double> x3(9);
FunctionDomain1D domain3(x3);
FunctionDomain1DVector domain3(x3);
FunctionValues values3(domain3);

TS_ASSERT_THROWS(values3 += values1,std::runtime_error);
}

void testFitData()
{
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
FunctionValues values1(domain);

TS_ASSERT_THROWS(values1.getFitData(0),std::runtime_error);
Expand Down Expand Up @@ -100,7 +100,7 @@ class FunctionValuesTest : public CxxTest::TestSuite

void testFitWeights()
{
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
FunctionValues values1(domain);

values1.setFitWeight(5,10.1);
Expand Down
2 changes: 1 addition & 1 deletion Code/Mantid/Framework/API/test/IFunction1DTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class IFunction1DTest : public CxxTest::TestSuite
{
x[i] = 1.0 + 0.1 * i;
}
FunctionDomain1D domain(x);
FunctionDomain1DVector domain(x);
FunctionValues values(domain);
function.function(domain,values);
for(size_t i = 0; i < domain.size(); ++i)
Expand Down
36 changes: 18 additions & 18 deletions Code/Mantid/Framework/API/test/MultiDomainFunctionTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
multi.getFunction(2)->setParameter("A",2);
multi.getFunction(2)->setParameter("B",3);

domain.addDomain(boost::make_shared<FunctionDomain1D>(0,1,9));
domain.addDomain(boost::make_shared<FunctionDomain1D>(1,2,10));
domain.addDomain(boost::make_shared<FunctionDomain1D>(2,3,11));
domain.addDomain(boost::make_shared<FunctionDomain1DVector>(0,1,9));
domain.addDomain(boost::make_shared<FunctionDomain1DVector>(1,2,10));
domain.addDomain(boost::make_shared<FunctionDomain1DVector>(2,3,11));

}

Expand All @@ -97,7 +97,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite

const double A = multi.getFunction(0)->getParameter("A");
const double B = multi.getFunction(0)->getParameter("B");
auto d = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
const FunctionDomain1D& d = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d[i]);
Expand All @@ -124,7 +124,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite

const double A = multi.getFunction(0)->getParameter("A");
const double B = multi.getFunction(0)->getParameter("B");
auto d = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
const FunctionDomain1D& d = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), 0);
Expand All @@ -150,7 +150,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite

const double A = multi.getFunction(0)->getParameter("A");
const double B = multi.getFunction(0)->getParameter("B");
auto d = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
const FunctionDomain1D& d = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), 0);
Expand All @@ -177,17 +177,17 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite

const double A = multi.getFunction(0)->getParameter("A");
const double B = multi.getFunction(0)->getParameter("B");
auto d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
const FunctionDomain1D& d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d0[i]);
}
auto d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
const FunctionDomain1D& d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
for(size_t i = 9; i < 19; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d1[i-9]);
}
auto d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
const FunctionDomain1D& d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
for(size_t i = 19; i < 30; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d2[i-19]);
Expand Down Expand Up @@ -216,23 +216,23 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
double B = multi.getFunction(0)->getParameter("B") +
multi.getFunction(1)->getParameter("B") +
multi.getFunction(2)->getParameter("B");
auto d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
const FunctionDomain1D& d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d0[i]);
}

A = multi.getFunction(1)->getParameter("A");
B = multi.getFunction(1)->getParameter("B");
auto d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
const FunctionDomain1D& d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
for(size_t i = 9; i < 19; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d1[i-9]);
}

A = multi.getFunction(2)->getParameter("A");
B = multi.getFunction(2)->getParameter("B");
auto d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
const FunctionDomain1D& d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
for(size_t i = 19; i < 30; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d2[i-19]);
Expand All @@ -256,23 +256,23 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
double B = multi.getFunction(0)->getParameter("B") +
multi.getFunction(1)->getParameter("B") +
multi.getFunction(2)->getParameter("B");
auto d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
const FunctionDomain1D& d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
for(size_t i = 0; i < 9; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d0[i]);
}

A = multi.getFunction(1)->getParameter("A");
B = multi.getFunction(1)->getParameter("B");
auto d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
const FunctionDomain1D& d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
for(size_t i = 9; i < 19; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d1[i-9]);
}

A = multi.getFunction(2)->getParameter("A");
B = multi.getFunction(2)->getParameter("B");
auto d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
const FunctionDomain1D& d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
for(size_t i = 19; i < 30; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d2[i-19]);
Expand All @@ -298,7 +298,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
double B = mfun->getFunction(0)->getParameter("B") +
mfun->getFunction(1)->getParameter("B") +
mfun->getFunction(2)->getParameter("B");
auto d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
const FunctionDomain1D& d0 = static_cast<const FunctionDomain1D&>(domain.getDomain(0));
double checksum = 0;
for(size_t i = 0; i < 9; ++i)
{
Expand All @@ -310,7 +310,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
checksum = 0;
A = mfun->getFunction(1)->getParameter("A");
B = mfun->getFunction(1)->getParameter("B");
auto d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
const FunctionDomain1D& d1 = static_cast<const FunctionDomain1D&>(domain.getDomain(1));
for(size_t i = 9; i < 19; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d1[i-9]);
Expand All @@ -321,7 +321,7 @@ class MultiDomainFunctionTest : public CxxTest::TestSuite
checksum = 0;
A = mfun->getFunction(2)->getParameter("A");
B = mfun->getFunction(2)->getParameter("B");
auto d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
const FunctionDomain1D& d2 = static_cast<const FunctionDomain1D&>(domain.getDomain(2));
for(size_t i = 19; i < 30; ++i)
{
TS_ASSERT_EQUALS(values.getCalculated(i), A + B * d2[i-19]);
Expand Down

0 comments on commit 59187a3

Please sign in to comment.