MCPcopy Create free account
hub / github.com/NeuralNetworkVerification/Marabou / addClipConstraint

Method addClipConstraint

src/engine/InputQuery.cpp:176–221  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

174}
175
176void 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
223List<PiecewiseLinearConstraint *> &InputQuery::getPiecewiseLinearConstraints()
224{

Calls 2

addAddendMethod · 0.45
setScalarMethod · 0.45