Skip to content

Commit 62e8dae

Browse files
authored
Merge pull request #258 from JuliaRobotics/maintenance/prep030
addNode! becomes addVariable!
2 parents 30fceef + 3ce3a99 commit 62e8dae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+144
-143
lines changed

REQUIRE

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
julia 0.7 1.1
2-
RoME 0.3.0
3-
IncrementalInference 0.5.0
4-
Graphs 0.10.2
5-
KernelDensityEstimate 0.5.0
62
Distributions 0.16.0
7-
TransformUtils 0.2.2
83
Rotations 0.8.0
4+
Graphs 0.10.2
5+
KernelDensityEstimate 0.5.0 0.6.0
6+
ApproxManifoldProducts 0.0.3 0.2.0
7+
IncrementalInference 0.5.1 0.6.0
8+
RoME 0.3.1 0.4.0
9+
TransformUtils 0.2.2
910
CoordinateTransformations 0.5.0
1011
JLD2
1112
JSON 0.18.0

docs/src/concepts/arena_visualizations.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ using RoME, Distributions
8888
using RoMEPlotting
8989

9090
fg = initfg()
91-
addNode!(fg, :x0, Pose2)
91+
addVariable!(fg, :x0, Pose2)
9292
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), eye(3))))
93-
addNode!(fg, :x1, Pose2)
93+
addVariable!(fg, :x1, Pose2)
9494
addFactor!(fg, [:x0;:x1], Pose2Pose2(MvNormal([10.0;0;0], eye(3))))
9595

9696
ensureAllInitialized!(fg)

docs/src/concepts/building_graphs.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ Variables (a.k.a. poses in localization terminology) are created in the same way
2626

2727
```julia
2828
# Add the first pose :x0
29-
addNode!(fg, :x0, Pose2)
29+
addVariable!(fg, :x0, Pose2)
3030
# Add a few more poses
3131
for i in 1:10
32-
addNode!(fg, Symbol("x$(i)"), Pose2)
32+
addVariable!(fg, Symbol("x$(i)"), Pose2)
3333
end
3434
```
3535

docs/src/examples/basic_continuousscalar.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ The variable nodes are identified by `Symbol`s, namely `:x0, :x1, :x2, :x3`.
2727
fg = emptyFactorGraph()
2828

2929
# add the first node
30-
addNode!(fg, :x0, ContinuousScalar)
30+
addVariable!(fg, :x0, ContinuousScalar)
3131

3232
# this is unary (prior) factor and does not immediately trigger autoinit of :x0.
3333
addFactor!(fg, [:x0], Prior(Normal(0,1)))
@@ -60,7 +60,7 @@ Also note that initialization of variables is a local operation based only on th
6060

6161
By adding `:x1` and connecting it through the `LinearConditional` and `Normal` distributed factor, the automatic initialization of `:x0` is triggered.
6262
```julia
63-
addNode!(fg, :x1, ContinuousScalar)
63+
addVariable!(fg, :x1, ContinuousScalar)
6464
# P(Z | :x1 - :x0 ) where Z ~ Normal(10,1)
6565
addFactor!(fg, [:x0, :x1], LinearConditional(Normal(10.0,1)))
6666
@show isInitialized(fg, :x0) # true
@@ -105,7 +105,7 @@ The red trace (predicted belief of `:x1`) is noting more than the approximated c
105105

106106
Another `ContinuousScalar` variable `:x2` is 'connected' to `:x1` through a more complicated `MixtureLinearConditional` likelihood function.
107107
```julia
108-
addNode!(fg, :x2, ContinuousScalar)
108+
addVariable!(fg, :x2, ContinuousScalar)
109109
mmo = MixtureLinearConditional([Rayleigh(3); Uniform(30,55)], Categorical([0.4; 0.6]))
110110
addFactor!(fg, [:x1, :x2], mmo)
111111
```
@@ -133,7 +133,7 @@ plotKDE(fg, [:x0, :x1, :x2])
133133

134134
Adding one more variable `:x3` through another `LinearConditional(Normal(-50,1))`
135135
```julia
136-
addNode!(fg, :x3, ContinuousScalar)
136+
addVariable!(fg, :x3, ContinuousScalar)
137137
addFactor!(fg, [:x2, :x3], LinearConditional(Normal(-50, 1)))
138138
```
139139
expands the factor graph to to four variables and four factors.

docs/src/examples/basic_hexagonal2d.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ After loading the RoME and Distributions modules, we construct a local factor gr
1919
fg = initfg()
2020

2121
# Add the first pose :x0
22-
addNode!(fg, :x0, Pose2)
22+
addVariable!(fg, :x0, Pose2)
2323

2424
# Add at a fixed location PriorPose2 to pin :x0 to a starting location
2525
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*Matrix(LinearAlgebra.I,3,3))) )
@@ -37,7 +37,7 @@ The next 6 nodes are added with odometry in an counter-clockwise hexagonal manne
3737
for i in 0:5
3838
psym = Symbol("x$i")
3939
nsym = Symbol("x$(i+1)")
40-
addNode!(fg, nsym, Pose2)
40+
addVariable!(fg, nsym, Pose2)
4141
pp = Pose2Pose2(MvNormal([10.0;0;pi/3], Matrix(Diagonal([0.1;0.1;0.1].^2))))
4242
addFactor!(fg, [psym;nsym], pp )
4343
end
@@ -86,7 +86,7 @@ Suppose some sensor detected a feature of interest with an associated range and
8686
The new variable and measurement can be included into the factor graph as follows:
8787
```julia
8888
# Add landmarks with Bearing range measurements
89-
addNode!(fg, :l1, Point2, labels=["LANDMARK"])
89+
addVariable!(fg, :l1, Point2, labels=["LANDMARK"])
9090
p2br = Pose2Point2BearingRange(Normal(0,0.1),Normal(20.0,1.0))
9191
addFactor!(fg, [:x0; :l1], p2br)
9292

docs/src/examples/basic_slamedonut.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ Next construct the factor graph containing the first pose `:l100` (without any k
6868
fg = initfg()
6969

7070
# first pose with no initial estimate
71-
addNode!(fg, :l100, Point2)
71+
addVariable!(fg, :l100, Point2)
7272

7373
# add three landmarks
74-
addNode!(fg, :l1, Point2)
75-
addNode!(fg, :l2, Point2)
76-
addNode!(fg, :l3, Point2)
74+
addVariable!(fg, :l1, Point2)
75+
addVariable!(fg, :l2, Point2)
76+
addVariable!(fg, :l3, Point2)
7777

7878
# and put priors on :l101 and :l102
7979
addFactor!(fg, [:l1;], PriorPoint2(MvNormal(GTl[:l1], Matrix(LinearAlgebra.I,2,2))) )
@@ -163,7 +163,7 @@ function vehicle_drives_to!(fgl::FactorGraph, pos_sym::Symbol, GTp::Dict, GTl::D
163163
prev_sym = Symbol("l$(maximum(Int[parse(Int,string(currvar[i])[2:end]) for i in 2:length(currvar)]))")
164164
if !(pos_sym in currvar)
165165
println("Adding variable vertex $pos_sym, not yet in fgl::FactorGraph.")
166-
addNode!(fgl, pos_sym, Point2)
166+
addVariable!(fgl, pos_sym, Point2)
167167
@show rho = norm(GTp[prev_sym] - GTp[pos_sym])
168168
ppr = Point2Point2Range( Normal(rho, 3.0) )
169169
addFactor!(fgl, [prev_sym;pos_sym], ppr)
@@ -178,7 +178,7 @@ function vehicle_drives_to!(fgl::FactorGraph, pos_sym::Symbol, GTp::Dict, GTl::D
178178
ppr = Point2Point2Range( Normal(rho, 3.0) )
179179
if !(ll in currvar)
180180
println("Adding variable vertex $ll, not yet in fgl::FactorGraph.")
181-
addNode!(fgl, ll, Point2)
181+
addVariable!(fgl, ll, Point2)
182182
end
183183
addFactor!(fgl, [pos_sym;ll], ppr)
184184
end

docs/src/examples/interm_dynpose.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ A smaller example in two dimensions where we wish to estimate the velocity of so
1212

1313
Variable nodes retain meta data (so called "soft types") describing the type of variable. Common VariableNode types are `RoME.Point2D`, `RoME.Pose3D`. VariableNode soft types are passed during construction of the factor graph, for example:
1414
```julia
15-
v1 = addNode!(fg, :x1, Pose2)
15+
v1 = addVariable!(fg, :x1, Pose2)
1616
```
1717

1818
Certain cases require that more information be retained for each VariableNode, and velocity calculations are a clear example where time stamp data across positions is required.
@@ -105,14 +105,14 @@ A brief usage example looks as follows, and further questions about how the prei
105105
```julia
106106
using RoME, Distributions
107107
fg = initfg()
108-
v0 = addNode!(fg, :x0, DynPoint2(ut=0))
108+
v0 = addVariable!(fg, :x0, DynPoint2(ut=0))
109109

110110
# Prior factor as boundary condition
111111
pp0 = DynPoint2VelocityPrior(MvNormal([zeros(2);10*ones(2)], 0.1*eye(4)))
112112
f0 = addFactor!(fg, [:x0;], pp0)
113113

114114
# conditional likelihood between Dynamic Point2
115-
v1 = addNode!(fg, :x1, DynPoint2(ut=1000_000)) # time in microseconds
115+
v1 = addVariable!(fg, :x1, DynPoint2(ut=1000_000)) # time in microseconds
116116
dp2dp2 = DynPoint2DynPoint2(MvNormal([10*ones(2);zeros(2)], 0.1*eye(4)))
117117
f1 = addFactor!(fg, [:x0;:x1], dp2dp2)
118118

@@ -163,9 +163,9 @@ A similar usage example here shows:
163163
fg = initfg()
164164

165165
# add three point locations
166-
v0 = addNode!(fg, :x0, DynPoint2(ut=0))
167-
v1 = addNode!(fg, :x1, DynPoint2(ut=1000_000))
168-
v2 = addNode!(fg, :x2, DynPoint2(ut=2000_000))
166+
v0 = addVariable!(fg, :x0, DynPoint2(ut=0))
167+
v1 = addVariable!(fg, :x1, DynPoint2(ut=1000_000))
168+
v2 = addVariable!(fg, :x2, DynPoint2(ut=2000_000))
169169

170170
# Prior factor as boundary condition
171171
pp0 = DynPoint2VelocityPrior(MvNormal([zeros(2);10*ones(2)], 0.1*eye(4)))

docs/src/examples/interm_fixedlag_hexagonal.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ lagLength = 30
2222
# Standard Hexagonal example for totalIterations - solve every iterationsPerSolve iterations.
2323
function runHexagonalExample(fg::FactorGraph, totalIterations::Int, iterationsPerSolve::Int)::DataFrame
2424
# Add the first pose :x0
25-
addNode!(fg, :x0, Pose2)
25+
addVariable!(fg, :x0, Pose2)
2626

2727
# Add at a fixed location PriorPose2 to pin :x0 to a starting location
2828
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*Matrix{Float64}(LinearAlgebra.I, 3,3))))
2929

3030
# Add a landmark l1
31-
addNode!(fg, :l1, Point2, labels=["LANDMARK"])
31+
addVariable!(fg, :l1, Point2, labels=["LANDMARK"])
3232

3333
# Drive around in a hexagon a number of times
3434
solveTimes = DataFrame(GraphSize = [], TimeBuildBayesTree = [], TimeSolveGraph = [])
3535
for i in 0:totalIterations
3636
psym = Symbol("x$i")
3737
nsym = Symbol("x$(i+1)")
3838
@info "Adding pose $nsym..."
39-
addNode!(fg, nsym, Pose2)
39+
addVariable!(fg, nsym, Pose2)
4040
pp = Pose2Pose2(MvNormal([10.0;0;pi/3], Matrix(Diagonal( [0.1;0.1;0.1].^2 ) )))
4141
@info "Adding odometry factor between $psym -> $nsym..."
4242
addFactor!(fg, [psym;nsym], pp )

examples/apriltagserver/todoslam.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ for p in poses
99
lmsyms = ls(fg)[2]
1010
atsym = Symbol("l$(detection.id)")
1111
if !(atsym in lmsyms)
12-
addNode!(fg, atsym, Point2(labels=["LANDMARK"; "APRILTAG"]))
12+
addVariable!(fg, atsym, Point2(labels=["LANDMARK"; "APRILTAG"]))
1313
end
1414

1515
# reverse homography to range, bearing

examples/database/0_HexagonalSlam2d.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fg = Caesar.initfg(sessionname=user_config["session"], robotname=addrdict["robot
2424
# fg.cg = backend_config
2525

2626
# also add a PriorPose2 to pin the first pose at a fixed location
27-
addNode!(fg, :x0, Pose2) # , labels=["POSE"]
27+
addVariable!(fg, :x0, Pose2) # , labels=["POSE"]
2828
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*eye(3))) )
2929

3030
# ls(fg, :x0)
@@ -38,7 +38,7 @@ addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*eye(3))) )
3838
for i in 0:5
3939
psym = Symbol("x$i")
4040
nsym = Symbol("x$(i+1)")
41-
addNode!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
41+
addVariable!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
4242
addFactor!(fg, [psym;nsym], Pose2Pose2(reshape([10.0;0;pi/3],3,1), 0.01*eye(3), [1.0]), autoinit=true )
4343
# Pose2Pose2_NEW(MvNormal([10.0;0;pi/3], diagm([0.1;0.1;0.1].^2)))
4444
end

examples/database/dbg_packedtype_conversions.jl

+4-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fg = Caesar.initfg(sessionname=user_config["session"], robotname=addrdict["robot
2020

2121

2222
# first pose :x0
23-
addNode!(fg, :x0, Pose2)
23+
addVariable!(fg, :x0, Pose2)
2424

2525
# also add a PriorPose2 to pin the first pose at a fixed location
2626
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*eye(3))) )
@@ -33,11 +33,11 @@ p1.attributes["data"]
3333

3434

3535

36-
addNode!(fg, :x1, Pose2)
36+
addVariable!(fg, :x1, Pose2)
3737
addFactor!(fg, [:x0;:x1], Pose2Pose2(reshape([10.0;0;pi/3],3,1), 0.01*eye(3), [1.0]), autoinit=true )
3838

3939

40-
addNode!(fg, :x2, Pose2)
40+
addVariable!(fg, :x2, Pose2)
4141
addFactor!(fg, [:x1;:x2], Pose2Pose2(reshape([10.0;0;pi/3],3,1), 0.01*eye(3), [1.0]), autoinit=true )
4242

4343

@@ -56,7 +56,7 @@ inferOverTreeR!(fg, tree)
5656
# DistributionRequest("Normal", Float64[0; 0.1]),
5757
# DistributionRequest("Normal", Float64[20; 1.0]))
5858

59-
addNode!(fg, :l1, Point2, labels=["LANDMARK";])
59+
addVariable!(fg, :l1, Point2, labels=["LANDMARK";])
6060

6161
br = Pose2Point2BearingRange(Normal(0, 0.1), Normal(20, 1.0))
6262

examples/database/dev/BasicCloudGraphsSLAM.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ odoCov = diagm([3.0;3.0;0.01].^2)
2929

3030

3131
# Some starting position
32-
v1 = addNode!(fg, :x1, zeros(3,1), diagm([1.0;1.0;0.1]), N=N,labels=["POSE"])
32+
v1 = addVariable!(fg, :x1, zeros(3,1), diagm([1.0;1.0;0.1]), N=N,labels=["POSE"])
3333
initPosePrior = PriorPose2(MvNormal(zeros(3), initCov) )
3434
f1 = addFactor!(fg,[v1], initPosePrior)
3535

@@ -75,14 +75,14 @@ inferOverTreeR!(fgs, tree)
7575
# cov = [3.0]
7676
#
7777
# # robot style, add first pose vertex
78-
# v1 = addNode!(fg,:x1,doors,N=N)
78+
# v1 = addVariable!(fg,:x1,doors,N=N)
7979
#
8080
# # add a prior for the initial position of the robot
8181
# f0 = addFactor!(fg,[v1], Obsv2(doors, cov', [1.0]))
8282
#
8383
# # add second pose vertex
8484
# tem = 2.0*randn(1,N)+getVal(v1)+50.0
85-
# v2 = addNode!(fg, :x2, tem, N=N)
85+
# v2 = addVariable!(fg, :x2, tem, N=N)
8686
#
8787
# # now add the odometry factor between them
8888
# f1 = addFactor!(fg,[v1;v2],Odo([50.0]',[2.0]',[1.0]))

examples/database/dev/BuildCloudFactorGraph.jl

+8-8
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ doors = [-100.0;0.0;100.0;300.0]'
2525
cov = [3.0]
2626

2727
# robot style, add first pose vertex
28-
v1 = addNode!(fg,:x1,doors,N=N,labels=["POSE"])
28+
v1 = addVariable!(fg,:x1,doors,N=N,labels=["POSE"])
2929

3030
# add a prior for the initial position of the robot
3131
f0 = addFactor!(fg,[v1], Obsv2(doors, cov', [1.0]))
3232

3333
# add second pose vertex
3434
tem = 2.0*randn(1,N)+getVal(v1)+50.0
35-
v2 = addNode!(fg, :x2, tem, N=N,labels=["POSE"])
35+
v2 = addVariable!(fg, :x2, tem, N=N,labels=["POSE"])
3636

3737
# now add the odometry factor between them
3838
f1 = addFactor!(fg,[v1;v2],Odo([50.0]',[2.0]',[1.0]))
3939

40-
v3=addNode!(fg,:x3,4.0*randn(1,N)+getVal(v2)+50.0, N=N,labels=["POSE"])
40+
v3=addVariable!(fg,:x3,4.0*randn(1,N)+getVal(v2)+50.0, N=N,labels=["POSE"])
4141
addFactor!(fg,[v2;v3],Odo([50.0]',[4.0]',[1.0]))
4242
f2 = addFactor!(fg,[v3], Obsv2(doors, cov', [1.0]))
4343

@@ -58,25 +58,25 @@ println("Waiting for initial solve to occur")
5858
sleep(10)
5959

6060

61-
v4=addNode!(fg,:x4,2.0*randn(1,N)+getVal(v3)+50.0, N=N,labels=["POSE"])
61+
v4=addVariable!(fg,:x4,2.0*randn(1,N)+getVal(v3)+50.0, N=N,labels=["POSE"])
6262
addFactor!(fg,[v3;v4],Odo([50.0]',[2.0]',[1.0]))
6363

6464
if true
65-
l1=addNode!(fg, :l1, 0.5*randn(1,N)+getVal(v3)+64.0, N=N,labels=["LANDMARK"])
65+
l1=addVariable!(fg, :l1, 0.5*randn(1,N)+getVal(v3)+64.0, N=N,labels=["LANDMARK"])
6666
addFactor!(fg, [v3,l1], Ranged([64.0],[0.5],[1.0]))
6767
addFactor!(fg, [v4,l1], Ranged([16.0],[0.5],[1.0]))
6868
end
6969

7070

71-
v5=addNode!(fg,:x5,2.0*randn(1,N)+getVal(v4)+50.0, N=N,labels=["POSE"])
71+
v5=addVariable!(fg,:x5,2.0*randn(1,N)+getVal(v4)+50.0, N=N,labels=["POSE"])
7272
addFactor!(fg,[v4;v5],Odo([50.0]',[2.0]',[1.0]))
7373

7474

75-
v6=addNode!(fg,:x6,1.25*randn(1,N)+getVal(v5)+40.0, N=N,labels=["POSE"])
75+
v6=addVariable!(fg,:x6,1.25*randn(1,N)+getVal(v5)+40.0, N=N,labels=["POSE"])
7676
addFactor!(fg,[v5;v6],Odo([40.0]',[1.25]',[1.0]))
7777

7878

79-
v7=addNode!(fg,:x7,2.0*randn(1,N)+getVal(v6) +60.0, N=N,labels=["POSE"])
79+
v7=addVariable!(fg,:x7,2.0*randn(1,N)+getVal(v6) +60.0, N=N,labels=["POSE"])
8080
addFactor!(fg,[v6;v7],Odo([60.0]',[2.0]',[1.0]))
8181

8282
f3 = addFactor!(fg,[v7], Obsv2(doors, cov', [1.0]))

examples/dev/FreezeVariables.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ sessionId = "Test"
66
fg = Caesar.initfg(sessionname=sessionId, robotname=robotId)
77

88
# also add a PriorPose2 to pin the first pose at a fixed location
9-
addNode!(fg, :x0, Pose2) # , labels=["POSE"]
9+
addVariable!(fg, :x0, Pose2) # , labels=["POSE"]
1010
addFactor!(fg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*Matrix(LinearAlgebra.I, 3,3))) )
1111

1212

1313
# Drive around in a hexagon
1414
for i in 0:5
1515
psym = Symbol("x$i")
1616
nsym = Symbol("x$(i+1)")
17-
addNode!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
17+
addVariable!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
1818
addFactor!(fg, [psym;nsym], Pose2Pose2( MvNormal([10.0;0;pi/3], 0.01*Matrix(LinearAlgebra.I, 3,3)) ), autoinit=true )
1919
# Pose2Pose2_NEW(MvNormal([10.0;0;pi/3], diagm([0.1;0.1;0.1].^2)))
2020
end
2121

2222

23-
response = addNode!(fg, :l1, Point2("LANDMARK"))
23+
response = addVariable!(fg, :l1, Point2("LANDMARK"))

examples/dfg/HexagonalDFG_PoC.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ addF!(dfg, [:x0], PriorPose2(MvNormal(zeros(3), 0.01*eye(3))) )
4040
for i in 0:5
4141
psym = Symbol("x$i")
4242
nsym = Symbol("x$(i+1)")
43-
addNode!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
43+
addVariable!(fg, nsym, Pose2) # , labels=["VARIABLE";"POSE"]
4444
addFactor!(fg, [psym;nsym], Pose2Pose2(reshape([10.0;0;pi/3],3,1), 0.01*eye(3), [1.0]), autoinit=true )
4545
# Pose2Pose2_NEW(MvNormal([10.0;0;pi/3], diagm([0.1;0.1;0.1].^2)))
4646
en

examples/marine/asv/kayaks/SAS-SLAM.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ saveBF = Dict();
3838
savedirheader = "0813/0813";
3939

4040
fg = initfg()
41-
addNode!(fg, beacon, Point2)
41+
addVariable!(fg, beacon, Point2)
4242

4343
for fitr in 1:nfactors
4444
navchecked = false;

0 commit comments

Comments
 (0)