Skip to content

Commit a6dbde6

Browse files
Eagerly filter reflexive subset relations in opt variant
1 parent cbdb555 commit a6dbde6

File tree

1 file changed

+13
-36
lines changed

1 file changed

+13
-36
lines changed

polonius-engine/src/output/datafrog_opt.rs

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -173,25 +173,6 @@ pub(super) fn compute<T: FactTypes>(
173173

174174
// .. and then start iterating rules!
175175
while iteration.changed() {
176-
// Cleanup step: remove symmetries
177-
// - remove origins which are `subset`s of themselves
178-
//
179-
// FIXME: investigate whether is there a better way to do that without complicating
180-
// the rules too much, because it would also require temporary variables and
181-
// impact performance. Until then, the big reduction in tuples improves performance
182-
// a lot, even if we're potentially adding a small number of tuples
183-
// per round just to remove them in the next round.
184-
subset_o1p
185-
.recent
186-
.borrow_mut()
187-
.elements
188-
.retain(|&((origin1, _), origin2)| origin1 != origin2);
189-
190-
subset_placeholder
191-
.recent
192-
.borrow_mut()
193-
.elements
194-
.retain(|&(origin1, origin2, _)| origin1 != origin2);
195176
subset_placeholder_o2p.from_map(&subset_placeholder, |&(origin1, origin2, point)| {
196177
((origin2, point), origin1)
197178
});
@@ -299,11 +280,14 @@ pub(super) fn compute<T: FactTypes>(
299280

300281
// subset(origin1, origin3, point2) :-
301282
// live_to_dying_regions(origin1, origin2, point1, point2),
302-
// dying_can_reach_live(origin2, origin3, point1, point2).
303-
subset_o1p.from_join(
283+
// dying_can_reach_live(origin2, origin3, point1, point2),
284+
// origin1 != origin3.
285+
subset_o1p.from_join_filtered(
304286
&live_to_dying_regions_o2pq,
305287
&dying_can_reach_live,
306-
|&(_origin2, _point1, point2), &origin1, &origin3| ((origin1, point2), origin3),
288+
|&(_origin2, _point1, point2), &origin1, &origin3| {
289+
(origin1 != origin3).then(|| ((origin1, point2), origin3))
290+
},
307291
);
308292

309293
// origin_contains_loan_on_entry(origin2, loan, point2) :-
@@ -403,13 +387,7 @@ pub(super) fn compute<T: FactTypes>(
403387
// placeholder_origin(Origin1).
404388
subset_placeholder.from_leapjoin(
405389
&subset_o1p,
406-
(
407-
placeholder_origin.extend_with(|&((origin1, _point), _origin2)| origin1),
408-
// remove symmetries:
409-
datafrog::ValueFilter::from(|&((origin1, _point), origin2), _| {
410-
origin1 != origin2
411-
}),
412-
),
390+
placeholder_origin.extend_with(|&((origin1, _point), _origin2)| origin1),
413391
|&((origin1, point), origin2), _| (origin1, origin2, point),
414392
);
415393

@@ -418,11 +396,14 @@ pub(super) fn compute<T: FactTypes>(
418396
//
419397
// subset_placeholder(Origin1, Origin3, Point) :-
420398
// subset_placeholder(Origin1, Origin2, Point),
421-
// subset(Origin2, Origin3, Point).
422-
subset_placeholder.from_join(
399+
// subset(Origin2, Origin3, Point),
400+
// Origin1 != Origin3.
401+
subset_placeholder.from_join_filtered(
423402
&subset_placeholder_o2p,
424403
&subset_o1p,
425-
|&(_origin2, point), &origin1, &origin3| (origin1, origin3, point),
404+
|&(_origin2, point), &origin1, &origin3| {
405+
(origin1 != origin3).then(|| (origin1, origin3, point))
406+
},
426407
);
427408

428409
// subset_error(Origin1, Origin2, Point) :-
@@ -435,10 +416,6 @@ pub(super) fn compute<T: FactTypes>(
435416
placeholder_origin.extend_with(|&(_origin1, origin2, _point)| origin2),
436417
known_placeholder_subset
437418
.filter_anti(|&(origin1, origin2, _point)| (origin1, origin2)),
438-
// remove symmetries:
439-
datafrog::ValueFilter::from(|&(origin1, origin2, _point), _| {
440-
origin1 != origin2
441-
}),
442419
),
443420
|&(origin1, origin2, point), _| (origin1, origin2, point),
444421
);

0 commit comments

Comments
 (0)