code: def _build_undirected_chunk_graph(
      self, chunk_to_assign: List[ChunkData]
  ) -> ChunkGraph:
      chunk_graph = self._chunk_graph.copy()
      # remove edges for all chunk_to_assign which may contain chunks
      # that need be reassigned
      for chunk in chunk_to_assign:
          if chunk_graph.count_predecessors(chunk) > 0:
              for pred in list(chunk_graph.predecessors(chunk)):
                  chunk_graph.remove_edge(pred, chunk)
      return chunk_graph.build_undirected()
  
imports: from abc import ABC, abstractmethod
  from collections import defaultdict
  from operator import itemgetter
  from typing import List, Dict, Union
  import numpy
  from ....core import ChunkGraph, ChunkData
  from ....core.operand import Operand, Fetch
  from ....lib.ordered_set import OrderedSet
  from ....resource import Resource
  from ....typing import BandType
  from ....utils import implements
label_desc: Use image node_id 4 for calling the GraphAssigner obj's underlying member method code with example usage: obj._build_undirected_chunk_graph(chunk_to_assign) and returns: chunk_graph