class_docstr: A class that maintains hyperparameters for configuring Texar modules.
  The class has several useful features:
  
  - **Auto-completion of missing values.** Users can specify only a subset of
    hyperparameters they care about. Other hyperparameters will automatically
    take the default values. The auto-completion performs **recursively** so
    that hyperparameters taking `dict` values will also be auto-completed
    **All Texar modules** provide a :meth:`default_hparams` containing
    allowed hyperparameters and their default values. For example
  
      .. code-block:: python
  
          ## Recursive auto-completion
          default_hparams = {"a": 1, "b": {"c": 2, "d": 3}}
          hparams = {"b": {"c": 22}}
          hparams_ = HParams(hparams, default_hparams)
          hparams_.todict() == {"a": 1, "b": {"c": 22, "d": 3}}
              # "a" and "d" are auto-completed
  
          ## All Texar modules have built-in `default_hparams`
          hparams = {"dropout_rate": 0.1}
          emb = tx.modules.WordEmbedder(hparams=hparams, ...)
          emb.hparams.todict() == {
              "dropout_rate": 0.1,  # provided value
              "dim": 100,           # default value
              ...
          }
  
  - **Automatic typecheck.** For most hyperparameters, provided value must
    have the same or compatible dtype with the default value. :class:`HParams`
    does necessary type-check, and raises Error if improper dtype is provided.
    Also, hyperparameters not listed in `default_hparams` are not allowed,
    except for `"kwargs"` as detailed below.
  
  - **Flexible dtype for specified hyperparameters.**  Some hyperparameters
    may allow different dtypes of values.
  
      - Hyperparameters named `"type"` are not type-checked.
        For example, in :func:`~texar.tf.core.get_rnn_cell`, hyperparameter
        `"type"` can take value of an RNNCell class, its string name of module
        path, or an RNNCell class instance. (String name or module path is
        allowed so that users can specify the value in YAML configuration
        files.)
  
      - For other hyperparameters, list them in the "@no_typecheck" field
        in :meth:`default_hparams` to skip type-check. For example, in
        :func:`~texar.tf.core.get_rnn_cell`, hyperparameter
        `"\*_keep_prob"` can be set to either a `float` or a `tf.placeholder`.
  
  - **Special flexibility of keyword argument hyparameters.**
    Hyperparameters named ``"kwargs"`` are used as keyword arguments for a
    class constructor or a function call. Such hyperparameters take a `dict`,
    and users can add arbitrary valid keyword arguments to the dict.
    For example:
  
      .. code-block:: python
  
          default_rnn_cell_hparams = {
              "type": "LSTMCell",
              "kwargs": {"num_units": 256}
              # Other hyperparameters
              ...
          }
          my_hparams = {
              "kwargs" {
                  "num_units": 123,
                  # Other valid keyword arguments for LSTMCell constructor
                  "forget_bias": 0.0
                  "activation": "tf.nn.relu"
              }
          }
          _ = HParams(my_hparams, default_rnn_cell_hparams)
  
  - **Rich interfaces.** An :class:`HParams` instance provides rich interfaces
    for accessing, updating, or adding hyperparameters.
  
      .. code-block:: python
  
          hparams = HParams(my_hparams, default_hparams)
          # Access
          hparams.type == hparams["type"]
          # Update
          hparams.type = "GRUCell"
          hparams.kwargs = { "num_units": 100 }
          hparams.kwargs.num_units == 100
          # Add new
          hparams.add_hparam("index", 1)
          hparams.index == 1
  
          # Convert to `dict` (recursively)
          type(hparams.todic()) == dict
  
          # I/O
          pickle.dump(hparams, "hparams.dump")
          with open("hparams.dump", 'rb') as f:
              hparams_loaded = pickle.load(f)
  
  
  Args:
      hparams: A `dict` or an :class:`HParams` instance containing
          hyperparameters. If `None`, all hyperparameters are set to default
          values.
      default_hparams (dict): Hyperparameters with default values. If `None`,
          Hyperparameters are fully defined by :attr:`hparams`.
      allow_new_hparam (bool): If `False` (default), :attr:`hparams` cannot
          contain hyperparameters that are not included in
          :attr:`default_hparams`, except for the case of :attr:`"kwargs"` as
          above.
class_docstr_tok: ["A","class","that","maintains","hyperparameters","for","configuring","Texar","modules",".","The","class","has","several","useful","features",":","-","*","*","Auto-completion","of","missing","values",".","*","*","Users","can","specify","only","a","subset","of","hyperparameters","they","care","about",".","Other","hyperparameters","will","automatically","take","the","default","values",".","The","auto-completion","performs","*","*","recursively","*","*","so","that","hyperparameters","taking","`","dict","`","values","will","also","be","auto-completed","*","*","All","Texar","modules","*","*","provide","a",":","meth",":","`","default_hparams","`","containing","allowed","hyperparameters","and","their","default","values",".","For","example","..","code-block",":",":","python","#","#","Recursive","auto-completion","default_hparams","=","{","``","a","''",":","1",",","``","b","''",":","{","``","c","''",":","2",",","``","d","''",":","3","}","}","hparams","=","{","``","b","''",":","{","``","c","''",":","22","}","}","hparams_","=","HParams","(","hparams",",","default_hparams",")","hparams_.todict","(",")","==","{","``","a","''",":","1",",","``","b","''",":","{","``","c","''",":","22",",","``","d","''",":","3","}","}","#","``","a","''","and","``","d","''","are","auto-completed","#","#","All","Texar","modules","have","built-in","`","default_hparams","`","hparams","=","{","``","dropout_rate","''",":","0.1","}","emb","=","tx.modules.WordEmbedder","(","hparams=hparams",",","...",")","emb.hparams.todict","(",")","==","{","``","dropout_rate","''",":","0.1",",","#","provided","value","``","dim","''",":","100",",","#","default","value","...","}","-","*","*","Automatic","typecheck",".","*","*","For","most","hyperparameters",",","provided","value","must","have","the","same","or","compatible","dtype","with","the","default","value",".",":","class",":","`","HParams","`","does","necessary","type-check",",","and","raises","Error","if","improper","dtype","is","provided",".","Also",",","hyperparameters","not","listed","in","`","default_hparams","`","are","not","allowed",",","except","for","`","``","kwargs","''","`","as","detailed","below",".","-","*","*","Flexible","dtype","for","specified","hyperparameters",".","*","*","Some","hyperparameters","may","allow","different","dtypes","of","values",".","-","Hyperparameters","named","`","``","type","''","`","are","not","type-checked",".","For","example",",","in",":","func",":","`","~texar.tf.core.get_rnn_cell","`",",","hyperparameter","`","``","type","''","`","can","take","value","of","an","RNNCell","class",",","its","string","name","of","module","path",",","or","an","RNNCell","class","instance",".","(","String","name","or","module","path","is","allowed","so","that","users","can","specify","the","value","in","YAML","configuration","files",".",")","-","For","other","hyperparameters",",","list","them","in","the","``","@","no_typecheck","''","field","in",":","meth",":","`","default_hparams","`","to","skip","type-check",".","For","example",",","in",":","func",":","`","~texar.tf.core.get_rnn_cell","`",",","hyperparameter","`","``","\\","*","_keep_prob","''","`","can","be","set","to","either","a","`","float","`","or","a","`","tf.placeholder","`",".","-","*","*","Special","flexibility","of","keyword","argument","hyparameters",".","*","*","Hyperparameters","named","``","``","kwargs","''","``","are","used","as","keyword","arguments","for","a","class","constructor","or","a","function","call",".","Such","hyperparameters","take","a","`","dict","`",",","and","users","can","add","arbitrary","valid","keyword","arguments","to","the","dict",".","For","example",":","..","code-block",":",":","python","default_rnn_cell_hparams","=","{","``","type","''",":","``","LSTMCell","''",",","``","kwargs","''",":","{","``","num_units","''",":","256","}","#","Other","hyperparameters","...","}","my_hparams","=","{","``","kwargs","''","{","``","num_units","''",":","123",",","#","Other","valid","keyword","arguments","for","LSTMCell","constructor","``","forget_bias","''",":","0.0","``","activation","''",":","``","tf.nn.relu","''","}","}","_","=","HParams","(","my_hparams",",","default_rnn_cell_hparams",")","-","*","*","Rich","interfaces",".","*","*","An",":","class",":","`","HParams","`","instance","provides","rich","interfaces","for","accessing",",","updating",",","or","adding","hyperparameters",".","..","code-block",":",":","python","hparams","=","HParams","(","my_hparams",",","default_hparams",")","#","Access","hparams.type","==","hparams","[","``","type","''","]","#","Update","hparams.type","=","``","GRUCell","''","hparams.kwargs","=","{","``","num_units","''",":","100","}","hparams.kwargs.num_units","==","100","#","Add","new","hparams.add_hparam","(","``","index","''",",","1",")","hparams.index","==","1","#","Convert","to","`","dict","`","(","recursively",")","type","(","hparams.todic","(",")",")","==","dict","#","I\/O","pickle.dump","(","hparams",",","``","hparams.dump","''",")","with","open","(","``","hparams.dump","''",",","'rb","'",")","as","f",":","hparams_loaded","=","pickle.load","(","f",")","Args",":","hparams",":","A","`","dict","`","or","an",":","class",":","`","HParams","`","instance","containing","hyperparameters",".","If","`","None","`",",","all","hyperparameters","are","set","to","default","values",".","default_hparams","(","dict",")",":","Hyperparameters","with","default","values",".","If","`","None","`",",","Hyperparameters","are","fully","defined","by",":","attr",":","`","hparams","`",".","allow_new_hparam","(","bool",")",":","If","`","False","`","(","default",")",",",":","attr",":","`","hparams","`","can","not","contain","hyperparameters","that","are","not","included","in",":","attr",":","`","default_hparams","`",",","except","for","the","case","of",":","attr",":","`","``","kwargs","''","`","as","above","."]
code: def __init__(self, hparams, default_hparams, allow_new_hparam=False):
      if isinstance(hparams, HParams):
          hparams = hparams.todict()
      if default_hparams is not None:
          parsed_hparams = self._parse(
              hparams, default_hparams, allow_new_hparam
          )
      else:
          parsed_hparams = self._parse(hparams, hparams)
      super(HParams, self).__setattr__("_hparams", parsed_hparams)
  
imports: import copy
  import json
label_desc: Use image node_id 1 to create a new HParams object from inherited base classes: object with example: obj = HParams(hparams, default_hparams, allow_new_hparam)