Ejemplo n.º 1
0
def test_removed_event_schedule_difference(slots):
    events = [
        Event(name='Talk 1', duration=30, demand=30),
        Event(name='Talk 2', duration=30, demand=500),
        Event(name='Workshop 1', duration=60, demand=20),
        Event(name='Workshop 2', duration=60, demand=20)
    ]
    old_schedule = (
        ScheduledItem(events[0], slots[1]),
        ScheduledItem(events[1], slots[4]),
        ScheduledItem(events[2], slots[2]),
        ScheduledItem(events[3], slots[5])
    )
    new_schedule = (
        ScheduledItem(events[0], slots[1]),
        ScheduledItem(events[1], slots[3]),
        ScheduledItem(events[2], slots[4])
    )
    difference = scheduler.event_schedule_difference(
        old_schedule, new_schedule)
    expected = [
        ChangedEventScheduledItem(events[1], slots[4], slots[3]),
        ChangedEventScheduledItem(events[2], slots[2], slots[4]),
        ChangedEventScheduledItem(events[3], slots[5], None)
    ]
    assert difference == expected
Ejemplo n.º 2
0
def test_unchanged_event_schedule_difference(events, slots):
    old_schedule = (
        ScheduledItem(events[0], slots[1]),
        ScheduledItem(events[1], slots[4]),
        ScheduledItem(events[2], slots[2])
    )
    difference = scheduler.event_schedule_difference(
        old_schedule, old_schedule)
    assert difference == []
Ejemplo n.º 3
0
def build(
    verbosity, algorithm, objective, diff, input_dir, solution_dir, build_dir
):
    logging.setup(verbosity)
    if input_dir:
        session.folders['input'] = Path(input_dir)

    if solution_dir:
        session.folders['solution'] = Path(solution_dir)

    if build_dir:
        session.folders['build'] = Path(build_dir)

    resources = defn.resources()
    events, slots = events_and_slots(resources)

    slots_by_index = {
        idx: f'{slot.starts_at} {slot.venue}'
        for idx, slot in enumerate(slots)}
    logger.debug(f'\nSlots List:\n{slots_by_index}')

    kwargs = {}
    if objective == 'consistency' or algorithm == 'simulated_annealing' or diff:
        original_solution = io.import_solution(session.folders['solution'])
        revised_solution = [
            item for item in original_solution
            if item[0] < len(events)]
        original_schedule = solution_to_schedule(
            revised_solution, events, slots)
        diff = True
        kwargs['original_schedule'] = original_schedule

    solution = calc.solution(events, slots, algorithm, objective, **kwargs)

    if diff:
        schedule = solution_to_schedule(solution, events, slots)
        event_diff = event_schedule_difference(original_schedule, schedule)
        logger.debug(f'\nevent_diff:')
        for item in event_diff:
            logger.debug(f'{item.event.name} has moved from {item.old_slot.venue} at {item.old_slot.starts_at} to {item.new_slot.venue} at {item.new_slot.starts_at}')

    if solution is not None:
        allocations = defn.allocations(resources)
        unbounded = defn.unbounded(resources)
        defn.add_allocations(events, slots, solution, allocations, unbounded)
        logger.debug(convert.schedule_to_text(solution, events, slots))
        io.export_solution_and_definition(
            resources, events, slots, allocations, solution,
            session.folders['solution'])
Ejemplo n.º 4
0
def test_changed_event_schedule_difference(events, slots):
    old_schedule = (
        ScheduledItem(events[0], slots[1]),
        ScheduledItem(events[1], slots[4]),
        ScheduledItem(events[2], slots[2])
    )
    new_schedule = (
        ScheduledItem(events[0], slots[1]),
        ScheduledItem(events[1], slots[3]),
        ScheduledItem(events[2], slots[4])
    )
    difference = scheduler.event_schedule_difference(
        old_schedule, new_schedule)
    expected = [
        ChangedEventScheduledItem(events[1], slots[4], slots[3]),
        ChangedEventScheduledItem(events[2], slots[2], slots[4])
    ]
    assert difference == expected
Ejemplo n.º 5
0
    def diff(self, original_schedule, new_schedule):
        """
        This method returns a dict of Event differences and Slot differences between
        the two schedules.
        """
        slot_diff = scheduler.slot_schedule_difference(
            original_schedule,
            new_schedule,
        )

        slot_output = []
        for item in slot_diff:
            slot_output.append(
                {
                    "event_location": self.camp.event_locations.get(pk=item.slot.venue),
                    "starttime": item.slot.starts_at,
                    "old": {},
                    "new": {},
                },
            )
            if item.old_event:
                try:
                    old_event = self.camp.events.get(pk=item.old_event.name)
                except self.camp.events.DoesNotExist:
                    old_event = item.old_event.name
                slot_output[-1]["old"]["event"] = old_event
            if item.new_event:
                try:
                    new_event = self.camp.events.get(pk=item.new_event.name)
                except self.camp.events.DoesNotExist:
                    new_event = item.old_event.name
                slot_output[-1]["new"]["event"] = new_event

        # then get a list of differences per event
        event_diff = scheduler.event_schedule_difference(
            original_schedule,
            new_schedule,
        )
        event_output = []
        # loop over the differences and build the dict
        for item in event_diff:
            try:
                event = self.camp.events.get(pk=item.event.name)
            except self.camp.events.DoesNotExist:
                event = item.event.name
            event_output.append(
                {
                    "event": event,
                    "old": {},
                    "new": {},
                },
            )
            # do we have an old slot for this event?
            if item.old_slot:
                event_output[-1]["old"][
                    "event_location"
                ] = self.camp.event_locations.get(id=item.old_slot.venue)
                event_output[-1]["old"]["starttime"] = item.old_slot.starts_at
            # do we have a new slot for this event?
            if item.new_slot:
                event_output[-1]["new"][
                    "event_location"
                ] = self.camp.event_locations.get(id=item.new_slot.venue)
                event_output[-1]["new"]["starttime"] = item.new_slot.starts_at

        # all good
        return {"event_diffs": event_output, "slot_diffs": slot_output}