2016-08-16 12 views
4

Optim.jlには、のVector{OptimizationState{T}}の別名であるタイプアライアがあります。私はコンストラクタOptimizationTrace{T}(method::T) = OptimizationTrace{T}()を作成したいが、それを動作させるのには苦労している。ジュリアのタイプアリアスのコンストラクタを定義する方法

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()) 

編集:及び(クレジットクリストファーカールソンによる)v0.4が上

call{T <: Optimizer}(::Type{OptimizationTrace}, method::T) = Vector{OptimizationState{T}}() 
関連する問題