Skip to content

Commit 41fd5ea

Browse files
committed
move functions
1 parent ef5435d commit 41fd5ea

File tree

3 files changed

+78
-77
lines changed

3 files changed

+78
-77
lines changed

src/Common.jl

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
2+
export sortVarNested
3+
4+
"""
5+
$(SIGNATURES)
6+
Test if all elements of the string is a number: Ex, "123" is true, "1_2" is false.
7+
"""
8+
allnums(str::S) where {S <: AbstractString} = occursin(Regex(string(["[0-9]" for j in 1:length(str)]...)), str)
9+
# occursin(r"_+|,+|-+", node_idx)
10+
11+
isnestednum(str::S; delim='_') where {S <: AbstractString} = occursin(Regex("[0-9]+$(delim)[0-9]+"), str)
12+
13+
function sortnestedperm(strs::Vector{<:AbstractString}; delim='_')
14+
str12 = split.(strs, delim)
15+
sp1 = sortperm(parse.(Int,getindex.(str12,2)))
16+
sp2 = sortperm(parse.(Int,getindex.(str12,1)[sp1]))
17+
return sp1[sp2]
18+
end
19+
20+
function getFirstNumericalOffset(st::AS) where AS <: AbstractString
21+
i = 1
22+
while !allnums(st[i:i]) i+=1; end
23+
return i
24+
end
25+
26+
"""
27+
$SIGNATURES
28+
29+
Sort a variable list which may have nested structure such as `:x1_2` -- does not sort for alphabetic characters.
30+
"""
31+
function sortVarNested(vars::Vector{Symbol})::Vector{Symbol}
32+
# whos nested and first numeric character offset
33+
sv = string.(vars)
34+
offsets = getFirstNumericalOffset.(sv)
35+
masknested = isnestednum.(sv)
36+
masknotnested = true .⊻ masknested
37+
38+
# strip alphabetic characters from front
39+
msv = sv[masknotnested]
40+
msvO = offsets[masknotnested]
41+
nsv = sv[masknested]
42+
nsvO = offsets[masknested]
43+
44+
# do nonnested list separately
45+
nnreducelist = map((s,o) -> s[o:end], msv, msvO)
46+
nnintlist = parse.(Int, nnreducelist)
47+
nnp = sortperm(nnintlist)
48+
nnNums = nnintlist[nnp] # used in mixing later
49+
nonnested = msv[nnp]
50+
smsv = vars[masknotnested][nnp]
51+
52+
# do nested list separately
53+
nestedreducelist = map((s,o) -> s[o:end], nsv, nsvO)
54+
nestedp = sortnestedperm(nestedreducelist)
55+
nesNums = parse.(Int, getindex.(split.(nestedreducelist[nestedp], '_'),1)) # used in mixing later
56+
nested = nsv[nestedp]
57+
snsv = vars[masknested][nestedp]
58+
59+
# mix back together, pick next sorted item from either pile
60+
retvars = Vector{Symbol}(undef, length(vars))
61+
nni = 1
62+
nesi = 1
63+
lsmsv = length(smsv)
64+
lsnsv = length(snsv)
65+
MAXMAX = 999999999999
66+
for i in 1:length(vars)
67+
# inner ifs to ensure bounds and correct sorting at end of each list
68+
if (nni<=lsmsv ? nnNums[nni] : MAXMAX) <= (nesi<=lsnsv ? nesNums[nesi] : MAXMAX)
69+
retvars[i] = smsv[nni]
70+
nni += 1
71+
else
72+
retvars[i] = snsv[nesi]
73+
nesi += 1
74+
end
75+
end
76+
return retvars
77+
end

src/DistributedFactorGraphs.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ include("services/AbstractDFG.jl")
3232
include("services/DFGVariable.jl")
3333

3434
# not sure where to put
35+
include("Common.jl")
3536
include("NeedsAHome.jl")
3637

3738
end

src/services/GraphsDFG.jl

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export getLabelDict, getDescription, setDescription, getInnerGraph, getAddHistor
3434
export getAddHistory, getDescription, getLabelDict
3535
export addVariable!, addFactor!
3636
export ls, lsf, getVariables, getFactors, getVariableIds, getFactorIds
37-
export sortVarNested
3837
export getVariable, getFactor
3938
export updateVariable!, updateFactor!
4039
export deleteVariable!, deleteFactor!
@@ -362,82 +361,6 @@ Checks if the graph is not fully connected, returns true if it is not contiguous
362361
hasOrphans(dfg::GraphsDFG)::Bool = !isFullyConnected(dfg)
363362

364363

365-
"""
366-
$(SIGNATURES)
367-
Test if all elements of the string is a number: Ex, "123" is true, "1_2" is false.
368-
"""
369-
allnums(str::S) where {S <: AbstractString} = occursin(Regex(string(["[0-9]" for j in 1:length(str)]...)), str)
370-
# occursin(r"_+|,+|-+", node_idx)
371-
372-
isnestednum(str::S; delim='_') where {S <: AbstractString} = occursin(Regex("[0-9]+$(delim)[0-9]+"), str)
373-
374-
function sortnestedperm(strs::Vector{<:AbstractString}; delim='_')
375-
str12 = split.(strs, delim)
376-
sp1 = sortperm(parse.(Int,getindex.(str12,2)))
377-
sp2 = sortperm(parse.(Int,getindex.(str12,1)[sp1]))
378-
return sp1[sp2]
379-
end
380-
381-
function getFirstNumericalOffset(st::AS) where AS <: AbstractString
382-
i = 1
383-
while !allnums(st[i:i]) i+=1; end
384-
return i
385-
end
386-
387-
"""
388-
$SIGNATURES
389-
390-
Sort a variable list which may have nested structure such as `:x1_2` -- does not sort for alphabetic characters.
391-
"""
392-
function sortVarNested(vars::Vector{Symbol})::Vector{Symbol}
393-
# whos nested and first numeric character offset
394-
sv = string.(vars)
395-
offsets = getFirstNumericalOffset.(sv)
396-
masknested = isnestednum.(sv)
397-
masknotnested = true .⊻ masknested
398-
399-
# strip alphabetic characters from front
400-
msv = sv[masknotnested]
401-
msvO = offsets[masknotnested]
402-
nsv = sv[masknested]
403-
nsvO = offsets[masknested]
404-
405-
# do nonnested list separately
406-
nnreducelist = map((s,o) -> s[o:end], msv, msvO)
407-
nnintlist = parse.(Int, nnreducelist)
408-
nnp = sortperm(nnintlist)
409-
nnNums = nnintlist[nnp] # used in mixing later
410-
nonnested = msv[nnp]
411-
smsv = vars[masknotnested][nnp]
412-
413-
# do nested list separately
414-
nestedreducelist = map((s,o) -> s[o:end], nsv, nsvO)
415-
nestedp = sortnestedperm(nestedreducelist)
416-
nesNums = parse.(Int, getindex.(split.(nestedreducelist[nestedp], '_'),1)) # used in mixing later
417-
nested = nsv[nestedp]
418-
snsv = vars[masknested][nestedp]
419-
420-
# mix back together, pick next sorted item from either pile
421-
retvars = Vector{Symbol}(undef, length(vars))
422-
nni = 1
423-
nesi = 1
424-
lsmsv = length(smsv)
425-
lsnsv = length(snsv)
426-
MAXMAX = 999999999999
427-
for i in 1:length(vars)
428-
# inner ifs to ensure bounds and correct sorting at end of each list
429-
if (nni<=lsmsv ? nnNums[nni] : MAXMAX) <= (nesi<=lsnsv ? nesNums[nesi] : MAXMAX)
430-
retvars[i] = smsv[nni]
431-
nni += 1
432-
else
433-
retvars[i] = snsv[nesi]
434-
nesi += 1
435-
end
436-
end
437-
return retvars
438-
end
439-
440-
441364
"""
442365
$(SIGNATURES)
443366
Retrieve a list of labels of the immediate neighbors around a given variable or factor.

0 commit comments

Comments
 (0)