code: def test_grid_search_three_table(self) -> None:
      tables = [
          EmbeddingBagConfig(
              num_embeddings=100 * i,
              embedding_dim=10 * i,
              name="table_" + str(i),
              feature_names=["feature_" + str(i)],
          )
          for i in range(1, 4)
      ]
      model = TestSparseNN(
          tables=tables, sparse_device=torch.device("meta")
      )
      search_space = self.enumerator.enumerate(
          module=model,
          sharders=[
              cast(
                  ModuleSharder[torch.nn.Module],
                  EmbeddingBagCollectionSharder(),
              )
          ],
      )
  
      """
          All sharding types but DP will have 3 possible compute kernels after pruning:
              - fused
              - fused_uvm_caching
              - fused_uvm
          DP will have 1 possible compute kernel: dense
          So the total number of pruned options will be:
              (num_sharding_types - 1) * 3 + 1 = 16
          """
      num_pruned_options = (len(ShardingType) - 1) * 3 + 1
      self.grid_search_proposer.load(search_space)
      for (
          sharding_options
      ) in self.grid_search_proposer._sharding_options_by_fqn.values():
          # number of sharding types after pruning is number of sharding types * 3
          # 3 compute kernels fused/dense, fused_uvm_caching, fused_uvm
          self.assertEqual(len(sharding_options), num_pruned_options)
  
      num_proposals = 0
      proposal = self.grid_search_proposer.propose()
      while proposal:
          self.grid_search_proposer.feedback(partitionable=True)
          proposal = self.grid_search_proposer.propose()
          num_proposals += 1
  
      self.assertEqual(num_pruned_options ** len(tables), num_proposals)
  
imports: import unittest
  from typing import cast, List, Optional
  from unittest.mock import MagicMock
  import torch
  from torchrec.distributed.embedding_types import EmbeddingComputeKernel
  from torchrec.distributed.embeddingbag import EmbeddingBagCollectionSharder
  from torchrec.distributed.planner.constants import BATCH_SIZE
  from torchrec.distributed.planner.enumerators import EmbeddingEnumerator
  from torchrec.distributed.planner.proposers import EmbeddingOffloadScaleupProposer, GreedyProposer, GridSearchProposer, proposers_to_proposals_list, UniformProposer
  from torchrec.distributed.planner.types import Enumerator, ParameterConstraints, Proposer, ShardingOption, Topology
  from torchrec.distributed.test_utils.test_model import TestSparseNN
  from torchrec.distributed.types import CacheParams, CacheStatistics, ModuleSharder, ShardingType
  from torchrec.modules.embedding_configs import EmbeddingBagConfig
label_desc: Use image node_id 4 for calling the TestProposers obj's underlying member method code with example usage: obj.test_grid_search_three_table() without return types