def sample_gen(args): from pytreex.core.document import Document opts, files = getopt(args, 'r:n:o:w:') num_to_generate = 1 oracle_eval_file = None fname_ttrees_out = None for opt, arg in opts: if opt == '-n': num_to_generate = int(arg) elif opt == '-o': oracle_eval_file = arg elif opt == '-w': fname_ttrees_out = arg if len(files) != 2: sys.exit(__doc__) fname_cand_model, fname_da_test = files # load model log_info('Initializing...') candgen = RandomCandidateGenerator.load_from_file(fname_cand_model) ranker = candgen tgen = SamplingPlanner({'candgen': candgen, 'ranker': ranker}) # generate log_info('Generating...') gen_doc = Document() das = read_das(fname_da_test) for da in das: for _ in xrange(num_to_generate): # repeat generation n times tgen.generate_tree(da, gen_doc) # evaluate if needed if oracle_eval_file is not None: log_info('Evaluating oracle F1...') log_info('Loading gold data from ' + oracle_eval_file) gold_trees = ttrees_from_doc(read_ttrees(oracle_eval_file), tgen.language, tgen.selector) gen_trees = ttrees_from_doc(gen_doc, tgen.language, tgen.selector) log_info('Gold data loaded.') correct, predicted, gold = 0, 0, 0 for gold_tree, gen_trees in zip(gold_trees, chunk_list(gen_trees, num_to_generate)): # find best of predicted trees (in terms of F1) _, tc, tp, tg = max([(f1_from_counts(c, p, g), c, p, g) for c, p, g in map(lambda gen_tree: corr_pred_gold(gold_tree, gen_tree), gen_trees)], key=lambda x: x[0]) correct += tc predicted += tp gold += tg # evaluate oracle F1 log_info("Oracle Precision: %.6f, Recall: %.6f, F1: %.6f" % p_r_f1_from_counts(correct, predicted, gold)) # write output if fname_ttrees_out is not None: log_info('Writing output...') write_ttrees(gen_doc, fname_ttrees_out)