model_graph.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:13k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = model_graph.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <string.h>
  7. #include "parmfile.h"
  8. #include "model_graph.h"
  9. extern ParmFile ParmInput;
  10. extern ofstream *DebugFile;
  11. //========================================================================
  12. ModelGraph::ModelGraph(PracSimModel* owning_model)
  13. {
  14.    Max_Signals = 50;
  15.    Owning_Model = owning_model;
  16.    Model_Is_Multirate = false;
  17.    Model_Is_Constant_Interval = false;
  18.    Delta_Delay = new std::vector<double>;
  19.    Vertex_Is_Input = new std::vector<bool>;
  20.    Vertex_Kind = new std::vector<SignalKinds_type>;
  21.    Node_Is_Feedback = new std::vector<bool>;
  22.    Block_Size = new std::vector<int>;
  23.    Samp_Intvl = new std::vector<double>;
  24.    Resamp_Rate = new std::vector<double>;
  25.    Const_Intvl = new std::vector<bool>;
  26.    Sig_Dep_Graph = new DirectedGraph;
  27.    return;
  28. }
  29. //=========================================================================
  30. ModelGraph::~ModelGraph()
  31. {
  32.    delete Vertex_Is_Input;
  33.    delete Vertex_Kind;
  34. };
  35. //=========================================================================
  36. void ModelGraph::InsertSignal( GenericSignal *new_sig_id,
  37.                                PracSimModel *model_ptr,
  38.                                bool new_sig_is_input)
  39. {
  40.    int new_sig_num;
  41.    //--------------------------------------------------------------
  42.    //  Add new vertex into Signal Dependency CMSG
  43.    new_sig_num = Sig_Dep_Graph->AddVertex(new_sig_id);
  44.    //---------------------------------------------
  45.    //  set node properies to default values
  46.    //
  47.    Vertex_Is_Input->push_back(new_sig_is_input);
  48.    Vertex_Kind->push_back(SK_REGULAR_SIGNAL);
  49.    Node_Is_Feedback->push_back(false);
  50.    Block_Size->push_back(0);
  51.    Samp_Intvl->push_back(0.0);
  52.    //------------------------------------------------------------
  53.    //  Loop thru existing vertices to see where edges need to be
  54.    //  added to or from new vertex
  55.    //
  56.    for(int old_vtx=0; old_vtx<Sig_Dep_Graph->GetNumVerts(); old_vtx++) {
  57.       //----------------------------------------------
  58.       //  Don't create edges between new signal and
  59.       //  existing signals of same input/output sense
  60.       //  (i.e. don't make edges from input to input
  61.       //  or from output to output)
  62.       if(Vertex_Is_Input->at(old_vtx) != new_sig_is_input) {
  63.           
  64.          //----------------------------------------------
  65.          //  add edge from input vertex to output vertex
  66.          if(new_sig_is_input){
  67.             // new vertex is INPUT: add edge from NEW vertex
  68.             // to EXISTING vertex
  69.             Sig_Dep_Graph->AddEdge( model_ptr,
  70.                                     new_sig_num,
  71.                                     old_vtx);
  72.          }
  73.          else {
  74.             // new vertex is OUTPUT: add edge from EXISTING
  75.             // vertex to NEW vertex
  76.             Sig_Dep_Graph->AddEdge( model_ptr,
  77.                                     old_vtx,
  78.                                     new_sig_num);
  79.          }
  80.          //--------------------------------------
  81.          // Set edge properties to default values
  82.          //         
  83.          Delta_Delay->push_back(0.0); // only used by a very few models
  84.          //-------------------------------------------------
  85.          //  Make Resampling_Rate undefined if model is a
  86.          //  multirate model or if the existing vertex
  87.          //  just connected to the new edge is a control
  88.          //  rather than a signal
  89.          if( Model_Is_Multirate ){
  90.             Resamp_Rate->push_back(UNDEFINED_RATE);
  91.          }
  92.          else{
  93.             Resamp_Rate->push_back(1.0);
  94.          }
  95.          Const_Intvl->push_back(Model_Is_Constant_Interval);
  96.       } //end of if
  97.    }// end of loop over old_vtx
  98.    return;
  99. }
  100. //====================================================
  101. GenericSignal* ModelGraph::GetSignalId(int vtx_num)
  102. {
  103.    GenericSignal* sig_id;
  104.    sig_id = (GenericSignal*)Sig_Dep_Graph->GetVertexId(vtx_num);
  105.    return(sig_id);
  106. }
  107. //====================================================
  108. void* ModelGraph::GetVertexId(int vtx_num)
  109. {
  110.    void* vtx_id;
  111.    vtx_id = Sig_Dep_Graph->GetVertexId(vtx_num);
  112.    return(vtx_id);
  113. }
  114. //====================================================
  115. void* ModelGraph::GetEdgeId(int edge_num)
  116. {
  117.    void* vtx_id;
  118.    vtx_id = Sig_Dep_Graph->GetEdgeId(edge_num);
  119.    return(vtx_id);
  120. }
  121. //====================================================
  122. PracSimModel* ModelGraph::GetModelId(int edge_num)
  123. {
  124.    PracSimModel* model_id;
  125.    model_id = (PracSimModel*)Sig_Dep_Graph->GetEdgeId(edge_num);
  126.    return(model_id);
  127. }
  128. //====================================================
  129. void ModelGraph::EnableMultirate()
  130. {
  131.    Model_Is_Multirate = true;
  132.    return;
  133. }
  134. //====================================================
  135. void ModelGraph::EnableConstantInterval()
  136. {
  137.    Model_Is_Constant_Interval = true;
  138.    return;
  139. }
  140. //===============================================================
  141. int ModelGraph::GetBlockSize(int vtx_num)
  142. {
  143.    return(Block_Size->at(vtx_num));
  144. }
  145. //===============================================================
  146. int ModelGraph::GetNumVerts(void)
  147. {
  148.    return(Sig_Dep_Graph->GetNumVerts());
  149. }
  150. //===============================================================
  151. void ModelGraph::SetSampIntvl( GenericSignal* sig_id,
  152.                                double samp_intvl)
  153. {
  154.    int sig_num = Sig_Dep_Graph->GetVertexNum(sig_id->GetId());
  155.    Samp_Intvl->at(sig_num) = samp_intvl;
  156. }
  157. //===============================================================
  158. void ModelGraph::SetBlockSize( GenericSignal* sig_id,
  159.                                int block_size)
  160. {
  161.    int sig_num = Sig_Dep_Graph->GetVertexNum(sig_id->GetId());
  162.    Block_Size->at(sig_num) = block_size;
  163. }
  164. //===============================================================
  165. double ModelGraph::GetSampIntvl(int vtx_num)
  166. {
  167.    return(Samp_Intvl->at(vtx_num));
  168. }
  169. //===============================================================
  170. double ModelGraph::GetResampRate(int edge_num)
  171. {
  172.    return(Resamp_Rate->at(edge_num));
  173. }
  174. //===============================================================
  175. bool ModelGraph::GetIsConstIntvl(int edge_num)
  176. {
  177.    return(Const_Intvl->at(edge_num));
  178. }
  179. //===============================================================
  180. double ModelGraph::GetDelay(int edge_num)
  181. {
  182.    return(Delta_Delay->at(edge_num));
  183. }
  184. //===============================================================
  185. bool ModelGraph::ConnIsFeedback(int vtx_num)
  186. {
  187.    return(false);
  188. }
  189. //===============================================================
  190. SignalKinds_type ModelGraph::GetVertexKind(int vtx_num)
  191. {
  192.    return(Vertex_Kind->at(vtx_num));
  193. }
  194. //===========================================================
  195. int ModelGraph::GetEdgeNum( int in_sig_num,
  196.                             int out_sig_num )
  197. {
  198.    int edge_num;
  199.    edge_num = Sig_Dep_Graph->GetEdgeNum(in_sig_num, out_sig_num);
  200.    return(edge_num);
  201. }
  202. //===========================================================
  203. void ModelGraph::ChangeRate( GenericSignal* in_sig_id,
  204.                              GenericSignal* out_sig_id,
  205.                              double resamp_rate,
  206.                              PracSimModel* model_ptr)
  207. {
  208.    int in_sig_num, out_sig_num, edge_num;
  209.    in_sig_num = Sig_Dep_Graph->GetVertexNum(in_sig_id);
  210.    out_sig_num = Sig_Dep_Graph->GetVertexNum(out_sig_id);
  211.    edge_num = Sig_Dep_Graph->GetEdgeNum(in_sig_num, out_sig_num);
  212.    if(edge_num < 0) {
  213.       //---------------------------------
  214.       // -- ERROR -- 
  215.       // could get this error if we try to set a rate change
  216.       // between two inputs or between two outputs -- these 
  217.       // combinations won't have an edge defined between them.
  218.       //ErrorStream << "Error in ModelGraph::ChangeRate -- "
  219.       *DebugFile << "Error in ModelGraph::ChangeRate -- "
  220.                  << "attempt to change rate on undefined edge"
  221.                  << endl;
  222.       exit(1);
  223.    }
  224.    Resamp_Rate->at(edge_num) = resamp_rate;
  225.    return;
  226. }
  227. //====================================================
  228. void ModelGraph::Closeout( PracSimModel* model_ptr)
  229. {
  230.    //-------------------------------------------------------
  231.    //  Each CMG must have at least one input signal and one
  232.    //  output signal.  Check to see if signals in CMG are all
  233.    //  inputs or all outputs.  If they are, augment CMG
  234.    //  by adding a dummy source or dummy destination signal
  235.    //  as appropriate.  (Only signals are checked -- vertices
  236.    //  that represent controls are ignored.)
  237.    //-----------------------------------------------
  238.    // Find first vertex that represents a signal
  239.    // and determine if it is an input or an output.
  240.    int vtx_num, first_sig_idx;
  241.    bool first_is_input;
  242.    bool sigs_have_same_in_out_sense;
  243.    int new_sig_num;
  244.    GenericSignal *dummy_signal;
  245.    int num_verts = Sig_Dep_Graph->GetNumVerts();
  246.    if(num_verts == 0) return;
  247.    first_sig_idx = 0;
  248.    first_is_input = Vertex_Is_Input->at(first_sig_idx);
  249.    //-------------------------------------------------
  250.    // Compare first signal against all other signals
  251.    sigs_have_same_in_out_sense = true;
  252.    for( vtx_num = first_sig_idx+1; vtx_num < num_verts; vtx_num++) {
  253.       if(first_is_input != Vertex_Is_Input->at(vtx_num))
  254.          sigs_have_same_in_out_sense = false;
  255.    }
  256.    if(sigs_have_same_in_out_sense) {
  257.       if(first_is_input) {
  258.          //  all existing signals are inputs: augment
  259.          //  CMG with a dummy destination signal
  260.          Vertex_Is_Input->push_back(false);
  261.          dummy_signal = new GenericSignal( "Dummy_Destination",
  262.                                            model_ptr);
  263.          new_sig_num = Sig_Dep_Graph->AddVertex( dummy_signal );
  264.          num_verts++;
  265.          Vertex_Kind->push_back(SK_DUMMY_DEST_SIGNAL);
  266.          Block_Size->push_back(0);
  267.          Samp_Intvl->push_back(0.0);
  268.          //-------------------------------------------------------
  269.          //  add edges from each input signal to added destination
  270.          for( vtx_num = 0; vtx_num < new_sig_num; vtx_num++){
  271.             if(Vertex_Is_Input->at(vtx_num) ){
  272.                Sig_Dep_Graph->AddEdge(model_ptr, vtx_num, new_sig_num);
  273.                Resamp_Rate->push_back(UNDEFINED_RATE);
  274.                Delta_Delay->push_back(0.0);
  275.                if(Model_Is_Constant_Interval){
  276.                   Const_Intvl->push_back(true);
  277.                }
  278.                else {
  279.                   Const_Intvl->push_back(false);
  280.                }
  281.             }
  282.          }
  283.       } // end of if(first_is_input)
  284.       else {
  285.          //--------------------------------------------
  286.          // all existing signals are outputs: augment
  287.          // CMSG with a dummy source signal
  288.          Vertex_Is_Input->push_back(true);
  289.          dummy_signal = new GenericSignal( "Dummy_Source",
  290.                                            model_ptr);
  291.          new_sig_num = Sig_Dep_Graph->AddVertex( dummy_signal );
  292.          num_verts++;
  293.          Vertex_Kind->push_back(SK_DUMMY_SOURCE_SIGNAL);
  294.          Block_Size->push_back(0);
  295.          Samp_Intvl->push_back(0.0);
  296.          //-------------------------------------------------------
  297.          //  add edges from added source to each output signal
  298.          for( vtx_num = 0; vtx_num < new_sig_num; vtx_num++){
  299.             if( ! Vertex_Is_Input->at(vtx_num) ){
  300.                Sig_Dep_Graph->AddEdge(model_ptr, new_sig_num, vtx_num);
  301.                Resamp_Rate->push_back(UNDEFINED_RATE);
  302.                Delta_Delay->push_back(0.0);
  303.                if(Model_Is_Constant_Interval){
  304.                   Const_Intvl->push_back(true);
  305.                }
  306.                else {
  307.                   Const_Intvl->push_back(false);
  308.                }
  309.             }
  310.          } // end of loop over vtx_num
  311.       } // end of else clause on if(first_is_input)
  312.    }
  313.    DumpSigDepGraph();
  314.    return;
  315. }
  316. //====================================================
  317. void ModelGraph::DumpSigDepGraph(void)
  318. {
  319.    int sig_idx, sig_idx2;
  320.    int edge_idx;
  321.    cout << "nIn ModelGraph::DumpSigDepGraph" << endl;
  322.    *DebugFile << "nIn ModelGraph::DumpSigDepGraph" << endl;
  323.    int num_verts = Sig_Dep_Graph->GetNumVerts();
  324.    *DebugFile << "nVertices: " << num_verts << endl;
  325.    for( sig_idx = 0; sig_idx < num_verts; sig_idx++) {
  326.       *DebugFile << Sig_Dep_Graph->GetVertexId(sig_idx) << "  "
  327.                  << ((GenericSignal*)Sig_Dep_Graph->GetVertexId(sig_idx))->GetName()
  328.                  << endl;
  329.    }
  330.    int num_edges = Sig_Dep_Graph->GetNumEdges();
  331.    *DebugFile << "nEdges: " << num_edges << endl;
  332.    for( edge_idx = 0; edge_idx < num_edges; edge_idx++){
  333.       *DebugFile << Sig_Dep_Graph->GetEdgeId(edge_idx) << "  "
  334.                  << ((PracSimModel*)Sig_Dep_Graph->GetEdgeId(edge_idx))->GetModelName()
  335.                  << endl;
  336.    }
  337.    *DebugFile << "nAdjacency Matrix:" << endl;
  338.    for( sig_idx = 0; sig_idx < num_verts; sig_idx++){
  339.       for( sig_idx2 = 0; sig_idx2 < num_verts; sig_idx2++) {
  340.          *DebugFile << Sig_Dep_Graph->GetEdgeNum(sig_idx, sig_idx2)
  341.                     << "   ";
  342.       }
  343.       *DebugFile << endl;
  344.    }
  345.    return;
  346. }
  347. //==================================================================
  348. PracSimModel* ModelGraph::GetOwningModel(void)
  349. {
  350.    return(Owning_Model);
  351. }