110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu#include "model/electrical/SeparableAllocator.h"
2310447Snilay@cs.wisc.edu
2410447Snilay@cs.wisc.edu#include "model/ModelGen.h"
2510447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalNet.h"
2610447Snilay@cs.wisc.edu
2710447Snilay@cs.wisc.edunamespace DSENT
2810447Snilay@cs.wisc.edu{
2910447Snilay@cs.wisc.edu    SeparableAllocator::SeparableAllocator(const String& instance_name_, const TechModel* tech_model_)
3010447Snilay@cs.wisc.edu        : ElectricalModel(instance_name_, tech_model_)
3110447Snilay@cs.wisc.edu    {
3210447Snilay@cs.wisc.edu        initParameters();
3310447Snilay@cs.wisc.edu        initProperties();
3410447Snilay@cs.wisc.edu    }
3510447Snilay@cs.wisc.edu
3610447Snilay@cs.wisc.edu    SeparableAllocator::~SeparableAllocator()
3710447Snilay@cs.wisc.edu    {}
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    void SeparableAllocator::initParameters()
4010447Snilay@cs.wisc.edu    {
4110447Snilay@cs.wisc.edu        addParameterName("NumberRequesters");
4210447Snilay@cs.wisc.edu        addParameterName("NumberResources");
4310447Snilay@cs.wisc.edu        addParameterName("IsRequesterFirst", true);
4410447Snilay@cs.wisc.edu        addParameterName("Stage1->ArbiterModel");
4510447Snilay@cs.wisc.edu        addParameterName("Stage2->ArbiterModel");
4610447Snilay@cs.wisc.edu        return;
4710447Snilay@cs.wisc.edu    }
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu    void SeparableAllocator::initProperties()
5010447Snilay@cs.wisc.edu    {
5110447Snilay@cs.wisc.edu        addPropertyName("P(Request)");
5210447Snilay@cs.wisc.edu        addPropertyName("Act(Request)");
5310447Snilay@cs.wisc.edu        addPropertyName("P(CK)");
5410447Snilay@cs.wisc.edu        addPropertyName("Act(CK)");
5510447Snilay@cs.wisc.edu        return;
5610447Snilay@cs.wisc.edu    }
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu    SeparableAllocator* SeparableAllocator::clone() const
5910447Snilay@cs.wisc.edu    {
6010447Snilay@cs.wisc.edu        // TODO
6110447Snilay@cs.wisc.edu        return NULL;
6210447Snilay@cs.wisc.edu    }
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edu    void SeparableAllocator::constructModel()
6510447Snilay@cs.wisc.edu    {
6610447Snilay@cs.wisc.edu        // Get parameters
6710447Snilay@cs.wisc.edu        unsigned int number_requesters = getParameter("NumberRequesters").toUInt();
6810447Snilay@cs.wisc.edu        unsigned int number_resources = getParameter("NumberResources").toUInt();
6910447Snilay@cs.wisc.edu        bool is_requester_first = getParameter("IsRequesterFirst").toBool();
7010447Snilay@cs.wisc.edu        const String& stage1_arbiter_model = getParameter("Stage1->ArbiterModel");
7110447Snilay@cs.wisc.edu        const String& stage2_arbiter_model = getParameter("Stage2->ArbiterModel");
7210447Snilay@cs.wisc.edu
7310447Snilay@cs.wisc.edu        ASSERT(number_requesters > 0, "[Error] " + getInstanceName() +
7410447Snilay@cs.wisc.edu                " -> Number of requesters must be > 0!");
7510447Snilay@cs.wisc.edu        ASSERT(number_resources > 0, "[Error] " + getInstanceName() +
7610447Snilay@cs.wisc.edu                " -> Number of resources must be > 0!");
7710447Snilay@cs.wisc.edu
7810447Snilay@cs.wisc.edu        // Create area, power, and event results
7910447Snilay@cs.wisc.edu        createElectricalResults();
8010447Snilay@cs.wisc.edu        addEventResult(new Result("Allocate"));
8110447Snilay@cs.wisc.edu
8210447Snilay@cs.wisc.edu        // Create ports
8310447Snilay@cs.wisc.edu        createInputPort("CK");
8410447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < number_requesters; ++i)
8510447Snilay@cs.wisc.edu        {
8610447Snilay@cs.wisc.edu            createInputPort("Request" + (String)i, makeNetIndex(0, number_resources-1));
8710447Snilay@cs.wisc.edu            createOutputPort("Grant" + (String)i, makeNetIndex(0, number_resources-1));
8810447Snilay@cs.wisc.edu        }
8910447Snilay@cs.wisc.edu
9010447Snilay@cs.wisc.edu        // If is_requester_first is set, requests from the same requester will be arbitrate
9110447Snilay@cs.wisc.edu        // on stage 1
9210447Snilay@cs.wisc.edu        if(is_requester_first)
9310447Snilay@cs.wisc.edu        {
9410447Snilay@cs.wisc.edu            // Init stage 1 arbiters
9510447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requesters; ++i)
9610447Snilay@cs.wisc.edu            {
9710447Snilay@cs.wisc.edu                ElectricalModel* arb = (ElectricalModel*)ModelGen::createModel(stage1_arbiter_model, "Stage1Arb" + (String)i, getTechModel());
9810447Snilay@cs.wisc.edu                arb->setParameter("NumberRequests", number_resources);
9910447Snilay@cs.wisc.edu                arb->construct();
10010447Snilay@cs.wisc.edu
10110447Snilay@cs.wisc.edu                addSubInstances(arb, 1.0);
10210447Snilay@cs.wisc.edu                addElectricalSubResults(arb, 1.0);
10310447Snilay@cs.wisc.edu
10410447Snilay@cs.wisc.edu                getEventResult("Allocate")->addSubResult(arb->getEventResult("Arbitrate"), arb->getInstanceName(), 1.0);
10510447Snilay@cs.wisc.edu
10610447Snilay@cs.wisc.edu                createNet("Stage1Arb_In" + (String)i, makeNetIndex(0, number_resources-1));
10710447Snilay@cs.wisc.edu                createNet("Stage1Arb_Out" + (String)i, makeNetIndex(0, number_resources-1));
10810447Snilay@cs.wisc.edu
10910447Snilay@cs.wisc.edu                portConnect(arb, "CK", "CK");
11010447Snilay@cs.wisc.edu                assign("Stage1Arb_In" + (String)i, "Request" + (String)i);
11110447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_resources; ++j)
11210447Snilay@cs.wisc.edu                {
11310447Snilay@cs.wisc.edu                    portConnect(arb, "Request" + (String)j, "Stage1Arb_In" + (String)i, makeNetIndex(j));
11410447Snilay@cs.wisc.edu                    portConnect(arb, "Grant" + (String)j, "Stage1Arb_Out" + (String)i, makeNetIndex(j));
11510447Snilay@cs.wisc.edu                }
11610447Snilay@cs.wisc.edu            }
11710447Snilay@cs.wisc.edu
11810447Snilay@cs.wisc.edu            // Init stage 2 arbiters
11910447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_resources; ++i)
12010447Snilay@cs.wisc.edu            {
12110447Snilay@cs.wisc.edu                ElectricalModel* arb = (ElectricalModel*)ModelGen::createModel(stage2_arbiter_model, "Stage2Arb" + (String)i, getTechModel());
12210447Snilay@cs.wisc.edu                arb->setParameter("NumberRequests", number_requesters);
12310447Snilay@cs.wisc.edu                arb->construct();
12410447Snilay@cs.wisc.edu
12510447Snilay@cs.wisc.edu                addSubInstances(arb, 1.0);
12610447Snilay@cs.wisc.edu                addElectricalSubResults(arb, 1.0);
12710447Snilay@cs.wisc.edu
12810447Snilay@cs.wisc.edu                getEventResult("Allocate")->addSubResult(arb->getEventResult("Arbitrate"), arb->getInstanceName(), 1.0);
12910447Snilay@cs.wisc.edu
13010447Snilay@cs.wisc.edu                createNet("Stage2Arb_In" + (String)i, makeNetIndex(0, number_requesters-1));
13110447Snilay@cs.wisc.edu                createNet("Stage2Arb_Out" + (String)i, makeNetIndex(0, number_requesters-1));
13210447Snilay@cs.wisc.edu
13310447Snilay@cs.wisc.edu                portConnect(arb, "CK", "CK");
13410447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_requesters; ++j)
13510447Snilay@cs.wisc.edu                {
13610447Snilay@cs.wisc.edu                    assign("Stage2Arb_In" + (String)i, makeNetIndex(j), "Stage1Arb_Out" + (String)j, makeNetIndex(i));
13710447Snilay@cs.wisc.edu                    portConnect(arb, "Request" + (String)j, "Stage2Arb_In" + (String)i, makeNetIndex(j));
13810447Snilay@cs.wisc.edu                    portConnect(arb, "Grant" + (String)j, "Stage2Arb_Out" + (String)i, makeNetIndex(j));
13910447Snilay@cs.wisc.edu                    assign("Grant" + (String)j, makeNetIndex(i), "Stage2Arb_Out" + (String)i, makeNetIndex(j));
14010447Snilay@cs.wisc.edu                }
14110447Snilay@cs.wisc.edu            }
14210447Snilay@cs.wisc.edu        }
14310447Snilay@cs.wisc.edu        else
14410447Snilay@cs.wisc.edu        {
14510447Snilay@cs.wisc.edu            // Init stage 1 arbiters
14610447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_resources; ++i)
14710447Snilay@cs.wisc.edu            {
14810447Snilay@cs.wisc.edu                ElectricalModel* arb = (ElectricalModel*)ModelGen::createModel(stage1_arbiter_model, "Stage1Arb" + (String)i, getTechModel());
14910447Snilay@cs.wisc.edu                arb->setParameter("NumberRequests", number_requesters);
15010447Snilay@cs.wisc.edu                arb->construct();
15110447Snilay@cs.wisc.edu
15210447Snilay@cs.wisc.edu                addSubInstances(arb, 1.0);
15310447Snilay@cs.wisc.edu                addElectricalSubResults(arb, 1.0);
15410447Snilay@cs.wisc.edu
15510447Snilay@cs.wisc.edu                getEventResult("Allocate")->addSubResult(arb->getEventResult("Arbitrate"), arb->getInstanceName(), 1.0);
15610447Snilay@cs.wisc.edu
15710447Snilay@cs.wisc.edu                createNet("Stage1Arb_In" + (String)i, makeNetIndex(0, number_requesters-1));
15810447Snilay@cs.wisc.edu                createNet("Stage1Arb_Out" + (String)i, makeNetIndex(0, number_requesters-1));
15910447Snilay@cs.wisc.edu
16010447Snilay@cs.wisc.edu                portConnect(arb, "CK", "CK");
16110447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_requesters; ++j)
16210447Snilay@cs.wisc.edu                {
16310447Snilay@cs.wisc.edu                    assign("Stage1Arb_In" + (String)i, makeNetIndex(j), "Request" + (String)j, makeNetIndex(i));
16410447Snilay@cs.wisc.edu                    portConnect(arb, "Request" + (String)j, "Stage1Arb_In" + (String)i, makeNetIndex(j));
16510447Snilay@cs.wisc.edu                    portConnect(arb, "Grant" + (String)j, "Stage1Arb_Out" + (String)i, makeNetIndex(j));
16610447Snilay@cs.wisc.edu                }
16710447Snilay@cs.wisc.edu            }
16810447Snilay@cs.wisc.edu
16910447Snilay@cs.wisc.edu            // Init stage 2 arbiters
17010447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requesters; ++i)
17110447Snilay@cs.wisc.edu            {
17210447Snilay@cs.wisc.edu                ElectricalModel* arb = (ElectricalModel*)ModelGen::createModel(stage2_arbiter_model, "Stage2Arb" + (String)i, getTechModel());
17310447Snilay@cs.wisc.edu                arb->setParameter("NumberRequests", number_requesters);
17410447Snilay@cs.wisc.edu                arb->construct();
17510447Snilay@cs.wisc.edu
17610447Snilay@cs.wisc.edu                addSubInstances(arb, 1.0);
17710447Snilay@cs.wisc.edu                addElectricalSubResults(arb, 1.0);
17810447Snilay@cs.wisc.edu
17910447Snilay@cs.wisc.edu                getEventResult("Allocate")->addSubResult(arb->getEventResult("Arbitrate"), arb->getInstanceName(), 1.0);
18010447Snilay@cs.wisc.edu
18110447Snilay@cs.wisc.edu                createNet("Stage2Arb_In" + (String)i, makeNetIndex(0, number_resources-1));
18210447Snilay@cs.wisc.edu                createNet("Stage2Arb_Out" + (String)i, makeNetIndex(0, number_resources-1));
18310447Snilay@cs.wisc.edu
18410447Snilay@cs.wisc.edu                portConnect(arb, "CK", "CK");
18510447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_resources; ++j)
18610447Snilay@cs.wisc.edu                {
18710447Snilay@cs.wisc.edu                    assign("Stage2Arb_In" + (String)i, makeNetIndex(j), "Stage1Arb_Out" + (String)j, makeNetIndex(i));
18810447Snilay@cs.wisc.edu                    portConnect(arb, "Request" + (String)j, "Stage2Arb_In", makeNetIndex(j));
18910447Snilay@cs.wisc.edu                    portConnect(arb, "Grant" + (String)j, "Stage2Arb_Out", makeNetIndex(j));
19010447Snilay@cs.wisc.edu                }
19110447Snilay@cs.wisc.edu                assign("Grant" + (String)i, "Stage2Arb_Out" + (String)i);
19210447Snilay@cs.wisc.edu            }
19310447Snilay@cs.wisc.edu        }
19410447Snilay@cs.wisc.edu        return;
19510447Snilay@cs.wisc.edu    }
19610447Snilay@cs.wisc.edu
19710447Snilay@cs.wisc.edu    void SeparableAllocator::updateModel()
19810447Snilay@cs.wisc.edu    {
19910447Snilay@cs.wisc.edu        // Get parameters
20010447Snilay@cs.wisc.edu        unsigned int number_requesters = getParameter("NumberRequesters").toUInt();
20110447Snilay@cs.wisc.edu        unsigned int number_resources = getParameter("NumberResources").toUInt();
20210447Snilay@cs.wisc.edu        bool is_requester_first = getParameter("IsRequesterFirst").toBool();
20310447Snilay@cs.wisc.edu
20410447Snilay@cs.wisc.edu        // Get probabilities from inputs
20510447Snilay@cs.wisc.edu        const String& P_request = getProperty("P(Request)");
20610447Snilay@cs.wisc.edu        const String& act_request = getProperty("Act(Request)");
20710447Snilay@cs.wisc.edu        const String& P_CK = getProperty("P(CK)");
20810447Snilay@cs.wisc.edu        const String& act_CK = getProperty("Act(CK)");
20910447Snilay@cs.wisc.edu
21010447Snilay@cs.wisc.edu        const vector<double>& P_request_vector = LibUtil::castStringVector<double>(P_request.split("[,]"));
21110447Snilay@cs.wisc.edu        const vector<double>& act_request_vector = LibUtil::castStringVector<double>(act_request.split("[,]"));
21210447Snilay@cs.wisc.edu
21310447Snilay@cs.wisc.edu        ASSERT(P_request_vector.size() == (number_requesters * number_resources), "[Error] " + getInstanceName() +
21410447Snilay@cs.wisc.edu                " -> Expecting " + (String)(number_requesters * number_resources) +
21510447Snilay@cs.wisc.edu                " request probabilities, but got " + P_request);
21610447Snilay@cs.wisc.edu        ASSERT(act_request_vector.size() == (number_requesters * number_resources), "[Error] " + getInstanceName() +
21710447Snilay@cs.wisc.edu                " -> Expecting " + (String)(number_requesters * number_resources) +
21810447Snilay@cs.wisc.edu                " request actvities multiplier, but got " + act_request);
21910447Snilay@cs.wisc.edu
22010447Snilay@cs.wisc.edu        vector<double> P_int_request_vector(number_requesters * number_resources, 0.0);
22110447Snilay@cs.wisc.edu        vector<double> act_int_request_vector(number_requesters * number_resources, 0.0);
22210447Snilay@cs.wisc.edu        vector<double> P_out_request_vector(number_requesters * number_resources, 0.0);
22310447Snilay@cs.wisc.edu        vector<double> act_out_request_vector(number_requesters * number_resources, 0.0);
22410447Snilay@cs.wisc.edu        if(is_requester_first)
22510447Snilay@cs.wisc.edu        {
22610447Snilay@cs.wisc.edu            // Update stage1 arbiter
22710447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requesters; ++i)
22810447Snilay@cs.wisc.edu            {
22910447Snilay@cs.wisc.edu                vector<double> P_arb_request_vector(number_resources, 0.0);
23010447Snilay@cs.wisc.edu                vector<double> act_arb_request_vector(number_resources, 0.0);
23110447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_resources; ++j)
23210447Snilay@cs.wisc.edu                {
23310447Snilay@cs.wisc.edu                    P_arb_request_vector[j] = P_request_vector[i * number_resources + j];
23410447Snilay@cs.wisc.edu                    act_arb_request_vector[j] = act_request_vector[i * number_resources + j];
23510447Snilay@cs.wisc.edu                }
23610447Snilay@cs.wisc.edu
23710447Snilay@cs.wisc.edu                Model* arb = getSubInstance("Stage1Arb" + (String)i);
23810447Snilay@cs.wisc.edu                arb->setProperty("P(Request)", LibUtil::vectorToString(P_arb_request_vector));
23910447Snilay@cs.wisc.edu                arb->setProperty("Act(Request)", LibUtil::vectorToString(act_arb_request_vector));
24010447Snilay@cs.wisc.edu                arb->setProperty("P(CK)", P_CK);
24110447Snilay@cs.wisc.edu                arb->setProperty("Act(CK)", act_CK);
24210447Snilay@cs.wisc.edu                arb->update();
24310447Snilay@cs.wisc.edu
24410447Snilay@cs.wisc.edu                const vector<double>& P_arb_out_request_vector = LibUtil::castStringVector<double>(arb->getGenProperties()->get("P(Grant)").split("[,]"));
24510447Snilay@cs.wisc.edu                const vector<double>& act_arb_out_request_vector = LibUtil::castStringVector<double>(arb->getGenProperties()->get("Act(Grant)").split("[,]"));
24610447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_resources; ++j)
24710447Snilay@cs.wisc.edu                {
24810447Snilay@cs.wisc.edu                    P_int_request_vector[i * number_resources + j] = P_arb_out_request_vector[j];
24910447Snilay@cs.wisc.edu                    act_int_request_vector[i * number_resources + j] = act_arb_out_request_vector[j];
25010447Snilay@cs.wisc.edu                }
25110447Snilay@cs.wisc.edu            }
25210447Snilay@cs.wisc.edu            // Update stage2 arbiter
25310447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_resources; ++i)
25410447Snilay@cs.wisc.edu            {
25510447Snilay@cs.wisc.edu                vector<double> P_arb_request_vector(number_requesters, 0.0);
25610447Snilay@cs.wisc.edu                vector<double> act_arb_request_vector(number_requesters, 0.0);
25710447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_requesters; ++j)
25810447Snilay@cs.wisc.edu                {
25910447Snilay@cs.wisc.edu                    P_arb_request_vector[j] = P_int_request_vector[j * number_resources + i];
26010447Snilay@cs.wisc.edu                    act_arb_request_vector[j] = act_int_request_vector[j * number_resources + i];
26110447Snilay@cs.wisc.edu                }
26210447Snilay@cs.wisc.edu
26310447Snilay@cs.wisc.edu                Model* arb = getSubInstance("Stage2Arb" + (String)i);
26410447Snilay@cs.wisc.edu                arb->setProperty("P(Request)", LibUtil::vectorToString(P_arb_request_vector));
26510447Snilay@cs.wisc.edu                arb->setProperty("Act(Request)", LibUtil::vectorToString(act_arb_request_vector));
26610447Snilay@cs.wisc.edu                arb->setProperty("P(CK)", P_CK);
26710447Snilay@cs.wisc.edu                arb->setProperty("Act(CK)", act_CK);
26810447Snilay@cs.wisc.edu                arb->update();
26910447Snilay@cs.wisc.edu
27010447Snilay@cs.wisc.edu                const vector<double>& P_arb_out_request_vector = LibUtil::castStringVector<double>(arb->getGenProperties()->get("P(Grant)").split("[,]"));
27110447Snilay@cs.wisc.edu                const vector<double>& act_arb_out_request_vector = LibUtil::castStringVector<double>(arb->getGenProperties()->get("Act(Grant)").split("[,]"));
27210447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_requesters; ++j)
27310447Snilay@cs.wisc.edu                {
27410447Snilay@cs.wisc.edu                    P_out_request_vector[j * number_resources + i] = P_arb_out_request_vector[j];
27510447Snilay@cs.wisc.edu                    act_out_request_vector[j * number_resources + i] = act_arb_out_request_vector[j];
27610447Snilay@cs.wisc.edu                }
27710447Snilay@cs.wisc.edu            }
27810447Snilay@cs.wisc.edu        }
27910447Snilay@cs.wisc.edu        else
28010447Snilay@cs.wisc.edu        {
28110447Snilay@cs.wisc.edu
28210447Snilay@cs.wisc.edu        }
28310447Snilay@cs.wisc.edu
28410447Snilay@cs.wisc.edu        // Update output probabilities
28510447Snilay@cs.wisc.edu        getGenProperties()->set("P(Grant)", LibUtil::vectorToString(P_out_request_vector));
28610447Snilay@cs.wisc.edu        getGenProperties()->set("Act(Grant)", LibUtil::vectorToString(act_out_request_vector));
28710447Snilay@cs.wisc.edu
28810447Snilay@cs.wisc.edu        return;
28910447Snilay@cs.wisc.edu    }
29010447Snilay@cs.wisc.edu} // namespace DSENT
29110447Snilay@cs.wisc.edu
292