Skip to content

Commit

Permalink
Merge pull request #2 from open-rmf/devel
Browse files Browse the repository at this point in the history
Some improvements as we polish up for release
  • Loading branch information
arjo129 committed May 8, 2024
2 parents daed6ee + 6ad32ce commit 35082be
Show file tree
Hide file tree
Showing 13 changed files with 172 additions and 133 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ jobs:

steps:
- uses: actions/checkout@v4
- name: Install latest nightly
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
override: true
components: rustfmt, clippy
- name: Build
run: cargo build --verbose
- name: Run tests
Expand Down
4 changes: 2 additions & 2 deletions examples/benchmark.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// Benchmark
///
///
/// This benchmark compares the speed at which we can calculate suboptimal solutions, optimal solutions using the assignment heuristic and
///
///
use std::hint;
use std::io::Write;
use std::sync::atomic::AtomicBool;
Expand Down
13 changes: 7 additions & 6 deletions examples/discrete_vs_nodiscrete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use rmf_reservations::database::ClockSource;
use rmf_reservations::discretization::fixed_timestep::FixedTimestep;
use rmf_reservations::discretization::DescretizationStrategy;
use rmf_reservations::ReservationParameters;
use rmf_reservations::ReservationRequest;
use rmf_reservations::ReservationRequestAlternative;
use rmf_reservations::StartTimeRange;

#[derive(Default, Clone)]
Expand All @@ -31,12 +31,11 @@ impl ClockSource for FakeClock {
}
}


fn generate_reservation_requests(
time_range: chrono::Duration,
alts: usize,
reqs: usize,
) -> (Vec<Vec<ReservationRequest>>, Vec<String>) {
) -> (Vec<Vec<ReservationRequestAlternative>>, Vec<String>) {
let mut result = vec![];
let mut rng = rand::thread_rng();

Expand All @@ -51,7 +50,7 @@ fn generate_reservation_requests(
for req in 0..reqs {
let mut alternatives = vec![];
for alternative in 0..alts {
let x = ReservationRequest {
let x = ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: resource[alternative].clone(),
duration: Some(Duration::minutes(200)),
Expand All @@ -70,7 +69,10 @@ fn generate_reservation_requests(
(result, resource)
}

fn discretize(res: &Vec<Vec<ReservationRequest>>, clock_source: FakeClock) -> Vec<Vec<ReservationRequest>> {
fn discretize(
res: &Vec<Vec<ReservationRequestAlternative>>,
clock_source: FakeClock,
) -> Vec<Vec<ReservationRequestAlternative>> {
let mut latest = Utc.with_ymd_and_hms(1970, 1, 1, 0, 0, 0).unwrap();
for r in res {
for v in r {
Expand All @@ -83,7 +85,6 @@ fn discretize(res: &Vec<Vec<ReservationRequest>>, clock_source: FakeClock) -> Ve
remapper.discretize(res)
}


fn main() {
//for x in 6..10 {
for time_length in 2..20 {
Expand Down
4 changes: 2 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

This is a library that provides resource optimization constraints for multi-robot applications. More specifcally,
we provide a very simple formulation for resource optimization and scheduling. A robot may request the use of a
resource like a charger for a fixed duration of time. The system will then assign the robot to said resource.
resource like a charger for a fixed duration of time within a given time range. The system will then assign the robot
to said resource.

At 10,000ft the library solves the following problem:

Expand Down Expand Up @@ -38,7 +39,6 @@ Alternatives:
The requests can come in asynchronously. We can solve both optimally and suboptimally depoending on the complexity of the problem.

A variety of algorithms have been implmented in this library including SAT based algorithms and greedy algorithms.
More information can be found in the tutorial documentation.

For more details take a look at the tutorial:

Expand Down
21 changes: 12 additions & 9 deletions src/algorithms/greedy_solver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use rand::Rng;

use crate::{
cost_function::static_cost::StaticCost, utils::multimap::UniqueMultiHashMap,
ReservationRequest, ReservationSchedule,
ReservationRequestAlternative, ReservationSchedule,
};

use super::SolverAlgorithm;
Expand All @@ -29,7 +29,7 @@ pub struct ConflictTracker {
base_resources: Vec<String>,
last_request_id: usize,
resource_name_to_id: HashMap<String, usize>,
requests: HashMap<usize, Vec<ReservationRequest>>,
requests: HashMap<usize, Vec<ReservationRequestAlternative>>,
// Maps requests by (request_id, resource_id) -> index in requests table
request_reservation_idx: HashMap<(usize, usize), usize>,
}
Expand All @@ -51,7 +51,10 @@ impl ConflictTracker {
}

// Requires that ReservationRequests have a well defined start time
pub fn request_resources(&mut self, request: Vec<ReservationRequest>) -> Option<usize> {
pub fn request_resources(
&mut self,
request: Vec<ReservationRequestAlternative>,
) -> Option<usize> {
let req_id = self.last_request_id;
for r_id in 0..request.len() {
let resource = request[r_id].parameters.resource_name.clone();
Expand All @@ -69,7 +72,7 @@ impl ConflictTracker {
pub fn generate_literals_and_remap_requests(&self) -> Problem {
let mut fake_resources = vec![];
let mut fake_resource_mapping: HashMap<String, FakeResourceMetaInfo> = HashMap::new();
let mut fake_requests: HashMap<usize, Vec<ReservationRequest>> = HashMap::new();
let mut fake_requests: HashMap<usize, Vec<ReservationRequestAlternative>> = HashMap::new();

let mut id_to_res = HashMap::new();
let mut res_to_id = HashMap::new();
Expand Down Expand Up @@ -278,7 +281,7 @@ pub struct Problem {
res_to_id: HashMap<String, (usize, usize)>,
id_to_res: HashMap<(usize, usize), String>,
conflict_sets: HashMap<String, HashSet<String>>,
fake_requests: HashMap<usize, Vec<ReservationRequest>>,
fake_requests: HashMap<usize, Vec<ReservationRequestAlternative>>,
}

impl Problem {
Expand Down Expand Up @@ -666,7 +669,7 @@ fn test_conflict_checker() {
use crate::{cost_function::static_cost::StaticCost, ReservationParameters, StartTimeRange};

let resources = vec!["station1".to_string(), "station2".to_string()];
let alternative1 = ReservationRequest {
let alternative1 = ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: resources[0].clone(),
start_time: StartTimeRange {
Expand All @@ -678,7 +681,7 @@ fn test_conflict_checker() {
cost_function: Arc::new(StaticCost::new(3.0)),
};

let alternative2 = ReservationRequest {
let alternative2 = ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: resources[1].clone(),
start_time: StartTimeRange {
Expand All @@ -690,7 +693,7 @@ fn test_conflict_checker() {
cost_function: Arc::new(StaticCost::new(6.0)),
};

let alternative1_cheaper = ReservationRequest {
let alternative1_cheaper = ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: resources[0].clone(),
start_time: StartTimeRange {
Expand Down Expand Up @@ -719,7 +722,7 @@ fn test_conflict_checker() {
assert!((solution.cost.0 - 8.0).abs() < 1.0);
}

fn validate_optimal_solution(soln: &(Vec<Vec<ReservationRequest>>, Vec<String>)) {}
fn validate_optimal_solution(soln: &(Vec<Vec<ReservationRequestAlternative>>, Vec<String>)) {}

#[cfg(test)]
#[test]
Expand Down
33 changes: 18 additions & 15 deletions src/algorithms/kuhn_munkres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use ordered_float::OrderedFloat;
use pathfinding::{kuhn_munkres, prelude::Weights};
use term_table::{row::Row, table_cell::TableCell, Table};

use crate::{ReservationParameters, ReservationRequest, StartTimeRange};
use crate::{ReservationParameters, ReservationRequestAlternative, StartTimeRange};

struct SparseAxisMasker {
masked_idx_remapping: Vec<Option<usize>>,
Expand Down Expand Up @@ -100,7 +100,7 @@ fn test_sparse_axis_masker() {
pub struct ReservationsKuhnMunkres {
resources: Vec<String>,
resource_name_to_id: HashMap<String, usize>,
requests: HashMap<usize, Vec<ReservationRequest>>,
requests: HashMap<usize, Vec<ReservationRequestAlternative>>,
// Maps requests by (request_id, resource_id) -> index in requests table
request_reservation_idx: HashMap<(usize, usize), usize>,
last_request_id: usize,
Expand Down Expand Up @@ -196,7 +196,10 @@ impl ReservationsKuhnMunkres {
}
}

pub fn request_resources(&mut self, request: Vec<ReservationRequest>) -> Option<usize> {
pub fn request_resources(
&mut self,
request: Vec<ReservationRequestAlternative>,
) -> Option<usize> {
let req_id = self.last_request_id;
for r_id in 0..request.len() {
let resource = request[r_id].parameters.resource_name.clone();
Expand Down Expand Up @@ -309,15 +312,15 @@ fn test_kuhn_munkres_correctness() {
let mut res_sys = ReservationsKuhnMunkres::create_with_resources(&resources);

let req1 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 1".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
Expand All @@ -327,15 +330,15 @@ fn test_kuhn_munkres_correctness() {
},
];
let req2 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 3".to_string(),
duration: None,
Expand Down Expand Up @@ -375,15 +378,15 @@ fn test_resource_constraint() {
let mut res_sys = ReservationsKuhnMunkres::create_with_resources(&resources);

let req1 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 1".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
Expand All @@ -393,15 +396,15 @@ fn test_resource_constraint() {
},
];
let req2 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 3".to_string(),
duration: None,
Expand Down Expand Up @@ -443,15 +446,15 @@ fn test_rquest_constraint() {
let mut res_sys = ReservationsKuhnMunkres::create_with_resources(&resources);

let req1 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 1".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
Expand All @@ -461,15 +464,15 @@ fn test_rquest_constraint() {
},
];
let req2 = vec![
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 2".to_string(),
duration: None,
start_time: StartTimeRange::no_specifics(),
},
cost_function: Arc::new(StaticCost::new(10.0)),
},
ReservationRequest {
ReservationRequestAlternative {
parameters: ReservationParameters {
resource_name: "Parking Spot 3".to_string(),
duration: None,
Expand Down
6 changes: 3 additions & 3 deletions src/algorithms/sat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use varisat::{ExtendFormula, Lit, Solver};

use crate::{
cost_function::{self, static_cost::StaticCost},
ReservationRequest,
ReservationRequestAlternative,
};

use super::{greedy_solver::Problem, AlgorithmState, SolverAlgorithm};
Expand Down Expand Up @@ -446,15 +446,15 @@ impl SATSolver {
pub fn generate_sat_devil(
n_resources: usize,
n_alt: usize,
) -> (Vec<Vec<ReservationRequest>>, Vec<String>) {
) -> (Vec<Vec<ReservationRequestAlternative>>, Vec<String>) {
let mut sat_devil_resources: Vec<_> = (0..n_resources).map(|i| format!("{:?}", i)).collect();
let time_step = Duration::seconds(100);
let start_time = Utc.with_ymd_and_hms(2014, 7, 8, 9, 10, 11).unwrap();
let mut requests = vec![vec![]; n_resources];

for i in 0..n_resources {
for j in 0..n_alt {
let req = ReservationRequest {
let req = ReservationRequestAlternative {
parameters: crate::ReservationParameters {
resource_name: sat_devil_resources[(i + j) % n_resources].clone(),
duration: Some(Duration::seconds(100)),
Expand Down
Loading

0 comments on commit 35082be

Please sign in to comment.