keras-rs-nightly 0.2.2.dev202508140338__tar.gz → 0.2.2.dev202508160334__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of keras-rs-nightly might be problematic. Click here for more details.

Files changed (61) hide show
  1. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/PKG-INFO +1 -1
  2. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/base_distributed_embedding.py +51 -38
  3. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/version.py +1 -1
  4. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs_nightly.egg-info/PKG-INFO +1 -1
  5. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/README.md +0 -0
  6. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/api/__init__.py +0 -0
  7. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/api/layers/__init__.py +0 -0
  8. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/api/losses/__init__.py +0 -0
  9. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/api/metrics/__init__.py +0 -0
  10. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/__init__.py +0 -0
  11. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/api_export.py +0 -0
  12. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/__init__.py +0 -0
  13. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/__init__.py +0 -0
  14. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/distributed_embedding.py +0 -0
  15. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/distributed_embedding_config.py +0 -0
  16. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/embed_reduce.py +0 -0
  17. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/__init__.py +0 -0
  18. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/checkpoint_utils.py +0 -0
  19. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/config_conversion.py +0 -0
  20. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/distributed_embedding.py +0 -0
  21. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/embedding_lookup.py +0 -0
  22. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/jax/embedding_utils.py +0 -0
  23. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/tensorflow/__init__.py +0 -0
  24. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/tensorflow/config_conversion.py +0 -0
  25. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/embedding/tensorflow/distributed_embedding.py +0 -0
  26. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/feature_interaction/__init__.py +0 -0
  27. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/feature_interaction/dot_interaction.py +0 -0
  28. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/feature_interaction/feature_cross.py +0 -0
  29. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/__init__.py +0 -0
  30. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/brute_force_retrieval.py +0 -0
  31. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/hard_negative_mining.py +0 -0
  32. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/remove_accidental_hits.py +0 -0
  33. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/retrieval.py +0 -0
  34. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/layers/retrieval/sampling_probability_correction.py +0 -0
  35. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/__init__.py +0 -0
  36. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_hinge_loss.py +0 -0
  37. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_logistic_loss.py +0 -0
  38. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_loss.py +0 -0
  39. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_loss_utils.py +0 -0
  40. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_mean_squared_error.py +0 -0
  41. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/losses/pairwise_soft_zero_one_loss.py +0 -0
  42. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/__init__.py +0 -0
  43. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/dcg.py +0 -0
  44. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/mean_average_precision.py +0 -0
  45. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/mean_reciprocal_rank.py +0 -0
  46. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/ndcg.py +0 -0
  47. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/precision_at_k.py +0 -0
  48. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/ranking_metric.py +0 -0
  49. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/ranking_metrics_utils.py +0 -0
  50. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/recall_at_k.py +0 -0
  51. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/metrics/utils.py +0 -0
  52. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/types.py +0 -0
  53. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/utils/__init__.py +0 -0
  54. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/utils/doc_string_utils.py +0 -0
  55. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs/src/utils/keras_utils.py +0 -0
  56. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs_nightly.egg-info/SOURCES.txt +0 -0
  57. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs_nightly.egg-info/dependency_links.txt +0 -0
  58. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs_nightly.egg-info/requires.txt +0 -0
  59. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/keras_rs_nightly.egg-info/top_level.txt +0 -0
  60. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/pyproject.toml +0 -0
  61. {keras_rs_nightly-0.2.2.dev202508140338 → keras_rs_nightly-0.2.2.dev202508160334}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: keras-rs-nightly
3
- Version: 0.2.2.dev202508140338
3
+ Version: 0.2.2.dev202508160334
4
4
  Summary: Multi-backend recommender systems with Keras 3.
5
5
  Author-email: Keras team <keras-users@googlegroups.com>
6
6
  License: Apache License 2.0
@@ -1,4 +1,5 @@
1
1
  import collections
2
+ import dataclasses
2
3
  import importlib.util
3
4
  import typing
4
5
  from typing import Any, Sequence
@@ -20,9 +21,10 @@ EmbedReduce = embed_reduce.EmbedReduce
20
21
  SUPPORTED_PLACEMENTS = ("auto", "default_device", "sparsecore")
21
22
 
22
23
 
23
- PlacementAndPath = collections.namedtuple(
24
- "PlacementAndPath", ["placement", "path"]
25
- )
24
+ @dataclasses.dataclass(eq=True, unsafe_hash=True, order=True)
25
+ class PlacementAndPath:
26
+ placement: str
27
+ path: str
26
28
 
27
29
 
28
30
  def _ragged_to_dense_inputs(
@@ -518,12 +520,12 @@ class DistributedEmbedding(keras.layers.Layer):
518
520
  With these structures in place, the steps to:
519
521
  - go from the deeply nested structure to the two-level structure are:
520
522
  - `assert_same_struct` as `self._feature_configs`
521
- - `flatten`
522
- - `pack_sequence_as` `self._placement_to_path_to_feature_config`
523
+ - use `self._feature_deeply_nested_placement_and_paths` to map from
524
+ deeply nested to two-level
523
525
  - go from the two-level structure to the deeply nested structure:
524
- - `assert_same_struct` as `self._placement_to_path_to_feature_config`
525
- - `flatten`
526
- - `pack_sequence_as` `self._feature_configs`
526
+ - `assert_same_struct` as `self._placement_to_path_to_feature_config`
527
+ - use `self._feature_deeply_nested_placement_and_paths` to locate each
528
+ output in the two-level dicts
527
529
 
528
530
  Args:
529
531
  feature_configs: The deeply nested structure of `FeatureConfig` or
@@ -590,14 +592,14 @@ class DistributedEmbedding(keras.layers.Layer):
590
592
  ] = collections.defaultdict(dict)
591
593
 
592
594
  def populate_placement_to_path_to_input_shape(
593
- placement_and_path: PlacementAndPath, input_shape: types.Shape
595
+ pp: PlacementAndPath, input_shape: types.Shape
594
596
  ) -> None:
595
- placement_to_path_to_input_shape[placement_and_path.placement][
596
- placement_and_path.path
597
- ] = input_shape
597
+ placement_to_path_to_input_shape[pp.placement][pp.path] = (
598
+ input_shape
599
+ )
598
600
 
599
601
  keras.tree.map_structure_up_to(
600
- self._feature_configs,
602
+ self._feature_deeply_nested_placement_and_paths,
601
603
  populate_placement_to_path_to_input_shape,
602
604
  self._feature_deeply_nested_placement_and_paths,
603
605
  input_shapes,
@@ -645,35 +647,40 @@ class DistributedEmbedding(keras.layers.Layer):
645
647
  """
646
648
  # Verify input structure.
647
649
  keras.tree.assert_same_structure(self._feature_configs, inputs)
650
+ if weights is not None:
651
+ keras.tree.assert_same_structure(self._feature_configs, weights)
648
652
 
649
653
  if not self.built:
650
- input_shapes = keras.tree.map_structure_up_to(
651
- self._feature_configs,
654
+ input_shapes = keras.tree.map_structure(
652
655
  lambda array: backend.standardize_shape(array.shape),
653
656
  inputs,
654
657
  )
655
658
  self.build(input_shapes)
656
659
 
657
- # Go from deeply nested structure of inputs to flat inputs.
658
- flat_inputs = keras.tree.flatten(inputs)
660
+ # Go from deeply nested to nested dict placement -> path -> input.
661
+ def to_placement_to_path(
662
+ tensors: types.Nested[types.Tensor],
663
+ ) -> dict[str, dict[str, types.Tensor]]:
664
+ result: dict[str, dict[str, types.Tensor]] = {
665
+ p: dict() for p in self._placement_to_path_to_feature_config
666
+ }
659
667
 
660
- # Go from flat to nested dict placement -> path -> input.
661
- placement_to_path_to_inputs = keras.tree.pack_sequence_as(
662
- self._placement_to_path_to_feature_config, flat_inputs
663
- )
668
+ def populate(pp: PlacementAndPath, x: types.Tensor) -> None:
669
+ result[pp.placement][pp.path] = x
664
670
 
665
- if weights is not None:
666
- # Same for weights if present.
667
- keras.tree.assert_same_structure(self._feature_configs, weights)
668
- flat_weights = keras.tree.flatten(weights)
669
- placement_to_path_to_weights = keras.tree.pack_sequence_as(
670
- self._placement_to_path_to_feature_config, flat_weights
671
+ keras.tree.map_structure(
672
+ populate,
673
+ self._feature_deeply_nested_placement_and_paths,
674
+ tensors,
671
675
  )
672
- else:
673
- # Populate keys for weights.
674
- placement_to_path_to_weights = {
675
- k: None for k in placement_to_path_to_inputs
676
- }
676
+ return result
677
+
678
+ placement_to_path_to_inputs = to_placement_to_path(inputs)
679
+
680
+ # Same for weights if present.
681
+ placement_to_path_to_weights = (
682
+ to_placement_to_path(weights) if weights is not None else None
683
+ )
677
684
 
678
685
  placement_to_path_to_preprocessed: dict[
679
686
  str, dict[str, dict[str, types.Nested[types.Tensor]]]
@@ -684,7 +691,9 @@ class DistributedEmbedding(keras.layers.Layer):
684
691
  placement_to_path_to_preprocessed["sparsecore"] = (
685
692
  self._sparsecore_preprocess(
686
693
  placement_to_path_to_inputs["sparsecore"],
687
- placement_to_path_to_weights["sparsecore"],
694
+ placement_to_path_to_weights["sparsecore"]
695
+ if placement_to_path_to_weights is not None
696
+ else None,
688
697
  training,
689
698
  )
690
699
  )
@@ -694,7 +703,9 @@ class DistributedEmbedding(keras.layers.Layer):
694
703
  placement_to_path_to_preprocessed["default_device"] = (
695
704
  self._default_device_preprocess(
696
705
  placement_to_path_to_inputs["default_device"],
697
- placement_to_path_to_weights["default_device"],
706
+ placement_to_path_to_weights["default_device"]
707
+ if placement_to_path_to_weights is not None
708
+ else None,
698
709
  training,
699
710
  )
700
711
  )
@@ -780,11 +791,13 @@ class DistributedEmbedding(keras.layers.Layer):
780
791
  placement_to_path_to_outputs,
781
792
  )
782
793
 
783
- # Go from placement -> path -> output to flat outputs.
784
- flat_outputs = keras.tree.flatten(placement_to_path_to_outputs)
794
+ # Go from placement -> path -> output to deeply nested structure.
795
+ def populate_output(pp: PlacementAndPath) -> types.Tensor:
796
+ return placement_to_path_to_outputs[pp.placement][pp.path]
785
797
 
786
- # Go from flat outputs to deeply nested structure.
787
- return keras.tree.pack_sequence_as(self._feature_configs, flat_outputs)
798
+ return keras.tree.map_structure(
799
+ populate_output, self._feature_deeply_nested_placement_and_paths
800
+ )
788
801
 
789
802
  def get_embedding_tables(self) -> dict[str, types.Tensor]:
790
803
  """Return the content of the embedding tables by table name.
@@ -1,7 +1,7 @@
1
1
  from keras_rs.src.api_export import keras_rs_export
2
2
 
3
3
  # Unique source of truth for the version number.
4
- __version__ = "0.2.2.dev202508140338"
4
+ __version__ = "0.2.2.dev202508160334"
5
5
 
6
6
 
7
7
  @keras_rs_export("keras_rs.version")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: keras-rs-nightly
3
- Version: 0.2.2.dev202508140338
3
+ Version: 0.2.2.dev202508160334
4
4
  Summary: Multi-backend recommender systems with Keras 3.
5
5
  Author-email: Keras team <keras-users@googlegroups.com>
6
6
  License: Apache License 2.0