def test_raises_value_error_with_unrecognized_computation_selection(self): executor = create_test_executor() source, _ = executor_test_utils.create_whimsy_computation_tuple() type_signature = computation_types.StructType([]) # A `ValueError` will be raised because `create_value` can not handle the # following `pb.Selection`, because does not set either a name or an index # field. value = pb.Computation( type=type_serialization.serialize_type(type_signature), selection=pb.Selection(source=source)) with self.assertRaises(ValueError): self.run_sync(executor.create_value(value, type_signature))
class FederatingExecutorCreateValueTest(executor_test_utils.AsyncTestCase, parameterized.TestCase): # pyformat: disable @parameterized.named_parameters([ ('placement_literal', *executor_test_utils.create_whimsy_placement_literal()), ('computation_intrinsic', *executor_test_utils.create_whimsy_computation_intrinsic()), ('computation_lambda', *executor_test_utils.create_whimsy_computation_lambda_empty()), ('computation_tensorflow', *executor_test_utils.create_whimsy_computation_tensorflow_empty()), ('federated_type_at_clients', *executor_test_utils.create_whimsy_value_at_clients()), ('federated_type_at_clients_all_equal', *executor_test_utils.create_whimsy_value_at_clients_all_equal()), ('federated_type_at_server', *executor_test_utils.create_whimsy_value_at_server()), ('unplaced_type', *executor_test_utils.create_whimsy_value_unplaced()), ] + get_named_parameters_for_supported_intrinsics()) # pyformat: enable def test_returns_value_with_value_and_type(self, value, type_signature): executor = create_test_executor() result = self.run_sync(executor.create_value(value, type_signature)) self.assertIsInstance(result, executor_value_base.ExecutorValue) self.assertEqual(result.type_signature.compact_representation(), type_signature.compact_representation()) # pyformat: disable @parameterized.named_parameters([ ('placement_literal', *executor_test_utils.create_whimsy_placement_literal()), ('computation_intrinsic', *executor_test_utils.create_whimsy_computation_intrinsic()), ('computation_lambda', *executor_test_utils.create_whimsy_computation_lambda_empty()), ('computation_tensorflow', *executor_test_utils.create_whimsy_computation_tensorflow_empty()), ]) # pyformat: enable def test_returns_value_with_value_only(self, value, type_signature): executor = create_test_executor() result = self.run_sync(executor.create_value(value)) self.assertIsInstance(result, executor_value_base.ExecutorValue) self.assertEqual(result.type_signature.compact_representation(), type_signature.compact_representation()) # pyformat: disable @parameterized.named_parameters([ ('computation_intrinsic', *executor_test_utils.create_whimsy_computation_intrinsic()), ('computation_lambda', *executor_test_utils.create_whimsy_computation_lambda_empty()), ('computation_tensorflow', *executor_test_utils.create_whimsy_computation_tensorflow_empty()), ]) # pyformat: enable def test_returns_value_with_computation_impl(self, proto, type_signature): executor = create_test_executor() value = computation_impl.ConcreteComputation( proto, context_stack_impl.context_stack) result = self.run_sync(executor.create_value(value, type_signature)) self.assertIsInstance(result, executor_value_base.ExecutorValue) self.assertEqual(result.type_signature.compact_representation(), type_signature.compact_representation()) # pyformat: disable @parameterized.named_parameters([ ('federated_type_at_clients', *executor_test_utils.create_whimsy_value_at_clients()), ('federated_type_at_clients_all_equal', *executor_test_utils.create_whimsy_value_at_clients_all_equal()), ('federated_type_at_server', *executor_test_utils.create_whimsy_value_at_server()), ('unplaced_type', *executor_test_utils.create_whimsy_value_unplaced()), ] + get_named_parameters_for_supported_intrinsics()) # pyformat: enable def test_raises_type_error_with_value_only(self, value, type_signature): del type_signature # Unused. executor = create_test_executor() with self.assertRaises(TypeError): self.run_sync(executor.create_value(value)) # pyformat: disable @parameterized.named_parameters([ ('placement_literal', *executor_test_utils.create_whimsy_placement_literal()), ('computation_call', *executor_test_utils.create_whimsy_computation_call()), ('computation_intrinsic', *executor_test_utils.create_whimsy_computation_intrinsic()), ('computation_lambda', *executor_test_utils.create_whimsy_computation_lambda_empty()), ('computation_selection', *executor_test_utils.create_whimsy_computation_selection()), ('computation_tensorflow', *executor_test_utils.create_whimsy_computation_tensorflow_empty()), ('computation_tuple', *executor_test_utils.create_whimsy_computation_tuple()), ('federated_type_at_clients', *executor_test_utils.create_whimsy_value_at_clients()), ('federated_type_at_clients_all_equal', *executor_test_utils.create_whimsy_value_at_clients_all_equal()), ('federated_type_at_server', *executor_test_utils.create_whimsy_value_at_server()), ('unplaced_type', *executor_test_utils.create_whimsy_value_unplaced()), ] + get_named_parameters_for_supported_intrinsics()) # pyformat: enable def test_raises_type_error_with_value_and_bad_type(self, value, type_signature): del type_signature # Unused. executor = create_test_executor() bad_type_signature = computation_types.TensorType(tf.string) with self.assertRaises(TypeError): self.run_sync(executor.create_value(value, bad_type_signature)) # pyformat: disable @parameterized.named_parameters([ ('computation_call', *executor_test_utils.create_whimsy_computation_call()), ('computation_placement', *executor_test_utils.create_whimsy_computation_placement()), ('computation_reference', *executor_test_utils.create_whimsy_computation_reference()), ('computation_selection', *executor_test_utils.create_whimsy_computation_selection()), ('computation_tuple', *executor_test_utils.create_whimsy_computation_tuple()), ]) # pyformat: enable def test_raises_value_error_with_value(self, value, type_signature): executor = create_test_executor() with self.assertRaises(ValueError): self.run_sync(executor.create_value(value, type_signature)) def test_raises_value_error_with_unrecognized_computation_intrinsic(self): executor = create_test_executor() type_signature = computation_types.TensorType(tf.int32) # A `ValueError` will be raised because `create_value` can not recognize the # following intrinsic, because it has not been added to the intrinsic # registry. type_signature = computation_types.TensorType(tf.int32) value = pb.Computation( type=type_serialization.serialize_type(type_signature), intrinsic=pb.Intrinsic(uri='unregistered_intrinsic')) with self.assertRaises(ValueError): self.run_sync(executor.create_value(value, type_signature)) def test_raises_value_error_with_unrecognized_computation_selection(self): executor = create_test_executor() source, _ = executor_test_utils.create_whimsy_computation_tuple() type_signature = computation_types.StructType([]) # A `ValueError` will be raised because `create_value` can not handle the # following `pb.Selection`, because does not set either a name or an index # field. value = pb.Computation( type=type_serialization.serialize_type(type_signature), selection=pb.Selection(source=source)) with self.assertRaises(ValueError): self.run_sync(executor.create_value(value, type_signature)) # pyformat: disable @parameterized.named_parameters([ ('intrinsic_def_federated_aggregate', *executor_test_utils.create_whimsy_intrinsic_def_federated_aggregate()), ('intrinsic_def_federated_apply', *executor_test_utils.create_whimsy_intrinsic_def_federated_apply()), ('intrinsic_def_federated_eval_at_server', *executor_test_utils.create_whimsy_intrinsic_def_federated_eval_at_server()), ('intrinsic_def_federated_mean', *executor_test_utils.create_whimsy_intrinsic_def_federated_mean()), ('intrinsic_def_federated_sum', *executor_test_utils.create_whimsy_intrinsic_def_federated_sum()), ('intrinsic_def_federated_value_at_server', *executor_test_utils.create_whimsy_intrinsic_def_federated_value_at_server()), ('intrinsic_def_federated_weighted_mean', *executor_test_utils.create_whimsy_intrinsic_def_federated_weighted_mean()), ('intrinsic_def_federated_zip_at_server', *executor_test_utils.create_whimsy_intrinsic_def_federated_zip_at_server()), ('federated_type_at_server', *executor_test_utils.create_whimsy_value_at_server()), ]) # pyformat: enable def test_raises_value_error_with_no_target_executor_server( self, value, type_signature): factory = federated_resolving_strategy.FederatedResolvingStrategy.factory({ placements.CLIENTS: eager_tf_executor.EagerTFExecutor(), }) executor = federating_executor.FederatingExecutor( factory, eager_tf_executor.EagerTFExecutor()) value, type_signature = executor_test_utils.create_whimsy_value_at_server() with self.assertRaises(ValueError): self.run_sync(executor.create_value(value, type_signature)) def test_raises_value_error_with_unexpected_federated_type_at_clients(self): executor = create_test_executor() value = [10, 20] type_signature = computation_types.at_clients(tf.int32) with self.assertRaises(executors_errors.CardinalityError): self.run_sync(executor.create_value(value, type_signature)) def test_raises_type_error_with_unexpected_federated_type_at_clients_all_equal( self): executor = create_test_executor() value = [10] * 3 type_signature = computation_types.at_clients(tf.int32, all_equal=True) with self.assertRaises(TypeError): self.run_sync(executor.create_value(value, type_signature))