@@ -297,8 +297,13 @@ function covarianceFiniteDiff(M, jacF!::JacF_RLM!, p0)
297297 H = FiniteDiff. finite_difference_hessian (costf, X0)
298298
299299 # inv(H)
300- Σ = Matrix (H) \ Matrix {eltype(H)} (I, size (H)... )
301- # sqrt.(diag(Σ))
300+ Σ = try
301+ Matrix (H) \ Matrix {eltype(H)} (I, size (H)... )
302+ catch ex # TODO only catch correct exception and try with pinv as fallback in certain cases.
303+ @warn " Hessian inverse failed" ex
304+ # Σ = pinv(H)
305+ nothing
306+ end
302307 return Σ
303308end
304309
@@ -490,27 +495,28 @@ end
490495 # new2 0.010764 seconds (34.61 k allocations: 3.111 MiB)
491496 # dense J 0.022079 seconds (283.54 k allocations: 18.146 MiB)
492497
493- function autoinitParametricManopt ! (
498+ function autoinitParametric ! (
494499 fg,
495500 varorderIds = getInitOrderParametric (fg);
496501 reinit = false ,
497502 kwargs...
498503)
499504 @showprogress for vIdx in varorderIds
500- autoinitParametricManopt ! (fg, vIdx; reinit, kwargs... )
505+ autoinitParametric ! (fg, vIdx; reinit, kwargs... )
501506 end
502507 return nothing
503508end
504509
505- function autoinitParametricManopt ! (dfg:: AbstractDFG , initme:: Symbol ; kwargs... )
506- return autoinitParametricManopt ! (dfg, getVariable (dfg, initme); kwargs... )
510+ function autoinitParametric ! (dfg:: AbstractDFG , initme:: Symbol ; kwargs... )
511+ return autoinitParametric ! (dfg, getVariable (dfg, initme); kwargs... )
507512end
508513
509- function autoinitParametricManopt ! (
514+ function autoinitParametric ! (
510515 dfg:: AbstractDFG ,
511516 xi:: DFGVariable ;
512517 solveKey = :parametric ,
513518 reinit:: Bool = false ,
519+ perturb_point:: Bool = false ,
514520 kwargs... ,
515521)
516522 #
@@ -528,12 +534,27 @@ function autoinitParametricManopt!(
528534 return isInitialized (dfg, vl, solveKey)
529535 end
530536
537+ vnd:: VariableNodeData = getSolverData (xi, solveKey)
538+
539+ if perturb_point
540+ _M = getManifold (xi)
541+ p = vnd. val[1 ]
542+ vnd. val[1 ] = exp (
543+ _M,
544+ p,
545+ get_vector (
546+ _M,
547+ p,
548+ randn (manifold_dimension (_M))* 10 ^- 6 ,
549+ DefaultOrthogonalBasis ()
550+ )
551+ )
552+ end
531553 M, vartypeslist, lm_r, Σ = solve_RLM_conditional (dfg, [initme], initfrom; kwargs... )
532-
554+
533555 val = lm_r[1 ]
534- vnd:: VariableNodeData = getSolverData (xi, solveKey)
535556 vnd. val[1 ] = val
536-
557+
537558 ! isnothing (Σ) && vnd. bw .= Σ
538559
539560 # updateSolverDataParametric!(vnd, val, Σ)
555576
556577
557578# #
579+ solveGraphParametric (args... ; kwargs... ) = solve_RLM (args... ; kwargs... )
558580
559581function DFG. solveGraphParametric! (
560582 fg:: AbstractDFG ,
@@ -578,7 +600,7 @@ function DFG.solveGraphParametric!(
578600
579601 updateParametricSolution! (fg, M, v, r, Σ)
580602
581- return v, r, Σ
603+ return M, v, r, Σ
582604end
583605
584606
0 commit comments