1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use crate::core::IndexSet; use std::{ cmp::Ordering, hash::{Hash, Hasher}, }; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct Feature { pub index: usize, pub parent_indices: IndexSet, } impl Feature { pub fn union(&self, other: &Self) -> IndexSet { let g = &self.parent_indices; let h = &other.parent_indices; g.union(h).cloned().collect() } } impl Hash for Feature { fn hash<H: Hasher>(&self, state: &mut H) { self.index.hash(state); } } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct CandidateFeature { pub relevance: f64, pub parent_indices: IndexSet, } impl CandidateFeature { pub fn new<T: Into<IndexSet>>(parent_indices: T) -> Self { CandidateFeature { relevance: 0.0, parent_indices: parent_indices.into(), } } pub fn from_vec(index_vec: Vec<usize>) -> Self { let mut parent_indices = IndexSet::new(); for i in index_vec { parent_indices.insert(i); } CandidateFeature::new(parent_indices) } pub fn into_feature(self, index: usize) -> Feature { Feature { index: index, parent_indices: self.parent_indices, } } } impl Hash for CandidateFeature { fn hash<H: Hasher>(&self, state: &mut H) { self.parent_indices.hash(state); } } impl PartialOrd for CandidateFeature { fn partial_cmp(&self, other: &CandidateFeature) -> Option<Ordering> { self.relevance.partial_cmp(&other.relevance) } }