def test_executor_create_value_with_intrinsic_as_pb_computation(self):
     val = _produce_test_value(
         pb.Computation(intrinsic=pb.Intrinsic(uri='generic_zero'),
                        type=type_serialization.serialize_type(tf.int32)))
     self.assertIsInstance(val, federated_executor.FederatedExecutorValue)
     self.assertEqual(str(val.type_signature), 'int32')
     self.assertIs(val.internal_representation, intrinsic_defs.GENERIC_ZERO)
Esempio n. 2
0
def create_dummy_computation_intrinsic():
    """Returns a intrinsic computation and type."""
    intrinsic_def, type_signature = create_dummy_intrinsic_def()
    value = pb.Computation(
        type=type_serialization.serialize_type(type_signature),
        intrinsic=pb.Intrinsic(uri=intrinsic_def.uri))
    return value, type_signature
def create_whimsy_computation_intrinsic():
    """Returns a intrinsic computation and type."""
    intrinsic_def, type_signature = create_whimsy_intrinsic_def_federated_eval_at_server(
    )
    value = pb.Computation(
        type=type_serialization.serialize_type(type_signature),
        intrinsic=pb.Intrinsic(uri=intrinsic_def.uri))
    return value, type_signature
    def test_executor_call_unsupported_intrinsic(self):
        dummy_intrinsic = intrinsic_defs.IntrinsicDef(
            'DUMMY_INTRINSIC', 'dummy_intrinsic',
            computation_types.AbstractType('T'))

        comp = pb.Computation(intrinsic=pb.Intrinsic(uri='dummy_intrinsic'),
                              type=type_serialization.serialize_type(tf.int32))

        with self.assertRaises(NotImplementedError):
            _run_test_comp(comp, num_clients=3)
Esempio n. 5
0
 def test_executor_create_value_with_intrinsic_as_pb_computation(self):
     loop = asyncio.get_event_loop()
     ex = _make_test_executor()
     val = loop.run_until_complete(
         ex.create_value(
             pb.Computation(intrinsic=pb.Intrinsic(uri='generic_zero'),
                            type=type_serialization.serialize_type(
                                tf.int32))))
     self.assertIsInstance(val, federated_executor.FederatedExecutorValue)
     self.assertEqual(str(val.type_signature), 'int32')
     self.assertIs(val.internal_representation, intrinsic_defs.GENERIC_ZERO)
    def test_raises_not_implemented_error_with_unimplemented_intrinsic(self):
        executor = create_test_executor()
        dummy_intrinsic = intrinsic_defs.IntrinsicDef(
            'DUMMY_INTRINSIC', 'dummy_intrinsic',
            computation_types.AbstractType('T'))
        comp = pb.Computation(intrinsic=pb.Intrinsic(uri='dummy_intrinsic'),
                              type=type_serialization.serialize_type(tf.int32))

        comp = self.run_sync(executor.create_value(comp))
        with self.assertRaises(NotImplementedError):
            self.run_sync(executor.create_call(comp))
    def test_raises_value_error_with_unrecognized_computation_intrinsic(self):
        executor = create_test_executor()
        # A `ValueError` will be raised because `create_value` can not recognize the
        # following intrinsic, because it has not been added to the intrinsic
        # registry.
        value = pb.Computation(
            type=type_serialization.serialize_type(tf.int32),
            intrinsic=pb.Intrinsic(uri='unregistered_intrinsic'))
        type_signature = computation_types.TensorType(tf.int32)

        with self.assertRaises(ValueError):
            self.run_sync(executor.create_value(value, type_signature))
Esempio n. 8
0
def create_intrinsic_comp(intrinsic_def, type_spec):
    """Creates an intrinsic `pb.Computation`.

  Args:
    intrinsic_def: An instance of `intrinsic_defs.IntrinsicDef`.
    type_spec: The concrete type of the intrinsic (`computation_types.Type`).

  Returns:
    An instance of `pb.Computation` that represents the intrinsics.
  """
    py_typecheck.check_type(intrinsic_def, intrinsic_defs.IntrinsicDef)
    py_typecheck.check_type(type_spec, computation_types.Type)
    return pb.Computation(type=type_serialization.serialize_type(type_spec),
                          intrinsic=pb.Intrinsic(uri=intrinsic_def.uri))
    def test_executor_call_unsupported_intrinsic(self):
        dummy_intrinsic = intrinsic_defs.IntrinsicDef(
            'DUMMY_INTRINSIC', 'dummy_intrinsic',
            computation_types.AbstractType('T'))

        comp = pb.Computation(type=type_serialization.serialize_type(tf.int32),
                              intrinsic=pb.Intrinsic(uri='dummy_intrinsic'))

        loop = asyncio.get_event_loop()
        executor = composing_executor.ComposingExecutor(
            _create_bottom_stack(), [_create_worker_stack() for _ in range(3)])

        with self.assertRaises(NotImplementedError):
            v1 = loop.run_until_complete(executor.create_value(comp, tf.int32))
            loop.run_until_complete(executor.create_call(v1, None))
Esempio n. 10
0
  def test_with_type_raises_non_assignable_type(self):
    int_return_type = computation_types.FunctionType(tf.int32, tf.int32)
    original_comp = computation_impl.ConcreteComputation(
        pb.Computation(
            **{
                'type': type_serialization.serialize_type(int_return_type),
                'intrinsic': pb.Intrinsic(uri='whatever')
            }), context_stack_impl.context_stack)

    list_return_type = computation_types.FunctionType(
        tf.int32,
        computation_types.StructWithPythonType([(None, tf.int32)], list))
    with self.assertRaises(computation_types.TypeNotAssignableError):
      computation_impl.ConcreteComputation.with_type(original_comp,
                                                     list_return_type)
  def test_raises_not_implemented_error_with_unimplemented_intrinsic(self):
    executor = create_test_executor()
    # `whimsy_intrinsic` definition is needed to allow lookup.
    whimsy_intrinsic = intrinsic_defs.IntrinsicDef(
        'WHIMSY_INTRINSIC', 'whimsy_intrinsic',
        computation_types.AbstractType('T'))
    type_signature = computation_types.TensorType(tf.int32)
    comp = pb.Computation(
        intrinsic=pb.Intrinsic(uri='whimsy_intrinsic'),
        type=type_serialization.serialize_type(type_signature))
    del whimsy_intrinsic

    comp = self.run_sync(executor.create_value(comp))
    with self.assertRaises(NotImplementedError):
      self.run_sync(executor.create_call(comp))
Esempio n. 12
0
  def test_with_type_preserves_python_container(self):
    struct_return_type = computation_types.FunctionType(
        tf.int32, computation_types.StructType([(None, tf.int32)]))
    original_comp = computation_impl.ConcreteComputation(
        pb.Computation(
            **{
                'type': type_serialization.serialize_type(struct_return_type),
                'intrinsic': pb.Intrinsic(uri='whatever')
            }), context_stack_impl.context_stack)

    list_return_type = computation_types.FunctionType(
        tf.int32,
        computation_types.StructWithPythonType([(None, tf.int32)], list))
    fn_with_annotated_type = computation_impl.ConcreteComputation.with_type(
        original_comp, list_return_type)
    type_test_utils.assert_types_identical(
        list_return_type, fn_with_annotated_type.type_signature)
    def test_executor_call_unsupported_intrinsic(self):
        dummy_intrinsic = intrinsic_defs.IntrinsicDef(
            'DUMMY_INTRINSIC', 'dummy_intrinsic',
            computation_types.AbstractType('T'))
        type_signature = computation_types.TensorType(tf.int32)
        comp = pb.Computation(
            type=type_serialization.serialize_type(type_signature),
            intrinsic=pb.Intrinsic(uri='dummy_intrinsic'))

        loop = asyncio.get_event_loop()
        factory = federated_composing_strategy.FederatedComposingStrategy.factory(
            _create_bottom_stack(), [_create_worker_stack()])
        executor = federating_executor.FederatingExecutor(
            factory, _create_bottom_stack())

        v1 = loop.run_until_complete(executor.create_value(comp))
        with self.assertRaises(NotImplementedError):
            loop.run_until_complete(executor.create_call(v1))
    def test_executor_call_unsupported_intrinsic(self):
        # `whimsy_intrinsic` definition is needed to allow successful lookup.
        whimsy_intrinsic = intrinsic_defs.IntrinsicDef(
            'WHIMSY_INTRINSIC', 'whimsy_intrinsic',
            computation_types.AbstractType('T'))
        type_signature = computation_types.TensorType(tf.int32)
        comp = pb.Computation(
            type=type_serialization.serialize_type(type_signature),
            intrinsic=pb.Intrinsic(uri='whimsy_intrinsic'))
        del whimsy_intrinsic

        factory = federated_composing_strategy.FederatedComposingStrategy.factory(
            _create_bottom_stack(), [_create_worker_stack()])
        executor = federating_executor.FederatingExecutor(
            factory, _create_bottom_stack())

        v1 = asyncio.run(executor.create_value(comp))
        with self.assertRaises(NotImplementedError):
            asyncio.run(executor.create_call(v1))
Esempio n. 15
0
  def test_returns_value_with_intrinsic_def_federated_value_at_server_and_tuple(
      self):
    executor = create_test_executor(num_clients=3)
    arg, arg_type = executor_test_utils.create_dummy_computation_tuple()
    intrinsic_def = intrinsic_defs.FEDERATED_VALUE_AT_SERVER
    comp_type = computation_types.FunctionType(arg_type,
                                               type_factory.at_server(arg_type))
    comp = pb.Computation(
        type=type_serialization.serialize_type(comp_type),
        intrinsic=pb.Intrinsic(uri=intrinsic_def.uri))

    comp = self.run_sync(executor.create_value(comp, comp_type))
    arg = self.run_sync(executor.create_value(arg, arg_type))
    result = self.run_sync(executor.create_call(comp, arg))

    self.assertIsInstance(result, federating_executor.FederatingExecutorValue)
    self.assertEqual(result.type_signature.compact_representation(),
                     comp_type.result.compact_representation())
    actual_result = self.run_sync(result.compute())
    expected_result = [10.0] * 2
    for actual_element, expected_element in zip(actual_result, expected_result):
      self.assertEqual(actual_element, expected_element)
Esempio n. 16
0
  def test_something(self):
    # TODO(b/113112108): Revise these tests after a more complete implementation
    # is in place.

    # At the moment, this should succeed, as both the computation body and the
    # type are well-formed.
    computation_impl.ComputationImpl(
        pb.Computation(
            **{
                'type':
                    type_serialization.serialize_type(
                        computation_types.FunctionType(tf.int32, tf.int32)),
                'intrinsic':
                    pb.Intrinsic(uri='whatever')
            }), context_stack_impl.context_stack)

    # This should fail, as the proto is not well-formed.
    self.assertRaises(TypeError, computation_impl.ComputationImpl,
                      pb.Computation(), context_stack_impl.context_stack)

    # This should fail, as "10" is not an instance of pb.Computation.
    self.assertRaises(TypeError, computation_impl.ComputationImpl, 10,
                      context_stack_impl.context_stack)
Esempio n. 17
0
def _make_sequence_map_value(executor, source_type, target_type):
    intrinsic_spec = pb.Intrinsic(uri=intrinsic_defs.SEQUENCE_MAP.uri)
    type_spec = _make_sequence_map_type(source_type, target_type)
    comp_pb = pb.Computation(type=type_serialization.serialize_type(type_spec),
                             intrinsic=intrinsic_spec)
    return _run_sync(executor.create_value(comp_pb, type_spec))
Esempio n. 18
0
 def proto(self):
     return pb.Computation(type=type_serialization.serialize_type(
         self.type_signature),
                           intrinsic=pb.Intrinsic(uri=self._uri))
def create_dummy_computation_intrinsic():
    value = pb.Computation(
        type=type_serialization.serialize_type(tf.int32),
        intrinsic=pb.Intrinsic(uri=intrinsic_defs.GENERIC_ZERO.uri))
    type_signature = computation_types.TensorType(tf.int32)
    return value, type_signature
Esempio n. 20
0
def _make_sequence_reduce_value(executor, element_type, accumulator_type):
    intrinsic_spec = pb.Intrinsic(uri=intrinsic_defs.SEQUENCE_REDUCE.uri)
    type_spec = _make_sequence_reduce_type(element_type, accumulator_type)
    comp_pb = pb.Computation(type=type_serialization.serialize_type(type_spec),
                             intrinsic=intrinsic_spec)
    return _run_sync(executor.create_value(comp_pb, type_spec))