TEST(FunctionFactoryTest, CreateCompositeFunctionTest) { std::string ini = "CompositeFunction(" "FunctionFactoryTestFunction(A=10,B=20)," "FunctionFactoryTestFunction(A=30,B=40)" ")"; IFunction_sptr fun = FunctionFactory::instance().createFitFunction(ini); EXPECT_TRUE( fun.get() != nullptr ); CompositeFunction_sptr cf = boost::dynamic_pointer_cast<CompositeFunction>(fun); EXPECT_TRUE( cf.get() != nullptr ); EXPECT_EQ( cf->nFunctions(), 2 ); auto f1 = cf->getFunction(0); auto f2 = cf->getFunction(1); EXPECT_EQ(f1->getParameter("A"),10); EXPECT_EQ(f1->getParameter("B"),20); EXPECT_EQ(f2->getParameter("A"),30); EXPECT_EQ(f2->getParameter("B"),40); EXPECT_EQ(cf->getParameter("f0.A"),10); EXPECT_EQ(cf->getParameter("f0.B"),20); EXPECT_EQ(cf->getParameter("f1.A"),30); EXPECT_EQ(cf->getParameter("f1.B"),40); std::cerr << '\n' << fun->asString(true) << '\n' << std::endl; IFunction_sptr fun1 = FunctionFactory::instance().createFitFunction(ini); EXPECT_TRUE( fun1.get() != nullptr ); cf = boost::dynamic_pointer_cast<CompositeFunction>(fun1); EXPECT_TRUE( cf.get() != nullptr ); EXPECT_EQ( cf->nFunctions(), 2 ); EXPECT_EQ(cf->getParameter("f0.A"),10); EXPECT_EQ(cf->getParameter("f0.B"),20); EXPECT_EQ(cf->getParameter("f1.A"),30); EXPECT_EQ(cf->getParameter("f1.B"),40); }
void IqtFit::constrainIntensities(CompositeFunction_sptr func) { std::string paramName = "f1.Intensity"; size_t index = func->parameterIndex(paramName); switch (m_uiForm.cbFitType->currentIndex()) { case 0: // 1 Exp case 2: // 1 Str if (!func->isFixed(index)) { func->tie(paramName, "1-f0.A0"); } else { std::string paramValue = boost::lexical_cast<std::string>(func->getParameter(paramName)); func->tie(paramName, paramValue); func->tie("f0.A0", "1-" + paramName); } break; case 1: // 2 Exp case 3: // 1 Exp & 1 Str if (!func->isFixed(index)) { func->tie(paramName, "1-f2.Intensity-f0.A0"); } else { std::string paramValue = boost::lexical_cast<std::string>(func->getParameter(paramName)); func->tie(paramName, "1-f2.Intensity-f0.A0"); func->tie(paramName, paramValue); } break; } }