Skip to content

Commit b5d5297

Browse files
committed
lazy diam calc
1 parent a06ec4d commit b5d5297

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

casr/src/bin/casr-cluster.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -366,12 +366,7 @@ fn update_clusters(
366366
let casreps = util::get_reports(cluster)?;
367367
let (_, stacktraces, crashlines, _) = util::reports_from_dirs(casreps, jobs);
368368
// Fill cluster info structures
369-
let diam = diam(&stacktraces);
370-
clusters.push(Cluster {
371-
number: i,
372-
stacktraces,
373-
diam,
374-
});
369+
clusters.push(Cluster::new(i, stacktraces));
375370
if dedup {
376371
for crashline in crashlines {
377372
// NOTE: Clusters enumerate from 1, not 0
@@ -396,8 +391,7 @@ fn update_clusters(
396391
let mut outers: Vec<(usize, f64)> = Vec::new();
397392
// Checker if casrep is duplicate of someone else
398393
let mut dup = false;
399-
for cluster in &clusters {
400-
// TODO: Add strategy options
394+
for cluster in &mut clusters {
401395
let relation = relation(
402396
stacktrace,
403397
cluster,
@@ -454,8 +448,7 @@ fn update_clusters(
454448

455449
// Update cluster
456450
let i = clusters.iter().position(|a| a.number == number).unwrap();
457-
clusters[i].stacktraces.push(stacktrace.to_vec());
458-
clusters[i].diam = diam(&clusters[i].stacktraces);
451+
clusters[i].push(stacktrace.to_vec());
459452
}
460453

461454
// Handle deviant casreps

libcasr/src/stacktrace.rs

+35-9
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,43 @@ pub enum AccumStrategy {
6161
Dist,
6262
}
6363

64-
// TODO: lazy diam
65-
// TODO: encapsulation
6664
/// Structure provides an interface for leverages with CASR report clusters
6765
#[derive(Clone, Debug)]
6866
pub struct Cluster {
6967
/// Cluster number
7068
pub number: usize,
7169
/// Cluster report stacktraces
72-
pub stacktraces: Vec<Stacktrace>,
70+
stacktraces: Vec<Stacktrace>,
7371
/// Cluster diameter
74-
pub diam: f64,
72+
diam: Option<f64>,
73+
}
74+
75+
impl Cluster {
76+
/// Create new `Cluster`
77+
pub fn new(number: usize, stacktraces: Vec<Stacktrace>) -> Self {
78+
Cluster {
79+
number,
80+
stacktraces,
81+
diam: None,
82+
}
83+
}
84+
/// Get CASR report stactraces
85+
pub fn stacktraces(&self) -> Vec<Stacktrace> {
86+
self.stacktraces.clone()
87+
}
88+
/// Add CASR report stacktrace to cluster
89+
pub fn push(&mut self, stacktrace: Stacktrace) {
90+
self.stacktraces.push(stacktrace);
91+
self.diam = None;
92+
}
93+
/// Get cluster diameter
94+
pub fn diam(&mut self) -> f64 {
95+
if self.diam.is_none() {
96+
diam(&self.stacktraces)
97+
} else {
98+
self.diam.unwrap()
99+
}
100+
}
75101
}
76102

77103
/// This macro updates variables used to remove trusted functions from stack trace
@@ -339,7 +365,7 @@ pub fn dedup_crashlines(crashlines: &[String], clusters: &mut [usize]) -> usize
339365
/// # Return value
340366
///
341367
/// Value of diameter
342-
pub fn diam(stacktraces: &[Stacktrace]) -> f64 {
368+
fn diam(stacktraces: &[Stacktrace]) -> f64 {
343369
let mut diam = 0f64;
344370
let len = stacktraces.len();
345371
for i in 0..len {
@@ -370,15 +396,15 @@ pub fn diam(stacktraces: &[Stacktrace]) -> f64 {
370396
/// `Relation` enum with measure according specified strategy
371397
pub fn relation(
372398
new: &Stacktrace,
373-
cluster: &Cluster,
399+
cluster: &mut Cluster,
374400
inner_strategy: AccumStrategy,
375401
outer_strategy: AccumStrategy,
376402
) -> Relation {
377-
let diam = cluster.diam;
403+
let diam = cluster.diam();
378404
let mut min = MAX;
379405
let mut max = 0f64;
380-
for stacktrace in &cluster.stacktraces {
381-
let dist = 1.0 - similarity(new, stacktrace);
406+
for stacktrace in cluster.stacktraces() {
407+
let dist = 1.0 - similarity(new, &stacktrace);
382408
if dist == 0.0 {
383409
return Relation::Dup;
384410
} else if dist > THRESHOLD {

0 commit comments

Comments
 (0)