Skip to content

Commit ca173dd

Browse files
committed
fix: improve barycentric ordering method
1 parent 46071cc commit ca173dd

1 file changed

Lines changed: 24 additions & 9 deletions

File tree

pkg/render/tower/ordering/barycentric.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ func wmedian(g *dag.DAG, nodes []*dag.Node, current, fixed []string, useParents
113113
for i, n := range nodes {
114114
var neighbors []string
115115
if useParents {
116-
neighbors = g.Parents(n.EffectiveID())
116+
neighbors = g.Parents(n.ID)
117117
} else {
118-
neighbors = g.Children(n.EffectiveID())
118+
neighbors = g.Children(n.ID)
119119
}
120120

121121
pos := len(current)
@@ -219,22 +219,37 @@ func orderByMinParent(g *dag.DAG, nodes []*dag.Node, parentOrder []string) []str
219219
parentPos := dag.PosMap(parentOrder)
220220

221221
type entry struct {
222-
id string
223-
pos int
222+
id string
223+
minPos int
224+
avgPos float64
224225
}
225226
entries := make([]entry, len(nodes))
226227
for i, n := range nodes {
228+
parents := g.Parents(n.ID)
227229
minPos := len(parentOrder)
228-
for _, parent := range g.Parents(n.EffectiveID()) {
229-
if pos, ok := parentPos[parent]; ok && pos < minPos {
230-
minPos = pos
230+
sumPos := 0
231+
count := 0
232+
for _, parent := range parents {
233+
if pos, ok := parentPos[parent]; ok {
234+
if pos < minPos {
235+
minPos = pos
236+
}
237+
sumPos += pos
238+
count++
231239
}
232240
}
233-
entries[i] = entry{n.ID, minPos}
241+
avgPos := float64(minPos)
242+
if count > 0 {
243+
avgPos = float64(sumPos) / float64(count)
244+
}
245+
entries[i] = entry{n.ID, minPos, avgPos}
234246
}
235247

236248
slices.SortStableFunc(entries, func(a, b entry) int {
237-
if c := cmp.Compare(a.pos, b.pos); c != 0 {
249+
if c := cmp.Compare(a.minPos, b.minPos); c != 0 {
250+
return c
251+
}
252+
if c := cmp.Compare(a.avgPos, b.avgPos); c != 0 {
238253
return c
239254
}
240255
return cmp.Compare(a.id, b.id)

0 commit comments

Comments
 (0)