feat: switch to Pert, add calendar scheduling

This commit is contained in:
swaits committed 2024-08-28 12:16:46 -06:00
1 parent b3207a64f5
commit 0b3b5c6896
18 files changed
+958 -323

No files matched your search

+3 -4
View File
@@ -1,5 +1,5 @@
use mcps::{
schedule::Schedule,
schedule::Project,
simulation::run_multiple_simulations,
task::{days_to_duration, Task},
};
@@ -12,7 +12,6 @@ fn test_average_effort_calculation() {
let min_days = 5.0;
let max_days = 15.0;
let expected_avg_days = 10.0;
let estimate_confidence = 0.8;
let num_simulations = 10000;
let num_workers = 1; // Using 1 worker to simplify effort calculation
@@ -23,13 +22,13 @@ fn test_average_effort_calculation() {
&format!("Task{}", i),
vec![],
days_to_duration(min_days),
days_to_duration(0.5 * (min_days + max_days)),
days_to_duration(max_days),
)
})
.collect();
let schedule =
Schedule::new(tasks, num_workers, estimate_confidence).expect("Failed to create schedule");
let schedule = Project::new(tasks, num_workers, None).expect("Failed to create schedule");
let (_, effort_times) = run_multiple_simulations(&schedule, num_simulations);
+8 -2
View File
@@ -1,10 +1,10 @@
use mcps::{
schedule::Schedule,
schedule::Project,
task::{days_to_duration, Task},
};
fn create_schedule_and_expect_error(tasks: Vec<Task>, expected_error: &str) {
let result = Schedule::new(tasks, 1, 0.8);
let result = Project::new(tasks, 1, None);
assert!(
result.is_err(),
@@ -27,12 +27,14 @@ fn test_cyclic_dependency() {
"A",
vec!["B".to_string()],
days_to_duration(1.0),
days_to_duration(1.5),
days_to_duration(2.0),
),
Task::new(
"B",
vec!["A".to_string()],
days_to_duration(1.0),
days_to_duration(1.5),
days_to_duration(2.0),
),
];
@@ -47,12 +49,14 @@ fn test_missing_dependency() {
"A",
vec!["C".to_string()],
days_to_duration(1.0),
days_to_duration(1.5),
days_to_duration(2.0),
),
Task::new(
"B",
vec!["A".to_string()],
days_to_duration(1.0),
days_to_duration(1.5),
days_to_duration(2.0),
),
];
@@ -66,6 +70,7 @@ fn test_negative_duration() {
"A",
vec![],
days_to_duration(0.0),
days_to_duration(0.5),
days_to_duration(1.0),
)];
@@ -79,6 +84,7 @@ fn test_min_greater_than_max() {
vec![],
days_to_duration(3.0),
days_to_duration(2.0),
days_to_duration(2.0),
)];
create_schedule_and_expect_error(tasks, "Minimum duration greater than maximum");
+4 -4
View File
@@ -1,5 +1,5 @@
use mcps::{
schedule::Schedule,
schedule::Project,
simulation::run_multiple_simulations,
task::{days_to_duration, Task},
};
@@ -13,6 +13,7 @@ fn create_independent_tasks(num_tasks: usize) -> Vec<Task> {
&format!("Task_{}", i),
vec![],
days_to_duration(1.0),
days_to_duration(2.0),
days_to_duration(3.0),
)
})
@@ -23,14 +24,13 @@ fn create_independent_tasks(num_tasks: usize) -> Vec<Task> {
fn test_no_dependencies_schedule() {
let num_tasks = 32;
let tasks = create_independent_tasks(num_tasks);
let estimate_confidence = 0.8;
let num_simulations = 1_000;
let mut prev_avg_effort = 0.0;
for num_workers in [1, 2, 4, 8] {
let schedule = Schedule::new(tasks.clone(), num_workers, estimate_confidence)
.expect("Failed to create schedule");
let schedule =
Project::new(tasks.clone(), num_workers, None).expect("Failed to create schedule");
let (project_durations, effort_times) =
run_multiple_simulations(&schedule, num_simulations);
+15 -5
View File
@@ -1,5 +1,5 @@
use mcps::{
schedule::Schedule,
schedule::Project,
simulation::run_multiple_simulations,
task::{days_to_duration, Task},
};
@@ -9,47 +9,57 @@ use std::time::Duration;
#[test]
fn test_simulation_with_different_worker_counts() {
let tasks = vec![
Task::new("A", vec![], days_to_duration(1.0), days_to_duration(3.0)),
Task::new(
"A",
vec![],
days_to_duration(1.0),
days_to_duration(2.0),
days_to_duration(3.0),
),
Task::new(
"B",
vec!["A".to_string()],
days_to_duration(2.0),
days_to_duration(3.0),
days_to_duration(4.0),
),
Task::new(
"C",
vec!["A".to_string()],
days_to_duration(3.0),
days_to_duration(4.0),
days_to_duration(5.0),
),
Task::new(
"D",
vec!["B".to_string(), "C".to_string()],
days_to_duration(2.0),
days_to_duration(4.0),
days_to_duration(6.0),
),
Task::new(
"E",
vec!["B".to_string()],
days_to_duration(1.0),
days_to_duration(1.5),
days_to_duration(2.0),
),
Task::new(
"F",
vec!["D".to_string(), "E".to_string()],
days_to_duration(2.0),
days_to_duration(3.0),
days_to_duration(4.0),
),
];
let estimate_confidence = 0.8;
let num_simulations = 1000;
let mut all_efforts = Vec::new();
for num_workers in [1, 2, 4, 8, 16, 32] {
let schedule = Schedule::new(tasks.clone(), num_workers, estimate_confidence)
.expect("Failed to create schedule");
let schedule =
Project::new(tasks.clone(), num_workers, None).expect("Failed to create schedule");
let (project_durations, effort_times) =
run_multiple_simulations(&schedule, num_simulations);