Skip to content

Commit 71a7378

Browse files
committed
naive variant: alternate way of computing subset errors
1 parent 0ec7954 commit 71a7378

File tree

2 files changed

+47
-30
lines changed

2 files changed

+47
-30
lines changed

polonius-engine/src/output/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ struct Context<'ctx, T: FactTypes> {
126126
loan_issued_at: &'ctx Vec<(T::Origin, T::Loan, T::Point)>,
127127

128128
// static inputs used by variants other than `LocationInsensitive`
129-
cfg_node: &'ctx BTreeSet<T::Point>,
130129
loan_killed_at: Relation<(T::Loan, T::Point)>,
131130
known_contains: Relation<(T::Origin, T::Loan)>,
132131
placeholder_origin: Relation<(T::Origin, ())>,
@@ -268,7 +267,6 @@ impl<T: FactTypes> Output<T> {
268267
origin_live_on_entry,
269268
loan_invalidated_at,
270269
cfg_edge,
271-
cfg_node: &cfg_node,
272270
subset_base: &all_facts.subset_base,
273271
loan_issued_at: &all_facts.loan_issued_at,
274272
loan_killed_at,

polonius-engine/src/output/naive.rs

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@ pub(super) fn compute<T: FactTypes>(
2929
// Static inputs
3030
let origin_live_on_entry_rel = &ctx.origin_live_on_entry;
3131
let cfg_edge_rel = &ctx.cfg_edge;
32-
let cfg_node = ctx.cfg_node;
3332
let loan_killed_at = &ctx.loan_killed_at;
34-
let known_contains = &ctx.known_contains;
33+
let known_subset = &ctx.known_subset;
3534
let placeholder_origin = &ctx.placeholder_origin;
36-
let placeholder_loan = &ctx.placeholder_loan;
3735

3836
// Create a new iteration context, ...
3937
let mut iteration = Iteration::new();
@@ -65,6 +63,10 @@ pub(super) fn compute<T: FactTypes>(
6563
let errors = iteration.variable("errors");
6664
let subset_errors = iteration.variable::<(T::Origin, T::Origin, T::Point)>("subset_errors");
6765

66+
let subset_placeholder =
67+
iteration.variable::<(T::Origin, T::Origin, T::Point)>("subset_placeholder");
68+
let subset_placeholder_o2p = iteration.variable_indistinct("subset_placeholder_o2p");
69+
6870
// load initial facts.
6971
subset.extend(ctx.subset_base.iter());
7072
origin_contains_loan_on_entry.extend(ctx.loan_issued_at.iter());
@@ -79,20 +81,6 @@ pub(super) fn compute<T: FactTypes>(
7981
.map(|&(origin, point)| ((origin, point), ())),
8082
);
8183

82-
// Placeholder loans are contained by their placeholder origin at all points of the CFG.
83-
//
84-
// contains(Origin, Loan, Node) :-
85-
// cfg_node(Node),
86-
// placeholder(Origin, Loan).
87-
let mut placeholder_loans = Vec::with_capacity(placeholder_loan.len() * cfg_node.len());
88-
for &(loan, origin) in placeholder_loan.iter() {
89-
for &node in cfg_node.iter() {
90-
placeholder_loans.push((origin, loan, node));
91-
}
92-
}
93-
94-
origin_contains_loan_on_entry.extend(placeholder_loans);
95-
9684
// .. and then start iterating rules!
9785
while iteration.changed() {
9886
// Cleanup step: remove symmetries
@@ -109,6 +97,15 @@ pub(super) fn compute<T: FactTypes>(
10997
.elements
11098
.retain(|&(origin1, origin2, _)| origin1 != origin2);
11199

100+
subset_placeholder
101+
.recent
102+
.borrow_mut()
103+
.elements
104+
.retain(|&(origin1, origin2, _)| origin1 != origin2);
105+
subset_placeholder_o2p.from_map(&subset_placeholder, |&(origin1, origin2, point)| {
106+
((origin2, point), origin1)
107+
});
108+
112109
// remap fields to re-index by keys.
113110
subset_o1p.from_map(&subset, |&(origin1, origin2, point)| {
114111
((origin1, point), origin2)
@@ -196,23 +193,45 @@ pub(super) fn compute<T: FactTypes>(
196193
|&(loan, point), _, _| (loan, point),
197194
);
198195

196+
// subset_placeholder(Origin1, Origin2, Point) :-
197+
// subset(Origin1, Origin2, Point),
198+
// placeholder_origin(Origin1).
199+
subset_placeholder.from_leapjoin(
200+
&subset_o1p,
201+
(
202+
placeholder_origin.extend_with(|&((origin1, _point), _origin2)| origin1),
203+
// remove symmetries:
204+
datafrog::ValueFilter::from(|&((origin1, _point), origin2), _| {
205+
origin1 != origin2
206+
}),
207+
),
208+
|&((origin1, point), origin2), _| (origin1, origin2, point),
209+
);
210+
211+
// subset_placeholder(Origin1, Origin3, Point) :-
212+
// subset_placeholder(Origin1, Origin2, Point),
213+
// subset(Origin2, Origin3, Point).
214+
subset_placeholder.from_join(
215+
&subset_placeholder_o2p,
216+
&subset_o1p,
217+
|&(_origin2, point), &origin1, &origin3| (origin1, origin3, point),
218+
);
219+
199220
// subset_errors(Origin1, Origin2, Point) :-
200-
// origin_contains_loan_on_entry(Origin2, Loan1, Point),
201-
// placeholder(Origin2, _),
202-
// placeholder(Origin1, Loan1),
203-
// !known_contains(Origin2, Loan1).
221+
// subset_placeholder(Origin1, Origin2, Point),
222+
// placeholder_origin(Origin2),
223+
// !known_subset(Origin1, Origin2).
204224
subset_errors.from_leapjoin(
205-
&origin_contains_loan_on_entry,
225+
&subset_placeholder,
206226
(
207-
placeholder_origin.filter_with(|&(origin2, _loan1, _point)| (origin2, ())),
208-
placeholder_loan.extend_with(|&(_origin2, loan1, _point)| loan1),
209-
known_contains.filter_anti(|&(origin2, loan1, _point)| (origin2, loan1)),
227+
placeholder_origin.extend_with(|&(_origin1, origin2, _point)| origin2),
228+
known_subset.filter_anti(|&(origin1, origin2, _point)| (origin1, origin2)),
210229
// remove symmetries:
211-
datafrog::ValueFilter::from(|&(origin2, _loan1, _point), &origin1| {
212-
origin2 != origin1
230+
datafrog::ValueFilter::from(|&(origin1, origin2, _point), _| {
231+
origin1 != origin2
213232
}),
214233
),
215-
|&(origin2, _loan1, point), &origin1| (origin1, origin2, point),
234+
|&(origin1, origin2, point), _| (origin1, origin2, point),
216235
);
217236
}
218237

0 commit comments

Comments
 (0)