Andrew, would you mind sharing your insight here? It made things more
confusing for me, and I don't know how to troubleshott this any further.
On Thursday, July 9, 2015 at 10:29:03 AM UTC-7, andrew cooke wrote:
>
>
> ah, that makes a certain kind of sense. thanks for the follow-up.
>
> On Wednesday, 8 July 2015 11:43:51 UTC-3, Seth wrote:
>>
>> As a followup: referencing T via info() in
>> the MinCutVisitor(graph::SimpleGraph, distmx::AbstractArray) results in an
>> error ("UndefVarError: T not defined"), but if I don't explicitly reference
>> it, the tests pass. It appears that T is not "evaluated" if it's within the
>> call to the inner constructor. Here's the code that works, and I can't
>> explain it:
>>
>> function MinCutVisitor(graph::SimpleGraph, distmx::AbstractArray)
>> n = nv(graph)
>> MinCutVisitor(
>> graph,
>> falses(n),
>> zeros(Int,n),
>> typemax(T),
>> zero(T),
>> zero(Int),
>> distmx,
>> @compat(Vector{Int}())
>> )
>> end
>>
>>
>>
>> On Wednesday, July 8, 2015 at 7:45:40 AM UTC-5, Seth wrote:
>>>
>>> I don't have T as a global that I know of.
>>>
>>> Bug report (for reference) is
>>> https://github.com/JuliaLang/julia/issues/12063
>>>
>>> Thanks.
>>>
>>> On Wednesday, July 8, 2015 at 7:42:59 AM UTC-5, Yichao Yu wrote:
>>>>
>>>> On Wed, Jul 8, 2015 at 8:32 AM, Seth <[email protected]> wrote:
>>>> > Yichao,
>>>> >
>>>> > That works - thanks. Why does it work, though?
>>>>
>>>> My guess is that the default constructor couldn't infer the type
>>>> parameter T so explicitly supplying it should make it work.
>>>>
>>>> Not sure what is the expected behavior (what should the default
>>>> constructor be able to infer).
>>>>
>>>> P.S. do you have T as a global variable somewhere?
>>>>
>>>> P.P.S. I see your bug report.
>>>>
>>>> >
>>>> >
>>>> > On Tuesday, July 7, 2015 at 8:47:30 PM UTC-5, Yichao Yu wrote:
>>>> >>
>>>> >> Not sure what changed so it might worth a bug report/doc update but
>>>> >> can you try this?
>>>> >>
>>>> >> function MinCutVisitor{T}(graph::SimpleGraph,
>>>> distmx::AbstractArray{T, 2})
>>>> >> n = nv(graph)
>>>> >> MinCutVisitor{T}(
>>>> >> graph,
>>>> >> falses(n),
>>>> >> zeros(Int,n),
>>>> >> typemax(T),
>>>> >> zero(T),
>>>> >> zero(Int),
>>>> >> distmx,
>>>> >> @compat(Vector{Int}())
>>>> >> )
>>>> >> end
>>>> >>
>>>> >> I.e. add `{T}` to the call to the default constructor
>>>> >>
>>>> >>
>>>> >> On Tue, Jul 7, 2015 at 8:05 PM, andrew cooke <[email protected]>
>>>> wrote:
>>>> >> >
>>>> >> > what's T in the last chunk of code? you have typemax(T), but no T
>>>> as a
>>>> >> > type
>>>> >> > parameter. is that really working?
>>>> >> >
>>>> >> >
>>>> >> > On Tuesday, 7 July 2015 20:03:24 UTC-3, Seth wrote:
>>>> >> >>
>>>> >> >> I have the following code:
>>>> >> >>
>>>> >> >> type MinCutVisitor{T} <: AbstractMASVisitor
>>>> >> >> graph::SimpleGraph
>>>> >> >> parities::AbstractArray{Bool,1}
>>>> >> >> colormap::Vector{Int}
>>>> >> >> bestweight::T
>>>> >> >> cutweight::T
>>>> >> >> visited::Integer
>>>> >> >> distmx::AbstractArray{T, 2}
>>>> >> >> vertices::Vector{Int}
>>>> >> >> end
>>>> >> >>
>>>> >> >> function MinCutVisitor{T}(graph::SimpleGraph,
>>>> distmx::AbstractArray{T,
>>>> >> >> 2})
>>>> >> >> n = nv(graph)
>>>> >> >> MinCutVisitor(
>>>> >> >> graph,
>>>> >> >> falses(n),
>>>> >> >> zeros(Int,n),
>>>> >> >> typemax(T),
>>>> >> >> zero(T),
>>>> >> >> zero(Int),
>>>> >> >> distmx,
>>>> >> >> @compat(Vector{Int}())
>>>> >> >> )
>>>> >> >> end
>>>> >> >>
>>>> >> >>
>>>> >> >> and up until June 30th the outer constructor was working in 0.4:
>>>> >> >>
>>>> >> >> julia> g = Graph(8)
>>>> >> >> {8, 0} undirected graph
>>>> >> >>
>>>> >> >>
>>>> >> >> julia> LightGraphs.MinCutVisitor(g,spzeros(Float64,8,8))
>>>> >> >> LightGraphs.MinCutVisitor{Float64}({8, 0} undirected
>>>> >> >>
>>>> >> >>
>>>> graph,Bool[false,false,false,false,false,false,false,false],[0,0,0,0,0,0,0,0],Inf,0.0,0,8x8
>>>>
>>>>
>>>> >> >> sparse matrix with 0 Float64 entries:,Int64[])
>>>> >> >>
>>>> >> >>
>>>> >> >> Now it fails on Float64 but not with Int:
>>>> >> >>
>>>> >> >> julia> LightGraphs.MinCutVisitor(g,spzeros(Float64,8,8))
>>>> >> >> ERROR: MethodError: `convert` has no method matching
>>>> >> >> convert(::Type{LightGraphs.MinCutVisitor{T}},
>>>> ::LightGraphs.Graph,
>>>> >> >> ::BitArray{1}, ::Array{Int64,1}, ::Float64, ::Float64, ::Int64,
>>>> >> >> ::Base.SparseMatrix.SparseMatrixCSC{Float64,Int64},
>>>> ::Array{Int64,1})
>>>> >> >> This may have arisen from a call to the constructor
>>>> >> >> LightGraphs.MinCutVisitor{T}(...),
>>>> >> >> since type constructors fall back to convert methods.
>>>> >> >> Closest candidates are:
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> LightGraphs.MinCutVisitor{T}(::Union{LightGraphs.Graph,LightGraphs.DiGraph},
>>>>
>>>>
>>>> >> >> ::AbstractArray{Bool,1}, ::Array{Int64,1}, ::T, ::T, ::Integer,
>>>> >> >> ::AbstractArray{T,2}, ::Array{Int64,1})
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> LightGraphs.MinCutVisitor{T}(::Union{LightGraphs.Graph,LightGraphs.DiGraph},
>>>>
>>>>
>>>> >> >> ::AbstractArray{T,2})
>>>> >> >> call{T}(::Type{T}, ::Any)
>>>> >> >> ...
>>>> >> >> in call at
>>>> /Users/seth/.julia/v0.4/LightGraphs/src/maxadjvisit.jl:99
>>>> >> >>
>>>> >> >>
>>>> >> >> julia> LightGraphs.MinCutVisitor(g,spzeros(Int,8,8))
>>>> >> >> LightGraphs.MinCutVisitor{Int64}({8, 0} undirected
>>>> >> >>
>>>> >> >>
>>>> graph,Bool[false,false,false,false,false,false,false,false],[0,0,0,0,0,0,0,0],9223372036854775807,0,0,8x8
>>>>
>>>>
>>>> >> >> sparse matrix with 0 Int64 entries:,Int64[])
>>>> >> >>
>>>> >> >> However, if I remove the type parameterization from the outer
>>>> >> >> constructor:
>>>> >> >>
>>>> >> >> function MinCutVisitor(graph::SimpleGraph, distmx::AbstractArray)
>>>> >> >>
>>>> >> >> n = nv(graph)
>>>> >> >> MinCutVisitor(
>>>> >> >> graph,
>>>> >> >> falses(n),
>>>> >> >> zeros(Int,n),
>>>> >> >> typemax(T),
>>>> >> >> zero(T),
>>>> >> >> zero(Int),
>>>> >> >> distmx,
>>>> >> >> @compat(Vector{Int}())
>>>> >> >> )
>>>> >> >> end
>>>> >> >>
>>>> >> >>
>>>> >> >> it works. Can someone tell me why this is?
>>>>
>>>