use rand::Rng;
use crate::person::Person;
use crate::people::People;
#[derive(Clone)]
pub struct Floor {
people: Vec<Person>,
pub capacity: usize,
pub dest_prob: f64
}
impl Floor {
pub fn new(capacity: usize) -> Floor {
Floor {
people: Vec::new(),
capacity: capacity,
dest_prob: 0_f64
}
}
pub fn get_free_capacity(&self) -> usize {
self.capacity - self.people.get_num_people()
}
pub fn get_p_out(&self) -> f64 {
if self.people.len() == 0 {
return 0_f64;
}
let mut p_out: f64 = 0_f64;
let mut past_p_outs: Vec<f64> = Vec::new();
for pers in self.people.iter() {
let inverse_p_outs: f64 = {
let mut tmp_inverse_p_outs: f64 = 1_f64;
for past_p_out in &past_p_outs {
tmp_inverse_p_outs = tmp_inverse_p_outs * (1_f64 - past_p_out);
}
tmp_inverse_p_outs
};
let tmp_p_out: f64 = pers.p_out * inverse_p_outs;
p_out += tmp_p_out;
past_p_outs.push(pers.p_out);
}
p_out
}
pub fn gen_people_leaving(&mut self, rng: &mut impl Rng) {
for pers in self.people.iter_mut() {
if pers.floor_on != pers.floor_to {
continue;
}
let _is_person_leaving: bool = pers.gen_is_leaving(rng);
}
}
pub fn flush_people_entering_elevator(&mut self, free_elevator_capacity: usize) -> Vec<Person> {
let mut people_entering_elevator: Vec<Person> = Vec::new();
let mut removals = 0_usize;
for i in 0..self.people.len() {
if people_entering_elevator.len() == free_elevator_capacity {
break;
}
if self.people[i-removals].floor_on == self.people[i-removals].floor_to {
continue;
}
let person_entering_elevator: Person = self.people.remove(i - removals);
people_entering_elevator.push(person_entering_elevator);
removals += 1_usize;
}
people_entering_elevator
}
pub fn flush_people_leaving_floor(&mut self) -> Vec<Person> {
let mut people_leaving_floor: Vec<Person> = Vec::new();
let mut removals = 0_usize;
for i in 0..self.people.len() {
if !self.people[i-removals].is_leaving {
continue;
}
let person_leaving_floor: Person = self.people.remove(i - removals);
people_leaving_floor.push(person_leaving_floor);
removals += 1_usize;
}
people_leaving_floor
}
}
impl Extend<Person> for Floor {
fn extend<T: IntoIterator<Item=Person>>(&mut self, iter: T) {
for pers in iter {
if self.people.get_num_people() == self.capacity {
break;
}
self.people.push(pers);
}
}
}
impl People for Floor {
fn gen_num_tips(&self, rng: &mut impl Rng) -> usize {
self.people.gen_num_tips(rng)
}
fn get_dest_floors(&self) -> Vec<usize> {
self.people.get_dest_floors()
}
fn get_num_people(&self) -> usize {
self.people.get_num_people()
}
fn get_num_people_waiting(&self) -> usize {
self.people.get_num_people_waiting()
}
fn get_num_people_going_to_floor(&self, floor_to: usize) -> usize {
self.people.get_num_people_going_to_floor(floor_to)
}
fn get_aggregate_wait_time(&self) -> usize {
self.people.get_aggregate_wait_time()
}
fn are_people_going_to_floor(&self, floor_index: usize) -> bool {
self.people.are_people_going_to_floor(floor_index)
}
fn are_people_waiting(&self) -> bool {
self.people.are_people_waiting()
}
fn increment_wait_times(&mut self) {
for pers in self.people.iter_mut() {
if pers.floor_on == pers.floor_to {
continue;
}
pers.increment_wait_time();
}
}
fn reset_wait_times(&mut self) {
for pers in self.people.iter_mut() {
if pers.floor_on != pers.floor_to {
continue;
}
pers.reset_wait_time();
}
}
}