2022-10-26 13:16:56 +02:00
|
|
|
package obitax
|
|
|
|
|
2023-05-02 10:43:22 +02:00
|
|
|
import (
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
2024-11-14 19:10:23 +01:00
|
|
|
func (t1 *Taxon) LCA(t2 *Taxon) (*Taxon, error) {
|
2023-12-14 08:09:06 +01:00
|
|
|
if t1 == nil {
|
2024-03-18 19:11:41 +01:00
|
|
|
log.Panicf("Try to get LCA of nil taxon")
|
2023-12-14 08:09:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if t2 == nil {
|
2024-03-18 19:11:41 +01:00
|
|
|
log.Panicf("Try to get LCA of nil taxon")
|
2023-12-14 08:09:06 +01:00
|
|
|
}
|
|
|
|
|
2024-11-14 19:10:23 +01:00
|
|
|
p1 := t1.Path()
|
|
|
|
p2 := t2.Path()
|
2022-10-26 13:16:56 +02:00
|
|
|
|
2024-11-14 19:10:23 +01:00
|
|
|
i1 := p1.Len() - 1
|
|
|
|
i2 := p2.Len() - 1
|
2022-10-26 13:16:56 +02:00
|
|
|
|
2024-11-14 19:10:23 +01:00
|
|
|
for i1 >= 0 && i2 >= 0 && p1.slice[i1].id == p2.slice[i2].id {
|
2022-10-26 13:16:56 +02:00
|
|
|
i1--
|
|
|
|
i2--
|
|
|
|
}
|
|
|
|
|
2024-11-14 19:10:23 +01:00
|
|
|
return &Taxon{
|
|
|
|
Taxonomy: t1.Taxonomy,
|
|
|
|
Node: p1.slice[i1+1],
|
|
|
|
}, nil
|
2022-10-26 13:16:56 +02:00
|
|
|
}
|