public static long AppendSynchronized( VectorNode root, VectorNode node, IDistanceCalculator model, double foldAngle, double identicalAngle) { var cursor = root; while (true) { var angle = cursor.Vector == null ? 0 : model.CosAngle(node.Vector, cursor.Vector); if (angle >= identicalAngle) { return(cursor.PostingsOffset); } else if (angle > foldAngle) { if (cursor.Left == null) { lock (cursor) { if (cursor.Left == null) { node.PostingsOffset = root.Weight; cursor.Left = node; return(node.PostingsOffset); } } } else { cursor = cursor.Left; } } else { if (cursor.Right == null) { lock (cursor) { if (cursor.Right == null) { node.PostingsOffset = root.Weight; cursor.Right = node; return(node.PostingsOffset); } } } else { cursor = cursor.Right; } } } }
public static bool TryMerge( VectorNode root, VectorNode node, IDistanceCalculator model, double foldAngle, double identicalAngle, out VectorNode parent) { var cursor = root; while (true) { var angle = cursor.Vector == null ? 0 : model.CosAngle(node.Vector, cursor.Vector); if (angle >= identicalAngle) { parent = cursor; return(true); } else if (angle > foldAngle) { if (cursor.Left == null) { cursor.Left = node; parent = cursor; return(false); } else { cursor = cursor.Left; } } else { if (cursor.Right == null) { cursor.Right = node; parent = cursor; return(false); } else { cursor = cursor.Right; } } } }
public static bool MergeOrAddConcurrent( VectorNode root, VectorNode node, IDistanceCalculator model, double foldAngle, double identicalAngle) { var cursor = root; while (true) { var angle = cursor.Vector == null ? 0 : model.CosAngle(node.Vector, cursor.Vector); if (angle >= identicalAngle) { lock (cursor.Sync) { AddDocId(cursor, node); } return(true); } else if (angle > foldAngle) { if (cursor.Left == null) { lock (cursor.Sync) { if (cursor.Left == null) { cursor.Left = node; return(false); } else { cursor = cursor.Left; } } } else { cursor = cursor.Left; } } else { if (cursor.Right == null) { lock (cursor.Sync) { if (cursor.Right == null) { cursor.Right = node; return(false); } else { cursor = cursor.Right; } } } else { cursor = cursor.Right; } } } }