vebtrees 0.1.2

A Rust implementation of Van Emde Boas trees
Documentation
use vebtree::VEBTree;

use std::time::{Instant, Duration};

#[test]
fn test_insert_asymptote(){
    let num_runs = 500;
    let mut test_n_values: Vec<usize> = Vec::with_capacity(num_runs);
    for i in (0..num_runs) {
        test_n_values.push((i+1)*10_usize.pow(3));
    }
    let mut test_results: Vec<f64> = Vec::with_capacity(num_runs);
    for i in 0..test_n_values.len() {
        let mut test_tree = VEBTree::new(i);
        let start = Instant::now();
        for j in 0..i {
            if j % 2 == 0 {
                test_tree.insert(j);
            }
        }
        let elapsed = start.elapsed();
        test_results.push(convert_elapsed_to_nanosec(elapsed));
    }
    for i in 0..test_results.len() {
        test_results[i] = test_results[i].log2().log2();
    }
    let corr = calculate_correlation_coefficient(
        &test_results[0..test_results.len()],
        &test_n_values[0..test_n_values.len()]
    );
    println!("corr: {:?}", corr);
    assert!(corr > 0.70);
}

#[test]
fn test_delete_asymptote(){
    let num_runs = 500;
    let mut test_n_values: Vec<usize> = Vec::with_capacity(num_runs);
    for i in (0..num_runs) {
        test_n_values.push((i+1)*10_usize.pow(3));
    }
    let mut test_results: Vec<f64> = Vec::with_capacity(num_runs);
    for i in 0..test_n_values.len() {
        let mut test_tree = VEBTree::new(i);
        for j in 0..i {
            if j % 2 == 0 {
                test_tree.insert(j);
            }
        }
        let start = Instant::now();
        for j in 0..i {
            if j % 2 == 0 {
                test_tree.delete(j);
            }
        }
        let elapsed = start.elapsed();
        test_results.push(convert_elapsed_to_nanosec(elapsed));
    }
    for i in 0..test_results.len() {
        test_results[i] = test_results[i].log2().log2();
    }
    let corr = calculate_correlation_coefficient(
        &test_results[0..test_results.len()],
        &test_n_values[0..test_n_values.len()]
    );
    println!("corr: {:?}", corr);
    assert!(corr > 0.70);
}

#[test]
fn test_findnext_asymptote(){
    let num_runs = 500;
    let mut test_n_values: Vec<usize> = Vec::with_capacity(num_runs);
    for i in (0..num_runs) {
        test_n_values.push((i+1)*10_usize.pow(3));
    }
    let mut test_results: Vec<f64> = Vec::with_capacity(num_runs);
    for i in 0..test_n_values.len() {
        let mut test_tree = VEBTree::new(i);
        for j in 0..i {
            if i % 2 == 0 {
                test_tree.insert(j);
            }
        }
        let start = Instant::now();
        for j in 0..i/2 {
            test_tree.findnext(j*2);
        }
        let elapsed = start.elapsed();
        test_results.push(convert_elapsed_to_nanosec(elapsed));
    }
    for i in 0..test_results.len() {
        test_results[i] = test_results[i].log2().log2();
    }
    let corr = calculate_correlation_coefficient(
        &test_results[0..test_results.len()],
        &test_n_values[0..test_n_values.len()]
    );
    println!("corr: {:?}", corr);
    assert!(corr > 0.70);
}


#[test]
fn test_findprev_asymptote(){
    let num_runs = 500;
    let mut test_n_values: Vec<usize> = Vec::with_capacity(num_runs);
    for i in (0..num_runs) {
        test_n_values.push((i+1)*10_usize.pow(3));
    }
    let mut test_results: Vec<f64> = Vec::with_capacity(num_runs);
    for i in 0..test_n_values.len() {
        let mut test_tree = VEBTree::new(i);
        for j in 0..i {
            if i % 2 == 0 {
                test_tree.insert(j);
            }
        }
        let start = Instant::now();
        for j in 0..i/2 {
            test_tree.findprev(j*2);
        }
        let elapsed = start.elapsed();
        test_results.push(convert_elapsed_to_nanosec(elapsed));
    }
    for i in 0..test_results.len() {
        test_results[i] = test_results[i].log2().log2();
    }
    let corr = calculate_correlation_coefficient(
        &test_results[0..test_results.len()],
        &test_n_values[0..test_n_values.len()]
    );
    println!("corr: {:?}", corr);
    assert!(corr > 0.70);
}







fn convert_elapsed_to_nanosec(elapsed: Duration) -> f64 {
    return ((elapsed.as_secs() as f64)*1_000_000_000.0)
        + ( elapsed.subsec_nanos() as f64);
}

fn calculate_correlation_coefficient(time: &[f64], size: &[usize]) -> f64 {
    assert_eq!(time.len(), size.len());
    let mut x: Vec<f64> = Vec::with_capacity(time.len());
    let mut y: Vec<f64> = Vec::with_capacity(time.len());
    for i in 0..time.len() {
        x.push(size[i] as f64);
        y.push(time[i]);
    }
    let mut xy: Vec<f64> = Vec::with_capacity(x.len());
    let mut x_2: Vec<f64> = Vec::with_capacity(x.len());
    let mut y_2: Vec<f64> = Vec::with_capacity(x.len());

    for i in 0..x.len() {
        xy.push(y[i]*x[i]);
        x_2.push(x[i].powf(2.0));
        y_2.push(y[i].powf(2.0));
    }
    let sum_x: f64 = x.iter().sum();
    let sum_y: f64 = y.iter().sum();
    let sum_xy: f64 = xy.iter().sum();
    let sum_x_2: f64 = x_2.iter().sum();
    let sum_y_2: f64 = y_2.iter().sum();
    println!("sum_x: {:?}, sum_y={:?}, sum_xy={:?}, sum_x_2={:?}, sum_y_2={:?}",
             sum_x,
             sum_y,
             sum_xy,
             sum_x_2,
             sum_y_2
    );
    let numerator: f64 = (x.len() as f64)*sum_xy - (sum_x)*(sum_y);
    let denominator_1: f64 =(x.len() as f64)*sum_x_2 - sum_x.powf(2.0);
    let denominator_2: f64 =(x.len() as f64)*sum_y_2 - sum_y.powf(2.0);
    let denominator = (denominator_1*denominator_2).sqrt();
    println!("Numerator: {:?}, Denominator: {:?}", numerator, denominator);
    return numerator/denominator;
}