| 174 | } |
| 175 | |
| 176 | void InputQuery::addClipConstraint( unsigned b, unsigned f, double floor, double ceiling ) |
| 177 | { |
| 178 | /* |
| 179 | f = clip(b, floor, ceiling) |
| 180 | - |
| 181 | aux1 = b - floor |
| 182 | aux2 = relu(aux1) |
| 183 | aux2.5 = aux2 + floor |
| 184 | aux3 = -aux2.5 + ceiling |
| 185 | aux4 = relu(aux3) |
| 186 | f = -aux4 + ceiling |
| 187 | */ |
| 188 | |
| 189 | // aux1 = var1 - floor |
| 190 | unsigned aux1 = getNewVariable(); |
| 191 | Equation eq1( Equation::EQ ); |
| 192 | eq1.addAddend( 1.0, b ); |
| 193 | eq1.addAddend( -1.0, aux1 ); |
| 194 | eq1.setScalar( floor ); |
| 195 | addEquation( eq1 ); |
| 196 | unsigned aux2 = getNewVariable(); |
| 197 | PiecewiseLinearConstraint *r1 = new ReluConstraint( aux1, aux2 ); |
| 198 | addPiecewiseLinearConstraint( r1 ); |
| 199 | // aux2.5 = aux2 + floor |
| 200 | // aux3 = -aux2.5 + ceiling |
| 201 | // So aux3 = -aux2 - floor + ceiling |
| 202 | unsigned aux3 = getNewVariable(); |
| 203 | Equation eq2( Equation::EQ ); |
| 204 | eq2.addAddend( -1.0, aux2 ); |
| 205 | eq2.addAddend( -1.0, aux3 ); |
| 206 | eq2.setScalar( floor - ceiling ); |
| 207 | addEquation( eq2 ); |
| 208 | |
| 209 | unsigned aux4 = getNewVariable(); |
| 210 | PiecewiseLinearConstraint *r2 = new ReluConstraint( aux3, aux4 ); |
| 211 | addPiecewiseLinearConstraint( r2 ); |
| 212 | |
| 213 | // aux4.5 = aux4 - ceiling |
| 214 | // f = -aux4.5 |
| 215 | // f = -aux4 + ceiling |
| 216 | Equation eq3( Equation::EQ ); |
| 217 | eq3.addAddend( -1.0, aux4 ); |
| 218 | eq3.addAddend( -1.0, f ); |
| 219 | eq3.setScalar( -ceiling ); |
| 220 | addEquation( eq3 ); |
| 221 | } |
| 222 | |
| 223 | List<PiecewiseLinearConstraint *> &InputQuery::getPiecewiseLinearConstraints() |
| 224 | { |