feat: switch to Pert, add calendar scheduling
This commit is contained in:
18 files changed
+958
-323
No files matched your search
@@ -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);
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user