code: def test_twrw_and_twcw_perf_host(self) -> None:
      self.topology = Topology(
          world_size=16, local_world_size=8, compute_device="cuda"
      )
      constraints = {
          "table_0": ParameterConstraints(
              sharding_types=[ShardingType.TABLE_ROW_WISE.value]
          ),
          "table_1": ParameterConstraints(
              sharding_types=[ShardingType.TABLE_COLUMN_WISE.value],
              min_partition=4 * 8,
          ),
          "table_2": ParameterConstraints(
              sharding_types=[ShardingType.TABLE_COLUMN_WISE.value],
              min_partition=4 * 10,
          ),
          "table_3": ParameterConstraints(
              sharding_types=[ShardingType.TABLE_ROW_WISE.value]
          ),
      }
      tables = [
          EmbeddingBagConfig(
              num_embeddings=128,
              embedding_dim=80 * (i + 1),
              name="table_" + str(i),
              feature_names=["feature_" + str(i)],
          )
          for i in range(4)
      ]
  
      self.model = TestSparseNN(tables=tables)
      self.enumerator = EmbeddingEnumerator(
          topology=self.topology,
          batch_size=BATCH_SIZE,
          constraints=constraints,
      )
      self.partitioner = GreedyPerfPartitioner()
      sharding_options = self.enumerator.enumerate(
          module=self.model,
          sharders=[HostLevelSharder()],
      )
  
      for sharding_option in sharding_options:
          for shard in sharding_option.shards:
              shard.perf = Perf(
                  fwd_compute=25,
                  fwd_comms=25,
                  bwd_compute=25,
                  bwd_comms=25,
              )
              shard.storage = Storage(hbm=1000, ddr=1000)
          sharding_option.partition_by = PartitionByType.HOST.value
  
      sharding_plan = self.partitioner.partition(
          proposal=sharding_options,
          storage_constraint=self.topology,
      )
      expected_ranks = {
          "table_0": [0, 1, 2, 3, 4, 5, 6, 7],
          "table_1": [8, 9, 10, 11, 12],
          "table_2": [0, 1, 2, 3, 4, 5],
          "table_3": [8, 9, 10, 11, 12, 13, 14, 15],
      }
  
      ranks = {
          sharding_option.name: [
              shard.rank for shard in sharding_option.shards
          ]
          for sharding_option in sharding_plan
      }
  
      self.assertEqual(expected_ranks, ranks)
  
imports: import copy
  import unittest
  from typing import cast, List
  from unittest.mock import MagicMock
  from torch import nn
  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.partitioners import GreedyPerfPartitioner, MemoryBalancedPartitioner, OrderedDeviceHardware
  from torchrec.distributed.planner.types import DeviceHardware, ParameterConstraints, PartitionByType, Perf, PlannerError, Shard, ShardingOption, Storage, Topology
  from torchrec.distributed.planner.utils import reset_shard_rank
  from torchrec.distributed.test_utils.test_model import TestSparseNN
  from torchrec.distributed.types import ModuleSharder, ShardingType
  from torchrec.modules.embedding_configs import EmbeddingBagConfig
label_desc: Use image node_id 8 for calling the TestGreedyPerfPartitioner obj's underlying member method code with example usage: obj.test_twrw_and_twcw_perf_host() without return types