There's not much more to say than the title states. I found a 20 DB layout for which QuickExact gives 0 physically valid layouts, while the 21 charge configurations in the "how to reproduce" section are actually physically valid as judged by charge_distribution_surface
standard functionality. I suspect the presence of positive charges here brings up an issue. I'm very much curious to hear what the problem here is when the issue is discovered.
To be sure there is no issue with (physical) parameters, I have specified them explicitly, although the issue is reproduced when all parameters (of charge_distribution_surface
and quickexact
) are defaulted.
You will have to take my word for that the charge configurations below are all unique (either that or check it yourself I suppose). Though even if they weren't and only one physically valid charge distribution is not detected by QuickExact, the issue claim here would still be valid.
QuickExact should find all physically valid layouts, hence also these ones. Either that or these layouts should not be judged physically valid, but I suspect the former is more likely.
Insert the following Catch2 test into a test file of choice and run it. On my systems the test passes, meaning all of these 21 charge distributions are physically valid, and QuickExact finds precisely 0 physically valid charge distributions for the same layout.
#include <fiction/algorithms/simulation/sidb/quickexact.hpp>
#include <fiction/algorithms/simulation/sidb/sidb_simulation_parameters.hpp>
#include <fiction/technology/charge_distribution_surface.hpp>
#include <fiction/types.hpp>
TEST_CASE("21 Physically valid charge distributions for the same layout not detected by QuickExact", "[quickexact]")
{
using sidb_lyt = sidb_cell_clk_lyt_siqad;
sidb_lyt lyt{};
lyt.assign_cell_type({22, 1, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({24, 2, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({23, 3, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({13, 4, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({10, 4, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({1, 5, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({0, 6, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({1, 6, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({24, 6, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({4, 6, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({3, 7, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({0, 8, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({1, 8, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({9, 9, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({24, 9, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({22, 9, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({13, 10, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({14, 10, 0}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({1, 11, 1}, sidb_lyt::cell_type::NORMAL);
lyt.assign_cell_type({17, 11, 1}, sidb_lyt::cell_type::NORMAL);
// not needed, but I'm giving all default parameters explicitly for the sake of the test
const sidb_simulation_parameters params{3, -0.32, 5.6, 5.0, 3.84, 7.68, 2.25};
charge_distribution_surface charge_lyt{lyt};
charge_lyt.assign_physical_parameters(params);
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
charge_lyt.assign_charge_state({22, 1, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 2, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({23, 3, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({13, 4, 0}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({10, 4, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 5, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({0, 6, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({1, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 6, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({4, 6, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({3, 7, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({0, 8, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 8, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({9, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({24, 9, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({22, 9, 1}, sidb_charge_state::NEUTRAL);
charge_lyt.assign_charge_state({13, 10, 0}, sidb_charge_state::POSITIVE);
charge_lyt.assign_charge_state({14, 10, 0}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({1, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.assign_charge_state({17, 11, 1}, sidb_charge_state::NEGATIVE);
charge_lyt.update_after_charge_change();
CHECK(charge_lyt.is_physically_valid());
// QuickExact finds 0 physically valid charge distributions for this layout
CHECK(quickexact(lyt,
quickexact_params<sidb_lyt>{params, quickexact_params<sidb_lyt>::automatic_base_number_detection::ON, {}, 0})
.charge_distributions.size() == 0);
}