Loading...
Searching...
No Matches
SymEngine::FuncArgTracker Class Reference
+ Collaboration diagram for SymEngine::FuncArgTracker:

Public Member Functions

 FuncArgTracker (const std::vector< std::pair< RCP< const Basic >, vec_basic > > &funcs)
 
template<typename Container >
vec_basic get_args_in_value_order (Container &argset)
 
unsigned get_or_add_value_number (RCP< const Basic > value)
 
void stop_arg_tracking (unsigned func_i)
 
std::map< unsigned, unsigned > get_common_arg_candidates (std::set< unsigned > &argset, unsigned min_func_i)
 
template<typename Container1 , typename Container2 >
std::vector< unsigned > get_subset_candidates (const Container1 &argset, const Container2 &restrict_to_funcset)
 
void update_func_argset (unsigned func_i, const std::vector< unsigned > &new_args)
 

Data Fields

std::unordered_map< RCP< const Basic >, unsigned, RCPBasicHash, RCPBasicKeyEqvalue_numbers
 
vec_basic value_number_to_value
 
std::vector< std::set< unsigned > > arg_to_funcset
 
std::vector< std::set< unsigned > > func_to_argset
 

Detailed Description

Definition at line 15 of file cse.cpp.

Constructor & Destructor Documentation

◆ FuncArgTracker()

SymEngine::FuncArgTracker::FuncArgTracker ( const std::vector< std::pair< RCP< const Basic >, vec_basic > > &  funcs)
inline

Definition at line 26 of file cse.cpp.

28 {
29 arg_to_funcset.resize(funcs.size());
30 for (unsigned func_i = 0; func_i < funcs.size(); func_i++) {
31 std::set<unsigned> func_argset;
32 for (auto &func_arg : funcs[func_i].second) {
33 unsigned arg_number = get_or_add_value_number(func_arg);
34 func_argset.insert(arg_number);
35 arg_to_funcset[arg_number].insert(func_i);
36 }
37 func_to_argset.push_back(func_argset);
38 }
39 }
T insert(T... args)
T push_back(T... args)
T resize(T... args)
T size(T... args)

Member Function Documentation

◆ get_args_in_value_order()

template<typename Container >
vec_basic SymEngine::FuncArgTracker::get_args_in_value_order ( Container &  argset)
inline

Definition at line 42 of file cse.cpp.

43 {
44 vec_basic v;
45 for (unsigned i : argset) {
46 v.push_back(value_number_to_value[i]);
47 }
48 return v;
49 }

◆ get_common_arg_candidates()

std::map< unsigned, unsigned > SymEngine::FuncArgTracker::get_common_arg_candidates ( std::set< unsigned > &  argset,
unsigned  min_func_i 
)
inline

Definition at line 78 of file cse.cpp.

79 {
82 for (unsigned arg : argset) {
83 funcsets.push_back(arg_to_funcset[arg]);
84 }
85 // Sorted by size to make best use of the performance hack below.
86 std::sort(funcsets.begin(), funcsets.end(),
87 [](const std::set<unsigned> &a, const std::set<unsigned> &b) {
88 return a.size() < b.size();
89 });
90
91 for (unsigned i = 0; i < funcsets.size(); i++) {
92 auto &funcset = funcsets[i];
93 for (unsigned func_i : funcset) {
94 if (func_i >= min_func_i) {
95 count_map[func_i] += 1;
96 }
97 }
98 }
99
100 /*auto &largest_funcset = funcsets[funcsets.size() - 1];
101
102 // We pick the smaller of the two containers to iterate over to
103 // reduce the number of items we have to look at.
104
105 if (largest_funcset.size() < count_map.size()) {
106 for (unsigned func_i : largest_funcset) {
107 if (count_map[func_i] < 1) {
108 continue;
109 }
110 if (count_map.find(func_i) != count_map.end()) {
111 count_map[func_i] += 1;
112 }
113 }
114 } else {
115 for (auto &count_map_pair : count_map) {
116 unsigned func_i = count_map_pair.first;
117 if (count_map[func_i] < 1) {
118 continue;
119 }
120 if (largest_funcset.find(func_i) != largest_funcset.end()) {
121 count_map[func_i] += 1;
122 }
123 }
124 }*/
125 auto iter = count_map.begin();
126 for (; iter != count_map.end();) {
127 if (iter->second >= 2) {
128 ++iter;
129 } else {
130 count_map.erase(iter++);
131 }
132 }
133 return count_map;
134 }
T begin(T... args)
T end(T... args)
T erase(T... args)
T sort(T... args)

◆ get_or_add_value_number()

unsigned SymEngine::FuncArgTracker::get_or_add_value_number ( RCP< const Basic value)
inline

Definition at line 51 of file cse.cpp.

52 {
53 unsigned nvalues = numeric_cast<unsigned>(value_numbers.size());
54 auto ret = value_numbers.insert(std::make_pair(value, nvalues));
55 bool inserted = ret.second;
56 if (inserted) {
57 value_number_to_value.push_back(value);
58 arg_to_funcset.push_back(std::set<unsigned>());
59 return nvalues;
60 } else {
61 return ret.first->second;
62 }
63 }
T make_pair(T... args)

◆ get_subset_candidates()

template<typename Container1 , typename Container2 >
std::vector< unsigned > SymEngine::FuncArgTracker::get_subset_candidates ( const Container1 &  argset,
const Container2 &  restrict_to_funcset 
)
inline

Definition at line 138 of file cse.cpp.

140 {
141 std::vector<unsigned> indices;
142 for (auto f : restrict_to_funcset) {
143 indices.push_back(f);
144 }
145 std::sort(std::begin(indices), std::end(indices));
146 std::vector<unsigned> intersect_result;
147 for (const auto &arg : argset) {
148 std::set_intersection(indices.begin(), indices.end(),
149 arg_to_funcset[arg].begin(),
150 arg_to_funcset[arg].end(),
151 std::back_inserter(intersect_result));
152 intersect_result.swap(indices);
153 intersect_result.clear();
154 }
155 return indices;
156 }
T back_inserter(T... args)
T clear(T... args)
T set_intersection(T... args)
T swap(T... args)

◆ stop_arg_tracking()

void SymEngine::FuncArgTracker::stop_arg_tracking ( unsigned  func_i)
inline

Definition at line 65 of file cse.cpp.

66 {
67 for (unsigned arg : func_to_argset[func_i]) {
68 arg_to_funcset[arg].erase(func_i);
69 }
70 }

◆ update_func_argset()

void SymEngine::FuncArgTracker::update_func_argset ( unsigned  func_i,
const std::vector< unsigned > &  new_args 
)
inline

Definition at line 158 of file cse.cpp.

160 {
161 // Update a function with a new set of arguments.
162 auto &old_args = func_to_argset[func_i];
163
165 std::set_difference(old_args.begin(), old_args.end(), new_args.begin(),
166 new_args.end(), std::inserter(diff, diff.begin()));
167
168 for (auto &deleted_arg : diff) {
169 arg_to_funcset[deleted_arg].erase(func_i);
170 }
171
172 diff.clear();
173 std::set_difference(new_args.begin(), new_args.end(), old_args.begin(),
174 old_args.end(), std::inserter(diff, diff.begin()));
175
176 for (auto &added_arg : diff) {
177 arg_to_funcset[added_arg].insert(func_i);
178 }
179
180 func_to_argset[func_i].clear();
181 func_to_argset[func_i].insert(new_args.begin(), new_args.end());
182 }
T inserter(T... args)
T set_difference(T... args)

Field Documentation

◆ arg_to_funcset

std::vector<std::set<unsigned> > SymEngine::FuncArgTracker::arg_to_funcset

Definition at line 22 of file cse.cpp.

◆ func_to_argset

std::vector<std::set<unsigned> > SymEngine::FuncArgTracker::func_to_argset

Definition at line 23 of file cse.cpp.

◆ value_number_to_value

vec_basic SymEngine::FuncArgTracker::value_number_to_value

Definition at line 21 of file cse.cpp.

◆ value_numbers

std::unordered_map<RCP<const Basic>, unsigned, RCPBasicHash, RCPBasicKeyEq> SymEngine::FuncArgTracker::value_numbers

Definition at line 20 of file cse.cpp.


The documentation for this class was generated from the following file: