- Timestamp:
- 07/22/21 14:05:58 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/binary_arithmetic_filter.cpp
r804 r2193 1 1 #include "binary_arithmetic_filter.hpp" 2 #include "workflow_graph.hpp" 2 3 3 4 namespace xios … … 9 10 { /* Nothing to do */ }; 10 11 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 11 61 CDataPacketPtr CScalarFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 12 62 { … … 15 65 packet->timestamp = data[0]->timestamp; 16 66 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 } 17 76 18 77 if (packet->status == CDataPacket::NO_ERROR) … … 28 87 { /* Nothing to do */ }; 29 88 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 30 138 CDataPacketPtr CFieldScalarArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 31 139 { … … 35 143 packet->status = data[0]->status; 36 144 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 37 154 if (packet->status == CDataPacket::NO_ERROR) 38 155 packet->data.reference(op(data[0]->data, value)); … … 46 163 { /* Nothing to do */ }; 47 164 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 48 229 CDataPacketPtr CFieldFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data) 49 230 { … … 51 232 packet->date = data[0]->date; 52 233 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 } 53 243 54 244 if (data[0]->status != CDataPacket::NO_ERROR)
Note: See TracChangeset
for help on using the changeset viewer.