'Initializes internal RNN models, builds the graph, starts the session.
Adds the graphs of the internal RNN models to this graph, adds the DQN ops
to the graph, and starts a new Saver and session. By having a separate
function for this rather than doing it in the constructor, it allows a model
inheriting from this class to define its q_network differently.
Args:
restore_from_checkpoint: If True, the weights for the \'q_network\',
\'target_q_network\', and \'reward_rnn\' will be loaded from a checkpoint.
If false, these models will be initialized with random weights. Useful
for checking what pure RL (with no influence from training data) sounds
like.'

def initialize_internal_models_graph_session(self, restore_from_checkpoint=True):

    with self.graph.as_default():
        tf.logging.info('Initializing    q    network')
        self.q_network = note_rnn_loader.NoteRNNLoader(self.graph, 'q_network', self.note_rnn_checkpoint_dir, midi_primer=self.midi_primer, training_file_list=self.training_file_list, checkpoint_file=self.note_rnn_checkpoint_file, hparams=self.note_rnn_hparams, note_rnn_type=self.note_rnn_type)
        tf.logging.info('Initializing    target    q    network')
        self.target_q_network = note_rnn_loader.NoteRNNLoader(self.graph, 'target_q_network', self.note_rnn_checkpoint_dir, midi_primer=self.midi_primer, training_file_list=self.training_file_list, checkpoint_file=self.note_rnn_checkpoint_file, hparams=self.note_rnn_hparams, note_rnn_type=self.note_rnn_type)
        tf.logging.info('Initializing    reward    network')
        self.reward_rnn = note_rnn_loader.NoteRNNLoader(self.graph, 'reward_rnn', self.note_rnn_checkpoint_dir, midi_primer=self.midi_primer, training_file_list=self.training_file_list, checkpoint_file=self.note_rnn_checkpoint_file, hparams=self.note_rnn_hparams, note_rnn_type=self.note_rnn_type)
        tf.logging.info('Q    network    cell:    %s', self.q_network.cell)
        tf.logging.info('Adding    RL    graph    variables')
        self.build_graph()
        self.saver = tf.train.Saver()
        self.session = tf.Session(graph=self.graph)
        self.session.run(tf.global_variables_initializer())
        if restore_from_checkpoint:
            self.q_network.initialize_and_restore(self.session)
            self.target_q_network.initialize_and_restore(self.session)
            self.reward_rnn.initialize_and_restore(self.session)
            reward_vars = self.reward_rnn.variables()
            q_vars = self.q_network.variables()
            reward1 = self.session.run(reward_vars[0])
            q1 = self.session.run(q_vars[0])
            if (np.sum(((q1 - reward1) ** 2)) == 0.0):
                print('\nSuccessfully    initialized    internal    nets    from    checkpoint!')
                tf.logging.info('\nSuccessfully    initialized    internal    nets    from    checkpoint!')
            else:
                tf.logging.fatal('Error!    The    model    was    not    initialized    from    checkpoint    properly')
        else:
            self.q_network.initialize_new(self.session)
            self.target_q_network.initialize_new(self.session)
            self.reward_rnn.initialize_new(self.session)
    if (self.priming_mode == 'random_midi'):
        tf.logging.info('Getting    priming    melodies')
        self.get_priming_melodies()
