code: def test_hash_and_eq_params_type(self):
      w1 = ParamsType(
          a1=TensorType("int64", shape=(None, None)),
          a2=TensorType("int64", shape=(None, 1, None, None, 1)),
          a3=Generic(),
      )
      w2 = ParamsType(
          a1=TensorType("int64", shape=(None, None)),
          a2=TensorType("int64", shape=(None, 1, None, None, 1)),
          a3=Generic(),
      )
      assert w1 == w2
      assert not (w1 != w2)
      assert hash(w1) == hash(w2)
      assert w1.name == w2.name
      # Changing attributes names only.
      w2 = ParamsType(
          a1=TensorType("int64", shape=(None, None)),
          other_name=TensorType(
              "int64", shape=(None, 1, None, None, 1)
          ),  # a2 -> other_name
          a3=Generic(),
      )
      assert w1 != w2
      # Changing attributes types only.
      w2 = ParamsType(
          a1=TensorType("int64", shape=(None, None)),
          a2=Generic(),  # changing class
          a3=Generic(),
      )
      assert w1 != w2
      # Changing attributes types characteristics only.
      w2 = ParamsType(
          a1=TensorType(
              "int64", shape=(None, 1)
          ),  # changing broadcasting
          a2=TensorType("int64", shape=(None, 1, None, None, 1)),
          a3=Generic(),
      )
      assert w1 != w2
  
imports: import numpy
  import pytest
  import pytensor
  from pytensor import tensor
  from pytensor.graph.basic import Apply
  from pytensor.link.c.op import COp, ExternalCOp
  from pytensor.link.c.params_type import Params, ParamsType
  from pytensor.link.c.type import EnumList, Generic
  from pytensor.scalar import ScalarType
  from pytensor.tensor.type import TensorType, matrix
  from tests import unittest_tools
label_desc: Use image node_id 2 for calling the TestParamsType obj's underlying member method code with example usage: obj.test_hash_and_eq_params_type() without return types