# coding=utf-8
# Copyright 2018 The Tensor2Tensor Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

r"""Decode from trained T2T models.

This binary performs inference using the Estimator API.

Example usage to decode from dataset:

  t2t-decoder \
      --data_dir ~/data \
      --problems=algorithmic_identity_binary40 \
      --model=transformer
      --hparams_set=transformer_base

Set FLAGS.decode_interactive or FLAGS.decode_from_file for alternative decode
sources.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os

# Dependency imports

from tensor2tensor.bin import t2t_trainer
from tensor2tensor.utils import decoding
from tensor2tensor.utils import trainer_lib
from tensor2tensor.utils import usr_dir

import tensorflow as tf

flags = tf.flags
FLAGS = flags.FLAGS

# Additional flags in bin/t2t_trainer.py and utils/flags.py
flags.DEFINE_string("checkpoint_path", None,
                    "Path to the model checkpoint. Overrides output_dir.")
flags.DEFINE_string("decode_from_file", None,
                    "Path to the source file for decoding")
flags.DEFINE_string("decode_to_file", None,
                    "Path to the decoded (output) file")
flags.DEFINE_bool("keep_timestamp", False,
                  "Set the mtime of the decoded file to the "
                  "checkpoint_path+'.index' mtime.")
flags.DEFINE_bool("decode_interactive", False,
                  "Interactive local inference mode.")
flags.DEFINE_integer("decode_shards", 1, "Number of decoding replicas.")


def create_hparams():
  return trainer_lib.create_hparams(
      FLAGS.hparams_set,
      FLAGS.hparams,
      data_dir=os.path.expanduser(FLAGS.data_dir),
      problem_name=FLAGS.problems)


def create_decode_hparams():
  decode_hp = decoding.decode_hparams(FLAGS.decode_hparams)
  decode_hp.add_hparam("shards", FLAGS.decode_shards)
  decode_hp.add_hparam("shard_id", FLAGS.worker_id)
  return decode_hp
  
def get_checkpoint_path():
  checkpoints = []
  checkpoint_file = FLAGS.checkpoint_path + "checkpoint"
  with open(checkpoint_file, encoding='utf-8', newline='') as fckpt:
    for line in fckpt:
      ckpt_type, ckpt_name = line.split(':')
      if ckpt_type == 'all_model_checkpoint_paths':
        checkpoints.append(ckpt_name.strip(' \n\"'))
  return checkpoints

def decode(estimator, hparams, decode_hp):
  if FLAGS.decode_interactive:
    decoding.decode_interactively(estimator, hparams, decode_hp)
  elif FLAGS.decode_from_file:
    for checkpoint_elem in get_checkpoint_path():
      decoding.decode_from_file(estimator, FLAGS.decode_from_file, hparams,
                                decode_hp, FLAGS.decode_to_file + checkpoint_elem,
                                checkpoint_path=FLAGS.checkpoint_path + checkpoint_elem)
      if FLAGS.keep_timestamp:
        ckpt_time = os.path.getmtime(FLAGS.checkpoint_path + checkpoint_elem + ".index")
        os.utime(FLAGS.decode_to_file + checkpoint_elem, (ckpt_time, ckpt_time))
  '''
  else:
    decoding.decode_from_dataset(
        estimator,
        FLAGS.problems.split("-"),
        hparams,
        decode_hp,
        decode_to_file=FLAGS.decode_to_file,
        dataset_split="test" if FLAGS.eval_use_test_set else None)
  '''

def main(_):
  tf.logging.set_verbosity(tf.logging.INFO)
  usr_dir.import_usr_dir(FLAGS.t2t_usr_dir)
  FLAGS.use_tpu = False  # decoding not supported on TPU

  hp = create_hparams()
  decode_hp = create_decode_hparams()

  estimator = trainer_lib.create_estimator(
      FLAGS.model,
      hp,
      t2t_trainer.create_run_config(hp),
      decode_hparams=decode_hp,
      use_tpu=False)

  decode(estimator, hp, decode_hp)


if __name__ == "__main__":
  tf.app.run()

# coding=utf-8
# Copyright 2018 The Tensor2Tensor Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

r"""Decode from trained T2T models.

This binary performs inference using the Estimator API.

Example usage to decode from dataset:

  t2t-decoder \
      --data_dir ~/data \
      --problems=algorithmic_identity_binary40 \
      --model=transformer
      --hparams_set=transformer_base

Set FLAGS.decode_interactive or FLAGS.decode_from_file for alternative decode
sources.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os

# Dependency imports

from tensor2tensor.bin import t2t_trainer
from tensor2tensor.utils import decoding
from tensor2tensor.utils import trainer_lib
from tensor2tensor.utils import usr_dir

import tensorflow as tf

flags = tf.flags
FLAGS = flags.FLAGS

# Additional flags in bin/t2t_trainer.py and utils/flags.py
flags.DEFINE_string("checkpoint_path", None,
                    "Path to the model checkpoint. Overrides output_dir.")
flags.DEFINE_string("decode_from_file", None,
                    "Path to the source file for decoding")
flags.DEFINE_string("decode_to_file", None,
                    "Path to the decoded (output) file")
flags.DEFINE_bool("keep_timestamp", False,
                  "Set the mtime of the decoded file to the "
                  "checkpoint_path+'.index' mtime.")
flags.DEFINE_bool("decode_interactive", False,
                  "Interactive local inference mode.")
flags.DEFINE_integer("decode_shards", 1, "Number of decoding replicas.")


def create_hparams():
  return trainer_lib.create_hparams(
      FLAGS.hparams_set,
      FLAGS.hparams,
      data_dir=os.path.expanduser(FLAGS.data_dir),
      problem_name=FLAGS.problems)


def create_decode_hparams():
  decode_hp = decoding.decode_hparams(FLAGS.decode_hparams)
  decode_hp.add_hparam("shards", FLAGS.decode_shards)
  decode_hp.add_hparam("shard_id", FLAGS.worker_id)
  return decode_hp
  
def get_checkpoint_path():
  checkpoints = []
  checkpoint_file = FLAGS.checkpoint_path + "checkpoint"
  with open(checkpoint_file, encoding='utf-8', newline='') as fckpt:
    for line in fckpt:
      ckpt_type, ckpt_name = line.split(':')
      if ckpt_type == 'all_model_checkpoint_paths':
        checkpoints.append(ckpt_name.strip(' \n\"'))
  return checkpoints

def decode(estimator, hparams, decode_hp):
  if FLAGS.decode_interactive:
    decoding.decode_interactively(estimator, hparams, decode_hp)
  elif FLAGS.decode_from_file:
    for checkpoint_elem in get_checkpoint_path():
      decoding.decode_from_file(estimator, FLAGS.decode_from_file, hparams,
                                decode_hp, FLAGS.decode_to_file + checkpoint_elem,
                                checkpoint_path=FLAGS.checkpoint_path + checkpoint_elem)
      if FLAGS.keep_timestamp:
        ckpt_time = os.path.getmtime(FLAGS.checkpoint_path + checkpoint_elem + ".index")
        os.utime(FLAGS.decode_to_file + checkpoint_elem, (ckpt_time, ckpt_time))
  '''
  else:
    decoding.decode_from_dataset(
        estimator,
        FLAGS.problems.split("-"),
        hparams,
        decode_hp,
        decode_to_file=FLAGS.decode_to_file,
        dataset_split="test" if FLAGS.eval_use_test_set else None)
  '''

def main(_):
  tf.logging.set_verbosity(tf.logging.INFO)
  usr_dir.import_usr_dir(FLAGS.t2t_usr_dir)
  FLAGS.use_tpu = False  # decoding not supported on TPU

  hp = create_hparams()
  decode_hp = create_decode_hparams()

  estimator = trainer_lib.create_estimator(
      FLAGS.model,
      hp,
      t2t_trainer.create_run_config(hp),
      decode_hparams=decode_hp,
      use_tpu=False)

  decode(estimator, hp, decode_hp)


if __name__ == "__main__":
  tf.app.run()

# coding=utf-8 # Copyright 2018 The Tensor2Tensor Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # #     http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. Decode from trained T2T models.  This binary performs inference using the Estimator API.  Example usage to decode from dataset:    t2t-decoder \       --data_dir ~/data \       --problems=algorithmic_identity_binary40 \       --model=transformer       --hparams_set=transformer_base  Set FLAGS.decode_interactive or FLAGS.decode_from_file for alternative decode sources. # Dependency imports # Additional flags in bin/t2t_trainer.py and utils/flags.py else:     decoding.decode_from_dataset(         estimator,         FLAGS.problems.split("-"),         hparams,         decode_hp,         decode_to_file=FLAGS.decode_to_file,         dataset_split="test" if FLAGS.eval_use_test_set else None) # decoding not supported on TPU