# Constraint involving numerical integration

**URL:** <https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043>\
**Category:** Optimization (Mathematical)\
**Tags:** jump\
**Created:** [November 13, 2017, 2:41pm UTC](https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043 "2017-11-13T14:41:50Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![MaximilianJHuber](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maximilianjhuber/32/2579_2.png) [@MaximilianJHuber](https://discourse.julialang.org/u/MaximilianJHuber)\
**Post date:** [November 13, 2017, 2:41pm UTC](https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043/1 "2017-11-13T14:41:50Z")

</div>

Hi!

I try to write up a minimization problem with 5+131 variables, a quadratic objective involving the last 131 variables and 131 constraints that involve a numerical integration using Gauss-Hermite nodes. The variables weight, hp, ac and price are 131-vectors of Float64.

```julia
using FastGaussQuadrature
using JuMP
using Ipopt

# Data
(e0, q0) = gausshermite(30)
weight = ones(131)
hp = ones(131)
ac = ones(131)
price = ones(131)

# Model
m = Model(solver=IpoptSolver(print_level=1))

@variable(m, β[1:3], start = 0.0)
@variable(m, μy, start = -0.1)
@variable(m, σy >= 0, start = 0.1)
@variable(m, ξ[i=1:131])

@objective(m, Min, ξ' * ξ)

@NLexpression(m, integrand[i=1:131, k=1:30], exp(ξ[i] + weight[i] * β[1] + hp[i] * β[2] + ac[i] * β[3] - exp(-μy -sqrt(2) * σy * e0[k]) * price[i]) / (1 + sum((exp(ξ[j]) + weight[j] * β[1] + hp[j] * β[2] + ac[j] * β[3] - exp(-μy - sqrt(2) * σy * e0[k]) * price[j]) for j in 1:131)))

@constraint(m, integral_constraint[i=1:131], share[i] == dot(integrand[i, :], q0))

```

The constraint throws an `MethodError: no method matching one(::Type{JuMP.NonlinearExpression})`  
I read the [syntax notes](http://www.juliaopt.org/JuMP.jl/0.18/nlp.html#syntax-notes) couple of times, and I do not understand why I should not use the `dot` in this expression, the notes just say you cannot use it **inside** nonlinear expressions.

My workaround is to make `integrand` a variable (131\*30 dimensional!), but when I solve my 16GBs memory fill up in a minute and it does not work.

```julia
@variable(m, integrand[1:131, 1:30])
@NLconstraint(m, integrandconst[i=1:131, k=1:30], integrand[i, k] == exp(ξ[i] + weight[i] * β[1] + hp[i] * β[2] + ac[i] * β[3] - exp(-μy -sqrt(2) * σy * e0[k]) * price[i]) / (1 + sum((exp(ξ[j]) + weight[j] * β[1] + hp[j] * β[2] + ac[j] * β[3] - exp(-μy - sqrt(2) * σy * e0[k]) * price[j]) for j in 1:131)))

```

Any advice?

---

<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:** [November 14, 2017, 2:51am UTC](https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043/2 "2017-11-14T02:51:23Z")

</div>

Try replacing `dot(integrand[i, :], q0)` with the expanded summation:

```julia
sum(integrand[i,k] * q0[k] for k in 1:30)

```

---

<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:** [November 14, 2017, 4:43am UTC](https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043/3 "2017-11-14T04:43:34Z")

</div>

`NLexpression` objects may only be used within other `NL` macros, so you have to use `@NLconstraint` here. `@NLconstraint` furthermore requires scalar syntax, i.e., no `dot`.

---

<div class="post-metadata">

**Author:** ![MaximilianJHuber](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maximilianjhuber/32/2579_2.png) [@MaximilianJHuber](https://discourse.julialang.org/u/MaximilianJHuber)\
**Post date:** [November 14, 2017, 3:47pm UTC](https://discourse.julialang.org/t/constraint-involving-numerical-integration/7043/4 "2017-11-14T15:47:39Z")

</div>

Thank you, `@NLconstraint(m, integral_constraint[i=1:131], share[i] == sum(integrand[i,k] * q0[k] for k in 1:30))` did the trick.
