@@ -298,12 +298,15 @@ static void compute_tensor_statistics(std::vector<tensor_statistics> & tstats) {
298298 }
299299
300300 // Compute Cosine Similarity
301+ float cs = 0 .0f ;
301302 if (norm1_sq > 0 .0f && norm2_sq > 0 .0f ) {
302- float cs = dot_prod / (std::sqrt (norm1_sq) * std::sqrt (norm2_sq));
303+ cs = dot_prod / (std::sqrt (norm1_sq) * std::sqrt (norm2_sq));
303304 cs = std::min (cs, 1 .0f );
304305 cs = std::max (cs, -1 .0f );
305- ts.cossim = cs;
306+ } else if (norm1_sq == 0 .0f && norm2_sq == 0 .0f ) {
307+ cs = 1 .0f ;
306308 }
309+ ts.cossim = cs;
307310
308311 // Compute L2 Norm (Euclidean Distance)
309312 ts.l2_norm = std::sqrt (l2_dist_sq);
@@ -332,45 +335,54 @@ static void compute_layer_statistics(const std::vector<tensor_statistics> & tsta
332335 const int blk = std::stoi (match[1 ]);
333336 if (blk <= 0 ) { continue ; }
334337 std::string prev_lyr (ts.tensor );
335- prev_lyr.replace (match.position (1 ), match.length (1 ), std::to_string (blk-1 ));
336- if (auto it_prev = tidx.find (prev_lyr); it_prev == tidx.end ()) { continue ; }
337- const auto curr_avg = compute_tensor_averages (stats_map.at (ts.tensor ));
338- const auto prev_avg = compute_tensor_averages (stats_map.at (prev_lyr));
338+ prev_lyr.replace (match.position (1 ), match.length (1 ), std::to_string (blk - 1 ));
339+ if (tidx.find (prev_lyr) == tidx.end ()) { continue ; }
340+ auto it_curr = stats_map.find (ts.tensor );
341+ auto it_prev = stats_map.find (prev_lyr);
342+ if (it_curr == stats_map.end () || it_prev == stats_map.end ()) { continue ; }
343+
344+ const auto curr_avg = compute_tensor_averages (it_curr->second );
345+ const auto prev_avg = compute_tensor_averages (it_prev->second );
339346 if (curr_avg.empty () || prev_avg.empty () || curr_avg.size () != prev_avg.size ()) { continue ; }
340- auto & [curr, prev] = agr[blk];
341- curr.insert (curr.end (), curr_avg.begin (), curr_avg.end ());
342- prev.insert (prev.end (), prev_avg.begin (), prev_avg.end ());
347+
348+ auto & entry = agr[blk];
349+ entry.curr_avg .insert (entry.curr_avg .end (), curr_avg.begin (), curr_avg.end ());
350+ entry.prev_avg .insert (entry.prev_avg .end (), prev_avg.begin (), prev_avg.end ());
343351 }
344352
345353 for (auto & kv : agr) {
346354 const auto & curr = kv.second .curr_avg ;
347355 const auto & prev = kv.second .prev_avg ;
348356 if (curr.size () != prev.size () || curr.empty ()) { continue ; }
349357
350- float dot_prod = 0 .0f ;
351- float norm1_sq = 0 .0f ;
352- float norm2_sq = 0 .0f ;
353- float l2_dist_sq = 0 .0f ;
358+ double dot_prod = 0.0 ;
359+ double norm1_sq = 0.0 ;
360+ double norm2_sq = 0.0 ;
361+ double l2_dist_sq = 0.0 ;
354362
355363 for (size_t i = 0 ; i < curr.size (); ++i) {
356- const float c_val = curr[i];
357- const float p_val = prev[i];
364+ const double c_val = curr[i];
365+ const double p_val = prev[i];
358366 dot_prod += c_val * p_val;
359367 norm1_sq += c_val * c_val;
360368 norm2_sq += p_val * p_val;
361- const float diff = c_val - p_val;
369+ const double diff = c_val - p_val;
362370 l2_dist_sq += diff * diff;
363371 }
364372
365373 // Compute aggregated Cosine Similarity
366374 float cossim = 0 .0f ;
367375 if (norm1_sq > 0 .0f && norm2_sq > 0 .0f ) {
368376 cossim = dot_prod / (std::sqrt (norm1_sq) * std::sqrt (norm2_sq));
377+ cossim = std::min (cossim, 1 .0f );
378+ cossim = std::max (cossim, -1 .0f );
379+ } else if (norm1_sq == 0 .0f && norm2_sq == 0 .0f ) {
380+ cossim = 1 .0f ;
369381 }
370382 layer_cossim[kv.first ] = cossim;
371383
372384 // Compute aggregated L2 Norm (Euclidean Distance)
373- layer_l2_norm[kv.first ] = std::sqrt (l2_dist_sq);
385+ layer_l2_norm[kv.first ] = ( float ) std::sqrt (l2_dist_sq);
374386 }
375387}
376388
@@ -1309,8 +1321,8 @@ static bool show_statistics(const common_params & params) {
13091321 float layer_zd = 0 .0f ;
13101322 int n = 0 ;
13111323 };
1312- std::map<int , layer_stats> ls;
13131324
1325+ std::map<int , layer_stats> ls;
13141326 LOG_INF (" \n Computing tensor statistics for %s (%d tensors)\n " , params.in_files [0 ].c_str (), static_cast <int >(ts.size ()));
13151327 LOG_INF (" \n %6s\t %18s\t %13s\t %8s\t %8s\t %7s\t %15s\t %13s\t %11s\t %8s\t %5s\t %10s\n " ,
13161328 " Layer" ,
@@ -1330,7 +1342,8 @@ static bool show_statistics(const common_params & params) {
13301342 " =============================================================\n " );
13311343
13321344 for (const auto & tstat : ts) {
1333- std::string layer, name;
1345+ std::string layer;
1346+ std::string name;
13341347 process_tensor_name (tstat.tensor , layer, name);
13351348
13361349 int blk;
0 commit comments