def make_param(ans_str, att_str, variable_list={}):
    """
    input: answer string, attemp string,
    optional input: variable dictionary {'variable_name':value to test, 'variable_name2':value}
    return: list of dict with format
        'user_id':d['user_id'],'answer':d['answer'], 'attempt':d['attempt'],
        'ans_tree':eval_tree,'att_tree':eval_tree_att
    """

    parse_tree = webwork_parser.parse_webwork(ans_str)
    if parse_tree[0] == None:
        print 'parse_tree empty'
        return {}
    eval_tree = Eval_parsed.eval_parsed(parse_tree[0], variable_list)
    if eval_tree == None:
        print 'eval_tree empty'
        return {}

    parse_tree_att = webwork_parser.parse_webwork(att_str)
    if parse_tree_att[0] == None:
        print 'parse_tree empty'
        return {}
    eval_tree_att = Eval_parsed.eval_parsed(parse_tree_att[0], variable_list)
    if eval_tree_att == None:
        print 'eval_tree empty'
        return {}

    params = {'answer':ans_str, 'attempt':att_str, 'ans_tree':eval_tree, 'att_tree':eval_tree_att}

    return params
def make_params(problem_id, part_id, problem_part_collection, variable_list={}):
    """return list of dict with format
    'user_id':d['user_id'],'answer':d['answer'], 'attempt':d['attempt'],
    'ans_tree':eval_tree,'att_tree':eval_tree_att"""
    params = []
    count = 0
    for d in problem_part_collection[problem_id,part_id]:
        print '\r',count,
        count += 1
        if d['answer']:
            parse_tree = webwork_parser.parse_webwork(d['answer'])
            if parse_tree[0] == None:
                print 'parse_tree empty'
                continue
            eval_tree = Eval_parsed.eval_parsed(parse_tree[0], variable_list)
            if eval_tree == None:
                print 'eval_tree empty'
                continue

            parse_tree_att = webwork_parser.parse_webwork(d['attempt'])
            if parse_tree_att[0] == None:
                print 'parse_tree empty'
                continue
            eval_tree_att = Eval_parsed.eval_parsed(parse_tree_att[0], variable_list)
            if eval_tree_att == None:
                print 'eval_tree empty'
                continue

            params += [{'user_id':d['user_id'], 'user_var':d['var'], 'timestamp':d['timestamp'], 'answer':d['answer'], 'attempt':d['attempt'],
                        'ans_tree':eval_tree, 'att_tree':eval_tree_att}]
        else:
            print 'no answer'
    return params
def show_matching_group_w_variables(ans_str, att_str, variable_values, test_all=False):
    matches = find_matches_w_variables(ans_str, att_str, variable_values, test_all)
    parse_tree_att = webwork_parser.parse_webwork(att_str)
    matching_exps = []
    if parse_tree_att[0] == None:
        print 'parse_tree empty'
        return None
    if matches:
        for m in matches:
            tree_index = [int(i)+1 for i in m[0].split('.')[1:]]
            node = parse_tree_att[0]
            for t in tree_index:
                print node
                print t
                node = node[t]
            matching_exps.append(att_str[node[0][1][0]:node[0][1][1]+1])
        return matching_exps
    else:
        return None