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

workflow graph : enable unary and binary arithmetic filters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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)); 
Note: See TracChangeset for help on using the changeset viewer.