def METHOD_NAME(border_mode):
    if aesara.config.mode == "FAST_COMPILE":
        mode = aesara.compile.mode.get_mode("FAST_RUN")
    else:
        mode = aesara.compile.mode.get_default_mode()
    Ns, Ts, C, Hs, Ws = 3, 10, 3, 32, 32
    Nf, Tf, C, Hf, Wf = 32, 5, 3, 5, 5
    signals = (
        np.arange(Ns * Ts * C * Hs * Ws).reshape(Ns, Ts, C, Hs, Ws).astype("float32")
    )
    filters = (
        np.arange(Nf * Tf * C * Hf * Wf).reshape(Nf, Tf, C, Hf, Wf).astype("float32")
    )
    # t0 = time.perf_counter()
    pyres = pyconv3d(signals, filters, border_mode)
    # print(time.perf_counter() - t0)
    s_signals = shared(signals)
    s_filters = shared(filters)
    s_output = shared(signals * 0)
    out = conv3d(
        s_signals,
        s_filters,
        signals_shape=signals.shape,
        filters_shape=filters.shape,
        border_mode=border_mode,
    )
    newconv3d = aesara.function([], [], updates={s_output: out}, mode=mode)
    check_diagonal_subtensor_view_traces(newconv3d)
    # t0 = time.perf_counter()
    newconv3d()
    # print(time.perf_counter() - t0)
    utt.assert_allclose(pyres, s_output.get_value(borrow=True))
    gsignals, gfilters = aesara.grad(out.sum(), [s_signals, s_filters])
    gnewconv3d = aesara.function(
        [],
        [],
        updates=[(s_filters, gfilters), (s_signals, gsignals)],
        mode=mode,
        name="grad",
    )
    check_diagonal_subtensor_view_traces(gnewconv3d)
    # t0 = time.perf_counter()
    gnewconv3d()
    # print("grad", time.perf_counter() - t0)
    Ns, Ts, C, Hs, Ws = 3, 3, 3, 5, 5
    Nf, Tf, C, Hf, Wf = 4, 2, 3, 2, 2
    rng = np.random.default_rng(280284)
    signals = rng.random((Ns, Ts, C, Hs, Ws)).astype("float32")
    filters = rng.random((Nf, Tf, C, Hf, Wf)).astype("float32")
    utt.verify_grad(
        lambda s, f: conv3d(s, f, border_mode=border_mode),
        [signals, filters],
        eps=1e-1,
        mode=mode,
    )
    # Additional Test that covers the case of patched implementation for filter with Tf=1
    Ns, Ts, C, Hs, Ws = 3, 10, 3, 32, 32
    Nf, Tf, C, Hf, Wf = 32, 1, 3, 5, 5
    signals = (
        np.arange(Ns * Ts * C * Hs * Ws).reshape(Ns, Ts, C, Hs, Ws).astype("float32")
    )
    filters = (
        np.arange(Nf * Tf * C * Hf * Wf).reshape(Nf, Tf, C, Hf, Wf).astype("float32")
    )
    # t0 = time.perf_counter()
    pyres = pyconv3d(signals, filters, border_mode)
    # print(time.perf_counter() - t0)
    s_signals = shared(signals)
    s_filters = shared(filters)
    s_output = shared(signals * 0)
    out = conv3d(
        s_signals,
        s_filters,
        signals_shape=signals.shape,
        filters_shape=filters.shape,
        border_mode=border_mode,
    )
    newconv3d = aesara.function([], [], updates={s_output: out}, mode=mode)
    # t0 = time.perf_counter()
    newconv3d()
    # print(time.perf_counter() - t0)
    utt.assert_allclose(pyres, s_output.get_value(borrow=True))
    gsignals, gfilters = aesara.grad(out.sum(), [s_signals, s_filters])
    gnewconv3d = aesara.function(
        [],
        [],
        updates=[(s_filters, gfilters), (s_signals, gsignals)],
        mode=mode,
        name="grad",
    )
    # t0 = time.perf_counter()
    gnewconv3d()
    # print("grad", time.perf_counter() - t0)
    Ns, Ts, C, Hs, Ws = 3, 3, 3, 5, 5
    Nf, Tf, C, Hf, Wf = 4, 1, 3, 2, 2
    signals = rng.random((Ns, Ts, C, Hs, Ws)).astype("float32")
    filters = rng.random((Nf, Tf, C, Hf, Wf)).astype("float32")
    utt.verify_grad(
        lambda s, f: conv3d(s, f, border_mode=border_mode),
        [signals, filters],
        eps=1e-1,
        mode=mode,
    )