Source code for bnelearn.tests.test_multi_unit_auctions

"""Testing correctness of auction implementations."""

import pytest
import torch

from bnelearn.mechanism import (MultiUnitDiscriminatoryAuction,
                                MultiUnitUniformPriceAuction,
                                MultiUnitVickreyAuction)

cuda = torch.cuda.is_available()

mida = MultiUnitDiscriminatoryAuction(cuda=cuda)
miup = MultiUnitUniformPriceAuction(cuda=cuda)
miva = MultiUnitVickreyAuction(cuda=cuda)

device = mida.device


bids_multi_unit_0 = torch.tensor([
    [[3.00, 2.00, 1.00],
     [3.70, 2.00, 0.00],
     [3.60, 2.99, 1.99]
    ],
    [[1.02, 1.01, 1.00],
     [1.01, 0.99, 0.93],
     [0.99, 0.95, 0.93]
    ],
    [[4.0, 3.0, 2.0],
     [1.0, 0.9, 0.0],
     [1.5, 1.1, 1.0]
    ]], device = device)

bids_multi_unit_0_allocations = torch.tensor([
    [[1., 0., 0.],
     [1., 0., 0.],
     [1., 0., 0.]
    ],
    [[1., 1., 0.],
     [1., 0., 0.],
     [0., 0., 0.]
    ],
    [[1., 1., 1.],
     [0., 0., 0.],
     [0., 0., 0.]
    ]], device = device)

bids_multi_unit_1 = torch.tensor([
    [[3.00, 2.00, 1.00, 1.00],
     [3.70, 2.00, 0.00, 0.00],
     [3.60, 2.99, 1.99, 1.00]
    ],
    [[1.02, 1.01, 1.00, 0.50],
     [1.01, 0.99, 0.93, 0.00],
     [0.99, 0.95, 0.93, 0.50]
    ]], device = device)

bids_multi_unit_1_allocations = torch.tensor([
    [[1., 0., 0., 0.],
     [1., 0., 0., 0.],
     [1., 1., 0., 0.]
    ],
    [[1., 1., 1., 0.],
     [1., 0., 0., 0.],
     [0., 0., 0., 0.]
    ]], device = device)


[docs]def test_mida_correctness(): """Test of allocation and payments in MultiUnitDiscriminatoryAuction.""" # test 0 allocations, payments = mida.run(bids_multi_unit_0) assert torch.equal(allocations, bids_multi_unit_0_allocations) assert torch.equal(payments, torch.tensor( [[3.0000, 3.7000, 3.6000], [2.0300, 1.0100, 0.0000], [9.0000, 0.0000, 0.0000]], device = payments.device)) # test 1 allocations, payments = mida.run(bids_multi_unit_1) assert torch.equal(allocations, bids_multi_unit_1_allocations) assert torch.equal(payments, torch.tensor( [[3.0000, 3.7000, 6.5900], [3.0300, 1.0100, 0.0000]], device = payments.device))
[docs]def test_miup_correctness(): """Test of allocation and payments in MultiUnitUniformPriceAuction.""" # test 0 allocations, payments = miup.run(bids_multi_unit_0) assert torch.equal(allocations, bids_multi_unit_0_allocations) assert torch.equal(payments, torch.tensor( [[2.9900, 2.9900, 2.9900], [2.0000, 1.0000, 0.0000], [4.5000, 0.0000, 0.0000]], device = payments.device)) # test 1 allocations, payments = miup.run(bids_multi_unit_1) assert torch.equal(allocations, bids_multi_unit_1_allocations) assert torch.equal(payments, torch.tensor( [[2.0000, 2.0000, 4.0000], [2.9700, 0.9900, 0.0000]], device = payments.device))
[docs]def test_miva_correctness(): """Test of allocation and payments in MultiUnitVickreyAuction.""" # test 0 allocations, payments = miva.run(bids_multi_unit_0) assert torch.equal(allocations, bids_multi_unit_0_allocations) assert torch.equal(payments, torch.tensor( [[2.9900, 2.9900, 2.0000], [1.9800, 1.0000, 0.0000], [3.6000, 0.0000, 0.0000]], device = payments.device)) # test 1 allocations, payments = miva.run(bids_multi_unit_1) assert torch.equal(allocations, bids_multi_unit_1_allocations) assert torch.equal(payments, torch.tensor( [[2.0000, 2.0000, 4.0000], [2.9300, 0.9900, 0.0000]], device = payments.device))