@@ -311,52 +311,43 @@ static void compute_tensor_statistics(std::vector<tensor_statistics> & tstats) {
311311static void compute_layer_statistics (const std::vector<tensor_statistics> & tstats,
312312 std::map<int , float > & layer_cossim,
313313 const std::unordered_map<std::string, Stats> & stats_map) {
314- struct layer_aggregation {
314+ struct layer_aggregation {
315315 std::vector<float > curr_avg;
316316 std::vector<float > prev_avg;
317317 };
318-
319318 static const std::regex pattern (R"( blk\.(\d+)\.)" );
320-
321- // index tensor stats by name for quick lookup
322319 std::unordered_map<std::string, const tensor_statistics*> tidx;
323320 tidx.reserve (tstats.size ());
324321 for (const auto & ts : tstats) tidx[ts.tensor ] = &ts;
322+ std::map<int , layer_aggregation> taggr;
325323
326- // concatenate per-layer
327- std::map<int , layer_aggregation> taggr; // ordered by layer
328324 for (const auto & ts : tstats) {
329325 std::smatch match;
330326 if (!std::regex_search (ts.tensor , match, pattern)) continue ;
331327 const int blk = std::stoi (match[1 ]);
332328 if (blk <= 0 ) continue ;
333-
334329 std::string prev_lyr (ts.tensor );
335330 prev_lyr.replace (match.position (1 ), match.length (1 ), std::to_string (blk-1 ));
336-
337331 if (auto it_prev = tidx.find (prev_lyr); it_prev == tidx.end ()) continue ;
338-
339- // use stored Stats to rebuild averages
340332 const auto curr_avg = compute_tensor_averages (stats_map.at (ts.tensor ));
341333 const auto prev_avg = compute_tensor_averages (stats_map.at (prev_lyr));
342334 if (curr_avg.empty () || prev_avg.empty () || curr_avg.size () != prev_avg.size ()) continue ;
343-
344335 auto & [curr, prev] = taggr[blk];
345336 curr.insert (curr.end (), curr_avg.begin (), curr_avg.end ());
346337 prev.insert (prev.end (), prev_avg.begin (), prev_avg.end ());
347338 }
348339
349- // compute cosine per layer
340+ // compute the cosine similarity between consecutive layers
350341 for (auto & kv : taggr) {
351342 const auto & curr = kv.second .curr_avg ;
352343 const auto & prev = kv.second .prev_avg ;
353344 if (curr.size () != prev.size () || curr.empty ()) continue ;
354345 float dot_prod = 0.0 , lyr1 = 0.0 , lyr2 = 0.0 ;
355346 for (size_t i = 0 ; i < curr.size (); ++i) {
356- const double a = curr[i], b = prev[i];
357- dot_prod += a*b ;
358- lyr1 += a*a ;
359- lyr2 += b*b ;
347+ float crr = curr[i], prv = prev[i];
348+ dot_prod += crr * prv ;
349+ lyr1 += crr * crr ;
350+ lyr2 += prv * prv ;
360351 }
361352 float cossim = 0 .0f ;
362353 if (lyr1 > 0.0 && lyr2 > 0.0 ) cossim = dot_prod / (std::sqrt (lyr1) * std::sqrt (lyr2));
0 commit comments