sp1_stark/lookup/
interaction.rsuse core::fmt::{Debug, Display};
use p3_air::VirtualPairCol;
use p3_field::Field;
use crate::air::InteractionScope;
#[derive(Clone)]
pub struct Interaction<F: Field> {
pub values: Vec<VirtualPairCol<F>>,
pub multiplicity: VirtualPairCol<F>,
pub kind: InteractionKind,
pub scope: InteractionScope,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum InteractionKind {
Memory = 1,
Program = 2,
Instruction = 3,
Alu = 4,
Byte = 5,
Range = 6,
Field = 7,
Syscall = 8,
Global = 9,
}
impl InteractionKind {
#[must_use]
pub fn all_kinds() -> Vec<InteractionKind> {
vec![
InteractionKind::Memory,
InteractionKind::Program,
InteractionKind::Instruction,
InteractionKind::Alu,
InteractionKind::Byte,
InteractionKind::Range,
InteractionKind::Field,
InteractionKind::Syscall,
]
}
}
impl<F: Field> Interaction<F> {
pub const fn new(
values: Vec<VirtualPairCol<F>>,
multiplicity: VirtualPairCol<F>,
kind: InteractionKind,
scope: InteractionScope,
) -> Self {
Self { values, multiplicity, kind, scope }
}
pub const fn argument_index(&self) -> usize {
self.kind as usize
}
}
impl<F: Field> Debug for Interaction<F> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Interaction")
.field("kind", &self.kind)
.field("scope", &self.scope)
.finish_non_exhaustive()
}
}
impl Display for InteractionKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
InteractionKind::Memory => write!(f, "Memory"),
InteractionKind::Program => write!(f, "Program"),
InteractionKind::Instruction => write!(f, "Instruction"),
InteractionKind::Alu => write!(f, "Alu"),
InteractionKind::Byte => write!(f, "Byte"),
InteractionKind::Range => write!(f, "Range"),
InteractionKind::Field => write!(f, "Field"),
InteractionKind::Syscall => write!(f, "Syscall"),
InteractionKind::Global => write!(f, "Global"),
}
}
}