20#ifndef _NESTED_FUNCTION_H_
21#define _NESTED_FUNCTION_H_
23#include "mbsim/functions/function.h"
41 template<
typename Ret,
typename Argo,
typename Argi>
47 setOuterFunction(fo_);
48 setInnerFunction(fi_);
53 for (
auto & i : fi)
delete i;
55 int getArgSize()
const override {
56 return fi[0]->getArgSize();
58 std::pair<int, int> getRetSize()
const override {
59 return fo1?fo1->getRetSize():fo2->getRetSize();
61 Ret operator()(
const Argi &arg)
override {
62 return fo1?(*fo1)((*fi[0])(arg)):(*fo2)((*fi[0])(arg),(*fi[1])(arg));
64 typename B::DRetDArg parDer(
const Argi &arg)
override {
65 return fo1?fo1->parDer((*fi[0])(arg))*fi[0]->parDer(arg):fo2->parDer1((*fi[0])(arg),(*fi[1])(arg))*fi[0]->parDer(arg)+fo2->parDer2((*fi[0])(arg),(*fi[1])(arg))*fi[1]->parDer(arg);
67 typename B::DRetDArg parDerDirDer(
const Argi &argDir,
const Argi &arg)
override {
68 return fo1?fo1->parDerDirDer(fi[0]->parDer(arg)*argDir,(*fi[0])(arg))*fi[0]->parDer(arg)+fo1->parDer((*fi[0])(arg))*fi[0]->parDerDirDer(argDir,arg):fo2->parDer1DirDer1(fi[0]->parDer(arg)*argDir,(*fi[0])(arg),(*fi[0])(arg))*fi[0]->parDer(arg)+fo2->parDer1DirDer2(fi[1]->parDer(arg)*argDir,(*fi[0])(arg),(*fi[0])(arg))*fi[0]->parDer(arg)+fo2->parDer2DirDer1(fi[0]->parDer(arg)*argDir,(*fi[0])(arg),(*fi[0])(arg))*fi[1]->parDer(arg)+fo2->parDer2DirDer2(fi[1]->parDer(arg)*argDir,(*fi[0])(arg),(*fi[0])(arg))*fi[1]->parDer(arg)+fo2->parDer1((*fi[0])(arg),(*fi[1])(arg))*fi[0]->parDerDirDer(argDir,arg)+fo2->parDer2((*fi[0])(arg),(*fi[1])(arg))*fi[1]->parDerDirDer(argDir,arg);
70 void setOuterFunction(
Function<Ret(Argo)> *fo_) {
73 fo1->setName(
"Outer");
75 void setOuterFunction(
Function<Ret(Argo,Argo)> *fo_) {
78 fo2->setName(
"Outer");
80 void setInnerFunction(
Function<Argo(Argi)> *fi_) {
82 fi_->setName(
"Inner");
85 void addInnerFunction(
Function<Argo(Argi)> *fi_) {
87 fi_->setName(
"Inner");
90 void initializeUsingXML(xercesc::DOMElement *element)
override {
91 xercesc::DOMElement *e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"innerFunction");
94 e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"innerFunctions")->getFirstElementChild();
95 for(
int i=0; i<2; i++) {
97 e=e->getNextElementSibling();
100 e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"outerFunction");
103 else if(fi.size()==2)
107 Function<Ret(Argi)>::init(stage, config);
108 if(fo1) fo1->init(stage, config);
109 if(fo2) fo2->init(stage, config);
110 for (
auto & i : fi) i->init(stage, config);
114 Function<Ret(Argo,Argo)> *fo2{
nullptr};
115 std::vector<Function<Argo(Argi)>*> fi;
void init(Element::InitStage stage, const InitConfigSet &config) override
plots time series header
Definition: composite_function.h:106
Definition: composite_function.h:27
InitStage
The stages of the initialization.
Definition: element.h:62
Definition: function.h:53
static ContainerType * createAndInit(const xercesc::DOMElement *element)
Definition: objectfactory.h:103
namespace MBSim
Definition: bilateral_constraint.cc:30