Skip to content

Commit 8f08dea

Browse files
Revert USoftConstraintsProvider
1 parent 552ef60 commit 8f08dea

File tree

1 file changed

+32
-43
lines changed

1 file changed

+32
-43
lines changed

usvm-core/src/main/kotlin/org/usvm/solver/USoftConstraintsProvider.kt

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import org.usvm.UBvSort
2828
import org.usvm.UConcreteHeapRef
2929
import org.usvm.UContext
3030
import org.usvm.UExpr
31-
import org.usvm.UExprTransformer
3231
import org.usvm.UHeapReading
3332
import org.usvm.UIndexedMethodReturnValue
3433
import org.usvm.UInputArrayLengthReading
@@ -42,18 +41,20 @@ import org.usvm.URegisterReading
4241
import org.usvm.USizeExpr
4342
import org.usvm.USort
4443
import org.usvm.USymbol
44+
import org.usvm.UTransformer
4545
import org.usvm.uctx
4646

47-
class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Field, Type>(ctx) {
47+
class USoftConstraintsProvider<Field, Type>(override val ctx: UContext) : UTransformer<Field, Type> {
4848
// We have a list here since sometimes we want to add several soft constraints
4949
// to make it possible to drop only a part of them, not the whole soft constraint
50-
private val caches = hashMapOf<UExpr<*>, Set<UBoolExpr>>().withDefault { emptySet() }
50+
private val caches = hashMapOf<UExpr<*>, Set<UBoolExpr>>()
5151
private val sortPreferredValuesProvider = SortPreferredValuesProvider()
5252

53-
fun provide(initialExpr: UExpr<*>): Set<UBoolExpr> {
54-
apply(initialExpr)
55-
return caches.getValue(initialExpr)
56-
}
53+
fun provide(initialExpr: UExpr<*>): Set<UBoolExpr> =
54+
caches.getOrElse(initialExpr) {
55+
apply(initialExpr)
56+
caches.getOrPut(initialExpr, ::emptySet)
57+
}
5758

5859
// region The most common methods
5960

@@ -62,13 +63,11 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
6263
}
6364

6465
override fun <T : KSort, A : KSort> transformApp(expr: KApp<T, A>): KExpr<T> =
65-
transformExprAfterTransformed(expr, expr.args) { args ->
66-
computeSideEffect(expr) {
67-
val nestedConstraints = args.flatMapTo(mutableSetOf()) { caches.getValue(it) }
68-
val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
66+
computeSideEffect(expr) {
67+
val nestedConstraints = expr.args.flatMapTo(mutableSetOf(), ::provide)
68+
val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
6969

70-
caches[expr] = nestedConstraints + selfConstraint
71-
}
70+
caches[expr] = nestedConstraints + selfConstraint
7271
}
7372

7473
private fun <Sort : USort> transformAppIfPossible(expr: UExpr<Sort>): UExpr<Sort> =
@@ -101,37 +100,31 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
101100

102101
override fun transform(expr: UNullRef): UExpr<UAddressSort> = expr
103102

104-
override fun transform(expr: UIsSubtypeExpr<Type>): UBoolExpr =
105-
error("Illegal operation since UIsExpr should not be translated into a SMT solver")
103+
override fun transform(expr: UIsSubtypeExpr<Type>): UBoolExpr = expr
106104

107-
override fun transform(expr: UIsSupertypeExpr<Type>): UBoolExpr =
108-
error("Illegal operation since UIsExpr should not be translated into a SMT solver")
105+
override fun transform(expr: UIsSupertypeExpr<Type>): UBoolExpr = expr
109106

110107
override fun transform(
111108
expr: UInputArrayLengthReading<Type>,
112-
): USizeExpr = transformExprAfterTransformed(expr, expr.address) {
113-
computeSideEffect(expr) {
114-
with(expr.ctx) {
115-
val addressIsNull = caches.getValue(expr.address)
116-
val arraySize = mkBvSignedLessOrEqualExpr(expr, PREFERRED_MAX_ARRAY_SIZE.toBv())
109+
): USizeExpr = computeSideEffect(expr) {
110+
with(expr.ctx) {
111+
val addressIsNull = provide(expr.address)
112+
val arraySize = mkBvSignedLessOrEqualExpr(expr, PREFERRED_MAX_ARRAY_SIZE.toBv())
117113

118-
caches[expr] = addressIsNull + arraySize
119-
}
114+
caches[expr] = addressIsNull + arraySize
120115
}
121116
}
122117

123118
override fun <Sort : USort> transform(
124119
expr: UInputArrayReading<Type, Sort>,
125-
): UExpr<Sort> = transformExprAfterTransformed(expr, expr.index, expr.address) { _, _ ->
126-
computeSideEffect(expr) {
127-
val constraints = mutableSetOf<UBoolExpr>()
120+
): UExpr<Sort> = computeSideEffect(expr) {
121+
val constraints = mutableSetOf<UBoolExpr>()
128122

129-
constraints += caches.getValue(expr.index)
130-
constraints += caches.getValue(expr.address)
131-
constraints += expr.sort.accept(sortPreferredValuesProvider)(expr)
123+
constraints += provide(expr.index)
124+
constraints += provide(expr.address)
125+
constraints += expr.sort.accept(sortPreferredValuesProvider)(expr)
132126

133-
caches[expr] = constraints
134-
}
127+
caches[expr] = constraints
135128
}
136129

137130
override fun <Sort : USort> transform(expr: UAllocatedArrayReading<Type, Sort>): UExpr<Sort> =
@@ -143,23 +136,19 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
143136
private fun <Sort : USort> readingWithSingleArgumentTransform(
144137
expr: UHeapReading<*, *, Sort>,
145138
arg: UExpr<*>,
146-
): UExpr<Sort> = transformExprAfterTransformed(expr, arg) { _ ->
147-
computeSideEffect(expr) {
148-
val argConstraint = caches.getValue(arg)
149-
val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
139+
): UExpr<Sort> = computeSideEffect(expr) {
140+
val argConstraint = provide(arg)
141+
val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
150142

151-
caches[expr] = argConstraint + selfConstraint
152-
}
143+
caches[expr] = argConstraint + selfConstraint
153144
}
154145

155146
// region KExpressions
156147

157148
override fun <T : KBvSort> transform(expr: KBvSignedLessOrEqualExpr<T>): KExpr<KBoolSort> = with(expr.ctx) {
158-
transformExprAfterTransformed(expr, expr.arg0, expr.arg1) { lhs, rhs ->
159-
computeSideEffect(expr) {
160-
val selfConstraint = mkEq(lhs, rhs)
161-
caches[expr] = mutableSetOf(selfConstraint) + caches.getValue(lhs) + caches.getValue(rhs)
162-
}
149+
computeSideEffect(expr) {
150+
val selfConstraint = mkEq(expr.arg0, expr.arg1)
151+
caches[expr] = mutableSetOf(selfConstraint) + provide(expr.arg0) + provide(expr.arg1)
163152
}
164153
}
165154

0 commit comments

Comments
 (0)