# How register a function in JuMP and use a subarray as args

**URL:** <https://discourse.julialang.org/t/how-register-a-function-in-jump-and-use-a-subarray-as-args/46043>\
**Category:** Optimization (Mathematical)\
**Created:** [September 4, 2020, 6:13am UTC](https://discourse.julialang.org/t/how-register-a-function-in-jump-and-use-a-subarray-as-args/46043 "2020-09-04T06:13:44Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Behemoth-s](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/behemoth-s/32/17428_2.png) [@Behemoth-s](https://discourse.julialang.org/u/Behemoth-s)\
**Post date:** [September 4, 2020, 6:13am UTC](https://discourse.julialang.org/t/how-register-a-function-in-jump-and-use-a-subarray-as-args/46043/1 "2020-09-04T06:13:44Z")

</div>

I would register constraint somehow like `c1` as a user-defined function

```julia
using Ipopt
using JuMP
using MathOptInterface
const MOI = MathOptInterface

d1 = 4
d2 = 5
d3 = 6
para_a = rand(d3)

m = Model(optimizer_with_attributes(Ipopt.Optimizer))

@variable(m, uc[i in 1:d1, j in 1:d2, k in 1:d3])
@variable(m, v[i in 1:d1, k in 1:d3])
@variable(m, w[i in 1:d1, j in 1:d2, k in 1:d3,])

@NLconstraint(m, c1[i in 1:d1, j in 1:d2, k in 1:d3], uc[i, j, k] == v[i, k] + sum(w[i, j, s] * para_a[s] for s in 1:d3))

```

I tried to implement it and got errors as below.

```julia
function f(uc_, v_, w_...)
    v_ + sum(w_[k] * para_a[k] for k in 1:length(w_)) - uc_
end
register(m, :f, 2 + d3, f,autodiff=true)
@NLconstraint(m, c2[i in 1:d1, j in 1:d2, k in 1:d3], f(uc[i, j, k], v[i, k], w[i, j, 1:d3]...) == 0)

ERROR: Unexpected expression in f(uc[i, j, k], v[i, k], w[i, j, 1:d3]...). JuMP supports splatting only symbols. For example, x... is ok, but (x + 1)..., [x; y]... and g(f(y)...) are not.

```

It seems that only a symbol can be used in user-defined function.  
Is there any way to use a subarray like `w[i, j, :]` args?

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [September 4, 2020, 8:36pm UTC](https://discourse.julialang.org/t/how-register-a-function-in-jump-and-use-a-subarray-as-args/46043/2 "2020-09-04T20:36:41Z")

</div>

It doesn’t seem to me that there’s any reason to splat `w`. You should be able to just pass `w[i, j, :]` as-is. That said, I’ve never had to register a JuMP function…  
Also, I personally tend work with anonymous variables and constraints more often than not because I find the `[i=1:n, ...]` syntax can get cumbersome.

The cleanest (also coolest) way you can do this is with `Tullio`:

```julia
using Tullio
@tullio ex[i,j,k] := v[i, k] + w[i,j,a]*para_a[a]
@constraint(m, c1, uc .== ex)

```

(I’m using `@constraint` because your constraints are actually linear)

---

<div class="post-metadata">

**Author:** ![miles.lubin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/miles.lubin/32/279_2.png) [@miles.lubin](https://discourse.julialang.org/u/miles.lubin)\
**Post date:** [September 5, 2020, 5:26pm UTC](https://discourse.julialang.org/t/how-register-a-function-in-jump-and-use-a-subarray-as-args/46043/3 "2020-09-05T17:26:47Z")

</div>

Here’s the workaround that I’d recommend for this particular case:

```julia
for i in 1:d1, j in 1:d2, k in 1:d3
  x = w[i, j, 1:d3]
  @NLconstraint(m, f(uc[i, j, k], v[i, k], x...) == 0)
end

```
