Example #1
0
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}.")
Example #2
0
def test_ids(
        formula_data: Data, formulas: Iterable[str],
        build_columns: Callable[[Mapping[str, Array]],
                                Sequence[Array]]) -> None:
    """Test that equivalent formulas build IDs as expected."""

    # create convenience columns of tuples of categorical variables
    formula_data = copy.deepcopy(formula_data)
    for (key1, values1), (key2, values2), (key3, values3) in itertools.product(
            formula_data.items(), repeat=3):
        key12 = f'{key1}{key2}'
        key123 = f'{key1}{key2}{key3}'
        if key12 not in formula_data:
            values12 = np.empty_like(values1, np.object_)
            values12[:] = list(zip(values1, values2))
            formula_data[key12] = values12
        if key123 not in formula_data:
            values123 = np.empty_like(values1, np.object_)
            values123[:] = list(zip(values1, values2, values3))
            formula_data[key123] = values123

    # build and compare columns for each formula, making sure that it can be formatted
    for absorb in formulas:
        formulation = Formulation('x', absorb)
        assert str(formulation)
        ids = formulation._build_ids(formula_data)
        expected_ids = np.column_stack(build_columns(formula_data))
        np.testing.assert_array_equal(ids, expected_ids, err_msg=absorb)