diff --git a/cpp/src/TypedIndex.h b/cpp/src/TypedIndex.h index c30ae97c..1966f1bf 100644 --- a/cpp/src/TypedIndex.h +++ b/cpp/src/TypedIndex.h @@ -36,6 +36,11 @@ #include "hnswlib.h" #include "std_utils.h" +class RecallError : public std::runtime_error { +public: + RecallError(const std::string &what) : std::runtime_error(what) {} +}; + template inline const StorageDataType storageDataType(); template inline const std::string storageDataTypeName(); @@ -569,10 +574,11 @@ class TypedIndex : public Index { nullptr, queryEf); if (result.size() != (unsigned long)k) { - throw std::runtime_error( + throw RecallError( "Fewer than expected results were retrieved; only found " + std::to_string(result.size()) + " of " + std::to_string(k) + - " requested neighbors."); + " requested neighbors. Reconstruct the index with a higher M " + "value to increase recall."); } for (int i = k - 1; i >= 0; i--) { @@ -606,10 +612,11 @@ class TypedIndex : public Index { queryEf); if (result.size() != (unsigned long)k) { - throw std::runtime_error( + throw RecallError( "Fewer than expected results were retrieved; only found " + std::to_string(result.size()) + " of " + std::to_string(k) + - " requested neighbors."); + " requested neighbors. Reconstruct the index with a higher M " + "value to increase recall."); } for (int i = k - 1; i >= 0; i--) { @@ -662,10 +669,11 @@ class TypedIndex : public Index { algorithmImpl->searchKnn(queryVector.data(), k, nullptr, queryEf); if (result.size() != (unsigned long)k) { - throw std::runtime_error( + throw RecallError( "Fewer than expected results were retrieved; only found " + std::to_string(result.size()) + " of " + std::to_string(k) + - " requested neighbors."); + " requested neighbors. Reconstruct the index with a higher M value " + "to increase recall."); } for (int i = k - 1; i >= 0; i--) { @@ -683,10 +691,11 @@ class TypedIndex : public Index { algorithmImpl->searchKnn(norm_array.data(), k, nullptr, queryEf); if (result.size() != (unsigned long)k) { - throw std::runtime_error( + throw RecallError( "Fewer than expected results were retrieved; only found " + std::to_string(result.size()) + " of " + std::to_string(k) + - " requested neighbors."); + " requested neighbors. Reconstruct the index with a higher M value " + "to increase recall."); } for (int i = k - 1; i >= 0; i--) { diff --git a/cpp/test/test_main.cpp b/cpp/test/test_main.cpp index e35f81a1..0fdf238b 100644 --- a/cpp/test/test_main.cpp +++ b/cpp/test/test_main.cpp @@ -26,7 +26,7 @@ template &index, int numVectors, int numDimensions, SpaceType spaceType, StorageDataType storageType, bool testSingleVectorMethod, - float precisionTolerance) { + float precisionTolerance, int k) { /** * Create test data and ids. If we are using Float8 or E4M3 storage, quantize * the vector values, if we are using Float32 storage, keep the float values @@ -53,7 +53,6 @@ void testQuery(TypedIndex &index, int numVectors, index.addItems(inputData, ids, -1); } - int k = 1; float lowerBound = 0.0f - precisionTolerance; float upperBound = 0.0f + precisionTolerance; @@ -120,8 +119,94 @@ void testQuery(TypedIndex &index, int numVectors, } } +/** + * Test querying the index when k is equal to the total number of items in the + * index. + */ +template > +void testQueryAllNearestNeighbors( + TypedIndex &index, int numVectors, + int numDimensions, bool testSingleVectorMethod) { + + std::vector> inputData = + randomVectors(numVectors, numDimensions); + std::vector ids(numVectors); + for (int i = 0; i < numVectors; i++) { + ids[i] = i; + } + + // add items to index + if (testSingleVectorMethod == true) { + for (auto id : ids) { + index.addItem(inputData[id], id); + } + } else { + index.addItems(inputData, ids, -1); + } + REQUIRE(index.getNumElements() == numVectors); + + std::vector targetVector = inputData[0]; + REQUIRE_THROWS_AS(index.query(targetVector, numVectors, -1), RecallError); +} + +/** + * This test reproduces https://github.com/spotify/voyager/issues/38, an issue + * where we cannot achieve 100% recall. testQueryAllNearestNeighbors() asserts + * that a custom RecallError is thrown. + */ +TEST_CASE( + "Test querying for kNN when k equals the number of items in the index") { + std::vector spaceTypesSet = { + SpaceType::Euclidean, SpaceType::InnerProduct, SpaceType::Cosine}; + std::vector storageTypesSet = { + StorageDataType::Float8, StorageDataType::Float32, StorageDataType::E4M3}; + std::vector numDimensionsSet = {32}; + std::vector numVectorsSet = {30000}; + std::vector testSingleVectorMethods = {true}; + + // Use a small M value to exacerbate the issue where a graph becomes + // disconnected. This helps to reproduce this nondeterministic issue. + size_t M_ = 4; + + for (auto spaceType : spaceTypesSet) { + for (auto storageType : storageTypesSet) { + for (auto numDimensions : numDimensionsSet) { + for (auto numVectors : numVectorsSet) { + for (auto testSingleVectorMethod : testSingleVectorMethods) { + + SUBCASE("Test instantiation ") { + CAPTURE(spaceType); + CAPTURE(numDimensions); + CAPTURE(numVectors); + CAPTURE(storageType); + CAPTURE(std::to_string(testSingleVectorMethod)); + + if (storageType == StorageDataType::Float8) { + auto index = TypedIndex>( + spaceType, numDimensions, M_); + testQueryAllNearestNeighbors(index, numVectors, numDimensions, + testSingleVectorMethod); + } else if (storageType == StorageDataType::Float32) { + auto index = TypedIndex(spaceType, numDimensions, M_); + testQueryAllNearestNeighbors(index, numVectors, numDimensions, + testSingleVectorMethod); + } else if (storageType == StorageDataType::E4M3) { + auto index = + TypedIndex(spaceType, numDimensions, M_); + testQueryAllNearestNeighbors(index, numVectors, numDimensions, + testSingleVectorMethod); + } + } + } + } + } + } + } +} + TEST_CASE("Test combinations of different instantiations. Test that each " - "vector's NN is itself and distance is approximately zero.") { + "vector's ANN is itself and distance is approximately zero.") { std::unordered_map PRECISION_TOLERANCE_PER_DATA_TYPE = {{StorageDataType::Float32, 0.00001f}, {StorageDataType::Float8, 0.10f}, @@ -133,6 +218,7 @@ TEST_CASE("Test combinations of different instantiations. Test that each " std::vector storageTypesSet = { StorageDataType::Float8, StorageDataType::Float32, StorageDataType::E4M3}; std::vector testSingleVectorMethods = {true, false}; + int k = 1; for (auto spaceType : spaceTypesSet) { for (auto storageType : storageTypesSet) { @@ -154,21 +240,21 @@ TEST_CASE("Test combinations of different instantiations. Test that each " storageType); testQuery(index, numVectors, numDimensions, spaceType, storageType, testSingleVectorMethod, - PRECISION_TOLERANCE_PER_DATA_TYPE[storageType]); + PRECISION_TOLERANCE_PER_DATA_TYPE[storageType], k); } else if (storageType == StorageDataType::Float32) { auto index = TypedIndex(spaceType, numDimensions); testIndexProperties(index, spaceType, numDimensions, storageType); testQuery(index, numVectors, numDimensions, spaceType, storageType, testSingleVectorMethod, - PRECISION_TOLERANCE_PER_DATA_TYPE[storageType]); + PRECISION_TOLERANCE_PER_DATA_TYPE[storageType], k); } else if (storageType == StorageDataType::E4M3) { auto index = TypedIndex(spaceType, numDimensions); testIndexProperties(index, spaceType, numDimensions, storageType); testQuery(index, numVectors, numDimensions, spaceType, storageType, testSingleVectorMethod, - PRECISION_TOLERANCE_PER_DATA_TYPE[storageType]); + PRECISION_TOLERANCE_PER_DATA_TYPE[storageType], k); } } } @@ -178,8 +264,8 @@ TEST_CASE("Test combinations of different instantiations. Test that each " } } -TEST_CASE("Test vectorsToNDArray converts 2D vector of float to NDArray") { +TEST_CASE( + "Test vectorsToNDArray converts 2D vector of float to NDArray") { std::vector> vectors = {{1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 6.0f, 7.0f, 8.0f}, {9.0f, 10.0f, 11.0f, 12.0f}}; @@ -205,8 +291,8 @@ TEST_CASE("Test vectorsToNDArray converts 2D vector of float to NDArray> vectors1 = {{1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 6.0f, 7.0f}, {9.0f, 10.0f, 11.0f, 12.0f}}; diff --git a/docs/java/apidocs/allclasses-index.html b/docs/java/apidocs/allclasses-index.html new file mode 100644 index 00000000..ee59aadd --- /dev/null +++ b/docs/java/apidocs/allclasses-index.html @@ -0,0 +1,108 @@ + + + + +All Classes and Interfaces (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Classes and Interfaces

+
+
+
+
+
+
Class
+
Description
+ +
+
A Voyager index, providing storage of floating-point vectors and the ability to efficiently + search among those vectors.
+
+ +
+
A container for query results, returned by Index.
+
+ +
+
The space, also known as distance metric, to use when searching.
+
+ +
+
The datatype used to use when storing vectors on disk.
+
+ +
 
+ +
+
An exception that indicates an error about the recall performance of the index.
+
+ +
+
Wrapper around com.spotify.voyager.jni.Index with a simplified interface which maps the index ID + to a provided String.
+
+ +
+
A wrapper class for nearest neighbor query results.
+
+ +
+
A dependency-free, super tiny JSON serde class that only supports reading and writing lists of + strings.
+
+
+
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/allpackages-index.html b/docs/java/apidocs/allpackages-index.html new file mode 100644 index 00000000..deb798e6 --- /dev/null +++ b/docs/java/apidocs/allpackages-index.html @@ -0,0 +1,80 @@ + + + + +All Packages (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Packages

+
+
Package Summary
+
+
Package
+
Description
+ +
+
Voyager is a Java and Python library that provides approximate nearest-neighbor search of vector + data.
+
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+ +
 
+ +
 
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/Index.QueryResults.html b/docs/java/apidocs/com/spotify/voyager/jni/Index.QueryResults.html new file mode 100644 index 00000000..ed32b210 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/Index.QueryResults.html @@ -0,0 +1,275 @@ + + + + +Index.QueryResults (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class Index.QueryResults

+
+
java.lang.Object +
com.spotify.voyager.jni.Index.QueryResults
+
+
+
+
Enclosing class:
+
Index
+
+
+
public static class Index.QueryResults +extends Object
+
A container for query results, returned by Index. Note that this class is instantiated from + C++, and as such, any changes to its location, visibility, or constructor will need to include + corresponding C++ changes.
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    final float[]
    + +
    +
    A list of distances from each item ID to the query vector for this query.
    +
    +
    final long[]
    + +
    +
    A list of item IDs ("labels").
    +
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    QueryResults(long[] labels, + float[] distances)
    +
    +
    Instantiates a new QueryResults object, provided two identical-length arrays of labels and + their corresponding distances.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    float[]
    + +
    +
    Retrieve the list of distances between query vectors and item vectors for the results of this + query.
    +
    +
    long[]
    + +
    +
    Retrieve the list of item IDs ("labels") returned by this query.
    +
    + + +
     
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      labels

      +
      public final long[] labels
      +
      A list of item IDs ("labels").
      +
      +
    • +
    • +
      +

      distances

      +
      public final float[] distances
      +
      A list of distances from each item ID to the query vector for this query.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      QueryResults

      +
      public QueryResults(long[] labels, + float[] distances)
      +
      Instantiates a new QueryResults object, provided two identical-length arrays of labels and + their corresponding distances. This method should probably not be used directly, as this + class is primarily used as a return type from the query method on Index.
      +
      +
      Throws:
      +
      IllegalArgumentException - if the length of the labels and distances arrays vary
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public String toString()
      +
      +
      Overrides:
      +
      toString in class Object
      +
      +
      +
    • +
    • +
      +

      getLabels

      +
      public long[] getLabels()
      +
      Retrieve the list of item IDs ("labels") returned by this query. This array is sorted by + distance: the first item is the closest to the query vector, the second is second-closest, + and so on. The items in this array correspond 1:1 with the distances returned by + getDistances().
      +
      +
    • +
    • +
      +

      getDistances

      +
      public float[] getDistances()
      +
      Retrieve the list of distances between query vectors and item vectors for the results of this + query. This array is sorted by distance: the first distance corresponds with the item the + closest to the query vector, the second is second-closest, and so on. The items in this array + correspond 1:1 with the labels returned by getLabels().
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/Index.SpaceType.html b/docs/java/apidocs/com/spotify/voyager/jni/Index.SpaceType.html new file mode 100644 index 00000000..a36fa3c6 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/Index.SpaceType.html @@ -0,0 +1,258 @@ + + + + +Index.SpaceType (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Enum Index.SpaceType

+
+
java.lang.Object +
java.lang.Enum<Index.SpaceType> +
com.spotify.voyager.jni.Index.SpaceType
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<Index.SpaceType>
+
+
+
Enclosing class:
+
Index
+
+
+
public static enum Index.SpaceType +extends Enum<Index.SpaceType>
+
The space, also known as distance metric, to use when searching. + +

SpaceType is a property of an Index, and cannot be changed after instantiation. Loading an + index with a different SpaceType than it was created with may result in nonsensical results + being returned.

+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    +
      +
    • +
      +

      Euclidean

      +
      public static final Index.SpaceType Euclidean
      +
      Euclidean distance, also known as L2 distance. Computed by taking the square root of + the sum of squared differences between each element of each vector.
      +
      +
    • +
    • +
      +

      InnerProduct

      +
      public static final Index.SpaceType InnerProduct
      +
      Inner (dot) product. Computed by taking the sum of the products of each element of each + vector. Since v2.0, this is implemented using the order preserving transform defined in this + paper from Microsoft: + https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/XboxInnerProduct.pdf
      +
      +
    • +
    • +
      +

      Cosine

      +
      public static final Index.SpaceType Cosine
      +
      Cosine distance; i.e. normalized dot product. Computed by taking the sum of the products of + each element of each vector, divided by the product of the magnitudes of each vector.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static Index.SpaceType[] values()
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum type, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static Index.SpaceType valueOf(String name)
      +
      Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum type has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/Index.StorageDataType.html b/docs/java/apidocs/com/spotify/voyager/jni/Index.StorageDataType.html new file mode 100644 index 00000000..594d2b61 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/Index.StorageDataType.html @@ -0,0 +1,264 @@ + + + + +Index.StorageDataType (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Enum Index.StorageDataType

+
+
java.lang.Object +
java.lang.Enum<Index.StorageDataType> +
com.spotify.voyager.jni.Index.StorageDataType
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<Index.StorageDataType>
+
+
+
Enclosing class:
+
Index
+
+
+
public static enum Index.StorageDataType +extends Enum<Index.StorageDataType>
+
The datatype used to use when storing vectors on disk. Affects both precision and memory usage.
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    +
      +
    • +
      +

      Float8

      +
      public static final Index.StorageDataType Float8
      +
      An 8-bit floating point data type that expects all values to be on [-1, 1]. This data type + provides adequate precision for many use cases, but cuts down memory usage bu a factor of 4x + compared to Float32, while also increasing query speed. + +

      Float8 provides 8 bits of resolution; i.e.: the distance between successive values is + 1/127, or 0.00787. For a variable-precision (i.e.: _actually_ floating point) representation, + use E4M3.

      +
      +
    • +
    • +
      +

      Float32

      +
      public static final Index.StorageDataType Float32
      +
      A 32-bit floating point ("Float") data type. The default.
      +
      +
    • +
    • +
      +

      E4M3

      +
      public static final Index.StorageDataType E4M3
      +
      A custom 8-bit floating point data type with range [-448, 448] and variable precision. Use + this data type to get 4x less memory usage compared to Float32, but when the values of + vectors to be stored in an Index may exceed [-1, 1]. + +

      E4M3 uses a 4-bit exponent and 3-bit mantissa field, and was inspired by the paper "FP8 + Formats for Deep Learning" by Micikevicus et al (arXiv:2209.05433). + +

      Note that using E4M3 with the Cosine space may result in negative distances at query time + due to reduced floating-point precision. While confusing, the query results are still + correctly ordered.

      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static Index.StorageDataType[] values()
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum type, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static Index.StorageDataType valueOf(String name)
      +
      Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum type has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/Index.html b/docs/java/apidocs/com/spotify/voyager/jni/Index.html new file mode 100644 index 00000000..ab51a883 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/Index.html @@ -0,0 +1,1005 @@ + + + + +Index (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class Index

+
+
java.lang.Object +
com.spotify.voyager.jni.Index
+
+
+
+
All Implemented Interfaces:
+
Closeable, AutoCloseable
+
+
+
public class Index +extends Object +implements Closeable
+
A Voyager index, providing storage of floating-point vectors and the ability to efficiently + search among those vectors. + +

A brief example of how to use Index: + +

+   // Create a new Index that compares 4-dimensional vectors via Euclidean distance:
+   Index index = new Index(Index.SpaceType.Euclidean, 4);
+
+   // Add some data to the index:
+   index.addItem(new float[]{1.0f, 2.0f, 3.0f, 4.0f});
+   index.addItem(new float[]{2.0f, 3.0f, 4.0f, 5.0f});
+
+   // Query the index to return the `k` nearest neighbors of a given vector:
+   Index.QueryResults results = index.query(new float[]{3.0f, 4.0f, 5.0f, 6.0f}, 1);
+
+   // Our query will return the 1th (second) item that was added, as it's the closest:
+   assert(results.getLabels()[0] == 1);
+
+   // Serialize this index to use it again later:
+   index.saveIndex("my_tiny_index.voy");
+ 
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    Nested Classes
    +
    +
    Modifier and Type
    +
    Class
    +
    Description
    +
    static class 
    + +
    +
    A container for query results, returned by Index.
    +
    +
    static enum 
    + +
    +
    The space, also known as distance metric, to use when searching.
    +
    +
    static enum 
    + +
    +
    The datatype used to use when storing vectors on disk.
    +
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    Index(Index.SpaceType space, + int numDimensions)
    +
    +
    Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
    +
    +
    Index(Index.SpaceType space, + int numDimensions, + long indexM, + long efConstruction, + long randomSeed, + long maxElements, + Index.StorageDataType storageDataType)
    +
    +
    Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    +
    addItem(float[] vector)
    +
    +
    Add an item (a vector) to this Index.
    +
    +
    void
    +
    addItem(float[] vector, + long id)
    +
    +
    Add an item (a vector) to this Index with the provided identifier.
    +
    +
    void
    +
    addItems(float[][] vectors, + int numThreads)
    +
    +
    Add multiple items (vectors) to this Index.
    +
    +
    void
    +
    addItems(float[][] vectors, + long[] ids, + int numThreads)
    +
    +
    Add multiple items (vectors) to this Index.
    +
    +
    byte[]
    + +
    +
    Returns the contents of this index as an array of bytes.
    +
    +
    void
    + +
    +
    Close this Index and release any memory held by it.
    +
    +
    protected void
    + +
     
    +
    int
    + +
    +
    Get the default EF ("query search depth") that will be uses when query(float[], int) is called.
    +
    +
    long
    + +
    +
    Get the EF Construction value used when adding new elements to this Index.
    +
    +
    long[]
    + +
    +
    Get the list of identifiers currently stored by this index.
    +
    +
    long
    + +
    +
    Get the M value used when adding new elements to this Index.
    +
    +
    long
    + +
    +
    Get the maximum number of elements currently storable by this Index.
    +
    +
    int
    + +
    +
    Get the number of dimensions used in this Index.
    +
    +
    long
    + +
    +
    Get the number of elements currently in this Index.
    +
    +
    int
    + +
    +
    Get the default number of threads used when adding multiple vectors in bulk oor when querying + for multiple vectors simultaneously.
    +
    + + +
    +
    Get the Index.SpaceType that this Index uses to store and compare vectors.
    +
    +
    float[]
    +
    getVector(long id)
    +
    +
    Get the vector for the provided identifier.
    +
    +
    float[][]
    +
    getVectors(long[] ids)
    +
    +
    Get the vectors for a provided array of identifiers.
    +
    +
    static Index
    +
    load(InputStream inputStream)
    +
    +
    Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
    +
    +
    static Index
    +
    load(InputStream inputStream, + Index.SpaceType space, + int numDimensions, + Index.StorageDataType storageDataType)
    +
    +
    Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
    +
    +
    static Index
    +
    load(String filename)
    +
    +
    Load a Voyager index file and create a new Index initialized with the data in that + file.
    +
    +
    static Index
    +
    load(String filename, + Index.SpaceType space, + int numDimensions, + Index.StorageDataType storageDataType)
    +
    +
    Load a Voyager index file and create a new Index initialized with the data in that + file.
    +
    +
    void
    +
    markDeleted(long label)
    +
    +
    Mark an element of the index as deleted.
    +
    + +
    query(float[][] queryVectors, + int k, + int numThreads)
    +
    +
    Query this Index for approximate nearest neighbors of multiple query vectors.
    +
    + +
    query(float[][] queryVectors, + int k, + int numThreads, + long queryEf)
    +
    +
    Query this Index for approximate nearest neighbors of multiple query vectors.
    +
    + +
    query(float[] queryVector, + int k)
    +
    +
    Query this Index for approximate nearest neighbors of a single query vector.
    +
    + +
    query(float[] queryVector, + int k, + long queryEf)
    +
    +
    Query this Index for approximate nearest neighbors of a single query vector.
    +
    +
    void
    +
    resizeIndex(long newSize)
    +
    +
    Change the maximum number of elements currently storable by this Index.
    +
    +
    void
    +
    saveIndex(OutputStream outputStream)
    +
    +
    Save this Index to the provided output stream.
    +
    +
    void
    +
    saveIndex(String pathToIndex)
    +
    +
    Save this Index to a file at the provided filename.
    +
    +
    void
    +
    setEf(long ef)
    +
    +
    Set the default EF ("query search depth") to use when query(float[], int) is called.
    +
    +
    void
    +
    setNumThreads(int numThreads)
    +
    +
    Set the default number of threads to use when adding multiple vectors in bulk, or when querying + for multiple vectors simultaneously.
    +
    +
    void
    +
    unmarkDeleted(long label)
    +
    +
    Un-mark an element of the index as deleted, making it available again.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Index

      +
      public Index(Index.SpaceType space, + int numDimensions)
      +
      Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
      +
      +
      Parameters:
      +
      space - the space type to use when storing and comparing vectors.
      +
      numDimensions - the number of dimensions per vector.
      +
      +
      +
    • +
    • +
      +

      Index

      +
      public Index(Index.SpaceType space, + int numDimensions, + long indexM, + long efConstruction, + long randomSeed, + long maxElements, + Index.StorageDataType storageDataType)
      +
      Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
      +
      +
      Parameters:
      +
      space - The space type to use when storing and comparing vectors.
      +
      numDimensions - The number of dimensions per vector.
      +
      indexM - Controls the degree of interconnectedness between vectors. Higher values of + M provide better recall (i.e. higher quality) but use more memory.
      +
      efConstruction - Controls index quality, affecting the speed of addItem calls. + Does not affect memory usage or size of the index.
      +
      randomSeed - A random seed to use when initializing the index's internal data structures.
      +
      maxElements - The maximum number of elements that this index can hold. This is a + performance optimization; if the index contains this number of elements and addItem(float[]) or addItems(float[][], int) is called, the index's capacity will automatically + expanded to fit the new elements. Setting maxElements in advance helps avoid these + expensive resize operations if the number of elements to be added is already known.
      +
      storageDataType - The datatype to use under-the-hood when storing vectors. Different data + type options trade off precision for memory usage and query speed; see Index.StorageDataType for available data types.
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      load

      +
      public static Index load(String filename, + Index.SpaceType space, + int numDimensions, + Index.StorageDataType storageDataType)
      +
      Load a Voyager index file and create a new Index initialized with the data in that + file.
      +
      +
      Parameters:
      +
      filename - A filename to load.
      +
      space - The Index.SpaceType to use when loading the index.
      +
      numDimensions - The number of dimensions per vector.
      +
      storageDataType - The Index.StorageDataType used by the index being loaded.
      +
      Returns:
      +
      An Index whose contents have been initialized with the data provided by the + file.
      +
      Throws:
      +
      RuntimeException - if the index cannot be loaded from the file, or the file contains + invalid data.
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static Index load(String filename)
      +
      Load a Voyager index file and create a new Index initialized with the data in that + file.
      +
      +
      Parameters:
      +
      filename - A filename to load.
      +
      Returns:
      +
      An Index whose contents have been initialized with the data provided by the + file.
      +
      Throws:
      +
      RuntimeException - if the index cannot be loaded from the file, the file contains invalid + data, or the file contains an older version of the Voyager file format that requires + additional arguments to be provided.
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static Index load(InputStream inputStream, + Index.SpaceType space, + int numDimensions, + Index.StorageDataType storageDataType)
      +
      Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
      +
      +
      Parameters:
      +
      inputStream - A InputStream that will provide the contents of a Voyager + index.
      +
      space - The Index.SpaceType to use when loading the index.
      +
      numDimensions - The number of dimensions per vector.
      +
      storageDataType - The Index.StorageDataType used by the index being loaded.
      +
      Returns:
      +
      An Index whose contents have been initialized with the data provided by the + input stream.
      +
      Throws:
      +
      RuntimeException - if the index cannot be loaded from the stream, or the stream contains + invalid data.
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static Index load(InputStream inputStream)
      +
      Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
      +
      +
      Parameters:
      +
      inputStream - A InputStream that will provide the contents of a Voyager + index.
      +
      Returns:
      +
      An Index whose contents have been initialized with the data provided by the + input stream.
      +
      Throws:
      +
      RuntimeException - if the index cannot be loaded from the stream, or the stream contains + invalid data, or the file contains an older version of the Voyager file format that + requires additional arguments to be provided.
      +
      +
      +
    • +
    • +
      +

      close

      +
      public void close() + throws IOException
      +
      Close this Index and release any memory held by it. Note that this method must be + called to release the memory backing this Index; failing to do so may cause a memory + leak. + +

      Any calls to methods after close() is called will fail, as the underlying + native C++ object will have been deallocated.

      +
      +
      Specified by:
      +
      close in interface AutoCloseable
      +
      Specified by:
      +
      close in interface Closeable
      +
      Throws:
      +
      IOException - if the C++ destructor fails.
      +
      +
      +
    • +
    • +
      +

      finalize

      +
      protected void finalize() + throws Throwable
      +
      +
      Overrides:
      +
      finalize in class Object
      +
      Throws:
      +
      Throwable
      +
      +
      +
    • +
    • +
      +

      setEf

      +
      public void setEf(long ef)
      +
      Set the default EF ("query search depth") to use when query(float[], int) is called.
      +
      +
      Parameters:
      +
      ef - The new default EF value to use. This value can be overridden on a per-query basis at + query time.
      +
      +
      +
    • +
    • +
      +

      getEf

      +
      public int getEf()
      +
      Get the default EF ("query search depth") that will be uses when query(float[], int) is called.
      +
      +
      Returns:
      +
      The current default EF value, used by the Index if no value is provided at + query time.
      +
      +
      +
    • +
    • +
      +

      getSpace

      +
      public Index.SpaceType getSpace()
      +
      Get the Index.SpaceType that this Index uses to store and compare vectors.
      +
      +
      Returns:
      +
      The Index.SpaceType that is currently used by this Index.
      +
      +
      +
    • +
    • +
      +

      getNumDimensions

      +
      public int getNumDimensions()
      +
      Get the number of dimensions used in this Index.
      +
      +
      Returns:
      +
      The number of dimensions used by this Index, and which all vectors within this + Index must have.
      +
      +
      +
    • +
    • +
      +

      setNumThreads

      +
      public void setNumThreads(int numThreads)
      +
      Set the default number of threads to use when adding multiple vectors in bulk, or when querying + for multiple vectors simultaneously.
      +
      +
      Parameters:
      +
      numThreads - The default number of threads used for bulk-add or bulk-query methods if not + overridden in each method call. Note that this affects the number of threads started for + each method call - Voyager keeps no long-lived thread pool. For maximum efficiency, pass as + much data as possible to each bulk-add or bulk-query method call to minimize overhead.
      +
      +
      +
    • +
    • +
      +

      getNumThreads

      +
      public int getNumThreads()
      +
      Get the default number of threads used when adding multiple vectors in bulk oor when querying + for multiple vectors simultaneously.
      +
      +
      Returns:
      +
      The default number of threads used for bulk-add or bulk-query methods if not overridden + in each method call.
      +
      +
      +
    • +
    • +
      +

      saveIndex

      +
      public void saveIndex(String pathToIndex)
      +
      Save this Index to a file at the provided filename. This file can be reloaded by using + Index.load(...).
      +
      +
      Parameters:
      +
      pathToIndex - The output filename to write to.
      +
      +
      +
    • +
    • +
      +

      saveIndex

      +
      public void saveIndex(OutputStream outputStream)
      +
      Save this Index to the provided output stream. The stream will not be closed automatically - be + sure to close the stream saveIndex has completed. The data written to the stream can be + reloaded by using Index.load(...).
      +
      +
      Parameters:
      +
      outputStream - The output stream to write to. This stream will not be closed + automatically.
      +
      +
      +
    • +
    • +
      +

      asBytes

      +
      public byte[] asBytes()
      +
      Returns the contents of this index as an array of bytes. The resulting bytes will contain the + same data as if this index was serialized to disk and then read back into memory again.
      +
      +
      Returns:
      +
      A +
      +invalid reference +
      byte
      +
      + array representing the contents of the index
      +
      +
      +
    • +
    • +
      +

      addItem

      +
      public void addItem(float[] vector)
      +
      Add an item (a vector) to this Index. The item will automatically be given an + identifier equal to the return value of getNumElements().
      +
      +
      Parameters:
      +
      vector - The vector to add to the index.
      +
      Throws:
      +
      RuntimeException - If the provided vector does not contain exactly getNumDimensions() dimensions.
      +
      +
      +
    • +
    • +
      +

      addItem

      +
      public void addItem(float[] vector, + long id)
      +
      Add an item (a vector) to this Index with the provided identifier.
      +
      +
      Parameters:
      +
      vector - The vector to add to the index.
      +
      id - The 64-bit integer denoting the identifier of this vector.
      +
      Throws:
      +
      RuntimeException - If the provided vector does not contain exactly getNumDimensions() dimensions.
      +
      +
      +
    • +
    • +
      +

      addItems

      +
      public void addItems(float[][] vectors, + int numThreads)
      +
      Add multiple items (vectors) to this Index.
      +
      +
      Parameters:
      +
      vectors - The vectors to add to the index.
      +
      numThreads - The number of threads to use when adding the provided vectors. If -1 (the + default), the number of CPUs available on the current machine will be used.
      +
      Throws:
      +
      RuntimeException - If any of the provided vectors do not contain exactly getNumDimensions() dimensions.
      +
      +
      +
    • +
    • +
      +

      addItems

      +
      public void addItems(float[][] vectors, + long[] ids, + int numThreads)
      +
      Add multiple items (vectors) to this Index.
      +
      +
      Parameters:
      +
      vectors - The vectors to add to the index.
      +
      ids - The 64-bit identifiers that correspond with each of the provided vectors.
      +
      numThreads - The number of threads to use when adding the provided vectors. If -1 (the + default), the number of CPUs available on the current machine will be used. Note that this + causes a temporary C++ thread pool to be used. Instead of calling addItems(float[][],int) in a + tight loop, consider passing more data to each addItems(float[][],int) call instead to reduce + overhead.
      +
      Throws:
      +
      RuntimeException - If any of the provided vectors do not contain exactly getNumDimensions() dimensions.
      +
      RuntimeException - If the list of IDs does not have the same length as the list of + provided vectors.
      +
      +
      +
    • +
    • +
      +

      getVector

      +
      public float[] getVector(long id)
      +
      Get the vector for the provided identifier.
      +
      +
      Parameters:
      +
      id - The identifier whose vector will be fetched.
      +
      Returns:
      +
      A +
      +invalid reference +
      float
      +
      + array representing the values of the vector.
      +
      Throws:
      +
      RuntimeException - If the provided identifier is not present in the Index.
      +
      +
      +
    • +
    • +
      +

      getVectors

      +
      public float[][] getVectors(long[] ids)
      +
      Get the vectors for a provided array of identifiers.
      +
      +
      Parameters:
      +
      ids - The identifiers whose vector will be fetched.
      +
      Returns:
      +
      A nested +
      +invalid reference +
      float
      +
      + array representing the values of the vectors corresponding with + each ID.
      +
      Throws:
      +
      RuntimeException - If any of the provided identifiers are not present in the Index.
      +
      +
      +
    • +
    • +
      +

      getIDs

      +
      public long[] getIDs()
      +
      Get the list of identifiers currently stored by this index.
      +
      +
      Returns:
      +
      a +
      +invalid reference +
      long
      +
      + array of identifiers.
      +
      +
      +
    • +
    • +
      +

      query

      +
      public Index.QueryResults query(float[] queryVector, + int k)
      +
      Query this Index for approximate nearest neighbors of a single query vector.
      +
      +
      Parameters:
      +
      queryVector - A query vector to use for searching.
      +
      k - The number of nearest neighbors to return.
      +
      Returns:
      +
      A Index.QueryResults object, containing the neighbors found that are (approximately) + nearest to the query vector.
      +
      Throws:
      +
      RecallException - if fewer than k results can be found in the index.
      +
      +
      +
    • +
    • +
      +

      query

      +
      public Index.QueryResults[] query(float[][] queryVectors, + int k, + int numThreads)
      +
      Query this Index for approximate nearest neighbors of multiple query vectors.
      +
      +
      Parameters:
      +
      queryVectors - The query vectors to use for searching.
      +
      k - The number of nearest neighbors to return for each query vector
      +
      numThreads - The number of threads to use when searching. If -1, all available CPU cores + will be used. Note that passing a number of threads other than 1 will cause a temporary C++ + thread pool to be used. Instead of calling query(float[],int) in a tight loop, consider passing + more data to each call instead to reduce overhead.
      +
      Returns:
      +
      An array of Index.QueryResults objects, each containing the neighbors found that are + (approximately) nearest to the corresponding query vector. The returned list of Index.QueryResults will contain the same number of elements as queryVectors.
      +
      Throws:
      +
      RecallException - if fewer than k results can be found in the index for one or + more queries.
      +
      +
      +
    • +
    • +
      +

      query

      +
      public Index.QueryResults query(float[] queryVector, + int k, + long queryEf)
      +
      Query this Index for approximate nearest neighbors of a single query vector.
      +
      +
      Parameters:
      +
      queryVector - A query vector to use for searching.
      +
      k - The number of nearest neighbors to return.
      +
      queryEf - The per-query "ef" value to use. Larger values produce more accurate results at + the expense of query time.
      +
      Returns:
      +
      A Index.QueryResults object, containing the neighbors found that are (approximately) + nearest to the query vector.
      +
      Throws:
      +
      RecallException - if fewer than k results can be found in the index.
      +
      +
      +
    • +
    • +
      +

      query

      +
      public Index.QueryResults[] query(float[][] queryVectors, + int k, + int numThreads, + long queryEf)
      +
      Query this Index for approximate nearest neighbors of multiple query vectors.
      +
      +
      Parameters:
      +
      queryVectors - The query vectors to use for searching.
      +
      k - The number of nearest neighbors to return for each query vector
      +
      numThreads - The number of threads to use when searching. If -1, all available CPU cores + will be used. Note that passing a number of threads other than 1 will cause a temporary C++ + thread pool to be used. Instead of calling query(float[],int) in a tight loop, consider passing + more data to each call instead to reduce overhead.
      +
      queryEf - The per-query "ef" value to use. Larger values produce more accurate results at + the expense of query time.
      +
      Returns:
      +
      An array of Index.QueryResults objects, each containing the neighbors found that are + (approximately) nearest to the corresponding query vector. The returned list of Index.QueryResults will contain the same number of elements as queryVectors.
      +
      Throws:
      +
      RecallException - if fewer than k results can be found in the index for one or + more queries.
      +
      +
      +
    • +
    • +
      +

      markDeleted

      +
      public void markDeleted(long label)
      +
      Mark an element of the index as deleted. Deleted elements will be skipped when querying, but + will still be present in the index.
      +
      +
      Parameters:
      +
      label - The ID of the element to mark as deleted.
      +
      Throws:
      +
      RuntimeException - If the provided identifier is not present in the Index.
      +
      +
      +
    • +
    • +
      +

      unmarkDeleted

      +
      public void unmarkDeleted(long label)
      +
      Un-mark an element of the index as deleted, making it available again.
      +
      +
      Parameters:
      +
      label - The ID of the element to unmark as deleted.
      +
      Throws:
      +
      RuntimeException - If the provided identifier is not present in the Index.
      +
      +
      +
    • +
    • +
      +

      resizeIndex

      +
      public void resizeIndex(long newSize)
      +
      Change the maximum number of elements currently storable by this Index. This operation + reallocates the memory used by the index and can be quite slow, so it may be useful to set the + maximum number of elements in advance if that number is known.
      +
      +
      Parameters:
      +
      newSize - The new number of maximum elements to resize this Index to.
      +
      +
      +
    • +
    • +
      +

      getMaxElements

      +
      public long getMaxElements()
      +
      Get the maximum number of elements currently storable by this Index. If more elements + are added than getMaxElements(), the index will be automatically (but slowly) resized.
      +
      +
      Returns:
      +
      The number of elements (vectors) that are currently storable in this Index.
      +
      +
      +
    • +
    • +
      +

      getNumElements

      +
      public long getNumElements()
      +
      Get the number of elements currently in this Index.
      +
      +
      Returns:
      +
      The number of elements (vectors) in this Index. This count includes any deleted + elements.
      +
      +
      +
    • +
    • +
      +

      getEfConstruction

      +
      public long getEfConstruction()
      +
      Get the EF Construction value used when adding new elements to this Index.
      +
      +
      Returns:
      +
      The current EF Construction value (i.e.: the number of neighbors to search for when + adding new elements).
      +
      +
      +
    • +
    • +
      +

      getM

      +
      public long getM()
      +
      Get the M value used when adding new elements to this Index.
      +
      +
      Returns:
      +
      The current M value (i.e.: the number of links between adjacent vectors to create when + adding elements).
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.QueryResults.html b/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.QueryResults.html new file mode 100644 index 00000000..c1ca9a72 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.QueryResults.html @@ -0,0 +1,233 @@ + + + + +StringIndex.QueryResults (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class StringIndex.QueryResults

+
+
java.lang.Object +
com.spotify.voyager.jni.StringIndex.QueryResults
+
+
+
+
Enclosing class:
+
StringIndex
+
+
+
public static class StringIndex.QueryResults +extends Object
+
A wrapper class for nearest neighbor query results.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      QueryResults

      +
      public QueryResults(String[] names, + float[] distances)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getNames

      +
      public String[] getNames()
      +
      +
    • +
    • +
      +

      getDistances

      +
      public float[] getDistances()
      +
      +
    • +
    • +
      +

      getName

      +
      public String getName(int index)
      +
      +
    • +
    • +
      +

      getDistance

      +
      public float getDistance(int index)
      +
      +
    • +
    • +
      +

      getNumResults

      +
      public int getNumResults()
      +
      +
    • +
    • +
      +

      toString

      +
      public String toString()
      +
      +
      Overrides:
      +
      toString in class Object
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.html b/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.html new file mode 100644 index 00000000..49aadfc9 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/StringIndex.html @@ -0,0 +1,570 @@ + + + + +StringIndex (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class StringIndex

+
+
java.lang.Object +
com.spotify.voyager.jni.StringIndex
+
+
+
+
All Implemented Interfaces:
+
Closeable, AutoCloseable
+
+
+
public class StringIndex +extends Object +implements Closeable
+
Wrapper around com.spotify.voyager.jni.Index with a simplified interface which maps the index ID + to a provided String. + In C++, do we also want to make a second class called StringIndex that wraps around TypedIndex? + +

StringIndex can only accommodate up to 2^31 - 1 (2.1B) items, despite typical Voyager indices + allowing up to 2^63 - 1 (9e18) items.

+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      StringIndex

      +
      public StringIndex(Index.SpaceType spaceType, + int numDimensions)
      +
      Instantiate a new empty index with the specified space type and dimensionality
      +
      +
      Parameters:
      +
      spaceType - Type of space and distance calculation used when determining distance between + embeddings in the index, @see com.spotify.voyager.jni.Index.SpaceType
      +
      numDimensions - Number of dimensions of each embedding stored in the underlying HNSW index
      +
      +
      +
    • +
    • +
      +

      StringIndex

      +
      public StringIndex(Index.SpaceType spaceType, + int numDimensions, + long indexM, + long efConstruction, + long randomSeed, + long maxElements, + Index.StorageDataType storageDataType)
      +
      Instantiate an empty index with the specified index parameters
      +
      +
      Parameters:
      +
      spaceType - Type of space and distance calculation used when determining distance between + embeddings in the index, @see com.spotify.voyager.jni.Index.SpaceType
      +
      numDimensions - Number of dimensions of each embedding stored in the underlying HNSW index
      +
      indexM - Number of connections made between nodes when inserting an element into the + index. Increasing this value can improve recall at the expense of higher memory usage
      +
      efConstruction - Search depth when inserting elements into the index. Increasing this + value can improve recall (up to a point) at the cost of increased indexing time
      +
      randomSeed - Random seed used during indexing
      +
      maxElements - Initial size of the underlying HNSW index
      +
      storageDataType - Type to store the embedding values as, @see + com.spotify.voyager.jni.StorageDataType
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      load

      +
      public static StringIndex load(String indexFilename, + String nameListFilename, + Index.SpaceType spaceType, + int numDimensions, + Index.StorageDataType storageDataType)
      +
      Load a previously constructed index from the provided file location. It is important that the + dimensions, space type, and storage data type provided are the same that the index was + constructed with.
      +
      +
      Parameters:
      +
      indexFilename - Filename of the underlying HNSW index
      +
      nameListFilename - Filename of the JSON encoded names list
      +
      spaceType - @see com.spotify.voyager.jni.Index.SpaceType
      +
      numDimensions - Number of dimensions of each embedding stored in the underlying HNSW index
      +
      storageDataType - @see com.spotify.voyager.jni.Index.StorageDataType
      +
      Returns:
      +
      reference to the loaded StringIndex
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static StringIndex load(InputStream indexInputStream, + InputStream nameListInputStream, + Index.SpaceType spaceType, + int numDimensions, + Index.StorageDataType storageDataType)
      +
      Load a previously constructed index from the provided input streams. It is important that the + dimensions, space type, and storage data type provided are the same that the index was + constructed with.
      +
      +
      Parameters:
      +
      indexInputStream - input stream pointing to the underlying HNSW index
      +
      nameListInputStream - input stream pointing to the JSON encoded names list
      +
      spaceType - @see com.spotify.voyager.jni.Index.SpaceType
      +
      numDimensions - Number of dimensions of each embedding stored in the underlying HNSW index
      +
      storageDataType - @see com.spotify.voyager.jni.Index.StorageDataType
      +
      Returns:
      +
      reference to the loaded StringIndex
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static StringIndex load(String indexFilename, + String nameListFilename)
      +
      Load a previously constructed index from the provided file location. The space type, + dimensions, and storage data type are read from the file metadata.
      +
      +
      Parameters:
      +
      indexFilename - Filename of the underlying HNSW index
      +
      nameListFilename - Filename of the JSON encoded names list
      +
      Returns:
      +
      reference to the loaded StringIndex
      +
      +
      +
    • +
    • +
      +

      load

      +
      public static StringIndex load(InputStream indexInputStream, + InputStream nameListInputStream)
      +
      Load a previously constructed index from the provided input stream. The space type, dimensions, + and storage data type are read from the file metadata.
      +
      +
      Parameters:
      +
      indexInputStream - input stream pointing to the underlying HNSW index
      +
      nameListInputStream - input stream pointing to the JSON encoded names list
      +
      Returns:
      +
      reference to the loaded StringIndex
      +
      +
      +
    • +
    • +
      +

      saveIndex

      +
      public void saveIndex(String outputDirectory) + throws IOException
      +
      Save the underlying index and JSON encoded name list to the provided output directory
      +
      +
      Parameters:
      +
      outputDirectory - directory to output files to
      +
      Throws:
      +
      IOException - when there is an error writing to JSON or saving to disk
      +
      +
      +
    • +
    • +
      +

      saveIndex

      +
      public void saveIndex(String outputDirectory, + String indexFilename, + String nameListFilename) + throws IOException
      +
      +
      Throws:
      +
      IOException
      +
      +
      +
    • +
    • +
      +

      saveIndex

      +
      public void saveIndex(OutputStream indexOutputStream, + OutputStream namesListOutputStream) + throws IOException
      +
      Save the underlying HNSW index and JSON encoded names list to the provided output streams
      +
      +
      Parameters:
      +
      indexOutputStream - output stream pointing to the location to save the HNSW index
      +
      namesListOutputStream - output stream pointing to the location to save the JSON names list
      +
      Throws:
      +
      IOException - when there is an error writing to JSON or the output streams
      +
      +
      +
    • +
    • +
      +

      addItem

      +
      public void addItem(String name, + float[] vector)
      +
      +
    • +
    • +
      +

      addItem

      +
      public void addItem(String name, + List<Float> vector)
      +
      +
    • +
    • +
      +

      addItems

      +
      public void addItems(Map<String,List<Float>> vectors)
      +
      +
    • +
    • +
      +

      getNumElements

      +
      public long getNumElements()
      +
      +
    • +
    • +
      +

      getVector

      +
      public float[] getVector(String name)
      +
      +
    • +
    • +
      +

      query

      +
      public StringIndex.QueryResults query(float[] queryVector, + int numNeighbors, + int ef)
      +
      Find the nearest neighbors of the provided embedding.
      +
      +
      Parameters:
      +
      queryVector - The vector to center the search around.
      +
      numNeighbors - The number of neighbors to return. The number of results returned may be + smaller than this value if the index does not contain enough items.
      +
      ef - How many neighbors to explore during search when looking for nearest neighbors. + Increasing this value can improve recall (up to a point) at the cost of increased search + latency. The minimum value of this parameter is the requested number of neighbors, and the + maximum value is the number of items in the index.
      +
      Returns:
      +
      a QueryResults object, containing the names of the neighbors and each neighbor's + distance from the query vector, sorted in ascending order of distance
      +
      +
      +
    • +
    • +
      +

      query

      +
      public StringIndex.QueryResults[] query(float[][] queryVectors, + int numNeighbors, + int numThreads, + int ef)
      +
      Query for multiple target vectors in parallel.
      +
      +
      Parameters:
      +
      queryVectors - Array of query vectors to search around
      +
      numNeighbors - Number of neighbors to get for each target
      +
      numThreads - Number of threads to use for the underlying index search. -1 uses all + available CPU cores
      +
      ef - Search depth in the graph
      +
      Returns:
      +
      Array of QueryResults, one for each target vector
      +
      +
      +
    • +
    • +
      +

      close

      +
      public void close() + throws IOException
      +
      +
      Specified by:
      +
      close in interface AutoCloseable
      +
      Specified by:
      +
      close in interface Closeable
      +
      Throws:
      +
      IOException
      +
      +
      +
    • +
    • +
      +

      resizeIndex

      +
      public void resizeIndex(long newSize)
      +
      Change the maximum number of elements currently storable by this Index. This operation + reallocates the memory used by the index and can be quite slow, so it may be useful to set the + maximum number of elements in advance if that number is known.
      +
      +
      Parameters:
      +
      newSize - The new number of maximum elements to resize this Index to.
      +
      +
      +
    • +
    • +
      +

      getMaxElements

      +
      public long getMaxElements()
      +
      Get the maximum number of elements currently storable by this Index. If more elements + are added than getMaxElements(), the index will be automatically (but slowly) resized.
      +
      +
      Returns:
      +
      The number of elements (vectors) that are currently storable in this Index.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.QueryResults.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.QueryResults.html new file mode 100644 index 00000000..3ba324d7 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.QueryResults.html @@ -0,0 +1,114 @@ + + + + +Uses of Class com.spotify.voyager.jni.Index.QueryResults (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.Index.QueryResults

+
+
Packages that use Index.QueryResults
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.SpaceType.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.SpaceType.html new file mode 100644 index 00000000..ab3a9291 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.SpaceType.html @@ -0,0 +1,186 @@ + + + + +Uses of Enum com.spotify.voyager.jni.Index.SpaceType (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum
com.spotify.voyager.jni.Index.SpaceType

+
+
Packages that use Index.SpaceType
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.StorageDataType.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.StorageDataType.html new file mode 100644 index 00000000..0c5226e2 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.StorageDataType.html @@ -0,0 +1,168 @@ + + + + +Uses of Enum com.spotify.voyager.jni.Index.StorageDataType (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum
com.spotify.voyager.jni.Index.StorageDataType

+
+
Packages that use Index.StorageDataType
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.html new file mode 100644 index 00000000..613f8def --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/Index.html @@ -0,0 +1,116 @@ + + + + +Uses of Class com.spotify.voyager.jni.Index (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.Index

+
+
Packages that use Index
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.QueryResults.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.QueryResults.html new file mode 100644 index 00000000..a19d13d8 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.QueryResults.html @@ -0,0 +1,101 @@ + + + + +Uses of Class com.spotify.voyager.jni.StringIndex.QueryResults (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.StringIndex.QueryResults

+
+
Packages that use StringIndex.QueryResults
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.html b/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.html new file mode 100644 index 00000000..3a9ec11b --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/class-use/StringIndex.html @@ -0,0 +1,116 @@ + + + + +Uses of Class com.spotify.voyager.jni.StringIndex (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.StringIndex

+
+
Packages that use StringIndex
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/exception/RecallException.html b/docs/java/apidocs/com/spotify/voyager/jni/exception/RecallException.html new file mode 100644 index 00000000..88234ce9 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/exception/RecallException.html @@ -0,0 +1,197 @@ + + + + +RecallException (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class RecallException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
com.spotify.voyager.jni.exception.RecallException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class RecallException +extends RuntimeException
+
An exception that indicates an error about the recall performance of the index.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      RecallException

      +
      public RecallException(String message)
      +
      Constructs a new RecallException with the specified detail message.
      +
      +
      Parameters:
      +
      message - the detail message
      +
      +
      +
    • +
    • +
      +

      RecallException

      +
      public RecallException(String message, + Throwable cause)
      +
      Constructs a new RecallException with the specified detail message and cause.
      +
      +
      Parameters:
      +
      message - the detail message
      +
      cause - the cause of the exception
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/exception/class-use/RecallException.html b/docs/java/apidocs/com/spotify/voyager/jni/exception/class-use/RecallException.html new file mode 100644 index 00000000..6cc33952 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/exception/class-use/RecallException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class com.spotify.voyager.jni.exception.RecallException (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.exception.RecallException

+
+No usage of com.spotify.voyager.jni.exception.RecallException
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/exception/package-summary.html b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-summary.html new file mode 100644 index 00000000..a20022cc --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-summary.html @@ -0,0 +1,113 @@ + + + + +com.spotify.voyager.jni.exception (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package com.spotify.voyager.jni.exception

+
+
+
package com.spotify.voyager.jni.exception
+
+
    +
  • + +
  • +
  • +
    +
    Exception Classes
    +
    +
    Class
    +
    Description
    + +
    +
    An exception that indicates an error about the recall performance of the index.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/exception/package-tree.html b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-tree.html new file mode 100644 index 00000000..702854b4 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-tree.html @@ -0,0 +1,88 @@ + + + + +com.spotify.voyager.jni.exception Class Hierarchy (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package com.spotify.voyager.jni.exception

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/exception/package-use.html b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-use.html new file mode 100644 index 00000000..7f1a02a9 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/exception/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package com.spotify.voyager.jni.exception (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
com.spotify.voyager.jni.exception

+
+No usage of com.spotify.voyager.jni.exception
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/package-summary.html b/docs/java/apidocs/com/spotify/voyager/jni/package-summary.html new file mode 100644 index 00000000..6cf2f4f3 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/package-summary.html @@ -0,0 +1,143 @@ + + + + +com.spotify.voyager.jni (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package com.spotify.voyager.jni

+
+
+
package com.spotify.voyager.jni
+
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
    +
  • + +
  • +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    A Voyager index, providing storage of floating-point vectors and the ability to efficiently + search among those vectors.
    +
    + +
    +
    A container for query results, returned by Index.
    +
    + +
    +
    The space, also known as distance metric, to use when searching.
    +
    + +
    +
    The datatype used to use when storing vectors on disk.
    +
    + +
    +
    Wrapper around com.spotify.voyager.jni.Index with a simplified interface which maps the index ID + to a provided String.
    +
    + +
    +
    A wrapper class for nearest neighbor query results.
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/package-tree.html b/docs/java/apidocs/com/spotify/voyager/jni/package-tree.html new file mode 100644 index 00000000..3bd67d01 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/package-tree.html @@ -0,0 +1,94 @@ + + + + +com.spotify.voyager.jni Class Hierarchy (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package com.spotify.voyager.jni

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Enum Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/package-use.html b/docs/java/apidocs/com/spotify/voyager/jni/package-use.html new file mode 100644 index 00000000..651ffda7 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/package-use.html @@ -0,0 +1,110 @@ + + + + +Uses of Package com.spotify.voyager.jni (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
com.spotify.voyager.jni

+
+
Packages that use com.spotify.voyager.jni
+
+
Package
+
Description
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
+
+
    +
  • +
    + +
    +
    Class
    +
    Description
    + +
    +
    A Voyager index, providing storage of floating-point vectors and the ability to efficiently + search among those vectors.
    +
    + +
    +
    A container for query results, returned by Index.
    +
    + +
    +
    The space, also known as distance metric, to use when searching.
    +
    + +
    +
    The datatype used to use when storing vectors on disk.
    +
    + +
    +
    Wrapper around com.spotify.voyager.jni.Index with a simplified interface which maps the index ID + to a provided String.
    +
    + +
    +
    A wrapper class for nearest neighbor query results.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/JniLibExtractor.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/JniLibExtractor.html new file mode 100644 index 00000000..cc98a98b --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/JniLibExtractor.html @@ -0,0 +1,177 @@ + + + + +JniLibExtractor (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class JniLibExtractor

+
+
java.lang.Object +
com.spotify.voyager.jni.utils.JniLibExtractor
+
+
+
+
public class JniLibExtractor +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      JniLibExtractor

      +
      public JniLibExtractor()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      extractBinaries

      +
      public static String extractBinaries(String libname)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/TinyJson.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/TinyJson.html new file mode 100644 index 00000000..19497ec7 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/TinyJson.html @@ -0,0 +1,195 @@ + + + + +TinyJson (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class TinyJson

+
+
java.lang.Object +
com.spotify.voyager.jni.utils.TinyJson
+
+
+
+
public class TinyJson +extends Object
+
A dependency-free, super tiny JSON serde class that only supports reading and writing lists of + strings.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TinyJson

      +
      public TinyJson()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/JniLibExtractor.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/JniLibExtractor.html new file mode 100644 index 00000000..c8302ae9 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/JniLibExtractor.html @@ -0,0 +1,62 @@ + + + + +Uses of Class com.spotify.voyager.jni.utils.JniLibExtractor (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.utils.JniLibExtractor

+
+No usage of com.spotify.voyager.jni.utils.JniLibExtractor
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/TinyJson.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/TinyJson.html new file mode 100644 index 00000000..0ac9d2c8 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/class-use/TinyJson.html @@ -0,0 +1,62 @@ + + + + +Uses of Class com.spotify.voyager.jni.utils.TinyJson (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
com.spotify.voyager.jni.utils.TinyJson

+
+No usage of com.spotify.voyager.jni.utils.TinyJson
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/package-summary.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-summary.html new file mode 100644 index 00000000..ea3f09d8 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-summary.html @@ -0,0 +1,116 @@ + + + + +com.spotify.voyager.jni.utils (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package com.spotify.voyager.jni.utils

+
+
+
package com.spotify.voyager.jni.utils
+
+
    +
  • + +
  • +
  • +
    +
    Classes
    +
    +
    Class
    +
    Description
    + +
     
    + +
    +
    A dependency-free, super tiny JSON serde class that only supports reading and writing lists of + strings.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/package-tree.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-tree.html new file mode 100644 index 00000000..45701caf --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-tree.html @@ -0,0 +1,77 @@ + + + + +com.spotify.voyager.jni.utils Class Hierarchy (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package com.spotify.voyager.jni.utils

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/jni/utils/package-use.html b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-use.html new file mode 100644 index 00000000..f1a0fd1d --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/jni/utils/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package com.spotify.voyager.jni.utils (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
com.spotify.voyager.jni.utils

+
+No usage of com.spotify.voyager.jni.utils
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/package-summary.html b/docs/java/apidocs/com/spotify/voyager/package-summary.html new file mode 100644 index 00000000..3baee1b5 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/package-summary.html @@ -0,0 +1,124 @@ + + + + +com.spotify.voyager (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package com.spotify.voyager

+
+
+
package com.spotify.voyager
+
+
Voyager is a Java and Python library that provides approximate nearest-neighbor search of vector + data. For most use cases, Index will be the primary interface to + Voyager's functionality. + +
+   // Import `Index`, the basic class that implements Voyager's functionality:
+   import com.spotify.voyager.jni.Index;
+
+   // Create a new Index that compares 4-dimensional vectors via Euclidean distance:
+   Index index = new Index(Index.SpaceType.Euclidean, 4);
+
+   // Add some data to the index:
+   index.addItem(new float[]{1.0f, 2.0f, 3.0f, 4.0f});
+   index.addItem(new float[]{2.0f, 3.0f, 4.0f, 5.0f});
+
+   // Query the index to return the `k` nearest neighbors of a given vector:
+   Index.QueryResults results = index.query(new float[]{3.0f, 4.0f, 5.0f, 6.0f}, 1);
+
+   // Our query will return the 1th (second) item that was added, as it's the closest:
+   assert(results.getLabels()[0] == 1);
+
+   // Serialize this index to use it again later:
+   index.saveIndex("my_tiny_index.voy");
+ 
+
+
+
    +
  • + +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/package-tree.html b/docs/java/apidocs/com/spotify/voyager/package-tree.html new file mode 100644 index 00000000..912341bf --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/package-tree.html @@ -0,0 +1,66 @@ + + + + +com.spotify.voyager Class Hierarchy (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package com.spotify.voyager

+
+Package Hierarchies: + +
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/com/spotify/voyager/package-use.html b/docs/java/apidocs/com/spotify/voyager/package-use.html new file mode 100644 index 00000000..43d5a4e2 --- /dev/null +++ b/docs/java/apidocs/com/spotify/voyager/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package com.spotify.voyager (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
com.spotify.voyager

+
+No usage of com.spotify.voyager
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/copy.svg b/docs/java/apidocs/copy.svg new file mode 100644 index 00000000..7c46ab15 --- /dev/null +++ b/docs/java/apidocs/copy.svg @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/docs/java/apidocs/element-list b/docs/java/apidocs/element-list new file mode 100644 index 00000000..46ced86b --- /dev/null +++ b/docs/java/apidocs/element-list @@ -0,0 +1,4 @@ +com.spotify.voyager +com.spotify.voyager.jni +com.spotify.voyager.jni.exception +com.spotify.voyager.jni.utils diff --git a/docs/java/apidocs/help-doc.html b/docs/java/apidocs/help-doc.html new file mode 100644 index 00000000..7b417bc3 --- /dev/null +++ b/docs/java/apidocs/help-doc.html @@ -0,0 +1,198 @@ + + + + +API Help (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+

JavaDoc Help

+ +
+
+

Navigation

+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
+
+
+

Kinds of Pages

+The following sections describe the different kinds of pages in this collection. +
+

Overview

+

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enums
  • +
  • Exception Classes
  • +
  • Annotation Types
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Enum Constant Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
+
+
    +
  • Enum Constant Details
  • +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
  • Element Details
  • +
+

Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Other Files

+

Packages and modules may contain pages with additional information related to the declarations nearby.

+
+
+

Use

+

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
  • +
+
+
+

Serialized Form

+

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.

+
+
+

All Packages

+

The All Packages page contains an alphabetic index of all packages contained in the documentation.

+
+
+

All Classes and Interfaces

+

The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/index-all.html b/docs/java/apidocs/index-all.html new file mode 100644 index 00000000..de8a231d --- /dev/null +++ b/docs/java/apidocs/index-all.html @@ -0,0 +1,470 @@ + + + + +Index (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+A C D E F G I J L M Q R S T U V W 
All Classes and Interfaces|All Packages|Serialized Form +

A

+
+
addItem(float[]) - Method in class com.spotify.voyager.jni.Index
+
+
Add an item (a vector) to this Index.
+
+
addItem(float[], long) - Method in class com.spotify.voyager.jni.Index
+
+
Add an item (a vector) to this Index with the provided identifier.
+
+
addItem(String, float[]) - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
addItem(String, List<Float>) - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
addItems(float[][], int) - Method in class com.spotify.voyager.jni.Index
+
+
Add multiple items (vectors) to this Index.
+
+
addItems(float[][], long[], int) - Method in class com.spotify.voyager.jni.Index
+
+
Add multiple items (vectors) to this Index.
+
+
addItems(Map<String, List<Float>>) - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
asBytes() - Method in class com.spotify.voyager.jni.Index
+
+
Returns the contents of this index as an array of bytes.
+
+
+

C

+
+
close() - Method in class com.spotify.voyager.jni.Index
+
+
Close this Index and release any memory held by it.
+
+
close() - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
com.spotify.voyager - package com.spotify.voyager
+
+
Voyager is a Java and Python library that provides approximate nearest-neighbor search of vector + data.
+
+
com.spotify.voyager.jni - package com.spotify.voyager.jni
+
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+
com.spotify.voyager.jni.exception - package com.spotify.voyager.jni.exception
+
 
+
com.spotify.voyager.jni.utils - package com.spotify.voyager.jni.utils
+
 
+
Cosine - Enum constant in enum com.spotify.voyager.jni.Index.SpaceType
+
+
Cosine distance; i.e. normalized dot product.
+
+
+

D

+
+
distances - Variable in class com.spotify.voyager.jni.Index.QueryResults
+
+
A list of distances from each item ID to the query vector for this query.
+
+
+

E

+
+
E4M3 - Enum constant in enum com.spotify.voyager.jni.Index.StorageDataType
+
+
A custom 8-bit floating point data type with range [-448, 448] and variable precision.
+
+
Euclidean - Enum constant in enum com.spotify.voyager.jni.Index.SpaceType
+
+
Euclidean distance, also known as L2 distance.
+
+
extractBinaries(String) - Static method in class com.spotify.voyager.jni.utils.JniLibExtractor
+
 
+
+

F

+
+
finalize() - Method in class com.spotify.voyager.jni.Index
+
 
+
Float32 - Enum constant in enum com.spotify.voyager.jni.Index.StorageDataType
+
+
A 32-bit floating point ("Float") data type.
+
+
Float8 - Enum constant in enum com.spotify.voyager.jni.Index.StorageDataType
+
+
An 8-bit floating point data type that expects all values to be on [-1, 1].
+
+
+

G

+
+
getDistance(int) - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
getDistances() - Method in class com.spotify.voyager.jni.Index.QueryResults
+
+
Retrieve the list of distances between query vectors and item vectors for the results of this + query.
+
+
getDistances() - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
getEf() - Method in class com.spotify.voyager.jni.Index
+
+
Get the default EF ("query search depth") that will be uses when Index.query(float[], int) is called.
+
+
getEfConstruction() - Method in class com.spotify.voyager.jni.Index
+
+
Get the EF Construction value used when adding new elements to this Index.
+
+
getIDs() - Method in class com.spotify.voyager.jni.Index
+
+
Get the list of identifiers currently stored by this index.
+
+
getLabels() - Method in class com.spotify.voyager.jni.Index.QueryResults
+
+
Retrieve the list of item IDs ("labels") returned by this query.
+
+
getM() - Method in class com.spotify.voyager.jni.Index
+
+
Get the M value used when adding new elements to this Index.
+
+
getMaxElements() - Method in class com.spotify.voyager.jni.Index
+
+
Get the maximum number of elements currently storable by this Index.
+
+
getMaxElements() - Method in class com.spotify.voyager.jni.StringIndex
+
+
Get the maximum number of elements currently storable by this Index.
+
+
getName(int) - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
getNames() - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
getNumDimensions() - Method in class com.spotify.voyager.jni.Index
+
+
Get the number of dimensions used in this Index.
+
+
getNumElements() - Method in class com.spotify.voyager.jni.Index
+
+
Get the number of elements currently in this Index.
+
+
getNumElements() - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
getNumResults() - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
getNumThreads() - Method in class com.spotify.voyager.jni.Index
+
+
Get the default number of threads used when adding multiple vectors in bulk oor when querying + for multiple vectors simultaneously.
+
+
getSpace() - Method in class com.spotify.voyager.jni.Index
+
+
Get the Index.SpaceType that this Index uses to store and compare vectors.
+
+
getVector(long) - Method in class com.spotify.voyager.jni.Index
+
+
Get the vector for the provided identifier.
+
+
getVector(String) - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
getVectors(long[]) - Method in class com.spotify.voyager.jni.Index
+
+
Get the vectors for a provided array of identifiers.
+
+
+

I

+
+
Index - Class in com.spotify.voyager.jni
+
+
A Voyager index, providing storage of floating-point vectors and the ability to efficiently + search among those vectors.
+
+
Index(Index.SpaceType, int) - Constructor for class com.spotify.voyager.jni.Index
+
+
Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
+
+
Index(Index.SpaceType, int, long, long, long, long, Index.StorageDataType) - Constructor for class com.spotify.voyager.jni.Index
+
+
Create a new Index that uses the given Index.SpaceType to store and compare + numDimensions-dimensional vectors.
+
+
Index.QueryResults - Class in com.spotify.voyager.jni
+
+
A container for query results, returned by Index.
+
+
Index.SpaceType - Enum in com.spotify.voyager.jni
+
+
The space, also known as distance metric, to use when searching.
+
+
Index.StorageDataType - Enum in com.spotify.voyager.jni
+
+
The datatype used to use when storing vectors on disk.
+
+
InnerProduct - Enum constant in enum com.spotify.voyager.jni.Index.SpaceType
+
+
Inner (dot) product.
+
+
+

J

+
+
JniLibExtractor - Class in com.spotify.voyager.jni.utils
+
 
+
JniLibExtractor() - Constructor for class com.spotify.voyager.jni.utils.JniLibExtractor
+
 
+
+

L

+
+
labels - Variable in class com.spotify.voyager.jni.Index.QueryResults
+
+
A list of item IDs ("labels").
+
+
load(InputStream) - Static method in class com.spotify.voyager.jni.Index
+
+
Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
+
+
load(InputStream, Index.SpaceType, int, Index.StorageDataType) - Static method in class com.spotify.voyager.jni.Index
+
+
Interpret the contents of a java.io.InputStream as the contents of a Voyager index file + and create a new Index initialized with the data provided by that stream.
+
+
load(InputStream, InputStream) - Static method in class com.spotify.voyager.jni.StringIndex
+
+
Load a previously constructed index from the provided input stream.
+
+
load(InputStream, InputStream, Index.SpaceType, int, Index.StorageDataType) - Static method in class com.spotify.voyager.jni.StringIndex
+
+
Load a previously constructed index from the provided input streams.
+
+
load(String) - Static method in class com.spotify.voyager.jni.Index
+
+
Load a Voyager index file and create a new Index initialized with the data in that + file.
+
+
load(String, Index.SpaceType, int, Index.StorageDataType) - Static method in class com.spotify.voyager.jni.Index
+
+
Load a Voyager index file and create a new Index initialized with the data in that + file.
+
+
load(String, String) - Static method in class com.spotify.voyager.jni.StringIndex
+
+
Load a previously constructed index from the provided file location.
+
+
load(String, String, Index.SpaceType, int, Index.StorageDataType) - Static method in class com.spotify.voyager.jni.StringIndex
+
+
Load a previously constructed index from the provided file location.
+
+
+

M

+
+
markDeleted(long) - Method in class com.spotify.voyager.jni.Index
+
+
Mark an element of the index as deleted.
+
+
+

Q

+
+
query(float[][], int, int) - Method in class com.spotify.voyager.jni.Index
+
+
Query this Index for approximate nearest neighbors of multiple query vectors.
+
+
query(float[][], int, int, int) - Method in class com.spotify.voyager.jni.StringIndex
+
+
Query for multiple target vectors in parallel.
+
+
query(float[][], int, int, long) - Method in class com.spotify.voyager.jni.Index
+
+
Query this Index for approximate nearest neighbors of multiple query vectors.
+
+
query(float[], int) - Method in class com.spotify.voyager.jni.Index
+
+
Query this Index for approximate nearest neighbors of a single query vector.
+
+
query(float[], int, int) - Method in class com.spotify.voyager.jni.StringIndex
+
+
Find the nearest neighbors of the provided embedding.
+
+
query(float[], int, long) - Method in class com.spotify.voyager.jni.Index
+
+
Query this Index for approximate nearest neighbors of a single query vector.
+
+
QueryResults(long[], float[]) - Constructor for class com.spotify.voyager.jni.Index.QueryResults
+
+
Instantiates a new QueryResults object, provided two identical-length arrays of labels and + their corresponding distances.
+
+
QueryResults(String[], float[]) - Constructor for class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
+

R

+
+
readStringList(InputStream) - Static method in class com.spotify.voyager.jni.utils.TinyJson
+
 
+
RecallException - Exception Class in com.spotify.voyager.jni.exception
+
+
An exception that indicates an error about the recall performance of the index.
+
+
RecallException(String) - Constructor for exception class com.spotify.voyager.jni.exception.RecallException
+
+
Constructs a new RecallException with the specified detail message.
+
+
RecallException(String, Throwable) - Constructor for exception class com.spotify.voyager.jni.exception.RecallException
+
+
Constructs a new RecallException with the specified detail message and cause.
+
+
resizeIndex(long) - Method in class com.spotify.voyager.jni.Index
+
+
Change the maximum number of elements currently storable by this Index.
+
+
resizeIndex(long) - Method in class com.spotify.voyager.jni.StringIndex
+
+
Change the maximum number of elements currently storable by this Index.
+
+
+

S

+
+
saveIndex(OutputStream) - Method in class com.spotify.voyager.jni.Index
+
+
Save this Index to the provided output stream.
+
+
saveIndex(OutputStream, OutputStream) - Method in class com.spotify.voyager.jni.StringIndex
+
+
Save the underlying HNSW index and JSON encoded names list to the provided output streams
+
+
saveIndex(String) - Method in class com.spotify.voyager.jni.Index
+
+
Save this Index to a file at the provided filename.
+
+
saveIndex(String) - Method in class com.spotify.voyager.jni.StringIndex
+
+
Save the underlying index and JSON encoded name list to the provided output directory
+
+
saveIndex(String, String, String) - Method in class com.spotify.voyager.jni.StringIndex
+
 
+
setEf(long) - Method in class com.spotify.voyager.jni.Index
+
+
Set the default EF ("query search depth") to use when Index.query(float[], int) is called.
+
+
setNumThreads(int) - Method in class com.spotify.voyager.jni.Index
+
+
Set the default number of threads to use when adding multiple vectors in bulk, or when querying + for multiple vectors simultaneously.
+
+
StringIndex - Class in com.spotify.voyager.jni
+
+
Wrapper around com.spotify.voyager.jni.Index with a simplified interface which maps the index ID + to a provided String.
+
+
StringIndex(Index.SpaceType, int) - Constructor for class com.spotify.voyager.jni.StringIndex
+
+
Instantiate a new empty index with the specified space type and dimensionality
+
+
StringIndex(Index.SpaceType, int, long, long, long, long, Index.StorageDataType) - Constructor for class com.spotify.voyager.jni.StringIndex
+
+
Instantiate an empty index with the specified index parameters
+
+
StringIndex.QueryResults - Class in com.spotify.voyager.jni
+
+
A wrapper class for nearest neighbor query results.
+
+
+

T

+
+
TinyJson - Class in com.spotify.voyager.jni.utils
+
+
A dependency-free, super tiny JSON serde class that only supports reading and writing lists of + strings.
+
+
TinyJson() - Constructor for class com.spotify.voyager.jni.utils.TinyJson
+
 
+
toString() - Method in class com.spotify.voyager.jni.Index.QueryResults
+
 
+
toString() - Method in class com.spotify.voyager.jni.StringIndex.QueryResults
+
 
+
+

U

+
+
unmarkDeleted(long) - Method in class com.spotify.voyager.jni.Index
+
+
Un-mark an element of the index as deleted, making it available again.
+
+
+

V

+
+
valueOf(String) - Static method in enum com.spotify.voyager.jni.Index.SpaceType
+
+
Returns the enum constant of this type with the specified name.
+
+
valueOf(String) - Static method in enum com.spotify.voyager.jni.Index.StorageDataType
+
+
Returns the enum constant of this type with the specified name.
+
+
values() - Static method in enum com.spotify.voyager.jni.Index.SpaceType
+
+
Returns an array containing the constants of this enum type, in +the order they are declared.
+
+
values() - Static method in enum com.spotify.voyager.jni.Index.StorageDataType
+
+
Returns an array containing the constants of this enum type, in +the order they are declared.
+
+
+

W

+
+
writeStringList(Iterable<String>, OutputStream) - Static method in class com.spotify.voyager.jni.utils.TinyJson
+
 
+
+A C D E F G I J L M Q R S T U V W 
All Classes and Interfaces|All Packages|Serialized Form
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/index.html b/docs/java/apidocs/index.html new file mode 100644 index 00000000..31481600 --- /dev/null +++ b/docs/java/apidocs/index.html @@ -0,0 +1,82 @@ + + + + +Overview (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

voyager 2.0.9 API

+
+
+
Packages
+
+
Package
+
Description
+ +
+
Voyager is a Java and Python library that provides approximate nearest-neighbor search of vector + data.
+
+ +
+
Java Native Interface (JNI) bindings to expose functionality from Voyager's C++ code into Java.
+
+ +
 
+ +
 
+
+
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/legal/ADDITIONAL_LICENSE_INFO b/docs/java/apidocs/legal/ADDITIONAL_LICENSE_INFO new file mode 100644 index 00000000..ff700cd0 --- /dev/null +++ b/docs/java/apidocs/legal/ADDITIONAL_LICENSE_INFO @@ -0,0 +1,37 @@ + ADDITIONAL INFORMATION ABOUT LICENSING + +Certain files distributed by Oracle America, Inc. and/or its affiliates are +subject to the following clarification and special exception to the GPLv2, +based on the GNU Project exception for its Classpath libraries, known as the +GNU Classpath Exception. + +Note that Oracle includes multiple, independent programs in this software +package. Some of those programs are provided under licenses deemed +incompatible with the GPLv2 by the Free Software Foundation and others. +For example, the package includes programs licensed under the Apache +License, Version 2.0 and may include FreeType. Such programs are licensed +to you under their original licenses. + +Oracle facilitates your further distribution of this package by adding the +Classpath Exception to the necessary parts of its GPLv2 code, which permits +you to use that code in combination with other independent modules not +licensed under the GPLv2. However, note that this would not permit you to +commingle code under an incompatible license with Oracle's GPLv2 licensed +code by, for example, cutting and pasting such code into a file also +containing Oracle's GPLv2 licensed code and then distributing the result. + +Additionally, if you were to remove the Classpath Exception from any of the +files to which it applies and distribute the result, you would likely be +required to license some or all of the other code in that distribution under +the GPLv2 as well, and since the GPLv2 is incompatible with the license terms +of some items included in the distribution by Oracle, removing the Classpath +Exception could therefore effectively compromise your ability to further +distribute the package. + +Failing to distribute notices associated with some files may also create +unexpected legal consequences. + +Proceed with caution and we recommend that you obtain the advice of a lawyer +skilled in open source matters before removing the Classpath Exception or +making modifications to this package which may subsequently be redistributed +and/or involve the use of third party software. diff --git a/docs/java/apidocs/legal/ASSEMBLY_EXCEPTION b/docs/java/apidocs/legal/ASSEMBLY_EXCEPTION new file mode 100644 index 00000000..42966666 --- /dev/null +++ b/docs/java/apidocs/legal/ASSEMBLY_EXCEPTION @@ -0,0 +1,27 @@ + +OPENJDK ASSEMBLY EXCEPTION + +The OpenJDK source code made available by Oracle America, Inc. (Oracle) at +openjdk.org ("OpenJDK Code") is distributed under the terms of the GNU +General Public License version 2 +only ("GPL2"), with the following clarification and special exception. + + Linking this OpenJDK Code statically or dynamically with other code + is making a combined work based on this library. Thus, the terms + and conditions of GPL2 cover the whole combination. + + As a special exception, Oracle gives you permission to link this + OpenJDK Code with certain code licensed by Oracle as indicated at + https://openjdk.org/legal/exception-modules-2007-05-08.html + ("Designated Exception Modules") to produce an executable, + regardless of the license terms of the Designated Exception Modules, + and to copy and distribute the resulting executable under GPL2, + provided that the Designated Exception Modules continue to be + governed by the licenses under which they were offered by Oracle. + +As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code +to build an executable that includes those portions of necessary code that +Oracle could not provide under GPL2 (or that Oracle has provided under GPL2 +with the Classpath exception). If you modify or add to the OpenJDK code, +that new GPL2 code may still be combined with Designated Exception Modules +if the new code is made subject to this exception by its copyright holder. diff --git a/docs/java/apidocs/legal/LICENSE b/docs/java/apidocs/legal/LICENSE new file mode 100644 index 00000000..8b400c7a --- /dev/null +++ b/docs/java/apidocs/legal/LICENSE @@ -0,0 +1,347 @@ +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. diff --git a/docs/java/apidocs/legal/jquery.md b/docs/java/apidocs/legal/jquery.md new file mode 100644 index 00000000..d468b318 --- /dev/null +++ b/docs/java/apidocs/legal/jquery.md @@ -0,0 +1,72 @@ +## jQuery v3.6.1 + +### jQuery License +``` +jQuery v 3.6.1 +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************** + +The jQuery JavaScript Library v3.6.1 also includes Sizzle.js + +Sizzle.js includes the following license: + +Copyright JS Foundation and other contributors, https://js.foundation/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/sizzle + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +********************* + +``` diff --git a/docs/java/apidocs/legal/jqueryUI.md b/docs/java/apidocs/legal/jqueryUI.md new file mode 100644 index 00000000..8bda9d7a --- /dev/null +++ b/docs/java/apidocs/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.13.2 + +### jQuery UI License +``` +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/docs/java/apidocs/link.svg b/docs/java/apidocs/link.svg new file mode 100644 index 00000000..7ccc5ed0 --- /dev/null +++ b/docs/java/apidocs/link.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/docs/java/apidocs/member-search-index.js b/docs/java/apidocs/member-search-index.js new file mode 100644 index 00000000..507052b5 --- /dev/null +++ b/docs/java/apidocs/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"com.spotify.voyager.jni","c":"Index","l":"addItem(float[])"},{"p":"com.spotify.voyager.jni","c":"Index","l":"addItem(float[], long)","u":"addItem(float[],long)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"addItem(String, float[])","u":"addItem(java.lang.String,float[])"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"addItem(String, List)","u":"addItem(java.lang.String,java.util.List)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"addItems(float[][], int)","u":"addItems(float[][],int)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"addItems(float[][], long[], int)","u":"addItems(float[][],long[],int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"addItems(Map>)","u":"addItems(java.util.Map)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"asBytes()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"close()"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"close()"},{"p":"com.spotify.voyager.jni","c":"Index.SpaceType","l":"Cosine"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"distances"},{"p":"com.spotify.voyager.jni","c":"Index.StorageDataType","l":"E4M3"},{"p":"com.spotify.voyager.jni","c":"Index.SpaceType","l":"Euclidean"},{"p":"com.spotify.voyager.jni.utils","c":"JniLibExtractor","l":"extractBinaries(String)","u":"extractBinaries(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"finalize()"},{"p":"com.spotify.voyager.jni","c":"Index.StorageDataType","l":"Float32"},{"p":"com.spotify.voyager.jni","c":"Index.StorageDataType","l":"Float8"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"getDistance(int)"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"getDistances()"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"getDistances()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getEf()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getEfConstruction()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getIDs()"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"getLabels()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getM()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getMaxElements()"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"getMaxElements()"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"getName(int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"getNames()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getNumDimensions()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getNumElements()"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"getNumElements()"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"getNumResults()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getNumThreads()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getSpace()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getVector(long)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"getVector(String)","u":"getVector(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"getVectors(long[])"},{"p":"com.spotify.voyager.jni","c":"Index","l":"Index(Index.SpaceType, int)","u":"%3Cinit%3E(com.spotify.voyager.jni.Index.SpaceType,int)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"Index(Index.SpaceType, int, long, long, long, long, Index.StorageDataType)","u":"%3Cinit%3E(com.spotify.voyager.jni.Index.SpaceType,int,long,long,long,long,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni","c":"Index.SpaceType","l":"InnerProduct"},{"p":"com.spotify.voyager.jni.utils","c":"JniLibExtractor","l":"JniLibExtractor()","u":"%3Cinit%3E()"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"labels"},{"p":"com.spotify.voyager.jni","c":"Index","l":"load(InputStream)","u":"load(java.io.InputStream)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"load(InputStream, Index.SpaceType, int, Index.StorageDataType)","u":"load(java.io.InputStream,com.spotify.voyager.jni.Index.SpaceType,int,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"load(InputStream, InputStream)","u":"load(java.io.InputStream,java.io.InputStream)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"load(InputStream, InputStream, Index.SpaceType, int, Index.StorageDataType)","u":"load(java.io.InputStream,java.io.InputStream,com.spotify.voyager.jni.Index.SpaceType,int,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"load(String)","u":"load(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"load(String, Index.SpaceType, int, Index.StorageDataType)","u":"load(java.lang.String,com.spotify.voyager.jni.Index.SpaceType,int,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"load(String, String)","u":"load(java.lang.String,java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"load(String, String, Index.SpaceType, int, Index.StorageDataType)","u":"load(java.lang.String,java.lang.String,com.spotify.voyager.jni.Index.SpaceType,int,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"markDeleted(long)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"query(float[], int)","u":"query(float[],int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"query(float[], int, int)","u":"query(float[],int,int)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"query(float[], int, long)","u":"query(float[],int,long)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"query(float[][], int, int)","u":"query(float[][],int,int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"query(float[][], int, int, int)","u":"query(float[][],int,int,int)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"query(float[][], int, int, long)","u":"query(float[][],int,int,long)"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"QueryResults(long[], float[])","u":"%3Cinit%3E(long[],float[])"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"QueryResults(String[], float[])","u":"%3Cinit%3E(java.lang.String[],float[])"},{"p":"com.spotify.voyager.jni.utils","c":"TinyJson","l":"readStringList(InputStream)","u":"readStringList(java.io.InputStream)"},{"p":"com.spotify.voyager.jni.exception","c":"RecallException","l":"RecallException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.spotify.voyager.jni.exception","c":"RecallException","l":"RecallException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"resizeIndex(long)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"resizeIndex(long)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"saveIndex(OutputStream)","u":"saveIndex(java.io.OutputStream)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"saveIndex(OutputStream, OutputStream)","u":"saveIndex(java.io.OutputStream,java.io.OutputStream)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"saveIndex(String)","u":"saveIndex(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"saveIndex(String)","u":"saveIndex(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"saveIndex(String, String, String)","u":"saveIndex(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"setEf(long)"},{"p":"com.spotify.voyager.jni","c":"Index","l":"setNumThreads(int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"StringIndex(Index.SpaceType, int)","u":"%3Cinit%3E(com.spotify.voyager.jni.Index.SpaceType,int)"},{"p":"com.spotify.voyager.jni","c":"StringIndex","l":"StringIndex(Index.SpaceType, int, long, long, long, long, Index.StorageDataType)","u":"%3Cinit%3E(com.spotify.voyager.jni.Index.SpaceType,int,long,long,long,long,com.spotify.voyager.jni.Index.StorageDataType)"},{"p":"com.spotify.voyager.jni.utils","c":"TinyJson","l":"TinyJson()","u":"%3Cinit%3E()"},{"p":"com.spotify.voyager.jni","c":"Index.QueryResults","l":"toString()"},{"p":"com.spotify.voyager.jni","c":"StringIndex.QueryResults","l":"toString()"},{"p":"com.spotify.voyager.jni","c":"Index","l":"unmarkDeleted(long)"},{"p":"com.spotify.voyager.jni","c":"Index.SpaceType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index.StorageDataType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.spotify.voyager.jni","c":"Index.SpaceType","l":"values()"},{"p":"com.spotify.voyager.jni","c":"Index.StorageDataType","l":"values()"},{"p":"com.spotify.voyager.jni.utils","c":"TinyJson","l":"writeStringList(Iterable, OutputStream)","u":"writeStringList(java.lang.Iterable,java.io.OutputStream)"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/java/apidocs/module-search-index.js b/docs/java/apidocs/module-search-index.js new file mode 100644 index 00000000..0d59754f --- /dev/null +++ b/docs/java/apidocs/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/docs/java/apidocs/overview-summary.html b/docs/java/apidocs/overview-summary.html new file mode 100644 index 00000000..f356116c --- /dev/null +++ b/docs/java/apidocs/overview-summary.html @@ -0,0 +1,26 @@ + + + + +voyager 2.0.9 API + + + + + + + + + + + +
+ +

index.html

+
+ + diff --git a/docs/java/apidocs/overview-tree.html b/docs/java/apidocs/overview-tree.html new file mode 100644 index 00000000..26f9bd61 --- /dev/null +++ b/docs/java/apidocs/overview-tree.html @@ -0,0 +1,112 @@ + + + + +Class Hierarchy (voyager 2.0.9 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Enum Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/java/apidocs/package-search-index.js b/docs/java/apidocs/package-search-index.js new file mode 100644 index 00000000..87e7f704 --- /dev/null +++ b/docs/java/apidocs/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"com.spotify.voyager"},{"l":"com.spotify.voyager.jni"},{"l":"com.spotify.voyager.jni.exception"},{"l":"com.spotify.voyager.jni.utils"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/java/apidocs/resources/glass.png b/docs/java/apidocs/resources/glass.png new file mode 100644 index 00000000..a7f591f4 Binary files /dev/null and b/docs/java/apidocs/resources/glass.png differ diff --git a/docs/java/apidocs/resources/x.png b/docs/java/apidocs/resources/x.png new file mode 100644 index 00000000..30548a75 Binary files /dev/null and b/docs/java/apidocs/resources/x.png differ diff --git a/docs/java/apidocs/script-dir/jquery-3.6.1.min.js b/docs/java/apidocs/script-dir/jquery-3.6.1.min.js new file mode 100644 index 00000000..2c69bc90 --- /dev/null +++ b/docs/java/apidocs/script-dir/jquery-3.6.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(E(s),E(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})},x.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,l=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(x.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],x.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("
    ").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){x(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(x("
    ").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==x.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=x("
    ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||x.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?x(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(x.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=x.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(x("
    ").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}});x.ui.autocomplete}); \ No newline at end of file diff --git a/docs/java/apidocs/script.js b/docs/java/apidocs/script.js new file mode 100644 index 00000000..8b9691a1 --- /dev/null +++ b/docs/java/apidocs/script.js @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; + +var oddRowColor = "odd-row-color"; +var evenRowColor = "even-row-color"; +var sortAsc = "sort-asc"; +var sortDesc = "sort-desc"; +var tableTab = "table-tab"; +var activeTableTab = "active-table-tab"; + +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +// Helper for making content containing release names comparable lexicographically +function makeComparable(s) { + return s.toLowerCase().replace(/(\d+)/g, + function(n, m) { + return ("000" + m).slice(-4); + }); +} + +// Switches between two styles depending on a condition +function toggleStyle(classList, condition, trueStyle, falseStyle) { + if (condition) { + classList.remove(falseStyle); + classList.add(trueStyle); + } else { + classList.remove(trueStyle); + classList.add(falseStyle); + } +} + +// Sorts the rows in a table lexicographically by the content of a specific column +function sortTable(header, columnIndex, columns) { + var container = header.parentElement; + var descending = header.classList.contains(sortAsc); + container.querySelectorAll("div.table-header").forEach( + function(header) { + header.classList.remove(sortAsc); + header.classList.remove(sortDesc); + } + ) + var cells = container.children; + var rows = []; + for (var i = columns; i < cells.length; i += columns) { + rows.push(Array.prototype.slice.call(cells, i, i + columns)); + } + var comparator = function(a, b) { + var ka = makeComparable(a[columnIndex].textContent); + var kb = makeComparable(b[columnIndex].textContent); + if (ka < kb) + return descending ? 1 : -1; + if (ka > kb) + return descending ? -1 : 1; + return 0; + }; + var sorted = rows.sort(comparator); + var visible = 0; + sorted.forEach(function(row) { + if (row[0].style.display !== 'none') { + var isEvenRow = visible++ % 2 === 0; + } + row.forEach(function(cell) { + toggleStyle(cell.classList, isEvenRow, evenRowColor, oddRowColor); + container.appendChild(cell); + }) + }); + toggleStyle(header.classList, descending, sortDesc, sortAsc); +} + +// Toggles the visibility of a table category in all tables in a page +function toggleGlobal(checkbox, selected, columns) { + var display = checkbox.checked ? '' : 'none'; + document.querySelectorAll("div.table-tabs").forEach(function(t) { + var id = t.parentElement.getAttribute("id"); + var selectedClass = id + "-tab" + selected; + // if selected is empty string it selects all uncategorized entries + var selectUncategorized = !Boolean(selected); + var visible = 0; + document.querySelectorAll('div.' + id) + .forEach(function(elem) { + if (selectUncategorized) { + if (elem.className.indexOf(selectedClass) === -1) { + elem.style.display = display; + } + } else if (elem.classList.contains(selectedClass)) { + elem.style.display = display; + } + if (elem.style.display === '') { + var isEvenRow = visible++ % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + } + }); + var displaySection = visible === 0 ? 'none' : ''; + t.parentElement.style.display = displaySection; + document.querySelector("li#contents-" + id).style.display = displaySection; + }) +} + +// Shows the elements of a table belonging to a specific category +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.querySelector('div#' + tableId +' .summary-table') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} +// Copy the contents of the local snippet to the clipboard +function copySnippet(button) { + copyToClipboard(button.nextElementSibling.innerText); + switchCopyLabel(button, button.firstElementChild); +} +function copyToClipboard(content) { + var textarea = document.createElement("textarea"); + textarea.style.height = 0; + document.body.appendChild(textarea); + textarea.value = content; + textarea.select(); + document.execCommand("copy"); + document.body.removeChild(textarea); +} +function switchCopyLabel(button, span) { + var copied = span.getAttribute("data-copied"); + button.classList.add("visible"); + var initialLabel = span.innerHTML; + span.innerHTML = copied; + setTimeout(function() { + button.classList.remove("visible"); + setTimeout(function() { + if (initialLabel !== copied) { + span.innerHTML = initialLabel; + } + }, 100); + }, 1900); +} +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + var timeoutId; + contentDiv.addEventListener("scroll", function(e) { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + }, 100); + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/docs/java/apidocs/search-page.js b/docs/java/apidocs/search-page.js new file mode 100644 index 00000000..540c90f5 --- /dev/null +++ b/docs/java/apidocs/search-page.js @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +"use strict"; +$(function() { + var copy = $("#page-search-copy"); + var expand = $("#page-search-expand"); + var searchLink = $("span#page-search-link"); + var redirect = $("input#search-redirect"); + function setSearchUrlTemplate() { + var href = document.location.href.split(/[#?]/)[0]; + href += "?q=" + "%s"; + if (redirect.is(":checked")) { + href += "&r=1"; + } + searchLink.html(href); + copy[0].onmouseenter(); + } + function copyLink(e) { + copyToClipboard(this.previousSibling.innerText); + switchCopyLabel(this, this.lastElementChild); + } + copy.click(copyLink); + copy[0].onmouseenter = function() {}; + redirect.click(setSearchUrlTemplate); + setSearchUrlTemplate(); + copy.prop("disabled", false); + redirect.prop("disabled", false); + expand.click(function (e) { + var searchInfo = $("div.page-search-info"); + if(this.parentElement.hasAttribute("open")) { + searchInfo.attr("style", "border-width: 0;"); + } else { + searchInfo.attr("style", "border-width: 1px;").height(searchInfo.prop("scrollHeight")); + } + }); +}); +$(window).on("load", function() { + var input = $("#page-search-input"); + var reset = $("#page-search-reset"); + var notify = $("#page-search-notify"); + var resultSection = $("div#result-section"); + var resultContainer = $("div#result-container"); + var searchTerm = ""; + var activeTab = ""; + var fixedTab = false; + var visibleTabs = []; + var feelingLucky = false; + function renderResults(result) { + if (!result.length) { + notify.html(messages.noResult); + } else if (result.length === 1) { + notify.html(messages.oneResult); + } else { + notify.html(messages.manyResults.replace("{0}", result.length)); + } + resultContainer.empty(); + var r = { + "types": [], + "members": [], + "packages": [], + "modules": [], + "searchTags": [] + }; + for (var i in result) { + var item = result[i]; + var arr = r[item.category]; + arr.push(item); + } + if (!activeTab || r[activeTab].length === 0 || !fixedTab) { + Object.keys(r).reduce(function(prev, curr) { + if (r[curr].length > 0 && r[curr][0].score > prev) { + activeTab = curr; + return r[curr][0].score; + } + return prev; + }, 0); + } + if (feelingLucky && activeTab) { + notify.html(messages.redirecting) + var firstItem = r[activeTab][0]; + window.location = getURL(firstItem.indexItem, firstItem.category); + return; + } + if (result.length > 20) { + if (searchTerm[searchTerm.length - 1] === ".") { + if (activeTab === "types" && r["members"].length > r["types"].length) { + activeTab = "members"; + } else if (activeTab === "packages" && r["types"].length > r["packages"].length) { + activeTab = "types"; + } + } + } + var categoryCount = Object.keys(r).reduce(function(prev, curr) { + return prev + (r[curr].length > 0 ? 1 : 0); + }, 0); + visibleTabs = []; + var tabContainer = $("
    ").appendTo(resultContainer); + for (var key in r) { + var id = "#result-tab-" + key.replace("searchTags", "search_tags"); + if (r[key].length) { + var count = r[key].length >= 1000 ? "999+" : r[key].length; + if (result.length > 20 && categoryCount > 1) { + var button = $("").appendTo(tabContainer); + button.click(key, function(e) { + fixedTab = true; + renderResult(e.data, $(this)); + }); + visibleTabs.push(key); + } else { + $("" + categories[key] + + " (" + count + ")").appendTo(tabContainer); + renderTable(key, r[key]).appendTo(resultContainer); + tabContainer = $("
    ").appendTo(resultContainer); + + } + } + } + if (activeTab && result.length > 20 && categoryCount > 1) { + $("button#result-tab-" + activeTab).addClass("active-table-tab"); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + } + resultSection.show(); + function renderResult(category, button) { + activeTab = category; + setSearchUrl(); + resultContainer.find("div.summary-table").remove(); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + button.siblings().removeClass("active-table-tab"); + button.addClass("active-table-tab"); + } + } + function selectTab(category) { + $("button#result-tab-" + category).click(); + } + function renderTable(category, items) { + var table = $("
    ") + .addClass(category === "modules" + ? "one-column-search-results" + : "two-column-search-results"); + var col1, col2; + if (category === "modules") { + col1 = "Module"; + } else if (category === "packages") { + col1 = "Module"; + col2 = "Package"; + } else if (category === "types") { + col1 = "Package"; + col2 = "Class" + } else if (category === "members") { + col1 = "Class"; + col2 = "Member"; + } else if (category === "searchTags") { + col1 = "Location"; + col2 = "Name"; + } + $("
    " + col1 + "
    ").appendTo(table); + if (category !== "modules") { + $("
    " + col2 + "
    ").appendTo(table); + } + $.each(items, function(index, item) { + var rowColor = index % 2 ? "odd-row-color" : "even-row-color"; + renderItem(item, table, rowColor); + }); + return table; + } + function renderItem(item, table, rowColor) { + var label = getHighlightedText(item.input, item.boundaries, item.prefix.length, item.input.length); + var link = $("") + .attr("href", getURL(item.indexItem, item.category)) + .attr("tabindex", "0") + .addClass("search-result-link") + .html(label); + var container = getHighlightedText(item.input, item.boundaries, 0, item.prefix.length - 1); + if (item.category === "searchTags") { + container = item.indexItem.h || ""; + } + if (item.category !== "modules") { + $("
    ").html(container).addClass("col-plain").addClass(rowColor).appendTo(table); + } + $("
    ").html(link).addClass("col-last").addClass(rowColor).appendTo(table); + } + var timeout; + function schedulePageSearch() { + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(function () { + doPageSearch() + }, 100); + } + function doPageSearch() { + setSearchUrl(); + var term = searchTerm = input.val().trim(); + if (term === "") { + notify.html(messages.enterTerm); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + resultSection.hide(); + } else { + notify.html(messages.searching); + doSearch({ term: term, maxResults: 1200 }, renderResults); + } + } + function setSearchUrl() { + var query = input.val().trim(); + var url = document.location.pathname; + if (query) { + url += "?q=" + encodeURI(query); + if (activeTab && fixedTab) { + url += "&c=" + activeTab; + } + } + history.replaceState({query: query}, "", url); + } + input.on("input", function(e) { + feelingLucky = false; + schedulePageSearch(); + }); + $(document).keydown(function(e) { + if ((e.ctrlKey || e.metaKey) && (e.key === "ArrowLeft" || e.key === "ArrowRight")) { + if (activeTab && visibleTabs.length > 1) { + var idx = visibleTabs.indexOf(activeTab); + idx += e.key === "ArrowLeft" ? visibleTabs.length - 1 : 1; + selectTab(visibleTabs[idx % visibleTabs.length]); + return false; + } + } + }); + reset.click(function() { + notify.html(messages.enterTerm); + resultSection.hide(); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + input.val('').focus(); + setSearchUrl(); + }); + input.prop("disabled", false); + reset.prop("disabled", false); + + var urlParams = new URLSearchParams(window.location.search); + if (urlParams.has("q")) { + input.val(urlParams.get("q")) + } + if (urlParams.has("c")) { + activeTab = urlParams.get("c"); + fixedTab = true; + } + if (urlParams.get("r")) { + feelingLucky = true; + } + if (input.val()) { + doPageSearch(); + } else { + notify.html(messages.enterTerm); + } + input.select().focus(); +}); diff --git a/docs/java/apidocs/search.html b/docs/java/apidocs/search.html new file mode 100644 index 00000000..1089606e --- /dev/null +++ b/docs/java/apidocs/search.html @@ -0,0 +1,77 @@ + + + + +Search (voyager 2.0.9 API) + + + + + + + + + + + + + + +
    + +
    +
    +

    Search

    +
    + + +
    +Additional resources +
    +
    +
    +

    The help page provides an introduction to the scope and syntax of JavaDoc search.

    +

    You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.

    +

    The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.

    +link +

    + +

    +
    +

    Loading search index...

    + +
    +
    +
    + +
    +
    +
    + + diff --git a/docs/java/apidocs/search.js b/docs/java/apidocs/search.js new file mode 100644 index 00000000..7673397e --- /dev/null +++ b/docs/java/apidocs/search.js @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +"use strict"; +const messages = { + enterTerm: "Enter a search term", + noResult: "No results found", + oneResult: "Found one result", + manyResults: "Found {0} results", + loading: "Loading search index...", + searching: "Searching...", + redirecting: "Redirecting to first result...", + linkIcon: "Link icon", + linkToSection: "Link to this section" +} +const categories = { + modules: "Modules", + packages: "Packages", + types: "Types", + members: "Members", + searchTags: "Search Tags" +}; +const highlight = "$&"; +const NO_MATCH = {}; +const MAX_RESULTS = 300; +function checkUnnamed(name, separator) { + return name === "" || !name ? "" : name + separator; +} +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(str, boundaries, from, to) { + var start = from; + var text = ""; + for (var i = 0; i < boundaries.length; i += 2) { + var b0 = boundaries[i]; + var b1 = boundaries[i + 1]; + if (b0 >= to || b1 <= from) { + continue; + } + text += escapeHtml(str.slice(start, Math.max(start, b0))); + text += ""; + text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1))); + text += ""; + start = Math.min(to, b1); + } + text += escapeHtml(str.slice(start, to)); + return text; +} +function getURLPrefix(item, category) { + var urlPrefix = ""; + var slash = "/"; + if (category === "modules") { + return item.l + slash; + } else if (category === "packages" && item.m) { + return item.m + slash; + } else if (category === "types" || category === "members") { + if (item.m) { + urlPrefix = item.m + slash; + } else { + $.each(packageSearchIndex, function(index, it) { + if (it.m && item.p === it.l) { + urlPrefix = it.m + slash; + } + }); + } + } + return urlPrefix; +} +function getURL(item, category) { + if (item.url) { + return item.url; + } + var url = getURLPrefix(item, category); + if (category === "modules") { + url += "module-summary.html"; + } else if (category === "packages") { + if (item.u) { + url = item.u; + } else { + url += item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (category === "types") { + if (item.u) { + url = item.u; + } else { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html"; + } + } else if (category === "members") { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#"; + if (item.u) { + url += item.u; + } else { + url += item.l; + } + } else if (category === "searchTags") { + url += item.u; + } + item.url = url; + return url; +} +function createMatcher(term, camelCase) { + if (camelCase && !isUpperCase(term)) { + return null; // no need for camel-case matcher for lower case query + } + var pattern = ""; + var upperCase = []; + term.trim().split(/\s+/).forEach(function(w, index, array) { + var tokens = w.split(/(?=[A-Z,.()<>?[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + // ',' and '?' are the only delimiters commonly followed by space in java signatures + pattern += "(" + $.ui.autocomplete.escapeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")"; + upperCase.push(false); + var isWordToken = /\w$/.test(s); + if (isWordToken) { + if (i === tokens.length - 1 && index < array.length - 1) { + // space in query string matches all delimiters + pattern += "(.*?)"; + upperCase.push(isUpperCase(s[0])); + } else { + if (!camelCase && isUpperCase(s) && s.length === 1) { + pattern += "()"; + } else { + pattern += "([a-z0-9$<>?[\\]]*?)"; + } + upperCase.push(isUpperCase(s[0])); + } + } else { + pattern += "()"; + upperCase.push(false); + } + } + }); + var re = new RegExp(pattern, "gi"); + re.upperCase = upperCase; + return re; +} +function findMatch(matcher, input, startOfName, endOfName) { + var from = startOfName; + matcher.lastIndex = from; + var match = matcher.exec(input); + // Expand search area until we get a valid result or reach the beginning of the string + while (!match || match.index + match[0].length < startOfName || endOfName < match.index) { + if (from === 0) { + return NO_MATCH; + } + from = input.lastIndexOf(".", from - 2) + 1; + matcher.lastIndex = from; + match = matcher.exec(input); + } + var boundaries = []; + var matchEnd = match.index + match[0].length; + var score = 5; + var start = match.index; + var prevEnd = -1; + for (var i = 1; i < match.length; i += 2) { + var isUpper = isUpperCase(input[start]); + var isMatcherUpper = matcher.upperCase[i]; + // capturing groups come in pairs, match and non-match + boundaries.push(start, start + match[i].length); + // make sure groups are anchored on a left word boundary + var prevChar = input[start - 1] || ""; + var nextChar = input[start + 1] || ""; + if (start !== 0 && !/[\W_]/.test(prevChar) && !/[\W_]/.test(input[start])) { + if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) { + score -= 0.1; + } else if (isMatcherUpper && start === prevEnd) { + score -= isUpper ? 0.1 : 1.0; + } else { + return NO_MATCH; + } + } + prevEnd = start + match[i].length; + start += match[i].length + match[i + 1].length; + + // lower score for parts of the name that are missing + if (match[i + 1] && prevEnd < endOfName) { + score -= rateNoise(match[i + 1]); + } + } + // lower score if a type name contains unmatched camel-case parts + if (input[matchEnd - 1] !== "." && endOfName > matchEnd) + score -= rateNoise(input.slice(matchEnd, endOfName)); + score -= rateNoise(input.slice(0, Math.max(startOfName, match.index))); + + if (score <= 0) { + return NO_MATCH; + } + return { + input: input, + score: score, + boundaries: boundaries + }; +} +function isUpperCase(s) { + return s !== s.toLowerCase(); +} +function isLowerCase(s) { + return s !== s.toUpperCase(); +} +function rateNoise(str) { + return (str.match(/([.(])/g) || []).length / 5 + + (str.match(/([A-Z]+)/g) || []).length / 10 + + str.length / 20; +} +function doSearch(request, response) { + var term = request.term.trim(); + var maxResults = request.maxResults || MAX_RESULTS; + if (term.length === 0) { + return this.close(); + } + var matcher = { + plainMatcher: createMatcher(term, false), + camelCaseMatcher: createMatcher(term, true) + } + var indexLoaded = indexFilesLoaded(); + + function getPrefix(item, category) { + switch (category) { + case "packages": + return checkUnnamed(item.m, "/"); + case "types": + return checkUnnamed(item.p, "."); + case "members": + return checkUnnamed(item.p, ".") + item.c + "."; + default: + return ""; + } + } + function useQualifiedName(category) { + switch (category) { + case "packages": + return /[\s/]/.test(term); + case "types": + case "members": + return /[\s.]/.test(term); + default: + return false; + } + } + function searchIndex(indexArray, category) { + var matches = []; + if (!indexArray) { + if (!indexLoaded) { + matches.push({ l: messages.loading, category: category }); + } + return matches; + } + $.each(indexArray, function (i, item) { + var prefix = getPrefix(item, category); + var simpleName = item.l; + var qualifiedName = prefix + simpleName; + var useQualified = useQualifiedName(category); + var input = useQualified ? qualifiedName : simpleName; + var startOfName = useQualified ? prefix.length : 0; + var endOfName = category === "members" && input.indexOf("(", startOfName) > -1 + ? input.indexOf("(", startOfName) : input.length; + var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName); + if (m === NO_MATCH && matcher.camelCaseMatcher) { + m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName); + } + if (m !== NO_MATCH) { + m.indexItem = item; + m.prefix = prefix; + m.category = category; + if (!useQualified) { + m.input = qualifiedName; + m.boundaries = m.boundaries.map(function(b) { + return b + prefix.length; + }); + } + matches.push(m); + } + return true; + }); + return matches.sort(function(e1, e2) { + return e2.score - e1.score; + }).slice(0, maxResults); + } + + var result = searchIndex(moduleSearchIndex, "modules") + .concat(searchIndex(packageSearchIndex, "packages")) + .concat(searchIndex(typeSearchIndex, "types")) + .concat(searchIndex(memberSearchIndex, "members")) + .concat(searchIndex(tagSearchIndex, "searchTags")); + + if (!indexLoaded) { + updateSearchResults = function() { + doSearch(request, response); + } + } else { + updateSearchResults = function() {}; + } + response(result); +} +// JQuery search menu implementation +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> .result-item"); + // workaround for search result scrolling + this.menu._scrollIntoView = function _scrollIntoView( item ) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; + if ( this._hasScroll() ) { + borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0; + paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0; + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; + scroll = this.activeMenu.scrollTop(); + elementHeight = this.activeMenu.height() - 26; + itemHeight = item.outerHeight(); + + if ( offset < 0 ) { + this.activeMenu.scrollTop( scroll + offset ); + } else if ( offset + itemHeight > elementHeight ) { + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); + } + } + }; + }, + _renderMenu: function(ul, items) { + var currentCategory = ""; + var widget = this; + widget.menu.bindings = $(); + $.each(items, function(index, item) { + if (item.category && item.category !== currentCategory) { + ul.append("
  • " + categories[item.category] + "
  • "); + currentCategory = item.category; + } + var li = widget._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", categories[item.category] + " : " + item.l); + } else { + li.attr("aria-label", item.l); + } + li.attr("class", "result-item"); + }); + ul.append(""); + }, + _renderItem: function(ul, item) { + var li = $("
  • ").appendTo(ul); + var div = $("
    ").appendTo(li); + var label = item.l + ? item.l + : getHighlightedText(item.input, item.boundaries, 0, item.input.length); + var idx = item.indexItem; + if (item.category === "searchTags" && idx && idx.h) { + if (idx.d) { + div.html(label + " (" + idx.h + ")
    " + + idx.d + "
    "); + } else { + div.html(label + " (" + idx.h + ")"); + } + } else { + div.html(label); + } + return li; + } +}); +$(function() { + var expanded = false; + var windowWidth; + function collapse() { + if (expanded) { + $("div#navbar-top").removeAttr("style"); + $("button#navbar-toggle-button") + .removeClass("expanded") + .attr("aria-expanded", "false"); + expanded = false; + } + } + $("button#navbar-toggle-button").click(function (e) { + if (expanded) { + collapse(); + } else { + var navbar = $("div#navbar-top"); + navbar.height(navbar.prop("scrollHeight")); + $("button#navbar-toggle-button") + .addClass("expanded") + .attr("aria-expanded", "true"); + expanded = true; + windowWidth = window.innerWidth; + } + }); + $("ul.sub-nav-list-small li a").click(collapse); + $("input#search-input").focus(collapse); + $("main").click(collapse); + $("section[id] > :header, :header[id], :header:has(a[id])").each(function(idx, el) { + // Create anchor links for headers with an associated id attribute + var hdr = $(el); + var id = hdr.attr("id") || hdr.parent("section").attr("id") || hdr.children("a").attr("id"); + if (id) { + hdr.append(" " + messages.linkIcon +""); + } + }); + $(window).on("orientationchange", collapse).on("resize", function(e) { + if (expanded && windowWidth !== window.innerWidth) collapse(); + }); + var search = $("#search-input"); + var reset = $("#reset-button"); + search.catcomplete({ + minLength: 1, + delay: 200, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push({ l: messages.noResult }); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.indexItem) { + var url = getURL(ui.item.indexItem, ui.item.category); + window.location.href = pathtoroot + url; + $("#search-input").focus(); + } + } + }); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + reset.click(function() { + search.val('').focus(); + }); + search.focus(); +}); diff --git a/docs/java/apidocs/serialized-form.html b/docs/java/apidocs/serialized-form.html new file mode 100644 index 00000000..65f19131 --- /dev/null +++ b/docs/java/apidocs/serialized-form.html @@ -0,0 +1,77 @@ + + + + +Serialized Form (voyager 2.0.9 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Serialized Form

    +
    + +
    +
    +
    + +
    +
    +
    + + diff --git a/docs/java/apidocs/stylesheet.css b/docs/java/apidocs/stylesheet.css new file mode 100644 index 00000000..f71489f8 --- /dev/null +++ b/docs/java/apidocs/stylesheet.css @@ -0,0 +1,1272 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * These CSS custom properties (variables) define the core color and font + * properties used in this stylesheet. + */ +:root { + /* body, block and code fonts */ + --body-font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + --block-font-family: 'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + --code-font-family: 'DejaVu Sans Mono', monospace; + /* Base font sizes for body and code elements */ + --body-font-size: 14px; + --code-font-size: 14px; + /* Text colors for body and block elements */ + --body-text-color: #353833; + --block-text-color: #474747; + /* Background colors for various structural elements */ + --body-background-color: #ffffff; + --section-background-color: #f8f8f8; + --detail-background-color: #ffffff; + /* Colors for navigation bar and table captions */ + --navbar-background-color: #4D7A97; + --navbar-text-color: #ffffff; + /* Background color for subnavigation and various headers */ + --subnav-background-color: #dee3e9; + /* Background and text colors for selected tabs and navigation items */ + --selected-background-color: #f8981d; + --selected-text-color: #253441; + --selected-link-color: #1f389c; + /* Background colors for generated tables */ + --even-row-color: #ffffff; + --odd-row-color: #eeeeef; + /* Text color for page title */ + --title-color: #2c4557; + /* Text colors for links */ + --link-color: #4A6782; + --link-color-active: #bb7a2a; + /* Snippet colors */ + --snippet-background-color: #ebecee; + --snippet-text-color: var(--block-text-color); + --snippet-highlight-color: #f7c590; + /* Border colors for structural elements and user defined tables */ + --border-color: #ededed; + --table-border-color: #000000; + /* Search input colors */ + --search-input-background-color: #ffffff; + --search-input-text-color: #000000; + --search-input-placeholder-color: #909090; + /* Highlight color for active search tag target */ + --search-tag-highlight-color: #ffff00; + /* Adjustments for icon and active background colors of copy-to-clipboard buttons */ + --copy-icon-brightness: 100%; + --copy-button-background-color-active: rgba(168, 168, 176, 0.3); + /* Colors for invalid tag notifications */ + --invalid-tag-background-color: #ffe6e6; + --invalid-tag-text-color: #000000; +} +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ +body { + background-color:var(--body-background-color); + color:var(--body-text-color); + font-family:var(--body-font-family); + font-size:var(--body-font-size); + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:var(--link-color); +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:var(--link-color-active); +} +pre { + font-family:var(--code-font-family); + font-size:1em; +} +h1 { + font-size:1.428em; +} +h2 { + font-size:1.285em; +} +h3 { + font-size:1.14em; +} +h4 { + font-size:1.072em; +} +h5 { + font-size:1.001em; +} +h6 { + font-size:0.93em; +} +/* Disable font boosting for selected elements */ +h1, h2, h3, h4, h5, h6, div.member-signature { + max-height: 1000em; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:var(--code-font-family); +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:var(--code-font-size); + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:var(--code-font-family); + font-size:1em; + padding-top:4px; +} +.summary-table dt code { + font-family:var(--code-font-family); + font-size:1em; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: var(--body-font-family); + font-size: 1em; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:0.915em; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +/* + * Styles for navigation bar. + */ +@media screen { + div.flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + header.flex-header { + flex: 0 0 auto; + } + div.flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + float:left; + width:100%; + clear:right; + min-height:2.8em; + padding:10px 0 0 0; + overflow:hidden; + font-size:0.857em; +} +button#navbar-toggle-button { + display:none; +} +ul.sub-nav-list-small { + display: none; +} +.sub-nav { + background-color:var(--subnav-background-color); + float:left; + width:100%; + overflow:hidden; + font-size:0.857em; +} +.sub-nav div { + clear:left; + float:left; + padding:6px; + text-transform:uppercase; +} +.sub-nav .sub-nav-list { + padding-top:4px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0; + padding:6px; + clear:none; + text-align:right; + position:relative; +} +ul.sub-nav-list li { + list-style:none; + float:left; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:var(--navbar-text-color); + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + color:var(--link-color-active); +} +.nav-bar-cell1-rev { + background-color:var(--selected-background-color); + color:var(--selected-text-color); + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header. + */ +.title { + color:var(--title-color); + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +ul.contents-list { + margin: 0 0 15px 0; + padding: 0; + list-style: none; +} +ul.contents-list li { + font-size:0.93em; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:var(--subnav-background-color); + border:1px solid var(--border-color); + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: var(--body-font-family); + font-size:0.856em; + font-weight:bold; + margin:10px 0 0 0; + color:var(--body-text-color); +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:1em; + font-family:var(--block-font-family) +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.ref-list { + padding:0; + margin:0; +} +ul.ref-list > li { + list-style:none; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.tag-list, ul.tag-list-long { + padding-left: 0; + list-style: none; +} +ul.tag-list li { + display: inline; +} +ul.tag-list li:not(:last-child):after, +ul.tag-list-long li:not(:last-child):after +{ + content: ", "; + white-space: pre-wrap; +} +ul.preview-feature-list { + list-style: none; + margin:0; + padding:0.1em; + line-height: 1.6em; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border:1px solid var(--border-color); + border-top:0; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:var(--selected-text-color); + clear:none; + overflow:hidden; + padding: 10px 0 0 1px; + margin:0; +} +.caption a:link, .caption a:visited { + color:var(--selected-link-color); +} +.caption a:hover, +.caption a:active { + color:var(--navbar-text-color); +} +.caption span { + font-weight:bold; + white-space:nowrap; + padding:5px 12px 7px 12px; + display:inline-block; + float:left; + background-color:var(--selected-background-color); + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:10px 0 0 0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 8px; +} +div.table-tabs > .active-table-tab { + background: var(--selected-background-color); + color: var(--selected-text-color); +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.two-column-search-results { + display: grid; + grid-template-columns: minmax(400px, max-content) minmax(400px, auto); +} +div.checkboxes { + line-height: 2em; +} +div.checkboxes > span { + margin-left: 10px; +} +div.checkboxes > label { + margin-left: 8px; + white-space: nowrap; +} +div.checkboxes > label > input { + margin: 0 2px; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(25%, max-content) minmax(25%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(20%, max-content) minmax(20%, auto); +} +.three-column-release-summary { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(10%, max-content) minmax(40%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +@media screen and (max-width: 800px) { + .two-column-search-results { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(40%, auto); + } + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-release-summary { + display: grid; + grid-template-columns: minmax(70%, max-content) minmax(30%, max-content) + } + .three-column-summary .col-last, + .three-column-release-summary .col-last{ + grid-column-end: span 2; + } +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; + overflow-x: auto; + scrollbar-width: thin; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:var(--subnav-background-color); + font-weight: bold; +} +/* Sortable table columns */ +.table-header[onclick] { + cursor: pointer; +} +.table-header[onclick]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + '); + background-size:100% 100%; + width:9px; + height:14px; + margin-left:4px; + margin-bottom:-3px; +} +.table-header[onclick].sort-asc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + +} +.table-header[onclick].sort-desc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +.col-first, .col-first { + font-size:0.93em; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:0.93em; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited { + font-weight:bold; +} +.even-row-color, .even-row-color .table-header { + background-color:var(--even-row-color); +} +.odd-row-color, .odd-row-color .table-header { + background-color:var(--odd-row-color); +} +/* + * Styles for contents. + */ +div.block { + font-size:var(--body-font-size); + font-family:var(--block-font-family); +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:var(--code-font-family); + font-size:1em; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + /* Color of line numbers in source pages can be set via custom property below */ + color:var(--source-linenumber-color, green); + padding:0 30px 0 0; +} +.block { + display:block; + margin:0 10px 5px 0; + color:var(--block-text-color); +} +.deprecated-label, .description-from-type-label, .implementation-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +details.invalid-tag, span.invalid-tag { + font-size:1em; + font-family:var(--block-font-family); + color: var(--invalid-tag-text-color); + background: var(--invalid-tag-background-color); + border: thin solid var(--table-border-color); + border-radius:2px; + padding: 2px 4px; + display:inline-block; +} +details summary { + cursor: pointer; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-state-active { + /* Overrides the color of selection used in jQuery UI */ + background: var(--selected-background-color); + border: 1px solid var(--selected-background-color); + color: var(--selected-text-color); +} +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:auto; + overflow-x:auto; + scrollbar-width: thin; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:1; + background-color: var(--body-background-color); +} +ul.ui-autocomplete li { + float:left; + clear:both; + min-width:100%; +} +ul.ui-autocomplete li.ui-static-link { + position:sticky; + bottom:0; + left:0; + background: var(--subnav-background-color); + padding: 5px 0; + font-family: var(--body-font-family); + font-size: 0.93em; + font-weight: bolder; + z-index: 2; +} +li.ui-static-link a, li.ui-static-link a:visited { + text-decoration:none; + color:var(--link-color); + float:right; + margin-right:20px; +} +.ui-autocomplete .result-item { + font-size: inherit; +} +.ui-autocomplete .result-highlight { + font-weight:bold; +} +#search-input, #page-search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + background-color: var(--search-input-background-color); + color: var(--search-input-text-color); + border-color: var(--border-color); + padding-left:20px; + width: 250px; + margin: 0; +} +#search-input { + margin-left: 4px; +} +#reset-button { + background-color: transparent; + background-image:url('resources/x.png'); + background-repeat:no-repeat; + background-size:contain; + border:0; + border-radius:0; + width:12px; + height:12px; + position:absolute; + right:12px; + top:10px; + font-size:0; +} +::placeholder { + color:var(--search-input-placeholder-color); + opacity: 1; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:var(--search-tag-highlight-color); +} +details.page-search-details { + display: inline-block; +} +div#result-container { + font-size: 1em; +} +div#result-container a.search-result-link { + padding: 0; + margin: 4px 0; + width: 100%; +} +#result-container .result-highlight { + font-weight:bolder; +} +.page-search-info { + background-color: var(--subnav-background-color); + border-radius: 3px; + border: 0 solid var(--border-color); + padding: 0 8px; + overflow: hidden; + height: 0; + transition: all 0.2s ease; +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.page-search-header { + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + display: inline-block; +} +button.page-search-header { + border: none; + cursor: pointer; +} +span#page-search-link { + text-decoration: underline; +} +.module-graph span, .sealed-graph span { + display:none; + position:absolute; +} +.module-graph:hover span, .sealed-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0 20px 5px 10px; + border: 1px solid var(--border-color); + background-color: var(--section-background-color); +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:var(--detail-background-color); + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +/* + * Styles for header/section anchor links + */ +a.anchor-link { + opacity: 0; + transition: opacity 0.1s; +} +:hover > a.anchor-link { + opacity: 80%; +} +a.anchor-link:hover, +a.anchor-link:focus-visible, +a.anchor-link.visible { + opacity: 100%; +} +a.anchor-link > img { + width: 0.9em; + height: 0.9em; +} +/* + * Styles for copy-to-clipboard buttons + */ +button.copy { + opacity: 70%; + border: none; + border-radius: 3px; + position: relative; + background:none; + transition: opacity 0.3s; + cursor: pointer; +} +:hover > button.copy { + opacity: 80%; +} +button.copy:hover, +button.copy:active, +button.copy:focus-visible, +button.copy.visible { + opacity: 100%; +} +button.copy img { + position: relative; + background: none; + filter: brightness(var(--copy-icon-brightness)); +} +button.copy:active { + background-color: var(--copy-button-background-color-active); +} +button.copy span { + color: var(--body-text-color); + position: relative; + top: -0.1em; + transition: all 0.1s; + font-size: 0.76rem; + line-height: 1.2em; + opacity: 0; +} +button.copy:hover span, +button.copy:focus-visible span, +button.copy.visible span { + opacity: 100%; +} +/* search page copy button */ +button#page-search-copy { + margin-left: 0.4em; + padding:0.3em; + top:0.13em; +} +button#page-search-copy img { + width: 1.2em; + height: 1.2em; + padding: 0.01em 0; + top: 0.15em; +} +button#page-search-copy span { + color: var(--body-text-color); + line-height: 1.2em; + padding: 0.2em; + top: -0.18em; +} +div.page-search-info:hover button#page-search-copy span { + opacity: 100%; +} +/* snippet copy button */ +button.snippet-copy { + position: absolute; + top: 6px; + right: 6px; + height: 1.7em; + padding: 2px; +} +button.snippet-copy img { + width: 18px; + height: 18px; + padding: 0.05em 0; +} +button.snippet-copy span { + line-height: 1.2em; + padding: 0.2em; + position: relative; + top: -0.5em; +} +div.snippet-container:hover button.snippet-copy span { + opacity: 100%; +} +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.striped > thead { + background-color: var(--subnav-background-color); +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped > tbody > tr:nth-child(even) { + background-color: var(--odd-row-color) +} +table.striped > tbody > tr:nth-child(odd) { + background-color: var(--even-row-color) +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid var(--table-border-color); + border-right: 1px solid var(--table-border-color); +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak style for small screens. + */ +@media screen and (max-width: 920px) { + header.flex-header { + max-height: 100vh; + overflow-y: auto; + } + div#navbar-top { + height: 2.8em; + transition: height 0.35s ease; + } + ul.nav-list { + display: block; + width: 40%; + float:left; + clear: left; + margin: 10px 0 0 0; + padding: 0; + } + ul.nav-list li { + float: none; + padding: 6px; + margin-left: 10px; + margin-top: 2px; + } + ul.sub-nav-list-small { + display:block; + height: 100%; + width: 50%; + float: right; + clear: right; + background-color: var(--subnav-background-color); + color: var(--body-text-color); + margin: 6px 0 0 0; + padding: 0; + } + ul.sub-nav-list-small ul { + padding-left: 20px; + } + ul.sub-nav-list-small a:link, ul.sub-nav-list-small a:visited { + color:var(--link-color); + } + ul.sub-nav-list-small a:hover { + color:var(--link-color-active); + } + ul.sub-nav-list-small li { + list-style:none; + float:none; + padding: 6px; + margin-top: 1px; + text-transform:uppercase; + } + ul.sub-nav-list-small > li { + margin-left: 10px; + } + ul.sub-nav-list-small li p { + margin: 5px 0; + } + div#navbar-sub-list { + display: none; + } + .top-nav a:link, .top-nav a:active, .top-nav a:visited { + display: block; + } + button#navbar-toggle-button { + width: 3.4em; + height: 2.8em; + background-color: transparent; + display: block; + float: left; + border: 0; + margin: 0 10px; + cursor: pointer; + font-size: 10px; + } + button#navbar-toggle-button .nav-bar-toggle-icon { + display: block; + width: 24px; + height: 3px; + margin: 1px 0 4px 0; + border-radius: 2px; + transition: all 0.1s; + background-color: var(--navbar-text-color); + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(1) { + transform: rotate(45deg); + transform-origin: 10% 10%; + width: 26px; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(2) { + opacity: 0; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(3) { + transform: rotate(-45deg); + transform-origin: 10% 90%; + width: 26px; + } +} +@media screen and (max-width: 800px) { + .about-language { + padding-right: 16px; + } + ul.nav-list li { + margin-left: 5px; + } + ul.sub-nav-list-small > li { + margin-left: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 400px) { + .about-language { + font-size: 10px; + padding-right: 12px; + } +} +@media screen and (max-width: 400px) { + .nav-list-search { + width: 94%; + } + #search-input, #page-search-input { + width: 70%; + } +} +@media screen and (max-width: 320px) { + .nav-list-search > label { + display: none; + } + .nav-list-search { + width: 90%; + } + #search-input, #page-search-input { + width: 80%; + } +} + +pre.snippet { + background-color: var(--snippet-background-color); + color: var(--snippet-text-color); + padding: 10px; + margin: 12px 0; + overflow: auto; + white-space: pre; +} +div.snippet-container { + position: relative; +} +@media screen and (max-width: 800px) { + pre.snippet { + padding-top: 26px; + } + button.snippet-copy { + top: 4px; + right: 4px; + } +} +pre.snippet .italic { + font-style: italic; +} +pre.snippet .bold { + font-weight: bold; +} +pre.snippet .highlighted { + background-color: var(--snippet-highlight-color); + border-radius: 10%; +} diff --git a/docs/java/apidocs/tag-search-index.js b/docs/java/apidocs/tag-search-index.js new file mode 100644 index 00000000..f38b3cb3 --- /dev/null +++ b/docs/java/apidocs/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/java/apidocs/type-search-index.js b/docs/java/apidocs/type-search-index.js new file mode 100644 index 00000000..6822b52e --- /dev/null +++ b/docs/java/apidocs/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.spotify.voyager.jni","l":"Index"},{"p":"com.spotify.voyager.jni.utils","l":"JniLibExtractor"},{"p":"com.spotify.voyager.jni","l":"Index.QueryResults"},{"p":"com.spotify.voyager.jni","l":"StringIndex.QueryResults"},{"p":"com.spotify.voyager.jni.exception","l":"RecallException"},{"p":"com.spotify.voyager.jni","l":"Index.SpaceType"},{"p":"com.spotify.voyager.jni","l":"Index.StorageDataType"},{"p":"com.spotify.voyager.jni","l":"StringIndex"},{"p":"com.spotify.voyager.jni.utils","l":"TinyJson"}];updateSearchResults(); \ No newline at end of file diff --git a/java/com_spotify_voyager_jni_Index.cpp b/java/com_spotify_voyager_jni_Index.cpp index a2fdbdc4..d03cba12 100644 --- a/java/com_spotify_voyager_jni_Index.cpp +++ b/java/com_spotify_voyager_jni_Index.cpp @@ -440,6 +440,13 @@ jobject Java_com_spotify_voyager_jni_Index_query___3FIJ(JNIEnv *env, std::get<1>(queryResults).data()); return env->NewObject(queryResultsClass, constructor, labels, distances); + } catch (RecallError const &e) { + if (!env->ExceptionCheck()) { + env->ThrowNew( + env->FindClass("com/spotify/voyager/jni/exception/RecallException"), + e.what()); + } + return nullptr; } catch (std::exception const &e) { if (!env->ExceptionCheck()) { env->ThrowNew(env->FindClass("java/lang/RuntimeException"), e.what()); @@ -502,6 +509,13 @@ jobjectArray Java_com_spotify_voyager_jni_Index_query___3_3FIIJ( } return javaQueryResults; + } catch (RecallError const &e) { + if (!env->ExceptionCheck()) { + env->ThrowNew( + env->FindClass("com/spotify/voyager/jni/exception/RecallException"), + e.what()); + } + return nullptr; } catch (std::exception const &e) { if (!env->ExceptionCheck()) { env->ThrowNew(env->FindClass("java/lang/RuntimeException"), e.what()); diff --git a/java/src/main/java/com/spotify/voyager/jni/Index.java b/java/src/main/java/com/spotify/voyager/jni/Index.java index f9f7ad9c..f634a092 100644 --- a/java/src/main/java/com/spotify/voyager/jni/Index.java +++ b/java/src/main/java/com/spotify/voyager/jni/Index.java @@ -20,6 +20,7 @@ package com.spotify.voyager.jni; +import com.spotify.voyager.jni.exception.RecallException; import com.spotify.voyager.jni.utils.JniLibExtractor; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -513,7 +514,7 @@ public byte[] asBytes() { * @param k The number of nearest neighbors to return. * @return A {@link QueryResults} object, containing the neighbors found that are (approximately) * nearest to the query vector. - * @throws RuntimeException if fewer than {@code k} results can be found in the index. + * @throws RecallException if fewer than {@code k} results can be found in the index. */ public QueryResults query(float[] queryVector, int k) { return query(queryVector, k, -1); @@ -531,7 +532,7 @@ public QueryResults query(float[] queryVector, int k) { * @return An array of {@link QueryResults} objects, each containing the neighbors found that are * (approximately) nearest to the corresponding query vector. The returned list of {@link * QueryResults} will contain the same number of elements as {@code queryVectors}. - * @throws RuntimeException if fewer than {@code k} results can be found in the index for one or + * @throws RecallException if fewer than {@code k} results can be found in the index for one or * more queries. */ public QueryResults[] query(float[][] queryVectors, int k, int numThreads) { @@ -547,7 +548,7 @@ public QueryResults[] query(float[][] queryVectors, int k, int numThreads) { * the expense of query time. * @return A {@link QueryResults} object, containing the neighbors found that are (approximately) * nearest to the query vector. - * @throws RuntimeException if fewer than {@code k} results can be found in the index. + * @throws RecallException if fewer than {@code k} results can be found in the index. */ public native QueryResults query(float[] queryVector, int k, long queryEf); @@ -565,7 +566,7 @@ public QueryResults[] query(float[][] queryVectors, int k, int numThreads) { * @return An array of {@link QueryResults} objects, each containing the neighbors found that are * (approximately) nearest to the corresponding query vector. The returned list of {@link * QueryResults} will contain the same number of elements as {@code queryVectors}. - * @throws RuntimeException if fewer than {@code k} results can be found in the index for one or + * @throws RecallException if fewer than {@code k} results can be found in the index for one or * more queries. */ public native QueryResults[] query(float[][] queryVectors, int k, int numThreads, long queryEf); diff --git a/java/src/main/java/com/spotify/voyager/jni/exception/RecallException.java b/java/src/main/java/com/spotify/voyager/jni/exception/RecallException.java new file mode 100644 index 00000000..666be067 --- /dev/null +++ b/java/src/main/java/com/spotify/voyager/jni/exception/RecallException.java @@ -0,0 +1,43 @@ +/*- + * -\-\- + * voyager + * -- + * Copyright (C) 2016 - 2023 Spotify AB + * -- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -/-/- + */ + +package com.spotify.voyager.jni.exception; + +/** An exception indicating that the desired recall of a query cannot be achieved */ +public class RecallException extends RuntimeException { + /** + * Constructs a new RecallException with the specified detail message. + * + * @param message the detail message + */ + public RecallException(String message) { + super(message); + } + + /** + * Constructs a new RecallException with the specified detail message and cause. + * + * @param message the detail message + * @param cause the cause of the exception + */ + public RecallException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/python/bindings.cpp b/python/bindings.cpp index 1a6dc299..bd5158d4 100644 --- a/python/bindings.cpp +++ b/python/bindings.cpp @@ -209,6 +209,8 @@ inline void register_index_class(py::module &m, std::string className, }; PYBIND11_MODULE(voyager, m) { + py::register_exception(m, "RecallError"); + init_LabelSetView(m); py::enum_(