docs: protected void bicoUpdate(double[] x) {
  		assert (!this.bufferPhase && this.numDimensions == x.length);
  		// Starts with the global root node as the current root node
  		ClusteringTreeNode r = this.root;
  		int i = 1;
  		while (true) {
  			ClusteringTreeNode y = r.nearestChild(x);
  			// Checks if the point can not be added to the current level
  			if (r.hasNoChildren()
  					|| y == null
  					|| Metric.distanceSquared(x, y.getCenter()) > calcRSquared(i)) {
  				// Creates a new node for the point and adds it to the current
  				// root node
  				r.addChild(new ClusteringTreeNode(x, new ClusteringFeature(x, calcR(i))));
  				this.rootCount++;
  				break;
  			} else {
  				// Checks if the point can be added to the nearest node without
  				// exceeding the global threshold
  				if (y.getClusteringFeature().calcKMeansCosts(y.getCenter(), x) <= this.T) {
  					// Adds the point to the ClusteringFeature
  					y.getClusteringFeature().add(1, x, Metric.distanceSquared(x));
  					break;
  				} else {
  					// Navigates one level down in the tree
  					r = y;
  					i++;
  				}
  			}
  		}
  		// Checks if the number of nodes in the tree exceeds the maximum number
  		if (this.rootCount > this.maxNumClusterFeatures) {
  			rebuild();
  		}
  	}