@@ -86,8 +86,9 @@ mutable struct DGraph{T<:Integer, D} <: Graphs.AbstractGraph{T}
86
86
return new {T,D} (Dagger. tochunk (state), Ref (false ))
87
87
end
88
88
end
89
- DGraph (x; kwargs... ) = DGraph {Int} (x; kwargs... )
90
89
DGraph (; kwargs... ) = DGraph {Int} (; kwargs... )
90
+ DGraph (x:: T ; kwargs... ) where {T<: Integer } = DGraph {T} (x; kwargs... )
91
+ DGraph (x:: AbstractGraph{T} ; kwargs... ) where {T<: Integer } = DGraph {T} (x; kwargs... )
91
92
DGraph {T} (n:: S ; kwargs... ) where {T<: Integer ,S<: Integer } =
92
93
DGraph {T} (T (n); kwargs... )
93
94
function DGraph {T} (n:: T ; freeze:: Bool = false , kwargs... ) where {T<: Integer }
@@ -96,13 +97,13 @@ function DGraph{T}(n::T; freeze::Bool=false, kwargs...) where {T<:Integer}
96
97
freeze && freeze! (g)
97
98
return g
98
99
end
99
- function DGraph {T} (sg:: AbstractGraph{T } ; directed:: Bool = is_directed (sg), freeze:: Bool = false , kwargs... ) where {T<: Integer }
100
- g = DGraph {T} (nv (sg); directed, kwargs... )
100
+ function DGraph {T} (sg:: AbstractGraph{U } ; directed:: Bool = is_directed (sg), freeze:: Bool = false , kwargs... ) where {T<: Integer , U <: Integer }
101
+ g = DGraph {T} (T ( nv (sg) ); directed, kwargs... )
101
102
foreach (edges (sg)) do edge
102
-
103
- add_edge! (g, edge )
103
+ edge_conv = Edge ( T ( src (edge)), T ( dst (edge)))
104
+ add_edge! (g, edge_conv )
104
105
if ! is_directed (sg) && directed
105
- add_edge! (g, dst (edge ), src (edge ))
106
+ add_edge! (g, dst (edge_conv ), src (edge_conv ))
106
107
end
107
108
end
108
109
freeze && freeze! (g)
@@ -221,7 +222,7 @@ function freeze!(g::DGraphState)
221
222
return false
222
223
end
223
224
g. frozen[] = true
224
- for part in nparts (g)
225
+ for part in 1 : nparts (g)
225
226
if Dagger. istask (g. parts[part])
226
227
g. parts[part] = fetch (g. parts[part]; raw= true )
227
228
end
@@ -516,6 +517,9 @@ function Graphs.has_edge(g::DGraphState{T,D}, src::Integer, dst::Integer) where
516
517
end
517
518
end
518
519
Graphs. is_directed (:: DGraph{T,D} ) where {T,D} = D
520
+ Graphs. is_directed (:: Type{<:DGraph{T,D}} ) where {T,D} = D
521
+ Graphs. is_directed (:: DGraphState{T,D} ) where {T,D} = D
522
+ Graphs. is_directed (:: Type{<:DGraphState{T,D}} ) where {T,D} = D
519
523
Graphs. vertices (g:: DGraph{T} ) where T = Base. OneTo {T} (nv (g))
520
524
Graphs. edges (g:: DGraph ) = DGraphEdgeIter (g)
521
525
@@ -663,30 +667,30 @@ function add_partition!(g::DGraphState{T,D}, part_data::Ref, back_data::Ref,
663
667
push! (g. bg_adjs_e_meta, back_edge_meta_data[])
664
668
return length (g. parts)
665
669
end
666
- function Graphs. add_edge! (g:: DGraph , src:: Integer , dst:: Integer )
670
+ function Graphs. add_edge! (g:: DGraph{T} , src:: Integer , dst:: Integer ) where T
667
671
check_not_frozen (g)
668
- return with_state (g, add_edge!, src, dst)
672
+ return with_state (g, add_edge!, T ( src), T ( dst) )
669
673
end
670
- function Graphs. add_edge! (g:: DGraph , edge:: Edge )
674
+ function Graphs. add_edge! (g:: DGraph{T} , edge:: Edge ) where T
671
675
check_not_frozen (g)
672
- return add_edge! (g, src (edge), dst (edge))
676
+ return add_edge! (g, T ( src (edge)), T ( dst (edge) ))
673
677
end
674
678
function Graphs. add_edge! (g:: DGraphState{T,D} , src:: Integer , dst:: Integer ) where {T,D}
675
679
check_not_frozen (g)
676
680
677
- src_part_idx = findfirst (span-> src in span, g. parts_nv)
681
+ src_part_idx = T ( findfirst (span-> src in span, g. parts_nv) )
678
682
@assert src_part_idx != = nothing " Source vertex $src does not exist"
679
683
680
- dst_part_idx = findfirst (span-> dst in span, g. parts_nv)
684
+ dst_part_idx = T ( findfirst (span-> dst in span, g. parts_nv) )
681
685
@assert dst_part_idx != = nothing " Destination vertex $dst does not exist"
682
686
683
687
if src_part_idx == dst_part_idx
684
688
# Edge exists within a single partition
685
689
part = g. parts[src_part_idx]
686
- src_shift = src - (g. parts_nv[src_part_idx]. start - 1 )
687
- dst_shift = dst - (g. parts_nv[dst_part_idx]. start - 1 )
690
+ src_shift = src - (g. parts_nv[src_part_idx]. start - one (T) )
691
+ dst_shift = dst - (g. parts_nv[dst_part_idx]. start - one (T) )
688
692
if exec_fast (add_edge!, part, src_shift, dst_shift)
689
- g. parts_ne[src_part_idx] += 1
693
+ g. parts_ne[src_part_idx] += one (T)
690
694
else
691
695
return false
692
696
end
@@ -701,13 +705,13 @@ function Graphs.add_edge!(g::DGraphState{T,D}, src::Integer, dst::Integer) where
701
705
end
702
706
if D
703
707
# TODO : This will cause imbalance for many outgoing edges from a few vertices
704
- g. bg_adjs_ne_src[src_part_idx] += 1
708
+ g. bg_adjs_ne_src[src_part_idx] += one (T)
705
709
else
706
710
owner_part_idx = edge_owner (src, dst, src_part_idx, dst_part_idx)
707
- g. bg_adjs_ne_src[owner_part_idx] += 1
711
+ g. bg_adjs_ne_src[owner_part_idx] += one (T)
708
712
end
709
- g. bg_adjs_ne[src_part_idx] += 1
710
- g. bg_adjs_ne[dst_part_idx] += 1
713
+ g. bg_adjs_ne[src_part_idx] += one (T)
714
+ g. bg_adjs_ne[dst_part_idx] += one (T)
711
715
end
712
716
713
717
return true
@@ -771,23 +775,24 @@ function add_edges!(g::Graphs.AbstractSimpleGraph, shift, edges; all::Bool=true)
771
775
end
772
776
773
777
"""
774
- edge_owner(src::Integer , dst::Integer , src_part_idx::Integer , dst_part_idx::Integer)
778
+ edge_owner(src::T , dst::T , src_part_idx::T , dst_part_idx::T) where {T<:Integer}
775
779
776
780
Determine which partition owns the edge `(src, dst)`.
777
- FIXME: I do not like it. Both partitions should own the edge. (i.e. there should be data redundancy for the backgorund graph)
781
+ FIXME: I do not like it. Both partitions should own the edge. (i.e. there should be data redundancy for the background graph)
778
782
"""
779
- edge_owner (src:: Int , dst:: Int , src_part_idx:: Int , dst_part_idx:: Int ) =
783
+ edge_owner (src:: T , dst:: T , src_part_idx:: T , dst_part_idx:: T ) where {T <: Integer } =
780
784
iseven (hash (Base. unsafe_trunc (UInt, src+ dst))) ? src_part_idx : dst_part_idx
781
785
782
- Graphs. inneighbors (g:: DGraph , v:: Integer ) = with_state (g, inneighbors, v)
783
- function Graphs. inneighbors (g:: DGraphState{T} , v:: Integer ) where T
786
+ Graphs. inneighbors (g:: DGraph{T} , v:: Integer ) where T =
787
+ with_state (g, inneighbors, T (v))
788
+ function Graphs. inneighbors (g:: DGraphState{T} , v:: T ) where T
784
789
part_idx = findfirst (span-> v in span, g. parts_nv)
785
790
if part_idx === nothing
786
791
throw (BoundsError (g, v))
787
792
end
788
793
789
794
neighbors = T[]
790
- shift = g. parts_nv[part_idx]. start - 1
795
+ shift = g. parts_nv[part_idx]. start - one (T)
791
796
792
797
# Check against local edges
793
798
v_shift = v - shift
@@ -797,17 +802,18 @@ function Graphs.inneighbors(g::DGraphState{T}, v::Integer) where T
797
802
# Check against background edges
798
803
append! (neighbors, exec_fast (inneighbors, g. bg_adjs[part_idx], v))
799
804
800
- return neighbors
805
+ return sort! ( neighbors)
801
806
end
802
- Graphs. outneighbors (g:: DGraph , v:: Integer ) = with_state (g, outneighbors, v)
803
- function Graphs. outneighbors (g:: DGraphState{T} , v:: Integer ) where T
807
+ Graphs. outneighbors (g:: DGraph{T} , v:: Integer ) where T =
808
+ with_state (g, outneighbors, T (v))
809
+ function Graphs. outneighbors (g:: DGraphState{T} , v:: T ) where T
804
810
part_idx = findfirst (span-> v in span, g. parts_nv)
805
811
if part_idx === nothing
806
812
throw (BoundsError (g, v))
807
813
end
808
814
809
815
neighbors = T[]
810
- shift = g. parts_nv[part_idx]. start - 1
816
+ shift = g. parts_nv[part_idx]. start - one (T)
811
817
812
818
# Check against local edges
813
819
v_shift = v - shift
@@ -817,7 +823,7 @@ function Graphs.outneighbors(g::DGraphState{T}, v::Integer) where T
817
823
# Check against background edges
818
824
append! (neighbors, exec_fast (outneighbors, g. bg_adjs[part_idx], v))
819
825
820
- return neighbors
826
+ return sort! ( neighbors)
821
827
end
822
828
823
829
"""
@@ -878,8 +884,8 @@ partition_edges(g::DGraph, part::Integer) =
878
884
879
885
Get the edges of the partition `part` of the graph state `g`.
880
886
"""
881
- function partition_edges (g:: DGraphState , part:: Integer )
882
- shift = g. parts_nv[part]. start - 1
887
+ function partition_edges (g:: DGraphState{T} , part:: Integer ) where T
888
+ shift = g. parts_nv[part]. start - one (T)
883
889
part_edges = map (edge-> Edge (src (edge)+ shift, dst (edge)+ shift), exec_fast (edges, g. parts[part]))
884
890
back_edges = exec_fast (edges, g. bg_adjs[part])
885
891
return part_edges, back_edges
0 commit comments