2016-08-16 50 views
4

在Optim.jl中,我們有一個typealias OptimizationTrace{T},它是Vector{OptimizationState{T}}的別名,其中T的類型爲Optimizer。我想創建一個構造函數OptimizationTrace{T}(method::T) = OptimizationTrace{T}(),但我正在努力使其工作。如何在Julia中爲typealias定義構造函數

abstract Optimizer 

immutable NelderMead <: Optimizer 
end 

immutable OptimizationState{T <: Optimizer} 
    iteration::Int 
    value::Float64 
    g_norm::Float64 
    metadata::Dict 
end 

typealias OptimizationTrace{T} Vector{OptimizationState{T}} 

OptimizationTrace{NelderMead}() # works 

# A different approach, define a convert-method. 
OptimizationTrace{T}(method::T) = OptimizationTrace{T}() #  Doesn't work: 
ERROR: cannot define function OptimizationTrace; it already has a value 

import Base.convert 
convert{T<:Optimizer}(::Type{Array{OptimizationState{T},1}}, method::T) = OptimizationTrace{T}() 
OptimizationTrace(NelderMead()) 
ERROR: MethodError: `convert` has no method matching convert(::Type{Array{OptimizationState{T},1}}, ::NelderMead) 
This may have arisen from a call to the constructor Array{OptimizationState{T},1}(...), 

回答

4

爲什麼它值得,最直接的方法在v0.5中工作。

abstract Optimizer 

immutable NelderMead <: Optimizer 
end 

immutable OptimizationState{T <: Optimizer} 
        iteration::Int 
        value::Float64 
        g_norm::Float64 
        metadata::Dict 
       end 

typealias OptimizationTrace{T} Vector{OptimizationState{T}} 

OptimizationTrace{T<:Optimizer}(method::T) = Vector{OptimizationState{T}}() 
OptimizationTrace(NelderMead()) 

編輯:和(信貸因的Kristoffer卡爾鬆)在V0.4

call{T <: Optimizer}(::Type{OptimizationTrace}, method::T) = Vector{OptimizationState{T}}() 
相關問題