docstr: Returns new node based on a current node using information about node and advisor.
  
  :param node: current node that must be changed.
docstr_tok: ["Returns","new","node","based","on","a","current","node","using","information","about","node","and","advisor",".",":","param","node",":","current","node","that","must","be","changed","."]
code: def exchange_node(self, node: OptNode):
      """
      Returns new node based on a current node using information about node and advisor.
  
      :param node: current node that must be changed.
      """
      candidates = (
          self.graph_model_repository.get_operations(is_primary=False)
          if node.nodes_from
          else self.graph_model_repository.get_operations(
              is_primary=True
          )
      )
      candidates = self.advisor.propose_change(
          node=node, possible_operations=candidates
      )
      candidates = self.filter_specific_candidates(candidates)
      return self._return_node(candidates)
  
file_path: FEDOT/fedot/core/pipelines/pipeline_node_factory.py
imports: from random import choice
  from typing import Optional, List
  from golem.core.optimisers.graph import OptNode
  from golem.core.optimisers.opt_node_factory import OptNodeFactory
  from fedot.core.pipelines.pipeline_advisor import PipelineChangeAdvisor, check_for_specific_operations
  from fedot.core.pipelines.pipeline_composer_requirements import PipelineComposerRequirements
  from fedot.core.repository.pipeline_operation_repository import PipelineOperationRepository
  from fedot.utilities.custom_errors import MethodNotImplementError
label_desc: Use image node_id 3 for calling the PipelineOptNodeFactory obj's underlying member method code with example usage: obj.exchange_node(node) and returns: self