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: reduce_max(x, axis) -> PondTensor
  
  Find the max value along an axis.
  
  .. code-block:: python
  
      >>> reduce_max([[10, 20, 30], [11, 13, 12], [15, 16, 17]], axis=0)
      [[30], [13], [17]]
  
  :See: tf.reduce_max
  :param PondTensor x: Input tensor.
  :param int axis: The tensor axis to reduce along.
  :rtype: PondTensor
  :returns: A new tensor with the specified axis reduced to the max value in
    that axis.
code: def reduce_max(self, x, axis=0):
      """
      reduce_max(x, axis) -> PondTensor
  
      Find the max value along an axis.
  
      .. code-block:: python
  
          >>> reduce_max([[10, 20, 30], [11, 13, 12], [15, 16, 17]], axis=0)
          [[30], [13], [17]]
  
      :See: tf.reduce_max
      :param PondTensor x: Input tensor.
      :param int axis: The tensor axis to reduce along.
      :rtype: PondTensor
      :returns: A new tensor with the specified axis reduced to the max value in
        that axis.
      """
      with tf.name_scope("reduce_max"):
  
          def build_comparison_tree(ts):
              if len(ts) == 1:
                  return ts[0]
              halfway = len(ts) // 2
              ts_left, ts_right = ts[:halfway], ts[halfway:]
              maximum_left = build_comparison_tree(ts_left)
              maximum_right = build_comparison_tree(ts_right)
              return self.maximum(maximum_left, maximum_right)
  
          tensors = self.split(x, int(x.shape[axis]), axis=axis)
          maximum = build_comparison_tree(tensors)
          return self.squeeze(maximum, axis=(axis,))
  
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 21 for calling the SecureNN obj's underlying member method code with example usage: obj.reduce_max(x, axis) and returns: self, self, ts