use crate::target::Target;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Mutation {
BitFlip {
target: Target,
col: usize,
row: usize,
mask: u128,
},
OutOfBounds {
target: Target,
col: usize,
row: usize,
value: u128,
},
FlipSelector {
target: Target,
col: usize,
row: usize,
},
SwapRows {
target: Target,
row_a: usize,
row_b: usize,
},
SwapColumns {
target: Target,
cols: Vec<usize>,
row_a: usize,
row_b: usize,
},
DuplicateRow {
target: Target,
src_row: usize,
dst_row: usize,
},
CopyColumns {
target: Target,
cols: Vec<usize>,
src_row: usize,
dst_row: usize,
},
ColumnUniformWrite {
target: Target,
col: usize,
value: u128,
},
RowSegmentZero {
target: Target,
rows: Vec<usize>,
cols: Vec<usize>,
},
MonotonicReplace {
target: Target,
col: usize,
base: u128,
step: u128,
},
Compound(Vec<Mutation>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MutationKind {
BitFlip,
OutOfBounds,
FlipSelector,
SwapRows,
DuplicateRow,
ColumnUniformWrite,
RowSegmentZero,
MonotonicReplace,
}
impl Mutation {
pub fn kind(&self) -> Option<MutationKind> {
match self {
Mutation::BitFlip { .. } => Some(MutationKind::BitFlip),
Mutation::OutOfBounds { .. } => Some(MutationKind::OutOfBounds),
Mutation::FlipSelector { .. } => Some(MutationKind::FlipSelector),
Mutation::SwapRows { .. } => Some(MutationKind::SwapRows),
Mutation::DuplicateRow { .. } => Some(MutationKind::DuplicateRow),
Mutation::ColumnUniformWrite { .. } => Some(MutationKind::ColumnUniformWrite),
Mutation::RowSegmentZero { .. } => Some(MutationKind::RowSegmentZero),
Mutation::MonotonicReplace { .. } => Some(MutationKind::MonotonicReplace),
Mutation::SwapColumns { .. } | Mutation::CopyColumns { .. } | Mutation::Compound(_) => {
None
}
}
}
}