ai-edge-quantizer-nightly 0.4.0.dev20251015__py3-none-any.whl → 0.4.0.dev20251017__py3-none-any.whl

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.
@@ -40,6 +40,8 @@ def get_validation_func(
40
40
  return median_diff_ratio
41
41
  elif func_name == "cosine_similarity":
42
42
  return cosine_similarity
43
+ elif func_name == "kl_divergence":
44
+ return kl_divergence
43
45
  else:
44
46
  raise ValueError(f"Validation function {func_name} not supported")
45
47
 
@@ -134,6 +136,43 @@ def cosine_similarity(
134
136
  return np.dot(data1, data2) / (norm_data1 * norm_data2)
135
137
 
136
138
 
139
+ def kl_divergence(
140
+ data1: np._typing.ArrayLike,
141
+ data2: np._typing.ArrayLike,
142
+ epsilon: float = 1e-9,
143
+ ) -> float:
144
+ """Calculates the KL divergence between data1 & data2.
145
+
146
+ KL(data2 || data1) = sum(data2 * log(data2 / data1)).
147
+ data2 is treated as the true distribution P, and data1 as the
148
+ approximated distribution Q.
149
+ Non-positive values in data1 and data2 are clipped to 0 before
150
+ KL divergence calculation. Epsilon is added to avoid log(0) and
151
+ division by zero.
152
+
153
+ Args:
154
+ data1: input data to be used for comparison (distribution Q)
155
+ data2: input data to be used for comparison (distribution P),
156
+ data1 & 2 must be of the same shape
157
+ epsilon: small value to avoid log(0) and division by zero.
158
+
159
+ Returns:
160
+ A float value representing the KL divergence between data1 & 2.
161
+
162
+ Raises:
163
+ Value error if the two inputs don't have the same number of elements.
164
+ """
165
+ data1, data2 = _preprocess_same_size_arrays(data1, data2)
166
+ # special handling for tensor of size 0
167
+ if data1.size == 0:
168
+ return float(0)
169
+
170
+ p = np.maximum(0, data2)
171
+ q = np.maximum(0, data1)
172
+
173
+ return float(np.sum(p * np.log((p + epsilon) / (q + epsilon))))
174
+
175
+
137
176
  def _preprocess_same_size_arrays(
138
177
  data1: np._typing.ArrayLike, data2: np._typing.ArrayLike
139
178
  ) -> Tuple[np.ndarray, np.ndarray]:
@@ -106,6 +106,34 @@ class ValidationUtilTest(googletest.TestCase):
106
106
  result = validation_utils.cosine_similarity(data1, data2)
107
107
  self.assertEqual(result, 0)
108
108
 
109
+ def test_kl_divergence(self):
110
+ data1 = [0.5, 0.5]
111
+ data2 = [0.1, 0.9]
112
+ result = validation_utils.kl_divergence(data1, data2)
113
+ self.assertAlmostEqual(result, 0.36808, 4)
114
+
115
+ def test_kl_divergence_zero_in_q(self):
116
+ data1 = [0, 1]
117
+ data2 = [1, 0]
118
+ result = validation_utils.kl_divergence(data1, data2)
119
+ self.assertAlmostEqual(result, 20.7232658, 4)
120
+
121
+ def test_kl_divergence_negative_values(self):
122
+ data1 = [-1, 1]
123
+ data2 = [1, -1]
124
+ result = validation_utils.kl_divergence(data1, data2)
125
+ self.assertAlmostEqual(result, 20.7232658, 4)
126
+
127
+ def test_kl_divergence_0d(self):
128
+ data1 = []
129
+ data2 = []
130
+ result = validation_utils.kl_divergence(data1, data2)
131
+ self.assertEqual(result, 0)
132
+
133
+ def test_get_validation_func_kl_divergence(self):
134
+ func = validation_utils.get_validation_func("kl_divergence")
135
+ self.assertEqual(func, validation_utils.kl_divergence)
136
+
109
137
 
110
138
  if __name__ == "__main__":
111
139
  googletest.main()
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: ai-edge-quantizer-nightly
3
- Version: 0.4.0.dev20251015
3
+ Version: 0.4.0.dev20251017
4
4
  Summary: A quantizer for advanced developers to quantize converted AI Edge models.
5
5
  Home-page: https://github.com/google-ai-edge/ai-edge-quantizer
6
6
  Keywords: On-Device ML,AI,Google,TFLite,Quantization,LLMs,GenAI
@@ -28,6 +28,15 @@ Requires-Dist: immutabledict
28
28
  Requires-Dist: numpy
29
29
  Requires-Dist: tf-nightly
30
30
  Requires-Dist: ai-edge-litert-nightly
31
+ Dynamic: classifier
32
+ Dynamic: description
33
+ Dynamic: description-content-type
34
+ Dynamic: home-page
35
+ Dynamic: keywords
36
+ Dynamic: license-file
37
+ Dynamic: requires-dist
38
+ Dynamic: requires-python
39
+ Dynamic: summary
31
40
 
32
41
  It aims to facilitate advanced users to strive for optimal performance on
33
42
  resource demanding models (e.g., GenAI models).
@@ -72,10 +72,10 @@ ai_edge_quantizer/utils/tfl_flatbuffer_utils.py,sha256=42OWzQsRTXq3XQYmoxlz177_d
72
72
  ai_edge_quantizer/utils/tfl_flatbuffer_utils_test.py,sha256=K1SbK8q92qYVtiVj0I0GtugsPTkpIpEKv9zakvFV_Sc,8555
73
73
  ai_edge_quantizer/utils/tfl_interpreter_utils.py,sha256=EoVjI_hplX_Rml3hfRsGmQOihexmizeJqt4SQcET9aA,14925
74
74
  ai_edge_quantizer/utils/tfl_interpreter_utils_test.py,sha256=6fjkM-rycZ95L4yfvlr0TN6RlrhfPzxNUYrZaYO_F0A,12013
75
- ai_edge_quantizer/utils/validation_utils.py,sha256=0sOdH4pzk_Pwh1r8O47iaECRng1Xn0ABn9GVc8UPNcY,4994
76
- ai_edge_quantizer/utils/validation_utils_test.py,sha256=1sblJWHLTYTbn1Qi9rwnrREOSXRy5KwHAWSwgI1e_aU,3697
77
- ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
78
- ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info/METADATA,sha256=aPMv8uCtui-_UA9TOyLpHkk5ZQtCBkYRa-_568uIth4,1508
79
- ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
80
- ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
81
- ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info/RECORD,,
75
+ ai_edge_quantizer/utils/validation_utils.py,sha256=QTYyQ_HDVrFTGPIsrA240Lv8tUw1fwWp2fu9kTVISkE,6224
76
+ ai_edge_quantizer/utils/validation_utils_test.py,sha256=lO51rGskhzpXePRdZMU87u_YO35_sDp9_eQ85CmupL4,4600
77
+ ai_edge_quantizer_nightly-0.4.0.dev20251017.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
78
+ ai_edge_quantizer_nightly-0.4.0.dev20251017.dist-info/METADATA,sha256=6qG6ge4eJjQvVvcuw4yKPexR4bWm788m-PE6pqbwWXQ,1707
79
+ ai_edge_quantizer_nightly-0.4.0.dev20251017.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
80
+ ai_edge_quantizer_nightly-0.4.0.dev20251017.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
81
+ ai_edge_quantizer_nightly-0.4.0.dev20251017.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.45.1)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5