@@ -504,7 +504,8 @@ function _beforeSolveCCW!(
504504 F_:: Type{<:AbstractRelative} ,
505505 ccwl:: CommonConvWrapper{F} ,
506506 variables:: AbstractVector{<:DFGVariable} ,
507- # solvefor::Symbol,
507+ destVarVals:: AbstractVector ,
508+ sfidx:: Int ,
508509 N:: Integer ;
509510 measurement = Vector {Tuple{}} (),
510511 needFreshMeasurements:: Bool = true ,
@@ -517,14 +518,25 @@ function _beforeSolveCCW!(
517518 @debug (" cannot prep ccw.param list with length(variables)==0, see DFG #590" )
518519 end
519520
521+ # in forward solve case, important to set which variable is being solved early in this sequence
522+ ccwl. varidx[] = sfidx
523+
520524 # TBD, order of fmd ccwl cf are a little weird and should be revised.
521525 # TODO , maxlen should parrot N (barring multi-/nullhypo issues)
522526 # set the 'solvefor' variable index -- i.e. which connected variable of the factor is being computed in this convolution.
523527 # ccwl.varidx[] = findfirst(==(solvefor), getLabel.(variables))
524528 # everybody use maxlen number of points in belief function estimation
525529 maxlen = maximum ((N, length .(ccwl. varValsAll[])... ,))
526530
527- ccwl. varValsAll[] = map (s-> getVal (s; solveKey), tuple (variables... ))
531+ # not type-stable
532+ varvals = [getVal (s; solveKey) for s in variables]
533+ # splice
534+ varvals[sfidx] = destVarVals
535+ # varvals_ = [varvals[1:sfidx-1]..., destVarVals, varvals[sfidx+1:end]...]
536+ tvarv = tuple (varvals... )
537+ # @info "TYPES" typeof(ccwl.varValsAll[]) typeof(tvarv)
538+ ccwl. varValsAll[] = tvarv
539+ # ccwl.varValsAll[] = map(s->getVal(s; solveKey), tuple(variables...))
528540 # # PLAN B, make deep copy of ccwl.varValsAll[ccwl.varidx[]] just before the numerical solve
529541
530542 # maxlen, ccwl.varidx[] = _updateParamVec(variables, solvefor, ccwl.varValsAll, N; solveKey)
@@ -563,26 +575,29 @@ end
563575function _beforeSolveCCW! (
564576 F_:: Type{<:AbstractPrior} ,
565577 ccwl:: CommonConvWrapper{F} ,
566- Xi:: AbstractVector{<:DFGVariable} ,
567- # solvefor::Symbol,
578+ variables:: AbstractVector{<:DFGVariable} ,
579+ destVarVals:: AbstractVector ,
580+ sfidx:: Int ,
568581 N:: Integer ;
569582 measurement = Vector {Tuple{}} (),
570583 needFreshMeasurements:: Bool = true ,
571584 solveKey:: Symbol = :default ,
572585) where {F <: AbstractFactor } # F might be Mixture
573586 # FIXME , NEEDS TO BE CLEANED UP AND WORK ON MANIFOLDS PROPER
587+
588+ ccwl. varidx[] = sfidx
574589 # fnc = ccwl.usrfnc!
575- # sfidx = findfirst(getLabel.(Xi ) .== solvefor)
590+ # sfidx = findfirst(getLabel.(variables ) .== solvefor)
576591 @assert ccwl. varidx[] == 1 " Solving on Prior with CCW should have sfidx=1, priors are unary factors."
577592 # @assert sfidx == 1 "Solving on Prior with CCW should have sfidx=1, priors are unary factors."
578593 # ccwl.varidx[] = sfidx
579594 # sfidx = 1 # why hardcoded to 1, maybe for only the AbstractPrior case here
580595
581596 # setup the partial or complete decision variable dimensions for this ccwl object
582597 # NOTE perhaps deconv has changed the decision variable list, so placed here during consolidation phase
583- _setCCWDecisionDimsConv! (ccwl, getDimension (getVariableType (Xi [ccwl. varidx[]])))
598+ _setCCWDecisionDimsConv! (ccwl, getDimension (getVariableType (variables [ccwl. varidx[]])))
584599
585- solveForPts = getVal (Xi [ccwl. varidx[]]; solveKey)
600+ solveForPts = getVal (variables [ccwl. varidx[]]; solveKey)
586601 maxlen = maximum ([N; length (solveForPts); length (ccwl. varValsAll[][ccwl. varidx[]])]) # calcZDim(ccwl); length(measurement[1])
587602
588603 # FIXME do not divert Mixture for sampling
@@ -596,23 +611,25 @@ end
596611function _beforeSolveCCW! (
597612 ccwl:: Union{CommonConvWrapper{F}, CommonConvWrapper{Mixture{N_, F, S, T}}} ,
598613 Xi:: AbstractVector{<:DFGVariable} ,
599- # solvefor::Symbol,
614+ destVarVals:: AbstractVector ,
615+ sfidx:: Int ,
600616 N:: Integer ;
601617 kw... ,
602618) where {N_, F <: AbstractRelative , S, T}
603619 #
604- return _beforeSolveCCW! (F, ccwl, Xi, N; kw... )
620+ return _beforeSolveCCW! (F, ccwl, Xi, destVarVals, sfidx, N; kw... )
605621end
606622
607623function _beforeSolveCCW! (
608624 ccwl:: Union{CommonConvWrapper{F}, CommonConvWrapper{Mixture{N_, F, S, T}}} ,
609625 Xi:: AbstractVector{<:DFGVariable} ,
610- # solvefor::Symbol,
626+ destVarVals:: AbstractVector ,
627+ sfidx:: Int ,
611628 N:: Integer ;
612629 kw... ,
613630) where {N_, F <: AbstractPrior , S, T}
614631 #
615- return _beforeSolveCCW! (F, ccwl, Xi, N; kw... )
632+ return _beforeSolveCCW! (F, ccwl, Xi, destVarVals, sfidx, N; kw... )
616633end
617634
618635
0 commit comments