Beispiel #1
0
def test_large_diffs():
    # Test situations where free energy differences are very large
    A = np.array([
        [1.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [0.0, 1.0, 0.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 1.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 0.0, 1.0, 1.0, 1.0],
    ])
    G = np.array([0.0, 40, 40, 40, -2000, -2050])
    x0 = np.array([[1e-6, 1e-6, 1e-6, 1e-6, 0, 0]])
    logx = eqtk.solve(c0=x0,
                      A=A,
                      G=G,
                      G_units=None,
                      units=None,
                      return_log=True)
    assert eqtk.eqcheck(logx, x0, A=A, G=G, c_as_log=True)

    A = np.array([
        [1.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [0.0, 1.0, 0.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 1.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 0.0, 1.0, 1.0, 1.0],
    ])
    G = np.array([0.0, 40, 40, 40, -2100, -2100])
    x0 = np.array([[1e-6, 1e-6, 1e-6, 1.0001e-6, 0, 0]])
    logx = eqtk.solve(c0=x0,
                      A=A,
                      G=G,
                      G_units=None,
                      units=None,
                      return_log=True)
    assert eqtk.eqcheck(logx, x0, A=A, G=G, c_as_log=True)

    A = np.array([
        [1.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [0.0, 1.0, 0.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 1.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, 0.0, 1.0, 1.0, 1.0],
    ])
    G = np.array([0.0, 40, 150, 200, -4200, -4215])
    x0 = np.array([[1e-6, 1e-6, 1e-6, 1.0000e-6, 0, 0]])
    logx = eqtk.solve(c0=x0,
                      A=A,
                      G=G,
                      G_units=None,
                      units=None,
                      return_log=True)
    assert eqtk.eqcheck(logx, x0, A=A, G=G, c_as_log=True)
Beispiel #2
0
    def compute_eq(G, x0):
        hypothesis.assume(not (np.isnan(x0).any() or np.isnan(G).any()))
        x = eqtk.solve(x0, A=A, G=G)

        eq_check, cons_check = eqtk.eqcheck(x, x0, A=A, G=G)
        assert np.isclose(eq_check, 1.0).all(), "Equilibrium error"
        assert np.isclose(cons_check, 1.0).all(), "Conservation of mass error"
Beispiel #3
0
def test_small_conc_failure():
    A = np.array(
        [
            [1.0, 0.0, 1.0, 1.0, 0.0],
            [1.0, 1.0, 0.0, 0.0, 2.0],
            [1.0, 0.0, 0.0, 1.0, 2.0],
        ]
    )
    G = np.array(
        [
            -1.1323012373599138e02,
            -2.7028447814426110e-01,
            -2.3382656193096754e01,
            -1.0088531260804201e02,
            -5.7676558386243052e01,
        ]
    )
    x0 = np.array(
        [
            [
                1.8134373707286439e-08,
                3.5913242229740680e-14,
                3.5913242229740680e-14,
                3.5913242229740680e-14,
                1.7956621114870340e-14,
            ]
        ]
    )
    x = eqtk.solve(c0=x0, A=A, G=G)
    assert eqtk.eqcheck(x, x0, A=A, G=G)
Beispiel #4
0
def test_past_failure_2():
    N = np.array([[-2.0, 1.0, 0.0, 0.0], [-3.0, 0.0, 1.0, 0.0], [-4.0, 0.0, 0.0, 1.0]])
    minus_log_K = np.array([-43.66660344, -68.14676841, -92.28023823])
    x0 = np.array([[1.87852623e-06, 3.75705246e-06, 1.25235082e-06, 4.69631557e-07]])
    K = np.exp(-minus_log_K)
    x = eqtk.solve(x0, N, K)
    assert eqtk.eqcheck(x, x0, N, K)
def check_test_case(tc):
    A = np.array(tc["A"]).transpose()
    G = -np.array(tc["g"])
    x0 = np.array(tc["x0"])

    # Remove infinities
    infs = np.isinf(G)
    A = A[:, ~infs]
    G = G[~infs]
    x0 = x0[~infs]

    x = eqtk.solve(c0=x0, A=A, G=G)
    assert eqtk.eqcheck(x, x0, A=A, G=G)

    x = eqtk.solve(c0=x0, A=A, G=G, normal_A=False)
    assert eqtk.eqcheck(x, x0, A=A, G=G)
Beispiel #6
0
def test_spontaneous_production_failure():
    N = np.array(
        [[1, 0, 1, 0, -1, 0], [1, 0, 0, 1, 0, -1], [1, 1, 1, 0, 0, 0]], dtype=float
    )

    A = np.array(
        [[0, 0, 0, 1, 0, 1], [1, 0, -1, 0, 0, 1], [0, -1, 1, 0, 1, 0]], dtype=float
    )

    G = np.array([0, 1, 2, 3, 4, 5])
    K = np.exp(-np.dot(N, G))

    for x0_val in [
        [1, 1, 1, 1, 1, 1],
        [0, 0, 0, 1, 0, 0],
        [1, 1, 1, 1, 0, 0],
        [0, 0, 0, 0, 0, 0],
    ]:
        x0 = np.array(x0_val, dtype=float)
        x_NK = eqtk.solve(c0=x0, N=N, K=K)

        with pytest.raises(ValueError) as excinfo:
            x_AG = eqtk.solve(c0=x0, A=A, G=G)
        excinfo.match("`A` must have all nonnegative entries.")

        assert eqtk.eqcheck(x_NK, x0, N=N, K=K)
Beispiel #7
0
def test_competition():
    N = np.array([[1, 1, 0, -1, 0], [1, 0, 1, 0, -1]])
    K = np.array([0.05, 0.01])
    x0 = np.array([2.0, 0.05, 1.0, 0.0, 0.0])

    x = eqtk.solve(c0=x0, N=N, K=K, units="µM")

    assert eqtk.eqcheck(x, x0, N, K)
Beispiel #8
0
def test_binary_binding_3():
    N = np.array([[-1, -1, 1]])
    K = np.array([2e3])
    A = np.array([[1, 0, 1], [0, 1, 1]])
    G = np.array([0, 0, -np.log(K)])
    x0 = np.array([3e-3, 5e-3, 0.0])
    x = eqtk.solve(c0=x0, N=N, K=K, units="M")

    assert eqtk.eqcheck(x, x0, N, K, units="M")
Beispiel #9
0
def test_random_cases(n_random_test_cases=200,
                      max_particles=4,
                      max_compound_size=5):
    # Generate list of random test cases
    random_test_cases = []
    for i in range(n_random_test_cases):
        n_parts = np.random.randint(1, max_particles)
        max_cmp_size = np.random.randint(1, max_compound_size + 1)
        random_test_cases.append(
            eqtk.testcases.random_elemental_test_case(n_parts, max_cmp_size))

    for tc in random_test_cases:
        c_NK = eqtk.solve(c0=tc["c0"], N=tc["N"], K=tc["K"])
        c_AG = eqtk.solve(c0=tc["c0"], A=tc["A"], G=tc["G"])
        assert np.allclose(c_NK, tc["c"])
        assert np.allclose(c_AG, tc["c"])
        assert eqtk.eqcheck(c_NK, tc["c0"], tc["N"], tc["K"])
        assert eqtk.eqcheck(c_AG, tc["c0"], A=tc["A"], G=tc["G"])
Beispiel #10
0
def test_example_4():
    rxns = """
    AB <=> A + B ; 0.015
    AC <=> A + C ; 0.003
    """
    N = eqtk.parse_rxns(rxns)
    c0 = {"A": 1.0, "B": 0.5, "C": 0.25, "AB": 0, "AC": 0}
    c = eqtk.solve(c0, N, units="mM")

    assert eqtk.eqcheck(c, c0, N=N, units="mM")
Beispiel #11
0
def test_example_3():
    N = np.array([
        [-1, -1, -1, 1, 1, 0, 0],
        [-1, 0, 0, 0, 0, -1, 1],
        [-1, 1, 1, 0, -1, 0, 0],
        [0, 1, -1, 0, -1, 1, 0],
    ])
    K = np.array([1.0, 2.0, 3.0, 5.0])
    x0 = np.array([1.0, 2.0, 3.0, 5.0, 7.0, 11.0, 13.0])
    x = eqtk.solve(c0=x0, N=N, K=K, units="M")

    assert eqtk.eqcheck(x, x0, N, K, units="M")
Beispiel #12
0
def test_binary_binding_5():
    N = np.array([[-2, 0, 1, 0, 0], [-1, -1, 0, 1, 0], [0, -2, 0, 0, 1]])
    K = np.array([2e4, 3e4, 8e3])
    x0_1 = np.array([3e-4, 5e-5, 0, 0, 0])
    x0_2 = np.array([0, 0, 1.5e-4, 0, 2.5e-5])
    x0_3 = np.array([7e-5, 1e-5, 1.0e-4, 3e-5, 5e-6])
    x0 = np.vstack((x0_1, x0_2, x0_3))
    A = np.array([[1, 0, 2, 1, 0], [0, 1, 0, 1, 2]])

    x = eqtk.solve(c0=x0, N=N, K=K, units="M")

    assert eqtk.eqcheck(x, x0, N=N, K=K, units="M")
Beispiel #13
0
def test_exponential_chain():
    n_rxns = 20
    N = np.diag(np.ones(n_rxns), 1)[:-1, :]
    np.fill_diagonal(N, -1)
    N[0, 0] = -2
    N[1:, 0] = -1
    K = 100.0 * np.ones(n_rxns)
    c0 = np.zeros((50, n_rxns + 1))
    c0[:, 0] = np.linspace(0.0, 10.0, 50)

    c = eqtk.solve(c0, N=N, K=K, units="M")

    assert eqtk.eqcheck(c, c0, N=N, K=K, units="M")
Beispiel #14
0
def test_sequential_binding():
    N = np.array([[-1, -1, 1, 0, 0], [0, -1, -1, 1, 0], [0, -1, 0, -1, 1]])
    K = np.array([50.0, 10.0, 40.0])
    c0 = np.array([0.006, 0.003, 0.0, 0.0, 0.0])
    titrated_species = 1
    c0_titrated = np.linspace(0.0, 0.01, 50)

    c0 = np.array([c0 for _ in range(len(c0_titrated))])
    c0[:, titrated_species] = c0_titrated

    c = eqtk.solve(c0, N=N, K=K, units="M")

    assert eqtk.eqcheck(c, c0, N=N, K=K)
Beispiel #15
0
def test_example_1():
    N = np.array([
        [-1, 0, 1, 0, 0, 0],
        [-1, -1, 0, 1, 0, 0],
        [0, -2, 0, 0, 1, 0],
        [0, -1, -1, 0, 0, 1],
    ])
    K = np.array([50.0, 10.0, 40.0, 100.0])
    x0 = np.array([[0.001, 0.003, 0.0, 0.0, 0.0, 0.0],
                   [0.001, 0.0, 0.0, 0.0, 0.0, 0.0]])

    x = eqtk.solve(c0=x0, N=N, K=K, units="M")

    assert eqtk.eqcheck(x, x0, N, K, units="M")
Beispiel #16
0
def test_past_failure_1():
    A = np.array([[1.0, 0.0, 2.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0, 2.0]])
    G = np.array([0.0, 0.0, -16.76857677, -2.38430181, 1.22028775])
    x0 = np.array(
        [
            [
                1.65989040e-10,
                1.07630096e-04,
                1.65989040e-10,
                1.65989040e-10,
                5.38150479e-05,
            ]
        ]
    )
    x = eqtk.solve(x0, A=A, G=G)
    assert eqtk.eqcheck(x, x0, A=A, G=G)
Beispiel #17
0
def test_scale_factor_failure():
    A = np.array([[1.0, 0.0, 2.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0, 2.0]])
    G = np.array([0.0, 0.0, 0.77428976, -5.64873697, -0.95863043])
    x0 = np.array(
        [
            [
                5.50293892e-05,
                6.49273515e-08,
                2.75796219e-05,
                1.29854703e-07,
                3.24636758e-08,
            ]
        ]
    )
    x = eqtk.solve(c0=x0, A=A, G=G)
    assert eqtk.eqcheck(x, x0, A=A, G=G)
Beispiel #18
0
def test_phosphoric_acid_titration():
    N = np.array([
        [1, 0, -1, 1, 0, 0],
        [1, 0, 0, -1, 1, 0],
        [1, 0, 0, 0, -1, 1],
        [1, 1, 0, 0, 0, 0],
    ])
    K = np.array([10**(-2.15), 10**(-7.2), 10**(-12.15), 1e-14])
    c0 = np.array([0.0, 0.0, 0.001, 0.0, 0.0, 0.0])
    c0_titrant = np.array([0.0, 0.001, 0.0, 0.0, 0.0, 0.0])
    vol_titrant = np.linspace(0.0, 4.0, 100)
    c = eqtk.volumetric_titration(c0,
                                  c0_titrant,
                                  vol_titrant,
                                  N=N,
                                  K=K,
                                  units="M")

    new_c0 = eqtk.solvers._volumetric_to_c0(c0, c0_titrant, vol_titrant)

    assert eqtk.eqcheck(c, new_c0, N=N, K=K, units="M")
Beispiel #19
0
def test_eqcheck_simple_binding_multiple_inputs(input_tuple):
    cA0_0, cB0_0, cA0_1, cB0_1, cA0_2, cB0_2, Kd = input_tuple

    tc_0 = eqtk.testcases.simple_binding(cA0_0, cB0_0, Kd)
    tc_1 = eqtk.testcases.simple_binding(cA0_0, cB0_0, Kd)
    tc_2 = eqtk.testcases.simple_binding(cA0_0, cB0_0, Kd)

    c_df = pd.concat(
        (
            tc_0["c_series"].to_frame().transpose(),
            tc_1["c_series"].to_frame().transpose(),
            tc_2["c_series"].to_frame().transpose(),
        )
    )

    c_df_log = pd.concat(
        (
            tc_0["c_series_log"].to_frame().transpose(),
            tc_1["c_series_log"].to_frame().transpose(),
            tc_2["c_series_log"].to_frame().transpose(),
        )
    )

    c = np.vstack((tc_0["c"], tc_1["c"], tc_2["c"]))
    c0 = np.vstack((tc_0["c0"], tc_1["c0"], tc_2["c0"]))

    N = tc_0["N"]
    K = tc_0["K"]
    N_df = tc_0["N_df"]

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c, c0, N, K, return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (3, 1)
    assert cons_check.shape == (3, 2)
    assert eq_satisfied.shape == (3, 1)
    assert cons_satisfied.shape == (3, 2)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied)
    assert np.all(cons_satisfied)
    assert eqtk.eqcheck(c, c0, N, K)

    erroneous_c = 1.0001 * c
    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        erroneous_c, c0, N, K, return_detailed=True
    )
    assert not all_ok
    assert eq_check.shape == (3, 1)
    assert cons_check.shape == (3, 2)
    assert eq_satisfied.shape == (3, 1)
    assert cons_satisfied.shape == (3, 2)
    assert not np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert not np.all(eq_satisfied)
    assert not np.all(cons_satisfied)
    assert not eqtk.eqcheck(erroneous_c, c0, N, K)

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c=c_df, N=N_df, return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (3, 1)
    assert cons_check.shape == (3, 2)
    assert eq_satisfied.shape == (3, 1)
    assert cons_satisfied.shape == (3, 2)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied)
    assert np.all(cons_satisfied)
    assert eqtk.eqcheck(c=c_df, N=N_df)

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c_df_log, N=N_df, return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (3, 1)
    assert cons_check.shape == (3, 2)
    assert eq_satisfied.shape == (3, 1)
    assert cons_satisfied.shape == (3, 2)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check with series."
    assert np.all(eq_satisfied), "Error in equilibrium check with series."
    assert np.all(cons_satisfied), "Error in conservation check with series."
    assert eqtk.eqcheck(c_df_log, N=N_df)

    c_df.loc[:, ~c_df.columns.str.contains("__0")] *= 1.0001
    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c_df, N=N_df, return_detailed=True
    )
    assert not all_ok
    assert eq_check.shape == (3, 1)
    assert cons_check.shape == (3, 2)
    assert eq_satisfied.shape == (3, 1)
    assert cons_satisfied.shape == (3, 2)
    assert not np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert not np.all(eq_satisfied)
    assert not np.all(cons_satisfied)
    assert not eqtk.eqcheck(c=c_df, N=N_df)
Beispiel #20
0
def test_eqcheck_simple_binding(input_tuple):
    cA0, cB0, Kd = input_tuple
    tc = eqtk.testcases.simple_binding(cA0, cB0, Kd)

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        tc["c"], tc["c0"], tc["N"], tc["K"], return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied), "Error in conservation check."
    assert np.all(cons_satisfied), "Error in conservation check."
    assert eqtk.eqcheck(tc["c"], tc["c0"], tc["N"], tc["K"])

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        tc["c_log"], tc["c0"], tc["N"], tc["K"], c_as_log=True, return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied), "Error in conservation check."
    assert np.all(cons_satisfied), "Error in conservation check."
    assert eqtk.eqcheck(tc["c_log"], tc["c0"], tc["N"], tc["K"], c_as_log=True)

    tc["erroneous_c"] = 1.0001 * tc["c"]
    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        tc["erroneous_c"], tc["c0"], tc["N"], tc["K"], return_detailed=True
    )
    assert not all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert not np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert not np.all(eq_satisfied), "Error in conservation check."
    assert not np.all(cons_satisfied), "Error in conservation check."
    assert not eqtk.eqcheck(tc["erroneous_c"], tc["c0"], tc["N"], tc["K"])

    tc["erroneous_c_log"] = tc["c_log"] - 0.001
    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        tc["erroneous_c_log"],
        tc["c0"],
        tc["N"],
        tc["K"],
        c_as_log=True,
        return_detailed=True,
    )
    assert not all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert not np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert not np.all(eq_satisfied), "Error in conservation check."
    assert not np.all(cons_satisfied), "Error in conservation check."
    assert not eqtk.eqcheck(
        tc["erroneous_c_log"], tc["c0"], tc["N"], tc["K"], c_as_log=True
    )

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c=tc["c_series"], N=tc["N_df"], return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied), "Error in conservation check."
    assert np.all(cons_satisfied), "Error in conservation check."
    assert eqtk.eqcheck(c=tc["c_series"], N=tc["N_df"])

    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        c=tc["c_series_log"], N=tc["N_df"], return_detailed=True
    )
    assert all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert np.all(eq_satisfied), "Error in conservation check."
    assert np.all(cons_satisfied), "Error in conservation check."
    assert eqtk.eqcheck(c=tc["c_series_log"], N=tc["N_df"])

    tc["c_series"][~tc["c_series"].index.str.contains("__0")] *= 1.0001
    all_ok, eq_check, eq_satisfied, cons_check, cons_satisfied = eqtk.eqcheck(
        tc["c_series"], N=tc["N_df"], return_detailed=True
    )
    assert not all_ok
    assert eq_check.shape == (1,)
    assert cons_check.shape == (2,)
    assert eq_satisfied.shape == (1,)
    assert cons_satisfied.shape == (2,)
    assert not np.allclose(eq_check, 1.0), "Error in equilibrium check."
    assert not np.all(eq_satisfied), "Error in conservation check."
    assert not np.all(cons_satisfied), "Error in conservation check."
    assert not eqtk.eqcheck(c=tc["c_series"], N=tc["N_df"])
Beispiel #21
0
def test_large():
    # fmt: off
    A = np.array([
        [
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            3.0,
            2.0,
            2.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            4.0,
            3.0,
            3.0,
            3.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            2.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
        ],
        [
            1.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            3.0,
            2.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            3.0,
            2.0,
            2.0,
            2.0,
            1.0,
            2.0,
            1.0,
            1.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            2.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            4.0,
            3.0,
            3.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            2.0,
            1.0,
            1.0,
            1.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
        ],
        [
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            2.0,
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            2.0,
            1.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            2.0,
            1.0,
            1.0,
            0.0,
            3.0,
            2.0,
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            2.0,
            1.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            2.0,
            0.0,
            1.0,
            0.0,
            2.0,
            1.0,
            1.0,
            2.0,
            1.0,
            2.0,
            3.0,
            2.0,
            1.0,
            2.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            2.0,
            1.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            2.0,
            1.0,
            1.0,
            0.0,
            2.0,
            1.0,
            3.0,
            2.0,
            2.0,
            1.0,
            0.0,
            2.0,
            1.0,
            1.0,
            0.0,
            4.0,
            3.0,
            2.0,
            2.0,
            1.0,
            0.0,
        ],
        [
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            2.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            1.0,
            1.0,
            2.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            1.0,
            2.0,
            0.0,
            1.0,
            2.0,
            3.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            1.0,
            1.0,
            2.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            1.0,
            2.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            1.0,
            1.0,
            1.0,
            2.0,
            2.0,
            1.0,
            1.0,
            2.0,
            1.0,
            1.0,
            2.0,
            2.0,
            2.0,
            3.0,
            0.0,
            0.0,
            1.0,
            0.0,
            1.0,
            1.0,
            2.0,
            0.0,
            1.0,
            0.0,
            1.0,
            1.0,
            2.0,
            2.0,
            1.0,
            2.0,
            2.0,
            3.0,
            0.0,
            1.0,
            2.0,
            2.0,
            3.0,
            4.0,
        ],
    ])
    # fmt: on
    G = np.array([
        -4.2015367534032657e02,
        -1.2703232169812192e02,
        -5.4817682865924418e01,
        -7.8102170476565016e00,
        -5.0193490507510681e01,
        -2.7165182426095953e02,
        -2.2879300425908158e02,
        -1.4323976440450812e02,
        -1.8958975769447511e02,
        -1.4124781488205676e02,
        -8.6673976923205487e01,
        -2.0133236499415651e02,
        -3.2653642782462079e01,
        -6.7053699416077549e01,
        -1.1963351823998251e02,
        -4.1489422124390160e02,
        -3.7341204386611190e02,
        -2.8870092306527079e02,
        -3.3220415271165064e02,
        -2.9702434984420739e02,
        -2.6053825202585415e02,
        -3.8323486406656087e02,
        -2.3501213478769949e02,
        -1.6877304869504263e02,
        -2.0824653925915831e02,
        -3.3590996661662558e02,
        -2.0520012341497807e02,
        -2.5971699676849943e02,
        -2.1094947752425242e02,
        -1.7385165483988780e02,
        -2.8773765389188344e02,
        -1.0538997980893089e02,
        -2.3825117626792220e02,
        -2.2061630240883488e02,
        -2.6763222147566859e02,
        -4.4752134398923594e01,
        -9.1402458513709178e01,
        -1.3718133395724152e02,
        -1.8524123876379437e02,
        -5.5865029666144483e02,
        -5.1489457397372496e02,
        -4.3343826706414734e02,
        -4.7510981508132687e02,
        -4.5612936186968261e02,
        -4.0516544010432943e02,
        -5.2786658540528890e02,
        -3.7963121373685630e02,
        -3.1423591441078139e02,
        -3.5051515988808501e02,
        -4.8060673985504400e02,
        -3.4836654223951467e02,
        -4.0233100683437743e02,
        -4.7197688702079347e02,
        -3.9381231460595689e02,
        -5.1781246568902998e02,
        -3.8326654234796888e02,
        -3.2915592514831127e02,
        -4.4917341152776635e02,
        -3.2983630637315213e02,
        -2.7921350085332392e02,
        -4.4497398982119728e02,
        -3.9412684034275190e02,
        -4.4928628483319653e02,
        -3.0552056600426687e02,
        -3.4915651913700128e02,
        -3.1294557706150187e02,
        -2.6675738226782761e02,
        -3.8945399430852598e02,
        -2.6054781451352403e02,
        -1.8459981759035912e02,
        -2.3377960947381828e02,
        -3.7152431456702061e02,
        -2.2687638301116129e02,
        -2.7837400045836358e02,
        -3.9842931333298338e02,
        -4.2796378507687069e02,
        -3.6698879215177789e02,
        -4.3182337303644073e02,
        -3.5519390403130399e02,
        -2.3065815130972845e02,
        -2.7657722516245099e02,
        -4.0100240632810880e02,
        -2.7532513340609239e02,
        -3.2497380477812760e02,
        -2.9620693634022933e02,
        -2.4460174120284984e02,
        -3.5701620136122949e02,
        -1.9255737553808018e02,
        -3.2465646516596814e02,
        -3.0321729265725014e02,
        -4.1421271587576661e02,
        -2.0506920063988736e02,
        -3.1964834666572102e02,
        -1.2588463387721514e02,
        -2.5691105508367849e02,
        -2.5753511368260058e02,
        -3.0307716707347032e02,
        -4.3284119923642481e02,
        -2.4211326870787389e02,
        -2.9484362717015421e02,
        -2.8668170416631432e02,
        -3.3775513541674047e02,
        -6.9179245072223310e01,
        -1.0595181053210460e02,
        -1.6153764121002649e02,
        -1.5335633483058461e02,
        -2.0267567033456882e02,
        -2.5467945122971807e02,
    ])
    x0 = np.array([[
        1.8134373707286439e-08,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        8.9783105574351699e-15,
        1.1971080743246893e-14,
        1.1971080743246893e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        3.5913242229740680e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        8.9783105574351699e-15,
        1.1971080743246893e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        8.9783105574351699e-15,
        1.1971080743246893e-14,
        1.7956621114870340e-14,
        1.7956621114870340e-14,
        1.1971080743246893e-14,
        8.9783105574351699e-15,
    ]])
    x = eqtk.solve(c0=x0, A=A, G=G)
    assert eqtk.eqcheck(x, x0, A=A, G=G)