Skip to content

Commit c2adde3

Browse files
committed
optimize addFactors!
1 parent a926951 commit c2adde3

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed

src/graphmanipulation.jl

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)