docstr: Test that fused_params can get info from both sharder and constraints.
code: def test_create_sharding_infos_by_sharding_combine(self) -> None:
      """
      Test that fused_params can get info from both sharder and constraints.
      """
  
      new_constraints = copy.deepcopy(self.constraints)
  
      # remove two fused_params from constraints
      for _, parameter_constraints in new_constraints.items():
          parameter_constraints.enforce_hbm = None
          parameter_constraints.stochastic_rounding = None
  
      new_planner = EmbeddingShardingPlanner(
          topology=Topology(world_size=1, compute_device="cpu"),
          constraints=new_constraints,
      )
      new_plan = new_planner.plan(
          self.model, [self.sharder]
      )  # pyre-ignore[6]
  
      # provide that two fused params from sharder
      sharder_fused_params = {
          "enforce_hbm": True,
          "stochastic_rounding": False,
      }
  
      combined_sharding_infos = create_sharding_infos_by_sharding(
          self.model,
          new_plan.get_plan_for_module(""),  # pyre-ignore[6]
          prefix="embedding_bags.",
          fused_params=sharder_fused_params,
      )
  
      # directly assertion won't work, since sharding_infos also have parameter_sharding
      for (
          sharding_type,
          combined_sharding_info,
      ) in combined_sharding_infos.items():
          expected_sharding_info = self.expected_sharding_infos[
              sharding_type
          ]
          for a, b in zip(
              expected_sharding_info, combined_sharding_info
          ):
              self.assertEqual(a.fused_params, b.fused_params)
  
      # provide that two fused params from sharder wrongly
      sharder_fused_params = {
          "enforce_hbm": True,
          "stochastic_rounding": True,
      }
      wrong_combined_sharding_infos = create_sharding_infos_by_sharding(
          self.model,
          new_plan.get_plan_for_module(""),  # pyre-ignore[6]
          prefix="embedding_bags.",
          fused_params=sharder_fused_params,
      )
      for (
          sharding_type,
          wrong_combined_sharding_info,
      ) in wrong_combined_sharding_infos.items():
          expected_sharding_info = self.expected_sharding_infos[
              sharding_type
          ]
          for a, b in zip(
              expected_sharding_info, wrong_combined_sharding_info
          ):
              self.assertNotEqual(a.fused_params, b.fused_params)
  
file_path: torchrec/torchrec/distributed/planner/tests/test_embeddingbag_utils.py
imports: import copy
  import unittest
  from torchrec.distributed.embeddingbag import create_sharding_infos_by_sharding, EmbeddingBagCollectionSharder
  from torchrec.distributed.planner import EmbeddingShardingPlanner, ParameterConstraints, Topology
  from torchrec.distributed.types import BoundsCheckMode, CacheAlgorithm, CacheParams, DataType
  from torchrec.modules.embedding_configs import EmbeddingBagConfig
  from torchrec.modules.embedding_modules import EmbeddingBagCollection
label_desc: Use image node_id 3 for calling the CreateShardingInfoTest obj's underlying member method code with example usage: obj.test_create_sharding_infos_by_sharding_combine() without return types