class_docstr: The NodeHandler is an abstract class used to generate every possible strategies for an operator node.
  
  Args:
      node (Node): the input node in node argument list.
      device_mesh (DeviceMesh): A logical view of a physical mesh.
      strategies_vector (StrategiesVector): all the strategies generated in this handler will be recorded into the strategies_vector.
class_docstr_tok: ["The","NodeHandler","is","an","abstract","class","used","to","generate","every","possible","strategies","for","an","operator","node",".","Args",":","node","(","Node",")",":","the","input","node","in","node","argument","list",".","device_mesh","(","DeviceMesh",")",":","A","logical","view","of","a","physical","mesh",".","strategies_vector","(","StrategiesVector",")",":","all","the","strategies","generated","in","this","handler","will","be","recorded","into","the","strategies_vector","."]
docstr: Returns the mapping between the logical operation data to its physical data.
  A logical operation data is a data associated with an operation, which can be input and output. It is
  defined by the strategy generator, for example, a matrix multiplication operation has two operands "input"
  and "other" and one result "output". For a nn.Linear module, the physical operand for "input" is
  the module input, the physical operand for "other" is the module weight, and the physical result for "output"
  is the module output.
  Note that the operand name is specified by the StrategyGenerator object.
  
  For example:
  
      # for a linear layer
      mapping = {
          "input": Operand(name=str(self.node.args[0]), type=OperationDataType.ARG, data=self.node.args[0]._meta_data),
          "other": Operand(name="weight", type=OperationDataType.PARAM, data=self.named_parameters['weight']),
          "bias": Operand(name="bias", type=OperationDataType.PARAM, data=self.named_parameters['bias']),
          "output": Operand(name=str(self.node), type=OperationDataType.OUTPUT, data=self.node._meta_data),
      }
docstr_tok: ["Returns","the","mapping","between","the","logical","operation","data","to","its","physical","data",".","A","logical","operation","data","is","a","data","associated","with","an","operation",",","which","can","be","input","and","output",".","It","is","defined","by","the","strategy","generator",",","for","example",",","a","matrix","multiplication","operation","has","two","operands","``","input","''","and","``","other","''","and","one","result","``","output","''",".","For","a","nn.Linear","module",",","the","physical","operand","for","``","input","''","is","the","module","input",",","the","physical","operand","for","``","other","''","is","the","module","weight",",","and","the","physical","result","for","``","output","''","is","the","module","output",".","Note","that","the","operand","name","is","specified","by","the","StrategyGenerator","object",".","For","example",":","#","for","a","linear","layer","mapping","=","{","``","input","''",":","Operand","(","name=str","(","self.node.args","[","0","]",")",",","type=OperationDataType.ARG",",","data=self.node.args","[","0","]","._meta_data",")",",","``","other","''",":","Operand","(","name=","''","weight","''",",","type=OperationDataType.PARAM",",","data=self.named_parameters","[","'weight","'","]",")",",","``","bias","''",":","Operand","(","name=","''","bias","''",",","type=OperationDataType.PARAM",",","data=self.named_parameters","[","'bias","'","]",")",",","``","output","''",":","Operand","(","name=str","(","self.node",")",",","type=OperationDataType.OUTPUT",",","data=self.node._meta_data",")",",","}"]
code: def get_operation_data_mapping(self) -> Dict[str, OperationData]:
      """
      Returns the mapping between the logical operation data to its physical data.
      A logical operation data is a data associated with an operation, which can be input and output. It is
      defined by the strategy generator, for example, a matrix multiplication operation has two operands "input"
      and "other" and one result "output". For a nn.Linear module, the physical operand for "input" is
      the module input, the physical operand for "other" is the module weight, and the physical result for "output"
      is the module output.
      Note that the operand name is specified by the StrategyGenerator object.
  
      For example:
  
          # for a linear layer
          mapping = {
              "input": Operand(name=str(self.node.args[0]), type=OperationDataType.ARG, data=self.node.args[0]._meta_data),
              "other": Operand(name="weight", type=OperationDataType.PARAM, data=self.named_parameters['weight']),
              "bias": Operand(name="bias", type=OperationDataType.PARAM, data=self.named_parameters['bias']),
              "output": Operand(name=str(self.node), type=OperationDataType.OUTPUT, data=self.node._meta_data),
          }
      """
  
imports: from abc import ABC, abstractmethod
  from typing import Dict, List, Tuple, Union
  import torch
  from torch.fx.node import Node
  from colossalai.auto_parallel.meta_profiler.shard_metainfo import ShardMetaInfo, meta_register
  from colossalai.auto_parallel.tensor_shard.options import ShardOption, SolverPerference
  from colossalai.auto_parallel.tensor_shard.sharding_strategy import OperationData, ShardingSpec, ShardingStrategy, StrategiesVector, TrainCycleItem
  from colossalai.auto_parallel.tensor_shard.utils import check_sharding_spec_validity
  from colossalai.device.device_mesh import DeviceMesh
  from colossalai.logging import get_dist_logger
  from colossalai.tensor.shape_consistency import ShapeConsistencyManager
  from .strategy import StrategyGenerator
label_desc: Use image node_id 7 for calling the NodeHandler obj's underlying member method code with example usage: obj.get_operation_data_mapping() without return types