Package org.apache.lucene.util.hnsw

## Class NeighborArray

- java.lang.Object
- - org.apache.lucene.util.hnsw.NeighborArray

-     public class NeighborArray
      extends Object

  NeighborArray encodes the neighbors of a node and their mutual scores in the HNSW graph as a pair of growable arrays. Nodes are arranged in the sorted order of their scores in descending order (if scoresDescOrder is true), or in the ascending order of their scores (if scoresDescOrder is false)
  NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.

- - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `ReadWriteLock` | `rwlock` |

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `NeighborArray​(int maxSize, boolean descOrder)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `addAndEnsureDiversity​(int newNode, float newScore, int nodeId, RandomVectorScorerSupplier scorerSupplier)` | In addition to `addOutOfOrder(int, float)`, this function will also remove the least-diverse node if the node array is full after insertion
    `void` | `addInOrder​(int newNode, float newScore)` | Add a new node to the NeighborArray.
    `void` | `addOutOfOrder​(int newNode, float newScore)` | Add node and newScore but do not insert as sorted
    `void` | `clear()` |
    `int[]` | `nodes()` | Direct access to the internal list of node ids; provided for efficient writing of the graph
    `float[]` | `scores()` |
    `int` | `size()` |
    `String` | `toString()` |

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Field Detail

    - #### rwlock

          public final ReadWriteLock rwlock

  - ### Constructor Detail

    - #### NeighborArray

          public NeighborArray​(int maxSize,
                               boolean descOrder)

  - ### Method Detail

    - #### addInOrder

          public void addInOrder​(int newNode,
                                 float newScore)

      Add a new node to the NeighborArray. The new node must be worse than all previously stored nodes. This cannot be called after `addOutOfOrder(int, float)`

    - #### addOutOfOrder

          public void addOutOfOrder​(int newNode,
                                    float newScore)

      Add node and newScore but do not insert as sorted

    - #### addAndEnsureDiversity

          public void addAndEnsureDiversity​(int newNode,
                                            float newScore,
                                            int nodeId,
                                            RandomVectorScorerSupplier scorerSupplier)
                                     throws IOException

      In addition to `addOutOfOrder(int, float)`, this function will also remove the least-diverse node if the node array is full after insertion

      In multi-threading environment, this method need to be locked as it will be called by multiple threads while other add method is only supposed to be called by one thread.

      Parameters:
        `nodeId` - node Id of the owner of this NeighbourArray
      Throws:
        `IOException`

    - #### size

          public int size()

    - #### nodes

          public int[] nodes()

      Direct access to the internal list of node ids; provided for efficient writing of the graph
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.

    - #### scores

          public float[] scores()

    - #### clear

          public void clear()

    - #### toString

          public String toString()

      Overrides:
        `toString` in class `Object`