@@ -55,10 +55,14 @@ class AlphaEquivalenceSolver : public SolverImpl {
5555 void notifyStateTermination (std::uint32_t id);
5656 ValidityCore changeVersion (const ValidityCore &validityCore,
5757 const ExprHashMap<ref<Expr>> &reverse);
58- const std::vector<const Array *>
58+ std::vector<const Array *>
5959 changeVersion (const std::vector<const Array *> &objects,
6060 const ArrayCache::ArrayHashMap<const Array *> &reverse);
6161 Assignment
62+ changeVersion (const std::vector<const Array *> &objects,
63+ const std::vector<SparseStorage<unsigned char >> &values,
64+ const ArrayCache::ArrayHashMap<const Array *> &reverse);
65+ Assignment
6266 changeVersion (const Assignment &a,
6367 const ArrayCache::ArrayHashMap<const Array *> &reverse);
6468 ref<SolverResponse> changeVersion (ref<SolverResponse> res,
@@ -80,12 +84,29 @@ AlphaEquivalenceSolver::changeVersion(const ValidityCore &validityCore,
8084 return reverseValidityCore;
8185}
8286
83- const std::vector<const Array *> AlphaEquivalenceSolver::changeVersion (
87+ Assignment AlphaEquivalenceSolver::changeVersion (
88+ const std::vector<const Array *> &objects,
89+ const std::vector<SparseStorage<unsigned char >> &values,
90+ const ArrayCache::ArrayHashMap<const Array *> &reverse) {
91+ std::vector<const Array *> reverseObjects;
92+ std::vector<SparseStorage<unsigned char >> reverseValues;
93+ for (size_t i = 0 ; i < objects.size (); i++) {
94+ if (reverse.count (objects.at (i)) != 0 ) {
95+ reverseObjects.push_back (reverse.at (objects.at (i)));
96+ reverseValues.push_back (values.at (i));
97+ }
98+ }
99+ return Assignment (reverseObjects, reverseValues);
100+ }
101+
102+ std::vector<const Array *> AlphaEquivalenceSolver::changeVersion (
84103 const std::vector<const Array *> &objects,
85104 const ArrayCache::ArrayHashMap<const Array *> &reverse) {
86105 std::vector<const Array *> reverseObjects;
87- for (auto it : objects) {
88- reverseObjects.push_back (reverse.at (it));
106+ for (size_t i = 0 ; i < objects.size (); i++) {
107+ if (reverse.count (objects.at (i)) != 0 ) {
108+ reverseObjects.push_back (reverse.at (objects.at (i)));
109+ }
89110 }
90111 return reverseObjects;
91112}
@@ -95,8 +116,7 @@ Assignment AlphaEquivalenceSolver::changeVersion(
95116 const ArrayCache::ArrayHashMap<const Array *> &reverse) {
96117 std::vector<const Array *> objects = a.keys ();
97118 std::vector<SparseStorage<unsigned char >> values = a.values ();
98- objects = changeVersion (objects, reverse);
99- return Assignment (objects, values);
119+ return changeVersion (objects, values, reverse);
100120}
101121
102122ref<SolverResponse>
@@ -136,7 +156,7 @@ bool AlphaEquivalenceSolver::computeValidity(const Query &query,
136156 PartialValidity &result) {
137157 AlphaBuilder builder (arrayCache);
138158 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
139- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
159+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
140160 return solver->impl ->computeValidity (
141161 Query (ConstraintSet (alphaQuery, {}, {}), alphaQueryExpr, query.id ),
142162 result);
@@ -145,7 +165,7 @@ bool AlphaEquivalenceSolver::computeValidity(const Query &query,
145165bool AlphaEquivalenceSolver::computeTruth (const Query &query, bool &isValid) {
146166 AlphaBuilder builder (arrayCache);
147167 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
148- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
168+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
149169 return solver->impl ->computeTruth (
150170 Query (ConstraintSet (alphaQuery, {}, {}), alphaQueryExpr, query.id ),
151171 isValid);
@@ -155,7 +175,7 @@ bool AlphaEquivalenceSolver::computeValue(const Query &query,
155175 ref<Expr> &result) {
156176 AlphaBuilder builder (arrayCache);
157177 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
158- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
178+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
159179 return solver->impl ->computeValue (
160180 Query (ConstraintSet (alphaQuery, {}, {}), alphaQueryExpr, query.id ),
161181 result);
@@ -166,7 +186,7 @@ bool AlphaEquivalenceSolver::computeInitialValues(
166186 std::vector<SparseStorage<unsigned char >> &values, bool &hasSolution) {
167187 AlphaBuilder builder (arrayCache);
168188 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
169- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
189+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
170190 const std::vector<const Array *> newObjects =
171191 changeVersion (objects, builder.alphaArrayMap );
172192
@@ -183,7 +203,7 @@ bool AlphaEquivalenceSolver::check(const Query &query,
183203 AlphaBuilder builder (arrayCache);
184204
185205 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
186- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
206+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
187207 result = createAlphaVersion (result, builder);
188208 if (!solver->impl ->check (
189209 Query (ConstraintSet (alphaQuery, {}, {}), alphaQueryExpr, query.id ),
@@ -201,7 +221,7 @@ bool AlphaEquivalenceSolver::computeValidityCore(const Query &query,
201221 AlphaBuilder builder (arrayCache);
202222
203223 constraints_ty alphaQuery = builder.visitConstraints (query.constraints .cs ());
204- ref<Expr> alphaQueryExpr = builder.visitExpr (query.expr );
224+ ref<Expr> alphaQueryExpr = builder.build (query.expr );
205225 if (!solver->impl ->computeValidityCore (
206226 Query (ConstraintSet (alphaQuery, {}, {}), alphaQueryExpr, query.id ),
207227 validityCore, isValid)) {
0 commit comments