Skip to content

Commit 4438f22

Browse files
committed
bugfix tests and CI
1 parent 2d0574f commit 4438f22

File tree

9 files changed

+64
-41
lines changed

9 files changed

+64
-41
lines changed

.github/workflows/CI.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,15 @@ jobs:
5151
python-version: '3.x'
5252
- run: pip install jupyter
5353
- uses: julia-actions/setup-julia@v2
54+
- run: sudo apt-get update && sudo apt-get install -y xvfb libgl1-mesa-dri
55+
- run: |
56+
Xvfb :0 -screen 0 1024x768x24 &
57+
sleep 3
58+
env:
59+
DISPLAY: ':0'
5460
- uses: julia-actions/julia-docdeploy@v1
5561
env:
62+
DISPLAY: ':0'
5663
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # For authentication with GitHub Actions token
5764
DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # For authentication with SSH deploy key
5865
JULIA_DEBUG: "Documenter"

src/measures/edge_betweenness.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ needs_edgebetweenness_workspace(::EdgeBetweenness, ::RSP) = true
3030
QuoteNode(Symbol(nameof(m), :_, nameof(W)))
3131

3232
# At the ConnectedGraph level we return a SparseMatrixCSC
33-
function allocate_connectedgraph_output(
33+
function _allocate_connectedgraph_output(
3434
l::Union{ConnectedGraphLevel,TargetLevel},
3535
::ReturnCustomSparse,
3636
m::EdgeBetweenness,

src/measures/eigmax.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ returntrait(::EigMax) = ReturnCustom()
2323
needs_eigmax(::EigMax, ::RSP) = true
2424

2525
# Allocate sqauare matrix of target * target size
26-
function allocate_gridgraph_output(
26+
function _allocate_gridgraph_output(
2727
::ReturnCustom,
2828
m::EigMax,
2929
::GridGraph,
@@ -33,7 +33,7 @@ function allocate_gridgraph_output(
3333
o = Vector{T}(undef, length(connectedgraphs))
3434
return MeasureOutput(m, o)
3535
end
36-
function allocate_connectedgraph_output(
36+
function _allocate_connectedgraph_output(
3737
::ConnectedGraphLevel,
3838
::ReturnCustom,
3939
m::EigMax,

src/measures/sensitivity.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,8 @@ function _compute_sensitivity_precursors(::PowerMeanProximity, cgi::ConnectedGra
299299

300300
edge_bet = EdgeBetweenness(custom_weighted)
301301
node_bet = Betweenness(custom_weighted)
302-
edge_output = allocate_connectedgraph_output(finallevel, edge_bet, cgi).output
303-
node_output = allocate_connectedgraph_output(finallevel, node_bet, cgi).output
302+
edge_output = _allocate_connectedgraph_output(finallevel, edge_bet, cgi).output
303+
node_output = _allocate_connectedgraph_output(finallevel, node_bet, cgi).output
304304

305305
# Compute EdgeBetweenness
306306
compute_connectedgraph!(edge_output, edge_bet, cgi)

src/measures/shared.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,19 @@ function num_vec_workspaces(problem::ConScapeProblem)
7070
# Base of 10 covers target_precalculation needs:
7171
# Z (2), Zⁱ (1), Y (1), K (2 with proximity measure), M (1), plus buffer
7272
base = 10
73-
return base + sum(m -> num_vec_workspaces(m, mov), values(mes); init=0)
73+
return base + _sum_over_measures(num_vec_workspaces, mes, mov)
7474
end
7575

7676
function num_sp_workspaces(problem::ConScapeProblem)
7777
mov = movement(problem)
7878
mes = measures(problem)
7979
base = num_sp_workspaces_base(mov, solver(problem))
80-
return base + sum(m -> num_sp_workspaces(m, mov), values(mes); init=0)
80+
return base + _sum_over_measures(num_sp_workspaces, mes, mov)
8181
end
8282

83+
_sum_over_measures(f, mes::NamedTuple, mov) = sum(m -> f(m, mov), values(mes); init=0)
84+
_sum_over_measures(f, m::Measure, mov) = f(m, mov)
85+
8386
# Define the default output Level for that initialisation object
8487
defaultfinallevel(::GridGraphInit) = GridGraphLevel()
8588
defaultfinallevel(::ConnectedGraphInit) = ConnectedGraphLevel()

src/output.jl

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ const ReturnAssigned = Union{ReturnAssignedSparse,ReturnAssignedDense}
1313
allocate_gridgraph_output(problem::ConScapeProblem, args...) =
1414
allocate_gridgraph_output(measures(problem), args...)
1515
allocate_gridgraph_output(measures::Union{Tuple,NamedTuple}, args...) =
16-
map(m -> allocate_gridgraph_output(m, args...)::MeasureOutput, measures)
17-
allocate_gridgraph_output(m::Measure, args...) =
18-
allocate_gridgraph_output(returntrait(m), m, args...)
16+
map(m -> _allocate_gridgraph_output(m, args...)::MeasureOutput, measures)
17+
# Single Measure: wrap in NamedTuple for consistent internal handling
18+
function allocate_gridgraph_output(m::Measure, args...)
19+
mo = _allocate_gridgraph_output(m, args...)
20+
return NamedTuple{(Symbol(m),)}((mo,))
21+
end
1922

20-
allocate_gridgraph_output(rt::ReturnTrait, m::Measure, ggi::GridGraphInit) =
21-
allocate_gridgraph_output(rt, m, gridgraph(ggi), connectedgraphs(ggi))
22-
function allocate_gridgraph_output(
23+
_allocate_gridgraph_output(m::Measure, args...) =
24+
_allocate_gridgraph_output(returntrait(m), m, args...)
25+
_allocate_gridgraph_output(rt::ReturnTrait, m::Measure, ggi::GridGraphInit) =
26+
_allocate_gridgraph_output(rt, m, gridgraph(ggi), connectedgraphs(ggi))
27+
function _allocate_gridgraph_output(
2328
::ReturnScalarSum,
2429
m::Measure,
2530
::GridGraph,
@@ -28,7 +33,7 @@ function allocate_gridgraph_output(
2833
return MeasureOutput(m, zeros(Float64, length(connectedgraphs)))
2934
end
3035
# We need to zero out all connected subgraphs
31-
function allocate_gridgraph_output(
36+
function _allocate_gridgraph_output(
3237
::ReturnSpatial,
3338
m::Measure,
3439
gridgraph::GridGraph,
@@ -37,7 +42,7 @@ function allocate_gridgraph_output(
3742
o = fill(NaN, size(gridgraph))
3843
return MeasureOutput(m, o)
3944
end
40-
function allocate_gridgraph_output(
45+
function _allocate_gridgraph_output(
4146
::ReturnAssignedDense,
4247
m::Measure,
4348
gridgraph::GridGraph,
@@ -46,7 +51,7 @@ function allocate_gridgraph_output(
4651
o = Vector{Matrix{Float64}}(undef, length(connectedgraphs))
4752
return MeasureOutput(m, o)
4853
end
49-
function allocate_gridgraph_output(
54+
function _allocate_gridgraph_output(
5055
::ReturnSparseGraph,
5156
m::Measure,
5257
gridgraph::GridGraph,
@@ -59,12 +64,18 @@ end
5964
allocate_connectedgraph_output(l::Level, problem::ConScapeProblem, args...) =
6065
allocate_connectedgraph_output(l, measures(problem), args...)
6166
allocate_connectedgraph_output(l::Level, measures::Union{Tuple,NamedTuple}, args...) =
62-
map(m -> allocate_connectedgraph_output(l, m, args...)::MeasureOutput, measures)
63-
allocate_connectedgraph_output(l::Level, m::Measure, args...)::MeasureOutput =
64-
allocate_connectedgraph_output(l, returntrait(m), m, args...)
65-
allocate_connectedgraph_output(l::Level, m::Measure, cgi::ConnectedGraphInit)::MeasureOutput =
66-
allocate_connectedgraph_output(l, returntrait(m), m, gridgraph(cgi), connectedgraph(cgi))
67-
function allocate_connectedgraph_output(
67+
map(m -> _allocate_connectedgraph_output(l, m, args...)::MeasureOutput, measures)
68+
# Single Measure: wrap in NamedTuple for consistent internal handling
69+
function allocate_connectedgraph_output(l::Level, m::Measure, args...)
70+
mo = _allocate_connectedgraph_output(l, m, args...)
71+
return NamedTuple{(Symbol(m),)}((mo,))
72+
end
73+
74+
_allocate_connectedgraph_output(l::Level, m::Measure, args...)::MeasureOutput =
75+
_allocate_connectedgraph_output(l, returntrait(m), m, args...)
76+
_allocate_connectedgraph_output(l::Level, m::Measure, cgi::ConnectedGraphInit)::MeasureOutput =
77+
_allocate_connectedgraph_output(l, returntrait(m), m, gridgraph(cgi), connectedgraph(cgi))
78+
function _allocate_connectedgraph_output(
6879
l::Union{ConnectedGraphLevel,TargetLevel},
6980
::ReturnSpatial,
7081
m::Measure,
@@ -76,7 +87,7 @@ function allocate_connectedgraph_output(
7687
o[sourceids(connectedgraph)] .= 0.0
7788
return MeasureOutput(m, o)
7889
end
79-
function allocate_connectedgraph_output(
90+
function _allocate_connectedgraph_output(
8091
l::Union{ConnectedGraphLevel,TargetLevel},
8192
::ReturnScalarSum,
8293
m::Measure,
@@ -87,7 +98,7 @@ function allocate_connectedgraph_output(
8798
return MeasureOutput(m, o)
8899
end
89100
# Return a sparse matrix for ReturnAssignedSparse at ConnectedGraphLevel
90-
function allocate_connectedgraph_output(
101+
function _allocate_connectedgraph_output(
91102
l::ConnectedGraphLevel,
92103
::ReturnAssignedSparse,
93104
m::Measure,
@@ -98,7 +109,7 @@ function allocate_connectedgraph_output(
98109
return MeasureOutput(m, o)
99110
end
100111
# Return a sparse vector for ReturnAssignedSparse at TargetLevel
101-
function allocate_connectedgraph_output(
112+
function _allocate_connectedgraph_output(
102113
l::TargetLevel,
103114
::ReturnAssignedSparse,
104115
m::Measure,
@@ -109,7 +120,7 @@ function allocate_connectedgraph_output(
109120
return MeasureOutput(m, o)
110121
end
111122
# Return a dense matrix for ReturnAssignedDense at ConnectedGraphLevel
112-
function allocate_connectedgraph_output(
123+
function _allocate_connectedgraph_output(
113124
l::ConnectedGraphLevel,
114125
::ReturnAssignedDense,
115126
m::Measure,
@@ -120,7 +131,7 @@ function allocate_connectedgraph_output(
120131
return MeasureOutput(m, o)
121132
end
122133
# Return a dense vector for ReturnAssignedDense at TargetLevel
123-
function allocate_connectedgraph_output(
134+
function _allocate_connectedgraph_output(
124135
l::TargetLevel,
125136
::ReturnAssignedDense,
126137
m::Measure,

src/precalculation.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ num_sp_workspaces_base(::MovementMode, ::Any) = 0
3232
anymeasure(f, measures::NamedTuple, mov::MovementMode) =
3333
anymeasure(f, values(measures), mov)
3434
anymeasure(f, measures::Tuple{Vararg{Measure}}, mov::MovementMode) =
35-
any(map(m -> f(m, mov), measures))
35+
any(map(m -> f(m, mov), measures))
36+
anymeasure(f, m::Measure, mov::MovementMode) = f(m, mov)
3637

3738
# TODO: Move these to a precalculation.jl file with the computation precalculations
3839
function sparse_precalculation(problem::ConScapeProblem{<:RSP}, graph::ConnectedGraph, workspaces::WorkspaceCollection)
@@ -238,7 +239,7 @@ function dense_precalculation(::ConnectedGraphInit)
238239
(;)
239240
end
240241

241-
function _get_eigmax(measures::NamedTuple)::EigMax
242+
function _get_eigmax(measures::NamedTuple)::Union{EigMax,Nothing}
242243
all_eigmax = map(_get_eigmax, values(measures))
243244
return reduce(all_eigmax; init=nothing) do out, cur
244245
if !(isnothing(out) || isnothing(cur))
@@ -247,9 +248,9 @@ function _get_eigmax(measures::NamedTuple)::EigMax
247248
isnothing(out) ? cur : out
248249
end
249250
end
250-
_get_eigmax(m::EigMax) = m
251-
_get_eigmax(m::SensitivityAnalysis) = metric(m) isa EigMax ? metric(m) : nothing
252-
_get_eigmax(m::Measure) = nothing
251+
_get_eigmax(m::EigMax)::EigMax = m
252+
_get_eigmax(m::SensitivityAnalysis)::Union{EigMax,Nothing} = metric(m) isa EigMax ? metric(m) : nothing
253+
_get_eigmax(m::Measure)::Nothing = nothing
253254

254255
###########################################################################################
255256
# Variable generation for ConnectedGraphInit

src/problem.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ solve(targetinit)
7575
```
7676
"""
7777
struct ConScapeProblem{
78-
MM<:MovementMode,M<:NamedTuple,S<:Solver,G<:Union{Int,Nothing},CF,LF,N,SW<:StepWeight,MP<:Union{Nothing,String}
78+
MM<:MovementMode,M<:Union{Measure,NamedTuple},S<:Solver,G<:Union{Int,Nothing},CF,LF,N,SW<:StepWeight,MP<:Union{Nothing,String}
7979
} <: AbstractProblem
8080
movement::MM
8181
measures::M
@@ -87,18 +87,16 @@ struct ConScapeProblem{
8787
stepweight::SW
8888
mmap_path::MP
8989
function ConScapeProblem(
90-
movement::MM, m::M, solver::S, grain::G, costfunction::CF,
90+
movement::MM, m::M, solver::S, grain::G, costfunction::CF,
9191
likelyhoodfunction::LF, neighbors::N, stepweight::NW, mmap_path::MP
9292
) where {MM,M,S,G,CF,LF,N,NW,MP}
93-
m1 = if m isa Measure
94-
NamedTuple{(Symbol(m),)}((m,))
95-
elseif m isa Tuple
93+
m1 = if m isa Tuple
9694
NamedTuple{map(Symbol, m)}(m)
9795
else
9896
m
9997
end
10098
return new{MM,typeof(m1),S,G,CF,LF,N,NW,MP}(
101-
movement, m1, solver, grain, costfunction,
99+
movement, m1, solver, grain, costfunction,
102100
likelyhoodfunction, neighbors, stepweight, mmap_path
103101
)
104102
end

src/utils/utils.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,10 @@ _get_cost(rast::RasterStack) = _keys_or_nothing(rast, (:cost, :stepcost))
134134
_maybe_rasterstack(ggi) = _maybe_rasterstack(measures_outputs(ggi), ggi)
135135
function _maybe_rasterstack(measures_outputs, ggi)
136136
out = _maybe_raster(measures_outputs, ggi)
137-
if all(map(o -> o isa Raster, out))
137+
# Unwrap single-measure results if the problem was defined with a single Measure
138+
if measures(problem(ggi)) isa Measure
139+
return only(out)
140+
elseif all(map(o -> o isa Raster, out))
138141
return RasterStack(out)
139142
else
140143
return out
@@ -210,7 +213,7 @@ end
210213
function setmeasures(ggi::GridGraphInit, m::MeasureNamedTuple)
211214
problem = setmeasures(ConScape.problem(ggi), m)
212215
outputs = map(measures(problem)) do m
213-
allocate_gridgraph_output(m, ggi)
216+
_allocate_gridgraph_output(m, ggi)
214217
end
215218
return ConstructionBase.setproperties(ggi, (; problem, outputs))
216219
end
@@ -219,7 +222,7 @@ function setmeasures(cgi::ConnectedGraphInit, m::MeasureNamedTuple;
219222
)
220223
problem = setmeasures(ConScape.problem(cgi), m)
221224
outputs = map(measures(problem)) do m
222-
allocate_connectedgraph_output(finallevel, m, cgi)
225+
_allocate_connectedgraph_output(finallevel, m, cgi)
223226
end
224227
return ConnectedGraphInit(
225228
problem,

0 commit comments

Comments
 (0)