code: def get_soft_bounds(self):
          
          if self.bounds is None:
              hl,hu=(None,None)
          else:
              hl,hu=self.bounds
  
          if self._softbounds is None:
              sl,su=(None,None)
          else:
              sl,su=self._softbounds
  
  
          if sl is None: l = hl
          else:          l = sl
  
          if su is None: u = hu
          else:          u = su
  
          return (l,u)
docs: For each soft bound (upper and lower), if there is a defined bound (not equal to None)
          then it is returned, otherwise it defaults to the hard bound. The hard bound could still be None.