impl Default for GNNErrorEncoder {
fn default() -> Self {
Self::default_config()
}
}
#[derive(Debug, Clone)]
pub struct ProgramFeedbackGraph {
pub node_features: Vec<Vec<f32>>,
pub node_types: Vec<NodeType>,
pub edges: Vec<(usize, usize)>,
pub edge_types: Vec<EdgeType>,
}
impl ProgramFeedbackGraph {
#[must_use]
pub fn new() -> Self {
Self {
node_features: Vec::new(),
node_types: Vec::new(),
edges: Vec::new(),
edge_types: Vec::new(),
}
}
pub fn add_node(&mut self, node_type: NodeType, features: Vec<f32>) -> usize {
let idx = self.node_features.len();
self.node_features.push(features);
self.node_types.push(node_type);
idx
}
pub fn add_edge(&mut self, source: usize, target: usize, edge_type: EdgeType) {
self.edges.push((source, target));
self.edge_types.push(edge_type);
}
#[must_use]
pub fn num_nodes(&self) -> usize {
self.node_features.len()
}
#[must_use]
pub fn num_edges(&self) -> usize {
self.edges.len()
}
}
impl Default for ProgramFeedbackGraph {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NodeType {
Ast,
Diagnostic,
ExpectedType,
FoundType,
Suggestion,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EdgeType {
AstChild,
DataFlow,
ControlFlow,
DiagnosticRefers,
Expects,
Found,
}
#[cfg(test)]
mod tests;