class_docstr: SecureNN(server_0, server_1, server_2, prime_factory, odd_factory, **kwargs)
  
  Implementation of SecureNN from
  `Wagh et al <https://eprint.iacr.org/2018/442/>`_.
class_docstr_tok: ["SecureNN","(","server_0",",","server_1",",","server_2",",","prime_factory",",","odd_factory",",","*","*","kwargs",")","Implementation","of","SecureNN","from","`","Wagh","et","al","<","https",":","\/\/eprint.iacr.org\/2018\/442\/",">","`","_","."]
docstr: select(choice_bit, x, y) -> PondTensor
  
  The `select` protocol from Wagh et al.  Secretly selects and returns
  elements from two candidate tensors.
  
  .. code-block:: python
  
      >>> option_x = [10, 20, 30, 40]
      >>> option_y = [1, 2, 3, 4]
      >>> select(choice_bit=1, x=option_x, y=option_y)
      [1, 2, 3, 4]
      >>> select(choice_bit=[0,1,0,1], x=option_x, y=option_y)
      [10, 2, 30, 4]
  
  `NOTE:` Inputs to this function in real use will not look like above.
  In practice these will be secret shares.
  
  :param PondTensor choice_bit: The bits representing which tensor to choose.
    If `choice_bit = 0` then choose elements from `x`, otherwise choose
    from `y`.
  :param PondTensor x: Candidate tensor 0.
  :param PondTensor y: Candidate tensor 1.
code: def select(self, choice_bit, x, y):
      """
      select(choice_bit, x, y) -> PondTensor
  
      The `select` protocol from Wagh et al.  Secretly selects and returns
      elements from two candidate tensors.
  
      .. code-block:: python
  
          >>> option_x = [10, 20, 30, 40]
          >>> option_y = [1, 2, 3, 4]
          >>> select(choice_bit=1, x=option_x, y=option_y)
          [1, 2, 3, 4]
          >>> select(choice_bit=[0,1,0,1], x=option_x, y=option_y)
          [10, 2, 30, 4]
  
      `NOTE:` Inputs to this function in real use will not look like above.
      In practice these will be secret shares.
  
      :param PondTensor choice_bit: The bits representing which tensor to choose.
        If `choice_bit = 0` then choose elements from `x`, otherwise choose
        from `y`.
      :param PondTensor x: Candidate tensor 0.
      :param PondTensor y: Candidate tensor 1.
      """  # noqa:E501
  
      # TODO[Morten] optimize select when choice_bit is a public tensor
  
      # TODO[Morten]
      # these assertions should ideally be enabled but requires lifting to be
      # applied to the inputs first; make sure that's fixed during refactoring
      #
      # assert x.backing_dtype == y.backing_dtype
      # assert x.is_scaled == y.is_scaled
      # assert not choice_bit.is_scaled
  
      with tf.name_scope("select"):
          return (y - x) * choice_bit + x
  
imports: from __future__ import absolute_import
  import math
  import random
  import sys
  from typing import Optional
  from typing import Tuple
  import numpy
  import tensorflow
  from tf_encrypted.config import get_config
  from tf_encrypted.player import Player
  from tf_encrypted.protocol import memoize
  from tf_encrypted.protocol.pond import Pond
  from tf_encrypted.protocol.pond import PondMaskedTensor
  from tf_encrypted.protocol.pond import PondPrivateTensor
  from tf_encrypted.protocol.pond import PondPublicTensor
  from tf_encrypted.protocol.pond import PondTensor
  from tf_encrypted.protocol.pond import _type
  from tf_encrypted.protocol.protocol import nodes
  from tf_encrypted.protocol.securenn.odd_tensor import oddint64_factory
  from tf_encrypted.tensor import int64factory
  from tf_encrypted.tensor import native_factory
  from tf_encrypted.tensor.factory import AbstractFactory
  from tf_encrypted.tensor.factory import AbstractTensor
label_desc: Use image node_id 15 for calling the SecureNN obj's underlying member method code with example usage: obj.select(choice_bit, x, y) and returns: unknown