@@ -469,6 +469,48 @@ function test_convert_VectorAffineFunction_VectorQuadraticFunction()
469469 return
470470end
471471
472+ function test_copy_ScalarNonlinearFunction ()
473+ N = 10_000
474+ x = MOI. VariableIndex .(1 : N)
475+ f1 = MOI. ScalarNonlinearFunction (:^ , Any[x[1 ], 1 ])
476+ for i in 2 : N
477+ g = MOI. ScalarNonlinearFunction (:^ , Any[x[i], 1 ])
478+ f1 = MOI. ScalarNonlinearFunction (:+ , Any[f1, g])
479+ end
480+ f2 = MOI. ScalarNonlinearFunction (:^ , Any[x[1 ], 1 ])
481+ for i in 2 : N
482+ g = MOI. ScalarNonlinearFunction (:^ , Any[x[i], 1 ])
483+ f2 = MOI. ScalarNonlinearFunction (:+ , Any[f2, g])
484+ end
485+ f_copy = copy (f1)
486+ @test ≈ (f_copy, f2)
487+ f1. args[2 ]. args[2 ] = 2.0 # x[1]^1 --> x[1]^2
488+ @test ! isapprox (f_copy, f1)
489+ @test isapprox (f_copy, f2)
490+ return
491+ end
492+
493+ function test_copy_ScalarNonlinearFunction_with_arg ()
494+ N = 10_000
495+ x = MOI. VariableIndex .(1 : N)
496+ f1 = 1.0 * x[1 ] + 1.0
497+ for i in 2 : N
498+ g = f1 = Float64 (i) * x[i] + Float64 (i)
499+ f1 = MOI. ScalarNonlinearFunction (:+ , Any[f1, g])
500+ end
501+ f2 = 1.0 * x[1 ] + 1.0
502+ for i in 2 : N
503+ g = f2 = Float64 (i) * x[i] + Float64 (i)
504+ f2 = MOI. ScalarNonlinearFunction (:+ , Any[f2, g])
505+ end
506+ f_copy = copy (f1)
507+ @test ≈ (f_copy, f2)
508+ f1. args[2 ]. constant += 1
509+ @test ! isapprox (f_copy, f1)
510+ @test isapprox (f_copy, f2)
511+ return
512+ end
513+
472514function runtests ()
473515 for name in names (@__MODULE__ ; all = true )
474516 if startswith (" $name " , " test_" )
0 commit comments