def test_sp1():
    '''
    Test two different SequencePattern instances
    '''
    sp = SequencePattern("maxmin_dup")
    y = sp.generate_output_sequence(range(10))
    assert all(y == np.array([9, 0, 2, 3, 4, 5, 6, 7, 8, 9]))
    sp = SequencePattern("sorted")
    y = sp.generate_output_sequence([5, 6, 1, 2, 9])
    assert all(y == np.array([1, 2, 5, 6, 9]))
    sp = SequencePattern("reversed")
    y = sp.generate_output_sequence(range(10))
    assert all(y == np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]))
def test_sp1():
    '''
    Test two different SequencePattern instances
    '''
    sp = SequencePattern("maxmin_dup")
    y = sp.generate_output_sequence(range(10))
    assert all(y==np.array([9, 0, 2, 3, 4, 5, 6, 7, 8, 9]))    
    sp = SequencePattern("sorted")
    y = sp.generate_output_sequence([5,6,1,2,9])
    assert all(y==np.array([1, 2, 5, 6, 9]))
    sp = SequencePattern("reversed")
    y = sp.generate_output_sequence(range(10))
    assert all(y==np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]))
def test_sp2():
    '''
    Test two SequencePattern instance with lengths different from default
    '''
    sp = SequencePattern("sorted", in_seq_len=20, out_seq_len=5)
    x = np.random.randint(0, 9, 20)
    y = sp.generate_output_sequence(x)
    assert len(y) == 5
    y_exp = sorted(x)[:5]
    assert all(y == y_exp)
def test_sp2():
    '''
    Test two SequencePattern instance with lengths different from default
    '''
    sp = SequencePattern("sorted", in_seq_len=20, out_seq_len=5)
    x = np.random.randint(0, 9, 20)
    y = sp.generate_output_sequence(x)
    assert len(y)==5
    y_exp = sorted(x)[:5]
    assert all(y==y_exp)
def CommandLine(args=None, arglist=None):
    '''
    Main command line.  Accepts args, to allow for simple unit testing.
    '''
    help_text = """
Commands:

train - give size of training set to use, as argument
predict - give input sequence as argument (or specify inputs via --from-file <filename>)

"""
    parser = argparse.ArgumentParser(
        description=help_text, formatter_class=argparse.RawTextHelpFormatter)

    parser.add_argument("cmd", help="command")
    parser.add_argument("cmd_input", nargs='*', help="input to command")
    parser.add_argument(
        '-v',
        "--verbose",
        nargs=0,
        help="increase output verbosity (add more -v to increase versbosity)",
        action=VAction,
        dest='verbose')
    parser.add_argument(
        "-m",
        "--model",
        help=
        "seq2seq model name: either embedding_rnn (default) or embedding_attention",
        default=None)
    parser.add_argument("-r",
                        "--learning-rate",
                        type=float,
                        help="learning rate (default 0.0001)",
                        default=0.0001)
    parser.add_argument("-e",
                        "--epochs",
                        type=int,
                        help="number of trainig epochs",
                        default=10)
    parser.add_argument("-i",
                        "--input-weights",
                        type=str,
                        help="tflearn file with network weights to load",
                        default=None)
    parser.add_argument(
        "-o",
        "--output-weights",
        type=str,
        help="new tflearn file where network weights are to be saved",
        default=None)
    parser.add_argument("-p",
                        "--pattern-name",
                        type=str,
                        help="name of pattern to use for sequence",
                        default=None)
    parser.add_argument(
        "-n",
        "--name",
        type=str,
        help="name of model, used when generating default weights filenames",
        default=None)
    parser.add_argument("--in-len",
                        type=int,
                        help="input sequence length (default 10)",
                        default=None)
    parser.add_argument("--out-len",
                        type=int,
                        help="output sequence length (default 10)",
                        default=None)
    parser.add_argument(
        "--from-file",
        type=str,
        help="name of file to take input data sequences from (json format)",
        default=None)
    parser.add_argument(
        "--iter-num",
        type=int,
        help=
        "training iteration number; specify instead of input- or output-weights to use generated filenames",
        default=None)
    parser.add_argument(
        "--data-dir",
        help=
        "directory to use for storing checkpoints (also used when generating default weights filenames)",
        default=None)
    # model parameters
    parser.add_argument(
        "-L",
        "--num-layers",
        type=int,
        help="number of RNN layers to use in the model (default 1)",
        default=1)
    parser.add_argument("--cell-size",
                        type=int,
                        help="size of RNN cell to use (default 32)",
                        default=32)
    parser.add_argument("--cell-type",
                        type=str,
                        help="type of RNN cell to use (default BasicLSTMCell)",
                        default="BasicLSTMCell")
    parser.add_argument("--embedding-size",
                        type=int,
                        help="size of embedding to use (default 20)",
                        default=20)
    parser.add_argument("--tensorboard-verbose",
                        type=int,
                        help="tensorboard verbosity level (default 0)",
                        default=0)

    if not args:
        args = parser.parse_args(arglist)

    if args.iter_num is not None:
        args.input_weights = args.iter_num
        args.output_weights = args.iter_num + 1

    model_params = dict(
        num_layers=args.num_layers,
        cell_size=args.cell_size,
        cell_type=args.cell_type,
        embedding_size=args.embedding_size,
        learning_rate=args.learning_rate,
        tensorboard_verbose=args.tensorboard_verbose,
    )

    if args.cmd == "train":
        try:
            num_points = int(args.cmd_input[0])
        except:
            raise Exception(
                "Please specify the number of datapoints to use for training, as the first argument"
            )
        sp = SequencePattern(args.pattern_name,
                             in_seq_len=args.in_len,
                             out_seq_len=args.out_len)
        ts2s = TFLearnSeq2Seq(sp,
                              seq2seq_model=args.model,
                              data_dir=args.data_dir,
                              name=args.name,
                              verbose=args.verbose)
        ts2s.train(num_epochs=args.epochs,
                   num_points=num_points,
                   weights_output_fn=args.output_weights,
                   weights_input_fn=args.input_weights,
                   model_params=model_params)
        return ts2s

    elif args.cmd == "predict":
        if args.from_file:
            inputs = json.loads(args.from_file)
        try:
            input_x = list(map(int, args.cmd_input))
            inputs = [input_x]
        except:
            raise Exception(
                "Please provide a space-delimited input sequence as the argument"
            )

        sp = SequencePattern(args.pattern_name,
                             in_seq_len=args.in_len,
                             out_seq_len=args.out_len)
        ts2s = TFLearnSeq2Seq(sp,
                              seq2seq_model=args.model,
                              data_dir=args.data_dir,
                              name=args.name,
                              verbose=args.verbose)
        results = []
        for x in inputs:
            prediction, y = ts2s.predict(x,
                                         weights_input_fn=args.input_weights,
                                         model_params=model_params)
            print("==> For input %s, prediction=%s (expected=%s)" %
                  (x, prediction, sp.generate_output_sequence(x)))
            results.append([prediction, y])
        ts2s.prediction_results = results
        return ts2s

    else:
        print("Unknown command %s" % args.cmd)
def CommandLine(args=None, arglist=None):
    '''
    Main command line.  Accepts args, to allow for simple unit testing.
    '''
    help_text = """
Commands:

train - give size of training set to use, as argument
predict - give input sequence as argument (or specify inputs via --from-file <filename>)

"""
    parser = argparse.ArgumentParser(description=help_text, formatter_class=argparse.RawTextHelpFormatter)
    
    parser.add_argument("cmd", help="command")
    parser.add_argument("cmd_input", nargs='*', help="input to command")
    parser.add_argument('-v', "--verbose", nargs=0, help="increase output verbosity (add more -v to increase versbosity)", action=VAction, dest='verbose')
    parser.add_argument("-m", "--model", help="seq2seq model name: either embedding_rnn (default) or embedding_attention", default=None)
    parser.add_argument("-r", "--learning-rate", type=float, help="learning rate (default 0.0001)", default=0.0001)
    parser.add_argument("-e", "--epochs", type=int, help="number of trainig epochs", default=10)
    parser.add_argument("-i", "--input-weights", type=str, help="tflearn file with network weights to load", default=None)
    parser.add_argument("-o", "--output-weights", type=str, help="new tflearn file where network weights are to be saved", default=None)
    parser.add_argument("-p", "--pattern-name", type=str, help="name of pattern to use for sequence", default=None)
    parser.add_argument("-n", "--name", type=str, help="name of model, used when generating default weights filenames", default=None)
    parser.add_argument("--in-len", type=int, help="input sequence length (default 10)", default=None)
    parser.add_argument("--out-len", type=int, help="output sequence length (default 10)", default=None)
    parser.add_argument("--from-file", type=str, help="name of file to take input data sequences from (json format)", default=None)
    parser.add_argument("--iter-num", type=int, help="training iteration number; specify instead of input- or output-weights to use generated filenames", default=None)
    parser.add_argument("--data-dir", help="directory to use for storing checkpoints (also used when generating default weights filenames)", default=None)
    # model parameters
    parser.add_argument("-L", "--num-layers", type=int, help="number of RNN layers to use in the model (default 1)", default=1)
    parser.add_argument("--cell-size", type=int, help="size of RNN cell to use (default 32)", default=32)
    parser.add_argument("--cell-type", type=str, help="type of RNN cell to use (default BasicLSTMCell)", default="BasicLSTMCell")
    parser.add_argument("--embedding-size", type=int, help="size of embedding to use (default 20)", default=20)
    parser.add_argument("--tensorboard-verbose", type=int, help="tensorboard verbosity level (default 0)", default=0)

    if not args:
        args = parser.parse_args(arglist)
    
    if args.iter_num is not None:
        args.input_weights = args.iter_num
        args.output_weights = args.iter_num + 1

    model_params = dict(num_layers=args.num_layers,
                        cell_size=args.cell_size,
                        cell_type=args.cell_type,
                        embedding_size=args.embedding_size,
                        learning_rate=args.learning_rate,
                        tensorboard_verbose=args.tensorboard_verbose,
                    )

    if args.cmd=="train":
        try:
            num_points = int(args.cmd_input[0])
        except:
            raise Exception("Please specify the number of datapoints to use for training, as the first argument")
        sp = SequencePattern(args.pattern_name, in_seq_len=args.in_len, out_seq_len=args.out_len)
        ts2s = TFLearnSeq2Seq(sp, seq2seq_model=args.model, data_dir=args.data_dir, name=args.name, verbose=args.verbose)
        ts2s.train(num_epochs=args.epochs, num_points=num_points, weights_output_fn=args.output_weights, 
                   weights_input_fn=args.input_weights, model_params=model_params)
        return ts2s
        
    elif args.cmd=="predict":
        if args.from_file:
            inputs = json.loads(args.from_file)
        try:
            input_x = list(map(int, args.cmd_input))
            inputs = [input_x]
        except:
            raise Exception("Please provide a space-delimited input sequence as the argument")

        sp = SequencePattern(args.pattern_name, in_seq_len=args.in_len, out_seq_len=args.out_len)
        ts2s = TFLearnSeq2Seq(sp, seq2seq_model=args.model, data_dir=args.data_dir, name=args.name, verbose=args.verbose)
        results = []
        for x in inputs:
            prediction, y = ts2s.predict(x, weights_input_fn=args.input_weights, model_params=model_params)
            print("==> For input %s, prediction=%s (expected=%s)" % (x, prediction, sp.generate_output_sequence(x)))
            results.append([prediction, y])
        ts2s.prediction_results = results
        return ts2s

    else:
        print("Unknown command %s" % args.cmd)