Skip to content

Commit 06e5327

Browse files
committed
add to performance tests
1 parent 00caac0 commit 06e5327

2 files changed

Lines changed: 72 additions & 4 deletions

File tree

.github/workflows/performance-test.yml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,30 @@ jobs:
4141
run: |
4242
python -m unittest src.test.test_query_performance -v 2>&1 | tee performance_test_output.log
4343
44-
- name: Run Legacy Performance Test
44+
- name: Run Legacy Performance Test
4545
env:
4646
VFBQUERY_CACHE_ENABLED: 'true'
4747
MPLBACKEND: 'Agg'
4848
VISPY_GL_LIB: 'osmesa'
4949
VISPY_USE_EGL: '0'
5050
run: |
5151
python -m unittest -v src.test.term_info_queries_test.TermInfoQueriesTest.test_term_info_performance 2>&1 | tee -a performance_test_output.log
52-
52+
53+
- name: Run Connectivity Tests
54+
env:
55+
VFBQUERY_CACHE_ENABLED: 'true'
56+
MPLBACKEND: 'Agg'
57+
VISPY_GL_LIB: 'osmesa'
58+
VISPY_USE_EGL: '0'
59+
run: |
60+
python -m unittest -v \
61+
src.test.test_neuron_neuron_connectivity \
62+
src.test.test_neuron_region_connectivity \
63+
src.test.test_upstream_class_connectivity \
64+
src.test.test_downstream_class_connectivity \
65+
src.test.test_vfb_connectivity \
66+
2>&1 | tee -a performance_test_output.log
67+
5368
- name: Create Performance Report
5469
if: always() # Always run this step, even if the test fails
5570
run: |
@@ -177,7 +192,7 @@ jobs:
177192
echo "|-------|----------|--------|" >> performance.md
178193
179194
# Parse timing information
180-
grep -E "^(get_term_info|NeuronsPartHere|NeuronsSynaptic|NeuronsPresynapticHere|NeuronsPostsynapticHere|ComponentsOf|PartsOf|SubclassesOf|NeuronClassesFasciculatingHere|TractsNervesInnervatingHere|LineageClonesIn|ListAllAvailableImages):" performance_test_output.log | while read line; do
195+
grep -E "^(get_term_info|NeuronsPartHere|NeuronsSynaptic|NeuronsPresynapticHere|NeuronsPostsynapticHere|ComponentsOf|PartsOf|SubclassesOf|NeuronClassesFasciculatingHere|TractsNervesInnervatingHere|LineageClonesIn|ListAllAvailableImages|NeuronNeuronConnectivityQuery|NeuronRegionConnectivityQuery|NeuronInputsTo|DownstreamClassConnectivity|UpstreamClassConnectivity|QueryConnectivity):" performance_test_output.log | while read line; do
181196
QUERY=$(echo "$line" | sed 's/:.*//')
182197
DURATION=$(echo "$line" | sed 's/.*: \([0-9.]*\)s.*/\1/')
183198
if echo "$line" | grep -q "✅"; then

src/test/test_query_performance.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@
3434
get_neuron_neuron_connectivity,
3535
get_neuron_region_connectivity,
3636
get_individual_neuron_inputs,
37+
get_downstream_class_connectivity,
38+
get_upstream_class_connectivity,
3739
get_expression_overlaps_here,
3840
get_anatomy_scrnaseq,
3941
get_cluster_expression,
4042
get_expression_cluster,
4143
get_scrnaseq_dataset_data,
4244
)
45+
from vfbquery.vfb_connectivity import query_connectivity
4346

4447

4548
class QueryPerformanceTest(unittest.TestCase):
@@ -348,7 +351,57 @@ def test_07_connectivity_queries(self):
348351
)
349352
print(f"NeuronRegionConnectivityQuery: {duration:.4f}s {'✅' if success else '❌'}")
350353
self.assertLess(duration, self.THRESHOLD_SLOW, "NeuronRegionConnectivityQuery exceeded threshold")
351-
354+
355+
def test_07b_class_connectivity_queries(self):
356+
"""Test class-level connectivity queries (pre-indexed Solr)"""
357+
print("\n" + "="*80)
358+
print("CLASS CONNECTIVITY QUERIES (Solr pre-indexed)")
359+
print("="*80)
360+
361+
# FBbt_00001482 = lineage NB3-2 primary interneuron — known to have
362+
# downstream/upstream connectivity data in the vfb_json Solr core.
363+
test_class = "FBbt_00001482"
364+
365+
# DownstreamClassConnectivity
366+
result, duration, success = self._time_query(
367+
"DownstreamClassConnectivity",
368+
get_downstream_class_connectivity,
369+
test_class,
370+
return_dataframe=False,
371+
)
372+
print(f"DownstreamClassConnectivity: {duration:.4f}s {'✅' if success else '❌'}")
373+
self.assertLess(duration, self.THRESHOLD_MEDIUM, "DownstreamClassConnectivity exceeded threshold")
374+
375+
# UpstreamClassConnectivity
376+
result, duration, success = self._time_query(
377+
"UpstreamClassConnectivity",
378+
get_upstream_class_connectivity,
379+
test_class,
380+
return_dataframe=False,
381+
)
382+
print(f"UpstreamClassConnectivity: {duration:.4f}s {'✅' if success else '❌'}")
383+
self.assertLess(duration, self.THRESHOLD_MEDIUM, "UpstreamClassConnectivity exceeded threshold")
384+
385+
def test_07c_cross_dataset_connectivity(self):
386+
"""Test cross-dataset query_connectivity (live, both-end filtered)"""
387+
print("\n" + "="*80)
388+
print("CROSS-DATASET CONNECTIVITY (live, slow)")
389+
print("="*80)
390+
391+
# Both-end + group_by_class is the fastest variant per LLM guidance.
392+
# giant fiber neuron → peripherally synapsing interneuron is a
393+
# known-good pair with non-zero results.
394+
result, duration, success = self._time_query(
395+
"QueryConnectivity",
396+
query_connectivity,
397+
upstream_type="giant fiber neuron",
398+
downstream_type="peripherally synapsing interneuron",
399+
group_by_class=True,
400+
)
401+
print(f"QueryConnectivity: {duration:.4f}s {'✅' if success else '❌'}")
402+
# Live cross-dataset query — allow up to 5 min per the MCP timeout.
403+
self.assertLess(duration, 300.0, "QueryConnectivity exceeded threshold")
404+
352405
def test_08_similarity_queries(self):
353406
"""Test NBLAST similarity queries"""
354407
print("\n" + "="*80)

0 commit comments

Comments
 (0)