diff --git a/src/sugar.py b/src/sugar.py index b5cecfa8d3802e2a92d54972300cee1a3891f03f..7a95a07ee42458a559f541312fc20d31551af9f4 100644 --- a/src/sugar.py +++ b/src/sugar.py @@ -38,6 +38,7 @@ from .plot import Plot __all__ = ['PS_field', 'power_analyze', 'create_power_operator', 'create_harmonic_smoothing_operator', 'from_random', 'full', 'makeField', + 'is_fieldlike', 'is_linearization', 'is_operator', 'makeDomain', 'get_signal_variance', 'makeOp', 'domain_union', 'get_default_codomain', 'single_plot', 'exec_time', 'calculate_position'] + list(pointwise.ptw_dict.keys()) @@ -526,3 +527,33 @@ def calculate_position(operator, output): kl, _ = minimizer(kl) pos = kl.position return pos + + +def is_operator(obj): + """Checks if object is operator-like. + + Note + ---- + A simple `isinstance(obj, ift.Operator)` does give the expected + result because, e.g., :class:`~nifty7.field.Field` inherits from + :class:`~nifty7.operators.operator.Operator`. + """ + return isinstance(obj, Operator) and obj.val is None and obj.jac is None + + +def is_linearization(obj): + """Checks if object is linearization-like.""" + return isinstance(obj, Operator) and obj.val is not None and obj.jac is not None + + +def is_fieldlike(obj): + """Checks if object is field-like. + + Note + ---- + A simple `isinstance(obj, ift.Field)` does give the expected + result because users might have implemented another class which + behaves field-like but is not an instance of + :class:`~nifty7.field.Field`. + """ + return isinstance(obj, Operator) and obj.val is not None and obj.jac is None diff --git a/test/test_sugar.py b/test/test_sugar.py index 61b59a47e2cca99b0cf3abd80461bdc278a24276..90d5294614a6dd8e8c44a5579a45cf61f4ab3a00 100644 --- a/test/test_sugar.py +++ b/test/test_sugar.py @@ -69,3 +69,19 @@ def test_calc_pos(mf, cplx): fld = op(0.1 * ift.from_random(op.domain, 'normal')) pos = ift.calculate_position(op, fld) ift.extra.assert_allclose(op(pos), fld, 1e-1, 1e-1) + + +def test_isinstance_helpers(): + dom = ift.RGSpace(12, harmonic=True) + op = ift.ScalingOperator(dom, 12.) + fld = ift.full(dom, 0.) + lin = ift.Linearization.make_var(fld) + assert not ift.is_fieldlike(op) + assert not ift.is_fieldlike(lin) + assert ift.is_fieldlike(fld) + assert not ift.is_linearization(op) + assert ift.is_linearization(lin) + assert not ift.is_linearization(fld) + assert ift.is_operator(op) + assert not ift.is_operator(lin) + assert not ift.is_operator(fld)