@@ -244,7 +244,7 @@ function add_predictor(
244
244
end
245
245
246
246
"""
247
- ReLUQuadratic() <: AbstractPredictor
247
+ ReLUQuadratic(; relaxation_parameter = nothing ) <: AbstractPredictor
248
248
249
249
An [`AbstractPredictor`](@ref) that represents the relationship:
250
250
```math
@@ -258,6 +258,15 @@ y \\cdot z = 0 \\\\
258
258
y, z \\ ge 0
259
259
\\ end{aligned}
260
260
```
261
+ If `relaxation_parameter` is set to a value `ϵ`, the constraints become:
262
+ ```math
263
+ \\ begin{aligned}
264
+ x = y - z \\\\
265
+ y \\ cdot z \\ leq \\ epsilon \\\\
266
+ y, z \\ ge 0
267
+ \\ end{aligned}
268
+ ```
269
+
261
270
262
271
## Example
263
272
@@ -269,7 +278,7 @@ julia> model = Model();
269
278
julia> @variable(model, -1 <= x[i in 1:2] <= i);
270
279
271
280
julia> f = MathOptAI.ReLUQuadratic()
272
- ReLUQuadratic()
281
+ ReLUQuadratic(nothing )
273
282
274
283
julia> y, formulation = MathOptAI.add_predictor(model, f, x);
275
284
@@ -279,7 +288,7 @@ julia> y
279
288
moai_ReLU[2]
280
289
281
290
julia> formulation
282
- ReLUQuadratic()
291
+ ReLUQuadratic(nothing )
283
292
├ variables [4]
284
293
│ ├ moai_ReLU[1]
285
294
│ ├ moai_ReLU[2]
@@ -300,7 +309,15 @@ ReLUQuadratic()
300
309
└ moai_ReLU[2]*moai_z[2] = 0
301
310
```
302
311
"""
303
- struct ReLUQuadratic <: AbstractPredictor end
312
+ struct ReLUQuadratic <: AbstractPredictor
313
+ relaxation_parameter:: Union{Nothing,Float64}
314
+ function ReLUQuadratic (;
315
+ relaxation_parameter:: Union{Nothing,Float64} = nothing ,
316
+ )
317
+ @assert something (relaxation_parameter, 0.0 ) >= 0.0
318
+ return new (relaxation_parameter)
319
+ end
320
+ end
304
321
305
322
function add_predictor (
306
323
model:: JuMP.AbstractModel ,
@@ -314,6 +331,11 @@ function add_predictor(
314
331
z = JuMP. @variable (model, [1 : m], base_name = " moai_z" )
315
332
_set_bounds_if_finite .(Ref (cons), z, 0 , max .(0 , - first .(bounds)))
316
333
append! (cons, JuMP. @constraint (model, x .== y - z))
317
- append! (cons, JuMP. @constraint (model, y .* z .== 0 ))
334
+ if predictor. relaxation_parameter === nothing
335
+ append! (cons, JuMP. @constraint (model, y .* z .== 0 ))
336
+ else
337
+ ϵ = predictor. relaxation_parameter
338
+ append! (cons, JuMP. @constraint (model, y .* z .<= ϵ))
339
+ end
318
340
return y, Formulation (predictor, Any[y; z], cons)
319
341
end
0 commit comments