class_docstr: This class creates a basic uniform resource allocation function.
  
  The function naively balances free resources (CPUs and GPUs) between
  trials, giving them all equal priority, ensuring that all resources
  are always being used. The free resources will be placed in new bundles.
  The function assumes that all bundles are equal (there is no "head"
  bundle).
  
  If for some reason a trial ends up with
  more resources than there are free ones, it will adjust downwards.
  It will also ensure that trial as at least as many resources as
  it started with (``base_trial_resource``).
  
  The function returns a new ``PlacementGroupFactory`` with updated
  resource requirements, or None. If the returned
  ``PlacementGroupFactory`` is equal by value to the one the
  trial has currently, the scheduler will skip the update process
  internally (same with None).
  
  If you wish to implement your own resource distribution logic,
  you can do so by extending this class, as it provides several
  generic methods. You can also implement a function instead.
  
  Args:
      add_bundles: If True, create new bundles from free resources.
          Otherwise, spread them among base_trial_resource bundles.
      increase_by: A dict with key-value
          pairs representing an atomic unit of resources (name-amount)
          the trial will be increased by. If not set, the trial will
          increase by 1 CPU/GPU.
      increase_by_times: If set to >=1 and ``increase_by`` is set,
          the trial will increase by maximum of
          ``increase_by_times * increase_by`` resources. If set to <1,
          no upper limit is set. Ignored if ``increase_by`` is not set.
      reserve_resources: A dict of
          resource_name-amount pairs representing the resources
          that will not be allocated to resized trials.
class_docstr_tok: ["This","class","creates","a","basic","uniform","resource","allocation","function",".","The","function","naively","balances","free","resources","(","CPUs","and","GPUs",")","between","trials",",","giving","them","all","equal","priority",",","ensuring","that","all","resources","are","always","being","used",".","The","free","resources","will","be","placed","in","new","bundles",".","The","function","assumes","that","all","bundles","are","equal","(","there","is","no","``","head","''","bundle",")",".","If","for","some","reason","a","trial","ends","up","with","more","resources","than","there","are","free","ones",",","it","will","adjust","downwards",".","It","will","also","ensure","that","trial","as","at","least","as","many","resources","as","it","started","with","(","``","base_trial_resource","``",")",".","The","function","returns","a","new","``","PlacementGroupFactory","``","with","updated","resource","requirements",",","or","None",".","If","the","returned","``","PlacementGroupFactory","``","is","equal","by","value","to","the","one","the","trial","has","currently",",","the","scheduler","will","skip","the","update","process","internally","(","same","with","None",")",".","If","you","wish","to","implement","your","own","resource","distribution","logic",",","you","can","do","so","by","extending","this","class",",","as","it","provides","several","generic","methods",".","You","can","also","implement","a","function","instead",".","Args",":","add_bundles",":","If","True",",","create","new","bundles","from","free","resources",".","Otherwise",",","spread","them","among","base_trial_resource","bundles",".","increase_by",":","A","dict","with","key-value","pairs","representing","an","atomic","unit","of","resources","(","name-amount",")","the","trial","will","be","increased","by",".","If","not","set",",","the","trial","will","increase","by","1","CPU\/GPU",".","increase_by_times",":","If","set","to",">","=1","and","``","increase_by","``","is","set",",","the","trial","will","increase","by","maximum","of","``","increase_by_times","*","increase_by","``","resources",".","If","set","to","<","1",",","no","upper","limit","is","set",".","Ignored","if","``","increase_by","``","is","not","set",".","reserve_resources",":","A","dict","of","resource_name-amount","pairs","representing","the","resources","that","will","not","be","allocated","to","resized","trials","."]
code: def _is_bundle_empty(self, bundle: Dict[str, float]) -> bool:
      return not (bundle.get("CPU", 0) or bundle.get("GPU", 0))
  
imports: from copy import deepcopy
  import numpy
  import logging
  from typing import Dict, Any, List, Optional, Set, Tuple, Union, Callable, TYPE_CHECKING
  import pickle
  import warnings
  from ray.air.execution.resources.request import _sum_bundles
  from ray.util.annotations import PublicAPI
  from ray.tune.schedulers.trial_scheduler import FIFOScheduler, TrialScheduler
  from ray.tune.experiment import Trial
  from ray.tune.execution.placement_groups import PlacementGroupFactory
label_desc: Use image node_id 6 for calling the DistributeResources obj's underlying member method code with example usage: obj._is_bundle_empty(bundle) and returns: unknown