docstr: Test that the weak & strong dtype promotion table does not change over time.
docstr_tok: ["Test","that","the","weak","&","strong","dtype","promotion","table","does","not","change","over","time","."]
code: def testObservedPromotionTable(self):
      """Test that the weak & strong dtype promotion table does not change over time."""
      # Note: * here refers to weakly-typed values
      typecodes = [
          "b1",
          "u1",
          "u2",
          "u4",
          "u8",
          "i1",
          "i2",
          "i4",
          "i8",
          "bf",
          "f2",
          "f4",
          "f8",
          "c4",
          "c8",
          "i*",
          "f*",
          "c*",
      ]
      if config.enable_x64.value:
          expected = [
              [
                  "b1",
                  "u1",
                  "u2",
                  "u4",
                  "u8",
                  "i1",
                  "i2",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i*",
                  "f*",
                  "c*",
              ],
              [
                  "u1",
                  "u1",
                  "u2",
                  "u4",
                  "u8",
                  "i2",
                  "i2",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "u1",
                  "f*",
                  "c*",
              ],
              [
                  "u2",
                  "u2",
                  "u2",
                  "u4",
                  "u8",
                  "i4",
                  "i4",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "u2",
                  "f*",
                  "c*",
              ],
              [
                  "u4",
                  "u4",
                  "u4",
                  "u4",
                  "u8",
                  "i8",
                  "i8",
                  "i8",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "u4",
                  "f*",
                  "c*",
              ],
              [
                  "u8",
                  "u8",
                  "u8",
                  "u8",
                  "u8",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "u8",
                  "f*",
                  "c*",
              ],
              [
                  "i1",
                  "i2",
                  "i4",
                  "i8",
                  "f*",
                  "i1",
                  "i2",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i1",
                  "f*",
                  "c*",
              ],
              [
                  "i2",
                  "i2",
                  "i4",
                  "i8",
                  "f*",
                  "i2",
                  "i2",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i2",
                  "f*",
                  "c*",
              ],
              [
                  "i4",
                  "i4",
                  "i4",
                  "i8",
                  "f*",
                  "i4",
                  "i4",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i4",
                  "f*",
                  "c*",
              ],
              [
                  "i8",
                  "i8",
                  "i8",
                  "i8",
                  "f*",
                  "i8",
                  "i8",
                  "i8",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i8",
                  "f*",
                  "c*",
              ],
              [
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "f4",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "bf",
                  "bf",
                  "c4",
              ],
              [
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f4",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "f2",
                  "f2",
                  "c4",
              ],
              [
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "f4",
                  "f4",
                  "c4",
              ],
              [
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "f8",
                  "c8",
                  "c8",
                  "f8",
                  "f8",
                  "c8",
              ],
              [
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c8",
                  "c4",
                  "c8",
                  "c4",
                  "c4",
                  "c4",
              ],
              [
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
                  "c8",
              ],
              [
                  "i*",
                  "u1",
                  "u2",
                  "u4",
                  "u8",
                  "i1",
                  "i2",
                  "i4",
                  "i8",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "i*",
                  "f*",
                  "c*",
              ],
              [
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "bf",
                  "f2",
                  "f4",
                  "f8",
                  "c4",
                  "c8",
                  "f*",
                  "f*",
                  "c*",
              ],
              [
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c4",
                  "c4",
                  "c4",
                  "c8",
                  "c4",
                  "c8",
                  "c*",
                  "c*",
                  "c*",
              ],
          ]
      else:
          expected = [
              [
                  "b1",
                  "u1",
                  "u2",
                  "u4",
                  "u4",
                  "i1",
                  "i2",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i*",
                  "f*",
                  "c*",
              ],
              [
                  "u1",
                  "u1",
                  "u2",
                  "u4",
                  "u4",
                  "i2",
                  "i2",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "u1",
                  "f*",
                  "c*",
              ],
              [
                  "u2",
                  "u2",
                  "u2",
                  "u4",
                  "u4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "u2",
                  "f*",
                  "c*",
              ],
              [
                  "u4",
                  "u4",
                  "u4",
                  "u4",
                  "u4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "u4",
                  "f*",
                  "c*",
              ],
              [
                  "u4",
                  "u4",
                  "u4",
                  "u4",
                  "u4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "u4",
                  "f*",
                  "c*",
              ],
              [
                  "i1",
                  "i2",
                  "i4",
                  "i4",
                  "i4",
                  "i1",
                  "i2",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i1",
                  "f*",
                  "c*",
              ],
              [
                  "i2",
                  "i2",
                  "i4",
                  "i4",
                  "i4",
                  "i2",
                  "i2",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i2",
                  "f*",
                  "c*",
              ],
              [
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i4",
                  "f*",
                  "c*",
              ],
              [
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i4",
                  "f*",
                  "c*",
              ],
              [
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "bf",
                  "f4",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "bf",
                  "bf",
                  "c4",
              ],
              [
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f2",
                  "f4",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "f2",
                  "f2",
                  "c4",
              ],
              [
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "f4",
                  "f4",
                  "c4",
              ],
              [
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "f4",
                  "f4",
                  "c4",
              ],
              [
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
              ],
              [
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
              ],
              [
                  "i*",
                  "u1",
                  "u2",
                  "u4",
                  "u4",
                  "i1",
                  "i2",
                  "i4",
                  "i4",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "i*",
                  "f*",
                  "c*",
              ],
              [
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "f*",
                  "bf",
                  "f2",
                  "f4",
                  "f4",
                  "c4",
                  "c4",
                  "f*",
                  "f*",
                  "c*",
              ],
              [
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c*",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c4",
                  "c*",
                  "c*",
                  "c*",
              ],
          ]
      typecode_to_dtype = {
          "b1": jnp.bool_,
          "u1": jnp.uint8,
          "u2": jnp.uint16,
          "u4": jnp.uint32,
          "u8": jnp.uint64,
          "i1": jnp.int8,
          "i2": jnp.int16,
          "i4": jnp.int32,
          "i8": jnp.int64,
          "bf": jnp.bfloat16,
          "f2": jnp.float16,
          "f4": jnp.float32,
          "f8": jnp.float64,
          "c4": jnp.complex64,
          "c8": jnp.complex128,
          "i*": jnp.int64,
          "f*": jnp.float64,
          "c*": jnp.complex128,
      }
      dtype_to_typecode = {
          jnp.dtype(v): k
          for k, v in typecode_to_dtype.items()
          if not k.endswith("*")
      }
  
      def typecode_to_val(typecode):
          weak_type = typecode.endswith("*")
          dtype = typecode_to_dtype[typecode]
          val = dtype(0)
          if weak_type:
              val = val.item()
          return val
  
      def val_to_typecode(val):
          dtype = dtypes.result_type(val)
          weak_type = dtypes.is_weakly_typed(val)
          typecode = dtype_to_typecode[dtype]
          if weak_type:
              typecode = typecode[:-1] + "*"
          return typecode
  
      vals = [typecode_to_val(t) for t in typecodes]
      table = [[val_to_typecode(v1 + v2) for v1 in vals] for v2 in vals]
  
      def show_differences(expected, actual):
          diffs = ""
          for i, t1 in enumerate(typecodes):
              for j, t2 in enumerate(typecodes):
                  if expected[i][j] != actual[i][j]:
                      diffs += f"\n{t1}, {t2} -> want {expected[i][j]}, got {actual[i][j]}"
          return diffs
  
      self.assertEqual(
          table, expected, show_differences(expected, table)
      )
  
imports: import dataclasses
  import enum
  import functools
  from functools import partial
  import itertools
  import operator
  from absl.testing import absltest
  from absl.testing import parameterized
  import numpy
  import jax
  from jax import numpy
  from jax._src import config
  from jax._src import dtypes
  from jax._src import test_util
  from jax._src.lax import lax
label_desc: Use image node_id 7 for calling the TestPromotionTables obj's underlying member method code with example usage: obj.testObservedPromotionTable() and returns: val, typecode, diffs