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)
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"
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)
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)
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)
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)
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")
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"])
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")
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")
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")
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")
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)
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")
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)
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)
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")
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)
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"])
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)