@@ -263,34 +263,38 @@ function addFactors!(gbp::GraphicalModel; mean = 0.0, variance = 0.0, jacobian =
263263
264264 varianceInitial = fill (0.0 , gbp. graph. Nvariable)
265265 meanInitial = fill (0.0 , gbp. graph. Nvariable)
266- idx = findall (! iszero, newFactorsTranspose)
267266 idxr = gbp. graph. Nindirect + 1
268267 idxi = gbp. graph. Nlink + 1
269268 prev = 1
270- @inbounds for i in idx
271- if (newFactorsTranspose. colptr[i[2 ] + 1 ] - newFactorsTranspose. colptr[i[2 ]]) != 1
272- gbp. graph. coefficient[idxi] = newFactorsTranspose[i]
273- gbp. graph. meanIndirect[idxi] = mean[i[2 ]]
274- gbp. graph. varianceIndirect[idxi] = variance[i[2 ]]
275- gbp. inference. toFactor[idxi] = i[2 ] + gbp. graph. Nfactor
276- gbp. inference. fromVariable[idxi] = i[1 ]
277-
278- toFactorLocal[idxi - gbp. graph. Nlink] = i[2 ]
279- push! (gbp. graph. rowptr[idxr], idxi)
280-
281- if meanInitial[i[1 ]] == 0 && varianceInitial[i[1 ]] == 0
282- Mcol = gbp. graph. meanDirect[i[1 ]]; Wcol = gbp. graph. weightDirect[i[1 ]]
283- for j in gbp. graph. colptrMarginal[i[1 ]]
284- Mcol += gbp. inference. meanFactorVariable[j] / gbp. inference. varianceFactorVariable[j]
285- Wcol += 1 / gbp. inference. varianceFactorVariable[j]
269+ @inbounds for col = 1 : Nfactor
270+ if (newFactorsTranspose. colptr[col + 1 ] - newFactorsTranspose. colptr[col]) != 1
271+ for i = newFactorsTranspose. colptr[col]: (newFactorsTranspose. colptr[col + 1 ] - 1 )
272+ row = newFactorsTranspose. rowval[i]
273+
274+ gbp. graph. coefficient[idxi] = newFactorsTranspose[row, col]
275+ gbp. graph. meanIndirect[idxi] = mean[col]
276+ gbp. graph. varianceIndirect[idxi] = variance[col]
277+ gbp. inference. toFactor[idxi] = col + gbp. graph. Nfactor
278+ gbp. inference. fromVariable[idxi] = row
279+
280+ toFactorLocal[idxi - gbp. graph. Nlink] = col
281+ push! (gbp. graph. rowptr[idxr], idxi)
282+
283+ if meanInitial[row] == 0 && varianceInitial[row] == 0
284+ Mcol = gbp. graph. meanDirect[row]; Wcol = gbp. graph. weightDirect[row]
285+ for j in gbp. graph. colptrMarginal[row]
286+ Mcol += gbp. inference. meanFactorVariable[j] / gbp. inference. varianceFactorVariable[j]
287+ Wcol += 1 / gbp. inference. varianceFactorVariable[j]
288+ end
289+ varianceInitial[row] = 1 / Wcol
290+ meanInitial[row] = Mcol * varianceInitial[row]
286291 end
287- varianceInitial[i[1 ]] = 1 / Wcol
288- meanInitial[i[1 ]] = Mcol * varianceInitial[i[1 ]]
289- end
290292
291- idxi += 1
292- if idx[newFactorsTranspose. colptr[i[2 ] + 1 ] - 1 ] == i
293- idxr += 1
293+ idxi += 1
294+ rown = newFactorsTranspose. rowval[newFactorsTranspose. colptr[col + 1 ] - 1 ]
295+ if CartesianIndex (rown, col) == CartesianIndex (row, col)
296+ idxr += 1
297+ end
294298 end
295299 end
296300 end
@@ -311,20 +315,23 @@ function addFactors!(gbp::GraphicalModel; mean = 0.0, variance = 0.0, jacobian =
311315 append! (gbp. inference. toVariable, toFactorLocal)
312316 append! (gbp. inference. fromFactor, toFactorLocal)
313317 dropzeros! (gbp. system. jacobian)
314- idx = findall (! iszero, gbp. system. jacobian); idxi = 1 ; prev = 1
315- @inbounds for i in idx
316- if gbp. system. jacobianTranspose. colptr[i[1 ] + 1 ] - gbp. system. jacobianTranspose. colptr[i[1 ]] != 1
317- if prev == i[2 ]
318- gbp. graph. colptr[i[2 ]] = Int64[]
319- gbp. graph. colptrMarginal[i[2 ]] = Int64[]
320- end
321- prev = i[2 ] + 1
318+ idxi = 1 ; prev = 1
319+ @inbounds for col = 1 : gbp. graph. Nvariable
320+ for i = gbp. system. jacobian. colptr[col]: (gbp. system. jacobian. colptr[col + 1 ] - 1 )
321+ row = gbp. system. jacobian. rowval[i]
322+ if gbp. system. jacobianTranspose. colptr[row + 1 ] - gbp. system. jacobianTranspose. colptr[row] != 1
323+ if prev == col
324+ gbp. graph. colptr[col] = Int64[]
325+ gbp. graph. colptrMarginal[col] = Int64[]
326+ end
327+ prev = col + 1
322328
323- push! (gbp. graph. colptr[i[2 ]], idxi)
324- push! (gbp. graph. colptrMarginal[i[2 ]], idxi)
325- gbp. inference. toVariable[idxi] = i[2 ]
326- gbp. inference. fromFactor[idxi] = i[1 ]
327- idxi += 1
329+ push! (gbp. graph. colptr[col], idxi)
330+ push! (gbp. graph. colptrMarginal[col], idxi)
331+ gbp. inference. toVariable[idxi] = col
332+ gbp. inference. fromFactor[idxi] = row
333+ idxi += 1
334+ end
328335 end
329336 end
330337
0 commit comments