euler314 commited on
Commit
ebb13a2
·
verified ·
1 Parent(s): 8d4bb9f

Update app.cpp

Browse files
Files changed (1) hide show
  1. app.cpp +48 -12
app.cpp CHANGED
@@ -339,13 +339,31 @@ bool saveImSDataAsJSON(const std::string& filename,
339
  return false;
340
  }
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  // Start JSON object
343
  outfile << "{\n";
344
 
345
  // Write z values
346
  outfile << " \"z_values\": [";
347
  for (size_t i = 0; i < data[0].size(); ++i) {
348
- outfile << data[0][i];
349
  if (i < data[0].size() - 1) outfile << ", ";
350
  }
351
  outfile << "],\n";
@@ -353,7 +371,7 @@ bool saveImSDataAsJSON(const std::string& filename,
353
  // Write Im(s) values for first root
354
  outfile << " \"ims_values1\": [";
355
  for (size_t i = 0; i < data[1].size(); ++i) {
356
- outfile << data[1][i];
357
  if (i < data[1].size() - 1) outfile << ", ";
358
  }
359
  outfile << "],\n";
@@ -361,7 +379,7 @@ bool saveImSDataAsJSON(const std::string& filename,
361
  // Write Im(s) values for second root
362
  outfile << " \"ims_values2\": [";
363
  for (size_t i = 0; i < data[2].size(); ++i) {
364
- outfile << data[2][i];
365
  if (i < data[2].size() - 1) outfile << ", ";
366
  }
367
  outfile << "],\n";
@@ -369,7 +387,7 @@ bool saveImSDataAsJSON(const std::string& filename,
369
  // Write Im(s) values for third root
370
  outfile << " \"ims_values3\": [";
371
  for (size_t i = 0; i < data[3].size(); ++i) {
372
- outfile << data[3][i];
373
  if (i < data[3].size() - 1) outfile << ", ";
374
  }
375
  outfile << "],\n";
@@ -377,7 +395,7 @@ bool saveImSDataAsJSON(const std::string& filename,
377
  // Write Real(s) values for first root
378
  outfile << " \"real_values1\": [";
379
  for (size_t i = 0; i < data[4].size(); ++i) {
380
- outfile << data[4][i];
381
  if (i < data[4].size() - 1) outfile << ", ";
382
  }
383
  outfile << "],\n";
@@ -385,7 +403,7 @@ bool saveImSDataAsJSON(const std::string& filename,
385
  // Write Real(s) values for second root
386
  outfile << " \"real_values2\": [";
387
  for (size_t i = 0; i < data[5].size(); ++i) {
388
- outfile << data[5][i];
389
  if (i < data[5].size() - 1) outfile << ", ";
390
  }
391
  outfile << "],\n";
@@ -393,7 +411,7 @@ bool saveImSDataAsJSON(const std::string& filename,
393
  // Write Real(s) values for third root
394
  outfile << " \"real_values3\": [";
395
  for (size_t i = 0; i < data[6].size(); ++i) {
396
- outfile << data[6][i];
397
  if (i < data[6].size() - 1) outfile << ", ";
398
  }
399
  outfile << "]\n";
@@ -517,13 +535,31 @@ bool save_as_json(const std::string& filename,
517
  return false;
518
  }
519
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
520
  // Start JSON object
521
  outfile << "{\n";
522
 
523
  // Write beta values
524
  outfile << " \"beta_values\": [";
525
  for (size_t i = 0; i < beta_values.size(); ++i) {
526
- outfile << beta_values[i];
527
  if (i < beta_values.size() - 1) outfile << ", ";
528
  }
529
  outfile << "],\n";
@@ -531,7 +567,7 @@ bool save_as_json(const std::string& filename,
531
  // Write max eigenvalues
532
  outfile << " \"max_eigenvalues\": [";
533
  for (size_t i = 0; i < max_eigenvalues.size(); ++i) {
534
- outfile << max_eigenvalues[i];
535
  if (i < max_eigenvalues.size() - 1) outfile << ", ";
536
  }
537
  outfile << "],\n";
@@ -539,7 +575,7 @@ bool save_as_json(const std::string& filename,
539
  // Write min eigenvalues
540
  outfile << " \"min_eigenvalues\": [";
541
  for (size_t i = 0; i < min_eigenvalues.size(); ++i) {
542
- outfile << min_eigenvalues[i];
543
  if (i < min_eigenvalues.size() - 1) outfile << ", ";
544
  }
545
  outfile << "],\n";
@@ -547,7 +583,7 @@ bool save_as_json(const std::string& filename,
547
  // Write theoretical max values
548
  outfile << " \"theoretical_max\": [";
549
  for (size_t i = 0; i < theoretical_max_values.size(); ++i) {
550
- outfile << theoretical_max_values[i];
551
  if (i < theoretical_max_values.size() - 1) outfile << ", ";
552
  }
553
  outfile << "],\n";
@@ -555,7 +591,7 @@ bool save_as_json(const std::string& filename,
555
  // Write theoretical min values
556
  outfile << " \"theoretical_min\": [";
557
  for (size_t i = 0; i < theoretical_min_values.size(); ++i) {
558
- outfile << theoretical_min_values[i];
559
  if (i < theoretical_min_values.size() - 1) outfile << ", ";
560
  }
561
  outfile << "]\n";
 
339
  return false;
340
  }
341
 
342
+ // Helper function to format floating point values safely for JSON
343
+ auto formatJsonValue = [](double value) -> std::string {
344
+ if (std::isnan(value)) {
345
+ return "\"NaN\""; // JSON doesn't support NaN, so use string
346
+ } else if (std::isinf(value)) {
347
+ if (value > 0) {
348
+ return "\"Infinity\""; // JSON doesn't support Infinity, so use string
349
+ } else {
350
+ return "\"-Infinity\""; // JSON doesn't support -Infinity, so use string
351
+ }
352
+ } else {
353
+ // Use a fixed precision to avoid excessively long numbers
354
+ std::ostringstream oss;
355
+ oss << std::setprecision(15) << value;
356
+ return oss.str();
357
+ }
358
+ };
359
+
360
  // Start JSON object
361
  outfile << "{\n";
362
 
363
  // Write z values
364
  outfile << " \"z_values\": [";
365
  for (size_t i = 0; i < data[0].size(); ++i) {
366
+ outfile << formatJsonValue(data[0][i]);
367
  if (i < data[0].size() - 1) outfile << ", ";
368
  }
369
  outfile << "],\n";
 
371
  // Write Im(s) values for first root
372
  outfile << " \"ims_values1\": [";
373
  for (size_t i = 0; i < data[1].size(); ++i) {
374
+ outfile << formatJsonValue(data[1][i]);
375
  if (i < data[1].size() - 1) outfile << ", ";
376
  }
377
  outfile << "],\n";
 
379
  // Write Im(s) values for second root
380
  outfile << " \"ims_values2\": [";
381
  for (size_t i = 0; i < data[2].size(); ++i) {
382
+ outfile << formatJsonValue(data[2][i]);
383
  if (i < data[2].size() - 1) outfile << ", ";
384
  }
385
  outfile << "],\n";
 
387
  // Write Im(s) values for third root
388
  outfile << " \"ims_values3\": [";
389
  for (size_t i = 0; i < data[3].size(); ++i) {
390
+ outfile << formatJsonValue(data[3][i]);
391
  if (i < data[3].size() - 1) outfile << ", ";
392
  }
393
  outfile << "],\n";
 
395
  // Write Real(s) values for first root
396
  outfile << " \"real_values1\": [";
397
  for (size_t i = 0; i < data[4].size(); ++i) {
398
+ outfile << formatJsonValue(data[4][i]);
399
  if (i < data[4].size() - 1) outfile << ", ";
400
  }
401
  outfile << "],\n";
 
403
  // Write Real(s) values for second root
404
  outfile << " \"real_values2\": [";
405
  for (size_t i = 0; i < data[5].size(); ++i) {
406
+ outfile << formatJsonValue(data[5][i]);
407
  if (i < data[5].size() - 1) outfile << ", ";
408
  }
409
  outfile << "],\n";
 
411
  // Write Real(s) values for third root
412
  outfile << " \"real_values3\": [";
413
  for (size_t i = 0; i < data[6].size(); ++i) {
414
+ outfile << formatJsonValue(data[6][i]);
415
  if (i < data[6].size() - 1) outfile << ", ";
416
  }
417
  outfile << "]\n";
 
535
  return false;
536
  }
537
 
538
+ // Helper function to format floating point values safely for JSON
539
+ auto formatJsonValue = [](double value) -> std::string {
540
+ if (std::isnan(value)) {
541
+ return "\"NaN\""; // JSON doesn't support NaN, so use string
542
+ } else if (std::isinf(value)) {
543
+ if (value > 0) {
544
+ return "\"Infinity\""; // JSON doesn't support Infinity, so use string
545
+ } else {
546
+ return "\"-Infinity\""; // JSON doesn't support -Infinity, so use string
547
+ }
548
+ } else {
549
+ // Use a fixed precision to avoid excessively long numbers
550
+ std::ostringstream oss;
551
+ oss << std::setprecision(15) << value;
552
+ return oss.str();
553
+ }
554
+ };
555
+
556
  // Start JSON object
557
  outfile << "{\n";
558
 
559
  // Write beta values
560
  outfile << " \"beta_values\": [";
561
  for (size_t i = 0; i < beta_values.size(); ++i) {
562
+ outfile << formatJsonValue(beta_values[i]);
563
  if (i < beta_values.size() - 1) outfile << ", ";
564
  }
565
  outfile << "],\n";
 
567
  // Write max eigenvalues
568
  outfile << " \"max_eigenvalues\": [";
569
  for (size_t i = 0; i < max_eigenvalues.size(); ++i) {
570
+ outfile << formatJsonValue(max_eigenvalues[i]);
571
  if (i < max_eigenvalues.size() - 1) outfile << ", ";
572
  }
573
  outfile << "],\n";
 
575
  // Write min eigenvalues
576
  outfile << " \"min_eigenvalues\": [";
577
  for (size_t i = 0; i < min_eigenvalues.size(); ++i) {
578
+ outfile << formatJsonValue(min_eigenvalues[i]);
579
  if (i < min_eigenvalues.size() - 1) outfile << ", ";
580
  }
581
  outfile << "],\n";
 
583
  // Write theoretical max values
584
  outfile << " \"theoretical_max\": [";
585
  for (size_t i = 0; i < theoretical_max_values.size(); ++i) {
586
+ outfile << formatJsonValue(theoretical_max_values[i]);
587
  if (i < theoretical_max_values.size() - 1) outfile << ", ";
588
  }
589
  outfile << "],\n";
 
591
  // Write theoretical min values
592
  outfile << " \"theoretical_min\": [";
593
  for (size_t i = 0; i < theoretical_min_values.size(); ++i) {
594
+ outfile << formatJsonValue(theoretical_min_values[i]);
595
  if (i < theoretical_min_values.size() - 1) outfile << ", ";
596
  }
597
  outfile << "]\n";