use super::*;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EmbedEdit {
pub token: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scale: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replace_with: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Steer {
pub layer: u32,
pub a: String,
pub b: String,
pub strength: f32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Patch {
pub layer: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub head: Option<u32>,
pub source: String,
#[serde(default)]
pub all_positions: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Ablation {
#[serde(default)]
pub skip_layers: Vec<u32>,
#[serde(default)]
pub zero_blocks: Vec<(u32, String)>,
#[serde(default)]
pub zero_heads: Vec<(u32, u32)>,
#[serde(default)]
pub zero_neurons: Vec<(u32, u32, u32)>,
#[serde(default)]
pub zero_experts: Vec<(u32, u32)>,
#[serde(default)]
pub zero_tensors: Vec<String>,
#[serde(default)]
pub mask_tokens: Vec<(u32, u32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scale_layers: Vec<(u32, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scale_blocks: Vec<(u32, String, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scale_heads: Vec<(u32, u32, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scale_neurons: Vec<(u32, u32, u32, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scale_experts: Vec<(u32, u32, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub embed_edits: Vec<EmbedEdit>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub logit_bias: Vec<(u32, f32)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub steer: Vec<Steer>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub patch: Vec<Patch>,
}
pub type Intervention = Ablation;
impl Ablation {
pub fn is_empty(&self) -> bool {
self == &Ablation::default()
}
pub fn merge(&mut self, o: Ablation) {
self.skip_layers.extend(o.skip_layers);
self.zero_blocks.extend(o.zero_blocks);
self.zero_heads.extend(o.zero_heads);
self.zero_neurons.extend(o.zero_neurons);
self.zero_experts.extend(o.zero_experts);
self.zero_tensors.extend(o.zero_tensors);
self.mask_tokens.extend(o.mask_tokens);
self.scale_layers.extend(o.scale_layers);
self.scale_blocks.extend(o.scale_blocks);
self.scale_heads.extend(o.scale_heads);
self.scale_neurons.extend(o.scale_neurons);
self.scale_experts.extend(o.scale_experts);
self.embed_edits.extend(o.embed_edits);
self.logit_bias.extend(o.logit_bias);
self.steer.extend(o.steer);
self.patch.extend(o.patch);
self.skip_layers.sort_unstable();
self.skip_layers.dedup();
self.zero_tensors.sort();
self.zero_tensors.dedup();
}
pub fn masks_token(&self, id: u32) -> bool {
self.mask_tokens.iter().any(|(a, b)| id >= *a && id <= *b)
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Sampling {
#[serde(default)]
pub temperature: f32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub top_k: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub seed: Option<u64>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub forced: Vec<(usize, u32)>,
}
impl Sampling {
pub fn is_greedy(&self) -> bool {
self.temperature <= 0.0
}
}