Skip to content

Commit d3e1208

Browse files
authored
feat: seeding for random order (#163)
* feat: seeding for random order * Generic seed type * Random as test dep
1 parent c89c3dd commit d3e1208

5 files changed

Lines changed: 44 additions & 10 deletions

File tree

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "SparseMatrixColorings"
22
uuid = "0a514795-09f3-496d-8182-132a7b665d35"
33
authors = ["Guillaume Dalle", "Alexis Montoison"]
4-
version = "0.4.10"
4+
version = "0.4.11"
55

66
[deps]
77
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"

src/SparseMatrixColorings.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ using LinearAlgebra:
2828
ldiv!,
2929
parent,
3030
transpose
31-
using Random: AbstractRNG, default_rng, randperm
31+
using Random: Random, AbstractRNG, default_rng, randperm
3232
using SparseArrays:
3333
SparseArrays,
3434
SparseMatrixCSC,

src/order.jl

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,42 @@ function vertices(bg::BipartiteGraph, ::Val{side}, ::NaturalOrder) where {side}
3333
end
3434

3535
"""
36-
RandomOrder(rng=default_rng())
36+
RandomOrder(rng=default_rng(), seed=nothing)
3737
38-
Instance of [`AbstractOrder`](@ref) which sorts vertices using a random permutation.
38+
Instance of [`AbstractOrder`](@ref) which sorts vertices using a random permutation, generated from `rng` with a given `seed`.
39+
40+
- If `seed = nothing`, the `rng` will never be re-seeded. Therefore, two consecutive calls to `vertices(g, order)` will give different results.
41+
- Otherwise, the `rng` will be re-seeded before each sample. Therefore, two consecutive calls to `vertices(g, order)` will give the same result.
42+
43+
!!! warning
44+
Do not use a seed with the `default_rng()`, otherwise you will affect the global state of your program.
45+
If you need reproducibility, create a new `rng` specifically for your `RandomOrder`.
46+
The package [StableRNGs.jl](https://github.com/JuliaRandom/StableRNGs.jl) offers random number generators whose behavior is stable across Julia versions.
3947
"""
40-
struct RandomOrder{R<:AbstractRNG} <: AbstractOrder
48+
struct RandomOrder{R<:AbstractRNG,S} <: AbstractOrder
4149
rng::R
50+
seed::S
4251
end
4352

53+
RandomOrder(rng::AbstractRNG) = RandomOrder(rng, nothing)
4454
RandomOrder() = RandomOrder(default_rng())
4555

4656
function vertices(g::AdjacencyGraph, order::RandomOrder)
47-
return randperm(order.rng, nb_vertices(g))
57+
(; rng, seed) = order
58+
if isnothing(seed)
59+
return randperm(rng, nb_vertices(g))
60+
else
61+
return randperm(Random.seed!(rng, seed), nb_vertices(g))
62+
end
4863
end
4964

5065
function vertices(bg::BipartiteGraph, ::Val{side}, order::RandomOrder) where {side}
51-
return randperm(order.rng, nb_vertices(bg, Val(side)))
66+
(; rng, seed) = order
67+
if isnothing(seed)
68+
return randperm(rng, nb_vertices(bg, Val(side)))
69+
else
70+
return randperm(Random.seed!(rng, seed), nb_vertices(bg, Val(side)))
71+
end
5272
end
5373

5474
"""

test/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b"
1414
JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
1515
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1616
MatrixDepot = "b51810bb-c9f3-55da-ae3c-350fc1fbce05"
17+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1718
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1819
SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
1920
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"

test/order.jl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ using SparseMatrixColorings:
1111
nb_vertices,
1212
valid_dynamic_order,
1313
vertices
14+
using Random
1415
using StableRNGs
1516
using Test
1617

@@ -31,10 +32,10 @@ rng = StableRNG(63)
3132
end;
3233

3334
@testset "RandomOrder" begin
34-
A = sprand(rng, Bool, 5, 5, 0.5)
35+
A = sprand(rng, Bool, 10, 10, 0.5)
3536
ag = AdjacencyGraph(A)
36-
@test sort(vertices(ag, RandomOrder(rng))) == 1:5
37-
@test sort(vertices(ag, RandomOrder())) == 1:5
37+
@test sort(vertices(ag, RandomOrder(rng))) == 1:10
38+
@test sort(vertices(ag, RandomOrder())) == 1:10
3839

3940
A = sprand(rng, Bool, 5, 4, 0.5)
4041
bg = BipartiteGraph(A)
@@ -45,6 +46,18 @@ end;
4546
bg = BipartiteGraph(A)
4647
@test sort(vertices(bg, Val(2), RandomOrder(rng))) == 1:4
4748
@test sort(vertices(bg, Val(2), RandomOrder())) == 1:4
49+
50+
order = RandomOrder()
51+
@test order.rng === Random.default_rng()
52+
@test isnothing(order.seed)
53+
54+
order = RandomOrder(StableRNG(0))
55+
@test isnothing(order.seed)
56+
@test vertices(ag, order) != vertices(ag, order)
57+
58+
order = RandomOrder(StableRNG(0), 6)
59+
@test order.seed == 6
60+
@test vertices(ag, order) == vertices(ag, order)
4861
end;
4962

5063
@testset "LargestFirst" begin

0 commit comments

Comments
 (0)