-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changing Model.constraints, and Reduction.new_top to be a Vec<Expression> #435
base: main
Are you sure you want to change the base?
Conversation
@niklasdewally @ozgurakgun Since we are changing I'm asking this because in rewrite_iteration expression is not a Vec<>, and I'm not sure how to handle that. fn rewrite_iteration<'a>(
expression: &'a Vec<Expression>,
model: &'a Model,
rules: &'a Vec<&'a Rule<'a>>,
apply_optimizations: bool,
stats: &mut RewriterStats,
) -> Option<Reduction> {
if apply_optimizations && expression.is_clean() { // should we use expression.first in here???
// Skip processing this expression if it's clean
return None;
}
// Mark the expression as clean - will be marked dirty if any rule is applied
let mut expression = expression.clone();
let rule_results = apply_all_rules(&expression, model, rules, stats); // should we try to iterate through the Vector, or expression.first would be just fine?
if let Some(new) = choose_rewrite(&rule_results, &expression) {
// If a rule is applied, mark the expression as dirty
return Some(new);
}
let mut sub = expression.children();
for i in 0..sub.len() {
if let Some(red) = rewrite_iteration(&sub[i], model, rules, apply_optimizations, stats) {
sub[i] = red.new_expression;
let res = expression.with_children(sub.clone());
return Some(Reduction::new(res, red.new_top, red.symbols));
}
}
// If all children are clean, mark this expression as clean
if apply_optimizations {
assert!(expression.children().iter().all(|c| c.is_clean()));
expression.set_clean(true);
return Some(Reduction::pure(expression));
}
None
} |
We currently have a top level |
Agreed. So the vector can, and often will, contain multiple expressions in it. |
Code and Documentation Coverage ReportDocumentation CoverageClick to view documentation coverage for this PR
Click to view documentation coverage for main
Code Coverage SummaryThis PR: Detailed Report
Main: Detailed Report
Coverage Main & PR Coverage ChangeLines coverage changed by -16.80% and covered lines changed by -906
Functions coverage changed by -9.80% and covered lines changed by -85
Branches... coverage: No comparison data available |
to me it looks like rewrite_iteration should operate on expressions, not vectors. we aren't rewriting vectors of expressions at a time after all? |
Good point. |
db6441b
to
cec2eab
Compare
I run into the same problem I had last time. For some reason on some models it's getting in an infinite loop, but I don't know exactly where and why. I'm planning to run it in a debug mode, but I don't know how. @niklasdewally Can you tell me how to do that?I want to run |
}; | ||
x.clone() | ||
// Transform all constraints in the model | ||
model.constraints.transform(Arc::new(|expressions| { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
due to uniplate this should work without an explicit for loop, i.e. the previous version unchanged. does it?
when I say unchanged, I think you would need to change transform to transform_bi
also, since this is an assertion and it is not going to update the model, we should probably change it to use universe/universe_bi.
&mut stats, | ||
) { | ||
step.apply(&mut new_model); // Apply side-effects (e.g. symbol table updates) | ||
let constraints = new_model.constraints.clone(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fine for now, but just to note that in gen_reduce (or whatever it's called) this for loop shouldn't be necessary. it's a container containing expressions, the top level container can be a vector of expressions or just an expression, it shouldn't matter via uniplate/biplate. fyi @lixitrixi @niklasdewally @YehorBoiar
is the debugging section here useful: https://code.visualstudio.com/docs/languages/rust assuming you are using vs code. |
RUST_LOG= cargo run -- --verbose INFO is the default log level, if thats all you need, no need to set rustlog, just use --verbose. INFO logs will give you "rule was applied", which might be enough, otherwise use TRACE. I would try info first as trace is very chatty... |
If not, the default binaries created by cargo build, stored in target/debug, have debug symbols for rust-gdb. |
I cancelled the CI runs manually and added time limits to CI jobs in #437 |
cec2eab
to
ef509c5
Compare
This PR is created to address the issue #421.