code: def save(state, filename=None, desc='', extra=None):
      
      if isinstance(state.image, util.RawImage):
          desc = desc or 'save'
          filename = filename or state.image.filename + '-peri-' + desc + '.pkl'
      else:
          if not filename:
              raise AttributeError("Must provide filename since RawImage is not used")
  
      if extra is None:
          save = state
      else:
          save = [state] + extra
  
      if os.path.exists(filename):
          ff = "{}-tmp-for-copy".format(filename)
  
          if os.path.exists(ff):
              os.remove(ff)
  
          os.rename(filename, ff)
  
      pickle.dump(save, open(filename, 'wb'), protocol=2)
docs: Save the current state with extra information (for example samples and LL
      from the optimization procedure).
  
      Parameters
      ----------
      state : peri.states.ImageState
          the state object which to save
  
      filename : string
          if provided, will override the default that is constructed based on
          the state's raw image file.  If there is no filename and the state has
          a RawImage, the it is saved to RawImage.filename + "-peri-save.pkl"
  
      desc : string
          if provided, will augment the default filename to be
          RawImage.filename + '-peri-' + desc + '.pkl'
  
      extra : list of pickleable objects
          if provided, will be saved with the state