Skip to content

Commit 6e64652

Browse files
authored
refactor formula util (#299)
1 parent da73627 commit 6e64652

File tree

7 files changed

+197
-185
lines changed

7 files changed

+197
-185
lines changed

src/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ CXXFLAGS += -DLODA_PLATFORM=$(LODA_PLATFORM)
99
endif
1010

1111
OBJS = cmd/benchmark.o cmd/boinc.o cmd/commands.o cmd/main.o cmd/test.o \
12-
form/expression_util.o form/expression.o form/formula_alt.o form/formula_gen.o form/formula.o form/pari.o \
12+
form/expression_util.o form/expression.o form/formula_alt.o form/formula_gen.o form/formula_util.o form/formula.o form/pari.o \
1313
lang/analyzer.o lang/big_number.o lang/comments.o lang/evaluator.o lang/evaluator_inc.o lang/interpreter.o lang/memory.o lang/minimizer.o lang/number.o lang/optimizer.o lang/parser.o lang/program.o lang/program_util.o lang/semantics.o lang/sequence.o \
1414
mine/api_client.o mine/blocks.o mine/config.o mine/distribution.o mine/extender.o mine/finder.o mine/generator_v1.o mine/generator_v2.o mine/generator_v3.o mine/generator_v4.o mine/generator_v5.o mine/generator_v6.o mine/generator_v7.o mine/generator_v8.o mine/generator.o mine/iterator.o mine/matcher.o mine/miner.o mine/mutator.o mine/reducer.o mine/stats.o \
1515
oeis/oeis_list.o oeis/oeis_manager.o oeis/oeis_program.o oeis/oeis_sequence.o \

src/Makefile.windows.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ CXXFLAGS = $(CXXFLAGS) /DLODA_PLATFORM=$(LODA_PLATFORM)
1111
!ENDIF
1212

1313
SRCS = cmd/benchmark.cpp cmd/boinc.cpp cmd/commands.cpp cmd/main.cpp cmd/test.cpp \
14-
form/expression_util.cpp form/expression.cpp form/formula_alt.cpp form/formula_gen.cpp form/formula.cpp form/pari.cpp \
14+
form/expression_util.cpp form/expression.cpp form/formula_alt.cpp form/formula_gen.cpp form/formula_util.cpp form/formula.cpp form/pari.cpp \
1515
lang/analyzer.cpp lang/big_number.cpp lang/comments.cpp lang/evaluator.cpp lang/evaluator_inc.cpp lang/interpreter.cpp lang/memory.cpp lang/minimizer.cpp lang/number.cpp lang/optimizer.cpp lang/parser.cpp lang/program.cpp lang/program_util.cpp lang/semantics.cpp lang/sequence.cpp \
1616
mine/api_client.cpp mine/blocks.cpp mine/config.cpp mine/distribution.cpp mine/extender.cpp mine/finder.cpp mine/generator.cpp mine/generator_v1.cpp mine/generator_v2.cpp mine/generator_v3.cpp mine/generator_v4.cpp mine/generator_v5.cpp mine/generator_v6.cpp mine/generator_v7.cpp mine/generator_v8.cpp mine/iterator.cpp mine/matcher.cpp mine/miner.cpp mine/mutator.cpp mine/reducer.cpp mine/stats.cpp \
1717
oeis/oeis_list.cpp oeis/oeis_manager.cpp oeis/oeis_program.cpp oeis/oeis_sequence.cpp \

src/form/formula.cpp

Lines changed: 0 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -158,177 +158,3 @@ void Formula::collectEntries(const Expression& e, Formula& target) {
158158
collectEntries(*c, target);
159159
}
160160
}
161-
162-
void Formula::resolveIdentities() {
163-
auto copy = entries;
164-
for (auto& e : copy) {
165-
if (ExpressionUtil::isSimpleFunction(e.first) &&
166-
ExpressionUtil::isSimpleFunction(e.second) &&
167-
copy.find(e.second) != copy.end()) {
168-
entries.erase(e.first);
169-
replaceName(e.second.name, e.first.name);
170-
}
171-
}
172-
}
173-
174-
void replaceFunction(Expression& target, const std::string& func,
175-
const Expression& param, const Expression& val) {
176-
// bottom-up
177-
for (const auto& c : target.children) {
178-
replaceFunction(*c, func, param, val);
179-
}
180-
ExpressionUtil::normalize(target);
181-
if (target.type != Expression::Type::FUNCTION ||
182-
target.children.size() != 1 || target.name != func) {
183-
return;
184-
}
185-
auto updated = val;
186-
updated.replaceAll(param, *target.children.front());
187-
ExpressionUtil::normalize(updated);
188-
target = updated;
189-
}
190-
191-
void Formula::resolveSimpleFunctions() {
192-
// collect function definitions
193-
std::set<std::string> simple_funcs;
194-
std::map<std::string, Expression> params, defs;
195-
for (auto& e : entries) {
196-
if (ExpressionUtil::isSimpleFunction(e.first)) {
197-
simple_funcs.insert(e.first.name);
198-
params[e.first.name] = *e.first.children.front();
199-
defs[e.first.name] = e.second;
200-
}
201-
}
202-
// filter out non-simple functions
203-
auto deps = getFunctionDeps(false, false);
204-
for (auto& e : entries) {
205-
if (e.first.type != Expression::Type::FUNCTION) {
206-
continue; // should not happen
207-
}
208-
auto f = e.first.name;
209-
bool is_simple = true;
210-
if (!ExpressionUtil::isSimpleFunction(e.first)) {
211-
is_simple = false;
212-
}
213-
for (auto it : deps) {
214-
if (it.first == f && containsFunctionDef(it.second)) {
215-
is_simple = false;
216-
break;
217-
}
218-
}
219-
if (!is_simple) {
220-
simple_funcs.erase(e.first.name);
221-
}
222-
}
223-
// perform replacements
224-
for (const auto& f : simple_funcs) {
225-
for (auto& e : entries) {
226-
replaceFunction(e.second, f, params[f], defs[f]);
227-
}
228-
}
229-
}
230-
231-
void Formula::resolveSimpleRecursions() {
232-
// collect functions
233-
std::set<std::string> funcs;
234-
for (auto& e : entries) {
235-
if (ExpressionUtil::isSimpleFunction(e.first)) {
236-
funcs.insert(e.first.name);
237-
}
238-
}
239-
// collect and check their slopes and offsets
240-
std::map<std::string, Number> slopes, offsets;
241-
std::map<std::string, Expression> params;
242-
std::map<Number, Number> constants;
243-
for (auto& f : funcs) {
244-
constants.clear();
245-
bool found_slope = false;
246-
Number slope = 0;
247-
for (auto& e : entries) {
248-
if (e.first.type != Expression::Type::FUNCTION) {
249-
continue;
250-
}
251-
if (e.first.name != f) {
252-
continue;
253-
}
254-
auto arg_type = e.first.children.front()->type;
255-
if (arg_type == Expression::Type::CONSTANT) {
256-
if (e.second.type != Expression::Type::CONSTANT) {
257-
constants.clear();
258-
break;
259-
}
260-
constants[e.first.children.front()->value] = e.second.value;
261-
} else if (arg_type == Expression::Type::PARAMETER) {
262-
params[f] = *e.first.children.front();
263-
auto val = e.second;
264-
if (val.type != Expression::Type::SUM) {
265-
found_slope = false;
266-
break;
267-
}
268-
if (val.children.size() != 2) {
269-
found_slope = false;
270-
break;
271-
}
272-
if (val.children.at(1)->type != Expression::Type::CONSTANT) {
273-
found_slope = false;
274-
break;
275-
}
276-
Expression predecessor(
277-
Expression::Type::SUM, "",
278-
{params[f],
279-
Expression(Expression::Type::CONSTANT, "", Number(-1))});
280-
Expression prevTerm(Expression::Type::FUNCTION, f, {predecessor});
281-
if (*val.children.at(0) != prevTerm) {
282-
found_slope = false;
283-
break;
284-
}
285-
slope = val.children.at(1)->value;
286-
found_slope = true;
287-
} else {
288-
found_slope = false;
289-
break;
290-
}
291-
}
292-
if (!found_slope || constants.find(Number::ZERO) == constants.end()) {
293-
continue;
294-
}
295-
auto offset = constants.at(Number::ZERO);
296-
for (const auto& c : constants) {
297-
auto expected_val = slope;
298-
expected_val *= c.first;
299-
expected_val += offset;
300-
if (c.second != expected_val) {
301-
found_slope = false;
302-
break;
303-
}
304-
}
305-
if (found_slope) {
306-
slopes[f] = slope;
307-
offsets[f] = offset;
308-
}
309-
}
310-
for (auto& f : funcs) {
311-
if (slopes.find(f) == slopes.end()) {
312-
continue;
313-
}
314-
// remove function
315-
auto it = entries.begin();
316-
while (it != entries.end()) {
317-
if (it->first.name == f) {
318-
it = entries.erase(it);
319-
} else {
320-
it++;
321-
}
322-
}
323-
// add simple function
324-
Expression prod(
325-
Expression::Type::PRODUCT, "",
326-
{Expression(Expression::Type::CONSTANT, "", slopes[f]), params[f]});
327-
Expression sum(
328-
Expression::Type::SUM, "",
329-
{Expression(Expression::Type::CONSTANT, "", offsets[f]), prod});
330-
ExpressionUtil::normalize(sum);
331-
Expression func(Expression::Type::FUNCTION, f, {params[f]});
332-
entries[func] = sum;
333-
}
334-
}

src/form/formula.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,5 @@ class Formula {
2828

2929
void collectEntries(const Expression& e, Formula& target);
3030

31-
void resolveIdentities();
32-
33-
void resolveSimpleFunctions();
34-
35-
void resolveSimpleRecursions();
36-
3731
std::map<Expression, Expression> entries;
3832
};

src/form/formula_gen.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "form/expression_util.hpp"
77
#include "form/formula_alt.hpp"
8+
#include "form/formula_util.hpp"
89
#include "lang/evaluator_inc.hpp"
910
#include "lang/parser.hpp"
1011
#include "lang/program_util.hpp"
@@ -322,11 +323,11 @@ bool FormulaGenerator::generateSingle(const Program& p) {
322323
}
323324

324325
// resolve linear functions
325-
formula.resolveSimpleRecursions();
326+
FormulaUtil::resolveSimpleRecursions(formula);
326327
Log::get().debug("Resolved simple recursions: " + formula.toString());
327328

328329
// resolve linear functions
329-
formula.resolveSimpleFunctions();
330+
FormulaUtil::resolveSimpleFunctions(formula);
330331
Log::get().debug("Resolved simple functions: " + formula.toString());
331332

332333
// extract main formula (filter out irrelant memory cells)
@@ -336,7 +337,7 @@ bool FormulaGenerator::generateSingle(const Program& p) {
336337
Log::get().debug("Pruned formula: " + formula.toString());
337338

338339
// resolve identities
339-
formula.resolveIdentities();
340+
FormulaUtil::resolveIdentities(formula);
340341
Log::get().debug("Resolved identities: " + formula.toString());
341342

342343
// success

0 commit comments

Comments
 (0)