diff --git a/src/nvtt/CompressDXT.cpp b/src/nvtt/CompressDXT.cpp index 24e0cb7..8b3c74c 100644 --- a/src/nvtt/CompressDXT.cpp +++ b/src/nvtt/CompressDXT.cpp @@ -199,18 +199,6 @@ void nv::fastCompressBC5(const Image * image, const nvtt::OutputOptions::Private } -void nv::doPrecomputation() -{ - static bool done = false; // @@ Stop using statics for reentrancy. Although the worst that could happen is that this stuff is precomputed multiple times. - - if (!done) - { - done = true; - squish::FastClusterFit::DoPrecomputation(); - } -} - - void nv::compressDXT1(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) { const uint w = image->width(); @@ -219,8 +207,6 @@ void nv::compressDXT1(const Image * image, const OutputOptions::Private & output ColorBlock rgba; BlockDXT1 block; - doPrecomputation(); - //squish::WeightedClusterFit fit; //squish::ClusterFit fit; squish::FastClusterFit fit; @@ -363,8 +349,6 @@ void nv::compressDXT5n(const Image * image, const OutputOptions::Private & outpu ColorBlock rgba; BlockDXT5 block; - doPrecomputation(); - for (uint y = 0; y < h; y += 4) { for (uint x = 0; x < w; x += 4) { diff --git a/src/nvtt/Compressor.cpp b/src/nvtt/Compressor.cpp index beab2c3..c203700 100644 --- a/src/nvtt/Compressor.cpp +++ b/src/nvtt/Compressor.cpp @@ -725,7 +725,8 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio if (cudaEnabled) { nvDebugCheck(cudaSupported); - cuda->compressDXT1(image, compressionOptions, outputOptions); + cuda->setImage(image, inputOptions.alphaMode); + cuda->compressDXT1(compressionOptions, outputOptions); } else { @@ -757,7 +758,8 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio if (cudaEnabled) { nvDebugCheck(cudaSupported); - cuda->compressDXT1n(image, compressionOptions, outputOptions); + cuda->setImage(image, inputOptions.alphaMode); + cuda->compressDXT1n(compressionOptions, outputOptions); } else { @@ -775,7 +777,8 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio if (cudaEnabled) { nvDebugCheck(cudaSupported); - cuda->compressDXT3(image, inputOptions, compressionOptions, outputOptions); + cuda->setImage(image, inputOptions.alphaMode); + cuda->compressDXT3(compressionOptions, outputOptions); } else { @@ -794,7 +797,8 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio if (cudaEnabled) { nvDebugCheck(cudaSupported); - cuda->compressDXT5(image, inputOptions, compressionOptions, outputOptions); + cuda->setImage(image, inputOptions.alphaMode); + cuda->compressDXT5(compressionOptions, outputOptions); } else { @@ -826,7 +830,8 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio if (cudaEnabled) { nvDebugCheck(cudaSupported); - cuda->compressCTX1(image, compressionOptions, outputOptions); + cuda->setImage(image, inputOptions.alphaMode); + cuda->compressCTX1(compressionOptions, outputOptions); } else { diff --git a/src/nvtt/cuda/CudaCompressDXT.cpp b/src/nvtt/cuda/CudaCompressDXT.cpp index 6119756..d63c10b 100644 --- a/src/nvtt/cuda/CudaCompressDXT.cpp +++ b/src/nvtt/cuda/CudaCompressDXT.cpp @@ -213,21 +213,27 @@ void CudaCompressor::compressKernel(CudaCompressionKernel * kernel) #endif // 0 +void CudaCompressor::setImage(const Image * image, nvtt::AlphaMode alphaMode) +{ + m_image = image; + m_alphaMode = alphaMode; +} + /// Compress image using CUDA. -void CudaCompressor::compressDXT1(const Image * image, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) +void CudaCompressor::compressDXT1(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) { nvDebugCheck(cuda::isHardwarePresent()); #if defined HAVE_CUDA // Image size in blocks. - const uint w = (image->width() + 3) / 4; - const uint h = (image->height() + 3) / 4; + const uint w = (m_image->width() + 3) / 4; + const uint h = (m_image->height() + 3) / 4; uint imageSize = w * h * 16 * sizeof(Color32); uint * blockLinearImage = (uint *) malloc(imageSize); - convertToBlockLinear(image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! + convertToBlockLinear(m_image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! const uint blockNum = w * h; const uint compressedSize = blockNum * 8; @@ -286,18 +292,18 @@ void CudaCompressor::compressDXT1(const Image * image, const CompressionOptions: /// Compress image using CUDA. -void CudaCompressor::compressDXT3(const Image * image, const InputOptions::Private & inputOptions, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) +void CudaCompressor::compressDXT3(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) { nvDebugCheck(cuda::isHardwarePresent()); #if defined HAVE_CUDA // Image size in blocks. - const uint w = (image->width() + 3) / 4; - const uint h = (image->height() + 3) / 4; + const uint w = (m_image->width() + 3) / 4; + const uint h = (m_image->height() + 3) / 4; uint imageSize = w * h * 16 * sizeof(Color32); uint * blockLinearImage = (uint *) malloc(imageSize); - convertToBlockLinear(image, blockLinearImage); + convertToBlockLinear(m_image, blockLinearImage); const uint blockNum = w * h; const uint compressedSize = blockNum * 8; @@ -370,18 +376,18 @@ void CudaCompressor::compressDXT3(const Image * image, const InputOptions::Priva /// Compress image using CUDA. -void CudaCompressor::compressDXT5(const Image * image, const InputOptions::Private & inputOptions, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) +void CudaCompressor::compressDXT5(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) { nvDebugCheck(cuda::isHardwarePresent()); #if defined HAVE_CUDA // Image size in blocks. - const uint w = (image->width() + 3) / 4; - const uint h = (image->height() + 3) / 4; + const uint w = (m_image->width() + 3) / 4; + const uint h = (m_image->height() + 3) / 4; uint imageSize = w * h * 16 * sizeof(Color32); uint * blockLinearImage = (uint *) malloc(imageSize); - convertToBlockLinear(image, blockLinearImage); + convertToBlockLinear(m_image, blockLinearImage); const uint blockNum = w * h; const uint compressedSize = blockNum * 8; @@ -453,18 +459,18 @@ void CudaCompressor::compressDXT5(const Image * image, const InputOptions::Priva } -void CudaCompressor::compressDXT1n(const Image * image, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions) +void CudaCompressor::compressDXT1n(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions) { nvDebugCheck(cuda::isHardwarePresent()); #if defined HAVE_CUDA // Image size in blocks. - const uint w = (image->width() + 3) / 4; - const uint h = (image->height() + 3) / 4; + const uint w = (m_image->width() + 3) / 4; + const uint h = (m_image->height() + 3) / 4; uint imageSize = w * h * 16 * sizeof(Color32); uint * blockLinearImage = (uint *) malloc(imageSize); - convertToBlockLinear(image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! + convertToBlockLinear(m_image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! const uint blockNum = w * h; const uint compressedSize = blockNum * 8; @@ -522,18 +528,18 @@ void CudaCompressor::compressDXT1n(const Image * image, const nvtt::CompressionO } -void CudaCompressor::compressCTX1(const Image * image, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions) +void CudaCompressor::compressCTX1(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions) { nvDebugCheck(cuda::isHardwarePresent()); #if defined HAVE_CUDA // Image size in blocks. - const uint w = (image->width() + 3) / 4; - const uint h = (image->height() + 3) / 4; + const uint w = (m_image->width() + 3) / 4; + const uint h = (m_image->height() + 3) / 4; uint imageSize = w * h * 16 * sizeof(Color32); uint * blockLinearImage = (uint *) malloc(imageSize); - convertToBlockLinear(image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! + convertToBlockLinear(m_image, blockLinearImage); // @@ Do this in parallel with the GPU, or in the GPU! const uint blockNum = w * h; const uint compressedSize = blockNum * 8; @@ -590,186 +596,3 @@ void CudaCompressor::compressCTX1(const Image * image, const nvtt::CompressionOp #endif } - - -#if 0 - -class Task -{ -public: - explicit Task(uint numBlocks) : blockMaxCount(numBlocks), blockCount(0) - { - // System memory allocations. - blockLinearImage = new uint[blockMaxCount * 16]; - xrefs = new uint[blockMaxCount * 16]; - - // Device memory allocations. - cudaMalloc((void**) &d_blockLinearImage, blockMaxCount * 16 * sizeof(uint)); - cudaMalloc((void**) &d_compressedImage, blockMaxCount * 8U); - - // @@ Check for allocation errors. - } - - ~Task() - { - delete [] blockLinearImage; - delete [] xrefs; - - cudaFree(d_blockLinearImage); - cudaFree(d_compressedImage); - } - - - - void addColorBlock(const ColorBlock & rgba) - { - nvDebugCheck(!isFull()); - - // @@ Count unique colors? - /* - // Convert colors to vectors. - Array pointArray(16); - - for(int i = 0; i < 16; i++) { - const Color32 color = rgba.color(i); - pointArray.append(Vector3(color.r, color.g, color.b)); - } - - // Find best fit line. - const Vector3 axis = Fit::bestLine(pointArray).direction(); - - // Project points to axis. - float dps[16]; - uint * order = &xrefs[blockCount * 16]; - - for (uint i = 0; i < 16; ++i) - { - dps[i] = dot(pointArray[i], axis); - order[i] = i; - } - - // Sort them. - for (uint i = 0; i < 16; ++i) - { - for (uint j = i; j > 0 && dps[j] < dps[j - 1]; --j) - { - swap(dps[j], dps[j - 1]); - swap(order[j], order[j - 1]); - } - } - */ - // Write sorted colors to blockLinearImage. - for(uint i = 0; i < 16; ++i) - { - // blockLinearImage[blockCount * 16 + i] = rgba.color(order[i]); - blockLinearImage[blockCount * 16 + i] = rgba.color(i); - } - - ++blockCount; - } - - bool isFull() - { - nvDebugCheck(blockCount <= blockMaxCount); - return blockCount == blockMaxCount; - } - - void flush(const OutputOptions::Private & outputOptions) - { - if (blockCount == 0) - { - // Nothing to do. - return; - } - - // Copy input color blocks. - cudaMemcpy(d_blockLinearImage, blockLinearImage, blockCount * 64, cudaMemcpyHostToDevice); - - // Launch kernel. - compressKernelDXT1(blockCount, d_blockLinearImage, d_compressedImage, d_bitmaps); - - // Check for errors. - cudaError_t err = cudaGetLastError(); - if (err != cudaSuccess) - { - nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } - } - - // Copy result to host, overwrite swizzled image. - uint * compressedImage = blockLinearImage; - cudaMemcpy(compressedImage, d_compressedImage, blockCount * 8, cudaMemcpyDeviceToHost); - - // @@ Sort block indices. - - // Output result. - if (outputOptions.outputHandler != NULL) - { - // outputOptions.outputHandler->writeData(compressedImage, blockCount * 8); - } - - blockCount = 0; - } - -private: - - const uint blockMaxCount; - uint blockCount; - - uint * blockLinearImage; - uint * xrefs; - - uint * d_blockLinearImage; - uint * d_compressedImage; - -}; - - -void nv::cudaCompressDXT1_2(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) -{ -#if defined HAVE_CUDA - const uint w = image->width(); - const uint h = image->height(); - - const uint blockNum = ((w + 3) / 4) * ((h + 3) / 4); - const uint blockMax = 32768; // 49152, 65535 - - setupCompressKernelDXT1(compressionOptions.colorWeight.ptr()); - - ColorBlock rgba; - Task task(min(blockNum, blockMax)); - - clock_t start = clock(); - - for (uint y = 0; y < h; y += 4) { - for (uint x = 0; x < w; x += 4) { - - rgba.init(image, x, y); - - task.addColorBlock(rgba); - - if (task.isFull()) - { - task.flush(outputOptions); - } - } - } - - task.flush(outputOptions); - - clock_t end = clock(); - printf("\rCUDA time taken: %.3f seconds\n", float(end-start) / CLOCKS_PER_SEC); - -#else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } -#endif -} - -#endif // 0 diff --git a/src/nvtt/cuda/CudaCompressDXT.h b/src/nvtt/cuda/CudaCompressDXT.h index fee5f10..5fbccde 100644 --- a/src/nvtt/cuda/CudaCompressDXT.h +++ b/src/nvtt/cuda/CudaCompressDXT.h @@ -39,17 +39,22 @@ namespace nv bool isValid() const; - void compressDXT1(const Image * image, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); - void compressDXT3(const Image * image, const nvtt::InputOptions::Private & inputOptions, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); - void compressDXT5(const Image * image, const nvtt::InputOptions::Private & inputOptions, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); - void compressDXT1n(const Image * image, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); - void compressCTX1(const Image * image, const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); + void setImage(const Image * image, nvtt::AlphaMode alphaMode); + + void compressDXT1(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); + void compressDXT3(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); + void compressDXT5(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); + void compressDXT1n(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); + void compressCTX1(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions); private: uint * m_bitmapTable; uint * m_data; uint * m_result; + + const Image * m_image; + nvtt::AlphaMode m_alphaMode; }; } // nv namespace diff --git a/src/nvtt/squish/extra/squishgen2.cpp b/src/nvtt/squish/extra/squishgen2.cpp new file mode 100644 index 0000000..a108bdf --- /dev/null +++ b/src/nvtt/squish/extra/squishgen2.cpp @@ -0,0 +1,113 @@ +/* ----------------------------------------------------------------------------- + + Copyright (c) 2006 Simon Brown si@sjbrown.co.uk + Copyright (c) 2008 Ignacio Castano castano@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + -------------------------------------------------------------------------- */ + +#include +#include +#include + +struct Precomp { + float alpha2_sum; + float beta2_sum; + float alphabeta_sum; + float factor; +}; + + +int main() +{ + int i = 0; + + printf("struct Precomp {\n"); + printf("\tfloat alpha2_sum;\n"); + printf("\tfloat beta2_sum;\n"); + printf("\tfloat alphabeta_sum;\n"); + printf("\tfloat factor;\n"); + printf("};\n\n"); + + printf("static const SQUISH_ALIGN_16 Precomp s_threeElement[153] = {\n"); + + // Three element clusters: + for( int c0 = 0; c0 <= 16; c0++) // At least two clusters. + { + for( int c1 = 0; c1 <= 16-c0; c1++) + { + int c2 = 16 - c0 - c1; + + Precomp p; + p.alpha2_sum = c0 + c1 * 0.25f; + p.beta2_sum = c2 + c1 * 0.25f; + p.alphabeta_sum = c1 * 0.25f; + p.factor = 1.0f / (p.alpha2_sum * p.beta2_sum - p.alphabeta_sum * p.alphabeta_sum); + + if (isfinite(p.factor)) + { + printf("\t{ %f, %f, %f, %f }, // %d (%d %d %d)\n", p.alpha2_sum, p.beta2_sum, p.alphabeta_sum, p.factor, i, c0, c1, c2); + } + else + { + printf("\t{ %f, %f, %f, INFINITY }, // %d (%d %d %d)\n", p.alpha2_sum, p.beta2_sum, p.alphabeta_sum, i, c0, c1, c2); + } + + i++; + } + } + printf("}; // %d three cluster elements\n\n", i); + + printf("static const SQUISH_ALIGN_16 Precomp s_fourElement[969] = {\n"); + + // Four element clusters: + i = 0; + for( int c0 = 0; c0 <= 16; c0++) + { + for( int c1 = 0; c1 <= 16-c0; c1++) + { + for( int c2 = 0; c2 <= 16-c0-c1; c2++) + { + int c3 = 16 - c0 - c1 - c2; + + Precomp p; + p.alpha2_sum = c0 + c1 * (4.0f/9.0f) + c2 * (1.0f/9.0f); + p.beta2_sum = c3 + c2 * (4.0f/9.0f) + c1 * (1.0f/9.0f); + p.alphabeta_sum = (c1 + c2) * (2.0f/9.0f); + p.factor = 1.0f / (p.alpha2_sum * p.beta2_sum - p.alphabeta_sum * p.alphabeta_sum); + + if (isfinite(p.factor)) + { + printf("\t{ %f, %f, %f, %f }, // %d (%d %d %d %d)\n", p.alpha2_sum, p.beta2_sum, p.alphabeta_sum, p.factor, i, c0, c1, c2, c3); + } + else + { + printf("\t{ %f, %f, %f, INFINITY }, // %d (%d %d %d %d)\n", p.alpha2_sum, p.beta2_sum, p.alphabeta_sum, i, c0, c1, c2, c3); + } + + i++; + } + } + } + printf("}; // %d four cluster elements\n\n", i); + + return 0; +} diff --git a/src/nvtt/squish/fastclusterfit.cpp b/src/nvtt/squish/fastclusterfit.cpp index c65cfb2..8ae8ab5 100644 --- a/src/nvtt/squish/fastclusterfit.cpp +++ b/src/nvtt/squish/fastclusterfit.cpp @@ -29,6 +29,8 @@ #include "colourblock.h" #include +#include "fastclusterlookup.inl" + namespace squish { FastClusterFit::FastClusterFit() @@ -97,91 +99,6 @@ void FastClusterFit::SetColourSet( ColourSet const* colours, int flags ) } -struct Precomp { - float alpha2_sum; - float beta2_sum; - float alphabeta_sum; - float factor; -}; - -static SQUISH_ALIGN_16 Precomp s_threeElement[153]; -static SQUISH_ALIGN_16 Precomp s_fourElement[969]; - -void FastClusterFit::DoPrecomputation() -{ - int i = 0; - - // Three element clusters: - for( int c0 = 0; c0 <= 16; c0++) // At least two clusters. - { - for( int c1 = 0; c1 <= 16-c0; c1++) - { - int c2 = 16 - c0 - c1; - - /*if (c2 == 16) { - // a = b = x2 / 16 - s_threeElement[i].alpha2_sum = 0; - s_threeElement[i].beta2_sum = 16; - s_threeElement[i].alphabeta_sum = -16; - s_threeElement[i].factor = 1.0f / 256.0f; - } - else if (c0 == 16) { - // a = b = x0 / 16 - s_threeElement[i].alpha2_sum = 16; - s_threeElement[i].beta2_sum = 0; - s_threeElement[i].alphabeta_sum = -16; - s_threeElement[i].factor = 1.0f / 256.0f; - } - else*/ { - s_threeElement[i].alpha2_sum = c0 + c1 * 0.25f; - s_threeElement[i].beta2_sum = c2 + c1 * 0.25f; - s_threeElement[i].alphabeta_sum = c1 * 0.25f; - s_threeElement[i].factor = 1.0f / (s_threeElement[i].alpha2_sum * s_threeElement[i].beta2_sum - s_threeElement[i].alphabeta_sum * s_threeElement[i].alphabeta_sum); - } - - i++; - } - } - //printf("%d three cluster elements\n", i); - - // Four element clusters: - i = 0; - for( int c0 = 0; c0 <= 16; c0++) - { - for( int c1 = 0; c1 <= 16-c0; c1++) - { - for( int c2 = 0; c2 <= 16-c0-c1; c2++) - { - int c3 = 16 - c0 - c1 - c2; - - /*if (c3 == 16) { - // a = b = x3 / 16 - s_fourElement[i].alpha2_sum = 16.0f; - s_fourElement[i].beta2_sum = 0.0f; - s_fourElement[i].alphabeta_sum = -16.0f; - s_fourElement[i].factor = 1.0f / 256.0f; - } - else if (c0 == 16) { - // a = b = x0 / 16 - s_fourElement[i].alpha2_sum = 0.0f; - s_fourElement[i].beta2_sum = 16.0f; - s_fourElement[i].alphabeta_sum = -16.0f; - s_fourElement[i].factor = 1.0f / 256.0f; - } - else*/ { - s_fourElement[i].alpha2_sum = c0 + c1 * (4.0f/9.0f) + c2 * (1.0f/9.0f); - s_fourElement[i].beta2_sum = c3 + c2 * (4.0f/9.0f) + c1 * (1.0f/9.0f); - s_fourElement[i].alphabeta_sum = (c1 + c2) * (2.0f/9.0f); - s_fourElement[i].factor = 1.0f / (s_fourElement[i].alpha2_sum * s_fourElement[i].beta2_sum - s_fourElement[i].alphabeta_sum * s_fourElement[i].alphabeta_sum); - } - - i++; - } - } - } - //printf("%d four cluster elements\n", i); -} - void FastClusterFit::SetMetric(float r, float g, float b) { #if SQUISH_USE_SIMD diff --git a/src/nvtt/squish/fastclusterfit.h b/src/nvtt/squish/fastclusterfit.h index 5faf7ac..d0ed971 100644 --- a/src/nvtt/squish/fastclusterfit.h +++ b/src/nvtt/squish/fastclusterfit.h @@ -44,8 +44,6 @@ public: void SetMetric(float r, float g, float b); float GetBestError() const; - static void DoPrecomputation(); - // Make them public virtual void Compress3( void* block ); virtual void Compress4( void* block ); diff --git a/src/nvtt/squish/fastclusterlookup.inl b/src/nvtt/squish/fastclusterlookup.inl new file mode 100644 index 0000000..e3c9c5a --- /dev/null +++ b/src/nvtt/squish/fastclusterlookup.inl @@ -0,0 +1,1135 @@ +struct Precomp { + float alpha2_sum; + float beta2_sum; + float alphabeta_sum; + float factor; +}; + +static const SQUISH_ALIGN_16 Precomp s_threeElement[153] = { + { 0.000000, 16.000000, 0.000000, INFINITY }, // 0 (0 0 16) + { 0.250000, 15.250000, 0.250000, 0.266667 }, // 1 (0 1 15) + { 0.500000, 14.500000, 0.500000, 0.142857 }, // 2 (0 2 14) + { 0.750000, 13.750000, 0.750000, 0.102564 }, // 3 (0 3 13) + { 1.000000, 13.000000, 1.000000, 0.083333 }, // 4 (0 4 12) + { 1.250000, 12.250000, 1.250000, 0.072727 }, // 5 (0 5 11) + { 1.500000, 11.500000, 1.500000, 0.066667 }, // 6 (0 6 10) + { 1.750000, 10.750000, 1.750000, 0.063492 }, // 7 (0 7 9) + { 2.000000, 10.000000, 2.000000, 0.062500 }, // 8 (0 8 8) + { 2.250000, 9.250000, 2.250000, 0.063492 }, // 9 (0 9 7) + { 2.500000, 8.500000, 2.500000, 0.066667 }, // 10 (0 10 6) + { 2.750000, 7.750000, 2.750000, 0.072727 }, // 11 (0 11 5) + { 3.000000, 7.000000, 3.000000, 0.083333 }, // 12 (0 12 4) + { 3.250000, 6.250000, 3.250000, 0.102564 }, // 13 (0 13 3) + { 3.500000, 5.500000, 3.500000, 0.142857 }, // 14 (0 14 2) + { 3.750000, 4.750000, 3.750000, 0.266667 }, // 15 (0 15 1) + { 4.000000, 4.000000, 4.000000, INFINITY }, // 16 (0 16 0) + { 1.000000, 15.000000, 0.000000, 0.066667 }, // 17 (1 0 15) + { 1.250000, 14.250000, 0.250000, 0.056338 }, // 18 (1 1 14) + { 1.500000, 13.500000, 0.500000, 0.050000 }, // 19 (1 2 13) + { 1.750000, 12.750000, 0.750000, 0.045977 }, // 20 (1 3 12) + { 2.000000, 12.000000, 1.000000, 0.043478 }, // 21 (1 4 11) + { 2.250000, 11.250000, 1.250000, 0.042105 }, // 22 (1 5 10) + { 2.500000, 10.500000, 1.500000, 0.041667 }, // 23 (1 6 9) + { 2.750000, 9.750000, 1.750000, 0.042105 }, // 24 (1 7 8) + { 3.000000, 9.000000, 2.000000, 0.043478 }, // 25 (1 8 7) + { 3.250000, 8.250000, 2.250000, 0.045977 }, // 26 (1 9 6) + { 3.500000, 7.500000, 2.500000, 0.050000 }, // 27 (1 10 5) + { 3.750000, 6.750000, 2.750000, 0.056338 }, // 28 (1 11 4) + { 4.000000, 6.000000, 3.000000, 0.066667 }, // 29 (1 12 3) + { 4.250000, 5.250000, 3.250000, 0.085106 }, // 30 (1 13 2) + { 4.500000, 4.500000, 3.500000, 0.125000 }, // 31 (1 14 1) + { 4.750000, 3.750000, 3.750000, 0.266667 }, // 32 (1 15 0) + { 2.000000, 14.000000, 0.000000, 0.035714 }, // 33 (2 0 14) + { 2.250000, 13.250000, 0.250000, 0.033613 }, // 34 (2 1 13) + { 2.500000, 12.500000, 0.500000, 0.032258 }, // 35 (2 2 12) + { 2.750000, 11.750000, 0.750000, 0.031496 }, // 36 (2 3 11) + { 3.000000, 11.000000, 1.000000, 0.031250 }, // 37 (2 4 10) + { 3.250000, 10.250000, 1.250000, 0.031496 }, // 38 (2 5 9) + { 3.500000, 9.500000, 1.500000, 0.032258 }, // 39 (2 6 8) + { 3.750000, 8.750000, 1.750000, 0.033613 }, // 40 (2 7 7) + { 4.000000, 8.000000, 2.000000, 0.035714 }, // 41 (2 8 6) + { 4.250000, 7.250000, 2.250000, 0.038835 }, // 42 (2 9 5) + { 4.500000, 6.500000, 2.500000, 0.043478 }, // 43 (2 10 4) + { 4.750000, 5.750000, 2.750000, 0.050633 }, // 44 (2 11 3) + { 5.000000, 5.000000, 3.000000, 0.062500 }, // 45 (2 12 2) + { 5.250000, 4.250000, 3.250000, 0.085106 }, // 46 (2 13 1) + { 5.500000, 3.500000, 3.500000, 0.142857 }, // 47 (2 14 0) + { 3.000000, 13.000000, 0.000000, 0.025641 }, // 48 (3 0 13) + { 3.250000, 12.250000, 0.250000, 0.025157 }, // 49 (3 1 12) + { 3.500000, 11.500000, 0.500000, 0.025000 }, // 50 (3 2 11) + { 3.750000, 10.750000, 0.750000, 0.025157 }, // 51 (3 3 10) + { 4.000000, 10.000000, 1.000000, 0.025641 }, // 52 (3 4 9) + { 4.250000, 9.250000, 1.250000, 0.026490 }, // 53 (3 5 8) + { 4.500000, 8.500000, 1.500000, 0.027778 }, // 54 (3 6 7) + { 4.750000, 7.750000, 1.750000, 0.029630 }, // 55 (3 7 6) + { 5.000000, 7.000000, 2.000000, 0.032258 }, // 56 (3 8 5) + { 5.250000, 6.250000, 2.250000, 0.036036 }, // 57 (3 9 4) + { 5.500000, 5.500000, 2.500000, 0.041667 }, // 58 (3 10 3) + { 5.750000, 4.750000, 2.750000, 0.050633 }, // 59 (3 11 2) + { 6.000000, 4.000000, 3.000000, 0.066667 }, // 60 (3 12 1) + { 6.250000, 3.250000, 3.250000, 0.102564 }, // 61 (3 13 0) + { 4.000000, 12.000000, 0.000000, 0.020833 }, // 62 (4 0 12) + { 4.250000, 11.250000, 0.250000, 0.020942 }, // 63 (4 1 11) + { 4.500000, 10.500000, 0.500000, 0.021277 }, // 64 (4 2 10) + { 4.750000, 9.750000, 0.750000, 0.021858 }, // 65 (4 3 9) + { 5.000000, 9.000000, 1.000000, 0.022727 }, // 66 (4 4 8) + { 5.250000, 8.250000, 1.250000, 0.023952 }, // 67 (4 5 7) + { 5.500000, 7.500000, 1.500000, 0.025641 }, // 68 (4 6 6) + { 5.750000, 6.750000, 1.750000, 0.027972 }, // 69 (4 7 5) + { 6.000000, 6.000000, 2.000000, 0.031250 }, // 70 (4 8 4) + { 6.250000, 5.250000, 2.250000, 0.036036 }, // 71 (4 9 3) + { 6.500000, 4.500000, 2.500000, 0.043478 }, // 72 (4 10 2) + { 6.750000, 3.750000, 2.750000, 0.056338 }, // 73 (4 11 1) + { 7.000000, 3.000000, 3.000000, 0.083333 }, // 74 (4 12 0) + { 5.000000, 11.000000, 0.000000, 0.018182 }, // 75 (5 0 11) + { 5.250000, 10.250000, 0.250000, 0.018605 }, // 76 (5 1 10) + { 5.500000, 9.500000, 0.500000, 0.019231 }, // 77 (5 2 9) + { 5.750000, 8.750000, 0.750000, 0.020101 }, // 78 (5 3 8) + { 6.000000, 8.000000, 1.000000, 0.021277 }, // 79 (5 4 7) + { 6.250000, 7.250000, 1.250000, 0.022857 }, // 80 (5 5 6) + { 6.500000, 6.500000, 1.500000, 0.025000 }, // 81 (5 6 5) + { 6.750000, 5.750000, 1.750000, 0.027972 }, // 82 (5 7 4) + { 7.000000, 5.000000, 2.000000, 0.032258 }, // 83 (5 8 3) + { 7.250000, 4.250000, 2.250000, 0.038835 }, // 84 (5 9 2) + { 7.500000, 3.500000, 2.500000, 0.050000 }, // 85 (5 10 1) + { 7.750000, 2.750000, 2.750000, 0.072727 }, // 86 (5 11 0) + { 6.000000, 10.000000, 0.000000, 0.016667 }, // 87 (6 0 10) + { 6.250000, 9.250000, 0.250000, 0.017316 }, // 88 (6 1 9) + { 6.500000, 8.500000, 0.500000, 0.018182 }, // 89 (6 2 8) + { 6.750000, 7.750000, 0.750000, 0.019324 }, // 90 (6 3 7) + { 7.000000, 7.000000, 1.000000, 0.020833 }, // 91 (6 4 6) + { 7.250000, 6.250000, 1.250000, 0.022857 }, // 92 (6 5 5) + { 7.500000, 5.500000, 1.500000, 0.025641 }, // 93 (6 6 4) + { 7.750000, 4.750000, 1.750000, 0.029630 }, // 94 (6 7 3) + { 8.000000, 4.000000, 2.000000, 0.035714 }, // 95 (6 8 2) + { 8.250000, 3.250000, 2.250000, 0.045977 }, // 96 (6 9 1) + { 8.500000, 2.500000, 2.500000, 0.066667 }, // 97 (6 10 0) + { 7.000000, 9.000000, 0.000000, 0.015873 }, // 98 (7 0 9) + { 7.250000, 8.250000, 0.250000, 0.016736 }, // 99 (7 1 8) + { 7.500000, 7.500000, 0.500000, 0.017857 }, // 100 (7 2 7) + { 7.750000, 6.750000, 0.750000, 0.019324 }, // 101 (7 3 6) + { 8.000000, 6.000000, 1.000000, 0.021277 }, // 102 (7 4 5) + { 8.250000, 5.250000, 1.250000, 0.023952 }, // 103 (7 5 4) + { 8.500000, 4.500000, 1.500000, 0.027778 }, // 104 (7 6 3) + { 8.750000, 3.750000, 1.750000, 0.033613 }, // 105 (7 7 2) + { 9.000000, 3.000000, 2.000000, 0.043478 }, // 106 (7 8 1) + { 9.250000, 2.250000, 2.250000, 0.063492 }, // 107 (7 9 0) + { 8.000000, 8.000000, 0.000000, 0.015625 }, // 108 (8 0 8) + { 8.250000, 7.250000, 0.250000, 0.016736 }, // 109 (8 1 7) + { 8.500000, 6.500000, 0.500000, 0.018182 }, // 110 (8 2 6) + { 8.750000, 5.750000, 0.750000, 0.020101 }, // 111 (8 3 5) + { 9.000000, 5.000000, 1.000000, 0.022727 }, // 112 (8 4 4) + { 9.250000, 4.250000, 1.250000, 0.026490 }, // 113 (8 5 3) + { 9.500000, 3.500000, 1.500000, 0.032258 }, // 114 (8 6 2) + { 9.750000, 2.750000, 1.750000, 0.042105 }, // 115 (8 7 1) + { 10.000000, 2.000000, 2.000000, 0.062500 }, // 116 (8 8 0) + { 9.000000, 7.000000, 0.000000, 0.015873 }, // 117 (9 0 7) + { 9.250000, 6.250000, 0.250000, 0.017316 }, // 118 (9 1 6) + { 9.500000, 5.500000, 0.500000, 0.019231 }, // 119 (9 2 5) + { 9.750000, 4.750000, 0.750000, 0.021858 }, // 120 (9 3 4) + { 10.000000, 4.000000, 1.000000, 0.025641 }, // 121 (9 4 3) + { 10.250000, 3.250000, 1.250000, 0.031496 }, // 122 (9 5 2) + { 10.500000, 2.500000, 1.500000, 0.041667 }, // 123 (9 6 1) + { 10.750000, 1.750000, 1.750000, 0.063492 }, // 124 (9 7 0) + { 10.000000, 6.000000, 0.000000, 0.016667 }, // 125 (10 0 6) + { 10.250000, 5.250000, 0.250000, 0.018605 }, // 126 (10 1 5) + { 10.500000, 4.500000, 0.500000, 0.021277 }, // 127 (10 2 4) + { 10.750000, 3.750000, 0.750000, 0.025157 }, // 128 (10 3 3) + { 11.000000, 3.000000, 1.000000, 0.031250 }, // 129 (10 4 2) + { 11.250000, 2.250000, 1.250000, 0.042105 }, // 130 (10 5 1) + { 11.500000, 1.500000, 1.500000, 0.066667 }, // 131 (10 6 0) + { 11.000000, 5.000000, 0.000000, 0.018182 }, // 132 (11 0 5) + { 11.250000, 4.250000, 0.250000, 0.020942 }, // 133 (11 1 4) + { 11.500000, 3.500000, 0.500000, 0.025000 }, // 134 (11 2 3) + { 11.750000, 2.750000, 0.750000, 0.031496 }, // 135 (11 3 2) + { 12.000000, 2.000000, 1.000000, 0.043478 }, // 136 (11 4 1) + { 12.250000, 1.250000, 1.250000, 0.072727 }, // 137 (11 5 0) + { 12.000000, 4.000000, 0.000000, 0.020833 }, // 138 (12 0 4) + { 12.250000, 3.250000, 0.250000, 0.025157 }, // 139 (12 1 3) + { 12.500000, 2.500000, 0.500000, 0.032258 }, // 140 (12 2 2) + { 12.750000, 1.750000, 0.750000, 0.045977 }, // 141 (12 3 1) + { 13.000000, 1.000000, 1.000000, 0.083333 }, // 142 (12 4 0) + { 13.000000, 3.000000, 0.000000, 0.025641 }, // 143 (13 0 3) + { 13.250000, 2.250000, 0.250000, 0.033613 }, // 144 (13 1 2) + { 13.500000, 1.500000, 0.500000, 0.050000 }, // 145 (13 2 1) + { 13.750000, 0.750000, 0.750000, 0.102564 }, // 146 (13 3 0) + { 14.000000, 2.000000, 0.000000, 0.035714 }, // 147 (14 0 2) + { 14.250000, 1.250000, 0.250000, 0.056338 }, // 148 (14 1 1) + { 14.500000, 0.500000, 0.500000, 0.142857 }, // 149 (14 2 0) + { 15.000000, 1.000000, 0.000000, 0.066667 }, // 150 (15 0 1) + { 15.250000, 0.250000, 0.250000, 0.266667 }, // 151 (15 1 0) + { 16.000000, 0.000000, 0.000000, INFINITY }, // 152 (16 0 0) +}; // 153 three cluster elements + +static const SQUISH_ALIGN_16 Precomp s_fourElement[969] = { + { 0.000000, 16.000000, 0.000000, INFINITY }, // 0 (0 0 0 16) + { 0.111111, 15.444445, 0.222222, 0.600000 }, // 1 (0 0 1 15) + { 0.222222, 14.888889, 0.444444, 0.321429 }, // 2 (0 0 2 14) + { 0.333333, 14.333333, 0.666667, 0.230769 }, // 3 (0 0 3 13) + { 0.444444, 13.777778, 0.888889, 0.187500 }, // 4 (0 0 4 12) + { 0.555556, 13.222222, 1.111111, 0.163636 }, // 5 (0 0 5 11) + { 0.666667, 12.666667, 1.333333, 0.150000 }, // 6 (0 0 6 10) + { 0.777778, 12.111111, 1.555556, 0.142857 }, // 7 (0 0 7 9) + { 0.888889, 11.555555, 1.777778, 0.140625 }, // 8 (0 0 8 8) + { 1.000000, 11.000000, 2.000000, 0.142857 }, // 9 (0 0 9 7) + { 1.111111, 10.444445, 2.222222, 0.150000 }, // 10 (0 0 10 6) + { 1.222222, 9.888889, 2.444444, 0.163636 }, // 11 (0 0 11 5) + { 1.333333, 9.333334, 2.666667, 0.187500 }, // 12 (0 0 12 4) + { 1.444444, 8.777778, 2.888889, 0.230769 }, // 13 (0 0 13 3) + { 1.555556, 8.222222, 3.111111, 0.321429 }, // 14 (0 0 14 2) + { 1.666667, 7.666667, 3.333333, 0.600000 }, // 15 (0 0 15 1) + { 1.777778, 7.111111, 3.555556, INFINITY }, // 16 (0 0 16 0) + { 0.444444, 15.111111, 0.222222, 0.150000 }, // 17 (0 1 0 15) + { 0.555556, 14.555555, 0.444444, 0.126761 }, // 18 (0 1 1 14) + { 0.666667, 14.000000, 0.666667, 0.112500 }, // 19 (0 1 2 13) + { 0.777778, 13.444444, 0.888889, 0.103448 }, // 20 (0 1 3 12) + { 0.888889, 12.888888, 1.111111, 0.097826 }, // 21 (0 1 4 11) + { 1.000000, 12.333333, 1.333333, 0.094737 }, // 22 (0 1 5 10) + { 1.111111, 11.777778, 1.555556, 0.093750 }, // 23 (0 1 6 9) + { 1.222222, 11.222221, 1.777778, 0.094737 }, // 24 (0 1 7 8) + { 1.333333, 10.666666, 2.000000, 0.097826 }, // 25 (0 1 8 7) + { 1.444444, 10.111111, 2.222222, 0.103448 }, // 26 (0 1 9 6) + { 1.555556, 9.555555, 2.444444, 0.112500 }, // 27 (0 1 10 5) + { 1.666667, 9.000000, 2.666667, 0.126761 }, // 28 (0 1 11 4) + { 1.777778, 8.444445, 2.888889, 0.150000 }, // 29 (0 1 12 3) + { 1.888889, 7.888889, 3.111111, 0.191489 }, // 30 (0 1 13 2) + { 2.000000, 7.333333, 3.333333, 0.281250 }, // 31 (0 1 14 1) + { 2.111111, 6.777778, 3.555556, 0.600000 }, // 32 (0 1 15 0) + { 0.888889, 14.222222, 0.444444, 0.080357 }, // 33 (0 2 0 14) + { 1.000000, 13.666667, 0.666667, 0.075630 }, // 34 (0 2 1 13) + { 1.111111, 13.111112, 0.888889, 0.072581 }, // 35 (0 2 2 12) + { 1.222222, 12.555555, 1.111111, 0.070866 }, // 36 (0 2 3 11) + { 1.333333, 12.000000, 1.333333, 0.070312 }, // 37 (0 2 4 10) + { 1.444444, 11.444445, 1.555556, 0.070866 }, // 38 (0 2 5 9) + { 1.555556, 10.888889, 1.777778, 0.072581 }, // 39 (0 2 6 8) + { 1.666667, 10.333333, 2.000000, 0.075630 }, // 40 (0 2 7 7) + { 1.777778, 9.777778, 2.222222, 0.080357 }, // 41 (0 2 8 6) + { 1.888889, 9.222222, 2.444444, 0.087379 }, // 42 (0 2 9 5) + { 2.000000, 8.666667, 2.666667, 0.097826 }, // 43 (0 2 10 4) + { 2.111111, 8.111111, 2.888889, 0.113924 }, // 44 (0 2 11 3) + { 2.222222, 7.555556, 3.111111, 0.140625 }, // 45 (0 2 12 2) + { 2.333333, 7.000000, 3.333333, 0.191489 }, // 46 (0 2 13 1) + { 2.444444, 6.444445, 3.555556, 0.321429 }, // 47 (0 2 14 0) + { 1.333333, 13.333333, 0.666667, 0.057692 }, // 48 (0 3 0 13) + { 1.444445, 12.777778, 0.888889, 0.056604 }, // 49 (0 3 1 12) + { 1.555556, 12.222222, 1.111111, 0.056250 }, // 50 (0 3 2 11) + { 1.666667, 11.666666, 1.333333, 0.056604 }, // 51 (0 3 3 10) + { 1.777778, 11.111111, 1.555556, 0.057692 }, // 52 (0 3 4 9) + { 1.888889, 10.555555, 1.777778, 0.059603 }, // 53 (0 3 5 8) + { 2.000000, 10.000000, 2.000000, 0.062500 }, // 54 (0 3 6 7) + { 2.111111, 9.444444, 2.222222, 0.066667 }, // 55 (0 3 7 6) + { 2.222222, 8.888888, 2.444444, 0.072581 }, // 56 (0 3 8 5) + { 2.333333, 8.333333, 2.666667, 0.081081 }, // 57 (0 3 9 4) + { 2.444445, 7.777778, 2.888889, 0.093750 }, // 58 (0 3 10 3) + { 2.555556, 7.222222, 3.111111, 0.113924 }, // 59 (0 3 11 2) + { 2.666667, 6.666667, 3.333333, 0.150000 }, // 60 (0 3 12 1) + { 2.777778, 6.111111, 3.555556, 0.230769 }, // 61 (0 3 13 0) + { 1.777778, 12.444445, 0.888889, 0.046875 }, // 62 (0 4 0 12) + { 1.888889, 11.888889, 1.111111, 0.047120 }, // 63 (0 4 1 11) + { 2.000000, 11.333334, 1.333333, 0.047872 }, // 64 (0 4 2 10) + { 2.111111, 10.777778, 1.555556, 0.049180 }, // 65 (0 4 3 9) + { 2.222222, 10.222222, 1.777778, 0.051136 }, // 66 (0 4 4 8) + { 2.333333, 9.666667, 2.000000, 0.053892 }, // 67 (0 4 5 7) + { 2.444444, 9.111112, 2.222222, 0.057692 }, // 68 (0 4 6 6) + { 2.555556, 8.555555, 2.444444, 0.062937 }, // 69 (0 4 7 5) + { 2.666667, 8.000000, 2.666667, 0.070312 }, // 70 (0 4 8 4) + { 2.777778, 7.444445, 2.888889, 0.081081 }, // 71 (0 4 9 3) + { 2.888889, 6.888889, 3.111111, 0.097826 }, // 72 (0 4 10 2) + { 3.000000, 6.333333, 3.333333, 0.126761 }, // 73 (0 4 11 1) + { 3.111111, 5.777778, 3.555556, 0.187500 }, // 74 (0 4 12 0) + { 2.222222, 11.555555, 1.111111, 0.040909 }, // 75 (0 5 0 11) + { 2.333333, 11.000000, 1.333333, 0.041860 }, // 76 (0 5 1 10) + { 2.444445, 10.444445, 1.555556, 0.043269 }, // 77 (0 5 2 9) + { 2.555556, 9.888888, 1.777778, 0.045226 }, // 78 (0 5 3 8) + { 2.666667, 9.333333, 2.000000, 0.047872 }, // 79 (0 5 4 7) + { 2.777778, 8.777778, 2.222222, 0.051429 }, // 80 (0 5 5 6) + { 2.888889, 8.222222, 2.444444, 0.056250 }, // 81 (0 5 6 5) + { 3.000000, 7.666667, 2.666667, 0.062937 }, // 82 (0 5 7 4) + { 3.111111, 7.111111, 2.888889, 0.072581 }, // 83 (0 5 8 3) + { 3.222222, 6.555555, 3.111111, 0.087379 }, // 84 (0 5 9 2) + { 3.333333, 6.000000, 3.333333, 0.112500 }, // 85 (0 5 10 1) + { 3.444445, 5.444445, 3.555556, 0.163636 }, // 86 (0 5 11 0) + { 2.666667, 10.666667, 1.333333, 0.037500 }, // 87 (0 6 0 10) + { 2.777778, 10.111112, 1.555556, 0.038961 }, // 88 (0 6 1 9) + { 2.888889, 9.555556, 1.777778, 0.040909 }, // 89 (0 6 2 8) + { 3.000000, 9.000000, 2.000000, 0.043478 }, // 90 (0 6 3 7) + { 3.111111, 8.444445, 2.222222, 0.046875 }, // 91 (0 6 4 6) + { 3.222222, 7.888889, 2.444444, 0.051429 }, // 92 (0 6 5 5) + { 3.333333, 7.333333, 2.666667, 0.057692 }, // 93 (0 6 6 4) + { 3.444445, 6.777778, 2.888889, 0.066667 }, // 94 (0 6 7 3) + { 3.555556, 6.222222, 3.111111, 0.080357 }, // 95 (0 6 8 2) + { 3.666667, 5.666667, 3.333333, 0.103448 }, // 96 (0 6 9 1) + { 3.777778, 5.111111, 3.555556, 0.150000 }, // 97 (0 6 10 0) + { 3.111111, 9.777778, 1.555556, 0.035714 }, // 98 (0 7 0 9) + { 3.222222, 9.222222, 1.777778, 0.037657 }, // 99 (0 7 1 8) + { 3.333333, 8.666667, 2.000000, 0.040179 }, // 100 (0 7 2 7) + { 3.444444, 8.111112, 2.222222, 0.043478 }, // 101 (0 7 3 6) + { 3.555556, 7.555555, 2.444444, 0.047872 }, // 102 (0 7 4 5) + { 3.666667, 7.000000, 2.666667, 0.053892 }, // 103 (0 7 5 4) + { 3.777778, 6.444445, 2.888889, 0.062500 }, // 104 (0 7 6 3) + { 3.888889, 5.888889, 3.111111, 0.075630 }, // 105 (0 7 7 2) + { 4.000000, 5.333333, 3.333333, 0.097826 }, // 106 (0 7 8 1) + { 4.111111, 4.777778, 3.555556, 0.142857 }, // 107 (0 7 9 0) + { 3.555556, 8.888889, 1.777778, 0.035156 }, // 108 (0 8 0 8) + { 3.666667, 8.333334, 2.000000, 0.037657 }, // 109 (0 8 1 7) + { 3.777778, 7.777778, 2.222222, 0.040909 }, // 110 (0 8 2 6) + { 3.888889, 7.222222, 2.444444, 0.045226 }, // 111 (0 8 3 5) + { 4.000000, 6.666667, 2.666667, 0.051136 }, // 112 (0 8 4 4) + { 4.111111, 6.111111, 2.888889, 0.059603 }, // 113 (0 8 5 3) + { 4.222222, 5.555556, 3.111111, 0.072581 }, // 114 (0 8 6 2) + { 4.333333, 5.000000, 3.333333, 0.094737 }, // 115 (0 8 7 1) + { 4.444445, 4.444445, 3.555556, 0.140625 }, // 116 (0 8 8 0) + { 4.000000, 8.000000, 2.000000, 0.035714 }, // 117 (0 9 0 7) + { 4.111111, 7.444445, 2.222222, 0.038961 }, // 118 (0 9 1 6) + { 4.222222, 6.888889, 2.444444, 0.043269 }, // 119 (0 9 2 5) + { 4.333333, 6.333333, 2.666667, 0.049180 }, // 120 (0 9 3 4) + { 4.444445, 5.777778, 2.888889, 0.057692 }, // 121 (0 9 4 3) + { 4.555555, 5.222222, 3.111111, 0.070866 }, // 122 (0 9 5 2) + { 4.666667, 4.666667, 3.333333, 0.093750 }, // 123 (0 9 6 1) + { 4.777778, 4.111111, 3.555556, 0.142857 }, // 124 (0 9 7 0) + { 4.444445, 7.111111, 2.222222, 0.037500 }, // 125 (0 10 0 6) + { 4.555556, 6.555556, 2.444444, 0.041860 }, // 126 (0 10 1 5) + { 4.666667, 6.000000, 2.666667, 0.047872 }, // 127 (0 10 2 4) + { 4.777778, 5.444445, 2.888889, 0.056604 }, // 128 (0 10 3 3) + { 4.888889, 4.888889, 3.111111, 0.070312 }, // 129 (0 10 4 2) + { 5.000000, 4.333333, 3.333333, 0.094737 }, // 130 (0 10 5 1) + { 5.111111, 3.777778, 3.555556, 0.150000 }, // 131 (0 10 6 0) + { 4.888889, 6.222222, 2.444444, 0.040909 }, // 132 (0 11 0 5) + { 5.000000, 5.666667, 2.666667, 0.047120 }, // 133 (0 11 1 4) + { 5.111111, 5.111111, 2.888889, 0.056250 }, // 134 (0 11 2 3) + { 5.222222, 4.555556, 3.111111, 0.070866 }, // 135 (0 11 3 2) + { 5.333333, 4.000000, 3.333333, 0.097826 }, // 136 (0 11 4 1) + { 5.444445, 3.444445, 3.555556, 0.163636 }, // 137 (0 11 5 0) + { 5.333333, 5.333333, 2.666667, 0.046875 }, // 138 (0 12 0 4) + { 5.444445, 4.777778, 2.888889, 0.056604 }, // 139 (0 12 1 3) + { 5.555556, 4.222222, 3.111111, 0.072581 }, // 140 (0 12 2 2) + { 5.666667, 3.666667, 3.333333, 0.103448 }, // 141 (0 12 3 1) + { 5.777778, 3.111111, 3.555556, 0.187500 }, // 142 (0 12 4 0) + { 5.777778, 4.444445, 2.888889, 0.057692 }, // 143 (0 13 0 3) + { 5.888889, 3.888889, 3.111111, 0.075630 }, // 144 (0 13 1 2) + { 6.000000, 3.333333, 3.333333, 0.112500 }, // 145 (0 13 2 1) + { 6.111111, 2.777778, 3.555556, 0.230769 }, // 146 (0 13 3 0) + { 6.222222, 3.555556, 3.111111, 0.080357 }, // 147 (0 14 0 2) + { 6.333333, 3.000000, 3.333333, 0.126761 }, // 148 (0 14 1 1) + { 6.444445, 2.444444, 3.555556, 0.321429 }, // 149 (0 14 2 0) + { 6.666667, 2.666667, 3.333333, 0.150000 }, // 150 (0 15 0 1) + { 6.777778, 2.111111, 3.555556, 0.600000 }, // 151 (0 15 1 0) + { 7.111111, 1.777778, 3.555556, INFINITY }, // 152 (0 16 0 0) + { 1.000000, 15.000000, 0.000000, 0.066667 }, // 153 (1 0 0 15) + { 1.111111, 14.444445, 0.222222, 0.062500 }, // 154 (1 0 1 14) + { 1.222222, 13.888889, 0.444444, 0.059603 }, // 155 (1 0 2 13) + { 1.333333, 13.333333, 0.666667, 0.057692 }, // 156 (1 0 3 12) + { 1.444444, 12.777778, 0.888889, 0.056604 }, // 157 (1 0 4 11) + { 1.555556, 12.222222, 1.111111, 0.056250 }, // 158 (1 0 5 10) + { 1.666667, 11.666667, 1.333333, 0.056604 }, // 159 (1 0 6 9) + { 1.777778, 11.111111, 1.555556, 0.057692 }, // 160 (1 0 7 8) + { 1.888889, 10.555555, 1.777778, 0.059603 }, // 161 (1 0 8 7) + { 2.000000, 10.000000, 2.000000, 0.062500 }, // 162 (1 0 9 6) + { 2.111111, 9.444445, 2.222222, 0.066667 }, // 163 (1 0 10 5) + { 2.222222, 8.888889, 2.444444, 0.072581 }, // 164 (1 0 11 4) + { 2.333333, 8.333334, 2.666667, 0.081081 }, // 165 (1 0 12 3) + { 2.444444, 7.777778, 2.888889, 0.093750 }, // 166 (1 0 13 2) + { 2.555556, 7.222222, 3.111111, 0.113924 }, // 167 (1 0 14 1) + { 2.666667, 6.666667, 3.333333, 0.150000 }, // 168 (1 0 15 0) + { 1.444444, 14.111111, 0.222222, 0.049180 }, // 169 (1 1 0 14) + { 1.555556, 13.555555, 0.444444, 0.047872 }, // 170 (1 1 1 13) + { 1.666667, 13.000000, 0.666667, 0.047120 }, // 171 (1 1 2 12) + { 1.777778, 12.444444, 0.888889, 0.046875 }, // 172 (1 1 3 11) + { 1.888889, 11.888888, 1.111111, 0.047120 }, // 173 (1 1 4 10) + { 2.000000, 11.333333, 1.333333, 0.047872 }, // 174 (1 1 5 9) + { 2.111111, 10.777778, 1.555556, 0.049180 }, // 175 (1 1 6 8) + { 2.222222, 10.222221, 1.777778, 0.051136 }, // 176 (1 1 7 7) + { 2.333333, 9.666666, 2.000000, 0.053892 }, // 177 (1 1 8 6) + { 2.444444, 9.111111, 2.222222, 0.057692 }, // 178 (1 1 9 5) + { 2.555556, 8.555555, 2.444444, 0.062937 }, // 179 (1 1 10 4) + { 2.666667, 8.000000, 2.666667, 0.070313 }, // 180 (1 1 11 3) + { 2.777778, 7.444445, 2.888889, 0.081081 }, // 181 (1 1 12 2) + { 2.888889, 6.888889, 3.111111, 0.097826 }, // 182 (1 1 13 1) + { 3.000000, 6.333333, 3.333333, 0.126761 }, // 183 (1 1 14 0) + { 1.888889, 13.222222, 0.444444, 0.040359 }, // 184 (1 2 0 13) + { 2.000000, 12.666667, 0.666667, 0.040179 }, // 185 (1 2 1 12) + { 2.111111, 12.111112, 0.888889, 0.040359 }, // 186 (1 2 2 11) + { 2.222222, 11.555555, 1.111111, 0.040909 }, // 187 (1 2 3 10) + { 2.333333, 11.000000, 1.333333, 0.041860 }, // 188 (1 2 4 9) + { 2.444444, 10.444445, 1.555556, 0.043269 }, // 189 (1 2 5 8) + { 2.555556, 9.888889, 1.777778, 0.045226 }, // 190 (1 2 6 7) + { 2.666667, 9.333333, 2.000000, 0.047872 }, // 191 (1 2 7 6) + { 2.777778, 8.777778, 2.222222, 0.051429 }, // 192 (1 2 8 5) + { 2.888889, 8.222222, 2.444444, 0.056250 }, // 193 (1 2 9 4) + { 3.000000, 7.666667, 2.666667, 0.062937 }, // 194 (1 2 10 3) + { 3.111111, 7.111111, 2.888889, 0.072581 }, // 195 (1 2 11 2) + { 3.222222, 6.555556, 3.111111, 0.087379 }, // 196 (1 2 12 1) + { 3.333333, 6.000000, 3.333333, 0.112500 }, // 197 (1 2 13 0) + { 2.333333, 12.333333, 0.666667, 0.035294 }, // 198 (1 3 0 12) + { 2.444445, 11.777778, 0.888889, 0.035714 }, // 199 (1 3 1 11) + { 2.555556, 11.222222, 1.111111, 0.036437 }, // 200 (1 3 2 10) + { 2.666667, 10.666666, 1.333333, 0.037500 }, // 201 (1 3 3 9) + { 2.777778, 10.111111, 1.555556, 0.038961 }, // 202 (1 3 4 8) + { 2.888889, 9.555555, 1.777778, 0.040909 }, // 203 (1 3 5 7) + { 3.000000, 9.000000, 2.000000, 0.043478 }, // 204 (1 3 6 6) + { 3.111111, 8.444444, 2.222222, 0.046875 }, // 205 (1 3 7 5) + { 3.222222, 7.888889, 2.444444, 0.051429 }, // 206 (1 3 8 4) + { 3.333333, 7.333333, 2.666667, 0.057692 }, // 207 (1 3 9 3) + { 3.444445, 6.777778, 2.888889, 0.066667 }, // 208 (1 3 10 2) + { 3.555556, 6.222222, 3.111111, 0.080357 }, // 209 (1 3 11 1) + { 3.666667, 5.666667, 3.333333, 0.103448 }, // 210 (1 3 12 0) + { 2.777778, 11.444445, 0.888889, 0.032258 }, // 211 (1 4 0 11) + { 2.888889, 10.888889, 1.111111, 0.033088 }, // 212 (1 4 1 10) + { 3.000000, 10.333334, 1.333333, 0.034221 }, // 213 (1 4 2 9) + { 3.111111, 9.777778, 1.555556, 0.035714 }, // 214 (1 4 3 8) + { 3.222222, 9.222222, 1.777778, 0.037657 }, // 215 (1 4 4 7) + { 3.333333, 8.666667, 2.000000, 0.040179 }, // 216 (1 4 5 6) + { 3.444444, 8.111112, 2.222222, 0.043478 }, // 217 (1 4 6 5) + { 3.555555, 7.555556, 2.444444, 0.047872 }, // 218 (1 4 7 4) + { 3.666667, 7.000000, 2.666667, 0.053892 }, // 219 (1 4 8 3) + { 3.777778, 6.444445, 2.888889, 0.062500 }, // 220 (1 4 9 2) + { 3.888889, 5.888889, 3.111111, 0.075630 }, // 221 (1 4 10 1) + { 4.000000, 5.333333, 3.333333, 0.097826 }, // 222 (1 4 11 0) + { 3.222222, 10.555555, 1.111111, 0.030508 }, // 223 (1 5 0 10) + { 3.333333, 10.000000, 1.333333, 0.031690 }, // 224 (1 5 1 9) + { 3.444445, 9.444445, 1.555556, 0.033210 }, // 225 (1 5 2 8) + { 3.555556, 8.888888, 1.777778, 0.035156 }, // 226 (1 5 3 7) + { 3.666667, 8.333333, 2.000000, 0.037657 }, // 227 (1 5 4 6) + { 3.777778, 7.777778, 2.222222, 0.040909 }, // 228 (1 5 5 5) + { 3.888889, 7.222222, 2.444444, 0.045226 }, // 229 (1 5 6 4) + { 4.000000, 6.666667, 2.666667, 0.051136 }, // 230 (1 5 7 3) + { 4.111111, 6.111111, 2.888889, 0.059603 }, // 231 (1 5 8 2) + { 4.222222, 5.555555, 3.111111, 0.072581 }, // 232 (1 5 9 1) + { 4.333333, 5.000000, 3.333333, 0.094737 }, // 233 (1 5 10 0) + { 3.666667, 9.666667, 1.333333, 0.029703 }, // 234 (1 6 0 9) + { 3.777778, 9.111112, 1.555556, 0.031250 }, // 235 (1 6 1 8) + { 3.888889, 8.555555, 1.777778, 0.033210 }, // 236 (1 6 2 7) + { 4.000000, 8.000000, 2.000000, 0.035714 }, // 237 (1 6 3 6) + { 4.111111, 7.444444, 2.222222, 0.038961 }, // 238 (1 6 4 5) + { 4.222222, 6.888889, 2.444444, 0.043269 }, // 239 (1 6 5 4) + { 4.333333, 6.333333, 2.666667, 0.049180 }, // 240 (1 6 6 3) + { 4.444445, 5.777778, 2.888889, 0.057692 }, // 241 (1 6 7 2) + { 4.555556, 5.222222, 3.111111, 0.070866 }, // 242 (1 6 8 1) + { 4.666667, 4.666667, 3.333333, 0.093750 }, // 243 (1 6 9 0) + { 4.111111, 8.777778, 1.555556, 0.029703 }, // 244 (1 7 0 8) + { 4.222222, 8.222222, 1.777778, 0.031690 }, // 245 (1 7 1 7) + { 4.333333, 7.666667, 2.000000, 0.034221 }, // 246 (1 7 2 6) + { 4.444445, 7.111111, 2.222222, 0.037500 }, // 247 (1 7 3 5) + { 4.555556, 6.555555, 2.444444, 0.041860 }, // 248 (1 7 4 4) + { 4.666667, 6.000000, 2.666667, 0.047872 }, // 249 (1 7 5 3) + { 4.777778, 5.444445, 2.888889, 0.056604 }, // 250 (1 7 6 2) + { 4.888889, 4.888889, 3.111111, 0.070313 }, // 251 (1 7 7 1) + { 5.000000, 4.333333, 3.333333, 0.094737 }, // 252 (1 7 8 0) + { 4.555555, 7.888889, 1.777778, 0.030508 }, // 253 (1 8 0 7) + { 4.666667, 7.333333, 2.000000, 0.033088 }, // 254 (1 8 1 6) + { 4.777778, 6.777778, 2.222222, 0.036437 }, // 255 (1 8 2 5) + { 4.888889, 6.222222, 2.444444, 0.040909 }, // 256 (1 8 3 4) + { 5.000000, 5.666667, 2.666667, 0.047120 }, // 257 (1 8 4 3) + { 5.111111, 5.111111, 2.888889, 0.056250 }, // 258 (1 8 5 2) + { 5.222222, 4.555556, 3.111111, 0.070866 }, // 259 (1 8 6 1) + { 5.333333, 4.000000, 3.333333, 0.097826 }, // 260 (1 8 7 0) + { 5.000000, 7.000000, 2.000000, 0.032258 }, // 261 (1 9 0 6) + { 5.111111, 6.444445, 2.222222, 0.035714 }, // 262 (1 9 1 5) + { 5.222222, 5.888889, 2.444444, 0.040359 }, // 263 (1 9 2 4) + { 5.333333, 5.333333, 2.666667, 0.046875 }, // 264 (1 9 3 3) + { 5.444445, 4.777778, 2.888889, 0.056604 }, // 265 (1 9 4 2) + { 5.555555, 4.222222, 3.111111, 0.072581 }, // 266 (1 9 5 1) + { 5.666667, 3.666667, 3.333333, 0.103448 }, // 267 (1 9 6 0) + { 5.444445, 6.111111, 2.222222, 0.035294 }, // 268 (1 10 0 5) + { 5.555556, 5.555556, 2.444444, 0.040179 }, // 269 (1 10 1 4) + { 5.666667, 5.000000, 2.666667, 0.047120 }, // 270 (1 10 2 3) + { 5.777778, 4.444445, 2.888889, 0.057692 }, // 271 (1 10 3 2) + { 5.888889, 3.888889, 3.111111, 0.075630 }, // 272 (1 10 4 1) + { 6.000000, 3.333333, 3.333333, 0.112500 }, // 273 (1 10 5 0) + { 5.888889, 5.222222, 2.444444, 0.040359 }, // 274 (1 11 0 4) + { 6.000000, 4.666667, 2.666667, 0.047872 }, // 275 (1 11 1 3) + { 6.111111, 4.111111, 2.888889, 0.059603 }, // 276 (1 11 2 2) + { 6.222222, 3.555556, 3.111111, 0.080357 }, // 277 (1 11 3 1) + { 6.333333, 3.000000, 3.333333, 0.126761 }, // 278 (1 11 4 0) + { 6.333333, 4.333333, 2.666667, 0.049180 }, // 279 (1 12 0 3) + { 6.444445, 3.777778, 2.888889, 0.062500 }, // 280 (1 12 1 2) + { 6.555556, 3.222222, 3.111111, 0.087379 }, // 281 (1 12 2 1) + { 6.666667, 2.666667, 3.333333, 0.150000 }, // 282 (1 12 3 0) + { 6.777778, 3.444444, 2.888889, 0.066667 }, // 283 (1 13 0 2) + { 6.888889, 2.888889, 3.111111, 0.097826 }, // 284 (1 13 1 1) + { 7.000000, 2.333333, 3.333333, 0.191489 }, // 285 (1 13 2 0) + { 7.222222, 2.555556, 3.111111, 0.113924 }, // 286 (1 14 0 1) + { 7.333333, 2.000000, 3.333333, 0.281250 }, // 287 (1 14 1 0) + { 7.666667, 1.666667, 3.333333, 0.600000 }, // 288 (1 15 0 0) + { 2.000000, 14.000000, 0.000000, 0.035714 }, // 289 (2 0 0 14) + { 2.111111, 13.444445, 0.222222, 0.035294 }, // 290 (2 0 1 13) + { 2.222222, 12.888889, 0.444444, 0.035156 }, // 291 (2 0 2 12) + { 2.333333, 12.333333, 0.666667, 0.035294 }, // 292 (2 0 3 11) + { 2.444444, 11.777778, 0.888889, 0.035714 }, // 293 (2 0 4 10) + { 2.555556, 11.222222, 1.111111, 0.036437 }, // 294 (2 0 5 9) + { 2.666667, 10.666667, 1.333333, 0.037500 }, // 295 (2 0 6 8) + { 2.777778, 10.111111, 1.555556, 0.038961 }, // 296 (2 0 7 7) + { 2.888889, 9.555555, 1.777778, 0.040909 }, // 297 (2 0 8 6) + { 3.000000, 9.000000, 2.000000, 0.043478 }, // 298 (2 0 9 5) + { 3.111111, 8.444445, 2.222222, 0.046875 }, // 299 (2 0 10 4) + { 3.222222, 7.888889, 2.444444, 0.051429 }, // 300 (2 0 11 3) + { 3.333333, 7.333333, 2.666667, 0.057692 }, // 301 (2 0 12 2) + { 3.444444, 6.777778, 2.888889, 0.066667 }, // 302 (2 0 13 1) + { 3.555556, 6.222222, 3.111111, 0.080357 }, // 303 (2 0 14 0) + { 2.444444, 13.111111, 0.222222, 0.031250 }, // 304 (2 1 0 13) + { 2.555556, 12.555555, 0.444444, 0.031359 }, // 305 (2 1 1 12) + { 2.666667, 12.000000, 0.666667, 0.031690 }, // 306 (2 1 2 11) + { 2.777778, 11.444444, 0.888889, 0.032258 }, // 307 (2 1 3 10) + { 2.888889, 10.888888, 1.111111, 0.033088 }, // 308 (2 1 4 9) + { 3.000000, 10.333333, 1.333333, 0.034221 }, // 309 (2 1 5 8) + { 3.111111, 9.777778, 1.555556, 0.035714 }, // 310 (2 1 6 7) + { 3.222222, 9.222221, 1.777778, 0.037657 }, // 311 (2 1 7 6) + { 3.333333, 8.666666, 2.000000, 0.040179 }, // 312 (2 1 8 5) + { 3.444444, 8.111111, 2.222222, 0.043478 }, // 313 (2 1 9 4) + { 3.555556, 7.555556, 2.444444, 0.047872 }, // 314 (2 1 10 3) + { 3.666667, 7.000000, 2.666667, 0.053892 }, // 315 (2 1 11 2) + { 3.777778, 6.444445, 2.888889, 0.062500 }, // 316 (2 1 12 1) + { 3.888889, 5.888889, 3.111111, 0.075630 }, // 317 (2 1 13 0) + { 2.888889, 12.222222, 0.444444, 0.028481 }, // 318 (2 2 0 12) + { 3.000000, 11.666667, 0.666667, 0.028939 }, // 319 (2 2 1 11) + { 3.111111, 11.111112, 0.888889, 0.029605 }, // 320 (2 2 2 10) + { 3.222222, 10.555555, 1.111111, 0.030508 }, // 321 (2 2 3 9) + { 3.333333, 10.000000, 1.333333, 0.031690 }, // 322 (2 2 4 8) + { 3.444444, 9.444445, 1.555556, 0.033210 }, // 323 (2 2 5 7) + { 3.555556, 8.888889, 1.777778, 0.035156 }, // 324 (2 2 6 6) + { 3.666667, 8.333333, 2.000000, 0.037657 }, // 325 (2 2 7 5) + { 3.777778, 7.777778, 2.222222, 0.040909 }, // 326 (2 2 8 4) + { 3.888889, 7.222222, 2.444444, 0.045226 }, // 327 (2 2 9 3) + { 4.000000, 6.666667, 2.666667, 0.051136 }, // 328 (2 2 10 2) + { 4.111111, 6.111111, 2.888889, 0.059603 }, // 329 (2 2 11 1) + { 4.222222, 5.555556, 3.111111, 0.072581 }, // 330 (2 2 12 0) + { 3.333333, 11.333333, 0.666667, 0.026786 }, // 331 (2 3 0 11) + { 3.444445, 10.777778, 0.888889, 0.027523 }, // 332 (2 3 1 10) + { 3.555556, 10.222222, 1.111111, 0.028481 }, // 333 (2 3 2 9) + { 3.666667, 9.666666, 1.333333, 0.029703 }, // 334 (2 3 3 8) + { 3.777778, 9.111111, 1.555556, 0.031250 }, // 335 (2 3 4 7) + { 3.888889, 8.555555, 1.777778, 0.033210 }, // 336 (2 3 5 6) + { 4.000000, 8.000000, 2.000000, 0.035714 }, // 337 (2 3 6 5) + { 4.111111, 7.444445, 2.222222, 0.038961 }, // 338 (2 3 7 4) + { 4.222222, 6.888889, 2.444444, 0.043269 }, // 339 (2 3 8 3) + { 4.333333, 6.333333, 2.666667, 0.049180 }, // 340 (2 3 9 2) + { 4.444445, 5.777778, 2.888889, 0.057692 }, // 341 (2 3 10 1) + { 4.555556, 5.222222, 3.111111, 0.070866 }, // 342 (2 3 11 0) + { 3.777778, 10.444445, 0.888889, 0.025862 }, // 343 (2 4 0 10) + { 3.888889, 9.888889, 1.111111, 0.026866 }, // 344 (2 4 1 9) + { 4.000000, 9.333334, 1.333333, 0.028125 }, // 345 (2 4 2 8) + { 4.111111, 8.777778, 1.555556, 0.029703 }, // 346 (2 4 3 7) + { 4.222222, 8.222222, 1.777778, 0.031690 }, // 347 (2 4 4 6) + { 4.333333, 7.666667, 2.000000, 0.034221 }, // 348 (2 4 5 5) + { 4.444444, 7.111112, 2.222222, 0.037500 }, // 349 (2 4 6 4) + { 4.555555, 6.555556, 2.444444, 0.041860 }, // 350 (2 4 7 3) + { 4.666667, 6.000000, 2.666667, 0.047872 }, // 351 (2 4 8 2) + { 4.777778, 5.444445, 2.888889, 0.056604 }, // 352 (2 4 9 1) + { 4.888889, 4.888889, 3.111111, 0.070312 }, // 353 (2 4 10 0) + { 4.222222, 9.555555, 1.111111, 0.025568 }, // 354 (2 5 0 9) + { 4.333333, 9.000000, 1.333333, 0.026866 }, // 355 (2 5 1 8) + { 4.444445, 8.444445, 1.555556, 0.028481 }, // 356 (2 5 2 7) + { 4.555556, 7.888889, 1.777778, 0.030508 }, // 357 (2 5 3 6) + { 4.666667, 7.333333, 2.000000, 0.033088 }, // 358 (2 5 4 5) + { 4.777778, 6.777778, 2.222222, 0.036437 }, // 359 (2 5 5 4) + { 4.888889, 6.222222, 2.444444, 0.040909 }, // 360 (2 5 6 3) + { 5.000000, 5.666667, 2.666667, 0.047120 }, // 361 (2 5 7 2) + { 5.111111, 5.111111, 2.888889, 0.056250 }, // 362 (2 5 8 1) + { 5.222222, 4.555555, 3.111111, 0.070866 }, // 363 (2 5 9 0) + { 4.666667, 8.666667, 1.333333, 0.025862 }, // 364 (2 6 0 8) + { 4.777778, 8.111112, 1.555556, 0.027523 }, // 365 (2 6 1 7) + { 4.888889, 7.555555, 1.777778, 0.029605 }, // 366 (2 6 2 6) + { 5.000000, 7.000000, 2.000000, 0.032258 }, // 367 (2 6 3 5) + { 5.111112, 6.444444, 2.222222, 0.035714 }, // 368 (2 6 4 4) + { 5.222222, 5.888889, 2.444444, 0.040359 }, // 369 (2 6 5 3) + { 5.333333, 5.333333, 2.666667, 0.046875 }, // 370 (2 6 6 2) + { 5.444445, 4.777778, 2.888889, 0.056604 }, // 371 (2 6 7 1) + { 5.555556, 4.222222, 3.111111, 0.072581 }, // 372 (2 6 8 0) + { 5.111111, 7.777778, 1.555556, 0.026786 }, // 373 (2 7 0 7) + { 5.222222, 7.222222, 1.777778, 0.028939 }, // 374 (2 7 1 6) + { 5.333333, 6.666667, 2.000000, 0.031690 }, // 375 (2 7 2 5) + { 5.444445, 6.111111, 2.222222, 0.035294 }, // 376 (2 7 3 4) + { 5.555556, 5.555555, 2.444444, 0.040179 }, // 377 (2 7 4 3) + { 5.666667, 5.000000, 2.666667, 0.047120 }, // 378 (2 7 5 2) + { 5.777778, 4.444445, 2.888889, 0.057692 }, // 379 (2 7 6 1) + { 5.888889, 3.888889, 3.111111, 0.075630 }, // 380 (2 7 7 0) + { 5.555555, 6.888889, 1.777778, 0.028481 }, // 381 (2 8 0 6) + { 5.666667, 6.333333, 2.000000, 0.031359 }, // 382 (2 8 1 5) + { 5.777778, 5.777778, 2.222222, 0.035156 }, // 383 (2 8 2 4) + { 5.888889, 5.222222, 2.444444, 0.040359 }, // 384 (2 8 3 3) + { 6.000000, 4.666667, 2.666667, 0.047872 }, // 385 (2 8 4 2) + { 6.111111, 4.111111, 2.888889, 0.059603 }, // 386 (2 8 5 1) + { 6.222222, 3.555556, 3.111111, 0.080357 }, // 387 (2 8 6 0) + { 6.000000, 6.000000, 2.000000, 0.031250 }, // 388 (2 9 0 5) + { 6.111111, 5.444445, 2.222222, 0.035294 }, // 389 (2 9 1 4) + { 6.222222, 4.888889, 2.444444, 0.040909 }, // 390 (2 9 2 3) + { 6.333333, 4.333333, 2.666667, 0.049180 }, // 391 (2 9 3 2) + { 6.444445, 3.777778, 2.888889, 0.062500 }, // 392 (2 9 4 1) + { 6.555555, 3.222222, 3.111111, 0.087379 }, // 393 (2 9 5 0) + { 6.444445, 5.111111, 2.222222, 0.035714 }, // 394 (2 10 0 4) + { 6.555556, 4.555555, 2.444444, 0.041860 }, // 395 (2 10 1 3) + { 6.666667, 4.000000, 2.666667, 0.051136 }, // 396 (2 10 2 2) + { 6.777778, 3.444445, 2.888889, 0.066667 }, // 397 (2 10 3 1) + { 6.888889, 2.888889, 3.111111, 0.097826 }, // 398 (2 10 4 0) + { 6.888889, 4.222222, 2.444444, 0.043269 }, // 399 (2 11 0 3) + { 7.000000, 3.666667, 2.666667, 0.053892 }, // 400 (2 11 1 2) + { 7.111111, 3.111111, 2.888889, 0.072581 }, // 401 (2 11 2 1) + { 7.222222, 2.555556, 3.111111, 0.113924 }, // 402 (2 11 3 0) + { 7.333333, 3.333333, 2.666667, 0.057692 }, // 403 (2 12 0 2) + { 7.444445, 2.777778, 2.888889, 0.081081 }, // 404 (2 12 1 1) + { 7.555556, 2.222222, 3.111111, 0.140625 }, // 405 (2 12 2 0) + { 7.777778, 2.444444, 2.888889, 0.093750 }, // 406 (2 13 0 1) + { 7.888889, 1.888889, 3.111111, 0.191489 }, // 407 (2 13 1 0) + { 8.222222, 1.555556, 3.111111, 0.321429 }, // 408 (2 14 0 0) + { 3.000000, 13.000000, 0.000000, 0.025641 }, // 409 (3 0 0 13) + { 3.111111, 12.444445, 0.222222, 0.025862 }, // 410 (3 0 1 12) + { 3.222222, 11.888889, 0.444444, 0.026239 }, // 411 (3 0 2 11) + { 3.333333, 11.333333, 0.666667, 0.026786 }, // 412 (3 0 3 10) + { 3.444444, 10.777778, 0.888889, 0.027523 }, // 413 (3 0 4 9) + { 3.555556, 10.222222, 1.111111, 0.028481 }, // 414 (3 0 5 8) + { 3.666667, 9.666667, 1.333333, 0.029703 }, // 415 (3 0 6 7) + { 3.777778, 9.111111, 1.555556, 0.031250 }, // 416 (3 0 7 6) + { 3.888889, 8.555555, 1.777778, 0.033210 }, // 417 (3 0 8 5) + { 4.000000, 8.000000, 2.000000, 0.035714 }, // 418 (3 0 9 4) + { 4.111111, 7.444445, 2.222222, 0.038961 }, // 419 (3 0 10 3) + { 4.222222, 6.888889, 2.444444, 0.043269 }, // 420 (3 0 11 2) + { 4.333333, 6.333333, 2.666667, 0.049180 }, // 421 (3 0 12 1) + { 4.444445, 5.777778, 2.888889, 0.057692 }, // 422 (3 0 13 0) + { 3.444444, 12.111111, 0.222222, 0.024000 }, // 423 (3 1 0 12) + { 3.555556, 11.555555, 0.444444, 0.024457 }, // 424 (3 1 1 11) + { 3.666667, 11.000000, 0.666667, 0.025070 }, // 425 (3 1 2 10) + { 3.777778, 10.444444, 0.888889, 0.025862 }, // 426 (3 1 3 9) + { 3.888889, 9.888888, 1.111111, 0.026866 }, // 427 (3 1 4 8) + { 4.000000, 9.333333, 1.333333, 0.028125 }, // 428 (3 1 5 7) + { 4.111111, 8.777778, 1.555556, 0.029703 }, // 429 (3 1 6 6) + { 4.222222, 8.222221, 1.777778, 0.031690 }, // 430 (3 1 7 5) + { 4.333333, 7.666667, 2.000000, 0.034221 }, // 431 (3 1 8 4) + { 4.444445, 7.111111, 2.222222, 0.037500 }, // 432 (3 1 9 3) + { 4.555555, 6.555556, 2.444444, 0.041860 }, // 433 (3 1 10 2) + { 4.666667, 6.000000, 2.666667, 0.047872 }, // 434 (3 1 11 1) + { 4.777778, 5.444445, 2.888889, 0.056604 }, // 435 (3 1 12 0) + { 3.888889, 11.222222, 0.444444, 0.023018 }, // 436 (3 2 0 11) + { 4.000000, 10.666667, 0.666667, 0.023684 }, // 437 (3 2 1 10) + { 4.111111, 10.111112, 0.888889, 0.024523 }, // 438 (3 2 2 9) + { 4.222222, 9.555555, 1.111111, 0.025568 }, // 439 (3 2 3 8) + { 4.333333, 9.000000, 1.333333, 0.026866 }, // 440 (3 2 4 7) + { 4.444445, 8.444445, 1.555556, 0.028481 }, // 441 (3 2 5 6) + { 4.555555, 7.888889, 1.777778, 0.030508 }, // 442 (3 2 6 5) + { 4.666667, 7.333333, 2.000000, 0.033088 }, // 443 (3 2 7 4) + { 4.777778, 6.777778, 2.222222, 0.036437 }, // 444 (3 2 8 3) + { 4.888889, 6.222222, 2.444444, 0.040909 }, // 445 (3 2 9 2) + { 5.000000, 5.666667, 2.666667, 0.047120 }, // 446 (3 2 10 1) + { 5.111111, 5.111111, 2.888889, 0.056250 }, // 447 (3 2 11 0) + { 4.333333, 10.333333, 0.666667, 0.022556 }, // 448 (3 3 0 10) + { 4.444445, 9.777778, 0.888889, 0.023438 }, // 449 (3 3 1 9) + { 4.555556, 9.222222, 1.111111, 0.024523 }, // 450 (3 3 2 8) + { 4.666667, 8.666666, 1.333333, 0.025862 }, // 451 (3 3 3 7) + { 4.777778, 8.111111, 1.555556, 0.027523 }, // 452 (3 3 4 6) + { 4.888889, 7.555556, 1.777778, 0.029605 }, // 453 (3 3 5 5) + { 5.000000, 7.000000, 2.000000, 0.032258 }, // 454 (3 3 6 4) + { 5.111111, 6.444445, 2.222222, 0.035714 }, // 455 (3 3 7 3) + { 5.222222, 5.888889, 2.444444, 0.040359 }, // 456 (3 3 8 2) + { 5.333333, 5.333333, 2.666667, 0.046875 }, // 457 (3 3 9 1) + { 5.444445, 4.777778, 2.888889, 0.056604 }, // 458 (3 3 10 0) + { 4.777778, 9.444445, 0.888889, 0.022556 }, // 459 (3 4 0 9) + { 4.888889, 8.888889, 1.111111, 0.023684 }, // 460 (3 4 1 8) + { 5.000000, 8.333333, 1.333333, 0.025070 }, // 461 (3 4 2 7) + { 5.111111, 7.777778, 1.555556, 0.026786 }, // 462 (3 4 3 6) + { 5.222222, 7.222222, 1.777778, 0.028939 }, // 463 (3 4 4 5) + { 5.333333, 6.666667, 2.000000, 0.031690 }, // 464 (3 4 5 4) + { 5.444444, 6.111112, 2.222222, 0.035294 }, // 465 (3 4 6 3) + { 5.555555, 5.555556, 2.444444, 0.040179 }, // 466 (3 4 7 2) + { 5.666667, 5.000000, 2.666667, 0.047120 }, // 467 (3 4 8 1) + { 5.777778, 4.444445, 2.888889, 0.057692 }, // 468 (3 4 9 0) + { 5.222222, 8.555555, 1.111111, 0.023018 }, // 469 (3 5 0 8) + { 5.333333, 8.000000, 1.333333, 0.024457 }, // 470 (3 5 1 7) + { 5.444445, 7.444445, 1.555556, 0.026239 }, // 471 (3 5 2 6) + { 5.555556, 6.888889, 1.777778, 0.028481 }, // 472 (3 5 3 5) + { 5.666667, 6.333333, 2.000000, 0.031359 }, // 473 (3 5 4 4) + { 5.777778, 5.777778, 2.222222, 0.035156 }, // 474 (3 5 5 3) + { 5.888889, 5.222222, 2.444444, 0.040359 }, // 475 (3 5 6 2) + { 6.000000, 4.666667, 2.666667, 0.047872 }, // 476 (3 5 7 1) + { 6.111111, 4.111111, 2.888889, 0.059603 }, // 477 (3 5 8 0) + { 5.666667, 7.666667, 1.333333, 0.024000 }, // 478 (3 6 0 7) + { 5.777778, 7.111111, 1.555556, 0.025862 }, // 479 (3 6 1 6) + { 5.888889, 6.555555, 1.777778, 0.028213 }, // 480 (3 6 2 5) + { 6.000000, 6.000000, 2.000000, 0.031250 }, // 481 (3 6 3 4) + { 6.111112, 5.444444, 2.222222, 0.035294 }, // 482 (3 6 4 3) + { 6.222222, 4.888889, 2.444444, 0.040909 }, // 483 (3 6 5 2) + { 6.333333, 4.333333, 2.666667, 0.049180 }, // 484 (3 6 6 1) + { 6.444445, 3.777778, 2.888889, 0.062500 }, // 485 (3 6 7 0) + { 6.111111, 6.777778, 1.555556, 0.025641 }, // 486 (3 7 0 6) + { 6.222222, 6.222222, 1.777778, 0.028125 }, // 487 (3 7 1 5) + { 6.333333, 5.666667, 2.000000, 0.031359 }, // 488 (3 7 2 4) + { 6.444445, 5.111111, 2.222222, 0.035714 }, // 489 (3 7 3 3) + { 6.555556, 4.555555, 2.444444, 0.041860 }, // 490 (3 7 4 2) + { 6.666667, 4.000000, 2.666667, 0.051136 }, // 491 (3 7 5 1) + { 6.777778, 3.444445, 2.888889, 0.066667 }, // 492 (3 7 6 0) + { 6.555555, 5.888889, 1.777778, 0.028213 }, // 493 (3 8 0 5) + { 6.666667, 5.333333, 2.000000, 0.031690 }, // 494 (3 8 1 4) + { 6.777778, 4.777778, 2.222222, 0.036437 }, // 495 (3 8 2 3) + { 6.888889, 4.222222, 2.444444, 0.043269 }, // 496 (3 8 3 2) + { 7.000000, 3.666667, 2.666667, 0.053892 }, // 497 (3 8 4 1) + { 7.111111, 3.111111, 2.888889, 0.072581 }, // 498 (3 8 5 0) + { 7.000000, 5.000000, 2.000000, 0.032258 }, // 499 (3 9 0 4) + { 7.111111, 4.444445, 2.222222, 0.037500 }, // 500 (3 9 1 3) + { 7.222222, 3.888889, 2.444444, 0.045226 }, // 501 (3 9 2 2) + { 7.333333, 3.333333, 2.666667, 0.057692 }, // 502 (3 9 3 1) + { 7.444445, 2.777778, 2.888889, 0.081081 }, // 503 (3 9 4 0) + { 7.444445, 4.111111, 2.222222, 0.038961 }, // 504 (3 10 0 3) + { 7.555556, 3.555556, 2.444444, 0.047872 }, // 505 (3 10 1 2) + { 7.666667, 3.000000, 2.666667, 0.062937 }, // 506 (3 10 2 1) + { 7.777778, 2.444445, 2.888889, 0.093750 }, // 507 (3 10 3 0) + { 7.888889, 3.222222, 2.444444, 0.051429 }, // 508 (3 11 0 2) + { 8.000000, 2.666667, 2.666667, 0.070313 }, // 509 (3 11 1 1) + { 8.111111, 2.111111, 2.888889, 0.113924 }, // 510 (3 11 2 0) + { 8.333334, 2.333333, 2.666667, 0.081081 }, // 511 (3 12 0 1) + { 8.444445, 1.777778, 2.888889, 0.150000 }, // 512 (3 12 1 0) + { 8.777778, 1.444444, 2.888889, 0.230769 }, // 513 (3 13 0 0) + { 4.000000, 12.000000, 0.000000, 0.020833 }, // 514 (4 0 0 12) + { 4.111111, 11.444445, 0.222222, 0.021277 }, // 515 (4 0 1 11) + { 4.222222, 10.888889, 0.444444, 0.021845 }, // 516 (4 0 2 10) + { 4.333333, 10.333333, 0.666667, 0.022556 }, // 517 (4 0 3 9) + { 4.444445, 9.777778, 0.888889, 0.023438 }, // 518 (4 0 4 8) + { 4.555555, 9.222222, 1.111111, 0.024523 }, // 519 (4 0 5 7) + { 4.666667, 8.666667, 1.333333, 0.025862 }, // 520 (4 0 6 6) + { 4.777778, 8.111111, 1.555556, 0.027523 }, // 521 (4 0 7 5) + { 4.888889, 7.555555, 1.777778, 0.029605 }, // 522 (4 0 8 4) + { 5.000000, 7.000000, 2.000000, 0.032258 }, // 523 (4 0 9 3) + { 5.111111, 6.444445, 2.222222, 0.035714 }, // 524 (4 0 10 2) + { 5.222222, 5.888889, 2.444444, 0.040359 }, // 525 (4 0 11 1) + { 5.333333, 5.333333, 2.666667, 0.046875 }, // 526 (4 0 12 0) + { 4.444445, 11.111111, 0.222222, 0.020270 }, // 527 (4 1 0 11) + { 4.555556, 10.555555, 0.444444, 0.020882 }, // 528 (4 1 1 10) + { 4.666667, 10.000000, 0.666667, 0.021635 }, // 529 (4 1 2 9) + { 4.777778, 9.444444, 0.888889, 0.022556 }, // 530 (4 1 3 8) + { 4.888889, 8.888888, 1.111111, 0.023684 }, // 531 (4 1 4 7) + { 5.000000, 8.333333, 1.333333, 0.025070 }, // 532 (4 1 5 6) + { 5.111111, 7.777778, 1.555556, 0.026786 }, // 533 (4 1 6 5) + { 5.222222, 7.222222, 1.777778, 0.028939 }, // 534 (4 1 7 4) + { 5.333333, 6.666667, 2.000000, 0.031690 }, // 535 (4 1 8 3) + { 5.444445, 6.111111, 2.222222, 0.035294 }, // 536 (4 1 9 2) + { 5.555556, 5.555556, 2.444444, 0.040179 }, // 537 (4 1 10 1) + { 5.666667, 5.000000, 2.666667, 0.047120 }, // 538 (4 1 11 0) + { 4.888889, 10.222222, 0.444444, 0.020089 }, // 539 (4 2 0 10) + { 5.000000, 9.666667, 0.666667, 0.020882 }, // 540 (4 2 1 9) + { 5.111111, 9.111112, 0.888889, 0.021845 }, // 541 (4 2 2 8) + { 5.222222, 8.555555, 1.111111, 0.023018 }, // 542 (4 2 3 7) + { 5.333333, 8.000000, 1.333333, 0.024457 }, // 543 (4 2 4 6) + { 5.444445, 7.444445, 1.555556, 0.026239 }, // 544 (4 2 5 5) + { 5.555555, 6.888889, 1.777778, 0.028481 }, // 545 (4 2 6 4) + { 5.666667, 6.333333, 2.000000, 0.031359 }, // 546 (4 2 7 3) + { 5.777778, 5.777778, 2.222222, 0.035156 }, // 547 (4 2 8 2) + { 5.888889, 5.222222, 2.444444, 0.040359 }, // 548 (4 2 9 1) + { 6.000000, 4.666667, 2.666667, 0.047872 }, // 549 (4 2 10 0) + { 5.333333, 9.333333, 0.666667, 0.020270 }, // 550 (4 3 0 9) + { 5.444445, 8.777778, 0.888889, 0.021277 }, // 551 (4 3 1 8) + { 5.555556, 8.222222, 1.111111, 0.022500 }, // 552 (4 3 2 7) + { 5.666667, 7.666667, 1.333333, 0.024000 }, // 553 (4 3 3 6) + { 5.777778, 7.111111, 1.555556, 0.025862 }, // 554 (4 3 4 5) + { 5.888889, 6.555556, 1.777778, 0.028213 }, // 555 (4 3 5 4) + { 6.000000, 6.000000, 2.000000, 0.031250 }, // 556 (4 3 6 3) + { 6.111111, 5.444445, 2.222222, 0.035294 }, // 557 (4 3 7 2) + { 6.222222, 4.888889, 2.444444, 0.040909 }, // 558 (4 3 8 1) + { 6.333333, 4.333333, 2.666667, 0.049180 }, // 559 (4 3 9 0) + { 5.777778, 8.444445, 0.888889, 0.020833 }, // 560 (4 4 0 8) + { 5.888889, 7.888889, 1.111111, 0.022113 }, // 561 (4 4 1 7) + { 6.000000, 7.333333, 1.333333, 0.023684 }, // 562 (4 4 2 6) + { 6.111111, 6.777778, 1.555556, 0.025641 }, // 563 (4 4 3 5) + { 6.222222, 6.222222, 1.777778, 0.028125 }, // 564 (4 4 4 4) + { 6.333333, 5.666667, 2.000000, 0.031359 }, // 565 (4 4 5 3) + { 6.444444, 5.111112, 2.222222, 0.035714 }, // 566 (4 4 6 2) + { 6.555555, 4.555556, 2.444444, 0.041860 }, // 567 (4 4 7 1) + { 6.666667, 4.000000, 2.666667, 0.051136 }, // 568 (4 4 8 0) + { 6.222222, 7.555555, 1.111111, 0.021845 }, // 569 (4 5 0 7) + { 6.333333, 7.000000, 1.333333, 0.023499 }, // 570 (4 5 1 6) + { 6.444445, 6.444445, 1.555556, 0.025568 }, // 571 (4 5 2 5) + { 6.555556, 5.888889, 1.777778, 0.028213 }, // 572 (4 5 3 4) + { 6.666667, 5.333333, 2.000000, 0.031690 }, // 573 (4 5 4 3) + { 6.777778, 4.777778, 2.222222, 0.036437 }, // 574 (4 5 5 2) + { 6.888889, 4.222222, 2.444444, 0.043269 }, // 575 (4 5 6 1) + { 7.000000, 3.666667, 2.666667, 0.053892 }, // 576 (4 5 7 0) + { 6.666667, 6.666667, 1.333333, 0.023438 }, // 577 (4 6 0 6) + { 6.777778, 6.111111, 1.555556, 0.025641 }, // 578 (4 6 1 5) + { 6.888889, 5.555555, 1.777778, 0.028481 }, // 579 (4 6 2 4) + { 7.000000, 5.000000, 2.000000, 0.032258 }, // 580 (4 6 3 3) + { 7.111112, 4.444444, 2.222222, 0.037500 }, // 581 (4 6 4 2) + { 7.222222, 3.888889, 2.444444, 0.045226 }, // 582 (4 6 5 1) + { 7.333333, 3.333333, 2.666667, 0.057692 }, // 583 (4 6 6 0) + { 7.111111, 5.777778, 1.555556, 0.025862 }, // 584 (4 7 0 5) + { 7.222222, 5.222222, 1.777778, 0.028939 }, // 585 (4 7 1 4) + { 7.333333, 4.666667, 2.000000, 0.033088 }, // 586 (4 7 2 3) + { 7.444445, 4.111111, 2.222222, 0.038961 }, // 587 (4 7 3 2) + { 7.555556, 3.555555, 2.444444, 0.047872 }, // 588 (4 7 4 1) + { 7.666667, 3.000000, 2.666667, 0.062937 }, // 589 (4 7 5 0) + { 7.555555, 4.888889, 1.777778, 0.029605 }, // 590 (4 8 0 4) + { 7.666667, 4.333333, 2.000000, 0.034221 }, // 591 (4 8 1 3) + { 7.777778, 3.777778, 2.222222, 0.040909 }, // 592 (4 8 2 2) + { 7.888889, 3.222222, 2.444444, 0.051429 }, // 593 (4 8 3 1) + { 8.000000, 2.666667, 2.666667, 0.070312 }, // 594 (4 8 4 0) + { 8.000000, 4.000000, 2.000000, 0.035714 }, // 595 (4 9 0 3) + { 8.111111, 3.444444, 2.222222, 0.043478 }, // 596 (4 9 1 2) + { 8.222222, 2.888889, 2.444444, 0.056250 }, // 597 (4 9 2 1) + { 8.333333, 2.333333, 2.666667, 0.081081 }, // 598 (4 9 3 0) + { 8.444445, 3.111111, 2.222222, 0.046875 }, // 599 (4 10 0 2) + { 8.555555, 2.555556, 2.444444, 0.062937 }, // 600 (4 10 1 1) + { 8.666667, 2.000000, 2.666667, 0.097826 }, // 601 (4 10 2 0) + { 8.888889, 2.222222, 2.444444, 0.072581 }, // 602 (4 11 0 1) + { 9.000000, 1.666667, 2.666667, 0.126761 }, // 603 (4 11 1 0) + { 9.333334, 1.333333, 2.666667, 0.187500 }, // 604 (4 12 0 0) + { 5.000000, 11.000000, 0.000000, 0.018182 }, // 605 (5 0 0 11) + { 5.111111, 10.444445, 0.222222, 0.018750 }, // 606 (5 0 1 10) + { 5.222222, 9.888889, 0.444444, 0.019438 }, // 607 (5 0 2 9) + { 5.333333, 9.333333, 0.666667, 0.020270 }, // 608 (5 0 3 8) + { 5.444445, 8.777778, 0.888889, 0.021277 }, // 609 (5 0 4 7) + { 5.555555, 8.222222, 1.111111, 0.022500 }, // 610 (5 0 5 6) + { 5.666667, 7.666667, 1.333333, 0.024000 }, // 611 (5 0 6 5) + { 5.777778, 7.111111, 1.555556, 0.025862 }, // 612 (5 0 7 4) + { 5.888889, 6.555555, 1.777778, 0.028213 }, // 613 (5 0 8 3) + { 6.000000, 6.000000, 2.000000, 0.031250 }, // 614 (5 0 9 2) + { 6.111111, 5.444445, 2.222222, 0.035294 }, // 615 (5 0 10 1) + { 6.222222, 4.888889, 2.444444, 0.040909 }, // 616 (5 0 11 0) + { 5.444445, 10.111111, 0.222222, 0.018182 }, // 617 (5 1 0 10) + { 5.555556, 9.555555, 0.444444, 0.018908 }, // 618 (5 1 1 9) + { 5.666667, 9.000000, 0.666667, 0.019780 }, // 619 (5 1 2 8) + { 5.777778, 8.444444, 0.888889, 0.020833 }, // 620 (5 1 3 7) + { 5.888889, 7.888889, 1.111111, 0.022113 }, // 621 (5 1 4 6) + { 6.000000, 7.333333, 1.333333, 0.023684 }, // 622 (5 1 5 5) + { 6.111111, 6.777778, 1.555556, 0.025641 }, // 623 (5 1 6 4) + { 6.222222, 6.222222, 1.777778, 0.028125 }, // 624 (5 1 7 3) + { 6.333333, 5.666667, 2.000000, 0.031359 }, // 625 (5 1 8 2) + { 6.444445, 5.111111, 2.222222, 0.035714 }, // 626 (5 1 9 1) + { 6.555556, 4.555556, 2.444444, 0.041860 }, // 627 (5 1 10 0) + { 5.888889, 9.222222, 0.444444, 0.018480 }, // 628 (5 2 0 9) + { 6.000000, 8.666667, 0.666667, 0.019397 }, // 629 (5 2 1 8) + { 6.111111, 8.111111, 0.888889, 0.020501 }, // 630 (5 2 2 7) + { 6.222222, 7.555556, 1.111111, 0.021845 }, // 631 (5 2 3 6) + { 6.333333, 7.000000, 1.333333, 0.023499 }, // 632 (5 2 4 5) + { 6.444445, 6.444445, 1.555556, 0.025568 }, // 633 (5 2 5 4) + { 6.555555, 5.888889, 1.777778, 0.028213 }, // 634 (5 2 6 3) + { 6.666667, 5.333333, 2.000000, 0.031690 }, // 635 (5 2 7 2) + { 6.777778, 4.777778, 2.222222, 0.036437 }, // 636 (5 2 8 1) + { 6.888889, 4.222222, 2.444444, 0.043269 }, // 637 (5 2 9 0) + { 6.333333, 8.333333, 0.666667, 0.019108 }, // 638 (5 3 0 8) + { 6.444445, 7.777778, 0.888889, 0.020270 }, // 639 (5 3 1 7) + { 6.555556, 7.222222, 1.111111, 0.021687 }, // 640 (5 3 2 6) + { 6.666667, 6.666667, 1.333333, 0.023437 }, // 641 (5 3 3 5) + { 6.777778, 6.111111, 1.555556, 0.025641 }, // 642 (5 3 4 4) + { 6.888889, 5.555556, 1.777778, 0.028481 }, // 643 (5 3 5 3) + { 7.000000, 5.000000, 2.000000, 0.032258 }, // 644 (5 3 6 2) + { 7.111111, 4.444445, 2.222222, 0.037500 }, // 645 (5 3 7 1) + { 7.222222, 3.888889, 2.444444, 0.045226 }, // 646 (5 3 8 0) + { 6.777778, 7.444445, 0.888889, 0.020134 }, // 647 (5 4 0 7) + { 6.888889, 6.888889, 1.111111, 0.021635 }, // 648 (5 4 1 6) + { 7.000000, 6.333333, 1.333333, 0.023499 }, // 649 (5 4 2 5) + { 7.111111, 5.777778, 1.555556, 0.025862 }, // 650 (5 4 3 4) + { 7.222222, 5.222222, 1.777778, 0.028939 }, // 651 (5 4 4 3) + { 7.333333, 4.666667, 2.000000, 0.033088 }, // 652 (5 4 5 2) + { 7.444444, 4.111111, 2.222222, 0.038961 }, // 653 (5 4 6 1) + { 7.555555, 3.555556, 2.444444, 0.047872 }, // 654 (5 4 7 0) + { 7.222222, 6.555555, 1.111111, 0.021687 }, // 655 (5 5 0 6) + { 7.333333, 6.000000, 1.333333, 0.023684 }, // 656 (5 5 1 5) + { 7.444445, 5.444445, 1.555556, 0.026239 }, // 657 (5 5 2 4) + { 7.555556, 4.888889, 1.777778, 0.029605 }, // 658 (5 5 3 3) + { 7.666667, 4.333333, 2.000000, 0.034221 }, // 659 (5 5 4 2) + { 7.777778, 3.777778, 2.222222, 0.040909 }, // 660 (5 5 5 1) + { 7.888889, 3.222222, 2.444444, 0.051429 }, // 661 (5 5 6 0) + { 7.666667, 5.666667, 1.333333, 0.024000 }, // 662 (5 6 0 5) + { 7.777778, 5.111111, 1.555556, 0.026786 }, // 663 (5 6 1 4) + { 7.888889, 4.555555, 1.777778, 0.030508 }, // 664 (5 6 2 3) + { 8.000000, 4.000000, 2.000000, 0.035714 }, // 665 (5 6 3 2) + { 8.111112, 3.444444, 2.222222, 0.043478 }, // 666 (5 6 4 1) + { 8.222222, 2.888889, 2.444444, 0.056250 }, // 667 (5 6 5 0) + { 8.111111, 4.777778, 1.555556, 0.027523 }, // 668 (5 7 0 4) + { 8.222221, 4.222222, 1.777778, 0.031690 }, // 669 (5 7 1 3) + { 8.333333, 3.666667, 2.000000, 0.037657 }, // 670 (5 7 2 2) + { 8.444444, 3.111111, 2.222222, 0.046875 }, // 671 (5 7 3 1) + { 8.555555, 2.555556, 2.444444, 0.062937 }, // 672 (5 7 4 0) + { 8.555555, 3.888889, 1.777778, 0.033210 }, // 673 (5 8 0 3) + { 8.666666, 3.333333, 2.000000, 0.040179 }, // 674 (5 8 1 2) + { 8.777778, 2.777778, 2.222222, 0.051429 }, // 675 (5 8 2 1) + { 8.888888, 2.222222, 2.444444, 0.072581 }, // 676 (5 8 3 0) + { 9.000000, 3.000000, 2.000000, 0.043478 }, // 677 (5 9 0 2) + { 9.111111, 2.444444, 2.222222, 0.057692 }, // 678 (5 9 1 1) + { 9.222222, 1.888889, 2.444444, 0.087379 }, // 679 (5 9 2 0) + { 9.444445, 2.111111, 2.222222, 0.066667 }, // 680 (5 10 0 1) + { 9.555555, 1.555556, 2.444444, 0.112500 }, // 681 (5 10 1 0) + { 9.888889, 1.222222, 2.444444, 0.163636 }, // 682 (5 11 0 0) + { 6.000000, 10.000000, 0.000000, 0.016667 }, // 683 (6 0 0 10) + { 6.111111, 9.444445, 0.222222, 0.017341 }, // 684 (6 0 1 9) + { 6.222222, 8.888889, 0.444444, 0.018145 }, // 685 (6 0 2 8) + { 6.333333, 8.333333, 0.666667, 0.019108 }, // 686 (6 0 3 7) + { 6.444445, 7.777778, 0.888889, 0.020270 }, // 687 (6 0 4 6) + { 6.555555, 7.222222, 1.111111, 0.021687 }, // 688 (6 0 5 5) + { 6.666667, 6.666667, 1.333333, 0.023438 }, // 689 (6 0 6 4) + { 6.777778, 6.111111, 1.555556, 0.025641 }, // 690 (6 0 7 3) + { 6.888889, 5.555555, 1.777778, 0.028481 }, // 691 (6 0 8 2) + { 7.000000, 5.000000, 2.000000, 0.032258 }, // 692 (6 0 9 1) + { 7.111111, 4.444445, 2.222222, 0.037500 }, // 693 (6 0 10 0) + { 6.444445, 9.111111, 0.222222, 0.017045 }, // 694 (6 1 0 9) + { 6.555556, 8.555555, 0.444444, 0.017893 }, // 695 (6 1 1 8) + { 6.666667, 8.000000, 0.666667, 0.018908 }, // 696 (6 1 2 7) + { 6.777778, 7.444445, 0.888889, 0.020134 }, // 697 (6 1 3 6) + { 6.888889, 6.888889, 1.111111, 0.021635 }, // 698 (6 1 4 5) + { 7.000000, 6.333333, 1.333333, 0.023499 }, // 699 (6 1 5 4) + { 7.111111, 5.777778, 1.555556, 0.025862 }, // 700 (6 1 6 3) + { 7.222222, 5.222222, 1.777778, 0.028939 }, // 701 (6 1 7 2) + { 7.333333, 4.666667, 2.000000, 0.033088 }, // 702 (6 1 8 1) + { 7.444445, 4.111111, 2.222222, 0.038961 }, // 703 (6 1 9 0) + { 6.888889, 8.222222, 0.444444, 0.017717 }, // 704 (6 2 0 8) + { 7.000000, 7.666667, 0.666667, 0.018789 }, // 705 (6 2 1 7) + { 7.111111, 7.111111, 0.888889, 0.020089 }, // 706 (6 2 2 6) + { 7.222222, 6.555556, 1.111111, 0.021687 }, // 707 (6 2 3 5) + { 7.333333, 6.000000, 1.333333, 0.023684 }, // 708 (6 2 4 4) + { 7.444445, 5.444445, 1.555556, 0.026239 }, // 709 (6 2 5 3) + { 7.555555, 4.888889, 1.777778, 0.029605 }, // 710 (6 2 6 2) + { 7.666667, 4.333333, 2.000000, 0.034221 }, // 711 (6 2 7 1) + { 7.777778, 3.777778, 2.222222, 0.040909 }, // 712 (6 2 8 0) + { 7.333333, 7.333333, 0.666667, 0.018750 }, // 713 (6 3 0 7) + { 7.444445, 6.777778, 0.888889, 0.020134 }, // 714 (6 3 1 6) + { 7.555556, 6.222222, 1.111111, 0.021845 }, // 715 (6 3 2 5) + { 7.666667, 5.666667, 1.333333, 0.024000 }, // 716 (6 3 3 4) + { 7.777778, 5.111111, 1.555556, 0.026786 }, // 717 (6 3 4 3) + { 7.888889, 4.555556, 1.777778, 0.030508 }, // 718 (6 3 5 2) + { 8.000000, 4.000000, 2.000000, 0.035714 }, // 719 (6 3 6 1) + { 8.111112, 3.444444, 2.222222, 0.043478 }, // 720 (6 3 7 0) + { 7.777778, 6.444445, 0.888889, 0.020270 }, // 721 (6 4 0 6) + { 7.888889, 5.888889, 1.111111, 0.022113 }, // 722 (6 4 1 5) + { 8.000000, 5.333333, 1.333333, 0.024457 }, // 723 (6 4 2 4) + { 8.111111, 4.777778, 1.555556, 0.027523 }, // 724 (6 4 3 3) + { 8.222222, 4.222222, 1.777778, 0.031690 }, // 725 (6 4 4 2) + { 8.333333, 3.666667, 2.000000, 0.037657 }, // 726 (6 4 5 1) + { 8.444445, 3.111111, 2.222222, 0.046875 }, // 727 (6 4 6 0) + { 8.222222, 5.555555, 1.111111, 0.022500 }, // 728 (6 5 0 5) + { 8.333333, 5.000000, 1.333333, 0.025070 }, // 729 (6 5 1 4) + { 8.444445, 4.444445, 1.555556, 0.028481 }, // 730 (6 5 2 3) + { 8.555555, 3.888889, 1.777778, 0.033210 }, // 731 (6 5 3 2) + { 8.666667, 3.333333, 2.000000, 0.040179 }, // 732 (6 5 4 1) + { 8.777778, 2.777778, 2.222222, 0.051429 }, // 733 (6 5 5 0) + { 8.666667, 4.666667, 1.333333, 0.025862 }, // 734 (6 6 0 4) + { 8.777778, 4.111111, 1.555556, 0.029703 }, // 735 (6 6 1 3) + { 8.888889, 3.555556, 1.777778, 0.035156 }, // 736 (6 6 2 2) + { 9.000000, 3.000000, 2.000000, 0.043478 }, // 737 (6 6 3 1) + { 9.111112, 2.444444, 2.222222, 0.057692 }, // 738 (6 6 4 0) + { 9.111111, 3.777778, 1.555556, 0.031250 }, // 739 (6 7 0 3) + { 9.222221, 3.222222, 1.777778, 0.037657 }, // 740 (6 7 1 2) + { 9.333333, 2.666667, 2.000000, 0.047872 }, // 741 (6 7 2 1) + { 9.444444, 2.111111, 2.222222, 0.066667 }, // 742 (6 7 3 0) + { 9.555555, 2.888889, 1.777778, 0.040909 }, // 743 (6 8 0 2) + { 9.666666, 2.333333, 2.000000, 0.053892 }, // 744 (6 8 1 1) + { 9.777778, 1.777778, 2.222222, 0.080357 }, // 745 (6 8 2 0) + { 10.000000, 2.000000, 2.000000, 0.062500 }, // 746 (6 9 0 1) + { 10.111111, 1.444444, 2.222222, 0.103448 }, // 747 (6 9 1 0) + { 10.444445, 1.111111, 2.222222, 0.150000 }, // 748 (6 10 0 0) + { 7.000000, 9.000000, 0.000000, 0.015873 }, // 749 (7 0 0 9) + { 7.111111, 8.444445, 0.222222, 0.016667 }, // 750 (7 0 1 8) + { 7.222222, 7.888889, 0.444444, 0.017613 }, // 751 (7 0 2 7) + { 7.333333, 7.333333, 0.666667, 0.018750 }, // 752 (7 0 3 6) + { 7.444445, 6.777778, 0.888889, 0.020134 }, // 753 (7 0 4 5) + { 7.555555, 6.222222, 1.111111, 0.021845 }, // 754 (7 0 5 4) + { 7.666667, 5.666667, 1.333333, 0.024000 }, // 755 (7 0 6 3) + { 7.777778, 5.111111, 1.555556, 0.026786 }, // 756 (7 0 7 2) + { 7.888889, 4.555555, 1.777778, 0.030508 }, // 757 (7 0 8 1) + { 8.000000, 4.000000, 2.000000, 0.035714 }, // 758 (7 0 9 0) + { 7.444445, 8.111111, 0.222222, 0.016575 }, // 759 (7 1 0 8) + { 7.555556, 7.555556, 0.444444, 0.017578 }, // 760 (7 1 1 7) + { 7.666667, 7.000000, 0.666667, 0.018789 }, // 761 (7 1 2 6) + { 7.777778, 6.444445, 0.888889, 0.020270 }, // 762 (7 1 3 5) + { 7.888889, 5.888889, 1.111111, 0.022113 }, // 763 (7 1 4 4) + { 8.000000, 5.333333, 1.333333, 0.024457 }, // 764 (7 1 5 3) + { 8.111112, 4.777778, 1.555556, 0.027523 }, // 765 (7 1 6 2) + { 8.222222, 4.222222, 1.777778, 0.031690 }, // 766 (7 1 7 1) + { 8.333334, 3.666667, 2.000000, 0.037657 }, // 767 (7 1 8 0) + { 7.888889, 7.222222, 0.444444, 0.017613 }, // 768 (7 2 0 7) + { 8.000000, 6.666667, 0.666667, 0.018908 }, // 769 (7 2 1 6) + { 8.111111, 6.111111, 0.888889, 0.020501 }, // 770 (7 2 2 5) + { 8.222222, 5.555556, 1.111111, 0.022500 }, // 771 (7 2 3 4) + { 8.333333, 5.000000, 1.333333, 0.025070 }, // 772 (7 2 4 3) + { 8.444445, 4.444445, 1.555556, 0.028481 }, // 773 (7 2 5 2) + { 8.555555, 3.888889, 1.777778, 0.033210 }, // 774 (7 2 6 1) + { 8.666667, 3.333333, 2.000000, 0.040179 }, // 775 (7 2 7 0) + { 8.333333, 6.333333, 0.666667, 0.019108 }, // 776 (7 3 0 6) + { 8.444444, 5.777778, 0.888889, 0.020833 }, // 777 (7 3 1 5) + { 8.555555, 5.222222, 1.111111, 0.023018 }, // 778 (7 3 2 4) + { 8.666666, 4.666667, 1.333333, 0.025862 }, // 779 (7 3 3 3) + { 8.777778, 4.111111, 1.555556, 0.029703 }, // 780 (7 3 4 2) + { 8.888888, 3.555556, 1.777778, 0.035156 }, // 781 (7 3 5 1) + { 9.000000, 3.000000, 2.000000, 0.043478 }, // 782 (7 3 6 0) + { 8.777778, 5.444445, 0.888889, 0.021277 }, // 783 (7 4 0 5) + { 8.888888, 4.888889, 1.111111, 0.023684 }, // 784 (7 4 1 4) + { 9.000000, 4.333333, 1.333333, 0.026866 }, // 785 (7 4 2 3) + { 9.111111, 3.777778, 1.555556, 0.031250 }, // 786 (7 4 3 2) + { 9.222222, 3.222222, 1.777778, 0.037657 }, // 787 (7 4 4 1) + { 9.333333, 2.666667, 2.000000, 0.047872 }, // 788 (7 4 5 0) + { 9.222222, 4.555555, 1.111111, 0.024523 }, // 789 (7 5 0 4) + { 9.333333, 4.000000, 1.333333, 0.028125 }, // 790 (7 5 1 3) + { 9.444445, 3.444444, 1.555556, 0.033210 }, // 791 (7 5 2 2) + { 9.555555, 2.888889, 1.777778, 0.040909 }, // 792 (7 5 3 1) + { 9.666667, 2.333333, 2.000000, 0.053892 }, // 793 (7 5 4 0) + { 9.666667, 3.666667, 1.333333, 0.029703 }, // 794 (7 6 0 3) + { 9.777778, 3.111111, 1.555556, 0.035714 }, // 795 (7 6 1 2) + { 9.888889, 2.555556, 1.777778, 0.045226 }, // 796 (7 6 2 1) + { 10.000000, 2.000000, 2.000000, 0.062500 }, // 797 (7 6 3 0) + { 10.111111, 2.777778, 1.555556, 0.038961 }, // 798 (7 7 0 2) + { 10.222221, 2.222222, 1.777778, 0.051136 }, // 799 (7 7 1 1) + { 10.333333, 1.666667, 2.000000, 0.075630 }, // 800 (7 7 2 0) + { 10.555555, 1.888889, 1.777778, 0.059603 }, // 801 (7 8 0 1) + { 10.666666, 1.333333, 2.000000, 0.097826 }, // 802 (7 8 1 0) + { 11.000000, 1.000000, 2.000000, 0.142857 }, // 803 (7 9 0 0) + { 8.000000, 8.000000, 0.000000, 0.015625 }, // 804 (8 0 0 8) + { 8.111111, 7.444445, 0.222222, 0.016575 }, // 805 (8 0 1 7) + { 8.222222, 6.888889, 0.444444, 0.017717 }, // 806 (8 0 2 6) + { 8.333333, 6.333333, 0.666667, 0.019108 }, // 807 (8 0 3 5) + { 8.444445, 5.777778, 0.888889, 0.020833 }, // 808 (8 0 4 4) + { 8.555555, 5.222222, 1.111111, 0.023018 }, // 809 (8 0 5 3) + { 8.666667, 4.666667, 1.333333, 0.025862 }, // 810 (8 0 6 2) + { 8.777778, 4.111111, 1.555556, 0.029703 }, // 811 (8 0 7 1) + { 8.888889, 3.555556, 1.777778, 0.035156 }, // 812 (8 0 8 0) + { 8.444445, 7.111111, 0.222222, 0.016667 }, // 813 (8 1 0 7) + { 8.555555, 6.555556, 0.444444, 0.017893 }, // 814 (8 1 1 6) + { 8.666667, 6.000000, 0.666667, 0.019397 }, // 815 (8 1 2 5) + { 8.777778, 5.444445, 0.888889, 0.021277 }, // 816 (8 1 3 4) + { 8.888889, 4.888889, 1.111111, 0.023684 }, // 817 (8 1 4 3) + { 9.000000, 4.333333, 1.333333, 0.026866 }, // 818 (8 1 5 2) + { 9.111112, 3.777778, 1.555556, 0.031250 }, // 819 (8 1 6 1) + { 9.222222, 3.222222, 1.777778, 0.037657 }, // 820 (8 1 7 0) + { 8.888889, 6.222222, 0.444444, 0.018145 }, // 821 (8 2 0 6) + { 9.000000, 5.666667, 0.666667, 0.019780 }, // 822 (8 2 1 5) + { 9.111112, 5.111111, 0.888889, 0.021845 }, // 823 (8 2 2 4) + { 9.222222, 4.555556, 1.111111, 0.024523 }, // 824 (8 2 3 3) + { 9.333334, 4.000000, 1.333333, 0.028125 }, // 825 (8 2 4 2) + { 9.444445, 3.444445, 1.555556, 0.033210 }, // 826 (8 2 5 1) + { 9.555556, 2.888889, 1.777778, 0.040909 }, // 827 (8 2 6 0) + { 9.333333, 5.333333, 0.666667, 0.020270 }, // 828 (8 3 0 5) + { 9.444444, 4.777778, 0.888889, 0.022556 }, // 829 (8 3 1 4) + { 9.555555, 4.222222, 1.111111, 0.025568 }, // 830 (8 3 2 3) + { 9.666666, 3.666667, 1.333333, 0.029703 }, // 831 (8 3 3 2) + { 9.777778, 3.111111, 1.555556, 0.035714 }, // 832 (8 3 4 1) + { 9.888888, 2.555556, 1.777778, 0.045226 }, // 833 (8 3 5 0) + { 9.777778, 4.444445, 0.888889, 0.023438 }, // 834 (8 4 0 4) + { 9.888888, 3.888889, 1.111111, 0.026866 }, // 835 (8 4 1 3) + { 10.000000, 3.333333, 1.333333, 0.031690 }, // 836 (8 4 2 2) + { 10.111111, 2.777778, 1.555556, 0.038961 }, // 837 (8 4 3 1) + { 10.222222, 2.222222, 1.777778, 0.051136 }, // 838 (8 4 4 0) + { 10.222222, 3.555556, 1.111111, 0.028481 }, // 839 (8 5 0 3) + { 10.333333, 3.000000, 1.333333, 0.034221 }, // 840 (8 5 1 2) + { 10.444445, 2.444444, 1.555556, 0.043269 }, // 841 (8 5 2 1) + { 10.555555, 1.888889, 1.777778, 0.059603 }, // 842 (8 5 3 0) + { 10.666667, 2.666667, 1.333333, 0.037500 }, // 843 (8 6 0 2) + { 10.777778, 2.111111, 1.555556, 0.049180 }, // 844 (8 6 1 1) + { 10.888889, 1.555556, 1.777778, 0.072581 }, // 845 (8 6 2 0) + { 11.111111, 1.777778, 1.555556, 0.057692 }, // 846 (8 7 0 1) + { 11.222221, 1.222222, 1.777778, 0.094737 }, // 847 (8 7 1 0) + { 11.555555, 0.888889, 1.777778, 0.140625 }, // 848 (8 8 0 0) + { 9.000000, 7.000000, 0.000000, 0.015873 }, // 849 (9 0 0 7) + { 9.111111, 6.444445, 0.222222, 0.017045 }, // 850 (9 0 1 6) + { 9.222222, 5.888889, 0.444444, 0.018480 }, // 851 (9 0 2 5) + { 9.333333, 5.333333, 0.666667, 0.020270 }, // 852 (9 0 3 4) + { 9.444445, 4.777778, 0.888889, 0.022556 }, // 853 (9 0 4 3) + { 9.555555, 4.222222, 1.111111, 0.025568 }, // 854 (9 0 5 2) + { 9.666667, 3.666667, 1.333333, 0.029703 }, // 855 (9 0 6 1) + { 9.777778, 3.111111, 1.555556, 0.035714 }, // 856 (9 0 7 0) + { 9.444445, 6.111111, 0.222222, 0.017341 }, // 857 (9 1 0 6) + { 9.555555, 5.555556, 0.444444, 0.018908 }, // 858 (9 1 1 5) + { 9.666667, 5.000000, 0.666667, 0.020882 }, // 859 (9 1 2 4) + { 9.777778, 4.444445, 0.888889, 0.023438 }, // 860 (9 1 3 3) + { 9.888889, 3.888889, 1.111111, 0.026866 }, // 861 (9 1 4 2) + { 10.000000, 3.333333, 1.333333, 0.031690 }, // 862 (9 1 5 1) + { 10.111112, 2.777778, 1.555556, 0.038961 }, // 863 (9 1 6 0) + { 9.888889, 5.222222, 0.444444, 0.019438 }, // 864 (9 2 0 5) + { 10.000000, 4.666667, 0.666667, 0.021635 }, // 865 (9 2 1 4) + { 10.111112, 4.111111, 0.888889, 0.024523 }, // 866 (9 2 2 3) + { 10.222222, 3.555556, 1.111111, 0.028481 }, // 867 (9 2 3 2) + { 10.333334, 3.000000, 1.333333, 0.034221 }, // 868 (9 2 4 1) + { 10.444445, 2.444445, 1.555556, 0.043269 }, // 869 (9 2 5 0) + { 10.333333, 4.333333, 0.666667, 0.022556 }, // 870 (9 3 0 4) + { 10.444444, 3.777778, 0.888889, 0.025862 }, // 871 (9 3 1 3) + { 10.555555, 3.222222, 1.111111, 0.030508 }, // 872 (9 3 2 2) + { 10.666666, 2.666667, 1.333333, 0.037500 }, // 873 (9 3 3 1) + { 10.777778, 2.111111, 1.555556, 0.049180 }, // 874 (9 3 4 0) + { 10.777778, 3.444444, 0.888889, 0.027523 }, // 875 (9 4 0 3) + { 10.888888, 2.888889, 1.111111, 0.033088 }, // 876 (9 4 1 2) + { 11.000000, 2.333333, 1.333333, 0.041860 }, // 877 (9 4 2 1) + { 11.111111, 1.777778, 1.555556, 0.057692 }, // 878 (9 4 3 0) + { 11.222222, 2.555556, 1.111111, 0.036437 }, // 879 (9 5 0 2) + { 11.333333, 2.000000, 1.333333, 0.047872 }, // 880 (9 5 1 1) + { 11.444445, 1.444444, 1.555556, 0.070866 }, // 881 (9 5 2 0) + { 11.666667, 1.666667, 1.333333, 0.056604 }, // 882 (9 6 0 1) + { 11.777778, 1.111111, 1.555556, 0.093750 }, // 883 (9 6 1 0) + { 12.111111, 0.777778, 1.555556, 0.142857 }, // 884 (9 7 0 0) + { 10.000000, 6.000000, 0.000000, 0.016667 }, // 885 (10 0 0 6) + { 10.111111, 5.444445, 0.222222, 0.018182 }, // 886 (10 0 1 5) + { 10.222222, 4.888889, 0.444444, 0.020089 }, // 887 (10 0 2 4) + { 10.333333, 4.333333, 0.666667, 0.022556 }, // 888 (10 0 3 3) + { 10.444445, 3.777778, 0.888889, 0.025862 }, // 889 (10 0 4 2) + { 10.555555, 3.222222, 1.111111, 0.030508 }, // 890 (10 0 5 1) + { 10.666667, 2.666667, 1.333333, 0.037500 }, // 891 (10 0 6 0) + { 10.444445, 5.111111, 0.222222, 0.018750 }, // 892 (10 1 0 5) + { 10.555555, 4.555556, 0.444444, 0.020882 }, // 893 (10 1 1 4) + { 10.666667, 4.000000, 0.666667, 0.023684 }, // 894 (10 1 2 3) + { 10.777778, 3.444445, 0.888889, 0.027523 }, // 895 (10 1 3 2) + { 10.888889, 2.888889, 1.111111, 0.033088 }, // 896 (10 1 4 1) + { 11.000000, 2.333333, 1.333333, 0.041860 }, // 897 (10 1 5 0) + { 10.888889, 4.222222, 0.444444, 0.021845 }, // 898 (10 2 0 4) + { 11.000000, 3.666667, 0.666667, 0.025070 }, // 899 (10 2 1 3) + { 11.111112, 3.111111, 0.888889, 0.029605 }, // 900 (10 2 2 2) + { 11.222222, 2.555556, 1.111111, 0.036437 }, // 901 (10 2 3 1) + { 11.333334, 2.000000, 1.333333, 0.047872 }, // 902 (10 2 4 0) + { 11.333333, 3.333333, 0.666667, 0.026786 }, // 903 (10 3 0 3) + { 11.444444, 2.777778, 0.888889, 0.032258 }, // 904 (10 3 1 2) + { 11.555555, 2.222222, 1.111111, 0.040909 }, // 905 (10 3 2 1) + { 11.666666, 1.666667, 1.333333, 0.056604 }, // 906 (10 3 3 0) + { 11.777778, 2.444444, 0.888889, 0.035714 }, // 907 (10 4 0 2) + { 11.888888, 1.888889, 1.111111, 0.047120 }, // 908 (10 4 1 1) + { 12.000000, 1.333333, 1.333333, 0.070312 }, // 909 (10 4 2 0) + { 12.222222, 1.555556, 1.111111, 0.056250 }, // 910 (10 5 0 1) + { 12.333333, 1.000000, 1.333333, 0.094737 }, // 911 (10 5 1 0) + { 12.666667, 0.666667, 1.333333, 0.150000 }, // 912 (10 6 0 0) + { 11.000000, 5.000000, 0.000000, 0.018182 }, // 913 (11 0 0 5) + { 11.111111, 4.444445, 0.222222, 0.020270 }, // 914 (11 0 1 4) + { 11.222222, 3.888889, 0.444444, 0.023018 }, // 915 (11 0 2 3) + { 11.333333, 3.333333, 0.666667, 0.026786 }, // 916 (11 0 3 2) + { 11.444445, 2.777778, 0.888889, 0.032258 }, // 917 (11 0 4 1) + { 11.555555, 2.222222, 1.111111, 0.040909 }, // 918 (11 0 5 0) + { 11.444445, 4.111111, 0.222222, 0.021277 }, // 919 (11 1 0 4) + { 11.555555, 3.555556, 0.444444, 0.024457 }, // 920 (11 1 1 3) + { 11.666667, 3.000000, 0.666667, 0.028939 }, // 921 (11 1 2 2) + { 11.777778, 2.444445, 0.888889, 0.035714 }, // 922 (11 1 3 1) + { 11.888889, 1.888889, 1.111111, 0.047120 }, // 923 (11 1 4 0) + { 11.888889, 3.222222, 0.444444, 0.026239 }, // 924 (11 2 0 3) + { 12.000000, 2.666667, 0.666667, 0.031690 }, // 925 (11 2 1 2) + { 12.111112, 2.111111, 0.888889, 0.040359 }, // 926 (11 2 2 1) + { 12.222222, 1.555556, 1.111111, 0.056250 }, // 927 (11 2 3 0) + { 12.333333, 2.333333, 0.666667, 0.035294 }, // 928 (11 3 0 2) + { 12.444444, 1.777778, 0.888889, 0.046875 }, // 929 (11 3 1 1) + { 12.555555, 1.222222, 1.111111, 0.070866 }, // 930 (11 3 2 0) + { 12.777778, 1.444444, 0.888889, 0.056604 }, // 931 (11 4 0 1) + { 12.888888, 0.888889, 1.111111, 0.097826 }, // 932 (11 4 1 0) + { 13.222222, 0.555556, 1.111111, 0.163636 }, // 933 (11 5 0 0) + { 12.000000, 4.000000, 0.000000, 0.020833 }, // 934 (12 0 0 4) + { 12.111111, 3.444444, 0.222222, 0.024000 }, // 935 (12 0 1 3) + { 12.222222, 2.888889, 0.444444, 0.028481 }, // 936 (12 0 2 2) + { 12.333333, 2.333333, 0.666667, 0.035294 }, // 937 (12 0 3 1) + { 12.444445, 1.777778, 0.888889, 0.046875 }, // 938 (12 0 4 0) + { 12.444445, 3.111111, 0.222222, 0.025862 }, // 939 (12 1 0 3) + { 12.555555, 2.555556, 0.444444, 0.031359 }, // 940 (12 1 1 2) + { 12.666667, 2.000000, 0.666667, 0.040179 }, // 941 (12 1 2 1) + { 12.777778, 1.444445, 0.888889, 0.056604 }, // 942 (12 1 3 0) + { 12.888889, 2.222222, 0.444444, 0.035156 }, // 943 (12 2 0 2) + { 13.000000, 1.666667, 0.666667, 0.047120 }, // 944 (12 2 1 1) + { 13.111112, 1.111111, 0.888889, 0.072581 }, // 945 (12 2 2 0) + { 13.333333, 1.333333, 0.666667, 0.057692 }, // 946 (12 3 0 1) + { 13.444444, 0.777778, 0.888889, 0.103448 }, // 947 (12 3 1 0) + { 13.777778, 0.444444, 0.888889, 0.187500 }, // 948 (12 4 0 0) + { 13.000000, 3.000000, 0.000000, 0.025641 }, // 949 (13 0 0 3) + { 13.111111, 2.444444, 0.222222, 0.031250 }, // 950 (13 0 1 2) + { 13.222222, 1.888889, 0.444444, 0.040359 }, // 951 (13 0 2 1) + { 13.333333, 1.333333, 0.666667, 0.057692 }, // 952 (13 0 3 0) + { 13.444445, 2.111111, 0.222222, 0.035294 }, // 953 (13 1 0 2) + { 13.555555, 1.555556, 0.444444, 0.047872 }, // 954 (13 1 1 1) + { 13.666667, 1.000000, 0.666667, 0.075630 }, // 955 (13 1 2 0) + { 13.888889, 1.222222, 0.444444, 0.059603 }, // 956 (13 2 0 1) + { 14.000000, 0.666667, 0.666667, 0.112500 }, // 957 (13 2 1 0) + { 14.333333, 0.333333, 0.666667, 0.230769 }, // 958 (13 3 0 0) + { 14.000000, 2.000000, 0.000000, 0.035714 }, // 959 (14 0 0 2) + { 14.111111, 1.444444, 0.222222, 0.049180 }, // 960 (14 0 1 1) + { 14.222222, 0.888889, 0.444444, 0.080357 }, // 961 (14 0 2 0) + { 14.444445, 1.111111, 0.222222, 0.062500 }, // 962 (14 1 0 1) + { 14.555555, 0.555556, 0.444444, 0.126761 }, // 963 (14 1 1 0) + { 14.888889, 0.222222, 0.444444, 0.321429 }, // 964 (14 2 0 0) + { 15.000000, 1.000000, 0.000000, 0.066667 }, // 965 (15 0 0 1) + { 15.111111, 0.444444, 0.222222, 0.150000 }, // 966 (15 0 1 0) + { 15.444445, 0.111111, 0.222222, 0.600000 }, // 967 (15 1 0 0) + { 16.000000, 0.000000, 0.000000, INFINITY }, // 968 (16 0 0 0) +}; // 969 four cluster elements +