class_docstr: "Positive random features hyperbolic" estimator, SMHyp+,
  as proposed in the Performers_ paper, Lemma 1.
  
  _Performers: "Rethinking attention with performers." K. Choromanski et al. (2020).
  https://arxiv.org/pdf/2009.14794v1.pdf
class_docstr_tok: ["``","Positive","random","features","hyperbolic","''","estimator",",","SMHyp+",",","as","proposed","in","the","Performers_","paper",",","Lemma","1",".","_Performers",":","``","Rethinking","attention","with","performers",".","''","K.","Choromanski","et","al",".","(","2020",")",".","https",":","\/\/arxiv.org\/pdf\/2009.14794v1.pdf"]
code: def __init__(
      self,
      dim_features: int,
      iter_before_redraw: Optional[int],
      normalize_inputs: bool = False,
      epsilon: float = 1e-6,
      softmax_temp: float = -1,
  ):
      super().__init__(
          dim_features,
          iter_before_redraw,
          normalize_inputs,
          epsilon,
          softmax_temp,
      )
  
      assert (
          dim_features % 2 == 0
      ), "The feature dimension needs to be even with this kernel"
      self.dim_feature_map = self.dim_features // 2
  
imports: import math
  from enum import Enum, auto
  from typing import Optional
  import torch
  from torch.autograd.profiler import record_function
  from .base import FeatureMap
label_desc: Use image node_id 1 to create a new SMHyperbolic object from inherited base classes: SoftMaxPositiveEstimators with example: obj = SMHyperbolic(dim_features, iter_before_redraw, normalize_inputs, epsilon, softmax_temp)