use std::cmp::Ordering;
use super::super::wire::{CollapseArtifact, DecodeLimits};
use super::super::{CollapseObjective, CollapsedRips};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CollapsePortfolioCandidate {
Serial,
Rounds {
threads: usize,
},
Adaptive {
objective: CollapseObjective,
work_limit: Option<u64>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CollapsePortfolioObjective {
Edges,
ReductionColumns {
max_homology_dimension: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct CollapsePortfolioLimits {
pub max_candidates: usize,
pub max_homology_dimension: usize,
pub max_cliques_per_candidate: u64,
}
impl Default for CollapsePortfolioLimits {
fn default() -> Self {
Self {
max_candidates: 16,
max_homology_dimension: 8,
max_cliques_per_candidate: 100_000_000,
}
}
}
impl CollapsePortfolioLimits {
pub fn with_max_homology_dimension(mut self, maximum: usize) -> Self {
self.max_homology_dimension = maximum;
self
}
pub fn with_max_cliques_per_candidate(mut self, maximum: u64) -> Self {
self.max_cliques_per_candidate = maximum;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CollapsePortfolioScore {
pub(super) simplex_counts: Vec<u64>,
}
impl CollapsePortfolioScore {
pub fn simplex_counts(&self) -> &[u64] {
&self.simplex_counts
}
pub(super) fn compare(&self, other: &Self) -> Ordering {
self.simplex_counts
.iter()
.rev()
.cmp(other.simplex_counts.iter().rev())
}
}
#[derive(Debug, Clone)]
pub struct CollapsePortfolioEntry {
pub(super) candidate: CollapsePortfolioCandidate,
pub(super) score: CollapsePortfolioScore,
pub(super) result: CollapsedRips,
}
impl CollapsePortfolioEntry {
pub fn candidate(&self) -> CollapsePortfolioCandidate {
self.candidate
}
pub fn score(&self) -> &CollapsePortfolioScore {
&self.score
}
pub fn result(&self) -> &CollapsedRips {
&self.result
}
}
#[derive(Debug, Clone)]
pub struct CollapsePortfolio {
pub(super) objective: CollapsePortfolioObjective,
pub(super) entries: Vec<CollapsePortfolioEntry>,
pub(super) selected: usize,
}
impl CollapsePortfolio {
pub fn objective(&self) -> CollapsePortfolioObjective {
self.objective
}
pub fn entries(&self) -> &[CollapsePortfolioEntry] {
&self.entries
}
pub fn selected_index(&self) -> usize {
self.selected
}
pub fn selected(&self) -> &CollapsePortfolioEntry {
&self.entries[self.selected]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct CollapsePortfolioDecodeLimits {
pub max_bytes: usize,
pub max_candidates: usize,
pub collapse: DecodeLimits,
}
impl Default for CollapsePortfolioDecodeLimits {
fn default() -> Self {
Self {
max_bytes: 1 << 30,
max_candidates: 16,
collapse: DecodeLimits::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct CollapsePortfolioArtifactEntry {
pub(super) candidate: CollapsePortfolioCandidate,
pub(super) score: CollapsePortfolioScore,
pub(super) artifact: CollapseArtifact,
}
impl CollapsePortfolioArtifactEntry {
pub fn candidate(&self) -> CollapsePortfolioCandidate {
self.candidate
}
pub fn score(&self) -> &CollapsePortfolioScore {
&self.score
}
pub fn artifact(&self) -> &CollapseArtifact {
&self.artifact
}
}
#[derive(Debug, Clone)]
pub struct CollapsePortfolioArtifact {
pub(super) objective: CollapsePortfolioObjective,
pub(super) entries: Vec<CollapsePortfolioArtifactEntry>,
pub(super) selected: usize,
pub(super) digest: [u8; 32],
}