Example #1
0
def get_seed(op_seed):
    """Returns the local seeds an operation should use given an op-specific seed.

  Given operation-specific seed, `op_seed`, this helper function returns two
  seeds derived from graph-level and op-level seeds. Many random operations
  internally use the two seeds to allow user to change the seed globally for a
  graph, or for only specific operations.

  For details on how the graph-level seed interacts with op seeds, see
  `tf.compat.v1.random.set_random_seed`.

  Args:
    op_seed: integer.

  Returns:
    A tuple of two integers that should be used for the local seed of this
    operation.
  """
    eager = context.executing_eagerly()

    if eager:
        global_seed = context.global_seed()
    else:
        global_seed = ops.get_default_graph().seed

    if global_seed is not None:
        if op_seed is None:
            # pylint: disable=protected-access
            if hasattr(ops.get_default_graph(), '_seed_used'):
                ops.get_default_graph()._seed_used = True
            if eager:
                op_seed = context.internal_operation_seed()
            else:
                op_seed = _graph_to_seed_dict.setdefault(
                    ops.get_default_graph(), 0)
                _graph_to_seed_dict[ops.get_default_graph()] += 1

        seeds = _truncate_seed(global_seed), _truncate_seed(op_seed)
    else:
        if op_seed is not None:
            seeds = DEFAULT_GRAPH_SEED, _truncate_seed(op_seed)
        else:
            seeds = None, None

    if seeds == (None, None) and config.deterministic_ops_enabled():
        raise RuntimeError(  # pylint: disable=g-doc-exception
            'Random ops require a seed to be set when determinism is enabled. '
            'Please set a seed before running the op, e.g. by calling '
            'tf.random.set_seed(1).')

    # Avoid (0, 0) as the C++ ops interpret it as nondeterminism, which would
    # be unexpected since Python docs say nondeterminism is (None, None).
    if seeds == (0, 0):
        return (0, _MAXINT32)
    return seeds
Example #2
0
def get_seed(op_seed):
    """Returns the local seeds an operation should use given an op-specific seed.

  Given operation-specific seed, `op_seed`, this helper function returns two
  seeds derived from graph-level and op-level seeds. Many random operations
  internally use the two seeds to allow user to change the seed globally for a
  graph, or for only specific operations.

  For details on how the graph-level seed interacts with op seeds, see
  `tf.random.set_random_seed`.

  Args:
    op_seed: integer.

  Returns:
    A tuple of two integers that should be used for the local seed of this
    operation.
  """
    eager = context.executing_eagerly()

    if eager:
        global_seed = context.global_seed()
    else:
        global_seed = ops.get_default_graph().seed

    if global_seed is not None:
        if op_seed is None:
            # pylint: disable=protected-access
            if hasattr(ops.get_default_graph(), '_seed_used'):
                ops.get_default_graph()._seed_used = True
            if eager:
                op_seed = context.internal_operation_seed()
            else:
                op_seed = ops.get_default_graph()._last_id

        seeds = _truncate_seed(global_seed), _truncate_seed(op_seed)
    else:
        if op_seed is not None:
            seeds = DEFAULT_GRAPH_SEED, _truncate_seed(op_seed)
        else:
            seeds = None, None
    # Avoid (0, 0) as the C++ ops interpret it as nondeterminism, which would
    # be unexpected since Python docs say nondeterminism is (None, None).
    if seeds == (0, 0):
        return (0, _MAXINT32)
    return seeds
Example #3
0
def get_seed(op_seed):
  """Returns the local seeds an operation should use given an op-specific seed.

  Given operation-specific seed, `op_seed`, this helper function returns two
  seeds derived from graph-level and op-level seeds. Many random operations
  internally use the two seeds to allow user to change the seed globally for a
  graph, or for only specific operations.

  For details on how the graph-level seed interacts with op seeds, see
  `tf.compat.v1.random.set_random_seed`.

  Args:
    op_seed: integer.

  Returns:
    A tuple of two integers that should be used for the local seed of this
    operation.
  """
  eager = context.executing_eagerly()

  if eager:
    global_seed = context.global_seed()
  else:
    global_seed = ops.get_default_graph().seed

  if global_seed is not None:
    if op_seed is None:
      # pylint: disable=protected-access
      if hasattr(ops.get_default_graph(), '_seed_used'):
        ops.get_default_graph()._seed_used = True
      if eager:
        op_seed = context.internal_operation_seed()
      else:
        op_seed = ops.get_default_graph()._last_id

    seeds = _truncate_seed(global_seed), _truncate_seed(op_seed)
  else:
    if op_seed is not None:
      seeds = DEFAULT_GRAPH_SEED, _truncate_seed(op_seed)
    else:
      seeds = None, None
  # Avoid (0, 0) as the C++ ops interpret it as nondeterminism, which would
  # be unexpected since Python docs say nondeterminism is (None, None).
  if seeds == (0, 0):
    return (0, _MAXINT32)
  return seeds
Example #4
0
def SecureGetRandomSeed(op_seed=None):
    """Returns the local seeds an operation should use given an op-specific seed.
    Args:
      op_seed: integer.

    Returns:
      A tuple of two integers that should be used for the local seed of this
      operation.
    """
    eager = context.executing_eagerly()

    if eager:
        global_seed = context.global_seed()
    else:
        global_seed = ops.get_default_graph().seed

    seeds = (0, 0)
    if global_seed is not None:
        if op_seed is None:
            # pylint: disable=protected-access
            if hasattr(ops.get_default_graph(), '_seed_used'):
                ops.get_default_graph()._seed_used = True
            if eager:
                op_seed = context.internal_operation_seed()
            else:
                op_seed = ops.get_default_graph()._last_id

        seeds = random_seed._truncate_seed(
            global_seed), random_seed._truncate_seed(op_seed)
    else:
        if op_seed is not None:
            seeds = random_seed.DEFAULT_GRAPH_SEED, random_seed._truncate_seed(
                op_seed)
        else:
            if py_protocol_handler.is_activated():
                seeds = py_protocol_handler.rand_seed(
                    0), py_protocol_handler.rand_seed(0)

    # Avoid (0, 0) as the C++ ops interpret it as nondeterminism, which would
    # random_seedbe unexpected since Python docs say nondeterminism is (None, None).
    if seeds == (0, 0):
        return (0, random_seed._MAXINT32)

    return seeds