class_docstr: Implements the g-h filter. The topic is too large to cover in
  this comment. See my book "Kalman and Bayesian Filters in Python" [1]
  or Eli Brookner's "Tracking and Kalman Filters Made Easy" [2].
  
  A few basic examples are below, and the tests in ./gh_tests.py may
  give you more ideas on use.
  
  
  Parameters
  ----------
  
  x : 1D np.array or scalar
      Initial value for the filter state. Each value can be a scalar
      or a np.array.
  
      You can use a scalar for x0. If order > 0, then 0.0 is assumed
      for the higher order terms.
  
      x[0] is the value being tracked
      x[1] is the first derivative (for order 1 and 2 filters)
      x[2] is the second derivative (for order 2 filters)
  
  dx : 1D np.array or scalar
      Initial value for the derivative of the filter state.
  
  dt : scalar
      time step
  
  g : float
      filter g gain parameter.
  
  h : float
      filter h gain parameter.
  
  
  Attributes
  ----------
  x : 1D np.array or scalar
      filter state
  
  dx : 1D np.array or scalar
     derivative of the filter state.
  
  x_prediction : 1D np.array or scalar
      predicted filter state
  
  dx_prediction : 1D np.array or scalar
     predicted derivative of the filter state.
  
  dt : scalar
      time step
  
  g : float
      filter g gain parameter.
  
  h : float
      filter h gain parameter.
  
  y : np.array, or scalar
      residual (difference between measurement and prior)
  
  z : np.array, or scalar
      measurement passed into update()
  
  Examples
  --------
  
  Create a basic filter for a scalar value with g=.8, h=.2.
  Initialize to 0, with a derivative(velocity) of 0.
  
  >>> from filterpy.gh import GHFilter
  >>> f = GHFilter (x=0., dx=0., dt=1., g=.8, h=.2)
  
  Incorporate the measurement of 1
  
  >>> f.update(z=1)
  (0.8, 0.2)
  
  Incorporate a measurement of 2 with g=1 and h=0.01
  
  >>> f.update(z=2, g=1, h=0.01)
  (2.0, 0.21000000000000002)
  
  Create a filter with two independent variables.
  
  >>> from numpy import array
  >>> f = GHFilter (x=array([0,1]), dx=array([0,0]), dt=1, g=.8, h=.02)
  
  and update with the measurements (2,4)
  
  >>> f.update(array([2,4])
  (array([ 1.6,  3.4]), array([ 0.04,  0.06]))
  
  
  References
  ----------
  
  [1] Labbe, "Kalman and Bayesian Filters in Python"
  http://rlabbe.github.io/Kalman-and-Bayesian-Filters-in-Python
  
  [2] Brookner, "Tracking and Kalman Filters Made Easy". John Wiley and
  Sons, 1998.
class_docstr_tok: ["Implements","the","g-h","filter",".","The","topic","is","too","large","to","cover","in","this","comment",".","See","my","book","``","Kalman","and","Bayesian","Filters","in","Python","''","[","1","]","or","Eli","Brookner","'s","``","Tracking","and","Kalman","Filters","Made","Easy","''","[","2","]",".","A","few","basic","examples","are","below",",","and","the","tests","in",".\/gh_tests.py","may","give","you","more","ideas","on","use",".","Parameters","--","--","--","--","--","x",":","1D","np.array","or","scalar","Initial","value","for","the","filter","state",".","Each","value","can","be","a","scalar","or","a","np.array",".","You","can","use","a","scalar","for","x0",".","If","order",">","0",",","then","0.0","is","assumed","for","the","higher","order","terms",".","x","[","0","]","is","the","value","being","tracked","x","[","1","]","is","the","first","derivative","(","for","order","1","and","2","filters",")","x","[","2","]","is","the","second","derivative","(","for","order","2","filters",")","dx",":","1D","np.array","or","scalar","Initial","value","for","the","derivative","of","the","filter","state",".","dt",":","scalar","time","step","g",":","float","filter","g","gain","parameter",".","h",":","float","filter","h","gain","parameter",".","Attributes","--","--","--","--","--","x",":","1D","np.array","or","scalar","filter","state","dx",":","1D","np.array","or","scalar","derivative","of","the","filter","state",".","x_prediction",":","1D","np.array","or","scalar","predicted","filter","state","dx_prediction",":","1D","np.array","or","scalar","predicted","derivative","of","the","filter","state",".","dt",":","scalar","time","step","g",":","float","filter","g","gain","parameter",".","h",":","float","filter","h","gain","parameter",".","y",":","np.array",",","or","scalar","residual","(","difference","between","measurement","and","prior",")","z",":","np.array",",","or","scalar","measurement","passed","into","update","(",")","Examples","--","--","--","--","Create","a","basic","filter","for","a","scalar","value","with","g=.8",",","h=.2",".","Initialize","to","0",",","with","a","derivative","(","velocity",")","of","0",".",">",">",">","from","filterpy.gh","import","GHFilter",">",">",">","f","=","GHFilter","(","x=0.",",","dx=0.",",","dt=1.",",","g=.8",",","h=.2",")","Incorporate","the","measurement","of","1",">",">",">","f.update","(","z=1",")","(","0.8",",","0.2",")","Incorporate","a","measurement","of","2","with","g=1","and","h=0.01",">",">",">","f.update","(","z=2",",","g=1",",","h=0.01",")","(","2.0",",","0.21000000000000002",")","Create","a","filter","with","two","independent","variables",".",">",">",">","from","numpy","import","array",">",">",">","f","=","GHFilter","(","x=array","(","[","0,1","]",")",",","dx=array","(","[","0,0","]",")",",","dt=1",",","g=.8",",","h=.02",")","and","update","with","the","measurements","(","2,4",")",">",">",">","f.update","(","array","(","[","2,4","]",")","(","array","(","[","1.6",",","3.4","]",")",",","array","(","[","0.04",",","0.06","]",")",")","References","--","--","--","--","--","[","1","]","Labbe",",","``","Kalman","and","Bayesian","Filters","in","Python","''","http",":","\/\/rlabbe.github.io\/Kalman-and-Bayesian-Filters-in-Python","[","2","]","Brookner",",","``","Tracking","and","Kalman","Filters","Made","Easy","''",".","John","Wiley","and","Sons",",","1998","."]
docstr: Given a sequenced list of data, performs g-h filter
  with a fixed g and h. See update() if you need to vary g and/or h.
  
  Uses self.x and self.dx to initialize the filter, but DOES NOT
  alter self.x and self.dx during execution, allowing you to use this
  class multiple times without reseting self.x and self.dx. I'm not sure
  how often you would need to do that, but the capability is there.
  More exactly, none of the class member variables are modified
  by this function, in distinct contrast to update(), which changes
  most of them.
  
  Parameters
  ----------
  
  data : list like
      contains the data to be filtered.
  
  save_predictions : boolean
      the predictions will be saved and returned if this is true
  
  saver : filterpy.common.Saver, optional
      filterpy.common.Saver object. If provided, saver.save() will be
      called after every epoch
  
  
  Returns
  -------
  
  results : np.array shape (n+1, 2), where n=len(data)
     contains the results of the filter, where
     results[i,0] is x , and
     results[i,1] is dx (derivative of x)
     First entry is the initial values of x and dx as set by __init__.
  
  predictions : np.array shape(n), optional
     the predictions for each step in the filter. Only retured if
     save_predictions == True
docstr_tok: ["Given","a","sequenced","list","of","data",",","performs","g-h","filter","with","a","fixed","g","and","h.","See","update","(",")","if","you","need","to","vary","g","and\/or","h.","Uses","self.x","and","self.dx","to","initialize","the","filter",",","but","DOES","NOT","alter","self.x","and","self.dx","during","execution",",","allowing","you","to","use","this","class","multiple","times","without","reseting","self.x","and","self.dx",".","I","'m","not","sure","how","often","you","would","need","to","do","that",",","but","the","capability","is","there",".","More","exactly",",","none","of","the","class","member","variables","are","modified","by","this","function",",","in","distinct","contrast","to","update","(",")",",","which","changes","most","of","them",".","Parameters","--","--","--","--","--","data",":","list","like","contains","the","data","to","be","filtered",".","save_predictions",":","boolean","the","predictions","will","be","saved","and","returned","if","this","is","true","saver",":","filterpy.common.Saver",",","optional","filterpy.common.Saver","object",".","If","provided",",","saver.save","(",")","will","be","called","after","every","epoch","Returns","--","--","--","-","results",":","np.array","shape","(","n+1",",","2",")",",","where","n=len","(","data",")","contains","the","results","of","the","filter",",","where","results","[","i,0","]","is","x",",","and","results","[","i,1","]","is","dx","(","derivative","of","x",")","First","entry","is","the","initial","values","of","x","and","dx","as","set","by","__init__",".","predictions",":","np.array","shape","(","n",")",",","optional","the","predictions","for","each","step","in","the","filter",".","Only","retured","if","save_predictions","==","True"]
code: def batch_filter(self, data, save_predictions=False, saver=None):
      """
      Given a sequenced list of data, performs g-h filter
      with a fixed g and h. See update() if you need to vary g and/or h.
  
      Uses self.x and self.dx to initialize the filter, but DOES NOT
      alter self.x and self.dx during execution, allowing you to use this
      class multiple times without reseting self.x and self.dx. I'm not sure
      how often you would need to do that, but the capability is there.
      More exactly, none of the class member variables are modified
      by this function, in distinct contrast to update(), which changes
      most of them.
  
      Parameters
      ----------
  
      data : list like
          contains the data to be filtered.
  
      save_predictions : boolean
          the predictions will be saved and returned if this is true
  
      saver : filterpy.common.Saver, optional
          filterpy.common.Saver object. If provided, saver.save() will be
          called after every epoch
  
  
      Returns
      -------
  
      results : np.array shape (n+1, 2), where n=len(data)
         contains the results of the filter, where
         results[i,0] is x , and
         results[i,1] is dx (derivative of x)
         First entry is the initial values of x and dx as set by __init__.
  
      predictions : np.array shape(n), optional
         the predictions for each step in the filter. Only retured if
         save_predictions == True
      """
  
      x = self.x
      dx = self.dx
      n = len(data)
  
      results = np.zeros((n + 1, 2))
      results[0, 0] = x
      results[0, 1] = dx
  
      if save_predictions:
          predictions = np.zeros(n)
  
      # optimization to avoid n computations of h / dt
      h_dt = self.h / self.dt
  
      for i, z in enumerate(data):
          # prediction step
          x_est = x + (dx * self.dt)
  
          # update step
          residual = z - x_est
          dx = dx + h_dt * residual  # i.e. dx = dx + h * residual / dt
          x = x_est + self.g * residual
  
          results[i + 1, 0] = x
          results[i + 1, 1] = dx
          if save_predictions:
              predictions[i] = x_est
  
          if saver is not None:
              saver.save()
  
      if save_predictions:
          return results, predictions
  
      return results
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import numpy
  from numpy import dot
  from filterpy.common import pretty_str
label_desc: Use image node_id 3 for calling the GHFilter obj's underlying member method code with example usage: obj.batch_filter(data, save_predictions, saver) and returns: results, results,  predictions