Example #1
0
GPTreeNode* GPTreeADFPoint::xmlPrint() const
{
    if (NULL == mFunc)
    {
        std::ostringstream out;
        out << mInputPos;
        return new GPTreeNode(GPStrings::GPTreeADF_INPUTS, out.str());
    }
    GPTreeNode* root = new GPTreeNode(GPStrings::GPTreeADF_FUNCTION, mFunc->name);
    GPPtr<GPTreeNode> status = new GPTreeNode(GPStrings::GPTreeADF_STATUS, "");
    root->addChild(status);
    for (int j=0; j<mStatus.size(); ++j)
    {
        const IStatusType* s = mStatus[j]->type();
        std::ostringstream values;
        mStatus[j]->print(values);
        status->addChild(s->name(), values.str());
    }
    GPPtr<GPTreeNode> children = new GPTreeNode(GPStrings::GPTreeADF_CHILDREN, "");
    root->addChild(children);
    GPASSERT(mChildren.size() == mFunc->inputType.size());
    for (int i=0; i<mChildren.size(); ++i)
    {
        GPTreeADFPoint* p = (GPTreeADFPoint*)(mChildren[i]);
        children->addChild(p->xmlPrint());
    }
    return root;
}
void GPTreeADFPoint::getinput(std::vector<const IStatusType*>& tlist) const
{
    tlist.insert(tlist.end(), (mFunc.inputs).begin(), (mFunc.inputs).end());
    for (int i=0; i<mChildren.size(); ++i)
    {
        GPTreeADFPoint* p = (GPTreeADFPoint*)mChildren[i];
        p->getinput(tlist);
    }
}
GPContents* GPTreeADFPoint::compute(GPContents* input, int& cur)
{
    GPContents outsideinputs;
    GPASSERT(input->size()>=(mFunc.inputs).size());
    for (int i=0; i<(mFunc.inputs).size(); ++i)
    {
        outsideinputs.push(input->contents[cur++]);
    }
    GPContents childreninputs;
    //Get Inputs from childern point
    for (int i=0; i<mChildren.size(); ++i)
    {
        GPTreeADFPoint* p = (GPTreeADFPoint*)(mChildren[i]);
        GPASSERT(NULL!=p);
        GPContents* out = p->compute(input, cur);
        const auto& output_unit = out->contents;
        for (int j=0; j<output_unit.size(); ++j)
        {
            childreninputs.push(output_unit[j]);
        }
        delete out;
    }
    /*For function that don't know inputType, just copy all contents to totalInputs*/
    GPContents totalInputs;
    /*Merge outsideinputs and childreninputs*/
    int children_cur = 0;
    int outside_cur = 0;
    for (int i=0; i<mFunc.useChildrenInput.size(); ++i)
    {
        if (mFunc.useChildrenInput[i]>0)
        {
            totalInputs.push(childreninputs.contents[children_cur++]);
        }
        else
        {
            totalInputs.push(outsideinputs.contents[outside_cur++]);
        }
    }
    GPASSERT(outside_cur == outsideinputs.size());
    GPASSERT(children_cur == childreninputs.size());
    //Get status
    for (int i=0; i<mStatus.size(); ++i)
    {
        totalInputs.push(mStatus[i]->content(), mStatus[i]->type());
    }
    GPContents* result;
    {
#ifdef DEBUG_TIMES
        GP_Clock c(__LINE__, (mFunc->name).c_str());
#endif
        result = mFunc.basic->basic(&totalInputs);
    }
    //Free All children' memory
    childreninputs.clear();
    return result;
}
int GPTreeADF::vMapStructure(GPParameter* para, bool& changed)
{
    const int number = 3;
    changed = false;
    if (NULL == para)
    {
        return number;
    }
    GPASSERT(para->size() == number);
    /*Replace*/
    if (para->get(0) > mProducer->getLargetVary())
    {
        return number;
    }
    changed = true;
    float pos = para->get(1);
    GPTreeADFPoint* p = find(pos);
    const vector<const IStatusType*> outputs = p->func()->outputType;
    //TODO If outputs is empty, Use function name to vary
    if (!outputs.empty())
    {
        vector<const IStatusType*> inputs;
        p->pGetInputs(inputs);
        vector<vector<GPTreeADFPoint*> > queue;
        mProducer->searchAllSequences(queue, outputs, inputs);
        GPASSERT(!queue.empty());
        size_t n = para->get(2)*queue.size();
        if (n >= queue.size())
        {
            n = queue.size()-1;
        }
        auto q = queue[n];
        GPASSERT(1 == q.size());
        if (p != mRoot)
        {
            mRoot->replace(p, q[0]);
        }
        else
        {
            mRoot->decRef();
            mRoot = q[0];
            q[0]->addRef();
        }
        for (auto que : queue)
        {
            for (auto _q : que)
            {
                _q->decRef();
            }
        }
        _refreshInputsAndOutputs();
    }
    return number;
}
Example #5
0
GPTreeADFPoint* GPTreeADFPoint::xmlLoad(const GPTreeNode* node, const GPFunctionDataBase* base)
{
    GPASSERT(NULL!=node);
    GPTreeADFPoint* res = NULL;
    if (node->name() == GPStrings::GPTreeADF_FUNCTION)
    {
        res = new GPTreeADFPoint(base->vQueryFunction(node->attr()), -1);
        for (auto c : node->getChildren())
        {
            if (c->name() == GPStrings::GPTreeADF_STATUS)
            {
                std::vector<istream*> streams;
                for (auto cc : c->getChildren())
                {
                    std::istringstream* is = new std::istringstream(cc->attr());
                    streams.push_back(is);
                }
                res->initStatus(streams);
                for (auto is : streams)
                {
                    delete is;
                }
            }
            else if (c->name() == GPStrings::GPTreeADF_CHILDREN)
            {
                for (auto cc : c->getChildren())
                {
                    res->addPoint(xmlLoad(cc.get(), base));
                }
            }
        }
    }
    else if (node->name() == GPStrings::GPTreeADF_INPUTS)
    {
        int inputpos = -1;
        std::istringstream is(node->attr());
        is >> inputpos;
        res = new GPTreeADFPoint(NULL, inputpos);
    }
GPTreeNode* GPTreeADFPoint::xmlPrint() const
{
    GPTreeNode* root = new GPTreeNode(GPStrings::GPTreeADF_FUNCTION, mFunc.basic->name);
    GPPtr<GPTreeNode> status = new GPTreeNode(GPStrings::GPTreeADF_STATUS, "");
    root->addChild(status);
    for (int j=0; j<mStatus.size(); ++j)
    {
        const IStatusType* s = mStatus[j]->type();
        std::ostringstream values;
        mStatus[j]->print(values);
        status->addChild(s->name(), values.str());
    }
    GPPtr<GPTreeNode> children = new GPTreeNode(GPStrings::GPTreeADF_CHILDREN, "");
    root->addChild(children);
    for (int i=0; i<mChildren.size(); ++i)
    {
        GPTreeADFPoint* p = (GPTreeADFPoint*)(mChildren[i]);
        children->addChild(p->xmlPrint());
    }
    if (mFunc.inputs.size() > 0)
    {
        std::ostringstream inputTypes;
        for (int i=0; i<mFunc.inputs.size(); ++i)
        {
            inputTypes << mFunc.inputs[i]->name() << " ";
        }
        GPPtr<GPTreeNode> inputs = new GPTreeNode(GPStrings::GPTreeADF_INPUTS, inputTypes.str());
        root->addChild(inputs);
        std::ostringstream childflags;
        for (int i=0; i<mFunc.useChildrenInput.size(); ++i)
        {
            childflags << mFunc.useChildrenInput[i] << " ";
        }
        GPPtr<GPTreeNode> childflagsn = new GPTreeNode(GPStrings::GPTreeADF_INPUTFLAGS, childflags.str());
        root->addChild(childflagsn);
    }
    return root;
}