@@ -23,8 +23,6 @@ JVM_ARGS=(
2323
2424 " -Dfile.encoding=UTF-8"
2525 " -Dreenc.mode=end"
26- # "-Dreenc.fullMigration=true"
27-
2826)
2927
3028# -------------------- SAFETY -------------------
@@ -38,10 +36,18 @@ need_file "$JAR"
3836
3937mkdir -p " $OUT_ROOT "
4038
39+ # Check disk space
40+ AVAILABLE_GB=$( df -BG " $OUT_ROOT " | tail -1 | awk ' {print $4}' | sed ' s/G//' )
41+ REQUIRED_GB=60
42+ if [ " $AVAILABLE_GB " -lt " $REQUIRED_GB " ]; then
43+ die " Insufficient disk space: ${AVAILABLE_GB} GB available, ${REQUIRED_GB} GB required"
44+ fi
45+ echo " Disk space: ${AVAILABLE_GB} GB available"
46+
4147# ================= DATASETS ====================
4248
4349declare -A CFG=(
44- [" SIFT1M" ]=" /home/jeco/IdeaProjects/fspann-query-system/fsp-anns-parent/config/src/main/resources/config_sift1m_ablation .json"
50+ [" SIFT1M" ]=" /home/jeco/IdeaProjects/fspann-query-system/fsp-anns-parent/config/src/main/resources/config_sift1m .json"
4551 [" glove-100" ]=" /home/jeco/IdeaProjects/fspann-query-system/fsp-anns-parent/config/src/main/resources/config_glove100.json"
4652 [" RedCaps" ]=" /home/jeco/IdeaProjects/fspann-query-system/fsp-anns-parent/config/src/main/resources/config_redcaps.json"
4753)
@@ -74,10 +80,20 @@ declare -A GT=(
7480ONLY_DATASET=" "
7581ONLY_PROFILE=" "
7682
83+ # ================= TRACKING ====================
84+ FAILED_PROFILES=()
85+ SWEEP_START=$( date +%s)
86+
87+ echo " SWEEP STARTED: $( date) "
88+ echo " Datasets: SIFT1M-128, Glove-100, RedCaps-512"
89+ echo " Profiles per dataset: 9"
90+ echo " Total profiles: 27"
91+ echo " "
92+
7793# ================= GLOBAL SUMMARY =================
7894
7995GLOBAL_SUMMARY=" $OUT_ROOT /global_summary.csv"
80- echo " dataset,profile,ART_ms,AvgRatio,ratio@20,ratio@40,ratio@60,ratio@80,ratio@100" \
96+ echo " dataset,profile,ART_ms,AvgRatio,recall_at_100, ratio@20,ratio@40,ratio@60,ratio@80,ratio@100" \
8197 > " $GLOBAL_SUMMARY "
8298
8399# ================= MAIN LOOP ======================
@@ -86,30 +102,37 @@ DATASETS=(SIFT1M glove-100 RedCaps)
86102[[ -n " $ONLY_DATASET " ]] && DATASETS=(" $ONLY_DATASET " )
87103
88104for ds in " ${DATASETS[@]} " ; do
89- echo " DATASET START : $ds "
105+ echo " DATASET: $ds "
90106
91107 cfg=" ${CFG[$ds]} "
92108 dim=" ${DIM[$ds]} "
93109 base=" ${BASE[$ds]} "
94110 query=" ${QUERY[$ds]} "
95111 gt=" ${GT[$ds]} "
96112
113+ # Validate config exists and has profiles
114+ [[ -f " $cfg " ]] || die " Config not found: $cfg "
115+ PROFILE_COUNT=" $( jq ' .profiles | length' " $cfg " ) "
116+ [[ " $PROFILE_COUNT " -gt 0 ]] || die " No profiles in config: $cfg "
117+ echo " Profiles to run: $PROFILE_COUNT "
118+
97119 BASE_JSON=" $( jq -c ' del(.profiles)' " $cfg " ) "
98120
99121 ds_root=" $OUT_ROOT /$ds "
100122 mkdir -p " $ds_root "
101123
102- echo " profile,ART_ms,AvgRatio,ratio@20,ratio@40,ratio@60,ratio@80,ratio@100" \
124+ echo " dataset, profile,ART_ms,AvgRatio,recall_at_100 ,ratio@20,ratio@40,ratio@60,ratio@80,ratio@100" \
103125 > " $ds_root /dataset_summary.csv"
104126
105- PROFILE_COUNT=" $( jq ' .profiles | length' " $cfg " ) "
106-
107127 for (( i= 0 ;i< PROFILE_COUNT;i++ )) ; do
108128 prof=" $( jq -c " .profiles[$i ]" " $cfg " ) "
109129 name=" $( jq -r ' .name' <<< " $prof" ) "
110130
111131 [[ -n " $ONLY_PROFILE " && " $name " != " $ONLY_PROFILE " ]] && continue
112132
133+ echo " "
134+ echo " [$ds ] Running profile $(( i+ 1 )) /$PROFILE_COUNT : $name "
135+
113136 overrides=" $( jq -c ' .overrides // {}' <<< " $prof" ) "
114137 run_dir=" $ds_root /$name "
115138
@@ -134,38 +157,82 @@ for ds in "${DATASETS[@]}"; do
134157 echo " $final_cfg " > " $run_dir /config.json"
135158 sha256sum " $run_dir /config.json" > " $run_dir /config.sha256"
136159
137- echo " RUNNING: $ds | $name (10k queries)"
138-
139160 start_ts=$( date +%s)
140161
141162 if ! java " ${JVM_ARGS[@]} " -jar " $JAR " \
142163 " $run_dir /config.json" " $base " " $query " " $run_dir /keys.blob" \
143164 " $dim " " $run_dir " " $gt " " $BATCH_SIZE " \
144165 > " $run_dir /run.log" 2>&1 ; then
145- echo " FAILED: $ds | $name "
166+ echo " ❌ FAILED: $ds | $name "
167+ FAILED_PROFILES+=(" $ds /$name " )
146168 continue
147169 fi
148170
149171 end_ts=$( date +%s)
150- echo " COMPLETED: $ds | $name | wall_time=$(( end_ts - start_ts)) s"
172+ duration=$(( end_ts - start_ts))
173+ echo " ✓ COMPLETED in ${duration} s"
151174
152175 acc=" $run_dir /results/summary.csv"
153- [[ -f " $acc " ]] || die " Missing summary.csv"
176+ if [[ ! -f " $acc " ]]; then
177+ echo " ⚠️ WARNING: Missing summary.csv"
178+ FAILED_PROFILES+=(" $ds /$name (no summary)" )
179+ continue
180+ fi
154181
155- avg_art= $( awk -F ' , ' ' NR>1 {print $13} ' " $acc " )
156- avg_ratio =$( awk -F' ,' ' NR>1 {print $7} ' " $acc " )
157- ratio20= $( awk -F ' , ' ' NR>1 {print $24} ' " $acc " )
158- ratio40= $( awk -F ' , ' ' NR>1 {print $25} ' " $acc " )
159- ratio60= $( awk -F ' , ' ' NR>1 {print $26} ' " $acc " )
160- ratio80= $( awk -F ' , ' ' NR>1 {print $27} ' " $acc " )
161- ratio100= $( awk -F ' , ' ' NR>1 {print $28} ' " $acc " )
182+ # Validate CSV has enough columns
183+ COL_COUNT =$( head -1 " $acc " | awk -F' ,' ' {print NF} ' )
184+ if [ " $COL_COUNT " -lt 28 ] ; then
185+ echo " ⚠️ WARNING: CSV has only $COL_COUNT columns (expected 28+) "
186+ FAILED_PROFILES+=( " $ds / $name (invalid CSV) " )
187+ continue
188+ fi
162189
190+ avg_art=$( awk -F' ,' ' NR>1 {print $13}' " $acc " )
191+ avg_ratio=$( awk -F' ,' ' NR>1 {print $7}' " $acc " )
192+ recall_100=$( awk -F' ,' ' NR>1 {print $23}' " $acc " )
193+ ratio20=$( awk -F' ,' ' NR>1 {print $24}' " $acc " )
194+ ratio40=$( awk -F' ,' ' NR>1 {print $25}' " $acc " )
195+ ratio60=$( awk -F' ,' ' NR>1 {print $26}' " $acc " )
196+ ratio80=$( awk -F' ,' ' NR>1 {print $27}' " $acc " )
197+ ratio100=$( awk -F' ,' ' NR>1 {print $28}' " $acc " )
163198
164- echo " $name ,$avg_art ,$avg_ratio ,$ratio20 ,$ratio40 ,$ratio60 ,$ratio80 ,$ratio100 " \
165- >> " $ds_root /dataset_summary.csv"
199+ echo " $ds , $ name ,$avg_art ,$avg_ratio , $recall_100 ,$ratio20 ,$ratio40 ,$ratio60 ,$ratio80 ,$ratio100 " \
200+ >> " $ds_root /dataset_summary.csv"
166201
167- echo " $ds ,$name ,$avg_art ,$avg_ratio ,$ratio20 ,$ratio40 ,$ratio60 ,$ratio80 ,$ratio100 " \
168- >> " $GLOBAL_SUMMARY "
202+ echo " $ds ,$name ,$avg_art ,$avg_ratio , $recall_100 ,$ratio20 ,$ratio40 ,$ratio60 ,$ratio80 ,$ratio100 " \
203+ >> " $GLOBAL_SUMMARY "
169204
205+ echo " Recall@100: $recall_100 | ART: ${avg_art} ms"
170206 done
207+
208+ echo " "
209+ echo " ✓ $ds completed"
171210done
211+
212+ # ================= FINAL SUMMARY =================
213+
214+ SWEEP_END=$( date +%s)
215+ SWEEP_DURATION=$(( SWEEP_END - SWEEP_START))
216+ SWEEP_HOURS=$(( SWEEP_DURATION / 3600 ))
217+ SWEEP_MINS=$(( (SWEEP_DURATION % 3600 ) / 60 ))
218+
219+ echo " "
220+ echo " SWEEP COMPLETED: $( date) "
221+ echo " Total Duration: ${SWEEP_HOURS} h ${SWEEP_MINS} m"
222+
223+ if [ ${# FAILED_PROFILES[@]} -gt 0 ]; then
224+ echo " "
225+ echo " ⚠️ FAILED PROFILES (${# FAILED_PROFILES[@]} ):"
226+ for fail in " ${FAILED_PROFILES[@]} " ; do
227+ echo " - $fail "
228+ done
229+ else
230+ echo " "
231+ echo " ll profiles completed successfully!"
232+ fi
233+
234+ echo " "
235+ echo " Results:"
236+ echo " Global summary: $GLOBAL_SUMMARY "
237+ echo " Per-dataset: $OUT_ROOT /{SIFT1M,glove-100,RedCaps}/dataset_summary.csv"
238+ echo " "
0 commit comments