From 67849bc3f2d025b80b3e91690bd4bb58efa373bd Mon Sep 17 00:00:00 2001 From: Ted Willke Date: Thu, 5 Mar 2026 00:39:43 +0000 Subject: [PATCH] Extend csv logging to include build and search compressor information. --- .../github/jbellis/jvector/example/Grid.java | 10 +++++++++- .../example/reporting/ExperimentsSchemaV1.java | 18 ++++++++++++++++++ .../example/reporting/RunArtifacts.java | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/Grid.java b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/Grid.java index 89fd7da83..97a28f01c 100644 --- a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/Grid.java +++ b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/Grid.java @@ -247,6 +247,10 @@ static void runOneGraph(OnDiskGraphIndexCache cache, buildCompressorObj = getCompressor(buildCompressor, ds, constructionMetrics, Phase.INDEX, buildQuantType); } + // Used in logging + String buildCompressorString = + (buildCompressorObj == null) ? "None" : String.valueOf(buildCompressorObj); + Map, ImmutableGraphIndex> indexes = new HashMap<>(); if (buildCompressorObj == null) { indexes = buildInMemory(featureSets, M, efConstruction, neighborOverflow, addHierarchy, refineFinalGraph, ds, workDirectory); @@ -323,7 +327,7 @@ static void runOneGraph(OnDiskGraphIndexCache cache, try (var cs = new ConfiguredSystem(ds, index, cv, featureSetForIndex)) { testConfiguration(cs, topKGrid, usePruningGrid, M, efConstruction, neighborOverflow, addHierarchy, refineFinalGraph, featureSetForIndex, - artifacts, constructionMetrics, workDirectory); + buildCompressorString, artifacts, constructionMetrics, workDirectory); } catch (Exception e) { throw new RuntimeException(e); } @@ -606,6 +610,7 @@ private static void testConfiguration(ConfiguredSystem cs, boolean addHierarchy, boolean refineFinalGraph, Set featureSetForIndex, + String buildCompressorString, RunArtifacts artifacts, ConstructionMetrics constructionMetrics, Path testDirectory) { @@ -674,6 +679,7 @@ private static void testConfiguration(ConfiguredSystem cs, printer.printRow(overquery, displayResults); // Apply log selection and write CSV row + String searchCompressorString = (cs.cv == null) ? "None" : String.valueOf(cs.cv.getCompressor()); var logOutputs = logSel.apply(results, logResolved); artifacts.logRow( cs.ds.getName(), @@ -683,6 +689,8 @@ private static void testConfiguration(ConfiguredSystem cs, addHierarchy, refineFinalGraph, featureSetForIndex, + buildCompressorString, + searchCompressorString, usePruning, topK, overquery, diff --git a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/ExperimentsSchemaV1.java b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/ExperimentsSchemaV1.java index d8b07b578..6d554e873 100644 --- a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/ExperimentsSchemaV1.java +++ b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/ExperimentsSchemaV1.java @@ -32,6 +32,18 @@ public final class ExperimentsSchemaV1 { private ExperimentsSchemaV1() {} + static String csvEscape(String s) { + if (s == null) return ""; + boolean needsQuotes = + s.indexOf(',') >= 0 || + s.indexOf('"') >= 0 || + s.indexOf('\n') >= 0 || + s.indexOf('\r') >= 0; + + if (!needsQuotes) return s; + return "\"" + s.replace("\"", "\"\"") + "\""; + } + public static List fixedColumns() { return List.of( "schema_version", @@ -45,6 +57,8 @@ public static List fixedColumns() { "addHierarchy", "refineFinalGraph", "feature_set", + "build_compressor", + "search_compressor", "usePruning", "topK", "overquery", @@ -65,6 +79,8 @@ public static Map fixedValues(RunContext run, boolean addHierarchy, boolean refineFinalGraph, Set featureSet, + String buildCompressorString, + String searchCompressorString, boolean usePruning, int topK, double overquery, @@ -82,6 +98,8 @@ public static Map fixedValues(RunContext run, fixed.put("addHierarchy", Boolean.toString(addHierarchy)); fixed.put("refineFinalGraph", Boolean.toString(refineFinalGraph)); fixed.put("feature_set", featureSet == null ? "" : featureSet.toString()); + fixed.put("build_compressor", csvEscape(buildCompressorString)); + fixed.put("search_compressor", csvEscape(searchCompressorString)); fixed.put("usePruning", Boolean.toString(usePruning)); fixed.put("topK", Integer.toString(topK)); diff --git a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/RunArtifacts.java b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/RunArtifacts.java index 0857c0226..77e180f4f 100644 --- a/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/RunArtifacts.java +++ b/jvector-examples/src/main/java/io/github/jbellis/jvector/example/reporting/RunArtifacts.java @@ -192,6 +192,8 @@ public void logRow(String datasetName, boolean addHierarchy, boolean refineFinalGraph, Set featureSetForIndex, + String buildCompressorString, + String searchCompressorString, boolean usePruning, int topK, double overquery, @@ -210,6 +212,8 @@ public void logRow(String datasetName, addHierarchy, refineFinalGraph, featureSetForIndex, + buildCompressorString, + searchCompressorString, usePruning, topK, overquery,