From 77e4e704f825d43a4a52619df50b75a66673fe06 Mon Sep 17 00:00:00 2001
From: Aayush Sabharwal <aayush.sabharwal@gmail.com>
Date: Thu, 20 Mar 2025 12:29:26 +0530
Subject: [PATCH] fix: fix incorrect folding in `substitute` in
 `OptimizationSystem`

---
 .../optimization/optimizationsystem.jl        |  6 ++---
 test/optimizationsystem.jl                    | 23 ++++++++++++++++++-
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/systems/optimization/optimizationsystem.jl b/src/systems/optimization/optimizationsystem.jl
index 4d01bd31c9..a62580024e 100644
--- a/src/systems/optimization/optimizationsystem.jl
+++ b/src/systems/optimization/optimizationsystem.jl
@@ -114,8 +114,8 @@ function OptimizationSystem(op, unknowns, ps;
             unknowns′[i] = irrvar
         end
     end
-    op′ = substitute(op′, irreducible_subs)
-    constraints = substitute.(constraints, (irreducible_subs,))
+    op′ = fast_substitute(op′, irreducible_subs)
+    constraints = fast_substitute.(constraints, (irreducible_subs,))
 
     if !(isempty(default_u0) && isempty(default_p))
         Base.depwarn(
@@ -127,7 +127,7 @@ function OptimizationSystem(op, unknowns, ps;
         throw(ArgumentError("System names must be unique."))
     end
     defaults = todict(defaults)
-    defaults = Dict(substitute(value(k), irreducible_subs) => substitute(
+    defaults = Dict(fast_substitute(value(k), irreducible_subs) => fast_substitute(
                         value(v), irreducible_subs)
     for (k, v) in pairs(defaults) if value(v) !== nothing)
 
diff --git a/test/optimizationsystem.jl b/test/optimizationsystem.jl
index c20613441a..2ec9516721 100644
--- a/test/optimizationsystem.jl
+++ b/test/optimizationsystem.jl
@@ -1,5 +1,6 @@
 using ModelingToolkit, SparseArrays, Test, Optimization, OptimizationOptimJL,
-      OptimizationMOI, Ipopt, AmplNLWriter, Ipopt_jll, SymbolicIndexingInterface
+      OptimizationMOI, Ipopt, AmplNLWriter, Ipopt_jll, SymbolicIndexingInterface,
+      LinearAlgebra
 using ModelingToolkit: get_metadata
 
 @testset "basic" begin
@@ -388,3 +389,23 @@ end
     @test all(y -> any(x -> isequal(x, y), unknowns(sys2)), [x2, sys1.x1])
     @test all(y -> any(x -> isequal(x, y), parameters(sys2)), [p2, sys1.p1])
 end
+
+function myeigvals_1(A::AbstractMatrix)
+    eigvals(A)[1]
+end
+
+@register_symbolic myeigvals_1(A::AbstractMatrix)
+
+@testset "Issue#3473: Registered array function in objective, no irreducible variables" begin
+    p_free = @variables begin
+        p1, [bounds = (0, 1)]
+        p2, [bounds = (0, 1)]
+        p3, [bounds = (0, 1)]
+        p4, [bounds = (0, 1)]
+    end
+
+    m = diagm(p_free)
+
+    obj = myeigvals_1(m)
+    @test_nowarn OptimizationSystem(obj, p_free, []; name = :osys)
+end