Search code examples
julianonlinear-optimizationeconomicsjulia-jump

Julia MethodError: no method matching parseNLExpr_runtime(


I'm attempting to code the method described here to estimate production functions of metal manufacturers. I've done this in Python and Matlab, but am trying to learn Julia.

spain_clean.csv is a dataset of log capital (lnk), log labor (lnl), log output (lnva), and log materials (lnm) that I am loading. Lagged variables are denoted with an "l" before them.

Code is at the bottom. I am getting an error:

ERROR: LoadError: MethodError: no method matching parseNLExpr_runtime(::JuMP.Model, ::JuMP.GenericQuadExpr{Float64,JuMP.Variable}, ::Array{ReverseDiffSparse.NodeData,1}, ::Int32, ::Array{Float64,1})

I think it has to do with the use of vector sums and arrays going into the non-linear objective, but I do not understand Julia enough to debug this.

using JuMP  # Need to say it whenever we use JuMP

using Clp, Ipopt # Loading the GLPK module for using its solver

using CSV # csv reader


# read data
df = CSV.read("spain_clean.csv")


#MODEL CONSTRUCTION
#--------------------

acf = Model(solver=IpoptSolver())



@variable(acf, -10<= b0  <= 10) # 

@variable(acf, -5 <= bk <= 5 ) # 

@variable(acf, -5 <= bl <= 5 ) #

@variable(acf, -10<= g1 <= 10) # 


const g = sum(df[:phihat]-b0-bk* df[:lnk]-bl* df[:lnl]-g1* (df[:lphihat]-b0-bk* df[:llnk]-bl* df[:llnl]))

const gllnk = sum((df[:phihat]-b0-bk* df[:lnk]-bl* df[:lnl]-g1* (df[:lphihat]-b0-bk* df[:llnk]-bl* df[:llnl])).*df[:llnk])

const gllnl = sum((df[:phihat]-b0-bk* df[:lnk]-bl* df[:lnl]-g1* (df[:lphihat]-b0-bk* df[:llnk]-bl* df[:llnl])).*df[:llnl])

const glphihat = sum((df[:phihat]-b0-bk* df[:lnk]-bl* df[:lnl]-g1* (df[:lphihat]-b0-bk* df[:llnk]-bl* df[:llnl])).*df[:lphihat])



#OBJECTIVE  

@NLobjective(acf, Min, g* g + gllnk* gllnk + gllnl* gllnk + glphihat* glphihat)



#SOLVE IT 
status = solve(acf) # solves the model

println("Objective value: ", getobjectivevalue(acf)) #     getObjectiveValue(model_name) gives the optimum objective value

println("b0 = ", getvalue(b0)) 

println("bk = ", getvalue(bk))

println("bl = ", getvalue(bl))

println("g1 = ", getvalue(g1))

Solution

  • No an expert in Julia, but I think a couple of things are wrong about your code. first, constant are not supposed to change during iteration and you are making them functions of control variables. Second, what you want to use there are nonlinear expression instead of constants. so instead of the constants what you want to write is

    N = size(df, 1)
    
    @NLexpression(acf, g, sum(df[i, :phihat]-b0-bk* df[i, :lnk]-bl* df[i, :lnl]-g1* (df[i, :lphihat]-b0-bk* df[i, :llnk]-bl* df[i, :llnl]) for i=1:N))
    
    @NLexpression(acf, gllnk, sum((df[i,:phihat]-b0-bk* df[i,:lnk]-bl* df[i,:lnl]-g1* (df[i,:lphihat]-b0-bk* df[i,:llnk]-bl* df[i,:llnl]))*df[i,:llnk] for i=1:N))
    
    @NLexpression(acf,gllnl,sum((df[i,:phihat]-b0-bk* df[i,:lnk]-bl* df[i,:lnl]-g1* (df[i,:lphihat]-b0-bk* df[i,:llnk]-bl* df[i,:llnl]))*df[i,:llnl] for i=1:N))
    
    @NLexpression(acf,glphihat,sum((df[i,:phihat]-b0-bk* df[i,:lnk]-bl* df[i,:lnl]-g1* (df[i,:lphihat]-b0-bk* df[i,:llnk]-bl* df[i,:llnl]))*df[i,:lphihat] for i=1:N))
    

    I tested this and it seems to work.