def test_subproblem_generation(self):
        demand = [0, 1, 2, 3, 4, 2]
        min_length = 1
        max_length = 2

        expected_window_offset = 1
        expected_windowed_demand = [1, 2, 3, 4, 2]
        expected_round_up = [1, 1, 2, 2, 1]
        expected_round_down = [0, 1, 1, 2, 1]

        d = Decompose(demand, min_length, max_length)

        actual_round_up = d._split_demand(round_up=True)
        actual_round_down = d._split_demand(round_up=False)
        actual_window_offset = d.window_offset

        assert actual_round_up == expected_round_up
        assert actual_round_down == expected_round_down
        assert actual_window_offset == expected_window_offset

        # Check that we exactly split demand in 2 (no overage or underage)
        recombined = [
            up + down for up, down in zip(actual_round_up, actual_round_down)
        ]
        assert recombined == expected_windowed_demand
 def test_edge_smoothing(self):
     demand = [3, 3, 2, 2, 4, 2, 3, 1, 3]
     min_length = 3
     max_length = 4
     expected_demand = [3, 3, 3, 2, 4, 3, 3, 3, 3]
     d = Decompose(demand, min_length, max_length)
     assert d.demand == expected_demand
    def test_init_no_shifts(self):
        demand = [1, 2, 3, 2, 1]
        min_length = 1
        max_length = 2

        d = Decompose(demand, min_length, max_length)

        assert d.demand == demand
        assert d.min_length == min_length
        assert d.max_length == max_length
        assert d.window_offset == 0  # No windowing
    def test_combined_windowing(self):
        demand = [0, 0, 0, 0, 1, 0, 2, 3, 0, 2, 1, 0, 0]
        expected_processed_demand = [1, 0, 2, 3, 0, 2, 1]
        min_length = 1
        max_length = 2

        d = Decompose(demand, min_length, max_length)

        assert d.demand == expected_processed_demand
        assert d.window_offset == 4  # Windowing
        assert d.min_length == min_length
        assert d.max_length == max_length
    def test_leading_zeros_windowing(self):
        demand = [0, 0, 0, 1, 2, 3, 2, 1]
        expected_processed_demand = [1, 2, 3, 2, 1]
        min_length = 1
        max_length = 2

        d = Decompose(demand, min_length, max_length)

        assert d.demand == expected_processed_demand
        assert d.min_length == min_length
        assert d.max_length == max_length
        assert d.window_offset == 3  # Windowing
示例#6
0
    def test_doesnt_freak_out_with_interior_zero(self):
        """Add an interior zero and make sure the algorithm does not freak out."""
        # This is important becuase when bifurcating, an interior zero is possible
        # Here, it's infeasible unless the interior point is > 0
        demand = [1, 0, 1, 1, 2, 2, 2, 2, 3, 2, 2, 1]
        min_length = 2
        max_length = 4

        d = Decompose(demand, min_length, max_length)
        d.calculate()
        d.validate()

        efficiency = d.efficiency()
        assert efficiency < EFFICIENCY_LIMIT
示例#7
0
    def test_big_on_demand(self):
        """Data from on demand client Jan 2015 (before splitting into roles)"""
        demand = [
            0, 0, 0, 0, 0, 0, 35, 35, 35, 34, 56, 59, 63, 70, 87, 107, 90, 61,
            44, 32, 28
        ]
        min_length = 4
        max_length = 8
        d = Decompose(demand, min_length, max_length)
        d.calculate()
        d.validate()

        efficiency = d.efficiency()
        assert efficiency < EFFICIENCY_LIMIT
示例#8
0
    def test_ondemand_data(self):
        """Data from customer bike group, Jan 2015"""
        demand = [
            0, 0, 0, 0, 0, 0, 0, 5, 5, 7, 8, 6, 6, 7, 7, 7, 9, 9, 6, 5, 4, 4,
            0, 0
        ]
        min_length = 4
        max_length = 8
        d = Decompose(demand, min_length, max_length)
        d.calculate()
        d.validate()

        efficiency = d.efficiency()
        assert efficiency < EFFICIENCY_LIMIT