wedding-planner/app/services/tables/discomfort_calculator.rb
Manuel Bustillo b7cabc1661
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 3m21s
Run unit tests / unit_tests (pull_request) Successful in 2m49s
Build Nginx-based docker image / build-static-assets (pull_request) Successful in 31m54s
Add copyright notice
2024-10-27 21:42:45 +00:00

28 lines
617 B
Ruby

# Copyright (C) 2024 Manuel Bustillo
module Tables
class DiscomfortCalculator
private attr_reader :table
def initialize(table)
@table = table
end
def calculate
cohesion_penalty
end
private
def cohesion_penalty
table.map { |guest| guest.affinity_group_list.first }.tally.to_a.combination(2).sum do |(a, count_a), (b, count_b)|
distance = AffinityGroupsHierarchy.instance.distance(a, b)
next count_a * count_b if distance.nil?
next 0 if distance.zero?
count_a * count_b * Rational(distance, distance + 1)
end
end
end
end