Julia Optim:InexactError:Int64(0.01)在使用IPNewton时

Julia Optim:InexactError:Int64(0.01)在使用IPNewton时,julia,mathematical-optimization,Julia,Mathematical Optimization,我使用(error.jl)使用以下代码优化函数: 朱莉娅版本: forcebru@thing~/test>julia--version julia版本1.5.3 错误消息: forcebru@thing~/test>julia error.jl 错误:LoadError:不精确错误:Int64(0.01) 堆栈跟踪: [1] Int64 at./float.jl:710[内联] [2] 转换为./number.jl:7[内联] [3] 集合索引!at./array.jl:847[内联] [4]

我使用(
error.jl
)使用以下代码优化函数:

朱莉娅版本:

forcebru@thing~/test>julia--version
julia版本1.5.3
错误消息:

forcebru@thing~/test>julia error.jl
错误:LoadError:不精确错误:Int64(0.01)
堆栈跟踪:
[1] Int64 at./float.jl:710[内联]
[2] 转换为./number.jl:7[内联]
[3] 集合索引!at./array.jl:847[内联]
[4] _不安全_copyto!(::数组{Int64,1},::Int64,::数组{Float64,1},::Int64,::Int64)位于./Array.jl:257
[5] 不安全!at./array.jl:311[内联]
[6] _copyto_impl!at./array.jl:335[内联]
[7] 抄袭!at./array.jl:321[内联]
[8] 抄袭!at./array.jl:347[内联]
[9] 有限差分雅可比矩阵!(::数组{Float64,2},::typeof(constraint!),::数组{Float64,1},::FiniteDiff.jacobiantache{Array{Int64,1},数组{Int64,1},数组{Int64,1},UnitRange{Int64},Nothing,Val{central}(),Int64},::Nothing;relstep::Float64,absstep::Float64,colorvec::UnitRange{Int64},稀疏::Nothing,dir Bool)在/Users/forcebru/.julia/packages/FiniteDiff/jLwWI/src/jacobians.jl:338
[10] 有限差分雅可比矩阵!(::Array{Float64,2},::Function,::Array{Float64,1},::FiniteDiff.jacobiantache{Array{Int64,1},Array{Int64,1},Array{Int64,1},UnitRange{Int64},Nothing,Val{:central}(),Int64},::Nothing)at/Users/forcebru/.julia/packages/FiniteDiff/jlwvi/src/jacobians.jl:334(重复2次)
[11] 杰克!at/Users/forcebru/.julia/packages/NLSolversBase/QPnui/src/objective_types/constraints.jl:298[内联]
[12] 初始状态(::Optim.IPNewton{typeof(Optim.backtrack_constrated_grad),Symbol},::Optim.Options{Float64,Nothing},::nlsolverbase.TwiceDifferentiableConstraints{Float64,Array{Float64,1},Array{Float64,2},Array{Float64,1},::NLSolversBase.TwiceDifferentiableConstraints{typeof(constraint!),solversbase.var){126}雅各布{数组{Int64,1},数组{Int64,1},数组{Int64,1},数组{Int64,1},数组{Int64,1},数组{Int64,1},数组{Int64,1},数组{Int64,1,1},1,单位范围{Int64{Int64,1,1,1,单位范围{Int64,无任何东西,无任何东西,瓦尔{:中央{:中央}无任何东西,中区,无任何东西,中区,无任何东西,中区,中区,中区,中区,中区,中区,中区,中区,中区{},数组{Int64,1},单位范围{Int64},无,Val{:central}(),Int64},Int64},::数组{Float64,1}位于/Users/forcebru/.julia/packages/Optim/D7azp/src/multivariable/solvers/constrated/ipnewton/ipnewton.jl:135
[13] 优化(::NLSolversBase.TwiceDifferentiable{Float64,Array{Float64,1},Array{Float64,2},Array{Float64,1},::NLSolversBase.TwiceDifferentiableConstraints{typeof(constraint!),NLSolversBase.var“#jac!#126{typeof(constraint!),FiniteDiff.jacobiantache{Array{Int64,1},Array{Int64,1},Array},unit64,range,intval(),{[3,2,5,3,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5.5.7.var.var \\ \\"5,5,5,5,5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.var.var.5.var..5.var  \  \ \\.................var.5 \\\(Optim.backtrack\u constraint\u grad),Symbol},::Optim.Options{Float64,Nothing})位于/Users/forcebru/.julia/packages/Optim/D7azp/src/multivariable/solvers/constrated/ipnewton/interior.jl:228
[14] 优化(::函数,::NLSOVERSBASE.TwiceDifferentiableConstraints{typeof(constraint!),NLSOVERSBASE.var“{typeof(constraint!),FiniteDiff.JacobianCache{Array{Int64,1},Array{Int64,1},Array{Int64,1},UnitRange{Int64},Nothing,Val{central}(),Int64},NLSOVERSBASE.var”{con con hess!{Int64,1},Int64,1},Array{Int64,1},Int64,3},NLSOVERSBASE}“#jac#u vec!#129”{Int64,Int64},FiniteDiff.jacobiantache{Array{Int64,1},Array{Int64,1},Array{Int64,1},UnitRange{Int64,1},UnitRange{Int64},Nothing,Val{central}(),Int64},Int64},Int64},::Array{Float64,1},::Optim IPNewton{typeof(Optim backtrack}约束梯度),Symbol},Optim Optimat/Users/forcebru/.julia/packages/Optim/D7azp/src/multivariable/optimize/interface.jl:148
[15] 优化(::函数,::NLSOVERSBASE.TwiceDifferentiableConstraints{typeof(constraint!),NLSOVERSBASE.var“{typeof(constraint!),FiniteDiff.JacobianCache{Array{Int64,1},Array{Int64,1},Array{Int64,1},UnitRange{Int64},Nothing,Val{central}(),Int64},NLSOVERSBASE.var”{con con hess!{Int64,1},Int64,1},Array{Int64,3},Int64}#jac#u vec!#129“{Int64,Int64},有限敌我.Jacobiantache{Array{Int64,1},Array{Int64,1},Array{Int64,1},Array{Int64,1},UnitRange{Int64},Nothing,Val{:central}(),Int64},Int64},Int64},::Array{Float64,1},::Optim.IPNewton{typeof(Optim.backtrack\U Constract}),Symbol},::Optim.Options,Nothing})at/Users/forcebru/.julia/packages/Optim/D7azp/src/multivariable/optimize/interface.jl:147(重复2次)
[16] 顶级范围位于/Users/forcebru/test/error.jl:27
[17] 包括(::函数,::模块,::字符串)在./Base.jl:380
[18] 在./Base.jl:368包含(::模块,::字符串)
[19] exec_选项(::Base.jl选项)位于./client.jl:296
[20] _start()位于./client.jl:506
在表达式中,从/Users/forcebru/test/error开始。jl:27
forcebru@thing~/test[1]>
所以…
increacterror:Int64(0.01)
?它似乎也起源于
Optim

我知道这里的
incecacterror
意味着Julia无法将
0.01
转换为整数,这是有意义的。但我不知道
0.01
是从哪里来的!如何找出它的来源?这段代码有什么问题,可以做些什么来修复



编辑:我注意到
0.01
必须是
p0=fill(1,N)/N
的一个元素,因为如果我设置
N=50
,错误将变成
不精确错误:Int64(0.02)
,其中
0.02==1/N
。但在仔细查看错误消息的以下部分后,它为什么要尝试将其转换为整数??

[8]copyto!at./array.jl:347[内联]
[9] 有限差分雅可比矩阵!(::数组{Float64,2},::typeof(constraint!),::数组{Float64,1},::FiniteDif
import Optim

"""
Generate a matrix of constants used in computation
"""
function get_const(x::Vector{Float64}, sigma::Vector{Float64})::Array{Float64, 2}
    exp.(-x'.^2 ./ (2 .* sigma.^2)) ./ (sigma .* sqrt(2 * π))
end

# Log likelihood for mixture model
log_likelihood(p, C::Array{Float64, 2}) = sum(log.(p' * C))

"""
Constraint: all probabilities (ps) must sum to 1
"""
function constraint!(c, ps)::typeof(c)
    c[1] = sum(ps)
    c
end

N = 100
x = range(-1, 1, length=1000) |> collect
sigma = range(0.001, 2, length=N) |> collect

C = get_const(x, sigma)

constraints = Optim.TwiceDifferentiableConstraints(
    constraint!,
    fill(0, N), fill(1, N), # 0 <= (each probability) <= 1
    fill(1, N), fill(1, N)  # 1 <= constraint(p) <= 1 (probabilities sum to 1)
)
p0 = fill(1, N) / N # initial guess == equal probabilities

res = Optim.optimize(
    ps -> -log_likelihood(ps, C), # want to MAXIMIZE, so negate
    constraints, p0,
    Optim.IPNewton()
)
FiniteDiff.JacobianCache{
    Array{Int64,1},
    Array{Int64,1},
    Array{Int64,1},
    UnitRange{Int64},
    Nothing,
    Val{:central}(),
    Int64
}
constraints = Optim.TwiceDifferentiableConstraints(
    constraint!,
    fill(0, N), fill(1, N), # 0 <= (each probability) <= 1
    fill(1, N), fill(1, N)  # 1 <= constraint(p) <= 1 (probabilities sum to 1)
)
constraints = Optim.TwiceDifferentiableConstraints(
    constraint!,
    fill(0., N), fill(1., N), # 0 <= (each probability) <= 1
    fill(1., N), fill(1., N)  # 1 <= constraint(p) <= 1 (probabilities sum to 1)
)