Generators.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "Generators.h"
  2. #include <cstdio>
  3. using mnd::Generator;
  4. using mnd::AdaptiveGenerator;
  5. Generator::~Generator(void)
  6. {
  7. }
  8. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen)
  9. {
  10. generators.insert({ 0.0000001, floatGen });
  11. generators.insert({ 0.0, doubleGen });
  12. }
  13. /*
  14. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen, Generator* quadGen)
  15. {
  16. generators.insert({ 0.0000001, floatGen });
  17. generators.insert({ 5.0e-16, doubleGen });
  18. generators.insert({ Real("1.0e-28"), quadGen });
  19. }*/
  20. void AdaptiveGenerator::addGenerator(const mnd::Real& precision, mnd::Generator& generator)
  21. {
  22. generators.insert({ precision, &generator });
  23. }
  24. void AdaptiveGenerator::addGenerator(mnd::Precision p, Generator& generator)
  25. {
  26. generators.insert({ getPrecision(p), &generator });
  27. }
  28. void AdaptiveGenerator::generate(const mnd::MandelInfo& info, float* data)
  29. {
  30. Real pixelW = info.view.width / info.bWidth;
  31. Real pixelH = info.view.height / info.bHeight;
  32. Real neededPrecision = pixelW < pixelH ? pixelW : pixelH;
  33. //Generator* toUse = nullptr;
  34. auto firstSmaller = generators.lower_bound(neededPrecision);
  35. if (firstSmaller != generators.end()) {
  36. //printf("use generator with precision: %s\n", mnd::toString(firstSmaller->first).c_str());
  37. //printf("gen: %p\n", firstSmaller->second);fflush(stdout);
  38. firstSmaller->second->generate(info, data);
  39. }
  40. else {
  41. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  42. data[s] = 0.0;
  43. }
  44. }
  45. return;
  46. /*
  47. int i = 0;
  48. for (auto [thresh, gen] : generators) {
  49. ++i;
  50. if (neededPrecision > thresh) {
  51. toUse = gen;
  52. }
  53. }
  54. if (toUse != nullptr) {
  55. toUse->generate(info, data);
  56. }
  57. else {
  58. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  59. data[s] = 0.0;
  60. }
  61. }*/
  62. }
  63. namespace mnd
  64. {
  65. Real getPrecision(Precision p)
  66. {
  67. static const std::map<Precision, Real> precs {
  68. { Precision::FLOAT, Real("1.0e-7") },
  69. { Precision::DOUBLE, Real("1.0e-15") },
  70. { Precision::DOUBLE_DOUBLE, Real("1.0e-29") },
  71. { Precision::QUAD_DOUBLE, Real("1.0e-56") },
  72. { Precision::FLOAT256, Real("1.0e-58") },
  73. { Precision::INF_PREC, Real(0.0) },
  74. };
  75. return precs.at(p);
  76. }
  77. }