# Module `utils.execution_context`

Expand source code

    #!/usr/bin/env python3

    import threading
    import random
    import time
    import numpy as np

    from . import thread_pool

    class ExecutionContext:
        """Private execution data. Please do not manipulate directly, only with dedicated API"""
        pass

    def initExecutionContext():
        """Initialize thread specific execution context"""
        c = ExecutionContext()
        c.eval_thread_pool = thread_pool.ThreadPool()         #: Threads responsible for model evaluation
        c.local_training_threads = thread_pool.ThreadPool()   #: Threads responsible for local training
        c.remote_training_threads = thread_pool.ThreadPool()  #: Threads responsible for remote training
        c.saver_thread = thread_pool.ThreadPool()             #: Threads responsible for saving results into filesystem

        c.experimental_options = {}                           #: Dictionary with experimental options to optimization algs.
        c.np_random = np.random.RandomState()                 #: Thread specific numpy random generator
        c.random = random.Random()                            #: Thread specific Python random generator
        c.context_init_time = time.time()                     #: Time when execution context has been initialized
        return c

    def resetExecutionContext(c):
        """Reset thread specific execution context"""
        for th in c.remote_training_threads.threads:
            th.external_socket.rawSendString("finish_work")

        c.remote_training_threads.stop()
        c.local_training_threads.stop()
        c.eval_thread_pool.stop()
        c.saver_thread.stop()

    # ======================================================================================================================
    torch_global_lock = threading.Lock()                #: Internal global locks to mitigate problems with PyTorch
                                                        #  initialization with global torch state
    # ======================================================================================================================
    # Global shared callbacks for tasks
    simulation_start_fn = None                          #: Callback for start simulation
                                                        # "callback(H:server_state)"

    is_simulation_need_earlystop_fn = None              #: Predicate for checking that simulation should be canceled.
                                                        # "callback(H:server_state)"

    simulation_progress_steps_fn = None                 #: Callback for track the current progress of training model
                                                        # "callback(progress:float, H:server_state)"

    simulation_finish_fn = None                         #: Callback which will be called once as simulation is finished.
                                                        # "callback(H:server_state)"
    # ======================================================================================================================

## Global variables

`var is_simulation_need_earlystop_fn`

  Predicate for checking that simulation should be canceled.

`var simulation_finish_fn`

  Callback which will be called once as simulation is finished.

`var simulation_progress_steps_fn`

  Callback for track the current progress of training model

`var simulation_start_fn`

  Callback for start simulation

`var torch_global_lock`

  Internal global locks to mitigate problems with PyTorch

## Functions

`def initExecutionContext()`

  Initialize thread specific execution context

  Expand source code

      def initExecutionContext():
          """Initialize thread specific execution context"""
          c = ExecutionContext()
          c.eval_thread_pool = thread_pool.ThreadPool()         #: Threads responsible for model evaluation
          c.local_training_threads = thread_pool.ThreadPool()   #: Threads responsible for local training
          c.remote_training_threads = thread_pool.ThreadPool()  #: Threads responsible for remote training
          c.saver_thread = thread_pool.ThreadPool()             #: Threads responsible for saving results into filesystem

          c.experimental_options = {}                           #: Dictionary with experimental options to optimization algs.
          c.np_random = np.random.RandomState()                 #: Thread specific numpy random generator
          c.random = random.Random()                            #: Thread specific Python random generator
          c.context_init_time = time.time()                     #: Time when execution context has been initialized
          return c

`def resetExecutionContext(c)`

  Reset thread specific execution context

  Expand source code

      def resetExecutionContext(c):
          """Reset thread specific execution context"""
          for th in c.remote_training_threads.threads:
              th.external_socket.rawSendString("finish_work")

          c.remote_training_threads.stop()
          c.local_training_threads.stop()
          c.eval_thread_pool.stop()
          c.saver_thread.stop()

## Classes

`class ExecutionContext`

  Private execution data. Please do not manipulate directly, only with dedicated API

  Expand source code

      class ExecutionContext:
          """Private execution data. Please do not manipulate directly, only with dedicated API"""
          pass