# Question on programmatically defining a nonlinear expression involving product and sum

**URL:** <https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330>\
**Category:** Optimization (Mathematical)\
**Tags:** jump\
**Created:** [March 25, 2025, 3:09am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330 "2025-03-25T03:09:12Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 3:09am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/1 "2025-03-25T03:09:12Z")

</div>

I have a `n`-dimensional vector `m`, a set of `JuMP` variables defined by

\{x\_{i,k\_{i}}\}\_{i\in\{1,2,\ldots,n\},k\_{i}\in\{1,2,\ldots,m\_{i}\}}=\{x\_{1,1},x\_{1,2},\ldots,x\_{1,m\_{1}},x\_{2,1},x\_{2,2},\ldots,x\_{2,m\_{2}},\ldots,x\_{n,1},x\_{n,2},\ldots x\_{n,m\_{n}}\}

(where m\_i means `m[i]`), a set of n multidimensional array defined by \{A[i]\}\_{i\in\{1,2,\ldots,n\}} with each A[i]\in[0,1]^{m\_{1}\times m\_{2}\times\ldots\times m\_{n}}. I want to define the following n nonlinear expressions in `JuMP`

\sum\_{k\_{1}\in[1:m\_{1}]}\cdots\sum\_{k\_{n}\in[1:m\_{n}]}\left(A[i]\right)[k\_{1},k\_{2},\ldots,k\_{n}]\left(x\_{1,k\_{1}}\times x\_{2,k\_{2}}\times\ldots\times x\_{n,k\_{n}}\right), \quad i=1,2,\ldots,n \quad \text{(EXPR)}(i)

I am defining the set of variables in `JuMP` as follows:

```julia
# Sample data 

using JuMP

n = 3

m = [3, 1, 2]

function generate_A(n::Int, m::Vector{Int})

    dims = Tuple(m)

    # A[i] has dimensions m[1] x m[2] x ... x m[n].
    A = Vector{Array{Float64}}(undef, n)
    for i in 1:n
        A[i] = rand(dims...) 
    end

    return A
    
end

A = generate_A(n, m) # so A[i][k_1, k_2, ..., k_m] gives $\sum_{k_{1}\in[1:m_{1}]}\cdots\sum_{k_{n}\in[1:m_{n}]}A[i][k_{1},k_{2},\ldots,k_{n}]\left(x_{1,k_{1}}\times x_{2,k_{2}}\times\ldots\times x_{n,k_{n}}\right)$

# define JuMP model

myModel = Model(Gurobi.Optimizer)

# define {x_{i,k_i}}_{i ∈ 1:n, k_i ∈ 1:m[i]}

@variable(myModel, x[i=1:n, k_i=1:m[i]])

```

When n and entries of m are small, I can define the expressions (\text{EXPR})(i) for i \in \{1,\ldots,n\} in `JuMP` manually without issue. However, it gets cumbersome for larger values of n or when m has large entries.

What is the best way to define the expressions (\text{EXPR})(i) for i\in \{1,\ldots,n\} in `JuMP` programmatically, i.e., one inputs `n`, `m`, `A` and the goal is to generate the nonlinear expressions (\text{EXPR})(i) for i\in \{1,\ldots,n\} in `JuMP`? Any tips/suggestions will be much appreciated!

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 25, 2025, 3:31am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/2 "2025-03-25T03:31:49Z")

</div>

You could do something like this:

```julia
using JuMP
m, n = [3, 1, 2], 3
generate_A(n::Int, m::Vector{Int}) = [rand(m...) for i in 1:n]
A = generate_A(n, m)
model = Model()
@variable(model, x[i in 1:n, k_i in 1:m[i]])
@expression(
    model,
    [i in 1:n],
    sum(
        A[i][k...] * prod(x[j,k[j]] for j in 1:n)
        for k in Iterators.product(map(i->1:i, m)...)
    )
)

```

---

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 4:01am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/3 "2025-03-25T04:01:17Z")

</div>

Hi @odow, thanks for the quick response! Sorry for the confusion, I am actually trying to define n total nonlinear expressions, with i in A[i] corresponding to the index i \in \{1,2,\ldots,n \}, i.e., I am trying to define the nonlinear expressions:

\sum\_{k\_{1}\in[1:m\_{1}]}\cdots\sum\_{k\_{n}\in[1:m\_{n}]}\left(A[i]\right)[k\_{1},k\_{2},\ldots,k\_{n}]\left(x\_{1,k\_{1}}\times x\_{2,k\_{2}}\times\ldots\times x\_{n,k\_{n}}\right)

for i = 1,2,\ldots,n.

I have also corrected my original question accordingly. Please let me know your thoughts.

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 25, 2025, 4:10am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/4 "2025-03-25T04:10:26Z")

</div>

I think my code example above does that? I do’t see anywhere else that `i` appears.

---

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 4:11am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/5 "2025-03-25T04:11:41Z")

</div>

You are correct, your code already accounts for that. Perhaps remove the question `What is i in A[i]` in your first post? So I can make it a solution to the question, because this will come handy to other people with a similar question.

---

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 4:42am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/6 "2025-03-25T04:42:40Z")

</div>

@odow, another side question, if I want to drop the sum over k\_{i} and product involving x\_{i,k\_{i}} from the expression, i.e., if I want to model the nonlinear expression

\sum\_{k\_{1}=1}^{m\_{1}}\sum\_{k\_{2}=1}^{m\_{2}}\ldots\sum\_{k\_{i-1}=1}^{m\_{i-1}}\sum\_{k\_{i+1}=1}^{m\_{i+1}}\ldots\sum\_{k\_{n}=1}^{m\_{n}}(A[i])[k\_{1},k\_{2},\ldots,k\_{n}]\prod\_{j=1,j\neq i}^{n}x\_{j,k\_{j}}

is it possible to model that in `JuMP`?

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 25, 2025, 6:18am UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/7 "2025-03-25T06:18:00Z")

</div>

What is k\_i in your A[i](k...) expression?

> is it possible to model that in `JuMP` ?

Pretty much any algebraic expression is possible.

Perhaps something like:

```Julia
function iterators(m, i)
    ret = [1:m_i for m_i in m]
    ret[i] = 1:1 # ???
    return ret
end
@expression(
    model,
    [i in 1:n],
    sum(
        A[i][k...] * prod(x[j,k[j]] for j in 1:n if j != i)
        for k in Iterators.product(iterators(m, i)...)
    )
)

```

---

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 1:28pm UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/8 "2025-03-25T13:28:35Z")

</div>

Hi @odow, thanks for your response! The term k\_{i} in A[i](k\_{1},k\_{2},\ldots,k\_{i-1},k\_{i},k\_{i+1},\ldots,k\_{n}) corresponds to any integer in \{1,2,\ldots,m\_{i}\}. Recall that in the initial sum k\_{i}\in\{1,2,\ldots,m\_{i}\} and in this version k\_{i} wil take one of those m\_{i} values. In other words, in this case, we are modeling m\_{i}\times n nonlinear expressions:

\sum\_{k\_{1}=1}^{m\_{1}}\sum\_{k\_{2}=1}^{m\_{2}}\ldots\sum\_{k\_{i-1}=1}^{m\_{i-1}}\sum\_{k\_{i+1}=1}^{m\_{i+1}}\ldots\sum\_{k\_{n}=1}^{m\_{n}}(A[i])[k\_{1},k\_{2},\ldots,k\_{n}]\prod\_{j=1,j\neq i}^{n}x\_{j,k\_{j}},

for i=1,2,\ldots,n and k\_{i}=1,2,\ldots,m\_{i}. I think your code can be modified as follows to fit this as follows:

```julia
function iterators(m, i, k_i)
    ret = [1:m_i for m_i in m]
    ret[i] = k_i:k_i
    return ret
end
@expression(
    model,
    [i in 1:n],
    sum(
        A[i][k...] * prod(x[j,k[j]] for j in 1:n if j != i)
        for k in Iterators.product(iterators(m, i, k_i)...)
    )
)

```

Please let me know if the modification is correct. Thanks again @odow!

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 25, 2025, 6:52pm UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/9 "2025-03-25T18:52:45Z")

</div>

It’s not correct. Your `k_i` is not defined. I think you need:

```Julia
function iterators(m, i, k_i)
    ret = [1:m_i for m_i in m]
    ret[i] = k_i:k_i
    return ret
end
@expression(
    model,
    [i in 1:n, k_i in 1:m[i]],
    sum(
        A[i][k...] * prod(x[j,k[j]] for j in 1:n if j != i)
        for k in Iterators.product(iterators(m, i, k_i)...)
    )
)

```

---

<div class="post-metadata">

**Author:** ![Shuvomoy\_Das\_Gupta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shuvomoy_das_gupta/32/10069_2.png) [@Shuvomoy\_Das\_Gupta](https://discourse.julialang.org/u/Shuvomoy_Das_Gupta)\
**Post date:** [March 25, 2025, 7:12pm UTC](https://discourse.julialang.org/t/question-on-programmatically-defining-a-nonlinear-expression-involving-product-and-sum/127330/10 "2025-03-25T19:12:58Z")

</div>

Yes, I ran into this issue while running the code, so was able to fix it basically the same way suggested by you earlier today. Thanks very much @odow !
