2016-08-16 1 views
4

In Optim.jl haben wir einen Typalias OptimizationTrace{T}, der ein Alias ​​für Vector{OptimizationState{T}} ist, wobei T vom Typ Optimizer ist. Ich möchte einen Konstruktor OptimizationTrace{T}(method::T) = OptimizationTrace{T}() erstellen, aber ich kämpfe, um es zur Arbeit zu bringen.So definieren Sie einen Konstruktor für einen Typalias in Julia

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}(...), 

Antwort

4

Für was es wert ist, funktioniert der einfachste Weg in 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()) 

Edit: und (Kredit aufgrund Kristoffer Carlsson) auf v0.4

call{T <: Optimizer}(::Type{OptimizationTrace}, method::T) = Vector{OptimizationState{T}}() 
Verwandte Themen