Exemple #1
0
def predict(path):
    np.random.seed(42)
    tf.set_random_seed(42)
    config = Config.get_default_config(args)
    model = Model(config)
    predictor = InteractivePredictor(config, model, path)
    predictor.predict()
    model.close_session()
    args = parser.parse_args()

    replace_tokens = ["@R_%d@"%i for i in range(1, args.num_replace_tokens+1)]

    if args.debug:
        config = Config.get_debug_config(args)
    else:
        config = Config.get_default_config(args)

    # Composite training loss
    lamb = args.lamb
    print('Lamb :=' + str(lamb))

    model = Model(config, replace_tokens)
    print('Created model')

    if config.TRAIN_PATH:
        model.train(lamb=lamb)
    if config.TEST_PATH and not args.data_path:
        results, precision, recall, f1 = model.evaluate()
        print('Accuracy: ' + str(results))
        print('Precision: ' + str(precision) + ', recall: ' + str(recall) + ', F1: ' + str(f1))
    if args.predict:
        predictor = InteractivePredictor(config, model)
        predictor.predict()
    if args.adv_eval:
        model.adv_eval_batched()    
    if args.release and args.load_path:
        model.evaluate(release=True)
    model.close_session()
Exemple #3
0
    parser.add_argument('--predict', action='store_true')
    parser.add_argument('--debug', action='store_true')
    parser.add_argument('--seed', type=int, default=239)
    parser.add_argument('--reports', type=str, default=239)

    args = parser.parse_args()

    np.random.seed(args.seed)
    tf.set_random_seed(args.seed)

    if args.debug:
        config = Config.get_debug_config(args)
    else:
        config = Config.get_default_config(args)

    model = Model(config)
    print('Created model')
    if config.TRAIN_PATH:
        model.train()
    if config.TEST_PATH and not args.data_path:
        results, precision, recall, f1, rouge = model.evaluate()
        print('Accuracy: ' + str(results))
        print('Precision: ' + str(precision) + ', recall: ' + str(recall) + ', F1: ' + str(f1))
        print('Rouge: ', rouge)
    if args.predict:
        predictor = InteractivePredictor(config, model, args.reports)
        predictor.predict()
    if args.release and args.load_path:
        model.evaluate(release=True)
    model.close_session()
Exemple #4
0
    parser.add_argument('--predict', action='store_true')
    parser.add_argument('--debug', action='store_true')
    args = parser.parse_args()

    if args.debug:
        config = Config.get_debug_config(args)
    else:
        config = Config.get_default_config(args)

    model = Model(config)
    print('Created model')
    if config.TRAIN_PATH:
        model.train()
    if config.TEST_PATH and not args.data_path:
        results, precision, recall, f1 = model.evaluate()
        print('Accuracy: ' + str(results))
        print('Precision: ' + str(precision) + ', recall: ' + str(recall) + ', F1: ' + str(f1))
    if args.predict:
        print("Under Prediciton process.....")
        predictor = InteractivePredictor(config, model)
        if extract_AST:
            ast_fetaure_list = predictor.get_ast_paths_for_file()
            print(f"AST Feature for {len(ast_fetaure_list)} snippets")
            print(ast_fetaure_list)
        else:
            predictor.predict()

    if args.release and args.load_path:
        model.evaluate(release=True)
    model.close_session()
Exemple #5
0
    def predict(self):
        input_filename = 'Input.java'
        MAX_ATTEMPTS = 50
        MAX_NODES_TO_OPEN = 10

        words_vocab = self.model.get_words_vocab_embed()
        # words_vocab = words_vocab / np.linalg.norm(words_vocab, axis=1).reshape((-1, 1))

        print('Starting interactive prediction with similar adversarial search...')
        while True:
            print(
                'Modify the file: "%s" and press any key when ready, or "q" / "quit" / "exit" to exit' % input_filename)
            user_input = input()
            if user_input.lower() in self.exit_keywords:
                print('Exiting...')
                return

            print("select variable to rename:")
            var_to_rename = newname_of_var = input()

            name_found = False
            closed = [var_to_rename]
            with open(input_filename, "r") as f:
                original_code = f.read()

            for i in range(MAX_ATTEMPTS):
                try:
                    predict_lines, hash_to_string_dict = self.path_extractor.extract_paths(input_filename)
                except ValueError as e:
                    print(e)
                    continue
                results = self.model.predict(predict_lines)
                prediction_results = common.parse_results(results, hash_to_string_dict, topk=SHOW_TOP_CONTEXTS)
                for method_prediction in prediction_results:
                    print('Original name:\t' + method_prediction.original_name)
                    for name_prob_pair in method_prediction.predictions:
                        print('\t(%f) predicted: %s' % (name_prob_pair['probability'], name_prob_pair['name']))

                if '|'.join(method_prediction.predictions[0]['name']) != method_prediction.original_name:
                    print("MATCH FOUND!", newname_of_var)
                    print("Tried (total:", len(closed), ") :: ", closed)
                    name_found = True
                    break

                    # print('Attention:')
                    # for attention_obj in method_prediction.attention_paths:
                    #     print('%f\tcontext: %s,%s,%s' % (
                    #     attention_obj['score'], attention_obj['token1'], attention_obj['path'], attention_obj['token2']))

                loss, all_strings, all_grads = self.model.calc_loss_and_gradients_wrt_input(predict_lines)
                indecies_of_var = np.argwhere(all_strings == newname_of_var.lower()).flatten()
                grads_of_var = all_grads[indecies_of_var]
                if grads_of_var.shape[0] > 0:
                    # print("current loss:",loss)
                    total_grad = np.sum(grads_of_var, axis=0)
                    # # words to increase loss
                    # top_replace_with = np.argsort(total_grad)[::-1][:5]
                    # result = [(i, total_grad[i], self.model.index_to_word[i]) for i in top_replace_with]
                    # print("words to increase loss:")
                    # print(result)
                    # words to decrease loss
                    # top_replace_with = np.argsort(total_grad)[:5]

                    similarity_to_var = self.get_similar_words(newname_of_var) #self.measureSimilarity(words_vocab,newname_of_var, "euclidean")
                    result = [(self.model.word_to_index[i], i, total_grad[self.model.word_to_index[i]]) for i in similarity_to_var]

                    result.sort(key=lambda v: (-v[2]))

                    print(result)
                    # similarity_to_var = self.measureSimilarity(words_vocab,newname_of_var, "cosine")
                    # resulte = [(i, self.model.index_to_word[i], similarity_to_var[i], total_grad[i]) for i in range(1, words_vocab.shape[0])]
                    #
                    # resulte.sort(key=lambda v: (v[2],-v[3]))

                    # select new name
                    for r in result:
                        if r[1] not in closed and r[1] != method_prediction.original_name.replace("|","")\
                                and r[2] > 0:
                            print(r)
                            newname_of_var = r[1]
                            break
                    else:
                        newname_of_var = None
                    if newname_of_var is None:
                        break
                    closed.append(newname_of_var)

                    print("rename", var_to_rename, "to", newname_of_var)

                    code = InteractivePredictor.rename_variable(original_code,var_to_rename,newname_of_var)
                    with open("input.java", "w") as f:
                        f.write(code)


            if not name_found:
                print("FAILED!")
                print("Tried (total:", len(closed),") :: ", closed)
Exemple #6
0
    def predict(self):
        input_filename = 'Input.java'
        MAX_ATTEMPTS = 50
        MAX_NODES_TO_OPEN = 10

        print('Starting interactive prediction with mono adversarial search...')
        while True:
            print(
                'Modify the file: "%s" and press any key when ready, or "q" / "quit" / "exit" to exit' % input_filename)
            user_input = input()
            if user_input.lower() in self.exit_keywords:
                print('Exiting...')
                return

            print("select variable to rename:")
            var_to_rename = newname_of_var = input()

            name_found = False

            opened = []
            closed = []
            with open(input_filename, "r") as f:
                original_code = f.read()

            for i in range(MAX_ATTEMPTS):
                try:
                    predict_lines, hash_to_string_dict = self.path_extractor.extract_paths(input_filename)
                except ValueError as e:
                    print(e)
                    continue

                bfs = AdversarialSearcher(2, 2, self.model)
                r = bfs.find_adversarial(predict_lines)
                print(r)
                print(timeit.timeit(lambda: bfs.find_adversarial(predict_lines), number=1000))


                return
                results = self.model.predict(predict_lines)
                prediction_results = common.parse_results(results, hash_to_string_dict, topk=SHOW_TOP_CONTEXTS)
                for method_prediction in prediction_results:
                    print('Original name:\t' + method_prediction.original_name)
                    for name_prob_pair in method_prediction.predictions:
                        print('\t(%f) predicted: %s' % (name_prob_pair['probability'], name_prob_pair['name']))

                if '|'.join(method_prediction.predictions[0]['name']) == method_prediction.original_name:
                    print("MATCH FOUND!", newname_of_var)
                    print("Tried (total:", len(closed), ") :: ", closed)
                    name_found = True
                    break

                    # print('Attention:')
                    # for attention_obj in method_prediction.attention_paths:
                    #     print('%f\tcontext: %s,%s,%s' % (
                    #     attention_obj['score'], attention_obj['token1'], attention_obj['path'], attention_obj['token2']))

                loss, all_strings, all_grads = self.model.calc_loss_and_gradients_wrt_input(predict_lines)
                indecies_of_var = np.argwhere(all_strings == newname_of_var.lower()).flatten()
                grads_of_var = all_grads[indecies_of_var]
                if grads_of_var.shape[0] > 0:
                    # print("current loss:",loss)
                    total_grad = np.sum(grads_of_var, axis=0)
                    # # words to increase loss
                    # top_replace_with = np.argsort(total_grad)[::-1][:5]
                    # result = [(i, total_grad[i], self.model.index_to_word[i]) for i in top_replace_with]
                    # print("words to increase loss:")
                    # print(result)
                    # words to decrease loss
                    top_replace_with = np.argsort(total_grad)[:5]
                    result = [(i, total_grad[i], self.model.index_to_word[i]) for i in top_replace_with]

                    # select new name
                    for r in result:
                        if r[2] not in closed and r[2] != method_prediction.original_name.replace("|",""):
                            print(r)
                            newname_of_var = r[2]
                            break
                    else:
                        newname_of_var = None
                    if newname_of_var is None:
                        break
                    closed.append(newname_of_var)

                    print("rename", var_to_rename, "to", newname_of_var)

                    code = InteractivePredictor.rename_variable(original_code,var_to_rename,newname_of_var)
                    with open("input.java", "w") as f:
                        f.write(code)


            if not name_found:
                print("FAILED!")
                print("Tried (total:", len(closed),") :: ", closed)