def METHOD_NAME(lbann):
    """Construct LBANN model.
    Args:
        lbann (module): Module for LBANN Python frontend
    """
    # ------------------------------------------
    # NumPy implementation
    # ------------------------------------------
    # Compute Kronecker factors
    x = _samples[:,:_in_size]
    dy = _samples[:,-_out_size:] / _num_samples
    A = np.matmul(x.T, x)
    G = np.matmul(dy.T, dy)
    # Apply one K-FAC step
    w = np.ones((_out_size, _in_size))
    dw = np.matmul(dy.T, x)
    dw = np.linalg.solve(A.T, dw.T).T
    dw = np.linalg.solve(G, dw)
    # Gradient Clipping
    w_grads_scaling = np.dot(dw.reshape(-1),dw.reshape(-1))
    w_grads_scaling_factor = min(1.0, math.sqrt(0.001/w_grads_scaling))
    dw = dw * w_grads_scaling_factor
    w_next = w - dw
    # ------------------------------------------
    # Basic model with conv layer
    # ------------------------------------------
    # Inputs and error signals are from data reader
    input_ = lbann.Input(data_field='samples')
    input_slice = lbann.Slice(input_, slice_points=[0,_in_size,_in_size+_out_size])
    x = lbann.Reshape(input_slice, dims=[-1,1,1])
    dy = lbann.Reshape(input_slice, dims=[-1,1,1])
    # Convolution layer
    w = lbann.Weights(
        initializer=lbann.ConstantInitializer(value=1),
        optimizer=lbann.SGD(learn_rate=1),
    )
    y = lbann.Convolution(
        x,
        weights=w,
        num_dims=2,
        out_channels=_out_size,
        groups=1,
        kernel_size=1,
        padding=0,
        stride=1,
        dilation=1,
        has_bias=False,
    )
    obj = lbann.Reduction(lbann.Multiply(y, dy))
    # ------------------------------------------
    # Metric checking
    # ------------------------------------------
    # Extract weights entries
    w = lbann.WeightsLayer(
        weights=w,
        dims=[_out_size,_in_size,1,1],
    )
    w = lbann.Slice(
        lbann.Reshape(w, dims=[-1]),
        slice_points=range(_out_size*_in_size+1),
    )
    w = [lbann.Identity(w) for _ in range(_out_size*_in_size)]
    # Metric checking with values from NumPy implementation
    metrics= []
    callbacks = []
    tol = 8 * np.finfo(np.float32).eps
    for i in range(_out_size*_in_size):
        val = w_next.flatten()[i]
        metrics.append(lbann.Metric(w[i], name=f'w[{i}]'))
        callbacks.append(lbann.CallbackCheckMetric(
            metric=metrics[-1].name,
            lower_bound=val-tol,
            upper_bound=val+tol,
            error_on_failure=True,
            execution_modes='test'))
    # ------------------------------------------
    # Construct model
    # ------------------------------------------
    num_epochs = 1
    return lbann.Model(
        num_epochs,
        layers=lbann.traverse_layer_graph([input_] + w),
        objective_function=obj,
        metrics=metrics,
        callbacks=callbacks,
    )