class_docstr: The class defines the interface of nodes modifying tha data flow in the :class:`Pipeline`
  
  Args:
      operation_type: operation defined in the operation repository
      nodes_from: parent nodes where data comes from
      node_data: ``dict`` with :class:`InputData` for fit and predict stage
      kwargs: optional arguments (i.e. logger)
docstr: Processes all the parent nodes via the current operation using ``input_data``
  
  Args:
      input_data: input data from pipeline abstraction (source input data)
      parent_operation: name of parent operation (``'fit'`` or ``'predict'``)
  
  Returns:
      InputData: predictions from the secondary nodes
docstr_tok: ["Processes","all","the","parent","nodes","via","the","current","operation","using","``","input_data","``","Args",":","input_data",":","input","data","from","pipeline","abstraction","(","source","input","data",")","parent_operation",":","name","of","parent","operation","(","``","'fit","'","``","or","``","'predict","'","``",")","Returns",":","InputData",":","predictions","from","the","secondary","nodes"]
code: def _input_from_parents(
      self, input_data: InputData, parent_operation: str
  ) -> InputData:
      """Processes all the parent nodes via the current operation using ``input_data``
  
      Args:
          input_data: input data from pipeline abstraction (source input data)
          parent_operation: name of parent operation (``'fit'`` or ``'predict'``)
  
      Returns:
          InputData: predictions from the secondary nodes
      """
  
      if len(self.nodes_from) == 0:
          raise ValueError("No parent nodes found")
  
      self.log.debug(
          f"Fit all parent nodes in secondary node with operation: {self.operation}"
      )
  
      parent_nodes = self._nodes_from_with_fixed_order()
  
      parent_results, _ = _combine_parents(
          parent_nodes, input_data, parent_operation
      )
      secondary_input = DataMerger.get(parent_results).merge()
      # Update info about visited nodes
      parent_operations = [
          node.operation.operation_type for node in parent_nodes
      ]
      secondary_input.supplementary_data.previous_operations = (
          parent_operations
      )
      return secondary_input
  
imports: from __future__ import annotations
  from dataclasses import dataclass
  from typing import Any, List, Optional, Tuple, Union
  import numpy
  from golem.core.dag.linked_graph_node import LinkedGraphNode
  from golem.core.log import default_log
  from golem.core.optimisers.timer import Timer
  from golem.serializers.serializer import register_serializable
  from fedot.core.data.data import InputData, OutputData
  from fedot.core.data.merge.data_merger import DataMerger
  from fedot.core.operations.factory import OperationFactory
  from fedot.core.operations.operation import Operation
  from fedot.core.operations.operation_parameters import OperationParameters
  from fedot.core.repository.operation_types_repository import OperationTypesRepository
  from fedot.core.utils import DEFAULT_PARAMS_STUB, NESTED_PARAMS_LABEL
label_desc: Use image node_id 18 for calling the PipelineNode obj's underlying member method code with example usage: obj._input_from_parents(input_data, parent_operation) and returns: secondary_input