class_docstr: A custom configuration file parser for SKLL.
docstr: Find any ill-specified options in the configuration file.
  
  Make sure that all the options are specified in the appropriate sections
  and are not specified in multiple spaces. One way to do this is to
  basically get the values for all the optional config options from each
  of the sections and then look at the section that has a non-default
  (specified) value and if that's not the right section as indicated by
  our section mapping, then we need to raise an exception.
  
  Returns
  -------
  incorrectly_specified_options : List[Tuple[str, str]]
      List of incorrectly specified options. Each element in the list
      is a tuple with the first item in the tuple being the option name
      and the second element being the incorrect section name in which
      the option was specified.
  
  multiply_specified_options : List[Tuple[str, List[str]]]
      List of options specified more than once. Each element in the list
      is a tuple with the first item in the tuple being the option name
      and the second item being the list of section names in which the
      option was multiply specified.
  
  Notes
  -----
  This will NOT work if the user specifies the default value for the
  option but puts it in the wrong section. However, since specifying
  the default value for the option  does not result in running an
  experiment with unexpected settings, this is not really a major
  problem.
docstr_tok: ["Find","any","ill-specified","options","in","the","configuration","file",".","Make","sure","that","all","the","options","are","specified","in","the","appropriate","sections","and","are","not","specified","in","multiple","spaces",".","One","way","to","do","this","is","to","basically","get","the","values","for","all","the","optional","config","options","from","each","of","the","sections","and","then","look","at","the","section","that","has","a","non-default","(","specified",")","value","and","if","that","'s","not","the","right","section","as","indicated","by","our","section","mapping",",","then","we","need","to","raise","an","exception",".","Returns","--","--","--","-","incorrectly_specified_options",":","List","[","Tuple","[","str",",","str","]","]","List","of","incorrectly","specified","options",".","Each","element","in","the","list","is","a","tuple","with","the","first","item","in","the","tuple","being","the","option","name","and","the","second","element","being","the","incorrect","section","name","in","which","the","option","was","specified",".","multiply_specified_options",":","List","[","Tuple","[","str",",","List","[","str","]","]","]","List","of","options","specified","more","than","once",".","Each","element","in","the","list","is","a","tuple","with","the","first","item","in","the","tuple","being","the","option","name","and","the","second","item","being","the","list","of","section","names","in","which","the","option","was","multiply","specified",".","Notes","--","--","-","This","will","NOT","work","if","the","user","specifies","the","default","value","for","the","option","but","puts","it","in","the","wrong","section",".","However",",","since","specifying","the","default","value","for","the","option","does","not","result","in","running","an","experiment","with","unexpected","settings",",","this","is","not","really","a","major","problem","."]
code: def _find_ill_specified_options(
      self,
  ) -> Tuple[List[Tuple[str, str]], List[Tuple[str, List[str]]]]:
      """
      Find any ill-specified options in the configuration file.
  
      Make sure that all the options are specified in the appropriate sections
      and are not specified in multiple spaces. One way to do this is to
      basically get the values for all the optional config options from each
      of the sections and then look at the section that has a non-default
      (specified) value and if that's not the right section as indicated by
      our section mapping, then we need to raise an exception.
  
      Returns
      -------
      incorrectly_specified_options : List[Tuple[str, str]]
          List of incorrectly specified options. Each element in the list
          is a tuple with the first item in the tuple being the option name
          and the second element being the incorrect section name in which
          the option was specified.
  
      multiply_specified_options : List[Tuple[str, List[str]]]
          List of options specified more than once. Each element in the list
          is a tuple with the first item in the tuple being the option name
          and the second item being the list of section names in which the
          option was multiply specified.
  
      Notes
      -----
      This will NOT work if the user specifies the default value for the
      option but puts it in the wrong section. However, since specifying
      the default value for the option  does not result in running an
      experiment with unexpected settings, this is not really a major
      problem.
      """
      incorrectly_specified_options = []
      multiply_specified_options = []
      for option_name, default_value in self.defaults().items():
          used_sections = [
              section
              for section in self.sections()
              if self.get(section, option_name) != default_value
          ]
          # skip options that are not specified in any sections
          if len(used_sections) == 0:
              pass
          # find all options that are specified in multiple sections
          elif len(used_sections) > 1:
              multiply_specified_options.append(
                  (option_name, used_sections)
              )
          # find all options that are specified in incorrect sections
          elif used_sections[0] != self._section_mapping[option_name]:
              incorrectly_specified_options.append(
                  (option_name, used_sections[0])
              )
  
      return (incorrectly_specified_options, multiply_specified_options)
  
imports: import configparser
  import itertools
  import logging
  import os
  from numbers import Number
  from os.path import basename, join
  from pathlib import Path
  from typing import Any, Dict, List, Optional, Set, Tuple, Union
  import numpy
  from ruamel.yaml import YAML
  from skll.data.readers import safe_float
  from skll.types import ClassMap, FoldMapping, LabelType, PathOrStr
  from skll.utils.constants import PROBABILISTIC_METRICS, VALID_FEATURE_SCALING_OPTIONS, VALID_SAMPLERS, VALID_TASKS
  from skll.utils.logging import get_skll_logger
  from .utils import _munge_featureset_name, _parse_and_validate_metrics, fix_json, load_cv_folds, locate_file
label_desc: Use image node_id 3 for calling the SKLLConfigParser obj's underlying member method code with example usage: obj._find_ill_specified_options() and returns: incorrectly_specified_options,  multiply_specified_options