docstr: Determine if the quadtree should be used for the binary predicate.
  
  Returns
  -------
  bool
      True if the quadtree should be used, False otherwise.
  
  Notes
  -----
  1. If the number of polygons in the lhs is less than 32, we use the
     brute-force algorithm because it is faster and has less memory
     overhead.
  2. If the lhs contains multipolygons, or `allpairs=True` is specified,
     we use quadtree because the quadtree code path already handles
     multipolygons.
  3. Otherwise default to pairwise to match the default GeoPandas
     behavior.
docstr_tok: ["Determine","if","the","quadtree","should","be","used","for","the","binary","predicate",".","Returns","--","--","--","-","bool","True","if","the","quadtree","should","be","used",",","False","otherwise",".","Notes","--","--","-","1",".","If","the","number","of","polygons","in","the","lhs","is","less","than","32",",","we","use","the","brute-force","algorithm","because","it","is","faster","and","has","less","memory","overhead",".","2",".","If","the","lhs","contains","multipolygons",",","or","`","allpairs=True","`","is","specified",",","we","use","quadtree","because","the","quadtree","code","path","already","handles","multipolygons",".","3",".","Otherwise","default","to","pairwise","to","match","the","default","GeoPandas","behavior","."]
code: def _pip_mode(self, lhs, rhs):
      """Determine if the quadtree should be used for the binary predicate.
  
      Returns
      -------
      bool
          True if the quadtree should be used, False otherwise.
  
      Notes
      -----
      1. If the number of polygons in the lhs is less than 32, we use the
         brute-force algorithm because it is faster and has less memory
         overhead.
      2. If the lhs contains multipolygons, or `allpairs=True` is specified,
         we use quadtree because the quadtree code path already handles
         multipolygons.
      3. Otherwise default to pairwise to match the default GeoPandas
         behavior.
      """
      if len(lhs) <= 31:
          return "brute_force"
      elif self.config.allpairs or has_multipolygons(lhs):
          return "quadtree"
      else:
          return "pairwise"
  
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 3 for calling the ContainsProperlyPredicate obj's underlying member method code with example usage: obj._pip_mode(lhs, rhs) and returns: str, str, str