docs: def set_options_from_dict(self, data_dict, filename=None):
          """Load options from a dictionary.
  
          :param dict data_dict: Dictionary with the options to load.
          :param str filename: If provided, assume that non-absolute
              paths provided are in reference to the file.
          """
          if filename is not None:
              filename = os.path.dirname(filename)
          for k in data_dict:
              if not isinstance(data_dict[k], dict):
                  raise ValueError("The input data has to be a dict of dict")
              for sk in data_dict[k]:
                  if self.gc[(self.gc["k1"] == k) &
                             (self.gc["k2"] == sk)].shape[0] == 0:
                      continue
                  if isinstance(data_dict[k][sk], six.string_types):
                      data_dict[k][sk] = str(data_dict[k][sk])
                  _type = self.gc[(self.gc["k1"] == k) &
                                  (self.gc["k2"] == sk)][["type"]].values[0]
                  data_dict[k][sk] = ev.cast(data_dict[k][sk], _type)
                  if self.get_option(k, sk, True) != data_dict[k][sk]:
                      try:
                          self.set_option(k, sk, data_dict[k][sk])
                      # Provided paths do not work: try add them relative
                      # to the config file
                      except IOError:
                          if filename is None:
                              raise IOError('Error path: {0}.{1}'.format(k, sk))
                          npat = os.path.join(filename, data_dict[k][sk])
                          self.set_option(k, sk, os.path.normpath(npat))
                      except ValueError:
                          pass