)]}'
{
  "log": [
    {
      "commit": "f6dec819824dd90c3428aba429535272247591f8",
      "tree": "e455998cfb096694ed3b58597d70535de8834f49",
      "parents": [
        "4cc9b88950b276acb15305c9079b3ceace4dfd7c"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Fri Sep 11 03:32:52 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Sep 11 03:33:32 2026"
      },
      "message": "Protect against integer overflow in DT_STRING tensor parsing causing out-of-bounds heap access.\n\nPiperOrigin-RevId: 979554703\n"
    },
    {
      "commit": "4cc9b88950b276acb15305c9079b3ceace4dfd7c",
      "tree": "fc005dd6056a4a87ab7c82936a1848cfaabb69c5",
      "parents": [
        "e1aafef603fd002523b8de7bb9bec5eabb0eb4fd"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu Sep 10 18:21:34 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Sep 10 18:22:46 2026"
      },
      "message": "Fix missing DT_INVALID check in rvalue Tensor::FromProto and other Tensor cleanup\n\nPiperOrigin-RevId: 979292654\n"
    },
    {
      "commit": "e1aafef603fd002523b8de7bb9bec5eabb0eb4fd",
      "tree": "d1c98979c6baa0f3f860f4af8a7f78821dca0615",
      "parents": [
        "dea4aeeb669889d3f6d20cea35c0d38fb82be87f"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu Sep 10 17:36:06 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Sep 10 17:36:57 2026"
      },
      "message": "Disable flaky Partition_NoiseScaleIncreasesWithNumPartitions test\n\nPiperOrigin-RevId: 979267127\n"
    },
    {
      "commit": "dea4aeeb669889d3f6d20cea35c0d38fb82be87f",
      "tree": "d5994cd962d1eca366e55a8a0b63c0377796602f",
      "parents": [
        "01e3718148407117dcfed422119d88b1dc5e84be"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Sep 08 18:45:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Sep 08 18:46:01 2026"
      },
      "message": "Fix variable name collision in StreamingRemoteExecutor for nested structures.\n\nPiperOrigin-RevId: 978031474\n"
    },
    {
      "commit": "01e3718148407117dcfed422119d88b1dc5e84be",
      "tree": "6d228439ea930baa6bf07a7f3fb3536fdc94369d",
      "parents": [
        "bc14789a9e0a73b03dd0a7006e9da49d589c322a"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Tue Sep 08 16:03:57 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Sep 08 16:04:55 2026"
      },
      "message": "Remove dead tensor_serialization helper library in TFF C++ executors.\n\nRemoves unused `tensor_serialization.h`, `tensor_serialization.cc`, and the `:tensor_serialization` cc_library rule.\n\nPiperOrigin-RevId: 977943513\n"
    },
    {
      "commit": "bc14789a9e0a73b03dd0a7006e9da49d589c322a",
      "tree": "ad910320ca9f64add8293bf7529d123e9edcbd09",
      "parents": [
        "b8622b1d76a9334033fd83e6cfad77f0c370f86b"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Tue Sep 01 19:47:03 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Sep 01 19:47:51 2026"
      },
      "message": "Implement DisposalQueue for batching remote ValueRef disposals.\n\nPiperOrigin-RevId: 974653335\n"
    },
    {
      "commit": "b8622b1d76a9334033fd83e6cfad77f0c370f86b",
      "tree": "b3b8b27330b6479240d30ba967bc4d971e36068f",
      "parents": [
        "3bf048988402343a2ed640d2193def6b2469997d"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Tue Sep 01 17:48:00 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Sep 01 17:48:42 2026"
      },
      "message": "Deprecate `tff.learning.models.VariableModel` in favor of `tff.learning.models.FunctionalModel`.\n\nPiperOrigin-RevId: 974584776\n"
    },
    {
      "commit": "3bf048988402343a2ed640d2193def6b2469997d",
      "tree": "9bd457f55c3302547747cc3837422f3c9c67c5ef",
      "parents": [
        "69c243ffb9c41b8ea629407976c4a7e257026f42"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Mon Aug 31 22:24:34 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Aug 31 22:25:07 2026"
      },
      "message": "Wire ArrayContentFromTensor into TensorFlowExecutor::MaterializeValue.\n\nPiperOrigin-RevId: 974108899\n"
    },
    {
      "commit": "69c243ffb9c41b8ea629407976c4a7e257026f42",
      "tree": "b18a38811913d4e702b3f77e1e31d88e93859626",
      "parents": [
        "f8252b9074f84312c432c873f0124894c982a91c"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Mon Aug 31 20:13:50 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Aug 31 20:14:40 2026"
      },
      "message": "Optimize array tensor conversions and bump federated_language to 0.5.4.\n\nPiperOrigin-RevId: 974039756\n"
    },
    {
      "commit": "f8252b9074f84312c432c873f0124894c982a91c",
      "tree": "e705283d18ed6847be69cc5543d6f56e4683e956",
      "parents": [
        "3f3e1dca6cb2256b2e20db90cf0298b1fbe1d6f8"
      ],
      "author": {
        "name": "Zachary Garrett CA",
        "email": "zachgarrett@google.com",
        "time": "Mon Aug 31 17:25:10 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Aug 31 17:26:42 2026"
      },
      "message": "Use `absl::AnyInvocable` in `ThreadPool` and `ThreadRun` to eliminate per-task heap allocations.\n\nPiperOrigin-RevId: 973953602\n"
    },
    {
      "commit": "3f3e1dca6cb2256b2e20db90cf0298b1fbe1d6f8",
      "tree": "dc1e0ed55b2cc3893052f42f5f6bb8ea11712a1c",
      "parents": [
        "010265be729e36f50a0e5c38f7478e21c986d50f"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Sun Aug 23 19:25:43 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Aug 23 19:26:10 2026"
      },
      "message": "Optimize SessionProvider, TensorFlowExecutor computation caching, and SequenceExecutor move semantics in TFF C++ executors.\n\n- Use std::move on GraphDef in SessionProvider and pre-check for container ops to avoid redundant GraphDef deep copies during session creation.\n- Coordinate concurrent TensorFlowExecutor computation caching with std::shared_future to eliminate redundant graph parsing on cache misses.\n- Use std::move on structure vector in SequenceExecutorValue::CreateStruct to avoid deep vector copies.\n- Add microbenchmarks for SessionProvider, TensorFlowExecutor computation caching, and SequenceExecutor move semantics.\n\nPiperOrigin-RevId: 969465176\n"
    },
    {
      "commit": "010265be729e36f50a0e5c38f7478e21c986d50f",
      "tree": "cf1f1641283e72e45e0ce7f1f3f8ecd4b93652c5",
      "parents": [
        "15cbc93d36e2528ff9ffb4700f5cbecc9949f1d4"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Sun Aug 23 14:45:07 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Aug 23 14:45:37 2026"
      },
      "message": "Optimize tensor serialization and deserialization in TFF C++ executors and remove dead tensor_serialization helper library.\n\n- Replaces redundant intermediate tensorflow::TensorProto copies in `tensorflow_utils.cc` with direct zero-copy `absl::MakeCordFromExternal` and `CopyToArray`.\n- Adds explicit validation for `DataTypeCanUseMemcpy`, rejecting unsupported dtypes (`DT_STRING`) with `InvalidArgumentError` instead of crashing.\n- Adds pre-allocation bounds checking, empty-tensor guards, and `DT_BOOL` byte validation.\n- Removes unused `tensor_serialization.h`, `tensor_serialization.cc`, and the `:tensor_serialization` cc_library rule.\n\nPiperOrigin-RevId: 969390705\n"
    },
    {
      "commit": "15cbc93d36e2528ff9ffb4700f5cbecc9949f1d4",
      "tree": "2295216d9fb7242905cf625873e68901cb1339b4",
      "parents": [
        "63f73da486b2a98e1de1538b4d22834eaaea19ab"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Sat Aug 22 21:35:09 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Aug 22 21:35:43 2026"
      },
      "message": "Optimize tensor serialization and deserialization in TFF C++ executors and remove dead tensor_serialization helper library.\n\n- Replaces redundant intermediate tensorflow::TensorProto copies in `tensorflow_utils.cc` with direct zero-copy `absl::MakeCordFromExternal` and `CopyToArray`.\n- Adds explicit validation for `DataTypeCanUseMemcpy`, rejecting unsupported dtypes (`DT_STRING`) with `InvalidArgumentError` instead of crashing.\n- Adds pre-allocation bounds checking, empty-tensor guards, and `DT_BOOL` byte validation.\n- Removes unused `tensor_serialization.h`, `tensor_serialization.cc`, and the `:tensor_serialization` cc_library rule.\n\nPiperOrigin-RevId: 969128411\n"
    },
    {
      "commit": "63f73da486b2a98e1de1538b4d22834eaaea19ab",
      "tree": "cf1f1641283e72e45e0ce7f1f3f8ecd4b93652c5",
      "parents": [
        "6ac5ee389a86a483a0175b8b00fdc7faac221abb"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Fri Aug 21 18:49:28 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Aug 21 18:49:58 2026"
      },
      "message": "Eliminate redundant protobuf copies in TFF C++ executors.\n\nLarge tensor payloads passed to C++ executors previously incurred redundant deep copies during asynchronous thread dispatch and value materialization:\n\n- `RemoteExecutor`: `CreateValueRequest` is now populated synchronously and moved into the worker thread closure (`[request \u003d std::move(request)]`), eliminating an extra heap copy of `v0::Value`.\n- `TensorFlowExecutor`: Added an optional `synchronous_value_creation` flag (defaulting to `false`) to `TensorFlowExecutor` and `CreateTensorFlowExecutor`. When enabled, tensor values are parsed synchronously into `ReadyFuture`, preventing large protobuf payloads from being cloned onto the thread pool heap.\n- `StreamingRemoteExecutor`: In `Materialize`, intermediate struct values are now bound by const reference (`const v0::Value::Struct\u0026`) instead of being copied by value.\n\nPiperOrigin-RevId: 968612635\n"
    },
    {
      "commit": "6ac5ee389a86a483a0175b8b00fdc7faac221abb",
      "tree": "7775aaa9526e7f2fef612e5057bd946116ea2040",
      "parents": [
        "aa4da04b70147f6a622a7f70d57f9331faee56a5"
      ],
      "author": {
        "name": "Hana Joo",
        "email": "hanajoo@google.com",
        "time": "Fri Aug 21 16:16:40 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Aug 21 16:17:11 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 968534492\n"
    },
    {
      "commit": "aa4da04b70147f6a622a7f70d57f9331faee56a5",
      "tree": "45f0f218cf8eac2eb3a1422940ca5d4d0a26f990",
      "parents": [
        "2925cc4b11b5c336e7cf86a21ce4a57e6a1f5cd2"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Aug 18 16:54:26 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Aug 18 16:55:40 2026"
      },
      "message": "Use boolean keepdims\u003dTrue in Adafactor optimizer reduction.\n\nPiperOrigin-RevId: 966652301\n"
    },
    {
      "commit": "2925cc4b11b5c336e7cf86a21ce4a57e6a1f5cd2",
      "tree": "994baf0890ac8310f48e25d0d867fad83e9be264",
      "parents": [
        "e97e552c8684f58f31333225fe2efac9cd586f73"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Aug 18 00:20:05 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Aug 18 00:20:38 2026"
      },
      "message": "Allow ValueError in test_type_error_in_client_update_statistics_with_int32.\n\nThis will be required in the future for https://github.com/tensorflow/tensorflow/pull/112634\n\nPiperOrigin-RevId: 966268907\n"
    },
    {
      "commit": "e97e552c8684f58f31333225fe2efac9cd586f73",
      "tree": "5c3d72fc1170990e084eb99505efd88a444264ee",
      "parents": [
        "c0f0d33fac4c6215d60203ccd5a3c318e631b1b4"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Mon Aug 17 06:51:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Aug 17 06:51:48 2026"
      },
      "message": "Fix: Handle negative ordinals in GroupByAggregator\n\nThis change updates GroupByAggregator to safely ignore negative ordinals. It ensures that `contributors_to_groups_.ExtendTo(...)` is not called with a negative parameter, which converted to `size_t` results in trying to allocate a too large array resulting in OOM.\n\n`GroupByAggregator` also had the issue of calling `ExtendTo` with an \"off by one\" index. This doesn\u0027t cause any failures, but it leads to calling `resize` twice. Once for with `max_ordinal`, and once again when `max_ordinal` is actually added by `AddToGroup`.\n\nIn general, ordinals should not be negative and this is a temporary fix before a broader refactor.\n\nPiperOrigin-RevId: 965775577\n"
    },
    {
      "commit": "c0f0d33fac4c6215d60203ccd5a3c318e631b1b4",
      "tree": "3fcfba83835bd26e6dcb2eb6f0e75dc5bc6e51f0",
      "parents": [
        "45c4d8e7e3e6b1654af5ca99fb54856759556c8e"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Sat Aug 15 04:09:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Aug 15 04:09:36 2026"
      },
      "message": "Fix TFF _partition_value client partition counts when struct ends with SERVER field\n\nPiperOrigin-RevId: 965040195\n"
    },
    {
      "commit": "45c4d8e7e3e6b1654af5ca99fb54856759556c8e",
      "tree": "8dae6272864e0173c3926e519ef855ec3e3b8022",
      "parents": [
        "6587681b94c1929c88ac26b34551f88f04277e1d"
      ],
      "author": {
        "name": "Yu Xiao",
        "email": "xiaoyux@google.com",
        "time": "Mon Aug 03 18:05:15 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Aug 03 18:05:41 2026"
      },
      "message": "Add a metric to count clients with non-finite model deltas.\n\nPiperOrigin-RevId: 958471800\n"
    },
    {
      "commit": "6587681b94c1929c88ac26b34551f88f04277e1d",
      "tree": "4d3ccb5378322d6cb8d6688fab192f418ecb7001",
      "parents": [
        "f274ec060a823fb5feddc27a247cd929b1fffd32"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Jul 24 15:28:13 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 24 15:28:47 2026"
      },
      "message": "Update DP thresholding noise description.\n\nThis change updates the explanation of differential privacy (DP) thresholding behavior. It clarifies that groups between the minimum and maximum contributor thresholds have their membership decided by a biased coin flip. Minor formatting fixes are also included.\n\nPiperOrigin-RevId: 953380558\n"
    },
    {
      "commit": "f274ec060a823fb5feddc27a247cd929b1fffd32",
      "tree": "8cd94a985a7df19902ebfd5187164dc3627256c1",
      "parents": [
        "c2bd12dfd77bc189c66cf358087662ed51f81494"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Tue Jul 21 20:54:29 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jul 21 20:55:19 2026"
      },
      "message": "Test code cleanup when using tensors\n\nPiperOrigin-RevId: 951682132\n"
    },
    {
      "commit": "c2bd12dfd77bc189c66cf358087662ed51f81494",
      "tree": "bad237a5f69985e133e57a28c8d16bdfba316999",
      "parents": [
        "5039536a5a3ba423cd36ee13157b7c336a565315"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu Jul 16 19:55:31 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jul 16 19:55:57 2026"
      },
      "message": "Cleanup of Tensor::Create in test code\n\nPiperOrigin-RevId: 949124417\n"
    },
    {
      "commit": "5039536a5a3ba423cd36ee13157b7c336a565315",
      "tree": "eaff4bb74e30cf26140884f67904b93640b9d6ad",
      "parents": [
        "53fb39131252c1c3d0c33503a843dcd50e35c0e9"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Fri Jul 10 23:34:33 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 10 23:35:08 2026"
      },
      "message": "Tensor::Create cleanup in group_by_aggregator_test.cc\n\nPiperOrigin-RevId: 945949322\n"
    },
    {
      "commit": "53fb39131252c1c3d0c33503a843dcd50e35c0e9",
      "tree": "05a8c9e3766c2ce402b42891ce3f92d09fe72e7b",
      "parents": [
        "87d2781ace86b76c99c3f5c018d72afc3322247f"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Fri Jul 10 23:13:42 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 10 23:14:03 2026"
      },
      "message": "Tensor::Create cleanup in dp_tensor_aggregator_bundle_test\n\nPiperOrigin-RevId: 945940424\n"
    },
    {
      "commit": "87d2781ace86b76c99c3f5c018d72afc3322247f",
      "tree": "f88c19966bf8b3b88225b19d06a1b09244932a40",
      "parents": [
        "c603fa47ebebf9d5e28f5369be3dc2c2f3de721f"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Tue Jun 23 01:06:45 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jun 23 01:07:18 2026"
      },
      "message": "Internal change\n\nPiperOrigin-RevId: 936348471\n"
    },
    {
      "commit": "c603fa47ebebf9d5e28f5369be3dc2c2f3de721f",
      "tree": "0d7b8958d36421ef95a2424b744cb7f546b8b666",
      "parents": [
        "53b61f0e8c53b82304df19d9e7383655c218b736"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Mon Jun 22 19:50:47 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jun 22 19:51:32 2026"
      },
      "message": "Refactor DPGroupByAggregator sensitivity calculation for Partition().\n\nThis change introduces a new method, CalculatePartitionSensitivity, to compute the L1 sensitivity of the vector of partition lengths returned by Partition(). The sensitivity calculation now correctly accounts for the varint overhead scaling with the number of partitions influenced by a single user\u0027s contribution. The epsilon budget is no longer split across partitions when padding, as the noise is added to a vector-valued function whose L1 sensitivity is bounded.\n\nPiperOrigin-RevId: 936202994\n"
    },
    {
      "commit": "53b61f0e8c53b82304df19d9e7383655c218b736",
      "tree": "2ae4f184ee26d505798afa3a4f1144bc004731ed",
      "parents": [
        "a70b6c5d040643d13fbf86a9e7cdf6aad4b75c61"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Wed Jun 17 22:06:09 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jun 17 22:06:38 2026"
      },
      "message": "Cleanup Tensor construction code\n\nPiperOrigin-RevId: 933943963\n"
    },
    {
      "commit": "a70b6c5d040643d13fbf86a9e7cdf6aad4b75c61",
      "tree": "358eee23b147384ca6a2b625412312f49f9441e2",
      "parents": [
        "16164f8d85ba2957bc87ed087cd665a88cd10219"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Mon Jun 08 15:07:23 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jun 08 15:07:53 2026"
      },
      "message": "Find hermetic Python interpreter dynamically in test_python_package.\n\nPiperOrigin-RevId: 928569049\n"
    },
    {
      "commit": "16164f8d85ba2957bc87ed087cd665a88cd10219",
      "tree": "d809018c7dce04eadaa9ed01b04a511729fe62ec",
      "parents": [
        "d0ddabc85d17faa9f6ab8e4d0d22ac0ada103f4f"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu Jun 04 02:48:45 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 04 02:49:11 2026"
      },
      "message": "Optimize memory use when partitioning aggregators and serializing string tensors.\n\nPiperOrigin-RevId: 926411392\n"
    },
    {
      "commit": "d0ddabc85d17faa9f6ab8e4d0d22ac0ada103f4f",
      "tree": "44d2a11b162025ead0563e1ef8632dc150333e8f",
      "parents": [
        "2bc424f4e63d15d21c45d3b5e18e0856edf90f17"
      ],
      "author": {
        "name": "Matej Aleksandrov",
        "email": "maleksandrov@google.com",
        "time": "Mon Jun 01 22:42:00 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jun 01 22:42:21 2026"
      },
      "message": "Automated Code Change\n\nPiperOrigin-RevId: 924951315\n"
    },
    {
      "commit": "2bc424f4e63d15d21c45d3b5e18e0856edf90f17",
      "tree": "d49167f181740155b207639e33d731645bf30978",
      "parents": [
        "a955e8690a4380377475b406379b903e800e79c0"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu May 28 01:54:04 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 28 01:54:32 2026"
      },
      "message": "Add InMemoryCheckpointParser.\n\nPiperOrigin-RevId: 922467417\n"
    },
    {
      "commit": "a955e8690a4380377475b406379b903e800e79c0",
      "tree": "ef702f0c2e6c525f61a14d37bfab948da6377a9a",
      "parents": [
        "8f0a2d9fad426763e9df64b6d1bf845eaed3c9a8"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu May 21 21:47:18 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 21 21:48:30 2026"
      },
      "message": "Optimization of DpGroupByAggregator\n\nPiperOrigin-RevId: 919265818\n"
    },
    {
      "commit": "8f0a2d9fad426763e9df64b6d1bf845eaed3c9a8",
      "tree": "4bccc3d8c3a304f20b7a6d7185cf3828442fb021",
      "parents": [
        "189fb8e13aa97ff11653a95de631b305420f9a5a"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu May 21 03:15:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 21 03:16:02 2026"
      },
      "message": "Fix crash in `GroupByAggregator::Partition` when there are no keys.\n\nAlso, update `Partitioner::Create` to handle partitioning when there are no keys. This change routes the input to partition 0 when there are no keys defined, leaving all other partitions empty.\n\nPiperOrigin-RevId: 918787321\n"
    },
    {
      "commit": "189fb8e13aa97ff11653a95de631b305420f9a5a",
      "tree": "6659a6cafcc0b961a521d616bf7dfd363ed84d47",
      "parents": [
        "607fc75107251ff4be79e95bf5a1f6ec818052ae"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Mon May 18 22:43:34 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon May 18 22:44:07 2026"
      },
      "message": "Adopt TensorFlow-like strategy for TFF wheel building, upgrade to federated_language 0.5.3, and clean up typing-extensions.\n\nThis change updates TFF\u0027s build configuration to use a modern environment for GitHub Actions while targeting an older GLIBC version for wheel compatibility, upgrades the federated_language dependency to v0.5.3, and completely cleans up the direct typing-extensions dependency.\n\nWheel building updates:\n- Update .bazelrc to target GLIBC 2.27 via hermetic toolchain.\n- Update pyproject.toml to target manylinux_2_27_x86_64.\n- Relax GLIBC check in build_python_package.sh to allow version 2.27 or newer.\n- Update publish.yaml to use ubuntu:22.04 container and Python 3.12.\n\nFederated Language upgrade:\n- Upgrade federated_language to 0.5.3 in WORKSPACE, requirements.in, and pyproject.toml.\n- Re-compile pip lock files requirements_lock_3_12.txt and requirements_lock_3_13.txt using uv.\n- Regenerate python_deps.patch, structure_visibility.patch, and remove_compile_pip_requirements.patch to support v0.5.3 cleanly.\n\nTyping Extensions cleanup:\n- Refactor python imports in py_typecheck.py and executors_errors.py to standard library\u0027s typing.TypeGuard (supported natively in Python 3.12+).\n- Clean up TFF\u0027s internal BUILD files to completely remove direct dependencies on //third_party/py/typing_extensions.\n- Remove typing-extensions from pyproject.toml and requirements.in packaging files.\n- Update requirements-test.txt to remove the legacy pinned typing-extensions line.\n- Clean up copy.bara.sky to remove obsolete typing_extensions replacements and insertions.\n\nPiperOrigin-RevId: 917466152\n"
    },
    {
      "commit": "607fc75107251ff4be79e95bf5a1f6ec818052ae",
      "tree": "93300b597e1a79f81fe90957ee2d04ca36ec7892",
      "parents": [
        "6137cc81dc6b534418bcd14a210b32ac577e0fe2"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Thu May 14 20:04:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 14 20:05:22 2026"
      },
      "message": "Add client timing metrics to Federated Averaging via compose_learning_process.\n\nThis change adds a `measure_timing` parameter to `compose_learning_process` in TensorFlow Federated, allowing it to measure the full on-device execution time of client work using data dependencies. The metrics (min, max, mean) are aggregated at the server.\n\nPiperOrigin-RevId: 915575603\n"
    },
    {
      "commit": "6137cc81dc6b534418bcd14a210b32ac577e0fe2",
      "tree": "5d660119d89eaf20f151fb30f8cfbf18dfbb7ebf",
      "parents": [
        "4e4b3db3c5b160c69de4055052fb7be4a06d4f5a"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Thu May 14 19:13:38 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 14 19:14:11 2026"
      },
      "message": "Improve error message for Python version check.\n\nThe error message now includes the Python version being used when it\u0027s older than the required 3.12.\n\nPiperOrigin-RevId: 915550679\n"
    },
    {
      "commit": "4e4b3db3c5b160c69de4055052fb7be4a06d4f5a",
      "tree": "e018e217b63a217ff3244c090f938a14db75714b",
      "parents": [
        "ae1d1730a92953d2b27787a6bce5d217c541093f"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed May 13 22:50:15 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed May 13 22:50:41 2026"
      },
      "message": "Extend support for Keras 3 APIs in tff.learning.\n\nPiperOrigin-RevId: 915101891\n"
    },
    {
      "commit": "ae1d1730a92953d2b27787a6bce5d217c541093f",
      "tree": "524016a47950dc79574f44555ba75d0e38d407c5",
      "parents": [
        "94e744beb84a6ce4fa65c52159a3d4caf1a74bbd"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed May 13 21:19:26 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed May 13 21:20:04 2026"
      },
      "message": "Tooling change\n\nPiperOrigin-RevId: 915055035\n"
    },
    {
      "commit": "94e744beb84a6ce4fa65c52159a3d4caf1a74bbd",
      "tree": "8a60cb798fc6686d516135742e1130ea78e78db3",
      "parents": [
        "8b8f2eb89d04fd607a5616e2b18ecce271baad3d"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Mon May 11 18:43:05 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon May 11 18:43:28 2026"
      },
      "message": "Extend TFF to accept Keras 3 losses and metrics.\n\nPiperOrigin-RevId: 913805333\n"
    },
    {
      "commit": "8b8f2eb89d04fd607a5616e2b18ecce271baad3d",
      "tree": "082a1982c3e0fbd234f74a8ee44169bb1f27e7e9",
      "parents": [
        "ee7728a5c1c0883aa20359d37ae7982b41416af1"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Mon May 11 18:08:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon May 11 18:10:25 2026"
      },
      "message": "Internal change\n\nPiperOrigin-RevId: 913787729\n"
    },
    {
      "commit": "ee7728a5c1c0883aa20359d37ae7982b41416af1",
      "tree": "11af66e8334b16b67f40ad87062e9507eac44530",
      "parents": [
        "66bb66edc86137131dc109e043dcc2a77658130a"
      ],
      "author": {
        "name": "Hana Joo",
        "email": "hanajoo@google.com",
        "time": "Sat May 09 13:31:51 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat May 09 13:32:32 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 912966712\n"
    },
    {
      "commit": "66bb66edc86137131dc109e043dcc2a77658130a",
      "tree": "c13bb962bb5c2538bcbcf41a9d19c2327f5c5ee7",
      "parents": [
        "db0b473533e885562142b64c756f3db4f5ccc887"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Mon May 04 21:05:07 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon May 04 21:05:41 2026"
      },
      "message": "Name the Tensor created in SetParameterIfUnset, to ensure consistency with DPGroupByFactory.\n\nThe factory uses the `name` field of parameter Tensors to validate that the correct parameters are set. Omitting the name will cause validation to fail.\n\nPiperOrigin-RevId: 910231002\n"
    },
    {
      "commit": "db0b473533e885562142b64c756f3db4f5ccc887",
      "tree": "b605136176685989795fe1fca5e7e8dde80c03c6",
      "parents": [
        "4003543e9ef0f9ccf1207b70b9aa588c63015fce"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Apr 24 15:53:40 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Apr 24 15:54:16 2026"
      },
      "message": "Add GetNoiseDescription to DPGroupByAggregator and DPThresholdingHistogram.\n\nThis change introduces a new method, GetNoiseDescription, to DPGroupByAggregator. This method provides a human-readable description of the differential privacy noise added during aggregation. The description includes the 90% confidence interval for the DP error, the type of noise distribution (Laplace or Gaussian) and its standard deviation, and any thresholds applied to noisy sums.\n\nDPThresholdingHistogram overrides this method to also include information about the minimum number of contributors required for a group to be included in the output.\n\nPiperOrigin-RevId: 905055280\n"
    },
    {
      "commit": "4003543e9ef0f9ccf1207b70b9aa588c63015fce",
      "tree": "a31b87c7d7226cbb842cdeb352d3f91224d6712a",
      "parents": [
        "0ae16ad64fd482fc7068f4d885b4dd67c6c19efb"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Thu Apr 23 20:31:19 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Apr 23 20:31:51 2026"
      },
      "message": "Code cleanup: dp_quntile_aggregator.cc\n\nPiperOrigin-RevId: 904611129\n"
    },
    {
      "commit": "0ae16ad64fd482fc7068f4d885b4dd67c6c19efb",
      "tree": "2359a4527bb5f95687691f7eaad848c04e98c075",
      "parents": [
        "34a6318a27c6da0efb99abc04f231dfa56231374"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Tue Apr 21 01:58:52 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 21 01:59:29 2026"
      },
      "message": "Introduce dp_fedsql_util for applying auto-tuning DP parameters to the intrinsics configuration\n\nPiperOrigin-RevId: 902929812\n"
    },
    {
      "commit": "34a6318a27c6da0efb99abc04f231dfa56231374",
      "tree": "9b37ab9c1084953df1e56b75df1ebe8a9dab2de8",
      "parents": [
        "672e08b6b3d73ccf86965a12ea9afe0bb8e1cdfa"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed Apr 08 13:32:39 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 08 13:33:13 2026"
      },
      "message": "Optimize: Use absl::InlinedVector for TensorShape dimension sizes.\n\nPiperOrigin-RevId: 896465002\n"
    },
    {
      "commit": "672e08b6b3d73ccf86965a12ea9afe0bb8e1cdfa",
      "tree": "b05550324d0ab0353aa66688521a7c20d096952d",
      "parents": [
        "5185729975f99d8f5f719ee066f81672ca48352e"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Apr 07 14:42:42 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 07 14:43:19 2026"
      },
      "message": "Change factory construction of DPGroupByAggregators to enable filtering of out-of-domain contributions during Accumulation.\n\nPiperOrigin-RevId: 895895588\n"
    },
    {
      "commit": "5185729975f99d8f5f719ee066f81672ca48352e",
      "tree": "91abf3ed4aa56fc72c5438ac437b7dda0b771492",
      "parents": [
        "0cfd4cbd4e231f1ed60bf40a0713c3334323acba"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Wed Apr 01 19:04:32 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 19:05:04 2026"
      },
      "message": "Refactor DPGroupByAggregators to create their DPHistogramBundles upon creation.\n\nThis will allow us to query the details of the noise mechanism before Accumulating any input or requesting a Report.\n\nAlong the way, introduce a Create method to DPExhaustiveReportHistogram.\n\nPiperOrigin-RevId: 893047388\n"
    },
    {
      "commit": "0cfd4cbd4e231f1ed60bf40a0713c3334323acba",
      "tree": "ad0bbcdcc9bdb705a897cf9e52e044821fd2209c",
      "parents": [
        "bfe964f86dcbf096bdc06e1113073622b6e972ee"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Mon Mar 30 17:16:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Mar 30 17:16:57 2026"
      },
      "message": "Add DomainSpec support to DPCompositeKeyCombiner.\n\nThis change allows DPCompositeKeyCombiner to filter out keys that are not present in a provided DomainSpec during the accumulation process. Out-of-domain keys are mapped to kNoOrdinal.\n\nPiperOrigin-RevId: 891781590\n"
    },
    {
      "commit": "bfe964f86dcbf096bdc06e1113073622b6e972ee",
      "tree": "0a5fe937889add7329e1f2bd4e1327c624cba72a",
      "parents": [
        "949948a8b6e730f9f0d57ef9fb4479005af2dc3e"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Thu Mar 26 15:34:06 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 26 15:34:41 2026"
      },
      "message": "Apply the same padding logic done in DPGroupByAggregator::Serialize() to an overridden Partition method.\n\nFor each serialized state emitted by Partition, we add a random amount of extra characters. The length is calculated the same way as Serialize(), except we scale epsilon and delta for \u003e1 outputs.\n\nAlong the way, make DPGroupByAggregator::Serialize() a protected member instead of a public one, in line with GroupByAggregator.\n\nPiperOrigin-RevId: 889859778\n"
    },
    {
      "commit": "949948a8b6e730f9f0d57ef9fb4479005af2dc3e",
      "tree": "2a47fd7376c95739511669407445ba6b8cf8c917",
      "parents": [
        "f2f7cd8a82938b256d07d617857a969d5124543a"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Wed Mar 25 15:15:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 25 15:15:59 2026"
      },
      "message": "Introduce DomainSpec class and supporting classes.\n\nThe DomainSpec class exists to allow searching for membership in each of a vector of tensors in constant rather than linear time (after creation). This will be useful for filtering inputs according to whether they contain a key in a preprovided list of allowed keys.\n\nPiperOrigin-RevId: 889253220\n"
    },
    {
      "commit": "f2f7cd8a82938b256d07d617857a969d5124543a",
      "tree": "c2b32118132f742cf31039e8eb333d6d2b3e4d04",
      "parents": [
        "07e6238ef0899917b4c8ebd249b519761b64f105"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Wed Mar 25 14:03:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 25 14:04:33 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 889221761\n"
    },
    {
      "commit": "07e6238ef0899917b4c8ebd249b519761b64f105",
      "tree": "c0e9a607cd7831a89fe91aaa5dd8f94d179913de",
      "parents": [
        "aa2fa7677dd25cc433e5539060bd138bd4e96d02"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Mar 20 19:50:39 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Mar 20 19:51:10 2026"
      },
      "message": "Correct the implementation of reservoir sampling inside DPQuantileAggregator during a merge.\n\nPreviously we did not weigh the sizes of the `other` aggregator correctly: those that were fed many inputs should have a greater probability of contributing to the merged list of values than smaller ones.\n\nAlong the way, update `PrefixSumAboveThreshold` to call `NoisedValueAboveThreshold` in lieu of explicitly sampling noise and performing the comparison.\n\nPiperOrigin-RevId: 886932106\n"
    },
    {
      "commit": "aa2fa7677dd25cc433e5539060bd138bd4e96d02",
      "tree": "b28daae178a6a131460c05acc851984c5146e68e",
      "parents": [
        "a73f1d92d4616a7ac3ce7e5e04fd0430326df201"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Thu Mar 19 22:48:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 19 22:48:56 2026"
      },
      "message": "Remove nokokoro tags and switch to pybind11 extensions for C++ execution in OSS.\n\nAll pybind11 extension targets now build and pass tests in the OSS\nenvironment after fixing the pybind11 version mismatch (v2.9.2 -\u003e v2.13.4)\nand numpy_headers reference issue.\n\nPiperOrigin-RevId: 886415345\n"
    },
    {
      "commit": "a73f1d92d4616a7ac3ce7e5e04fd0430326df201",
      "tree": "2b1a3d040d7e844eabe35d8c7f64523e531815af",
      "parents": [
        "9b1b48774a9851f99cc34b67465d7e90bbe1430b"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed Mar 18 17:16:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 18 17:17:25 2026"
      },
      "message": "Vendor checkpoint_reader.h into TFF.\n\nThe tensorflow/c/checkpoint_reader.h header is not shipped with the\nTensorFlow pip package, but all its transitive dependencies are.\nVendor a copy as tf_checkpoint_reader.{h,cc} and update all consumers\nto use the vendored copy.\n\nPiperOrigin-RevId: 885662384\n"
    },
    {
      "commit": "9b1b48774a9851f99cc34b67465d7e90bbe1430b",
      "tree": "5103b2c9f64abc67ab31c0a2202ec5055ba69a8e",
      "parents": [
        "b2ef5ad2ffac10d5054271dc34760bad0b0327e0"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed Mar 18 14:43:06 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 18 14:43:40 2026"
      },
      "message": "Change dataset materialization to use Session-based iteration.\n\nReplace the standalone.h dependency with a Session-based approach using\nDatasetFromGraph, IteratorV2, MakeIterator, and IteratorGetNext ops to\niterate datasets from serialized GraphDefs.\n\n- Add IterateDatasetFromGraphDef and ExtractOutputTypesAndShapesFromGraphDef\n  to dataset_utils.\n- Extend SequenceTensor with output types/shapes metadata.\n\nPiperOrigin-RevId: 885587905\n"
    },
    {
      "commit": "b2ef5ad2ffac10d5054271dc34760bad0b0327e0",
      "tree": "a574d71e819d221131b3478a10f44fbe9ecaaa00",
      "parents": [
        "f808ffee136ec5cadd6119bfb2e66e648a364491"
      ],
      "author": {
        "name": "Brett McLarnon",
        "email": "bmclarnon@google.com",
        "time": "Tue Mar 17 21:43:03 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 21:43:40 2026"
      },
      "message": "Move agg core tensorflow test utils to a separate file\n\nPiperOrigin-RevId: 885218716\n"
    },
    {
      "commit": "f808ffee136ec5cadd6119bfb2e66e648a364491",
      "tree": "53a68e91bf7d64070d58079ec572ce9645a1e087",
      "parents": [
        "b7bfdace65d6dab567e4a2bc56a57ec4e70ab476"
      ],
      "author": {
        "name": "Brett McLarnon",
        "email": "bmclarnon@google.com",
        "time": "Tue Mar 17 19:56:10 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 19:56:51 2026"
      },
      "message": "Use proto_library paths from @com_google_protobuf\n\nPiperOrigin-RevId: 885165824\n"
    },
    {
      "commit": "b7bfdace65d6dab567e4a2bc56a57ec4e70ab476",
      "tree": "9c3f2531c3e940150171e61d5f8b8bf43179a547",
      "parents": [
        "77644f808b2ecdd5004a94a5b9d535335d9d4483"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Mar 17 19:35:53 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 19:36:46 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 885155352\n"
    },
    {
      "commit": "77644f808b2ecdd5004a94a5b9d535335d9d4483",
      "tree": "a2d1882c8d84d51f19e9599d99241ee8868d7862",
      "parents": [
        "3490aa80819080013d7221c3bba3b6ae4f086fae"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Tue Mar 17 17:47:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 17:48:35 2026"
      },
      "message": "Vendor checkpoint_reader.h into TFF.\n\nThe tensorflow/c/checkpoint_reader.h header is not shipped with the\nTensorFlow pip package, but all its transitive dependencies are.\nVendor a copy as tf_checkpoint_reader.{h,cc} and update all consumers\nto use the vendored copy.\n\nPiperOrigin-RevId: 885102362\n"
    },
    {
      "commit": "3490aa80819080013d7221c3bba3b6ae4f086fae",
      "tree": "9c3f2531c3e940150171e61d5f8b8bf43179a547",
      "parents": [
        "1c3eef0c8f8d15e7d13296bb26e1d89b79a2f64a"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Tue Mar 17 15:54:30 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 15:55:05 2026"
      },
      "message": "Delete unused eager_computation code.\n\neager_computation.{h,cc} and eager_computation_test.cc are unused code\nthat is not referenced by any other target in the repository. Removing\nthem to reduce maintenance burden and simplify the dependency graph.\n\nPiperOrigin-RevId: 885048341\n"
    },
    {
      "commit": "1c3eef0c8f8d15e7d13296bb26e1d89b79a2f64a",
      "tree": "b447cf8019182ba2d49a5bfb5631afbccfe40738",
      "parents": [
        "89fdc38e9d4b0b09b2f692f34614a01306181592"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Mon Mar 16 17:13:13 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Mar 16 17:13:45 2026"
      },
      "message": "Update TensorFlow Federated to TensorFlow 2.21.0\n\nUpdate TFF\u0027s dependency on TensorFlow from 2.20.0 to 2.21.0. This includes:\n\n- Bump org_tensorflow to v2.21.0\n- Update rules_python from 0.39.0 to 1.6.0 with TF 2.21 patches\n- Update bazel_skylib from 1.3.0 to 1.7.1\n- Update gRPC from 1.68.2 to 1.74.0\n- Update keras from ~\u003d3.11.3 to ~\u003d3.12.0\n- Remove com_google_protobuf definition (now provided by TF\u0027s python_init_rules)\n- Restructure WORKSPACE Python init to follow TF 2.21 pattern\n  (python_init_rules/repositories/toolchains instead of direct rules_python)\n- Update @local_xla -\u003e @xla and @local_tsl -\u003e @tsl references\n  (TF 2.21 renamed vendored repos)\n- Update internal_visibility.patch for TF 2.21\n- Remove tensor_testutil.patch (fixed upstream in TF 2.21)\n- Regenerate requirements lock files\n\nPiperOrigin-RevId: 884507763\n"
    },
    {
      "commit": "89fdc38e9d4b0b09b2f692f34614a01306181592",
      "tree": "dc06711c62efe93ca2ebf242a7ed194263de94c6",
      "parents": [
        "6d87d0b89977262d78b05a5873e837962fbbd85e"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Fri Mar 13 00:26:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Mar 13 00:27:22 2026"
      },
      "message": "Optimize CompositeKey storage\n\nPiperOrigin-RevId: 882863522\n"
    },
    {
      "commit": "6d87d0b89977262d78b05a5873e837962fbbd85e",
      "tree": "cae7ab9e27224a245346be72cb7f564c6d422a88",
      "parents": [
        "3e82bbac418bcd73b3352b63801a14d382675928"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Wed Mar 11 20:35:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 11 20:35:57 2026"
      },
      "message": "reverting a CL that accidentally got submitted.\n\nPiperOrigin-RevId: 882172394\n"
    },
    {
      "commit": "3e82bbac418bcd73b3352b63801a14d382675928",
      "tree": "77644c7d42072e97ba6ffcc44c6661c5ea089463",
      "parents": [
        "2417d72c9df5be8bdabce2a67a93ee2aada5d4fb"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Wed Mar 11 18:07:26 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 11 18:09:13 2026"
      },
      "message": "Automated Code Change\n\nPiperOrigin-RevId: 882104291\n"
    },
    {
      "commit": "2417d72c9df5be8bdabce2a67a93ee2aada5d4fb",
      "tree": "cae7ab9e27224a245346be72cb7f564c6d422a88",
      "parents": [
        "6b4623e478b6c1bc82d49602bfe0426bd28b37f6"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Tue Mar 10 01:32:02 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 10 01:32:28 2026"
      },
      "message": "Add LoadAllTensors to CheckpointParser interface and FC CheckpointParser implementation.\n\nPiperOrigin-RevId: 881138186\n"
    },
    {
      "commit": "6b4623e478b6c1bc82d49602bfe0426bd28b37f6",
      "tree": "a2590369427430ebaf7c12ec0ca79ba46054a828",
      "parents": [
        "1dc6144b5584b79a895935b7569a8f7ef8ef8d47"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Mon Mar 09 16:53:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Mar 09 16:53:36 2026"
      },
      "message": "Rename DP histogram implementations for clarity.\n\nThis change renames `dp_open_domain_histogram` to `dp_thresholding_histogram` and `dp_closed_domain_histogram` to `dp_exhaustive_report_histogram`. These new names better reflect the mechanisms that will be includied in each after upcoming changes. Specifically the parts formally called OpenDomain will deal with thresholding within a closed domain. All references in BUILD files, includes, and tests have been updated accordingly.\n\nPiperOrigin-RevId: 880906117\n"
    },
    {
      "commit": "1dc6144b5584b79a895935b7569a8f7ef8ef8d47",
      "tree": "2fb771aa87483eb9164985f6cee72a700a736e3e",
      "parents": [
        "a544acc55405a758cb45908665984a3e7069de27"
      ],
      "author": {
        "name": "Amer Elsheikh",
        "email": "amere@google.com",
        "time": "Sat Mar 07 14:34:49 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Mar 07 14:35:23 2026"
      },
      "message": "Remove obsolete `...` annotations from all python files.\n\nPiperOrigin-RevId: 880109243\n"
    },
    {
      "commit": "a544acc55405a758cb45908665984a3e7069de27",
      "tree": "3751ae7c99cc748764d67be2f004b774c5c0d2d9",
      "parents": [
        "f51719385a77e397c9f2621f7cd04990e6d112ee"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Fri Mar 06 14:28:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Mar 06 14:29:01 2026"
      },
      "message": "Update TFF to TF 2.20.0.\n\nAdditionally:\n- Update transitive dependencies absl-py, dm-tree, grpcio, ml_dtypes, numpy, scipy, tqdm, and typing extensions.\n- Use Python 3.12 for building.\n- Use pypi depdenencies in BUILD files, rather than system installations.\n- Updates some Keras code to use `tf.identity(v)` in places that previously used `tf.Variable.read_value()` and unwrap `keras.Variable` objects when encountered.\nPiperOrigin-RevId: 879602059\n"
    },
    {
      "commit": "f51719385a77e397c9f2621f7cd04990e6d112ee",
      "tree": "0999dcc0a936335718e5fa57dd023bc6feca5087",
      "parents": [
        "7740ea3acefcda8c650ddb99b9e01ce31388b69f"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu Mar 05 02:43:13 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 02:43:36 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 878766908\n"
    },
    {
      "commit": "7740ea3acefcda8c650ddb99b9e01ce31388b69f",
      "tree": "f2f780075d2a40552645cf608762de15a60aaed6",
      "parents": [
        "e18fdf5e51736e74e6882ac6f89e62ce972402ba"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Thu Mar 05 00:21:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 00:22:25 2026"
      },
      "message": "Update TFF to TF 2.20.0.\n\nAdditionally:\n- Update transitive dependencies absl-py, dm-tree, grpcio, ml_dtypes, numpy, scipy, tqdm, and typing extensions.\n- Use Python 3.12 for building.\n- Use pypi depdenencies in BUILD files, rather than system installations.\n- Updates some Keras code to use `tf.identity(v)` in places that previously used `tf.Variable.read_value()` and unwrap `keras.Variable` objects when encountered.\nPiperOrigin-RevId: 878718277\n"
    },
    {
      "commit": "e18fdf5e51736e74e6882ac6f89e62ce972402ba",
      "tree": "0999dcc0a936335718e5fa57dd023bc6feca5087",
      "parents": [
        "7c3d88d1bd8b473e3a770540faf0c80430d64eee"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed Feb 25 22:24:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Feb 25 22:25:12 2026"
      },
      "message": "Remove Federated Reconstruction tutorial and related code.\n\nThis change removes the `federated_reconstruction_for_matrix_factorization.ipynb` tutorial, along with all references to it in the documentation and the associated `fed_recon` and `reconstruction_model` implementations from `tff.learning`. This is an ongoing effort to decompose TFF into core components.\n\nPiperOrigin-RevId: 875335830\n"
    },
    {
      "commit": "7c3d88d1bd8b473e3a770540faf0c80430d64eee",
      "tree": "903693a476f47f2ecd7dce7e2bbfdf8dfa6b550d",
      "parents": [
        "b666bf0a992d4503b54e023fe5e6a5f46df106d8"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Mon Feb 23 05:26:28 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Feb 23 05:27:07 2026"
      },
      "message": "Test to verify that Aggregation string tensor supports serialization of non UTF-8 bytes\n\nPiperOrigin-RevId: 873853146\n"
    },
    {
      "commit": "b666bf0a992d4503b54e023fe5e6a5f46df106d8",
      "tree": "bc3e38416360522c4df86e6c614c7f8b1f7e8d25",
      "parents": [
        "f878c97da08259ca4029a52d3b91065e51af9e86"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Thu Feb 12 23:44:50 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Feb 12 23:45:30 2026"
      },
      "message": "Update EMNIST synthetic data generation to use numpy.\n\nPiperOrigin-RevId: 869419053\n"
    },
    {
      "commit": "f878c97da08259ca4029a52d3b91065e51af9e86",
      "tree": "45e86e576505202ec2125d7aa10f23b74fff71be",
      "parents": [
        "71d59f560807b2d2ef1a5cf31eac45c64964eedf"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Wed Feb 11 19:58:29 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Feb 11 19:59:28 2026"
      },
      "message": "Enable the use of `L_1` norm bound when `min_contributors_to_group` is given. Previously, an error would have been thrown when the `L_inf` bound was absent.\n\nAlso, make explicit that we do not currently support the use of both `min_contributors_to_group` and closed domain key files.\n\nPiperOrigin-RevId: 868780248\n"
    },
    {
      "commit": "71d59f560807b2d2ef1a5cf31eac45c64964eedf",
      "tree": "4422613cc1c6c2a2d243302711554501fa85d5ab",
      "parents": [
        "8f384365370a321bcca1dc88677f087f87b31ecc"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Tue Feb 10 03:01:53 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Feb 10 03:03:10 2026"
      },
      "message": "Remove Vizier integration and example.\n\nThis change removes the `tff.learning.programs.train_model_with_vizier` and the associated example in `examples/learning/federated_program/vizier`. The `google-vizier` dependency is also removed from the project requirements.\n\nVizier has not been updated since Feb 2025 and is making it prohibitive to update to newer versions of TensorFlow.\n\nPiperOrigin-RevId: 867874128\n"
    },
    {
      "commit": "8f384365370a321bcca1dc88677f087f87b31ecc",
      "tree": "de8597739e1ab120d57cf42e3900dccc071ae00d",
      "parents": [
        "864d91cee5d091d4f1d046e51744fd5f5c6dc8a6"
      ],
      "author": {
        "name": "Galen Andrew",
        "email": "galenandrew@google.com",
        "time": "Mon Feb 09 23:15:01 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Feb 09 23:15:57 2026"
      },
      "message": "Use implementation of Gaussian calibration from dp_accounting.\n\nUpdates dp_accounting dependency to 0.6.0.\n\nPiperOrigin-RevId: 867795564\n"
    },
    {
      "commit": "864d91cee5d091d4f1d046e51744fd5f5c6dc8a6",
      "tree": "74d0369515a706fc6084f187f96797c274bd4c47",
      "parents": [
        "0040bea4c4ccd37f6e16feafac7ae433dd8bc279"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Feb 06 22:32:41 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Feb 06 22:33:25 2026"
      },
      "message": "When creating Intrinsics in dp_histogram_test_utils, allow for custom key types without appending the domain specification to the parameter list.\n\nPreviously, specifying non-empty key_types to `CreateIntrinsicWithKeyTypes` would automatically trigger the addition of the domain specification in the top-level intrinsic. Here, we introduce a boolean flag `add_spec` to the function (defaulting to `false`) and a separate `CreateIntrinsicWithKeyTypes_ClosedDomain` function that sets the flag to `true`.\n\nPiperOrigin-RevId: 866617783\n"
    },
    {
      "commit": "0040bea4c4ccd37f6e16feafac7ae433dd8bc279",
      "tree": "cfd19f85e0d13258ca68a1d9c344ac332d53bd25",
      "parents": [
        "3bcc48944dc1a89fbde2241f9c94b5559b26d13e"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Feb 06 22:06:33 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Feb 06 22:07:31 2026"
      },
      "message": "Add validation of keys to GroupByAggregator::ValidateInputs\n\nPreviously, type of the grouping keys given to GroupByAggregator::ValidateInputs could have been incorrect. Now, we call CompositeKeyCombiner::CheckValidAndGetShape to close that gap.\n\nPiperOrigin-RevId: 866607360\n"
    },
    {
      "commit": "3bcc48944dc1a89fbde2241f9c94b5559b26d13e",
      "tree": "e45d9f3ad7153d1773f6e2d5ee9a80bae0ec634d",
      "parents": [
        "8cce210e80a7efdb047643f084ef783e8b4503ec"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Tue Feb 03 21:23:19 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Feb 03 21:24:02 2026"
      },
      "message": "Remove SubsampleProcess.\n\nPiperOrigin-RevId: 865018294\n"
    },
    {
      "commit": "8cce210e80a7efdb047643f084ef783e8b4503ec",
      "tree": "4d1471b7bea969e7b2ba81a6405cff43e94b41ee",
      "parents": [
        "196926fb9dfb8bfc3bab579afc5225cfab16bbc1"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Tue Jan 27 01:05:57 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jan 27 01:07:02 2026"
      },
      "message": "Remove dependency on `tensorflow_privacy` by inlining.\n\nPiperOrigin-RevId: 861418523\n"
    },
    {
      "commit": "196926fb9dfb8bfc3bab579afc5225cfab16bbc1",
      "tree": "fbbc87e5d8ab9765e57e06bacf914bb4abcb75b5",
      "parents": [
        "aa505bf4a0eebd7fe190d8f2ff57404ff8098ef8"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Sat Jan 24 19:34:18 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Jan 24 19:35:05 2026"
      },
      "message": "Remove distributed DP aggregator and related code.\n\nPiperOrigin-RevId: 860569230\n"
    },
    {
      "commit": "aa505bf4a0eebd7fe190d8f2ff57404ff8098ef8",
      "tree": "6501d7f1b95060274bbcfda9fb1c23d34caddd79",
      "parents": [
        "11ad3d70fdb75e7d35fec394812a1202cc060677"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Tue Jan 06 18:04:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jan 06 18:05:32 2026"
      },
      "message": "Expose TensorFlow backend utilities in `tff.tensorflow`.\n\nPiperOrigin-RevId: 852827152\n"
    },
    {
      "commit": "11ad3d70fdb75e7d35fec394812a1202cc060677",
      "tree": "540e8a8ed30e1198b83784668a41b2bcf8864e7f",
      "parents": [
        "2107a62ebd797b0f65d7cdd3e75e08c52b5e2f5a"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Tue Jan 06 17:03:48 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jan 06 17:04:39 2026"
      },
      "message": "Use PositiveLaplaceMechanism in overridden DPGroupByAggregator::Serialize to add a noisy amount of padding and update Deserialize to match.\n\nAlso migrate the Deserialize test from the open domain test suite to the factory test suite.\n\nPiperOrigin-RevId: 852803743\n"
    },
    {
      "commit": "2107a62ebd797b0f65d7cdd3e75e08c52b5e2f5a",
      "tree": "9713721b61b905bd1b5900aaa99cd51ec7f80ca4",
      "parents": [
        "0559e2ceeef97a10147e7a3b9271ab0393ad1bb8"
      ],
      "author": {
        "name": "Yu Xiao",
        "email": "xiaoyux@google.com",
        "time": "Tue Dec 23 21:48:42 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Dec 23 21:49:45 2025"
      },
      "message": "Support nesterov in the TFF SGD optimizer.\n\nPiperOrigin-RevId: 848286929\n"
    },
    {
      "commit": "0559e2ceeef97a10147e7a3b9271ab0393ad1bb8",
      "tree": "f0408c40b106226022fb3dcf893f2fd6f4d36ab3",
      "parents": [
        "ade95e49db03c21fc586948aa3d0a1c4969d93ae"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu Dec 18 15:02:52 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Dec 18 15:03:37 2025"
      },
      "message": "Switch the storage of group contributions onto the ContributorsToGroups class, ready to add priv_id checking code.\n\nPiperOrigin-RevId: 846251013\n"
    },
    {
      "commit": "ade95e49db03c21fc586948aa3d0a1c4969d93ae",
      "tree": "3b251580dc21dc69e4263f178c3e52faae3c6c53",
      "parents": [
        "590104cb7c358ee5c4efa8937e0ccf93a5925265"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Thu Dec 11 02:03:52 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Dec 11 02:04:43 2025"
      },
      "message": "Add PositiveLaplaceMechanism.\n\nThis change introduces a `PositiveLaplaceMechanism` class, which post-processes the result of `LaplaceMechanism::AddNoise` to ensure that values are only ever shifted upward.\n\nPiperOrigin-RevId: 842966097\n"
    },
    {
      "commit": "590104cb7c358ee5c4efa8937e0ccf93a5925265",
      "tree": "1ac42bf183c3492130652ff68e629cf615046085",
      "parents": [
        "7cbcfabbb0820aba3a2311e11fa29ebdf124bd72"
      ],
      "author": {
        "name": "Stanislav Chiknavaryan",
        "email": "stanisc@google.com",
        "time": "Fri Dec 05 18:27:02 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Dec 05 18:27:40 2025"
      },
      "message": "Add Tensor constructors for scalar tensors and one-dimensional tensors.\n\nThis adds an ability to construct a tensor from a numeric or string scalar value, or from a vector, or from an initializer_list. The type of the tensor and the shape is deducted from the argument. Please note that construction will always succeed in these cases except when the type is unsupported, but since the type is known at compile time there is no need to return StatusOr. The more general construction method via Tensor::Create is still available for the cases when the simple construction is insufficient. But using these new constructors will make the code more concise and readable.\n\nExamples:\n\n// Scalar tensors\nTensor t1(123);\nTensor t2(123.4f);\nTensor t3(\"abc\");  // string_view or string\u0026, or string\u0026\u0026 are accepted too\n\n// One dimensional tensors\nTensor t4({1, 2, 3}); // std::vector\u003cT\u003e\u0026\u0026 is accepted too\nTensor t5({\"a\", \"b\", \"c\"}); // std::vector\u003cstd::string\u003e\u0026\u0026 is accepted too\n\nPiperOrigin-RevId: 840782940\n"
    },
    {
      "commit": "7cbcfabbb0820aba3a2311e11fa29ebdf124bd72",
      "tree": "e29ed1366cb8f23d890e8aac3d6eca782fdc4ae1",
      "parents": [
        "5af363b0f05e779666deb6f858822f933e060cf6"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu Dec 04 20:57:01 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Dec 04 20:57:43 2025"
      },
      "message": "Allow Tensor names to be updated after creation.\n\nPreviously set_name could only be used on unnamed Tensors.\n\nPiperOrigin-RevId: 840364212\n"
    },
    {
      "commit": "5af363b0f05e779666deb6f858822f933e060cf6",
      "tree": "032a8173b67487eedf71077bc0a13f87004b804b",
      "parents": [
        "662e1be56dc3a37812cc3c92860dca6aea02a16f"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Thu Dec 04 17:35:35 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Dec 04 17:36:32 2025"
      },
      "message": "Add Serialize sensitivity calculation.\n\nThis change introduces `CalculateSerializeSensitivity`, a method to compute the sensitivity of the serialized output size to a single `Accumulate` call, considering the byte sizes of different data types and varint encoding.\n\nAlong the way, update StringLengthCheck to create a default inner intrinsic instead of making one inline and remove unneeded `using` declarations in contributors_to_group_test.cc\n\nPiperOrigin-RevId: 840281117\n"
    },
    {
      "commit": "662e1be56dc3a37812cc3c92860dca6aea02a16f",
      "tree": "18790ff8446043f920e598afbc304383e3f59045",
      "parents": [
        "9eb9169473c67dc453507e708d487e3545a149c0"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Thu Dec 04 11:48:36 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Dec 04 11:49:30 2025"
      },
      "message": "Create first version of a ContributorsToGroups class to store the contributors to an aggregation during k-thresholding.\n\nPiperOrigin-RevId: 840169884\n"
    },
    {
      "commit": "9eb9169473c67dc453507e708d487e3545a149c0",
      "tree": "3684c79daa5811b72c6b8447decc513a3bf130f9",
      "parents": [
        "4f12c96e1ca4561b82b7a232540dc94447e03da0"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Fri Nov 21 22:50:57 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 21 22:51:52 2025"
      },
      "message": "Add `is_scalar()` method to Tensor.\n\nThis method returns true if the tensor contains a single element.\n\nPiperOrigin-RevId: 835367507\n"
    },
    {
      "commit": "4f12c96e1ca4561b82b7a232540dc94447e03da0",
      "tree": "2d371cca3a53b69af9dda5205f0ff055b2ef404e",
      "parents": [
        "3d193140ccdd3580dcf0fd8d6f90fa56fa85dd2e"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Fri Nov 21 20:37:05 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 21 20:37:44 2025"
      },
      "message": "Correctly update the contribution counts in DPOpenDomainHistogram: ignore ordinals that have negative value.\n\nThe result of DPCompositeKeyCombiner::Accumulate will include negative numbers to represent dropped contributions. Prior to this CL, an index error would have been thrown.\n\nPiperOrigin-RevId: 835321978\n"
    },
    {
      "commit": "3d193140ccdd3580dcf0fd8d6f90fa56fa85dd2e",
      "tree": "6181566f0143c68b56ae71697e3aad9c2f5472a6",
      "parents": [
        "c838f22e5703b17e23b1e98a43e057a16474065a"
      ],
      "author": {
        "name": "Albert Cheu",
        "email": "cheu@google.com",
        "time": "Thu Nov 13 19:32:40 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 13 19:33:33 2025"
      },
      "message": "Change the criteria for valid Intrinsics that encode DPGroupByAggregators: `delta` and `max_groups_contributed` (a.k.a. L0 bound) must both be positive.\n\nThe new criteria hold regardless of whether we are in the open or closed domain case. With these assurances, we will be able to randomly lengthen the outcome of Serialize()---via a new padding field---in a DP manner.\n\nPiperOrigin-RevId: 831941387\n"
    },
    {
      "commit": "c838f22e5703b17e23b1e98a43e057a16474065a",
      "tree": "d649d77f0b965da05ba4f6a027fdccf935cfd40c",
      "parents": [
        "5e8d352ce119dde61eb97f6f49341d2056fae6eb"
      ],
      "author": {
        "name": "Chris Kennelly",
        "email": "ckennelly@google.com",
        "time": "Thu Nov 13 00:34:10 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 13 00:35:04 2025"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 831586662\n"
    },
    {
      "commit": "5e8d352ce119dde61eb97f6f49341d2056fae6eb",
      "tree": "3ec123c0e6d97a04a0da9816a29be285201fe587",
      "parents": [
        "f9b451b46a39c540266a752bbf2dd2b4ff16e229"
      ],
      "author": {
        "name": "Galen Andrew",
        "email": "galenandrew@google.com",
        "time": "Wed Nov 12 23:52:48 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 12 23:53:44 2025"
      },
      "message": "Improved numerical stability, speed, and code clarity in Gaussian mechanism calibration.\n\nPiperOrigin-RevId: 831572175\n"
    },
    {
      "commit": "f9b451b46a39c540266a752bbf2dd2b4ff16e229",
      "tree": "5c29bf24d092bb2313e6833f60dad1836e6520d0",
      "parents": [
        "e4b11a9221de721917704f71b8b50795e0db93d6"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Wed Nov 12 16:08:21 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 12 16:09:05 2025"
      },
      "message": "Support compatible array shapes during serialization.\n\nPiperOrigin-RevId: 831393353\n"
    },
    {
      "commit": "e4b11a9221de721917704f71b8b50795e0db93d6",
      "tree": "4889746814a399a9ea9b509c054ed12179af087b",
      "parents": [
        "548eb85480a07423ed52f80461761e6a8f658bbc"
      ],
      "author": {
        "name": "Zachary Garrett",
        "email": "zachgarrett@google.com",
        "time": "Wed Nov 05 16:56:55 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 05 16:57:44 2025"
      },
      "message": "Remove tensorflow-model-optimization dependency from TFF.\n\nThis package has not been updated since Feb 2024.\n\nPiperOrigin-RevId: 828491280\n"
    },
    {
      "commit": "548eb85480a07423ed52f80461761e6a8f658bbc",
      "tree": "5f6e0aa8adc06692381bdaab725a47c2d1b5cf34",
      "parents": [
        "b79895f075fe8957b6b34c0717b4f8034e8d849c"
      ],
      "author": {
        "name": "TensorFlow Federated Team",
        "email": "no-reply@google.com",
        "time": "Mon Nov 03 16:53:14 2025"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 03 16:54:03 2025"
      },
      "message": "Add value serialization support for Array protos.\n\nPiperOrigin-RevId: 827518197\n"
    }
  ],
  "next": "b79895f075fe8957b6b34c0717b4f8034e8d849c"
}
