def test_invalid_formulas(formula_data, exception, formula, absorb): """Test that an invalid formula gives rise to an exception.""" try: formulation = Formulation(formula, absorb) formulation._build_matrix(formula_data) if absorb is not None: formulation._build_ids(formula_data) except exception: print(traceback.format_exc()) return raise RuntimeError(f"Successful formulation: {formulation}.")
def test_matrices( formula_data: Data, formulas: Iterable[str], build_columns: Callable[[Mapping[str, Array]], Sequence[Array]], build_derivatives: Callable[[Mapping[str, Array]], Sequence[Array]]) -> None: """Test that equivalent formulas build columns and derivatives as expected. Take derivatives with respect to x.""" # construct convenience columns of ones and zeros ones = np.ones_like(formula_data['x']) zeros = np.zeros_like(formula_data['x']) # build columns and derivatives for each formula, making sure that it can be formatted for formula in formulas: formulation = Formulation(formula) assert str(formulation) matrix, column_formulations, underlying_data = formulation._build_matrix(formula_data) evaluated_matrix = np.column_stack([ones * f.evaluate(underlying_data) for f in column_formulations]) derivatives = np.column_stack([ones * f.evaluate_derivative('x', underlying_data) for f in column_formulations]) # build expected columns and derivatives supplemented_data = {'1': ones, '0': zeros, **underlying_data} expected_matrix = np.column_stack(build_columns(supplemented_data)) expected_derivatives = np.column_stack(build_derivatives(supplemented_data)) # compare columns and derivatives np.testing.assert_allclose(matrix, expected_matrix, rtol=0, atol=1e-14, err_msg=formula) np.testing.assert_allclose(matrix, evaluated_matrix, rtol=0, atol=1e-14, err_msg=formula) np.testing.assert_allclose(derivatives, expected_derivatives, rtol=0, atol=1e-14, err_msg=formula)