# ==================================================

print("Entering into graph\n")
with tf.Graph().as_default():
    session_conf = tf.ConfigProto(
      allow_soft_placement=FLAGS.allow_soft_placement,
      log_device_placement=FLAGS.log_device_placement)
    sess = tf.Session(config=session_conf)
    print("Entering into session\n")
    with sess.as_default():

        model = Model(
            num_classes=y_train.shape[1],
            vocab_size=len(vocab_processor.vocabulary_),
            embedding_size = embeddings.shape[1],
            max_length = FLAGS.max_doc_length,
            vocab_proc = vocab_processor,
            filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
            num_filters=FLAGS.num_filters,
            l2_reg_lambda=FLAGS.l2_reg_lambda)


        print("Defined Model\n")
        # Define Training procedure
        global_step = tf.Variable(0, name="global_step", trainable=False)
        optimizer = tf.train.AdamOptimizer(FLAGS.learning_rate)
        grads_and_vars = optimizer.compute_gradients(model.loss) # ,tf.trainable_variables()
        def ClipIfNotNone(grad):
            if grad is None:
                print("NAN----------------------------------------------------")
                return grad
# Training
# ==================================================

print("Entering into graph\n")
with tf.Graph().as_default():
    session_conf = tf.ConfigProto(
      allow_soft_placement=FLAGS.allow_soft_placement,
      log_device_placement=FLAGS.log_device_placement)
    sess = tf.Session(config=session_conf)
    print("Entering into session\n")
    with sess.as_default():

        model = Model(
            #sequence_length=q_train.shape[1],
            num_classes=y_train.shape[1],
            #vocab_size=len(vocab_processor.vocabulary_),
            embedding_size=q_train.shape[1],
            filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
            num_filters=FLAGS.num_filters,
            l2_reg_lambda=FLAGS.l2_reg_lambda)

        # Output directory for models and summaries
        timestamp = str(int(time.time()))
        out_dir = os.path.abspath(os.path.join("../../runs", timestamp))  #os.path.curdir,"runs", timestamp
        print("Writing to {}\n".format(out_dir))

        print("Defined Model\n")
        # Define Training procedure
        global_step = tf.Variable(0, name="global_step", trainable=False)
        optimizer = tf.train.AdamOptimizer(FLAGS.learning_rate)
        grads_and_vars = optimizer.compute_gradients(model.loss, tf.trainable_variables())
        train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)