class_docstr: iSOUP-Tree's Extended Binary Search Tree (E-BST).
  
  This class implements the Extended Binary Search Tree[^1] (E-BST)
  structure, using the variant employed by Osojnik et al.[^2] in the
  iSOUP-Tree algorithm. This structure is employed to observe the target
  space distribution.
  
  Proposed along with Fast Incremental Model Tree with Drift Detection[^1] (FIMT-DD), E-BST was
  the first attribute observer (AO) proposed for incremental Hoeffding Tree regressors. This
  AO works by storing all observations between splits in an extended binary search tree
  structure. E-BST stores the input feature realizations and statistics of the target(s) that
  enable calculating the split heuristic at any time. To alleviate time and memory costs, E-BST
  implements a memory management routine, where the worst split candidates are pruned from the
  binary tree.
  
  In this variant, only the left branch statistics are stored and the complete split-enabling
  statistics are calculated with an in-order traversal of the binary search tree.
  
  References
  ----------
  [^1]: Ikonomovska, E., Gama, J., & Džeroski, S. (2011). Learning model trees from evolving
      data streams. Data mining and knowledge discovery, 23(1), 128-168.
  [^2]: [Osojnik, Aljaž. 2017. Structured output prediction on Data Streams
  (Doctoral Dissertation)](http://kt.ijs.si/theses/phd_aljaz_osojnik.pdf)
class_docstr_tok: ["iSOUP-Tree","'s","Extended","Binary","Search","Tree","(","E-BST",")",".","This","class","implements","the","Extended","Binary","Search","Tree","[","^1","]","(","E-BST",")","structure",",","using","the","variant","employed","by","Osojnik","et","al",".","[","^2","]","in","the","iSOUP-Tree","algorithm",".","This","structure","is","employed","to","observe","the","target","space","distribution",".","Proposed","along","with","Fast","Incremental","Model","Tree","with","Drift","Detection","[","^1","]","(","FIMT-DD",")",",","E-BST","was","the","first","attribute","observer","(","AO",")","proposed","for","incremental","Hoeffding","Tree","regressors",".","This","AO","works","by","storing","all","observations","between","splits","in","an","extended","binary","search","tree","structure",".","E-BST","stores","the","input","feature","realizations","and","statistics","of","the","target","(","s",")","that","enable","calculating","the","split","heuristic","at","any","time",".","To","alleviate","time","and","memory","costs",",","E-BST","implements","a","memory","management","routine",",","where","the","worst","split","candidates","are","pruned","from","the","binary","tree",".","In","this","variant",",","only","the","left","branch","statistics","are","stored","and","the","complete","split-enabling","statistics","are","calculated","with","an","in-order","traversal","of","the","binary","search","tree",".","References","--","--","--","--","--","[","^1","]",":","Ikonomovska",",","E.",",","Gama",",","J.",",","&","D\u017eeroski",",","S.","(","2011",")",".","Learning","model","trees","from","evolving","data","streams",".","Data","mining","and","knowledge","discovery",",","23","(","1",")",",","128-168",".","[","^2","]",":","[","Osojnik",",","Alja\u017e",".","2017",".","Structured","output","prediction","on","Data","Streams","(","Doctoral","Dissertation",")","]","(","http",":","\/\/kt.ijs.si\/theses\/phd_aljaz_osojnik.pdf",")"]
code: def update(self, att_val, target_val, w):
      if att_val is None:
          return
      else:
          if self._root is None:
              self._root = EBSTNode(att_val, target_val, w)
          else:
              self._root.insert_value(att_val, target_val, w)
  
file_path: river/river/tree/splitter/ebst_splitter.py
imports: from __future__ import annotations
  import functools
  from river.stats import Var
  from ..utils import BranchFactory
  from .base import Splitter
label_desc: Use image node_id 3 for calling the EBSTSplitter obj's underlying member method code with example usage: obj.update(att_val, target_val, w) without return types