## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(taxodist)

## ----ultrametric-check--------------------------------------------------------
m <- as.matrix(taxobase$statistical_matrix)
tolerance <- sqrt(.Machine$double.eps)

ultrametric_ok <- function(index) {
  i <- index[1]
  j <- index[2]
  k <- index[3]

  d_ij <- m[i, j]
  d_ik <- m[i, k]
  d_jk <- m[j, k]

  d_ij <= max(d_ik, d_jk) + tolerance &&
    d_ik <= max(d_ij, d_jk) + tolerance &&
    d_jk <= max(d_ij, d_ik) + tolerance
}

all(combn(seq_len(nrow(m)), 3, FUN = ultrametric_ok))

## ----metrics------------------------------------------------------------------
lineages <- list(
  Panthera = c("Biota", "Animalia", "Chordata", "Mammalia", "Carnivora",
               "Felidae", "Panthera"),
  Felis    = c("Biota", "Animalia", "Chordata", "Mammalia", "Carnivora",
               "Felidae", "Felis"),
  Canis    = c("Biota", "Animalia", "Chordata", "Mammalia", "Carnivora",
               "Canidae", "Canis"),
  Homo     = c("Biota", "Animalia", "Chordata", "Mammalia", "Primates",
               "Hominidae", "Homo"),
  Musca    = c("Biota", "Animalia", "Arthropoda", "Insecta", "Diptera",
               "Muscidae", "Musca")
)
standard <- c(NA, "Kingdom", "Phylum", "Class", "Order", "Family", "Genus")
example <- taxo_from_lineages(
  lineages,
  ranks = rep(list(standard), length(lineages)) |> setNames(names(lineages))
)

for (metric in c("reciprocal", "path", "wu_palmer", "ranked")) {
  cat("\n", metric, "\n")
  print(round(distance_matrix(example, metric = metric, progress = FALSE), 3))
}

## ----distinctness-------------------------------------------------------------
d <- distance_matrix(example, metric = "ranked", progress = FALSE)
communities <- rbind(
  site_1 = c(Panthera = 4, Felis = 2, Canis = 1, Homo = 0, Musca = 0),
  site_2 = c(Panthera = 1, Felis = 0, Canis = 1, Homo = 2, Musca = 5)
)
taxo_distinctness(communities, d)

## ----distinctness-test--------------------------------------------------------
set.seed(1)
taxo_distinctness_test(c("Panthera", "Felis", "Canis"), d, n_iter = 499)

