1
0

Generators.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 Real& precision, Generator& generator)
  21. {
  22. generators.insert({ precision, &generator });
  23. }
  24. void AdaptiveGenerator::addGenerator(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. firstSmaller->second->generate(info, data);
  38. }
  39. else {
  40. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  41. data[s] = 0.0;
  42. }
  43. }
  44. return;
  45. /*
  46. int i = 0;
  47. for (auto [thresh, gen] : generators) {
  48. ++i;
  49. if (neededPrecision > thresh) {
  50. toUse = gen;
  51. }
  52. }
  53. if (toUse != nullptr) {
  54. toUse->generate(info, data);
  55. }
  56. else {
  57. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  58. data[s] = 0.0;
  59. }
  60. }*/
  61. }
  62. namespace mnd
  63. {
  64. Real getPrecision(Precision p)
  65. {
  66. static const std::map<Precision, Real> precs {
  67. { Precision::FLOAT, 1.0e-7 },
  68. { Precision::DOUBLE, 1.0e-15 },
  69. { Precision::DOUBLE_DOUBLE, Real("1.0e-29") },
  70. { Precision::QUAD_DOUBLE, Real("1.0e-56") },
  71. { Precision::FLOAT256, Real("1.0e-58") },
  72. { Precision::INFINITE, Real(0.0) },
  73. };
  74. return precs.at(p);
  75. }
  76. }