def METHOD_NAME(
    input_infos: List[ModelInputInfo],
    with_input_tracing=False,
    wrap_inputs_fn=None,
    wrap_outputs_fn=None,
    with_output_tracing=False,
):
    def default_dummy_forward_fn(model):
        from nncf.torch.dynamic_graph.io_handling import replicate_same_tensors  # pylint: disable=cyclic-import
        from nncf.torch.dynamic_graph.io_handling import (
            wrap_nncf_model_inputs_with_objwalk,  # pylint: disable=cyclic-import
        )
        from nncf.torch.dynamic_graph.io_handling import (
            wrap_nncf_model_outputs_with_objwalk,  # pylint: disable=cyclic-import
        )
        device = get_model_device(model)
        args_list = [create_mock_tensor(info, device) for info in input_infos if info.keyword is None]
        kwargs = OrderedDict()
        for info in input_infos:
            if info.keyword is not None:
                kwargs[info.keyword] = create_mock_tensor(info, device)
        args = tuple(args_list)
        if with_input_tracing:
            if wrap_inputs_fn is None:
                # We control the input argument structure w.r.t. tensors
                # - a simple objwalk application should be sufficient in this simple case.
                # For more control, wrap_inputs_fn is used when this is used in NNCFNetwork
                # which is guaranteed to be the same as during the actual NNCFNetwork.forward
                args, kwargs = wrap_nncf_model_inputs_with_objwalk(args, kwargs)
            else:
                args, kwargs = wrap_inputs_fn(args, kwargs)
        retval = model(*args, **kwargs)
        if with_output_tracing:
            retval = replicate_same_tensors(retval)
            if wrap_outputs_fn is not None:
                return wrap_outputs_fn(retval)
            return wrap_nncf_model_outputs_with_objwalk(retval)
        return retval
    return default_dummy_forward_fn