class_docstr: Strategy Compiler.
  
  Currently, this just entails resolving device attributes,
  but this can be easily modified to do more in the future.
code: def _resolve_devices(self, strategy):
      s = strategy.copy()
      for n in s.node_config:
          if n.partitioner:
              # meaning this var is going to be partitioned
              for part in n.part_config:
                  self._resolve_reduction_destination(part)
          else:
              self._resolve_reduction_destination(n)
      d = s.graph_config.replicas
      s.graph_config.replicas[:] = self._device_resolver(d)
      return s
  
imports: import os
  from abc import ABC, abstractmethod
  from datetime import datetime
  from autodist.const import DEFAULT_SERIALIZATION_DIR
  from autodist.graph_item import GraphItem
  from autodist.kernel.common.utils import get_op_name
  from autodist.proto import strategy_pb2
  from autodist.resource_spec import ResourceSpec
label_desc: Use image node_id 4 for calling the StrategyCompiler obj's underlying member method code with example usage: obj._resolve_devices(strategy) and returns: s