Ignore:
Timestamp:
07/22/21 14:05:58 (3 years ago)
Author:
yushan
Message:

workflow graph : enable unary and binary arithmetic filters

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src/filter
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/binary_arithmetic_filter.cpp

    r804 r2193  
    11#include "binary_arithmetic_filter.hpp" 
     2#include "workflow_graph.hpp" 
    23 
    34namespace xios 
     
    910  { /* Nothing to do */ }; 
    1011 
     12  std::pair<int, int> CScalarFieldArithmeticFilter::buildGraph(std::vector<CDataPacketPtr> data) 
     13  { 
     14    bool building_graph = this->graphEnabled; 
     15    int unique_filter_id; 
     16    bool firstround = true; 
     17     
     18    if(building_graph) 
     19    { 
     20      if(!data[0]->graphPackage) 
     21      { 
     22        data[0]->graphPackage = new CGraphDataPackage; 
     23        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     24        data[0]->graphPackage->fromFilter = -1; 
     25      } 
     26 
     27      if(!CWorkflowGraph::mapHashFilterID_) CWorkflowGraph::mapHashFilterID_ = new std::unordered_map <size_t, int>; 
     28 
     29      size_t filterhash = std::hash<StdString>{}(this->graphPackage->inFields[0]->content+to_string(data[0]->timestamp)+this->graphPackage->inFields[0]->getId()); 
     30 
     31      // first round 
     32      if(CWorkflowGraph::mapHashFilterID_->find(filterhash) == CWorkflowGraph::mapHashFilterID_->end()) 
     33      { 
     34        this->graphPackage->filterId = CWorkflowGraph::getNodeSize(); 
     35        unique_filter_id = this->graphPackage->filterId; 
     36        CWorkflowGraph::addNode("Arithmetic filter\\n ("+this->graphPackage->inFields[0]->content+")", 4, false, 0, data[0]);         
     37 
     38        CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]); 
     39        data[0]->graphPackage->fromFilter = this->graphPackage->filterId; 
     40        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     41        std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end()); 
     42 
     43        
     44        (*CWorkflowGraph::mapHashFilterID_)[filterhash] = unique_filter_id;  
     45         
     46      } 
     47      // not first round 
     48      else  
     49      { 
     50        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_)[filterhash]; 
     51        if(data[0]->graphPackage->fromFilter != unique_filter_id) 
     52        { 
     53          CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, unique_filter_id, data[0]);   
     54        } 
     55      }   
     56    } 
     57 
     58    return std::make_pair(building_graph, unique_filter_id); 
     59  } 
     60 
    1161  CDataPacketPtr CScalarFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 
    1262  { 
     
    1565    packet->timestamp = data[0]->timestamp; 
    1666    packet->status = data[0]->status; 
     67     
     68    std::pair<int, int> graph = buildGraph(data); 
     69 
     70    if(std::get<0>(graph)) 
     71    {   
     72      packet->graphPackage = new CGraphDataPackage; 
     73      packet->graphPackage->fromFilter = std::get<1>(graph); 
     74      packet->graphPackage->currentField = this->graphPackage->inFields[0];  
     75    } 
    1776 
    1877    if (packet->status == CDataPacket::NO_ERROR) 
     
    2887  { /* Nothing to do */ }; 
    2988 
     89  std::pair<int, int> CFieldScalarArithmeticFilter::buildGraph(std::vector<CDataPacketPtr> data) 
     90  { 
     91    bool building_graph = this->graphEnabled; 
     92    int unique_filter_id; 
     93    bool firstround = true; 
     94 
     95    if(building_graph) 
     96    { 
     97      if(!data[0]->graphPackage) 
     98      { 
     99        data[0]->graphPackage = new CGraphDataPackage; 
     100        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     101        data[0]->graphPackage->fromFilter = -1; 
     102      } 
     103 
     104      if(!CWorkflowGraph::mapHashFilterID_) CWorkflowGraph::mapHashFilterID_ = new std::unordered_map <size_t, int>; 
     105 
     106      size_t filterhash = std::hash<StdString>{}(this->graphPackage->inFields[0]->content+to_string(data[0]->timestamp)+this->graphPackage->inFields[0]->getId()); 
     107 
     108      // first round 
     109      if(CWorkflowGraph::mapHashFilterID_->find(filterhash) == CWorkflowGraph::mapHashFilterID_->end()) 
     110      { 
     111        this->graphPackage->filterId = CWorkflowGraph::getNodeSize(); 
     112        unique_filter_id = this->graphPackage->filterId; 
     113        CWorkflowGraph::addNode("Arithmetic filter\\n ("+this->graphPackage->inFields[0]->content+")", 4, false, 0, data[0]);         
     114 
     115        CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]); 
     116        data[0]->graphPackage->fromFilter = this->graphPackage->filterId; 
     117        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     118        std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end()); 
     119 
     120        
     121        (*CWorkflowGraph::mapHashFilterID_)[filterhash] = unique_filter_id;  
     122         
     123      } 
     124      // not first round 
     125      else  
     126      { 
     127        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_)[filterhash]; 
     128        if(data[0]->graphPackage->fromFilter != unique_filter_id) 
     129        { 
     130          CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, unique_filter_id, data[0]);   
     131        } 
     132      }   
     133    } 
     134 
     135    return std::make_pair(building_graph, unique_filter_id); 
     136  } 
     137 
    30138  CDataPacketPtr CFieldScalarArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 
    31139  { 
     
    35143    packet->status = data[0]->status; 
    36144 
     145    std::pair<int, int> graph = buildGraph(data); 
     146 
     147    if(std::get<0>(graph)) 
     148    {   
     149      packet->graphPackage = new CGraphDataPackage; 
     150      packet->graphPackage->fromFilter = std::get<1>(graph); 
     151      packet->graphPackage->currentField = this->graphPackage->inFields[0];  
     152    } 
     153 
    37154    if (packet->status == CDataPacket::NO_ERROR) 
    38155      packet->data.reference(op(data[0]->data, value)); 
     
    46163  { /* Nothing to do */ }; 
    47164 
     165  std::pair<int, int> CFieldFieldArithmeticFilter::buildGraph(std::vector<CDataPacketPtr> data) 
     166  { 
     167    bool building_graph = this->graphEnabled; 
     168    int unique_filter_id; 
     169    bool firstround = true; 
     170 
     171    if(building_graph) 
     172    { 
     173      if(!data[0]->graphPackage) 
     174      { 
     175        data[0]->graphPackage = new CGraphDataPackage; 
     176        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     177        data[0]->graphPackage->fromFilter = -1; 
     178      } 
     179      if(!data[1]->graphPackage) 
     180      { 
     181        data[1]->graphPackage = new CGraphDataPackage; 
     182        data[1]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     183        data[1]->graphPackage->fromFilter = -1; 
     184      } 
     185 
     186      if(!CWorkflowGraph::mapHashFilterID_) CWorkflowGraph::mapHashFilterID_ = new std::unordered_map <size_t, int>; 
     187 
     188      size_t filterhash = std::hash<StdString>{}(this->graphPackage->inFields[0]->content+to_string(data[0]->timestamp)+this->graphPackage->inFields[0]->getId()); 
     189 
     190      // first round 
     191      if(CWorkflowGraph::mapHashFilterID_->find(filterhash) == CWorkflowGraph::mapHashFilterID_->end()) 
     192      { 
     193        this->graphPackage->filterId = CWorkflowGraph::getNodeSize(); 
     194        unique_filter_id = this->graphPackage->filterId; 
     195        CWorkflowGraph::addNode("Arithmetic filter\\n ("+this->graphPackage->inFields[0]->content+")", 4, false, 0, data[0]);         
     196 
     197        CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]); 
     198        data[0]->graphPackage->fromFilter = this->graphPackage->filterId; 
     199        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     200 
     201        CWorkflowGraph::addEdge(data[1]->graphPackage->fromFilter, this->graphPackage->filterId, data[1]); 
     202        data[1]->graphPackage->fromFilter = this->graphPackage->filterId; 
     203        data[1]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     204 
     205        std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end()); 
     206 
     207        (*CWorkflowGraph::mapHashFilterID_)[filterhash] = unique_filter_id;  
     208         
     209      } 
     210      // not first round 
     211      else  
     212      { 
     213        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_)[filterhash]; 
     214        if(data[0]->graphPackage->fromFilter != unique_filter_id) 
     215        { 
     216          CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, unique_filter_id, data[0]);   
     217        } 
     218        if(data[1]->graphPackage->fromFilter != unique_filter_id) 
     219        { 
     220          CWorkflowGraph::addEdge(data[1]->graphPackage->fromFilter, unique_filter_id, data[1]);   
     221        } 
     222      }   
     223    } 
     224 
     225    return std::make_pair(building_graph, unique_filter_id); 
     226  } 
     227 
     228 
    48229  CDataPacketPtr CFieldFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 
    49230  { 
     
    51232    packet->date = data[0]->date; 
    52233    packet->timestamp = data[0]->timestamp; 
     234 
     235    std::pair<int, int> graph = buildGraph(data); 
     236 
     237    if(std::get<0>(graph)) 
     238    {   
     239      packet->graphPackage = new CGraphDataPackage; 
     240      packet->graphPackage->fromFilter = std::get<1>(graph); 
     241      packet->graphPackage->currentField = this->graphPackage->inFields[0];  
     242    } 
    53243 
    54244    if (data[0]->status != CDataPacket::NO_ERROR) 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/binary_arithmetic_filter.hpp

    r1542 r2193  
    3535       */ 
    3636      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data); 
     37      std::pair<int, int> virtual buildGraph(std::vector<CDataPacketPtr> data); 
    3738  }; // class CScalarFieldArithmeticFilter 
    3839 
     
    6364       */ 
    6465      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data); 
     66      std::pair<int, int> virtual buildGraph(std::vector<CDataPacketPtr> data); 
    6567  }; // class CFieldScalarArithmeticFilter 
    6668 
     
    8991       */ 
    9092      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data); 
     93      std::pair<int, int> virtual buildGraph(std::vector<CDataPacketPtr> data); 
     94       
    9195  }; // class CFieldFieldArithmeticFilter 
    9296} // namespace xios 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_filter.cpp

    r2143 r2193  
    3030    , isFirstOperation(true) 
    3131    , graphCycleCompleted(true) 
     32    , temporalOperation(opId) 
    3233  { 
     34  } 
     35 
     36  std::string CTemporalFilter::getTemporalOperation() 
     37  { 
     38    return this->temporalOperation; 
    3339  } 
    3440 
     
    4551      {   
    4652        this->graphPackage->filterId = CWorkflowGraph::getNodeSize(); 
    47         CWorkflowGraph::addNode("Temporal filter", 3, false, 0, data[0]); 
     53        CWorkflowGraph::addNode("Temporal filter \\n("+getTemporalOperation()+")", 3, false, 0, data[0]); 
    4854        graphCycleCompleted = false; 
    4955      } 
     
    5460      CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]); 
    5561      data[0]->graphPackage->fromFilter = this->graphPackage->filterId; 
    56       this->graphPackage->sourceFilterIds.push_back(data[0]->graphPackage->fromFilter);  
     62      // this->graphPackage->sourceFilterIds.push_back(data[0]->graphPackage->fromFilter);  
    5763      data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
    5864      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end()); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_filter.hpp

    r2143 r2193  
    5555      bool virtual isDataExpected(const CDate& date) const; 
    5656      bool graphCycleCompleted; 
     57      std::string getTemporalOperation(); 
    5758 
    5859    private: 
     
    7374//      CDate nextOperationDate; //!< The date of the next operation 
    7475      bool isFirstOperation; //!< True before the first operation was been computed 
     76      const std::string temporalOperation; 
    7577  }; // class CTemporalFilter 
    7678} // namespace xios 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/unary_arithmetic_filter.cpp

    r643 r2193  
    11#include "unary_arithmetic_filter.hpp" 
     2#include "workflow_graph.hpp" 
     3 
    24 
    35namespace xios 
     
    810  { /* Nothing to do */ }; 
    911 
     12  std::pair<int, int> CUnaryArithmeticFilter::buildGraph(std::vector<CDataPacketPtr> data) 
     13  { 
     14    bool building_graph = this->graphEnabled; 
     15    int unique_filter_id; 
     16    bool firstround = true; 
     17     
     18    if(building_graph) 
     19    { 
     20      if(!data[0]->graphPackage) 
     21      { 
     22        data[0]->graphPackage = new CGraphDataPackage; 
     23        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     24        data[0]->graphPackage->fromFilter = -1; 
     25      } 
     26 
     27      if(!CWorkflowGraph::mapHashFilterID_) CWorkflowGraph::mapHashFilterID_ = new std::unordered_map <size_t, int>; 
     28 
     29      size_t filterhash = std::hash<StdString>{}(this->graphPackage->inFields[0]->content+to_string(data[0]->timestamp)+this->graphPackage->inFields[0]->getId()); 
     30 
     31      // first round 
     32      if(CWorkflowGraph::mapHashFilterID_->find(filterhash) == CWorkflowGraph::mapHashFilterID_->end()) 
     33      { 
     34        this->graphPackage->filterId = CWorkflowGraph::getNodeSize(); 
     35        unique_filter_id = this->graphPackage->filterId; 
     36        CWorkflowGraph::addNode("Arithmetic filter\\n ("+this->graphPackage->inFields[0]->content+")", 4, false, 0, data[0]);         
     37 
     38        CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]); 
     39        data[0]->graphPackage->fromFilter = this->graphPackage->filterId; 
     40        data[0]->graphPackage->currentField = this->graphPackage->inFields[0]; 
     41        std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end()); 
     42 
     43        
     44        (*CWorkflowGraph::mapHashFilterID_)[filterhash] = unique_filter_id;  
     45         
     46      } 
     47      // not first round 
     48      else  
     49      { 
     50        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_)[filterhash]; 
     51        if(data[0]->graphPackage->fromFilter != unique_filter_id) 
     52        { 
     53          CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, unique_filter_id, data[0]);   
     54        } 
     55      }   
     56    } 
     57 
     58    return std::make_pair(building_graph, unique_filter_id); 
     59  } 
     60 
     61 
    1062  CDataPacketPtr CUnaryArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 
    1163  { 
     
    1567    packet->status = data[0]->status; 
    1668 
     69    std::pair<int, int> graph = buildGraph(data); 
     70 
     71    if(std::get<0>(graph)) 
     72    {   
     73      packet->graphPackage = new CGraphDataPackage; 
     74      packet->graphPackage->fromFilter = std::get<1>(graph); 
     75      packet->graphPackage->currentField = this->graphPackage->inFields[0];  
     76    } 
     77 
    1778    if (packet->status == CDataPacket::NO_ERROR) 
    1879      packet->data.reference(op(data[0]->data)); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/unary_arithmetic_filter.hpp

    r642 r2193  
    3434       */ 
    3535      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data); 
     36      std::pair<int, int> virtual buildGraph(std::vector<CDataPacketPtr> data); 
    3637  }; // class CUnaryArithmeticFilter 
    3738} // namespace xios 
Note: See TracChangeset for help on using the changeset viewer.