docstr: Postprocess the output GeoSeries to ensure that they are of the
  correct type for the predicate.
  
  Postprocess for contains_properly has to handle multiple input and
  output configurations.
  
  
  The input to postprocess is `point_indices`, which can be either a
  cudf.DataFrame with one row per point and one column per polygon or
  a cudf.DataFrame containing the point index and the part index for
  each point in the polygon.
  
  Parameters
  ----------
  lhs : GeoSeries
      The left-hand side of the binary predicate.
  rhs : GeoSeries
      The right-hand side of the binary predicate.
  preprocessor_output : ContainsOpResult
      The result of the contains_properly call.
  
  Returns
  -------
  cudf.Series or cudf.DataFrame
      A Series of boolean values indicating whether each feature in
      the rhs GeoSeries is contained in the lhs GeoSeries in the
      case of allpairs=False. Otherwise, a DataFrame containing the
      point index and the polygon index for each point in the
      polygon.
docstr_tok: ["Postprocess","the","output","GeoSeries","to","ensure","that","they","are","of","the","correct","type","for","the","predicate",".","Postprocess","for","contains_properly","has","to","handle","multiple","input","and","output","configurations",".","The","input","to","postprocess","is","`","point_indices","`",",","which","can","be","either","a","cudf.DataFrame","with","one","row","per","point","and","one","column","per","polygon","or","a","cudf.DataFrame","containing","the","point","index","and","the","part","index","for","each","point","in","the","polygon",".","Parameters","--","--","--","--","--","lhs",":","GeoSeries","The","left-hand","side","of","the","binary","predicate",".","rhs",":","GeoSeries","The","right-hand","side","of","the","binary","predicate",".","preprocessor_output",":","ContainsOpResult","The","result","of","the","contains_properly","call",".","Returns","--","--","--","-","cudf.Series","or","cudf.DataFrame","A","Series","of","boolean","values","indicating","whether","each","feature","in","the","rhs","GeoSeries","is","contained","in","the","lhs","GeoSeries","in","the","case","of","allpairs=False",".","Otherwise",",","a","DataFrame","containing","the","point","index","and","the","polygon","index","for","each","point","in","the","polygon","."]
code: def _postprocess(self, lhs, rhs, preprocessor_result, op_result):
      """Postprocess the output GeoSeries to ensure that they are of the
      correct type for the predicate.
  
      Postprocess for contains_properly has to handle multiple input and
      output configurations.
  
  
      The input to postprocess is `point_indices`, which can be either a
      cudf.DataFrame with one row per point and one column per polygon or
      a cudf.DataFrame containing the point index and the part index for
      each point in the polygon.
  
      Parameters
      ----------
      lhs : GeoSeries
          The left-hand side of the binary predicate.
      rhs : GeoSeries
          The right-hand side of the binary predicate.
      preprocessor_output : ContainsOpResult
          The result of the contains_properly call.
  
      Returns
      -------
      cudf.Series or cudf.DataFrame
          A Series of boolean values indicating whether each feature in
          the rhs GeoSeries is contained in the lhs GeoSeries in the
          case of allpairs=False. Otherwise, a DataFrame containing the
          point index and the polygon index for each point in the
          polygon.
      """
  
      if _is_complex(rhs):
          return super()._postprocess_multipoint_rhs(
              lhs,
              rhs,
              preprocessor_result,
              op_result,
              mode=self.config.mode,
          )
      else:
          return super()._postprocess_points(
              lhs, rhs, preprocessor_result, op_result
          )
  
imports: from typing import TypeVar
  import cupy
  import cudf
  from cuspatial.core.binpreds.basic_predicates import _basic_equals_all, _basic_intersects
  from cuspatial.core.binpreds.binpred_interface import BinPred, ContainsOpResult, ImpossiblePredicate, NotImplementedPredicate, PreprocessorResult
  from cuspatial.core.binpreds.contains import contains_properly
  from cuspatial.core.binpreds.contains_geometry_processor import ContainsGeometryProcessor
  from cuspatial.utils.binpred_utils import LineString, MultiPoint, Point, Polygon, _is_complex
  from cuspatial.utils.column_utils import contains_only_polygons, has_multipolygons
label_desc: Use image node_id 5 for calling the ContainsProperlyPredicate obj's underlying member method code with example usage: obj._postprocess(lhs, rhs, preprocessor_result, op_result) and returns: super, super