def METHOD_NAME(y2_exponent, dt, time_integrator, lam):
    '''
    Function which actually runs MOOSE.
    '''
    command_line_args = ['../../../moose_test-opt', '-i', 'stiff.i',
                         'Executioner/dt={}'.format(dt),
                         'Executioner/dtmin={}'.format(dt),
                         'Executioner/TimeIntegrator/type={}'.format(time_integrator),
                         'LAMBDA={}'.format(lam),
                         'Y2_EXPONENT={}'.format(y2_exponent)]
    try:
        child = subprocess.Popen(command_line_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        # communicate() waits for the process to terminate, so there's no
        # need to wait() for it.  It also sets the returncode attribute on
        # child.
        (stdoutdata, stderrdata) = child.communicate()
        if (child.returncode != 0):
            print('Running MOOSE failed: program output is below:')
            print(stdoutdata)
            raise
    except:
        print('Error executing moose_test')
        sys.exit(1)
    # Parse the last line of the output file to get the error at the final time.
    #
    # The columns are in alphabetical order, we want to look at
    # "max_error_y1", which is the "stiff" component of the system of
    # ODEs.
    # The columns are currently given by:
    # time,error_y1,error_y2,max_error_y1,max_error_y2,value_y1,value_y1_abs_max,value_y2,value_y2_abs_max,y1,y2
    output_filename = 'stiff_out.csv'
    last_row = get_last_row(output_filename)
    max_error_y1 = float(last_row[3])
    value_y1_abs_max = float(last_row[6])
    normalized_error = max_error_y1 / value_y1_abs_max
    return normalized_error