KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
RuleSet.cpp
Go to the documentation of this file.
1#include "kids/RuleSet.h"
2
3#include <map>
4#include <string>
5
7#include "kids/concat.h"
8#include "kids/fmt.h"
9
10namespace PROJECT_NS {
11
12std::vector<std::shared_ptr<RuleSet>>& RuleSet::getRuleSets() {
13 static std::vector<std::shared_ptr<RuleSet>> _GLOBAL;
14 return _GLOBAL;
15}
16
17void RuleSet::registerRulesInRuleSet(std::shared_ptr<RuleEvaluator>& exprRule) {
18 auto& expression_ios = getRuleSets();
19 for (auto it = expression_ios.begin(); it != expression_ios.end(); ++it) {
20 if (exprRule->save == (*it)->unique_name) {
21 (*it)->rules.push_back(exprRule);
22 (*it)->appendHeader(exprRule);
23 return;
24 }
25 }
26 expression_ios.push_back(std::shared_ptr<RuleSet>(new RuleSet(exprRule)));
27}
28
29void RuleSet::registerRules(std::shared_ptr<RuleEvaluator>& exprRule) {
30 rules.push_back(exprRule);
32}
33
34RuleSet::RuleSet(std::shared_ptr<RuleEvaluator>& expr_rule) {
35 unique_name = expr_rule->save;
36 header = "";
37 totalFrameNumber = expr_rule->totalFrameNumber;
38 rules.push_back(expr_rule);
39 appendHeader(expr_rule);
40}
41
42void RuleSet::flush_all(const std::string& path, int level) {
43 auto& expression_ios = getRuleSets();
44 for (auto& io : expression_ios) io->flush(path, level);
45}
46
47void RuleSet::flush(const std::string& path, int level) {
48 std::ofstream ofs(utils::concat(path, "/", unique_name));
49 ofs << header << "\n";
50 for (int iframe = 0; iframe < totalFrameNumber; ++iframe) {
51 for (auto& r : rules) {
52 std::shared_ptr<VariableDescriptor> resvar;
53 switch (level) {
54 case 0: {
55 resvar = r->result;
56 break;
57 }
58 case 1: {
59 resvar = r->collect;
60 break;
61 }
62 case 2: {
63 resvar = r->reduced;
64 break;
65 }
66 }
67 r->writeTo(ofs, resvar->dataPointer, iframe);
68 }
69 ofs << "\n";
70 }
71 ofs.close();
72}
73
74void RuleSet::appendHeader(std::shared_ptr<RuleEvaluator>& expr_rule) {
75 auto& res = expr_rule->result;
76 std::stringstream ss;
77 switch (res->dataType) {
78 case kids_real_type: {
79 for (int i = 0; i < expr_rule->totalTermNumber; ++i) { //
80 if (expr_rule->totalTermNumber == 1) {
81 ss << FMT(8) << res->name;
82 } else {
83 ss << FMT(8) << utils::concat(res->name, i);
84 }
85 }
86 break;
87 }
88 case kids_complex_type: {
89 for (int i = 0; i < expr_rule->totalTermNumber; ++i) {
90 if (expr_rule->totalTermNumber == 1) {
91 ss << FMT(8) << utils::concat("R", res->name) //
92 << FMT(8) << utils::concat("I", res->name);
93 } else {
94 ss << FMT(8) << utils::concat("R", res->name, i) //
95 << FMT(8) << utils::concat("I", res->name, i);
96 }
97 }
98 break;
99 }
100 }
101 header += ss.str();
102}
103
104std::vector<std::shared_ptr<RuleEvaluator>>& RuleSet::getRules() { return rules; }
105
107 Result res{};
108 std::shared_ptr<VariableDescriptor> resvar;
109 for (auto& r : rules) {
110 switch (level) {
111 case 0: {
112 resvar = r->result;
113 break;
114 }
115 case 1: {
116 resvar = r->collect;
117 break;
118 }
119 case 2: {
120 resvar = r->reduced;
121 break;
122 }
123 }
124 std::string key = utils::concat(resvar->field, ".", resvar->name);
125 res._data.push_back(std::make_tuple(key, //
126 resvar->dataPointer, //
127 resvar->dataType, //
128 resvar->shape->size(), //
130 ));
131 }
132 return res;
133}
134
135}; // namespace PROJECT_NS
provide RuleEvaluator class
provide RuleSet class
std::vector< std::shared_ptr< RuleEvaluator > > rules
List of RuleEvaluator.
Definition RuleSet.h:88
std::string header
The header of set.
Definition RuleSet.h:86
void appendHeader(std::shared_ptr< RuleEvaluator > &expr_rule)
Append header information to the output file.
Definition RuleSet.cpp:74
void flush(const std::string &path, int level)
Flush data to the output file.
Definition RuleSet.cpp:47
static void registerRulesInRuleSet(std::shared_ptr< RuleEvaluator > &exprRule)
Register rules in the RuleSet for a specific input/output file.
Definition RuleSet.cpp:17
void registerRules(std::shared_ptr< RuleEvaluator > &exprRule)
Definition RuleSet.cpp:29
std::string unique_name
Definition RuleSet.h:85
static std::vector< std::shared_ptr< RuleSet > > & getRuleSets()
Get the list of RuleSet instances.
Definition RuleSet.cpp:12
Result getResult(int level)
Definition RuleSet.cpp:106
std::vector< std::shared_ptr< RuleEvaluator > > & getRules()
Definition RuleSet.cpp:104
size_t totalFrameNumber
The number of frames.
Definition RuleSet.h:87
static void flush_all(const std::string &path, int level)
Flush data to all output files.
Definition RuleSet.cpp:42
utils for formating
#define FMT(X)
Definition fmt.h:40
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
@ kids_real_type
Represents real number type.
Definition Types.h:47
@ kids_complex_type
Represents complex number type.
Definition Types.h:48
std::basic_string< CharT > concat(const separator_t< CharT > &sep, Args &&... seq)
Definition concat.h:242