Skip to content

Commit 90de911

Browse files
committed
Experiment with factor gradients in solve
1 parent 4bcc7b4 commit 90de911

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

src/parametric/services/ParametricManopt.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,17 @@ function CalcFactorResidualAP(fg::GraphsDFG, factorLabels::Vector{Symbol}, varIn
6262
return ArrayPartition{CalcFactorResidual, typeof(parts_tuple)}(parts_tuple)
6363
end
6464

65-
function (cfm::CalcFactorResidual)(p)
65+
function (cfm::CalcFactorResidual)(p::Vector)
6666
meas = cfm.meas
6767
points = map(idx->p[idx], cfm.varOrderIdxs)
6868
return cfm.sqrt_iΣ * cfm(meas, points...)
6969
end
7070

71+
function (cfm::CalcFactorResidual)(p::ArrayPartition)
72+
points = map(idx->p.x[idx], cfm.varOrderIdxs)
73+
return cfm.sqrt_iΣ * cfm(cfm.meas, points...)
74+
end
75+
7176
# cost function f: M->ℝᵈ for Riemannian Levenberg-Marquardt
7277
struct CostFres_cond!{PT, CFT}
7378
points::PT

src/services/FactorGradients.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,36 @@ function factorJacobian(
2828
return ManifoldDiff.jacobian(M_dom, M_codom, costf, p0, backend)
2929
end
3030

31+
function factorGradient(
32+
cf::CalcFactorResidual,
33+
M,
34+
p,
35+
backend = ManifoldDiff.TangentDiffBackend(ManifoldDiff.FiniteDiffBackend()),
36+
)
37+
ManifoldDiff.gradient(M, (x) -> 1//2 * norm(cf(x))^2, p, backend)
38+
end
39+
40+
function factorJacobian(
41+
cf::CalcFactorResidual,
42+
M_dom,
43+
p,
44+
backend = ManifoldDiff.TangentDiffBackend(ManifoldDiff.FiniteDiffBackend()),
45+
)
46+
# M_dom = ProductManifold(getManifold.(fg, varlabels)...)
47+
M_codom = Euclidean(manifold_dimension(getManifold(cf)))
48+
49+
return ManifoldDiff.jacobian(M_dom, M_codom, cf, p, backend)
50+
end
3151

52+
#
53+
function factorGradient(
54+
cf::CalcFactorNormSq,
55+
M,
56+
p,
57+
backend = ManifoldDiff.TangentDiffBackend(ManifoldDiff.FiniteDiffBackend()),
58+
)
59+
ManifoldDiff.gradient(M, cf, p, backend)
60+
end
3261

3362
export getCoordSizes
3463
export checkGradientsToleranceMask, calcPerturbationFromVariable

src/services/NumericalCalculations.jl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,16 @@ function _solveLambdaNumeric(
7171
return r.minimizer
7272
end
7373

74-
# struct OptimCalcConv end
74+
struct OptimCalcConv end
7575
# CalcFactorNormSq cost function for an input in coordinates as used by Optim.jl
76-
function (hypoCalcFactor::CalcFactorNormSq)(M::AbstractManifold, Xc::AbstractVector)
76+
function (hypoCalcFactor::CalcFactorNormSq)(::Type{OptimCalcConv}, M::AbstractManifold, Xc::AbstractVector)
7777
# hypoCalcFactor.manifold is the factor's manifold, not the variable's manifold that is needed here
7878
ϵ = getPointIdentity(M)
7979
X = get_vector(M, ϵ, SVector(Xc), DefaultOrthogonalBasis())
8080
p = exp(M, ϵ, X)
8181
return hypoCalcFactor(CalcConv, p)
8282
end
83+
(hypoCalcFactor::CalcFactorNormSq)(M::AbstractManifold, p) = hypoCalcFactor(OptimCalcConv, M, p)
8384

8485
struct ManoptCalcConv end
8586

@@ -127,10 +128,19 @@ function _solveLambdaNumeric(
127128
retraction_method = ExponentialRetraction()
128129
)
129130
return r
131+
elseif false
132+
r = gradient_descent(
133+
M,
134+
(M,x)->hypoCalcFactor(x),
135+
(M, x)-> factorGradient(hypoCalcFactor, M, x),
136+
u0;
137+
stepsize=ConstantStepsize(0.1),
138+
)
139+
return r
130140
end
131141

132142
r = Optim.optimize(
133-
x->hypoCalcFactor(M, x),
143+
x->hypoCalcFactor(OptimCalcConv, M, x),
134144
X0c,
135145
alg
136146
)
@@ -396,6 +406,8 @@ function (cf::CalcFactorNormSq)(::Type{CalcConv}, x)
396406
res = isnothing(cf.slack) ? res : res .- cf.slack
397407
return sum(x->x^2, res)
398408
end
409+
#default to conv
410+
(cf::CalcFactorNormSq)(x) = cf(CalcConv, x)
399411

400412
function _buildHypoCalcFactor(ccwl::CommonConvWrapper, smpid::Integer, _slack)
401413
# build a view to the decision variable memory

0 commit comments

Comments
 (0)