Skip to content
This repository has been archived by the owner on Nov 6, 2023. It is now read-only.

Commit

Permalink
Merge pull request #53 from jvdcf/fix_verify_add
Browse files Browse the repository at this point in the history
Fix verify add
  • Loading branch information
jvdcf authored Nov 3, 2023
2 parents 9b9da14 + 7ff7a98 commit 9af1fdb
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 3 deletions.
53 changes: 50 additions & 3 deletions src/Runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,11 +437,29 @@ void Runtime::handle_process(Process p) {
if (res == OperationResult::Success) {
// Balanced classes | O(n)
std::vector<uint64_t> occupancy;
for (ClassSchedule* class_ : this->find_uc(parse_uc_gen(ops[1]))) {
occupancy.push_back(class_->get_student_count());
double sum = 0.0;
auto classes_ = this->find_uc(parse_uc_gen(ops[1]));
for (ClassSchedule* class_ : classes_) {
occupancy.push_back(class_->get_student_count() + (class_==target ? 1 : 0));
sum += (double)class_->get_student_count();
}
double mean = sum / (double)classes_.size();
double std_deviance_before = uc_variance(mean, classes_);
sum += 1.0;
for (ClassSchedule* class_ : classes_) {
if (class_ == target) {
class_->add_student(student_code);
}
}
mean = sum / (double)classes_.size();
double std_deviance_after = uc_variance(mean, classes_);
auto [min, max] = std::minmax_element(occupancy.begin(), occupancy.end());
if (*max - *min > 4) {
for (ClassSchedule* class_ : classes_) {
if (class_ == target) {
class_->remove_student(student_code);
}
}
if ((*max - *min > 4) && (std_deviance_after > std_deviance_before)) {
std::cerr << "ERROR: Critical conflicts found: the classes will not be balanced. Skipping." << std::endl;
return;
}
Expand All @@ -459,6 +477,35 @@ void Runtime::handle_process(Process p) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (answer == "y") {
// Balanced classes | O(n)
std::vector<uint64_t> occupancy;
double sum = 0.0;
auto classes_ = this->find_uc(parse_uc_gen(ops[1]));
for (ClassSchedule* class_ : classes_) {
occupancy.push_back(class_->get_student_count() + (class_==target ? 1 : 0));
sum += (double)class_->get_student_count();
}
double mean = sum / (double)classes_.size();
double std_deviance_before = uc_variance(mean, classes_);
sum += 1.0;
for (ClassSchedule* class_ : classes_) {
if (class_ == target) {
class_->add_student(student_code);
}
}
mean = sum / (double)classes_.size();
double std_deviance_after = uc_variance(mean, classes_);
auto [min, max] = std::minmax_element(occupancy.begin(), occupancy.end());
for (ClassSchedule* class_ : classes_) {
if (class_ == target) {
class_->remove_student(student_code);
}
}
if ((*max - *min > 4) && (std_deviance_after > std_deviance_before)) {
std::cerr << "ERROR: Critical conflicts found: the classes will not be balanced. Skipping." << std::endl;
return;
}

students.erase(s);
s.add_to_class(target);
students.insert(s);
Expand Down
19 changes: 19 additions & 0 deletions src/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
* This file defines some functions that are gonna be useful in other classes
*/
#include "Utils.hpp"
#include <cstdint>
#include <iostream>
#include <numeric>

/**
* This function converts a string to a 8 bit hash.
Expand Down Expand Up @@ -102,3 +104,20 @@ void parse_csv_line(std::string s, std::vector<std::string> &res) {
while (getline(line, buf, ','))
res.push_back(buf);
}

/**
* This function calculates the standard deviance for the number of students in each class of a given UC, taking a mean as the input.
* Theoretical Complexity: O(n), n being the number of classes in a given UC.
* @param mean
* @param c
*/
double uc_variance(double mean, const std::vector<ClassSchedule *> &c) {
uint64_t size = c.size();
auto variance_func = [&mean,&size](double acc, const ClassSchedule* val) {
return acc + (((double)val->get_student_count() - mean) * ((double)val->get_student_count() - mean)) / ((double)size - 1.0);
};
return std::accumulate(c.begin(), c.end(), 0.0, variance_func);
}



3 changes: 3 additions & 0 deletions src/Utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*/
#ifndef UTILS_HPP
#define UTILS_HPP
#include "ClassSchedule.hpp"
#include <cinttypes>
#include <cstdint>
#include <string>
Expand All @@ -21,6 +22,8 @@ bool isnum(uint32_t c);

void parse_csv_line(std::string s, std::vector<std::string> &res);

double uc_variance(double mean, const std::vector<ClassSchedule*>& c);

enum class OperationResult {
Success = 0,
Conflicts = 1,
Expand Down

0 comments on commit 9af1fdb

Please sign in to comment.