package d2talalayout
import (
"cmp"
"context"
"fmt"
"github.com/pancsta/d2/d2layouts/d2talalayout/internal/layoutgraph"
"github.com/pancsta/d2/d2layouts/d2talalayout/internal/quality"
)
type layoutScore struct {
penalty float64
area float64
}
func (score layoutScore ) compare (other layoutScore ) int {
if comparison := comparePenalty (score .penalty , other .penalty ); comparison != 0 {
return comparison
}
return compareArea (score .area , other .area )
}
func compareArea(left , right float64 ) int {
leftValid := isFiniteResultNumber (left ) && left >= 0
rightValid := isFiniteResultNumber (right ) && right >= 0
if leftValid && !rightValid {
return -1
}
if !leftValid && rightValid {
return 1
}
if !leftValid {
return 0
}
return cmp .Compare (left , right )
}
func comparePenalty(left , right float64 ) int {
leftFinite := isFiniteResultNumber (left )
rightFinite := isFiniteResultNumber (right )
if leftFinite && !rightFinite {
return -1
}
if !leftFinite && rightFinite {
return 1
}
if !leftFinite {
return 0
}
return cmp .Compare (left , right )
}
type seedResult struct {
bindings translation
graph *layoutgraph .Graph
sequenceEdges map [layoutgraph .EntityID ]struct {}
score layoutScore
}
func evaluateSeedResult(ctx context .Context , input seedInput , graph *layoutgraph .Graph ) (seedResult , error ) {
if err := ctx .Err (); err != nil {
return seedResult {}, err
}
if input .graph == nil {
return seedResult {}, fmt .Errorf ("TALA seed input is empty" )
}
if graph == nil {
return seedResult {}, fmt .Errorf ("TALA seed result is empty" )
}
if err := validateCompletedGraph (ctx , graph ); err != nil {
return seedResult {}, fmt .Errorf ("validate TALA seed result: %w" , err )
}
sequenceEdges , err := validateLayoutResultTopology (ctx , input .graph , graph )
if err != nil {
return seedResult {}, fmt .Errorf ("validate TALA seed result topology: %w" , err )
}
if err := validateLayoutResultMetadata (ctx , input .graph , graph , sequenceEdges ); err != nil {
return seedResult {}, fmt .Errorf ("validate TALA seed result metadata: %w" , err )
}
penalty , area , err := quality .EvaluateWithArea (ctx , graph )
if err != nil {
return seedResult {}, err
}
if !isFiniteResultNumber (penalty ) {
return seedResult {}, fmt .Errorf ("TALA seed result has a non-finite score" )
}
return seedResult {
bindings : input .bindings ,
graph : graph ,
sequenceEdges : sequenceEdges ,
score : layoutScore {penalty : penalty , area : area },
}, nil
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .