From 6ff8072e8c5a6dc1301e884f5a648a0b63bdd48a Mon Sep 17 00:00:00 2001 From: Arnur Nigmetov Date: Tue, 3 Dec 2019 20:34:28 +0100 Subject: Rename directories for bottleneck and Wasserstein --- bottleneck/.gitignore | 36 + bottleneck/CMakeLists.txt | 38 + bottleneck/README | 98 + bottleneck/example/CMakeLists.txt | 27 + bottleneck/example/bottleneck_dist.cpp | 96 + bottleneck/include/basic_defs_bt.h | 569 + bottleneck/include/bottleneck.h | 153 + bottleneck/include/bottleneck_detail.h | 90 + bottleneck/include/bottleneck_detail.hpp | 636 + bottleneck/include/bound_match.h | 109 + bottleneck/include/bound_match.hpp | 511 + bottleneck/include/catch/catch.hpp | 11545 +++++++++++++++++++ bottleneck/include/def_debug_bt.h | 42 + bottleneck/include/diagram_reader.h | 196 + bottleneck/include/diagram_traits.h | 45 + bottleneck/include/dnn/geometry/euclidean-fixed.h | 162 + bottleneck/include/dnn/local/kd-tree.h | 106 + bottleneck/include/dnn/local/kd-tree.hpp | 296 + bottleneck/include/dnn/local/search-functors.h | 119 + bottleneck/include/dnn/parallel/tbb.h | 235 + bottleneck/include/dnn/parallel/utils.h | 100 + bottleneck/include/dnn/utils.h | 47 + bottleneck/include/neighb_oracle.h | 295 + bottleneck/tests/data/test_001_A | 1 + bottleneck/tests/data/test_001_B | 1 + bottleneck/tests/data/test_002_A | 1 + bottleneck/tests/data/test_002_B | 1 + bottleneck/tests/data/test_003_A | 2 + bottleneck/tests/data/test_003_B | 2 + bottleneck/tests/data/test_004_A | 2 + bottleneck/tests/data/test_004_B | 3 + bottleneck/tests/data/test_005_A | 6 + bottleneck/tests/data/test_005_B | 6 + bottleneck/tests/data/test_006_A | 7 + bottleneck/tests/data/test_006_B | 7 + bottleneck/tests/data/test_007_A | 0 bottleneck/tests/data/test_007_B | 0 bottleneck/tests/data/test_008_A | 1 + bottleneck/tests/data/test_008_B | 1 + bottleneck/tests/data/test_009_A | 1 + bottleneck/tests/data/test_009_B | 1 + bottleneck/tests/data/test_010_A | 100 + bottleneck/tests/data/test_010_B | 100 + bottleneck/tests/data/test_011_A | 200 + bottleneck/tests/data/test_011_B | 200 + bottleneck/tests/data/test_012_A | 5000 ++++++++ bottleneck/tests/data/test_012_B | 5000 ++++++++ bottleneck/tests/data/test_013_A | 5 + bottleneck/tests/data/test_013_B | 5 + bottleneck/tests/data/test_014_A | 1 + bottleneck/tests/data/test_014_B | 1 + bottleneck/tests/data/test_015_A | 1 + bottleneck/tests/data/test_015_B | 1 + bottleneck/tests/data/test_016_A | 220 + bottleneck/tests/data/test_016_B | 193 + bottleneck/tests/data/test_100_A | 2 + bottleneck/tests/data/test_100_B | 2 + bottleneck/tests/data/test_101_A | 2 + bottleneck/tests/data/test_101_B | 2 + bottleneck/tests/data/test_102_A | 2 + bottleneck/tests/data/test_102_B | 2 + bottleneck/tests/data/test_103_A | 2 + bottleneck/tests/data/test_103_B | 2 + bottleneck/tests/data/test_104_A | 2 + bottleneck/tests/data/test_104_B | 2 + bottleneck/tests/data/test_105_A | 2 + bottleneck/tests/data/test_105_B | 2 + bottleneck/tests/data/test_106_A | 2 + bottleneck/tests/data/test_106_B | 2 + bottleneck/tests/data/test_107_A | 2 + bottleneck/tests/data/test_107_B | 2 + bottleneck/tests/data/test_108_A | 2 + bottleneck/tests/data/test_108_B | 2 + bottleneck/tests/data/test_109_A | 2 + bottleneck/tests/data/test_109_B | 2 + bottleneck/tests/data/test_110_A | 2 + bottleneck/tests/data/test_110_B | 2 + bottleneck/tests/data/test_111_A | 2 + bottleneck/tests/data/test_111_B | 2 + bottleneck/tests/data/test_112_A | 2 + bottleneck/tests/data/test_112_B | 2 + bottleneck/tests/data/test_113_A | 2 + bottleneck/tests/data/test_113_B | 2 + bottleneck/tests/data/test_114_A | 2 + bottleneck/tests/data/test_114_B | 2 + bottleneck/tests/data/test_115_A | 2 + bottleneck/tests/data/test_115_B | 2 + bottleneck/tests/data/test_116_A | 2 + bottleneck/tests/data/test_116_B | 2 + bottleneck/tests/data/test_117_A | 2 + bottleneck/tests/data/test_117_B | 2 + bottleneck/tests/data/test_118_A | 2 + bottleneck/tests/data/test_118_B | 2 + bottleneck/tests/data/test_119_A | 2 + bottleneck/tests/data/test_119_B | 2 + bottleneck/tests/data/test_120_A | 3 + bottleneck/tests/data/test_120_B | 3 + bottleneck/tests/data/test_121_A | 3 + bottleneck/tests/data/test_121_B | 3 + bottleneck/tests/data/test_122_A | 3 + bottleneck/tests/data/test_122_B | 3 + bottleneck/tests/data/test_123_A | 3 + bottleneck/tests/data/test_123_B | 3 + bottleneck/tests/data/test_124_A | 3 + bottleneck/tests/data/test_124_B | 3 + bottleneck/tests/data/test_125_A | 3 + bottleneck/tests/data/test_125_B | 3 + bottleneck/tests/data/test_126_A | 3 + bottleneck/tests/data/test_126_B | 3 + bottleneck/tests/data/test_127_A | 3 + bottleneck/tests/data/test_127_B | 3 + bottleneck/tests/data/test_128_A | 3 + bottleneck/tests/data/test_128_B | 3 + bottleneck/tests/data/test_129_A | 3 + bottleneck/tests/data/test_129_B | 3 + bottleneck/tests/data/test_130_A | 3 + bottleneck/tests/data/test_130_B | 3 + bottleneck/tests/data/test_131_A | 3 + bottleneck/tests/data/test_131_B | 3 + bottleneck/tests/data/test_132_A | 3 + bottleneck/tests/data/test_132_B | 3 + bottleneck/tests/data/test_133_A | 3 + bottleneck/tests/data/test_133_B | 3 + bottleneck/tests/data/test_134_A | 3 + bottleneck/tests/data/test_134_B | 3 + bottleneck/tests/data/test_135_A | 3 + bottleneck/tests/data/test_135_B | 3 + bottleneck/tests/data/test_136_A | 3 + bottleneck/tests/data/test_136_B | 3 + bottleneck/tests/data/test_137_A | 3 + bottleneck/tests/data/test_137_B | 3 + bottleneck/tests/data/test_138_A | 3 + bottleneck/tests/data/test_138_B | 3 + bottleneck/tests/data/test_139_A | 3 + bottleneck/tests/data/test_139_B | 3 + bottleneck/tests/data/test_140_A | 4 + bottleneck/tests/data/test_140_B | 4 + bottleneck/tests/data/test_141_A | 4 + bottleneck/tests/data/test_141_B | 4 + bottleneck/tests/data/test_142_A | 4 + bottleneck/tests/data/test_142_B | 4 + bottleneck/tests/data/test_143_A | 4 + bottleneck/tests/data/test_143_B | 4 + bottleneck/tests/data/test_144_A | 4 + bottleneck/tests/data/test_144_B | 4 + bottleneck/tests/data/test_145_A | 4 + bottleneck/tests/data/test_145_B | 4 + bottleneck/tests/data/test_146_A | 4 + bottleneck/tests/data/test_146_B | 4 + bottleneck/tests/data/test_147_A | 4 + bottleneck/tests/data/test_147_B | 4 + bottleneck/tests/data/test_148_A | 4 + bottleneck/tests/data/test_148_B | 4 + bottleneck/tests/data/test_149_A | 4 + bottleneck/tests/data/test_149_B | 4 + bottleneck/tests/data/test_150_A | 4 + bottleneck/tests/data/test_150_B | 4 + bottleneck/tests/data/test_151_A | 4 + bottleneck/tests/data/test_151_B | 4 + bottleneck/tests/data/test_152_A | 4 + bottleneck/tests/data/test_152_B | 4 + bottleneck/tests/data/test_153_A | 4 + bottleneck/tests/data/test_153_B | 4 + bottleneck/tests/data/test_154_A | 4 + bottleneck/tests/data/test_154_B | 4 + bottleneck/tests/data/test_155_A | 4 + bottleneck/tests/data/test_155_B | 4 + bottleneck/tests/data/test_156_A | 4 + bottleneck/tests/data/test_156_B | 4 + bottleneck/tests/data/test_157_A | 4 + bottleneck/tests/data/test_157_B | 4 + bottleneck/tests/data/test_158_A | 4 + bottleneck/tests/data/test_158_B | 4 + bottleneck/tests/data/test_159_A | 4 + bottleneck/tests/data/test_159_B | 4 + bottleneck/tests/data/test_160_A | 5 + bottleneck/tests/data/test_160_B | 5 + bottleneck/tests/data/test_161_A | 5 + bottleneck/tests/data/test_161_B | 5 + bottleneck/tests/data/test_162_A | 5 + bottleneck/tests/data/test_162_B | 5 + bottleneck/tests/data/test_163_A | 5 + bottleneck/tests/data/test_163_B | 5 + bottleneck/tests/data/test_164_A | 5 + bottleneck/tests/data/test_164_B | 5 + bottleneck/tests/data/test_165_A | 5 + bottleneck/tests/data/test_165_B | 5 + bottleneck/tests/data/test_166_A | 5 + bottleneck/tests/data/test_166_B | 5 + bottleneck/tests/data/test_167_A | 5 + bottleneck/tests/data/test_167_B | 5 + bottleneck/tests/data/test_168_A | 5 + bottleneck/tests/data/test_168_B | 5 + bottleneck/tests/data/test_169_A | 5 + bottleneck/tests/data/test_169_B | 5 + bottleneck/tests/data/test_170_A | 5 + bottleneck/tests/data/test_170_B | 5 + bottleneck/tests/data/test_171_A | 5 + bottleneck/tests/data/test_171_B | 5 + bottleneck/tests/data/test_172_A | 5 + bottleneck/tests/data/test_172_B | 5 + bottleneck/tests/data/test_173_A | 5 + bottleneck/tests/data/test_173_B | 5 + bottleneck/tests/data/test_174_A | 5 + bottleneck/tests/data/test_174_B | 5 + bottleneck/tests/data/test_175_A | 5 + bottleneck/tests/data/test_175_B | 5 + bottleneck/tests/data/test_176_A | 5 + bottleneck/tests/data/test_176_B | 5 + bottleneck/tests/data/test_177_A | 5 + bottleneck/tests/data/test_177_B | 5 + bottleneck/tests/data/test_178_A | 5 + bottleneck/tests/data/test_178_B | 5 + bottleneck/tests/data/test_179_A | 5 + bottleneck/tests/data/test_179_B | 5 + bottleneck/tests/data/test_180_A | 6 + bottleneck/tests/data/test_180_B | 6 + bottleneck/tests/data/test_181_A | 6 + bottleneck/tests/data/test_181_B | 6 + bottleneck/tests/data/test_182_A | 6 + bottleneck/tests/data/test_182_B | 6 + bottleneck/tests/data/test_183_A | 6 + bottleneck/tests/data/test_183_B | 6 + bottleneck/tests/data/test_184_A | 6 + bottleneck/tests/data/test_184_B | 6 + bottleneck/tests/data/test_185_A | 6 + bottleneck/tests/data/test_185_B | 6 + bottleneck/tests/data/test_186_A | 6 + bottleneck/tests/data/test_186_B | 6 + bottleneck/tests/data/test_187_A | 6 + bottleneck/tests/data/test_187_B | 6 + bottleneck/tests/data/test_188_A | 6 + bottleneck/tests/data/test_188_B | 6 + bottleneck/tests/data/test_189_A | 6 + bottleneck/tests/data/test_189_B | 6 + bottleneck/tests/data/test_190_A | 6 + bottleneck/tests/data/test_190_B | 6 + bottleneck/tests/data/test_191_A | 6 + bottleneck/tests/data/test_191_B | 6 + bottleneck/tests/data/test_192_A | 6 + bottleneck/tests/data/test_192_B | 6 + bottleneck/tests/data/test_193_A | 6 + bottleneck/tests/data/test_193_B | 6 + bottleneck/tests/data/test_194_A | 6 + bottleneck/tests/data/test_194_B | 6 + bottleneck/tests/data/test_195_A | 6 + bottleneck/tests/data/test_195_B | 6 + bottleneck/tests/data/test_196_A | 6 + bottleneck/tests/data/test_196_B | 6 + bottleneck/tests/data/test_197_A | 6 + bottleneck/tests/data/test_197_B | 6 + bottleneck/tests/data/test_198_A | 6 + bottleneck/tests/data/test_198_B | 6 + bottleneck/tests/data/test_199_A | 6 + bottleneck/tests/data/test_199_B | 6 + bottleneck/tests/data/test_200_A | 7 + bottleneck/tests/data/test_200_B | 7 + bottleneck/tests/data/test_201_A | 7 + bottleneck/tests/data/test_201_B | 7 + bottleneck/tests/data/test_202_A | 7 + bottleneck/tests/data/test_202_B | 7 + bottleneck/tests/data/test_203_A | 7 + bottleneck/tests/data/test_203_B | 7 + bottleneck/tests/data/test_204_A | 7 + bottleneck/tests/data/test_204_B | 7 + bottleneck/tests/data/test_205_A | 7 + bottleneck/tests/data/test_205_B | 7 + bottleneck/tests/data/test_206_A | 7 + bottleneck/tests/data/test_206_B | 7 + bottleneck/tests/data/test_207_A | 7 + bottleneck/tests/data/test_207_B | 7 + bottleneck/tests/data/test_208_A | 7 + bottleneck/tests/data/test_208_B | 7 + bottleneck/tests/data/test_209_A | 7 + bottleneck/tests/data/test_209_B | 7 + bottleneck/tests/data/test_210_A | 7 + bottleneck/tests/data/test_210_B | 7 + bottleneck/tests/data/test_211_A | 7 + bottleneck/tests/data/test_211_B | 7 + bottleneck/tests/data/test_212_A | 7 + bottleneck/tests/data/test_212_B | 7 + bottleneck/tests/data/test_213_A | 7 + bottleneck/tests/data/test_213_B | 7 + bottleneck/tests/data/test_214_A | 7 + bottleneck/tests/data/test_214_B | 7 + bottleneck/tests/data/test_215_A | 7 + bottleneck/tests/data/test_215_B | 7 + bottleneck/tests/data/test_216_A | 7 + bottleneck/tests/data/test_216_B | 7 + bottleneck/tests/data/test_217_A | 7 + bottleneck/tests/data/test_217_B | 7 + bottleneck/tests/data/test_218_A | 7 + bottleneck/tests/data/test_218_B | 7 + bottleneck/tests/data/test_219_A | 7 + bottleneck/tests/data/test_219_B | 7 + bottleneck/tests/data/test_220_A | 8 + bottleneck/tests/data/test_220_B | 8 + bottleneck/tests/data/test_221_A | 8 + bottleneck/tests/data/test_221_B | 8 + bottleneck/tests/data/test_222_A | 8 + bottleneck/tests/data/test_222_B | 8 + bottleneck/tests/data/test_223_A | 8 + bottleneck/tests/data/test_223_B | 8 + bottleneck/tests/data/test_224_A | 8 + bottleneck/tests/data/test_224_B | 8 + bottleneck/tests/data/test_225_A | 8 + bottleneck/tests/data/test_225_B | 8 + bottleneck/tests/data/test_226_A | 8 + bottleneck/tests/data/test_226_B | 8 + bottleneck/tests/data/test_227_A | 8 + bottleneck/tests/data/test_227_B | 8 + bottleneck/tests/data/test_228_A | 8 + bottleneck/tests/data/test_228_B | 8 + bottleneck/tests/data/test_229_A | 8 + bottleneck/tests/data/test_229_B | 8 + bottleneck/tests/data/test_230_A | 8 + bottleneck/tests/data/test_230_B | 8 + bottleneck/tests/data/test_231_A | 8 + bottleneck/tests/data/test_231_B | 8 + bottleneck/tests/data/test_232_A | 8 + bottleneck/tests/data/test_232_B | 8 + bottleneck/tests/data/test_233_A | 8 + bottleneck/tests/data/test_233_B | 8 + bottleneck/tests/data/test_234_A | 8 + bottleneck/tests/data/test_234_B | 8 + bottleneck/tests/data/test_235_A | 8 + bottleneck/tests/data/test_235_B | 8 + bottleneck/tests/data/test_236_A | 8 + bottleneck/tests/data/test_236_B | 8 + bottleneck/tests/data/test_237_A | 8 + bottleneck/tests/data/test_237_B | 8 + bottleneck/tests/data/test_238_A | 8 + bottleneck/tests/data/test_238_B | 8 + bottleneck/tests/data/test_239_A | 8 + bottleneck/tests/data/test_239_B | 8 + bottleneck/tests/data/test_240_A | 9 + bottleneck/tests/data/test_240_B | 9 + bottleneck/tests/data/test_241_A | 9 + bottleneck/tests/data/test_241_B | 9 + bottleneck/tests/data/test_242_A | 9 + bottleneck/tests/data/test_242_B | 9 + bottleneck/tests/data/test_243_A | 9 + bottleneck/tests/data/test_243_B | 9 + bottleneck/tests/data/test_244_A | 9 + bottleneck/tests/data/test_244_B | 9 + bottleneck/tests/data/test_245_A | 9 + bottleneck/tests/data/test_245_B | 9 + bottleneck/tests/data/test_246_A | 9 + bottleneck/tests/data/test_246_B | 9 + bottleneck/tests/data/test_247_A | 9 + bottleneck/tests/data/test_247_B | 9 + bottleneck/tests/data/test_248_A | 9 + bottleneck/tests/data/test_248_B | 9 + bottleneck/tests/data/test_249_A | 9 + bottleneck/tests/data/test_249_B | 9 + bottleneck/tests/data/test_250_A | 9 + bottleneck/tests/data/test_250_B | 9 + bottleneck/tests/data/test_251_A | 9 + bottleneck/tests/data/test_251_B | 9 + bottleneck/tests/data/test_252_A | 9 + bottleneck/tests/data/test_252_B | 9 + bottleneck/tests/data/test_253_A | 9 + bottleneck/tests/data/test_253_B | 9 + bottleneck/tests/data/test_254_A | 9 + bottleneck/tests/data/test_254_B | 9 + bottleneck/tests/data/test_255_A | 9 + bottleneck/tests/data/test_255_B | 9 + bottleneck/tests/data/test_256_A | 9 + bottleneck/tests/data/test_256_B | 9 + bottleneck/tests/data/test_257_A | 9 + bottleneck/tests/data/test_257_B | 9 + bottleneck/tests/data/test_258_A | 9 + bottleneck/tests/data/test_258_B | 9 + bottleneck/tests/data/test_259_A | 9 + bottleneck/tests/data/test_259_B | 9 + bottleneck/tests/data/test_260_A | 10 + bottleneck/tests/data/test_260_B | 10 + bottleneck/tests/data/test_261_A | 10 + bottleneck/tests/data/test_261_B | 10 + bottleneck/tests/data/test_262_A | 10 + bottleneck/tests/data/test_262_B | 10 + bottleneck/tests/data/test_263_A | 10 + bottleneck/tests/data/test_263_B | 10 + bottleneck/tests/data/test_264_A | 10 + bottleneck/tests/data/test_264_B | 10 + bottleneck/tests/data/test_265_A | 10 + bottleneck/tests/data/test_265_B | 10 + bottleneck/tests/data/test_266_A | 10 + bottleneck/tests/data/test_266_B | 10 + bottleneck/tests/data/test_267_A | 10 + bottleneck/tests/data/test_267_B | 10 + bottleneck/tests/data/test_268_A | 10 + bottleneck/tests/data/test_268_B | 10 + bottleneck/tests/data/test_269_A | 10 + bottleneck/tests/data/test_269_B | 10 + bottleneck/tests/data/test_270_A | 10 + bottleneck/tests/data/test_270_B | 10 + bottleneck/tests/data/test_271_A | 10 + bottleneck/tests/data/test_271_B | 10 + bottleneck/tests/data/test_272_A | 10 + bottleneck/tests/data/test_272_B | 10 + bottleneck/tests/data/test_273_A | 10 + bottleneck/tests/data/test_273_B | 10 + bottleneck/tests/data/test_274_A | 10 + bottleneck/tests/data/test_274_B | 10 + bottleneck/tests/data/test_275_A | 10 + bottleneck/tests/data/test_275_B | 10 + bottleneck/tests/data/test_276_A | 10 + bottleneck/tests/data/test_276_B | 10 + bottleneck/tests/data/test_277_A | 10 + bottleneck/tests/data/test_277_B | 10 + bottleneck/tests/data/test_278_A | 10 + bottleneck/tests/data/test_278_B | 10 + bottleneck/tests/data/test_279_A | 10 + bottleneck/tests/data/test_279_B | 10 + bottleneck/tests/data/test_280_A | 20 + bottleneck/tests/data/test_280_B | 20 + bottleneck/tests/data/test_281_A | 20 + bottleneck/tests/data/test_281_B | 20 + bottleneck/tests/data/test_282_A | 20 + bottleneck/tests/data/test_282_B | 20 + bottleneck/tests/data/test_283_A | 20 + bottleneck/tests/data/test_283_B | 20 + bottleneck/tests/data/test_284_A | 20 + bottleneck/tests/data/test_284_B | 20 + bottleneck/tests/data/test_285_A | 20 + bottleneck/tests/data/test_285_B | 20 + bottleneck/tests/data/test_286_A | 20 + bottleneck/tests/data/test_286_B | 20 + bottleneck/tests/data/test_287_A | 20 + bottleneck/tests/data/test_287_B | 20 + bottleneck/tests/data/test_288_A | 20 + bottleneck/tests/data/test_288_B | 20 + bottleneck/tests/data/test_289_A | 20 + bottleneck/tests/data/test_289_B | 20 + bottleneck/tests/data/test_290_A | 20 + bottleneck/tests/data/test_290_B | 20 + bottleneck/tests/data/test_291_A | 20 + bottleneck/tests/data/test_291_B | 20 + bottleneck/tests/data/test_292_A | 20 + bottleneck/tests/data/test_292_B | 20 + bottleneck/tests/data/test_293_A | 20 + bottleneck/tests/data/test_293_B | 20 + bottleneck/tests/data/test_294_A | 20 + bottleneck/tests/data/test_294_B | 20 + bottleneck/tests/data/test_295_A | 20 + bottleneck/tests/data/test_295_B | 20 + bottleneck/tests/data/test_296_A | 20 + bottleneck/tests/data/test_296_B | 20 + bottleneck/tests/data/test_297_A | 20 + bottleneck/tests/data/test_297_B | 20 + bottleneck/tests/data/test_298_A | 20 + bottleneck/tests/data/test_298_B | 20 + bottleneck/tests/data/test_299_A | 20 + bottleneck/tests/data/test_299_B | 20 + bottleneck/tests/data/test_300_A | 30 + bottleneck/tests/data/test_300_B | 30 + bottleneck/tests/data/test_301_A | 30 + bottleneck/tests/data/test_301_B | 30 + bottleneck/tests/data/test_302_A | 30 + bottleneck/tests/data/test_302_B | 30 + bottleneck/tests/data/test_303_A | 30 + bottleneck/tests/data/test_303_B | 30 + bottleneck/tests/data/test_304_A | 30 + bottleneck/tests/data/test_304_B | 30 + bottleneck/tests/data/test_305_A | 30 + bottleneck/tests/data/test_305_B | 30 + bottleneck/tests/data/test_306_A | 30 + bottleneck/tests/data/test_306_B | 30 + bottleneck/tests/data/test_307_A | 30 + bottleneck/tests/data/test_307_B | 30 + bottleneck/tests/data/test_308_A | 30 + bottleneck/tests/data/test_308_B | 30 + bottleneck/tests/data/test_309_A | 30 + bottleneck/tests/data/test_309_B | 30 + bottleneck/tests/data/test_310_A | 30 + bottleneck/tests/data/test_310_B | 30 + bottleneck/tests/data/test_311_A | 30 + bottleneck/tests/data/test_311_B | 30 + bottleneck/tests/data/test_312_A | 30 + bottleneck/tests/data/test_312_B | 30 + bottleneck/tests/data/test_313_A | 30 + bottleneck/tests/data/test_313_B | 30 + bottleneck/tests/data/test_314_A | 30 + bottleneck/tests/data/test_314_B | 30 + bottleneck/tests/data/test_315_A | 30 + bottleneck/tests/data/test_315_B | 30 + bottleneck/tests/data/test_316_A | 30 + bottleneck/tests/data/test_316_B | 30 + bottleneck/tests/data/test_317_A | 30 + bottleneck/tests/data/test_317_B | 30 + bottleneck/tests/data/test_318_A | 30 + bottleneck/tests/data/test_318_B | 30 + bottleneck/tests/data/test_319_A | 30 + bottleneck/tests/data/test_319_B | 30 + bottleneck/tests/data/test_320_A | 50 + bottleneck/tests/data/test_320_B | 50 + bottleneck/tests/data/test_321_A | 50 + bottleneck/tests/data/test_321_B | 50 + bottleneck/tests/data/test_322_A | 50 + bottleneck/tests/data/test_322_B | 50 + bottleneck/tests/data/test_323_A | 50 + bottleneck/tests/data/test_323_B | 50 + bottleneck/tests/data/test_324_A | 50 + bottleneck/tests/data/test_324_B | 50 + bottleneck/tests/data/test_325_A | 50 + bottleneck/tests/data/test_325_B | 50 + bottleneck/tests/data/test_326_A | 50 + bottleneck/tests/data/test_326_B | 50 + bottleneck/tests/data/test_327_A | 50 + bottleneck/tests/data/test_327_B | 50 + bottleneck/tests/data/test_328_A | 50 + bottleneck/tests/data/test_328_B | 50 + bottleneck/tests/data/test_329_A | 50 + bottleneck/tests/data/test_329_B | 50 + bottleneck/tests/data/test_330_A | 50 + bottleneck/tests/data/test_330_B | 50 + bottleneck/tests/data/test_331_A | 50 + bottleneck/tests/data/test_331_B | 50 + bottleneck/tests/data/test_332_A | 50 + bottleneck/tests/data/test_332_B | 50 + bottleneck/tests/data/test_333_A | 50 + bottleneck/tests/data/test_333_B | 50 + bottleneck/tests/data/test_334_A | 50 + bottleneck/tests/data/test_334_B | 50 + bottleneck/tests/data/test_335_A | 50 + bottleneck/tests/data/test_335_B | 50 + bottleneck/tests/data/test_336_A | 50 + bottleneck/tests/data/test_336_B | 50 + bottleneck/tests/data/test_337_A | 50 + bottleneck/tests/data/test_337_B | 50 + bottleneck/tests/data/test_338_A | 50 + bottleneck/tests/data/test_338_B | 50 + bottleneck/tests/data/test_339_A | 50 + bottleneck/tests/data/test_339_B | 50 + bottleneck/tests/data/test_340_A | 100 + bottleneck/tests/data/test_340_B | 100 + bottleneck/tests/data/test_341_A | 100 + bottleneck/tests/data/test_341_B | 100 + bottleneck/tests/data/test_342_A | 100 + bottleneck/tests/data/test_342_B | 100 + bottleneck/tests/data/test_343_A | 100 + bottleneck/tests/data/test_343_B | 100 + bottleneck/tests/data/test_344_A | 100 + bottleneck/tests/data/test_344_B | 100 + bottleneck/tests/data/test_345_A | 100 + bottleneck/tests/data/test_345_B | 100 + bottleneck/tests/data/test_346_A | 100 + bottleneck/tests/data/test_346_B | 100 + bottleneck/tests/data/test_347_A | 100 + bottleneck/tests/data/test_347_B | 100 + bottleneck/tests/data/test_348_A | 100 + bottleneck/tests/data/test_348_B | 100 + bottleneck/tests/data/test_349_A | 100 + bottleneck/tests/data/test_349_B | 100 + bottleneck/tests/data/test_350_A | 100 + bottleneck/tests/data/test_350_B | 100 + bottleneck/tests/data/test_351_A | 100 + bottleneck/tests/data/test_351_B | 100 + bottleneck/tests/data/test_352_A | 100 + bottleneck/tests/data/test_352_B | 100 + bottleneck/tests/data/test_353_A | 100 + bottleneck/tests/data/test_353_B | 100 + bottleneck/tests/data/test_354_A | 100 + bottleneck/tests/data/test_354_B | 100 + bottleneck/tests/data/test_355_A | 100 + bottleneck/tests/data/test_355_B | 100 + bottleneck/tests/data/test_356_A | 100 + bottleneck/tests/data/test_356_B | 100 + bottleneck/tests/data/test_357_A | 100 + bottleneck/tests/data/test_357_B | 100 + bottleneck/tests/data/test_358_A | 100 + bottleneck/tests/data/test_358_B | 100 + bottleneck/tests/data/test_359_A | 100 + bottleneck/tests/data/test_359_B | 100 + bottleneck/tests/data/test_360_A | 2 + bottleneck/tests/data/test_360_B | 2 + bottleneck/tests/data/test_361_A | 2 + bottleneck/tests/data/test_361_B | 2 + bottleneck/tests/data/test_362_A | 2 + bottleneck/tests/data/test_362_B | 2 + bottleneck/tests/data/test_363_A | 2 + bottleneck/tests/data/test_363_B | 2 + bottleneck/tests/data/test_364_A | 2 + bottleneck/tests/data/test_364_B | 2 + bottleneck/tests/data/test_365_A | 2 + bottleneck/tests/data/test_365_B | 2 + bottleneck/tests/data/test_366_A | 2 + bottleneck/tests/data/test_366_B | 2 + bottleneck/tests/data/test_367_A | 2 + bottleneck/tests/data/test_367_B | 2 + bottleneck/tests/data/test_368_A | 2 + bottleneck/tests/data/test_368_B | 2 + bottleneck/tests/data/test_369_A | 2 + bottleneck/tests/data/test_369_B | 2 + bottleneck/tests/data/test_370_A | 2 + bottleneck/tests/data/test_370_B | 2 + bottleneck/tests/data/test_371_A | 2 + bottleneck/tests/data/test_371_B | 2 + bottleneck/tests/data/test_372_A | 2 + bottleneck/tests/data/test_372_B | 2 + bottleneck/tests/data/test_373_A | 2 + bottleneck/tests/data/test_373_B | 2 + bottleneck/tests/data/test_374_A | 2 + bottleneck/tests/data/test_374_B | 2 + bottleneck/tests/data/test_375_A | 2 + bottleneck/tests/data/test_375_B | 2 + bottleneck/tests/data/test_376_A | 2 + bottleneck/tests/data/test_376_B | 2 + bottleneck/tests/data/test_377_A | 2 + bottleneck/tests/data/test_377_B | 2 + bottleneck/tests/data/test_378_A | 2 + bottleneck/tests/data/test_378_B | 2 + bottleneck/tests/data/test_379_A | 2 + bottleneck/tests/data/test_379_B | 2 + bottleneck/tests/data/test_380_A | 3 + bottleneck/tests/data/test_380_B | 3 + bottleneck/tests/data/test_381_A | 3 + bottleneck/tests/data/test_381_B | 3 + bottleneck/tests/data/test_382_A | 3 + bottleneck/tests/data/test_382_B | 3 + bottleneck/tests/data/test_383_A | 3 + bottleneck/tests/data/test_383_B | 3 + bottleneck/tests/data/test_384_A | 3 + bottleneck/tests/data/test_384_B | 3 + bottleneck/tests/data/test_385_A | 3 + bottleneck/tests/data/test_385_B | 3 + bottleneck/tests/data/test_386_A | 3 + bottleneck/tests/data/test_386_B | 3 + bottleneck/tests/data/test_387_A | 3 + bottleneck/tests/data/test_387_B | 3 + bottleneck/tests/data/test_388_A | 3 + bottleneck/tests/data/test_388_B | 3 + bottleneck/tests/data/test_389_A | 3 + bottleneck/tests/data/test_389_B | 3 + bottleneck/tests/data/test_390_A | 3 + bottleneck/tests/data/test_390_B | 3 + bottleneck/tests/data/test_391_A | 3 + bottleneck/tests/data/test_391_B | 3 + bottleneck/tests/data/test_392_A | 3 + bottleneck/tests/data/test_392_B | 3 + bottleneck/tests/data/test_393_A | 3 + bottleneck/tests/data/test_393_B | 3 + bottleneck/tests/data/test_394_A | 3 + bottleneck/tests/data/test_394_B | 3 + bottleneck/tests/data/test_395_A | 3 + bottleneck/tests/data/test_395_B | 3 + bottleneck/tests/data/test_396_A | 3 + bottleneck/tests/data/test_396_B | 3 + bottleneck/tests/data/test_397_A | 3 + bottleneck/tests/data/test_397_B | 3 + bottleneck/tests/data/test_398_A | 3 + bottleneck/tests/data/test_398_B | 3 + bottleneck/tests/data/test_399_A | 3 + bottleneck/tests/data/test_399_B | 3 + bottleneck/tests/data/test_400_A | 4 + bottleneck/tests/data/test_400_B | 4 + bottleneck/tests/data/test_401_A | 4 + bottleneck/tests/data/test_401_B | 4 + bottleneck/tests/data/test_402_A | 4 + bottleneck/tests/data/test_402_B | 4 + bottleneck/tests/data/test_403_A | 4 + bottleneck/tests/data/test_403_B | 4 + bottleneck/tests/data/test_404_A | 4 + bottleneck/tests/data/test_404_B | 4 + bottleneck/tests/data/test_405_A | 4 + bottleneck/tests/data/test_405_B | 4 + bottleneck/tests/data/test_406_A | 4 + bottleneck/tests/data/test_406_B | 4 + bottleneck/tests/data/test_407_A | 4 + bottleneck/tests/data/test_407_B | 4 + bottleneck/tests/data/test_408_A | 4 + bottleneck/tests/data/test_408_B | 4 + bottleneck/tests/data/test_409_A | 4 + bottleneck/tests/data/test_409_B | 4 + bottleneck/tests/data/test_410_A | 4 + bottleneck/tests/data/test_410_B | 4 + bottleneck/tests/data/test_411_A | 4 + bottleneck/tests/data/test_411_B | 4 + bottleneck/tests/data/test_412_A | 4 + bottleneck/tests/data/test_412_B | 4 + bottleneck/tests/data/test_413_A | 4 + bottleneck/tests/data/test_413_B | 4 + bottleneck/tests/data/test_414_A | 4 + bottleneck/tests/data/test_414_B | 4 + bottleneck/tests/data/test_415_A | 4 + bottleneck/tests/data/test_415_B | 4 + bottleneck/tests/data/test_416_A | 4 + bottleneck/tests/data/test_416_B | 4 + bottleneck/tests/data/test_417_A | 4 + bottleneck/tests/data/test_417_B | 4 + bottleneck/tests/data/test_418_A | 4 + bottleneck/tests/data/test_418_B | 4 + bottleneck/tests/data/test_419_A | 4 + bottleneck/tests/data/test_419_B | 4 + bottleneck/tests/data/test_420_A | 5 + bottleneck/tests/data/test_420_B | 5 + bottleneck/tests/data/test_421_A | 5 + bottleneck/tests/data/test_421_B | 5 + bottleneck/tests/data/test_422_A | 5 + bottleneck/tests/data/test_422_B | 5 + bottleneck/tests/data/test_423_A | 5 + bottleneck/tests/data/test_423_B | 5 + bottleneck/tests/data/test_424_A | 5 + bottleneck/tests/data/test_424_B | 5 + bottleneck/tests/data/test_425_A | 5 + bottleneck/tests/data/test_425_B | 5 + bottleneck/tests/data/test_426_A | 5 + bottleneck/tests/data/test_426_B | 5 + bottleneck/tests/data/test_427_A | 5 + bottleneck/tests/data/test_427_B | 5 + bottleneck/tests/data/test_428_A | 5 + bottleneck/tests/data/test_428_B | 5 + bottleneck/tests/data/test_429_A | 5 + bottleneck/tests/data/test_429_B | 5 + bottleneck/tests/data/test_430_A | 5 + bottleneck/tests/data/test_430_B | 5 + bottleneck/tests/data/test_431_A | 5 + bottleneck/tests/data/test_431_B | 5 + bottleneck/tests/data/test_432_A | 5 + bottleneck/tests/data/test_432_B | 5 + bottleneck/tests/data/test_433_A | 5 + bottleneck/tests/data/test_433_B | 5 + bottleneck/tests/data/test_434_A | 5 + bottleneck/tests/data/test_434_B | 5 + bottleneck/tests/data/test_435_A | 5 + bottleneck/tests/data/test_435_B | 5 + bottleneck/tests/data/test_436_A | 5 + bottleneck/tests/data/test_436_B | 5 + bottleneck/tests/data/test_437_A | 5 + bottleneck/tests/data/test_437_B | 5 + bottleneck/tests/data/test_438_A | 5 + bottleneck/tests/data/test_438_B | 5 + bottleneck/tests/data/test_439_A | 5 + bottleneck/tests/data/test_439_B | 5 + bottleneck/tests/data/test_440_A | 6 + bottleneck/tests/data/test_440_B | 6 + bottleneck/tests/data/test_441_A | 6 + bottleneck/tests/data/test_441_B | 6 + bottleneck/tests/data/test_442_A | 6 + bottleneck/tests/data/test_442_B | 6 + bottleneck/tests/data/test_443_A | 6 + bottleneck/tests/data/test_443_B | 6 + bottleneck/tests/data/test_444_A | 6 + bottleneck/tests/data/test_444_B | 6 + bottleneck/tests/data/test_445_A | 6 + bottleneck/tests/data/test_445_B | 6 + bottleneck/tests/data/test_446_A | 6 + bottleneck/tests/data/test_446_B | 6 + bottleneck/tests/data/test_447_A | 6 + bottleneck/tests/data/test_447_B | 6 + bottleneck/tests/data/test_448_A | 6 + bottleneck/tests/data/test_448_B | 6 + bottleneck/tests/data/test_449_A | 6 + bottleneck/tests/data/test_449_B | 6 + bottleneck/tests/data/test_450_A | 6 + bottleneck/tests/data/test_450_B | 6 + bottleneck/tests/data/test_451_A | 6 + bottleneck/tests/data/test_451_B | 6 + bottleneck/tests/data/test_452_A | 6 + bottleneck/tests/data/test_452_B | 6 + bottleneck/tests/data/test_453_A | 6 + bottleneck/tests/data/test_453_B | 6 + bottleneck/tests/data/test_454_A | 6 + bottleneck/tests/data/test_454_B | 6 + bottleneck/tests/data/test_455_A | 6 + bottleneck/tests/data/test_455_B | 6 + bottleneck/tests/data/test_456_A | 6 + bottleneck/tests/data/test_456_B | 6 + bottleneck/tests/data/test_457_A | 6 + bottleneck/tests/data/test_457_B | 6 + bottleneck/tests/data/test_458_A | 6 + bottleneck/tests/data/test_458_B | 6 + bottleneck/tests/data/test_459_A | 6 + bottleneck/tests/data/test_459_B | 6 + bottleneck/tests/data/test_460_A | 7 + bottleneck/tests/data/test_460_B | 7 + bottleneck/tests/data/test_461_A | 7 + bottleneck/tests/data/test_461_B | 7 + bottleneck/tests/data/test_462_A | 7 + bottleneck/tests/data/test_462_B | 7 + bottleneck/tests/data/test_463_A | 7 + bottleneck/tests/data/test_463_B | 7 + bottleneck/tests/data/test_464_A | 7 + bottleneck/tests/data/test_464_B | 7 + bottleneck/tests/data/test_465_A | 7 + bottleneck/tests/data/test_465_B | 7 + bottleneck/tests/data/test_466_A | 7 + bottleneck/tests/data/test_466_B | 7 + bottleneck/tests/data/test_467_A | 7 + bottleneck/tests/data/test_467_B | 7 + bottleneck/tests/data/test_468_A | 7 + bottleneck/tests/data/test_468_B | 7 + bottleneck/tests/data/test_469_A | 7 + bottleneck/tests/data/test_469_B | 7 + bottleneck/tests/data/test_470_A | 7 + bottleneck/tests/data/test_470_B | 7 + bottleneck/tests/data/test_471_A | 7 + bottleneck/tests/data/test_471_B | 7 + bottleneck/tests/data/test_472_A | 7 + bottleneck/tests/data/test_472_B | 7 + bottleneck/tests/data/test_473_A | 7 + bottleneck/tests/data/test_473_B | 7 + bottleneck/tests/data/test_474_A | 7 + bottleneck/tests/data/test_474_B | 7 + bottleneck/tests/data/test_475_A | 7 + bottleneck/tests/data/test_475_B | 7 + bottleneck/tests/data/test_476_A | 7 + bottleneck/tests/data/test_476_B | 7 + bottleneck/tests/data/test_477_A | 7 + bottleneck/tests/data/test_477_B | 7 + bottleneck/tests/data/test_478_A | 7 + bottleneck/tests/data/test_478_B | 7 + bottleneck/tests/data/test_479_A | 7 + bottleneck/tests/data/test_479_B | 7 + bottleneck/tests/data/test_480_A | 8 + bottleneck/tests/data/test_480_B | 8 + bottleneck/tests/data/test_481_A | 8 + bottleneck/tests/data/test_481_B | 8 + bottleneck/tests/data/test_482_A | 8 + bottleneck/tests/data/test_482_B | 8 + bottleneck/tests/data/test_483_A | 8 + bottleneck/tests/data/test_483_B | 8 + bottleneck/tests/data/test_484_A | 8 + bottleneck/tests/data/test_484_B | 8 + bottleneck/tests/data/test_485_A | 8 + bottleneck/tests/data/test_485_B | 8 + bottleneck/tests/data/test_486_A | 8 + bottleneck/tests/data/test_486_B | 8 + bottleneck/tests/data/test_487_A | 8 + bottleneck/tests/data/test_487_B | 8 + bottleneck/tests/data/test_488_A | 8 + bottleneck/tests/data/test_488_B | 8 + bottleneck/tests/data/test_489_A | 8 + bottleneck/tests/data/test_489_B | 8 + bottleneck/tests/data/test_490_A | 8 + bottleneck/tests/data/test_490_B | 8 + bottleneck/tests/data/test_491_A | 8 + bottleneck/tests/data/test_491_B | 8 + bottleneck/tests/data/test_492_A | 8 + bottleneck/tests/data/test_492_B | 8 + bottleneck/tests/data/test_493_A | 8 + bottleneck/tests/data/test_493_B | 8 + bottleneck/tests/data/test_494_A | 8 + bottleneck/tests/data/test_494_B | 8 + bottleneck/tests/data/test_495_A | 8 + bottleneck/tests/data/test_495_B | 8 + bottleneck/tests/data/test_496_A | 8 + bottleneck/tests/data/test_496_B | 8 + bottleneck/tests/data/test_497_A | 8 + bottleneck/tests/data/test_497_B | 8 + bottleneck/tests/data/test_498_A | 8 + bottleneck/tests/data/test_498_B | 8 + bottleneck/tests/data/test_499_A | 8 + bottleneck/tests/data/test_499_B | 8 + bottleneck/tests/data/test_500_A | 9 + bottleneck/tests/data/test_500_B | 9 + bottleneck/tests/data/test_501_A | 9 + bottleneck/tests/data/test_501_B | 9 + bottleneck/tests/data/test_502_A | 9 + bottleneck/tests/data/test_502_B | 9 + bottleneck/tests/data/test_503_A | 9 + bottleneck/tests/data/test_503_B | 9 + bottleneck/tests/data/test_504_A | 9 + bottleneck/tests/data/test_504_B | 9 + bottleneck/tests/data/test_505_A | 9 + bottleneck/tests/data/test_505_B | 9 + bottleneck/tests/data/test_506_A | 9 + bottleneck/tests/data/test_506_B | 9 + bottleneck/tests/data/test_507_A | 9 + bottleneck/tests/data/test_507_B | 9 + bottleneck/tests/data/test_508_A | 9 + bottleneck/tests/data/test_508_B | 9 + bottleneck/tests/data/test_509_A | 9 + bottleneck/tests/data/test_509_B | 9 + bottleneck/tests/data/test_510_A | 9 + bottleneck/tests/data/test_510_B | 9 + bottleneck/tests/data/test_511_A | 9 + bottleneck/tests/data/test_511_B | 9 + bottleneck/tests/data/test_512_A | 9 + bottleneck/tests/data/test_512_B | 9 + bottleneck/tests/data/test_513_A | 9 + bottleneck/tests/data/test_513_B | 9 + bottleneck/tests/data/test_514_A | 9 + bottleneck/tests/data/test_514_B | 9 + bottleneck/tests/data/test_515_A | 9 + bottleneck/tests/data/test_515_B | 9 + bottleneck/tests/data/test_516_A | 9 + bottleneck/tests/data/test_516_B | 9 + bottleneck/tests/data/test_517_A | 9 + bottleneck/tests/data/test_517_B | 9 + bottleneck/tests/data/test_518_A | 9 + bottleneck/tests/data/test_518_B | 9 + bottleneck/tests/data/test_519_A | 9 + bottleneck/tests/data/test_519_B | 9 + bottleneck/tests/data/test_520_A | 10 + bottleneck/tests/data/test_520_B | 10 + bottleneck/tests/data/test_521_A | 10 + bottleneck/tests/data/test_521_B | 10 + bottleneck/tests/data/test_522_A | 10 + bottleneck/tests/data/test_522_B | 10 + bottleneck/tests/data/test_523_A | 10 + bottleneck/tests/data/test_523_B | 10 + bottleneck/tests/data/test_524_A | 10 + bottleneck/tests/data/test_524_B | 10 + bottleneck/tests/data/test_525_A | 10 + bottleneck/tests/data/test_525_B | 10 + bottleneck/tests/data/test_526_A | 10 + bottleneck/tests/data/test_526_B | 10 + bottleneck/tests/data/test_527_A | 10 + bottleneck/tests/data/test_527_B | 10 + bottleneck/tests/data/test_528_A | 10 + bottleneck/tests/data/test_528_B | 10 + bottleneck/tests/data/test_529_A | 10 + bottleneck/tests/data/test_529_B | 10 + bottleneck/tests/data/test_530_A | 10 + bottleneck/tests/data/test_530_B | 10 + bottleneck/tests/data/test_531_A | 10 + bottleneck/tests/data/test_531_B | 10 + bottleneck/tests/data/test_532_A | 10 + bottleneck/tests/data/test_532_B | 10 + bottleneck/tests/data/test_533_A | 10 + bottleneck/tests/data/test_533_B | 10 + bottleneck/tests/data/test_534_A | 10 + bottleneck/tests/data/test_534_B | 10 + bottleneck/tests/data/test_535_A | 10 + bottleneck/tests/data/test_535_B | 10 + bottleneck/tests/data/test_536_A | 10 + bottleneck/tests/data/test_536_B | 10 + bottleneck/tests/data/test_537_A | 10 + bottleneck/tests/data/test_537_B | 10 + bottleneck/tests/data/test_538_A | 10 + bottleneck/tests/data/test_538_B | 10 + bottleneck/tests/data/test_539_A | 10 + bottleneck/tests/data/test_539_B | 10 + bottleneck/tests/data/test_540_A | 20 + bottleneck/tests/data/test_540_B | 20 + bottleneck/tests/data/test_541_A | 20 + bottleneck/tests/data/test_541_B | 20 + bottleneck/tests/data/test_542_A | 20 + bottleneck/tests/data/test_542_B | 20 + bottleneck/tests/data/test_543_A | 20 + bottleneck/tests/data/test_543_B | 20 + bottleneck/tests/data/test_544_A | 20 + bottleneck/tests/data/test_544_B | 20 + bottleneck/tests/data/test_545_A | 20 + bottleneck/tests/data/test_545_B | 20 + bottleneck/tests/data/test_546_A | 20 + bottleneck/tests/data/test_546_B | 20 + bottleneck/tests/data/test_547_A | 20 + bottleneck/tests/data/test_547_B | 20 + bottleneck/tests/data/test_548_A | 20 + bottleneck/tests/data/test_548_B | 20 + bottleneck/tests/data/test_549_A | 20 + bottleneck/tests/data/test_549_B | 20 + bottleneck/tests/data/test_550_A | 20 + bottleneck/tests/data/test_550_B | 20 + bottleneck/tests/data/test_551_A | 20 + bottleneck/tests/data/test_551_B | 20 + bottleneck/tests/data/test_552_A | 20 + bottleneck/tests/data/test_552_B | 20 + bottleneck/tests/data/test_553_A | 20 + bottleneck/tests/data/test_553_B | 20 + bottleneck/tests/data/test_554_A | 20 + bottleneck/tests/data/test_554_B | 20 + bottleneck/tests/data/test_555_A | 20 + bottleneck/tests/data/test_555_B | 20 + bottleneck/tests/data/test_556_A | 20 + bottleneck/tests/data/test_556_B | 20 + bottleneck/tests/data/test_557_A | 20 + bottleneck/tests/data/test_557_B | 20 + bottleneck/tests/data/test_558_A | 20 + bottleneck/tests/data/test_558_B | 20 + bottleneck/tests/data/test_559_A | 20 + bottleneck/tests/data/test_559_B | 20 + bottleneck/tests/data/test_560_A | 30 + bottleneck/tests/data/test_560_B | 30 + bottleneck/tests/data/test_561_A | 30 + bottleneck/tests/data/test_561_B | 30 + bottleneck/tests/data/test_562_A | 30 + bottleneck/tests/data/test_562_B | 30 + bottleneck/tests/data/test_563_A | 30 + bottleneck/tests/data/test_563_B | 30 + bottleneck/tests/data/test_564_A | 30 + bottleneck/tests/data/test_564_B | 30 + bottleneck/tests/data/test_565_A | 30 + bottleneck/tests/data/test_565_B | 30 + bottleneck/tests/data/test_566_A | 30 + bottleneck/tests/data/test_566_B | 30 + bottleneck/tests/data/test_567_A | 30 + bottleneck/tests/data/test_567_B | 30 + bottleneck/tests/data/test_568_A | 30 + bottleneck/tests/data/test_568_B | 30 + bottleneck/tests/data/test_569_A | 30 + bottleneck/tests/data/test_569_B | 30 + bottleneck/tests/data/test_570_A | 30 + bottleneck/tests/data/test_570_B | 30 + bottleneck/tests/data/test_571_A | 30 + bottleneck/tests/data/test_571_B | 30 + bottleneck/tests/data/test_572_A | 30 + bottleneck/tests/data/test_572_B | 30 + bottleneck/tests/data/test_573_A | 30 + bottleneck/tests/data/test_573_B | 30 + bottleneck/tests/data/test_574_A | 30 + bottleneck/tests/data/test_574_B | 30 + bottleneck/tests/data/test_575_A | 30 + bottleneck/tests/data/test_575_B | 30 + bottleneck/tests/data/test_576_A | 30 + bottleneck/tests/data/test_576_B | 30 + bottleneck/tests/data/test_577_A | 30 + bottleneck/tests/data/test_577_B | 30 + bottleneck/tests/data/test_578_A | 30 + bottleneck/tests/data/test_578_B | 30 + bottleneck/tests/data/test_579_A | 30 + bottleneck/tests/data/test_579_B | 30 + bottleneck/tests/data/test_580_A | 50 + bottleneck/tests/data/test_580_B | 50 + bottleneck/tests/data/test_581_A | 50 + bottleneck/tests/data/test_581_B | 50 + bottleneck/tests/data/test_582_A | 50 + bottleneck/tests/data/test_582_B | 50 + bottleneck/tests/data/test_583_A | 50 + bottleneck/tests/data/test_583_B | 50 + bottleneck/tests/data/test_584_A | 50 + bottleneck/tests/data/test_584_B | 50 + bottleneck/tests/data/test_585_A | 50 + bottleneck/tests/data/test_585_B | 50 + bottleneck/tests/data/test_586_A | 50 + bottleneck/tests/data/test_586_B | 50 + bottleneck/tests/data/test_587_A | 50 + bottleneck/tests/data/test_587_B | 50 + bottleneck/tests/data/test_588_A | 50 + bottleneck/tests/data/test_588_B | 50 + bottleneck/tests/data/test_589_A | 50 + bottleneck/tests/data/test_589_B | 50 + bottleneck/tests/data/test_590_A | 50 + bottleneck/tests/data/test_590_B | 50 + bottleneck/tests/data/test_591_A | 50 + bottleneck/tests/data/test_591_B | 50 + bottleneck/tests/data/test_592_A | 50 + bottleneck/tests/data/test_592_B | 50 + bottleneck/tests/data/test_593_A | 50 + bottleneck/tests/data/test_593_B | 50 + bottleneck/tests/data/test_594_A | 50 + bottleneck/tests/data/test_594_B | 50 + bottleneck/tests/data/test_595_A | 50 + bottleneck/tests/data/test_595_B | 50 + bottleneck/tests/data/test_596_A | 50 + bottleneck/tests/data/test_596_B | 50 + bottleneck/tests/data/test_597_A | 50 + bottleneck/tests/data/test_597_B | 50 + bottleneck/tests/data/test_598_A | 50 + bottleneck/tests/data/test_598_B | 50 + bottleneck/tests/data/test_599_A | 50 + bottleneck/tests/data/test_599_B | 50 + bottleneck/tests/data/test_600_A | 100 + bottleneck/tests/data/test_600_B | 100 + bottleneck/tests/data/test_601_A | 100 + bottleneck/tests/data/test_601_B | 100 + bottleneck/tests/data/test_602_A | 100 + bottleneck/tests/data/test_602_B | 100 + bottleneck/tests/data/test_603_A | 100 + bottleneck/tests/data/test_603_B | 100 + bottleneck/tests/data/test_604_A | 100 + bottleneck/tests/data/test_604_B | 100 + bottleneck/tests/data/test_605_A | 100 + bottleneck/tests/data/test_605_B | 100 + bottleneck/tests/data/test_606_A | 100 + bottleneck/tests/data/test_606_B | 100 + bottleneck/tests/data/test_607_A | 100 + bottleneck/tests/data/test_607_B | 100 + bottleneck/tests/data/test_608_A | 100 + bottleneck/tests/data/test_608_B | 100 + bottleneck/tests/data/test_609_A | 100 + bottleneck/tests/data/test_609_B | 100 + bottleneck/tests/data/test_610_A | 100 + bottleneck/tests/data/test_610_B | 100 + bottleneck/tests/data/test_611_A | 100 + bottleneck/tests/data/test_611_B | 100 + bottleneck/tests/data/test_612_A | 100 + bottleneck/tests/data/test_612_B | 100 + bottleneck/tests/data/test_613_A | 100 + bottleneck/tests/data/test_613_B | 100 + bottleneck/tests/data/test_614_A | 100 + bottleneck/tests/data/test_614_B | 100 + bottleneck/tests/data/test_615_A | 100 + bottleneck/tests/data/test_615_B | 100 + bottleneck/tests/data/test_616_A | 100 + bottleneck/tests/data/test_616_B | 100 + bottleneck/tests/data/test_617_A | 100 + bottleneck/tests/data/test_617_B | 100 + bottleneck/tests/data/test_618_A | 100 + bottleneck/tests/data/test_618_B | 100 + bottleneck/tests/data/test_619_A | 100 + bottleneck/tests/data/test_619_B | 100 + bottleneck/tests/data/test_620_A | 2 + bottleneck/tests/data/test_620_B | 2 + bottleneck/tests/data/test_621_A | 2 + bottleneck/tests/data/test_621_B | 2 + bottleneck/tests/data/test_622_A | 2 + bottleneck/tests/data/test_622_B | 2 + bottleneck/tests/data/test_623_A | 2 + bottleneck/tests/data/test_623_B | 2 + bottleneck/tests/data/test_624_A | 2 + bottleneck/tests/data/test_624_B | 2 + bottleneck/tests/data/test_625_A | 2 + bottleneck/tests/data/test_625_B | 2 + bottleneck/tests/data/test_626_A | 2 + bottleneck/tests/data/test_626_B | 2 + bottleneck/tests/data/test_627_A | 2 + bottleneck/tests/data/test_627_B | 2 + bottleneck/tests/data/test_628_A | 2 + bottleneck/tests/data/test_628_B | 2 + bottleneck/tests/data/test_629_A | 2 + bottleneck/tests/data/test_629_B | 2 + bottleneck/tests/data/test_630_A | 2 + bottleneck/tests/data/test_630_B | 2 + bottleneck/tests/data/test_631_A | 2 + bottleneck/tests/data/test_631_B | 2 + bottleneck/tests/data/test_632_A | 2 + bottleneck/tests/data/test_632_B | 2 + bottleneck/tests/data/test_633_A | 2 + bottleneck/tests/data/test_633_B | 2 + bottleneck/tests/data/test_634_A | 2 + bottleneck/tests/data/test_634_B | 2 + bottleneck/tests/data/test_635_A | 2 + bottleneck/tests/data/test_635_B | 2 + bottleneck/tests/data/test_636_A | 2 + bottleneck/tests/data/test_636_B | 2 + bottleneck/tests/data/test_637_A | 2 + bottleneck/tests/data/test_637_B | 2 + bottleneck/tests/data/test_638_A | 2 + bottleneck/tests/data/test_638_B | 2 + bottleneck/tests/data/test_639_A | 2 + bottleneck/tests/data/test_639_B | 2 + bottleneck/tests/data/test_640_A | 3 + bottleneck/tests/data/test_640_B | 3 + bottleneck/tests/data/test_641_A | 3 + bottleneck/tests/data/test_641_B | 3 + bottleneck/tests/data/test_642_A | 3 + bottleneck/tests/data/test_642_B | 3 + bottleneck/tests/data/test_643_A | 3 + bottleneck/tests/data/test_643_B | 3 + bottleneck/tests/data/test_644_A | 3 + bottleneck/tests/data/test_644_B | 3 + bottleneck/tests/data/test_645_A | 3 + bottleneck/tests/data/test_645_B | 3 + bottleneck/tests/data/test_646_A | 3 + bottleneck/tests/data/test_646_B | 3 + bottleneck/tests/data/test_647_A | 3 + bottleneck/tests/data/test_647_B | 3 + bottleneck/tests/data/test_648_A | 3 + bottleneck/tests/data/test_648_B | 3 + bottleneck/tests/data/test_649_A | 3 + bottleneck/tests/data/test_649_B | 3 + bottleneck/tests/data/test_650_A | 3 + bottleneck/tests/data/test_650_B | 3 + bottleneck/tests/data/test_651_A | 3 + bottleneck/tests/data/test_651_B | 3 + bottleneck/tests/data/test_652_A | 3 + bottleneck/tests/data/test_652_B | 3 + bottleneck/tests/data/test_653_A | 3 + bottleneck/tests/data/test_653_B | 3 + bottleneck/tests/data/test_654_A | 3 + bottleneck/tests/data/test_654_B | 3 + bottleneck/tests/data/test_655_A | 3 + bottleneck/tests/data/test_655_B | 3 + bottleneck/tests/data/test_656_A | 3 + bottleneck/tests/data/test_656_B | 3 + bottleneck/tests/data/test_657_A | 3 + bottleneck/tests/data/test_657_B | 3 + bottleneck/tests/data/test_658_A | 3 + bottleneck/tests/data/test_658_B | 3 + bottleneck/tests/data/test_659_A | 3 + bottleneck/tests/data/test_659_B | 3 + bottleneck/tests/data/test_660_A | 4 + bottleneck/tests/data/test_660_B | 4 + bottleneck/tests/data/test_661_A | 4 + bottleneck/tests/data/test_661_B | 4 + bottleneck/tests/data/test_662_A | 4 + bottleneck/tests/data/test_662_B | 4 + bottleneck/tests/data/test_663_A | 4 + bottleneck/tests/data/test_663_B | 4 + bottleneck/tests/data/test_664_A | 4 + bottleneck/tests/data/test_664_B | 4 + bottleneck/tests/data/test_665_A | 4 + bottleneck/tests/data/test_665_B | 4 + bottleneck/tests/data/test_666_A | 4 + bottleneck/tests/data/test_666_B | 4 + bottleneck/tests/data/test_667_A | 4 + bottleneck/tests/data/test_667_B | 4 + bottleneck/tests/data/test_668_A | 4 + bottleneck/tests/data/test_668_B | 4 + bottleneck/tests/data/test_669_A | 4 + bottleneck/tests/data/test_669_B | 4 + bottleneck/tests/data/test_670_A | 4 + bottleneck/tests/data/test_670_B | 4 + bottleneck/tests/data/test_671_A | 4 + bottleneck/tests/data/test_671_B | 4 + bottleneck/tests/data/test_672_A | 4 + bottleneck/tests/data/test_672_B | 4 + bottleneck/tests/data/test_673_A | 4 + bottleneck/tests/data/test_673_B | 4 + bottleneck/tests/data/test_674_A | 4 + bottleneck/tests/data/test_674_B | 4 + bottleneck/tests/data/test_675_A | 4 + bottleneck/tests/data/test_675_B | 4 + bottleneck/tests/data/test_676_A | 4 + bottleneck/tests/data/test_676_B | 4 + bottleneck/tests/data/test_677_A | 4 + bottleneck/tests/data/test_677_B | 4 + bottleneck/tests/data/test_678_A | 4 + bottleneck/tests/data/test_678_B | 4 + bottleneck/tests/data/test_679_A | 4 + bottleneck/tests/data/test_679_B | 4 + bottleneck/tests/data/test_680_A | 5 + bottleneck/tests/data/test_680_B | 5 + bottleneck/tests/data/test_681_A | 5 + bottleneck/tests/data/test_681_B | 5 + bottleneck/tests/data/test_682_A | 5 + bottleneck/tests/data/test_682_B | 5 + bottleneck/tests/data/test_683_A | 5 + bottleneck/tests/data/test_683_B | 5 + bottleneck/tests/data/test_684_A | 5 + bottleneck/tests/data/test_684_B | 5 + bottleneck/tests/data/test_685_A | 5 + bottleneck/tests/data/test_685_B | 5 + bottleneck/tests/data/test_686_A | 5 + bottleneck/tests/data/test_686_B | 5 + bottleneck/tests/data/test_687_A | 5 + bottleneck/tests/data/test_687_B | 5 + bottleneck/tests/data/test_688_A | 5 + bottleneck/tests/data/test_688_B | 5 + bottleneck/tests/data/test_689_A | 5 + bottleneck/tests/data/test_689_B | 5 + bottleneck/tests/data/test_690_A | 5 + bottleneck/tests/data/test_690_B | 5 + bottleneck/tests/data/test_691_A | 5 + bottleneck/tests/data/test_691_B | 5 + bottleneck/tests/data/test_692_A | 5 + bottleneck/tests/data/test_692_B | 5 + bottleneck/tests/data/test_693_A | 5 + bottleneck/tests/data/test_693_B | 5 + bottleneck/tests/data/test_694_A | 5 + bottleneck/tests/data/test_694_B | 5 + bottleneck/tests/data/test_695_A | 5 + bottleneck/tests/data/test_695_B | 5 + bottleneck/tests/data/test_696_A | 5 + bottleneck/tests/data/test_696_B | 5 + bottleneck/tests/data/test_697_A | 5 + bottleneck/tests/data/test_697_B | 5 + bottleneck/tests/data/test_698_A | 5 + bottleneck/tests/data/test_698_B | 5 + bottleneck/tests/data/test_699_A | 5 + bottleneck/tests/data/test_699_B | 5 + bottleneck/tests/data/test_700_A | 6 + bottleneck/tests/data/test_700_B | 6 + bottleneck/tests/data/test_701_A | 6 + bottleneck/tests/data/test_701_B | 6 + bottleneck/tests/data/test_702_A | 6 + bottleneck/tests/data/test_702_B | 6 + bottleneck/tests/data/test_703_A | 6 + bottleneck/tests/data/test_703_B | 6 + bottleneck/tests/data/test_704_A | 6 + bottleneck/tests/data/test_704_B | 6 + bottleneck/tests/data/test_705_A | 6 + bottleneck/tests/data/test_705_B | 6 + bottleneck/tests/data/test_706_A | 6 + bottleneck/tests/data/test_706_B | 6 + bottleneck/tests/data/test_707_A | 6 + bottleneck/tests/data/test_707_B | 6 + bottleneck/tests/data/test_708_A | 6 + bottleneck/tests/data/test_708_B | 6 + bottleneck/tests/data/test_709_A | 6 + bottleneck/tests/data/test_709_B | 6 + bottleneck/tests/data/test_710_A | 6 + bottleneck/tests/data/test_710_B | 6 + bottleneck/tests/data/test_711_A | 6 + bottleneck/tests/data/test_711_B | 6 + bottleneck/tests/data/test_712_A | 6 + bottleneck/tests/data/test_712_B | 6 + bottleneck/tests/data/test_713_A | 6 + bottleneck/tests/data/test_713_B | 6 + bottleneck/tests/data/test_714_A | 6 + bottleneck/tests/data/test_714_B | 6 + bottleneck/tests/data/test_715_A | 6 + bottleneck/tests/data/test_715_B | 6 + bottleneck/tests/data/test_716_A | 6 + bottleneck/tests/data/test_716_B | 6 + bottleneck/tests/data/test_717_A | 6 + bottleneck/tests/data/test_717_B | 6 + bottleneck/tests/data/test_718_A | 6 + bottleneck/tests/data/test_718_B | 6 + bottleneck/tests/data/test_719_A | 6 + bottleneck/tests/data/test_719_B | 6 + bottleneck/tests/data/test_720_A | 7 + bottleneck/tests/data/test_720_B | 7 + bottleneck/tests/data/test_721_A | 7 + bottleneck/tests/data/test_721_B | 7 + bottleneck/tests/data/test_722_A | 7 + bottleneck/tests/data/test_722_B | 7 + bottleneck/tests/data/test_723_A | 7 + bottleneck/tests/data/test_723_B | 7 + bottleneck/tests/data/test_724_A | 7 + bottleneck/tests/data/test_724_B | 7 + bottleneck/tests/data/test_725_A | 7 + bottleneck/tests/data/test_725_B | 7 + bottleneck/tests/data/test_726_A | 7 + bottleneck/tests/data/test_726_B | 7 + bottleneck/tests/data/test_727_A | 7 + bottleneck/tests/data/test_727_B | 7 + bottleneck/tests/data/test_728_A | 7 + bottleneck/tests/data/test_728_B | 7 + bottleneck/tests/data/test_729_A | 7 + bottleneck/tests/data/test_729_B | 7 + bottleneck/tests/data/test_730_A | 7 + bottleneck/tests/data/test_730_B | 7 + bottleneck/tests/data/test_731_A | 7 + bottleneck/tests/data/test_731_B | 7 + bottleneck/tests/data/test_732_A | 7 + bottleneck/tests/data/test_732_B | 7 + bottleneck/tests/data/test_733_A | 7 + bottleneck/tests/data/test_733_B | 7 + bottleneck/tests/data/test_734_A | 7 + bottleneck/tests/data/test_734_B | 7 + bottleneck/tests/data/test_735_A | 7 + bottleneck/tests/data/test_735_B | 7 + bottleneck/tests/data/test_736_A | 7 + bottleneck/tests/data/test_736_B | 7 + bottleneck/tests/data/test_737_A | 7 + bottleneck/tests/data/test_737_B | 7 + bottleneck/tests/data/test_738_A | 7 + bottleneck/tests/data/test_738_B | 7 + bottleneck/tests/data/test_739_A | 7 + bottleneck/tests/data/test_739_B | 7 + bottleneck/tests/data/test_740_A | 8 + bottleneck/tests/data/test_740_B | 8 + bottleneck/tests/data/test_741_A | 8 + bottleneck/tests/data/test_741_B | 8 + bottleneck/tests/data/test_742_A | 8 + bottleneck/tests/data/test_742_B | 8 + bottleneck/tests/data/test_743_A | 8 + bottleneck/tests/data/test_743_B | 8 + bottleneck/tests/data/test_744_A | 8 + bottleneck/tests/data/test_744_B | 8 + bottleneck/tests/data/test_745_A | 8 + bottleneck/tests/data/test_745_B | 8 + bottleneck/tests/data/test_746_A | 8 + bottleneck/tests/data/test_746_B | 8 + bottleneck/tests/data/test_747_A | 8 + bottleneck/tests/data/test_747_B | 8 + bottleneck/tests/data/test_748_A | 8 + bottleneck/tests/data/test_748_B | 8 + bottleneck/tests/data/test_749_A | 8 + bottleneck/tests/data/test_749_B | 8 + bottleneck/tests/data/test_750_A | 8 + bottleneck/tests/data/test_750_B | 8 + bottleneck/tests/data/test_751_A | 8 + bottleneck/tests/data/test_751_B | 8 + bottleneck/tests/data/test_752_A | 8 + bottleneck/tests/data/test_752_B | 8 + bottleneck/tests/data/test_753_A | 8 + bottleneck/tests/data/test_753_B | 8 + bottleneck/tests/data/test_754_A | 8 + bottleneck/tests/data/test_754_B | 8 + bottleneck/tests/data/test_755_A | 8 + bottleneck/tests/data/test_755_B | 8 + bottleneck/tests/data/test_756_A | 8 + bottleneck/tests/data/test_756_B | 8 + bottleneck/tests/data/test_757_A | 8 + bottleneck/tests/data/test_757_B | 8 + bottleneck/tests/data/test_758_A | 8 + bottleneck/tests/data/test_758_B | 8 + bottleneck/tests/data/test_759_A | 8 + bottleneck/tests/data/test_759_B | 8 + bottleneck/tests/data/test_760_A | 9 + bottleneck/tests/data/test_760_B | 9 + bottleneck/tests/data/test_761_A | 9 + bottleneck/tests/data/test_761_B | 9 + bottleneck/tests/data/test_762_A | 9 + bottleneck/tests/data/test_762_B | 9 + bottleneck/tests/data/test_763_A | 9 + bottleneck/tests/data/test_763_B | 9 + bottleneck/tests/data/test_764_A | 9 + bottleneck/tests/data/test_764_B | 9 + bottleneck/tests/data/test_765_A | 9 + bottleneck/tests/data/test_765_B | 9 + bottleneck/tests/data/test_766_A | 9 + bottleneck/tests/data/test_766_B | 9 + bottleneck/tests/data/test_767_A | 9 + bottleneck/tests/data/test_767_B | 9 + bottleneck/tests/data/test_768_A | 9 + bottleneck/tests/data/test_768_B | 9 + bottleneck/tests/data/test_769_A | 9 + bottleneck/tests/data/test_769_B | 9 + bottleneck/tests/data/test_770_A | 9 + bottleneck/tests/data/test_770_B | 9 + bottleneck/tests/data/test_771_A | 9 + bottleneck/tests/data/test_771_B | 9 + bottleneck/tests/data/test_772_A | 9 + bottleneck/tests/data/test_772_B | 9 + bottleneck/tests/data/test_773_A | 9 + bottleneck/tests/data/test_773_B | 9 + bottleneck/tests/data/test_774_A | 9 + bottleneck/tests/data/test_774_B | 9 + bottleneck/tests/data/test_775_A | 9 + bottleneck/tests/data/test_775_B | 9 + bottleneck/tests/data/test_776_A | 9 + bottleneck/tests/data/test_776_B | 9 + bottleneck/tests/data/test_777_A | 9 + bottleneck/tests/data/test_777_B | 9 + bottleneck/tests/data/test_778_A | 9 + bottleneck/tests/data/test_778_B | 9 + bottleneck/tests/data/test_779_A | 9 + bottleneck/tests/data/test_779_B | 9 + bottleneck/tests/data/test_780_A | 10 + bottleneck/tests/data/test_780_B | 10 + bottleneck/tests/data/test_781_A | 10 + bottleneck/tests/data/test_781_B | 10 + bottleneck/tests/data/test_782_A | 10 + bottleneck/tests/data/test_782_B | 10 + bottleneck/tests/data/test_783_A | 10 + bottleneck/tests/data/test_783_B | 10 + bottleneck/tests/data/test_784_A | 10 + bottleneck/tests/data/test_784_B | 10 + bottleneck/tests/data/test_785_A | 10 + bottleneck/tests/data/test_785_B | 10 + bottleneck/tests/data/test_786_A | 10 + bottleneck/tests/data/test_786_B | 10 + bottleneck/tests/data/test_787_A | 10 + bottleneck/tests/data/test_787_B | 10 + bottleneck/tests/data/test_788_A | 10 + bottleneck/tests/data/test_788_B | 10 + bottleneck/tests/data/test_789_A | 10 + bottleneck/tests/data/test_789_B | 10 + bottleneck/tests/data/test_790_A | 10 + bottleneck/tests/data/test_790_B | 10 + bottleneck/tests/data/test_791_A | 10 + bottleneck/tests/data/test_791_B | 10 + bottleneck/tests/data/test_792_A | 10 + bottleneck/tests/data/test_792_B | 10 + bottleneck/tests/data/test_793_A | 10 + bottleneck/tests/data/test_793_B | 10 + bottleneck/tests/data/test_794_A | 10 + bottleneck/tests/data/test_794_B | 10 + bottleneck/tests/data/test_795_A | 10 + bottleneck/tests/data/test_795_B | 10 + bottleneck/tests/data/test_796_A | 10 + bottleneck/tests/data/test_796_B | 10 + bottleneck/tests/data/test_797_A | 10 + bottleneck/tests/data/test_797_B | 10 + bottleneck/tests/data/test_798_A | 10 + bottleneck/tests/data/test_798_B | 10 + bottleneck/tests/data/test_799_A | 10 + bottleneck/tests/data/test_799_B | 10 + bottleneck/tests/data/test_800_A | 20 + bottleneck/tests/data/test_800_B | 20 + bottleneck/tests/data/test_801_A | 20 + bottleneck/tests/data/test_801_B | 20 + bottleneck/tests/data/test_802_A | 20 + bottleneck/tests/data/test_802_B | 20 + bottleneck/tests/data/test_803_A | 20 + bottleneck/tests/data/test_803_B | 20 + bottleneck/tests/data/test_804_A | 20 + bottleneck/tests/data/test_804_B | 20 + bottleneck/tests/data/test_805_A | 20 + bottleneck/tests/data/test_805_B | 20 + bottleneck/tests/data/test_806_A | 20 + bottleneck/tests/data/test_806_B | 20 + bottleneck/tests/data/test_807_A | 20 + bottleneck/tests/data/test_807_B | 20 + bottleneck/tests/data/test_808_A | 20 + bottleneck/tests/data/test_808_B | 20 + bottleneck/tests/data/test_809_A | 20 + bottleneck/tests/data/test_809_B | 20 + bottleneck/tests/data/test_810_A | 20 + bottleneck/tests/data/test_810_B | 20 + bottleneck/tests/data/test_811_A | 20 + bottleneck/tests/data/test_811_B | 20 + bottleneck/tests/data/test_812_A | 20 + bottleneck/tests/data/test_812_B | 20 + bottleneck/tests/data/test_813_A | 20 + bottleneck/tests/data/test_813_B | 20 + bottleneck/tests/data/test_814_A | 20 + bottleneck/tests/data/test_814_B | 20 + bottleneck/tests/data/test_815_A | 20 + bottleneck/tests/data/test_815_B | 20 + bottleneck/tests/data/test_816_A | 20 + bottleneck/tests/data/test_816_B | 20 + bottleneck/tests/data/test_817_A | 20 + bottleneck/tests/data/test_817_B | 20 + bottleneck/tests/data/test_818_A | 20 + bottleneck/tests/data/test_818_B | 20 + bottleneck/tests/data/test_819_A | 20 + bottleneck/tests/data/test_819_B | 20 + bottleneck/tests/data/test_820_A | 30 + bottleneck/tests/data/test_820_B | 30 + bottleneck/tests/data/test_821_A | 30 + bottleneck/tests/data/test_821_B | 30 + bottleneck/tests/data/test_822_A | 30 + bottleneck/tests/data/test_822_B | 30 + bottleneck/tests/data/test_823_A | 30 + bottleneck/tests/data/test_823_B | 30 + bottleneck/tests/data/test_824_A | 30 + bottleneck/tests/data/test_824_B | 30 + bottleneck/tests/data/test_825_A | 30 + bottleneck/tests/data/test_825_B | 30 + bottleneck/tests/data/test_826_A | 30 + bottleneck/tests/data/test_826_B | 30 + bottleneck/tests/data/test_827_A | 30 + bottleneck/tests/data/test_827_B | 30 + bottleneck/tests/data/test_828_A | 30 + bottleneck/tests/data/test_828_B | 30 + bottleneck/tests/data/test_829_A | 30 + bottleneck/tests/data/test_829_B | 30 + bottleneck/tests/data/test_830_A | 30 + bottleneck/tests/data/test_830_B | 30 + bottleneck/tests/data/test_831_A | 30 + bottleneck/tests/data/test_831_B | 30 + bottleneck/tests/data/test_832_A | 30 + bottleneck/tests/data/test_832_B | 30 + bottleneck/tests/data/test_833_A | 30 + bottleneck/tests/data/test_833_B | 30 + bottleneck/tests/data/test_834_A | 30 + bottleneck/tests/data/test_834_B | 30 + bottleneck/tests/data/test_835_A | 30 + bottleneck/tests/data/test_835_B | 30 + bottleneck/tests/data/test_836_A | 30 + bottleneck/tests/data/test_836_B | 30 + bottleneck/tests/data/test_837_A | 30 + bottleneck/tests/data/test_837_B | 30 + bottleneck/tests/data/test_838_A | 30 + bottleneck/tests/data/test_838_B | 30 + bottleneck/tests/data/test_839_A | 30 + bottleneck/tests/data/test_839_B | 30 + bottleneck/tests/data/test_840_A | 50 + bottleneck/tests/data/test_840_B | 50 + bottleneck/tests/data/test_841_A | 50 + bottleneck/tests/data/test_841_B | 50 + bottleneck/tests/data/test_842_A | 50 + bottleneck/tests/data/test_842_B | 50 + bottleneck/tests/data/test_843_A | 50 + bottleneck/tests/data/test_843_B | 50 + bottleneck/tests/data/test_844_A | 50 + bottleneck/tests/data/test_844_B | 50 + bottleneck/tests/data/test_845_A | 50 + bottleneck/tests/data/test_845_B | 50 + bottleneck/tests/data/test_846_A | 50 + bottleneck/tests/data/test_846_B | 50 + bottleneck/tests/data/test_847_A | 50 + bottleneck/tests/data/test_847_B | 50 + bottleneck/tests/data/test_848_A | 50 + bottleneck/tests/data/test_848_B | 50 + bottleneck/tests/data/test_849_A | 50 + bottleneck/tests/data/test_849_B | 50 + bottleneck/tests/data/test_850_A | 50 + bottleneck/tests/data/test_850_B | 50 + bottleneck/tests/data/test_851_A | 50 + bottleneck/tests/data/test_851_B | 50 + bottleneck/tests/data/test_852_A | 50 + bottleneck/tests/data/test_852_B | 50 + bottleneck/tests/data/test_853_A | 50 + bottleneck/tests/data/test_853_B | 50 + bottleneck/tests/data/test_854_A | 50 + bottleneck/tests/data/test_854_B | 50 + bottleneck/tests/data/test_855_A | 50 + bottleneck/tests/data/test_855_B | 50 + bottleneck/tests/data/test_856_A | 50 + bottleneck/tests/data/test_856_B | 50 + bottleneck/tests/data/test_857_A | 50 + bottleneck/tests/data/test_857_B | 50 + bottleneck/tests/data/test_858_A | 50 + bottleneck/tests/data/test_858_B | 50 + bottleneck/tests/data/test_859_A | 50 + bottleneck/tests/data/test_859_B | 50 + bottleneck/tests/data/test_860_A | 100 + bottleneck/tests/data/test_860_B | 100 + bottleneck/tests/data/test_861_A | 100 + bottleneck/tests/data/test_861_B | 100 + bottleneck/tests/data/test_862_A | 100 + bottleneck/tests/data/test_862_B | 100 + bottleneck/tests/data/test_863_A | 100 + bottleneck/tests/data/test_863_B | 100 + bottleneck/tests/data/test_864_A | 100 + bottleneck/tests/data/test_864_B | 100 + bottleneck/tests/data/test_865_A | 100 + bottleneck/tests/data/test_865_B | 100 + bottleneck/tests/data/test_866_A | 100 + bottleneck/tests/data/test_866_B | 100 + bottleneck/tests/data/test_867_A | 100 + bottleneck/tests/data/test_867_B | 100 + bottleneck/tests/data/test_868_A | 100 + bottleneck/tests/data/test_868_B | 100 + bottleneck/tests/data/test_869_A | 100 + bottleneck/tests/data/test_869_B | 100 + bottleneck/tests/data/test_870_A | 100 + bottleneck/tests/data/test_870_B | 100 + bottleneck/tests/data/test_871_A | 100 + bottleneck/tests/data/test_871_B | 100 + bottleneck/tests/data/test_872_A | 100 + bottleneck/tests/data/test_872_B | 100 + bottleneck/tests/data/test_873_A | 100 + bottleneck/tests/data/test_873_B | 100 + bottleneck/tests/data/test_874_A | 100 + bottleneck/tests/data/test_874_B | 100 + bottleneck/tests/data/test_875_A | 100 + bottleneck/tests/data/test_875_B | 100 + bottleneck/tests/data/test_876_A | 100 + bottleneck/tests/data/test_876_B | 100 + bottleneck/tests/data/test_877_A | 100 + bottleneck/tests/data/test_877_B | 100 + bottleneck/tests/data/test_878_A | 100 + bottleneck/tests/data/test_878_B | 100 + bottleneck/tests/data/test_879_A | 100 + bottleneck/tests/data/test_879_B | 100 + bottleneck/tests/data/test_list.txt | 792 ++ bottleneck/tests/data/test_list.txt.bak | 792 ++ bottleneck/tests/data/ws_tests/test_100_A | 100 + bottleneck/tests/data/ws_tests/test_100_A.pd.dipha | Bin 0 -> 2424 bytes bottleneck/tests/data/ws_tests/test_100_B | 100 + bottleneck/tests/data/ws_tests/test_100_B.pd.dipha | Bin 0 -> 2424 bytes bottleneck/tests/data/ws_tests/test_200_A | 200 + bottleneck/tests/data/ws_tests/test_200_B | 200 + bottleneck/tests/data/ws_tests/test_5000_A | 5000 ++++++++ bottleneck/tests/data/ws_tests/test_5000_B | 5000 ++++++++ bottleneck/tests/data/ws_tests/test_5_A | 5 + bottleneck/tests/data/ws_tests/test_5_A.pd.dipha | Bin 0 -> 144 bytes bottleneck/tests/data/ws_tests/test_5_B | 5 + bottleneck/tests/data/ws_tests/test_5_B.pd.dipha | Bin 0 -> 144 bytes bottleneck/tests/data/ws_tests/test_diag1_A | 1 + .../tests/data/ws_tests/test_diag1_A.pd.dipha | Bin 0 -> 48 bytes bottleneck/tests/data/ws_tests/test_diag1_B | 1 + .../tests/data/ws_tests/test_diag1_B.pd.dipha | Bin 0 -> 48 bytes bottleneck/tests/data/ws_tests/test_diag2_A | 1 + .../tests/data/ws_tests/test_diag2_A.pd.dipha | Bin 0 -> 48 bytes bottleneck/tests/data/ws_tests/test_diag2_B | 1 + .../tests/data/ws_tests/test_diag2_B.pd.dipha | Bin 0 -> 48 bytes bottleneck/tests/data/ws_tests/test_diag3_A | 220 + .../tests/data/ws_tests/test_diag3_A.pd.dipha | Bin 0 -> 5304 bytes bottleneck/tests/data/ws_tests/test_diag3_B | 193 + .../tests/data/ws_tests/test_diag3_B.pd.dipha | Bin 0 -> 4656 bytes bottleneck/tests/data/ws_tests/test_list.txt | 21 + bottleneck/tests/test_hera_bottleneck.cpp | 611 + bottleneck/tests/tests_main.cpp | 3 + geom_bottleneck/.gitignore | 36 - geom_bottleneck/CMakeLists.txt | 38 - geom_bottleneck/README | 98 - geom_bottleneck/example/CMakeLists.txt | 27 - geom_bottleneck/example/bottleneck_dist.cpp | 96 - geom_bottleneck/include/basic_defs_bt.h | 569 - geom_bottleneck/include/bottleneck.h | 153 - geom_bottleneck/include/bottleneck_detail.h | 90 - geom_bottleneck/include/bottleneck_detail.hpp | 636 - geom_bottleneck/include/bound_match.h | 109 - geom_bottleneck/include/bound_match.hpp | 511 - geom_bottleneck/include/catch/catch.hpp | 11545 ------------------- geom_bottleneck/include/def_debug_bt.h | 42 - geom_bottleneck/include/diagram_reader.h | 196 - geom_bottleneck/include/diagram_traits.h | 45 - .../include/dnn/geometry/euclidean-fixed.h | 162 - geom_bottleneck/include/dnn/local/kd-tree.h | 106 - geom_bottleneck/include/dnn/local/kd-tree.hpp | 296 - .../include/dnn/local/search-functors.h | 119 - geom_bottleneck/include/dnn/parallel/tbb.h | 235 - geom_bottleneck/include/dnn/parallel/utils.h | 100 - geom_bottleneck/include/dnn/utils.h | 47 - geom_bottleneck/include/neighb_oracle.h | 295 - geom_bottleneck/tests/data/test_001_A | 1 - geom_bottleneck/tests/data/test_001_B | 1 - geom_bottleneck/tests/data/test_002_A | 1 - geom_bottleneck/tests/data/test_002_B | 1 - geom_bottleneck/tests/data/test_003_A | 2 - geom_bottleneck/tests/data/test_003_B | 2 - geom_bottleneck/tests/data/test_004_A | 2 - geom_bottleneck/tests/data/test_004_B | 3 - geom_bottleneck/tests/data/test_005_A | 6 - geom_bottleneck/tests/data/test_005_B | 6 - geom_bottleneck/tests/data/test_006_A | 7 - geom_bottleneck/tests/data/test_006_B | 7 - geom_bottleneck/tests/data/test_007_A | 0 geom_bottleneck/tests/data/test_007_B | 0 geom_bottleneck/tests/data/test_008_A | 1 - geom_bottleneck/tests/data/test_008_B | 1 - geom_bottleneck/tests/data/test_009_A | 1 - geom_bottleneck/tests/data/test_009_B | 1 - geom_bottleneck/tests/data/test_010_A | 100 - geom_bottleneck/tests/data/test_010_B | 100 - geom_bottleneck/tests/data/test_011_A | 200 - geom_bottleneck/tests/data/test_011_B | 200 - geom_bottleneck/tests/data/test_012_A | 5000 -------- geom_bottleneck/tests/data/test_012_B | 5000 -------- geom_bottleneck/tests/data/test_013_A | 5 - geom_bottleneck/tests/data/test_013_B | 5 - geom_bottleneck/tests/data/test_014_A | 1 - geom_bottleneck/tests/data/test_014_B | 1 - geom_bottleneck/tests/data/test_015_A | 1 - geom_bottleneck/tests/data/test_015_B | 1 - geom_bottleneck/tests/data/test_016_A | 220 - geom_bottleneck/tests/data/test_016_B | 193 - geom_bottleneck/tests/data/test_100_A | 2 - geom_bottleneck/tests/data/test_100_B | 2 - geom_bottleneck/tests/data/test_101_A | 2 - geom_bottleneck/tests/data/test_101_B | 2 - geom_bottleneck/tests/data/test_102_A | 2 - geom_bottleneck/tests/data/test_102_B | 2 - geom_bottleneck/tests/data/test_103_A | 2 - geom_bottleneck/tests/data/test_103_B | 2 - geom_bottleneck/tests/data/test_104_A | 2 - geom_bottleneck/tests/data/test_104_B | 2 - geom_bottleneck/tests/data/test_105_A | 2 - geom_bottleneck/tests/data/test_105_B | 2 - geom_bottleneck/tests/data/test_106_A | 2 - geom_bottleneck/tests/data/test_106_B | 2 - geom_bottleneck/tests/data/test_107_A | 2 - geom_bottleneck/tests/data/test_107_B | 2 - geom_bottleneck/tests/data/test_108_A | 2 - geom_bottleneck/tests/data/test_108_B | 2 - geom_bottleneck/tests/data/test_109_A | 2 - geom_bottleneck/tests/data/test_109_B | 2 - geom_bottleneck/tests/data/test_110_A | 2 - geom_bottleneck/tests/data/test_110_B | 2 - geom_bottleneck/tests/data/test_111_A | 2 - geom_bottleneck/tests/data/test_111_B | 2 - geom_bottleneck/tests/data/test_112_A | 2 - geom_bottleneck/tests/data/test_112_B | 2 - geom_bottleneck/tests/data/test_113_A | 2 - geom_bottleneck/tests/data/test_113_B | 2 - geom_bottleneck/tests/data/test_114_A | 2 - geom_bottleneck/tests/data/test_114_B | 2 - geom_bottleneck/tests/data/test_115_A | 2 - geom_bottleneck/tests/data/test_115_B | 2 - geom_bottleneck/tests/data/test_116_A | 2 - geom_bottleneck/tests/data/test_116_B | 2 - geom_bottleneck/tests/data/test_117_A | 2 - geom_bottleneck/tests/data/test_117_B | 2 - geom_bottleneck/tests/data/test_118_A | 2 - geom_bottleneck/tests/data/test_118_B | 2 - geom_bottleneck/tests/data/test_119_A | 2 - geom_bottleneck/tests/data/test_119_B | 2 - geom_bottleneck/tests/data/test_120_A | 3 - geom_bottleneck/tests/data/test_120_B | 3 - geom_bottleneck/tests/data/test_121_A | 3 - geom_bottleneck/tests/data/test_121_B | 3 - geom_bottleneck/tests/data/test_122_A | 3 - geom_bottleneck/tests/data/test_122_B | 3 - geom_bottleneck/tests/data/test_123_A | 3 - geom_bottleneck/tests/data/test_123_B | 3 - geom_bottleneck/tests/data/test_124_A | 3 - geom_bottleneck/tests/data/test_124_B | 3 - geom_bottleneck/tests/data/test_125_A | 3 - geom_bottleneck/tests/data/test_125_B | 3 - geom_bottleneck/tests/data/test_126_A | 3 - geom_bottleneck/tests/data/test_126_B | 3 - geom_bottleneck/tests/data/test_127_A | 3 - geom_bottleneck/tests/data/test_127_B | 3 - geom_bottleneck/tests/data/test_128_A | 3 - geom_bottleneck/tests/data/test_128_B | 3 - geom_bottleneck/tests/data/test_129_A | 3 - geom_bottleneck/tests/data/test_129_B | 3 - geom_bottleneck/tests/data/test_130_A | 3 - geom_bottleneck/tests/data/test_130_B | 3 - geom_bottleneck/tests/data/test_131_A | 3 - geom_bottleneck/tests/data/test_131_B | 3 - geom_bottleneck/tests/data/test_132_A | 3 - geom_bottleneck/tests/data/test_132_B | 3 - geom_bottleneck/tests/data/test_133_A | 3 - geom_bottleneck/tests/data/test_133_B | 3 - geom_bottleneck/tests/data/test_134_A | 3 - geom_bottleneck/tests/data/test_134_B | 3 - geom_bottleneck/tests/data/test_135_A | 3 - geom_bottleneck/tests/data/test_135_B | 3 - geom_bottleneck/tests/data/test_136_A | 3 - geom_bottleneck/tests/data/test_136_B | 3 - geom_bottleneck/tests/data/test_137_A | 3 - geom_bottleneck/tests/data/test_137_B | 3 - geom_bottleneck/tests/data/test_138_A | 3 - geom_bottleneck/tests/data/test_138_B | 3 - geom_bottleneck/tests/data/test_139_A | 3 - geom_bottleneck/tests/data/test_139_B | 3 - geom_bottleneck/tests/data/test_140_A | 4 - geom_bottleneck/tests/data/test_140_B | 4 - geom_bottleneck/tests/data/test_141_A | 4 - geom_bottleneck/tests/data/test_141_B | 4 - geom_bottleneck/tests/data/test_142_A | 4 - geom_bottleneck/tests/data/test_142_B | 4 - geom_bottleneck/tests/data/test_143_A | 4 - geom_bottleneck/tests/data/test_143_B | 4 - geom_bottleneck/tests/data/test_144_A | 4 - geom_bottleneck/tests/data/test_144_B | 4 - geom_bottleneck/tests/data/test_145_A | 4 - geom_bottleneck/tests/data/test_145_B | 4 - geom_bottleneck/tests/data/test_146_A | 4 - geom_bottleneck/tests/data/test_146_B | 4 - geom_bottleneck/tests/data/test_147_A | 4 - geom_bottleneck/tests/data/test_147_B | 4 - geom_bottleneck/tests/data/test_148_A | 4 - geom_bottleneck/tests/data/test_148_B | 4 - geom_bottleneck/tests/data/test_149_A | 4 - geom_bottleneck/tests/data/test_149_B | 4 - geom_bottleneck/tests/data/test_150_A | 4 - geom_bottleneck/tests/data/test_150_B | 4 - geom_bottleneck/tests/data/test_151_A | 4 - geom_bottleneck/tests/data/test_151_B | 4 - geom_bottleneck/tests/data/test_152_A | 4 - geom_bottleneck/tests/data/test_152_B | 4 - geom_bottleneck/tests/data/test_153_A | 4 - geom_bottleneck/tests/data/test_153_B | 4 - geom_bottleneck/tests/data/test_154_A | 4 - geom_bottleneck/tests/data/test_154_B | 4 - geom_bottleneck/tests/data/test_155_A | 4 - geom_bottleneck/tests/data/test_155_B | 4 - geom_bottleneck/tests/data/test_156_A | 4 - geom_bottleneck/tests/data/test_156_B | 4 - geom_bottleneck/tests/data/test_157_A | 4 - geom_bottleneck/tests/data/test_157_B | 4 - geom_bottleneck/tests/data/test_158_A | 4 - geom_bottleneck/tests/data/test_158_B | 4 - geom_bottleneck/tests/data/test_159_A | 4 - geom_bottleneck/tests/data/test_159_B | 4 - geom_bottleneck/tests/data/test_160_A | 5 - geom_bottleneck/tests/data/test_160_B | 5 - geom_bottleneck/tests/data/test_161_A | 5 - geom_bottleneck/tests/data/test_161_B | 5 - geom_bottleneck/tests/data/test_162_A | 5 - geom_bottleneck/tests/data/test_162_B | 5 - geom_bottleneck/tests/data/test_163_A | 5 - geom_bottleneck/tests/data/test_163_B | 5 - geom_bottleneck/tests/data/test_164_A | 5 - geom_bottleneck/tests/data/test_164_B | 5 - geom_bottleneck/tests/data/test_165_A | 5 - geom_bottleneck/tests/data/test_165_B | 5 - geom_bottleneck/tests/data/test_166_A | 5 - geom_bottleneck/tests/data/test_166_B | 5 - geom_bottleneck/tests/data/test_167_A | 5 - geom_bottleneck/tests/data/test_167_B | 5 - geom_bottleneck/tests/data/test_168_A | 5 - geom_bottleneck/tests/data/test_168_B | 5 - geom_bottleneck/tests/data/test_169_A | 5 - geom_bottleneck/tests/data/test_169_B | 5 - geom_bottleneck/tests/data/test_170_A | 5 - geom_bottleneck/tests/data/test_170_B | 5 - geom_bottleneck/tests/data/test_171_A | 5 - geom_bottleneck/tests/data/test_171_B | 5 - geom_bottleneck/tests/data/test_172_A | 5 - geom_bottleneck/tests/data/test_172_B | 5 - geom_bottleneck/tests/data/test_173_A | 5 - geom_bottleneck/tests/data/test_173_B | 5 - geom_bottleneck/tests/data/test_174_A | 5 - geom_bottleneck/tests/data/test_174_B | 5 - geom_bottleneck/tests/data/test_175_A | 5 - geom_bottleneck/tests/data/test_175_B | 5 - geom_bottleneck/tests/data/test_176_A | 5 - geom_bottleneck/tests/data/test_176_B | 5 - geom_bottleneck/tests/data/test_177_A | 5 - geom_bottleneck/tests/data/test_177_B | 5 - geom_bottleneck/tests/data/test_178_A | 5 - geom_bottleneck/tests/data/test_178_B | 5 - geom_bottleneck/tests/data/test_179_A | 5 - geom_bottleneck/tests/data/test_179_B | 5 - geom_bottleneck/tests/data/test_180_A | 6 - geom_bottleneck/tests/data/test_180_B | 6 - geom_bottleneck/tests/data/test_181_A | 6 - geom_bottleneck/tests/data/test_181_B | 6 - geom_bottleneck/tests/data/test_182_A | 6 - geom_bottleneck/tests/data/test_182_B | 6 - geom_bottleneck/tests/data/test_183_A | 6 - geom_bottleneck/tests/data/test_183_B | 6 - geom_bottleneck/tests/data/test_184_A | 6 - geom_bottleneck/tests/data/test_184_B | 6 - geom_bottleneck/tests/data/test_185_A | 6 - geom_bottleneck/tests/data/test_185_B | 6 - geom_bottleneck/tests/data/test_186_A | 6 - geom_bottleneck/tests/data/test_186_B | 6 - geom_bottleneck/tests/data/test_187_A | 6 - geom_bottleneck/tests/data/test_187_B | 6 - geom_bottleneck/tests/data/test_188_A | 6 - geom_bottleneck/tests/data/test_188_B | 6 - geom_bottleneck/tests/data/test_189_A | 6 - geom_bottleneck/tests/data/test_189_B | 6 - geom_bottleneck/tests/data/test_190_A | 6 - geom_bottleneck/tests/data/test_190_B | 6 - geom_bottleneck/tests/data/test_191_A | 6 - geom_bottleneck/tests/data/test_191_B | 6 - geom_bottleneck/tests/data/test_192_A | 6 - geom_bottleneck/tests/data/test_192_B | 6 - geom_bottleneck/tests/data/test_193_A | 6 - geom_bottleneck/tests/data/test_193_B | 6 - geom_bottleneck/tests/data/test_194_A | 6 - geom_bottleneck/tests/data/test_194_B | 6 - geom_bottleneck/tests/data/test_195_A | 6 - geom_bottleneck/tests/data/test_195_B | 6 - geom_bottleneck/tests/data/test_196_A | 6 - geom_bottleneck/tests/data/test_196_B | 6 - geom_bottleneck/tests/data/test_197_A | 6 - geom_bottleneck/tests/data/test_197_B | 6 - geom_bottleneck/tests/data/test_198_A | 6 - geom_bottleneck/tests/data/test_198_B | 6 - geom_bottleneck/tests/data/test_199_A | 6 - geom_bottleneck/tests/data/test_199_B | 6 - geom_bottleneck/tests/data/test_200_A | 7 - geom_bottleneck/tests/data/test_200_B | 7 - geom_bottleneck/tests/data/test_201_A | 7 - geom_bottleneck/tests/data/test_201_B | 7 - geom_bottleneck/tests/data/test_202_A | 7 - geom_bottleneck/tests/data/test_202_B | 7 - geom_bottleneck/tests/data/test_203_A | 7 - geom_bottleneck/tests/data/test_203_B | 7 - geom_bottleneck/tests/data/test_204_A | 7 - geom_bottleneck/tests/data/test_204_B | 7 - geom_bottleneck/tests/data/test_205_A | 7 - geom_bottleneck/tests/data/test_205_B | 7 - geom_bottleneck/tests/data/test_206_A | 7 - geom_bottleneck/tests/data/test_206_B | 7 - geom_bottleneck/tests/data/test_207_A | 7 - geom_bottleneck/tests/data/test_207_B | 7 - geom_bottleneck/tests/data/test_208_A | 7 - geom_bottleneck/tests/data/test_208_B | 7 - geom_bottleneck/tests/data/test_209_A | 7 - geom_bottleneck/tests/data/test_209_B | 7 - geom_bottleneck/tests/data/test_210_A | 7 - geom_bottleneck/tests/data/test_210_B | 7 - geom_bottleneck/tests/data/test_211_A | 7 - geom_bottleneck/tests/data/test_211_B | 7 - geom_bottleneck/tests/data/test_212_A | 7 - geom_bottleneck/tests/data/test_212_B | 7 - geom_bottleneck/tests/data/test_213_A | 7 - geom_bottleneck/tests/data/test_213_B | 7 - geom_bottleneck/tests/data/test_214_A | 7 - geom_bottleneck/tests/data/test_214_B | 7 - geom_bottleneck/tests/data/test_215_A | 7 - geom_bottleneck/tests/data/test_215_B | 7 - geom_bottleneck/tests/data/test_216_A | 7 - geom_bottleneck/tests/data/test_216_B | 7 - geom_bottleneck/tests/data/test_217_A | 7 - geom_bottleneck/tests/data/test_217_B | 7 - geom_bottleneck/tests/data/test_218_A | 7 - geom_bottleneck/tests/data/test_218_B | 7 - geom_bottleneck/tests/data/test_219_A | 7 - geom_bottleneck/tests/data/test_219_B | 7 - geom_bottleneck/tests/data/test_220_A | 8 - geom_bottleneck/tests/data/test_220_B | 8 - geom_bottleneck/tests/data/test_221_A | 8 - geom_bottleneck/tests/data/test_221_B | 8 - geom_bottleneck/tests/data/test_222_A | 8 - geom_bottleneck/tests/data/test_222_B | 8 - geom_bottleneck/tests/data/test_223_A | 8 - geom_bottleneck/tests/data/test_223_B | 8 - geom_bottleneck/tests/data/test_224_A | 8 - geom_bottleneck/tests/data/test_224_B | 8 - geom_bottleneck/tests/data/test_225_A | 8 - geom_bottleneck/tests/data/test_225_B | 8 - geom_bottleneck/tests/data/test_226_A | 8 - geom_bottleneck/tests/data/test_226_B | 8 - geom_bottleneck/tests/data/test_227_A | 8 - geom_bottleneck/tests/data/test_227_B | 8 - geom_bottleneck/tests/data/test_228_A | 8 - geom_bottleneck/tests/data/test_228_B | 8 - geom_bottleneck/tests/data/test_229_A | 8 - geom_bottleneck/tests/data/test_229_B | 8 - geom_bottleneck/tests/data/test_230_A | 8 - geom_bottleneck/tests/data/test_230_B | 8 - geom_bottleneck/tests/data/test_231_A | 8 - geom_bottleneck/tests/data/test_231_B | 8 - geom_bottleneck/tests/data/test_232_A | 8 - geom_bottleneck/tests/data/test_232_B | 8 - geom_bottleneck/tests/data/test_233_A | 8 - geom_bottleneck/tests/data/test_233_B | 8 - geom_bottleneck/tests/data/test_234_A | 8 - geom_bottleneck/tests/data/test_234_B | 8 - geom_bottleneck/tests/data/test_235_A | 8 - geom_bottleneck/tests/data/test_235_B | 8 - geom_bottleneck/tests/data/test_236_A | 8 - geom_bottleneck/tests/data/test_236_B | 8 - geom_bottleneck/tests/data/test_237_A | 8 - geom_bottleneck/tests/data/test_237_B | 8 - geom_bottleneck/tests/data/test_238_A | 8 - geom_bottleneck/tests/data/test_238_B | 8 - geom_bottleneck/tests/data/test_239_A | 8 - geom_bottleneck/tests/data/test_239_B | 8 - geom_bottleneck/tests/data/test_240_A | 9 - geom_bottleneck/tests/data/test_240_B | 9 - geom_bottleneck/tests/data/test_241_A | 9 - geom_bottleneck/tests/data/test_241_B | 9 - geom_bottleneck/tests/data/test_242_A | 9 - geom_bottleneck/tests/data/test_242_B | 9 - geom_bottleneck/tests/data/test_243_A | 9 - geom_bottleneck/tests/data/test_243_B | 9 - geom_bottleneck/tests/data/test_244_A | 9 - geom_bottleneck/tests/data/test_244_B | 9 - geom_bottleneck/tests/data/test_245_A | 9 - geom_bottleneck/tests/data/test_245_B | 9 - geom_bottleneck/tests/data/test_246_A | 9 - geom_bottleneck/tests/data/test_246_B | 9 - geom_bottleneck/tests/data/test_247_A | 9 - geom_bottleneck/tests/data/test_247_B | 9 - geom_bottleneck/tests/data/test_248_A | 9 - geom_bottleneck/tests/data/test_248_B | 9 - geom_bottleneck/tests/data/test_249_A | 9 - geom_bottleneck/tests/data/test_249_B | 9 - geom_bottleneck/tests/data/test_250_A | 9 - geom_bottleneck/tests/data/test_250_B | 9 - geom_bottleneck/tests/data/test_251_A | 9 - geom_bottleneck/tests/data/test_251_B | 9 - geom_bottleneck/tests/data/test_252_A | 9 - geom_bottleneck/tests/data/test_252_B | 9 - geom_bottleneck/tests/data/test_253_A | 9 - geom_bottleneck/tests/data/test_253_B | 9 - geom_bottleneck/tests/data/test_254_A | 9 - geom_bottleneck/tests/data/test_254_B | 9 - geom_bottleneck/tests/data/test_255_A | 9 - geom_bottleneck/tests/data/test_255_B | 9 - geom_bottleneck/tests/data/test_256_A | 9 - geom_bottleneck/tests/data/test_256_B | 9 - geom_bottleneck/tests/data/test_257_A | 9 - geom_bottleneck/tests/data/test_257_B | 9 - geom_bottleneck/tests/data/test_258_A | 9 - geom_bottleneck/tests/data/test_258_B | 9 - geom_bottleneck/tests/data/test_259_A | 9 - geom_bottleneck/tests/data/test_259_B | 9 - geom_bottleneck/tests/data/test_260_A | 10 - geom_bottleneck/tests/data/test_260_B | 10 - geom_bottleneck/tests/data/test_261_A | 10 - geom_bottleneck/tests/data/test_261_B | 10 - geom_bottleneck/tests/data/test_262_A | 10 - geom_bottleneck/tests/data/test_262_B | 10 - geom_bottleneck/tests/data/test_263_A | 10 - geom_bottleneck/tests/data/test_263_B | 10 - geom_bottleneck/tests/data/test_264_A | 10 - geom_bottleneck/tests/data/test_264_B | 10 - geom_bottleneck/tests/data/test_265_A | 10 - geom_bottleneck/tests/data/test_265_B | 10 - geom_bottleneck/tests/data/test_266_A | 10 - geom_bottleneck/tests/data/test_266_B | 10 - geom_bottleneck/tests/data/test_267_A | 10 - geom_bottleneck/tests/data/test_267_B | 10 - geom_bottleneck/tests/data/test_268_A | 10 - geom_bottleneck/tests/data/test_268_B | 10 - geom_bottleneck/tests/data/test_269_A | 10 - geom_bottleneck/tests/data/test_269_B | 10 - geom_bottleneck/tests/data/test_270_A | 10 - geom_bottleneck/tests/data/test_270_B | 10 - geom_bottleneck/tests/data/test_271_A | 10 - geom_bottleneck/tests/data/test_271_B | 10 - geom_bottleneck/tests/data/test_272_A | 10 - geom_bottleneck/tests/data/test_272_B | 10 - geom_bottleneck/tests/data/test_273_A | 10 - geom_bottleneck/tests/data/test_273_B | 10 - geom_bottleneck/tests/data/test_274_A | 10 - geom_bottleneck/tests/data/test_274_B | 10 - geom_bottleneck/tests/data/test_275_A | 10 - geom_bottleneck/tests/data/test_275_B | 10 - geom_bottleneck/tests/data/test_276_A | 10 - geom_bottleneck/tests/data/test_276_B | 10 - geom_bottleneck/tests/data/test_277_A | 10 - geom_bottleneck/tests/data/test_277_B | 10 - geom_bottleneck/tests/data/test_278_A | 10 - geom_bottleneck/tests/data/test_278_B | 10 - geom_bottleneck/tests/data/test_279_A | 10 - geom_bottleneck/tests/data/test_279_B | 10 - geom_bottleneck/tests/data/test_280_A | 20 - geom_bottleneck/tests/data/test_280_B | 20 - geom_bottleneck/tests/data/test_281_A | 20 - geom_bottleneck/tests/data/test_281_B | 20 - geom_bottleneck/tests/data/test_282_A | 20 - geom_bottleneck/tests/data/test_282_B | 20 - geom_bottleneck/tests/data/test_283_A | 20 - geom_bottleneck/tests/data/test_283_B | 20 - geom_bottleneck/tests/data/test_284_A | 20 - geom_bottleneck/tests/data/test_284_B | 20 - geom_bottleneck/tests/data/test_285_A | 20 - geom_bottleneck/tests/data/test_285_B | 20 - geom_bottleneck/tests/data/test_286_A | 20 - geom_bottleneck/tests/data/test_286_B | 20 - geom_bottleneck/tests/data/test_287_A | 20 - geom_bottleneck/tests/data/test_287_B | 20 - geom_bottleneck/tests/data/test_288_A | 20 - geom_bottleneck/tests/data/test_288_B | 20 - geom_bottleneck/tests/data/test_289_A | 20 - geom_bottleneck/tests/data/test_289_B | 20 - geom_bottleneck/tests/data/test_290_A | 20 - geom_bottleneck/tests/data/test_290_B | 20 - geom_bottleneck/tests/data/test_291_A | 20 - geom_bottleneck/tests/data/test_291_B | 20 - geom_bottleneck/tests/data/test_292_A | 20 - geom_bottleneck/tests/data/test_292_B | 20 - geom_bottleneck/tests/data/test_293_A | 20 - geom_bottleneck/tests/data/test_293_B | 20 - geom_bottleneck/tests/data/test_294_A | 20 - geom_bottleneck/tests/data/test_294_B | 20 - geom_bottleneck/tests/data/test_295_A | 20 - geom_bottleneck/tests/data/test_295_B | 20 - geom_bottleneck/tests/data/test_296_A | 20 - geom_bottleneck/tests/data/test_296_B | 20 - geom_bottleneck/tests/data/test_297_A | 20 - geom_bottleneck/tests/data/test_297_B | 20 - geom_bottleneck/tests/data/test_298_A | 20 - geom_bottleneck/tests/data/test_298_B | 20 - geom_bottleneck/tests/data/test_299_A | 20 - geom_bottleneck/tests/data/test_299_B | 20 - geom_bottleneck/tests/data/test_300_A | 30 - geom_bottleneck/tests/data/test_300_B | 30 - geom_bottleneck/tests/data/test_301_A | 30 - geom_bottleneck/tests/data/test_301_B | 30 - geom_bottleneck/tests/data/test_302_A | 30 - geom_bottleneck/tests/data/test_302_B | 30 - geom_bottleneck/tests/data/test_303_A | 30 - geom_bottleneck/tests/data/test_303_B | 30 - geom_bottleneck/tests/data/test_304_A | 30 - geom_bottleneck/tests/data/test_304_B | 30 - geom_bottleneck/tests/data/test_305_A | 30 - geom_bottleneck/tests/data/test_305_B | 30 - geom_bottleneck/tests/data/test_306_A | 30 - geom_bottleneck/tests/data/test_306_B | 30 - geom_bottleneck/tests/data/test_307_A | 30 - geom_bottleneck/tests/data/test_307_B | 30 - geom_bottleneck/tests/data/test_308_A | 30 - geom_bottleneck/tests/data/test_308_B | 30 - geom_bottleneck/tests/data/test_309_A | 30 - geom_bottleneck/tests/data/test_309_B | 30 - geom_bottleneck/tests/data/test_310_A | 30 - geom_bottleneck/tests/data/test_310_B | 30 - geom_bottleneck/tests/data/test_311_A | 30 - geom_bottleneck/tests/data/test_311_B | 30 - geom_bottleneck/tests/data/test_312_A | 30 - geom_bottleneck/tests/data/test_312_B | 30 - geom_bottleneck/tests/data/test_313_A | 30 - geom_bottleneck/tests/data/test_313_B | 30 - geom_bottleneck/tests/data/test_314_A | 30 - geom_bottleneck/tests/data/test_314_B | 30 - geom_bottleneck/tests/data/test_315_A | 30 - geom_bottleneck/tests/data/test_315_B | 30 - geom_bottleneck/tests/data/test_316_A | 30 - geom_bottleneck/tests/data/test_316_B | 30 - geom_bottleneck/tests/data/test_317_A | 30 - geom_bottleneck/tests/data/test_317_B | 30 - geom_bottleneck/tests/data/test_318_A | 30 - geom_bottleneck/tests/data/test_318_B | 30 - geom_bottleneck/tests/data/test_319_A | 30 - geom_bottleneck/tests/data/test_319_B | 30 - geom_bottleneck/tests/data/test_320_A | 50 - geom_bottleneck/tests/data/test_320_B | 50 - geom_bottleneck/tests/data/test_321_A | 50 - geom_bottleneck/tests/data/test_321_B | 50 - geom_bottleneck/tests/data/test_322_A | 50 - geom_bottleneck/tests/data/test_322_B | 50 - geom_bottleneck/tests/data/test_323_A | 50 - geom_bottleneck/tests/data/test_323_B | 50 - geom_bottleneck/tests/data/test_324_A | 50 - geom_bottleneck/tests/data/test_324_B | 50 - geom_bottleneck/tests/data/test_325_A | 50 - geom_bottleneck/tests/data/test_325_B | 50 - geom_bottleneck/tests/data/test_326_A | 50 - geom_bottleneck/tests/data/test_326_B | 50 - geom_bottleneck/tests/data/test_327_A | 50 - geom_bottleneck/tests/data/test_327_B | 50 - geom_bottleneck/tests/data/test_328_A | 50 - geom_bottleneck/tests/data/test_328_B | 50 - geom_bottleneck/tests/data/test_329_A | 50 - geom_bottleneck/tests/data/test_329_B | 50 - geom_bottleneck/tests/data/test_330_A | 50 - geom_bottleneck/tests/data/test_330_B | 50 - geom_bottleneck/tests/data/test_331_A | 50 - geom_bottleneck/tests/data/test_331_B | 50 - geom_bottleneck/tests/data/test_332_A | 50 - geom_bottleneck/tests/data/test_332_B | 50 - geom_bottleneck/tests/data/test_333_A | 50 - geom_bottleneck/tests/data/test_333_B | 50 - geom_bottleneck/tests/data/test_334_A | 50 - geom_bottleneck/tests/data/test_334_B | 50 - geom_bottleneck/tests/data/test_335_A | 50 - geom_bottleneck/tests/data/test_335_B | 50 - geom_bottleneck/tests/data/test_336_A | 50 - geom_bottleneck/tests/data/test_336_B | 50 - geom_bottleneck/tests/data/test_337_A | 50 - geom_bottleneck/tests/data/test_337_B | 50 - geom_bottleneck/tests/data/test_338_A | 50 - geom_bottleneck/tests/data/test_338_B | 50 - geom_bottleneck/tests/data/test_339_A | 50 - geom_bottleneck/tests/data/test_339_B | 50 - geom_bottleneck/tests/data/test_340_A | 100 - geom_bottleneck/tests/data/test_340_B | 100 - geom_bottleneck/tests/data/test_341_A | 100 - geom_bottleneck/tests/data/test_341_B | 100 - geom_bottleneck/tests/data/test_342_A | 100 - geom_bottleneck/tests/data/test_342_B | 100 - geom_bottleneck/tests/data/test_343_A | 100 - geom_bottleneck/tests/data/test_343_B | 100 - geom_bottleneck/tests/data/test_344_A | 100 - geom_bottleneck/tests/data/test_344_B | 100 - geom_bottleneck/tests/data/test_345_A | 100 - geom_bottleneck/tests/data/test_345_B | 100 - geom_bottleneck/tests/data/test_346_A | 100 - geom_bottleneck/tests/data/test_346_B | 100 - geom_bottleneck/tests/data/test_347_A | 100 - geom_bottleneck/tests/data/test_347_B | 100 - geom_bottleneck/tests/data/test_348_A | 100 - geom_bottleneck/tests/data/test_348_B | 100 - geom_bottleneck/tests/data/test_349_A | 100 - geom_bottleneck/tests/data/test_349_B | 100 - geom_bottleneck/tests/data/test_350_A | 100 - geom_bottleneck/tests/data/test_350_B | 100 - geom_bottleneck/tests/data/test_351_A | 100 - geom_bottleneck/tests/data/test_351_B | 100 - geom_bottleneck/tests/data/test_352_A | 100 - geom_bottleneck/tests/data/test_352_B | 100 - geom_bottleneck/tests/data/test_353_A | 100 - geom_bottleneck/tests/data/test_353_B | 100 - geom_bottleneck/tests/data/test_354_A | 100 - geom_bottleneck/tests/data/test_354_B | 100 - geom_bottleneck/tests/data/test_355_A | 100 - geom_bottleneck/tests/data/test_355_B | 100 - geom_bottleneck/tests/data/test_356_A | 100 - geom_bottleneck/tests/data/test_356_B | 100 - geom_bottleneck/tests/data/test_357_A | 100 - geom_bottleneck/tests/data/test_357_B | 100 - geom_bottleneck/tests/data/test_358_A | 100 - geom_bottleneck/tests/data/test_358_B | 100 - geom_bottleneck/tests/data/test_359_A | 100 - geom_bottleneck/tests/data/test_359_B | 100 - geom_bottleneck/tests/data/test_360_A | 2 - geom_bottleneck/tests/data/test_360_B | 2 - geom_bottleneck/tests/data/test_361_A | 2 - geom_bottleneck/tests/data/test_361_B | 2 - geom_bottleneck/tests/data/test_362_A | 2 - geom_bottleneck/tests/data/test_362_B | 2 - geom_bottleneck/tests/data/test_363_A | 2 - geom_bottleneck/tests/data/test_363_B | 2 - geom_bottleneck/tests/data/test_364_A | 2 - geom_bottleneck/tests/data/test_364_B | 2 - geom_bottleneck/tests/data/test_365_A | 2 - geom_bottleneck/tests/data/test_365_B | 2 - geom_bottleneck/tests/data/test_366_A | 2 - geom_bottleneck/tests/data/test_366_B | 2 - geom_bottleneck/tests/data/test_367_A | 2 - geom_bottleneck/tests/data/test_367_B | 2 - geom_bottleneck/tests/data/test_368_A | 2 - geom_bottleneck/tests/data/test_368_B | 2 - geom_bottleneck/tests/data/test_369_A | 2 - geom_bottleneck/tests/data/test_369_B | 2 - geom_bottleneck/tests/data/test_370_A | 2 - geom_bottleneck/tests/data/test_370_B | 2 - geom_bottleneck/tests/data/test_371_A | 2 - geom_bottleneck/tests/data/test_371_B | 2 - geom_bottleneck/tests/data/test_372_A | 2 - geom_bottleneck/tests/data/test_372_B | 2 - geom_bottleneck/tests/data/test_373_A | 2 - geom_bottleneck/tests/data/test_373_B | 2 - geom_bottleneck/tests/data/test_374_A | 2 - geom_bottleneck/tests/data/test_374_B | 2 - geom_bottleneck/tests/data/test_375_A | 2 - geom_bottleneck/tests/data/test_375_B | 2 - geom_bottleneck/tests/data/test_376_A | 2 - geom_bottleneck/tests/data/test_376_B | 2 - geom_bottleneck/tests/data/test_377_A | 2 - geom_bottleneck/tests/data/test_377_B | 2 - geom_bottleneck/tests/data/test_378_A | 2 - geom_bottleneck/tests/data/test_378_B | 2 - geom_bottleneck/tests/data/test_379_A | 2 - geom_bottleneck/tests/data/test_379_B | 2 - geom_bottleneck/tests/data/test_380_A | 3 - geom_bottleneck/tests/data/test_380_B | 3 - geom_bottleneck/tests/data/test_381_A | 3 - geom_bottleneck/tests/data/test_381_B | 3 - geom_bottleneck/tests/data/test_382_A | 3 - geom_bottleneck/tests/data/test_382_B | 3 - geom_bottleneck/tests/data/test_383_A | 3 - geom_bottleneck/tests/data/test_383_B | 3 - geom_bottleneck/tests/data/test_384_A | 3 - geom_bottleneck/tests/data/test_384_B | 3 - geom_bottleneck/tests/data/test_385_A | 3 - geom_bottleneck/tests/data/test_385_B | 3 - geom_bottleneck/tests/data/test_386_A | 3 - geom_bottleneck/tests/data/test_386_B | 3 - geom_bottleneck/tests/data/test_387_A | 3 - geom_bottleneck/tests/data/test_387_B | 3 - geom_bottleneck/tests/data/test_388_A | 3 - geom_bottleneck/tests/data/test_388_B | 3 - geom_bottleneck/tests/data/test_389_A | 3 - geom_bottleneck/tests/data/test_389_B | 3 - geom_bottleneck/tests/data/test_390_A | 3 - geom_bottleneck/tests/data/test_390_B | 3 - geom_bottleneck/tests/data/test_391_A | 3 - geom_bottleneck/tests/data/test_391_B | 3 - geom_bottleneck/tests/data/test_392_A | 3 - geom_bottleneck/tests/data/test_392_B | 3 - geom_bottleneck/tests/data/test_393_A | 3 - geom_bottleneck/tests/data/test_393_B | 3 - geom_bottleneck/tests/data/test_394_A | 3 - geom_bottleneck/tests/data/test_394_B | 3 - geom_bottleneck/tests/data/test_395_A | 3 - geom_bottleneck/tests/data/test_395_B | 3 - geom_bottleneck/tests/data/test_396_A | 3 - geom_bottleneck/tests/data/test_396_B | 3 - geom_bottleneck/tests/data/test_397_A | 3 - geom_bottleneck/tests/data/test_397_B | 3 - geom_bottleneck/tests/data/test_398_A | 3 - geom_bottleneck/tests/data/test_398_B | 3 - geom_bottleneck/tests/data/test_399_A | 3 - geom_bottleneck/tests/data/test_399_B | 3 - geom_bottleneck/tests/data/test_400_A | 4 - geom_bottleneck/tests/data/test_400_B | 4 - geom_bottleneck/tests/data/test_401_A | 4 - geom_bottleneck/tests/data/test_401_B | 4 - geom_bottleneck/tests/data/test_402_A | 4 - geom_bottleneck/tests/data/test_402_B | 4 - geom_bottleneck/tests/data/test_403_A | 4 - geom_bottleneck/tests/data/test_403_B | 4 - geom_bottleneck/tests/data/test_404_A | 4 - geom_bottleneck/tests/data/test_404_B | 4 - geom_bottleneck/tests/data/test_405_A | 4 - geom_bottleneck/tests/data/test_405_B | 4 - geom_bottleneck/tests/data/test_406_A | 4 - geom_bottleneck/tests/data/test_406_B | 4 - geom_bottleneck/tests/data/test_407_A | 4 - geom_bottleneck/tests/data/test_407_B | 4 - geom_bottleneck/tests/data/test_408_A | 4 - geom_bottleneck/tests/data/test_408_B | 4 - geom_bottleneck/tests/data/test_409_A | 4 - geom_bottleneck/tests/data/test_409_B | 4 - geom_bottleneck/tests/data/test_410_A | 4 - geom_bottleneck/tests/data/test_410_B | 4 - geom_bottleneck/tests/data/test_411_A | 4 - geom_bottleneck/tests/data/test_411_B | 4 - geom_bottleneck/tests/data/test_412_A | 4 - geom_bottleneck/tests/data/test_412_B | 4 - geom_bottleneck/tests/data/test_413_A | 4 - geom_bottleneck/tests/data/test_413_B | 4 - geom_bottleneck/tests/data/test_414_A | 4 - geom_bottleneck/tests/data/test_414_B | 4 - geom_bottleneck/tests/data/test_415_A | 4 - geom_bottleneck/tests/data/test_415_B | 4 - geom_bottleneck/tests/data/test_416_A | 4 - geom_bottleneck/tests/data/test_416_B | 4 - geom_bottleneck/tests/data/test_417_A | 4 - geom_bottleneck/tests/data/test_417_B | 4 - geom_bottleneck/tests/data/test_418_A | 4 - geom_bottleneck/tests/data/test_418_B | 4 - geom_bottleneck/tests/data/test_419_A | 4 - geom_bottleneck/tests/data/test_419_B | 4 - geom_bottleneck/tests/data/test_420_A | 5 - geom_bottleneck/tests/data/test_420_B | 5 - geom_bottleneck/tests/data/test_421_A | 5 - geom_bottleneck/tests/data/test_421_B | 5 - geom_bottleneck/tests/data/test_422_A | 5 - geom_bottleneck/tests/data/test_422_B | 5 - geom_bottleneck/tests/data/test_423_A | 5 - geom_bottleneck/tests/data/test_423_B | 5 - geom_bottleneck/tests/data/test_424_A | 5 - geom_bottleneck/tests/data/test_424_B | 5 - geom_bottleneck/tests/data/test_425_A | 5 - geom_bottleneck/tests/data/test_425_B | 5 - geom_bottleneck/tests/data/test_426_A | 5 - geom_bottleneck/tests/data/test_426_B | 5 - geom_bottleneck/tests/data/test_427_A | 5 - geom_bottleneck/tests/data/test_427_B | 5 - geom_bottleneck/tests/data/test_428_A | 5 - geom_bottleneck/tests/data/test_428_B | 5 - geom_bottleneck/tests/data/test_429_A | 5 - geom_bottleneck/tests/data/test_429_B | 5 - geom_bottleneck/tests/data/test_430_A | 5 - geom_bottleneck/tests/data/test_430_B | 5 - geom_bottleneck/tests/data/test_431_A | 5 - geom_bottleneck/tests/data/test_431_B | 5 - geom_bottleneck/tests/data/test_432_A | 5 - geom_bottleneck/tests/data/test_432_B | 5 - geom_bottleneck/tests/data/test_433_A | 5 - geom_bottleneck/tests/data/test_433_B | 5 - geom_bottleneck/tests/data/test_434_A | 5 - geom_bottleneck/tests/data/test_434_B | 5 - geom_bottleneck/tests/data/test_435_A | 5 - geom_bottleneck/tests/data/test_435_B | 5 - geom_bottleneck/tests/data/test_436_A | 5 - geom_bottleneck/tests/data/test_436_B | 5 - geom_bottleneck/tests/data/test_437_A | 5 - geom_bottleneck/tests/data/test_437_B | 5 - geom_bottleneck/tests/data/test_438_A | 5 - geom_bottleneck/tests/data/test_438_B | 5 - geom_bottleneck/tests/data/test_439_A | 5 - geom_bottleneck/tests/data/test_439_B | 5 - geom_bottleneck/tests/data/test_440_A | 6 - geom_bottleneck/tests/data/test_440_B | 6 - geom_bottleneck/tests/data/test_441_A | 6 - geom_bottleneck/tests/data/test_441_B | 6 - geom_bottleneck/tests/data/test_442_A | 6 - geom_bottleneck/tests/data/test_442_B | 6 - geom_bottleneck/tests/data/test_443_A | 6 - geom_bottleneck/tests/data/test_443_B | 6 - geom_bottleneck/tests/data/test_444_A | 6 - geom_bottleneck/tests/data/test_444_B | 6 - geom_bottleneck/tests/data/test_445_A | 6 - geom_bottleneck/tests/data/test_445_B | 6 - geom_bottleneck/tests/data/test_446_A | 6 - geom_bottleneck/tests/data/test_446_B | 6 - geom_bottleneck/tests/data/test_447_A | 6 - geom_bottleneck/tests/data/test_447_B | 6 - geom_bottleneck/tests/data/test_448_A | 6 - geom_bottleneck/tests/data/test_448_B | 6 - geom_bottleneck/tests/data/test_449_A | 6 - geom_bottleneck/tests/data/test_449_B | 6 - geom_bottleneck/tests/data/test_450_A | 6 - geom_bottleneck/tests/data/test_450_B | 6 - geom_bottleneck/tests/data/test_451_A | 6 - geom_bottleneck/tests/data/test_451_B | 6 - geom_bottleneck/tests/data/test_452_A | 6 - geom_bottleneck/tests/data/test_452_B | 6 - geom_bottleneck/tests/data/test_453_A | 6 - geom_bottleneck/tests/data/test_453_B | 6 - geom_bottleneck/tests/data/test_454_A | 6 - geom_bottleneck/tests/data/test_454_B | 6 - geom_bottleneck/tests/data/test_455_A | 6 - geom_bottleneck/tests/data/test_455_B | 6 - geom_bottleneck/tests/data/test_456_A | 6 - geom_bottleneck/tests/data/test_456_B | 6 - geom_bottleneck/tests/data/test_457_A | 6 - geom_bottleneck/tests/data/test_457_B | 6 - geom_bottleneck/tests/data/test_458_A | 6 - geom_bottleneck/tests/data/test_458_B | 6 - geom_bottleneck/tests/data/test_459_A | 6 - geom_bottleneck/tests/data/test_459_B | 6 - geom_bottleneck/tests/data/test_460_A | 7 - geom_bottleneck/tests/data/test_460_B | 7 - geom_bottleneck/tests/data/test_461_A | 7 - geom_bottleneck/tests/data/test_461_B | 7 - geom_bottleneck/tests/data/test_462_A | 7 - geom_bottleneck/tests/data/test_462_B | 7 - geom_bottleneck/tests/data/test_463_A | 7 - geom_bottleneck/tests/data/test_463_B | 7 - geom_bottleneck/tests/data/test_464_A | 7 - geom_bottleneck/tests/data/test_464_B | 7 - geom_bottleneck/tests/data/test_465_A | 7 - geom_bottleneck/tests/data/test_465_B | 7 - geom_bottleneck/tests/data/test_466_A | 7 - geom_bottleneck/tests/data/test_466_B | 7 - geom_bottleneck/tests/data/test_467_A | 7 - geom_bottleneck/tests/data/test_467_B | 7 - geom_bottleneck/tests/data/test_468_A | 7 - geom_bottleneck/tests/data/test_468_B | 7 - geom_bottleneck/tests/data/test_469_A | 7 - geom_bottleneck/tests/data/test_469_B | 7 - geom_bottleneck/tests/data/test_470_A | 7 - geom_bottleneck/tests/data/test_470_B | 7 - geom_bottleneck/tests/data/test_471_A | 7 - geom_bottleneck/tests/data/test_471_B | 7 - geom_bottleneck/tests/data/test_472_A | 7 - geom_bottleneck/tests/data/test_472_B | 7 - geom_bottleneck/tests/data/test_473_A | 7 - geom_bottleneck/tests/data/test_473_B | 7 - geom_bottleneck/tests/data/test_474_A | 7 - geom_bottleneck/tests/data/test_474_B | 7 - geom_bottleneck/tests/data/test_475_A | 7 - geom_bottleneck/tests/data/test_475_B | 7 - geom_bottleneck/tests/data/test_476_A | 7 - geom_bottleneck/tests/data/test_476_B | 7 - geom_bottleneck/tests/data/test_477_A | 7 - geom_bottleneck/tests/data/test_477_B | 7 - geom_bottleneck/tests/data/test_478_A | 7 - geom_bottleneck/tests/data/test_478_B | 7 - geom_bottleneck/tests/data/test_479_A | 7 - geom_bottleneck/tests/data/test_479_B | 7 - geom_bottleneck/tests/data/test_480_A | 8 - geom_bottleneck/tests/data/test_480_B | 8 - geom_bottleneck/tests/data/test_481_A | 8 - geom_bottleneck/tests/data/test_481_B | 8 - geom_bottleneck/tests/data/test_482_A | 8 - geom_bottleneck/tests/data/test_482_B | 8 - geom_bottleneck/tests/data/test_483_A | 8 - geom_bottleneck/tests/data/test_483_B | 8 - geom_bottleneck/tests/data/test_484_A | 8 - geom_bottleneck/tests/data/test_484_B | 8 - geom_bottleneck/tests/data/test_485_A | 8 - geom_bottleneck/tests/data/test_485_B | 8 - geom_bottleneck/tests/data/test_486_A | 8 - geom_bottleneck/tests/data/test_486_B | 8 - geom_bottleneck/tests/data/test_487_A | 8 - geom_bottleneck/tests/data/test_487_B | 8 - geom_bottleneck/tests/data/test_488_A | 8 - geom_bottleneck/tests/data/test_488_B | 8 - geom_bottleneck/tests/data/test_489_A | 8 - geom_bottleneck/tests/data/test_489_B | 8 - geom_bottleneck/tests/data/test_490_A | 8 - geom_bottleneck/tests/data/test_490_B | 8 - geom_bottleneck/tests/data/test_491_A | 8 - geom_bottleneck/tests/data/test_491_B | 8 - geom_bottleneck/tests/data/test_492_A | 8 - geom_bottleneck/tests/data/test_492_B | 8 - geom_bottleneck/tests/data/test_493_A | 8 - geom_bottleneck/tests/data/test_493_B | 8 - geom_bottleneck/tests/data/test_494_A | 8 - geom_bottleneck/tests/data/test_494_B | 8 - geom_bottleneck/tests/data/test_495_A | 8 - geom_bottleneck/tests/data/test_495_B | 8 - geom_bottleneck/tests/data/test_496_A | 8 - geom_bottleneck/tests/data/test_496_B | 8 - geom_bottleneck/tests/data/test_497_A | 8 - geom_bottleneck/tests/data/test_497_B | 8 - geom_bottleneck/tests/data/test_498_A | 8 - geom_bottleneck/tests/data/test_498_B | 8 - geom_bottleneck/tests/data/test_499_A | 8 - geom_bottleneck/tests/data/test_499_B | 8 - geom_bottleneck/tests/data/test_500_A | 9 - geom_bottleneck/tests/data/test_500_B | 9 - geom_bottleneck/tests/data/test_501_A | 9 - geom_bottleneck/tests/data/test_501_B | 9 - geom_bottleneck/tests/data/test_502_A | 9 - geom_bottleneck/tests/data/test_502_B | 9 - geom_bottleneck/tests/data/test_503_A | 9 - geom_bottleneck/tests/data/test_503_B | 9 - geom_bottleneck/tests/data/test_504_A | 9 - geom_bottleneck/tests/data/test_504_B | 9 - geom_bottleneck/tests/data/test_505_A | 9 - geom_bottleneck/tests/data/test_505_B | 9 - geom_bottleneck/tests/data/test_506_A | 9 - geom_bottleneck/tests/data/test_506_B | 9 - geom_bottleneck/tests/data/test_507_A | 9 - geom_bottleneck/tests/data/test_507_B | 9 - geom_bottleneck/tests/data/test_508_A | 9 - geom_bottleneck/tests/data/test_508_B | 9 - geom_bottleneck/tests/data/test_509_A | 9 - geom_bottleneck/tests/data/test_509_B | 9 - geom_bottleneck/tests/data/test_510_A | 9 - geom_bottleneck/tests/data/test_510_B | 9 - geom_bottleneck/tests/data/test_511_A | 9 - geom_bottleneck/tests/data/test_511_B | 9 - geom_bottleneck/tests/data/test_512_A | 9 - geom_bottleneck/tests/data/test_512_B | 9 - geom_bottleneck/tests/data/test_513_A | 9 - geom_bottleneck/tests/data/test_513_B | 9 - geom_bottleneck/tests/data/test_514_A | 9 - geom_bottleneck/tests/data/test_514_B | 9 - geom_bottleneck/tests/data/test_515_A | 9 - geom_bottleneck/tests/data/test_515_B | 9 - geom_bottleneck/tests/data/test_516_A | 9 - geom_bottleneck/tests/data/test_516_B | 9 - geom_bottleneck/tests/data/test_517_A | 9 - geom_bottleneck/tests/data/test_517_B | 9 - geom_bottleneck/tests/data/test_518_A | 9 - geom_bottleneck/tests/data/test_518_B | 9 - geom_bottleneck/tests/data/test_519_A | 9 - geom_bottleneck/tests/data/test_519_B | 9 - geom_bottleneck/tests/data/test_520_A | 10 - geom_bottleneck/tests/data/test_520_B | 10 - geom_bottleneck/tests/data/test_521_A | 10 - geom_bottleneck/tests/data/test_521_B | 10 - geom_bottleneck/tests/data/test_522_A | 10 - geom_bottleneck/tests/data/test_522_B | 10 - geom_bottleneck/tests/data/test_523_A | 10 - geom_bottleneck/tests/data/test_523_B | 10 - geom_bottleneck/tests/data/test_524_A | 10 - geom_bottleneck/tests/data/test_524_B | 10 - geom_bottleneck/tests/data/test_525_A | 10 - geom_bottleneck/tests/data/test_525_B | 10 - geom_bottleneck/tests/data/test_526_A | 10 - geom_bottleneck/tests/data/test_526_B | 10 - geom_bottleneck/tests/data/test_527_A | 10 - geom_bottleneck/tests/data/test_527_B | 10 - geom_bottleneck/tests/data/test_528_A | 10 - geom_bottleneck/tests/data/test_528_B | 10 - geom_bottleneck/tests/data/test_529_A | 10 - geom_bottleneck/tests/data/test_529_B | 10 - geom_bottleneck/tests/data/test_530_A | 10 - geom_bottleneck/tests/data/test_530_B | 10 - geom_bottleneck/tests/data/test_531_A | 10 - geom_bottleneck/tests/data/test_531_B | 10 - geom_bottleneck/tests/data/test_532_A | 10 - geom_bottleneck/tests/data/test_532_B | 10 - geom_bottleneck/tests/data/test_533_A | 10 - geom_bottleneck/tests/data/test_533_B | 10 - geom_bottleneck/tests/data/test_534_A | 10 - geom_bottleneck/tests/data/test_534_B | 10 - geom_bottleneck/tests/data/test_535_A | 10 - geom_bottleneck/tests/data/test_535_B | 10 - geom_bottleneck/tests/data/test_536_A | 10 - geom_bottleneck/tests/data/test_536_B | 10 - geom_bottleneck/tests/data/test_537_A | 10 - geom_bottleneck/tests/data/test_537_B | 10 - geom_bottleneck/tests/data/test_538_A | 10 - geom_bottleneck/tests/data/test_538_B | 10 - geom_bottleneck/tests/data/test_539_A | 10 - geom_bottleneck/tests/data/test_539_B | 10 - geom_bottleneck/tests/data/test_540_A | 20 - geom_bottleneck/tests/data/test_540_B | 20 - geom_bottleneck/tests/data/test_541_A | 20 - geom_bottleneck/tests/data/test_541_B | 20 - geom_bottleneck/tests/data/test_542_A | 20 - geom_bottleneck/tests/data/test_542_B | 20 - geom_bottleneck/tests/data/test_543_A | 20 - geom_bottleneck/tests/data/test_543_B | 20 - geom_bottleneck/tests/data/test_544_A | 20 - geom_bottleneck/tests/data/test_544_B | 20 - geom_bottleneck/tests/data/test_545_A | 20 - geom_bottleneck/tests/data/test_545_B | 20 - geom_bottleneck/tests/data/test_546_A | 20 - geom_bottleneck/tests/data/test_546_B | 20 - geom_bottleneck/tests/data/test_547_A | 20 - geom_bottleneck/tests/data/test_547_B | 20 - geom_bottleneck/tests/data/test_548_A | 20 - geom_bottleneck/tests/data/test_548_B | 20 - geom_bottleneck/tests/data/test_549_A | 20 - geom_bottleneck/tests/data/test_549_B | 20 - geom_bottleneck/tests/data/test_550_A | 20 - geom_bottleneck/tests/data/test_550_B | 20 - geom_bottleneck/tests/data/test_551_A | 20 - geom_bottleneck/tests/data/test_551_B | 20 - geom_bottleneck/tests/data/test_552_A | 20 - geom_bottleneck/tests/data/test_552_B | 20 - geom_bottleneck/tests/data/test_553_A | 20 - geom_bottleneck/tests/data/test_553_B | 20 - geom_bottleneck/tests/data/test_554_A | 20 - geom_bottleneck/tests/data/test_554_B | 20 - geom_bottleneck/tests/data/test_555_A | 20 - geom_bottleneck/tests/data/test_555_B | 20 - geom_bottleneck/tests/data/test_556_A | 20 - geom_bottleneck/tests/data/test_556_B | 20 - geom_bottleneck/tests/data/test_557_A | 20 - geom_bottleneck/tests/data/test_557_B | 20 - geom_bottleneck/tests/data/test_558_A | 20 - geom_bottleneck/tests/data/test_558_B | 20 - geom_bottleneck/tests/data/test_559_A | 20 - geom_bottleneck/tests/data/test_559_B | 20 - geom_bottleneck/tests/data/test_560_A | 30 - geom_bottleneck/tests/data/test_560_B | 30 - geom_bottleneck/tests/data/test_561_A | 30 - geom_bottleneck/tests/data/test_561_B | 30 - geom_bottleneck/tests/data/test_562_A | 30 - geom_bottleneck/tests/data/test_562_B | 30 - geom_bottleneck/tests/data/test_563_A | 30 - geom_bottleneck/tests/data/test_563_B | 30 - geom_bottleneck/tests/data/test_564_A | 30 - geom_bottleneck/tests/data/test_564_B | 30 - geom_bottleneck/tests/data/test_565_A | 30 - geom_bottleneck/tests/data/test_565_B | 30 - geom_bottleneck/tests/data/test_566_A | 30 - geom_bottleneck/tests/data/test_566_B | 30 - geom_bottleneck/tests/data/test_567_A | 30 - geom_bottleneck/tests/data/test_567_B | 30 - geom_bottleneck/tests/data/test_568_A | 30 - geom_bottleneck/tests/data/test_568_B | 30 - geom_bottleneck/tests/data/test_569_A | 30 - geom_bottleneck/tests/data/test_569_B | 30 - geom_bottleneck/tests/data/test_570_A | 30 - geom_bottleneck/tests/data/test_570_B | 30 - geom_bottleneck/tests/data/test_571_A | 30 - geom_bottleneck/tests/data/test_571_B | 30 - geom_bottleneck/tests/data/test_572_A | 30 - geom_bottleneck/tests/data/test_572_B | 30 - geom_bottleneck/tests/data/test_573_A | 30 - geom_bottleneck/tests/data/test_573_B | 30 - geom_bottleneck/tests/data/test_574_A | 30 - geom_bottleneck/tests/data/test_574_B | 30 - geom_bottleneck/tests/data/test_575_A | 30 - geom_bottleneck/tests/data/test_575_B | 30 - geom_bottleneck/tests/data/test_576_A | 30 - geom_bottleneck/tests/data/test_576_B | 30 - geom_bottleneck/tests/data/test_577_A | 30 - geom_bottleneck/tests/data/test_577_B | 30 - geom_bottleneck/tests/data/test_578_A | 30 - geom_bottleneck/tests/data/test_578_B | 30 - geom_bottleneck/tests/data/test_579_A | 30 - geom_bottleneck/tests/data/test_579_B | 30 - geom_bottleneck/tests/data/test_580_A | 50 - geom_bottleneck/tests/data/test_580_B | 50 - geom_bottleneck/tests/data/test_581_A | 50 - geom_bottleneck/tests/data/test_581_B | 50 - geom_bottleneck/tests/data/test_582_A | 50 - geom_bottleneck/tests/data/test_582_B | 50 - geom_bottleneck/tests/data/test_583_A | 50 - geom_bottleneck/tests/data/test_583_B | 50 - geom_bottleneck/tests/data/test_584_A | 50 - geom_bottleneck/tests/data/test_584_B | 50 - geom_bottleneck/tests/data/test_585_A | 50 - geom_bottleneck/tests/data/test_585_B | 50 - geom_bottleneck/tests/data/test_586_A | 50 - geom_bottleneck/tests/data/test_586_B | 50 - geom_bottleneck/tests/data/test_587_A | 50 - geom_bottleneck/tests/data/test_587_B | 50 - geom_bottleneck/tests/data/test_588_A | 50 - geom_bottleneck/tests/data/test_588_B | 50 - geom_bottleneck/tests/data/test_589_A | 50 - geom_bottleneck/tests/data/test_589_B | 50 - geom_bottleneck/tests/data/test_590_A | 50 - geom_bottleneck/tests/data/test_590_B | 50 - geom_bottleneck/tests/data/test_591_A | 50 - geom_bottleneck/tests/data/test_591_B | 50 - geom_bottleneck/tests/data/test_592_A | 50 - geom_bottleneck/tests/data/test_592_B | 50 - geom_bottleneck/tests/data/test_593_A | 50 - geom_bottleneck/tests/data/test_593_B | 50 - geom_bottleneck/tests/data/test_594_A | 50 - geom_bottleneck/tests/data/test_594_B | 50 - geom_bottleneck/tests/data/test_595_A | 50 - geom_bottleneck/tests/data/test_595_B | 50 - geom_bottleneck/tests/data/test_596_A | 50 - geom_bottleneck/tests/data/test_596_B | 50 - geom_bottleneck/tests/data/test_597_A | 50 - geom_bottleneck/tests/data/test_597_B | 50 - geom_bottleneck/tests/data/test_598_A | 50 - geom_bottleneck/tests/data/test_598_B | 50 - geom_bottleneck/tests/data/test_599_A | 50 - geom_bottleneck/tests/data/test_599_B | 50 - geom_bottleneck/tests/data/test_600_A | 100 - geom_bottleneck/tests/data/test_600_B | 100 - geom_bottleneck/tests/data/test_601_A | 100 - geom_bottleneck/tests/data/test_601_B | 100 - geom_bottleneck/tests/data/test_602_A | 100 - geom_bottleneck/tests/data/test_602_B | 100 - geom_bottleneck/tests/data/test_603_A | 100 - geom_bottleneck/tests/data/test_603_B | 100 - geom_bottleneck/tests/data/test_604_A | 100 - geom_bottleneck/tests/data/test_604_B | 100 - geom_bottleneck/tests/data/test_605_A | 100 - geom_bottleneck/tests/data/test_605_B | 100 - geom_bottleneck/tests/data/test_606_A | 100 - geom_bottleneck/tests/data/test_606_B | 100 - geom_bottleneck/tests/data/test_607_A | 100 - geom_bottleneck/tests/data/test_607_B | 100 - geom_bottleneck/tests/data/test_608_A | 100 - geom_bottleneck/tests/data/test_608_B | 100 - geom_bottleneck/tests/data/test_609_A | 100 - geom_bottleneck/tests/data/test_609_B | 100 - geom_bottleneck/tests/data/test_610_A | 100 - geom_bottleneck/tests/data/test_610_B | 100 - geom_bottleneck/tests/data/test_611_A | 100 - geom_bottleneck/tests/data/test_611_B | 100 - geom_bottleneck/tests/data/test_612_A | 100 - geom_bottleneck/tests/data/test_612_B | 100 - geom_bottleneck/tests/data/test_613_A | 100 - geom_bottleneck/tests/data/test_613_B | 100 - geom_bottleneck/tests/data/test_614_A | 100 - geom_bottleneck/tests/data/test_614_B | 100 - geom_bottleneck/tests/data/test_615_A | 100 - geom_bottleneck/tests/data/test_615_B | 100 - geom_bottleneck/tests/data/test_616_A | 100 - geom_bottleneck/tests/data/test_616_B | 100 - geom_bottleneck/tests/data/test_617_A | 100 - geom_bottleneck/tests/data/test_617_B | 100 - geom_bottleneck/tests/data/test_618_A | 100 - geom_bottleneck/tests/data/test_618_B | 100 - geom_bottleneck/tests/data/test_619_A | 100 - geom_bottleneck/tests/data/test_619_B | 100 - geom_bottleneck/tests/data/test_620_A | 2 - geom_bottleneck/tests/data/test_620_B | 2 - geom_bottleneck/tests/data/test_621_A | 2 - geom_bottleneck/tests/data/test_621_B | 2 - geom_bottleneck/tests/data/test_622_A | 2 - geom_bottleneck/tests/data/test_622_B | 2 - geom_bottleneck/tests/data/test_623_A | 2 - geom_bottleneck/tests/data/test_623_B | 2 - geom_bottleneck/tests/data/test_624_A | 2 - geom_bottleneck/tests/data/test_624_B | 2 - geom_bottleneck/tests/data/test_625_A | 2 - geom_bottleneck/tests/data/test_625_B | 2 - geom_bottleneck/tests/data/test_626_A | 2 - geom_bottleneck/tests/data/test_626_B | 2 - geom_bottleneck/tests/data/test_627_A | 2 - geom_bottleneck/tests/data/test_627_B | 2 - geom_bottleneck/tests/data/test_628_A | 2 - geom_bottleneck/tests/data/test_628_B | 2 - geom_bottleneck/tests/data/test_629_A | 2 - geom_bottleneck/tests/data/test_629_B | 2 - geom_bottleneck/tests/data/test_630_A | 2 - geom_bottleneck/tests/data/test_630_B | 2 - geom_bottleneck/tests/data/test_631_A | 2 - geom_bottleneck/tests/data/test_631_B | 2 - geom_bottleneck/tests/data/test_632_A | 2 - geom_bottleneck/tests/data/test_632_B | 2 - geom_bottleneck/tests/data/test_633_A | 2 - geom_bottleneck/tests/data/test_633_B | 2 - geom_bottleneck/tests/data/test_634_A | 2 - geom_bottleneck/tests/data/test_634_B | 2 - geom_bottleneck/tests/data/test_635_A | 2 - geom_bottleneck/tests/data/test_635_B | 2 - geom_bottleneck/tests/data/test_636_A | 2 - geom_bottleneck/tests/data/test_636_B | 2 - geom_bottleneck/tests/data/test_637_A | 2 - geom_bottleneck/tests/data/test_637_B | 2 - geom_bottleneck/tests/data/test_638_A | 2 - geom_bottleneck/tests/data/test_638_B | 2 - geom_bottleneck/tests/data/test_639_A | 2 - geom_bottleneck/tests/data/test_639_B | 2 - geom_bottleneck/tests/data/test_640_A | 3 - geom_bottleneck/tests/data/test_640_B | 3 - geom_bottleneck/tests/data/test_641_A | 3 - geom_bottleneck/tests/data/test_641_B | 3 - geom_bottleneck/tests/data/test_642_A | 3 - geom_bottleneck/tests/data/test_642_B | 3 - geom_bottleneck/tests/data/test_643_A | 3 - geom_bottleneck/tests/data/test_643_B | 3 - geom_bottleneck/tests/data/test_644_A | 3 - geom_bottleneck/tests/data/test_644_B | 3 - geom_bottleneck/tests/data/test_645_A | 3 - geom_bottleneck/tests/data/test_645_B | 3 - geom_bottleneck/tests/data/test_646_A | 3 - geom_bottleneck/tests/data/test_646_B | 3 - geom_bottleneck/tests/data/test_647_A | 3 - geom_bottleneck/tests/data/test_647_B | 3 - geom_bottleneck/tests/data/test_648_A | 3 - geom_bottleneck/tests/data/test_648_B | 3 - geom_bottleneck/tests/data/test_649_A | 3 - geom_bottleneck/tests/data/test_649_B | 3 - geom_bottleneck/tests/data/test_650_A | 3 - geom_bottleneck/tests/data/test_650_B | 3 - geom_bottleneck/tests/data/test_651_A | 3 - geom_bottleneck/tests/data/test_651_B | 3 - geom_bottleneck/tests/data/test_652_A | 3 - geom_bottleneck/tests/data/test_652_B | 3 - geom_bottleneck/tests/data/test_653_A | 3 - geom_bottleneck/tests/data/test_653_B | 3 - geom_bottleneck/tests/data/test_654_A | 3 - geom_bottleneck/tests/data/test_654_B | 3 - geom_bottleneck/tests/data/test_655_A | 3 - geom_bottleneck/tests/data/test_655_B | 3 - geom_bottleneck/tests/data/test_656_A | 3 - geom_bottleneck/tests/data/test_656_B | 3 - geom_bottleneck/tests/data/test_657_A | 3 - geom_bottleneck/tests/data/test_657_B | 3 - geom_bottleneck/tests/data/test_658_A | 3 - geom_bottleneck/tests/data/test_658_B | 3 - geom_bottleneck/tests/data/test_659_A | 3 - geom_bottleneck/tests/data/test_659_B | 3 - geom_bottleneck/tests/data/test_660_A | 4 - geom_bottleneck/tests/data/test_660_B | 4 - geom_bottleneck/tests/data/test_661_A | 4 - geom_bottleneck/tests/data/test_661_B | 4 - geom_bottleneck/tests/data/test_662_A | 4 - geom_bottleneck/tests/data/test_662_B | 4 - geom_bottleneck/tests/data/test_663_A | 4 - geom_bottleneck/tests/data/test_663_B | 4 - geom_bottleneck/tests/data/test_664_A | 4 - geom_bottleneck/tests/data/test_664_B | 4 - geom_bottleneck/tests/data/test_665_A | 4 - geom_bottleneck/tests/data/test_665_B | 4 - geom_bottleneck/tests/data/test_666_A | 4 - geom_bottleneck/tests/data/test_666_B | 4 - geom_bottleneck/tests/data/test_667_A | 4 - geom_bottleneck/tests/data/test_667_B | 4 - geom_bottleneck/tests/data/test_668_A | 4 - geom_bottleneck/tests/data/test_668_B | 4 - geom_bottleneck/tests/data/test_669_A | 4 - geom_bottleneck/tests/data/test_669_B | 4 - geom_bottleneck/tests/data/test_670_A | 4 - geom_bottleneck/tests/data/test_670_B | 4 - geom_bottleneck/tests/data/test_671_A | 4 - geom_bottleneck/tests/data/test_671_B | 4 - geom_bottleneck/tests/data/test_672_A | 4 - geom_bottleneck/tests/data/test_672_B | 4 - geom_bottleneck/tests/data/test_673_A | 4 - geom_bottleneck/tests/data/test_673_B | 4 - geom_bottleneck/tests/data/test_674_A | 4 - geom_bottleneck/tests/data/test_674_B | 4 - geom_bottleneck/tests/data/test_675_A | 4 - geom_bottleneck/tests/data/test_675_B | 4 - geom_bottleneck/tests/data/test_676_A | 4 - geom_bottleneck/tests/data/test_676_B | 4 - geom_bottleneck/tests/data/test_677_A | 4 - geom_bottleneck/tests/data/test_677_B | 4 - geom_bottleneck/tests/data/test_678_A | 4 - geom_bottleneck/tests/data/test_678_B | 4 - geom_bottleneck/tests/data/test_679_A | 4 - geom_bottleneck/tests/data/test_679_B | 4 - geom_bottleneck/tests/data/test_680_A | 5 - geom_bottleneck/tests/data/test_680_B | 5 - geom_bottleneck/tests/data/test_681_A | 5 - geom_bottleneck/tests/data/test_681_B | 5 - geom_bottleneck/tests/data/test_682_A | 5 - geom_bottleneck/tests/data/test_682_B | 5 - geom_bottleneck/tests/data/test_683_A | 5 - geom_bottleneck/tests/data/test_683_B | 5 - geom_bottleneck/tests/data/test_684_A | 5 - geom_bottleneck/tests/data/test_684_B | 5 - geom_bottleneck/tests/data/test_685_A | 5 - geom_bottleneck/tests/data/test_685_B | 5 - geom_bottleneck/tests/data/test_686_A | 5 - geom_bottleneck/tests/data/test_686_B | 5 - geom_bottleneck/tests/data/test_687_A | 5 - geom_bottleneck/tests/data/test_687_B | 5 - geom_bottleneck/tests/data/test_688_A | 5 - geom_bottleneck/tests/data/test_688_B | 5 - geom_bottleneck/tests/data/test_689_A | 5 - geom_bottleneck/tests/data/test_689_B | 5 - geom_bottleneck/tests/data/test_690_A | 5 - geom_bottleneck/tests/data/test_690_B | 5 - geom_bottleneck/tests/data/test_691_A | 5 - geom_bottleneck/tests/data/test_691_B | 5 - geom_bottleneck/tests/data/test_692_A | 5 - geom_bottleneck/tests/data/test_692_B | 5 - geom_bottleneck/tests/data/test_693_A | 5 - geom_bottleneck/tests/data/test_693_B | 5 - geom_bottleneck/tests/data/test_694_A | 5 - geom_bottleneck/tests/data/test_694_B | 5 - geom_bottleneck/tests/data/test_695_A | 5 - geom_bottleneck/tests/data/test_695_B | 5 - geom_bottleneck/tests/data/test_696_A | 5 - geom_bottleneck/tests/data/test_696_B | 5 - geom_bottleneck/tests/data/test_697_A | 5 - geom_bottleneck/tests/data/test_697_B | 5 - geom_bottleneck/tests/data/test_698_A | 5 - geom_bottleneck/tests/data/test_698_B | 5 - geom_bottleneck/tests/data/test_699_A | 5 - geom_bottleneck/tests/data/test_699_B | 5 - geom_bottleneck/tests/data/test_700_A | 6 - geom_bottleneck/tests/data/test_700_B | 6 - geom_bottleneck/tests/data/test_701_A | 6 - geom_bottleneck/tests/data/test_701_B | 6 - geom_bottleneck/tests/data/test_702_A | 6 - geom_bottleneck/tests/data/test_702_B | 6 - geom_bottleneck/tests/data/test_703_A | 6 - geom_bottleneck/tests/data/test_703_B | 6 - geom_bottleneck/tests/data/test_704_A | 6 - geom_bottleneck/tests/data/test_704_B | 6 - geom_bottleneck/tests/data/test_705_A | 6 - geom_bottleneck/tests/data/test_705_B | 6 - geom_bottleneck/tests/data/test_706_A | 6 - geom_bottleneck/tests/data/test_706_B | 6 - geom_bottleneck/tests/data/test_707_A | 6 - geom_bottleneck/tests/data/test_707_B | 6 - geom_bottleneck/tests/data/test_708_A | 6 - geom_bottleneck/tests/data/test_708_B | 6 - geom_bottleneck/tests/data/test_709_A | 6 - geom_bottleneck/tests/data/test_709_B | 6 - geom_bottleneck/tests/data/test_710_A | 6 - geom_bottleneck/tests/data/test_710_B | 6 - geom_bottleneck/tests/data/test_711_A | 6 - geom_bottleneck/tests/data/test_711_B | 6 - geom_bottleneck/tests/data/test_712_A | 6 - geom_bottleneck/tests/data/test_712_B | 6 - geom_bottleneck/tests/data/test_713_A | 6 - geom_bottleneck/tests/data/test_713_B | 6 - geom_bottleneck/tests/data/test_714_A | 6 - geom_bottleneck/tests/data/test_714_B | 6 - geom_bottleneck/tests/data/test_715_A | 6 - geom_bottleneck/tests/data/test_715_B | 6 - geom_bottleneck/tests/data/test_716_A | 6 - geom_bottleneck/tests/data/test_716_B | 6 - geom_bottleneck/tests/data/test_717_A | 6 - geom_bottleneck/tests/data/test_717_B | 6 - geom_bottleneck/tests/data/test_718_A | 6 - geom_bottleneck/tests/data/test_718_B | 6 - geom_bottleneck/tests/data/test_719_A | 6 - geom_bottleneck/tests/data/test_719_B | 6 - geom_bottleneck/tests/data/test_720_A | 7 - geom_bottleneck/tests/data/test_720_B | 7 - geom_bottleneck/tests/data/test_721_A | 7 - geom_bottleneck/tests/data/test_721_B | 7 - geom_bottleneck/tests/data/test_722_A | 7 - geom_bottleneck/tests/data/test_722_B | 7 - geom_bottleneck/tests/data/test_723_A | 7 - geom_bottleneck/tests/data/test_723_B | 7 - geom_bottleneck/tests/data/test_724_A | 7 - geom_bottleneck/tests/data/test_724_B | 7 - geom_bottleneck/tests/data/test_725_A | 7 - geom_bottleneck/tests/data/test_725_B | 7 - geom_bottleneck/tests/data/test_726_A | 7 - geom_bottleneck/tests/data/test_726_B | 7 - geom_bottleneck/tests/data/test_727_A | 7 - geom_bottleneck/tests/data/test_727_B | 7 - geom_bottleneck/tests/data/test_728_A | 7 - geom_bottleneck/tests/data/test_728_B | 7 - geom_bottleneck/tests/data/test_729_A | 7 - geom_bottleneck/tests/data/test_729_B | 7 - geom_bottleneck/tests/data/test_730_A | 7 - geom_bottleneck/tests/data/test_730_B | 7 - geom_bottleneck/tests/data/test_731_A | 7 - geom_bottleneck/tests/data/test_731_B | 7 - geom_bottleneck/tests/data/test_732_A | 7 - geom_bottleneck/tests/data/test_732_B | 7 - geom_bottleneck/tests/data/test_733_A | 7 - geom_bottleneck/tests/data/test_733_B | 7 - geom_bottleneck/tests/data/test_734_A | 7 - geom_bottleneck/tests/data/test_734_B | 7 - geom_bottleneck/tests/data/test_735_A | 7 - geom_bottleneck/tests/data/test_735_B | 7 - geom_bottleneck/tests/data/test_736_A | 7 - geom_bottleneck/tests/data/test_736_B | 7 - geom_bottleneck/tests/data/test_737_A | 7 - geom_bottleneck/tests/data/test_737_B | 7 - geom_bottleneck/tests/data/test_738_A | 7 - geom_bottleneck/tests/data/test_738_B | 7 - geom_bottleneck/tests/data/test_739_A | 7 - geom_bottleneck/tests/data/test_739_B | 7 - geom_bottleneck/tests/data/test_740_A | 8 - geom_bottleneck/tests/data/test_740_B | 8 - geom_bottleneck/tests/data/test_741_A | 8 - geom_bottleneck/tests/data/test_741_B | 8 - geom_bottleneck/tests/data/test_742_A | 8 - geom_bottleneck/tests/data/test_742_B | 8 - geom_bottleneck/tests/data/test_743_A | 8 - geom_bottleneck/tests/data/test_743_B | 8 - geom_bottleneck/tests/data/test_744_A | 8 - geom_bottleneck/tests/data/test_744_B | 8 - geom_bottleneck/tests/data/test_745_A | 8 - geom_bottleneck/tests/data/test_745_B | 8 - geom_bottleneck/tests/data/test_746_A | 8 - geom_bottleneck/tests/data/test_746_B | 8 - geom_bottleneck/tests/data/test_747_A | 8 - geom_bottleneck/tests/data/test_747_B | 8 - geom_bottleneck/tests/data/test_748_A | 8 - geom_bottleneck/tests/data/test_748_B | 8 - geom_bottleneck/tests/data/test_749_A | 8 - geom_bottleneck/tests/data/test_749_B | 8 - geom_bottleneck/tests/data/test_750_A | 8 - geom_bottleneck/tests/data/test_750_B | 8 - geom_bottleneck/tests/data/test_751_A | 8 - geom_bottleneck/tests/data/test_751_B | 8 - geom_bottleneck/tests/data/test_752_A | 8 - geom_bottleneck/tests/data/test_752_B | 8 - geom_bottleneck/tests/data/test_753_A | 8 - geom_bottleneck/tests/data/test_753_B | 8 - geom_bottleneck/tests/data/test_754_A | 8 - geom_bottleneck/tests/data/test_754_B | 8 - geom_bottleneck/tests/data/test_755_A | 8 - geom_bottleneck/tests/data/test_755_B | 8 - geom_bottleneck/tests/data/test_756_A | 8 - geom_bottleneck/tests/data/test_756_B | 8 - geom_bottleneck/tests/data/test_757_A | 8 - geom_bottleneck/tests/data/test_757_B | 8 - geom_bottleneck/tests/data/test_758_A | 8 - geom_bottleneck/tests/data/test_758_B | 8 - geom_bottleneck/tests/data/test_759_A | 8 - geom_bottleneck/tests/data/test_759_B | 8 - geom_bottleneck/tests/data/test_760_A | 9 - geom_bottleneck/tests/data/test_760_B | 9 - geom_bottleneck/tests/data/test_761_A | 9 - geom_bottleneck/tests/data/test_761_B | 9 - geom_bottleneck/tests/data/test_762_A | 9 - geom_bottleneck/tests/data/test_762_B | 9 - geom_bottleneck/tests/data/test_763_A | 9 - geom_bottleneck/tests/data/test_763_B | 9 - geom_bottleneck/tests/data/test_764_A | 9 - geom_bottleneck/tests/data/test_764_B | 9 - geom_bottleneck/tests/data/test_765_A | 9 - geom_bottleneck/tests/data/test_765_B | 9 - geom_bottleneck/tests/data/test_766_A | 9 - geom_bottleneck/tests/data/test_766_B | 9 - geom_bottleneck/tests/data/test_767_A | 9 - geom_bottleneck/tests/data/test_767_B | 9 - geom_bottleneck/tests/data/test_768_A | 9 - geom_bottleneck/tests/data/test_768_B | 9 - geom_bottleneck/tests/data/test_769_A | 9 - geom_bottleneck/tests/data/test_769_B | 9 - geom_bottleneck/tests/data/test_770_A | 9 - geom_bottleneck/tests/data/test_770_B | 9 - geom_bottleneck/tests/data/test_771_A | 9 - geom_bottleneck/tests/data/test_771_B | 9 - geom_bottleneck/tests/data/test_772_A | 9 - geom_bottleneck/tests/data/test_772_B | 9 - geom_bottleneck/tests/data/test_773_A | 9 - geom_bottleneck/tests/data/test_773_B | 9 - geom_bottleneck/tests/data/test_774_A | 9 - geom_bottleneck/tests/data/test_774_B | 9 - geom_bottleneck/tests/data/test_775_A | 9 - geom_bottleneck/tests/data/test_775_B | 9 - geom_bottleneck/tests/data/test_776_A | 9 - geom_bottleneck/tests/data/test_776_B | 9 - geom_bottleneck/tests/data/test_777_A | 9 - geom_bottleneck/tests/data/test_777_B | 9 - geom_bottleneck/tests/data/test_778_A | 9 - geom_bottleneck/tests/data/test_778_B | 9 - geom_bottleneck/tests/data/test_779_A | 9 - geom_bottleneck/tests/data/test_779_B | 9 - geom_bottleneck/tests/data/test_780_A | 10 - geom_bottleneck/tests/data/test_780_B | 10 - geom_bottleneck/tests/data/test_781_A | 10 - geom_bottleneck/tests/data/test_781_B | 10 - geom_bottleneck/tests/data/test_782_A | 10 - geom_bottleneck/tests/data/test_782_B | 10 - geom_bottleneck/tests/data/test_783_A | 10 - geom_bottleneck/tests/data/test_783_B | 10 - geom_bottleneck/tests/data/test_784_A | 10 - geom_bottleneck/tests/data/test_784_B | 10 - geom_bottleneck/tests/data/test_785_A | 10 - geom_bottleneck/tests/data/test_785_B | 10 - geom_bottleneck/tests/data/test_786_A | 10 - geom_bottleneck/tests/data/test_786_B | 10 - geom_bottleneck/tests/data/test_787_A | 10 - geom_bottleneck/tests/data/test_787_B | 10 - geom_bottleneck/tests/data/test_788_A | 10 - geom_bottleneck/tests/data/test_788_B | 10 - geom_bottleneck/tests/data/test_789_A | 10 - geom_bottleneck/tests/data/test_789_B | 10 - geom_bottleneck/tests/data/test_790_A | 10 - geom_bottleneck/tests/data/test_790_B | 10 - geom_bottleneck/tests/data/test_791_A | 10 - geom_bottleneck/tests/data/test_791_B | 10 - geom_bottleneck/tests/data/test_792_A | 10 - geom_bottleneck/tests/data/test_792_B | 10 - geom_bottleneck/tests/data/test_793_A | 10 - geom_bottleneck/tests/data/test_793_B | 10 - geom_bottleneck/tests/data/test_794_A | 10 - geom_bottleneck/tests/data/test_794_B | 10 - geom_bottleneck/tests/data/test_795_A | 10 - geom_bottleneck/tests/data/test_795_B | 10 - geom_bottleneck/tests/data/test_796_A | 10 - geom_bottleneck/tests/data/test_796_B | 10 - geom_bottleneck/tests/data/test_797_A | 10 - geom_bottleneck/tests/data/test_797_B | 10 - geom_bottleneck/tests/data/test_798_A | 10 - geom_bottleneck/tests/data/test_798_B | 10 - geom_bottleneck/tests/data/test_799_A | 10 - geom_bottleneck/tests/data/test_799_B | 10 - geom_bottleneck/tests/data/test_800_A | 20 - geom_bottleneck/tests/data/test_800_B | 20 - geom_bottleneck/tests/data/test_801_A | 20 - geom_bottleneck/tests/data/test_801_B | 20 - geom_bottleneck/tests/data/test_802_A | 20 - geom_bottleneck/tests/data/test_802_B | 20 - geom_bottleneck/tests/data/test_803_A | 20 - geom_bottleneck/tests/data/test_803_B | 20 - geom_bottleneck/tests/data/test_804_A | 20 - geom_bottleneck/tests/data/test_804_B | 20 - geom_bottleneck/tests/data/test_805_A | 20 - geom_bottleneck/tests/data/test_805_B | 20 - geom_bottleneck/tests/data/test_806_A | 20 - geom_bottleneck/tests/data/test_806_B | 20 - geom_bottleneck/tests/data/test_807_A | 20 - geom_bottleneck/tests/data/test_807_B | 20 - geom_bottleneck/tests/data/test_808_A | 20 - geom_bottleneck/tests/data/test_808_B | 20 - geom_bottleneck/tests/data/test_809_A | 20 - geom_bottleneck/tests/data/test_809_B | 20 - geom_bottleneck/tests/data/test_810_A | 20 - geom_bottleneck/tests/data/test_810_B | 20 - geom_bottleneck/tests/data/test_811_A | 20 - geom_bottleneck/tests/data/test_811_B | 20 - geom_bottleneck/tests/data/test_812_A | 20 - geom_bottleneck/tests/data/test_812_B | 20 - geom_bottleneck/tests/data/test_813_A | 20 - geom_bottleneck/tests/data/test_813_B | 20 - geom_bottleneck/tests/data/test_814_A | 20 - geom_bottleneck/tests/data/test_814_B | 20 - geom_bottleneck/tests/data/test_815_A | 20 - geom_bottleneck/tests/data/test_815_B | 20 - geom_bottleneck/tests/data/test_816_A | 20 - geom_bottleneck/tests/data/test_816_B | 20 - geom_bottleneck/tests/data/test_817_A | 20 - geom_bottleneck/tests/data/test_817_B | 20 - geom_bottleneck/tests/data/test_818_A | 20 - geom_bottleneck/tests/data/test_818_B | 20 - geom_bottleneck/tests/data/test_819_A | 20 - geom_bottleneck/tests/data/test_819_B | 20 - geom_bottleneck/tests/data/test_820_A | 30 - geom_bottleneck/tests/data/test_820_B | 30 - geom_bottleneck/tests/data/test_821_A | 30 - geom_bottleneck/tests/data/test_821_B | 30 - geom_bottleneck/tests/data/test_822_A | 30 - geom_bottleneck/tests/data/test_822_B | 30 - geom_bottleneck/tests/data/test_823_A | 30 - geom_bottleneck/tests/data/test_823_B | 30 - geom_bottleneck/tests/data/test_824_A | 30 - geom_bottleneck/tests/data/test_824_B | 30 - geom_bottleneck/tests/data/test_825_A | 30 - geom_bottleneck/tests/data/test_825_B | 30 - geom_bottleneck/tests/data/test_826_A | 30 - geom_bottleneck/tests/data/test_826_B | 30 - geom_bottleneck/tests/data/test_827_A | 30 - geom_bottleneck/tests/data/test_827_B | 30 - geom_bottleneck/tests/data/test_828_A | 30 - geom_bottleneck/tests/data/test_828_B | 30 - geom_bottleneck/tests/data/test_829_A | 30 - geom_bottleneck/tests/data/test_829_B | 30 - geom_bottleneck/tests/data/test_830_A | 30 - geom_bottleneck/tests/data/test_830_B | 30 - geom_bottleneck/tests/data/test_831_A | 30 - geom_bottleneck/tests/data/test_831_B | 30 - geom_bottleneck/tests/data/test_832_A | 30 - geom_bottleneck/tests/data/test_832_B | 30 - geom_bottleneck/tests/data/test_833_A | 30 - geom_bottleneck/tests/data/test_833_B | 30 - geom_bottleneck/tests/data/test_834_A | 30 - geom_bottleneck/tests/data/test_834_B | 30 - geom_bottleneck/tests/data/test_835_A | 30 - geom_bottleneck/tests/data/test_835_B | 30 - geom_bottleneck/tests/data/test_836_A | 30 - geom_bottleneck/tests/data/test_836_B | 30 - geom_bottleneck/tests/data/test_837_A | 30 - geom_bottleneck/tests/data/test_837_B | 30 - geom_bottleneck/tests/data/test_838_A | 30 - geom_bottleneck/tests/data/test_838_B | 30 - geom_bottleneck/tests/data/test_839_A | 30 - geom_bottleneck/tests/data/test_839_B | 30 - geom_bottleneck/tests/data/test_840_A | 50 - geom_bottleneck/tests/data/test_840_B | 50 - geom_bottleneck/tests/data/test_841_A | 50 - geom_bottleneck/tests/data/test_841_B | 50 - geom_bottleneck/tests/data/test_842_A | 50 - geom_bottleneck/tests/data/test_842_B | 50 - geom_bottleneck/tests/data/test_843_A | 50 - geom_bottleneck/tests/data/test_843_B | 50 - geom_bottleneck/tests/data/test_844_A | 50 - geom_bottleneck/tests/data/test_844_B | 50 - geom_bottleneck/tests/data/test_845_A | 50 - geom_bottleneck/tests/data/test_845_B | 50 - geom_bottleneck/tests/data/test_846_A | 50 - geom_bottleneck/tests/data/test_846_B | 50 - geom_bottleneck/tests/data/test_847_A | 50 - geom_bottleneck/tests/data/test_847_B | 50 - geom_bottleneck/tests/data/test_848_A | 50 - geom_bottleneck/tests/data/test_848_B | 50 - geom_bottleneck/tests/data/test_849_A | 50 - geom_bottleneck/tests/data/test_849_B | 50 - geom_bottleneck/tests/data/test_850_A | 50 - geom_bottleneck/tests/data/test_850_B | 50 - geom_bottleneck/tests/data/test_851_A | 50 - geom_bottleneck/tests/data/test_851_B | 50 - geom_bottleneck/tests/data/test_852_A | 50 - geom_bottleneck/tests/data/test_852_B | 50 - geom_bottleneck/tests/data/test_853_A | 50 - geom_bottleneck/tests/data/test_853_B | 50 - geom_bottleneck/tests/data/test_854_A | 50 - geom_bottleneck/tests/data/test_854_B | 50 - geom_bottleneck/tests/data/test_855_A | 50 - geom_bottleneck/tests/data/test_855_B | 50 - geom_bottleneck/tests/data/test_856_A | 50 - geom_bottleneck/tests/data/test_856_B | 50 - geom_bottleneck/tests/data/test_857_A | 50 - geom_bottleneck/tests/data/test_857_B | 50 - geom_bottleneck/tests/data/test_858_A | 50 - geom_bottleneck/tests/data/test_858_B | 50 - geom_bottleneck/tests/data/test_859_A | 50 - geom_bottleneck/tests/data/test_859_B | 50 - geom_bottleneck/tests/data/test_860_A | 100 - geom_bottleneck/tests/data/test_860_B | 100 - geom_bottleneck/tests/data/test_861_A | 100 - geom_bottleneck/tests/data/test_861_B | 100 - geom_bottleneck/tests/data/test_862_A | 100 - geom_bottleneck/tests/data/test_862_B | 100 - geom_bottleneck/tests/data/test_863_A | 100 - geom_bottleneck/tests/data/test_863_B | 100 - geom_bottleneck/tests/data/test_864_A | 100 - geom_bottleneck/tests/data/test_864_B | 100 - geom_bottleneck/tests/data/test_865_A | 100 - geom_bottleneck/tests/data/test_865_B | 100 - geom_bottleneck/tests/data/test_866_A | 100 - geom_bottleneck/tests/data/test_866_B | 100 - geom_bottleneck/tests/data/test_867_A | 100 - geom_bottleneck/tests/data/test_867_B | 100 - geom_bottleneck/tests/data/test_868_A | 100 - geom_bottleneck/tests/data/test_868_B | 100 - geom_bottleneck/tests/data/test_869_A | 100 - geom_bottleneck/tests/data/test_869_B | 100 - geom_bottleneck/tests/data/test_870_A | 100 - geom_bottleneck/tests/data/test_870_B | 100 - geom_bottleneck/tests/data/test_871_A | 100 - geom_bottleneck/tests/data/test_871_B | 100 - geom_bottleneck/tests/data/test_872_A | 100 - geom_bottleneck/tests/data/test_872_B | 100 - geom_bottleneck/tests/data/test_873_A | 100 - geom_bottleneck/tests/data/test_873_B | 100 - geom_bottleneck/tests/data/test_874_A | 100 - geom_bottleneck/tests/data/test_874_B | 100 - geom_bottleneck/tests/data/test_875_A | 100 - geom_bottleneck/tests/data/test_875_B | 100 - geom_bottleneck/tests/data/test_876_A | 100 - geom_bottleneck/tests/data/test_876_B | 100 - geom_bottleneck/tests/data/test_877_A | 100 - geom_bottleneck/tests/data/test_877_B | 100 - geom_bottleneck/tests/data/test_878_A | 100 - geom_bottleneck/tests/data/test_878_B | 100 - geom_bottleneck/tests/data/test_879_A | 100 - geom_bottleneck/tests/data/test_879_B | 100 - geom_bottleneck/tests/data/test_list.txt | 792 -- geom_bottleneck/tests/data/test_list.txt.bak | 792 -- geom_bottleneck/tests/data/ws_tests/test_100_A | 100 - .../tests/data/ws_tests/test_100_A.pd.dipha | Bin 2424 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_100_B | 100 - .../tests/data/ws_tests/test_100_B.pd.dipha | Bin 2424 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_200_A | 200 - geom_bottleneck/tests/data/ws_tests/test_200_B | 200 - geom_bottleneck/tests/data/ws_tests/test_5000_A | 5000 -------- geom_bottleneck/tests/data/ws_tests/test_5000_B | 5000 -------- geom_bottleneck/tests/data/ws_tests/test_5_A | 5 - .../tests/data/ws_tests/test_5_A.pd.dipha | Bin 144 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_5_B | 5 - .../tests/data/ws_tests/test_5_B.pd.dipha | Bin 144 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag1_A | 1 - .../tests/data/ws_tests/test_diag1_A.pd.dipha | Bin 48 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag1_B | 1 - .../tests/data/ws_tests/test_diag1_B.pd.dipha | Bin 48 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag2_A | 1 - .../tests/data/ws_tests/test_diag2_A.pd.dipha | Bin 48 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag2_B | 1 - .../tests/data/ws_tests/test_diag2_B.pd.dipha | Bin 48 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag3_A | 220 - .../tests/data/ws_tests/test_diag3_A.pd.dipha | Bin 5304 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_diag3_B | 193 - .../tests/data/ws_tests/test_diag3_B.pd.dipha | Bin 4656 -> 0 bytes geom_bottleneck/tests/data/ws_tests/test_list.txt | 21 - geom_bottleneck/tests/test_hera_bottleneck.cpp | 611 - geom_bottleneck/tests/tests_main.cpp | 3 - geom_matching/.gitignore | 31 - geom_matching/README | 100 - geom_matching/wasserstein/CMakeLists.txt | 62 - .../wasserstein/example/wasserstein_dist.cpp | 156 - .../wasserstein/example/wasserstein_dist_dipha.cpp | 133 - .../example/wasserstein_dist_point_cloud.cpp | 175 - geom_matching/wasserstein/include/auction_oracle.h | 40 - .../wasserstein/include/auction_oracle_base.h | 85 - .../wasserstein/include/auction_oracle_base.hpp | 97 - .../include/auction_oracle_kdtree_pure_geom.h | 97 - .../include/auction_oracle_kdtree_pure_geom.hpp | 247 - .../include/auction_oracle_kdtree_restricted.h | 122 - .../include/auction_oracle_kdtree_restricted.hpp | 598 - .../include/auction_oracle_kdtree_single_diag.h | 219 - .../include/auction_oracle_kdtree_single_diag.hpp | 717 -- .../wasserstein/include/auction_oracle_lazy_heap.h | 191 - .../include/auction_oracle_lazy_heap.hpp | 465 - .../auction_oracle_stupid_sparse_restricted.h | 114 - .../auction_oracle_stupid_sparse_restricted.hpp | 568 - .../wasserstein/include/auction_runner_fr.h | 289 - .../wasserstein/include/auction_runner_fr.hpp | 1440 --- .../wasserstein/include/auction_runner_gs.h | 123 - .../wasserstein/include/auction_runner_gs.hpp | 494 - .../include/auction_runner_gs_single_diag.h | 149 - .../include/auction_runner_gs_single_diag.hpp | 738 -- .../wasserstein/include/auction_runner_jac.h | 230 - .../wasserstein/include/auction_runner_jac.hpp | 879 -- geom_matching/wasserstein/include/basic_defs_ws.h | 337 - .../wasserstein/include/basic_defs_ws.hpp | 220 - geom_matching/wasserstein/include/catch/catch.hpp | 11545 ------------------- geom_matching/wasserstein/include/def_debug_ws.h | 44 - geom_matching/wasserstein/include/diagonal_heap.h | 149 - geom_matching/wasserstein/include/diagram_reader.h | 447 - .../include/dnn/geometry/euclidean-dynamic.h | 270 - .../include/dnn/geometry/euclidean-fixed.h | 196 - .../wasserstein/include/dnn/local/kd-tree.h | 97 - .../wasserstein/include/dnn/local/kd-tree.hpp | 330 - .../include/dnn/local/search-functors.h | 95 - .../wasserstein/include/dnn/parallel/tbb.h | 237 - .../wasserstein/include/dnn/parallel/utils.h | 100 - geom_matching/wasserstein/include/dnn/utils.h | 47 - geom_matching/wasserstein/include/hera_infinity.h | 22 - geom_matching/wasserstein/include/opts/opts.h | 353 - .../wasserstein/include/spdlog/async_logger.h | 82 - geom_matching/wasserstein/include/spdlog/common.h | 160 - .../include/spdlog/details/async_log_helper.h | 399 - .../include/spdlog/details/async_logger_impl.h | 105 - .../include/spdlog/details/file_helper.h | 117 - .../wasserstein/include/spdlog/details/log_msg.h | 50 - .../include/spdlog/details/logger_impl.h | 563 - .../include/spdlog/details/mpmc_bounded_q.h | 172 - .../include/spdlog/details/null_mutex.h | 45 - .../wasserstein/include/spdlog/details/os.h | 469 - .../spdlog/details/pattern_formatter_impl.h | 690 -- .../wasserstein/include/spdlog/details/registry.h | 214 - .../include/spdlog/details/spdlog_impl.h | 263 - .../include/spdlog/fmt/bundled/format.cc | 940 -- .../include/spdlog/fmt/bundled/format.h | 4501 -------- .../include/spdlog/fmt/bundled/ostream.cc | 43 - .../include/spdlog/fmt/bundled/ostream.h | 126 - .../include/spdlog/fmt/bundled/posix.cc | 238 - .../wasserstein/include/spdlog/fmt/bundled/posix.h | 443 - .../wasserstein/include/spdlog/fmt/bundled/time.h | 58 - geom_matching/wasserstein/include/spdlog/fmt/fmt.h | 28 - .../wasserstein/include/spdlog/fmt/ostr.h | 17 - .../wasserstein/include/spdlog/formatter.h | 47 - geom_matching/wasserstein/include/spdlog/logger.h | 132 - .../include/spdlog/sinks/android_sink.h | 90 - .../include/spdlog/sinks/ansicolor_sink.h | 133 - .../wasserstein/include/spdlog/sinks/base_sink.h | 50 - .../wasserstein/include/spdlog/sinks/dist_sink.h | 73 - .../wasserstein/include/spdlog/sinks/file_sinks.h | 242 - .../wasserstein/include/spdlog/sinks/msvc_sink.h | 51 - .../wasserstein/include/spdlog/sinks/null_sink.h | 34 - .../include/spdlog/sinks/ostream_sink.h | 47 - .../wasserstein/include/spdlog/sinks/sink.h | 53 - .../include/spdlog/sinks/stdout_sinks.h | 77 - .../wasserstein/include/spdlog/sinks/syslog_sink.h | 81 - .../include/spdlog/sinks/wincolor_sink.h | 117 - geom_matching/wasserstein/include/spdlog/spdlog.h | 187 - geom_matching/wasserstein/include/spdlog/tweakme.h | 141 - geom_matching/wasserstein/include/wasserstein.h | 370 - .../wasserstein/include/wasserstein_pure_geom.hpp | 86 - geom_matching/wasserstein/tests/data/test_100_A | 100 - .../wasserstein/tests/data/test_100_A.pd.dipha | Bin 2424 -> 0 bytes geom_matching/wasserstein/tests/data/test_100_B | 100 - .../wasserstein/tests/data/test_100_B.pd.dipha | Bin 2424 -> 0 bytes geom_matching/wasserstein/tests/data/test_200_A | 200 - geom_matching/wasserstein/tests/data/test_200_B | 200 - geom_matching/wasserstein/tests/data/test_5000_A | 5000 -------- geom_matching/wasserstein/tests/data/test_5000_B | 5000 -------- geom_matching/wasserstein/tests/data/test_5_A | 5 - .../wasserstein/tests/data/test_5_A.pd.dipha | Bin 144 -> 0 bytes geom_matching/wasserstein/tests/data/test_5_B | 5 - .../wasserstein/tests/data/test_5_B.pd.dipha | Bin 144 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag1_A | 1 - .../wasserstein/tests/data/test_diag1_A.pd.dipha | Bin 48 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag1_B | 1 - .../wasserstein/tests/data/test_diag1_B.pd.dipha | Bin 48 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag2_A | 1 - .../wasserstein/tests/data/test_diag2_A.pd.dipha | Bin 48 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag2_B | 1 - .../wasserstein/tests/data/test_diag2_B.pd.dipha | Bin 48 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag3_A | 220 - .../wasserstein/tests/data/test_diag3_A.pd.dipha | Bin 5304 -> 0 bytes geom_matching/wasserstein/tests/data/test_diag3_B | 193 - .../wasserstein/tests/data/test_diag3_B.pd.dipha | Bin 4656 -> 0 bytes geom_matching/wasserstein/tests/data/test_list.txt | 21 - .../wasserstein/tests/test_hera_wasserstein.cpp | 532 - .../tests/test_hera_wasserstein_pure_geom.cpp | 111 - geom_matching/wasserstein/tests/tests_main.cpp | 3 - geom_matching/wasserstein/tests/tests_reader.h | 67 - wasserstein/.gitignore | 31 + wasserstein/CMakeLists.txt | 62 + wasserstein/README | 100 + wasserstein/example/wasserstein_dist.cpp | 156 + wasserstein/example/wasserstein_dist_dipha.cpp | 133 + .../example/wasserstein_dist_point_cloud.cpp | 175 + wasserstein/include/auction_oracle.h | 40 + wasserstein/include/auction_oracle_base.h | 85 + wasserstein/include/auction_oracle_base.hpp | 97 + .../include/auction_oracle_kdtree_pure_geom.h | 97 + .../include/auction_oracle_kdtree_pure_geom.hpp | 247 + .../include/auction_oracle_kdtree_restricted.h | 122 + .../include/auction_oracle_kdtree_restricted.hpp | 598 + .../include/auction_oracle_kdtree_single_diag.h | 219 + .../include/auction_oracle_kdtree_single_diag.hpp | 717 ++ wasserstein/include/auction_oracle_lazy_heap.h | 191 + wasserstein/include/auction_oracle_lazy_heap.hpp | 465 + .../auction_oracle_stupid_sparse_restricted.h | 114 + .../auction_oracle_stupid_sparse_restricted.hpp | 568 + wasserstein/include/auction_runner_fr.h | 289 + wasserstein/include/auction_runner_fr.hpp | 1440 +++ wasserstein/include/auction_runner_gs.h | 123 + wasserstein/include/auction_runner_gs.hpp | 494 + .../include/auction_runner_gs_single_diag.h | 149 + .../include/auction_runner_gs_single_diag.hpp | 738 ++ wasserstein/include/auction_runner_jac.h | 230 + wasserstein/include/auction_runner_jac.hpp | 879 ++ wasserstein/include/basic_defs_ws.h | 337 + wasserstein/include/basic_defs_ws.hpp | 220 + wasserstein/include/catch/catch.hpp | 11545 +++++++++++++++++++ wasserstein/include/def_debug_ws.h | 44 + wasserstein/include/diagonal_heap.h | 149 + wasserstein/include/diagram_reader.h | 447 + .../include/dnn/geometry/euclidean-dynamic.h | 270 + wasserstein/include/dnn/geometry/euclidean-fixed.h | 196 + wasserstein/include/dnn/local/kd-tree.h | 97 + wasserstein/include/dnn/local/kd-tree.hpp | 330 + wasserstein/include/dnn/local/search-functors.h | 95 + wasserstein/include/dnn/parallel/tbb.h | 237 + wasserstein/include/dnn/parallel/utils.h | 100 + wasserstein/include/dnn/utils.h | 47 + wasserstein/include/hera_infinity.h | 22 + wasserstein/include/opts/opts.h | 353 + wasserstein/include/spdlog/async_logger.h | 82 + wasserstein/include/spdlog/common.h | 160 + .../include/spdlog/details/async_log_helper.h | 399 + .../include/spdlog/details/async_logger_impl.h | 105 + wasserstein/include/spdlog/details/file_helper.h | 117 + wasserstein/include/spdlog/details/log_msg.h | 50 + wasserstein/include/spdlog/details/logger_impl.h | 563 + .../include/spdlog/details/mpmc_bounded_q.h | 172 + wasserstein/include/spdlog/details/null_mutex.h | 45 + wasserstein/include/spdlog/details/os.h | 469 + .../spdlog/details/pattern_formatter_impl.h | 690 ++ wasserstein/include/spdlog/details/registry.h | 214 + wasserstein/include/spdlog/details/spdlog_impl.h | 263 + wasserstein/include/spdlog/fmt/bundled/format.cc | 940 ++ wasserstein/include/spdlog/fmt/bundled/format.h | 4501 ++++++++ wasserstein/include/spdlog/fmt/bundled/ostream.cc | 43 + wasserstein/include/spdlog/fmt/bundled/ostream.h | 126 + wasserstein/include/spdlog/fmt/bundled/posix.cc | 238 + wasserstein/include/spdlog/fmt/bundled/posix.h | 443 + wasserstein/include/spdlog/fmt/bundled/time.h | 58 + wasserstein/include/spdlog/fmt/fmt.h | 28 + wasserstein/include/spdlog/fmt/ostr.h | 17 + wasserstein/include/spdlog/formatter.h | 47 + wasserstein/include/spdlog/logger.h | 132 + wasserstein/include/spdlog/sinks/android_sink.h | 90 + wasserstein/include/spdlog/sinks/ansicolor_sink.h | 133 + wasserstein/include/spdlog/sinks/base_sink.h | 50 + wasserstein/include/spdlog/sinks/dist_sink.h | 73 + wasserstein/include/spdlog/sinks/file_sinks.h | 242 + wasserstein/include/spdlog/sinks/msvc_sink.h | 51 + wasserstein/include/spdlog/sinks/null_sink.h | 34 + wasserstein/include/spdlog/sinks/ostream_sink.h | 47 + wasserstein/include/spdlog/sinks/sink.h | 53 + wasserstein/include/spdlog/sinks/stdout_sinks.h | 77 + wasserstein/include/spdlog/sinks/syslog_sink.h | 81 + wasserstein/include/spdlog/sinks/wincolor_sink.h | 117 + wasserstein/include/spdlog/spdlog.h | 187 + wasserstein/include/spdlog/tweakme.h | 141 + wasserstein/include/wasserstein.h | 370 + wasserstein/include/wasserstein_pure_geom.hpp | 86 + wasserstein/tests/data/test_100_A | 100 + wasserstein/tests/data/test_100_A.pd.dipha | Bin 0 -> 2424 bytes wasserstein/tests/data/test_100_B | 100 + wasserstein/tests/data/test_100_B.pd.dipha | Bin 0 -> 2424 bytes wasserstein/tests/data/test_200_A | 200 + wasserstein/tests/data/test_200_B | 200 + wasserstein/tests/data/test_5000_A | 5000 ++++++++ wasserstein/tests/data/test_5000_B | 5000 ++++++++ wasserstein/tests/data/test_5_A | 5 + wasserstein/tests/data/test_5_A.pd.dipha | Bin 0 -> 144 bytes wasserstein/tests/data/test_5_B | 5 + wasserstein/tests/data/test_5_B.pd.dipha | Bin 0 -> 144 bytes wasserstein/tests/data/test_diag1_A | 1 + wasserstein/tests/data/test_diag1_A.pd.dipha | Bin 0 -> 48 bytes wasserstein/tests/data/test_diag1_B | 1 + wasserstein/tests/data/test_diag1_B.pd.dipha | Bin 0 -> 48 bytes wasserstein/tests/data/test_diag2_A | 1 + wasserstein/tests/data/test_diag2_A.pd.dipha | Bin 0 -> 48 bytes wasserstein/tests/data/test_diag2_B | 1 + wasserstein/tests/data/test_diag2_B.pd.dipha | Bin 0 -> 48 bytes wasserstein/tests/data/test_diag3_A | 220 + wasserstein/tests/data/test_diag3_A.pd.dipha | Bin 0 -> 5304 bytes wasserstein/tests/data/test_diag3_B | 193 + wasserstein/tests/data/test_diag3_B.pd.dipha | Bin 0 -> 4656 bytes wasserstein/tests/data/test_list.txt | 21 + wasserstein/tests/test_hera_wasserstein.cpp | 532 + .../tests/test_hera_wasserstein_pure_geom.cpp | 111 + wasserstein/tests/tests_main.cpp | 3 + wasserstein/tests/tests_reader.h | 67 + 3512 files changed, 116890 insertions(+), 116890 deletions(-) create mode 100644 bottleneck/.gitignore create mode 100644 bottleneck/CMakeLists.txt create mode 100644 bottleneck/README create mode 100644 bottleneck/example/CMakeLists.txt create mode 100644 bottleneck/example/bottleneck_dist.cpp create mode 100644 bottleneck/include/basic_defs_bt.h create mode 100644 bottleneck/include/bottleneck.h create mode 100644 bottleneck/include/bottleneck_detail.h create mode 100644 bottleneck/include/bottleneck_detail.hpp create mode 100644 bottleneck/include/bound_match.h create mode 100644 bottleneck/include/bound_match.hpp create mode 100644 bottleneck/include/catch/catch.hpp create mode 100644 bottleneck/include/def_debug_bt.h create mode 100644 bottleneck/include/diagram_reader.h create mode 100644 bottleneck/include/diagram_traits.h create mode 100644 bottleneck/include/dnn/geometry/euclidean-fixed.h create mode 100644 bottleneck/include/dnn/local/kd-tree.h create mode 100644 bottleneck/include/dnn/local/kd-tree.hpp create mode 100644 bottleneck/include/dnn/local/search-functors.h create mode 100644 bottleneck/include/dnn/parallel/tbb.h create mode 100644 bottleneck/include/dnn/parallel/utils.h create mode 100644 bottleneck/include/dnn/utils.h create mode 100644 bottleneck/include/neighb_oracle.h create mode 100644 bottleneck/tests/data/test_001_A create mode 100644 bottleneck/tests/data/test_001_B create mode 100644 bottleneck/tests/data/test_002_A create mode 100644 bottleneck/tests/data/test_002_B create mode 100644 bottleneck/tests/data/test_003_A create mode 100644 bottleneck/tests/data/test_003_B create mode 100644 bottleneck/tests/data/test_004_A create mode 100644 bottleneck/tests/data/test_004_B create mode 100644 bottleneck/tests/data/test_005_A create mode 100644 bottleneck/tests/data/test_005_B create mode 100644 bottleneck/tests/data/test_006_A create mode 100644 bottleneck/tests/data/test_006_B create mode 100644 bottleneck/tests/data/test_007_A create mode 100644 bottleneck/tests/data/test_007_B create mode 100644 bottleneck/tests/data/test_008_A create mode 100644 bottleneck/tests/data/test_008_B create mode 100644 bottleneck/tests/data/test_009_A create mode 100644 bottleneck/tests/data/test_009_B create mode 100644 bottleneck/tests/data/test_010_A create mode 100644 bottleneck/tests/data/test_010_B create mode 100644 bottleneck/tests/data/test_011_A create mode 100644 bottleneck/tests/data/test_011_B create mode 100644 bottleneck/tests/data/test_012_A create mode 100644 bottleneck/tests/data/test_012_B create mode 100644 bottleneck/tests/data/test_013_A create mode 100644 bottleneck/tests/data/test_013_B create mode 100644 bottleneck/tests/data/test_014_A create mode 100644 bottleneck/tests/data/test_014_B create mode 100644 bottleneck/tests/data/test_015_A create mode 100644 bottleneck/tests/data/test_015_B create mode 100644 bottleneck/tests/data/test_016_A create mode 100644 bottleneck/tests/data/test_016_B create mode 100644 bottleneck/tests/data/test_100_A create mode 100644 bottleneck/tests/data/test_100_B create mode 100644 bottleneck/tests/data/test_101_A create mode 100644 bottleneck/tests/data/test_101_B create mode 100644 bottleneck/tests/data/test_102_A create mode 100644 bottleneck/tests/data/test_102_B create mode 100644 bottleneck/tests/data/test_103_A create mode 100644 bottleneck/tests/data/test_103_B create mode 100644 bottleneck/tests/data/test_104_A create mode 100644 bottleneck/tests/data/test_104_B create mode 100644 bottleneck/tests/data/test_105_A create mode 100644 bottleneck/tests/data/test_105_B create mode 100644 bottleneck/tests/data/test_106_A create mode 100644 bottleneck/tests/data/test_106_B create mode 100644 bottleneck/tests/data/test_107_A create mode 100644 bottleneck/tests/data/test_107_B create mode 100644 bottleneck/tests/data/test_108_A create mode 100644 bottleneck/tests/data/test_108_B create mode 100644 bottleneck/tests/data/test_109_A create mode 100644 bottleneck/tests/data/test_109_B create mode 100644 bottleneck/tests/data/test_110_A create mode 100644 bottleneck/tests/data/test_110_B create mode 100644 bottleneck/tests/data/test_111_A create mode 100644 bottleneck/tests/data/test_111_B create mode 100644 bottleneck/tests/data/test_112_A create mode 100644 bottleneck/tests/data/test_112_B create mode 100644 bottleneck/tests/data/test_113_A create mode 100644 bottleneck/tests/data/test_113_B create mode 100644 bottleneck/tests/data/test_114_A create mode 100644 bottleneck/tests/data/test_114_B create mode 100644 bottleneck/tests/data/test_115_A create mode 100644 bottleneck/tests/data/test_115_B create mode 100644 bottleneck/tests/data/test_116_A create mode 100644 bottleneck/tests/data/test_116_B create mode 100644 bottleneck/tests/data/test_117_A create mode 100644 bottleneck/tests/data/test_117_B create mode 100644 bottleneck/tests/data/test_118_A create mode 100644 bottleneck/tests/data/test_118_B create mode 100644 bottleneck/tests/data/test_119_A create mode 100644 bottleneck/tests/data/test_119_B create mode 100644 bottleneck/tests/data/test_120_A create mode 100644 bottleneck/tests/data/test_120_B create mode 100644 bottleneck/tests/data/test_121_A create mode 100644 bottleneck/tests/data/test_121_B create mode 100644 bottleneck/tests/data/test_122_A create mode 100644 bottleneck/tests/data/test_122_B create mode 100644 bottleneck/tests/data/test_123_A create mode 100644 bottleneck/tests/data/test_123_B create mode 100644 bottleneck/tests/data/test_124_A create mode 100644 bottleneck/tests/data/test_124_B create mode 100644 bottleneck/tests/data/test_125_A create mode 100644 bottleneck/tests/data/test_125_B create mode 100644 bottleneck/tests/data/test_126_A create mode 100644 bottleneck/tests/data/test_126_B create mode 100644 bottleneck/tests/data/test_127_A create mode 100644 bottleneck/tests/data/test_127_B create mode 100644 bottleneck/tests/data/test_128_A create mode 100644 bottleneck/tests/data/test_128_B create mode 100644 bottleneck/tests/data/test_129_A create mode 100644 bottleneck/tests/data/test_129_B create mode 100644 bottleneck/tests/data/test_130_A create mode 100644 bottleneck/tests/data/test_130_B create mode 100644 bottleneck/tests/data/test_131_A create mode 100644 bottleneck/tests/data/test_131_B create mode 100644 bottleneck/tests/data/test_132_A create mode 100644 bottleneck/tests/data/test_132_B create mode 100644 bottleneck/tests/data/test_133_A create mode 100644 bottleneck/tests/data/test_133_B create mode 100644 bottleneck/tests/data/test_134_A create mode 100644 bottleneck/tests/data/test_134_B create mode 100644 bottleneck/tests/data/test_135_A create mode 100644 bottleneck/tests/data/test_135_B create mode 100644 bottleneck/tests/data/test_136_A create mode 100644 bottleneck/tests/data/test_136_B create mode 100644 bottleneck/tests/data/test_137_A create mode 100644 bottleneck/tests/data/test_137_B create mode 100644 bottleneck/tests/data/test_138_A create mode 100644 bottleneck/tests/data/test_138_B create mode 100644 bottleneck/tests/data/test_139_A create mode 100644 bottleneck/tests/data/test_139_B create mode 100644 bottleneck/tests/data/test_140_A create mode 100644 bottleneck/tests/data/test_140_B create mode 100644 bottleneck/tests/data/test_141_A create mode 100644 bottleneck/tests/data/test_141_B create mode 100644 bottleneck/tests/data/test_142_A create mode 100644 bottleneck/tests/data/test_142_B create mode 100644 bottleneck/tests/data/test_143_A create mode 100644 bottleneck/tests/data/test_143_B create mode 100644 bottleneck/tests/data/test_144_A create mode 100644 bottleneck/tests/data/test_144_B create mode 100644 bottleneck/tests/data/test_145_A create mode 100644 bottleneck/tests/data/test_145_B create mode 100644 bottleneck/tests/data/test_146_A create mode 100644 bottleneck/tests/data/test_146_B create mode 100644 bottleneck/tests/data/test_147_A create mode 100644 bottleneck/tests/data/test_147_B create mode 100644 bottleneck/tests/data/test_148_A create mode 100644 bottleneck/tests/data/test_148_B create mode 100644 bottleneck/tests/data/test_149_A create mode 100644 bottleneck/tests/data/test_149_B create mode 100644 bottleneck/tests/data/test_150_A create mode 100644 bottleneck/tests/data/test_150_B create mode 100644 bottleneck/tests/data/test_151_A create mode 100644 bottleneck/tests/data/test_151_B create mode 100644 bottleneck/tests/data/test_152_A create mode 100644 bottleneck/tests/data/test_152_B create mode 100644 bottleneck/tests/data/test_153_A create mode 100644 bottleneck/tests/data/test_153_B create mode 100644 bottleneck/tests/data/test_154_A create mode 100644 bottleneck/tests/data/test_154_B create mode 100644 bottleneck/tests/data/test_155_A create mode 100644 bottleneck/tests/data/test_155_B create mode 100644 bottleneck/tests/data/test_156_A create mode 100644 bottleneck/tests/data/test_156_B create mode 100644 bottleneck/tests/data/test_157_A create mode 100644 bottleneck/tests/data/test_157_B create mode 100644 bottleneck/tests/data/test_158_A create mode 100644 bottleneck/tests/data/test_158_B create mode 100644 bottleneck/tests/data/test_159_A create mode 100644 bottleneck/tests/data/test_159_B create mode 100644 bottleneck/tests/data/test_160_A create mode 100644 bottleneck/tests/data/test_160_B create mode 100644 bottleneck/tests/data/test_161_A create mode 100644 bottleneck/tests/data/test_161_B create mode 100644 bottleneck/tests/data/test_162_A create mode 100644 bottleneck/tests/data/test_162_B create mode 100644 bottleneck/tests/data/test_163_A create mode 100644 bottleneck/tests/data/test_163_B create mode 100644 bottleneck/tests/data/test_164_A create mode 100644 bottleneck/tests/data/test_164_B create mode 100644 bottleneck/tests/data/test_165_A create mode 100644 bottleneck/tests/data/test_165_B create mode 100644 bottleneck/tests/data/test_166_A create mode 100644 bottleneck/tests/data/test_166_B create mode 100644 bottleneck/tests/data/test_167_A create mode 100644 bottleneck/tests/data/test_167_B create mode 100644 bottleneck/tests/data/test_168_A create mode 100644 bottleneck/tests/data/test_168_B create mode 100644 bottleneck/tests/data/test_169_A create mode 100644 bottleneck/tests/data/test_169_B create mode 100644 bottleneck/tests/data/test_170_A create mode 100644 bottleneck/tests/data/test_170_B create mode 100644 bottleneck/tests/data/test_171_A create mode 100644 bottleneck/tests/data/test_171_B create mode 100644 bottleneck/tests/data/test_172_A create mode 100644 bottleneck/tests/data/test_172_B create mode 100644 bottleneck/tests/data/test_173_A create mode 100644 bottleneck/tests/data/test_173_B create mode 100644 bottleneck/tests/data/test_174_A create mode 100644 bottleneck/tests/data/test_174_B create mode 100644 bottleneck/tests/data/test_175_A create mode 100644 bottleneck/tests/data/test_175_B create mode 100644 bottleneck/tests/data/test_176_A create mode 100644 bottleneck/tests/data/test_176_B create mode 100644 bottleneck/tests/data/test_177_A create mode 100644 bottleneck/tests/data/test_177_B create mode 100644 bottleneck/tests/data/test_178_A create mode 100644 bottleneck/tests/data/test_178_B create mode 100644 bottleneck/tests/data/test_179_A create mode 100644 bottleneck/tests/data/test_179_B create mode 100644 bottleneck/tests/data/test_180_A create mode 100644 bottleneck/tests/data/test_180_B create mode 100644 bottleneck/tests/data/test_181_A create mode 100644 bottleneck/tests/data/test_181_B create mode 100644 bottleneck/tests/data/test_182_A create mode 100644 bottleneck/tests/data/test_182_B create mode 100644 bottleneck/tests/data/test_183_A create mode 100644 bottleneck/tests/data/test_183_B create mode 100644 bottleneck/tests/data/test_184_A create mode 100644 bottleneck/tests/data/test_184_B create mode 100644 bottleneck/tests/data/test_185_A create mode 100644 bottleneck/tests/data/test_185_B create mode 100644 bottleneck/tests/data/test_186_A create mode 100644 bottleneck/tests/data/test_186_B create mode 100644 bottleneck/tests/data/test_187_A create mode 100644 bottleneck/tests/data/test_187_B create mode 100644 bottleneck/tests/data/test_188_A create mode 100644 bottleneck/tests/data/test_188_B create mode 100644 bottleneck/tests/data/test_189_A create mode 100644 bottleneck/tests/data/test_189_B create mode 100644 bottleneck/tests/data/test_190_A create mode 100644 bottleneck/tests/data/test_190_B create mode 100644 bottleneck/tests/data/test_191_A create mode 100644 bottleneck/tests/data/test_191_B create mode 100644 bottleneck/tests/data/test_192_A create mode 100644 bottleneck/tests/data/test_192_B create mode 100644 bottleneck/tests/data/test_193_A create mode 100644 bottleneck/tests/data/test_193_B create mode 100644 bottleneck/tests/data/test_194_A create mode 100644 bottleneck/tests/data/test_194_B create mode 100644 bottleneck/tests/data/test_195_A create mode 100644 bottleneck/tests/data/test_195_B create mode 100644 bottleneck/tests/data/test_196_A create mode 100644 bottleneck/tests/data/test_196_B create mode 100644 bottleneck/tests/data/test_197_A create mode 100644 bottleneck/tests/data/test_197_B create mode 100644 bottleneck/tests/data/test_198_A create mode 100644 bottleneck/tests/data/test_198_B create mode 100644 bottleneck/tests/data/test_199_A create mode 100644 bottleneck/tests/data/test_199_B create mode 100644 bottleneck/tests/data/test_200_A create mode 100644 bottleneck/tests/data/test_200_B create mode 100644 bottleneck/tests/data/test_201_A create mode 100644 bottleneck/tests/data/test_201_B create mode 100644 bottleneck/tests/data/test_202_A create mode 100644 bottleneck/tests/data/test_202_B create mode 100644 bottleneck/tests/data/test_203_A create mode 100644 bottleneck/tests/data/test_203_B create mode 100644 bottleneck/tests/data/test_204_A create mode 100644 bottleneck/tests/data/test_204_B create mode 100644 bottleneck/tests/data/test_205_A create mode 100644 bottleneck/tests/data/test_205_B create mode 100644 bottleneck/tests/data/test_206_A create mode 100644 bottleneck/tests/data/test_206_B create mode 100644 bottleneck/tests/data/test_207_A create mode 100644 bottleneck/tests/data/test_207_B create mode 100644 bottleneck/tests/data/test_208_A create mode 100644 bottleneck/tests/data/test_208_B create mode 100644 bottleneck/tests/data/test_209_A create mode 100644 bottleneck/tests/data/test_209_B create mode 100644 bottleneck/tests/data/test_210_A create mode 100644 bottleneck/tests/data/test_210_B create mode 100644 bottleneck/tests/data/test_211_A create mode 100644 bottleneck/tests/data/test_211_B create mode 100644 bottleneck/tests/data/test_212_A create mode 100644 bottleneck/tests/data/test_212_B create mode 100644 bottleneck/tests/data/test_213_A create mode 100644 bottleneck/tests/data/test_213_B create mode 100644 bottleneck/tests/data/test_214_A create mode 100644 bottleneck/tests/data/test_214_B create mode 100644 bottleneck/tests/data/test_215_A create mode 100644 bottleneck/tests/data/test_215_B create mode 100644 bottleneck/tests/data/test_216_A create mode 100644 bottleneck/tests/data/test_216_B create mode 100644 bottleneck/tests/data/test_217_A create mode 100644 bottleneck/tests/data/test_217_B create mode 100644 bottleneck/tests/data/test_218_A create mode 100644 bottleneck/tests/data/test_218_B create mode 100644 bottleneck/tests/data/test_219_A create mode 100644 bottleneck/tests/data/test_219_B create mode 100644 bottleneck/tests/data/test_220_A create mode 100644 bottleneck/tests/data/test_220_B create mode 100644 bottleneck/tests/data/test_221_A create mode 100644 bottleneck/tests/data/test_221_B create mode 100644 bottleneck/tests/data/test_222_A create mode 100644 bottleneck/tests/data/test_222_B create mode 100644 bottleneck/tests/data/test_223_A create mode 100644 bottleneck/tests/data/test_223_B create mode 100644 bottleneck/tests/data/test_224_A create mode 100644 bottleneck/tests/data/test_224_B create mode 100644 bottleneck/tests/data/test_225_A create mode 100644 bottleneck/tests/data/test_225_B create mode 100644 bottleneck/tests/data/test_226_A create mode 100644 bottleneck/tests/data/test_226_B create mode 100644 bottleneck/tests/data/test_227_A create mode 100644 bottleneck/tests/data/test_227_B create mode 100644 bottleneck/tests/data/test_228_A create mode 100644 bottleneck/tests/data/test_228_B create mode 100644 bottleneck/tests/data/test_229_A create mode 100644 bottleneck/tests/data/test_229_B create mode 100644 bottleneck/tests/data/test_230_A create mode 100644 bottleneck/tests/data/test_230_B create mode 100644 bottleneck/tests/data/test_231_A create mode 100644 bottleneck/tests/data/test_231_B create mode 100644 bottleneck/tests/data/test_232_A create mode 100644 bottleneck/tests/data/test_232_B create mode 100644 bottleneck/tests/data/test_233_A create mode 100644 bottleneck/tests/data/test_233_B create mode 100644 bottleneck/tests/data/test_234_A create mode 100644 bottleneck/tests/data/test_234_B create mode 100644 bottleneck/tests/data/test_235_A create mode 100644 bottleneck/tests/data/test_235_B create mode 100644 bottleneck/tests/data/test_236_A create mode 100644 bottleneck/tests/data/test_236_B create mode 100644 bottleneck/tests/data/test_237_A create mode 100644 bottleneck/tests/data/test_237_B create mode 100644 bottleneck/tests/data/test_238_A create mode 100644 bottleneck/tests/data/test_238_B create mode 100644 bottleneck/tests/data/test_239_A create mode 100644 bottleneck/tests/data/test_239_B create mode 100644 bottleneck/tests/data/test_240_A create mode 100644 bottleneck/tests/data/test_240_B create mode 100644 bottleneck/tests/data/test_241_A create mode 100644 bottleneck/tests/data/test_241_B create mode 100644 bottleneck/tests/data/test_242_A create mode 100644 bottleneck/tests/data/test_242_B create mode 100644 bottleneck/tests/data/test_243_A create mode 100644 bottleneck/tests/data/test_243_B create mode 100644 bottleneck/tests/data/test_244_A create mode 100644 bottleneck/tests/data/test_244_B create mode 100644 bottleneck/tests/data/test_245_A create mode 100644 bottleneck/tests/data/test_245_B create mode 100644 bottleneck/tests/data/test_246_A create mode 100644 bottleneck/tests/data/test_246_B create mode 100644 bottleneck/tests/data/test_247_A create mode 100644 bottleneck/tests/data/test_247_B create mode 100644 bottleneck/tests/data/test_248_A create mode 100644 bottleneck/tests/data/test_248_B create mode 100644 bottleneck/tests/data/test_249_A create mode 100644 bottleneck/tests/data/test_249_B create mode 100644 bottleneck/tests/data/test_250_A create mode 100644 bottleneck/tests/data/test_250_B create mode 100644 bottleneck/tests/data/test_251_A create mode 100644 bottleneck/tests/data/test_251_B create mode 100644 bottleneck/tests/data/test_252_A create mode 100644 bottleneck/tests/data/test_252_B create mode 100644 bottleneck/tests/data/test_253_A create mode 100644 bottleneck/tests/data/test_253_B create mode 100644 bottleneck/tests/data/test_254_A create mode 100644 bottleneck/tests/data/test_254_B create mode 100644 bottleneck/tests/data/test_255_A create mode 100644 bottleneck/tests/data/test_255_B create mode 100644 bottleneck/tests/data/test_256_A create mode 100644 bottleneck/tests/data/test_256_B create mode 100644 bottleneck/tests/data/test_257_A create mode 100644 bottleneck/tests/data/test_257_B create mode 100644 bottleneck/tests/data/test_258_A create mode 100644 bottleneck/tests/data/test_258_B create mode 100644 bottleneck/tests/data/test_259_A create mode 100644 bottleneck/tests/data/test_259_B create mode 100644 bottleneck/tests/data/test_260_A create mode 100644 bottleneck/tests/data/test_260_B create mode 100644 bottleneck/tests/data/test_261_A create mode 100644 bottleneck/tests/data/test_261_B create mode 100644 bottleneck/tests/data/test_262_A create mode 100644 bottleneck/tests/data/test_262_B create mode 100644 bottleneck/tests/data/test_263_A create mode 100644 bottleneck/tests/data/test_263_B create mode 100644 bottleneck/tests/data/test_264_A create mode 100644 bottleneck/tests/data/test_264_B create mode 100644 bottleneck/tests/data/test_265_A create mode 100644 bottleneck/tests/data/test_265_B create mode 100644 bottleneck/tests/data/test_266_A create mode 100644 bottleneck/tests/data/test_266_B create mode 100644 bottleneck/tests/data/test_267_A create mode 100644 bottleneck/tests/data/test_267_B create mode 100644 bottleneck/tests/data/test_268_A create mode 100644 bottleneck/tests/data/test_268_B create mode 100644 bottleneck/tests/data/test_269_A create mode 100644 bottleneck/tests/data/test_269_B create mode 100644 bottleneck/tests/data/test_270_A create mode 100644 bottleneck/tests/data/test_270_B create mode 100644 bottleneck/tests/data/test_271_A create mode 100644 bottleneck/tests/data/test_271_B create mode 100644 bottleneck/tests/data/test_272_A create mode 100644 bottleneck/tests/data/test_272_B create mode 100644 bottleneck/tests/data/test_273_A create mode 100644 bottleneck/tests/data/test_273_B create mode 100644 bottleneck/tests/data/test_274_A create mode 100644 bottleneck/tests/data/test_274_B create mode 100644 bottleneck/tests/data/test_275_A create mode 100644 bottleneck/tests/data/test_275_B create mode 100644 bottleneck/tests/data/test_276_A create mode 100644 bottleneck/tests/data/test_276_B create mode 100644 bottleneck/tests/data/test_277_A create mode 100644 bottleneck/tests/data/test_277_B create mode 100644 bottleneck/tests/data/test_278_A create mode 100644 bottleneck/tests/data/test_278_B create mode 100644 bottleneck/tests/data/test_279_A create mode 100644 bottleneck/tests/data/test_279_B create mode 100644 bottleneck/tests/data/test_280_A create mode 100644 bottleneck/tests/data/test_280_B create mode 100644 bottleneck/tests/data/test_281_A create mode 100644 bottleneck/tests/data/test_281_B create mode 100644 bottleneck/tests/data/test_282_A create mode 100644 bottleneck/tests/data/test_282_B create mode 100644 bottleneck/tests/data/test_283_A create mode 100644 bottleneck/tests/data/test_283_B create mode 100644 bottleneck/tests/data/test_284_A create mode 100644 bottleneck/tests/data/test_284_B create mode 100644 bottleneck/tests/data/test_285_A create mode 100644 bottleneck/tests/data/test_285_B create mode 100644 bottleneck/tests/data/test_286_A create mode 100644 bottleneck/tests/data/test_286_B create mode 100644 bottleneck/tests/data/test_287_A create mode 100644 bottleneck/tests/data/test_287_B create mode 100644 bottleneck/tests/data/test_288_A create mode 100644 bottleneck/tests/data/test_288_B create mode 100644 bottleneck/tests/data/test_289_A create mode 100644 bottleneck/tests/data/test_289_B create mode 100644 bottleneck/tests/data/test_290_A create mode 100644 bottleneck/tests/data/test_290_B create mode 100644 bottleneck/tests/data/test_291_A create mode 100644 bottleneck/tests/data/test_291_B create mode 100644 bottleneck/tests/data/test_292_A create mode 100644 bottleneck/tests/data/test_292_B create mode 100644 bottleneck/tests/data/test_293_A create mode 100644 bottleneck/tests/data/test_293_B create mode 100644 bottleneck/tests/data/test_294_A create mode 100644 bottleneck/tests/data/test_294_B create mode 100644 bottleneck/tests/data/test_295_A create mode 100644 bottleneck/tests/data/test_295_B create mode 100644 bottleneck/tests/data/test_296_A create mode 100644 bottleneck/tests/data/test_296_B create mode 100644 bottleneck/tests/data/test_297_A create mode 100644 bottleneck/tests/data/test_297_B create mode 100644 bottleneck/tests/data/test_298_A create mode 100644 bottleneck/tests/data/test_298_B create mode 100644 bottleneck/tests/data/test_299_A create mode 100644 bottleneck/tests/data/test_299_B create mode 100644 bottleneck/tests/data/test_300_A create mode 100644 bottleneck/tests/data/test_300_B create mode 100644 bottleneck/tests/data/test_301_A create mode 100644 bottleneck/tests/data/test_301_B create mode 100644 bottleneck/tests/data/test_302_A create mode 100644 bottleneck/tests/data/test_302_B create mode 100644 bottleneck/tests/data/test_303_A create mode 100644 bottleneck/tests/data/test_303_B create mode 100644 bottleneck/tests/data/test_304_A create mode 100644 bottleneck/tests/data/test_304_B create mode 100644 bottleneck/tests/data/test_305_A create mode 100644 bottleneck/tests/data/test_305_B create mode 100644 bottleneck/tests/data/test_306_A create mode 100644 bottleneck/tests/data/test_306_B create mode 100644 bottleneck/tests/data/test_307_A create mode 100644 bottleneck/tests/data/test_307_B create mode 100644 bottleneck/tests/data/test_308_A create mode 100644 bottleneck/tests/data/test_308_B create mode 100644 bottleneck/tests/data/test_309_A create mode 100644 bottleneck/tests/data/test_309_B create mode 100644 bottleneck/tests/data/test_310_A create mode 100644 bottleneck/tests/data/test_310_B create mode 100644 bottleneck/tests/data/test_311_A create mode 100644 bottleneck/tests/data/test_311_B create mode 100644 bottleneck/tests/data/test_312_A create mode 100644 bottleneck/tests/data/test_312_B create mode 100644 bottleneck/tests/data/test_313_A create mode 100644 bottleneck/tests/data/test_313_B create mode 100644 bottleneck/tests/data/test_314_A create mode 100644 bottleneck/tests/data/test_314_B create mode 100644 bottleneck/tests/data/test_315_A create mode 100644 bottleneck/tests/data/test_315_B create mode 100644 bottleneck/tests/data/test_316_A create mode 100644 bottleneck/tests/data/test_316_B create mode 100644 bottleneck/tests/data/test_317_A create mode 100644 bottleneck/tests/data/test_317_B create mode 100644 bottleneck/tests/data/test_318_A create mode 100644 bottleneck/tests/data/test_318_B create mode 100644 bottleneck/tests/data/test_319_A create mode 100644 bottleneck/tests/data/test_319_B create mode 100644 bottleneck/tests/data/test_320_A create mode 100644 bottleneck/tests/data/test_320_B create mode 100644 bottleneck/tests/data/test_321_A create mode 100644 bottleneck/tests/data/test_321_B create mode 100644 bottleneck/tests/data/test_322_A create mode 100644 bottleneck/tests/data/test_322_B create mode 100644 bottleneck/tests/data/test_323_A create mode 100644 bottleneck/tests/data/test_323_B create mode 100644 bottleneck/tests/data/test_324_A create mode 100644 bottleneck/tests/data/test_324_B create mode 100644 bottleneck/tests/data/test_325_A create mode 100644 bottleneck/tests/data/test_325_B create mode 100644 bottleneck/tests/data/test_326_A create mode 100644 bottleneck/tests/data/test_326_B create mode 100644 bottleneck/tests/data/test_327_A create mode 100644 bottleneck/tests/data/test_327_B create mode 100644 bottleneck/tests/data/test_328_A create mode 100644 bottleneck/tests/data/test_328_B create mode 100644 bottleneck/tests/data/test_329_A create mode 100644 bottleneck/tests/data/test_329_B create mode 100644 bottleneck/tests/data/test_330_A create mode 100644 bottleneck/tests/data/test_330_B create mode 100644 bottleneck/tests/data/test_331_A create mode 100644 bottleneck/tests/data/test_331_B create mode 100644 bottleneck/tests/data/test_332_A create mode 100644 bottleneck/tests/data/test_332_B create mode 100644 bottleneck/tests/data/test_333_A create mode 100644 bottleneck/tests/data/test_333_B create mode 100644 bottleneck/tests/data/test_334_A create mode 100644 bottleneck/tests/data/test_334_B create mode 100644 bottleneck/tests/data/test_335_A create mode 100644 bottleneck/tests/data/test_335_B create mode 100644 bottleneck/tests/data/test_336_A create mode 100644 bottleneck/tests/data/test_336_B create mode 100644 bottleneck/tests/data/test_337_A create mode 100644 bottleneck/tests/data/test_337_B create mode 100644 bottleneck/tests/data/test_338_A create mode 100644 bottleneck/tests/data/test_338_B create mode 100644 bottleneck/tests/data/test_339_A create mode 100644 bottleneck/tests/data/test_339_B create mode 100644 bottleneck/tests/data/test_340_A create mode 100644 bottleneck/tests/data/test_340_B create mode 100644 bottleneck/tests/data/test_341_A create mode 100644 bottleneck/tests/data/test_341_B create mode 100644 bottleneck/tests/data/test_342_A create mode 100644 bottleneck/tests/data/test_342_B create mode 100644 bottleneck/tests/data/test_343_A create mode 100644 bottleneck/tests/data/test_343_B create mode 100644 bottleneck/tests/data/test_344_A create mode 100644 bottleneck/tests/data/test_344_B create mode 100644 bottleneck/tests/data/test_345_A create mode 100644 bottleneck/tests/data/test_345_B create mode 100644 bottleneck/tests/data/test_346_A create mode 100644 bottleneck/tests/data/test_346_B create mode 100644 bottleneck/tests/data/test_347_A create mode 100644 bottleneck/tests/data/test_347_B create mode 100644 bottleneck/tests/data/test_348_A create mode 100644 bottleneck/tests/data/test_348_B create mode 100644 bottleneck/tests/data/test_349_A create mode 100644 bottleneck/tests/data/test_349_B create mode 100644 bottleneck/tests/data/test_350_A create mode 100644 bottleneck/tests/data/test_350_B create mode 100644 bottleneck/tests/data/test_351_A create mode 100644 bottleneck/tests/data/test_351_B create mode 100644 bottleneck/tests/data/test_352_A create mode 100644 bottleneck/tests/data/test_352_B create mode 100644 bottleneck/tests/data/test_353_A create mode 100644 bottleneck/tests/data/test_353_B create mode 100644 bottleneck/tests/data/test_354_A create mode 100644 bottleneck/tests/data/test_354_B create mode 100644 bottleneck/tests/data/test_355_A create mode 100644 bottleneck/tests/data/test_355_B create mode 100644 bottleneck/tests/data/test_356_A create mode 100644 bottleneck/tests/data/test_356_B create mode 100644 bottleneck/tests/data/test_357_A create mode 100644 bottleneck/tests/data/test_357_B create mode 100644 bottleneck/tests/data/test_358_A create mode 100644 bottleneck/tests/data/test_358_B create mode 100644 bottleneck/tests/data/test_359_A create mode 100644 bottleneck/tests/data/test_359_B create mode 100644 bottleneck/tests/data/test_360_A create mode 100644 bottleneck/tests/data/test_360_B create mode 100644 bottleneck/tests/data/test_361_A create mode 100644 bottleneck/tests/data/test_361_B create mode 100644 bottleneck/tests/data/test_362_A create mode 100644 bottleneck/tests/data/test_362_B create mode 100644 bottleneck/tests/data/test_363_A create mode 100644 bottleneck/tests/data/test_363_B create mode 100644 bottleneck/tests/data/test_364_A create mode 100644 bottleneck/tests/data/test_364_B create mode 100644 bottleneck/tests/data/test_365_A create mode 100644 bottleneck/tests/data/test_365_B create mode 100644 bottleneck/tests/data/test_366_A create mode 100644 bottleneck/tests/data/test_366_B create mode 100644 bottleneck/tests/data/test_367_A create mode 100644 bottleneck/tests/data/test_367_B create mode 100644 bottleneck/tests/data/test_368_A create mode 100644 bottleneck/tests/data/test_368_B create mode 100644 bottleneck/tests/data/test_369_A create mode 100644 bottleneck/tests/data/test_369_B create mode 100644 bottleneck/tests/data/test_370_A create mode 100644 bottleneck/tests/data/test_370_B create mode 100644 bottleneck/tests/data/test_371_A create mode 100644 bottleneck/tests/data/test_371_B create mode 100644 bottleneck/tests/data/test_372_A create mode 100644 bottleneck/tests/data/test_372_B create mode 100644 bottleneck/tests/data/test_373_A create mode 100644 bottleneck/tests/data/test_373_B create mode 100644 bottleneck/tests/data/test_374_A create mode 100644 bottleneck/tests/data/test_374_B create mode 100644 bottleneck/tests/data/test_375_A create mode 100644 bottleneck/tests/data/test_375_B create mode 100644 bottleneck/tests/data/test_376_A create mode 100644 bottleneck/tests/data/test_376_B create mode 100644 bottleneck/tests/data/test_377_A create mode 100644 bottleneck/tests/data/test_377_B create mode 100644 bottleneck/tests/data/test_378_A create mode 100644 bottleneck/tests/data/test_378_B create mode 100644 bottleneck/tests/data/test_379_A create mode 100644 bottleneck/tests/data/test_379_B create mode 100644 bottleneck/tests/data/test_380_A create mode 100644 bottleneck/tests/data/test_380_B create mode 100644 bottleneck/tests/data/test_381_A create mode 100644 bottleneck/tests/data/test_381_B create mode 100644 bottleneck/tests/data/test_382_A create mode 100644 bottleneck/tests/data/test_382_B create mode 100644 bottleneck/tests/data/test_383_A create mode 100644 bottleneck/tests/data/test_383_B create mode 100644 bottleneck/tests/data/test_384_A create mode 100644 bottleneck/tests/data/test_384_B create mode 100644 bottleneck/tests/data/test_385_A create mode 100644 bottleneck/tests/data/test_385_B create mode 100644 bottleneck/tests/data/test_386_A create mode 100644 bottleneck/tests/data/test_386_B create mode 100644 bottleneck/tests/data/test_387_A create mode 100644 bottleneck/tests/data/test_387_B create mode 100644 bottleneck/tests/data/test_388_A create mode 100644 bottleneck/tests/data/test_388_B create mode 100644 bottleneck/tests/data/test_389_A create mode 100644 bottleneck/tests/data/test_389_B create mode 100644 bottleneck/tests/data/test_390_A create mode 100644 bottleneck/tests/data/test_390_B create mode 100644 bottleneck/tests/data/test_391_A create mode 100644 bottleneck/tests/data/test_391_B create mode 100644 bottleneck/tests/data/test_392_A create mode 100644 bottleneck/tests/data/test_392_B create mode 100644 bottleneck/tests/data/test_393_A create mode 100644 bottleneck/tests/data/test_393_B create mode 100644 bottleneck/tests/data/test_394_A create mode 100644 bottleneck/tests/data/test_394_B create mode 100644 bottleneck/tests/data/test_395_A create mode 100644 bottleneck/tests/data/test_395_B create mode 100644 bottleneck/tests/data/test_396_A create mode 100644 bottleneck/tests/data/test_396_B create mode 100644 bottleneck/tests/data/test_397_A create mode 100644 bottleneck/tests/data/test_397_B create mode 100644 bottleneck/tests/data/test_398_A create mode 100644 bottleneck/tests/data/test_398_B create mode 100644 bottleneck/tests/data/test_399_A create mode 100644 bottleneck/tests/data/test_399_B create mode 100644 bottleneck/tests/data/test_400_A create mode 100644 bottleneck/tests/data/test_400_B create mode 100644 bottleneck/tests/data/test_401_A create mode 100644 bottleneck/tests/data/test_401_B create mode 100644 bottleneck/tests/data/test_402_A create mode 100644 bottleneck/tests/data/test_402_B create mode 100644 bottleneck/tests/data/test_403_A create mode 100644 bottleneck/tests/data/test_403_B create mode 100644 bottleneck/tests/data/test_404_A create mode 100644 bottleneck/tests/data/test_404_B create mode 100644 bottleneck/tests/data/test_405_A create mode 100644 bottleneck/tests/data/test_405_B create mode 100644 bottleneck/tests/data/test_406_A create mode 100644 bottleneck/tests/data/test_406_B create mode 100644 bottleneck/tests/data/test_407_A create mode 100644 bottleneck/tests/data/test_407_B create mode 100644 bottleneck/tests/data/test_408_A create mode 100644 bottleneck/tests/data/test_408_B create mode 100644 bottleneck/tests/data/test_409_A create mode 100644 bottleneck/tests/data/test_409_B create mode 100644 bottleneck/tests/data/test_410_A create mode 100644 bottleneck/tests/data/test_410_B create mode 100644 bottleneck/tests/data/test_411_A create mode 100644 bottleneck/tests/data/test_411_B create mode 100644 bottleneck/tests/data/test_412_A create mode 100644 bottleneck/tests/data/test_412_B create mode 100644 bottleneck/tests/data/test_413_A create mode 100644 bottleneck/tests/data/test_413_B create mode 100644 bottleneck/tests/data/test_414_A create mode 100644 bottleneck/tests/data/test_414_B create mode 100644 bottleneck/tests/data/test_415_A create mode 100644 bottleneck/tests/data/test_415_B create mode 100644 bottleneck/tests/data/test_416_A create mode 100644 bottleneck/tests/data/test_416_B create mode 100644 bottleneck/tests/data/test_417_A create mode 100644 bottleneck/tests/data/test_417_B create mode 100644 bottleneck/tests/data/test_418_A create mode 100644 bottleneck/tests/data/test_418_B create mode 100644 bottleneck/tests/data/test_419_A create mode 100644 bottleneck/tests/data/test_419_B create mode 100644 bottleneck/tests/data/test_420_A create mode 100644 bottleneck/tests/data/test_420_B create mode 100644 bottleneck/tests/data/test_421_A create mode 100644 bottleneck/tests/data/test_421_B create mode 100644 bottleneck/tests/data/test_422_A create mode 100644 bottleneck/tests/data/test_422_B create mode 100644 bottleneck/tests/data/test_423_A create mode 100644 bottleneck/tests/data/test_423_B create mode 100644 bottleneck/tests/data/test_424_A create mode 100644 bottleneck/tests/data/test_424_B create mode 100644 bottleneck/tests/data/test_425_A create mode 100644 bottleneck/tests/data/test_425_B create mode 100644 bottleneck/tests/data/test_426_A create mode 100644 bottleneck/tests/data/test_426_B create mode 100644 bottleneck/tests/data/test_427_A create mode 100644 bottleneck/tests/data/test_427_B create mode 100644 bottleneck/tests/data/test_428_A create mode 100644 bottleneck/tests/data/test_428_B create mode 100644 bottleneck/tests/data/test_429_A create mode 100644 bottleneck/tests/data/test_429_B create mode 100644 bottleneck/tests/data/test_430_A create mode 100644 bottleneck/tests/data/test_430_B create mode 100644 bottleneck/tests/data/test_431_A create mode 100644 bottleneck/tests/data/test_431_B create mode 100644 bottleneck/tests/data/test_432_A create mode 100644 bottleneck/tests/data/test_432_B create mode 100644 bottleneck/tests/data/test_433_A create mode 100644 bottleneck/tests/data/test_433_B create mode 100644 bottleneck/tests/data/test_434_A create mode 100644 bottleneck/tests/data/test_434_B create mode 100644 bottleneck/tests/data/test_435_A create mode 100644 bottleneck/tests/data/test_435_B create mode 100644 bottleneck/tests/data/test_436_A create mode 100644 bottleneck/tests/data/test_436_B create mode 100644 bottleneck/tests/data/test_437_A create mode 100644 bottleneck/tests/data/test_437_B create mode 100644 bottleneck/tests/data/test_438_A create mode 100644 bottleneck/tests/data/test_438_B create mode 100644 bottleneck/tests/data/test_439_A create mode 100644 bottleneck/tests/data/test_439_B create mode 100644 bottleneck/tests/data/test_440_A create mode 100644 bottleneck/tests/data/test_440_B create mode 100644 bottleneck/tests/data/test_441_A create mode 100644 bottleneck/tests/data/test_441_B create mode 100644 bottleneck/tests/data/test_442_A create mode 100644 bottleneck/tests/data/test_442_B create mode 100644 bottleneck/tests/data/test_443_A create mode 100644 bottleneck/tests/data/test_443_B create mode 100644 bottleneck/tests/data/test_444_A create mode 100644 bottleneck/tests/data/test_444_B create mode 100644 bottleneck/tests/data/test_445_A create mode 100644 bottleneck/tests/data/test_445_B create mode 100644 bottleneck/tests/data/test_446_A create mode 100644 bottleneck/tests/data/test_446_B create mode 100644 bottleneck/tests/data/test_447_A create mode 100644 bottleneck/tests/data/test_447_B create mode 100644 bottleneck/tests/data/test_448_A create mode 100644 bottleneck/tests/data/test_448_B create mode 100644 bottleneck/tests/data/test_449_A create mode 100644 bottleneck/tests/data/test_449_B create mode 100644 bottleneck/tests/data/test_450_A create mode 100644 bottleneck/tests/data/test_450_B create mode 100644 bottleneck/tests/data/test_451_A create mode 100644 bottleneck/tests/data/test_451_B create mode 100644 bottleneck/tests/data/test_452_A create mode 100644 bottleneck/tests/data/test_452_B create mode 100644 bottleneck/tests/data/test_453_A create mode 100644 bottleneck/tests/data/test_453_B create mode 100644 bottleneck/tests/data/test_454_A create mode 100644 bottleneck/tests/data/test_454_B create mode 100644 bottleneck/tests/data/test_455_A create mode 100644 bottleneck/tests/data/test_455_B create mode 100644 bottleneck/tests/data/test_456_A create mode 100644 bottleneck/tests/data/test_456_B create mode 100644 bottleneck/tests/data/test_457_A create mode 100644 bottleneck/tests/data/test_457_B create mode 100644 bottleneck/tests/data/test_458_A create mode 100644 bottleneck/tests/data/test_458_B create mode 100644 bottleneck/tests/data/test_459_A create mode 100644 bottleneck/tests/data/test_459_B create mode 100644 bottleneck/tests/data/test_460_A create mode 100644 bottleneck/tests/data/test_460_B create mode 100644 bottleneck/tests/data/test_461_A create mode 100644 bottleneck/tests/data/test_461_B create mode 100644 bottleneck/tests/data/test_462_A create mode 100644 bottleneck/tests/data/test_462_B create mode 100644 bottleneck/tests/data/test_463_A create mode 100644 bottleneck/tests/data/test_463_B create mode 100644 bottleneck/tests/data/test_464_A create mode 100644 bottleneck/tests/data/test_464_B create mode 100644 bottleneck/tests/data/test_465_A create mode 100644 bottleneck/tests/data/test_465_B create mode 100644 bottleneck/tests/data/test_466_A create mode 100644 bottleneck/tests/data/test_466_B create mode 100644 bottleneck/tests/data/test_467_A create mode 100644 bottleneck/tests/data/test_467_B create mode 100644 bottleneck/tests/data/test_468_A create mode 100644 bottleneck/tests/data/test_468_B create mode 100644 bottleneck/tests/data/test_469_A create mode 100644 bottleneck/tests/data/test_469_B create mode 100644 bottleneck/tests/data/test_470_A create mode 100644 bottleneck/tests/data/test_470_B create mode 100644 bottleneck/tests/data/test_471_A create mode 100644 bottleneck/tests/data/test_471_B create mode 100644 bottleneck/tests/data/test_472_A create mode 100644 bottleneck/tests/data/test_472_B create mode 100644 bottleneck/tests/data/test_473_A create mode 100644 bottleneck/tests/data/test_473_B create mode 100644 bottleneck/tests/data/test_474_A create mode 100644 bottleneck/tests/data/test_474_B create mode 100644 bottleneck/tests/data/test_475_A create mode 100644 bottleneck/tests/data/test_475_B create mode 100644 bottleneck/tests/data/test_476_A create mode 100644 bottleneck/tests/data/test_476_B create mode 100644 bottleneck/tests/data/test_477_A create mode 100644 bottleneck/tests/data/test_477_B create mode 100644 bottleneck/tests/data/test_478_A create mode 100644 bottleneck/tests/data/test_478_B create mode 100644 bottleneck/tests/data/test_479_A create mode 100644 bottleneck/tests/data/test_479_B create mode 100644 bottleneck/tests/data/test_480_A create mode 100644 bottleneck/tests/data/test_480_B create mode 100644 bottleneck/tests/data/test_481_A create mode 100644 bottleneck/tests/data/test_481_B create mode 100644 bottleneck/tests/data/test_482_A create mode 100644 bottleneck/tests/data/test_482_B create mode 100644 bottleneck/tests/data/test_483_A create mode 100644 bottleneck/tests/data/test_483_B create mode 100644 bottleneck/tests/data/test_484_A create mode 100644 bottleneck/tests/data/test_484_B create mode 100644 bottleneck/tests/data/test_485_A create mode 100644 bottleneck/tests/data/test_485_B create mode 100644 bottleneck/tests/data/test_486_A create mode 100644 bottleneck/tests/data/test_486_B create mode 100644 bottleneck/tests/data/test_487_A create mode 100644 bottleneck/tests/data/test_487_B create mode 100644 bottleneck/tests/data/test_488_A create mode 100644 bottleneck/tests/data/test_488_B create mode 100644 bottleneck/tests/data/test_489_A create mode 100644 bottleneck/tests/data/test_489_B create mode 100644 bottleneck/tests/data/test_490_A create mode 100644 bottleneck/tests/data/test_490_B create mode 100644 bottleneck/tests/data/test_491_A create mode 100644 bottleneck/tests/data/test_491_B create mode 100644 bottleneck/tests/data/test_492_A create mode 100644 bottleneck/tests/data/test_492_B create mode 100644 bottleneck/tests/data/test_493_A create mode 100644 bottleneck/tests/data/test_493_B create mode 100644 bottleneck/tests/data/test_494_A create mode 100644 bottleneck/tests/data/test_494_B create mode 100644 bottleneck/tests/data/test_495_A create mode 100644 bottleneck/tests/data/test_495_B create mode 100644 bottleneck/tests/data/test_496_A create mode 100644 bottleneck/tests/data/test_496_B create mode 100644 bottleneck/tests/data/test_497_A create mode 100644 bottleneck/tests/data/test_497_B create mode 100644 bottleneck/tests/data/test_498_A create mode 100644 bottleneck/tests/data/test_498_B create mode 100644 bottleneck/tests/data/test_499_A create mode 100644 bottleneck/tests/data/test_499_B create mode 100644 bottleneck/tests/data/test_500_A create mode 100644 bottleneck/tests/data/test_500_B create mode 100644 bottleneck/tests/data/test_501_A create mode 100644 bottleneck/tests/data/test_501_B create mode 100644 bottleneck/tests/data/test_502_A create mode 100644 bottleneck/tests/data/test_502_B create mode 100644 bottleneck/tests/data/test_503_A create mode 100644 bottleneck/tests/data/test_503_B create mode 100644 bottleneck/tests/data/test_504_A create mode 100644 bottleneck/tests/data/test_504_B create mode 100644 bottleneck/tests/data/test_505_A create mode 100644 bottleneck/tests/data/test_505_B create mode 100644 bottleneck/tests/data/test_506_A create mode 100644 bottleneck/tests/data/test_506_B create mode 100644 bottleneck/tests/data/test_507_A create mode 100644 bottleneck/tests/data/test_507_B create mode 100644 bottleneck/tests/data/test_508_A create mode 100644 bottleneck/tests/data/test_508_B create mode 100644 bottleneck/tests/data/test_509_A create mode 100644 bottleneck/tests/data/test_509_B create mode 100644 bottleneck/tests/data/test_510_A create mode 100644 bottleneck/tests/data/test_510_B create mode 100644 bottleneck/tests/data/test_511_A create mode 100644 bottleneck/tests/data/test_511_B create mode 100644 bottleneck/tests/data/test_512_A create mode 100644 bottleneck/tests/data/test_512_B create mode 100644 bottleneck/tests/data/test_513_A create mode 100644 bottleneck/tests/data/test_513_B create mode 100644 bottleneck/tests/data/test_514_A create mode 100644 bottleneck/tests/data/test_514_B create mode 100644 bottleneck/tests/data/test_515_A create mode 100644 bottleneck/tests/data/test_515_B create mode 100644 bottleneck/tests/data/test_516_A create mode 100644 bottleneck/tests/data/test_516_B create mode 100644 bottleneck/tests/data/test_517_A create mode 100644 bottleneck/tests/data/test_517_B create mode 100644 bottleneck/tests/data/test_518_A create mode 100644 bottleneck/tests/data/test_518_B create mode 100644 bottleneck/tests/data/test_519_A create mode 100644 bottleneck/tests/data/test_519_B create mode 100644 bottleneck/tests/data/test_520_A create mode 100644 bottleneck/tests/data/test_520_B create mode 100644 bottleneck/tests/data/test_521_A create mode 100644 bottleneck/tests/data/test_521_B create mode 100644 bottleneck/tests/data/test_522_A create mode 100644 bottleneck/tests/data/test_522_B create mode 100644 bottleneck/tests/data/test_523_A create mode 100644 bottleneck/tests/data/test_523_B create mode 100644 bottleneck/tests/data/test_524_A create mode 100644 bottleneck/tests/data/test_524_B create mode 100644 bottleneck/tests/data/test_525_A create mode 100644 bottleneck/tests/data/test_525_B create mode 100644 bottleneck/tests/data/test_526_A create mode 100644 bottleneck/tests/data/test_526_B create mode 100644 bottleneck/tests/data/test_527_A create mode 100644 bottleneck/tests/data/test_527_B create mode 100644 bottleneck/tests/data/test_528_A create mode 100644 bottleneck/tests/data/test_528_B create mode 100644 bottleneck/tests/data/test_529_A create mode 100644 bottleneck/tests/data/test_529_B create mode 100644 bottleneck/tests/data/test_530_A create mode 100644 bottleneck/tests/data/test_530_B create mode 100644 bottleneck/tests/data/test_531_A create mode 100644 bottleneck/tests/data/test_531_B create mode 100644 bottleneck/tests/data/test_532_A create mode 100644 bottleneck/tests/data/test_532_B create mode 100644 bottleneck/tests/data/test_533_A create mode 100644 bottleneck/tests/data/test_533_B create mode 100644 bottleneck/tests/data/test_534_A create mode 100644 bottleneck/tests/data/test_534_B create mode 100644 bottleneck/tests/data/test_535_A create mode 100644 bottleneck/tests/data/test_535_B create mode 100644 bottleneck/tests/data/test_536_A create mode 100644 bottleneck/tests/data/test_536_B create mode 100644 bottleneck/tests/data/test_537_A create mode 100644 bottleneck/tests/data/test_537_B create mode 100644 bottleneck/tests/data/test_538_A create mode 100644 bottleneck/tests/data/test_538_B create mode 100644 bottleneck/tests/data/test_539_A create mode 100644 bottleneck/tests/data/test_539_B create mode 100644 bottleneck/tests/data/test_540_A create mode 100644 bottleneck/tests/data/test_540_B create mode 100644 bottleneck/tests/data/test_541_A create mode 100644 bottleneck/tests/data/test_541_B create mode 100644 bottleneck/tests/data/test_542_A create mode 100644 bottleneck/tests/data/test_542_B create mode 100644 bottleneck/tests/data/test_543_A create mode 100644 bottleneck/tests/data/test_543_B create mode 100644 bottleneck/tests/data/test_544_A create mode 100644 bottleneck/tests/data/test_544_B create mode 100644 bottleneck/tests/data/test_545_A create mode 100644 bottleneck/tests/data/test_545_B create mode 100644 bottleneck/tests/data/test_546_A create mode 100644 bottleneck/tests/data/test_546_B create mode 100644 bottleneck/tests/data/test_547_A create mode 100644 bottleneck/tests/data/test_547_B create mode 100644 bottleneck/tests/data/test_548_A create mode 100644 bottleneck/tests/data/test_548_B create mode 100644 bottleneck/tests/data/test_549_A create mode 100644 bottleneck/tests/data/test_549_B create mode 100644 bottleneck/tests/data/test_550_A create mode 100644 bottleneck/tests/data/test_550_B create mode 100644 bottleneck/tests/data/test_551_A create mode 100644 bottleneck/tests/data/test_551_B create mode 100644 bottleneck/tests/data/test_552_A create mode 100644 bottleneck/tests/data/test_552_B create mode 100644 bottleneck/tests/data/test_553_A create mode 100644 bottleneck/tests/data/test_553_B create mode 100644 bottleneck/tests/data/test_554_A create mode 100644 bottleneck/tests/data/test_554_B create mode 100644 bottleneck/tests/data/test_555_A create mode 100644 bottleneck/tests/data/test_555_B create mode 100644 bottleneck/tests/data/test_556_A create mode 100644 bottleneck/tests/data/test_556_B create mode 100644 bottleneck/tests/data/test_557_A create mode 100644 bottleneck/tests/data/test_557_B create mode 100644 bottleneck/tests/data/test_558_A create mode 100644 bottleneck/tests/data/test_558_B create mode 100644 bottleneck/tests/data/test_559_A create mode 100644 bottleneck/tests/data/test_559_B create mode 100644 bottleneck/tests/data/test_560_A create mode 100644 bottleneck/tests/data/test_560_B create mode 100644 bottleneck/tests/data/test_561_A create mode 100644 bottleneck/tests/data/test_561_B create mode 100644 bottleneck/tests/data/test_562_A create mode 100644 bottleneck/tests/data/test_562_B create mode 100644 bottleneck/tests/data/test_563_A create mode 100644 bottleneck/tests/data/test_563_B create mode 100644 bottleneck/tests/data/test_564_A create mode 100644 bottleneck/tests/data/test_564_B create mode 100644 bottleneck/tests/data/test_565_A create mode 100644 bottleneck/tests/data/test_565_B create mode 100644 bottleneck/tests/data/test_566_A create mode 100644 bottleneck/tests/data/test_566_B create mode 100644 bottleneck/tests/data/test_567_A create mode 100644 bottleneck/tests/data/test_567_B create mode 100644 bottleneck/tests/data/test_568_A create mode 100644 bottleneck/tests/data/test_568_B create mode 100644 bottleneck/tests/data/test_569_A create mode 100644 bottleneck/tests/data/test_569_B create mode 100644 bottleneck/tests/data/test_570_A create mode 100644 bottleneck/tests/data/test_570_B create mode 100644 bottleneck/tests/data/test_571_A create mode 100644 bottleneck/tests/data/test_571_B create mode 100644 bottleneck/tests/data/test_572_A create mode 100644 bottleneck/tests/data/test_572_B create mode 100644 bottleneck/tests/data/test_573_A create mode 100644 bottleneck/tests/data/test_573_B create mode 100644 bottleneck/tests/data/test_574_A create mode 100644 bottleneck/tests/data/test_574_B create mode 100644 bottleneck/tests/data/test_575_A create mode 100644 bottleneck/tests/data/test_575_B create mode 100644 bottleneck/tests/data/test_576_A create mode 100644 bottleneck/tests/data/test_576_B create mode 100644 bottleneck/tests/data/test_577_A create mode 100644 bottleneck/tests/data/test_577_B create mode 100644 bottleneck/tests/data/test_578_A create mode 100644 bottleneck/tests/data/test_578_B create mode 100644 bottleneck/tests/data/test_579_A create mode 100644 bottleneck/tests/data/test_579_B create mode 100644 bottleneck/tests/data/test_580_A create mode 100644 bottleneck/tests/data/test_580_B create mode 100644 bottleneck/tests/data/test_581_A create mode 100644 bottleneck/tests/data/test_581_B create mode 100644 bottleneck/tests/data/test_582_A create mode 100644 bottleneck/tests/data/test_582_B create mode 100644 bottleneck/tests/data/test_583_A create mode 100644 bottleneck/tests/data/test_583_B create mode 100644 bottleneck/tests/data/test_584_A create mode 100644 bottleneck/tests/data/test_584_B create mode 100644 bottleneck/tests/data/test_585_A create mode 100644 bottleneck/tests/data/test_585_B create mode 100644 bottleneck/tests/data/test_586_A create mode 100644 bottleneck/tests/data/test_586_B create mode 100644 bottleneck/tests/data/test_587_A create mode 100644 bottleneck/tests/data/test_587_B create mode 100644 bottleneck/tests/data/test_588_A create mode 100644 bottleneck/tests/data/test_588_B create mode 100644 bottleneck/tests/data/test_589_A create mode 100644 bottleneck/tests/data/test_589_B create mode 100644 bottleneck/tests/data/test_590_A create mode 100644 bottleneck/tests/data/test_590_B create mode 100644 bottleneck/tests/data/test_591_A create mode 100644 bottleneck/tests/data/test_591_B create mode 100644 bottleneck/tests/data/test_592_A create mode 100644 bottleneck/tests/data/test_592_B create mode 100644 bottleneck/tests/data/test_593_A create mode 100644 bottleneck/tests/data/test_593_B create mode 100644 bottleneck/tests/data/test_594_A create mode 100644 bottleneck/tests/data/test_594_B create mode 100644 bottleneck/tests/data/test_595_A create mode 100644 bottleneck/tests/data/test_595_B create mode 100644 bottleneck/tests/data/test_596_A create mode 100644 bottleneck/tests/data/test_596_B create mode 100644 bottleneck/tests/data/test_597_A create mode 100644 bottleneck/tests/data/test_597_B create mode 100644 bottleneck/tests/data/test_598_A create mode 100644 bottleneck/tests/data/test_598_B create mode 100644 bottleneck/tests/data/test_599_A create mode 100644 bottleneck/tests/data/test_599_B create mode 100644 bottleneck/tests/data/test_600_A create mode 100644 bottleneck/tests/data/test_600_B create mode 100644 bottleneck/tests/data/test_601_A create mode 100644 bottleneck/tests/data/test_601_B create mode 100644 bottleneck/tests/data/test_602_A create mode 100644 bottleneck/tests/data/test_602_B create mode 100644 bottleneck/tests/data/test_603_A create mode 100644 bottleneck/tests/data/test_603_B create mode 100644 bottleneck/tests/data/test_604_A create mode 100644 bottleneck/tests/data/test_604_B create mode 100644 bottleneck/tests/data/test_605_A create mode 100644 bottleneck/tests/data/test_605_B create mode 100644 bottleneck/tests/data/test_606_A create mode 100644 bottleneck/tests/data/test_606_B create mode 100644 bottleneck/tests/data/test_607_A create mode 100644 bottleneck/tests/data/test_607_B create mode 100644 bottleneck/tests/data/test_608_A create mode 100644 bottleneck/tests/data/test_608_B create mode 100644 bottleneck/tests/data/test_609_A create mode 100644 bottleneck/tests/data/test_609_B create mode 100644 bottleneck/tests/data/test_610_A create mode 100644 bottleneck/tests/data/test_610_B create mode 100644 bottleneck/tests/data/test_611_A create mode 100644 bottleneck/tests/data/test_611_B create mode 100644 bottleneck/tests/data/test_612_A create mode 100644 bottleneck/tests/data/test_612_B create mode 100644 bottleneck/tests/data/test_613_A create mode 100644 bottleneck/tests/data/test_613_B create mode 100644 bottleneck/tests/data/test_614_A create mode 100644 bottleneck/tests/data/test_614_B create mode 100644 bottleneck/tests/data/test_615_A create mode 100644 bottleneck/tests/data/test_615_B create mode 100644 bottleneck/tests/data/test_616_A create mode 100644 bottleneck/tests/data/test_616_B create mode 100644 bottleneck/tests/data/test_617_A create mode 100644 bottleneck/tests/data/test_617_B create mode 100644 bottleneck/tests/data/test_618_A create mode 100644 bottleneck/tests/data/test_618_B create mode 100644 bottleneck/tests/data/test_619_A create mode 100644 bottleneck/tests/data/test_619_B create mode 100644 bottleneck/tests/data/test_620_A create mode 100644 bottleneck/tests/data/test_620_B create mode 100644 bottleneck/tests/data/test_621_A create mode 100644 bottleneck/tests/data/test_621_B create mode 100644 bottleneck/tests/data/test_622_A create mode 100644 bottleneck/tests/data/test_622_B create mode 100644 bottleneck/tests/data/test_623_A create mode 100644 bottleneck/tests/data/test_623_B create mode 100644 bottleneck/tests/data/test_624_A create mode 100644 bottleneck/tests/data/test_624_B create mode 100644 bottleneck/tests/data/test_625_A create mode 100644 bottleneck/tests/data/test_625_B create mode 100644 bottleneck/tests/data/test_626_A create mode 100644 bottleneck/tests/data/test_626_B create mode 100644 bottleneck/tests/data/test_627_A create mode 100644 bottleneck/tests/data/test_627_B create mode 100644 bottleneck/tests/data/test_628_A create mode 100644 bottleneck/tests/data/test_628_B create mode 100644 bottleneck/tests/data/test_629_A create mode 100644 bottleneck/tests/data/test_629_B create mode 100644 bottleneck/tests/data/test_630_A create mode 100644 bottleneck/tests/data/test_630_B create mode 100644 bottleneck/tests/data/test_631_A create mode 100644 bottleneck/tests/data/test_631_B create mode 100644 bottleneck/tests/data/test_632_A create mode 100644 bottleneck/tests/data/test_632_B create mode 100644 bottleneck/tests/data/test_633_A create mode 100644 bottleneck/tests/data/test_633_B create mode 100644 bottleneck/tests/data/test_634_A create mode 100644 bottleneck/tests/data/test_634_B create mode 100644 bottleneck/tests/data/test_635_A create mode 100644 bottleneck/tests/data/test_635_B create mode 100644 bottleneck/tests/data/test_636_A create mode 100644 bottleneck/tests/data/test_636_B create mode 100644 bottleneck/tests/data/test_637_A create mode 100644 bottleneck/tests/data/test_637_B create mode 100644 bottleneck/tests/data/test_638_A create mode 100644 bottleneck/tests/data/test_638_B create mode 100644 bottleneck/tests/data/test_639_A create mode 100644 bottleneck/tests/data/test_639_B create mode 100644 bottleneck/tests/data/test_640_A create mode 100644 bottleneck/tests/data/test_640_B create mode 100644 bottleneck/tests/data/test_641_A create mode 100644 bottleneck/tests/data/test_641_B create mode 100644 bottleneck/tests/data/test_642_A create mode 100644 bottleneck/tests/data/test_642_B create mode 100644 bottleneck/tests/data/test_643_A create mode 100644 bottleneck/tests/data/test_643_B create mode 100644 bottleneck/tests/data/test_644_A create mode 100644 bottleneck/tests/data/test_644_B create mode 100644 bottleneck/tests/data/test_645_A create mode 100644 bottleneck/tests/data/test_645_B create mode 100644 bottleneck/tests/data/test_646_A create mode 100644 bottleneck/tests/data/test_646_B create mode 100644 bottleneck/tests/data/test_647_A create mode 100644 bottleneck/tests/data/test_647_B create mode 100644 bottleneck/tests/data/test_648_A create mode 100644 bottleneck/tests/data/test_648_B create mode 100644 bottleneck/tests/data/test_649_A create mode 100644 bottleneck/tests/data/test_649_B create mode 100644 bottleneck/tests/data/test_650_A create mode 100644 bottleneck/tests/data/test_650_B create mode 100644 bottleneck/tests/data/test_651_A create mode 100644 bottleneck/tests/data/test_651_B create mode 100644 bottleneck/tests/data/test_652_A create mode 100644 bottleneck/tests/data/test_652_B create mode 100644 bottleneck/tests/data/test_653_A create mode 100644 bottleneck/tests/data/test_653_B create mode 100644 bottleneck/tests/data/test_654_A create mode 100644 bottleneck/tests/data/test_654_B create mode 100644 bottleneck/tests/data/test_655_A create mode 100644 bottleneck/tests/data/test_655_B create mode 100644 bottleneck/tests/data/test_656_A create mode 100644 bottleneck/tests/data/test_656_B create mode 100644 bottleneck/tests/data/test_657_A create mode 100644 bottleneck/tests/data/test_657_B create mode 100644 bottleneck/tests/data/test_658_A create mode 100644 bottleneck/tests/data/test_658_B create mode 100644 bottleneck/tests/data/test_659_A create mode 100644 bottleneck/tests/data/test_659_B create mode 100644 bottleneck/tests/data/test_660_A create mode 100644 bottleneck/tests/data/test_660_B create mode 100644 bottleneck/tests/data/test_661_A create mode 100644 bottleneck/tests/data/test_661_B create mode 100644 bottleneck/tests/data/test_662_A create mode 100644 bottleneck/tests/data/test_662_B create mode 100644 bottleneck/tests/data/test_663_A create mode 100644 bottleneck/tests/data/test_663_B create mode 100644 bottleneck/tests/data/test_664_A create mode 100644 bottleneck/tests/data/test_664_B create mode 100644 bottleneck/tests/data/test_665_A create mode 100644 bottleneck/tests/data/test_665_B create mode 100644 bottleneck/tests/data/test_666_A create mode 100644 bottleneck/tests/data/test_666_B create mode 100644 bottleneck/tests/data/test_667_A create mode 100644 bottleneck/tests/data/test_667_B create mode 100644 bottleneck/tests/data/test_668_A create mode 100644 bottleneck/tests/data/test_668_B create mode 100644 bottleneck/tests/data/test_669_A create mode 100644 bottleneck/tests/data/test_669_B create mode 100644 bottleneck/tests/data/test_670_A create mode 100644 bottleneck/tests/data/test_670_B create mode 100644 bottleneck/tests/data/test_671_A create mode 100644 bottleneck/tests/data/test_671_B create mode 100644 bottleneck/tests/data/test_672_A create mode 100644 bottleneck/tests/data/test_672_B create mode 100644 bottleneck/tests/data/test_673_A create mode 100644 bottleneck/tests/data/test_673_B create mode 100644 bottleneck/tests/data/test_674_A create mode 100644 bottleneck/tests/data/test_674_B create mode 100644 bottleneck/tests/data/test_675_A create mode 100644 bottleneck/tests/data/test_675_B create mode 100644 bottleneck/tests/data/test_676_A create mode 100644 bottleneck/tests/data/test_676_B create mode 100644 bottleneck/tests/data/test_677_A create mode 100644 bottleneck/tests/data/test_677_B create mode 100644 bottleneck/tests/data/test_678_A create mode 100644 bottleneck/tests/data/test_678_B create mode 100644 bottleneck/tests/data/test_679_A create mode 100644 bottleneck/tests/data/test_679_B create mode 100644 bottleneck/tests/data/test_680_A create mode 100644 bottleneck/tests/data/test_680_B create mode 100644 bottleneck/tests/data/test_681_A create mode 100644 bottleneck/tests/data/test_681_B create mode 100644 bottleneck/tests/data/test_682_A create mode 100644 bottleneck/tests/data/test_682_B create mode 100644 bottleneck/tests/data/test_683_A create mode 100644 bottleneck/tests/data/test_683_B create mode 100644 bottleneck/tests/data/test_684_A create mode 100644 bottleneck/tests/data/test_684_B create mode 100644 bottleneck/tests/data/test_685_A create mode 100644 bottleneck/tests/data/test_685_B create mode 100644 bottleneck/tests/data/test_686_A create mode 100644 bottleneck/tests/data/test_686_B create mode 100644 bottleneck/tests/data/test_687_A create mode 100644 bottleneck/tests/data/test_687_B create mode 100644 bottleneck/tests/data/test_688_A create mode 100644 bottleneck/tests/data/test_688_B create mode 100644 bottleneck/tests/data/test_689_A create mode 100644 bottleneck/tests/data/test_689_B create mode 100644 bottleneck/tests/data/test_690_A create mode 100644 bottleneck/tests/data/test_690_B create mode 100644 bottleneck/tests/data/test_691_A create mode 100644 bottleneck/tests/data/test_691_B create mode 100644 bottleneck/tests/data/test_692_A create mode 100644 bottleneck/tests/data/test_692_B create mode 100644 bottleneck/tests/data/test_693_A create mode 100644 bottleneck/tests/data/test_693_B create mode 100644 bottleneck/tests/data/test_694_A create mode 100644 bottleneck/tests/data/test_694_B create mode 100644 bottleneck/tests/data/test_695_A create mode 100644 bottleneck/tests/data/test_695_B create mode 100644 bottleneck/tests/data/test_696_A create mode 100644 bottleneck/tests/data/test_696_B create mode 100644 bottleneck/tests/data/test_697_A create mode 100644 bottleneck/tests/data/test_697_B create mode 100644 bottleneck/tests/data/test_698_A create mode 100644 bottleneck/tests/data/test_698_B create mode 100644 bottleneck/tests/data/test_699_A create mode 100644 bottleneck/tests/data/test_699_B create mode 100644 bottleneck/tests/data/test_700_A create mode 100644 bottleneck/tests/data/test_700_B create mode 100644 bottleneck/tests/data/test_701_A create mode 100644 bottleneck/tests/data/test_701_B create mode 100644 bottleneck/tests/data/test_702_A create mode 100644 bottleneck/tests/data/test_702_B create mode 100644 bottleneck/tests/data/test_703_A create mode 100644 bottleneck/tests/data/test_703_B create mode 100644 bottleneck/tests/data/test_704_A create mode 100644 bottleneck/tests/data/test_704_B create mode 100644 bottleneck/tests/data/test_705_A create mode 100644 bottleneck/tests/data/test_705_B create mode 100644 bottleneck/tests/data/test_706_A create mode 100644 bottleneck/tests/data/test_706_B create mode 100644 bottleneck/tests/data/test_707_A create mode 100644 bottleneck/tests/data/test_707_B create mode 100644 bottleneck/tests/data/test_708_A create mode 100644 bottleneck/tests/data/test_708_B create mode 100644 bottleneck/tests/data/test_709_A create mode 100644 bottleneck/tests/data/test_709_B create mode 100644 bottleneck/tests/data/test_710_A create mode 100644 bottleneck/tests/data/test_710_B create mode 100644 bottleneck/tests/data/test_711_A create mode 100644 bottleneck/tests/data/test_711_B create mode 100644 bottleneck/tests/data/test_712_A create mode 100644 bottleneck/tests/data/test_712_B create mode 100644 bottleneck/tests/data/test_713_A create mode 100644 bottleneck/tests/data/test_713_B create mode 100644 bottleneck/tests/data/test_714_A create mode 100644 bottleneck/tests/data/test_714_B create mode 100644 bottleneck/tests/data/test_715_A create mode 100644 bottleneck/tests/data/test_715_B create mode 100644 bottleneck/tests/data/test_716_A create mode 100644 bottleneck/tests/data/test_716_B create mode 100644 bottleneck/tests/data/test_717_A create mode 100644 bottleneck/tests/data/test_717_B create mode 100644 bottleneck/tests/data/test_718_A create mode 100644 bottleneck/tests/data/test_718_B create mode 100644 bottleneck/tests/data/test_719_A create mode 100644 bottleneck/tests/data/test_719_B create mode 100644 bottleneck/tests/data/test_720_A create mode 100644 bottleneck/tests/data/test_720_B create mode 100644 bottleneck/tests/data/test_721_A create mode 100644 bottleneck/tests/data/test_721_B create mode 100644 bottleneck/tests/data/test_722_A create mode 100644 bottleneck/tests/data/test_722_B create mode 100644 bottleneck/tests/data/test_723_A create mode 100644 bottleneck/tests/data/test_723_B create mode 100644 bottleneck/tests/data/test_724_A create mode 100644 bottleneck/tests/data/test_724_B create mode 100644 bottleneck/tests/data/test_725_A create mode 100644 bottleneck/tests/data/test_725_B create mode 100644 bottleneck/tests/data/test_726_A create mode 100644 bottleneck/tests/data/test_726_B create mode 100644 bottleneck/tests/data/test_727_A create mode 100644 bottleneck/tests/data/test_727_B create mode 100644 bottleneck/tests/data/test_728_A create mode 100644 bottleneck/tests/data/test_728_B create mode 100644 bottleneck/tests/data/test_729_A create mode 100644 bottleneck/tests/data/test_729_B create mode 100644 bottleneck/tests/data/test_730_A create mode 100644 bottleneck/tests/data/test_730_B create mode 100644 bottleneck/tests/data/test_731_A create mode 100644 bottleneck/tests/data/test_731_B create mode 100644 bottleneck/tests/data/test_732_A create mode 100644 bottleneck/tests/data/test_732_B create mode 100644 bottleneck/tests/data/test_733_A create mode 100644 bottleneck/tests/data/test_733_B create mode 100644 bottleneck/tests/data/test_734_A create mode 100644 bottleneck/tests/data/test_734_B create mode 100644 bottleneck/tests/data/test_735_A create mode 100644 bottleneck/tests/data/test_735_B create mode 100644 bottleneck/tests/data/test_736_A create mode 100644 bottleneck/tests/data/test_736_B create mode 100644 bottleneck/tests/data/test_737_A create mode 100644 bottleneck/tests/data/test_737_B create mode 100644 bottleneck/tests/data/test_738_A create mode 100644 bottleneck/tests/data/test_738_B create mode 100644 bottleneck/tests/data/test_739_A create mode 100644 bottleneck/tests/data/test_739_B create mode 100644 bottleneck/tests/data/test_740_A create mode 100644 bottleneck/tests/data/test_740_B create mode 100644 bottleneck/tests/data/test_741_A create mode 100644 bottleneck/tests/data/test_741_B create mode 100644 bottleneck/tests/data/test_742_A create mode 100644 bottleneck/tests/data/test_742_B create mode 100644 bottleneck/tests/data/test_743_A create mode 100644 bottleneck/tests/data/test_743_B create mode 100644 bottleneck/tests/data/test_744_A create mode 100644 bottleneck/tests/data/test_744_B create mode 100644 bottleneck/tests/data/test_745_A create mode 100644 bottleneck/tests/data/test_745_B create mode 100644 bottleneck/tests/data/test_746_A create mode 100644 bottleneck/tests/data/test_746_B create mode 100644 bottleneck/tests/data/test_747_A create mode 100644 bottleneck/tests/data/test_747_B create mode 100644 bottleneck/tests/data/test_748_A create mode 100644 bottleneck/tests/data/test_748_B create mode 100644 bottleneck/tests/data/test_749_A create mode 100644 bottleneck/tests/data/test_749_B create mode 100644 bottleneck/tests/data/test_750_A create mode 100644 bottleneck/tests/data/test_750_B create mode 100644 bottleneck/tests/data/test_751_A create mode 100644 bottleneck/tests/data/test_751_B create mode 100644 bottleneck/tests/data/test_752_A create mode 100644 bottleneck/tests/data/test_752_B create mode 100644 bottleneck/tests/data/test_753_A create mode 100644 bottleneck/tests/data/test_753_B create mode 100644 bottleneck/tests/data/test_754_A create mode 100644 bottleneck/tests/data/test_754_B create mode 100644 bottleneck/tests/data/test_755_A create mode 100644 bottleneck/tests/data/test_755_B create mode 100644 bottleneck/tests/data/test_756_A create mode 100644 bottleneck/tests/data/test_756_B create mode 100644 bottleneck/tests/data/test_757_A create mode 100644 bottleneck/tests/data/test_757_B create mode 100644 bottleneck/tests/data/test_758_A create mode 100644 bottleneck/tests/data/test_758_B create mode 100644 bottleneck/tests/data/test_759_A create mode 100644 bottleneck/tests/data/test_759_B create mode 100644 bottleneck/tests/data/test_760_A create mode 100644 bottleneck/tests/data/test_760_B create mode 100644 bottleneck/tests/data/test_761_A create mode 100644 bottleneck/tests/data/test_761_B create mode 100644 bottleneck/tests/data/test_762_A create mode 100644 bottleneck/tests/data/test_762_B create mode 100644 bottleneck/tests/data/test_763_A create mode 100644 bottleneck/tests/data/test_763_B create mode 100644 bottleneck/tests/data/test_764_A create mode 100644 bottleneck/tests/data/test_764_B create mode 100644 bottleneck/tests/data/test_765_A create mode 100644 bottleneck/tests/data/test_765_B create mode 100644 bottleneck/tests/data/test_766_A create mode 100644 bottleneck/tests/data/test_766_B create mode 100644 bottleneck/tests/data/test_767_A create mode 100644 bottleneck/tests/data/test_767_B create mode 100644 bottleneck/tests/data/test_768_A create mode 100644 bottleneck/tests/data/test_768_B create mode 100644 bottleneck/tests/data/test_769_A create mode 100644 bottleneck/tests/data/test_769_B create mode 100644 bottleneck/tests/data/test_770_A create mode 100644 bottleneck/tests/data/test_770_B create mode 100644 bottleneck/tests/data/test_771_A create mode 100644 bottleneck/tests/data/test_771_B create mode 100644 bottleneck/tests/data/test_772_A create mode 100644 bottleneck/tests/data/test_772_B create mode 100644 bottleneck/tests/data/test_773_A create mode 100644 bottleneck/tests/data/test_773_B create mode 100644 bottleneck/tests/data/test_774_A create mode 100644 bottleneck/tests/data/test_774_B create mode 100644 bottleneck/tests/data/test_775_A create mode 100644 bottleneck/tests/data/test_775_B create mode 100644 bottleneck/tests/data/test_776_A create mode 100644 bottleneck/tests/data/test_776_B create mode 100644 bottleneck/tests/data/test_777_A create mode 100644 bottleneck/tests/data/test_777_B create mode 100644 bottleneck/tests/data/test_778_A create mode 100644 bottleneck/tests/data/test_778_B create mode 100644 bottleneck/tests/data/test_779_A create mode 100644 bottleneck/tests/data/test_779_B create mode 100644 bottleneck/tests/data/test_780_A create mode 100644 bottleneck/tests/data/test_780_B create mode 100644 bottleneck/tests/data/test_781_A create mode 100644 bottleneck/tests/data/test_781_B create mode 100644 bottleneck/tests/data/test_782_A create mode 100644 bottleneck/tests/data/test_782_B create mode 100644 bottleneck/tests/data/test_783_A create mode 100644 bottleneck/tests/data/test_783_B create mode 100644 bottleneck/tests/data/test_784_A create mode 100644 bottleneck/tests/data/test_784_B create mode 100644 bottleneck/tests/data/test_785_A create mode 100644 bottleneck/tests/data/test_785_B create mode 100644 bottleneck/tests/data/test_786_A create mode 100644 bottleneck/tests/data/test_786_B create mode 100644 bottleneck/tests/data/test_787_A create mode 100644 bottleneck/tests/data/test_787_B create mode 100644 bottleneck/tests/data/test_788_A create mode 100644 bottleneck/tests/data/test_788_B create mode 100644 bottleneck/tests/data/test_789_A create mode 100644 bottleneck/tests/data/test_789_B create mode 100644 bottleneck/tests/data/test_790_A create mode 100644 bottleneck/tests/data/test_790_B create mode 100644 bottleneck/tests/data/test_791_A create mode 100644 bottleneck/tests/data/test_791_B create mode 100644 bottleneck/tests/data/test_792_A create mode 100644 bottleneck/tests/data/test_792_B create mode 100644 bottleneck/tests/data/test_793_A create mode 100644 bottleneck/tests/data/test_793_B create mode 100644 bottleneck/tests/data/test_794_A create mode 100644 bottleneck/tests/data/test_794_B create mode 100644 bottleneck/tests/data/test_795_A create mode 100644 bottleneck/tests/data/test_795_B create mode 100644 bottleneck/tests/data/test_796_A create mode 100644 bottleneck/tests/data/test_796_B create mode 100644 bottleneck/tests/data/test_797_A create mode 100644 bottleneck/tests/data/test_797_B create mode 100644 bottleneck/tests/data/test_798_A create mode 100644 bottleneck/tests/data/test_798_B create mode 100644 bottleneck/tests/data/test_799_A create mode 100644 bottleneck/tests/data/test_799_B create mode 100644 bottleneck/tests/data/test_800_A create mode 100644 bottleneck/tests/data/test_800_B create mode 100644 bottleneck/tests/data/test_801_A create mode 100644 bottleneck/tests/data/test_801_B create mode 100644 bottleneck/tests/data/test_802_A create mode 100644 bottleneck/tests/data/test_802_B create mode 100644 bottleneck/tests/data/test_803_A create mode 100644 bottleneck/tests/data/test_803_B create mode 100644 bottleneck/tests/data/test_804_A create mode 100644 bottleneck/tests/data/test_804_B create mode 100644 bottleneck/tests/data/test_805_A create mode 100644 bottleneck/tests/data/test_805_B create mode 100644 bottleneck/tests/data/test_806_A create mode 100644 bottleneck/tests/data/test_806_B create mode 100644 bottleneck/tests/data/test_807_A create mode 100644 bottleneck/tests/data/test_807_B create mode 100644 bottleneck/tests/data/test_808_A create mode 100644 bottleneck/tests/data/test_808_B create mode 100644 bottleneck/tests/data/test_809_A create mode 100644 bottleneck/tests/data/test_809_B create mode 100644 bottleneck/tests/data/test_810_A create mode 100644 bottleneck/tests/data/test_810_B create mode 100644 bottleneck/tests/data/test_811_A create mode 100644 bottleneck/tests/data/test_811_B create mode 100644 bottleneck/tests/data/test_812_A create mode 100644 bottleneck/tests/data/test_812_B create mode 100644 bottleneck/tests/data/test_813_A create mode 100644 bottleneck/tests/data/test_813_B create mode 100644 bottleneck/tests/data/test_814_A create mode 100644 bottleneck/tests/data/test_814_B create mode 100644 bottleneck/tests/data/test_815_A create mode 100644 bottleneck/tests/data/test_815_B create mode 100644 bottleneck/tests/data/test_816_A create mode 100644 bottleneck/tests/data/test_816_B create mode 100644 bottleneck/tests/data/test_817_A create mode 100644 bottleneck/tests/data/test_817_B create mode 100644 bottleneck/tests/data/test_818_A create mode 100644 bottleneck/tests/data/test_818_B create mode 100644 bottleneck/tests/data/test_819_A create mode 100644 bottleneck/tests/data/test_819_B create mode 100644 bottleneck/tests/data/test_820_A create mode 100644 bottleneck/tests/data/test_820_B create mode 100644 bottleneck/tests/data/test_821_A create mode 100644 bottleneck/tests/data/test_821_B create mode 100644 bottleneck/tests/data/test_822_A create mode 100644 bottleneck/tests/data/test_822_B create mode 100644 bottleneck/tests/data/test_823_A create mode 100644 bottleneck/tests/data/test_823_B create mode 100644 bottleneck/tests/data/test_824_A create mode 100644 bottleneck/tests/data/test_824_B create mode 100644 bottleneck/tests/data/test_825_A create mode 100644 bottleneck/tests/data/test_825_B create mode 100644 bottleneck/tests/data/test_826_A create mode 100644 bottleneck/tests/data/test_826_B create mode 100644 bottleneck/tests/data/test_827_A create mode 100644 bottleneck/tests/data/test_827_B create mode 100644 bottleneck/tests/data/test_828_A create mode 100644 bottleneck/tests/data/test_828_B create mode 100644 bottleneck/tests/data/test_829_A create mode 100644 bottleneck/tests/data/test_829_B create mode 100644 bottleneck/tests/data/test_830_A create mode 100644 bottleneck/tests/data/test_830_B create mode 100644 bottleneck/tests/data/test_831_A create mode 100644 bottleneck/tests/data/test_831_B create mode 100644 bottleneck/tests/data/test_832_A create mode 100644 bottleneck/tests/data/test_832_B create mode 100644 bottleneck/tests/data/test_833_A create mode 100644 bottleneck/tests/data/test_833_B create mode 100644 bottleneck/tests/data/test_834_A create mode 100644 bottleneck/tests/data/test_834_B create mode 100644 bottleneck/tests/data/test_835_A create mode 100644 bottleneck/tests/data/test_835_B create mode 100644 bottleneck/tests/data/test_836_A create mode 100644 bottleneck/tests/data/test_836_B create mode 100644 bottleneck/tests/data/test_837_A create mode 100644 bottleneck/tests/data/test_837_B create mode 100644 bottleneck/tests/data/test_838_A create mode 100644 bottleneck/tests/data/test_838_B create mode 100644 bottleneck/tests/data/test_839_A create mode 100644 bottleneck/tests/data/test_839_B create mode 100644 bottleneck/tests/data/test_840_A create mode 100644 bottleneck/tests/data/test_840_B create mode 100644 bottleneck/tests/data/test_841_A create mode 100644 bottleneck/tests/data/test_841_B create mode 100644 bottleneck/tests/data/test_842_A create mode 100644 bottleneck/tests/data/test_842_B create mode 100644 bottleneck/tests/data/test_843_A create mode 100644 bottleneck/tests/data/test_843_B create mode 100644 bottleneck/tests/data/test_844_A create mode 100644 bottleneck/tests/data/test_844_B create mode 100644 bottleneck/tests/data/test_845_A create mode 100644 bottleneck/tests/data/test_845_B create mode 100644 bottleneck/tests/data/test_846_A create mode 100644 bottleneck/tests/data/test_846_B create mode 100644 bottleneck/tests/data/test_847_A create mode 100644 bottleneck/tests/data/test_847_B create mode 100644 bottleneck/tests/data/test_848_A create mode 100644 bottleneck/tests/data/test_848_B create mode 100644 bottleneck/tests/data/test_849_A create mode 100644 bottleneck/tests/data/test_849_B create mode 100644 bottleneck/tests/data/test_850_A create mode 100644 bottleneck/tests/data/test_850_B create mode 100644 bottleneck/tests/data/test_851_A create mode 100644 bottleneck/tests/data/test_851_B create mode 100644 bottleneck/tests/data/test_852_A create mode 100644 bottleneck/tests/data/test_852_B create mode 100644 bottleneck/tests/data/test_853_A create mode 100644 bottleneck/tests/data/test_853_B create mode 100644 bottleneck/tests/data/test_854_A create mode 100644 bottleneck/tests/data/test_854_B create mode 100644 bottleneck/tests/data/test_855_A create mode 100644 bottleneck/tests/data/test_855_B create mode 100644 bottleneck/tests/data/test_856_A create mode 100644 bottleneck/tests/data/test_856_B create mode 100644 bottleneck/tests/data/test_857_A create mode 100644 bottleneck/tests/data/test_857_B create mode 100644 bottleneck/tests/data/test_858_A create mode 100644 bottleneck/tests/data/test_858_B create mode 100644 bottleneck/tests/data/test_859_A create mode 100644 bottleneck/tests/data/test_859_B create mode 100644 bottleneck/tests/data/test_860_A create mode 100644 bottleneck/tests/data/test_860_B create mode 100644 bottleneck/tests/data/test_861_A create mode 100644 bottleneck/tests/data/test_861_B create mode 100644 bottleneck/tests/data/test_862_A create mode 100644 bottleneck/tests/data/test_862_B create mode 100644 bottleneck/tests/data/test_863_A create mode 100644 bottleneck/tests/data/test_863_B create mode 100644 bottleneck/tests/data/test_864_A create mode 100644 bottleneck/tests/data/test_864_B create mode 100644 bottleneck/tests/data/test_865_A create mode 100644 bottleneck/tests/data/test_865_B create mode 100644 bottleneck/tests/data/test_866_A create mode 100644 bottleneck/tests/data/test_866_B create mode 100644 bottleneck/tests/data/test_867_A create mode 100644 bottleneck/tests/data/test_867_B create mode 100644 bottleneck/tests/data/test_868_A create mode 100644 bottleneck/tests/data/test_868_B create mode 100644 bottleneck/tests/data/test_869_A create mode 100644 bottleneck/tests/data/test_869_B create mode 100644 bottleneck/tests/data/test_870_A create mode 100644 bottleneck/tests/data/test_870_B create mode 100644 bottleneck/tests/data/test_871_A create mode 100644 bottleneck/tests/data/test_871_B create mode 100644 bottleneck/tests/data/test_872_A create mode 100644 bottleneck/tests/data/test_872_B create mode 100644 bottleneck/tests/data/test_873_A create mode 100644 bottleneck/tests/data/test_873_B create mode 100644 bottleneck/tests/data/test_874_A create mode 100644 bottleneck/tests/data/test_874_B create mode 100644 bottleneck/tests/data/test_875_A create mode 100644 bottleneck/tests/data/test_875_B create mode 100644 bottleneck/tests/data/test_876_A create mode 100644 bottleneck/tests/data/test_876_B create mode 100644 bottleneck/tests/data/test_877_A create mode 100644 bottleneck/tests/data/test_877_B create mode 100644 bottleneck/tests/data/test_878_A create mode 100644 bottleneck/tests/data/test_878_B create mode 100644 bottleneck/tests/data/test_879_A create mode 100644 bottleneck/tests/data/test_879_B create mode 100644 bottleneck/tests/data/test_list.txt create mode 100644 bottleneck/tests/data/test_list.txt.bak create mode 100644 bottleneck/tests/data/ws_tests/test_100_A create mode 100644 bottleneck/tests/data/ws_tests/test_100_A.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_100_B create mode 100644 bottleneck/tests/data/ws_tests/test_100_B.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_200_A create mode 100644 bottleneck/tests/data/ws_tests/test_200_B create mode 100644 bottleneck/tests/data/ws_tests/test_5000_A create mode 100644 bottleneck/tests/data/ws_tests/test_5000_B create mode 100644 bottleneck/tests/data/ws_tests/test_5_A create mode 100644 bottleneck/tests/data/ws_tests/test_5_A.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_5_B create mode 100644 bottleneck/tests/data/ws_tests/test_5_B.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag1_A create mode 100644 bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag1_B create mode 100644 bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag2_A create mode 100644 bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag2_B create mode 100644 bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag3_A create mode 100644 bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_diag3_B create mode 100644 bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha create mode 100644 bottleneck/tests/data/ws_tests/test_list.txt create mode 100644 bottleneck/tests/test_hera_bottleneck.cpp create mode 100644 bottleneck/tests/tests_main.cpp delete mode 100644 geom_bottleneck/.gitignore delete mode 100644 geom_bottleneck/CMakeLists.txt delete mode 100644 geom_bottleneck/README delete mode 100644 geom_bottleneck/example/CMakeLists.txt delete mode 100644 geom_bottleneck/example/bottleneck_dist.cpp delete mode 100644 geom_bottleneck/include/basic_defs_bt.h delete mode 100644 geom_bottleneck/include/bottleneck.h delete mode 100644 geom_bottleneck/include/bottleneck_detail.h delete mode 100644 geom_bottleneck/include/bottleneck_detail.hpp delete mode 100644 geom_bottleneck/include/bound_match.h delete mode 100644 geom_bottleneck/include/bound_match.hpp delete mode 100644 geom_bottleneck/include/catch/catch.hpp delete mode 100644 geom_bottleneck/include/def_debug_bt.h delete mode 100644 geom_bottleneck/include/diagram_reader.h delete mode 100644 geom_bottleneck/include/diagram_traits.h delete mode 100644 geom_bottleneck/include/dnn/geometry/euclidean-fixed.h delete mode 100644 geom_bottleneck/include/dnn/local/kd-tree.h delete mode 100644 geom_bottleneck/include/dnn/local/kd-tree.hpp delete mode 100644 geom_bottleneck/include/dnn/local/search-functors.h delete mode 100644 geom_bottleneck/include/dnn/parallel/tbb.h delete mode 100644 geom_bottleneck/include/dnn/parallel/utils.h delete mode 100644 geom_bottleneck/include/dnn/utils.h delete mode 100644 geom_bottleneck/include/neighb_oracle.h delete mode 100644 geom_bottleneck/tests/data/test_001_A delete mode 100644 geom_bottleneck/tests/data/test_001_B delete mode 100644 geom_bottleneck/tests/data/test_002_A delete mode 100644 geom_bottleneck/tests/data/test_002_B delete mode 100644 geom_bottleneck/tests/data/test_003_A delete mode 100644 geom_bottleneck/tests/data/test_003_B delete mode 100644 geom_bottleneck/tests/data/test_004_A delete mode 100644 geom_bottleneck/tests/data/test_004_B delete mode 100644 geom_bottleneck/tests/data/test_005_A delete mode 100644 geom_bottleneck/tests/data/test_005_B delete mode 100644 geom_bottleneck/tests/data/test_006_A delete mode 100644 geom_bottleneck/tests/data/test_006_B delete mode 100644 geom_bottleneck/tests/data/test_007_A delete mode 100644 geom_bottleneck/tests/data/test_007_B delete mode 100644 geom_bottleneck/tests/data/test_008_A delete mode 100644 geom_bottleneck/tests/data/test_008_B delete mode 100644 geom_bottleneck/tests/data/test_009_A delete mode 100644 geom_bottleneck/tests/data/test_009_B delete mode 100644 geom_bottleneck/tests/data/test_010_A delete mode 100644 geom_bottleneck/tests/data/test_010_B delete mode 100644 geom_bottleneck/tests/data/test_011_A delete mode 100644 geom_bottleneck/tests/data/test_011_B delete mode 100644 geom_bottleneck/tests/data/test_012_A delete mode 100644 geom_bottleneck/tests/data/test_012_B delete mode 100644 geom_bottleneck/tests/data/test_013_A delete mode 100644 geom_bottleneck/tests/data/test_013_B delete mode 100644 geom_bottleneck/tests/data/test_014_A delete mode 100644 geom_bottleneck/tests/data/test_014_B delete mode 100644 geom_bottleneck/tests/data/test_015_A delete mode 100644 geom_bottleneck/tests/data/test_015_B delete mode 100644 geom_bottleneck/tests/data/test_016_A delete mode 100644 geom_bottleneck/tests/data/test_016_B delete mode 100644 geom_bottleneck/tests/data/test_100_A delete mode 100644 geom_bottleneck/tests/data/test_100_B delete mode 100644 geom_bottleneck/tests/data/test_101_A delete mode 100644 geom_bottleneck/tests/data/test_101_B delete mode 100644 geom_bottleneck/tests/data/test_102_A delete mode 100644 geom_bottleneck/tests/data/test_102_B delete mode 100644 geom_bottleneck/tests/data/test_103_A delete mode 100644 geom_bottleneck/tests/data/test_103_B delete mode 100644 geom_bottleneck/tests/data/test_104_A delete mode 100644 geom_bottleneck/tests/data/test_104_B delete mode 100644 geom_bottleneck/tests/data/test_105_A delete mode 100644 geom_bottleneck/tests/data/test_105_B delete mode 100644 geom_bottleneck/tests/data/test_106_A delete mode 100644 geom_bottleneck/tests/data/test_106_B delete mode 100644 geom_bottleneck/tests/data/test_107_A delete mode 100644 geom_bottleneck/tests/data/test_107_B delete mode 100644 geom_bottleneck/tests/data/test_108_A delete mode 100644 geom_bottleneck/tests/data/test_108_B delete mode 100644 geom_bottleneck/tests/data/test_109_A delete mode 100644 geom_bottleneck/tests/data/test_109_B delete mode 100644 geom_bottleneck/tests/data/test_110_A delete mode 100644 geom_bottleneck/tests/data/test_110_B delete mode 100644 geom_bottleneck/tests/data/test_111_A delete mode 100644 geom_bottleneck/tests/data/test_111_B delete mode 100644 geom_bottleneck/tests/data/test_112_A delete mode 100644 geom_bottleneck/tests/data/test_112_B delete mode 100644 geom_bottleneck/tests/data/test_113_A delete mode 100644 geom_bottleneck/tests/data/test_113_B delete mode 100644 geom_bottleneck/tests/data/test_114_A delete mode 100644 geom_bottleneck/tests/data/test_114_B delete mode 100644 geom_bottleneck/tests/data/test_115_A delete mode 100644 geom_bottleneck/tests/data/test_115_B delete mode 100644 geom_bottleneck/tests/data/test_116_A delete mode 100644 geom_bottleneck/tests/data/test_116_B delete mode 100644 geom_bottleneck/tests/data/test_117_A delete mode 100644 geom_bottleneck/tests/data/test_117_B delete mode 100644 geom_bottleneck/tests/data/test_118_A delete mode 100644 geom_bottleneck/tests/data/test_118_B delete mode 100644 geom_bottleneck/tests/data/test_119_A delete mode 100644 geom_bottleneck/tests/data/test_119_B delete mode 100644 geom_bottleneck/tests/data/test_120_A delete mode 100644 geom_bottleneck/tests/data/test_120_B delete mode 100644 geom_bottleneck/tests/data/test_121_A delete mode 100644 geom_bottleneck/tests/data/test_121_B delete mode 100644 geom_bottleneck/tests/data/test_122_A delete mode 100644 geom_bottleneck/tests/data/test_122_B delete mode 100644 geom_bottleneck/tests/data/test_123_A delete mode 100644 geom_bottleneck/tests/data/test_123_B delete mode 100644 geom_bottleneck/tests/data/test_124_A delete mode 100644 geom_bottleneck/tests/data/test_124_B delete mode 100644 geom_bottleneck/tests/data/test_125_A delete mode 100644 geom_bottleneck/tests/data/test_125_B delete mode 100644 geom_bottleneck/tests/data/test_126_A delete mode 100644 geom_bottleneck/tests/data/test_126_B delete mode 100644 geom_bottleneck/tests/data/test_127_A delete mode 100644 geom_bottleneck/tests/data/test_127_B delete mode 100644 geom_bottleneck/tests/data/test_128_A delete mode 100644 geom_bottleneck/tests/data/test_128_B delete mode 100644 geom_bottleneck/tests/data/test_129_A delete mode 100644 geom_bottleneck/tests/data/test_129_B delete mode 100644 geom_bottleneck/tests/data/test_130_A delete mode 100644 geom_bottleneck/tests/data/test_130_B delete mode 100644 geom_bottleneck/tests/data/test_131_A delete mode 100644 geom_bottleneck/tests/data/test_131_B delete mode 100644 geom_bottleneck/tests/data/test_132_A delete mode 100644 geom_bottleneck/tests/data/test_132_B delete mode 100644 geom_bottleneck/tests/data/test_133_A delete mode 100644 geom_bottleneck/tests/data/test_133_B delete mode 100644 geom_bottleneck/tests/data/test_134_A delete mode 100644 geom_bottleneck/tests/data/test_134_B delete mode 100644 geom_bottleneck/tests/data/test_135_A delete mode 100644 geom_bottleneck/tests/data/test_135_B delete mode 100644 geom_bottleneck/tests/data/test_136_A delete mode 100644 geom_bottleneck/tests/data/test_136_B delete mode 100644 geom_bottleneck/tests/data/test_137_A delete mode 100644 geom_bottleneck/tests/data/test_137_B delete mode 100644 geom_bottleneck/tests/data/test_138_A delete mode 100644 geom_bottleneck/tests/data/test_138_B delete mode 100644 geom_bottleneck/tests/data/test_139_A delete mode 100644 geom_bottleneck/tests/data/test_139_B delete mode 100644 geom_bottleneck/tests/data/test_140_A delete mode 100644 geom_bottleneck/tests/data/test_140_B delete mode 100644 geom_bottleneck/tests/data/test_141_A delete mode 100644 geom_bottleneck/tests/data/test_141_B delete mode 100644 geom_bottleneck/tests/data/test_142_A delete mode 100644 geom_bottleneck/tests/data/test_142_B delete mode 100644 geom_bottleneck/tests/data/test_143_A delete mode 100644 geom_bottleneck/tests/data/test_143_B delete mode 100644 geom_bottleneck/tests/data/test_144_A delete mode 100644 geom_bottleneck/tests/data/test_144_B delete mode 100644 geom_bottleneck/tests/data/test_145_A delete mode 100644 geom_bottleneck/tests/data/test_145_B delete mode 100644 geom_bottleneck/tests/data/test_146_A delete mode 100644 geom_bottleneck/tests/data/test_146_B delete mode 100644 geom_bottleneck/tests/data/test_147_A delete mode 100644 geom_bottleneck/tests/data/test_147_B delete mode 100644 geom_bottleneck/tests/data/test_148_A delete mode 100644 geom_bottleneck/tests/data/test_148_B delete mode 100644 geom_bottleneck/tests/data/test_149_A delete mode 100644 geom_bottleneck/tests/data/test_149_B delete mode 100644 geom_bottleneck/tests/data/test_150_A delete mode 100644 geom_bottleneck/tests/data/test_150_B delete mode 100644 geom_bottleneck/tests/data/test_151_A delete mode 100644 geom_bottleneck/tests/data/test_151_B delete mode 100644 geom_bottleneck/tests/data/test_152_A delete mode 100644 geom_bottleneck/tests/data/test_152_B delete mode 100644 geom_bottleneck/tests/data/test_153_A delete mode 100644 geom_bottleneck/tests/data/test_153_B delete mode 100644 geom_bottleneck/tests/data/test_154_A delete mode 100644 geom_bottleneck/tests/data/test_154_B delete mode 100644 geom_bottleneck/tests/data/test_155_A delete mode 100644 geom_bottleneck/tests/data/test_155_B delete mode 100644 geom_bottleneck/tests/data/test_156_A delete mode 100644 geom_bottleneck/tests/data/test_156_B delete mode 100644 geom_bottleneck/tests/data/test_157_A delete mode 100644 geom_bottleneck/tests/data/test_157_B delete mode 100644 geom_bottleneck/tests/data/test_158_A delete mode 100644 geom_bottleneck/tests/data/test_158_B delete mode 100644 geom_bottleneck/tests/data/test_159_A delete mode 100644 geom_bottleneck/tests/data/test_159_B delete mode 100644 geom_bottleneck/tests/data/test_160_A delete mode 100644 geom_bottleneck/tests/data/test_160_B delete mode 100644 geom_bottleneck/tests/data/test_161_A delete mode 100644 geom_bottleneck/tests/data/test_161_B delete mode 100644 geom_bottleneck/tests/data/test_162_A delete mode 100644 geom_bottleneck/tests/data/test_162_B delete mode 100644 geom_bottleneck/tests/data/test_163_A delete mode 100644 geom_bottleneck/tests/data/test_163_B delete mode 100644 geom_bottleneck/tests/data/test_164_A delete mode 100644 geom_bottleneck/tests/data/test_164_B delete mode 100644 geom_bottleneck/tests/data/test_165_A delete mode 100644 geom_bottleneck/tests/data/test_165_B delete mode 100644 geom_bottleneck/tests/data/test_166_A delete mode 100644 geom_bottleneck/tests/data/test_166_B delete mode 100644 geom_bottleneck/tests/data/test_167_A delete mode 100644 geom_bottleneck/tests/data/test_167_B delete mode 100644 geom_bottleneck/tests/data/test_168_A delete mode 100644 geom_bottleneck/tests/data/test_168_B delete mode 100644 geom_bottleneck/tests/data/test_169_A delete mode 100644 geom_bottleneck/tests/data/test_169_B delete mode 100644 geom_bottleneck/tests/data/test_170_A delete mode 100644 geom_bottleneck/tests/data/test_170_B delete mode 100644 geom_bottleneck/tests/data/test_171_A delete mode 100644 geom_bottleneck/tests/data/test_171_B delete mode 100644 geom_bottleneck/tests/data/test_172_A delete mode 100644 geom_bottleneck/tests/data/test_172_B delete mode 100644 geom_bottleneck/tests/data/test_173_A delete mode 100644 geom_bottleneck/tests/data/test_173_B delete mode 100644 geom_bottleneck/tests/data/test_174_A delete mode 100644 geom_bottleneck/tests/data/test_174_B delete mode 100644 geom_bottleneck/tests/data/test_175_A delete mode 100644 geom_bottleneck/tests/data/test_175_B delete mode 100644 geom_bottleneck/tests/data/test_176_A delete mode 100644 geom_bottleneck/tests/data/test_176_B delete mode 100644 geom_bottleneck/tests/data/test_177_A delete mode 100644 geom_bottleneck/tests/data/test_177_B delete mode 100644 geom_bottleneck/tests/data/test_178_A delete mode 100644 geom_bottleneck/tests/data/test_178_B delete mode 100644 geom_bottleneck/tests/data/test_179_A delete mode 100644 geom_bottleneck/tests/data/test_179_B delete mode 100644 geom_bottleneck/tests/data/test_180_A delete mode 100644 geom_bottleneck/tests/data/test_180_B delete mode 100644 geom_bottleneck/tests/data/test_181_A delete mode 100644 geom_bottleneck/tests/data/test_181_B delete mode 100644 geom_bottleneck/tests/data/test_182_A delete mode 100644 geom_bottleneck/tests/data/test_182_B delete mode 100644 geom_bottleneck/tests/data/test_183_A delete mode 100644 geom_bottleneck/tests/data/test_183_B delete mode 100644 geom_bottleneck/tests/data/test_184_A delete mode 100644 geom_bottleneck/tests/data/test_184_B delete mode 100644 geom_bottleneck/tests/data/test_185_A delete mode 100644 geom_bottleneck/tests/data/test_185_B delete mode 100644 geom_bottleneck/tests/data/test_186_A delete mode 100644 geom_bottleneck/tests/data/test_186_B delete mode 100644 geom_bottleneck/tests/data/test_187_A delete mode 100644 geom_bottleneck/tests/data/test_187_B delete mode 100644 geom_bottleneck/tests/data/test_188_A delete mode 100644 geom_bottleneck/tests/data/test_188_B delete mode 100644 geom_bottleneck/tests/data/test_189_A delete mode 100644 geom_bottleneck/tests/data/test_189_B delete mode 100644 geom_bottleneck/tests/data/test_190_A delete mode 100644 geom_bottleneck/tests/data/test_190_B delete mode 100644 geom_bottleneck/tests/data/test_191_A delete mode 100644 geom_bottleneck/tests/data/test_191_B delete mode 100644 geom_bottleneck/tests/data/test_192_A delete mode 100644 geom_bottleneck/tests/data/test_192_B delete mode 100644 geom_bottleneck/tests/data/test_193_A delete mode 100644 geom_bottleneck/tests/data/test_193_B delete mode 100644 geom_bottleneck/tests/data/test_194_A delete mode 100644 geom_bottleneck/tests/data/test_194_B delete mode 100644 geom_bottleneck/tests/data/test_195_A delete mode 100644 geom_bottleneck/tests/data/test_195_B delete mode 100644 geom_bottleneck/tests/data/test_196_A delete mode 100644 geom_bottleneck/tests/data/test_196_B delete mode 100644 geom_bottleneck/tests/data/test_197_A delete mode 100644 geom_bottleneck/tests/data/test_197_B delete mode 100644 geom_bottleneck/tests/data/test_198_A delete mode 100644 geom_bottleneck/tests/data/test_198_B delete mode 100644 geom_bottleneck/tests/data/test_199_A delete mode 100644 geom_bottleneck/tests/data/test_199_B delete mode 100644 geom_bottleneck/tests/data/test_200_A delete mode 100644 geom_bottleneck/tests/data/test_200_B delete mode 100644 geom_bottleneck/tests/data/test_201_A delete mode 100644 geom_bottleneck/tests/data/test_201_B delete mode 100644 geom_bottleneck/tests/data/test_202_A delete mode 100644 geom_bottleneck/tests/data/test_202_B delete mode 100644 geom_bottleneck/tests/data/test_203_A delete mode 100644 geom_bottleneck/tests/data/test_203_B delete mode 100644 geom_bottleneck/tests/data/test_204_A delete mode 100644 geom_bottleneck/tests/data/test_204_B delete mode 100644 geom_bottleneck/tests/data/test_205_A delete mode 100644 geom_bottleneck/tests/data/test_205_B delete mode 100644 geom_bottleneck/tests/data/test_206_A delete mode 100644 geom_bottleneck/tests/data/test_206_B delete mode 100644 geom_bottleneck/tests/data/test_207_A delete mode 100644 geom_bottleneck/tests/data/test_207_B delete mode 100644 geom_bottleneck/tests/data/test_208_A delete mode 100644 geom_bottleneck/tests/data/test_208_B delete mode 100644 geom_bottleneck/tests/data/test_209_A delete mode 100644 geom_bottleneck/tests/data/test_209_B delete mode 100644 geom_bottleneck/tests/data/test_210_A delete mode 100644 geom_bottleneck/tests/data/test_210_B delete mode 100644 geom_bottleneck/tests/data/test_211_A delete mode 100644 geom_bottleneck/tests/data/test_211_B delete mode 100644 geom_bottleneck/tests/data/test_212_A delete mode 100644 geom_bottleneck/tests/data/test_212_B delete mode 100644 geom_bottleneck/tests/data/test_213_A delete mode 100644 geom_bottleneck/tests/data/test_213_B delete mode 100644 geom_bottleneck/tests/data/test_214_A delete mode 100644 geom_bottleneck/tests/data/test_214_B delete mode 100644 geom_bottleneck/tests/data/test_215_A delete mode 100644 geom_bottleneck/tests/data/test_215_B delete mode 100644 geom_bottleneck/tests/data/test_216_A delete mode 100644 geom_bottleneck/tests/data/test_216_B delete mode 100644 geom_bottleneck/tests/data/test_217_A delete mode 100644 geom_bottleneck/tests/data/test_217_B delete mode 100644 geom_bottleneck/tests/data/test_218_A delete mode 100644 geom_bottleneck/tests/data/test_218_B delete mode 100644 geom_bottleneck/tests/data/test_219_A delete mode 100644 geom_bottleneck/tests/data/test_219_B delete mode 100644 geom_bottleneck/tests/data/test_220_A delete mode 100644 geom_bottleneck/tests/data/test_220_B delete mode 100644 geom_bottleneck/tests/data/test_221_A delete mode 100644 geom_bottleneck/tests/data/test_221_B delete mode 100644 geom_bottleneck/tests/data/test_222_A delete mode 100644 geom_bottleneck/tests/data/test_222_B delete mode 100644 geom_bottleneck/tests/data/test_223_A delete mode 100644 geom_bottleneck/tests/data/test_223_B delete mode 100644 geom_bottleneck/tests/data/test_224_A delete mode 100644 geom_bottleneck/tests/data/test_224_B delete mode 100644 geom_bottleneck/tests/data/test_225_A delete mode 100644 geom_bottleneck/tests/data/test_225_B delete mode 100644 geom_bottleneck/tests/data/test_226_A delete mode 100644 geom_bottleneck/tests/data/test_226_B delete mode 100644 geom_bottleneck/tests/data/test_227_A delete mode 100644 geom_bottleneck/tests/data/test_227_B delete mode 100644 geom_bottleneck/tests/data/test_228_A delete mode 100644 geom_bottleneck/tests/data/test_228_B delete mode 100644 geom_bottleneck/tests/data/test_229_A delete mode 100644 geom_bottleneck/tests/data/test_229_B delete mode 100644 geom_bottleneck/tests/data/test_230_A delete mode 100644 geom_bottleneck/tests/data/test_230_B delete mode 100644 geom_bottleneck/tests/data/test_231_A delete mode 100644 geom_bottleneck/tests/data/test_231_B delete mode 100644 geom_bottleneck/tests/data/test_232_A delete mode 100644 geom_bottleneck/tests/data/test_232_B delete mode 100644 geom_bottleneck/tests/data/test_233_A delete mode 100644 geom_bottleneck/tests/data/test_233_B delete mode 100644 geom_bottleneck/tests/data/test_234_A delete mode 100644 geom_bottleneck/tests/data/test_234_B delete mode 100644 geom_bottleneck/tests/data/test_235_A delete mode 100644 geom_bottleneck/tests/data/test_235_B delete mode 100644 geom_bottleneck/tests/data/test_236_A delete mode 100644 geom_bottleneck/tests/data/test_236_B delete mode 100644 geom_bottleneck/tests/data/test_237_A delete mode 100644 geom_bottleneck/tests/data/test_237_B delete mode 100644 geom_bottleneck/tests/data/test_238_A delete mode 100644 geom_bottleneck/tests/data/test_238_B delete mode 100644 geom_bottleneck/tests/data/test_239_A delete mode 100644 geom_bottleneck/tests/data/test_239_B delete mode 100644 geom_bottleneck/tests/data/test_240_A delete mode 100644 geom_bottleneck/tests/data/test_240_B delete mode 100644 geom_bottleneck/tests/data/test_241_A delete mode 100644 geom_bottleneck/tests/data/test_241_B delete mode 100644 geom_bottleneck/tests/data/test_242_A delete mode 100644 geom_bottleneck/tests/data/test_242_B delete mode 100644 geom_bottleneck/tests/data/test_243_A delete mode 100644 geom_bottleneck/tests/data/test_243_B delete mode 100644 geom_bottleneck/tests/data/test_244_A delete mode 100644 geom_bottleneck/tests/data/test_244_B delete mode 100644 geom_bottleneck/tests/data/test_245_A delete mode 100644 geom_bottleneck/tests/data/test_245_B delete mode 100644 geom_bottleneck/tests/data/test_246_A delete mode 100644 geom_bottleneck/tests/data/test_246_B delete mode 100644 geom_bottleneck/tests/data/test_247_A delete mode 100644 geom_bottleneck/tests/data/test_247_B delete mode 100644 geom_bottleneck/tests/data/test_248_A delete mode 100644 geom_bottleneck/tests/data/test_248_B delete mode 100644 geom_bottleneck/tests/data/test_249_A delete mode 100644 geom_bottleneck/tests/data/test_249_B delete mode 100644 geom_bottleneck/tests/data/test_250_A delete mode 100644 geom_bottleneck/tests/data/test_250_B delete mode 100644 geom_bottleneck/tests/data/test_251_A delete mode 100644 geom_bottleneck/tests/data/test_251_B delete mode 100644 geom_bottleneck/tests/data/test_252_A delete mode 100644 geom_bottleneck/tests/data/test_252_B delete mode 100644 geom_bottleneck/tests/data/test_253_A delete mode 100644 geom_bottleneck/tests/data/test_253_B delete mode 100644 geom_bottleneck/tests/data/test_254_A delete mode 100644 geom_bottleneck/tests/data/test_254_B delete mode 100644 geom_bottleneck/tests/data/test_255_A delete mode 100644 geom_bottleneck/tests/data/test_255_B delete mode 100644 geom_bottleneck/tests/data/test_256_A delete mode 100644 geom_bottleneck/tests/data/test_256_B delete mode 100644 geom_bottleneck/tests/data/test_257_A delete mode 100644 geom_bottleneck/tests/data/test_257_B delete mode 100644 geom_bottleneck/tests/data/test_258_A delete mode 100644 geom_bottleneck/tests/data/test_258_B delete mode 100644 geom_bottleneck/tests/data/test_259_A delete mode 100644 geom_bottleneck/tests/data/test_259_B delete mode 100644 geom_bottleneck/tests/data/test_260_A delete mode 100644 geom_bottleneck/tests/data/test_260_B delete mode 100644 geom_bottleneck/tests/data/test_261_A delete mode 100644 geom_bottleneck/tests/data/test_261_B delete mode 100644 geom_bottleneck/tests/data/test_262_A delete mode 100644 geom_bottleneck/tests/data/test_262_B delete mode 100644 geom_bottleneck/tests/data/test_263_A delete mode 100644 geom_bottleneck/tests/data/test_263_B delete mode 100644 geom_bottleneck/tests/data/test_264_A delete mode 100644 geom_bottleneck/tests/data/test_264_B delete mode 100644 geom_bottleneck/tests/data/test_265_A delete mode 100644 geom_bottleneck/tests/data/test_265_B delete mode 100644 geom_bottleneck/tests/data/test_266_A delete mode 100644 geom_bottleneck/tests/data/test_266_B delete mode 100644 geom_bottleneck/tests/data/test_267_A delete mode 100644 geom_bottleneck/tests/data/test_267_B delete mode 100644 geom_bottleneck/tests/data/test_268_A delete mode 100644 geom_bottleneck/tests/data/test_268_B delete mode 100644 geom_bottleneck/tests/data/test_269_A delete mode 100644 geom_bottleneck/tests/data/test_269_B delete mode 100644 geom_bottleneck/tests/data/test_270_A delete mode 100644 geom_bottleneck/tests/data/test_270_B delete mode 100644 geom_bottleneck/tests/data/test_271_A delete mode 100644 geom_bottleneck/tests/data/test_271_B delete mode 100644 geom_bottleneck/tests/data/test_272_A delete mode 100644 geom_bottleneck/tests/data/test_272_B delete mode 100644 geom_bottleneck/tests/data/test_273_A delete mode 100644 geom_bottleneck/tests/data/test_273_B delete mode 100644 geom_bottleneck/tests/data/test_274_A delete mode 100644 geom_bottleneck/tests/data/test_274_B delete mode 100644 geom_bottleneck/tests/data/test_275_A delete mode 100644 geom_bottleneck/tests/data/test_275_B delete mode 100644 geom_bottleneck/tests/data/test_276_A delete mode 100644 geom_bottleneck/tests/data/test_276_B delete mode 100644 geom_bottleneck/tests/data/test_277_A delete mode 100644 geom_bottleneck/tests/data/test_277_B delete mode 100644 geom_bottleneck/tests/data/test_278_A delete mode 100644 geom_bottleneck/tests/data/test_278_B delete mode 100644 geom_bottleneck/tests/data/test_279_A delete mode 100644 geom_bottleneck/tests/data/test_279_B delete mode 100644 geom_bottleneck/tests/data/test_280_A delete mode 100644 geom_bottleneck/tests/data/test_280_B delete mode 100644 geom_bottleneck/tests/data/test_281_A delete mode 100644 geom_bottleneck/tests/data/test_281_B delete mode 100644 geom_bottleneck/tests/data/test_282_A delete mode 100644 geom_bottleneck/tests/data/test_282_B delete mode 100644 geom_bottleneck/tests/data/test_283_A delete mode 100644 geom_bottleneck/tests/data/test_283_B delete mode 100644 geom_bottleneck/tests/data/test_284_A delete mode 100644 geom_bottleneck/tests/data/test_284_B delete mode 100644 geom_bottleneck/tests/data/test_285_A delete mode 100644 geom_bottleneck/tests/data/test_285_B delete mode 100644 geom_bottleneck/tests/data/test_286_A delete mode 100644 geom_bottleneck/tests/data/test_286_B delete mode 100644 geom_bottleneck/tests/data/test_287_A delete mode 100644 geom_bottleneck/tests/data/test_287_B delete mode 100644 geom_bottleneck/tests/data/test_288_A delete mode 100644 geom_bottleneck/tests/data/test_288_B delete mode 100644 geom_bottleneck/tests/data/test_289_A delete mode 100644 geom_bottleneck/tests/data/test_289_B delete mode 100644 geom_bottleneck/tests/data/test_290_A delete mode 100644 geom_bottleneck/tests/data/test_290_B delete mode 100644 geom_bottleneck/tests/data/test_291_A delete mode 100644 geom_bottleneck/tests/data/test_291_B delete mode 100644 geom_bottleneck/tests/data/test_292_A delete mode 100644 geom_bottleneck/tests/data/test_292_B delete mode 100644 geom_bottleneck/tests/data/test_293_A delete mode 100644 geom_bottleneck/tests/data/test_293_B delete mode 100644 geom_bottleneck/tests/data/test_294_A delete mode 100644 geom_bottleneck/tests/data/test_294_B delete mode 100644 geom_bottleneck/tests/data/test_295_A delete mode 100644 geom_bottleneck/tests/data/test_295_B delete mode 100644 geom_bottleneck/tests/data/test_296_A delete mode 100644 geom_bottleneck/tests/data/test_296_B delete mode 100644 geom_bottleneck/tests/data/test_297_A delete mode 100644 geom_bottleneck/tests/data/test_297_B delete mode 100644 geom_bottleneck/tests/data/test_298_A delete mode 100644 geom_bottleneck/tests/data/test_298_B delete mode 100644 geom_bottleneck/tests/data/test_299_A delete mode 100644 geom_bottleneck/tests/data/test_299_B delete mode 100644 geom_bottleneck/tests/data/test_300_A delete mode 100644 geom_bottleneck/tests/data/test_300_B delete mode 100644 geom_bottleneck/tests/data/test_301_A delete mode 100644 geom_bottleneck/tests/data/test_301_B delete mode 100644 geom_bottleneck/tests/data/test_302_A delete mode 100644 geom_bottleneck/tests/data/test_302_B delete mode 100644 geom_bottleneck/tests/data/test_303_A delete mode 100644 geom_bottleneck/tests/data/test_303_B delete mode 100644 geom_bottleneck/tests/data/test_304_A delete mode 100644 geom_bottleneck/tests/data/test_304_B delete mode 100644 geom_bottleneck/tests/data/test_305_A delete mode 100644 geom_bottleneck/tests/data/test_305_B delete mode 100644 geom_bottleneck/tests/data/test_306_A delete mode 100644 geom_bottleneck/tests/data/test_306_B delete mode 100644 geom_bottleneck/tests/data/test_307_A delete mode 100644 geom_bottleneck/tests/data/test_307_B delete mode 100644 geom_bottleneck/tests/data/test_308_A delete mode 100644 geom_bottleneck/tests/data/test_308_B delete mode 100644 geom_bottleneck/tests/data/test_309_A delete mode 100644 geom_bottleneck/tests/data/test_309_B delete mode 100644 geom_bottleneck/tests/data/test_310_A delete mode 100644 geom_bottleneck/tests/data/test_310_B delete mode 100644 geom_bottleneck/tests/data/test_311_A delete mode 100644 geom_bottleneck/tests/data/test_311_B delete mode 100644 geom_bottleneck/tests/data/test_312_A delete mode 100644 geom_bottleneck/tests/data/test_312_B delete mode 100644 geom_bottleneck/tests/data/test_313_A delete mode 100644 geom_bottleneck/tests/data/test_313_B delete mode 100644 geom_bottleneck/tests/data/test_314_A delete mode 100644 geom_bottleneck/tests/data/test_314_B delete mode 100644 geom_bottleneck/tests/data/test_315_A delete mode 100644 geom_bottleneck/tests/data/test_315_B delete mode 100644 geom_bottleneck/tests/data/test_316_A delete mode 100644 geom_bottleneck/tests/data/test_316_B delete mode 100644 geom_bottleneck/tests/data/test_317_A delete mode 100644 geom_bottleneck/tests/data/test_317_B delete mode 100644 geom_bottleneck/tests/data/test_318_A delete mode 100644 geom_bottleneck/tests/data/test_318_B delete mode 100644 geom_bottleneck/tests/data/test_319_A delete mode 100644 geom_bottleneck/tests/data/test_319_B delete mode 100644 geom_bottleneck/tests/data/test_320_A delete mode 100644 geom_bottleneck/tests/data/test_320_B delete mode 100644 geom_bottleneck/tests/data/test_321_A delete mode 100644 geom_bottleneck/tests/data/test_321_B delete mode 100644 geom_bottleneck/tests/data/test_322_A delete mode 100644 geom_bottleneck/tests/data/test_322_B delete mode 100644 geom_bottleneck/tests/data/test_323_A delete mode 100644 geom_bottleneck/tests/data/test_323_B delete mode 100644 geom_bottleneck/tests/data/test_324_A delete mode 100644 geom_bottleneck/tests/data/test_324_B delete mode 100644 geom_bottleneck/tests/data/test_325_A delete mode 100644 geom_bottleneck/tests/data/test_325_B delete mode 100644 geom_bottleneck/tests/data/test_326_A delete mode 100644 geom_bottleneck/tests/data/test_326_B delete mode 100644 geom_bottleneck/tests/data/test_327_A delete mode 100644 geom_bottleneck/tests/data/test_327_B delete mode 100644 geom_bottleneck/tests/data/test_328_A delete mode 100644 geom_bottleneck/tests/data/test_328_B delete mode 100644 geom_bottleneck/tests/data/test_329_A delete mode 100644 geom_bottleneck/tests/data/test_329_B delete mode 100644 geom_bottleneck/tests/data/test_330_A delete mode 100644 geom_bottleneck/tests/data/test_330_B delete mode 100644 geom_bottleneck/tests/data/test_331_A delete mode 100644 geom_bottleneck/tests/data/test_331_B delete mode 100644 geom_bottleneck/tests/data/test_332_A delete mode 100644 geom_bottleneck/tests/data/test_332_B delete mode 100644 geom_bottleneck/tests/data/test_333_A delete mode 100644 geom_bottleneck/tests/data/test_333_B delete mode 100644 geom_bottleneck/tests/data/test_334_A delete mode 100644 geom_bottleneck/tests/data/test_334_B delete mode 100644 geom_bottleneck/tests/data/test_335_A delete mode 100644 geom_bottleneck/tests/data/test_335_B delete mode 100644 geom_bottleneck/tests/data/test_336_A delete mode 100644 geom_bottleneck/tests/data/test_336_B delete mode 100644 geom_bottleneck/tests/data/test_337_A delete mode 100644 geom_bottleneck/tests/data/test_337_B delete mode 100644 geom_bottleneck/tests/data/test_338_A delete mode 100644 geom_bottleneck/tests/data/test_338_B delete mode 100644 geom_bottleneck/tests/data/test_339_A delete mode 100644 geom_bottleneck/tests/data/test_339_B delete mode 100644 geom_bottleneck/tests/data/test_340_A delete mode 100644 geom_bottleneck/tests/data/test_340_B delete mode 100644 geom_bottleneck/tests/data/test_341_A delete mode 100644 geom_bottleneck/tests/data/test_341_B delete mode 100644 geom_bottleneck/tests/data/test_342_A delete mode 100644 geom_bottleneck/tests/data/test_342_B delete mode 100644 geom_bottleneck/tests/data/test_343_A delete mode 100644 geom_bottleneck/tests/data/test_343_B delete mode 100644 geom_bottleneck/tests/data/test_344_A delete mode 100644 geom_bottleneck/tests/data/test_344_B delete mode 100644 geom_bottleneck/tests/data/test_345_A delete mode 100644 geom_bottleneck/tests/data/test_345_B delete mode 100644 geom_bottleneck/tests/data/test_346_A delete mode 100644 geom_bottleneck/tests/data/test_346_B delete mode 100644 geom_bottleneck/tests/data/test_347_A delete mode 100644 geom_bottleneck/tests/data/test_347_B delete mode 100644 geom_bottleneck/tests/data/test_348_A delete mode 100644 geom_bottleneck/tests/data/test_348_B delete mode 100644 geom_bottleneck/tests/data/test_349_A delete mode 100644 geom_bottleneck/tests/data/test_349_B delete mode 100644 geom_bottleneck/tests/data/test_350_A delete mode 100644 geom_bottleneck/tests/data/test_350_B delete mode 100644 geom_bottleneck/tests/data/test_351_A delete mode 100644 geom_bottleneck/tests/data/test_351_B delete mode 100644 geom_bottleneck/tests/data/test_352_A delete mode 100644 geom_bottleneck/tests/data/test_352_B delete mode 100644 geom_bottleneck/tests/data/test_353_A delete mode 100644 geom_bottleneck/tests/data/test_353_B delete mode 100644 geom_bottleneck/tests/data/test_354_A delete mode 100644 geom_bottleneck/tests/data/test_354_B delete mode 100644 geom_bottleneck/tests/data/test_355_A delete mode 100644 geom_bottleneck/tests/data/test_355_B delete mode 100644 geom_bottleneck/tests/data/test_356_A delete mode 100644 geom_bottleneck/tests/data/test_356_B delete mode 100644 geom_bottleneck/tests/data/test_357_A delete mode 100644 geom_bottleneck/tests/data/test_357_B delete mode 100644 geom_bottleneck/tests/data/test_358_A delete mode 100644 geom_bottleneck/tests/data/test_358_B delete mode 100644 geom_bottleneck/tests/data/test_359_A delete mode 100644 geom_bottleneck/tests/data/test_359_B delete mode 100644 geom_bottleneck/tests/data/test_360_A delete mode 100644 geom_bottleneck/tests/data/test_360_B delete mode 100644 geom_bottleneck/tests/data/test_361_A delete mode 100644 geom_bottleneck/tests/data/test_361_B delete mode 100644 geom_bottleneck/tests/data/test_362_A delete mode 100644 geom_bottleneck/tests/data/test_362_B delete mode 100644 geom_bottleneck/tests/data/test_363_A delete mode 100644 geom_bottleneck/tests/data/test_363_B delete mode 100644 geom_bottleneck/tests/data/test_364_A delete mode 100644 geom_bottleneck/tests/data/test_364_B delete mode 100644 geom_bottleneck/tests/data/test_365_A delete mode 100644 geom_bottleneck/tests/data/test_365_B delete mode 100644 geom_bottleneck/tests/data/test_366_A delete mode 100644 geom_bottleneck/tests/data/test_366_B delete mode 100644 geom_bottleneck/tests/data/test_367_A delete mode 100644 geom_bottleneck/tests/data/test_367_B delete mode 100644 geom_bottleneck/tests/data/test_368_A delete mode 100644 geom_bottleneck/tests/data/test_368_B delete mode 100644 geom_bottleneck/tests/data/test_369_A delete mode 100644 geom_bottleneck/tests/data/test_369_B delete mode 100644 geom_bottleneck/tests/data/test_370_A delete mode 100644 geom_bottleneck/tests/data/test_370_B delete mode 100644 geom_bottleneck/tests/data/test_371_A delete mode 100644 geom_bottleneck/tests/data/test_371_B delete mode 100644 geom_bottleneck/tests/data/test_372_A delete mode 100644 geom_bottleneck/tests/data/test_372_B delete mode 100644 geom_bottleneck/tests/data/test_373_A delete mode 100644 geom_bottleneck/tests/data/test_373_B delete mode 100644 geom_bottleneck/tests/data/test_374_A delete mode 100644 geom_bottleneck/tests/data/test_374_B delete mode 100644 geom_bottleneck/tests/data/test_375_A delete mode 100644 geom_bottleneck/tests/data/test_375_B delete mode 100644 geom_bottleneck/tests/data/test_376_A delete mode 100644 geom_bottleneck/tests/data/test_376_B delete mode 100644 geom_bottleneck/tests/data/test_377_A delete mode 100644 geom_bottleneck/tests/data/test_377_B delete mode 100644 geom_bottleneck/tests/data/test_378_A delete mode 100644 geom_bottleneck/tests/data/test_378_B delete mode 100644 geom_bottleneck/tests/data/test_379_A delete mode 100644 geom_bottleneck/tests/data/test_379_B delete mode 100644 geom_bottleneck/tests/data/test_380_A delete mode 100644 geom_bottleneck/tests/data/test_380_B delete mode 100644 geom_bottleneck/tests/data/test_381_A delete mode 100644 geom_bottleneck/tests/data/test_381_B delete mode 100644 geom_bottleneck/tests/data/test_382_A delete mode 100644 geom_bottleneck/tests/data/test_382_B delete mode 100644 geom_bottleneck/tests/data/test_383_A delete mode 100644 geom_bottleneck/tests/data/test_383_B delete mode 100644 geom_bottleneck/tests/data/test_384_A delete mode 100644 geom_bottleneck/tests/data/test_384_B delete mode 100644 geom_bottleneck/tests/data/test_385_A delete mode 100644 geom_bottleneck/tests/data/test_385_B delete mode 100644 geom_bottleneck/tests/data/test_386_A delete mode 100644 geom_bottleneck/tests/data/test_386_B delete mode 100644 geom_bottleneck/tests/data/test_387_A delete mode 100644 geom_bottleneck/tests/data/test_387_B delete mode 100644 geom_bottleneck/tests/data/test_388_A delete mode 100644 geom_bottleneck/tests/data/test_388_B delete mode 100644 geom_bottleneck/tests/data/test_389_A delete mode 100644 geom_bottleneck/tests/data/test_389_B delete mode 100644 geom_bottleneck/tests/data/test_390_A delete mode 100644 geom_bottleneck/tests/data/test_390_B delete mode 100644 geom_bottleneck/tests/data/test_391_A delete mode 100644 geom_bottleneck/tests/data/test_391_B delete mode 100644 geom_bottleneck/tests/data/test_392_A delete mode 100644 geom_bottleneck/tests/data/test_392_B delete mode 100644 geom_bottleneck/tests/data/test_393_A delete mode 100644 geom_bottleneck/tests/data/test_393_B delete mode 100644 geom_bottleneck/tests/data/test_394_A delete mode 100644 geom_bottleneck/tests/data/test_394_B delete mode 100644 geom_bottleneck/tests/data/test_395_A delete mode 100644 geom_bottleneck/tests/data/test_395_B delete mode 100644 geom_bottleneck/tests/data/test_396_A delete mode 100644 geom_bottleneck/tests/data/test_396_B delete mode 100644 geom_bottleneck/tests/data/test_397_A delete mode 100644 geom_bottleneck/tests/data/test_397_B delete mode 100644 geom_bottleneck/tests/data/test_398_A delete mode 100644 geom_bottleneck/tests/data/test_398_B delete mode 100644 geom_bottleneck/tests/data/test_399_A delete mode 100644 geom_bottleneck/tests/data/test_399_B delete mode 100644 geom_bottleneck/tests/data/test_400_A delete mode 100644 geom_bottleneck/tests/data/test_400_B delete mode 100644 geom_bottleneck/tests/data/test_401_A delete mode 100644 geom_bottleneck/tests/data/test_401_B delete mode 100644 geom_bottleneck/tests/data/test_402_A delete mode 100644 geom_bottleneck/tests/data/test_402_B delete mode 100644 geom_bottleneck/tests/data/test_403_A delete mode 100644 geom_bottleneck/tests/data/test_403_B delete mode 100644 geom_bottleneck/tests/data/test_404_A delete mode 100644 geom_bottleneck/tests/data/test_404_B delete mode 100644 geom_bottleneck/tests/data/test_405_A delete mode 100644 geom_bottleneck/tests/data/test_405_B delete mode 100644 geom_bottleneck/tests/data/test_406_A delete mode 100644 geom_bottleneck/tests/data/test_406_B delete mode 100644 geom_bottleneck/tests/data/test_407_A delete mode 100644 geom_bottleneck/tests/data/test_407_B delete mode 100644 geom_bottleneck/tests/data/test_408_A delete mode 100644 geom_bottleneck/tests/data/test_408_B delete mode 100644 geom_bottleneck/tests/data/test_409_A delete mode 100644 geom_bottleneck/tests/data/test_409_B delete mode 100644 geom_bottleneck/tests/data/test_410_A delete mode 100644 geom_bottleneck/tests/data/test_410_B delete mode 100644 geom_bottleneck/tests/data/test_411_A delete mode 100644 geom_bottleneck/tests/data/test_411_B delete mode 100644 geom_bottleneck/tests/data/test_412_A delete mode 100644 geom_bottleneck/tests/data/test_412_B delete mode 100644 geom_bottleneck/tests/data/test_413_A delete mode 100644 geom_bottleneck/tests/data/test_413_B delete mode 100644 geom_bottleneck/tests/data/test_414_A delete mode 100644 geom_bottleneck/tests/data/test_414_B delete mode 100644 geom_bottleneck/tests/data/test_415_A delete mode 100644 geom_bottleneck/tests/data/test_415_B delete mode 100644 geom_bottleneck/tests/data/test_416_A delete mode 100644 geom_bottleneck/tests/data/test_416_B delete mode 100644 geom_bottleneck/tests/data/test_417_A delete mode 100644 geom_bottleneck/tests/data/test_417_B delete mode 100644 geom_bottleneck/tests/data/test_418_A delete mode 100644 geom_bottleneck/tests/data/test_418_B delete mode 100644 geom_bottleneck/tests/data/test_419_A delete mode 100644 geom_bottleneck/tests/data/test_419_B delete mode 100644 geom_bottleneck/tests/data/test_420_A delete mode 100644 geom_bottleneck/tests/data/test_420_B delete mode 100644 geom_bottleneck/tests/data/test_421_A delete mode 100644 geom_bottleneck/tests/data/test_421_B delete mode 100644 geom_bottleneck/tests/data/test_422_A delete mode 100644 geom_bottleneck/tests/data/test_422_B delete mode 100644 geom_bottleneck/tests/data/test_423_A delete mode 100644 geom_bottleneck/tests/data/test_423_B delete mode 100644 geom_bottleneck/tests/data/test_424_A delete mode 100644 geom_bottleneck/tests/data/test_424_B delete mode 100644 geom_bottleneck/tests/data/test_425_A delete mode 100644 geom_bottleneck/tests/data/test_425_B delete mode 100644 geom_bottleneck/tests/data/test_426_A delete mode 100644 geom_bottleneck/tests/data/test_426_B delete mode 100644 geom_bottleneck/tests/data/test_427_A delete mode 100644 geom_bottleneck/tests/data/test_427_B delete mode 100644 geom_bottleneck/tests/data/test_428_A delete mode 100644 geom_bottleneck/tests/data/test_428_B delete mode 100644 geom_bottleneck/tests/data/test_429_A delete mode 100644 geom_bottleneck/tests/data/test_429_B delete mode 100644 geom_bottleneck/tests/data/test_430_A delete mode 100644 geom_bottleneck/tests/data/test_430_B delete mode 100644 geom_bottleneck/tests/data/test_431_A delete mode 100644 geom_bottleneck/tests/data/test_431_B delete mode 100644 geom_bottleneck/tests/data/test_432_A delete mode 100644 geom_bottleneck/tests/data/test_432_B delete mode 100644 geom_bottleneck/tests/data/test_433_A delete mode 100644 geom_bottleneck/tests/data/test_433_B delete mode 100644 geom_bottleneck/tests/data/test_434_A delete mode 100644 geom_bottleneck/tests/data/test_434_B delete mode 100644 geom_bottleneck/tests/data/test_435_A delete mode 100644 geom_bottleneck/tests/data/test_435_B delete mode 100644 geom_bottleneck/tests/data/test_436_A delete mode 100644 geom_bottleneck/tests/data/test_436_B delete mode 100644 geom_bottleneck/tests/data/test_437_A delete mode 100644 geom_bottleneck/tests/data/test_437_B delete mode 100644 geom_bottleneck/tests/data/test_438_A delete mode 100644 geom_bottleneck/tests/data/test_438_B delete mode 100644 geom_bottleneck/tests/data/test_439_A delete mode 100644 geom_bottleneck/tests/data/test_439_B delete mode 100644 geom_bottleneck/tests/data/test_440_A delete mode 100644 geom_bottleneck/tests/data/test_440_B delete mode 100644 geom_bottleneck/tests/data/test_441_A delete mode 100644 geom_bottleneck/tests/data/test_441_B delete mode 100644 geom_bottleneck/tests/data/test_442_A delete mode 100644 geom_bottleneck/tests/data/test_442_B delete mode 100644 geom_bottleneck/tests/data/test_443_A delete mode 100644 geom_bottleneck/tests/data/test_443_B delete mode 100644 geom_bottleneck/tests/data/test_444_A delete mode 100644 geom_bottleneck/tests/data/test_444_B delete mode 100644 geom_bottleneck/tests/data/test_445_A delete mode 100644 geom_bottleneck/tests/data/test_445_B delete mode 100644 geom_bottleneck/tests/data/test_446_A delete mode 100644 geom_bottleneck/tests/data/test_446_B delete mode 100644 geom_bottleneck/tests/data/test_447_A delete mode 100644 geom_bottleneck/tests/data/test_447_B delete mode 100644 geom_bottleneck/tests/data/test_448_A delete mode 100644 geom_bottleneck/tests/data/test_448_B delete mode 100644 geom_bottleneck/tests/data/test_449_A delete mode 100644 geom_bottleneck/tests/data/test_449_B delete mode 100644 geom_bottleneck/tests/data/test_450_A delete mode 100644 geom_bottleneck/tests/data/test_450_B delete mode 100644 geom_bottleneck/tests/data/test_451_A delete mode 100644 geom_bottleneck/tests/data/test_451_B delete mode 100644 geom_bottleneck/tests/data/test_452_A delete mode 100644 geom_bottleneck/tests/data/test_452_B delete mode 100644 geom_bottleneck/tests/data/test_453_A delete mode 100644 geom_bottleneck/tests/data/test_453_B delete mode 100644 geom_bottleneck/tests/data/test_454_A delete mode 100644 geom_bottleneck/tests/data/test_454_B delete mode 100644 geom_bottleneck/tests/data/test_455_A delete mode 100644 geom_bottleneck/tests/data/test_455_B delete mode 100644 geom_bottleneck/tests/data/test_456_A delete mode 100644 geom_bottleneck/tests/data/test_456_B delete mode 100644 geom_bottleneck/tests/data/test_457_A delete mode 100644 geom_bottleneck/tests/data/test_457_B delete mode 100644 geom_bottleneck/tests/data/test_458_A delete mode 100644 geom_bottleneck/tests/data/test_458_B delete mode 100644 geom_bottleneck/tests/data/test_459_A delete mode 100644 geom_bottleneck/tests/data/test_459_B delete mode 100644 geom_bottleneck/tests/data/test_460_A delete mode 100644 geom_bottleneck/tests/data/test_460_B delete mode 100644 geom_bottleneck/tests/data/test_461_A delete mode 100644 geom_bottleneck/tests/data/test_461_B delete mode 100644 geom_bottleneck/tests/data/test_462_A delete mode 100644 geom_bottleneck/tests/data/test_462_B delete mode 100644 geom_bottleneck/tests/data/test_463_A delete mode 100644 geom_bottleneck/tests/data/test_463_B delete mode 100644 geom_bottleneck/tests/data/test_464_A delete mode 100644 geom_bottleneck/tests/data/test_464_B delete mode 100644 geom_bottleneck/tests/data/test_465_A delete mode 100644 geom_bottleneck/tests/data/test_465_B delete mode 100644 geom_bottleneck/tests/data/test_466_A delete mode 100644 geom_bottleneck/tests/data/test_466_B delete mode 100644 geom_bottleneck/tests/data/test_467_A delete mode 100644 geom_bottleneck/tests/data/test_467_B delete mode 100644 geom_bottleneck/tests/data/test_468_A delete mode 100644 geom_bottleneck/tests/data/test_468_B delete mode 100644 geom_bottleneck/tests/data/test_469_A delete mode 100644 geom_bottleneck/tests/data/test_469_B delete mode 100644 geom_bottleneck/tests/data/test_470_A delete mode 100644 geom_bottleneck/tests/data/test_470_B delete mode 100644 geom_bottleneck/tests/data/test_471_A delete mode 100644 geom_bottleneck/tests/data/test_471_B delete mode 100644 geom_bottleneck/tests/data/test_472_A delete mode 100644 geom_bottleneck/tests/data/test_472_B delete mode 100644 geom_bottleneck/tests/data/test_473_A delete mode 100644 geom_bottleneck/tests/data/test_473_B delete mode 100644 geom_bottleneck/tests/data/test_474_A delete mode 100644 geom_bottleneck/tests/data/test_474_B delete mode 100644 geom_bottleneck/tests/data/test_475_A delete mode 100644 geom_bottleneck/tests/data/test_475_B delete mode 100644 geom_bottleneck/tests/data/test_476_A delete mode 100644 geom_bottleneck/tests/data/test_476_B delete mode 100644 geom_bottleneck/tests/data/test_477_A delete mode 100644 geom_bottleneck/tests/data/test_477_B delete mode 100644 geom_bottleneck/tests/data/test_478_A delete mode 100644 geom_bottleneck/tests/data/test_478_B delete mode 100644 geom_bottleneck/tests/data/test_479_A delete mode 100644 geom_bottleneck/tests/data/test_479_B delete mode 100644 geom_bottleneck/tests/data/test_480_A delete mode 100644 geom_bottleneck/tests/data/test_480_B delete mode 100644 geom_bottleneck/tests/data/test_481_A delete mode 100644 geom_bottleneck/tests/data/test_481_B delete mode 100644 geom_bottleneck/tests/data/test_482_A delete mode 100644 geom_bottleneck/tests/data/test_482_B delete mode 100644 geom_bottleneck/tests/data/test_483_A delete mode 100644 geom_bottleneck/tests/data/test_483_B delete mode 100644 geom_bottleneck/tests/data/test_484_A delete mode 100644 geom_bottleneck/tests/data/test_484_B delete mode 100644 geom_bottleneck/tests/data/test_485_A delete mode 100644 geom_bottleneck/tests/data/test_485_B delete mode 100644 geom_bottleneck/tests/data/test_486_A delete mode 100644 geom_bottleneck/tests/data/test_486_B delete mode 100644 geom_bottleneck/tests/data/test_487_A delete mode 100644 geom_bottleneck/tests/data/test_487_B delete mode 100644 geom_bottleneck/tests/data/test_488_A delete mode 100644 geom_bottleneck/tests/data/test_488_B delete mode 100644 geom_bottleneck/tests/data/test_489_A delete mode 100644 geom_bottleneck/tests/data/test_489_B delete mode 100644 geom_bottleneck/tests/data/test_490_A delete mode 100644 geom_bottleneck/tests/data/test_490_B delete mode 100644 geom_bottleneck/tests/data/test_491_A delete mode 100644 geom_bottleneck/tests/data/test_491_B delete mode 100644 geom_bottleneck/tests/data/test_492_A delete mode 100644 geom_bottleneck/tests/data/test_492_B delete mode 100644 geom_bottleneck/tests/data/test_493_A delete mode 100644 geom_bottleneck/tests/data/test_493_B delete mode 100644 geom_bottleneck/tests/data/test_494_A delete mode 100644 geom_bottleneck/tests/data/test_494_B delete mode 100644 geom_bottleneck/tests/data/test_495_A delete mode 100644 geom_bottleneck/tests/data/test_495_B delete mode 100644 geom_bottleneck/tests/data/test_496_A delete mode 100644 geom_bottleneck/tests/data/test_496_B delete mode 100644 geom_bottleneck/tests/data/test_497_A delete mode 100644 geom_bottleneck/tests/data/test_497_B delete mode 100644 geom_bottleneck/tests/data/test_498_A delete mode 100644 geom_bottleneck/tests/data/test_498_B delete mode 100644 geom_bottleneck/tests/data/test_499_A delete mode 100644 geom_bottleneck/tests/data/test_499_B delete mode 100644 geom_bottleneck/tests/data/test_500_A delete mode 100644 geom_bottleneck/tests/data/test_500_B delete mode 100644 geom_bottleneck/tests/data/test_501_A delete mode 100644 geom_bottleneck/tests/data/test_501_B delete mode 100644 geom_bottleneck/tests/data/test_502_A delete mode 100644 geom_bottleneck/tests/data/test_502_B delete mode 100644 geom_bottleneck/tests/data/test_503_A delete mode 100644 geom_bottleneck/tests/data/test_503_B delete mode 100644 geom_bottleneck/tests/data/test_504_A delete mode 100644 geom_bottleneck/tests/data/test_504_B delete mode 100644 geom_bottleneck/tests/data/test_505_A delete mode 100644 geom_bottleneck/tests/data/test_505_B delete mode 100644 geom_bottleneck/tests/data/test_506_A delete mode 100644 geom_bottleneck/tests/data/test_506_B delete mode 100644 geom_bottleneck/tests/data/test_507_A delete mode 100644 geom_bottleneck/tests/data/test_507_B delete mode 100644 geom_bottleneck/tests/data/test_508_A delete mode 100644 geom_bottleneck/tests/data/test_508_B delete mode 100644 geom_bottleneck/tests/data/test_509_A delete mode 100644 geom_bottleneck/tests/data/test_509_B delete mode 100644 geom_bottleneck/tests/data/test_510_A delete mode 100644 geom_bottleneck/tests/data/test_510_B delete mode 100644 geom_bottleneck/tests/data/test_511_A delete mode 100644 geom_bottleneck/tests/data/test_511_B delete mode 100644 geom_bottleneck/tests/data/test_512_A delete mode 100644 geom_bottleneck/tests/data/test_512_B delete mode 100644 geom_bottleneck/tests/data/test_513_A delete mode 100644 geom_bottleneck/tests/data/test_513_B delete mode 100644 geom_bottleneck/tests/data/test_514_A delete mode 100644 geom_bottleneck/tests/data/test_514_B delete mode 100644 geom_bottleneck/tests/data/test_515_A delete mode 100644 geom_bottleneck/tests/data/test_515_B delete mode 100644 geom_bottleneck/tests/data/test_516_A delete mode 100644 geom_bottleneck/tests/data/test_516_B delete mode 100644 geom_bottleneck/tests/data/test_517_A delete mode 100644 geom_bottleneck/tests/data/test_517_B delete mode 100644 geom_bottleneck/tests/data/test_518_A delete mode 100644 geom_bottleneck/tests/data/test_518_B delete mode 100644 geom_bottleneck/tests/data/test_519_A delete mode 100644 geom_bottleneck/tests/data/test_519_B delete mode 100644 geom_bottleneck/tests/data/test_520_A delete mode 100644 geom_bottleneck/tests/data/test_520_B delete mode 100644 geom_bottleneck/tests/data/test_521_A delete mode 100644 geom_bottleneck/tests/data/test_521_B delete mode 100644 geom_bottleneck/tests/data/test_522_A delete mode 100644 geom_bottleneck/tests/data/test_522_B delete mode 100644 geom_bottleneck/tests/data/test_523_A delete mode 100644 geom_bottleneck/tests/data/test_523_B delete mode 100644 geom_bottleneck/tests/data/test_524_A delete mode 100644 geom_bottleneck/tests/data/test_524_B delete mode 100644 geom_bottleneck/tests/data/test_525_A delete mode 100644 geom_bottleneck/tests/data/test_525_B delete mode 100644 geom_bottleneck/tests/data/test_526_A delete mode 100644 geom_bottleneck/tests/data/test_526_B delete mode 100644 geom_bottleneck/tests/data/test_527_A delete mode 100644 geom_bottleneck/tests/data/test_527_B delete mode 100644 geom_bottleneck/tests/data/test_528_A delete mode 100644 geom_bottleneck/tests/data/test_528_B delete mode 100644 geom_bottleneck/tests/data/test_529_A delete mode 100644 geom_bottleneck/tests/data/test_529_B delete mode 100644 geom_bottleneck/tests/data/test_530_A delete mode 100644 geom_bottleneck/tests/data/test_530_B delete mode 100644 geom_bottleneck/tests/data/test_531_A delete mode 100644 geom_bottleneck/tests/data/test_531_B delete mode 100644 geom_bottleneck/tests/data/test_532_A delete mode 100644 geom_bottleneck/tests/data/test_532_B delete mode 100644 geom_bottleneck/tests/data/test_533_A delete mode 100644 geom_bottleneck/tests/data/test_533_B delete mode 100644 geom_bottleneck/tests/data/test_534_A delete mode 100644 geom_bottleneck/tests/data/test_534_B delete mode 100644 geom_bottleneck/tests/data/test_535_A delete mode 100644 geom_bottleneck/tests/data/test_535_B delete mode 100644 geom_bottleneck/tests/data/test_536_A delete mode 100644 geom_bottleneck/tests/data/test_536_B delete mode 100644 geom_bottleneck/tests/data/test_537_A delete mode 100644 geom_bottleneck/tests/data/test_537_B delete mode 100644 geom_bottleneck/tests/data/test_538_A delete mode 100644 geom_bottleneck/tests/data/test_538_B delete mode 100644 geom_bottleneck/tests/data/test_539_A delete mode 100644 geom_bottleneck/tests/data/test_539_B delete mode 100644 geom_bottleneck/tests/data/test_540_A delete mode 100644 geom_bottleneck/tests/data/test_540_B delete mode 100644 geom_bottleneck/tests/data/test_541_A delete mode 100644 geom_bottleneck/tests/data/test_541_B delete mode 100644 geom_bottleneck/tests/data/test_542_A delete mode 100644 geom_bottleneck/tests/data/test_542_B delete mode 100644 geom_bottleneck/tests/data/test_543_A delete mode 100644 geom_bottleneck/tests/data/test_543_B delete mode 100644 geom_bottleneck/tests/data/test_544_A delete mode 100644 geom_bottleneck/tests/data/test_544_B delete mode 100644 geom_bottleneck/tests/data/test_545_A delete mode 100644 geom_bottleneck/tests/data/test_545_B delete mode 100644 geom_bottleneck/tests/data/test_546_A delete mode 100644 geom_bottleneck/tests/data/test_546_B delete mode 100644 geom_bottleneck/tests/data/test_547_A delete mode 100644 geom_bottleneck/tests/data/test_547_B delete mode 100644 geom_bottleneck/tests/data/test_548_A delete mode 100644 geom_bottleneck/tests/data/test_548_B delete mode 100644 geom_bottleneck/tests/data/test_549_A delete mode 100644 geom_bottleneck/tests/data/test_549_B delete mode 100644 geom_bottleneck/tests/data/test_550_A delete mode 100644 geom_bottleneck/tests/data/test_550_B delete mode 100644 geom_bottleneck/tests/data/test_551_A delete mode 100644 geom_bottleneck/tests/data/test_551_B delete mode 100644 geom_bottleneck/tests/data/test_552_A delete mode 100644 geom_bottleneck/tests/data/test_552_B delete mode 100644 geom_bottleneck/tests/data/test_553_A delete mode 100644 geom_bottleneck/tests/data/test_553_B delete mode 100644 geom_bottleneck/tests/data/test_554_A delete mode 100644 geom_bottleneck/tests/data/test_554_B delete mode 100644 geom_bottleneck/tests/data/test_555_A delete mode 100644 geom_bottleneck/tests/data/test_555_B delete mode 100644 geom_bottleneck/tests/data/test_556_A delete mode 100644 geom_bottleneck/tests/data/test_556_B delete mode 100644 geom_bottleneck/tests/data/test_557_A delete mode 100644 geom_bottleneck/tests/data/test_557_B delete mode 100644 geom_bottleneck/tests/data/test_558_A delete mode 100644 geom_bottleneck/tests/data/test_558_B delete mode 100644 geom_bottleneck/tests/data/test_559_A delete mode 100644 geom_bottleneck/tests/data/test_559_B delete mode 100644 geom_bottleneck/tests/data/test_560_A delete mode 100644 geom_bottleneck/tests/data/test_560_B delete mode 100644 geom_bottleneck/tests/data/test_561_A delete mode 100644 geom_bottleneck/tests/data/test_561_B delete mode 100644 geom_bottleneck/tests/data/test_562_A delete mode 100644 geom_bottleneck/tests/data/test_562_B delete mode 100644 geom_bottleneck/tests/data/test_563_A delete mode 100644 geom_bottleneck/tests/data/test_563_B delete mode 100644 geom_bottleneck/tests/data/test_564_A delete mode 100644 geom_bottleneck/tests/data/test_564_B delete mode 100644 geom_bottleneck/tests/data/test_565_A delete mode 100644 geom_bottleneck/tests/data/test_565_B delete mode 100644 geom_bottleneck/tests/data/test_566_A delete mode 100644 geom_bottleneck/tests/data/test_566_B delete mode 100644 geom_bottleneck/tests/data/test_567_A delete mode 100644 geom_bottleneck/tests/data/test_567_B delete mode 100644 geom_bottleneck/tests/data/test_568_A delete mode 100644 geom_bottleneck/tests/data/test_568_B delete mode 100644 geom_bottleneck/tests/data/test_569_A delete mode 100644 geom_bottleneck/tests/data/test_569_B delete mode 100644 geom_bottleneck/tests/data/test_570_A delete mode 100644 geom_bottleneck/tests/data/test_570_B delete mode 100644 geom_bottleneck/tests/data/test_571_A delete mode 100644 geom_bottleneck/tests/data/test_571_B delete mode 100644 geom_bottleneck/tests/data/test_572_A delete mode 100644 geom_bottleneck/tests/data/test_572_B delete mode 100644 geom_bottleneck/tests/data/test_573_A delete mode 100644 geom_bottleneck/tests/data/test_573_B delete mode 100644 geom_bottleneck/tests/data/test_574_A delete mode 100644 geom_bottleneck/tests/data/test_574_B delete mode 100644 geom_bottleneck/tests/data/test_575_A delete mode 100644 geom_bottleneck/tests/data/test_575_B delete mode 100644 geom_bottleneck/tests/data/test_576_A delete mode 100644 geom_bottleneck/tests/data/test_576_B delete mode 100644 geom_bottleneck/tests/data/test_577_A delete mode 100644 geom_bottleneck/tests/data/test_577_B delete mode 100644 geom_bottleneck/tests/data/test_578_A delete mode 100644 geom_bottleneck/tests/data/test_578_B delete mode 100644 geom_bottleneck/tests/data/test_579_A delete mode 100644 geom_bottleneck/tests/data/test_579_B delete mode 100644 geom_bottleneck/tests/data/test_580_A delete mode 100644 geom_bottleneck/tests/data/test_580_B delete mode 100644 geom_bottleneck/tests/data/test_581_A delete mode 100644 geom_bottleneck/tests/data/test_581_B delete mode 100644 geom_bottleneck/tests/data/test_582_A delete mode 100644 geom_bottleneck/tests/data/test_582_B delete mode 100644 geom_bottleneck/tests/data/test_583_A delete mode 100644 geom_bottleneck/tests/data/test_583_B delete mode 100644 geom_bottleneck/tests/data/test_584_A delete mode 100644 geom_bottleneck/tests/data/test_584_B delete mode 100644 geom_bottleneck/tests/data/test_585_A delete mode 100644 geom_bottleneck/tests/data/test_585_B delete mode 100644 geom_bottleneck/tests/data/test_586_A delete mode 100644 geom_bottleneck/tests/data/test_586_B delete mode 100644 geom_bottleneck/tests/data/test_587_A delete mode 100644 geom_bottleneck/tests/data/test_587_B delete mode 100644 geom_bottleneck/tests/data/test_588_A delete mode 100644 geom_bottleneck/tests/data/test_588_B delete mode 100644 geom_bottleneck/tests/data/test_589_A delete mode 100644 geom_bottleneck/tests/data/test_589_B delete mode 100644 geom_bottleneck/tests/data/test_590_A delete mode 100644 geom_bottleneck/tests/data/test_590_B delete mode 100644 geom_bottleneck/tests/data/test_591_A delete mode 100644 geom_bottleneck/tests/data/test_591_B delete mode 100644 geom_bottleneck/tests/data/test_592_A delete mode 100644 geom_bottleneck/tests/data/test_592_B delete mode 100644 geom_bottleneck/tests/data/test_593_A delete mode 100644 geom_bottleneck/tests/data/test_593_B delete mode 100644 geom_bottleneck/tests/data/test_594_A delete mode 100644 geom_bottleneck/tests/data/test_594_B delete mode 100644 geom_bottleneck/tests/data/test_595_A delete mode 100644 geom_bottleneck/tests/data/test_595_B delete mode 100644 geom_bottleneck/tests/data/test_596_A delete mode 100644 geom_bottleneck/tests/data/test_596_B delete mode 100644 geom_bottleneck/tests/data/test_597_A delete mode 100644 geom_bottleneck/tests/data/test_597_B delete mode 100644 geom_bottleneck/tests/data/test_598_A delete mode 100644 geom_bottleneck/tests/data/test_598_B delete mode 100644 geom_bottleneck/tests/data/test_599_A delete mode 100644 geom_bottleneck/tests/data/test_599_B delete mode 100644 geom_bottleneck/tests/data/test_600_A delete mode 100644 geom_bottleneck/tests/data/test_600_B delete mode 100644 geom_bottleneck/tests/data/test_601_A delete mode 100644 geom_bottleneck/tests/data/test_601_B delete mode 100644 geom_bottleneck/tests/data/test_602_A delete mode 100644 geom_bottleneck/tests/data/test_602_B delete mode 100644 geom_bottleneck/tests/data/test_603_A delete mode 100644 geom_bottleneck/tests/data/test_603_B delete mode 100644 geom_bottleneck/tests/data/test_604_A delete mode 100644 geom_bottleneck/tests/data/test_604_B delete mode 100644 geom_bottleneck/tests/data/test_605_A delete mode 100644 geom_bottleneck/tests/data/test_605_B delete mode 100644 geom_bottleneck/tests/data/test_606_A delete mode 100644 geom_bottleneck/tests/data/test_606_B delete mode 100644 geom_bottleneck/tests/data/test_607_A delete mode 100644 geom_bottleneck/tests/data/test_607_B delete mode 100644 geom_bottleneck/tests/data/test_608_A delete mode 100644 geom_bottleneck/tests/data/test_608_B delete mode 100644 geom_bottleneck/tests/data/test_609_A delete mode 100644 geom_bottleneck/tests/data/test_609_B delete mode 100644 geom_bottleneck/tests/data/test_610_A delete mode 100644 geom_bottleneck/tests/data/test_610_B delete mode 100644 geom_bottleneck/tests/data/test_611_A delete mode 100644 geom_bottleneck/tests/data/test_611_B delete mode 100644 geom_bottleneck/tests/data/test_612_A delete mode 100644 geom_bottleneck/tests/data/test_612_B delete mode 100644 geom_bottleneck/tests/data/test_613_A delete mode 100644 geom_bottleneck/tests/data/test_613_B delete mode 100644 geom_bottleneck/tests/data/test_614_A delete mode 100644 geom_bottleneck/tests/data/test_614_B delete mode 100644 geom_bottleneck/tests/data/test_615_A delete mode 100644 geom_bottleneck/tests/data/test_615_B delete mode 100644 geom_bottleneck/tests/data/test_616_A delete mode 100644 geom_bottleneck/tests/data/test_616_B delete mode 100644 geom_bottleneck/tests/data/test_617_A delete mode 100644 geom_bottleneck/tests/data/test_617_B delete mode 100644 geom_bottleneck/tests/data/test_618_A delete mode 100644 geom_bottleneck/tests/data/test_618_B delete mode 100644 geom_bottleneck/tests/data/test_619_A delete mode 100644 geom_bottleneck/tests/data/test_619_B delete mode 100644 geom_bottleneck/tests/data/test_620_A delete mode 100644 geom_bottleneck/tests/data/test_620_B delete mode 100644 geom_bottleneck/tests/data/test_621_A delete mode 100644 geom_bottleneck/tests/data/test_621_B delete mode 100644 geom_bottleneck/tests/data/test_622_A delete mode 100644 geom_bottleneck/tests/data/test_622_B delete mode 100644 geom_bottleneck/tests/data/test_623_A delete mode 100644 geom_bottleneck/tests/data/test_623_B delete mode 100644 geom_bottleneck/tests/data/test_624_A delete mode 100644 geom_bottleneck/tests/data/test_624_B delete mode 100644 geom_bottleneck/tests/data/test_625_A delete mode 100644 geom_bottleneck/tests/data/test_625_B delete mode 100644 geom_bottleneck/tests/data/test_626_A delete mode 100644 geom_bottleneck/tests/data/test_626_B delete mode 100644 geom_bottleneck/tests/data/test_627_A delete mode 100644 geom_bottleneck/tests/data/test_627_B delete mode 100644 geom_bottleneck/tests/data/test_628_A delete mode 100644 geom_bottleneck/tests/data/test_628_B delete mode 100644 geom_bottleneck/tests/data/test_629_A delete mode 100644 geom_bottleneck/tests/data/test_629_B delete mode 100644 geom_bottleneck/tests/data/test_630_A delete mode 100644 geom_bottleneck/tests/data/test_630_B delete mode 100644 geom_bottleneck/tests/data/test_631_A delete mode 100644 geom_bottleneck/tests/data/test_631_B delete mode 100644 geom_bottleneck/tests/data/test_632_A delete mode 100644 geom_bottleneck/tests/data/test_632_B delete mode 100644 geom_bottleneck/tests/data/test_633_A delete mode 100644 geom_bottleneck/tests/data/test_633_B delete mode 100644 geom_bottleneck/tests/data/test_634_A delete mode 100644 geom_bottleneck/tests/data/test_634_B delete mode 100644 geom_bottleneck/tests/data/test_635_A delete mode 100644 geom_bottleneck/tests/data/test_635_B delete mode 100644 geom_bottleneck/tests/data/test_636_A delete mode 100644 geom_bottleneck/tests/data/test_636_B delete mode 100644 geom_bottleneck/tests/data/test_637_A delete mode 100644 geom_bottleneck/tests/data/test_637_B delete mode 100644 geom_bottleneck/tests/data/test_638_A delete mode 100644 geom_bottleneck/tests/data/test_638_B delete mode 100644 geom_bottleneck/tests/data/test_639_A delete mode 100644 geom_bottleneck/tests/data/test_639_B delete mode 100644 geom_bottleneck/tests/data/test_640_A delete mode 100644 geom_bottleneck/tests/data/test_640_B delete mode 100644 geom_bottleneck/tests/data/test_641_A delete mode 100644 geom_bottleneck/tests/data/test_641_B delete mode 100644 geom_bottleneck/tests/data/test_642_A delete mode 100644 geom_bottleneck/tests/data/test_642_B delete mode 100644 geom_bottleneck/tests/data/test_643_A delete mode 100644 geom_bottleneck/tests/data/test_643_B delete mode 100644 geom_bottleneck/tests/data/test_644_A delete mode 100644 geom_bottleneck/tests/data/test_644_B delete mode 100644 geom_bottleneck/tests/data/test_645_A delete mode 100644 geom_bottleneck/tests/data/test_645_B delete mode 100644 geom_bottleneck/tests/data/test_646_A delete mode 100644 geom_bottleneck/tests/data/test_646_B delete mode 100644 geom_bottleneck/tests/data/test_647_A delete mode 100644 geom_bottleneck/tests/data/test_647_B delete mode 100644 geom_bottleneck/tests/data/test_648_A delete mode 100644 geom_bottleneck/tests/data/test_648_B delete mode 100644 geom_bottleneck/tests/data/test_649_A delete mode 100644 geom_bottleneck/tests/data/test_649_B delete mode 100644 geom_bottleneck/tests/data/test_650_A delete mode 100644 geom_bottleneck/tests/data/test_650_B delete mode 100644 geom_bottleneck/tests/data/test_651_A delete mode 100644 geom_bottleneck/tests/data/test_651_B delete mode 100644 geom_bottleneck/tests/data/test_652_A delete mode 100644 geom_bottleneck/tests/data/test_652_B delete mode 100644 geom_bottleneck/tests/data/test_653_A delete mode 100644 geom_bottleneck/tests/data/test_653_B delete mode 100644 geom_bottleneck/tests/data/test_654_A delete mode 100644 geom_bottleneck/tests/data/test_654_B delete mode 100644 geom_bottleneck/tests/data/test_655_A delete mode 100644 geom_bottleneck/tests/data/test_655_B delete mode 100644 geom_bottleneck/tests/data/test_656_A delete mode 100644 geom_bottleneck/tests/data/test_656_B delete mode 100644 geom_bottleneck/tests/data/test_657_A delete mode 100644 geom_bottleneck/tests/data/test_657_B delete mode 100644 geom_bottleneck/tests/data/test_658_A delete mode 100644 geom_bottleneck/tests/data/test_658_B delete mode 100644 geom_bottleneck/tests/data/test_659_A delete mode 100644 geom_bottleneck/tests/data/test_659_B delete mode 100644 geom_bottleneck/tests/data/test_660_A delete mode 100644 geom_bottleneck/tests/data/test_660_B delete mode 100644 geom_bottleneck/tests/data/test_661_A delete mode 100644 geom_bottleneck/tests/data/test_661_B delete mode 100644 geom_bottleneck/tests/data/test_662_A delete mode 100644 geom_bottleneck/tests/data/test_662_B delete mode 100644 geom_bottleneck/tests/data/test_663_A delete mode 100644 geom_bottleneck/tests/data/test_663_B delete mode 100644 geom_bottleneck/tests/data/test_664_A delete mode 100644 geom_bottleneck/tests/data/test_664_B delete mode 100644 geom_bottleneck/tests/data/test_665_A delete mode 100644 geom_bottleneck/tests/data/test_665_B delete mode 100644 geom_bottleneck/tests/data/test_666_A delete mode 100644 geom_bottleneck/tests/data/test_666_B delete mode 100644 geom_bottleneck/tests/data/test_667_A delete mode 100644 geom_bottleneck/tests/data/test_667_B delete mode 100644 geom_bottleneck/tests/data/test_668_A delete mode 100644 geom_bottleneck/tests/data/test_668_B delete mode 100644 geom_bottleneck/tests/data/test_669_A delete mode 100644 geom_bottleneck/tests/data/test_669_B delete mode 100644 geom_bottleneck/tests/data/test_670_A delete mode 100644 geom_bottleneck/tests/data/test_670_B delete mode 100644 geom_bottleneck/tests/data/test_671_A delete mode 100644 geom_bottleneck/tests/data/test_671_B delete mode 100644 geom_bottleneck/tests/data/test_672_A delete mode 100644 geom_bottleneck/tests/data/test_672_B delete mode 100644 geom_bottleneck/tests/data/test_673_A delete mode 100644 geom_bottleneck/tests/data/test_673_B delete mode 100644 geom_bottleneck/tests/data/test_674_A delete mode 100644 geom_bottleneck/tests/data/test_674_B delete mode 100644 geom_bottleneck/tests/data/test_675_A delete mode 100644 geom_bottleneck/tests/data/test_675_B delete mode 100644 geom_bottleneck/tests/data/test_676_A delete mode 100644 geom_bottleneck/tests/data/test_676_B delete mode 100644 geom_bottleneck/tests/data/test_677_A delete mode 100644 geom_bottleneck/tests/data/test_677_B delete mode 100644 geom_bottleneck/tests/data/test_678_A delete mode 100644 geom_bottleneck/tests/data/test_678_B delete mode 100644 geom_bottleneck/tests/data/test_679_A delete mode 100644 geom_bottleneck/tests/data/test_679_B delete mode 100644 geom_bottleneck/tests/data/test_680_A delete mode 100644 geom_bottleneck/tests/data/test_680_B delete mode 100644 geom_bottleneck/tests/data/test_681_A delete mode 100644 geom_bottleneck/tests/data/test_681_B delete mode 100644 geom_bottleneck/tests/data/test_682_A delete mode 100644 geom_bottleneck/tests/data/test_682_B delete mode 100644 geom_bottleneck/tests/data/test_683_A delete mode 100644 geom_bottleneck/tests/data/test_683_B delete mode 100644 geom_bottleneck/tests/data/test_684_A delete mode 100644 geom_bottleneck/tests/data/test_684_B delete mode 100644 geom_bottleneck/tests/data/test_685_A delete mode 100644 geom_bottleneck/tests/data/test_685_B delete mode 100644 geom_bottleneck/tests/data/test_686_A delete mode 100644 geom_bottleneck/tests/data/test_686_B delete mode 100644 geom_bottleneck/tests/data/test_687_A delete mode 100644 geom_bottleneck/tests/data/test_687_B delete mode 100644 geom_bottleneck/tests/data/test_688_A delete mode 100644 geom_bottleneck/tests/data/test_688_B delete mode 100644 geom_bottleneck/tests/data/test_689_A delete mode 100644 geom_bottleneck/tests/data/test_689_B delete mode 100644 geom_bottleneck/tests/data/test_690_A delete mode 100644 geom_bottleneck/tests/data/test_690_B delete mode 100644 geom_bottleneck/tests/data/test_691_A delete mode 100644 geom_bottleneck/tests/data/test_691_B delete mode 100644 geom_bottleneck/tests/data/test_692_A delete mode 100644 geom_bottleneck/tests/data/test_692_B delete mode 100644 geom_bottleneck/tests/data/test_693_A delete mode 100644 geom_bottleneck/tests/data/test_693_B delete mode 100644 geom_bottleneck/tests/data/test_694_A delete mode 100644 geom_bottleneck/tests/data/test_694_B delete mode 100644 geom_bottleneck/tests/data/test_695_A delete mode 100644 geom_bottleneck/tests/data/test_695_B delete mode 100644 geom_bottleneck/tests/data/test_696_A delete mode 100644 geom_bottleneck/tests/data/test_696_B delete mode 100644 geom_bottleneck/tests/data/test_697_A delete mode 100644 geom_bottleneck/tests/data/test_697_B delete mode 100644 geom_bottleneck/tests/data/test_698_A delete mode 100644 geom_bottleneck/tests/data/test_698_B delete mode 100644 geom_bottleneck/tests/data/test_699_A delete mode 100644 geom_bottleneck/tests/data/test_699_B delete mode 100644 geom_bottleneck/tests/data/test_700_A delete mode 100644 geom_bottleneck/tests/data/test_700_B delete mode 100644 geom_bottleneck/tests/data/test_701_A delete mode 100644 geom_bottleneck/tests/data/test_701_B delete mode 100644 geom_bottleneck/tests/data/test_702_A delete mode 100644 geom_bottleneck/tests/data/test_702_B delete mode 100644 geom_bottleneck/tests/data/test_703_A delete mode 100644 geom_bottleneck/tests/data/test_703_B delete mode 100644 geom_bottleneck/tests/data/test_704_A delete mode 100644 geom_bottleneck/tests/data/test_704_B delete mode 100644 geom_bottleneck/tests/data/test_705_A delete mode 100644 geom_bottleneck/tests/data/test_705_B delete mode 100644 geom_bottleneck/tests/data/test_706_A delete mode 100644 geom_bottleneck/tests/data/test_706_B delete mode 100644 geom_bottleneck/tests/data/test_707_A delete mode 100644 geom_bottleneck/tests/data/test_707_B delete mode 100644 geom_bottleneck/tests/data/test_708_A delete mode 100644 geom_bottleneck/tests/data/test_708_B delete mode 100644 geom_bottleneck/tests/data/test_709_A delete mode 100644 geom_bottleneck/tests/data/test_709_B delete mode 100644 geom_bottleneck/tests/data/test_710_A delete mode 100644 geom_bottleneck/tests/data/test_710_B delete mode 100644 geom_bottleneck/tests/data/test_711_A delete mode 100644 geom_bottleneck/tests/data/test_711_B delete mode 100644 geom_bottleneck/tests/data/test_712_A delete mode 100644 geom_bottleneck/tests/data/test_712_B delete mode 100644 geom_bottleneck/tests/data/test_713_A delete mode 100644 geom_bottleneck/tests/data/test_713_B delete mode 100644 geom_bottleneck/tests/data/test_714_A delete mode 100644 geom_bottleneck/tests/data/test_714_B delete mode 100644 geom_bottleneck/tests/data/test_715_A delete mode 100644 geom_bottleneck/tests/data/test_715_B delete mode 100644 geom_bottleneck/tests/data/test_716_A delete mode 100644 geom_bottleneck/tests/data/test_716_B delete mode 100644 geom_bottleneck/tests/data/test_717_A delete mode 100644 geom_bottleneck/tests/data/test_717_B delete mode 100644 geom_bottleneck/tests/data/test_718_A delete mode 100644 geom_bottleneck/tests/data/test_718_B delete mode 100644 geom_bottleneck/tests/data/test_719_A delete mode 100644 geom_bottleneck/tests/data/test_719_B delete mode 100644 geom_bottleneck/tests/data/test_720_A delete mode 100644 geom_bottleneck/tests/data/test_720_B delete mode 100644 geom_bottleneck/tests/data/test_721_A delete mode 100644 geom_bottleneck/tests/data/test_721_B delete mode 100644 geom_bottleneck/tests/data/test_722_A delete mode 100644 geom_bottleneck/tests/data/test_722_B delete mode 100644 geom_bottleneck/tests/data/test_723_A delete mode 100644 geom_bottleneck/tests/data/test_723_B delete mode 100644 geom_bottleneck/tests/data/test_724_A delete mode 100644 geom_bottleneck/tests/data/test_724_B delete mode 100644 geom_bottleneck/tests/data/test_725_A delete mode 100644 geom_bottleneck/tests/data/test_725_B delete mode 100644 geom_bottleneck/tests/data/test_726_A delete mode 100644 geom_bottleneck/tests/data/test_726_B delete mode 100644 geom_bottleneck/tests/data/test_727_A delete mode 100644 geom_bottleneck/tests/data/test_727_B delete mode 100644 geom_bottleneck/tests/data/test_728_A delete mode 100644 geom_bottleneck/tests/data/test_728_B delete mode 100644 geom_bottleneck/tests/data/test_729_A delete mode 100644 geom_bottleneck/tests/data/test_729_B delete mode 100644 geom_bottleneck/tests/data/test_730_A delete mode 100644 geom_bottleneck/tests/data/test_730_B delete mode 100644 geom_bottleneck/tests/data/test_731_A delete mode 100644 geom_bottleneck/tests/data/test_731_B delete mode 100644 geom_bottleneck/tests/data/test_732_A delete mode 100644 geom_bottleneck/tests/data/test_732_B delete mode 100644 geom_bottleneck/tests/data/test_733_A delete mode 100644 geom_bottleneck/tests/data/test_733_B delete mode 100644 geom_bottleneck/tests/data/test_734_A delete mode 100644 geom_bottleneck/tests/data/test_734_B delete mode 100644 geom_bottleneck/tests/data/test_735_A delete mode 100644 geom_bottleneck/tests/data/test_735_B delete mode 100644 geom_bottleneck/tests/data/test_736_A delete mode 100644 geom_bottleneck/tests/data/test_736_B delete mode 100644 geom_bottleneck/tests/data/test_737_A delete mode 100644 geom_bottleneck/tests/data/test_737_B delete mode 100644 geom_bottleneck/tests/data/test_738_A delete mode 100644 geom_bottleneck/tests/data/test_738_B delete mode 100644 geom_bottleneck/tests/data/test_739_A delete mode 100644 geom_bottleneck/tests/data/test_739_B delete mode 100644 geom_bottleneck/tests/data/test_740_A delete mode 100644 geom_bottleneck/tests/data/test_740_B delete mode 100644 geom_bottleneck/tests/data/test_741_A delete mode 100644 geom_bottleneck/tests/data/test_741_B delete mode 100644 geom_bottleneck/tests/data/test_742_A delete mode 100644 geom_bottleneck/tests/data/test_742_B delete mode 100644 geom_bottleneck/tests/data/test_743_A delete mode 100644 geom_bottleneck/tests/data/test_743_B delete mode 100644 geom_bottleneck/tests/data/test_744_A delete mode 100644 geom_bottleneck/tests/data/test_744_B delete mode 100644 geom_bottleneck/tests/data/test_745_A delete mode 100644 geom_bottleneck/tests/data/test_745_B delete mode 100644 geom_bottleneck/tests/data/test_746_A delete mode 100644 geom_bottleneck/tests/data/test_746_B delete mode 100644 geom_bottleneck/tests/data/test_747_A delete mode 100644 geom_bottleneck/tests/data/test_747_B delete mode 100644 geom_bottleneck/tests/data/test_748_A delete mode 100644 geom_bottleneck/tests/data/test_748_B delete mode 100644 geom_bottleneck/tests/data/test_749_A delete mode 100644 geom_bottleneck/tests/data/test_749_B delete mode 100644 geom_bottleneck/tests/data/test_750_A delete mode 100644 geom_bottleneck/tests/data/test_750_B delete mode 100644 geom_bottleneck/tests/data/test_751_A delete mode 100644 geom_bottleneck/tests/data/test_751_B delete mode 100644 geom_bottleneck/tests/data/test_752_A delete mode 100644 geom_bottleneck/tests/data/test_752_B delete mode 100644 geom_bottleneck/tests/data/test_753_A delete mode 100644 geom_bottleneck/tests/data/test_753_B delete mode 100644 geom_bottleneck/tests/data/test_754_A delete mode 100644 geom_bottleneck/tests/data/test_754_B delete mode 100644 geom_bottleneck/tests/data/test_755_A delete mode 100644 geom_bottleneck/tests/data/test_755_B delete mode 100644 geom_bottleneck/tests/data/test_756_A delete mode 100644 geom_bottleneck/tests/data/test_756_B delete mode 100644 geom_bottleneck/tests/data/test_757_A delete mode 100644 geom_bottleneck/tests/data/test_757_B delete mode 100644 geom_bottleneck/tests/data/test_758_A delete mode 100644 geom_bottleneck/tests/data/test_758_B delete mode 100644 geom_bottleneck/tests/data/test_759_A delete mode 100644 geom_bottleneck/tests/data/test_759_B delete mode 100644 geom_bottleneck/tests/data/test_760_A delete mode 100644 geom_bottleneck/tests/data/test_760_B delete mode 100644 geom_bottleneck/tests/data/test_761_A delete mode 100644 geom_bottleneck/tests/data/test_761_B delete mode 100644 geom_bottleneck/tests/data/test_762_A delete mode 100644 geom_bottleneck/tests/data/test_762_B delete mode 100644 geom_bottleneck/tests/data/test_763_A delete mode 100644 geom_bottleneck/tests/data/test_763_B delete mode 100644 geom_bottleneck/tests/data/test_764_A delete mode 100644 geom_bottleneck/tests/data/test_764_B delete mode 100644 geom_bottleneck/tests/data/test_765_A delete mode 100644 geom_bottleneck/tests/data/test_765_B delete mode 100644 geom_bottleneck/tests/data/test_766_A delete mode 100644 geom_bottleneck/tests/data/test_766_B delete mode 100644 geom_bottleneck/tests/data/test_767_A delete mode 100644 geom_bottleneck/tests/data/test_767_B delete mode 100644 geom_bottleneck/tests/data/test_768_A delete mode 100644 geom_bottleneck/tests/data/test_768_B delete mode 100644 geom_bottleneck/tests/data/test_769_A delete mode 100644 geom_bottleneck/tests/data/test_769_B delete mode 100644 geom_bottleneck/tests/data/test_770_A delete mode 100644 geom_bottleneck/tests/data/test_770_B delete mode 100644 geom_bottleneck/tests/data/test_771_A delete mode 100644 geom_bottleneck/tests/data/test_771_B delete mode 100644 geom_bottleneck/tests/data/test_772_A delete mode 100644 geom_bottleneck/tests/data/test_772_B delete mode 100644 geom_bottleneck/tests/data/test_773_A delete mode 100644 geom_bottleneck/tests/data/test_773_B delete mode 100644 geom_bottleneck/tests/data/test_774_A delete mode 100644 geom_bottleneck/tests/data/test_774_B delete mode 100644 geom_bottleneck/tests/data/test_775_A delete mode 100644 geom_bottleneck/tests/data/test_775_B delete mode 100644 geom_bottleneck/tests/data/test_776_A delete mode 100644 geom_bottleneck/tests/data/test_776_B delete mode 100644 geom_bottleneck/tests/data/test_777_A delete mode 100644 geom_bottleneck/tests/data/test_777_B delete mode 100644 geom_bottleneck/tests/data/test_778_A delete mode 100644 geom_bottleneck/tests/data/test_778_B delete mode 100644 geom_bottleneck/tests/data/test_779_A delete mode 100644 geom_bottleneck/tests/data/test_779_B delete mode 100644 geom_bottleneck/tests/data/test_780_A delete mode 100644 geom_bottleneck/tests/data/test_780_B delete mode 100644 geom_bottleneck/tests/data/test_781_A delete mode 100644 geom_bottleneck/tests/data/test_781_B delete mode 100644 geom_bottleneck/tests/data/test_782_A delete mode 100644 geom_bottleneck/tests/data/test_782_B delete mode 100644 geom_bottleneck/tests/data/test_783_A delete mode 100644 geom_bottleneck/tests/data/test_783_B delete mode 100644 geom_bottleneck/tests/data/test_784_A delete mode 100644 geom_bottleneck/tests/data/test_784_B delete mode 100644 geom_bottleneck/tests/data/test_785_A delete mode 100644 geom_bottleneck/tests/data/test_785_B delete mode 100644 geom_bottleneck/tests/data/test_786_A delete mode 100644 geom_bottleneck/tests/data/test_786_B delete mode 100644 geom_bottleneck/tests/data/test_787_A delete mode 100644 geom_bottleneck/tests/data/test_787_B delete mode 100644 geom_bottleneck/tests/data/test_788_A delete mode 100644 geom_bottleneck/tests/data/test_788_B delete mode 100644 geom_bottleneck/tests/data/test_789_A delete mode 100644 geom_bottleneck/tests/data/test_789_B delete mode 100644 geom_bottleneck/tests/data/test_790_A delete mode 100644 geom_bottleneck/tests/data/test_790_B delete mode 100644 geom_bottleneck/tests/data/test_791_A delete mode 100644 geom_bottleneck/tests/data/test_791_B delete mode 100644 geom_bottleneck/tests/data/test_792_A delete mode 100644 geom_bottleneck/tests/data/test_792_B delete mode 100644 geom_bottleneck/tests/data/test_793_A delete mode 100644 geom_bottleneck/tests/data/test_793_B delete mode 100644 geom_bottleneck/tests/data/test_794_A delete mode 100644 geom_bottleneck/tests/data/test_794_B delete mode 100644 geom_bottleneck/tests/data/test_795_A delete mode 100644 geom_bottleneck/tests/data/test_795_B delete mode 100644 geom_bottleneck/tests/data/test_796_A delete mode 100644 geom_bottleneck/tests/data/test_796_B delete mode 100644 geom_bottleneck/tests/data/test_797_A delete mode 100644 geom_bottleneck/tests/data/test_797_B delete mode 100644 geom_bottleneck/tests/data/test_798_A delete mode 100644 geom_bottleneck/tests/data/test_798_B delete mode 100644 geom_bottleneck/tests/data/test_799_A delete mode 100644 geom_bottleneck/tests/data/test_799_B delete mode 100644 geom_bottleneck/tests/data/test_800_A delete mode 100644 geom_bottleneck/tests/data/test_800_B delete mode 100644 geom_bottleneck/tests/data/test_801_A delete mode 100644 geom_bottleneck/tests/data/test_801_B delete mode 100644 geom_bottleneck/tests/data/test_802_A delete mode 100644 geom_bottleneck/tests/data/test_802_B delete mode 100644 geom_bottleneck/tests/data/test_803_A delete mode 100644 geom_bottleneck/tests/data/test_803_B delete mode 100644 geom_bottleneck/tests/data/test_804_A delete mode 100644 geom_bottleneck/tests/data/test_804_B delete mode 100644 geom_bottleneck/tests/data/test_805_A delete mode 100644 geom_bottleneck/tests/data/test_805_B delete mode 100644 geom_bottleneck/tests/data/test_806_A delete mode 100644 geom_bottleneck/tests/data/test_806_B delete mode 100644 geom_bottleneck/tests/data/test_807_A delete mode 100644 geom_bottleneck/tests/data/test_807_B delete mode 100644 geom_bottleneck/tests/data/test_808_A delete mode 100644 geom_bottleneck/tests/data/test_808_B delete mode 100644 geom_bottleneck/tests/data/test_809_A delete mode 100644 geom_bottleneck/tests/data/test_809_B delete mode 100644 geom_bottleneck/tests/data/test_810_A delete mode 100644 geom_bottleneck/tests/data/test_810_B delete mode 100644 geom_bottleneck/tests/data/test_811_A delete mode 100644 geom_bottleneck/tests/data/test_811_B delete mode 100644 geom_bottleneck/tests/data/test_812_A delete mode 100644 geom_bottleneck/tests/data/test_812_B delete mode 100644 geom_bottleneck/tests/data/test_813_A delete mode 100644 geom_bottleneck/tests/data/test_813_B delete mode 100644 geom_bottleneck/tests/data/test_814_A delete mode 100644 geom_bottleneck/tests/data/test_814_B delete mode 100644 geom_bottleneck/tests/data/test_815_A delete mode 100644 geom_bottleneck/tests/data/test_815_B delete mode 100644 geom_bottleneck/tests/data/test_816_A delete mode 100644 geom_bottleneck/tests/data/test_816_B delete mode 100644 geom_bottleneck/tests/data/test_817_A delete mode 100644 geom_bottleneck/tests/data/test_817_B delete mode 100644 geom_bottleneck/tests/data/test_818_A delete mode 100644 geom_bottleneck/tests/data/test_818_B delete mode 100644 geom_bottleneck/tests/data/test_819_A delete mode 100644 geom_bottleneck/tests/data/test_819_B delete mode 100644 geom_bottleneck/tests/data/test_820_A delete mode 100644 geom_bottleneck/tests/data/test_820_B delete mode 100644 geom_bottleneck/tests/data/test_821_A delete mode 100644 geom_bottleneck/tests/data/test_821_B delete mode 100644 geom_bottleneck/tests/data/test_822_A delete mode 100644 geom_bottleneck/tests/data/test_822_B delete mode 100644 geom_bottleneck/tests/data/test_823_A delete mode 100644 geom_bottleneck/tests/data/test_823_B delete mode 100644 geom_bottleneck/tests/data/test_824_A delete mode 100644 geom_bottleneck/tests/data/test_824_B delete mode 100644 geom_bottleneck/tests/data/test_825_A delete mode 100644 geom_bottleneck/tests/data/test_825_B delete mode 100644 geom_bottleneck/tests/data/test_826_A delete mode 100644 geom_bottleneck/tests/data/test_826_B delete mode 100644 geom_bottleneck/tests/data/test_827_A delete mode 100644 geom_bottleneck/tests/data/test_827_B delete mode 100644 geom_bottleneck/tests/data/test_828_A delete mode 100644 geom_bottleneck/tests/data/test_828_B delete mode 100644 geom_bottleneck/tests/data/test_829_A delete mode 100644 geom_bottleneck/tests/data/test_829_B delete mode 100644 geom_bottleneck/tests/data/test_830_A delete mode 100644 geom_bottleneck/tests/data/test_830_B delete mode 100644 geom_bottleneck/tests/data/test_831_A delete mode 100644 geom_bottleneck/tests/data/test_831_B delete mode 100644 geom_bottleneck/tests/data/test_832_A delete mode 100644 geom_bottleneck/tests/data/test_832_B delete mode 100644 geom_bottleneck/tests/data/test_833_A delete mode 100644 geom_bottleneck/tests/data/test_833_B delete mode 100644 geom_bottleneck/tests/data/test_834_A delete mode 100644 geom_bottleneck/tests/data/test_834_B delete mode 100644 geom_bottleneck/tests/data/test_835_A delete mode 100644 geom_bottleneck/tests/data/test_835_B delete mode 100644 geom_bottleneck/tests/data/test_836_A delete mode 100644 geom_bottleneck/tests/data/test_836_B delete mode 100644 geom_bottleneck/tests/data/test_837_A delete mode 100644 geom_bottleneck/tests/data/test_837_B delete mode 100644 geom_bottleneck/tests/data/test_838_A delete mode 100644 geom_bottleneck/tests/data/test_838_B delete mode 100644 geom_bottleneck/tests/data/test_839_A delete mode 100644 geom_bottleneck/tests/data/test_839_B delete mode 100644 geom_bottleneck/tests/data/test_840_A delete mode 100644 geom_bottleneck/tests/data/test_840_B delete mode 100644 geom_bottleneck/tests/data/test_841_A delete mode 100644 geom_bottleneck/tests/data/test_841_B delete mode 100644 geom_bottleneck/tests/data/test_842_A delete mode 100644 geom_bottleneck/tests/data/test_842_B delete mode 100644 geom_bottleneck/tests/data/test_843_A delete mode 100644 geom_bottleneck/tests/data/test_843_B delete mode 100644 geom_bottleneck/tests/data/test_844_A delete mode 100644 geom_bottleneck/tests/data/test_844_B delete mode 100644 geom_bottleneck/tests/data/test_845_A delete mode 100644 geom_bottleneck/tests/data/test_845_B delete mode 100644 geom_bottleneck/tests/data/test_846_A delete mode 100644 geom_bottleneck/tests/data/test_846_B delete mode 100644 geom_bottleneck/tests/data/test_847_A delete mode 100644 geom_bottleneck/tests/data/test_847_B delete mode 100644 geom_bottleneck/tests/data/test_848_A delete mode 100644 geom_bottleneck/tests/data/test_848_B delete mode 100644 geom_bottleneck/tests/data/test_849_A delete mode 100644 geom_bottleneck/tests/data/test_849_B delete mode 100644 geom_bottleneck/tests/data/test_850_A delete mode 100644 geom_bottleneck/tests/data/test_850_B delete mode 100644 geom_bottleneck/tests/data/test_851_A delete mode 100644 geom_bottleneck/tests/data/test_851_B delete mode 100644 geom_bottleneck/tests/data/test_852_A delete mode 100644 geom_bottleneck/tests/data/test_852_B delete mode 100644 geom_bottleneck/tests/data/test_853_A delete mode 100644 geom_bottleneck/tests/data/test_853_B delete mode 100644 geom_bottleneck/tests/data/test_854_A delete mode 100644 geom_bottleneck/tests/data/test_854_B delete mode 100644 geom_bottleneck/tests/data/test_855_A delete mode 100644 geom_bottleneck/tests/data/test_855_B delete mode 100644 geom_bottleneck/tests/data/test_856_A delete mode 100644 geom_bottleneck/tests/data/test_856_B delete mode 100644 geom_bottleneck/tests/data/test_857_A delete mode 100644 geom_bottleneck/tests/data/test_857_B delete mode 100644 geom_bottleneck/tests/data/test_858_A delete mode 100644 geom_bottleneck/tests/data/test_858_B delete mode 100644 geom_bottleneck/tests/data/test_859_A delete mode 100644 geom_bottleneck/tests/data/test_859_B delete mode 100644 geom_bottleneck/tests/data/test_860_A delete mode 100644 geom_bottleneck/tests/data/test_860_B delete mode 100644 geom_bottleneck/tests/data/test_861_A delete mode 100644 geom_bottleneck/tests/data/test_861_B delete mode 100644 geom_bottleneck/tests/data/test_862_A delete mode 100644 geom_bottleneck/tests/data/test_862_B delete mode 100644 geom_bottleneck/tests/data/test_863_A delete mode 100644 geom_bottleneck/tests/data/test_863_B delete mode 100644 geom_bottleneck/tests/data/test_864_A delete mode 100644 geom_bottleneck/tests/data/test_864_B delete mode 100644 geom_bottleneck/tests/data/test_865_A delete mode 100644 geom_bottleneck/tests/data/test_865_B delete mode 100644 geom_bottleneck/tests/data/test_866_A delete mode 100644 geom_bottleneck/tests/data/test_866_B delete mode 100644 geom_bottleneck/tests/data/test_867_A delete mode 100644 geom_bottleneck/tests/data/test_867_B delete mode 100644 geom_bottleneck/tests/data/test_868_A delete mode 100644 geom_bottleneck/tests/data/test_868_B delete mode 100644 geom_bottleneck/tests/data/test_869_A delete mode 100644 geom_bottleneck/tests/data/test_869_B delete mode 100644 geom_bottleneck/tests/data/test_870_A delete mode 100644 geom_bottleneck/tests/data/test_870_B delete mode 100644 geom_bottleneck/tests/data/test_871_A delete mode 100644 geom_bottleneck/tests/data/test_871_B delete mode 100644 geom_bottleneck/tests/data/test_872_A delete mode 100644 geom_bottleneck/tests/data/test_872_B delete mode 100644 geom_bottleneck/tests/data/test_873_A delete mode 100644 geom_bottleneck/tests/data/test_873_B delete mode 100644 geom_bottleneck/tests/data/test_874_A delete mode 100644 geom_bottleneck/tests/data/test_874_B delete mode 100644 geom_bottleneck/tests/data/test_875_A delete mode 100644 geom_bottleneck/tests/data/test_875_B delete mode 100644 geom_bottleneck/tests/data/test_876_A delete mode 100644 geom_bottleneck/tests/data/test_876_B delete mode 100644 geom_bottleneck/tests/data/test_877_A delete mode 100644 geom_bottleneck/tests/data/test_877_B delete mode 100644 geom_bottleneck/tests/data/test_878_A delete mode 100644 geom_bottleneck/tests/data/test_878_B delete mode 100644 geom_bottleneck/tests/data/test_879_A delete mode 100644 geom_bottleneck/tests/data/test_879_B delete mode 100644 geom_bottleneck/tests/data/test_list.txt delete mode 100644 geom_bottleneck/tests/data/test_list.txt.bak delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_100_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_100_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_200_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_200_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5000_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5000_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag1_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag1_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag2_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag2_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag3_A delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag3_B delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha delete mode 100644 geom_bottleneck/tests/data/ws_tests/test_list.txt delete mode 100644 geom_bottleneck/tests/test_hera_bottleneck.cpp delete mode 100644 geom_bottleneck/tests/tests_main.cpp delete mode 100644 geom_matching/.gitignore delete mode 100644 geom_matching/README delete mode 100644 geom_matching/wasserstein/CMakeLists.txt delete mode 100644 geom_matching/wasserstein/example/wasserstein_dist.cpp delete mode 100644 geom_matching/wasserstein/example/wasserstein_dist_dipha.cpp delete mode 100644 geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_base.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_base.hpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.hpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle_lazy_heap.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_lazy_heap.hpp delete mode 100644 geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.h delete mode 100644 geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp delete mode 100644 geom_matching/wasserstein/include/auction_runner_fr.h delete mode 100644 geom_matching/wasserstein/include/auction_runner_fr.hpp delete mode 100644 geom_matching/wasserstein/include/auction_runner_gs.h delete mode 100644 geom_matching/wasserstein/include/auction_runner_gs.hpp delete mode 100644 geom_matching/wasserstein/include/auction_runner_gs_single_diag.h delete mode 100644 geom_matching/wasserstein/include/auction_runner_gs_single_diag.hpp delete mode 100644 geom_matching/wasserstein/include/auction_runner_jac.h delete mode 100644 geom_matching/wasserstein/include/auction_runner_jac.hpp delete mode 100644 geom_matching/wasserstein/include/basic_defs_ws.h delete mode 100644 geom_matching/wasserstein/include/basic_defs_ws.hpp delete mode 100644 geom_matching/wasserstein/include/catch/catch.hpp delete mode 100644 geom_matching/wasserstein/include/def_debug_ws.h delete mode 100644 geom_matching/wasserstein/include/diagonal_heap.h delete mode 100644 geom_matching/wasserstein/include/diagram_reader.h delete mode 100644 geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h delete mode 100644 geom_matching/wasserstein/include/dnn/geometry/euclidean-fixed.h delete mode 100644 geom_matching/wasserstein/include/dnn/local/kd-tree.h delete mode 100644 geom_matching/wasserstein/include/dnn/local/kd-tree.hpp delete mode 100644 geom_matching/wasserstein/include/dnn/local/search-functors.h delete mode 100644 geom_matching/wasserstein/include/dnn/parallel/tbb.h delete mode 100644 geom_matching/wasserstein/include/dnn/parallel/utils.h delete mode 100644 geom_matching/wasserstein/include/dnn/utils.h delete mode 100644 geom_matching/wasserstein/include/hera_infinity.h delete mode 100755 geom_matching/wasserstein/include/opts/opts.h delete mode 100644 geom_matching/wasserstein/include/spdlog/async_logger.h delete mode 100644 geom_matching/wasserstein/include/spdlog/common.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/async_log_helper.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/async_logger_impl.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/file_helper.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/log_msg.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/logger_impl.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/mpmc_bounded_q.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/null_mutex.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/os.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/pattern_formatter_impl.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/registry.h delete mode 100644 geom_matching/wasserstein/include/spdlog/details/spdlog_impl.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/format.cc delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/format.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.cc delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.cc delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/bundled/time.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/fmt.h delete mode 100644 geom_matching/wasserstein/include/spdlog/fmt/ostr.h delete mode 100644 geom_matching/wasserstein/include/spdlog/formatter.h delete mode 100644 geom_matching/wasserstein/include/spdlog/logger.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/android_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/ansicolor_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/base_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/dist_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/file_sinks.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/msvc_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/null_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/ostream_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/stdout_sinks.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/syslog_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/sinks/wincolor_sink.h delete mode 100644 geom_matching/wasserstein/include/spdlog/spdlog.h delete mode 100644 geom_matching/wasserstein/include/spdlog/tweakme.h delete mode 100644 geom_matching/wasserstein/include/wasserstein.h delete mode 100644 geom_matching/wasserstein/include/wasserstein_pure_geom.hpp delete mode 100644 geom_matching/wasserstein/tests/data/test_100_A delete mode 100644 geom_matching/wasserstein/tests/data/test_100_A.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_100_B delete mode 100644 geom_matching/wasserstein/tests/data/test_100_B.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_200_A delete mode 100644 geom_matching/wasserstein/tests/data/test_200_B delete mode 100644 geom_matching/wasserstein/tests/data/test_5000_A delete mode 100644 geom_matching/wasserstein/tests/data/test_5000_B delete mode 100644 geom_matching/wasserstein/tests/data/test_5_A delete mode 100644 geom_matching/wasserstein/tests/data/test_5_A.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_5_B delete mode 100644 geom_matching/wasserstein/tests/data/test_5_B.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag1_A delete mode 100644 geom_matching/wasserstein/tests/data/test_diag1_A.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag1_B delete mode 100644 geom_matching/wasserstein/tests/data/test_diag1_B.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag2_A delete mode 100644 geom_matching/wasserstein/tests/data/test_diag2_A.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag2_B delete mode 100644 geom_matching/wasserstein/tests/data/test_diag2_B.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag3_A delete mode 100644 geom_matching/wasserstein/tests/data/test_diag3_A.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_diag3_B delete mode 100644 geom_matching/wasserstein/tests/data/test_diag3_B.pd.dipha delete mode 100644 geom_matching/wasserstein/tests/data/test_list.txt delete mode 100644 geom_matching/wasserstein/tests/test_hera_wasserstein.cpp delete mode 100644 geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp delete mode 100644 geom_matching/wasserstein/tests/tests_main.cpp delete mode 100644 geom_matching/wasserstein/tests/tests_reader.h create mode 100644 wasserstein/.gitignore create mode 100644 wasserstein/CMakeLists.txt create mode 100644 wasserstein/README create mode 100644 wasserstein/example/wasserstein_dist.cpp create mode 100644 wasserstein/example/wasserstein_dist_dipha.cpp create mode 100644 wasserstein/example/wasserstein_dist_point_cloud.cpp create mode 100644 wasserstein/include/auction_oracle.h create mode 100644 wasserstein/include/auction_oracle_base.h create mode 100644 wasserstein/include/auction_oracle_base.hpp create mode 100644 wasserstein/include/auction_oracle_kdtree_pure_geom.h create mode 100644 wasserstein/include/auction_oracle_kdtree_pure_geom.hpp create mode 100644 wasserstein/include/auction_oracle_kdtree_restricted.h create mode 100644 wasserstein/include/auction_oracle_kdtree_restricted.hpp create mode 100644 wasserstein/include/auction_oracle_kdtree_single_diag.h create mode 100644 wasserstein/include/auction_oracle_kdtree_single_diag.hpp create mode 100644 wasserstein/include/auction_oracle_lazy_heap.h create mode 100644 wasserstein/include/auction_oracle_lazy_heap.hpp create mode 100644 wasserstein/include/auction_oracle_stupid_sparse_restricted.h create mode 100644 wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp create mode 100644 wasserstein/include/auction_runner_fr.h create mode 100644 wasserstein/include/auction_runner_fr.hpp create mode 100644 wasserstein/include/auction_runner_gs.h create mode 100644 wasserstein/include/auction_runner_gs.hpp create mode 100644 wasserstein/include/auction_runner_gs_single_diag.h create mode 100644 wasserstein/include/auction_runner_gs_single_diag.hpp create mode 100644 wasserstein/include/auction_runner_jac.h create mode 100644 wasserstein/include/auction_runner_jac.hpp create mode 100644 wasserstein/include/basic_defs_ws.h create mode 100644 wasserstein/include/basic_defs_ws.hpp create mode 100644 wasserstein/include/catch/catch.hpp create mode 100644 wasserstein/include/def_debug_ws.h create mode 100644 wasserstein/include/diagonal_heap.h create mode 100644 wasserstein/include/diagram_reader.h create mode 100644 wasserstein/include/dnn/geometry/euclidean-dynamic.h create mode 100644 wasserstein/include/dnn/geometry/euclidean-fixed.h create mode 100644 wasserstein/include/dnn/local/kd-tree.h create mode 100644 wasserstein/include/dnn/local/kd-tree.hpp create mode 100644 wasserstein/include/dnn/local/search-functors.h create mode 100644 wasserstein/include/dnn/parallel/tbb.h create mode 100644 wasserstein/include/dnn/parallel/utils.h create mode 100644 wasserstein/include/dnn/utils.h create mode 100644 wasserstein/include/hera_infinity.h create mode 100755 wasserstein/include/opts/opts.h create mode 100644 wasserstein/include/spdlog/async_logger.h create mode 100644 wasserstein/include/spdlog/common.h create mode 100644 wasserstein/include/spdlog/details/async_log_helper.h create mode 100644 wasserstein/include/spdlog/details/async_logger_impl.h create mode 100644 wasserstein/include/spdlog/details/file_helper.h create mode 100644 wasserstein/include/spdlog/details/log_msg.h create mode 100644 wasserstein/include/spdlog/details/logger_impl.h create mode 100644 wasserstein/include/spdlog/details/mpmc_bounded_q.h create mode 100644 wasserstein/include/spdlog/details/null_mutex.h create mode 100644 wasserstein/include/spdlog/details/os.h create mode 100644 wasserstein/include/spdlog/details/pattern_formatter_impl.h create mode 100644 wasserstein/include/spdlog/details/registry.h create mode 100644 wasserstein/include/spdlog/details/spdlog_impl.h create mode 100644 wasserstein/include/spdlog/fmt/bundled/format.cc create mode 100644 wasserstein/include/spdlog/fmt/bundled/format.h create mode 100644 wasserstein/include/spdlog/fmt/bundled/ostream.cc create mode 100644 wasserstein/include/spdlog/fmt/bundled/ostream.h create mode 100644 wasserstein/include/spdlog/fmt/bundled/posix.cc create mode 100644 wasserstein/include/spdlog/fmt/bundled/posix.h create mode 100644 wasserstein/include/spdlog/fmt/bundled/time.h create mode 100644 wasserstein/include/spdlog/fmt/fmt.h create mode 100644 wasserstein/include/spdlog/fmt/ostr.h create mode 100644 wasserstein/include/spdlog/formatter.h create mode 100644 wasserstein/include/spdlog/logger.h create mode 100644 wasserstein/include/spdlog/sinks/android_sink.h create mode 100644 wasserstein/include/spdlog/sinks/ansicolor_sink.h create mode 100644 wasserstein/include/spdlog/sinks/base_sink.h create mode 100644 wasserstein/include/spdlog/sinks/dist_sink.h create mode 100644 wasserstein/include/spdlog/sinks/file_sinks.h create mode 100644 wasserstein/include/spdlog/sinks/msvc_sink.h create mode 100644 wasserstein/include/spdlog/sinks/null_sink.h create mode 100644 wasserstein/include/spdlog/sinks/ostream_sink.h create mode 100644 wasserstein/include/spdlog/sinks/sink.h create mode 100644 wasserstein/include/spdlog/sinks/stdout_sinks.h create mode 100644 wasserstein/include/spdlog/sinks/syslog_sink.h create mode 100644 wasserstein/include/spdlog/sinks/wincolor_sink.h create mode 100644 wasserstein/include/spdlog/spdlog.h create mode 100644 wasserstein/include/spdlog/tweakme.h create mode 100644 wasserstein/include/wasserstein.h create mode 100644 wasserstein/include/wasserstein_pure_geom.hpp create mode 100644 wasserstein/tests/data/test_100_A create mode 100644 wasserstein/tests/data/test_100_A.pd.dipha create mode 100644 wasserstein/tests/data/test_100_B create mode 100644 wasserstein/tests/data/test_100_B.pd.dipha create mode 100644 wasserstein/tests/data/test_200_A create mode 100644 wasserstein/tests/data/test_200_B create mode 100644 wasserstein/tests/data/test_5000_A create mode 100644 wasserstein/tests/data/test_5000_B create mode 100644 wasserstein/tests/data/test_5_A create mode 100644 wasserstein/tests/data/test_5_A.pd.dipha create mode 100644 wasserstein/tests/data/test_5_B create mode 100644 wasserstein/tests/data/test_5_B.pd.dipha create mode 100644 wasserstein/tests/data/test_diag1_A create mode 100644 wasserstein/tests/data/test_diag1_A.pd.dipha create mode 100644 wasserstein/tests/data/test_diag1_B create mode 100644 wasserstein/tests/data/test_diag1_B.pd.dipha create mode 100644 wasserstein/tests/data/test_diag2_A create mode 100644 wasserstein/tests/data/test_diag2_A.pd.dipha create mode 100644 wasserstein/tests/data/test_diag2_B create mode 100644 wasserstein/tests/data/test_diag2_B.pd.dipha create mode 100644 wasserstein/tests/data/test_diag3_A create mode 100644 wasserstein/tests/data/test_diag3_A.pd.dipha create mode 100644 wasserstein/tests/data/test_diag3_B create mode 100644 wasserstein/tests/data/test_diag3_B.pd.dipha create mode 100644 wasserstein/tests/data/test_list.txt create mode 100644 wasserstein/tests/test_hera_wasserstein.cpp create mode 100644 wasserstein/tests/test_hera_wasserstein_pure_geom.cpp create mode 100644 wasserstein/tests/tests_main.cpp create mode 100644 wasserstein/tests/tests_reader.h diff --git a/bottleneck/.gitignore b/bottleneck/.gitignore new file mode 100644 index 0000000..3d0a40b --- /dev/null +++ b/bottleneck/.gitignore @@ -0,0 +1,36 @@ +/*.cfg +/build +*.gitattributes +*.opensdf +*.sdf +*.suo +*.vcxproj +*.filters +*.log +*.tlog +*.lastbuildstate +*.obj +*.idb +*.pdb +*.exe +*.ilk +*.user +*.out +*.output +*.pyc +*.*~* +*.swp +*.nfs* +*.pdf +*.o +*.d +*.dll +*.lib +*.exe +makeout +/MS_Win32 +/bin +bottleneck/build/ +ann/lib +ann/bin +ann/lib/dummy diff --git a/bottleneck/CMakeLists.txt b/bottleneck/CMakeLists.txt new file mode 100644 index 0000000..7a820ac --- /dev/null +++ b/bottleneck/CMakeLists.txt @@ -0,0 +1,38 @@ +project (geom_bottleneck) +cmake_minimum_required (VERSION 3.5.1) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# C++ 11 required +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Default to Release + +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif (NOT CMAKE_BUILD_TYPE) + +if(NOT WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -D_GLIBCXX_DEBUG") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 -g -ggdb") +endif(NOT WIN32) + +include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) + +file(GLOB WS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) + + + +find_package (Threads) +set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT}) + +add_executable(bottleneck_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/bottleneck_dist.cpp ${WS_HEADERS}) +target_link_libraries(bottleneck_dist PUBLIC ${libraries}) + +add_executable(bottleneck_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_bottleneck.cpp) +target_link_libraries(bottleneck_test PUBLIC ${libraries}) diff --git a/bottleneck/README b/bottleneck/README new file mode 100644 index 0000000..8b368af --- /dev/null +++ b/bottleneck/README @@ -0,0 +1,98 @@ +Accompanying paper: M. Kerber, D. Morozov, A. Nigmetov. Geometry Helps To Compare Persistence Diagrams (ALENEX 2016, http://www.geometrie.tugraz.at/nigmetov/geom_dist.pdf) + +Bug reports can be sent to "nigmetov EMAIL SIGN tugraz DOT at". + +# Dependencies + +Your compiler must support C++11. + +# Usage: + +1. To use a standalone command-line utility bottleneck_dist: + +bottleneck_dist file1 file2 [relative_error]. + +If relative error is not supplied, the exact distance is computed and printed. +If two diagrams are equal, then the exact distance 0.0 is printed (the order +of points in file1 and file2 need not be the same). +Otherwise the output is an approximation of the exact distance. Precisely: +if d_exact is the true distance and d_approx is the output, then + + | d_exact - d_approx | / d_exact < relative_error. + +file1 and file2 must contain persistence diagrams in plain text format +(one point per line, empty lines are ignored, comments can be made with #): + +# this is how your input can look like +x_1 y_1 # two real numbers per line +... +# empty lines or comments are ignored +x_n y_n + +2. To use from your code: + +#include "bottleneck.h" + +// the functions hera::bottleneckDistExact, hera::bottleneckDistApprox +// return the exact and approximate bottleneck distance. + +// function hera::readDiagramPointSet reads diagram from a plain-text file. + +std::vector> diagram1, diagram2; +// any container class that supports range-for loops will do. +// A pair represents a single point, +// first component = x-coordinate, +// second component = y-coordinate. +// ... +// load your diagrams into diagram1, diagram2 (off-diagonal points). +// If you data is in plain text format, you can use readDiagramPointSet function: + +if (!hera::readDiagramPointSet("diagram1.txt", diagram1)) { + // something went wrong: function returns true if it successfully read the file + } + +// OK: diagram1.txt was read. +// ... +// to get exact distance: +double btDist = hera::bottleneckDistExact(diagram1, diagram2); +// to get 1% approximation +double btDistApprox = hera::bottleneckDistApprox(diagram1, diagram2, 0.01); +// .............................................................................. +// if diagrams will be used many times, you may want to avoid copying them +// to hera::bt::DiagramPointSet (which is done internally in each call to +bottleneckDistExact/bottleneckDistApprox) and do it yourself once. +// Constructor takes two iterators: +hera::bt::DiagramPointSet ds1(diagram1.begin(), diagram1.end()); +hera::bt::DiagramPointSet ds2(diagram2.begin(), diagram2.end()); +btDist = hera::bt::bottleneckDistExact(ds1, ds2); +btDistApprox = hera::bt::bottleneckDistApprox(ds1, ds2, 0.01); + +Necessary projections (diagonal points) will be added in the bottleneckDistApprox +function. + +See also code in example/bottleneck_dist.cpp. + +# Remarks: + +1) If bottleneckDistApprox is called with epsilon = 0.0, it will never return. +2) Empty diagrams are not considered as error. + +# License + +See licence.txt + +# Building + +CMakeLists.txt in the root directory can be used to build +the command-line utility (in example/ directory). +The library itself is header-only and does not require separate compilation. + +On Linux/Mac: + +mkdir build +cd build +cmake .. +make + +On Windows: +use cmake-gui to create the solution in build directory and build it with VS. diff --git a/bottleneck/example/CMakeLists.txt b/bottleneck/example/CMakeLists.txt new file mode 100644 index 0000000..3ae8536 --- /dev/null +++ b/bottleneck/example/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 2.8.9) + +# Default to Release +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +# Add path to ANN header files +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../bottleneck/include") + +set(CXX_FLAGS ${CMAKE_CXX_FLAGS_RELEASE}) + +if(NOT WIN32) + set(CMAKE_CXX_FLAGS "-O3 -DNDEBUG -DBOOST_DISABLE_ASSERTS") + add_definitions(-std=c++11) +endif(NOT WIN32) + + +if(UNIX) + # specify full path to ANN + set_property(TARGET bottleneck PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../bottleneck/build/libbottleneck.a") +endif(UNIX) + +add_executable (bottleneck_dist bottleneck_dist.cpp) + +target_link_libraries(bottleneck_dist PUBLIC bottleneck) + diff --git a/bottleneck/example/bottleneck_dist.cpp b/bottleneck/example/bottleneck_dist.cpp new file mode 100644 index 0000000..8966789 --- /dev/null +++ b/bottleneck/example/bottleneck_dist.cpp @@ -0,0 +1,96 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#include +#include "bottleneck.h" + +// any container of pairs of doubles can be used, +// we use vector in this example. + +typedef std::vector> PairVector; + +// estimate initial guess on sampled diagram? +constexpr bool useSamplingHeur = false; +// if diagrams contain fewer points, don't use heuristic +constexpr int heurThreshold = 30000; + +int main(int argc, char* argv[]) +{ + if (argc < 3 ) { + std::cerr << "Usage: " << argv[0] << " file1 file2 [relative_error]. Without relative_error calculate the exact distance." << std::endl; + return 1; + } + + PairVector diagramA, diagramB; + int decPrecision { 0 }; + if (!hera::readDiagramPointSet(argv[1], diagramA, decPrecision)) { + std::exit(1); + } + + if (!hera::readDiagramPointSet(argv[2], diagramB, decPrecision)) { + std::exit(1); + } + + double res; + hera::bt::MatchingEdge e; + if (argc >= 4) { + // the third parameter is epsilon, + // return approximate distance (faster) + double delta = atof(argv[3]); + if (delta > 0.0) { + if (useSamplingHeur && diagramA.size() > heurThreshold && diagramB.size() > heurThreshold) { + res = hera::bottleneckDistApproxHeur(diagramA, diagramB, delta); + } else { + res = hera::bottleneckDistApprox(diagramA, diagramB, delta, e, true); + } + } else if (delta == 0.0) { + res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision); + } else { + std::cerr << "The third parameter (relative error) must be positive!" << std::endl; + std::exit(1); + } + } else { + // only filenames have been supplied, return exact distance + res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision, e, true); + + } + std::cout << std::setprecision(15) << res << std::endl; + //std::cout << "Longest edge " << e.first.get_user_id() << " <-> " << e.second.get_user_id() << std::endl; + //std::cout << "Longest edge " << e.first << " <-> " << e.second << std::endl; + // Alternative could be to construct DiagramPointSet + // using the constructor with iterators. + // May be useful if the same diagram is used multiple times + // to avoid copying data from user's container each time. + + //hera::bt::DiagramPointSet dA(diagramA); + //hera::bt::DiagramPointSet dB(diagramB); + //double result1 = hera::bt::bottleneckDistExact(dA, dB); + //std::cout << std::setprecision(15) << result1 << std::endl; + + return 0; +} diff --git a/bottleneck/include/basic_defs_bt.h b/bottleneck/include/basic_defs_bt.h new file mode 100644 index 0000000..172e0f7 --- /dev/null +++ b/bottleneck/include/basic_defs_bt.h @@ -0,0 +1,569 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BASIC_DEFS_BT_H +#define HERA_BASIC_DEFS_BT_H + +#ifdef _WIN32 +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "def_debug_bt.h" + +#ifndef FOR_R_TDA + +#include + +#endif + +namespace hera { + + template + Real get_infinity() + { + return Real(-1.0); + } + + namespace bt { + + + typedef int IdType; + constexpr IdType MinValidId = 10; + + template + struct Point + { + Real x, y; + + bool operator==(const Point& other) const + { + return ((this->x == other.x) and (this->y == other.y)); + } + + bool operator!=(const Point& other) const + { + return !(*this == other); + } + + Point(Real ax, Real ay) : + x(ax), y(ay) + {} + + Point() : + x(0.0), y(0.0) + {} + +#ifndef FOR_R_TDA + + template + friend std::ostream& operator<<(std::ostream& output, const Point& p) + { + output << "(" << p.x << ", " << p.y << ")"; + return output; + } + +#endif + }; + + template + struct DiagramPoint + { + // Points above the diagonal have type NORMAL + // Projections onto the diagonal have type DIAG + // for DIAG points only x-coordinate is relevant + // to-do: add getters/setters, checks in constructors, etc + enum Type + { + NORMAL, DIAG + }; + // data members + private: + Real x, y; + public: + Type type; + IdType id; + IdType user_id; + + // operators, constructors + bool operator==(const DiagramPoint& other) const + { + // compare by id only + assert(this->id >= MinValidId); + assert(other.id >= MinValidId); + bool areEqual { this->id == other.id }; + assert(!areEqual or ((this->x == other.x) and (this->y == other.y) and (this->type == other.type))); + return areEqual; + } + + bool operator!=(const DiagramPoint& other) const + { + return !(*this == other); + } + + DiagramPoint() : + x(0.0), + y(0.0), + type(DiagramPoint::DIAG), + id(MinValidId - 1), + user_id(-1) + { + } + + DiagramPoint(Real _x, Real _y, Type _type, IdType _id, IdType _user_id) : + x(_x), + y(_y), + type(_type), + id(_id), + user_id(_user_id) + { + if (_y == _x and _type != DIAG) { + throw std::runtime_error("Point on the main diagonal must have DIAG type"); + } + + } + + + bool isDiagonal() const + { return type == DIAG; } + + bool isNormal() const + { return type == NORMAL; } + + bool isInfinity() const + { + return x == std::numeric_limits::infinity() or + x == -std::numeric_limits::infinity() or + y == std::numeric_limits::infinity() or + y == -std::numeric_limits::infinity(); + } + + Real inline getRealX() const // return the x-coord + { + return x; + } + + Real inline getRealY() const // return the y-coord + { + return y; + } + + IdType inline get_user_id() const + { + if (isNormal()) + return user_id; + else + return -1; + } + + Real inline get_persistence(const Real internal_p = get_infinity()) const + { + if (isDiagonal()) + return 0.0; + Real pers = fabs(y - x) / 2; + if (internal_p == get_infinity()) { + return pers; + } else if (internal_p == 1.0) { + return 2 * pers; + } else { + return std::pow(static_cast(2), static_cast(1) / internal_p); + } + } + +#ifndef FOR_R_TDA + + friend std::ostream& operator<<(std::ostream& output, const DiagramPoint& p) + { + if (p.isDiagonal()) { + output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )"; + } else { + output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)"; + } + return output; + } +#endif + }; + + template + using MatchingEdge = std::pair, DiagramPoint>; + + // compute l-inf distance between two diagram points + template + inline Real distLInf(const DiagramPoint& a, const DiagramPoint& b) + { + if (a.isDiagonal() and b.isDiagonal()) { + // distance between points on the diagonal is 0 + return 0.0; + } + // otherwise distance is a usual l-inf distance + return std::max(fabs(a.getRealX() - b.getRealX()), fabs(a.getRealY() - b.getRealY())); + } + + // this function works with points at infinity as well + // not needed in actual computation, since these points are processed + // separately, but is useful in tests + template + inline Real dist_l_inf_slow(const DiagramPoint& a, const DiagramPoint& b) + { + if (a.isDiagonal() and b.isDiagonal()) { + // distance between points on the diagonal is 0 + return 0.0; + } + // otherwise distance is a usual l-inf distance + // + Real dx = (a.getRealX() == b.getRealX()) ? 0.0 : fabs(a.getRealX() - b.getRealX()); + Real dy = (a.getRealY() == b.getRealY()) ? 0.0 : fabs(a.getRealY() - b.getRealY()); + Real result = std::max(dx, dy); + if (std::isnan(result)) + result = std::numeric_limits::infinity(); + return result; + } + + + + template + inline Real get_infinity() + { + return Real(-1.0); + } + + template + inline void hash_combine(std::size_t& seed, const T& v) + { + std::hash hasher; + seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + } + + template + struct DiagramPointHash + { + size_t operator()(const DiagramPoint& p) const + { + assert(p.id >= MinValidId); + return std::hash()(p.id); + } + }; + + template + Real distLInf(const DiagramPoint& a, const DiagramPoint& b); + + //template + //typedef std::unordered_set PointSet; + template + class DiagramPointSet; + + template + void addProjections(DiagramPointSet& A, DiagramPointSet& B); + + template + class DiagramPointSet + { + public: + + using Real = Real_; + using DgmPoint = DiagramPoint; + using DgmPointHash = DiagramPointHash; + using const_iterator = typename std::unordered_set::const_iterator; + using iterator = typename std::unordered_set::iterator; + + private: + + bool isLinked { false }; + IdType maxId { MinValidId + 1 }; + std::unordered_set points; + + public: + + void insert(const DgmPoint& p) + { + points.insert(p); + if (p.id > maxId) { + maxId = p.id + 1; + } + } + + void erase(const DgmPoint& p, bool doCheck = true) + { + // if doCheck, erasing non-existing elements causes assert + auto it = points.find(p); + if (it != points.end()) { + points.erase(it); + } else { + assert(!doCheck); + } + } + + + void erase(const const_iterator it) + { + points.erase(it); + } + + void removeDiagonalPoints() + { + if (isLinked) { + auto ptIter = points.begin(); + while (ptIter != points.end()) { + if (ptIter->isDiagonal()) { + ptIter = points.erase(ptIter); + } else { + ptIter++; + } + } + isLinked = false; + } + } + + size_t size() const + { + return points.size(); + } + + void reserve(const size_t newSize) + { + points.reserve(newSize); + } + + void clear() + { + points.clear(); + } + + bool empty() const + { + return points.empty(); + } + + bool hasElement(const DgmPoint& p) const + { + return points.find(p) != points.end(); + } + + iterator find(const DgmPoint& p) + { + return points.find(p); + } + + iterator begin() + { + return points.begin(); + } + + iterator end() + { + return points.end(); + } + + const_iterator cbegin() const + { + return points.cbegin(); + } + + const_iterator cend() const + { + return points.cend(); + } + + + const_iterator find(const DgmPoint& p) const + { + return points.find(p); + } + +#ifndef FOR_R_TDA + + friend std::ostream& operator<<(std::ostream& output, const DiagramPointSet& ps) + { + output << "{ "; + for (auto pit = ps.cbegin(); pit != ps.cend(); ++pit) { + output << *pit << ", "; + } + output << "\b\b }"; + return output; + } + +#endif + + friend void addProjections(DiagramPointSet& A, DiagramPointSet& B); + + template + void fillIn(PairIterator begin_iter, PairIterator end_iter) + { + isLinked = false; + clear(); + IdType uniqueId = MinValidId + 1; + IdType user_id = 0; + for (auto iter = begin_iter; iter != end_iter; ++iter) { + insert(DgmPoint(iter->first, iter->second, DgmPoint::NORMAL, uniqueId++, user_id++)); + } + } + + template + void fillIn(const PointContainer& dgm_cont) + { + using Traits = DiagramTraits; + isLinked = false; + clear(); + IdType uniqueId = MinValidId + 1; + IdType user_id = 0; + for (const auto& pt : dgm_cont) { + Real x = Traits::get_x(pt); + Real y = Traits::get_y(pt); + insert(DgmPoint(x, y, DgmPoint::NORMAL, uniqueId++, user_id++)); + } + } + + + // ctor from range + template + DiagramPointSet(PairIterator begin_iter, PairIterator end_iter) + { + fillIn(begin_iter, end_iter); + } + + // ctor from container, uses DiagramTraits + template + DiagramPointSet(const PointContainer& dgm) + { + fillIn(dgm); + } + + + // default ctor, empty diagram + DiagramPointSet(IdType minId = MinValidId + 1) : + maxId(minId + 1) + {}; + + IdType nextId() + { return maxId + 1; } + + }; // DiagramPointSet + + + template + Real getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B) + { + Real result { 0.0 }; + DiagramPoint begA = *(A.begin()); + DiagramPoint optB = *(B.begin()); + for (const auto& pointB : B) { + if (distLInf(begA, pointB) > result) { + result = distLInf(begA, pointB); + optB = pointB; + } + } + for (const auto& pointA : A) { + if (distLInf(pointA, optB) > result) { + result = distLInf(pointA, optB); + } + } + return result; + } + + // preprocess diagrams A and B by adding projections onto diagonal of points of + // A to B and vice versa. Also removes points at infinity! + // NB: ids of points will be changed! + template + void addProjections(DiagramPointSet& A, DiagramPointSet& B) + { + + using Real = Real_; + using DgmPoint = DiagramPoint; + using DgmPointSet = DiagramPointSet; + + IdType uniqueId { MinValidId + 1 }; + DgmPointSet newA, newB; + + // copy normal points from A to newA + // add projections to newB + for (auto& pA : A) { + if (pA.isNormal() and not pA.isInfinity()) { + // add pA's projection to B + DgmPoint dpA { pA.getRealX(), pA.getRealY(), DgmPoint::NORMAL, uniqueId++, pA.get_user_id() }; + DgmPoint dpB { (pA.getRealX() + pA.getRealY()) / 2, (pA.getRealX() + pA.getRealY()) / 2, + DgmPoint::DIAG, uniqueId++, -1 }; + newA.insert(dpA); + newB.insert(dpB); + } + } + + for (auto& pB : B) { + if (pB.isNormal() and not pB.isInfinity()) { + // add pB's projection to A + DgmPoint dpB { pB.getRealX(), pB.getRealY(), DgmPoint::NORMAL, uniqueId++, pB.get_user_id() }; + DgmPoint dpA { (pB.getRealX() + pB.getRealY()) / 2, (pB.getRealX() + pB.getRealY()) / 2, + DgmPoint::DIAG, uniqueId++, -1 }; + newB.insert(dpB); + newA.insert(dpA); + } + } + + A = newA; + B = newB; + A.isLinked = true; + B.isLinked = true; + } + + //#ifndef FOR_R_TDA + + //template + //std::ostream& operator<<(std::ostream& output, const DiagramPoint& p) + //{ + // if ( p.isDiagonal() ) { + // output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )"; + // } else { + // output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)"; + // } + // return output; + //} + + //template + //std::ostream& operator<<(std::ostream& output, const DiagramPointSet& ps) + //{ + // output << "{ "; + // for(auto pit = ps.cbegin(); pit != ps.cend(); ++pit) { + // output << *pit << ", "; + // } + // output << "\b\b }"; + // return output; + //} + //#endif // FOR_R_TDA + + + } // end namespace bt +} // end namespace hera +#endif // HERA_BASIC_DEFS_BT_H diff --git a/bottleneck/include/bottleneck.h b/bottleneck/include/bottleneck.h new file mode 100644 index 0000000..64da2c8 --- /dev/null +++ b/bottleneck/include/bottleneck.h @@ -0,0 +1,153 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BOTTLENECK_H +#define HERA_BOTTLENECK_H + + +#include +#include +#include +#include +#include + +#include "diagram_traits.h" +#include "diagram_reader.h" +#include "bottleneck_detail.h" +#include "basic_defs_bt.h" +#include "bound_match.h" + +namespace hera { + // internal_p defines cost function on edges (use hera::get_infinity(), + // if you want to explicitly refer to l_inf, but that's default value + // delta is relative error, default is 1 percent + template + struct BottleneckParams + { + Real internal_p { hera::get_infinity() }; + Real delta { 0.01 }; + }; + + // functions taking containers as input + // template parameter PairContainer must be a container of pairs of real + // numbers (pair.first = x-coordinate, pair.second = y-coordinate) + // PairContainer class must support iteration of the form + // for(it = pairContainer.begin(); it != pairContainer.end(); ++it) + + // all functions in this header are wrappers around + // functions from hera::bt namespace + + // get exact bottleneck distance, + template + typename DiagramTraits::RealType + bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision, + hera::bt::MatchingEdge::RealType>& longest_edge, + bool compute_longest_edge = true) + { + using Real = typename DiagramTraits::RealType; + hera::bt::DiagramPointSet a(dgm_A); + hera::bt::DiagramPointSet b(dgm_B); + return hera::bt::bottleneckDistExact(a, b, decPrecision, longest_edge, compute_longest_edge); + } + + template + typename DiagramTraits::RealType + bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision) + { + using Real = typename DiagramTraits::RealType; + hera::bt::MatchingEdge longest_edge; + return bottleneckDistExact(dgm_A, dgm_B, decPrecision, longest_edge, false); + } + + + template + typename DiagramTraits::RealType + bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B) + { + int dec_precision = 14; + return bottleneckDistExact(dgm_A, dgm_B, dec_precision); + } + + +// return the interval (distMin, distMax) such that: +// a) actual bottleneck distance between A and B is contained in the interval +// b) if the interval is not (0,0), then (distMax - distMin) / distMin < delta + template + std::pair::RealType, typename DiagramTraits::RealType> + bottleneckDistApproxInterval(PairContainer& dgm_A, PairContainer& dgm_B, + const typename DiagramTraits::RealType delta) + { + using Real = typename DiagramTraits::RealType; + hera::bt::DiagramPointSet a(dgm_A); + hera::bt::DiagramPointSet b(dgm_B); + return hera::bt::bottleneckDistApproxInterval(a, b, delta); + } + +// use sampling heuristic: discard most of the points with small persistency +// to get a good initial approximation of the bottleneck distance + template + typename DiagramTraits::RealType + bottleneckDistApproxHeur(PairContainer& dgm_A, PairContainer& dgm_B, + const typename DiagramTraits::RealType delta) + { + using Real = typename DiagramTraits::RealType; + hera::bt::DiagramPointSet a(dgm_A); + hera::bt::DiagramPointSet b(dgm_B); + std::pair resPair = hera::bt::bottleneckDistApproxIntervalHeur(a, b, delta); + return resPair.second; + } + +// get approximate distance, +// see bottleneckDistApproxInterval + template + typename DiagramTraits::RealType + bottleneckDistApprox(PairContainer& A, PairContainer& B, + const typename DiagramTraits::RealType delta, + hera::bt::MatchingEdge::RealType>& longest_edge, + bool compute_longest_edge = true) + { + using Real = typename DiagramTraits::RealType; + hera::bt::DiagramPointSet a(A.begin(), A.end()); + hera::bt::DiagramPointSet b(B.begin(), B.end()); + return hera::bt::bottleneckDistApprox(a, b, delta, longest_edge, compute_longest_edge); + } + + template + typename DiagramTraits::RealType + bottleneckDistApprox(PairContainer& A, PairContainer& B, + const typename DiagramTraits::RealType delta) + { + using Real = typename DiagramTraits::RealType; + hera::bt::MatchingEdge longest_edge; + return hera::bottleneckDistApprox(A, B, delta, longest_edge, false); + } + + +} // end namespace hera + +#endif diff --git a/bottleneck/include/bottleneck_detail.h b/bottleneck/include/bottleneck_detail.h new file mode 100644 index 0000000..7241c9a --- /dev/null +++ b/bottleneck/include/bottleneck_detail.h @@ -0,0 +1,90 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BOTTLENECK_DETAIL_H +#define HERA_BOTTLENECK_DETAIL_H + + +#include +#include +#include +#include +#include + +#include "diagram_traits.h" +#include "basic_defs_bt.h" +#include "bound_match.h" + +namespace hera { + + + namespace bt { + + // functions taking DiagramPointSet as input. + // ATTENTION: parameters A and B (diagrams) will be changed after the call + // (projections added). + + // return the interval (distMin, distMax) such that: + // a) actual bottleneck distance between A and B is contained in the interval + // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon + template + std::pair bottleneckDistApproxInterval(DiagramPointSet& A, DiagramPointSet& B, + const Real epsilon, MatchingEdge& longest_edge, + bool compute_longest_edge = false); + + + // heuristic (sample diagram to estimate the distance) + template + std::pair + bottleneckDistApproxIntervalHeur(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, + bool compute_longest_edge = false); + + // get approximate distance, + // see bottleneckDistApproxInterval + template + Real bottleneckDistApprox(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, + MatchingEdge& longest_edge, bool compute_longest_edge = false); + + // get exact bottleneck distance, + template + Real bottleneckDistExact(DiagramPointSet& A, DiagramPointSet& B, const int decPrecision, + MatchingEdge& longest_edge, bool compute_longest_edge = false); + + // get exact bottleneck distance, + template + Real bottleneckDistExact(DiagramPointSet& A, DiagramPointSet& B, MatchingEdge& longest_edge, + bool compute_longest_edge = false); + + } // end namespace bt + + +} // end namespace hera + +#include "bottleneck_detail.hpp" + +#endif // HERA_BOTTLENECK_DETAIL_H diff --git a/bottleneck/include/bottleneck_detail.hpp b/bottleneck/include/bottleneck_detail.hpp new file mode 100644 index 0000000..8f51d07 --- /dev/null +++ b/bottleneck/include/bottleneck_detail.hpp @@ -0,0 +1,636 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BOTTLENECK_HPP +#define HERA_BOTTLENECK_HPP + +#ifdef FOR_R_TDA +#undef DEBUG_BOUND_MATCH +#undef DEBUG_MATCHING +#undef VERBOSE_BOTTLENECK +#endif + + +#include +#include +#include +#include +#include + +#include "bottleneck_detail.h" + +namespace hera { + namespace bt { + + template + void binarySearch(const Real epsilon, + std::pair& result, + BoundMatchOracle & oracle, + const Real infinityCost, + bool isResultInitializedCorrectly, + const Real distProbeInit) + { + // aliases for result components + Real& distMin = result.first; + Real& distMax = result.second; + + distMin = std::max(distMin, infinityCost); + distMax = std::max(distMax, infinityCost); + + Real distProbe; + + if (not isResultInitializedCorrectly) { + distProbe = distProbeInit; + if (oracle.isMatchLess(distProbe)) { + // distProbe is an upper bound, + // find lower bound with binary search + do { + distMax = distProbe; + distProbe /= 2.0; + } while (oracle.isMatchLess(distProbe)); + distMin = distProbe; + } else { + // distProbe is a lower bound, + // find upper bound with exponential search + do { + distMin = distProbe; + distProbe *= 2.0; + } while (!oracle.isMatchLess(distProbe)); + distMax = distProbe; + } + } + // bounds are correct , perform binary search + distProbe = (distMin + distMax) / 2.0; + while ((distMax - distMin) / distMin >= epsilon) { + + if (distMax < infinityCost) { + distMin = infinityCost; + distMax = infinityCost; + break; + } + + if (oracle.isMatchLess(distProbe)) { + distMax = distProbe; + } else { + distMin = distProbe; + } + + distProbe = (distMin + distMax) / 2.0; + } + + distMin = std::max(distMin, infinityCost); + distMax = std::max(distMax, infinityCost); + } + + // template + // inline Real getOneDimensionalCost(std::vector& set_A, std::vector& set_B) + // { + // if (set_A.size() != set_B.size()) { + // return std::numeric_limits::infinity(); + // } + // + // if (set_A.empty()) { + // return Real(0.0); + // } + // + // std::sort(set_A.begin(), set_A.end()); + // std::sort(set_B.begin(), set_B.end()); + // + // Real result = 0.0; + // for (size_t i = 0; i < set_A.size(); ++i) { + // result = std::max(result, (std::fabs(set_A[i] - set_B[i]))); + // } + // + // return result; + // } + + + template + struct CostEdgePair + { + Real cost; + typename hera::bt::MatchingEdge edge; + }; + + template + using CoordPointPair = std::pair>; + + template + using CoordPointVector = std::vector>; + + template + struct CoordPointPairComparator + { + bool operator()(const CoordPointPair& a, const CoordPointPair& b) const + { + return a.first < b.first or (a.first == b.first and a.second.id < b.second.id); + }; + }; + + template + inline typename hera::bt::CostEdgePair + getOneDimensionalCost(typename hera::bt::CoordPointVector& set_A, + typename hera::bt::CoordPointVector& set_B) + { + using MatchingEdgeR = hera::bt::MatchingEdge; + using CostEdgePairR = CostEdgePair; + + if (set_A.size() != set_B.size()) { + return CostEdgePairR { std::numeric_limits::infinity(), MatchingEdgeR() }; + } + + if (set_A.empty()) { + return CostEdgePairR { Real(0.0), MatchingEdgeR() }; + } + + std::sort(set_A.begin(), set_A.end(), CoordPointPairComparator()); + std::sort(set_B.begin(), set_B.end(), CoordPointPairComparator()); + + CostEdgePairR result { -1.0, MatchingEdgeR() }; + + for (size_t i = 0; i < set_A.size(); ++i) { + Real curr_cost = std::fabs(set_A[i].first - set_B[i].first); + if (curr_cost > result.cost) { + result.cost = curr_cost; + result.edge = MatchingEdgeR(set_A[i].second, set_B[i].second); + } + } + return result; + } + + + template + inline CostEdgePair getInfinityCost(const DiagramPointSet & A, const DiagramPointSet & B, + bool compute_longest_edge = false) + { + using CostEdgePairR = CostEdgePair; + using CoordPointVectorR = CoordPointVector; + + CoordPointVectorR x_plus_A, x_minus_A, y_plus_A, y_minus_A; + CoordPointVectorR x_plus_B, x_minus_B, y_plus_B, y_minus_B; + + for (auto iter_A = A.cbegin(); iter_A != A.cend(); ++iter_A) { + Real x = iter_A->getRealX(); + Real y = iter_A->getRealY(); + if (x == std::numeric_limits::infinity()) { + y_plus_A.emplace_back(y, *iter_A); + } else if (x == -std::numeric_limits::infinity()) { + y_minus_A.emplace_back(y, *iter_A); + } else if (y == std::numeric_limits::infinity()) { + x_plus_A.emplace_back(x, *iter_A); + } else if (y == -std::numeric_limits::infinity()) { + x_minus_A.emplace_back(x, *iter_A); + } + } + + for (auto iter_B = B.cbegin(); iter_B != B.cend(); ++iter_B) { + Real x = iter_B->getRealX(); + Real y = iter_B->getRealY(); + if (x == std::numeric_limits::infinity()) { + y_plus_B.emplace_back(y, *iter_B); + } else if (x == -std::numeric_limits::infinity()) { + y_minus_B.emplace_back(y, *iter_B); + } else if (y == std::numeric_limits::infinity()) { + x_plus_B.emplace_back(x, *iter_B); + } else if (y == -std::numeric_limits::infinity()) { + x_minus_B.emplace_back(x, *iter_B); + } + } + + CostEdgePairR result = getOneDimensionalCost(x_plus_A, x_plus_B); + + CostEdgePairR next_cost_edge = getOneDimensionalCost(x_minus_A, x_minus_B); + if (next_cost_edge.cost > result.cost) { + result = next_cost_edge; + } + + next_cost_edge = getOneDimensionalCost(y_plus_A, y_plus_B); + if (next_cost_edge.cost > result.cost) { + result = next_cost_edge; + } + + next_cost_edge = getOneDimensionalCost(y_minus_A, y_minus_B); + if (next_cost_edge.cost > result.cost) { + result = next_cost_edge; + } + + return result; + } + + // return the interval (distMin, distMax) such that: + // a) actual bottleneck distance between A and B is contained in the interval + // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon + template + inline std::pair + bottleneckDistApproxInterval(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, + MatchingEdge& edge, bool compute_longest_edge) + { + using MatchingEdgeR = MatchingEdge; + using CostEdgePairR = CostEdgePair; + + edge = MatchingEdgeR(); + // empty diagrams are not considered as error + if (A.empty() and B.empty()) { + return std::make_pair(0.0, 0.0); + } + + CostEdgePairR inf_cost_edge = getInfinityCost(A, B, true); + + Real infinity_cost = inf_cost_edge.cost; + if (infinity_cost == std::numeric_limits::infinity()) { + return std::make_pair(infinity_cost, infinity_cost); + } else { + edge = inf_cost_edge.edge; + } + + // link diagrams A and B by adding projections + addProjections(A, B); + + // TODO: think about that! + // we need one threshold for checking if the distance is 0, + // another one for the oracle! + constexpr Real epsThreshold { 1.0e-10 }; + std::pair result { 0.0, 0.0 }; + bool useRangeSearch { true }; + // construct an oracle + BoundMatchOracle oracle(A, B, epsThreshold, useRangeSearch); + // check for distance = 0 + if (oracle.isMatchLess(2 * epsThreshold)) { + if (infinity_cost > epsThreshold) { + result.first = infinity_cost; + result.second = infinity_cost; + edge = inf_cost_edge.edge; + } + return result; + } + // get a 3-approximation of maximal distance between A and B + // as a starting value for probe distance + Real distProbe { getFurthestDistance3Approx>(A, B) }; + binarySearch(epsilon, result, oracle, infinity_cost, false, distProbe); + // to compute longest edge a perfect matching is needed + if (compute_longest_edge and result.first > infinity_cost) { + oracle.isMatchLess(result.second); + edge = oracle.get_longest_edge(); + } + return result; + } + + template + void sampleDiagramForHeur(const DiagramPointSet & dgmIn, DiagramPointSet & dgmOut) + { + struct pair_hash + { + std::size_t operator()(const std::pair p) const + { + return std::hash()(p.first) ^ std::hash()(p.second); + } + }; + std::unordered_map, int, pair_hash> m; + for (auto ptIter = dgmIn.cbegin(); ptIter != dgmIn.cend(); ++ptIter) { + if (ptIter->isNormal() and not ptIter->isInfinity()) { + m[std::make_pair(ptIter->getRealX(), ptIter->getRealY())]++; + } + } + if (m.size() < 2) { + dgmOut = dgmIn; + return; + } + std::vector v; + for (const auto& ptQtyPair : m) { + v.push_back(ptQtyPair.second); + } + std::sort(v.begin(), v.end()); + int maxLeap = v[1] - v[0]; + int cutVal = v[0]; + for (int i = 1; i < static_cast(v.size()) - 1; ++i) { + int currLeap = v[i + 1] - v[i]; + if (currLeap > maxLeap) { + maxLeap = currLeap; + cutVal = v[i]; + } + } + std::vector> vv; + // keep points whose multiplicites are at most cutVal + // quick-and-dirty: fill in vv with copies of each point + // to construct DiagramPointSet from it later + for (const auto& ptQty : m) { + if (ptQty.second < cutVal) { + for (int i = 0; i < ptQty.second; ++i) { + vv.push_back(std::make_pair(ptQty.first.first, ptQty.first.second)); + } + } + } + dgmOut.clear(); + dgmOut = DiagramPointSet(vv.begin(), vv.end()); + } + + + // return the interval (distMin, distMax) such that: + // a) actual bottleneck distance between A and B is contained in the interval + // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon + template + std::pair + bottleneckDistApproxIntervalWithInitial(DiagramPointSet & A, DiagramPointSet & B, + const Real epsilon, + const std::pair initialGuess, + const Real infinity_cost, + MatchingEdge & longest_edge, + bool compute_longest_edge = false) + { + // empty diagrams are not considered as error + if (A.empty() and B.empty()) { + return std::make_pair(0.0, 0.0); + } + + // link diagrams A and B by adding projections + addProjections(A, B); + + constexpr Real epsThreshold { 1.0e-10 }; + std::pair result { 0.0, 0.0 }; + bool useRangeSearch { true }; + // construct an oracle + BoundMatchOracle oracle(A, B, epsThreshold, useRangeSearch); + + Real& distMin { result.first }; + Real& distMax { result.second }; + + // initialize search interval from initialGuess + distMin = initialGuess.first; + distMax = initialGuess.second; + + assert(distMin <= distMax); + + // make sure that distMin is a lower bound + while (oracle.isMatchLess(distMin)) { + // distMin is in fact an upper bound, so assign it to distMax + distMax = distMin; + // and decrease distMin by 5 % + distMin = 0.95 * distMin; + } + + // make sure that distMax is an upper bound + while (not oracle.isMatchLess(distMax)) { + // distMax is in fact a lower bound, so assign it to distMin + distMin = distMax; + // and increase distMax by 5 % + distMax = 1.05 * distMax; + } + + // bounds are found, perform binary search + Real distProbe = (distMin + distMax) / 2.0; + binarySearch(epsilon, result, oracle, infinity_cost, true, distProbe); + if (compute_longest_edge) { + longest_edge = oracle.get_longest_edge(); + } + return result; + } + + // return the interval (distMin, distMax) such that: + // a) actual bottleneck distance between A and B is contained in the interval + // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon + // use heuristic: initial estimate on sampled diagrams + template + std::pair + bottleneckDistApproxIntervalHeur(DiagramPointSet & A, DiagramPointSet & B, const Real epsilon, + MatchingEdge & longest_edge) + { + // empty diagrams are not considered as error + if (A.empty() and B.empty()) { + return std::make_pair(0.0, 0.0); + } + + Real infinity_cost = getInfinityCost(A, B); + if (infinity_cost == std::numeric_limits::infinity()) { + return std::make_pair(infinity_cost, infinity_cost); + } + + DiagramPointSet sampledA, sampledB; + sampleDiagramForHeur(A, sampledA); + sampleDiagramForHeur(B, sampledB); + + std::pair initGuess = bottleneckDistApproxInterval(sampledA, sampledB, epsilon); + + initGuess.first = std::max(initGuess.first, infinity_cost); + initGuess.second = std::max(initGuess.second, infinity_cost); + + return bottleneckDistApproxIntervalWithInitial(A, B, epsilon, initGuess, infinity_cost, longest_edge); + } + + + // get approximate distance, + // see bottleneckDistApproxInterval + template + Real bottleneckDistApprox(DiagramPointSet & A, DiagramPointSet & B, const Real epsilon, + MatchingEdge & longest_edge, bool compute_longest_edge) + { + auto interval = bottleneckDistApproxInterval(A, B, epsilon, longest_edge, compute_longest_edge); + return interval.second; + } + + + template + Real bottleneckDistExactFromSortedPwDist(DiagramPointSet & A, DiagramPointSet & B, + const std::vector& pairwiseDist, + const int decPrecision, MatchingEdge & longest_edge, + bool compute_longest_edge = false) + { + // trivial case: we have only one candidate + if (pairwiseDist.size() == 1) { + return pairwiseDist[0]; + } + + bool useRangeSearch = true; + Real distEpsilon = std::numeric_limits::max(); + Real diffThreshold = 0.1; + for (int k = 0; k < decPrecision; ++k) { + diffThreshold /= 10; + } + for (size_t k = 0; k < pairwiseDist.size() - 2; ++k) { + auto diff = pairwiseDist[k + 1] - pairwiseDist[k]; + if (diff > diffThreshold and diff < distEpsilon) { + distEpsilon = diff; + } + } + distEpsilon = std::min(diffThreshold, distEpsilon / 3); + + BoundMatchOracle oracle(A, B, distEpsilon, useRangeSearch); + // binary search + size_t iterNum { 0 }; + size_t idxMin { 0 }, idxMax { pairwiseDist.size() - 1 }; + size_t idxMid; + while (idxMax > idxMin) { + idxMid = static_cast(floor(idxMin + idxMax) / 2); + iterNum++; + // not A[imid] < dist <=> A[imid] >= dist <=> A[imid[ >= dist + eps + if (oracle.isMatchLess(pairwiseDist[idxMid] + distEpsilon / 2)) { + idxMax = idxMid; + } else { + idxMin = idxMid + 1; + } + } + idxMid = static_cast(floor(idxMin + idxMax) / 2); + Real result = pairwiseDist[idxMid]; + if (compute_longest_edge) { + oracle.isMatchLess(result + distEpsilon / 2); + longest_edge = oracle.get_longest_edge(); + } + return result; + } + + + template + Real + bottleneckDistExact(DiagramPointSet & A, DiagramPointSet & B, MatchingEdge & longest_edge, + bool compute_longest_edge) + { + return bottleneckDistExact(A, B, 14, longest_edge, compute_longest_edge); + } + + template + Real bottleneckDistExact(DiagramPointSet & A, DiagramPointSet & B, const int decPrecision, + MatchingEdge & longest_edge, bool compute_longest_edge) + { + using DgmPoint = DiagramPoint; + + constexpr Real epsilon = 0.001; + auto interval = bottleneckDistApproxInterval(A, B, epsilon, longest_edge, true); + // if the longest edge is on infinity, the answer is already exact + // this will be detected here and all the code after if + // may assume that the longest edge is on finite points + if (interval.first == interval.second) { + return interval.first; + } + const Real delta = 0.50001 * (interval.second - interval.first); + const Real approxDist = 0.5 * (interval.first + interval.second); + const Real minDist = interval.first; + const Real maxDist = interval.second; + if (delta == 0) { + return interval.first; + } + // copy points from A to a vector + // todo: get rid of this? + std::vector pointsA; + pointsA.reserve(A.size()); + for (const auto& ptA : A) { + pointsA.push_back(ptA); + } + + // in this vector we store the distances between the points + // that are candidates to realize + std::set pairwiseDist; + { + // vector to store centers of vertical stripes + // two for each point in A and the id of the corresponding point + std::vector> xCentersVec; + xCentersVec.reserve(2 * pointsA.size()); + for (auto ptA : pointsA) { + xCentersVec.push_back(std::make_pair(ptA.getRealX() - approxDist, ptA)); + xCentersVec.push_back(std::make_pair(ptA.getRealX() + approxDist, ptA)); + } + // lambda to compare pairs w.r.t coordinate + auto compLambda = [](std::pair a, std::pair b) { + return a.first < b.first; + }; + + std::sort(xCentersVec.begin(), xCentersVec.end(), compLambda); + // todo: sort points in B, reduce search range in lower and upper bounds + for (auto ptB : B) { + // iterator to the first stripe such that ptB lies to the left + // from its right boundary (x_B <= x_j + \delta iff x_j >= x_B - \delta + auto itStart = std::lower_bound(xCentersVec.begin(), + xCentersVec.end(), + std::make_pair(ptB.getRealX() - delta, ptB), + compLambda); + + for (auto iterA = itStart; iterA < xCentersVec.end(); ++iterA) { + if (ptB.getRealX() < iterA->first - delta) { + // from that moment x_B >= x_j - delta + // is violated: x_B no longer lies to right from the left + // boundary of current stripe + break; + } + // we're here => ptB lies in vertical stripe, + // check if distance fits into the interval we've found + Real pwDist = distLInf(iterA->second, ptB); + if (pwDist >= minDist and pwDist <= maxDist) { + pairwiseDist.insert(pwDist); + } + } + } + } + + { + // for y + // vector to store centers of vertical stripes + // two for each point in A and the id of the corresponding point + std::vector> yCentersVec; + yCentersVec.reserve(2 * pointsA.size()); + for (auto ptA : pointsA) { + yCentersVec.push_back(std::make_pair(ptA.getRealY() - approxDist, ptA)); + yCentersVec.push_back(std::make_pair(ptA.getRealY() + approxDist, ptA)); + } + // lambda to compare pairs w.r.t coordinate + auto compLambda = [](std::pair a, std::pair b) { + return a.first < b.first; + }; + + std::sort(yCentersVec.begin(), yCentersVec.end(), compLambda); + + // todo: sort points in B, reduce search range in lower and upper bounds + for (auto ptB : B) { + auto itStart = std::lower_bound(yCentersVec.begin(), + yCentersVec.end(), + std::make_pair(ptB.getRealY() - delta, ptB), + compLambda); + + + for (auto iterA = itStart; iterA < yCentersVec.end(); ++iterA) { + if (ptB.getRealY() < iterA->first - delta) { + break; + } + Real pwDist = distLInf(iterA->second, ptB); + if (pwDist >= minDist and pwDist <= maxDist) { + pairwiseDist.insert(pwDist); + } + } + } + } + + std::vector pw_dists; + pw_dists.reserve(pairwiseDist.size()); + for(Real d : pairwiseDist) { + pw_dists.push_back(d); + } + + return bottleneckDistExactFromSortedPwDist(A, B, pw_dists, decPrecision, longest_edge, + compute_longest_edge); + } + + } // end namespace bt +} // end namespace hera +#endif // HERA_BOTTLENECK_HPP diff --git a/bottleneck/include/bound_match.h b/bottleneck/include/bound_match.h new file mode 100644 index 0000000..99543f9 --- /dev/null +++ b/bottleneck/include/bound_match.h @@ -0,0 +1,109 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BOUND_MATCH_H +#define HERA_BOUND_MATCH_H + +#include +#include + +#include "basic_defs_bt.h" +#include "neighb_oracle.h" + + +namespace hera { +namespace bt { + +template +class Matching { +public: + using DgmPoint = DiagramPoint; + using DgmPointSet = DiagramPointSet; + using DgmPointHash = DiagramPointHash; + using Path = std::vector; + + Matching(const DgmPointSet& AA, const DgmPointSet& BB) : A(AA), B(BB) {}; + DgmPointSet getExposedVertices(bool forA = true) const ; + bool isExposed(const DgmPoint& p) const; + void getAllAdjacentVertices(const DgmPointSet& setIn, DgmPointSet& setOut, bool forA = true) const; + void increase(const Path& augmentingPath); + void checkAugPath(const Path& augPath) const; + bool getMatchedVertex(const DgmPoint& p, DgmPoint& result) const; + bool isPerfect() const; + void trimMatching(const Real newThreshold); + MatchingEdge get_longest_edge() const; +#ifndef FOR_R_TDA + template + friend std::ostream& operator<<(std::ostream& output, const Matching& m); +#endif +private: + DgmPointSet A; + DgmPointSet B; + std::unordered_map AToB, BToA; + void matchVertices(const DgmPoint& pA, const DgmPoint& pB); + void sanityCheck() const; +}; + + + +template> +class BoundMatchOracle { +public: + using Real = Real_; + using NeighbOracle = NeighbOracle_; + using DgmPoint = DiagramPoint; + using DgmPointSet = DiagramPointSet; + using Path = std::vector; + + BoundMatchOracle(DgmPointSet psA, DgmPointSet psB, Real dEps, bool useRS = true); + bool isMatchLess(Real r); + bool buildMatchingForThreshold(const Real r); + MatchingEdge get_longest_edge() const { return M.get_longest_edge(); } +private: + DgmPointSet A, B; + Matching M; + void printLayerGraph(); + void buildLayerGraph(Real r); + void buildLayerOracles(Real r); + bool buildAugmentingPath(const DgmPoint startVertex, Path& result); + void removeFromLayer(const DgmPoint& p, const int layerIdx); + std::unique_ptr neighbOracle; + bool augPathExist; + std::vector layerGraph; + std::vector> layerOracles; + Real distEpsilon; + bool useRangeSearch; + Real prevQueryValue; +}; + +} // end namespace bt +} // end namespace hera + +#include "bound_match.hpp" + +#endif // HERA_BOUND_MATCH_H diff --git a/bottleneck/include/bound_match.hpp b/bottleneck/include/bound_match.hpp new file mode 100644 index 0000000..b95628f --- /dev/null +++ b/bottleneck/include/bound_match.hpp @@ -0,0 +1,511 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_BOUND_MATCH_HPP +#define HERA_BOUND_MATCH_HPP + + +#ifdef FOR_R_TDA +#undef DEBUG_BOUND_MATCH +#undef DEBUG_MATCHING +#undef VERBOSE_BOTTLENECK +#endif + +#include +#include "def_debug_bt.h" +#include "bound_match.h" + +#ifdef VERBOSE_BOTTLENECK +#include +#endif + +#ifndef FOR_R_TDA + +#include + +#endif + +namespace hera { + namespace bt { + +#ifndef FOR_R_TDA + + template + std::ostream& operator<<(std::ostream& output, const Matching & m) + { + output << "Matching: " << m.AToB.size() << " pairs ("; + if (!m.isPerfect()) { + output << "not"; + } + output << " perfect)" << std::endl; + for (auto atob : m.AToB) { + output << atob.first << " <-> " << atob.second << " distance: " << distLInf(atob.first, atob.second) + << std::endl; + } + return output; + } + +#endif + + template + void Matching::sanityCheck() const + { +#ifdef DEBUG_MATCHING + assert( AToB.size() == BToA.size() ); + for(auto aToBPair : AToB) { + auto bToAPair = BToA.find(aToBPair.second); + assert(bToAPair != BToA.end()); + assert( aToBPair.first == bToAPair->second); + } +#endif + } + + template + bool Matching::isPerfect() const + { + return AToB.size() == A.size(); + } + + template + void Matching::matchVertices(const DgmPoint& pA, const DgmPoint& pB) + { + assert(A.hasElement(pA)); + assert(B.hasElement(pB)); + AToB.erase(pA); + AToB.insert({{ pA, pB }}); + BToA.erase(pB); + BToA.insert({{ pB, pA }}); + } + + template + bool Matching::getMatchedVertex(const DgmPoint& p, DgmPoint& result) const + { + sanityCheck(); + auto inA = AToB.find(p); + if (inA != AToB.end()) { + result = inA->second; + return true; + } else { + auto inB = BToA.find(p); + if (inB != BToA.end()) { + result = inB->second; + return true; + } + } + return false; + } + + + template + void Matching::checkAugPath(const Path& augPath) const + { + assert(augPath.size() % 2 == 0); + for (size_t idx = 0; idx < augPath.size(); ++idx) { + bool mustBeExposed { idx == 0 or idx == augPath.size() - 1 }; + if (isExposed(augPath[idx]) != mustBeExposed) { +#ifndef FOR_R_TDA + std::cerr << "mustBeExposed = " << mustBeExposed << ", idx = " << idx << ", point " << augPath[idx] + << std::endl; +#endif + } + assert(isExposed(augPath[idx]) == mustBeExposed); + DgmPoint matchedVertex; + if (idx % 2 == 0) { + assert(A.hasElement(augPath[idx])); + if (not mustBeExposed) { + getMatchedVertex(augPath[idx], matchedVertex); + assert(matchedVertex == augPath[idx - 1]); + } + } else { + assert(B.hasElement(augPath[idx])); + if (not mustBeExposed) { + getMatchedVertex(augPath[idx], matchedVertex); + assert(matchedVertex == augPath[idx + 1]); + } + } + } + } + + // use augmenting path to increase + // the size of the matching + template + void Matching::increase(const Path& augPath) + { + sanityCheck(); + // check that augPath is an augmenting path + checkAugPath(augPath); + for (size_t idx = 0; idx < augPath.size() - 1; idx += 2) { + matchVertices(augPath[idx], augPath[idx + 1]); + } + sanityCheck(); + } + + template + DiagramPointSet Matching::getExposedVertices(bool forA) const + { + sanityCheck(); + DgmPointSet result; + const DgmPointSet* setToSearch { forA ? &A : &B }; + const std::unordered_map* mapToSearch { forA ? &AToB : &BToA }; + for (auto it = setToSearch->cbegin(); it != setToSearch->cend(); ++it) { + if (mapToSearch->find((*it)) == mapToSearch->cend()) { + result.insert((*it)); + } + } + return result; + } + + template + void Matching::getAllAdjacentVertices(const DgmPointSet& setIn, + DgmPointSet& setOut, + bool forA) const + { + sanityCheck(); + //bool isDebug {false}; + setOut.clear(); + const std::unordered_map* m; + m = (forA) ? &BToA : &AToB; + for (auto pit = setIn.cbegin(); pit != setIn.cend(); ++pit) { + auto findRes = m->find(*pit); + if (findRes != m->cend()) { + setOut.insert((*findRes).second); + } + } + sanityCheck(); + } + + template + bool Matching::isExposed(const DgmPoint& p) const + { + return (AToB.find(p) == AToB.end()) && (BToA.find(p) == BToA.end()); + } + + // remove all edges whose length is > newThreshold + template + void Matching::trimMatching(const R newThreshold) + { + //bool isDebug { false }; + sanityCheck(); + for (auto aToBIter = AToB.begin(); aToBIter != AToB.end();) { + if (distLInf(aToBIter->first, aToBIter->second) > newThreshold) { + // remove edge from AToB and BToA + BToA.erase(aToBIter->second); + aToBIter = AToB.erase(aToBIter); + } else { + aToBIter++; + } + } + sanityCheck(); + } + + template + MatchingEdge Matching::get_longest_edge() const + { + R max_dist = -1.0; + MatchingEdge edge; + for (const auto& x : AToB) { + //std::cout << "max_dist = " << max_dist << std::endl; + //std::cout << "distance = " << distLInf(x.first, x.second) << std::endl; + + // for now skew edges may appear in the matching + // but they should not be returned to user + // if currrent edge is a skew edge, there must another edge + // with the same cost + R curr_dist; + if (x.first.isDiagonal() and x.second.isNormal()) { + curr_dist = x.second.get_persistence(hera::get_infinity()); + } else if (x.first.isNormal() and x.second.isDiagonal()) { + curr_dist = x.first.get_persistence(hera::get_infinity()); + } else { + curr_dist = distLInf(x.first, x.second); + } + if (max_dist < curr_dist) { + max_dist = curr_dist; + edge = x; + //std::cout << "updated max_dist = " << max_dist << std::endl; + //std::cout << "updated edge = " << x.first << " <-> " << x.second << std::endl; + } + } + return edge; + } + + // ------- BoundMatchOracle -------------- + + template + BoundMatchOracle::BoundMatchOracle(DgmPointSet psA, DgmPointSet psB, + Real dEps, bool useRS) : + A(psA), B(psB), M(A, B), distEpsilon(dEps), useRangeSearch(useRS), prevQueryValue(0.0) + { + neighbOracle = std::unique_ptr(new NeighbOracle(psB, 0, distEpsilon)); + } + + template + bool BoundMatchOracle::isMatchLess(Real r) + { +#ifdef VERBOSE_BOTTLENECK + std::chrono::high_resolution_clock hrClock; + std::chrono::time_point startMoment; + startMoment = hrClock.now(); +#endif + bool result = buildMatchingForThreshold(r); +#ifdef VERBOSE_BOTTLENECK + auto endMoment = hrClock.now(); + std::chrono::duration iterTime = endMoment - startMoment; + std::cout << "isMatchLess for r = " << r << " finished in " << std::chrono::duration(iterTime).count() << " ms." << std::endl; +#endif + return result; + + } + + + template + void BoundMatchOracle::removeFromLayer(const DgmPoint& p, const int layerIdx) + { + //bool isDebug {false}; + layerGraph[layerIdx].erase(p); + if (layerOracles[layerIdx]) { + layerOracles[layerIdx]->deletePoint(p); + } + } + + // return true, if there exists an augmenting path from startVertex + // in this case the path is returned in result. + // startVertex must be an exposed vertex from L_1 (layer[0]) + template + bool BoundMatchOracle::buildAugmentingPath(const DgmPoint startVertex, Path& result) + { + //bool isDebug {false}; + DgmPoint prevVertexA = startVertex; + result.clear(); + result.push_back(startVertex); + size_t evenLayerIdx { 1 }; + while (evenLayerIdx < layerGraph.size()) { + //for(size_t evenLayerIdx = 1; evenLayerIdx < layerGraph.size(); evenLayerIdx += 2) { + DgmPoint nextVertexB; // next vertex from even layer + bool neighbFound = layerOracles[evenLayerIdx]->getNeighbour(prevVertexA, nextVertexB); + if (neighbFound) { + result.push_back(nextVertexB); + if (layerGraph.size() == evenLayerIdx + 1) { + break; + } else { + // nextVertexB must be matched with some vertex from the next odd + // layer + DgmPoint nextVertexA; + if (!M.getMatchedVertex(nextVertexB, nextVertexA)) { +#ifndef FOR_R_TDA + std::cerr << "Vertices in even layers must be matched! Unmatched: "; + std::cerr << nextVertexB << std::endl; + std::cerr << evenLayerIdx << "; " << layerGraph.size() << std::endl; +#endif + throw std::runtime_error("Unmatched vertex in even layer"); + } else { + assert(!(nextVertexA.getRealX() == 0 and nextVertexA.getRealY() == 0)); + result.push_back(nextVertexA); + prevVertexA = nextVertexA; + evenLayerIdx += 2; + continue; + } + } + } else { + // prevVertexA has no neighbours in the next layer, + // backtrack + if (evenLayerIdx == 1) { + // startVertex is not connected to any vertices + // in the next layer, augm. path doesn't exist + removeFromLayer(startVertex, 0); + return false; + } else { + assert(evenLayerIdx >= 3); + assert(result.size() % 2 == 1); + result.pop_back(); + DgmPoint prevVertexB = result.back(); + result.pop_back(); + removeFromLayer(prevVertexA, evenLayerIdx - 1); + removeFromLayer(prevVertexB, evenLayerIdx - 2); + // we should proceed from the previous odd layer + assert(result.size() >= 1); + prevVertexA = result.back(); + evenLayerIdx -= 2; + continue; + } + } + } // finished iterating over all layers + // remove all vertices in the augmenting paths + // the corresponding layers + for (size_t layerIdx = 0; layerIdx < result.size(); ++layerIdx) { + removeFromLayer(result[layerIdx], layerIdx); + } + return true; + } + + + template + bool BoundMatchOracle::buildMatchingForThreshold(const Real r) + { + //bool isDebug {false}; + if (prevQueryValue > r) { + M.trimMatching(r); + } + prevQueryValue = r; + while (true) { + buildLayerGraph(r); + if (augPathExist) { + std::vector augmentingPaths; + DgmPointSet copyLG0; + for (DgmPoint p : layerGraph[0]) { + copyLG0.insert(p); + } + for (DgmPoint exposedVertex : copyLG0) { + Path augPath; + if (buildAugmentingPath(exposedVertex, augPath)) { + augmentingPaths.push_back(augPath); + } + } + if (augmentingPaths.empty()) { +#ifndef FOR_R_TDA + std::cerr << "augmenting paths must exist, but were not found!" << std::endl; +#endif + throw std::runtime_error("bad epsilon?"); + } + // swap all augmenting paths with matching to increase it + for (auto& augPath : augmentingPaths) { + M.increase(augPath); + } + } else { + return M.isPerfect(); + } + } + } + + template + void BoundMatchOracle::printLayerGraph(void) + { +#ifdef DEBUG_BOUND_MATCH + for(auto& layer : layerGraph) { + std::cout << "{ "; + for(auto& p : layer) { + std::cout << p << "; "; + } + std::cout << "\b\b }" << std::endl; + } +#endif + } + + template + void BoundMatchOracle::buildLayerGraph(Real r) + { +#ifdef VERBOSE_BOTTLENECK + std::cout << "Entered buildLayerGraph, r = " << r << std::endl; +#endif + layerGraph.clear(); + DgmPointSet L1 = M.getExposedVertices(); + layerGraph.push_back(L1); + neighbOracle->rebuild(B, r); + size_t k = 0; + DgmPointSet layerNextEven; + DgmPointSet layerNextOdd; + bool exposedVerticesFound { false }; + while (true) { + layerNextEven.clear(); + for (auto p : layerGraph[k]) { + bool neighbFound; + //DgmPoint neighbour {0.0, 0.0, DgmPoint::DIAG, 1}; + DgmPoint neighbour; + if (useRangeSearch) { + std::vector neighbVec; + neighbOracle->getAllNeighbours(p, neighbVec); + neighbFound = !neighbVec.empty(); + for (auto& neighbPt : neighbVec) { + layerNextEven.insert(neighbPt); + if (!exposedVerticesFound and M.isExposed(neighbPt)) { + exposedVerticesFound = true; + } + } + } else { + while (true) { + neighbFound = neighbOracle->getNeighbour(p, neighbour); + if (neighbFound) { + layerNextEven.insert(neighbour); + neighbOracle->deletePoint(neighbour); + if ((!exposedVerticesFound) && M.isExposed(neighbour)) { + exposedVerticesFound = true; + } + } else { + break; + } + } + } // without range search + } // all vertices from previous odd layer processed + if (layerNextEven.empty()) { + augPathExist = false; + break; + } + if (exposedVerticesFound) { + for (auto it = layerNextEven.cbegin(); it != layerNextEven.cend();) { + if (!M.isExposed(*it)) { + layerNextEven.erase(it++); + } else { + ++it; + } + + } + layerGraph.push_back(layerNextEven); + augPathExist = true; + break; + } + layerGraph.push_back(layerNextEven); + M.getAllAdjacentVertices(layerNextEven, layerNextOdd); + layerGraph.push_back(layerNextOdd); + k += 2; + } + buildLayerOracles(r); + printLayerGraph(); + } + + // create geometric oracles for each even layer + // odd layers have NULL in layerOracles + template + void BoundMatchOracle::buildLayerOracles(Real r) + { + //bool isDebug {false}; + // free previously constructed oracles + layerOracles.clear(); + for (size_t layerIdx = 0; layerIdx < layerGraph.size(); ++layerIdx) { + if (layerIdx % 2 == 1) { + // even layer, build actual oracle + layerOracles.emplace_back(new NeighbOracle(layerGraph[layerIdx], r, distEpsilon)); + } else { + // odd layer + layerOracles.emplace_back(nullptr); + } + } + } + + } // end namespace bt +} // end namespace hera +#endif // HERA_BOUND_MATCH_HPP diff --git a/bottleneck/include/catch/catch.hpp b/bottleneck/include/catch/catch.hpp new file mode 100644 index 0000000..f7681f4 --- /dev/null +++ b/bottleneck/include/catch/catch.hpp @@ -0,0 +1,11545 @@ +/* + * Catch v1.9.6 + * Generated: 2017-06-27 12:19:54.557875 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + +#define TWOBLUECUBES_CATCH_HPP_INCLUDED + +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + +// #included from: internal/catch_suppress_warnings.h + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic ignored "-Wglobal-constructors" +# pragma clang diagnostic ignored "-Wvariadic-macros" +# pragma clang diagnostic ignored "-Wc99-extensions" +# pragma clang diagnostic ignored "-Wunused-variable" +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wc++98-compat" +# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic ignored "-Wvariadic-macros" +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wparentheses" + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpadded" +#endif +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL +#endif + +#ifdef CATCH_IMPL +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// #included from: internal/catch_notimplemented_exception.h +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED + +// #included from: catch_common.h +#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED + +// #included from: catch_compiler_capabilities.h +#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED + +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? +// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported +// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? +// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? +// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) +// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? +// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? + +// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_ form +// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 + +#ifdef __cplusplus + +# if __cplusplus >= 201103L +# define CATCH_CPP11_OR_GREATER +# endif + +# if __cplusplus >= 201402L +# define CATCH_CPP14_OR_GREATER +# endif + +#endif + +#ifdef __clang__ + +# if __has_feature(cxx_nullptr) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# if __has_feature(cxx_noexcept) +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# endif + +# if defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic pop" ) + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic pop" ) +# endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# endif + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE + +#endif // __CYGWIN__ + +//////////////////////////////////////////////////////////////////////////////// +// Borland +#ifdef __BORLANDC__ + +#endif // __BORLANDC__ + +//////////////////////////////////////////////////////////////////////////////// +// EDG +#ifdef __EDG_VERSION__ + +#endif // __EDG_VERSION__ + +//////////////////////////////////////////////////////////////////////////////// +// Digital Mars +#ifdef __DMC__ + +#endif // __DMC__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH + +#if (_MSC_VER >= 1600) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS +#endif + +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// + +// Use variadic macros if the compiler supports them +#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ + ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ + ( defined __GNUC__ && __GNUC__ >= 3 ) || \ + ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) + +#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS + +#endif + +// Use __COUNTER__ if the compiler supports it +#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ + ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \ + ( defined __clang__ && __clang_major__ >= 3 ) + +#define CATCH_INTERNAL_CONFIG_COUNTER + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// catch all support for C++11 +#if defined(CATCH_CPP11_OR_GREATER) + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# endif + +# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) +# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) +# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) +# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) +# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS +# endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NULLPTR +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_IS_ENUM +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TUPLE +#endif +#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) +# define CATCH_CONFIG_VARIADIC_MACROS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_LONG_LONG +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_UNIQUE_PTR +#endif +// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for +// analytics) because, at time of writing, __COUNTER__ is not properly handled by it. +// This does not affect compilation +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_SHUFFLE +#endif +# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TYPE_TRAITS +# endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS +#endif + +// noexcept support: +#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) +# define CATCH_NOEXCEPT noexcept +# define CATCH_NOEXCEPT_IS(x) noexcept(x) +#else +# define CATCH_NOEXCEPT throw() +# define CATCH_NOEXCEPT_IS(x) +#endif + +// nullptr support +#ifdef CATCH_CONFIG_CPP11_NULLPTR +# define CATCH_NULL nullptr +#else +# define CATCH_NULL NULL +#endif + +// override support +#ifdef CATCH_CONFIG_CPP11_OVERRIDE +# define CATCH_OVERRIDE override +#else +# define CATCH_OVERRIDE +#endif + +// unique_ptr support +#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR +# define CATCH_AUTO_PTR( T ) std::unique_ptr +#else +# define CATCH_AUTO_PTR( T ) std::auto_ptr +#endif + +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr +#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) + +#include +#include + +namespace Catch { + + struct IConfig; + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + + class NonCopyable { +#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; +#else + NonCopyable( NonCopyable const& info ); + NonCopyable& operator = ( NonCopyable const& ); +#endif + + protected: + NonCopyable() {} + virtual ~NonCopyable(); + }; + + class SafeBool { + public: + typedef void (SafeBool::*type)() const; + + static type makeSafe( bool value ) { + return value ? &SafeBool::trueValue : 0; + } + private: + void trueValue() const {} + }; + + template + inline void deleteAll( ContainerT& container ) { + typename ContainerT::const_iterator it = container.begin(); + typename ContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete *it; + } + template + inline void deleteAllValues( AssociativeContainerT& container ) { + typename AssociativeContainerT::const_iterator it = container.begin(); + typename AssociativeContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete it->second; + } + + bool startsWith( std::string const& s, std::string const& prefix ); + bool startsWith( std::string const& s, char prefix ); + bool endsWith( std::string const& s, std::string const& suffix ); + bool endsWith( std::string const& s, char suffix ); + bool contains( std::string const& s, std::string const& infix ); + void toLowerInPlace( std::string& s ); + std::string toLower( std::string const& s ); + std::string trim( std::string const& str ); + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); + + struct pluralise { + pluralise( std::size_t count, std::string const& label ); + + friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); + + std::size_t m_count; + std::string m_label; + }; + + struct SourceLineInfo { + + SourceLineInfo(); + SourceLineInfo( char const* _file, std::size_t _line ); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + SourceLineInfo(SourceLineInfo const& other) = default; + SourceLineInfo( SourceLineInfo && ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo& operator = ( SourceLineInfo && ) = default; +# endif + bool empty() const; + bool operator == ( SourceLineInfo const& other ) const; + bool operator < ( SourceLineInfo const& other ) const; + + char const* file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // This is just here to avoid compiler warnings with macro constants and boolean literals + inline bool isTrue( bool value ){ return value; } + inline bool alwaysTrue() { return true; } + inline bool alwaysFalse() { return false; } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); + + void seedRng( IConfig const& config ); + unsigned int rngSeed(); + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() { + return std::string(); + } + }; + template + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) +#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); + +namespace Catch { + + class NotImplementedException : public std::exception + { + public: + NotImplementedException( SourceLineInfo const& lineInfo ); + NotImplementedException( NotImplementedException const& ) {} + + virtual ~NotImplementedException() CATCH_NOEXCEPT {} + + virtual const char* what() const CATCH_NOEXCEPT; + + private: + std::string m_what; + SourceLineInfo m_lineInfo; + }; + +} // end namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) + +// #included from: internal/catch_context.h +#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED + +// #included from: catch_interfaces_generators.h +#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED + +#include + +namespace Catch { + + struct IGeneratorInfo { + virtual ~IGeneratorInfo(); + virtual bool moveNext() = 0; + virtual std::size_t getCurrentIndex() const = 0; + }; + + struct IGeneratorsForTest { + virtual ~IGeneratorsForTest(); + + virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; + virtual bool moveNext() = 0; + }; + + IGeneratorsForTest* createGeneratorsForTest(); + +} // end namespace Catch + +// #included from: catch_ptr.hpp +#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + // An intrusive reference counting smart pointer. + // T must implement addRef() and release() methods + // typically implementing the IShared interface + template + class Ptr { + public: + Ptr() : m_p( CATCH_NULL ){} + Ptr( T* p ) : m_p( p ){ + if( m_p ) + m_p->addRef(); + } + Ptr( Ptr const& other ) : m_p( other.m_p ){ + if( m_p ) + m_p->addRef(); + } + ~Ptr(){ + if( m_p ) + m_p->release(); + } + void reset() { + if( m_p ) + m_p->release(); + m_p = CATCH_NULL; + } + Ptr& operator = ( T* p ){ + Ptr temp( p ); + swap( temp ); + return *this; + } + Ptr& operator = ( Ptr const& other ){ + Ptr temp( other ); + swap( temp ); + return *this; + } + void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } + T* get() const{ return m_p; } + T& operator*() const { return *m_p; } + T* operator->() const { return m_p; } + bool operator !() const { return m_p == CATCH_NULL; } + operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } + + private: + T* m_p; + }; + + struct IShared : NonCopyable { + virtual ~IShared(); + virtual void addRef() const = 0; + virtual void release() const = 0; + }; + + template + struct SharedImpl : T { + + SharedImpl() : m_rc( 0 ){} + + virtual void addRef() const { + ++m_rc; + } + virtual void release() const { + if( --m_rc == 0 ) + delete this; + } + + mutable unsigned int m_rc; + }; + +} // end namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +namespace Catch { + + class TestCase; + class Stream; + struct IResultCapture; + struct IRunner; + struct IGeneratorsForTest; + struct IConfig; + + struct IContext + { + virtual ~IContext(); + + virtual IResultCapture* getResultCapture() = 0; + virtual IRunner* getRunner() = 0; + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; + virtual bool advanceGeneratorsForCurrentTest() = 0; + virtual Ptr getConfig() const = 0; + }; + + struct IMutableContext : IContext + { + virtual ~IMutableContext(); + virtual void setResultCapture( IResultCapture* resultCapture ) = 0; + virtual void setRunner( IRunner* runner ) = 0; + virtual void setConfig( Ptr const& config ) = 0; + }; + + IContext& getCurrentContext(); + IMutableContext& getCurrentMutableContext(); + void cleanUpContext(); + Stream createStream( std::string const& streamName ); + +} + +// #included from: internal/catch_test_registry.hpp +#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED + +// #included from: catch_interfaces_testcase.h +#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED + +#include + +namespace Catch { + + class TestSpec; + + struct ITestCase : IShared { + virtual void invoke () const = 0; + protected: + virtual ~ITestCase(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector const& getAllTests() const = 0; + virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; + }; + + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector const& getAllTestCasesSorted( IConfig const& config ); + +} + +namespace Catch { + +template +class MethodTestCase : public SharedImpl { + +public: + MethodTestCase( void (C::*method)() ) : m_method( method ) {} + + virtual void invoke() const { + C obj; + (obj.*m_method)(); + } + +private: + virtual ~MethodTestCase() {} + + void (C::*m_method)(); +}; + +typedef void(*TestFunction)(); + +struct NameAndDesc { + NameAndDesc( const char* _name = "", const char* _description= "" ) + : name( _name ), description( _description ) + {} + + const char* name; + const char* description; +}; + +void registerTestCase + ( ITestCase* testCase, + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ); + +struct AutoReg { + + AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + + template + AutoReg + ( void (C::*method)(), + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + + registerTestCase + ( new MethodTestCase( method ), + className, + nameAndDesc, + lineInfo ); + } + + ~AutoReg(); + +private: + AutoReg( AutoReg const& ); + void operator= ( AutoReg const& ); +}; + +void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( ... ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ \ + struct TestName : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +#else + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ \ + struct TestCaseName : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestCaseName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +#endif + +// #included from: internal/catch_capture.hpp +#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED + +// #included from: catch_result_builder.h +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED + +// #included from: catch_result_type.h +#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED + +namespace Catch { + + // ResultWas::OfType enum + struct ResultWas { enum OfType { + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, + + FailureBit = 0x10, + + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, + + Exception = 0x100 | FailureBit, + + ThrewException = Exception | 1, + DidntThrowException = Exception | 2, + + FatalErrorCondition = 0x200 | FailureBit + + }; }; + + inline bool isOk( ResultWas::OfType resultType ) { + return ( resultType & ResultWas::FailureBit ) == 0; + } + inline bool isJustInfo( int flags ) { + return flags == ResultWas::Info; + } + + // ResultDisposition::Flags enum + struct ResultDisposition { enum Flags { + Normal = 0x01, + + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test + }; }; + + inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { + return static_cast( static_cast( lhs ) | static_cast( rhs ) ); + } + + inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } + inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } + inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } + +} // end namespace Catch + +// #included from: catch_assertionresult.h +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED + +#include + +namespace Catch { + + struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; + + struct DecomposedExpression + { + virtual ~DecomposedExpression() {} + virtual bool isBinaryExpression() const { + return false; + } + virtual void reconstructExpression( std::string& dest ) const = 0; + + // Only simple binary comparisons can be decomposed. + // If more complex check is required then wrap sub-expressions in parentheses. + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); + + private: + DecomposedExpression& operator = (DecomposedExpression const&); + }; + + struct AssertionInfo + { + AssertionInfo() {} + AssertionInfo( char const * _macroName, + SourceLineInfo const& _lineInfo, + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg = ""); + + char const * macroName; + SourceLineInfo lineInfo; + char const * capturedExpression; + ResultDisposition::Flags resultDisposition; + char const * secondArg; + }; + + struct AssertionResultData + { + AssertionResultData() : decomposedExpression( CATCH_NULL ) + , resultType( ResultWas::Unknown ) + , negated( false ) + , parenthesized( false ) {} + + void negate( bool parenthesize ) { + negated = !negated; + parenthesized = parenthesize; + if( resultType == ResultWas::Ok ) + resultType = ResultWas::ExpressionFailed; + else if( resultType == ResultWas::ExpressionFailed ) + resultType = ResultWas::Ok; + } + + std::string const& reconstructExpression() const { + if( decomposedExpression != CATCH_NULL ) { + decomposedExpression->reconstructExpression( reconstructedExpression ); + if( parenthesized ) { + reconstructedExpression.insert( 0, 1, '(' ); + reconstructedExpression.append( 1, ')' ); + } + if( negated ) { + reconstructedExpression.insert( 0, 1, '!' ); + } + decomposedExpression = CATCH_NULL; + } + return reconstructedExpression; + } + + mutable DecomposedExpression const* decomposedExpression; + mutable std::string reconstructedExpression; + std::string message; + ResultWas::OfType resultType; + bool negated; + bool parenthesized; + }; + + class AssertionResult { + public: + AssertionResult(); + AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); + ~AssertionResult(); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + AssertionResult( AssertionResult const& ) = default; + AssertionResult( AssertionResult && ) = default; + AssertionResult& operator = ( AssertionResult const& ) = default; + AssertionResult& operator = ( AssertionResult && ) = default; +# endif + + bool isOk() const; + bool succeeded() const; + ResultWas::OfType getResultType() const; + bool hasExpression() const; + bool hasMessage() const; + std::string getExpression() const; + std::string getExpressionInMacro() const; + bool hasExpandedExpression() const; + std::string getExpandedExpression() const; + std::string getMessage() const; + SourceLineInfo getSourceInfo() const; + std::string getTestMacroName() const; + void discardDecomposedExpression() const; + void expandDecomposedExpression() const; + + protected: + AssertionInfo m_info; + AssertionResultData m_resultData; + }; + +} // end namespace Catch + +// #included from: catch_matchers.hpp +#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED + +namespace Catch { +namespace Matchers { + namespace Impl { + + template struct MatchAllOf; + template struct MatchAnyOf; + template struct MatchNotOf; + + class MatcherUntypedBase { + public: + std::string toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + private: + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ); + }; + + template + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; + template + struct MatcherMethod { + virtual bool match( PtrT* arg ) const = 0; + }; + + template + struct MatcherBase : MatcherUntypedBase, MatcherMethod { + + MatchAllOf operator && ( MatcherBase const& other ) const; + MatchAnyOf operator || ( MatcherBase const& other ) const; + MatchNotOf operator ! () const; + }; + + template + struct MatchAllOf : MatcherBase { + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (!m_matchers[i]->match(arg)) + return false; + } + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " and "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAllOf& operator && ( MatcherBase const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector const*> m_matchers; + }; + template + struct MatchAnyOf : MatcherBase { + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (m_matchers[i]->match(arg)) + return true; + } + return false; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " or "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAnyOf& operator || ( MatcherBase const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector const*> m_matchers; + }; + + template + struct MatchNotOf : MatcherBase { + + MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + return !m_underlyingMatcher.match( arg ); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase const& m_underlyingMatcher; + }; + + template + MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { + return MatchAllOf() && *this && other; + } + template + MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { + return MatchAnyOf() || *this || other; + } + template + MatchNotOf MatcherBase::operator ! () const { + return MatchNotOf( *this ); + } + + } // namespace Impl + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + // - deprecated: prefer ||, && and ! + template + inline Impl::MatchNotOf Not( Impl::MatcherBase const& underlyingMatcher ) { + return Impl::MatchNotOf( underlyingMatcher ); + } + template + inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { + return Impl::MatchAllOf() && m1 && m2; + } + template + inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { + return Impl::MatchAllOf() && m1 && m2 && m3; + } + template + inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { + return Impl::MatchAnyOf() || m1 || m2; + } + template + inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { + return Impl::MatchAnyOf() || m1 || m2 || m3; + } + +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch + +namespace Catch { + + struct TestFailureException{}; + + template class ExpressionLhs; + + struct CopyableStream { + CopyableStream() {} + CopyableStream( CopyableStream const& other ) { + oss << other.oss.str(); + } + CopyableStream& operator=( CopyableStream const& other ) { + oss.str(std::string()); + oss << other.oss.str(); + return *this; + } + std::ostringstream oss; + }; + + class ResultBuilder : public DecomposedExpression { + public: + ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition, + char const* secondArg = "" ); + ~ResultBuilder(); + + template + ExpressionLhs operator <= ( T const& operand ); + ExpressionLhs operator <= ( bool value ); + + template + ResultBuilder& operator << ( T const& value ) { + m_stream().oss << value; + return *this; + } + + ResultBuilder& setResultType( ResultWas::OfType result ); + ResultBuilder& setResultType( bool result ); + + void endExpression( DecomposedExpression const& expr ); + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; + + AssertionResult build() const; + AssertionResult build( DecomposedExpression const& expr ) const; + + void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); + void captureResult( ResultWas::OfType resultType ); + void captureExpression(); + void captureExpectedException( std::string const& expectedMessage ); + void captureExpectedException( Matchers::Impl::MatcherBase const& matcher ); + void handleResult( AssertionResult const& result ); + void react(); + bool shouldDebugBreak() const; + bool allowThrows() const; + + template + void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); + + void setExceptionGuard(); + void unsetExceptionGuard(); + + private: + AssertionInfo m_assertionInfo; + AssertionResultData m_data; + + static CopyableStream &m_stream() + { + static CopyableStream s; + return s; + } + + bool m_shouldDebugBreak; + bool m_shouldThrow; + bool m_guardException; + }; + +} // namespace Catch + +// Include after due to circular dependency: +// #included from: catch_expression_lhs.hpp +#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED + +// #included from: catch_evaluate.hpp +#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) +#endif + +#include + +namespace Catch { +namespace Internal { + + enum Operator { + IsEqualTo, + IsNotEqualTo, + IsLessThan, + IsGreaterThan, + IsLessThanOrEqualTo, + IsGreaterThanOrEqualTo + }; + + template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; + template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; + template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; + template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; + template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; + template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; + template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; + + template + inline T& opCast(T const& t) { return const_cast(t); } + +// nullptr_t support based on pull request #154 from Konstantin Baumann +#ifdef CATCH_CONFIG_CPP11_NULLPTR + inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } +#endif // CATCH_CONFIG_CPP11_NULLPTR + + // So the compare overloads can be operator agnostic we convey the operator as a template + // enum, which is used to specialise an Evaluator for doing the comparison. + template + class Evaluator{}; + + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs) { + return bool( opCast( lhs ) == opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) != opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) < opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) > opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) >= opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) <= opCast( rhs ) ); + } + }; + + template + bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { + return Evaluator::evaluate( lhs, rhs ); + } + + // This level of indirection allows us to specialise for integer types + // to avoid signed/ unsigned warnings + + // "base" overload + template + bool compare( T1 const& lhs, T2 const& rhs ) { + return Evaluator::evaluate( lhs, rhs ); + } + + // unsigned X to int + template bool compare( unsigned int lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned long lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned char lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + + // unsigned X to long + template bool compare( unsigned int lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned long lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned char lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + + // int to unsigned X + template bool compare( int lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( int lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( int lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // long to unsigned X + template bool compare( long lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // pointer to long (when comparing against NULL) + template bool compare( long lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, long rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } + + // pointer to int (when comparing against NULL) + template bool compare( int lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, int rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + // long long to unsigned X + template bool compare( long long lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned long long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // unsigned long long to X + template bool compare( unsigned long long lhs, int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, long long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // pointer to long long (when comparing against NULL) + template bool compare( long long lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, long long rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } +#endif // CATCH_CONFIG_CPP11_LONG_LONG + +#ifdef CATCH_CONFIG_CPP11_NULLPTR + // pointer to nullptr_t (when comparing against nullptr) + template bool compare( std::nullptr_t, T* rhs ) { + return Evaluator::evaluate( nullptr, rhs ); + } + template bool compare( T* lhs, std::nullptr_t ) { + return Evaluator::evaluate( lhs, nullptr ); + } +#endif // CATCH_CONFIG_CPP11_NULLPTR + +} // end of namespace Internal +} // end of namespace Catch + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// #included from: catch_tostring.h +#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED + +#include +#include +#include +#include +#include + +#ifdef __OBJC__ +// #included from: catch_objc_arc.hpp +#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED + +#import + +#ifdef __has_feature +#define CATCH_ARC_ENABLED __has_feature(objc_arc) +#else +#define CATCH_ARC_ENABLED 0 +#endif + +void arcSafeRelease( NSObject* obj ); +id performOptionalSelector( id obj, SEL sel ); + +#if !CATCH_ARC_ENABLED +inline void arcSafeRelease( NSObject* obj ) { + [obj release]; +} +inline id performOptionalSelector( id obj, SEL sel ) { + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; + return nil; +} +#define CATCH_UNSAFE_UNRETAINED +#define CATCH_ARC_STRONG +#else +inline void arcSafeRelease( NSObject* ){} +inline id performOptionalSelector( id obj, SEL sel ) { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#endif + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + return nil; +} +#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained +#define CATCH_ARC_STRONG __strong +#endif + +#endif + +#ifdef CATCH_CONFIG_CPP11_TUPLE +#include +#endif + +#ifdef CATCH_CONFIG_CPP11_IS_ENUM +#include +#endif + +namespace Catch { + +// Why we're here. +template +std::string toString( T const& value ); + +// Built in overloads + +std::string toString( std::string const& value ); +std::string toString( std::wstring const& value ); +std::string toString( const char* const value ); +std::string toString( char* const value ); +std::string toString( const wchar_t* const value ); +std::string toString( wchar_t* const value ); +std::string toString( int value ); +std::string toString( unsigned long value ); +std::string toString( unsigned int value ); +std::string toString( const double value ); +std::string toString( const float value ); +std::string toString( bool value ); +std::string toString( char value ); +std::string toString( signed char value ); +std::string toString( unsigned char value ); + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ); +std::string toString( unsigned long long value ); +#endif + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ); +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ); + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ); + std::string toString( NSObject* const& nsObject ); +#endif + +namespace Detail { + + extern const std::string unprintableString; + + #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK) + struct BorgType { + template BorgType( T const& ); + }; + + struct TrueType { char sizer[1]; }; + struct FalseType { char sizer[2]; }; + + TrueType& testStreamable( std::ostream& ); + FalseType testStreamable( FalseType ); + + FalseType operator<<( std::ostream const&, BorgType const& ); + + template + struct IsStreamInsertable { + static std::ostream &s; + static T const&t; + enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; + }; +#else + template + class IsStreamInsertable { + template + static auto test(int) + -> decltype( std::declval() << std::declval(), std::true_type() ); + + template + static auto test(...) -> std::false_type; + + public: + static const bool value = decltype(test(0))::value; + }; +#endif + +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) + template::value + > + struct EnumStringMaker + { + static std::string convert( T const& ) { return unprintableString; } + }; + + template + struct EnumStringMaker + { + static std::string convert( T const& v ) + { + return ::Catch::toString( + static_cast::type>(v) + ); + } + }; +#endif + template + struct StringMakerBase { +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) + template + static std::string convert( T const& v ) + { + return EnumStringMaker::convert( v ); + } +#else + template + static std::string convert( T const& ) { return unprintableString; } +#endif + }; + + template<> + struct StringMakerBase { + template + static std::string convert( T const& _value ) { + std::ostringstream oss; + oss << _value; + return oss.str(); + } + }; + + std::string rawMemoryToString( const void *object, std::size_t size ); + + template + inline std::string rawMemoryToString( const T& object ) { + return rawMemoryToString( &object, sizeof(object) ); + } + +} // end namespace Detail + +template +struct StringMaker : + Detail::StringMakerBase::value> {}; + +template +struct StringMaker { + template + static std::string convert( U* p ) { + if( !p ) + return "NULL"; + else + return Detail::rawMemoryToString( p ); + } +}; + +template +struct StringMaker { + static std::string convert( R C::* p ) { + if( !p ) + return "NULL"; + else + return Detail::rawMemoryToString( p ); + } +}; + +namespace Detail { + template + std::string rangeToString( InputIterator first, InputIterator last ); +} + +//template +//struct StringMaker > { +// static std::string convert( std::vector const& v ) { +// return Detail::rangeToString( v.begin(), v.end() ); +// } +//}; + +template +std::string toString( std::vector const& v ) { + return Detail::rangeToString( v.begin(), v.end() ); +} + +#ifdef CATCH_CONFIG_CPP11_TUPLE + +// toString for tuples +namespace TupleDetail { + template< + typename Tuple, + std::size_t N = 0, + bool = (N < std::tuple_size::value) + > + struct ElementPrinter { + static void print( const Tuple& tuple, std::ostream& os ) + { + os << ( N ? ", " : " " ) + << Catch::toString(std::get(tuple)); + ElementPrinter::print(tuple,os); + } + }; + + template< + typename Tuple, + std::size_t N + > + struct ElementPrinter { + static void print( const Tuple&, std::ostream& ) {} + }; + +} + +template +struct StringMaker> { + + static std::string convert( const std::tuple& tuple ) + { + std::ostringstream os; + os << '{'; + TupleDetail::ElementPrinter>::print( tuple, os ); + os << " }"; + return os.str(); + } +}; +#endif // CATCH_CONFIG_CPP11_TUPLE + +namespace Detail { + template + std::string makeString( T const& value ) { + return StringMaker::convert( value ); + } +} // end namespace Detail + +/// \brief converts any type to a string +/// +/// The default template forwards on to ostringstream - except when an +/// ostringstream overload does not exist - in which case it attempts to detect +/// that and writes {?}. +/// Overload (not specialise) this template for custom typs that you don't want +/// to provide an ostream overload for. +template +std::string toString( T const& value ) { + return StringMaker::convert( value ); +} + + namespace Detail { + template + std::string rangeToString( InputIterator first, InputIterator last ) { + std::ostringstream oss; + oss << "{ "; + if( first != last ) { + oss << Catch::toString( *first ); + for( ++first ; first != last ; ++first ) + oss << ", " << Catch::toString( *first ); + } + oss << " }"; + return oss.str(); + } +} + +} // end namespace Catch + +namespace Catch { + +template +class BinaryExpression; + +template +class MatchExpression; + +// Wraps the LHS of an expression and overloads comparison operators +// for also capturing those and RHS (if any) +template +class ExpressionLhs : public DecomposedExpression { +public: + ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} + + ExpressionLhs& operator = ( const ExpressionLhs& ); + + template + BinaryExpression + operator == ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator != ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator < ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator > ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator <= ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator >= ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + BinaryExpression operator == ( bool rhs ) { + return captureExpression( rhs ); + } + + BinaryExpression operator != ( bool rhs ) { + return captureExpression( rhs ); + } + + void endExpression() { + m_truthy = m_lhs ? true : false; + m_rb + .setResultType( m_truthy ) + .endExpression( *this ); + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + dest = Catch::toString( m_lhs ); + } + +private: + template + BinaryExpression captureExpression( RhsT& rhs ) const { + return BinaryExpression( m_rb, m_lhs, rhs ); + } + + template + BinaryExpression captureExpression( bool rhs ) const { + return BinaryExpression( m_rb, m_lhs, rhs ); + } + +private: + ResultBuilder& m_rb; + T m_lhs; + bool m_truthy; +}; + +template +class BinaryExpression : public DecomposedExpression { +public: + BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) + : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} + + BinaryExpression& operator = ( BinaryExpression& ); + + void endExpression() const { + m_rb + .setResultType( Internal::compare( m_lhs, m_rhs ) ) + .endExpression( *this ); + } + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string lhs = Catch::toString( m_lhs ); + std::string rhs = Catch::toString( m_rhs ); + char delim = lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ? ' ' : '\n'; + dest.reserve( 7 + lhs.size() + rhs.size() ); + // 2 for spaces around operator + // 2 for operator + // 2 for parentheses (conditionally added later) + // 1 for negation (conditionally added later) + dest = lhs; + dest += delim; + dest += Internal::OperatorTraits::getName(); + dest += delim; + dest += rhs; + } + +private: + ResultBuilder& m_rb; + LhsT m_lhs; + RhsT m_rhs; +}; + +template +class MatchExpression : public DecomposedExpression { +public: + MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) + : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string matcherAsString = m_matcher.toString(); + dest = Catch::toString( m_arg ); + dest += ' '; + if( matcherAsString == Detail::unprintableString ) + dest += m_matcherString; + else + dest += matcherAsString; + } + +private: + ArgT m_arg; + MatcherT m_matcher; + char const* m_matcherString; +}; + +} // end namespace Catch + + +namespace Catch { + + template + inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { + return ExpressionLhs( *this, operand ); + } + + inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { + return ExpressionLhs( *this, value ); + } + + template + inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, + char const* matcherString ) { + MatchExpression expr( arg, matcher, matcherString ); + setResultType( matcher.match( arg ) ); + endExpression( expr ); + } + +} // namespace Catch + +// #included from: catch_message.h +#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED + +#include + +namespace Catch { + + struct MessageInfo { + MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ); + + std::string macroName; + SourceLineInfo lineInfo; + ResultWas::OfType type; + std::string message; + unsigned int sequence; + + bool operator == ( MessageInfo const& other ) const { + return sequence == other.sequence; + } + bool operator < ( MessageInfo const& other ) const { + return sequence < other.sequence; + } + private: + static unsigned int globalCount; + }; + + struct MessageBuilder { + MessageBuilder( std::string const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ) + : m_info( macroName, lineInfo, type ) + {} + + template + MessageBuilder& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + MessageInfo m_info; + std::ostringstream m_stream; + }; + + class ScopedMessage { + public: + ScopedMessage( MessageBuilder const& builder ); + ScopedMessage( ScopedMessage const& other ); + ~ScopedMessage(); + + MessageInfo m_info; + }; + +} // end namespace Catch + +// #included from: catch_interfaces_capture.h +#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED + +#include + +namespace Catch { + + class TestCase; + class AssertionResult; + struct AssertionInfo; + struct SectionInfo; + struct SectionEndInfo; + struct MessageInfo; + class ScopedMessageBuilder; + struct Counts; + + struct IResultCapture { + + virtual ~IResultCapture(); + + virtual void assertionEnded( AssertionResult const& result ) = 0; + virtual bool sectionStarted( SectionInfo const& sectionInfo, + Counts& assertions ) = 0; + virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; + virtual void pushScopedMessage( MessageInfo const& message ) = 0; + virtual void popScopedMessage( MessageInfo const& message ) = 0; + + virtual std::string getCurrentTestName() const = 0; + virtual const AssertionResult* getLastResult() const = 0; + + virtual void exceptionEarlyReported() = 0; + + virtual void handleFatalErrorCondition( std::string const& message ) = 0; + }; + + IResultCapture& getResultCapture(); +} + +// #included from: catch_debugger.h +#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED + +// #included from: catch_platform.h +#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED + +#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +# define CATCH_PLATFORM_MAC +#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define CATCH_PLATFORM_IPHONE +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +# define CATCH_PLATFORM_WINDOWS +# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) +# define CATCH_DEFINES_NOMINMAX +# endif +# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) +# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# endif +#endif + +#include + +namespace Catch{ + + bool isDebuggerActive(); + void writeToDebugConsole( std::string const& text ); +} + +#ifdef CATCH_PLATFORM_MAC + + // The following code snippet based on: + // http://cocoawithlove.com/2008/03/break-into-debugger.html + #if defined(__ppc64__) || defined(__ppc__) + #define CATCH_TRAP() \ + __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ + : : : "memory","r0","r3","r4" ) + #else + #define CATCH_TRAP() __asm__("int $3\n" : : ) + #endif + +#elif defined(CATCH_PLATFORM_LINUX) + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") + #else // Fall back to the generic way. + #include + + #define CATCH_TRAP() raise(SIGTRAP) + #endif +#elif defined(_MSC_VER) + #define CATCH_TRAP() __debugbreak() +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) void __stdcall DebugBreak(); + #define CATCH_TRAP() DebugBreak() +#endif + +#ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } +#else + #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); +#endif + +// #included from: catch_interfaces_runner.h +#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED + +namespace Catch { + class TestCase; + + struct IRunner { + virtual ~IRunner(); + virtual bool aborting() const = 0; + }; +} + +#if defined(CATCH_CONFIG_FAST_COMPILE) +/////////////////////////////////////////////////////////////////////////////// +// We can speedup compilation significantly by breaking into debugger lower in +// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER +// macro in each assertion +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + resultBuilder.react(); + +/////////////////////////////////////////////////////////////////////////////// +// Another way to speed-up compilation is to omit local try-catch for REQUIRE* +// macros. +// This can potentially cause false negative, if the test code catches +// the exception before it propagates back up to the runner. +#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look +// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + +#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + __catchResult.captureMatch( arg, matcher, #matcher ); \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +#else +/////////////////////////////////////////////////////////////////////////////// +// In the event of a failure works out if the debugger needs to be invoked +// and/or an exception thrown and takes appropriate action. +// This needs to be done as a macro so the debugger will stop in the user +// source code rather than in Catch library code +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ + resultBuilder.react(); +#endif + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( !Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ + if( __catchResult.allowThrows() ) \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( ... ) { \ + __catchResult.captureExpectedException( matcher ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr ", " #exceptionType, resultDisposition ); \ + if( __catchResult.allowThrows() ) \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( exceptionType ) { \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#else + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << log + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#endif + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_INFO( macroName, log ) \ + Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ + try { \ + __catchResult.captureMatch( arg, matcher, #matcher ); \ + } catch( ... ) { \ + __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +// #included from: internal/catch_section.h +#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED + +// #included from: catch_section_info.h +#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED + +// #included from: catch_totals.hpp +#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED + +#include + +namespace Catch { + + struct Counts { + Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} + + Counts operator - ( Counts const& other ) const { + Counts diff; + diff.passed = passed - other.passed; + diff.failed = failed - other.failed; + diff.failedButOk = failedButOk - other.failedButOk; + return diff; + } + Counts& operator += ( Counts const& other ) { + passed += other.passed; + failed += other.failed; + failedButOk += other.failedButOk; + return *this; + } + + std::size_t total() const { + return passed + failed + failedButOk; + } + bool allPassed() const { + return failed == 0 && failedButOk == 0; + } + bool allOk() const { + return failed == 0; + } + + std::size_t passed; + std::size_t failed; + std::size_t failedButOk; + }; + + struct Totals { + + Totals operator - ( Totals const& other ) const { + Totals diff; + diff.assertions = assertions - other.assertions; + diff.testCases = testCases - other.testCases; + return diff; + } + + Totals delta( Totals const& prevTotals ) const { + Totals diff = *this - prevTotals; + if( diff.assertions.failed > 0 ) + ++diff.testCases.failed; + else if( diff.assertions.failedButOk > 0 ) + ++diff.testCases.failedButOk; + else + ++diff.testCases.passed; + return diff; + } + + Totals& operator += ( Totals const& other ) { + assertions += other.assertions; + testCases += other.testCases; + return *this; + } + + Counts assertions; + Counts testCases; + }; +} + +#include + +namespace Catch { + + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description = std::string() ); + + std::string name; + std::string description; + SourceLineInfo lineInfo; + }; + + struct SectionEndInfo { + SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) + : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) + {} + + SectionInfo sectionInfo; + Counts prevAssertions; + double durationInSeconds; + }; + +} // end namespace Catch + +// #included from: catch_timer.h +#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED + +#ifdef _MSC_VER + +namespace Catch { + typedef unsigned long long UInt64; +} +#else +#include +namespace Catch { + typedef uint64_t UInt64; +} +#endif + +namespace Catch { + class Timer { + public: + Timer() : m_ticks( 0 ) {} + void start(); + unsigned int getElapsedMicroseconds() const; + unsigned int getElapsedMilliseconds() const; + double getElapsedSeconds() const; + + private: + UInt64 m_ticks; + }; + +} // namespace Catch + +#include + +namespace Catch { + + class Section : NonCopyable { + public: + Section( SectionInfo const& info ); + ~Section(); + + // This indicates whether the section should be executed or not + operator bool() const; + + private: + SectionInfo m_info; + + std::string m_name; + Counts m_assertions; + bool m_sectionIncluded; + Timer m_timer; + }; + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_SECTION( ... ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) +#else + #define INTERNAL_CATCH_SECTION( name, desc ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) +#endif + +// #included from: internal/catch_generators.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + +template +struct IGenerator { + virtual ~IGenerator() {} + virtual T getValue( std::size_t index ) const = 0; + virtual std::size_t size () const = 0; +}; + +template +class BetweenGenerator : public IGenerator { +public: + BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} + + virtual T getValue( std::size_t index ) const { + return m_from+static_cast( index ); + } + + virtual std::size_t size() const { + return static_cast( 1+m_to-m_from ); + } + +private: + + T m_from; + T m_to; +}; + +template +class ValuesGenerator : public IGenerator { +public: + ValuesGenerator(){} + + void add( T value ) { + m_values.push_back( value ); + } + + virtual T getValue( std::size_t index ) const { + return m_values[index]; + } + + virtual std::size_t size() const { + return m_values.size(); + } + +private: + std::vector m_values; +}; + +template +class CompositeGenerator { +public: + CompositeGenerator() : m_totalSize( 0 ) {} + + // *** Move semantics, similar to auto_ptr *** + CompositeGenerator( CompositeGenerator& other ) + : m_fileInfo( other.m_fileInfo ), + m_totalSize( 0 ) + { + move( other ); + } + + CompositeGenerator& setFileInfo( const char* fileInfo ) { + m_fileInfo = fileInfo; + return *this; + } + + ~CompositeGenerator() { + deleteAll( m_composed ); + } + + operator T () const { + size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); + + typename std::vector*>::const_iterator it = m_composed.begin(); + typename std::vector*>::const_iterator itEnd = m_composed.end(); + for( size_t index = 0; it != itEnd; ++it ) + { + const IGenerator* generator = *it; + if( overallIndex >= index && overallIndex < index + generator->size() ) + { + return generator->getValue( overallIndex-index ); + } + index += generator->size(); + } + CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); + return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so + } + + void add( const IGenerator* generator ) { + m_totalSize += generator->size(); + m_composed.push_back( generator ); + } + + CompositeGenerator& then( CompositeGenerator& other ) { + move( other ); + return *this; + } + + CompositeGenerator& then( T value ) { + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( value ); + add( valuesGen ); + return *this; + } + +private: + + void move( CompositeGenerator& other ) { + m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() ); + m_totalSize += other.m_totalSize; + other.m_composed.clear(); + } + + std::vector*> m_composed; + std::string m_fileInfo; + size_t m_totalSize; +}; + +namespace Generators +{ + template + CompositeGenerator between( T from, T to ) { + CompositeGenerator generators; + generators.add( new BetweenGenerator( from, to ) ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2 ) { + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + generators.add( valuesGen ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2, T val3 ){ + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + generators.add( valuesGen ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2, T val3, T val4 ) { + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + valuesGen->add( val4 ); + generators.add( valuesGen ); + return generators; + } + +} // end namespace Generators + +using namespace Generators; + +} // end namespace Catch + +#define INTERNAL_CATCH_LINESTR2( line ) #line +#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) + +#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) + +// #included from: internal/catch_interfaces_exception.h +#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED + +#include +#include + +// #included from: catch_interfaces_registry_hub.h +#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED + +#include + +namespace Catch { + + class TestCase; + struct ITestCaseRegistry; + struct IExceptionTranslatorRegistry; + struct IExceptionTranslator; + struct IReporterRegistry; + struct IReporterFactory; + struct ITagAliasRegistry; + + struct IRegistryHub { + virtual ~IRegistryHub(); + + virtual IReporterRegistry const& getReporterRegistry() const = 0; + virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; + + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; + }; + + struct IMutableRegistryHub { + virtual ~IMutableRegistryHub(); + virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; + virtual void registerListener( Ptr const& factory ) = 0; + virtual void registerTest( TestCase const& testInfo ) = 0; + virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; + }; + + IRegistryHub& getRegistryHub(); + IMutableRegistryHub& getMutableRegistryHub(); + void cleanUp(); + std::string translateActiveException(); + +} + +namespace Catch { + + typedef std::string(*exceptionTranslateFunction)(); + + struct IExceptionTranslator; + typedef std::vector ExceptionTranslators; + + struct IExceptionTranslator { + virtual ~IExceptionTranslator(); + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; + }; + + struct IExceptionTranslatorRegistry { + virtual ~IExceptionTranslatorRegistry(); + + virtual std::string translateActiveException() const = 0; + }; + + class ExceptionTranslatorRegistrar { + template + class ExceptionTranslator : public IExceptionTranslator { + public: + + ExceptionTranslator( std::string(*translateFunction)( T& ) ) + : m_translateFunction( translateFunction ) + {} + + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { + try { + if( it == itEnd ) + throw; + else + return (*it)->translate( it+1, itEnd ); + } + catch( T& ex ) { + return m_translateFunction( ex ); + } + } + + protected: + std::string(*m_translateFunction)( T& ); + }; + + public: + template + ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { + getMutableRegistryHub().registerTranslator + ( new ExceptionTranslator( translateFunction ) ); + } + }; +} + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// #included from: internal/catch_approx.hpp +#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED + +#include +#include + +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) +#include +#endif + +namespace Catch { +namespace Detail { + + class Approx { + public: + explicit Approx ( double value ) + : m_epsilon( std::numeric_limits::epsilon()*100 ), + m_margin( 0.0 ), + m_scale( 1.0 ), + m_value( value ) + {} + + Approx( Approx const& other ) + : m_epsilon( other.m_epsilon ), + m_margin( other.m_margin ), + m_scale( other.m_scale ), + m_value( other.m_value ) + {} + + static Approx custom() { + return Approx( 0 ); + } + +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) + + template ::value>::type> + Approx operator()( T value ) { + Approx approx( static_cast(value) ); + approx.epsilon( m_epsilon ); + approx.margin( m_margin ); + approx.scale( m_scale ); + return approx; + } + + template ::value>::type> + explicit Approx( T value ): Approx(static_cast(value)) + {} + + template ::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + auto lhs_v = double(lhs); + bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); + if (relativeOK) { + return true; + } + return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin; + } + + template ::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } + + template ::value>::type> + friend bool operator != ( T lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + template ::value>::type> + friend bool operator != ( Approx const& lhs, T rhs ) { + return !operator==( rhs, lhs ); + } + + template ::value>::type> + friend bool operator <= ( T lhs, Approx const& rhs ) { + return double(lhs) < rhs.m_value || lhs == rhs; + } + + template ::value>::type> + friend bool operator <= ( Approx const& lhs, T rhs ) { + return lhs.m_value < double(rhs) || lhs == rhs; + } + + template ::value>::type> + friend bool operator >= ( T lhs, Approx const& rhs ) { + return double(lhs) > rhs.m_value || lhs == rhs; + } + + template ::value>::type> + friend bool operator >= ( Approx const& lhs, T rhs ) { + return lhs.m_value > double(rhs) || lhs == rhs; + } + + template ::value>::type> + Approx& epsilon( T newEpsilon ) { + m_epsilon = double(newEpsilon); + return *this; + } + + template ::value>::type> + Approx& margin( T newMargin ) { + m_margin = double(newMargin); + return *this; + } + + template ::value>::type> + Approx& scale( T newScale ) { + m_scale = double(newScale); + return *this; + } + +#else + + Approx operator()( double value ) { + Approx approx( value ); + approx.epsilon( m_epsilon ); + approx.margin( m_margin ); + approx.scale( m_scale ); + return approx; + } + + friend bool operator == ( double lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) ); + if (relativeOK) { + return true; + } + return std::fabs(lhs - rhs.m_value) < rhs.m_margin; + } + + friend bool operator == ( Approx const& lhs, double rhs ) { + return operator==( rhs, lhs ); + } + + friend bool operator != ( double lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + friend bool operator != ( Approx const& lhs, double rhs ) { + return !operator==( rhs, lhs ); + } + + friend bool operator <= ( double lhs, Approx const& rhs ) { + return lhs < rhs.m_value || lhs == rhs; + } + + friend bool operator <= ( Approx const& lhs, double rhs ) { + return lhs.m_value < rhs || lhs == rhs; + } + + friend bool operator >= ( double lhs, Approx const& rhs ) { + return lhs > rhs.m_value || lhs == rhs; + } + + friend bool operator >= ( Approx const& lhs, double rhs ) { + return lhs.m_value > rhs || lhs == rhs; + } + + Approx& epsilon( double newEpsilon ) { + m_epsilon = newEpsilon; + return *this; + } + + Approx& margin( double newMargin ) { + m_margin = newMargin; + return *this; + } + + Approx& scale( double newScale ) { + m_scale = newScale; + return *this; + } +#endif + + std::string toString() const { + std::ostringstream oss; + oss << "Approx( " << Catch::toString( m_value ) << " )"; + return oss.str(); + } + + private: + double m_epsilon; + double m_margin; + double m_scale; + double m_value; + }; +} + +template<> +inline std::string toString( Detail::Approx const& value ) { + return value.toString(); +} + +} // end namespace Catch + +// #included from: internal/catch_matchers_string.h +#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED + +namespace Catch { +namespace Matchers { + + namespace StdString { + + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; + + CaseSensitive::Choice m_caseSensitivity; + std::string m_str; + }; + + struct StringMatcherBase : MatcherBase { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + virtual std::string describe() const CATCH_OVERRIDE; + + CasedString m_comparator; + std::string m_operation; + }; + + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + + } // namespace StdString + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + +} // namespace Matchers +} // namespace Catch + +// #included from: internal/catch_matchers_vector.h +#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED + +namespace Catch { +namespace Matchers { + + namespace Vector { + + template + struct ContainsElementMatcher : MatcherBase, T> { + + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + return std::find(v.begin(), v.end(), m_comparator) != v.end(); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + T const& m_comparator; + }; + + template + struct ContainsMatcher : MatcherBase, std::vector > { + + ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) + return false; + for (size_t i = 0; i < m_comparator.size(); ++i) + if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end()) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + std::vector const& m_comparator; + }; + + template + struct EqualsMatcher : MatcherBase, std::vector > { + + EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector etc + // - then just call that directly + if (m_comparator.size() != v.size()) + return false; + for (size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Equals: " + Catch::toString( m_comparator ); + } + std::vector const& m_comparator; + }; + + } // namespace Vector + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + template + Vector::ContainsMatcher Contains( std::vector const& comparator ) { + return Vector::ContainsMatcher( comparator ); + } + + template + Vector::ContainsElementMatcher VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher( comparator ); + } + + template + Vector::EqualsMatcher Equals( std::vector const& comparator ) { + return Vector::EqualsMatcher( comparator ); + } + +} // namespace Matchers +} // namespace Catch + +// #included from: internal/catch_interfaces_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED + +// #included from: catch_tag_alias.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED + +#include + +namespace Catch { + + struct TagAlias { + TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} + + std::string tag; + SourceLineInfo lineInfo; + }; + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } +// #included from: catch_option.hpp +#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED + +namespace Catch { + + // An optional type + template + class Option { + public: + Option() : nullableValue( CATCH_NULL ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) + {} + + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = CATCH_NULL; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != CATCH_NULL; } + bool none() const { return nullableValue == CATCH_NULL; } + + bool operator !() const { return nullableValue == CATCH_NULL; } + operator SafeBool::type() const { + return SafeBool::makeSafe( some() ); + } + + private: + T *nullableValue; + union { + char storage[sizeof(T)]; + + // These are here to force alignment for the storage + long double dummy1; + void (*dummy2)(); + long double dummy3; +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + long long dummy4; +#endif + }; + }; + +} // end namespace Catch + +namespace Catch { + + struct ITagAliasRegistry { + virtual ~ITagAliasRegistry(); + virtual Option find( std::string const& alias ) const = 0; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; + + static ITagAliasRegistry const& get(); + }; + +} // end namespace Catch + +// These files are included here so the single_include script doesn't put them +// in the conditionally compiled sections +// #included from: internal/catch_test_case_info.h +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED + +#include +#include + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct ITestCase; + + struct TestCaseInfo { + enum SpecialProperties{ + None = 0, + IsHidden = 1 << 1, + ShouldFail = 1 << 2, + MayFail = 1 << 3, + Throws = 1 << 4, + NonPortable = 1 << 5 + }; + + TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set const& _tags, + SourceLineInfo const& _lineInfo ); + + TestCaseInfo( TestCaseInfo const& other ); + + friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); + + bool isHidden() const; + bool throws() const; + bool okToFail() const; + bool expectedToFail() const; + + std::string name; + std::string className; + std::string description; + std::set tags; + std::set lcaseTags; + std::string tagsAsString; + SourceLineInfo lineInfo; + SpecialProperties properties; + }; + + class TestCase : public TestCaseInfo { + public: + + TestCase( ITestCase* testCase, TestCaseInfo const& info ); + TestCase( TestCase const& other ); + + TestCase withName( std::string const& _newName ) const; + + void invoke() const; + + TestCaseInfo const& getTestCaseInfo() const; + + void swap( TestCase& other ); + bool operator == ( TestCase const& other ) const; + bool operator < ( TestCase const& other ) const; + TestCase& operator = ( TestCase const& other ); + + private: + Ptr test; + }; + + TestCase makeTestCase( ITestCase* testCase, + std::string const& className, + std::string const& name, + std::string const& description, + SourceLineInfo const& lineInfo ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + +#ifdef __OBJC__ +// #included from: internal/catch_objc.hpp +#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED + +#import + +#include + +// NB. Any general catch headers included here must be included +// in catch.hpp first to make sure they are included by the single +// header for non obj-usage + +/////////////////////////////////////////////////////////////////////////////// +// This protocol is really only here for (self) documenting purposes, since +// all its methods are optional. +@protocol OcFixture + +@optional + +-(void) setUp; +-(void) tearDown; + +@end + +namespace Catch { + + class OcMethod : public SharedImpl { + + public: + OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} + + virtual void invoke() const { + id obj = [[m_cls alloc] init]; + + performOptionalSelector( obj, @selector(setUp) ); + performOptionalSelector( obj, m_sel ); + performOptionalSelector( obj, @selector(tearDown) ); + + arcSafeRelease( obj ); + } + private: + virtual ~OcMethod() {} + + Class m_cls; + SEL m_sel; + }; + + namespace Detail{ + + inline std::string getAnnotation( Class cls, + std::string const& annotationName, + std::string const& testCaseName ) { + NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; + SEL sel = NSSelectorFromString( selStr ); + arcSafeRelease( selStr ); + id value = performOptionalSelector( cls, sel ); + if( value ) + return [(NSString*)value UTF8String]; + return ""; + } + } + + inline size_t registerTestMethods() { + size_t noTestMethods = 0; + int noClasses = objc_getClassList( CATCH_NULL, 0 ); + + Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); + objc_getClassList( classes, noClasses ); + + for( int c = 0; c < noClasses; c++ ) { + Class cls = classes[c]; + { + u_int count; + Method* methods = class_copyMethodList( cls, &count ); + for( u_int m = 0; m < count ; m++ ) { + SEL selector = method_getName(methods[m]); + std::string methodName = sel_getName(selector); + if( startsWith( methodName, "Catch_TestCase_" ) ) { + std::string testCaseName = methodName.substr( 15 ); + std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); + std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); + const char* className = class_getName( cls ); + + getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); + noTestMethods++; + } + } + free(methods); + } + } + return noTestMethods; + } + + namespace Matchers { + namespace Impl { + namespace NSStringMatchers { + + struct StringHolder : MatcherBase{ + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} + StringHolder() { + arcSafeRelease( m_substr ); + } + + virtual bool match( NSString* arg ) const CATCH_OVERRIDE { + return false; + } + + NSString* m_substr; + }; + + struct Equals : StringHolder { + Equals( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const CATCH_OVERRIDE { + return (str != nil || m_substr == nil ) && + [str isEqualToString:m_substr]; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "equals string: " + Catch::toString( m_substr ); + } + }; + + struct Contains : StringHolder { + Contains( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location != NSNotFound; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "contains string: " + Catch::toString( m_substr ); + } + }; + + struct StartsWith : StringHolder { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == 0; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "starts with: " + Catch::toString( m_substr ); + } + }; + struct EndsWith : StringHolder { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "ends with: " + Catch::toString( m_substr ); + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Equals + Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define OC_TEST_CASE( name, desc )\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ +{\ +return @ name; \ +}\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ +{ \ +return @ desc; \ +} \ +-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) + +#endif + +#ifdef CATCH_IMPL + +// !TBD: Move the leak detector code into a separate header +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include +class LeakDetector { +public: + LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +}; +#else +class LeakDetector {}; +#endif + +LeakDetector leakDetector; + +// #included from: internal/catch_impl.hpp +#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED + +// Collect all the implementation files together here +// These are the equivalent of what would usually be cpp files + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + +// #included from: ../catch_session.hpp +#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED + +// #included from: internal/catch_commandline.hpp +#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED + +// #included from: catch_config.hpp +#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED + +// #included from: catch_test_spec_parser.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// #included from: catch_test_spec.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// #included from: catch_wildcard_pattern.hpp +#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED + +#include + +namespace Catch +{ + class WildcardPattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + + WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_wildcard( NoWildcard ), + m_pattern( adjustCase( pattern ) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); + m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); + } + } + virtual ~WildcardPattern(); + virtual bool matches( std::string const& str ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_pattern == adjustCase( str ); + case WildcardAtStart: + return endsWith( adjustCase( str ), m_pattern ); + case WildcardAtEnd: + return startsWith( adjustCase( str ), m_pattern ); + case WildcardAtBothEnds: + return contains( adjustCase( str ), m_pattern ); + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + throw std::logic_error( "Unknown enum" ); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } + private: + std::string adjustCase( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; + } + CaseSensitive::Choice m_caseSensitivity; + WildcardPosition m_wildcard; + std::string m_pattern; + }; +} + +#include +#include + +namespace Catch { + + class TestSpec { + struct Pattern : SharedImpl<> { + virtual ~Pattern(); + virtual bool matches( TestCaseInfo const& testCase ) const = 0; + }; + class NamePattern : public Pattern { + public: + NamePattern( std::string const& name ) + : m_wildcardPattern( toLower( name ), CaseSensitive::No ) + {} + virtual ~NamePattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + return m_wildcardPattern.matches( toLower( testCase.name ) ); + } + private: + WildcardPattern m_wildcardPattern; + }; + + class TagPattern : public Pattern { + public: + TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} + virtual ~TagPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); + } + private: + std::string m_tag; + }; + + class ExcludedPattern : public Pattern { + public: + ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} + virtual ~ExcludedPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } + private: + Ptr m_underlyingPattern; + }; + + struct Filter { + std::vector > m_patterns; + + bool matches( TestCaseInfo const& testCase ) const { + // All patterns in a filter must match for the filter to be a match + for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { + if( !(*it)->matches( testCase ) ) + return false; + } + return true; + } + }; + + public: + bool hasFilters() const { + return !m_filters.empty(); + } + bool matches( TestCaseInfo const& testCase ) const { + // A TestSpec matches if any filter matches + for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) + if( it->matches( testCase ) ) + return true; + return false; + } + + private: + std::vector m_filters; + + friend class TestSpecParser; + }; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +namespace Catch { + + class TestSpecParser { + enum Mode{ None, Name, QuotedName, Tag, EscapedName }; + Mode m_mode; + bool m_exclusion; + std::size_t m_start, m_pos; + std::string m_arg; + std::vector m_escapeChars; + TestSpec::Filter m_currentFilter; + TestSpec m_testSpec; + ITagAliasRegistry const* m_tagAliases; + + public: + TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + + TestSpecParser& parse( std::string const& arg ) { + m_mode = None; + m_exclusion = false; + m_start = std::string::npos; + m_arg = m_tagAliases->expandAliases( arg ); + m_escapeChars.clear(); + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) + visitChar( m_arg[m_pos] ); + if( m_mode == Name ) + addPattern(); + return *this; + } + TestSpec testSpec() { + addFilter(); + return m_testSpec; + } + private: + void visitChar( char c ) { + if( m_mode == None ) { + switch( c ) { + case ' ': return; + case '~': m_exclusion = true; return; + case '[': return startNewMode( Tag, ++m_pos ); + case '"': return startNewMode( QuotedName, ++m_pos ); + case '\\': return escape(); + default: startNewMode( Name, m_pos ); break; + } + } + if( m_mode == Name ) { + if( c == ',' ) { + addPattern(); + addFilter(); + } + else if( c == '[' ) { + if( subString() == "exclude:" ) + m_exclusion = true; + else + addPattern(); + startNewMode( Tag, ++m_pos ); + } + else if( c == '\\' ) + escape(); + } + else if( m_mode == EscapedName ) + m_mode = Name; + else if( m_mode == QuotedName && c == '"' ) + addPattern(); + else if( m_mode == Tag && c == ']' ) + addPattern(); + } + void startNewMode( Mode mode, std::size_t start ) { + m_mode = mode; + m_start = start; + } + void escape() { + if( m_mode == None ) + m_start = m_pos; + m_mode = EscapedName; + m_escapeChars.push_back( m_pos ); + } + std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } + template + void addPattern() { + std::string token = subString(); + for( size_t i = 0; i < m_escapeChars.size(); ++i ) + token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); + m_escapeChars.clear(); + if( startsWith( token, "exclude:" ) ) { + m_exclusion = true; + token = token.substr( 8 ); + } + if( !token.empty() ) { + Ptr pattern = new T( token ); + if( m_exclusion ) + pattern = new TestSpec::ExcludedPattern( pattern ); + m_currentFilter.m_patterns.push_back( pattern ); + } + m_exclusion = false; + m_mode = None; + } + void addFilter() { + if( !m_currentFilter.m_patterns.empty() ) { + m_testSpec.m_filters.push_back( m_currentFilter ); + m_currentFilter = TestSpec::Filter(); + } + } + }; + inline TestSpec parseTestSpec( std::string const& arg ) { + return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// #included from: catch_interfaces_config.h +#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED + +#include +#include +#include + +namespace Catch { + + struct Verbosity { enum Level { + NoOutput = 0, + Quiet, + Normal + }; }; + + struct WarnAbout { enum What { + Nothing = 0x00, + NoAssertions = 0x01 + }; }; + + struct ShowDurations { enum OrNot { + DefaultForReporter, + Always, + Never + }; }; + struct RunTests { enum InWhatOrder { + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; + + class TestSpec; + + struct IConfig : IShared { + + virtual ~IConfig(); + + virtual bool allowThrows() const = 0; + virtual std::ostream& stream() const = 0; + virtual std::string name() const = 0; + virtual bool includeSuccessfulResults() const = 0; + virtual bool shouldDebugBreak() const = 0; + virtual bool warnAboutMissingAssertions() const = 0; + virtual int abortAfter() const = 0; + virtual bool showInvisibles() const = 0; + virtual ShowDurations::OrNot showDurations() const = 0; + virtual TestSpec const& testSpec() const = 0; + virtual RunTests::InWhatOrder runOrder() const = 0; + virtual unsigned int rngSeed() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; + virtual std::vector const& getSectionsToRun() const = 0; + + }; +} + +// #included from: catch_stream.h +#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED + +// #included from: catch_streambuf.h +#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED + +#include + +namespace Catch { + + class StreamBufBase : public std::streambuf { + public: + virtual ~StreamBufBase() CATCH_NOEXCEPT; + }; +} + +#include +#include +#include +#include + +namespace Catch { + + std::ostream& cout(); + std::ostream& cerr(); + + struct IStream { + virtual ~IStream() CATCH_NOEXCEPT; + virtual std::ostream& stream() const = 0; + }; + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( std::string const& filename ); + virtual ~FileStream() CATCH_NOEXCEPT; + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + CoutStream(); + virtual ~CoutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class DebugOutStream : public IStream { + CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream(); + virtual ~DebugOutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; +} + +#include +#include +#include +#include + +#ifndef CATCH_CONFIG_CONSOLE_WIDTH +#define CATCH_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { + + struct ConfigData { + + ConfigData() + : listTests( false ), + listTags( false ), + listReporters( false ), + listTestNamesOnly( false ), + listExtraInfo( false ), + showSuccessfulTests( false ), + shouldDebugBreak( false ), + noThrow( false ), + showHelp( false ), + showInvisibles( false ), + filenamesAsTags( false ), + abortAfter( -1 ), + rngSeed( 0 ), + verbosity( Verbosity::Normal ), + warnings( WarnAbout::Nothing ), + showDurations( ShowDurations::DefaultForReporter ), + runOrder( RunTests::InDeclarationOrder ), + useColour( UseColour::Auto ) + {} + + bool listTests; + bool listTags; + bool listReporters; + bool listTestNamesOnly; + bool listExtraInfo; + + bool showSuccessfulTests; + bool shouldDebugBreak; + bool noThrow; + bool showHelp; + bool showInvisibles; + bool filenamesAsTags; + + int abortAfter; + unsigned int rngSeed; + + Verbosity::Level verbosity; + WarnAbout::What warnings; + ShowDurations::OrNot showDurations; + RunTests::InWhatOrder runOrder; + UseColour::YesOrNo useColour; + + std::string outputFilename; + std::string name; + std::string processName; + + std::vector reporterNames; + std::vector testsOrTags; + std::vector sectionsToRun; + }; + + class Config : public SharedImpl { + private: + Config( Config const& other ); + Config& operator = ( Config const& other ); + virtual void dummy(); + public: + + Config() + {} + + Config( ConfigData const& data ) + : m_data( data ), + m_stream( openStream() ) + { + if( !data.testsOrTags.empty() ) { + TestSpecParser parser( ITagAliasRegistry::get() ); + for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) + parser.parse( data.testsOrTags[i] ); + m_testSpec = parser.testSpec(); + } + } + + virtual ~Config() {} + + std::string const& getFilename() const { + return m_data.outputFilename ; + } + + bool listTests() const { return m_data.listTests; } + bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } + bool listTags() const { return m_data.listTags; } + bool listReporters() const { return m_data.listReporters; } + bool listExtraInfo() const { return m_data.listExtraInfo; } + + std::string getProcessName() const { return m_data.processName; } + + std::vector const& getReporterNames() const { return m_data.reporterNames; } + std::vector const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } + + virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; } + + bool showHelp() const { return m_data.showHelp; } + + // IConfig interface + virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; } + virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); } + virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; } + virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; } + virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; } + virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; } + virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; } + virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; } + virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; } + virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; } + virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; } + virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; } + + private: + + IStream const* openStream() { + if( m_data.outputFilename.empty() ) + return new CoutStream(); + else if( m_data.outputFilename[0] == '%' ) { + if( m_data.outputFilename == "%debug" ) + return new DebugOutStream(); + else + throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); + } + else + return new FileStream( m_data.outputFilename ); + } + ConfigData m_data; + + CATCH_AUTO_PTR( IStream const ) m_stream; + TestSpec m_testSpec; + }; + +} // end namespace Catch + +// #included from: catch_clara.h +#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED + +// Use Catch's value for console width (store Clara's off to the side, if present) +#ifdef CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH +#undef CLARA_CONFIG_CONSOLE_WIDTH +#endif +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +// Declare Clara inside the Catch namespace +#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { +// #included from: ../external/clara.h + +// Version 0.0.2.4 + +// Only use header guard if we are not using an outer namespace +#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) + +#ifndef STITCH_CLARA_OPEN_NAMESPACE +#define TWOBLUECUBES_CLARA_H_INCLUDED +#define STITCH_CLARA_OPEN_NAMESPACE +#define STITCH_CLARA_CLOSE_NAMESPACE +#else +#define STITCH_CLARA_CLOSE_NAMESPACE } +#endif + +#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE + +// ----------- #included from tbc_text_format.h ----------- + +// Only use header guard if we are not using an outer namespace +#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) +#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define TBC_TEXT_FORMAT_H_INCLUDED +#endif + +#include +#include +#include +#include +#include + +// Use optional outer namespace +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ), + tabChar( '\t' ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + char tabChar; // If this char is seen the indent is changed to current pos + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + std::string wrappableChars = " [({.,/|\\-"; + std::size_t indent = _attr.initialIndent != std::string::npos + ? _attr.initialIndent + : _attr.indent; + std::string remainder = _str; + + while( !remainder.empty() ) { + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + std::size_t tabPos = std::string::npos; + std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); + std::size_t pos = remainder.find_first_of( '\n' ); + if( pos <= width ) { + width = pos; + } + pos = remainder.find_last_of( _attr.tabChar, width ); + if( pos != std::string::npos ) { + tabPos = pos; + if( remainder[width] == '\n' ) + width--; + remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); + } + + if( width == remainder.size() ) { + spliceLine( indent, remainder, width ); + } + else if( remainder[width] == '\n' ) { + spliceLine( indent, remainder, width ); + if( width <= 1 || remainder.size() != 1 ) + remainder = remainder.substr( 1 ); + indent = _attr.indent; + } + else { + pos = remainder.find_last_of( wrappableChars, width ); + if( pos != std::string::npos && pos > 0 ) { + spliceLine( indent, remainder, pos ); + if( remainder[0] == ' ' ) + remainder = remainder.substr( 1 ); + } + else { + spliceLine( indent, remainder, width-1 ); + lines.back() += "-"; + } + if( lines.size() == 1 ) + indent = _attr.indent; + if( tabPos != std::string::npos ) + indent += tabPos; + } + } + } + + void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { + lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); + _remainder = _remainder.substr( _pos ); + } + + typedef std::vector::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector lines; + }; + +} // end namespace Tbc + +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TBC_TEXT_FORMAT_H_INCLUDED + +// ----------- end of #include from tbc_text_format.h ----------- +// ........... back in clara.h + +#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE + +// ----------- #included from clara_compilers.h ----------- + +#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED +#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? +// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) + +// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? + +// In general each macro has a _NO_ form +// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 + +#ifdef __clang__ + +#if __has_feature(cxx_nullptr) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#if __has_feature(cxx_noexcept) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#if (_MSC_VER >= 1600) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// catch all support for C++11 +#if defined(__cplusplus) && __cplusplus >= 201103L + +#define CLARA_CPP11_OR_GREATER + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) +#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE +#endif +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NULLPTR +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_UNIQUE_PTR +#endif + +// noexcept support: +#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) +#define CLARA_NOEXCEPT noexcept +# define CLARA_NOEXCEPT_IS(x) noexcept(x) +#else +#define CLARA_NOEXCEPT throw() +# define CLARA_NOEXCEPT_IS(x) +#endif + +// nullptr support +#ifdef CLARA_CONFIG_CPP11_NULLPTR +#define CLARA_NULL nullptr +#else +#define CLARA_NULL NULL +#endif + +// override support +#ifdef CLARA_CONFIG_CPP11_OVERRIDE +#define CLARA_OVERRIDE override +#else +#define CLARA_OVERRIDE +#endif + +// unique_ptr support +#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR +# define CLARA_AUTO_PTR( T ) std::unique_ptr +#else +# define CLARA_AUTO_PTR( T ) std::auto_ptr +#endif + +#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// ----------- end of #include from clara_compilers.h ----------- +// ........... back in clara.h + +#include +#include +#include + +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CLARA_PLATFORM_WINDOWS +#endif + +// Use optional outer namespace +#ifdef STITCH_CLARA_OPEN_NAMESPACE +STITCH_CLARA_OPEN_NAMESPACE +#endif + +namespace Clara { + + struct UnpositionalTag {}; + + extern UnpositionalTag _; + +#ifdef CLARA_CONFIG_MAIN + UnpositionalTag _; +#endif + + namespace Detail { + +#ifdef CLARA_CONSOLE_WIDTH + const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + using namespace Tbc; + + inline bool startsWith( std::string const& str, std::string const& prefix ) { + return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; + } + + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + + template struct IsBool { static const bool value = false; }; + template<> struct IsBool { static const bool value = true; }; + + template + void convertInto( std::string const& _source, T& _dest ) { + std::stringstream ss; + ss << _source; + ss >> _dest; + if( ss.fail() ) + throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); + } + inline void convertInto( std::string const& _source, std::string& _dest ) { + _dest = _source; + } + char toLowerCh(char c) { + return static_cast( std::tolower( c ) ); + } + inline void convertInto( std::string const& _source, bool& _dest ) { + std::string sourceLC = _source; + std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); + if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) + _dest = true; + else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) + _dest = false; + else + throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); + } + + template + struct IArgFunction { + virtual ~IArgFunction() {} +#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS + IArgFunction() = default; + IArgFunction( IArgFunction const& ) = default; +#endif + virtual void set( ConfigT& config, std::string const& value ) const = 0; + virtual bool takesArg() const = 0; + virtual IArgFunction* clone() const = 0; + }; + + template + class BoundArgFunction { + public: + BoundArgFunction() : functionObj( CLARA_NULL ) {} + BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} + BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} + BoundArgFunction& operator = ( BoundArgFunction const& other ) { + IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; + delete functionObj; + functionObj = newFunctionObj; + return *this; + } + ~BoundArgFunction() { delete functionObj; } + + void set( ConfigT& config, std::string const& value ) const { + functionObj->set( config, value ); + } + bool takesArg() const { return functionObj->takesArg(); } + + bool isSet() const { + return functionObj != CLARA_NULL; + } + private: + IArgFunction* functionObj; + }; + + template + struct NullBinder : IArgFunction{ + virtual void set( C&, std::string const& ) const {} + virtual bool takesArg() const { return true; } + virtual IArgFunction* clone() const { return new NullBinder( *this ); } + }; + + template + struct BoundDataMember : IArgFunction{ + BoundDataMember( M C::* _member ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + convertInto( stringValue, p.*member ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } + M C::* member; + }; + template + struct BoundUnaryMethod : IArgFunction{ + BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + typename RemoveConstRef::type value; + convertInto( stringValue, value ); + (p.*member)( value ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } + void (C::*member)( M ); + }; + template + struct BoundNullaryMethod : IArgFunction{ + BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + (p.*member)(); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } + void (C::*member)(); + }; + + template + struct BoundUnaryFunction : IArgFunction{ + BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + function( obj ); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } + void (*function)( C& ); + }; + + template + struct BoundBinaryFunction : IArgFunction{ + BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + typename RemoveConstRef::type value; + convertInto( stringValue, value ); + function( obj, value ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } + void (*function)( C&, T ); + }; + + } // namespace Detail + + inline std::vector argsToVector( int argc, char const* const* const argv ) { + std::vector args( static_cast( argc ) ); + for( std::size_t i = 0; i < static_cast( argc ); ++i ) + args[i] = argv[i]; + + return args; + } + + class Parser { + enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; + Mode mode; + std::size_t from; + bool inQuotes; + public: + + struct Token { + enum Type { Positional, ShortOpt, LongOpt }; + Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} + Type type; + std::string data; + }; + + Parser() : mode( None ), from( 0 ), inQuotes( false ){} + + void parseIntoTokens( std::vector const& args, std::vector& tokens ) { + const std::string doubleDash = "--"; + for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) + parseIntoTokens( args[i], tokens); + } + + void parseIntoTokens( std::string const& arg, std::vector& tokens ) { + for( std::size_t i = 0; i < arg.size(); ++i ) { + char c = arg[i]; + if( c == '"' ) + inQuotes = !inQuotes; + mode = handleMode( i, c, arg, tokens ); + } + mode = handleMode( arg.size(), '\0', arg, tokens ); + } + Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + switch( mode ) { + case None: return handleNone( i, c ); + case MaybeShortOpt: return handleMaybeShortOpt( i, c ); + case ShortOpt: + case LongOpt: + case SlashOpt: return handleOpt( i, c, arg, tokens ); + case Positional: return handlePositional( i, c, arg, tokens ); + default: throw std::logic_error( "Unknown mode" ); + } + } + + Mode handleNone( std::size_t i, char c ) { + if( inQuotes ) { + from = i; + return Positional; + } + switch( c ) { + case '-': return MaybeShortOpt; +#ifdef CLARA_PLATFORM_WINDOWS + case '/': from = i+1; return SlashOpt; +#endif + default: from = i; return Positional; + } + } + Mode handleMaybeShortOpt( std::size_t i, char c ) { + switch( c ) { + case '-': from = i+1; return LongOpt; + default: from = i; return ShortOpt; + } + } + + Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) + return mode; + + std::string optName = arg.substr( from, i-from ); + if( mode == ShortOpt ) + for( std::size_t j = 0; j < optName.size(); ++j ) + tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); + else if( mode == SlashOpt && optName.size() == 1 ) + tokens.push_back( Token( Token::ShortOpt, optName ) ); + else + tokens.push_back( Token( Token::LongOpt, optName ) ); + return None; + } + Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) + return mode; + + std::string data = arg.substr( from, i-from ); + tokens.push_back( Token( Token::Positional, data ) ); + return None; + } + }; + + template + struct CommonArgProperties { + CommonArgProperties() {} + CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} + + Detail::BoundArgFunction boundField; + std::string description; + std::string detail; + std::string placeholder; // Only value if boundField takes an arg + + bool takesArg() const { + return !placeholder.empty(); + } + void validate() const { + if( !boundField.isSet() ) + throw std::logic_error( "option not bound" ); + } + }; + struct OptionArgProperties { + std::vector shortNames; + std::string longName; + + bool hasShortName( std::string const& shortName ) const { + return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); + } + bool hasLongName( std::string const& _longName ) const { + return _longName == longName; + } + }; + struct PositionalArgProperties { + PositionalArgProperties() : position( -1 ) {} + int position; // -1 means non-positional (floating) + + bool isFixedPositional() const { + return position != -1; + } + }; + + template + class CommandLine { + + struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { + Arg() {} + Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} + + using CommonArgProperties::placeholder; // !TBD + + std::string dbgName() const { + if( !longName.empty() ) + return "--" + longName; + if( !shortNames.empty() ) + return "-" + shortNames[0]; + return "positional args"; + } + std::string commands() const { + std::ostringstream oss; + bool first = true; + std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); + for(; it != itEnd; ++it ) { + if( first ) + first = false; + else + oss << ", "; + oss << "-" << *it; + } + if( !longName.empty() ) { + if( !first ) + oss << ", "; + oss << "--" << longName; + } + if( !placeholder.empty() ) + oss << " <" << placeholder << ">"; + return oss.str(); + } + }; + + typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; + + friend void addOptName( Arg& arg, std::string const& optName ) + { + if( optName.empty() ) + return; + if( Detail::startsWith( optName, "--" ) ) { + if( !arg.longName.empty() ) + throw std::logic_error( "Only one long opt may be specified. '" + + arg.longName + + "' already specified, now attempting to add '" + + optName + "'" ); + arg.longName = optName.substr( 2 ); + } + else if( Detail::startsWith( optName, "-" ) ) + arg.shortNames.push_back( optName.substr( 1 ) ); + else + throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); + } + friend void setPositionalArg( Arg& arg, int position ) + { + arg.position = position; + } + + class ArgBuilder { + public: + ArgBuilder( Arg* arg ) : m_arg( arg ) {} + + // Bind a non-boolean data member (requires placeholder string) + template + void bind( M C::* field, std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundDataMember( field ); + m_arg->placeholder = placeholder; + } + // Bind a boolean data member (no placeholder required) + template + void bind( bool C::* field ) { + m_arg->boundField = new Detail::BoundDataMember( field ); + } + + // Bind a method taking a single, non-boolean argument (requires a placeholder string) + template + void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); + m_arg->placeholder = placeholder; + } + + // Bind a method taking a single, boolean argument (no placeholder string required) + template + void bind( void (C::* unaryMethod)( bool ) ) { + m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); + } + + // Bind a method that takes no arguments (will be called if opt is present) + template + void bind( void (C::* nullaryMethod)() ) { + m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); + } + + // Bind a free function taking a single argument - the object to operate on (no placeholder string required) + template + void bind( void (* unaryFunction)( C& ) ) { + m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); + } + + // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) + template + void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); + m_arg->placeholder = placeholder; + } + + ArgBuilder& describe( std::string const& description ) { + m_arg->description = description; + return *this; + } + ArgBuilder& detail( std::string const& detail ) { + m_arg->detail = detail; + return *this; + } + + protected: + Arg* m_arg; + }; + + class OptBuilder : public ArgBuilder { + public: + OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} + OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} + + OptBuilder& operator[]( std::string const& optName ) { + addOptName( *ArgBuilder::m_arg, optName ); + return *this; + } + }; + + public: + + CommandLine() + : m_boundProcessName( new Detail::NullBinder() ), + m_highestSpecifiedArgPosition( 0 ), + m_throwOnUnrecognisedTokens( false ) + {} + CommandLine( CommandLine const& other ) + : m_boundProcessName( other.m_boundProcessName ), + m_options ( other.m_options ), + m_positionalArgs( other.m_positionalArgs ), + m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), + m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) + { + if( other.m_floatingArg.get() ) + m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); + } + + CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { + m_throwOnUnrecognisedTokens = shouldThrow; + return *this; + } + + OptBuilder operator[]( std::string const& optName ) { + m_options.push_back( Arg() ); + addOptName( m_options.back(), optName ); + OptBuilder builder( &m_options.back() ); + return builder; + } + + ArgBuilder operator[]( int position ) { + m_positionalArgs.insert( std::make_pair( position, Arg() ) ); + if( position > m_highestSpecifiedArgPosition ) + m_highestSpecifiedArgPosition = position; + setPositionalArg( m_positionalArgs[position], position ); + ArgBuilder builder( &m_positionalArgs[position] ); + return builder; + } + + // Invoke this with the _ instance + ArgBuilder operator[]( UnpositionalTag ) { + if( m_floatingArg.get() ) + throw std::logic_error( "Only one unpositional argument can be added" ); + m_floatingArg.reset( new Arg() ); + ArgBuilder builder( m_floatingArg.get() ); + return builder; + } + + template + void bindProcessName( M C::* field ) { + m_boundProcessName = new Detail::BoundDataMember( field ); + } + template + void bindProcessName( void (C::*_unaryMethod)( M ) ) { + m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); + } + + void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { + typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; + std::size_t maxWidth = 0; + for( it = itBegin; it != itEnd; ++it ) + maxWidth = (std::max)( maxWidth, it->commands().size() ); + + for( it = itBegin; it != itEnd; ++it ) { + Detail::Text usage( it->commands(), Detail::TextAttributes() + .setWidth( maxWidth+indent ) + .setIndent( indent ) ); + Detail::Text desc( it->description, Detail::TextAttributes() + .setWidth( width - maxWidth - 3 ) ); + + for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { + std::string usageCol = i < usage.size() ? usage[i] : ""; + os << usageCol; + + if( i < desc.size() && !desc[i].empty() ) + os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) + << desc[i]; + os << "\n"; + } + } + } + std::string optUsage() const { + std::ostringstream oss; + optUsage( oss ); + return oss.str(); + } + + void argSynopsis( std::ostream& os ) const { + for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { + if( i > 1 ) + os << " "; + typename std::map::const_iterator it = m_positionalArgs.find( i ); + if( it != m_positionalArgs.end() ) + os << "<" << it->second.placeholder << ">"; + else if( m_floatingArg.get() ) + os << "<" << m_floatingArg->placeholder << ">"; + else + throw std::logic_error( "non consecutive positional arguments with no floating args" ); + } + // !TBD No indication of mandatory args + if( m_floatingArg.get() ) { + if( m_highestSpecifiedArgPosition > 1 ) + os << " "; + os << "[<" << m_floatingArg->placeholder << "> ...]"; + } + } + std::string argSynopsis() const { + std::ostringstream oss; + argSynopsis( oss ); + return oss.str(); + } + + void usage( std::ostream& os, std::string const& procName ) const { + validate(); + os << "usage:\n " << procName << " "; + argSynopsis( os ); + if( !m_options.empty() ) { + os << " [options]\n\nwhere options are: \n"; + optUsage( os, 2 ); + } + os << "\n"; + } + std::string usage( std::string const& procName ) const { + std::ostringstream oss; + usage( oss, procName ); + return oss.str(); + } + + ConfigT parse( std::vector const& args ) const { + ConfigT config; + parseInto( args, config ); + return config; + } + + std::vector parseInto( std::vector const& args, ConfigT& config ) const { + std::string processName = args.empty() ? std::string() : args[0]; + std::size_t lastSlash = processName.find_last_of( "/\\" ); + if( lastSlash != std::string::npos ) + processName = processName.substr( lastSlash+1 ); + m_boundProcessName.set( config, processName ); + std::vector tokens; + Parser parser; + parser.parseIntoTokens( args, tokens ); + return populate( tokens, config ); + } + + std::vector populate( std::vector const& tokens, ConfigT& config ) const { + validate(); + std::vector unusedTokens = populateOptions( tokens, config ); + unusedTokens = populateFixedArgs( unusedTokens, config ); + unusedTokens = populateFloatingArgs( unusedTokens, config ); + return unusedTokens; + } + + std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { + std::vector unusedTokens; + std::vector errors; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); + for(; it != itEnd; ++it ) { + Arg const& arg = *it; + + try { + if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || + ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { + if( arg.takesArg() ) { + if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) + errors.push_back( "Expected argument to option: " + token.data ); + else + arg.boundField.set( config, tokens[++i].data ); + } + else { + arg.boundField.set( config, "true" ); + } + break; + } + } + catch( std::exception& ex ) { + errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); + } + } + if( it == itEnd ) { + if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) + unusedTokens.push_back( token ); + else if( errors.empty() && m_throwOnUnrecognisedTokens ) + errors.push_back( "unrecognised option: " + token.data ); + } + } + if( !errors.empty() ) { + std::ostringstream oss; + for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); + it != itEnd; + ++it ) { + if( it != errors.begin() ) + oss << "\n"; + oss << *it; + } + throw std::runtime_error( oss.str() ); + } + return unusedTokens; + } + std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { + std::vector unusedTokens; + int position = 1; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::map::const_iterator it = m_positionalArgs.find( position ); + if( it != m_positionalArgs.end() ) + it->second.boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + if( token.type == Parser::Token::Positional ) + position++; + } + return unusedTokens; + } + std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { + if( !m_floatingArg.get() ) + return tokens; + std::vector unusedTokens; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + if( token.type == Parser::Token::Positional ) + m_floatingArg->boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + } + return unusedTokens; + } + + void validate() const + { + if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) + throw std::logic_error( "No options or arguments specified" ); + + for( typename std::vector::const_iterator it = m_options.begin(), + itEnd = m_options.end(); + it != itEnd; ++it ) + it->validate(); + } + + private: + Detail::BoundArgFunction m_boundProcessName; + std::vector m_options; + std::map m_positionalArgs; + ArgAutoPtr m_floatingArg; + int m_highestSpecifiedArgPosition; + bool m_throwOnUnrecognisedTokens; + }; + +} // end namespace Clara + +STITCH_CLARA_CLOSE_NAMESPACE +#undef STITCH_CLARA_OPEN_NAMESPACE +#undef STITCH_CLARA_CLOSE_NAMESPACE + +#endif // TWOBLUECUBES_CLARA_H_INCLUDED +#undef STITCH_CLARA_OPEN_NAMESPACE + +// Restore Clara's value for console width, if present +#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +#include +#include + +namespace Catch { + + inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } + inline void abortAfterX( ConfigData& config, int x ) { + if( x < 1 ) + throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); + config.abortAfter = x; + } + inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } + inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } + inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } + + inline void addWarning( ConfigData& config, std::string const& _warning ) { + if( _warning == "NoAssertions" ) + config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); + else + throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); + } + inline void setOrder( ConfigData& config, std::string const& order ) { + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); + } + inline void setRngSeed( ConfigData& config, std::string const& seed ) { + if( seed == "time" ) { + config.rngSeed = static_cast( std::time(0) ); + } + else { + std::stringstream ss; + ss << seed; + ss >> config.rngSeed; + if( ss.fail() ) + throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" ); + } + } + inline void setVerbosity( ConfigData& config, int level ) { + // !TBD: accept strings? + config.verbosity = static_cast( level ); + } + inline void setShowDurations( ConfigData& config, bool _showDurations ) { + config.showDurations = _showDurations + ? ShowDurations::Always + : ShowDurations::Never; + } + inline void setUseColour( ConfigData& config, std::string const& value ) { + std::string mode = toLower( value ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); + } + inline void forceColour( ConfigData& config ) { + config.useColour = UseColour::Yes; + } + inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { + std::ifstream f( _filename.c_str() ); + if( !f.is_open() ) + throw std::domain_error( "Unable to load input file: " + _filename ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + addTestOrTags( config, line + ',' ); + } + } + } + + inline Clara::CommandLine makeCommandLineParser() { + + using namespace Clara; + CommandLine cli; + + cli.bindProcessName( &ConfigData::processName ); + + cli["-?"]["-h"]["--help"] + .describe( "display usage information" ) + .bind( &ConfigData::showHelp ); + + cli["-l"]["--list-tests"] + .describe( "list all/matching test cases" ) + .bind( &ConfigData::listTests ); + + cli["-t"]["--list-tags"] + .describe( "list all/matching tags" ) + .bind( &ConfigData::listTags ); + + cli["-s"]["--success"] + .describe( "include successful tests in output" ) + .bind( &ConfigData::showSuccessfulTests ); + + cli["-b"]["--break"] + .describe( "break into debugger on failure" ) + .bind( &ConfigData::shouldDebugBreak ); + + cli["-e"]["--nothrow"] + .describe( "skip exception tests" ) + .bind( &ConfigData::noThrow ); + + cli["-i"]["--invisibles"] + .describe( "show invisibles (tabs, newlines)" ) + .bind( &ConfigData::showInvisibles ); + + cli["-o"]["--out"] + .describe( "output filename" ) + .bind( &ConfigData::outputFilename, "filename" ); + + cli["-r"]["--reporter"] +// .placeholder( "name[:filename]" ) + .describe( "reporter to use (defaults to console)" ) + .bind( &addReporterName, "name" ); + + cli["-n"]["--name"] + .describe( "suite name" ) + .bind( &ConfigData::name, "name" ); + + cli["-a"]["--abort"] + .describe( "abort at first failure" ) + .bind( &abortAfterFirst ); + + cli["-x"]["--abortx"] + .describe( "abort after x failures" ) + .bind( &abortAfterX, "no. failures" ); + + cli["-w"]["--warn"] + .describe( "enable warnings" ) + .bind( &addWarning, "warning name" ); + +// - needs updating if reinstated +// cli.into( &setVerbosity ) +// .describe( "level of verbosity (0=no output)" ) +// .shortOpt( "v") +// .longOpt( "verbosity" ) +// .placeholder( "level" ); + + cli[_] + .describe( "which test or tests to use" ) + .bind( &addTestOrTags, "test name, pattern or tags" ); + + cli["-d"]["--durations"] + .describe( "show test durations" ) + .bind( &setShowDurations, "yes|no" ); + + cli["-f"]["--input-file"] + .describe( "load test names to run from a file" ) + .bind( &loadTestNamesFromFile, "filename" ); + + cli["-#"]["--filenames-as-tags"] + .describe( "adds a tag for the filename" ) + .bind( &ConfigData::filenamesAsTags ); + + cli["-c"]["--section"] + .describe( "specify section to run" ) + .bind( &addSectionToRun, "section name" ); + + // Less common commands which don't have a short form + cli["--list-test-names-only"] + .describe( "list all/matching test cases names only" ) + .bind( &ConfigData::listTestNamesOnly ); + + cli["--list-extra-info"] + .describe( "list all/matching test cases with more info" ) + .bind( &ConfigData::listExtraInfo ); + + cli["--list-reporters"] + .describe( "list all reporters" ) + .bind( &ConfigData::listReporters ); + + cli["--order"] + .describe( "test case order (defaults to decl)" ) + .bind( &setOrder, "decl|lex|rand" ); + + cli["--rng-seed"] + .describe( "set a specific seed for random numbers" ) + .bind( &setRngSeed, "'time'|number" ); + + cli["--force-colour"] + .describe( "force colourised output (deprecated)" ) + .bind( &forceColour ); + + cli["--use-colour"] + .describe( "should output be colourised" ) + .bind( &setUseColour, "yes|no" ); + + return cli; + } + +} // end namespace Catch + +// #included from: internal/catch_list.hpp +#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED + +// #included from: catch_text.h +#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED + +#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch +// #included from: ../external/tbc_text_format.h +// Only use header guard if we are not using an outer namespace +#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# endif +# else +# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# endif +#endif +#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#include +#include +#include + +// Use optional outer namespace +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + const std::string wrappableBeforeChars = "[({<\t"; + const std::string wrappableAfterChars = "])}>-,./|\\"; + const std::string wrappableInsteadOfChars = " \n\r"; + std::string indent = _attr.initialIndent != std::string::npos + ? std::string( _attr.initialIndent, ' ' ) + : std::string( _attr.indent, ' ' ); + + typedef std::string::const_iterator iterator; + iterator it = _str.begin(); + const iterator strEnd = _str.end(); + + while( it != strEnd ) { + + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + + std::string suffix; + std::size_t width = (std::min)( static_cast( strEnd-it ), _attr.width-static_cast( indent.size() ) ); + iterator itEnd = it+width; + iterator itNext = _str.end(); + + iterator itNewLine = std::find( it, itEnd, '\n' ); + if( itNewLine != itEnd ) + itEnd = itNewLine; + + if( itEnd != strEnd ) { + bool foundWrapPoint = false; + iterator findIt = itEnd; + do { + if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { + itEnd = findIt+1; + itNext = findIt+1; + foundWrapPoint = true; + } + else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { + itEnd = findIt; + itNext = findIt; + foundWrapPoint = true; + } + else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { + itNext = findIt+1; + itEnd = findIt; + foundWrapPoint = true; + } + if( findIt == it ) + break; + else + --findIt; + } + while( !foundWrapPoint ); + + if( !foundWrapPoint ) { + // No good wrap char, so we'll break mid word and add a hyphen + --itEnd; + itNext = itEnd; + suffix = "-"; + } + else { + while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) + --itEnd; + } + } + lines.push_back( indent + std::string( it, itEnd ) + suffix ); + + if( indent.size() != _attr.indent ) + indent = std::string( _attr.indent, ' ' ); + it = itNext; + } + } + + typedef std::vector::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector lines; + }; + +} // end namespace Tbc + +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE + +namespace Catch { + using Tbc::Text; + using Tbc::TextAttributes; +} + +// #included from: catch_console_colour.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED + +namespace Catch { + + struct Colour { + enum Code { + None = 0, + + White, + Red, + Green, + Blue, + Cyan, + Yellow, + Grey, + + Bright = 0x10, + + BrightRed = Bright | Red, + BrightGreen = Bright | Green, + LightGrey = Bright | Grey, + BrightWhite = Bright | White, + + // By intention + FileName = LightGrey, + Warning = Yellow, + ResultError = BrightRed, + ResultSuccess = BrightGreen, + ResultExpectedFailure = Warning, + + Error = BrightRed, + Success = Green, + + OriginalExpression = Cyan, + ReconstructedExpression = Yellow, + + SecondaryText = LightGrey, + Headers = White + }; + + // Use constructed object for RAII guard + Colour( Code _colourCode ); + Colour( Colour const& other ); + ~Colour(); + + // Use static method for one-shot changes + static void use( Code _colourCode ); + + private: + bool m_moved; + }; + + inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } + +} // end namespace Catch + +// #included from: catch_interfaces_reporter.h +#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED + +#include +#include +#include + +namespace Catch +{ + struct ReporterConfig { + explicit ReporterConfig( Ptr const& _fullConfig ) + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + + ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + + std::ostream& stream() const { return *m_stream; } + Ptr fullConfig() const { return m_fullConfig; } + + private: + std::ostream* m_stream; + Ptr m_fullConfig; + }; + + struct ReporterPreferences { + ReporterPreferences() + : shouldRedirectStdOut( false ) + {} + + bool shouldRedirectStdOut; + }; + + template + struct LazyStat : Option { + LazyStat() : used( false ) {} + LazyStat& operator=( T const& _value ) { + Option::operator=( _value ); + used = false; + return *this; + } + void reset() { + Option::reset(); + used = false; + } + bool used; + }; + + struct TestRunInfo { + TestRunInfo( std::string const& _name ) : name( _name ) {} + std::string name; + }; + struct GroupInfo { + GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) + {} + + std::string name; + std::size_t groupIndex; + std::size_t groupsCounts; + }; + + struct AssertionStats { + AssertionStats( AssertionResult const& _assertionResult, + std::vector const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) + { + if( assertionResult.hasMessage() ) { + // Copy message into messages list. + // !TBD This should have been done earlier, somewhere + MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); + builder << assertionResult.getMessage(); + builder.m_info.message = builder.m_stream.str(); + + infoMessages.push_back( builder.m_info ); + } + } + virtual ~AssertionStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = default; + AssertionStats& operator = ( AssertionStats && ) = default; +# endif + + AssertionResult assertionResult; + std::vector infoMessages; + Totals totals; + }; + + struct SectionStats { + SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) + {} + virtual ~SectionStats(); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; +# endif + + SectionInfo sectionInfo; + Counts assertions; + double durationInSeconds; + bool missingAssertions; + }; + + struct TestCaseStats { + TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) + {} + virtual ~TestCaseStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; +# endif + + TestCaseInfo testInfo; + Totals totals; + std::string stdOut; + std::string stdErr; + bool aborting; + }; + + struct TestGroupStats { + TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) + {} + TestGroupStats( GroupInfo const& _groupInfo ) + : groupInfo( _groupInfo ), + aborting( false ) + {} + virtual ~TestGroupStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; +# endif + + GroupInfo groupInfo; + Totals totals; + bool aborting; + }; + + struct TestRunStats { + TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) + {} + virtual ~TestRunStats(); + +# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestRunStats( TestRunStats const& _other ) + : runInfo( _other.runInfo ), + totals( _other.totals ), + aborting( _other.aborting ) + {} +# else + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; +# endif + + TestRunInfo runInfo; + Totals totals; + bool aborting; + }; + + class MultipleReporters; + + struct IStreamingReporter : IShared { + virtual ~IStreamingReporter(); + + // Implementing class must also provide the following static method: + // static std::string getDescription(); + + virtual ReporterPreferences getPreferences() const = 0; + + virtual void noMatchingTestCases( std::string const& spec ) = 0; + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; + virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; + virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + + virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } + }; + + struct IReporterFactory : IShared { + virtual ~IReporterFactory(); + virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; + virtual std::string getDescription() const = 0; + }; + + struct IReporterRegistry { + typedef std::map > FactoryMap; + typedef std::vector > Listeners; + + virtual ~IReporterRegistry(); + virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; + virtual FactoryMap const& getFactories() const = 0; + virtual Listeners const& getListeners() const = 0; + }; + + Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); + +} + +#include +#include + +namespace Catch { + + inline std::size_t listTests( Config const& config ) { + + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + Catch::cout() << "Matching test cases:\n"; + else { + Catch::cout() << "All available test cases:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::size_t matchedTests = 0; + TextAttributes nameAttr, descAttr, tagsAttr; + nameAttr.setInitialIndent( 2 ).setIndent( 4 ); + descAttr.setIndent( 4 ); + tagsAttr.setIndent( 6 ); + + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + Colour::Code colour = testCaseInfo.isHidden() + ? Colour::SecondaryText + : Colour::None; + Colour colourGuard( colour ); + + Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; + if( config.listExtraInfo() ) { + Catch::cout() << " " << testCaseInfo.lineInfo << std::endl; + std::string description = testCaseInfo.description; + if( description.empty() ) + description = "(NO DESCRIPTION)"; + Catch::cout() << Text( description, descAttr ) << std::endl; + } + if( !testCaseInfo.tags.empty() ) + Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; + } + + if( !config.testSpec().hasFilters() ) + Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; + else + Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; + return matchedTests; + } + + inline std::size_t listTestsNamesOnly( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( !config.testSpec().hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + std::size_t matchedTests = 0; + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + if( startsWith( testCaseInfo.name, '#' ) ) + Catch::cout() << '"' << testCaseInfo.name << '"'; + else + Catch::cout() << testCaseInfo.name; + if ( config.listExtraInfo() ) + Catch::cout() << "\t@" << testCaseInfo.lineInfo; + Catch::cout() << std::endl; + } + return matchedTests; + } + + struct TagInfo { + TagInfo() : count ( 0 ) {} + void add( std::string const& spelling ) { + ++count; + spellings.insert( spelling ); + } + std::string all() const { + std::string out; + for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); + it != itEnd; + ++it ) + out += "[" + *it + "]"; + return out; + } + std::set spellings; + std::size_t count; + }; + + inline std::size_t listTags( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + Catch::cout() << "Tags for matching test cases:\n"; + else { + Catch::cout() << "All available tags:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::map tagCounts; + + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), + tagItEnd = it->getTestCaseInfo().tags.end(); + tagIt != tagItEnd; + ++tagIt ) { + std::string tagName = *tagIt; + std::string lcaseTagName = toLower( tagName ); + std::map::iterator countIt = tagCounts.find( lcaseTagName ); + if( countIt == tagCounts.end() ) + countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; + countIt->second.add( tagName ); + } + } + + for( std::map::const_iterator countIt = tagCounts.begin(), + countItEnd = tagCounts.end(); + countIt != countItEnd; + ++countIt ) { + std::ostringstream oss; + oss << " " << std::setw(2) << countIt->second.count << " "; + Text wrapper( countIt->second.all(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( oss.str().size() ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); + Catch::cout() << oss.str() << wrapper << '\n'; + } + Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; + return tagCounts.size(); + } + + inline std::size_t listReporters( Config const& /*config*/ ) { + Catch::cout() << "Available reporters:\n"; + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; + std::size_t maxNameLen = 0; + for(it = itBegin; it != itEnd; ++it ) + maxNameLen = (std::max)( maxNameLen, it->first.size() ); + + for(it = itBegin; it != itEnd; ++it ) { + Text wrapper( it->second->getDescription(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( 7+maxNameLen ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); + Catch::cout() << " " + << it->first + << ':' + << std::string( maxNameLen - it->first.size() + 2, ' ' ) + << wrapper << '\n'; + } + Catch::cout() << std::endl; + return factories.size(); + } + + inline Option list( Config const& config ) { + Option listedCount; + if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) ) + listedCount = listedCount.valueOr(0) + listTests( config ); + if( config.listTestNamesOnly() ) + listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); + if( config.listTags() ) + listedCount = listedCount.valueOr(0) + listTags( config ); + if( config.listReporters() ) + listedCount = listedCount.valueOr(0) + listReporters( config ); + return listedCount; + } + +} // end namespace Catch + +// #included from: internal/catch_run_context.hpp +#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED + +// #included from: catch_test_case_tracker.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED + +#include +#include +#include +#include +#include + +CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS + +namespace Catch { +namespace TestCaseTracking { + + struct NameAndLocation { + std::string name; + SourceLineInfo location; + + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} + }; + + struct ITracker : SharedImpl<> { + virtual ~ITracker(); + + // static queries + virtual NameAndLocation const& nameAndLocation() const = 0; + + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + + virtual ITracker& parent() = 0; + + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; + + virtual void addChild( Ptr const& child ) = 0; + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isIndexTracker() const = 0; + }; + + class TrackerContext { + + enum RunState { + NotStarted, + Executing, + CompletedCycle + }; + + Ptr m_rootTracker; + ITracker* m_currentTracker; + RunState m_runState; + + public: + + static TrackerContext& instance() { + static TrackerContext s_instance; + return s_instance; + } + + TrackerContext() + : m_currentTracker( CATCH_NULL ), + m_runState( NotStarted ) + {} + + ITracker& startRun(); + + void endRun() { + m_rootTracker.reset(); + m_currentTracker = CATCH_NULL; + m_runState = NotStarted; + } + + void startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; + } + void completeCycle() { + m_runState = CompletedCycle; + } + + bool completedCycle() const { + return m_runState == CompletedCycle; + } + ITracker& currentTracker() { + return *m_currentTracker; + } + void setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } + }; + + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; + class TrackerHasName { + NameAndLocation m_nameAndLocation; + public: + TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} + bool operator ()( Ptr const& tracker ) { + return + tracker->nameAndLocation().name == m_nameAndLocation.name && + tracker->nameAndLocation().location == m_nameAndLocation.location; + } + }; + typedef std::vector > Children; + NameAndLocation m_nameAndLocation; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState; + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : m_nameAndLocation( nameAndLocation ), + m_ctx( ctx ), + m_parent( parent ), + m_runState( NotStarted ) + {} + virtual ~TrackerBase(); + + virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { + return m_nameAndLocation; + } + virtual bool isComplete() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully; + } + virtual bool isOpen() const CATCH_OVERRIDE { + return m_runState != NotStarted && !isComplete(); + } + virtual bool hasChildren() const CATCH_OVERRIDE { + return !m_children.empty(); + } + + virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { + m_children.push_back( child ); + } + + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { + Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); + return( it != m_children.end() ) + ? it->get() + : CATCH_NULL; + } + virtual ITracker& parent() CATCH_OVERRIDE { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } + + virtual void openChild() CATCH_OVERRIDE { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } + virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } + + void open() { + m_runState = Executing; + moveToThis(); + if( m_parent ) + m_parent->openChild(); + } + + virtual void close() CATCH_OVERRIDE { + + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); + + switch( m_runState ) { + case NotStarted: + case CompletedSuccessfully: + case Failed: + throw std::logic_error( "Illogical state" ); + + case NeedsAnotherRun: + break;; + + case Executing: + m_runState = CompletedSuccessfully; + break; + case ExecutingChildren: + if( m_children.empty() || m_children.back()->isComplete() ) + m_runState = CompletedSuccessfully; + break; + + default: + throw std::logic_error( "Unexpected state" ); + } + moveToParent(); + m_ctx.completeCycle(); + } + virtual void fail() CATCH_OVERRIDE { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { + m_runState = NeedsAnotherRun; + } + private: + void moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void moveToThis() { + m_ctx.setCurrentTracker( this ); + } + }; + + class SectionTracker : public TrackerBase { + std::vector m_filters; + public: + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); + + SectionTracker& parentSection = static_cast( *parent ); + addNextFilters( parentSection.m_filters ); + } + } + virtual ~SectionTracker(); + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } + + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + SectionTracker* section = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = static_cast( childTracker ); + } + else { + section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; + } + + void tryOpen() { + if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) + open(); + } + + void addInitialFilters( std::vector const& filters ) { + if( !filters.empty() ) { + m_filters.push_back(""); // Root - should never be consulted + m_filters.push_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void addNextFilters( std::vector const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); + } + }; + + class IndexTracker : public TrackerBase { + int m_size; + int m_index; + public: + IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_size( size ), + m_index( -1 ) + {} + virtual ~IndexTracker(); + + virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } + + static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { + IndexTracker* tracker = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isIndexTracker() ); + tracker = static_cast( childTracker ); + } + else { + tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); + currentTracker.addChild( tracker ); + } + + if( !ctx.completedCycle() && !tracker->isComplete() ) { + if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) + tracker->moveNext(); + tracker->open(); + } + + return *tracker; + } + + int index() const { return m_index; } + + void moveNext() { + m_index++; + m_children.clear(); + } + + virtual void close() CATCH_OVERRIDE { + TrackerBase::close(); + if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) + m_runState = Executing; + } + }; + + inline ITracker& TrackerContext::startRun() { + m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); + m_currentTracker = CATCH_NULL; + m_runState = Executing; + return *m_rootTracker; + } + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; +using TestCaseTracking::IndexTracker; + +} // namespace Catch + +CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +// #included from: catch_fatal_condition.hpp +#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED + +namespace Catch { + + // Report the error condition + inline void reportFatal( std::string const& message ) { + IContext& context = Catch::getCurrentContext(); + IResultCapture* resultCapture = context.getResultCapture(); + resultCapture->handleFatalErrorCondition( message ); + } + +} // namespace Catch + +#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// +// #included from: catch_windows_h_proxy.h + +#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED + +#ifdef CATCH_DEFINES_NOMINMAX +# define NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#ifdef __AFXDLL +#include +#else +#include +#endif + +#ifdef CATCH_DEFINES_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + + +# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_WINDOWS_SEH is defined + +namespace Catch { + + struct SignalDefs { DWORD id; const char* name; }; + extern SignalDefs signalDefs[]; + // There is no 1-1 mapping between signals and windows exceptions. + // Windows can easily distinguish between SO and SigSegV, + // but SigInt, SigTerm, etc are handled differently. + SignalDefs signalDefs[] = { + { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, + { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, + { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, + { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, + }; + + struct FatalConditionHandler { + + static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { + for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { + reportFatal(signalDefs[i].name); + } + } + // If its not an exception we care about, pass it along. + // This stops us from eating debugger breaks etc. + return EXCEPTION_CONTINUE_SEARCH; + } + + FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = CATCH_NULL; + // Register as first handler in current chain + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + // Pass in guarantee size to be filled + SetThreadStackGuarantee(&guaranteeSize); + } + + static void reset() { + if (isSet) { + // Unregister handler and restore the old guarantee + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = CATCH_NULL; + isSet = false; + } + } + + ~FatalConditionHandler() { + reset(); + } + private: + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; + }; + + bool FatalConditionHandler::isSet = false; + ULONG FatalConditionHandler::guaranteeSize = 0; + PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; + +} // namespace Catch + +# endif // CATCH_CONFIG_WINDOWS_SEH + +#else // Not Windows - assumed to be POSIX compatible ////////////////////////// + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_POSIX_SIGNALS is defined + +#include + +namespace Catch { + + struct SignalDefs { + int id; + const char* name; + }; + extern SignalDefs signalDefs[]; + SignalDefs signalDefs[] = { + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + }; + + struct FatalConditionHandler { + + static bool isSet; + static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; + static stack_t oldSigStack; + static char altStackMem[SIGSTKSZ]; + + static void handleSignal( int sig ) { + std::string name = ""; + for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + SignalDefs &def = signalDefs[i]; + if (sig == def.id) { + name = def.name; + break; + } + } + reset(); + reportFatal(name); + raise( sig ); + } + + FatalConditionHandler() { + isSet = true; + stack_t sigStack; + sigStack.ss_sp = altStackMem; + sigStack.ss_size = SIGSTKSZ; + sigStack.ss_flags = 0; + sigaltstack(&sigStack, &oldSigStack); + struct sigaction sa = { 0 }; + + sa.sa_handler = handleSignal; + sa.sa_flags = SA_ONSTACK; + for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { + sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); + } + } + + ~FatalConditionHandler() { + reset(); + } + static void reset() { + if( isSet ) { + // Set signals back to previous values -- hopefully nobody overwrote them in the meantime + for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { + sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); + } + // Return the old stack + sigaltstack(&oldSigStack, CATCH_NULL); + isSet = false; + } + } + }; + + bool FatalConditionHandler::isSet = false; + struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; + stack_t FatalConditionHandler::oldSigStack = {}; + char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; + +} // namespace Catch + +# endif // CATCH_CONFIG_POSIX_SIGNALS + +#endif // not Windows + +#include +#include + +namespace Catch { + + class StreamRedirect { + + public: + StreamRedirect( std::ostream& stream, std::string& targetString ) + : m_stream( stream ), + m_prevBuf( stream.rdbuf() ), + m_targetString( targetString ) + { + stream.rdbuf( m_oss.rdbuf() ); + } + + ~StreamRedirect() { + m_targetString += m_oss.str(); + m_stream.rdbuf( m_prevBuf ); + } + + private: + std::ostream& m_stream; + std::streambuf* m_prevBuf; + std::ostringstream m_oss; + std::string& m_targetString; + }; + + /////////////////////////////////////////////////////////////////////////// + + class RunContext : public IResultCapture, public IRunner { + + RunContext( RunContext const& ); + void operator =( RunContext const& ); + + public: + + explicit RunContext( Ptr const& _config, Ptr const& reporter ) + : m_runInfo( _config->name() ), + m_context( getCurrentMutableContext() ), + m_activeTestCase( CATCH_NULL ), + m_config( _config ), + m_reporter( reporter ), + m_shouldReportUnexpected ( true ) + { + m_context.setRunner( this ); + m_context.setConfig( m_config ); + m_context.setResultCapture( this ); + m_reporter->testRunStarting( m_runInfo ); + } + + virtual ~RunContext() { + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); + } + + void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); + } + void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); + } + + Totals runTest( TestCase const& testCase ) { + Totals prevTotals = m_totals; + + std::string redirectedCout; + std::string redirectedCerr; + + TestCaseInfo testInfo = testCase.getTestCaseInfo(); + + m_reporter->testCaseStarting( testInfo ); + + m_activeTestCase = &testCase; + + do { + ITracker& rootTracker = m_trackerContext.startRun(); + assert( rootTracker.isSectionTracker() ); + static_cast( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); + do { + m_trackerContext.startCycle(); + m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); + runCurrentTest( redirectedCout, redirectedCerr ); + } + while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); + } + // !TBD: deprecated - this will be replaced by indexed trackers + while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); + + Totals deltaTotals = m_totals.delta( prevTotals ); + if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } + m_totals.testCases += deltaTotals.testCases; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + redirectedCout, + redirectedCerr, + aborting() ) ); + + m_activeTestCase = CATCH_NULL; + m_testCaseTracker = CATCH_NULL; + + return deltaTotals; + } + + Ptr config() const { + return m_config; + } + + private: // IResultCapture + + virtual void assertionEnded( AssertionResult const& result ) { + if( result.getResultType() == ResultWas::Ok ) { + m_totals.assertions.passed++; + } + else if( !result.isOk() ) { + m_totals.assertions.failed++; + } + + // We have no use for the return value (whether messages should be cleared), because messages were made scoped + // and should be let to clear themselves out. + static_cast(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); + + // Reset working state + m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); + m_lastResult = result; + } + + virtual bool sectionStarted ( + SectionInfo const& sectionInfo, + Counts& assertions + ) + { + ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); + if( !sectionTracker.isOpen() ) + return false; + m_activeSections.push_back( §ionTracker ); + + m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; + + m_reporter->sectionStarting( sectionInfo ); + + assertions = m_totals.assertions; + + return true; + } + bool testForMissingAssertions( Counts& assertions ) { + if( assertions.total() != 0 ) + return false; + if( !m_config->warnAboutMissingAssertions() ) + return false; + if( m_trackerContext.currentTracker().hasChildren() ) + return false; + m_totals.assertions.failed++; + assertions.failed++; + return true; + } + + virtual void sectionEnded( SectionEndInfo const& endInfo ) { + Counts assertions = m_totals.assertions - endInfo.prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + if( !m_activeSections.empty() ) { + m_activeSections.back()->close(); + m_activeSections.pop_back(); + } + + m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); + m_messages.clear(); + } + + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { + if( m_unfinishedSections.empty() ) + m_activeSections.back()->fail(); + else + m_activeSections.back()->close(); + m_activeSections.pop_back(); + + m_unfinishedSections.push_back( endInfo ); + } + + virtual void pushScopedMessage( MessageInfo const& message ) { + m_messages.push_back( message ); + } + + virtual void popScopedMessage( MessageInfo const& message ) { + m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); + } + + virtual std::string getCurrentTestName() const { + return m_activeTestCase + ? m_activeTestCase->getTestCaseInfo().name + : std::string(); + } + + virtual const AssertionResult* getLastResult() const { + return &m_lastResult; + } + + virtual void exceptionEarlyReported() { + m_shouldReportUnexpected = false; + } + + virtual void handleFatalErrorCondition( std::string const& message ) { + // Don't rebuild the result -- the stringification itself can cause more fatal errors + // Instead, fake a result data. + AssertionResultData tempResult; + tempResult.resultType = ResultWas::FatalErrorCondition; + tempResult.message = message; + AssertionResult result(m_lastAssertionInfo, tempResult); + + getResultCapture().assertionEnded(result); + + handleUnfinishedSections(); + + // Recreate section for test case (as we will lose the one that was in scope) + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + + Counts assertions; + assertions.failed = 1; + SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); + m_reporter->sectionEnded( testCaseSectionStats ); + + TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); + + Totals deltaTotals; + deltaTotals.testCases.failed = 1; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + std::string(), + std::string(), + false ) ); + m_totals.testCases.failed++; + testGroupEnded( std::string(), m_totals, 1, 1 ); + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); + } + + public: + // !TBD We need to do this another way! + bool aborting() const { + return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); + } + + private: + + void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + m_reporter->sectionStarting( testCaseSection ); + Counts prevAssertions = m_totals.assertions; + double duration = 0; + m_shouldReportUnexpected = true; + try { + m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); + + seedRng( *m_config ); + + Timer timer; + timer.start(); + if( m_reporter->getPreferences().shouldRedirectStdOut ) { + StreamRedirect coutRedir( Catch::cout(), redirectedCout ); + StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); + invokeActiveTestCase(); + } + else { + invokeActiveTestCase(); + } + duration = timer.getElapsedSeconds(); + } + catch( TestFailureException& ) { + // This just means the test was aborted due to failure + } + catch(...) { + // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions + // are reported without translation at the point of origin. + if (m_shouldReportUnexpected) { + makeUnexpectedResultBuilder().useActiveException(); + } + } + m_testCaseTracker->close(); + handleUnfinishedSections(); + m_messages.clear(); + + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + if( testCaseInfo.okToFail() ) { + std::swap( assertions.failedButOk, assertions.failed ); + m_totals.assertions.failed -= assertions.failedButOk; + m_totals.assertions.failedButOk += assertions.failedButOk; + } + + SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); + m_reporter->sectionEnded( testCaseSectionStats ); + } + + void invokeActiveTestCase() { + FatalConditionHandler fatalConditionHandler; // Handle signals + m_activeTestCase->invoke(); + fatalConditionHandler.reset(); + } + + private: + + ResultBuilder makeUnexpectedResultBuilder() const { + return ResultBuilder( m_lastAssertionInfo.macroName, + m_lastAssertionInfo.lineInfo, + m_lastAssertionInfo.capturedExpression, + m_lastAssertionInfo.resultDisposition ); + } + + void handleUnfinishedSections() { + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it ) + sectionEnded( *it ); + m_unfinishedSections.clear(); + } + + TestRunInfo m_runInfo; + IMutableContext& m_context; + TestCase const* m_activeTestCase; + ITracker* m_testCaseTracker; + ITracker* m_currentSectionTracker; + AssertionResult m_lastResult; + + Ptr m_config; + Totals m_totals; + Ptr m_reporter; + std::vector m_messages; + AssertionInfo m_lastAssertionInfo; + std::vector m_unfinishedSections; + std::vector m_activeSections; + TrackerContext m_trackerContext; + bool m_shouldReportUnexpected; + }; + + IResultCapture& getResultCapture() { + if( IResultCapture* capture = getCurrentContext().getResultCapture() ) + return *capture; + else + throw std::logic_error( "No result capture instance" ); + } + +} // end namespace Catch + +// #included from: internal/catch_version.h +#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED + +namespace Catch { + + // Versioning information + struct Version { + Version( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ); + + unsigned int const majorVersion; + unsigned int const minorVersion; + unsigned int const patchNumber; + + // buildNumber is only used if branchName is not null + char const * const branchName; + unsigned int const buildNumber; + + friend std::ostream& operator << ( std::ostream& os, Version const& version ); + + private: + void operator=( Version const& ); + }; + + inline Version libraryVersion(); +} + +#include +#include +#include + +namespace Catch { + + Ptr createReporter( std::string const& reporterName, Ptr const& config ) { + Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); + if( !reporter ) { + std::ostringstream oss; + oss << "No reporter registered with name: '" << reporterName << "'"; + throw std::domain_error( oss.str() ); + } + return reporter; + } + + Ptr makeReporter( Ptr const& config ) { + std::vector reporters = config->getReporterNames(); + if( reporters.empty() ) + reporters.push_back( "console" ); + + Ptr reporter; + for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); + it != itEnd; + ++it ) + reporter = addReporter( reporter, createReporter( *it, config ) ); + return reporter; + } + Ptr addListeners( Ptr const& config, Ptr reporters ) { + IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); + for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); + it != itEnd; + ++it ) + reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); + return reporters; + } + + Totals runTests( Ptr const& config ) { + + Ptr iconfig = config.get(); + + Ptr reporter = makeReporter( config ); + reporter = addListeners( iconfig, reporter ); + + RunContext context( iconfig, reporter ); + + Totals totals; + + context.testGroupStarting( config->name(), 1, 1 ); + + TestSpec testSpec = config->testSpec(); + if( !testSpec.hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests + + std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); + for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); + it != itEnd; + ++it ) { + if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) + totals += context.runTest( *it ); + else + reporter->skipTest( *it ); + } + + context.testGroupEnded( iconfig->name(), totals, 1, 1 ); + return totals; + } + + void applyFilenamesAsTags( IConfig const& config ) { + std::vector const& tests = getAllTestCasesSorted( config ); + for(std::size_t i = 0; i < tests.size(); ++i ) { + TestCase& test = const_cast( tests[i] ); + std::set tags = test.tags; + + std::string filename = test.lineInfo.file; + std::string::size_type lastSlash = filename.find_last_of( "\\/" ); + if( lastSlash != std::string::npos ) + filename = filename.substr( lastSlash+1 ); + + std::string::size_type lastDot = filename.find_last_of( "." ); + if( lastDot != std::string::npos ) + filename = filename.substr( 0, lastDot ); + + tags.insert( "#" + filename ); + setTags( test, tags ); + } + } + + class Session : NonCopyable { + static bool alreadyInstantiated; + + public: + + struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; + + Session() + : m_cli( makeCommandLineParser() ) { + if( alreadyInstantiated ) { + std::string msg = "Only one instance of Catch::Session can ever be used"; + Catch::cerr() << msg << std::endl; + throw std::logic_error( msg ); + } + alreadyInstantiated = true; + } + ~Session() { + Catch::cleanUp(); + } + + void showHelp( std::string const& processName ) { + Catch::cout() << "\nCatch v" << libraryVersion() << "\n"; + + m_cli.usage( Catch::cout(), processName ); + Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; + } + + int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + try { + m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); + m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); + if( m_configData.showHelp ) + showHelp( m_configData.processName ); + m_config.reset(); + } + catch( std::exception& ex ) { + { + Colour colourGuard( Colour::Red ); + Catch::cerr() + << "\nError(s) in input:\n" + << Text( ex.what(), TextAttributes().setIndent(2) ) + << "\n\n"; + } + m_cli.usage( Catch::cout(), m_configData.processName ); + return (std::numeric_limits::max)(); + } + return 0; + } + + void useConfigData( ConfigData const& _configData ) { + m_configData = _configData; + m_config.reset(); + } + + int run( int argc, char const* const* const argv ) { + + int returnCode = applyCommandLine( argc, argv ); + if( returnCode == 0 ) + returnCode = run(); + return returnCode; + } + + #if defined(WIN32) && defined(UNICODE) + int run( int argc, wchar_t const* const* const argv ) { + + char **utf8Argv = new char *[ argc ]; + + for ( int i = 0; i < argc; ++i ) { + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); + + utf8Argv[ i ] = new char[ bufSize ]; + + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); + } + + int returnCode = applyCommandLine( argc, utf8Argv ); + if( returnCode == 0 ) + returnCode = run(); + + for ( int i = 0; i < argc; ++i ) + delete [] utf8Argv[ i ]; + + delete [] utf8Argv; + + return returnCode; + } + #endif + + int run() { + if( m_configData.showHelp ) + return 0; + + try + { + config(); // Force config to be constructed + + seedRng( *m_config ); + + if( m_configData.filenamesAsTags ) + applyFilenamesAsTags( *m_config ); + + // Handle list request + if( Option listed = list( config() ) ) + return static_cast( *listed ); + + return static_cast( runTests( m_config ).assertions.failed ); + } + catch( std::exception& ex ) { + Catch::cerr() << ex.what() << std::endl; + return (std::numeric_limits::max)(); + } + } + + Clara::CommandLine const& cli() const { + return m_cli; + } + std::vector const& unusedTokens() const { + return m_unusedTokens; + } + ConfigData& configData() { + return m_configData; + } + Config& config() { + if( !m_config ) + m_config = new Config( m_configData ); + return *m_config; + } + private: + Clara::CommandLine m_cli; + std::vector m_unusedTokens; + ConfigData m_configData; + Ptr m_config; + }; + + bool Session::alreadyInstantiated = false; + +} // end namespace Catch + +// #included from: catch_registry_hub.hpp +#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED + +// #included from: catch_test_case_registry_impl.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + struct RandomNumberGenerator { + typedef std::ptrdiff_t result_type; + + result_type operator()( result_type n ) const { return std::rand() % n; } + +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return 1000000; } + result_type operator()() const { return std::rand() % max(); } +#endif + template + static void shuffle( V& vector ) { + RandomNumberGenerator rng; +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + std::shuffle( vector.begin(), vector.end(), rng ); +#else + std::random_shuffle( vector.begin(), vector.end(), rng ); +#endif + } + }; + + inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { + + std::vector sorted = unsortedTestCases; + + switch( config.runOrder() ) { + case RunTests::InLexicographicalOrder: + std::sort( sorted.begin(), sorted.end() ); + break; + case RunTests::InRandomOrder: + { + seedRng( config ); + RandomNumberGenerator::shuffle( sorted ); + } + break; + case RunTests::InDeclarationOrder: + // already in declaration order + break; + } + return sorted; + } + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { + return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); + } + + void enforceNoDuplicateTestCases( std::vector const& functions ) { + std::set seenFunctions; + for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); + it != itEnd; + ++it ) { + std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); + if( !prev.second ) { + std::ostringstream ss; + + ss << Colour( Colour::Red ) + << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' + << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; + + throw std::runtime_error(ss.str()); + } + } + } + + std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { + std::vector filtered; + filtered.reserve( testCases.size() ); + for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); + it != itEnd; + ++it ) + if( matchTest( *it, testSpec, config ) ) + filtered.push_back( *it ); + return filtered; + } + std::vector const& getAllTestCasesSorted( IConfig const& config ) { + return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); + } + + class TestRegistry : public ITestCaseRegistry { + public: + TestRegistry() + : m_currentSortOrder( RunTests::InDeclarationOrder ), + m_unnamedCount( 0 ) + {} + virtual ~TestRegistry(); + + virtual void registerTest( TestCase const& testCase ) { + std::string name = testCase.getTestCaseInfo().name; + if( name.empty() ) { + std::ostringstream oss; + oss << "Anonymous test case " << ++m_unnamedCount; + return registerTest( testCase.withName( oss.str() ) ); + } + m_functions.push_back( testCase ); + } + + virtual std::vector const& getAllTests() const { + return m_functions; + } + virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { + if( m_sortedFunctions.empty() ) + enforceNoDuplicateTestCases( m_functions ); + + if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { + m_sortedFunctions = sortTests( config, m_functions ); + m_currentSortOrder = config.runOrder(); + } + return m_sortedFunctions; + } + + private: + std::vector m_functions; + mutable RunTests::InWhatOrder m_currentSortOrder; + mutable std::vector m_sortedFunctions; + size_t m_unnamedCount; + std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised + }; + + /////////////////////////////////////////////////////////////////////////// + + class FreeFunctionTestCase : public SharedImpl { + public: + + FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} + + virtual void invoke() const { + m_fun(); + } + + private: + virtual ~FreeFunctionTestCase(); + + TestFunction m_fun; + }; + + inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { + std::string className = classOrQualifiedMethodName; + if( startsWith( className, '&' ) ) + { + std::size_t lastColons = className.rfind( "::" ); + std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); + if( penultimateColons == std::string::npos ) + penultimateColons = 1; + className = className.substr( penultimateColons, lastColons-penultimateColons ); + } + return className; + } + + void registerTestCase + ( ITestCase* testCase, + char const* classOrQualifiedMethodName, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + + getMutableRegistryHub().registerTest + ( makeTestCase + ( testCase, + extractClassName( classOrQualifiedMethodName ), + nameAndDesc.name, + nameAndDesc.description, + lineInfo ) ); + } + void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); + } + + /////////////////////////////////////////////////////////////////////////// + + AutoReg::AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCaseFunction( function, lineInfo, nameAndDesc ); + } + + AutoReg::~AutoReg() {} + +} // end namespace Catch + +// #included from: catch_reporter_registry.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED + +#include + +namespace Catch { + + class ReporterRegistry : public IReporterRegistry { + + public: + + virtual ~ReporterRegistry() CATCH_OVERRIDE {} + + virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { + FactoryMap::const_iterator it = m_factories.find( name ); + if( it == m_factories.end() ) + return CATCH_NULL; + return it->second->create( ReporterConfig( config ) ); + } + + void registerReporter( std::string const& name, Ptr const& factory ) { + m_factories.insert( std::make_pair( name, factory ) ); + } + void registerListener( Ptr const& factory ) { + m_listeners.push_back( factory ); + } + + virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { + return m_factories; + } + virtual Listeners const& getListeners() const CATCH_OVERRIDE { + return m_listeners; + } + + private: + FactoryMap m_factories; + Listeners m_listeners; + }; +} + +// #included from: catch_exception_translator_registry.hpp +#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED + +#ifdef __OBJC__ +#import "Foundation/Foundation.h" +#endif + +namespace Catch { + + class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { + public: + ~ExceptionTranslatorRegistry() { + deleteAll( m_translators ); + } + + virtual void registerTranslator( const IExceptionTranslator* translator ) { + m_translators.push_back( translator ); + } + + virtual std::string translateActiveException() const { + try { +#ifdef __OBJC__ + // In Objective-C try objective-c exceptions first + @try { + return tryTranslators(); + } + @catch (NSException *exception) { + return Catch::toString( [exception description] ); + } +#else + return tryTranslators(); +#endif + } + catch( TestFailureException& ) { + throw; + } + catch( std::exception& ex ) { + return ex.what(); + } + catch( std::string& msg ) { + return msg; + } + catch( const char* msg ) { + return msg; + } + catch(...) { + return "Unknown exception"; + } + } + + std::string tryTranslators() const { + if( m_translators.empty() ) + throw; + else + return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); + } + + private: + std::vector m_translators; + }; +} + +// #included from: catch_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED + +#include + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + virtual ~TagAliasRegistry(); + virtual Option find( std::string const& alias ) const; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; + void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); + + private: + std::map m_registry; + }; + +} // end namespace Catch + +namespace Catch { + + namespace { + + class RegistryHub : public IRegistryHub, public IMutableRegistryHub { + + RegistryHub( RegistryHub const& ); + void operator=( RegistryHub const& ); + + public: // IRegistryHub + RegistryHub() { + } + virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { + return m_reporterRegistry; + } + virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { + return m_testCaseRegistry; + } + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { + return m_exceptionTranslatorRegistry; + } + virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE { + return m_tagAliasRegistry; + } + + public: // IMutableRegistryHub + virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { + m_reporterRegistry.registerReporter( name, factory ); + } + virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { + m_reporterRegistry.registerListener( factory ); + } + virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { + m_testCaseRegistry.registerTest( testInfo ); + } + virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { + m_exceptionTranslatorRegistry.registerTranslator( translator ); + } + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE { + m_tagAliasRegistry.add( alias, tag, lineInfo ); + } + + private: + TestRegistry m_testCaseRegistry; + ReporterRegistry m_reporterRegistry; + ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + TagAliasRegistry m_tagAliasRegistry; + }; + + // Single, global, instance + inline RegistryHub*& getTheRegistryHub() { + static RegistryHub* theRegistryHub = CATCH_NULL; + if( !theRegistryHub ) + theRegistryHub = new RegistryHub(); + return theRegistryHub; + } + } + + IRegistryHub& getRegistryHub() { + return *getTheRegistryHub(); + } + IMutableRegistryHub& getMutableRegistryHub() { + return *getTheRegistryHub(); + } + void cleanUp() { + delete getTheRegistryHub(); + getTheRegistryHub() = CATCH_NULL; + cleanUpContext(); + } + std::string translateActiveException() { + return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); + } + +} // end namespace Catch + +// #included from: catch_notimplemented_exception.hpp +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED + +#include + +namespace Catch { + + NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) + : m_lineInfo( lineInfo ) { + std::ostringstream oss; + oss << lineInfo << ": function "; + oss << "not implemented"; + m_what = oss.str(); + } + + const char* NotImplementedException::what() const CATCH_NOEXCEPT { + return m_what.c_str(); + } + +} // end namespace Catch + +// #included from: catch_context_impl.hpp +#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED + +// #included from: catch_stream.hpp +#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + + template + class StreamBufImpl : public StreamBufBase { + char data[bufferSize]; + WriterF m_writer; + + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } + + ~StreamBufImpl() CATCH_NOEXCEPT { + sync(); + } + + private: + int overflow( int c ) { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast( c ) ) ); + else + sputc( static_cast( c ) ); + } + return 0; + } + + int sync() { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + FileStream::FileStream( std::string const& filename ) { + m_ofs.open( filename.c_str() ); + if( m_ofs.fail() ) { + std::ostringstream oss; + oss << "Unable to open file: '" << filename << '\''; + throw std::domain_error( oss.str() ); + } + } + + std::ostream& FileStream::stream() const { + return m_ofs; + } + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + DebugOutStream::DebugOutStream() + : m_streamBuf( new StreamBufImpl() ), + m_os( m_streamBuf.get() ) + {} + + std::ostream& DebugOutStream::stream() const { + return m_os; + } + + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream::CoutStream() + : m_os( Catch::cout().rdbuf() ) + {} + + std::ostream& CoutStream::stream() const { + return m_os; + } + +#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions + std::ostream& cout() { + return std::cout; + } + std::ostream& cerr() { + return std::cerr; + } +#endif +} + +namespace Catch { + + class Context : public IMutableContext { + + Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} + Context( Context const& ); + void operator=( Context const& ); + + public: + virtual ~Context() { + deleteAllValues( m_generatorsByTestName ); + } + + public: // IContext + virtual IResultCapture* getResultCapture() { + return m_resultCapture; + } + virtual IRunner* getRunner() { + return m_runner; + } + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { + return getGeneratorsForCurrentTest() + .getGeneratorInfo( fileInfo, totalSize ) + .getCurrentIndex(); + } + virtual bool advanceGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + return generators && generators->moveNext(); + } + + virtual Ptr getConfig() const { + return m_config; + } + + public: // IMutableContext + virtual void setResultCapture( IResultCapture* resultCapture ) { + m_resultCapture = resultCapture; + } + virtual void setRunner( IRunner* runner ) { + m_runner = runner; + } + virtual void setConfig( Ptr const& config ) { + m_config = config; + } + + friend IMutableContext& getCurrentMutableContext(); + + private: + IGeneratorsForTest* findGeneratorsForCurrentTest() { + std::string testName = getResultCapture()->getCurrentTestName(); + + std::map::const_iterator it = + m_generatorsByTestName.find( testName ); + return it != m_generatorsByTestName.end() + ? it->second + : CATCH_NULL; + } + + IGeneratorsForTest& getGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + if( !generators ) { + std::string testName = getResultCapture()->getCurrentTestName(); + generators = createGeneratorsForTest(); + m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); + } + return *generators; + } + + private: + Ptr m_config; + IRunner* m_runner; + IResultCapture* m_resultCapture; + std::map m_generatorsByTestName; + }; + + namespace { + Context* currentContext = CATCH_NULL; + } + IMutableContext& getCurrentMutableContext() { + if( !currentContext ) + currentContext = new Context(); + return *currentContext; + } + IContext& getCurrentContext() { + return getCurrentMutableContext(); + } + + void cleanUpContext() { + delete currentContext; + currentContext = CATCH_NULL; + } +} + +// #included from: catch_console_colour_impl.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED + +// #included from: catch_errno_guard.hpp +#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED + +#include + +namespace Catch { + + class ErrnoGuard { + public: + ErrnoGuard():m_oldErrno(errno){} + ~ErrnoGuard() { errno = m_oldErrno; } + private: + int m_oldErrno; + }; + +} + +namespace Catch { + namespace { + + struct IColourImpl { + virtual ~IColourImpl() {} + virtual void use( Colour::Code _colourCode ) = 0; + }; + + struct NoColourImpl : IColourImpl { + void use( Colour::Code ) {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + + } // anon namespace +} // namespace Catch + +#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) +# ifdef CATCH_PLATFORM_WINDOWS +# define CATCH_CONFIG_COLOUR_WINDOWS +# else +# define CATCH_CONFIG_COLOUR_ANSI +# endif +#endif + +#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// + +namespace Catch { +namespace { + + class Win32ColourImpl : public IColourImpl { + public: + Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) + { + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); + originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); + originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); + } + + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: return setTextAttribute( originalForegroundAttributes ); + case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::Red: return setTextAttribute( FOREGROUND_RED ); + case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); + case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); + case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); + case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); + case Colour::Grey: return setTextAttribute( 0 ); + + case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); + case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); + case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); + case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + + private: + void setTextAttribute( WORD _textAttribute ) { + SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); + } + HANDLE stdoutHandle; + WORD originalForegroundAttributes; + WORD originalBackgroundAttributes; + }; + + IColourImpl* platformColourInstance() { + static Win32ColourImpl s_instance; + + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = !isDebuggerActive() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// + +#include + +namespace Catch { +namespace { + + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public IColourImpl { + public: + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0;34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; + } + + private: + void setColour( const char* _escapeCode ) { + Catch::cout() << '\033' << _escapeCode; + } + }; + + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#else // not Windows or ANSI /////////////////////////////////////////////// + +namespace Catch { + + static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } + +} // end namespace Catch + +#endif // Windows/ ANSI/ None + +namespace Catch { + + Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } + Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } + Colour::~Colour(){ if( !m_moved ) use( None ); } + + void Colour::use( Code _colourCode ) { + static IColourImpl* impl = platformColourInstance(); + impl->use( _colourCode ); + } + +} // end namespace Catch + +// #included from: catch_generators_impl.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + + struct GeneratorInfo : IGeneratorInfo { + + GeneratorInfo( std::size_t size ) + : m_size( size ), + m_currentIndex( 0 ) + {} + + bool moveNext() { + if( ++m_currentIndex == m_size ) { + m_currentIndex = 0; + return false; + } + return true; + } + + std::size_t getCurrentIndex() const { + return m_currentIndex; + } + + std::size_t m_size; + std::size_t m_currentIndex; + }; + + /////////////////////////////////////////////////////////////////////////// + + class GeneratorsForTest : public IGeneratorsForTest { + + public: + ~GeneratorsForTest() { + deleteAll( m_generatorsInOrder ); + } + + IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { + std::map::const_iterator it = m_generatorsByName.find( fileInfo ); + if( it == m_generatorsByName.end() ) { + IGeneratorInfo* info = new GeneratorInfo( size ); + m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); + m_generatorsInOrder.push_back( info ); + return *info; + } + return *it->second; + } + + bool moveNext() { + std::vector::const_iterator it = m_generatorsInOrder.begin(); + std::vector::const_iterator itEnd = m_generatorsInOrder.end(); + for(; it != itEnd; ++it ) { + if( (*it)->moveNext() ) + return true; + } + return false; + } + + private: + std::map m_generatorsByName; + std::vector m_generatorsInOrder; + }; + + IGeneratorsForTest* createGeneratorsForTest() + { + return new GeneratorsForTest(); + } + +} // end namespace Catch + +// #included from: catch_assertionresult.hpp +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED + +namespace Catch { + + AssertionInfo::AssertionInfo( char const * _macroName, + SourceLineInfo const& _lineInfo, + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg) + : macroName( _macroName ), + lineInfo( _lineInfo ), + capturedExpression( _capturedExpression ), + resultDisposition( _resultDisposition ), + secondArg( _secondArg ) + {} + + AssertionResult::AssertionResult() {} + + AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) + : m_info( info ), + m_resultData( data ) + {} + + AssertionResult::~AssertionResult() {} + + // Result was a success + bool AssertionResult::succeeded() const { + return Catch::isOk( m_resultData.resultType ); + } + + // Result was a success, or failure is suppressed + bool AssertionResult::isOk() const { + return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); + } + + ResultWas::OfType AssertionResult::getResultType() const { + return m_resultData.resultType; + } + + bool AssertionResult::hasExpression() const { + return m_info.capturedExpression[0] != 0; + } + + bool AssertionResult::hasMessage() const { + return !m_resultData.message.empty(); + } + + std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) { + return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"') + ? capturedExpression + : std::string(capturedExpression) + ", " + secondArg; + } + + std::string AssertionResult::getExpression() const { + if( isFalseTest( m_info.resultDisposition ) ) + return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + else + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + } + std::string AssertionResult::getExpressionInMacro() const { + if( m_info.macroName[0] == 0 ) + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + else + return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )"; + } + + bool AssertionResult::hasExpandedExpression() const { + return hasExpression() && getExpandedExpression() != getExpression(); + } + + std::string AssertionResult::getExpandedExpression() const { + return m_resultData.reconstructExpression(); + } + + std::string AssertionResult::getMessage() const { + return m_resultData.message; + } + SourceLineInfo AssertionResult::getSourceInfo() const { + return m_info.lineInfo; + } + + std::string AssertionResult::getTestMacroName() const { + return m_info.macroName; + } + + void AssertionResult::discardDecomposedExpression() const { + m_resultData.decomposedExpression = CATCH_NULL; + } + + void AssertionResult::expandDecomposedExpression() const { + m_resultData.reconstructExpression(); + } + +} // end namespace Catch + +// #included from: catch_test_case_info.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED + +#include + +namespace Catch { + + inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { + if( startsWith( tag, '.' ) || + tag == "hide" || + tag == "!hide" ) + return TestCaseInfo::IsHidden; + else if( tag == "!throws" ) + return TestCaseInfo::Throws; + else if( tag == "!shouldfail" ) + return TestCaseInfo::ShouldFail; + else if( tag == "!mayfail" ) + return TestCaseInfo::MayFail; + else if( tag == "!nonportable" ) + return TestCaseInfo::NonPortable; + else + return TestCaseInfo::None; + } + inline bool isReservedTag( std::string const& tag ) { + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] ); + } + inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { + if( isReservedTag( tag ) ) { + std::ostringstream ss; + ss << Colour(Colour::Red) + << "Tag name [" << tag << "] not allowed.\n" + << "Tag names starting with non alpha-numeric characters are reserved\n" + << Colour(Colour::FileName) + << _lineInfo << '\n'; + throw std::runtime_error(ss.str()); + } + } + + TestCase makeTestCase( ITestCase* _testCase, + std::string const& _className, + std::string const& _name, + std::string const& _descOrTags, + SourceLineInfo const& _lineInfo ) + { + bool isHidden( startsWith( _name, "./" ) ); // Legacy support + + // Parse out tags + std::set tags; + std::string desc, tag; + bool inTag = false; + for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { + char c = _descOrTags[i]; + if( !inTag ) { + if( c == '[' ) + inTag = true; + else + desc += c; + } + else { + if( c == ']' ) { + TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); + if( prop == TestCaseInfo::IsHidden ) + isHidden = true; + else if( prop == TestCaseInfo::None ) + enforceNotReservedTag( tag, _lineInfo ); + + tags.insert( tag ); + tag.clear(); + inTag = false; + } + else + tag += c; + } + } + if( isHidden ) { + tags.insert( "hide" ); + tags.insert( "." ); + } + + TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); + return TestCase( _testCase, info ); + } + + void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) + { + testCaseInfo.tags = tags; + testCaseInfo.lcaseTags.clear(); + + std::ostringstream oss; + for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { + oss << '[' << *it << ']'; + std::string lcaseTag = toLower( *it ); + testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); + testCaseInfo.lcaseTags.insert( lcaseTag ); + } + testCaseInfo.tagsAsString = oss.str(); + } + + TestCaseInfo::TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set const& _tags, + SourceLineInfo const& _lineInfo ) + : name( _name ), + className( _className ), + description( _description ), + lineInfo( _lineInfo ), + properties( None ) + { + setTags( *this, _tags ); + } + + TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) + : name( other.name ), + className( other.className ), + description( other.description ), + tags( other.tags ), + lcaseTags( other.lcaseTags ), + tagsAsString( other.tagsAsString ), + lineInfo( other.lineInfo ), + properties( other.properties ) + {} + + bool TestCaseInfo::isHidden() const { + return ( properties & IsHidden ) != 0; + } + bool TestCaseInfo::throws() const { + return ( properties & Throws ) != 0; + } + bool TestCaseInfo::okToFail() const { + return ( properties & (ShouldFail | MayFail ) ) != 0; + } + bool TestCaseInfo::expectedToFail() const { + return ( properties & (ShouldFail ) ) != 0; + } + + TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} + + TestCase::TestCase( TestCase const& other ) + : TestCaseInfo( other ), + test( other.test ) + {} + + TestCase TestCase::withName( std::string const& _newName ) const { + TestCase other( *this ); + other.name = _newName; + return other; + } + + void TestCase::swap( TestCase& other ) { + test.swap( other.test ); + name.swap( other.name ); + className.swap( other.className ); + description.swap( other.description ); + tags.swap( other.tags ); + lcaseTags.swap( other.lcaseTags ); + tagsAsString.swap( other.tagsAsString ); + std::swap( TestCaseInfo::properties, static_cast( other ).properties ); + std::swap( lineInfo, other.lineInfo ); + } + + void TestCase::invoke() const { + test->invoke(); + } + + bool TestCase::operator == ( TestCase const& other ) const { + return test.get() == other.test.get() && + name == other.name && + className == other.className; + } + + bool TestCase::operator < ( TestCase const& other ) const { + return name < other.name; + } + TestCase& TestCase::operator = ( TestCase const& other ) { + TestCase temp( other ); + swap( temp ); + return *this; + } + + TestCaseInfo const& TestCase::getTestCaseInfo() const + { + return *this; + } + +} // end namespace Catch + +// #included from: catch_version.hpp +#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED + +namespace Catch { + + Version::Version + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) + {} + + std::ostream& operator << ( std::ostream& os, Version const& version ) { + os << version.majorVersion << '.' + << version.minorVersion << '.' + << version.patchNumber; + // branchName is never null -> 0th char is \0 if it is empty + if (version.branchName[0]) { + os << '-' << version.branchName + << '.' << version.buildNumber; + } + return os; + } + + inline Version libraryVersion() { + static Version version( 1, 9, 6, "", 0 ); + return version; + } + +} + +// #included from: catch_message.hpp +#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED + +namespace Catch { + + MessageInfo::MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) + {} + + // This may need protecting if threading support is added + unsigned int MessageInfo::globalCount = 0; + + //////////////////////////////////////////////////////////////////////////// + + ScopedMessage::ScopedMessage( MessageBuilder const& builder ) + : m_info( builder.m_info ) + { + m_info.message = builder.m_stream.str(); + getResultCapture().pushScopedMessage( m_info ); + } + ScopedMessage::ScopedMessage( ScopedMessage const& other ) + : m_info( other.m_info ) + {} + + ScopedMessage::~ScopedMessage() { + if ( !std::uncaught_exception() ){ + getResultCapture().popScopedMessage(m_info); + } + } + +} // end namespace Catch + +// #included from: catch_legacy_reporter_adapter.hpp +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED + +// #included from: catch_legacy_reporter_adapter.h +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED + +namespace Catch +{ + // Deprecated + struct IReporter : IShared { + virtual ~IReporter(); + + virtual bool shouldRedirectStdout() const = 0; + + virtual void StartTesting() = 0; + virtual void EndTesting( Totals const& totals ) = 0; + virtual void StartGroup( std::string const& groupName ) = 0; + virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; + virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; + virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; + virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; + virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; + virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; + virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; + virtual void Aborted() = 0; + virtual void Result( AssertionResult const& result ) = 0; + }; + + class LegacyReporterAdapter : public SharedImpl + { + public: + LegacyReporterAdapter( Ptr const& legacyReporter ); + virtual ~LegacyReporterAdapter(); + + virtual ReporterPreferences getPreferences() const; + virtual void noMatchingTestCases( std::string const& ); + virtual void testRunStarting( TestRunInfo const& ); + virtual void testGroupStarting( GroupInfo const& groupInfo ); + virtual void testCaseStarting( TestCaseInfo const& testInfo ); + virtual void sectionStarting( SectionInfo const& sectionInfo ); + virtual void assertionStarting( AssertionInfo const& ); + virtual bool assertionEnded( AssertionStats const& assertionStats ); + virtual void sectionEnded( SectionStats const& sectionStats ); + virtual void testCaseEnded( TestCaseStats const& testCaseStats ); + virtual void testGroupEnded( TestGroupStats const& testGroupStats ); + virtual void testRunEnded( TestRunStats const& testRunStats ); + virtual void skipTest( TestCaseInfo const& ); + + private: + Ptr m_legacyReporter; + }; +} + +namespace Catch +{ + LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) + : m_legacyReporter( legacyReporter ) + {} + LegacyReporterAdapter::~LegacyReporterAdapter() {} + + ReporterPreferences LegacyReporterAdapter::getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); + return prefs; + } + + void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} + void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { + m_legacyReporter->StartTesting(); + } + void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { + m_legacyReporter->StartGroup( groupInfo.name ); + } + void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { + m_legacyReporter->StartTestCase( testInfo ); + } + void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { + m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); + } + void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { + // Not on legacy interface + } + + bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { + for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info ) { + ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); + rb << it->message; + rb.setResultType( ResultWas::Info ); + AssertionResult result = rb.build(); + m_legacyReporter->Result( result ); + } + } + } + m_legacyReporter->Result( assertionStats.assertionResult ); + return true; + } + void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { + if( sectionStats.missingAssertions ) + m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); + m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); + } + void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { + m_legacyReporter->EndTestCase + ( testCaseStats.testInfo, + testCaseStats.totals, + testCaseStats.stdOut, + testCaseStats.stdErr ); + } + void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { + if( testGroupStats.aborting ) + m_legacyReporter->Aborted(); + m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); + } + void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { + m_legacyReporter->EndTesting( testRunStats.totals ); + } + void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { + } +} + +// #included from: catch_timer.hpp + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#endif + +#ifdef CATCH_PLATFORM_WINDOWS + +#else + +#include + +#endif + +namespace Catch { + + namespace { +#ifdef CATCH_PLATFORM_WINDOWS + UInt64 getCurrentTicks() { + static UInt64 hz=0, hzo=0; + if (!hz) { + QueryPerformanceFrequency( reinterpret_cast( &hz ) ); + QueryPerformanceCounter( reinterpret_cast( &hzo ) ); + } + UInt64 t; + QueryPerformanceCounter( reinterpret_cast( &t ) ); + return ((t-hzo)*1000000)/hz; + } +#else + UInt64 getCurrentTicks() { + timeval t; + gettimeofday(&t,CATCH_NULL); + return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); + } +#endif + } + + void Timer::start() { + m_ticks = getCurrentTicks(); + } + unsigned int Timer::getElapsedMicroseconds() const { + return static_cast(getCurrentTicks() - m_ticks); + } + unsigned int Timer::getElapsedMilliseconds() const { + return static_cast(getElapsedMicroseconds()/1000); + } + double Timer::getElapsedSeconds() const { + return getElapsedMicroseconds()/1000000.0; + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +// #included from: catch_common.hpp +#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED + +#include +#include + +namespace Catch { + + bool startsWith( std::string const& s, std::string const& prefix ) { + return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); + } + bool startsWith( std::string const& s, char prefix ) { + return !s.empty() && s[0] == prefix; + } + bool endsWith( std::string const& s, std::string const& suffix ) { + return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); + } + bool endsWith( std::string const& s, char suffix ) { + return !s.empty() && s[s.size()-1] == suffix; + } + bool contains( std::string const& s, std::string const& infix ) { + return s.find( infix ) != std::string::npos; + } + char toLowerCh(char c) { + return static_cast( std::tolower( c ) ); + } + void toLowerInPlace( std::string& s ) { + std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); + } + std::string toLower( std::string const& s ) { + std::string lc = s; + toLowerInPlace( lc ); + return lc; + } + std::string trim( std::string const& str ) { + static char const* whitespaceChars = "\n\r\t "; + std::string::size_type start = str.find_first_not_of( whitespaceChars ); + std::string::size_type end = str.find_last_not_of( whitespaceChars ); + + return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); + } + + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { + bool replaced = false; + std::size_t i = str.find( replaceThis ); + while( i != std::string::npos ) { + replaced = true; + str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); + if( i < str.size()-withThis.size() ) + i = str.find( replaceThis, i+withThis.size() ); + else + i = std::string::npos; + } + return replaced; + } + + pluralise::pluralise( std::size_t count, std::string const& label ) + : m_count( count ), + m_label( label ) + {} + + std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { + os << pluraliser.m_count << ' ' << pluraliser.m_label; + if( pluraliser.m_count != 1 ) + os << 's'; + return os; + } + + SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} + SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) + : file( _file ), + line( _line ) + {} + bool SourceLineInfo::empty() const { + return file[0] == '\0'; + } + bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { + return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); + } + bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { + return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); + } + + void seedRng( IConfig const& config ) { + if( config.rngSeed() != 0 ) + std::srand( config.rngSeed() ); + } + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); + } + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { +#ifndef __GNUG__ + os << info.file << '(' << info.line << ')'; +#else + os << info.file << ':' << info.line; +#endif + return os; + } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { + std::ostringstream oss; + oss << locationInfo << ": Internal Catch error: '" << message << '\''; + if( alwaysTrue() ) + throw std::logic_error( oss.str() ); + } +} + +// #included from: catch_section.hpp +#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED + +namespace Catch { + + SectionInfo::SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description ) + : name( _name ), + description( _description ), + lineInfo( _lineInfo ) + {} + + Section::Section( SectionInfo const& info ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + { + m_timer.start(); + } + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 +#endif + Section::~Section() { + if( m_sectionIncluded ) { + SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); + if( std::uncaught_exception() ) + getResultCapture().sectionEndedEarly( endInfo ); + else + getResultCapture().sectionEnded( endInfo ); + } + } +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + + // This indicates whether the section should be executed or not + Section::operator bool() const { + return m_sectionIncluded; + } + +} // end namespace Catch + +// #included from: catch_debugger.hpp +#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED + +#ifdef CATCH_PLATFORM_MAC + + #include + #include + #include + #include + #include + + namespace Catch{ + + // The following function is taken directly from the following technical note: + // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html + + // Returns true if the current process is being debugged (either + // running under the debugger or has a debugger attached post facto). + bool isDebuggerActive(){ + + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { + Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + } + } // namespace Catch + +#elif defined(CATCH_PLATFORM_LINUX) + #include + #include + + namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } + } + + return false; + } + } // namespace Catch +#elif defined(_MSC_VER) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#else + namespace Catch { + inline bool isDebuggerActive() { return false; } + } +#endif // Platform + +#ifdef CATCH_PLATFORM_WINDOWS + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + ::OutputDebugStringA( text.c_str() ); + } + } +#else + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + Catch::cout() << text; + } + } +#endif // Platform + +// #included from: catch_tostring.hpp +#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED + +namespace Catch { + +namespace Detail { + + const std::string unprintableString = "{?}"; + + namespace { + const int hexThreshold = 255; + + struct Endianness { + enum Arch { Big, Little }; + + static Arch which() { + union _{ + int asInt; + char asChar[sizeof (int)]; + } u; + + u.asInt = 1; + return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; + } + }; + } + + std::string rawMemoryToString( const void *object, std::size_t size ) + { + // Reverse order for little endian architectures + int i = 0, end = static_cast( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; + } + + unsigned char const *bytes = static_cast(object); + std::ostringstream os; + os << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + os << std::setw(2) << static_cast(bytes[i]); + return os.str(); + } +} + +std::string toString( std::string const& value ) { + std::string s = value; + if( getCurrentContext().getConfig()->showInvisibles() ) { + for(size_t i = 0; i < s.size(); ++i ) { + std::string subs; + switch( s[i] ) { + case '\n': subs = "\\n"; break; + case '\t': subs = "\\t"; break; + default: break; + } + if( !subs.empty() ) { + s = s.substr( 0, i ) + subs + s.substr( i+1 ); + ++i; + } + } + } + return '"' + s + '"'; +} +std::string toString( std::wstring const& value ) { + + std::string s; + s.reserve( value.size() ); + for(size_t i = 0; i < value.size(); ++i ) + s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; + return Catch::toString( s ); +} + +std::string toString( const char* const value ) { + return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); +} + +std::string toString( char* const value ) { + return Catch::toString( static_cast( value ) ); +} + +std::string toString( const wchar_t* const value ) +{ + return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); +} + +std::string toString( wchar_t* const value ) +{ + return Catch::toString( static_cast( value ) ); +} + +std::string toString( int value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} + +std::string toString( unsigned long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} + +std::string toString( unsigned int value ) { + return Catch::toString( static_cast( value ) ); +} + +template +std::string fpToString( T value, int precision ) { + std::ostringstream oss; + oss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = oss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; +} + +std::string toString( const double value ) { + return fpToString( value, 10 ); +} +std::string toString( const float value ) { + return fpToString( value, 5 ) + 'f'; +} + +std::string toString( bool value ) { + return value ? "true" : "false"; +} + +std::string toString( char value ) { + if ( value == '\r' ) + return "'\\r'"; + if ( value == '\f' ) + return "'\\f'"; + if ( value == '\n' ) + return "'\\n'"; + if ( value == '\t' ) + return "'\\t'"; + if ( '\0' <= value && value < ' ' ) + return toString( static_cast( value ) ); + char chstr[] = "' '"; + chstr[1] = value; + return chstr; +} + +std::string toString( signed char value ) { + return toString( static_cast( value ) ); +} + +std::string toString( unsigned char value ) { + return toString( static_cast( value ) ); +} + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +std::string toString( unsigned long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +#endif + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ) { + return "nullptr"; +} +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSObject* const& nsObject ) { + return toString( [nsObject description] ); + } +#endif + +} // end namespace Catch + +// #included from: catch_result_builder.hpp +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED + +namespace Catch { + + ResultBuilder::ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition, + char const* secondArg ) + : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ), + m_shouldDebugBreak( false ), + m_shouldThrow( false ), + m_guardException( false ) + { + m_stream().oss.str(""); + } + + ResultBuilder::~ResultBuilder() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if ( m_guardException ) { + m_stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; + captureResult( ResultWas::ThrewException ); + getCurrentContext().getResultCapture()->exceptionEarlyReported(); + } +#endif + } + + ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { + m_data.resultType = result; + return *this; + } + ResultBuilder& ResultBuilder::setResultType( bool result ) { + m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; + return *this; + } + + void ResultBuilder::endExpression( DecomposedExpression const& expr ) { + AssertionResult result = build( expr ); + handleResult( result ); + } + + void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { + m_assertionInfo.resultDisposition = resultDisposition; + m_stream().oss << Catch::translateActiveException(); + captureResult( ResultWas::ThrewException ); + } + + void ResultBuilder::captureResult( ResultWas::OfType resultType ) { + setResultType( resultType ); + captureExpression(); + } + + void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { + if( expectedMessage.empty() ) + captureExpectedException( Matchers::Impl::MatchAllOf() ); + else + captureExpectedException( Matchers::Equals( expectedMessage ) ); + } + + void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase const& matcher ) { + + assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); + AssertionResultData data = m_data; + data.resultType = ResultWas::Ok; + data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + + std::string actualMessage = Catch::translateActiveException(); + if( !matcher.match( actualMessage ) ) { + data.resultType = ResultWas::ExpressionFailed; + data.reconstructedExpression = actualMessage; + } + AssertionResult result( m_assertionInfo, data ); + handleResult( result ); + } + + void ResultBuilder::captureExpression() { + AssertionResult result = build(); + handleResult( result ); + } + + void ResultBuilder::handleResult( AssertionResult const& result ) + { + getResultCapture().assertionEnded( result ); + + if( !result.isOk() ) { + if( getCurrentContext().getConfig()->shouldDebugBreak() ) + m_shouldDebugBreak = true; + if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) + m_shouldThrow = true; + } + } + + void ResultBuilder::react() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if (m_shouldDebugBreak) { + /////////////////////////////////////////////////////////////////// + // To inspect the state during test, you need to go one level up the callstack + // To go back to the test and change execution, jump over the throw statement + /////////////////////////////////////////////////////////////////// + CATCH_BREAK_INTO_DEBUGGER(); + } +#endif + if( m_shouldThrow ) + throw Catch::TestFailureException(); + } + + bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } + bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } + + AssertionResult ResultBuilder::build() const + { + return build( *this ); + } + + // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, + // a temporary DecomposedExpression, which in turn holds references to + // operands, possibly temporary as well. + // It should immediately be passed to handleResult; if the expression + // needs to be reported, its string expansion must be composed before + // the temporaries are destroyed. + AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const + { + assert( m_data.resultType != ResultWas::Unknown ); + AssertionResultData data = m_data; + + // Flip bool results if FalseTest flag is set + if( isFalseTest( m_assertionInfo.resultDisposition ) ) { + data.negate( expr.isBinaryExpression() ); + } + + data.message = m_stream().oss.str(); + data.decomposedExpression = &expr; // for lazy reconstruction + return AssertionResult( m_assertionInfo, data ); + } + + void ResultBuilder::reconstructExpression( std::string& dest ) const { + dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + } + + void ResultBuilder::setExceptionGuard() { + m_guardException = true; + } + void ResultBuilder::unsetExceptionGuard() { + m_guardException = false; + } + +} // end namespace Catch + +// #included from: catch_tag_alias_registry.hpp +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED + +namespace Catch { + + TagAliasRegistry::~TagAliasRegistry() {} + + Option TagAliasRegistry::find( std::string const& alias ) const { + std::map::const_iterator it = m_registry.find( alias ); + if( it != m_registry.end() ) + return it->second; + else + return Option(); + } + + std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { + std::string expandedTestSpec = unexpandedTestSpec; + for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); + it != itEnd; + ++it ) { + std::size_t pos = expandedTestSpec.find( it->first ); + if( pos != std::string::npos ) { + expandedTestSpec = expandedTestSpec.substr( 0, pos ) + + it->second.tag + + expandedTestSpec.substr( pos + it->first.size() ); + } + } + return expandedTestSpec; + } + + void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { + + if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { + std::ostringstream oss; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" + << Colour( Colour::FileName ) + << lineInfo << '\n'; + throw std::domain_error( oss.str().c_str() ); + } + if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { + std::ostringstream oss; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" already registered.\n" + << "\tFirst seen at " + << Colour( Colour::Red ) << find(alias)->lineInfo << '\n' + << Colour( Colour::Red ) << "\tRedefined at " + << Colour( Colour::FileName) << lineInfo << '\n'; + throw std::domain_error( oss.str().c_str() ); + } + } + + ITagAliasRegistry::~ITagAliasRegistry() {} + + ITagAliasRegistry const& ITagAliasRegistry::get() { + return getRegistryHub().getTagAliasRegistry(); + } + + RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { + getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo ); + } + +} // end namespace Catch + +// #included from: catch_matchers_string.hpp + +namespace Catch { +namespace Matchers { + + namespace StdString { + + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } + + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } + + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } + + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } + + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + } // namespace StdString + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + +} // namespace Matchers +} // namespace Catch +// #included from: ../reporters/catch_reporter_multi.hpp +#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED + +namespace Catch { + +class MultipleReporters : public SharedImpl { + typedef std::vector > Reporters; + Reporters m_reporters; + +public: + void add( Ptr const& reporter ) { + m_reporters.push_back( reporter ); + } + +public: // IStreamingReporter + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporters[0]->getPreferences(); + } + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->noMatchingTestCases( spec ); + } + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunStarting( testRunInfo ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupStarting( groupInfo ); + } + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseStarting( testInfo ); + } + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionStarting( sectionInfo ); + } + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->assertionStarting( assertionInfo ); + } + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + bool clearBuffer = false; + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + clearBuffer |= (*it)->assertionEnded( assertionStats ); + return clearBuffer; + } + + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionEnded( sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupEnded( testGroupStats ); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunEnded( testRunStats ); + } + + virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->skipTest( testInfo ); + } + + virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { + return this; + } + +}; + +Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { + Ptr resultingReporter; + + if( existingReporter ) { + MultipleReporters* multi = existingReporter->tryAsMulti(); + if( !multi ) { + multi = new MultipleReporters; + resultingReporter = Ptr( multi ); + if( existingReporter ) + multi->add( existingReporter ); + } + else + resultingReporter = existingReporter; + multi->add( additionalReporter ); + } + else + resultingReporter = additionalReporter; + + return resultingReporter; +} + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_xml.hpp +#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED + +// #included from: catch_reporter_bases.hpp +#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + namespace { + // Because formatting using c++ streams is stateful, drop down to C is required + // Alternatively we could use stringstream, but its performance is... not good. + std::string getFormattedDuration( double duration ) { + // Max exponent + 1 is required to represent the whole part + // + 1 for decimal point + // + 3 for the 3 decimal places + // + 1 for null terminator + const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; + char buffer[maxDoubleSize]; + + // Save previous errno, to prevent sprintf from overwriting it + ErrnoGuard guard; +#ifdef _MSC_VER + sprintf_s(buffer, "%.3f", duration); +#else + sprintf(buffer, "%.3f", duration); +#endif + return std::string(buffer); + } + } + + struct StreamingReporterBase : SharedImpl { + + StreamingReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + } + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } + + virtual ~StreamingReporterBase() CATCH_OVERRIDE; + + virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} + + virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { + currentTestRunInfo = _testRunInfo; + } + virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { + currentGroupInfo = _groupInfo; + } + + virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { + currentTestCaseInfo = _testInfo; + } + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { + m_sectionStack.push_back( _sectionInfo ); + } + + virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { + currentTestCaseInfo.reset(); + } + virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { + currentGroupInfo.reset(); + } + virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { + currentTestCaseInfo.reset(); + currentGroupInfo.reset(); + currentTestRunInfo.reset(); + } + + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { + // Don't do anything with this by default. + // It can optionally be overridden in the derived class. + } + + Ptr m_config; + std::ostream& stream; + + LazyStat currentTestRunInfo; + LazyStat currentGroupInfo; + LazyStat currentTestCaseInfo; + + std::vector m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + struct CumulativeReporterBase : SharedImpl { + template + struct Node : SharedImpl<> { + explicit Node( T const& _value ) : value( _value ) {} + virtual ~Node() {} + + typedef std::vector > ChildNodes; + T value; + ChildNodes children; + }; + struct SectionNode : SharedImpl<> { + explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} + virtual ~SectionNode(); + + bool operator == ( SectionNode const& other ) const { + return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; + } + bool operator == ( Ptr const& other ) const { + return operator==( *other ); + } + + SectionStats stats; + typedef std::vector > ChildSections; + typedef std::vector Assertions; + ChildSections childSections; + Assertions assertions; + std::string stdOut; + std::string stdErr; + }; + + struct BySectionInfo { + BySectionInfo( SectionInfo const& other ) : m_other( other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + bool operator() ( Ptr const& node ) const { + return node->stats.sectionInfo.lineInfo == m_other.lineInfo; + } + private: + void operator=( BySectionInfo const& ); + SectionInfo const& m_other; + }; + + typedef Node TestCaseNode; + typedef Node TestGroupNode; + typedef Node TestRunNode; + + CumulativeReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + } + ~CumulativeReporterBase(); + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } + + virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} + virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} + + virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); + Ptr node; + if( m_sectionStack.empty() ) { + if( !m_rootSection ) + m_rootSection = new SectionNode( incompleteStats ); + node = m_rootSection; + } + else { + SectionNode& parentNode = *m_sectionStack.back(); + SectionNode::ChildSections::const_iterator it = + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); + if( it == parentNode.childSections.end() ) { + node = new SectionNode( incompleteStats ); + parentNode.childSections.push_back( node ); + } + else + node = *it; + } + m_sectionStack.push_back( node ); + m_deepestSection = node; + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} + + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + assert( !m_sectionStack.empty() ); + SectionNode& sectionNode = *m_sectionStack.back(); + sectionNode.assertions.push_back( assertionStats ); + // AssertionResult holds a pointer to a temporary DecomposedExpression, + // which getExpandedExpression() calls to build the expression string. + // Our section stack copy of the assertionResult will likely outlive the + // temporary, so it must be expanded or discarded now to avoid calling + // a destroyed object later. + prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); + return true; + } + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + assert( !m_sectionStack.empty() ); + SectionNode& node = *m_sectionStack.back(); + node.stats = sectionStats; + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + Ptr node = new TestCaseNode( testCaseStats ); + assert( m_sectionStack.size() == 0 ); + node->children.push_back( m_rootSection ); + m_testCases.push_back( node ); + m_rootSection.reset(); + + assert( m_deepestSection ); + m_deepestSection->stdOut = testCaseStats.stdOut; + m_deepestSection->stdErr = testCaseStats.stdErr; + } + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + Ptr node = new TestGroupNode( testGroupStats ); + node->children.swap( m_testCases ); + m_testGroups.push_back( node ); + } + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + Ptr node = new TestRunNode( testRunStats ); + node->children.swap( m_testGroups ); + m_testRuns.push_back( node ); + testRunEndedCumulative(); + } + virtual void testRunEndedCumulative() = 0; + + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void prepareExpandedExpression( AssertionResult& result ) const { + if( result.isOk() ) + result.discardDecomposedExpression(); + else + result.expandDecomposedExpression(); + } + + Ptr m_config; + std::ostream& stream; + std::vector m_assertions; + std::vector > > m_sections; + std::vector > m_testCases; + std::vector > m_testGroups; + + std::vector > m_testRuns; + + Ptr m_rootSection; + Ptr m_deepestSection; + std::vector > m_sectionStack; + ReporterPreferences m_reporterPrefs; + + }; + + template + char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + struct TestEventListenerBase : StreamingReporterBase { + TestEventListenerBase( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} + virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { + return false; + } + }; + +} // end namespace Catch + +// #included from: ../internal/catch_reporter_registrars.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED + +namespace Catch { + + template + class LegacyReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new LegacyReporterAdapter( new T( config ) ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + LegacyReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; + + template + class ReporterRegistrar { + + class ReporterFactory : public SharedImpl { + + // *** Please Note ***: + // - If you end up here looking at a compiler error because it's trying to register + // your custom reporter class be aware that the native reporter interface has changed + // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via + // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. + // However please consider updating to the new interface as the old one is now + // deprecated and will probably be removed quite soon! + // Please contact me via github if you have any questions at all about this. + // In fact, ideally, please contact me anyway to let me know you've hit this - as I have + // no idea who is actually using custom reporters at all (possibly no-one!). + // The new interface is designed to minimise exposure to interface changes in the future. + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + ReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; + + template + class ListenerRegistrar { + + class ListenerFactory : public SharedImpl { + + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + virtual std::string getDescription() const { + return std::string(); + } + }; + + public: + + ListenerRegistrar() { + getMutableRegistryHub().registerListener( new ListenerFactory() ); + } + }; +} + +#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ + namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } + +#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ + namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } + +// Deprecated - use the form without INTERNAL_ +#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } + +#define CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } + +// #included from: ../internal/catch_xmlwriter.hpp +#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + class XmlEncode { + public: + enum ForWhat { ForTextNodes, ForAttributes }; + + XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) + : m_str( str ), + m_forWhat( forWhat ) + {} + + void encodeTo( std::ostream& os ) const { + + // Apostrophe escaping not necessary if we always use " to write attributes + // (see: http://www.w3.org/TR/xml/#syntax) + + for( std::size_t i = 0; i < m_str.size(); ++ i ) { + char c = m_str[i]; + switch( c ) { + case '<': os << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) + os << ">"; + else + os << c; + break; + + case '\"': + if( m_forWhat == ForAttributes ) + os << """; + else + os << c; + break; + + default: + // Escape control chars - based on contribution by @espenalb in PR #465 and + // by @mrpi PR #588 + if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) { + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast( c ); + } + else + os << c; + } + } + } + + friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { + xmlEncode.encodeTo( os ); + return os; + } + + private: + std::string m_str; + ForWhat m_forWhat; + }; + + class XmlWriter { + public: + + class ScopedElement { + public: + ScopedElement( XmlWriter* writer ) + : m_writer( writer ) + {} + + ScopedElement( ScopedElement const& other ) + : m_writer( other.m_writer ){ + other.m_writer = CATCH_NULL; + } + + ~ScopedElement() { + if( m_writer ) + m_writer->endElement(); + } + + ScopedElement& writeText( std::string const& text, bool indent = true ) { + m_writer->writeText( text, indent ); + return *this; + } + + template + ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { + m_writer->writeAttribute( name, attribute ); + return *this; + } + + private: + mutable XmlWriter* m_writer; + }; + + XmlWriter() + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( Catch::cout() ) + { + writeDeclaration(); + } + + XmlWriter( std::ostream& os ) + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( os ) + { + writeDeclaration(); + } + + ~XmlWriter() { + while( !m_tags.empty() ) + endElement(); + } + + XmlWriter& startElement( std::string const& name ) { + ensureTagClosed(); + newlineIfNecessary(); + m_os << m_indent << '<' << name; + m_tags.push_back( name ); + m_indent += " "; + m_tagIsOpen = true; + return *this; + } + + ScopedElement scopedElement( std::string const& name ) { + ScopedElement scoped( this ); + startElement( name ); + return scoped; + } + + XmlWriter& endElement() { + newlineIfNecessary(); + m_indent = m_indent.substr( 0, m_indent.size()-2 ); + if( m_tagIsOpen ) { + m_os << "/>"; + m_tagIsOpen = false; + } + else { + m_os << m_indent << ""; + } + m_os << std::endl; + m_tags.pop_back(); + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { + if( !name.empty() && !attribute.empty() ) + m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, bool attribute ) { + m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; + return *this; + } + + template + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + std::ostringstream oss; + oss << attribute; + return writeAttribute( name, oss.str() ); + } + + XmlWriter& writeText( std::string const& text, bool indent = true ) { + if( !text.empty() ){ + bool tagWasOpen = m_tagIsOpen; + ensureTagClosed(); + if( tagWasOpen && indent ) + m_os << m_indent; + m_os << XmlEncode( text ); + m_needsNewline = true; + } + return *this; + } + + XmlWriter& writeComment( std::string const& text ) { + ensureTagClosed(); + m_os << m_indent << ""; + m_needsNewline = true; + return *this; + } + + void writeStylesheetRef( std::string const& url ) { + m_os << "\n"; + } + + XmlWriter& writeBlankLine() { + ensureTagClosed(); + m_os << '\n'; + return *this; + } + + void ensureTagClosed() { + if( m_tagIsOpen ) { + m_os << ">" << std::endl; + m_tagIsOpen = false; + } + } + + private: + XmlWriter( XmlWriter const& ); + void operator=( XmlWriter const& ); + + void writeDeclaration() { + m_os << "\n"; + } + + void newlineIfNecessary() { + if( m_needsNewline ) { + m_os << std::endl; + m_needsNewline = false; + } + } + + bool m_tagIsOpen; + bool m_needsNewline; + std::vector m_tags; + std::string m_indent; + std::ostream& m_os; + }; + +} + +namespace Catch { + class XmlReporter : public StreamingReporterBase { + public: + XmlReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_xml(_config.stream()), + m_sectionDepth( 0 ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + virtual ~XmlReporter() CATCH_OVERRIDE; + + static std::string getDescription() { + return "Reports test results as an XML document"; + } + + virtual std::string getStylesheetRef() const { + return std::string(); + } + + void writeSourceInfo( SourceLineInfo const& sourceInfo ) { + m_xml + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); + } + + public: // StreamingReporterBase + + virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { + StreamingReporterBase::noMatchingTestCases( s ); + } + + virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testRunStarting( testInfo ); + std::string stylesheetRef = getStylesheetRef(); + if( !stylesheetRef.empty() ) + m_xml.writeStylesheetRef( stylesheetRef ); + m_xml.startElement( "Catch" ); + if( !m_config->name().empty() ) + m_xml.writeAttribute( "name", m_config->name() ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupStarting( groupInfo ); + m_xml.startElement( "Group" ) + .writeAttribute( "name", groupInfo.name ); + } + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseStarting(testInfo); + m_xml.startElement( "TestCase" ) + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString ); + + writeSourceInfo( testInfo.lineInfo ); + + if ( m_config->showDurations() == ShowDurations::Always ) + m_testCaseTimer.start(); + m_xml.ensureTagClosed(); + } + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + StreamingReporterBase::sectionStarting( sectionInfo ); + if( m_sectionDepth++ > 0 ) { + m_xml.startElement( "Section" ) + .writeAttribute( "name", trim( sectionInfo.name ) ) + .writeAttribute( "description", sectionInfo.description ); + writeSourceInfo( sectionInfo.lineInfo ); + m_xml.ensureTagClosed(); + } + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } + + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + + AssertionResult const& result = assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + if( includeResults ) { + // Print any info messages in tags. + for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info ) { + m_xml.scopedElement( "Info" ) + .writeText( it->message ); + } else if ( it->type == ResultWas::Warning ) { + m_xml.scopedElement( "Warning" ) + .writeText( it->message ); + } + } + } + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return true; + + // Print the expression if there is one. + if( result.hasExpression() ) { + m_xml.startElement( "Expression" ) + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); + + writeSourceInfo( result.getSourceInfo() ); + + m_xml.scopedElement( "Original" ) + .writeText( result.getExpression() ); + m_xml.scopedElement( "Expanded" ) + .writeText( result.getExpandedExpression() ); + } + + // And... Print a result applicable to each result type. + switch( result.getResultType() ) { + case ResultWas::ThrewException: + m_xml.startElement( "Exception" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::FatalErrorCondition: + m_xml.startElement( "FatalErrorCondition" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::Info: + m_xml.scopedElement( "Info" ) + .writeText( result.getMessage() ); + break; + case ResultWas::Warning: + // Warning will already have been written + break; + case ResultWas::ExplicitFailure: + m_xml.startElement( "Failure" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + default: + break; + } + + if( result.hasExpression() ) + m_xml.endElement(); + + return true; + } + + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + StreamingReporterBase::sectionEnded( sectionStats ); + if( --m_sectionDepth > 0 ) { + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); + e.writeAttribute( "successes", sectionStats.assertions.passed ); + e.writeAttribute( "failures", sectionStats.assertions.failed ); + e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); + + m_xml.endElement(); + } + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseEnded( testCaseStats ); + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); + e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); + + m_xml.endElement(); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupEnded( testGroupStats ); + // TODO: Check testGroupStats.aborting and act accordingly. + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + StreamingReporterBase::testRunEnded( testRunStats ); + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + private: + Timer m_testCaseTimer; + XmlWriter m_xml; + int m_sectionDepth; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_junit.hpp +#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED + +#include + +namespace Catch { + + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + } + + class JunitReporter : public CumulativeReporterBase { + public: + JunitReporter( ReporterConfig const& _config ) + : CumulativeReporterBase( _config ), + xml( _config.stream() ), + m_okToFail( false ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + virtual ~JunitReporter() CATCH_OVERRIDE; + + static std::string getDescription() { + return "Reports test results in an XML format that looks like Ant's junitreport target"; + } + + virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} + + virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { + CumulativeReporterBase::testRunStarting( runInfo ); + xml.startElement( "testsuites" ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + suiteTimer.start(); + stdOutForSuite.str(""); + stdErrForSuite.str(""); + unexpectedExceptions = 0; + CumulativeReporterBase::testGroupStarting( groupInfo ); + } + + virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE { + m_okToFail = testCaseInfo.okToFail(); + } + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) + unexpectedExceptions++; + return CumulativeReporterBase::assertionEnded( assertionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + stdOutForSuite << testCaseStats.stdOut; + stdErrForSuite << testCaseStats.stdErr; + CumulativeReporterBase::testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + double suiteTime = suiteTimer.getElapsedSeconds(); + CumulativeReporterBase::testGroupEnded( testGroupStats ); + writeGroup( *m_testGroups.back(), suiteTime ); + } + + virtual void testRunEndedCumulative() CATCH_OVERRIDE { + xml.endElement(); + } + + void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); + TestGroupStats const& stats = groupNode.value; + xml.writeAttribute( "name", stats.groupInfo.name ); + xml.writeAttribute( "errors", unexpectedExceptions ); + xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); + xml.writeAttribute( "tests", stats.totals.assertions.total() ); + xml.writeAttribute( "hostname", "tbd" ); // !TBD + if( m_config->showDurations() == ShowDurations::Never ) + xml.writeAttribute( "time", "" ); + else + xml.writeAttribute( "time", suiteTime ); + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); + + // Write test cases + for( TestGroupNode::ChildNodes::const_iterator + it = groupNode.children.begin(), itEnd = groupNode.children.end(); + it != itEnd; + ++it ) + writeTestCase( **it ); + + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); + } + + void writeTestCase( TestCaseNode const& testCaseNode ) { + TestCaseStats const& stats = testCaseNode.value; + + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert( testCaseNode.children.size() == 1 ); + SectionNode const& rootSection = *testCaseNode.children.front(); + + std::string className = stats.testInfo.className; + + if( className.empty() ) { + if( rootSection.childSections.empty() ) + className = "global"; + } + writeSection( className, "", rootSection ); + } + + void writeSection( std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode ) { + std::string name = trim( sectionNode.stats.sectionInfo.name ); + if( !rootName.empty() ) + name = rootName + '/' + name; + + if( !sectionNode.assertions.empty() || + !sectionNode.stdOut.empty() || + !sectionNode.stdErr.empty() ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); + if( className.empty() ) { + xml.writeAttribute( "classname", name ); + xml.writeAttribute( "name", "root" ); + } + else { + xml.writeAttribute( "classname", className ); + xml.writeAttribute( "name", name ); + } + xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); + + writeAssertions( sectionNode ); + + if( !sectionNode.stdOut.empty() ) + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); + if( !sectionNode.stdErr.empty() ) + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); + } + for( SectionNode::ChildSections::const_iterator + it = sectionNode.childSections.begin(), + itEnd = sectionNode.childSections.end(); + it != itEnd; + ++it ) + if( className.empty() ) + writeSection( name, "", **it ); + else + writeSection( className, name, **it ); + } + + void writeAssertions( SectionNode const& sectionNode ) { + for( SectionNode::Assertions::const_iterator + it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); + it != itEnd; + ++it ) + writeAssertion( *it ); + } + void writeAssertion( AssertionStats const& stats ) { + AssertionResult const& result = stats.assertionResult; + if( !result.isOk() ) { + std::string elementName; + switch( result.getResultType() ) { + case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + elementName = "failure"; + break; + case ResultWas::ExpressionFailed: + elementName = "failure"; + break; + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + + XmlWriter::ScopedElement e = xml.scopedElement( elementName ); + + xml.writeAttribute( "message", result.getExpandedExpression() ); + xml.writeAttribute( "type", result.getTestMacroName() ); + + std::ostringstream oss; + if( !result.getMessage().empty() ) + oss << result.getMessage() << '\n'; + for( std::vector::const_iterator + it = stats.infoMessages.begin(), + itEnd = stats.infoMessages.end(); + it != itEnd; + ++it ) + if( it->type == ResultWas::Info ) + oss << it->message << '\n'; + + oss << "at " << result.getSourceInfo(); + xml.writeText( oss.str(), false ); + } + } + + XmlWriter xml; + Timer suiteTimer; + std::ostringstream stdOutForSuite; + std::ostringstream stdErrForSuite; + unsigned int unexpectedExceptions; + bool m_okToFail; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_console.hpp +#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED + +#include +#include + +namespace Catch { + + struct ConsoleReporter : StreamingReporterBase { + ConsoleReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_headerPrinted( false ) + {} + + virtual ~ConsoleReporter() CATCH_OVERRIDE; + static std::string getDescription() { + return "Reports test results as plain lines of text"; + } + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { + } + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { + AssertionResult const& result = _assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return false; + + lazyPrint(); + + AssertionPrinter printer( stream, _assertionStats, includeResults ); + printer.print(); + stream << std::endl; + return true; + } + + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { + m_headerPrinted = false; + StreamingReporterBase::sectionStarting( _sectionInfo ); + } + virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { + if( _sectionStats.missingAssertions ) { + lazyPrint(); + Colour colour( Colour::ResultError ); + if( m_sectionStack.size() > 1 ) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + if( m_config->showDurations() == ShowDurations::Always ) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + if( m_headerPrinted ) { + m_headerPrinted = false; + } + StreamingReporterBase::sectionEnded( _sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseEnded( _testCaseStats ); + m_headerPrinted = false; + } + virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { + if( currentGroupInfo.used ) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals( _testGroupStats.totals ); + stream << '\n' << std::endl; + } + StreamingReporterBase::testGroupEnded( _testGroupStats ); + } + virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { + printTotalsDivider( _testRunStats.totals ); + printTotals( _testRunStats.totals ); + stream << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ), + stats( _stats ), + result( _stats.assertionResult ), + colour( Colour::None ), + message( result.getMessage() ), + messages( _stats.infoMessages ), + printInfoMessages( _printInfoMessages ) + { + switch( result.getResultType() ) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } + else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if( _stats.infoMessages.size() == 1 ) + messageLabel = "explicitly with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } + + void print() const { + printSourceInfo(); + if( stats.totals.assertions.total() > 0 ) { + if( result.isOk() ) + stream << '\n'; + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } + else { + stream << '\n'; + } + printMessage(); + } + + private: + void printResultType() const { + if( !passOrFail.empty() ) { + Colour colourGuard( colour ); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if( result.hasExpression() ) { + Colour colourGuard( Colour::OriginalExpression ); + stream << " "; + stream << result.getExpressionInMacro(); + stream << '\n'; + } + } + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + stream << "with expansion:\n"; + Colour colourGuard( Colour::ReconstructedExpression ); + stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; + } + } + void printMessage() const { + if( !messageLabel.empty() ) + stream << messageLabel << ':' << '\n'; + for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); + it != itEnd; + ++it ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || it->type != ResultWas::Info ) + stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; + } + } + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ": "; + } + + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector messages; + bool printInfoMessages; + }; + + void lazyPrint() { + + if( !currentTestRunInfo.used ) + lazyPrintRunInfo(); + if( !currentGroupInfo.used ) + lazyPrintGroupInfo(); + + if( !m_headerPrinted ) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } + } + void lazyPrintRunInfo() { + stream << '\n' << getLineOfChars<'~'>() << '\n'; + Colour colour( Colour::SecondaryText ); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion() << " host application.\n" + << "Run with -? for options\n\n"; + + if( m_config->rngSeed() != 0 ) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + + currentTestRunInfo.used = true; + } + void lazyPrintGroupInfo() { + if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { + printClosedHeader( "Group: " + currentGroupInfo->name ); + currentGroupInfo.used = true; + } + } + void printTestCaseAndSectionHeader() { + assert( !m_sectionStack.empty() ); + printOpenHeader( currentTestCaseInfo->name ); + + if( m_sectionStack.size() > 1 ) { + Colour colourGuard( Colour::Headers ); + + std::vector::const_iterator + it = m_sectionStack.begin()+1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for( ; it != itEnd; ++it ) + printHeaderString( it->name, 2 ); + } + + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; + + if( !lineInfo.empty() ){ + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard( Colour::FileName ); + stream << lineInfo << '\n'; + } + stream << getLineOfChars<'.'>() << '\n' << std::endl; + } + + void printClosedHeader( std::string const& _name ) { + printOpenHeader( _name ); + stream << getLineOfChars<'.'>() << '\n'; + } + void printOpenHeader( std::string const& _name ) { + stream << getLineOfChars<'-'>() << '\n'; + { + Colour colourGuard( Colour::Headers ); + printHeaderString( _name ); + } + } + + // if string has a : in first line will set indent to follow it on + // subsequent lines + void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { + std::size_t i = _string.find( ": " ); + if( i != std::string::npos ) + i+=2; + else + i = 0; + stream << Text( _string, TextAttributes() + .setIndent( indent+i) + .setInitialIndent( indent ) ) << '\n'; + } + + struct SummaryColumn { + + SummaryColumn( std::string const& _label, Colour::Code _colour ) + : label( _label ), + colour( _colour ) + {} + SummaryColumn addRow( std::size_t count ) { + std::ostringstream oss; + oss << count; + std::string row = oss.str(); + for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { + while( it->size() < row.size() ) + *it = ' ' + *it; + while( it->size() > row.size() ) + row = ' ' + row; + } + rows.push_back( row ); + return *this; + } + + std::string label; + Colour::Code colour; + std::vector rows; + + }; + + void printTotals( Totals const& totals ) { + if( totals.testCases.total() == 0 ) { + stream << Colour( Colour::Warning ) << "No tests ran\n"; + } + else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { + stream << Colour( Colour::ResultSuccess ) << "All tests passed"; + stream << " (" + << pluralise( totals.assertions.passed, "assertion" ) << " in " + << pluralise( totals.testCases.passed, "test case" ) << ')' + << '\n'; + } + else { + + std::vector columns; + columns.push_back( SummaryColumn( "", Colour::None ) + .addRow( totals.testCases.total() ) + .addRow( totals.assertions.total() ) ); + columns.push_back( SummaryColumn( "passed", Colour::Success ) + .addRow( totals.testCases.passed ) + .addRow( totals.assertions.passed ) ); + columns.push_back( SummaryColumn( "failed", Colour::ResultError ) + .addRow( totals.testCases.failed ) + .addRow( totals.assertions.failed ) ); + columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) + .addRow( totals.testCases.failedButOk ) + .addRow( totals.assertions.failedButOk ) ); + + printSummaryRow( "test cases", columns, 0 ); + printSummaryRow( "assertions", columns, 1 ); + } + } + void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { + for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { + std::string value = it->rows[row]; + if( it->label.empty() ) { + stream << label << ": "; + if( value != "0" ) + stream << value; + else + stream << Colour( Colour::Warning ) << "- none -"; + } + else if( value != "0" ) { + stream << Colour( Colour::LightGrey ) << " | "; + stream << Colour( it->colour ) + << value << ' ' << it->label; + } + } + stream << '\n'; + } + + static std::size_t makeRatio( std::size_t number, std::size_t total ) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; + return ( ratio == 0 && number > 0 ) ? 1 : ratio; + } + static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { + if( i > j && i > k ) + return i; + else if( j > k ) + return j; + else + return k; + } + + void printTotalsDivider( Totals const& totals ) { + if( totals.testCases.total() > 0 ) { + std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); + std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); + std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); + while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )++; + while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )--; + + stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); + stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); + if( totals.testCases.allPassed() ) + stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); + else + stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); + } + else { + stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); + } + stream << '\n'; + } + void printSummaryDivider() { + stream << getLineOfChars<'-'>() << '\n'; + } + + private: + bool m_headerPrinted; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_compact.hpp +#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED + +namespace Catch { + + struct CompactReporter : StreamingReporterBase { + + CompactReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual ~CompactReporter(); + + static std::string getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } + + virtual ReporterPreferences getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = false; + return prefs; + } + + virtual void noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) {} + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + + stream << std::endl; + return true; + } + + virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE { + if (m_config->showDurations() == ShowDurations::Always) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + } + + virtual void testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( _testRunStats.totals ); + stream << '\n' << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ) + , stats( _stats ) + , result( _stats.assertionResult ) + , messages( _stats.infoMessages ) + , itMessage( _stats.infoMessages.begin() ) + , printInfoMessages( _printInfoMessages ) + {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch( result.getResultType() ) { + case ResultWas::Ok: + printResultType( Colour::ResultSuccess, passedString() ); + printOriginalExpression(); + printReconstructedExpression(); + if ( ! result.hasExpression() ) + printRemainingMessages( Colour::None ); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) + printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); + else + printResultType( Colour::Error, failedString() ); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType( Colour::Error, failedString() ); + printIssue( "unexpected exception with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType( Colour::Error, failedString() ); + printIssue( "fatal error condition with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType( Colour::Error, failedString() ); + printIssue( "expected exception, got none" ); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType( Colour::None, "info" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType( Colour::None, "warning" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType( Colour::Error, failedString() ); + printIssue( "explicitly" ); + printRemainingMessages( Colour::None ); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType( Colour::Error, "** internal error **" ); + break; + } + } + + private: + // Colour::LightGrey + + static Colour::Code dimColour() { return Colour::FileName; } + +#ifdef CATCH_PLATFORM_MAC + static const char* failedString() { return "FAILED"; } + static const char* passedString() { return "PASSED"; } +#else + static const char* failedString() { return "failed"; } + static const char* passedString() { return "passed"; } +#endif + + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ':'; + } + + void printResultType( Colour::Code colour, std::string const& passOrFail ) const { + if( !passOrFail.empty() ) { + { + Colour colourGuard( colour ); + stream << ' ' << passOrFail; + } + stream << ':'; + } + } + + void printIssue( std::string const& issue ) const { + stream << ' ' << issue; + } + + void printExpressionWas() { + if( result.hasExpression() ) { + stream << ';'; + { + Colour colour( dimColour() ); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if( result.hasExpression() ) { + stream << ' ' << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + { + Colour colour( dimColour() ); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if ( itMessage != messages.end() ) { + stream << " '" << itMessage->message << '\''; + ++itMessage; + } + } + + void printRemainingMessages( Colour::Code colour = dimColour() ) { + if ( itMessage == messages.end() ) + return; + + // using messages.end() directly yields compilation error: + std::vector::const_iterator itEnd = messages.end(); + const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); + + { + Colour colourGuard( colour ); + stream << " with " << pluralise( N, "message" ) << ':'; + } + + for(; itMessage != itEnd; ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || itMessage->type != ResultWas::Info ) { + stream << " '" << itMessage->message << '\''; + if ( ++itMessage != itEnd ) { + Colour colourGuard( dimColour() ); + stream << " and"; + } + } + } + } + + private: + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + std::vector messages; + std::vector::const_iterator itMessage; + bool printInfoMessages; + }; + + // Colour, message variants: + // - white: No tests ran. + // - red: Failed [both/all] N test cases, failed [both/all] M assertions. + // - white: Passed [both/all] N test cases (no assertions). + // - red: Failed N tests cases, failed M assertions. + // - green: Passed [both/all] N tests cases with M assertions. + + std::string bothOrAll( std::size_t count ) const { + return count == 1 ? std::string() : count == 2 ? "both " : "all " ; + } + + void printTotals( const Totals& totals ) const { + if( totals.testCases.total() == 0 ) { + stream << "No tests ran."; + } + else if( totals.testCases.failed == totals.testCases.total() ) { + Colour colour( Colour::ResultError ); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll( totals.assertions.failed ) : std::string(); + stream << + "Failed " << bothOrAll( totals.testCases.failed ) + << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << qualify_assertions_failed << + pluralise( totals.assertions.failed, "assertion" ) << '.'; + } + else if( totals.assertions.total() == 0 ) { + stream << + "Passed " << bothOrAll( totals.testCases.total() ) + << pluralise( totals.testCases.total(), "test case" ) + << " (no assertions)."; + } + else if( totals.assertions.failed ) { + Colour colour( Colour::ResultError ); + stream << + "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; + } + else { + Colour colour( Colour::ResultSuccess ); + stream << + "Passed " << bothOrAll( totals.testCases.passed ) + << pluralise( totals.testCases.passed, "test case" ) << + " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; + } + } + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) + +} // end namespace Catch + +namespace Catch { + // These are all here to avoid warnings about not having any out of line + // virtual methods + NonCopyable::~NonCopyable() {} + IShared::~IShared() {} + IStream::~IStream() CATCH_NOEXCEPT {} + FileStream::~FileStream() CATCH_NOEXCEPT {} + CoutStream::~CoutStream() CATCH_NOEXCEPT {} + DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} + StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} + IContext::~IContext() {} + IResultCapture::~IResultCapture() {} + ITestCase::~ITestCase() {} + ITestCaseRegistry::~ITestCaseRegistry() {} + IRegistryHub::~IRegistryHub() {} + IMutableRegistryHub::~IMutableRegistryHub() {} + IExceptionTranslator::~IExceptionTranslator() {} + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} + IReporter::~IReporter() {} + IReporterFactory::~IReporterFactory() {} + IReporterRegistry::~IReporterRegistry() {} + IStreamingReporter::~IStreamingReporter() {} + AssertionStats::~AssertionStats() {} + SectionStats::~SectionStats() {} + TestCaseStats::~TestCaseStats() {} + TestGroupStats::~TestGroupStats() {} + TestRunStats::~TestRunStats() {} + CumulativeReporterBase::SectionNode::~SectionNode() {} + CumulativeReporterBase::~CumulativeReporterBase() {} + + StreamingReporterBase::~StreamingReporterBase() {} + ConsoleReporter::~ConsoleReporter() {} + CompactReporter::~CompactReporter() {} + IRunner::~IRunner() {} + IMutableContext::~IMutableContext() {} + IConfig::~IConfig() {} + XmlReporter::~XmlReporter() {} + JunitReporter::~JunitReporter() {} + TestRegistry::~TestRegistry() {} + FreeFunctionTestCase::~FreeFunctionTestCase() {} + IGeneratorInfo::~IGeneratorInfo() {} + IGeneratorsForTest::~IGeneratorsForTest() {} + WildcardPattern::~WildcardPattern() {} + TestSpec::Pattern::~Pattern() {} + TestSpec::NamePattern::~NamePattern() {} + TestSpec::TagPattern::~TagPattern() {} + TestSpec::ExcludedPattern::~ExcludedPattern() {} + Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {} + + void Config::dummy() {} + + namespace TestCaseTracking { + ITracker::~ITracker() {} + TrackerBase::~TrackerBase() {} + SectionTracker::~SectionTracker() {} + IndexTracker::~IndexTracker() {} + } +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#endif + +#ifdef CATCH_CONFIG_MAIN +// #included from: internal/catch_default_main.hpp +#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED + +#ifndef __OBJC__ + +#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +// Standard C/C++ Win32 Unicode wmain entry point +extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +#else +// Standard C/C++ main entry point +int main (int argc, char * argv[]) { +#endif + + int result = Catch::Session().run( argc, argv ); + return ( result < 0xff ? result : 0xff ); +} + +#else // __OBJC__ + +// Objective-C entry point +int main (int argc, char * const argv[]) { +#if !CATCH_ARC_ENABLED + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; +#endif + + Catch::registerTestMethods(); + int result = Catch::Session().run( argc, (char* const*)argv ); + +#if !CATCH_ARC_ENABLED + [pool drain]; +#endif + + return ( result < 0xff ? result : 0xff ); +} + +#endif // __OBJC__ + +#endif + +#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED +# undef CLARA_CONFIG_MAIN +#endif + +////// + +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#else +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif + +#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) + +#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) + +#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) + +#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) +#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) + #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) + #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) + #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) + #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) + #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) + #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#else + #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) + #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) +#endif +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) +#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) +#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) +#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) +#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) +#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) + +#else +#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif + +#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) + +#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) + +#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) + +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) +#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#else +#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) + #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) +#endif +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) +#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) +#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) +#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) +#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) +#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) + +using Catch::Detail::Approx; + +// #included from: internal/catch_reenable_warnings.h + +#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(pop) +# else +# pragma clang diagnostic pop +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic pop +#endif + +#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + diff --git a/bottleneck/include/def_debug_bt.h b/bottleneck/include/def_debug_bt.h new file mode 100644 index 0000000..21557e7 --- /dev/null +++ b/bottleneck/include/def_debug_bt.h @@ -0,0 +1,42 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef DEF_DEBUG_BT_H +#define DEF_DEBUG_BT_H + +//#define DEBUG_BOUND_MATCH +//#define DEBUG_NEIGHBOUR_ORACLE +//#define DEBUG_MATCHING +//#define DEBUG_AUCTION +// This symbol should be defined only in the version +// for R package TDA, to comply with some CRAN rules +// like no usage of cout, cerr, cin, exit, etc. +//#define FOR_R_TDA +//#define VERBOSE_BOTTLENECK + +#endif diff --git a/bottleneck/include/diagram_reader.h b/bottleneck/include/diagram_reader.h new file mode 100644 index 0000000..08d9e2b --- /dev/null +++ b/bottleneck/include/diagram_reader.h @@ -0,0 +1,196 @@ +/* +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_DIAGRAM_READER_H +#define HERA_DIAGRAM_READER_H + +#ifndef FOR_R_TDA +#include +#endif + +#include +#include +#include +#include + +namespace hera { + +// cannot choose stod, stof or stold based on RealType, +// lazy solution: partial specialization + template + inline RealType parse_real_from_str(const std::string& s); + + template <> + inline double parse_real_from_str(const std::string& s) + { + return std::stod(s); + } + + + template <> + inline long double parse_real_from_str(const std::string& s) + { + return std::stold(s); + } + + + template <> + inline float parse_real_from_str(const std::string& s) + { + return std::stof(s); + } + + + template + inline RealType parse_real_from_str(const std::string& s) + { + static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above"); + } + +// fill in result with points from file fname +// return false if file can't be opened +// or error occurred while reading +// decPrecision is the maximal decimal precision in the input, +// it is zero if all coordinates in the input are integers + + template>> + inline bool readDiagramPointSet(const char* fname, ContType_& result, int& decPrecision) + { + using RealType = RealType_; + + size_t lineNumber { 0 }; + result.clear(); + std::ifstream f(fname); + if (!f.good()) { +#ifndef FOR_R_TDA + std::cerr << "Cannot open file " << fname << std::endl; +#endif + return false; + } + std::locale loc; + std::string line; + while(std::getline(f, line)) { + lineNumber++; + // process comments: remove everything after hash + auto hashPos = line.find_first_of("#", 0); + if( std::string::npos != hashPos) { + line = std::string(line.begin(), line.begin() + hashPos); + } + if (line.empty()) { + continue; + } + // trim whitespaces + auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); + auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); + if (whiteSpaceBack <= whiteSpaceFront) { + // line consists of spaces only - move to the next line + continue; + } + line = std::string(whiteSpaceFront,whiteSpaceBack); + + // transform line to lower case + // to parse Infinity + for(auto& c : line) { + c = std::tolower(c, loc); + } + + bool fracPart = false; + int currDecPrecision = 0; + for(auto c : line) { + if (c == '.') { + fracPart = true; + } else if (fracPart) { + if (isdigit(c)) { + currDecPrecision++; + } else { + fracPart = false; + if (currDecPrecision > decPrecision) + decPrecision = currDecPrecision; + currDecPrecision = 0; + } + } + } + + RealType x, y; + std::string str_x, str_y; + std::istringstream iss(line); + try { + iss >> str_x >> str_y; + + x = parse_real_from_str(str_x); + y = parse_real_from_str(str_y); + + if (x != y) { + result.push_back(std::make_pair(x, y)); + } else { +#ifndef FOR_R_TDA + std::cerr << "Warning: point with 0 persistence ignored in " << fname << ":" << lineNumber << "\n"; +#endif + } + } + catch (const std::invalid_argument& e) { +#ifndef FOR_R_TDA + std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; +#endif + return false; + } + catch (const std::out_of_range&) { +#ifndef FOR_R_TDA + std::cerr << "Error while reading file " << fname << ", line number " << lineNumber << ": value too large in \"" << line << "\"" << std::endl; +#endif + return false; + } + } + f.close(); + return true; + } + + // wrappers + template>> + inline bool readDiagramPointSet(const std::string& fname, ContType_& result, int& decPrecision) + { + return readDiagramPointSet(fname.c_str(), result, decPrecision); + } + + // these two functions are now just wrappers for the previous ones, + // in case someone needs them; decPrecision is ignored + template>> + inline bool readDiagramPointSet(const char* fname, ContType_& result) + { + int decPrecision; + return readDiagramPointSet(fname, result, decPrecision); + } + + template>> + inline bool readDiagramPointSet(const std::string& fname, ContType_& result) + { + int decPrecision; + return readDiagramPointSet(fname.c_str(), result, decPrecision); + } + +} // end namespace hera +#endif // HERA_DIAGRAM_READER_H diff --git a/bottleneck/include/diagram_traits.h b/bottleneck/include/diagram_traits.h new file mode 100644 index 0000000..c8d4862 --- /dev/null +++ b/bottleneck/include/diagram_traits.h @@ -0,0 +1,45 @@ +#ifndef HERA_DIAGRAM_TRAITS_H +#define HERA_DIAGRAM_TRAITS_H + +namespace hera { + +template().begin())>::type > +struct DiagramTraits +{ + using Container = PairContainer_; + using PointType = PointType_; + using RealType = typename std::remove_reference< decltype(std::declval()[0]) >::type; + + static RealType get_x(const PointType& p) { return p[0]; } + static RealType get_y(const PointType& p) { return p[1]; } +}; + + +template +struct DiagramTraits> +{ + using PointType = std::pair; + using RealType = double; + using Container = std::vector; + + static RealType get_x(const PointType& p) { return p.first; } + static RealType get_y(const PointType& p) { return p.second; } +}; + + +template +struct DiagramTraits> +{ + using PointType = std::pair; + using RealType = float; + using Container = std::vector; + + static RealType get_x(const PointType& p) { return p.first; } + static RealType get_y(const PointType& p) { return p.second; } +}; + + +} // end namespace hera + + +#endif // HERA_DIAGRAM_TRAITS_H diff --git a/bottleneck/include/dnn/geometry/euclidean-fixed.h b/bottleneck/include/dnn/geometry/euclidean-fixed.h new file mode 100644 index 0000000..f45b980 --- /dev/null +++ b/bottleneck/include/dnn/geometry/euclidean-fixed.h @@ -0,0 +1,162 @@ +#ifndef HERA_BT_DNN_GEOMETRY_EUCLIDEAN_FIXED_H +#define HERA_BT_DNN_GEOMETRY_EUCLIDEAN_FIXED_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "../parallel/tbb.h" // for dnn::vector<...> + +namespace hera { +namespace bt { +namespace dnn +{ + // TODO: wrap in another namespace (e.g., euclidean) + + template + struct Point: + boost::addable< Point, + boost::subtractable< Point, + boost::dividable2< Point, Real, + boost::multipliable2< Point, Real > > > >, + public boost::array + { + public: + typedef Real Coordinate; + typedef Real DistanceType; + + + public: + Point(size_t id = 0): id_(id) {} + template + Point(const Point& p, size_t id = 0): + id_(id) { *this = p; } + + static size_t dimension() { return D; } + + // Assign a point of different dimension + template + Point& operator=(const Point& p) { for (size_t i = 0; i < (D < DD ? D : DD); ++i) (*this)[i] = p[i]; if (DD < D) for (size_t i = DD; i < D; ++i) (*this)[i] = 0; return *this; } + + Point& operator+=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] += p[i]; return *this; } + Point& operator-=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] -= p[i]; return *this; } + Point& operator/=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] /= r; return *this; } + Point& operator*=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] *= r; return *this; } + + Real norm2() const { Real n = 0; for (size_t i = 0; i < D; ++i) n += (*this)[i] * (*this)[i]; return n; } + Real max_norm() const + { + Real m = std::fabs((*this)[0]); + for (size_t i = 1; i < D; ++i) + if (std::fabs((*this)[i]) > m) + m = std::fabs((*this)[i]); + return m; } + + // quick and dirty for now; make generic later + //DistanceType distance(const Point& other) const { return sqrt(sq_distance(other)); } + //DistanceType sq_distance(const Point& other) const { return (other - *this).norm2(); } + + DistanceType distance(const Point& other) const { return (other - *this).max_norm(); } + DistanceType sq_distance(const Point& other) const { DistanceType d = distance(other); return d*d; } + + size_t id() const { return id_; } + size_t& id() { return id_; } + + private: + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::base_object< boost::array >(*this) & id_; } + + private: + size_t id_; + }; + + template + std::ostream& + operator<<(std::ostream& out, const Point& p) + { out << p[0]; for (size_t i = 1; i < D; ++i) out << " " << p[i]; return out; } + + + template + struct PointTraits; // intentionally undefined; should be specialized for each type + + template + struct PointTraits< Point > // specialization for dnn::Point + { + typedef Point PointType; + typedef const PointType* PointHandle; + typedef std::vector PointContainer; + + typedef typename PointType::Coordinate Coordinate; + typedef typename PointType::DistanceType DistanceType; + + static DistanceType + distance(const PointType& p1, const PointType& p2) { return p1.distance(p2); } + static DistanceType + distance(PointHandle p1, PointHandle p2) { return distance(*p1,*p2); } + static DistanceType + sq_distance(const PointType& p1, + const PointType& p2) { return p1.sq_distance(p2); } + static DistanceType + sq_distance(PointHandle p1, PointHandle p2) { return sq_distance(*p1,*p2); } + static size_t dimension() { return D; } + static Real coordinate(const PointType& p, size_t i) { return p[i]; } + static Real& coordinate(PointType& p, size_t i) { return p[i]; } + static Real coordinate(PointHandle p, size_t i) { return coordinate(*p,i); } + + static size_t id(const PointType& p) { return p.id(); } + static size_t& id(PointType& p) { return p.id(); } + static size_t id(PointHandle p) { return id(*p); } + + static PointHandle + handle(const PointType& p) { return &p; } + static const PointType& + point(PointHandle ph) { return *ph; } + + void swap(PointType& p1, PointType& p2) const { return std::swap(p1, p2); } + + static PointContainer + container(size_t n = 0, const PointType& p = PointType()) { return PointContainer(n, p); } + static typename PointContainer::iterator + iterator(PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } + static typename PointContainer::const_iterator + iterator(const PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } + + private: + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) {} + }; + + template + void read_points(const std::string& filename, PointContainer& points) + { + typedef typename boost::range_value::type Point; + typedef typename PointTraits::Coordinate Coordinate; + + std::ifstream in(filename.c_str()); + std::string line; + while(std::getline(in, line)) + { + if (line[0] == '#') continue; // comment line in the file + std::stringstream linestream(line); + Coordinate x; + points.push_back(Point()); + size_t i = 0; + while (linestream >> x) + points.back()[i++] = x; + } + } +} // dnn +} // bt +} // hera +#endif diff --git a/bottleneck/include/dnn/local/kd-tree.h b/bottleneck/include/dnn/local/kd-tree.h new file mode 100644 index 0000000..c1aed2b --- /dev/null +++ b/bottleneck/include/dnn/local/kd-tree.h @@ -0,0 +1,106 @@ +#ifndef HERA_BT_DNN_LOCAL_KD_TREE_H +#define HERA_BT_DNN_LOCAL_KD_TREE_H + +#include "../utils.h" +#include "search-functors.h" + +#include +#include + +#include +#include +#include + +#include +#include + +namespace hera { +namespace bt { +namespace dnn +{ + // Weighted KDTree + // Traits_ provides Coordinate, DistanceType, PointType, dimension(), distance(p1,p2), coordinate(p,i) + template< class Traits_ > + class KDTree + { + public: + typedef Traits_ Traits; + typedef hera::bt::dnn::HandleDistance HandleDistance; + + typedef typename Traits::PointType Point; + typedef typename Traits::PointHandle PointHandle; + typedef typename Traits::Coordinate Coordinate; + typedef typename Traits::DistanceType DistanceType; + typedef std::vector HandleContainer; + typedef std::vector HDContainer; // TODO: use tbb::scalable_allocator + typedef HDContainer Result; + typedef std::vector DistanceContainer; + typedef std::unordered_map HandleMap; + //private: + typedef typename HandleContainer::iterator HCIterator; + typedef std::tuple KDTreeNode; + typedef std::tuple KDTreeNodeNoCut; + + //BOOST_STATIC_ASSERT_MSG(has_coordinates::value, "KDTree requires coordinates"); + + public: + KDTree(const Traits& traits): + traits_(traits) {} + + KDTree(const Traits& traits, HandleContainer&& handles); + + template + KDTree(const Traits& traits, const Range& range); + + template + void init(const Range& range); + + HandleDistance find(PointHandle q) const; + Result findR(PointHandle q, DistanceType r) const; // all neighbors within r + Result findFirstR(PointHandle q, DistanceType r) const; // first neighbor within r + Result findK(PointHandle q, size_t k) const; // k nearest neighbors + + HandleDistance find(const Point& q) const { return find(traits().handle(q)); } + Result findR(const Point& q, DistanceType r) const { return findR(traits().handle(q), r); } + Result findFirstR(const Point& q, DistanceType r) const { return findFirstR(traits().handle(q), r); } + Result findK(const Point& q, size_t k) const { return findK(traits().handle(q), k); } + + + + template + void search(PointHandle q, ResultsFunctor& rf) const; + + const Traits& traits() const { return traits_; } + + void get_path_to_root(const size_t idx, std::stack& s); + // to support deletion + void init_n_elems(); + void delete_point(const size_t idx); + void delete_point(PointHandle p); + void update_n_elems(const ssize_t idx, const int delta); + void increase_n_elems(const ssize_t idx); + void decrease_n_elems(const ssize_t idx); + size_t get_num_points() const { return num_points_; } + //private: + void init(); + + + struct CoordinateComparison; + struct OrderTree; + + //private: + Traits traits_; + HandleContainer tree_; + std::vector delete_flags_; + std::vector subtree_n_elems; + HandleMap indices_; + std::vector parents_; + + size_t num_points_; + }; +} // dnn +} // bt +} // hera +#include "kd-tree.hpp" + +#endif diff --git a/bottleneck/include/dnn/local/kd-tree.hpp b/bottleneck/include/dnn/local/kd-tree.hpp new file mode 100644 index 0000000..5b84eb0 --- /dev/null +++ b/bottleneck/include/dnn/local/kd-tree.hpp @@ -0,0 +1,296 @@ +#include +#include +#include + +#include + +#include "../parallel/tbb.h" + +template +hera::bt::dnn::KDTree::KDTree(const Traits& traits, HandleContainer&& handles): + traits_(traits), + tree_(std::move(handles)), + delete_flags_(handles.size(), static_cast(0) ), + subtree_n_elems(handles.size(), static_cast(0)), + num_points_(handles.size()) +{ + init(); +} + +template +template +hera::bt::dnn::KDTree::KDTree(const Traits& traits, const Range& range): + traits_(traits) +{ + init(range); +} + +template +template +void hera::bt::dnn::KDTree::init(const Range& range) +{ + size_t sz = std::distance(std::begin(range), std::end(range)); + subtree_n_elems = std::vector(sz, 0); + delete_flags_ = std::vector(sz, 0); + num_points_ = sz; + tree_.reserve(sz); + for (PointHandle h : range) + tree_.push_back(h); + parents_.resize(sz, -1); + init(); +} + +template +void hera::bt::dnn::KDTree::init() +{ + if (tree_.empty()) + return; + +#if defined(TBB) + task_group g; + g.run(OrderTree(this, tree_.begin(), tree_.end(), -1, 0, traits())); + g.wait(); +#else + OrderTree(this, tree_.begin(), tree_.end(), -1, 0, traits()).serial(); +#endif + + for (size_t i = 0; i < tree_.size(); ++i) + indices_[tree_[i]] = i; + init_n_elems(); +} + +template +struct +hera::bt::dnn::KDTree::OrderTree +{ + OrderTree(KDTree* tree_, HCIterator b_, HCIterator e_, ssize_t p_, size_t i_, const Traits& traits_): + tree(tree_), b(b_), e(e_), p(p_), i(i_), traits(traits_) {} + + void operator()() const + { + if (e - b < 1000) + { + serial(); + return; + } + + HCIterator m = b + (e - b)/2; + ssize_t im = m - tree->tree_.begin(); + tree->parents_[im] = p; + + CoordinateComparison cmp(i, traits); + std::nth_element(b,m,e, cmp); + size_t next_i = (i + 1) % traits.dimension(); + + task_group g; + if (b < m - 1) g.run(OrderTree(tree, b, m, im, next_i, traits)); + if (e > m + 2) g.run(OrderTree(tree, m+1, e, im, next_i, traits)); + g.wait(); + } + + void serial() const + { + std::queue q; + q.push(KDTreeNode(b,e,p,i)); + while (!q.empty()) + { + HCIterator b, e; ssize_t p; size_t i; + std::tie(b,e,p,i) = q.front(); + q.pop(); + HCIterator m = b + (e - b)/2; + ssize_t im = m - tree->tree_.begin(); + tree->parents_[im] = p; + + CoordinateComparison cmp(i, traits); + std::nth_element(b,m,e, cmp); + size_t next_i = (i + 1) % traits.dimension(); + + // Replace with a size condition instead? + if (m - b > 1) + q.push(KDTreeNode(b, m, im, next_i)); + else if (b < m) + tree->parents_[im - 1] = im; + if (e - m > 2) + q.push(KDTreeNode(m+1, e, im, next_i)); + else if (e > m + 1) + tree->parents_[im + 1] = im; + } + } + + KDTree* tree; + HCIterator b, e; + ssize_t p; + size_t i; + const Traits& traits; +}; + +template +void hera::bt::dnn::KDTree::update_n_elems(ssize_t idx, const int delta) +// add delta to the number of points in node idx and update subtree_n_elems +// for all parents of the node idx +{ + //std::cout << "subtree_n_elems.size = " << subtree_n_elems.size() << std::endl; + // update the node itself + while (idx != -1) + { + //std::cout << idx << std::endl; + subtree_n_elems[idx] += delta; + idx = parents_[idx]; + } +} + +template +void hera::bt::dnn::KDTree::increase_n_elems(const ssize_t idx) +{ + update_n_elems(idx, static_cast(1)); +} + +template +void hera::bt::dnn::KDTree::decrease_n_elems(const ssize_t idx) +{ + update_n_elems(idx, static_cast(-1)); +} + +template +void hera::bt::dnn::KDTree::init_n_elems() +{ + for(size_t idx = 0; idx < tree_.size(); ++idx) { + increase_n_elems(idx); + } +} + + +template +template +void hera::bt::dnn::KDTree::search(PointHandle q, ResultsFunctor& rf) const +{ + typedef typename HandleContainer::const_iterator HCIterator; + typedef std::tuple KDTreeNode; + + if (tree_.empty()) + return; + + DistanceType D = std::numeric_limits::infinity(); + + // TODO: use tbb::scalable_allocator for the queue + std::queue nodes; + + nodes.push(KDTreeNode(tree_.begin(), tree_.end(), 0)); + + //std::cout << "started kdtree::search" << std::endl; + + while (!nodes.empty()) + { + HCIterator b, e; size_t i; + std::tie(b,e,i) = nodes.front(); + nodes.pop(); + + CoordinateComparison cmp(i, traits()); + i = (i + 1) % traits().dimension(); + + HCIterator m = b + (e - b)/2; + size_t m_idx = m - tree_.begin(); + // ignore deleted points + if ( delete_flags_[m_idx] == 0 ) { + DistanceType dist = traits().distance(q, *m); + // + weights_[m - tree_.begin()]; + //std::cout << "Supplied to functor: m : "; + //std::cout << "(" << (*(*m))[0] << ", " << (*(*m))[1] << ")"; + //std::cout << " and q : "; + //std::cout << "(" << (*q)[0] << ", " << (*q)[1] << ")" << std::endl; + //std::cout << "dist^q + weight = " << dist << std::endl; + //std::cout << "weight = " << weights_[m - tree_.begin()] << std::endl; + //std::cout << "dist = " << traits().distance(q, *m) << std::endl; + //std::cout << "dist^q = " << pow(traits().distance(q, *m), wassersteinPower) << std::endl; + + D = rf(*m, dist); + } + // we are really searching w.r.t L_\infty ball; could prune better with an L_2 ball + Coordinate diff = cmp.diff(q, *m); // diff returns signed distance + DistanceType diffToWasserPower = (diff > 0 ? 1.0 : -1.0) * fabs(diff); + + size_t lm = m + 1 + (e - (m+1))/2 - tree_.begin(); + if ( e > m + 1 and subtree_n_elems[lm] > 0 ) { + if (e > m + 1 && diffToWasserPower >= -D) { + nodes.push(KDTreeNode(m+1, e, i)); + } + } + + size_t rm = b + (m - b) / 2 - tree_.begin(); + if ( subtree_n_elems[rm] > 0 ) { + if (b < m && diffToWasserPower <= D) { + nodes.push(KDTreeNode(b, m, i)); + } + } + } + //std::cout << "exited kdtree::search" << std::endl; +} + +template +typename hera::bt::dnn::KDTree::HandleDistance hera::bt::dnn::KDTree::find(PointHandle q) const +{ + hera::bt::dnn::NNRecord nn; + search(q, nn); + return nn.result; +} + +template +typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findR(PointHandle q, DistanceType r) const +{ + hera::bt::dnn::rNNRecord rnn(r); + search(q, rnn); + //std::sort(rnn.result.begin(), rnn.result.end()); + return rnn.result; +} + +template +typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findFirstR(PointHandle q, DistanceType r) const +{ + hera::bt::dnn::firstrNNRecord rnn(r); + search(q, rnn); + return rnn.result; +} + +template +typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findK(PointHandle q, size_t k) const +{ + hera::bt::dnn::kNNRecord knn(k); + search(q, knn); + // do we need this??? + std::sort(knn.result.begin(), knn.result.end()); + return knn.result; +} + +template +struct hera::bt::dnn::KDTree::CoordinateComparison +{ + CoordinateComparison(size_t i, const Traits& traits): + i_(i), traits_(traits) {} + + bool operator()(PointHandle p1, PointHandle p2) const { return coordinate(p1) < coordinate(p2); } + Coordinate diff(PointHandle p1, PointHandle p2) const { return coordinate(p1) - coordinate(p2); } + + Coordinate coordinate(PointHandle p) const { return traits_.coordinate(p, i_); } + size_t axis() const { return i_; } + + private: + size_t i_; + const Traits& traits_; +}; + +template +void hera::bt::dnn::KDTree::delete_point(const size_t idx) +{ + // prevent double deletion + assert(delete_flags_[idx] == 0); + delete_flags_[idx] = 1; + decrease_n_elems(idx); + --num_points_; +} + +template +void hera::bt::dnn::KDTree::delete_point(PointHandle p) +{ + delete_point(indices_[p]); +} + diff --git a/bottleneck/include/dnn/local/search-functors.h b/bottleneck/include/dnn/local/search-functors.h new file mode 100644 index 0000000..63ad11d --- /dev/null +++ b/bottleneck/include/dnn/local/search-functors.h @@ -0,0 +1,119 @@ +#ifndef HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H +#define HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H + +#include + +namespace hera +{ +namespace bt +{ +namespace dnn +{ + +template +struct HandleDistance +{ + typedef typename NN::PointHandle PointHandle; + typedef typename NN::DistanceType DistanceType; + typedef typename NN::HDContainer HDContainer; + + HandleDistance() {} + HandleDistance(PointHandle pp, DistanceType dd): + p(pp), d(dd) {} + bool operator<(const HandleDistance& other) const { return d < other.d; } + + PointHandle p; + DistanceType d; +}; + +template +struct NNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + + NNRecord() { result.d = std::numeric_limits::infinity(); } + DistanceType operator()(PointHandle p, DistanceType d) { if (d < result.d) { result.p = p; result.d = d; } return result.d; } + HandleDistance result; +}; + +template +struct rNNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + typedef typename HandleDistance::HDContainer HDContainer; + + rNNRecord(DistanceType r_): r(r_) {} + DistanceType operator()(PointHandle p, DistanceType d) + { + if (d <= r) + result.push_back(HandleDistance(p,d)); + return r; + } + + DistanceType r; + HDContainer result; +}; + +template +struct firstrNNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + typedef typename HandleDistance::HDContainer HDContainer; + + firstrNNRecord(DistanceType r_): r(r_) {} + + DistanceType operator()(PointHandle p, DistanceType d) + { + if (d <= r) { + result.push_back(HandleDistance(p,d)); + return -100000000.0; + } else { + return r; + } + } + + DistanceType r; + HDContainer result; +}; + + +template +struct kNNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + typedef typename HandleDistance::HDContainer HDContainer; + + kNNRecord(unsigned k_): k(k_) {} + DistanceType operator()(PointHandle p, DistanceType d) + { + if (result.size() < k) + { + result.push_back(HandleDistance(p,d)); + boost::push_heap(result); + if (result.size() < k) + return std::numeric_limits::infinity(); + } else if (d < result[0].d) + { + boost::pop_heap(result); + result.back() = HandleDistance(p,d); + boost::push_heap(result); + } + if ( result.size() > 1 ) { + assert( result[0].d >= result[1].d ); + } + return result[0].d; + } + + unsigned k; + HDContainer result; +}; + +} // dnn +} // bt +} // hera + +#endif // HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H diff --git a/bottleneck/include/dnn/parallel/tbb.h b/bottleneck/include/dnn/parallel/tbb.h new file mode 100644 index 0000000..14f0093 --- /dev/null +++ b/bottleneck/include/dnn/parallel/tbb.h @@ -0,0 +1,235 @@ +#ifndef HERA_BT_PARALLEL_H +#define HERA_BT_PARALLEL_H + +#ifndef FOR_R_TDA +#include +#endif + +#include + +#include +#include +#include + +#ifdef TBB + +#include +#include +#include + +#include +#include +#include + +namespace hera { +namespace bt { +namespace dnn +{ + using tbb::mutex; + using tbb::task_scheduler_init; + using tbb::task_group; + using tbb::task; + + template + struct vector + { + typedef tbb::concurrent_vector type; + }; + + template + struct atomic + { + typedef tbb::atomic type; + static T compare_and_swap(type& v, T n, T o) { return v.compare_and_swap(n,o); } + }; + + template + void do_foreach(Iterator begin, Iterator end, const F& f) { tbb::parallel_do(begin, end, f); } + + template + void for_each_range_(const Range& r, const F& f) + { + for (typename Range::iterator cur = r.begin(); cur != r.end(); ++cur) + f(*cur); + } + + template + void for_each_range(size_t from, size_t to, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(from, to, f); + } + + template + void for_each_range(const Container& c, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); + } + + template + void for_each_range(Container& c, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); + } + + template + struct map_traits + { + typedef tbb::concurrent_hash_map type; + typedef typename type::range_type range; + }; + + struct progress_timer + { + progress_timer(): start(tbb::tick_count::now()) {} + ~progress_timer() + { +#ifndef FOR_R_TDA + std::cout << (tbb::tick_count::now() - start).seconds() << " s" << std::endl; +#endif + } + + tbb::tick_count start; + }; +} +} +} + +// Serialization for tbb::concurrent_vector<...> +namespace boost +{ + namespace serialization + { + template + void save(Archive& ar, const tbb::concurrent_vector& v, const unsigned int file_version) + { stl::save_collection(ar, v); } + + template + void load(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) + { + stl::load_collection, + stl::archive_input_seq< Archive, tbb::concurrent_vector >, + stl::reserve_imp< tbb::concurrent_vector > + >(ar, v); + } + + template + void serialize(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) + { split_free(ar, v, file_version); } + + template + void save(Archive& ar, const tbb::atomic& v, const unsigned int file_version) + { T v_ = v; ar << v_; } + + template + void load(Archive& ar, tbb::atomic& v, const unsigned int file_version) + { T v_; ar >> v_; v = v_; } + + template + void serialize(Archive& ar, tbb::atomic& v, const unsigned int file_version) + { split_free(ar, v, file_version); } + } +} + +#else + +#include +#include +#include + +namespace hera { +namespace bt { +namespace dnn +{ + template + struct vector + { + typedef ::std::vector type; + }; + + template + struct atomic + { + typedef T type; + static T compare_and_swap(type& v, T n, T o) { if (v != o) return v; v = n; return o; } + }; + + template + void do_foreach(Iterator begin, Iterator end, const F& f) { std::for_each(begin, end, f); } + + template + void for_each_range(size_t from, size_t to, const F& f) + { + for (size_t i = from; i < to; ++i) + f(i); + } + + template + void for_each_range(Container& c, const F& f) + { + BOOST_FOREACH(const typename Container::value_type& i, c) + f(i); + } + + template + void for_each_range(const Container& c, const F& f) + { + BOOST_FOREACH(const typename Container::value_type& i, c) + f(i); + } + + struct mutex + { + struct scoped_lock + { + scoped_lock() {} + scoped_lock(mutex& ) {} + void acquire(mutex& ) const {} + void release() const {} + }; + }; + + struct task_scheduler_init + { + task_scheduler_init(unsigned) {} + void initialize(unsigned) {} + static const unsigned automatic = 0; + static const unsigned deferred = 0; + }; + + struct task_group + { + template + void run(const Functor& f) const { f(); } + void wait() const {} + }; + + template + struct map_traits + { + typedef std::map type; + typedef type range; + }; + + using boost::progress_timer; +} +} +} + +#endif // TBB + +namespace dnn +{ + template + void do_foreach(const Range& range, const F& f) { do_foreach(boost::begin(range), boost::end(range), f); } +} + +#endif diff --git a/bottleneck/include/dnn/parallel/utils.h b/bottleneck/include/dnn/parallel/utils.h new file mode 100644 index 0000000..9809e77 --- /dev/null +++ b/bottleneck/include/dnn/parallel/utils.h @@ -0,0 +1,100 @@ +#ifndef HERA_BT_PARALLEL_UTILS_H +#define HERA_BT_PARALLEL_UTILS_H + +#include "../utils.h" + +namespace hera +{ +namespace bt +{ +namespace dnn +{ + // Assumes rng is synchronized across ranks + template + void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty = DataVector()); + + template + void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng) + { + typedef decltype(data[0]) T; + shuffle(world, data, rng, [](T& x, T& y) { std::swap(x,y); }); + } +} +} +} + +template +void +hera::bt::dnn::shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty) +{ + // This is not a perfect shuffle: it dishes out data in chunks of 1/size. + // (It can be interpreted as generating a bistochastic matrix by taking the + // sum of size random permutation matrices.) Hopefully, it works for our purposes. + + typedef typename RNGType::result_type RNGResult; + + int size = world.size(); + int rank = world.rank(); + + // Generate local seeds + boost::uniform_int uniform; + RNGResult seed; + for (size_t i = 0; i < size; ++i) + { + RNGResult v = uniform(rng); + if (i == rank) + seed = v; + } + RNGType local_rng(seed); + + // Shuffle local data + hera::bt::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); + + // Decide how much of our data goes to i-th processor + std::vector out_counts(size); + std::vector ranks(boost::counting_iterator(0), + boost::counting_iterator(size)); + for (size_t i = 0; i < size; ++i) + { + hera::bt::dnn::random_shuffle(ranks.begin(), ranks.end(), rng); + ++out_counts[ranks[rank]]; + } + + // Fill the outgoing array + size_t total = 0; + std::vector< DataVector > outgoing(size, empty); + for (size_t i = 0; i < size; ++i) + { + size_t count = data.size()*out_counts[i]/size; + if (total + count > data.size()) + count = data.size() - total; + + outgoing[i].reserve(count); + for (size_t j = total; j < total + count; ++j) + outgoing[i].push_back(data[j]); + + total += count; + } + + boost::uniform_int uniform_outgoing(0,size-1); // in range [0,size-1] + while(total < data.size()) // send leftover to random processes + { + outgoing[uniform_outgoing(local_rng)].push_back(data[total]); + ++total; + } + data.clear(); + + // Exchange the data + std::vector< DataVector > incoming(size, empty); + mpi::all_to_all(world, outgoing, incoming); + outgoing.clear(); + + // Assemble our data + for(const DataVector& vec : incoming) + for (size_t i = 0; i < vec.size(); ++i) + data.push_back(vec[i]); + hera::bt::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); + // XXX: the final shuffle is irrelevant for our purposes. But it's also cheap. +} + +#endif diff --git a/bottleneck/include/dnn/utils.h b/bottleneck/include/dnn/utils.h new file mode 100644 index 0000000..f4ce632 --- /dev/null +++ b/bottleneck/include/dnn/utils.h @@ -0,0 +1,47 @@ +#ifndef HERA_BT_DNN_UTILS_H +#define HERA_BT_DNN_UTILS_H + +#include +#include +#include + +namespace hera +{ +namespace bt +{ +namespace dnn +{ + +template +struct has_coordinates +{ + template ().coordinate(std::declval()...) )> + static std::true_type test(int); + + template + static std::false_type test(...); + + static constexpr bool value = decltype(test(0))::value; +}; + +template +void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g, const SwapFunctor& swap) +{ + size_t n = last - first; + boost::uniform_int uniform(0,n); + for (size_t i = n-1; i > 0; --i) + swap(first[i], first[uniform(g,i+1)]); // picks a random number in [0,i] range +} + +template +void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g) +{ + typedef decltype(*first) T; + random_shuffle(first, last, g, [](T& x, T& y) { std::swap(x,y); }); +} + +} // dnn +} // bt +} // hera + +#endif diff --git a/bottleneck/include/neighb_oracle.h b/bottleneck/include/neighb_oracle.h new file mode 100644 index 0000000..91ebc0e --- /dev/null +++ b/bottleneck/include/neighb_oracle.h @@ -0,0 +1,295 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_NEIGHB_ORACLE_H +#define HERA_NEIGHB_ORACLE_H + +#include +#include +#include + +#include "basic_defs_bt.h" +#include "dnn/geometry/euclidean-fixed.h" +#include "dnn/local/kd-tree.h" + + + +namespace hera { +namespace bt { + +template +class NeighbOracleSimple +{ +public: + using DgmPoint = DiagramPoint; + using DgmPointSet = DiagramPointSet; + +private: + Real r; + Real distEpsilon; + DgmPointSet pointSet; + +public: + + NeighbOracleSimple() : r(0.0) {} + + NeighbOracleSimple(const DgmPointSet& _pointSet, const Real _r, const Real _distEpsilon) : + r(_r), + distEpsilon(_distEpsilon), + pointSet(_pointSet) + {} + + void deletePoint(const DgmPoint& p) + { + pointSet.erase(p); + } + + void rebuild(const DgmPointSet& S, const double rr) + { + pointSet = S; + r = rr; + } + + bool getNeighbour(const DgmPoint& q, DgmPoint& result) const + { + for(auto pit = pointSet.cbegin(); pit != pointSet.cend(); ++pit) { + if ( distLInf(*pit, q) <= r) { + result = *pit; + return true; + } + } + return false; + } + + void getAllNeighbours(const DgmPoint& q, std::vector& result) + { + result.clear(); + for(const auto& point : pointSet) { + if ( distLInf(point, q) <= r) { + result.push_back(point); + } + } + for(auto& pt : result) { + deletePoint(pt); + } + } + +}; + +template +class NeighbOracleDnn +{ +public: + + using Real = Real_; + using DnnPoint = dnn::Point<2, double>; + using DnnTraits = dnn::PointTraits; + using DgmPoint = DiagramPoint; + using DgmPointSet = DiagramPointSet; + using DgmPointHash = DiagramPointHash; + + Real r; + Real distEpsilon; + std::vector allPoints; + DgmPointSet diagonalPoints; + std::unordered_map pointIdxLookup; + // dnn-stuff + std::unique_ptr> kdtree; + std::vector dnnPoints; + std::vector dnnPointHandles; + std::vector kdtreeItems; + + NeighbOracleDnn(const DgmPointSet& S, const Real rr, const Real dEps) : + kdtree(nullptr) + { + assert(dEps >= 0); + distEpsilon = dEps; + rebuild(S, rr); + } + + + void deletePoint(const DgmPoint& p) + { + auto findRes = pointIdxLookup.find(p); + assert(findRes != pointIdxLookup.end()); + //std::cout << "Deleting point " << p << std::endl; + size_t pointIdx { (*findRes).second }; + //std::cout << "pointIdx = " << pointIdx << std::endl; + diagonalPoints.erase(p, false); + kdtree->delete_point(dnnPointHandles[kdtreeItems[pointIdx]]); + } + + void rebuild(const DgmPointSet& S, const Real rr) + { + //std::cout << "Entered rebuild, r = " << rr << std::endl; + r = rr; + size_t dnnNumPoints = S.size(); + //printDebug(isDebug, "S = ", S); + if (dnnNumPoints > 0) { + pointIdxLookup.clear(); + pointIdxLookup.reserve(S.size()); + allPoints.clear(); + allPoints.reserve(S.size()); + diagonalPoints.clear(); + diagonalPoints.reserve(S.size() / 2); + for(auto pit = S.cbegin(); pit != S.cend(); ++pit) { + allPoints.push_back(*pit); + if (pit->isDiagonal()) { + diagonalPoints.insert(*pit); + } + } + + size_t pointIdx = 0; + for(auto& dataPoint : allPoints) { + pointIdxLookup.insert( { dataPoint, pointIdx++ } ); + } + + size_t dnnItemIdx { 0 }; + size_t trueIdx { 0 }; + dnnPoints.clear(); + kdtreeItems.clear(); + dnnPointHandles.clear(); + dnnPoints.clear(); + kdtreeItems.reserve(S.size() ); + // store normal items in kd-tree + for(const auto& g : allPoints) { + if (true) { + kdtreeItems.push_back(dnnItemIdx); + // index of items is id of dnn-point + DnnPoint p(trueIdx); + p[0] = g.getRealX(); + p[1] = g.getRealY(); + dnnPoints.push_back(p); + assert(dnnItemIdx == dnnPoints.size() - 1); + dnnItemIdx++; + } + trueIdx++; + } + assert(dnnPoints.size() == allPoints.size() ); + for(size_t i = 0; i < dnnPoints.size(); ++i) { + dnnPointHandles.push_back(&dnnPoints[i]); + } + DnnTraits traits; + //std::cout << "kdtree: " << dnnPointHandles.size() << " points" << std::endl; + kdtree.reset(new dnn::KDTree(traits, dnnPointHandles)); + } + } + + + bool getNeighbour(const DgmPoint& q, DgmPoint& result) const + { + //std::cout << "getNeighbour for q = " << q << ", r = " << r << std::endl; + //std::cout << *this << std::endl; + // distance between two diagonal points + // is 0 + if (q.isDiagonal()) { + if (!diagonalPoints.empty()) { + result = *diagonalPoints.cbegin(); + //std::cout << "Neighbour found in diagonal points, res = " << result; + return true; + } + } + // check if kdtree is not empty + if (0 == kdtree->get_num_points() ) { + //std::cout << "empty tree, no neighb." << std::endl; + return false; + } + // if no neighbour found among diagonal points, + // search in kd_tree + DnnPoint queryPoint; + queryPoint[0] = q.getRealX(); + queryPoint[1] = q.getRealY(); + auto kdtreeResult = kdtree->findFirstR(queryPoint, r); + if (kdtreeResult.empty()) { + //std::cout << "no neighbour within " << r << "found." << std::endl; + return false; + } + if (kdtreeResult[0].d <= r + distEpsilon) { + result = allPoints[kdtreeResult[0].p->id()]; + //std::cout << "Neighbour found with kd-tree, index = " << kdtreeResult[0].p->id() << std::endl; + //std::cout << "result = " << result << std::endl; + return true; + } + //std::cout << "No neighbour found for r = " << r << std::endl; + return false; + } + + + + void getAllNeighbours(const DgmPoint& q, std::vector& result) + { + //std::cout << "Entered getAllNeighbours for q = " << q << std::endl; + result.clear(); + // add diagonal points, if necessary + if ( q.isDiagonal() ) { + for( auto& diagPt : diagonalPoints ) { + result.push_back(diagPt); + } + } + // delete diagonal points we found + // to prevent finding them again + for(auto& pt : result) { + //std::cout << "deleting DIAG point pt = " << pt << std::endl; + deletePoint(pt); + } + size_t diagOffset = result.size(); + std::vector pointIndicesOut; + // perorm range search on kd-tree + DnnPoint queryPoint; + queryPoint[0] = q.getRealX(); + queryPoint[1] = q.getRealY(); + auto kdtreeResult = kdtree->findR(queryPoint, r); + pointIndicesOut.reserve(kdtreeResult.size()); + for(auto& handleDist : kdtreeResult) { + if (handleDist.d <= r + distEpsilon) { + pointIndicesOut.push_back(handleDist.p->id()); + } else { + break; + } + } + // get actual points in result + for(auto& ptIdx : pointIndicesOut) { + result.push_back(allPoints[ptIdx]); + } + // delete all points we found + for(auto ptIt = result.begin() + diagOffset; ptIt != result.end(); ++ptIt) { + //printDebug(isDebug, "deleting point pt = ", *ptIt); + deletePoint(*ptIt); + } + } + + //DgmPointSet originalPointSet; + template + friend std::ostream& operator<<(std::ostream& out, const NeighbOracleDnn& oracle); + +}; + +} // end namespace bt +} // end namespace hera + +#endif // HERA_NEIGHB_ORACLE_H diff --git a/bottleneck/tests/data/test_001_A b/bottleneck/tests/data/test_001_A new file mode 100644 index 0000000..8d04f96 --- /dev/null +++ b/bottleneck/tests/data/test_001_A @@ -0,0 +1 @@ +1 2 diff --git a/bottleneck/tests/data/test_001_B b/bottleneck/tests/data/test_001_B new file mode 100644 index 0000000..9290688 --- /dev/null +++ b/bottleneck/tests/data/test_001_B @@ -0,0 +1 @@ +4 6 diff --git a/bottleneck/tests/data/test_002_A b/bottleneck/tests/data/test_002_A new file mode 100644 index 0000000..8d04f96 --- /dev/null +++ b/bottleneck/tests/data/test_002_A @@ -0,0 +1 @@ +1 2 diff --git a/bottleneck/tests/data/test_002_B b/bottleneck/tests/data/test_002_B new file mode 100644 index 0000000..a4cec9b --- /dev/null +++ b/bottleneck/tests/data/test_002_B @@ -0,0 +1 @@ +1.1 2.2 diff --git a/bottleneck/tests/data/test_003_A b/bottleneck/tests/data/test_003_A new file mode 100644 index 0000000..fdf0acd --- /dev/null +++ b/bottleneck/tests/data/test_003_A @@ -0,0 +1,2 @@ +1 2 +2 inf diff --git a/bottleneck/tests/data/test_003_B b/bottleneck/tests/data/test_003_B new file mode 100644 index 0000000..ac429f9 --- /dev/null +++ b/bottleneck/tests/data/test_003_B @@ -0,0 +1,2 @@ +1.1 2.2 +4 inf diff --git a/bottleneck/tests/data/test_004_A b/bottleneck/tests/data/test_004_A new file mode 100644 index 0000000..fdf0acd --- /dev/null +++ b/bottleneck/tests/data/test_004_A @@ -0,0 +1,2 @@ +1 2 +2 inf diff --git a/bottleneck/tests/data/test_004_B b/bottleneck/tests/data/test_004_B new file mode 100644 index 0000000..5769823 --- /dev/null +++ b/bottleneck/tests/data/test_004_B @@ -0,0 +1,3 @@ +1.1 2.2 +4 inf +4 inf diff --git a/bottleneck/tests/data/test_005_A b/bottleneck/tests/data/test_005_A new file mode 100644 index 0000000..e28367d --- /dev/null +++ b/bottleneck/tests/data/test_005_A @@ -0,0 +1,6 @@ +1 2 +2 inf +3 inf +10 inf +inf 21 +inf 44 diff --git a/bottleneck/tests/data/test_005_B b/bottleneck/tests/data/test_005_B new file mode 100644 index 0000000..7f6032b --- /dev/null +++ b/bottleneck/tests/data/test_005_B @@ -0,0 +1,6 @@ +1.1 2.2 +4 inf +4 inf +12 inf +inf 20 +inf 40 diff --git a/bottleneck/tests/data/test_006_A b/bottleneck/tests/data/test_006_A new file mode 100644 index 0000000..b5184a5 --- /dev/null +++ b/bottleneck/tests/data/test_006_A @@ -0,0 +1,7 @@ +1 2 +2 inf +3 inf +10 inf +inf 21 +inf 44 +1 34 diff --git a/bottleneck/tests/data/test_006_B b/bottleneck/tests/data/test_006_B new file mode 100644 index 0000000..0d07369 --- /dev/null +++ b/bottleneck/tests/data/test_006_B @@ -0,0 +1,7 @@ +2 40 +1.1 2.2 +4 inf +4 inf +12 inf +inf 20 +inf 40 diff --git a/bottleneck/tests/data/test_007_A b/bottleneck/tests/data/test_007_A new file mode 100644 index 0000000..e69de29 diff --git a/bottleneck/tests/data/test_007_B b/bottleneck/tests/data/test_007_B new file mode 100644 index 0000000..e69de29 diff --git a/bottleneck/tests/data/test_008_A b/bottleneck/tests/data/test_008_A new file mode 100644 index 0000000..50b3df6 --- /dev/null +++ b/bottleneck/tests/data/test_008_A @@ -0,0 +1 @@ +0 1.1 diff --git a/bottleneck/tests/data/test_008_B b/bottleneck/tests/data/test_008_B new file mode 100644 index 0000000..1935b11 --- /dev/null +++ b/bottleneck/tests/data/test_008_B @@ -0,0 +1 @@ +0 0.1 diff --git a/bottleneck/tests/data/test_009_A b/bottleneck/tests/data/test_009_A new file mode 100644 index 0000000..a1b859e --- /dev/null +++ b/bottleneck/tests/data/test_009_A @@ -0,0 +1 @@ +1.1 0 diff --git a/bottleneck/tests/data/test_009_B b/bottleneck/tests/data/test_009_B new file mode 100644 index 0000000..b5befbc --- /dev/null +++ b/bottleneck/tests/data/test_009_B @@ -0,0 +1 @@ +0.1 0 diff --git a/bottleneck/tests/data/test_010_A b/bottleneck/tests/data/test_010_A new file mode 100644 index 0000000..8d126f0 --- /dev/null +++ b/bottleneck/tests/data/test_010_A @@ -0,0 +1,100 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 +3.79915 4.51283 +3.17645 3.75321 +0.61305 0.998622 +0.445643 1.13781 +6.38205 6.53669 +5.96392 6.44093 +7.21047 7.26005 +0.6703 1.26593 +0.529933 1.7027 +7.92495 8.83023 +2.1382 2.71695 +3.79209 4.5197 +5.23354 5.82214 +-0.395097 2.18831 +3.22028 3.88648 +5.56262 5.79949 +8.39623 9.37185 +2.7452 3.84539 +9.5022 10.2414 +1.01374 1.40504 +3.2029 3.89559 +7.61236 8.28485 +6.4371 6.909 +4.45616 5.35067 +1.57802 1.77895 +6.5991 7.76339 +6.66729 6.71714 +6.11898 6.57121 +2.60663 4.36396 +-0.259613 1.17683 +7.72857 9.48862 +4.68398 5.51521 +4.87447 5.4233 +6.86301 6.88244 +4.17814 4.25886 +8.70558 9.72902 +4.40873 4.57389 +6.1824 7.05049 +7.97557 8.79739 +8.52591 8.6985 +5.15336 5.27796 +9.70144 9.77031 +0.561778 1.39045 +9.32553 10.2456 +7.01495 7.74521 +6.83355 7.28255 +1.96721 3.01504 +5.78411 7.59464 +5.64012 6.10721 +3.7249 5.17086 +4.33297 5.91657 +7.11793 7.2545 +5.109 6.76878 +3.02787 3.04077 +0.999365 2.05566 +8.81392 8.9086 +6.20106 6.78943 +6.7987 7.05794 +0.438805 0.449602 +8.71793 9.79853 +-0.150282 0.51997 +5.72257 5.93156 +5.71098 6.09535 +9.0378 9.45942 +0.534987 0.872885 +7.72276 8.57754 +9.26069 9.40289 +4.148 4.80519 +1.04579 3.18109 +0.259767 0.93215 +0.250608 0.511569 +4.88108 5.62239 +4.6731 5.3348 +7.84979 7.93545 +0.912521 1.48142 +4.82553 5.38108 +6.02179 7.61665 +3.85848 6.39418 +5.10754 6.02118 +1.71956 1.86238 +6.47336 6.74034 +-0.0371018 0.212738 +3.97259 4.15465 +2.17413 3.20188 +4.49098 6.09812 +6.62445 7.84196 +6.57541 7.432 +6.81052 9.6653 +3.67502 4.69734 +3.92378 4.14743 +5.93127 6.46154 +0.63424 0.705454 +7.60129 9.23263 +4.23064 4.74575 +0.397705 1.24458 diff --git a/bottleneck/tests/data/test_010_B b/bottleneck/tests/data/test_010_B new file mode 100644 index 0000000..852799d --- /dev/null +++ b/bottleneck/tests/data/test_010_B @@ -0,0 +1,100 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 +3.77337 5.2686 +8.31344 9.05384 +0.734064 1.14844 +7.57606 7.8521 +3.16719 3.86953 +2.55072 2.64932 +9.51707 9.6071 +0.304643 2.41784 +2.79925 3.28234 +5.32901 7.7576 +5.19903 6.30449 +1.87819 2.99454 +8.92272 9.67105 +4.62414 5.05592 +4.0079 4.64148 +2.26369 3.44573 +2.69335 3.13426 +1.90706 2.42652 +2.68113 2.79133 +1.41065 1.56018 +6.55282 7.18725 +5.72986 6.37151 +7.26968 8.22623 +3.32643 3.73606 +3.77325 4.63115 +1.05457 1.83651 +8.6815 8.85251 +3.91285 4.17139 +0.380936 0.842109 +7.33227 7.69334 +8.45635 8.923 +4.1769 5.08373 +0.501374 2.23328 +-0.161782 1.28908 +3.44716 3.4662 +3.15394 4.30243 +8.71416 9.3781 +6.3034 8.62893 +6.53824 7.04611 +0.6386 1.35269 +0.862088 0.960371 +5.12963 5.20203 +1.58695 2.0452 +6.57698 6.63228 +3.87747 4.45669 +1.51273 3.25669 +-0.0992804 0.667302 +4.7489 4.80059 +0.0280559 1.90471 +6.7462 8.27612 +0.915652 1.30007 +2.79556 3.77404 +9.87989 10.0722 +9.39105 9.84229 +7.57235 9.37122 +5.09426 6.44266 +6.3994 6.72037 +5.73441 6.99341 +6.9079 7.88049 +4.2003 4.41933 +-1.72447 2.25877 +9.04907 9.64323 +4.40473 5.3593 +9.31201 9.96079 +7.28343 8.74163 +3.0172 6.23779 +8.08422 8.56069 +6.83038 6.99863 +2.32038 3.1289 +7.42302 8.26286 +6.66905 7.18496 +0.730748 1.61335 +4.00564 5.73993 +2.81231 3.67489 +2.33178 2.37845 +9.03302 9.68681 +0.567816 0.755485 +7.89783 8.7621 +0.177662 0.332833 +-0.181569 1.36821 +6.22158 6.55787 +4.67115 5.16995 +0.806432 0.820738 +7.69636 7.87402 +4.40933 4.54995 +9.1329 9.15037 +8.87416 9.04329 +1.14349 1.8993 +3.29756 4.7172 +6.67873 8.31364 +6.91238 7.1654 +0.483084 1.55006 +2.66058 3.86294 +5.93347 6.06085 +7.40514 9.05071 diff --git a/bottleneck/tests/data/test_011_A b/bottleneck/tests/data/test_011_A new file mode 100644 index 0000000..164b71d --- /dev/null +++ b/bottleneck/tests/data/test_011_A @@ -0,0 +1,200 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 diff --git a/bottleneck/tests/data/test_011_B b/bottleneck/tests/data/test_011_B new file mode 100644 index 0000000..761943d --- /dev/null +++ b/bottleneck/tests/data/test_011_B @@ -0,0 +1,200 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 diff --git a/bottleneck/tests/data/test_012_A b/bottleneck/tests/data/test_012_A new file mode 100644 index 0000000..094c6e0 --- /dev/null +++ b/bottleneck/tests/data/test_012_A @@ -0,0 +1,5000 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 +0.903753 1.57921 +0.380744 1.88053 +1.3164 1.79885 +0.199366 0.576639 +5.53683 6.49433 +8.8705 9.14396 +3.1401 3.98761 +4.82675 6.69396 +7.28593 8.08916 +8.11312 9.92914 +3.25737 3.42109 +2.58413 4.57223 +2.65202 2.77196 +-0.31616 1.51568 +4.1621 5.29563 +4.49155 5.21037 +7.28481 7.31722 +9.70568 10.0406 +2.39057 2.85874 +2.30626 3.16244 +1.15896 2.09616 +5.91343 7.33024 +-0.172181 0.177363 +5.08934 6.10928 +7.15508 7.55315 +4.43036 4.68093 +6.00772 6.49566 +7.9247 8.43809 +1.57028 2.52328 +3.45458 4.43692 +3.18257 4.83824 +1.48243 1.91225 +2.59025 2.99596 +6.93059 8.34359 +4.53752 7.51216 +6.42857 6.51513 +5.5663 6.13877 +7.54367 7.56485 +9.01229 9.19913 +2.84158 3.23347 +0.42959 0.620618 +8.77033 9.33787 +8.06103 8.30989 +6.48425 7.83668 +4.66949 6.00205 +4.46683 4.66247 +8.96738 9.07714 +0.463093 0.514808 +7.72986 9.44537 +6.31391 6.8289 +0.883295 1.70946 +3.73278 3.98015 +6.73453 6.92514 +3.58434 4.43262 +0.236286 1.4601 +2.00505 2.38684 +3.845 4.20708 +1.18852 3.04911 +0.766784 1.00641 +7.38781 8.11216 +8.9396 9.27589 +0.369822 1.53322 +8.76527 9.23987 +0.663408 0.803445 +9.69209 10.1455 +9.73379 10.234 +3.47602 4.89968 +4.12754 5.45249 +7.31984 8.57369 +0.989101 1.47678 +5.57662 5.83292 +4.99092 6.85044 +4.35272 4.3683 +0.0517815 1.92227 +7.2694 7.80634 +1.35565 1.42783 +8.5638 8.91707 +1.74557 2.74123 +2.18226 2.19664 +-0.901334 1.32691 +0.866613 1.03788 +5.30895 6.31774 +7.70178 8.5675 +4.06894 4.16071 +2.59697 3.53162 +4.30201 5.34212 +4.08762 4.19091 +-0.516192 0.848397 +9.85911 10.1066 +0.472991 1.40069 +6.26012 7.0054 +0.707801 2.15445 +1.73825 1.87193 +0.206301 0.831746 +7.77872 7.92715 +4.94477 5.60361 +3.86216 5.16839 +1.35166 1.54482 +2.91721 3.56193 +4.57242 4.75913 +7.09303 8.29678 +8.18431 8.92151 +6.80303 10.87 +1.29208 1.72027 +1.22224 1.31693 +5.26756 6.26459 +2.55221 3.94397 +6.58902 6.78354 +7.85917 8.89791 +6.59279 7.63115 +4.45787 7.26828 +3.48759 5.33991 +2.13838 3.86589 +1.53368 3.57313 +1.41722 3.19336 +3.48388 4.11958 +1.53756 2.98451 +7.29083 8.22109 +1.2713 2.16915 +6.94685 7.31029 +6.2494 7.04676 +3.00376 3.02028 +1.25232 1.43301 +1.50413 2.25 +2.89098 4.77198 +4.50766 5.89294 +5.5403 6.07893 +-0.101858 0.409209 +3.87963 6.1053 +-0.19564 1.46589 +-0.342077 0.694623 +6.63875 7.42223 +7.89982 9.05857 +4.91121 5.48031 +5.90743 8.35815 +7.13881 8.21597 +4.11493 5.08147 +3.59673 3.77176 +8.08236 8.3237 +1.35842 1.48934 +5.42963 5.85906 +4.60778 4.9734 +-0.607198 0.91225 +5.40263 5.7017 +5.08624 5.63236 +7.34529 9.02233 +7.30013 8.12907 +6.56106 6.75585 +6.82576 7.25434 +2.96037 3.56454 +3.60283 4.09137 +6.35408 6.71888 +-0.688103 0.84579 +8.45128 8.69771 +6.31749 7.3294 +5.82223 6.04761 +1.72983 2.38205 +6.94974 7.76985 +9.681 10.0141 +8.65394 9.2456 +2.52904 3.39548 +6.66609 7.35785 +4.18963 4.5473 +3.58643 3.80513 +2.88796 3.82413 +0.992066 1.1477 +4.57942 5.15419 +3.02826 4.32268 +5.91565 6.82087 +4.13694 5.13393 +6.28717 6.53257 +1.3149 2.36944 +0.488974 0.981461 +4.32763 4.98272 +-0.420836 0.63619 +7.13406 7.31362 +0.367782 1.91138 +6.14763 6.16713 +0.837933 1.92794 +9.3781 10.0609 +3.22887 5.44584 +5.91554 6.65974 +5.68608 6.02435 +7.99715 8.55953 +5.37106 5.38574 +0.254544 0.374268 +0.184701 0.917061 +9.38005 9.54042 +6.86741 7.35628 +0.87398 1.69093 +7.75845 8.53773 +0.370425 1.35335 +0.699837 0.810893 +3.73223 4.32089 +3.81804 3.85752 +4.85936 5.10097 +2.70381 3.10519 +3.82523 5.27699 +9.13422 10.3317 +4.62775 4.77988 +7.91139 7.95504 +2.72614 4.79958 +0.863357 1.88643 +4.14155 5.02327 +2.49683 4.11585 +1.06741 1.11516 +6.20979 8.38443 +0.936362 2.46703 +6.58231 7.85063 +1.89469 2.31422 +8.70668 9.14006 +5.76486 6.1122 +3.15778 3.76679 +0.248282 2.19881 +1.25317 1.92694 +7.81837 9.53067 +-0.582906 0.818904 +8.34194 8.37845 +4.4913 5.10164 +3.86376 5.5453 +6.94054 7.68699 +2.07462 2.5811 +0.518698 2.1529 +3.51773 4.60946 +8.39915 8.98446 +1.63685 2.19755 +6.60737 9.05917 +2.06667 3.23994 +3.18822 3.31219 +2.44332 3.22088 +4.755 4.87118 +4.34245 4.91565 +4.64562 4.8104 +2.73282 3.35646 +9.48057 9.86441 +0.640899 1.03356 +0.789475 0.925731 +1.4247 1.58347 +1.47747 2.25408 +8.8612 9.81597 +8.44147 10.6885 +9.07046 10.0877 +0.350125 1.15765 +4.45375 5.73964 +4.06526 4.26457 +7.50776 8.23491 +1.55452 1.63786 +2.8399 4.52559 +1.34319 1.47951 +5.21572 5.65702 +5.85695 6.75574 +8.21826 10.657 +-0.0479956 1.79162 +1.72905 1.78113 +3.35685 4.03797 +3.7123 5.82296 +8.56751 10.2992 +4.07987 4.25273 +5.8347 6.07253 +3.25283 3.99065 +9.31995 10.3647 +0.649025 1.14496 +1.06966 2.04182 +7.59831 7.85826 +3.35263 3.84374 +4.91371 5.10148 +8.0875 9.23421 +3.00484 5.14282 +8.60448 9.09442 +5.61429 6.24037 +3.4729 4.17907 +7.18702 7.26274 +0.729966 0.928899 +2.27264 2.81241 +2.67248 3.91661 +3.98443 4.64406 +5.50463 6.92435 +-0.257961 0.905736 +5.71363 6.67387 +4.12643 4.66467 +3.97623 4.64917 +9.71227 9.8243 +8.66674 8.97634 +7.94673 8.73904 +7.45228 8.14466 +3.78405 4.81189 +4.05505 5.00011 +2.84957 3.15451 +6.93785 7.58172 +1.85006 1.96814 +6.82256 7.00166 +2.42727 2.68161 +8.06129 8.76308 +1.53758 3.67482 +2.5057 4.18495 +7.09618 7.79664 +1.12843 1.46228 +1.61447 2.2668 +5.58639 5.70776 +8.15398 8.34959 +2.49733 2.57643 +5.18817 5.32462 +5.62963 5.86377 +1.95215 2.26641 +7.22129 7.23255 +5.99833 6.18639 +6.20875 7.13868 +6.814 7.6597 +7.41314 9.49798 +5.48819 6.31634 +4.81318 5.08156 +9.15434 9.42787 +4.83201 5.43295 +1.44477 2.6455 +8.8907 10.4727 +3.19487 3.21255 +1.47291 3.13113 +4.14796 5.10058 +5.85016 8.41212 +7.58183 8.53659 +9.5978 10.2877 +1.5954 2.58394 +2.65561 4.0975 +-0.157024 0.16627 +7.04379 7.75368 +2.39896 2.7728 +2.42376 3.58085 +0.158653 0.857045 +7.82101 9.01833 +6.80499 7.35261 +6.62833 6.66255 +4.90229 5.45681 +8.50205 8.69236 +2.01845 2.06924 +8.2503 9.04222 +4.58265 5.52758 +8.6176 9.74887 +1.28468 1.77019 +5.40424 6.20705 +0.943905 1.98023 +4.2702 4.41287 +3.89454 4.4814 +0.585132 1.56351 +9.45354 10.5374 +3.7501 5.07553 +7.53248 8.14004 +4.60026 4.78921 +1.61073 4.22368 +6.22591 7.40966 +0.57866 1.0522 +5.877 6.55882 +3.54573 3.7731 +7.64294 7.66103 +8.2399 9.14032 +0.307808 0.571367 +7.89791 9.25734 +5.2852 5.84332 +0.45713 2.42223 +7.73426 8.48158 +8.0058 9.46405 +8.03189 8.41868 +1.54624 1.98914 +7.24167 7.27699 +8.61226 8.83199 +5.38365 6.52599 +0.827018 1.51428 +7.19285 7.48372 +-0.0969552 2.16007 +4.08084 6.32563 +9.16026 10.2604 +0.206147 0.717435 +4.00643 4.8093 +2.16139 3.14759 +1.73359 3.13485 +9.1103 9.36052 +7.05621 7.43901 +4.83509 6.07581 +5.67164 7.89488 +7.93353 8.18454 +2.59566 3.1842 +3.62521 4.95121 +3.0297 3.18649 +1.08515 2.69289 +3.77063 5.7789 +0.106035 1.27409 +0.601099 2.13481 +6.98837 7.58833 +9.22955 9.79149 +1.6398 1.78726 +2.30423 3.34814 +2.3912 2.81842 +4.71724 6.16966 +5.13553 5.5016 +5.34117 5.45075 +9.32776 10.0676 +4.54244 5.29058 +4.01337 5.73188 +8.17427 8.39652 +1.96122 2.6921 +0.594267 1.00176 +-0.136973 0.977133 +6.41362 6.78056 +1.68388 2.39891 +9.50795 10.2315 +-0.262703 1.15557 +8.72229 9.683 +5.41821 5.67519 +4.93514 7.15867 +4.07046 4.26702 +-0.00866106 0.252353 +8.65877 10.1527 +2.10958 3.40353 +2.94947 3.43201 +6.32014 7.06279 +2.55034 2.89646 +3.87777 5.68044 +2.05325 3.00968 +5.11855 6.55784 +8.99618 9.22608 +3.36303 3.84902 +2.6234 3.70832 +7.35189 8.30856 +6.43777 7.28495 +5.33954 5.48055 +0.15999 0.391114 +3.4492 5.07088 +2.38503 2.42742 +3.88912 4.93246 +2.76303 4.54991 +6.56261 7.60381 +3.64198 3.72471 +1.70542 1.78806 +9.71115 9.88315 +0.471586 1.82377 +9.27611 10.5725 +0.486889 0.851587 +4.39234 5.10637 +9.54209 9.8955 +6.99602 7.42461 +2.98797 3.74623 +5.89424 6.4498 +9.63845 9.86333 +4.39828 5.18646 +2.30118 3.5758 +8.68128 9.56011 +9.00505 10.4304 +-0.22184 0.233296 +6.48492 7.60283 +1.54156 2.60693 +4.06808 6.39369 +5.52361 6.26241 +-0.698727 0.745524 +2.30742 2.41924 +0.655833 1.65752 +6.94733 7.81866 +7.83136 9.10651 +6.45284 7.1931 +6.09683 6.66159 +9.03299 9.4163 +1.86392 3.26189 +0.54863 2.07194 +0.364026 1.38376 +0.706954 1.0736 +-0.111015 0.584367 +1.54265 2.1413 +0.501172 0.57928 +2.09411 2.28902 +1.89894 4.09104 +8.72895 8.87045 +5.27709 5.72545 +0.164581 1.64188 +8.39203 8.73608 +8.21523 8.45002 +9.62006 10.1665 +4.79076 6.26442 +3.44189 3.68669 +8.93789 9.38343 +7.07036 7.64194 +8.34396 9.56445 +8.29992 8.64954 +5.82566 7.83287 +2.43008 3.4476 +1.81121 2.12203 +4.36108 4.3842 +6.28756 6.95939 +3.8698 5.79519 +0.644581 0.699162 +9.71982 10.2422 +4.86545 5.00544 +8.3808 9.29356 +1.34495 1.40972 +1.03641 2.01838 +8.55609 9.99958 +1.40813 3.46097 +3.20928 4.08838 +8.24345 9.11587 +1.27604 2.03462 +8.28298 8.46252 +2.20644 3.19585 +1.91396 2.30108 +4.2553 5.66006 +7.34925 8.38275 +6.28319 7.22199 +8.42171 9.62596 +1.12059 1.18262 +1.37555 1.84196 +4.39663 4.93639 +9.28044 9.58437 +5.47407 6.88593 +8.36529 8.49813 +9.40208 10.5922 +-0.451389 1.92404 +2.89431 3.19453 +6.51433 8.02158 +5.52163 6.06786 +7.63525 9.86457 +4.13898 5.05845 +0.136662 0.503748 +6.13492 6.74997 +8.37416 9.18971 +8.64164 8.82663 +0.941173 1.16158 +6.9073 8.26916 +8.37278 8.44326 +8.8951 9.20427 +8.40149 9.17577 +3.60361 4.57183 +8.67263 10.1127 +5.89716 6.45412 +1.97285 2.35593 +7.22973 8.13467 +9.55645 9.92529 +0.261578 0.836274 +9.04414 9.45485 +6.18043 6.54229 +8.88579 9.54087 +1.82613 2.93849 +5.7599 5.96366 +5.23105 5.5541 +0.425229 1.44436 +0.32065 2.60892 +7.83655 9.48786 +2.3168 3.45972 +2.35466 3.23342 +8.24494 8.27258 +7.32678 7.74264 +8.37275 10.0741 +4.17337 4.98348 +-0.162009 0.724431 +9.49757 9.76377 +8.69435 9.08089 +4.13841 4.7514 +7.26358 7.55514 +6.91912 6.93 +6.7883 7.18296 +-0.614315 1.1857 +6.05907 7.33557 +4.86704 4.87705 +8.50012 9.14836 +1.83683 3.09895 +6.16389 8.39248 +3.03556 4.41004 +4.72416 5.05782 +1.98183 3.19183 +2.77103 5.71501 +4.90002 4.9817 +0.269258 0.725628 +5.59551 7.05038 +2.95416 3.09633 +2.17662 3.18385 +6.67536 7.56762 +7.31678 7.39321 +3.84158 3.85359 +4.38203 5.10149 +0.816784 1.09918 +0.70131 0.739502 +0.276631 2.32633 +9.15839 9.49433 +0.721295 1.97673 +2.63875 2.75437 +5.00344 5.5645 +2.24555 2.81234 +7.74465 9.07646 +2.35244 4.90632 +0.812093 0.954419 +3.97904 5.2071 +4.19177 4.83646 +0.853012 1.331 +2.64112 3.25613 +0.0894716 1.61954 +3.39617 3.40859 +1.56906 2.28518 +2.37258 4.36515 +1.60997 1.7561 +5.15275 5.33281 +6.47824 7.47529 +2.51145 3.29949 +2.71094 2.77785 +8.84653 9.48398 +1.3246 1.66664 +7.43718 7.5546 +3.68985 4.24649 +4.50553 4.51669 +4.15617 4.54887 +8.55319 10.2136 +2.1448 3.55805 +4.64594 4.71505 +1.71763 1.99977 +4.98066 5.46709 +7.7779 8.36497 +-0.0604997 0.301294 +5.11873 7.32867 +4.94567 5.5986 +5.32645 6.26835 +2.5768 3.13511 +3.31604 3.87555 +1.60834 2.68762 +3.30552 3.85211 +4.26741 4.98636 +0.820475 1.18854 +7.91501 10.7203 +5.17391 5.30351 +4.00452 5.75141 +2.37722 3.4602 +2.2373 2.94837 +1.62462 3.48264 +7.98507 9.2566 +5.32504 5.56388 +0.760614 0.7802 +0.855659 1.01522 +3.11231 4.43223 +5.62821 6.21564 +4.96845 5.35921 +8.10559 9.11106 +1.02533 1.13103 +6.99976 7.0788 +1.87628 2.58801 +1.11023 2.24655 +5.23343 5.45086 +0.95875 2.25343 +7.45917 8.23614 +2.72245 3.04663 +8.66816 8.70698 +5.55734 7.12262 +1.01935 1.88271 +0.804417 1.76187 +7.82703 8.78426 +4.77321 6.15199 +2.91503 3.69352 +0.776735 1.08883 +5.19981 5.46442 +9.06483 10.4008 +7.72082 8.26398 +2.9854 3.26573 +0.584028 2.60443 +0.700994 1.10379 +5.47612 5.94502 +-0.318442 0.986786 +5.0704 5.08055 +3.83732 4.4826 +5.60843 6.59005 +8.81432 9.7851 +6.28792 6.65284 +1.16812 2.27701 +7.15234 9.66795 +9.02188 9.15339 +1.76112 2.04839 +7.49419 7.6204 +5.1765 5.497 +1.45855 1.94969 +1.35003 1.55822 +2.50453 2.86815 +7.10451 8.51352 +3.87727 4.1124 +1.84876 2.79351 +3.01661 4.05396 +-0.16814 0.366484 +-0.538895 0.608786 +7.59933 9.00744 +0.938648 2.38471 +5.76934 6.16572 +8.20416 8.62505 +8.64542 8.7264 +2.75784 2.7828 +0.794451 1.97817 +9.21331 10.5156 +8.46671 8.80572 +3.94814 5.16845 +6.73654 6.97397 +4.05301 4.93008 +6.37833 6.77985 +7.21161 8.15994 +3.74993 4.61029 +-0.127938 1.09853 +2.82957 4.28816 +6.50564 6.59445 +8.37926 8.48332 +0.757443 1.74585 +0.232438 0.972293 +6.99187 8.7098 +7.20368 8.44301 +4.4801 6.07501 +4.34015 6.1495 +2.19394 3.22334 +7.29817 8.41021 +1.16627 2.68901 +4.62423 5.08039 +0.955655 2.22882 +1.45862 3.07065 +1.69815 2.56291 +4.01179 4.36587 +7.135 7.75829 +6.6823 7.27765 +5.44745 5.67195 +4.94594 5.42067 +0.267772 0.301939 +0.676432 1.6296 +1.37335 1.91645 +1.89051 2.38631 +4.84386 6.30539 +8.95613 10.944 +2.18119 2.41821 +5.74901 6.16952 +7.5431 7.88071 +9.05278 9.8128 +0.201334 1.65323 +2.82787 3.82083 +3.07073 3.08475 +8.99671 10.1766 +5.43261 6.12137 +4.83693 4.86848 +6.31804 7.21544 +2.34491 3.2562 +6.05941 6.53725 +-0.483381 1.17347 +5.53777 5.72651 +3.28875 3.47472 +3.94609 4.9418 +7.45585 8.6871 +1.50066 2.57215 +8.10112 8.67954 +6.24737 6.42635 +0.64413 1.05759 +7.1741 8.21476 +0.502722 1.77462 +0.783663 1.74174 +9.52704 9.9109 +-0.473873 2.01013 +7.07946 7.11474 +0.857335 1.6501 +4.00225 4.84453 +5.40598 6.30573 +8.18802 8.30067 +9.00412 10.9588 +9.8362 10.1517 +7.62735 8.37572 +3.41477 4.63099 +2.51254 2.81559 +6.36702 6.56061 +5.11842 5.35515 +5.21873 5.73296 +5.73528 7.77276 +3.64993 4.66826 +7.12664 8.46553 +8.7257 9.16851 +1.27615 2.20376 +7.46188 8.20752 +2.64939 2.66373 +4.94147 6.0509 +6.3805 7.48841 +6.25197 7.12327 +0.0885331 1.2682 +4.97356 6.58488 +4.11917 4.27267 +9.08793 9.70385 +0.897277 1.31702 +6.87538 8.25544 +1.55565 1.59492 +2.62483 3.54274 +1.49631 2.92263 +9.45305 9.97728 +6.24087 6.4577 +3.94636 5.13669 +-0.000956745 1.08235 +1.46134 1.83767 +9.18517 10.6601 +-0.740186 1.81269 +5.81977 6.15818 +7.0529 7.99421 +6.17753 7.49749 +8.63091 9.04205 +9.65219 10.1558 +3.12839 4.99211 +2.97262 4.07384 +4.28605 4.33171 +4.15906 5.6805 +1.35165 1.50732 +0.524207 2.12307 +5.32468 7.01472 +3.16982 4.87893 +6.88786 8.34191 +3.81703 5.22335 +3.86772 4.37359 +8.19386 10.0705 +1.73155 3.16695 +4.31685 4.62261 +9.40618 9.89612 +4.41215 5.19659 +2.35595 2.63543 +7.88481 8.14203 +7.17062 10.3534 +9.41379 10.389 +7.99867 9.01239 +3.31382 4.04915 +5.39222 6.07657 +8.5187 8.65976 +9.30132 10.6131 +7.17351 7.93596 +4.80134 6.72724 +3.59756 4.65182 +1.08248 1.17479 +1.03124 1.06871 +6.43154 6.95098 +-0.102199 0.59801 +4.94795 5.18081 +6.39126 7.30258 +1.52738 2.04271 +1.80373 2.33093 +2.72251 3.01677 +0.296722 1.10844 +6.39104 6.51567 +8.70965 8.78714 +2.07858 4.41695 +1.91027 2.9718 +1.42944 2.01864 +1.96347 2.73397 +4.0701 4.22456 +4.02859 4.05107 +7.10977 7.98092 +8.21148 9.54287 +6.59231 7.65109 +0.144191 0.830665 +2.0192 2.23704 +8.03482 8.39591 +8.90473 9.98543 +2.18284 2.70166 +3.05569 3.54238 +8.35319 9.39539 +2.00803 2.42866 +2.35282 3.13763 +2.20155 2.79377 +1.76531 2.94892 +7.52749 7.72567 +3.02266 3.24778 +4.01741 4.22521 +9.75263 9.91571 +6.45502 6.67838 +2.24912 3.47262 +1.84372 2.26517 +4.09559 5.71188 +1.43811 2.33732 +3.89171 4.16905 +3.01506 3.9725 +0.0273168 1.51766 +5.04118 5.80507 +3.08517 4.17316 +8.81637 8.8332 +8.74055 9.50143 +2.36904 2.69008 +6.39733 6.44221 +8.53272 9.51114 +9.48423 9.55002 +8.65645 9.04872 +6.66352 7.48009 +5.64389 7.88656 +5.75301 6.6759 +3.28645 4.22757 +4.99482 5.82988 +3.00004 4.0273 +1.45249 1.56662 +4.96263 5.32195 +7.91351 8.1437 +1.02034 1.56249 +0.71376 1.73319 +0.709968 1.44651 +9.01414 9.54799 +4.02116 4.68005 +7.10903 7.27075 +7.21322 8.71031 +1.6644 2.27186 +3.71304 4.68764 +9.66257 10.1452 +5.34477 5.46136 +9.27722 10.583 +3.82328 4.83316 +4.77019 5.07928 +9.07112 9.23836 +6.99091 7.25634 +2.11871 2.3054 +7.88242 7.98572 +0.570809 0.714073 +8.51532 9.49151 +0.329247 2.48897 +4.78202 5.36476 +1.47969 2.78867 +6.75011 7.36769 +2.31162 2.39533 +3.50434 4.48026 +5.84603 6.28861 +7.5337 7.62538 +1.09955 2.85741 +6.09915 7.20381 +0.933825 2.37925 +0.576363 2.0182 +3.12126 3.22507 +2.85313 3.02656 +3.25724 3.92077 +5.48575 6.58011 +1.02824 1.65415 +8.68703 9.06219 +3.28389 3.86349 +5.80264 6.12775 +7.11846 7.47444 +1.29638 3.38601 +6.37908 7.05986 +-0.592438 0.854361 +0.39233 1.17768 +2.1497 3.94423 +2.42336 2.43441 +6.94806 8.30626 +0.79865 1.4173 +1.41455 1.43684 +0.240074 1.16712 +4.18593 5.9929 +6.161 6.564 +0.726091 1.90706 +0.375606 0.694866 +4.09349 4.26452 +2.01652 2.68038 +8.99301 9.90549 +8.93909 9.17673 +1.10427 2.01247 +9.12668 9.15282 +1.08098 1.55374 +0.377836 0.414809 +7.28611 8.86318 +8.3542 8.53251 +3.86353 4.12875 +6.7631 7.40068 +4.61679 4.78182 +2.12935 3.45492 +3.68233 4.0457 +6.68131 8.22111 +8.79197 8.80474 +1.8915 2.26287 +0.387586 3.073 +6.46798 7.57381 +7.79742 9.34526 +-1.21538 1.67303 +2.07845 2.66028 +3.14148 4.46647 +1.66789 2.73375 +8.49821 10.0574 +8.42537 8.89906 +0.618349 2.72887 +6.8229 7.54501 +6.99343 7.35322 +7.34223 8.68781 +3.18834 3.98274 +8.86908 10.2535 +3.39839 3.76171 +0.188168 0.392276 +1.68187 3.53401 +6.50423 6.71714 +7.61191 8.89715 +1.68463 2.09275 +5.94627 7.6003 +2.15865 3.24126 +7.93639 8.53826 +2.99626 3.43273 +7.71028 8.41172 +3.19472 4.60878 +8.36123 8.92549 +8.92975 9.02783 +2.87187 3.49672 +6.76949 7.71139 +8.09121 9.31151 +6.84199 7.44009 +0.730655 0.800873 +7.5208 7.54109 +6.75992 7.55017 +6.09818 6.17399 +0.639209 1.27283 +3.01917 3.22327 +1.69181 2.60614 +9.49245 9.5842 +-0.418034 1.08035 +5.77705 6.4705 +6.79362 8.51993 +9.73155 9.81609 +3.71503 3.92022 +6.18589 6.77634 +3.94124 4.23942 +7.59911 8.05275 +3.68865 5.10948 +7.63926 8.63019 +-0.049855 0.0844425 +-0.41188 0.807786 +1.35962 1.81039 +5.40579 6.15098 +1.38594 2.0059 +6.93444 8.71958 +7.01229 9.38008 +-0.0974976 0.962679 +4.74131 6.59152 +1.02343 1.59245 +1.55629 1.9128 +6.28353 8.38021 +5.66349 5.79644 +1.72629 2.28563 +1.64539 2.82654 +0.359466 1.05106 +4.37569 4.82703 +5.87657 6.37853 +1.46316 1.65333 +7.44494 7.5985 +1.16846 1.98579 +4.43371 4.93234 +2.31838 2.47777 +7.52687 8.44423 +6.08056 7.42253 +9.16144 9.94783 +4.74382 4.95616 +0.248344 1.05335 +6.12345 7.43941 +9.45647 9.99799 +3.77124 4.75199 +3.31315 3.44873 +-0.0909828 1.51271 +7.03234 8.02546 +8.11403 9.11461 +6.734 7.34799 +1.08903 1.18319 +2.72871 4.31607 +6.53688 7.52754 +1.07868 1.27792 +6.28409 6.56795 +4.89866 5.79458 +9.06994 9.1221 +2.54989 3.14338 +3.69971 5.71717 +3.7113 4.55076 +8.91864 9.64522 +8.75634 8.82359 +9.02242 9.03869 +3.59945 4.20169 +4.98557 5.07401 +4.81526 5.74009 +7.264 8.63749 +2.79579 4.43389 +2.87204 4.66432 +2.32487 3.72127 +3.99704 4.72567 +8.17229 9.0158 +-0.72926 0.823658 +2.52355 3.32725 +5.3446 6.63868 +4.48935 7.37833 +3.08173 3.0968 +2.41585 3.23026 +9.23187 10.5413 +5.50099 5.51888 +1.29634 1.88846 +-0.0113225 1.41526 +6.34508 7.53417 +0.383019 2.25144 +5.0649 5.40222 +3.08221 3.76296 +9.29111 10.6833 +2.19714 2.94735 +8.75711 9.48583 +8.61564 8.69349 +1.9362 3.96191 +3.7962 4.44382 +7.78501 9.03843 +5.79649 7.29675 +6.03048 7.4316 +1.31105 4.36446 +6.5882 7.03622 +4.88148 7.12474 +6.62305 6.90973 +2.27488 2.73731 +8.42703 9.28888 +7.72928 8.53989 +7.27021 8.63879 +0.992908 1.92001 +-0.282737 0.511292 +7.88963 8.03117 +6.93371 8.26148 +-0.0346633 0.403617 +8.7827 8.82558 +5.16876 5.59742 +8.61275 8.73843 +5.70578 6.02783 +9.08706 9.35903 +9.32728 9.83021 +9.20058 10.2497 +6.79824 7.3024 +7.17979 7.51783 +0.918555 2.67878 +7.9662 8.63241 +8.85903 10.3145 +9.34614 10.1964 +9.05027 9.79872 +8.28959 8.45837 +1.32518 2.04557 +8.72848 9.16742 +5.92126 6.77277 +8.31504 8.78631 +1.02487 1.70172 +4.45204 4.72842 +8.20636 10.4724 +5.86211 6.25457 +6.15754 7.71303 +8.37832 8.82577 +4.25233 4.59417 +9.41451 9.95324 +9.372 10.4461 +1.8346 2.7144 +8.00681 8.14717 +7.03997 7.06753 +7.16892 7.70102 +7.01781 7.46799 +1.78526 1.7969 +1.63304 2.2011 +8.59718 8.61083 +9.43498 10.3636 +4.98718 5.32487 +3.65451 4.89601 +8.82368 9.11333 +-0.104862 0.598773 +4.97756 5.62342 +1.99876 3.24686 +2.32242 4.01096 +4.04914 4.77892 +3.81545 4.32583 +3.30153 3.46783 +3.14287 4.04718 +8.65711 8.76768 +9.09385 10.6898 +4.82771 5.64405 +5.98783 6.36785 +7.93397 9.6543 +4.89726 5.65486 +5.08717 5.22314 +6.59377 7.23748 +3.58289 3.98597 +0.177884 0.397629 +5.30856 5.79257 +2.53943 3.98007 +6.51217 6.59644 +0.196888 1.99904 +3.8709 4.1901 +2.37646 2.50997 +7.03837 8.13287 +6.8674 6.89535 +0.576964 2.08851 +0.902928 2.86981 +8.59261 9.20279 +5.96621 7.49899 +0.617602 1.83267 +2.29189 2.6361 +4.34207 4.61026 +6.19963 6.76443 +1.15955 1.44068 +5.25852 6.33905 +6.37306 7.53103 +9.13334 10.039 +8.67743 9.93959 +5.62973 6.04375 +8.32286 8.77042 +3.28772 6.1722 +4.97902 5.47249 +3.37765 5.07238 +4.58025 4.84341 +2.76807 3.18817 +4.27581 4.43023 +6.92572 7.68461 +0.279247 1.0561 +1.10903 2.61106 +6.71708 6.73132 +2.66415 3.75702 +8.0513 9.80334 +4.82466 6.04232 +2.59971 2.85768 +9.04689 9.73945 +3.48338 5.16622 +7.90925 8.92774 +7.30264 8.06247 +7.59087 8.26476 +0.150315 0.423068 +8.62726 9.74636 +9.01983 9.71707 +6.84007 7.40541 +8.87829 9.48342 +2.69214 3.71481 +0.580036 0.77289 +9.474 9.83397 +5.80151 6.08527 +3.63837 5.27137 +8.5848 8.65779 +7.88338 8.13276 +3.27992 4.20963 +6.21244 7.28079 +-0.348924 1.38478 +5.26688 5.93787 +3.78941 5.01009 +6.41929 8.38529 +1.41724 1.67733 +0.212821 1.58246 +0.0697189 0.160497 +9.57839 10.2377 +9.03332 9.70645 +4.94572 5.15163 +3.16999 4.536 +5.77494 6.68359 +5.89258 6.11852 +7.72257 8.21668 +8.42501 8.44905 +8.7196 8.86465 +4.392 5.1076 +1.88249 2.54422 +1.38092 1.60326 +5.04142 6.37374 +4.31795 5.91152 +1.79399 2.09314 +6.65405 8.32262 +1.36356 1.58538 +5.45456 6.55824 +4.95807 6.22848 +8.72077 10.2825 +0.745968 2.01546 +6.85041 7.11076 +4.82028 5.34442 +5.77673 8.01294 +8.58582 9.33714 +8.49884 9.21533 +9.05574 9.4096 +3.19932 3.27024 +9.50227 9.96685 +0.771636 1.0617 +9.00621 9.36397 +-0.097167 1.39463 +7.79622 8.43537 +8.05228 10.1504 +2.21685 4.17072 +1.82476 2.45381 +4.34408 4.56578 +9.27538 9.54701 +6.80153 7.44115 +7.38884 7.84448 +7.17526 8.00165 +5.85812 7.67326 +5.25545 6.30791 +5.68518 5.94055 +3.77685 4.1545 +0.530928 0.737248 +3.9772 4.59563 +8.96322 9.45618 +7.98322 8.44165 +3.42929 4.22329 +3.66445 4.7583 +-0.183652 0.434842 +3.16492 3.95726 +6.87407 7.89944 +5.08921 5.7745 +2.85466 3.04505 +7.12685 7.41248 +0.715419 0.876676 +3.47441 5.21753 +9.13594 9.87799 +5.52459 6.35691 +5.12544 6.12935 +2.44296 2.91543 +2.75148 4.19886 +1.43478 4.3919 +6.6352 7.07768 +4.72283 5.11506 +6.36434 7.69268 +2.32643 2.75289 +5.46566 6.22854 +6.37995 6.76989 +1.52564 3.55871 +1.05807 2.19393 +1.95374 4.08727 +8.11273 8.12767 +2.85955 4.71355 +4.89009 6.88516 +2.06859 2.25512 +7.50556 8.77923 +4.43353 5.11915 +5.16308 5.9695 +1.12072 1.69277 +3.96494 4.38143 +7.06931 7.89524 +0.514522 1.51265 +6.56389 7.01146 +1.51362 1.8541 +4.90339 5.51209 +2.11422 3.15457 +2.50094 3.92557 +8.24319 8.62826 +-0.0843505 0.710377 +6.35956 7.89457 +-0.790954 1.2964 +4.02253 5.19193 +2.7425 3.46763 +9.41469 10.1367 +1.57636 2.25105 +3.18647 3.38738 +8.36644 9.66791 +0.180846 0.461221 +7.07675 7.71881 +0.265366 1.19275 +5.43007 6.4854 +9.13912 9.23294 +9.52905 10.4029 +1.18712 2.66227 +5.22714 5.62601 +1.87413 2.8716 +5.71882 6.16374 +5.38169 6.13948 +-0.196005 0.236738 +5.36803 6.4395 +8.27713 8.71262 +8.82031 8.8598 +-0.53845 0.564783 +1.80716 1.94173 +5.67905 7.47291 +2.37779 3.64893 +0.574727 0.766424 +4.60701 4.86591 +3.17989 4.37738 +1.36777 3.15112 +1.48092 3.06573 +3.37009 4.06028 +4.17179 6.2073 +6.47953 6.88994 +5.74431 6.5253 +4.88827 5.49049 +5.44148 5.59239 +1.66153 2.63132 +7.69387 7.82267 +5.20911 5.48488 +-0.103218 0.497402 +7.18003 7.33324 +6.54305 8.81732 +0.278108 1.27452 +2.38323 2.94772 +1.2461 2.03246 +5.47052 5.75781 +7.31505 7.35895 +2.22248 4.23589 +0.0305319 0.430773 +8.32043 10.1222 +6.11732 7.09764 +5.08797 5.74991 +6.62491 7.34164 +5.55795 5.66083 +3.27549 4.13145 +1.0113 3.24631 +0.0717186 0.519738 +7.82905 9.30839 +9.90251 9.98691 +0.841457 0.952276 +-0.133927 0.510174 +1.14614 2.82218 +2.59767 4.19742 +3.41095 3.95265 +3.38951 3.75838 +8.86766 9.19437 +9.27927 10.261 +2.33249 2.79402 +5.69681 5.93469 +4.02502 5.38732 +0.797157 1.22845 +7.23558 7.8651 +1.1253 1.99184 +8.58296 8.64267 +-0.400141 0.74698 +3.46677 3.50526 +6.03252 6.64842 +5.8493 6.68938 +3.53209 3.84014 +7.22078 8.98106 +6.21943 7.69944 +0.887198 2.07323 +3.36591 4.57442 +4.30143 6.41179 +4.07556 4.54276 +8.77552 10.0615 +6.7247 7.04044 +9.05494 10.1126 +7.46604 7.80632 +3.38601 3.8043 +5.60475 7.02788 +9.09811 9.4654 +9.33447 9.80012 +8.66499 10.1002 +3.87007 3.88281 +2.87624 3.11359 +5.92385 6.80801 +4.49711 5.01863 +8.84524 9.36225 +6.40944 6.82093 +2.90915 3.68288 +3.96801 4.82534 +5.51744 5.84233 +3.2959 3.44409 +0.18526 0.207322 +5.49717 5.72648 +6.9522 7.1952 +0.769572 1.79343 +5.95522 6.03918 +6.54327 7.7475 +2.13516 3.83957 +-0.388892 0.775076 +1.30128 2.29414 +9.76761 10.1604 +7.38731 8.66002 +7.09229 7.43495 +9.1379 9.52432 +6.75942 7.88717 +7.42824 8.82063 +6.93078 8.19884 +2.307 2.93836 +8.38254 8.84691 +3.90159 5.37938 +0.0413204 0.112203 +0.638217 1.53943 +0.88678 2.49435 +1.99104 2.60847 +6.61595 7.65064 +2.37641 4.71719 +7.94945 9.21404 +5.44594 7.13646 +5.45737 6.12335 +7.39207 8.02885 +5.51588 7.39341 +8.1581 10.0632 +0.197869 1.44516 +-0.0161139 0.73487 +4.24155 4.7304 +0.00374564 1.26481 +8.1878 8.20011 +-0.115544 1.74771 +0.912347 2.52922 +2.72234 4.83268 +6.45577 7.07776 +9.74201 10.1772 +7.11008 8.72914 +4.41921 4.8673 +7.97673 8.36658 +0.438659 0.647061 +4.35086 5.44482 +8.22919 9.34379 +3.53242 5.65576 +1.126 2.32177 +5.95118 6.51364 +3.10519 3.9447 +1.28889 2.26267 +7.04255 7.67791 +3.12614 3.17626 +8.09968 8.49162 +6.07924 7.219 +5.99554 6.52549 +9.14378 9.5773 +5.82872 6.53112 +9.3361 10.1704 +4.3751 6.51675 +3.288 3.98328 +4.56342 4.80185 +7.16574 7.43901 +7.7638 8.47758 +7.31514 7.78499 +7.98942 9.50252 +4.31211 4.70724 +2.9094 3.33304 +0.108736 0.668815 +8.08409 9.11098 +-0.0053985 0.589992 +1.31926 2.72153 +2.28664 2.38813 +7.95237 8.26388 +-0.0283047 0.452099 +7.50295 8.71708 +7.72356 8.63468 +3.48953 3.89579 +7.73814 8.73456 +4.54487 5.45817 +6.45109 7.00312 +3.99915 5.41716 +6.81436 8.5682 +6.86726 7.55999 +2.67863 3.7053 +2.6837 3.39567 +2.84347 2.91724 +5.79383 5.80493 +2.41217 3.0619 +8.78163 9.0998 +1.43456 2.50854 +6.73393 8.53005 +3.02563 3.56456 +3.34628 4.2934 +2.44985 2.92819 +1.38262 2.89341 +4.56337 5.75702 +0.275735 1.16604 +1.39763 2.8108 +9.69128 9.90361 +8.54868 9.66756 +3.01838 3.72831 +8.34017 10.5262 +1.82721 3.0476 +5.9732 6.83307 +2.77874 4.25603 +1.71987 3.1227 +6.33773 7.89103 +1.31982 2.82992 +4.21601 4.9627 +6.68166 6.72653 +0.87708 1.06828 +1.03483 1.26625 +2.996 4.03087 +1.54718 1.57452 +2.33087 2.38226 +2.29464 3.36496 +2.03064 3.41867 +5.8456 6.10406 +7.54614 8.2874 +1.42938 2.89154 +2.65935 3.53883 +3.98845 4.42049 +6.85632 7.15487 +8.12038 9.34993 +0.873558 1.32129 +6.61595 8.00766 +9.49147 9.81947 +-0.0225601 0.328769 +-0.481519 1.37204 +6.31457 7.45251 +4.59738 5.81395 +4.83304 5.63008 +1.95746 2.78657 +2.97889 3.74408 +9.08327 10.702 +3.58219 4.93634 +7.87068 9.77851 +0.330978 1.36031 +4.78145 5.36918 +4.94672 5.56644 +7.66806 8.08613 +4.78512 6.35461 +5.17367 5.74386 +8.65884 9.97088 +9.22053 9.60447 +6.15061 6.58817 +0.0875971 0.541643 +6.45597 7.92002 +0.636824 1.05267 +5.31677 6.12838 +6.51127 6.6731 +0.459551 1.69382 +5.75106 6.41377 +3.68438 4.67415 +9.36302 9.78281 +5.46195 7.99215 +2.55471 2.59231 +-0.0640245 1.33755 +9.36027 10.6198 +2.67955 2.77882 +3.51443 4.10619 +6.83904 7.23692 +2.59553 2.81418 +7.74628 8.95169 +3.86464 3.90067 +3.32377 3.992 +1.43737 2.52191 +3.83927 3.99402 +5.24426 5.35179 +0.833857 1.05277 +8.4062 8.51964 +9.62299 9.66254 +3.55427 5.19048 +1.7003 2.62107 +6.8059 7.49246 +-0.761104 0.773528 +1.37137 1.95048 +2.1222 2.59387 +0.633505 2.04796 +0.605156 1.04336 +7.22842 8.3365 +4.28716 5.28921 +8.14286 9.52015 +7.62467 9.18603 +1.11029 1.81278 +5.05654 5.13597 +0.862653 0.97827 +7.24766 7.92167 +8.80103 8.91467 +3.05841 4.82292 +1.28204 1.55969 +1.58886 2.57874 +0.0537678 1.28837 +8.09303 9.71678 +8.37599 8.85705 +3.18107 4.01971 +6.67019 7.75848 +6.29836 8.21603 +0.86271 1.30358 +3.86126 6.49694 +5.84446 6.24913 +0.475025 0.598151 +6.3477 7.08327 +3.60161 4.51824 +7.13317 8.13858 +4.89052 6.23701 +5.69441 5.99027 +7.18735 8.34853 +9.30182 9.34894 +6.06589 6.15141 +8.05917 8.89642 +5.6136 7.14058 +0.838337 0.959487 +0.56421 2.00841 +6.46876 6.63629 +2.4434 3.92184 +7.97216 9.45372 +8.17926 8.66756 +1.86522 2.01888 +0.983342 1.89079 +2.07322 2.09765 +3.52974 4.73717 +3.24973 4.88691 +5.47789 5.95384 +4.11218 4.57076 +6.61174 7.47165 +8.09302 8.36193 +1.67911 1.69022 +4.436 6.17515 +5.6544 5.74951 +1.50354 1.76043 +4.41433 4.83589 +1.82528 3.53979 +3.98749 4.65527 +6.42503 7.5787 +8.69554 10.1767 +8.39215 8.56999 +8.71646 9.66209 +1.59091 3.39622 +6.12574 6.94955 +7.92527 8.25049 +9.19858 9.49137 +2.73382 2.97747 +4.56558 5.94738 +8.33983 8.58548 +9.00798 9.01838 +4.93268 5.28383 +3.15356 3.58606 +8.28171 8.79351 +1.47358 1.9581 +0.891797 2.05345 +1.56032 2.38159 +2.5152 3.80485 +8.0963 9.88138 +1.1262 1.89279 +7.99336 8.2352 +5.25067 5.41251 +4.57532 5.20101 +1.87911 4.59415 +4.25142 4.70467 +8.18782 8.76989 +9.20478 9.3612 +7.70898 9.7752 +0.655865 0.958924 +4.8883 5.77477 +3.03279 3.47456 +1.01979 1.41661 +8.94219 10.6987 +2.49348 4.58195 +2.44003 3.29005 +3.4725 3.55572 +9.3917 9.95851 +7.08658 7.47686 +3.56413 4.44089 +-0.47868 1.11453 +6.82615 8.00596 +3.49451 3.74705 +8.13286 8.47976 +7.01732 8.82556 +1.19064 1.48887 +5.28851 6.88637 +8.83175 9.49879 +0.939903 1.17024 +7.49124 9.01906 +2.9285 4.23224 +5.68296 6.86273 +8.53897 8.77886 +2.9107 5.01232 +0.748655 1.10265 +4.77258 5.12626 +3.995 4.75289 +2.71467 4.26926 +6.21665 7.16233 +4.53883 5.75731 +4.37153 4.76125 +7.47635 8.75777 +4.82013 6.4699 +9.36015 9.58451 +4.43054 5.86752 +2.10934 2.34705 +3.00306 3.06539 +7.81957 8.44081 +1.97221 3.06916 +0.153393 0.503956 +5.05611 5.27536 +5.73277 5.89001 +3.64807 4.85582 +6.13416 6.1528 +3.85511 4.14045 +0.411725 1.36529 +2.26932 2.5447 +3.51164 4.93266 +2.50955 4.34201 +8.74663 9.39268 +6.2229 6.39303 +4.38059 4.91592 +7.29109 8.62318 +6.31801 6.99532 +9.75036 10.0514 +1.69019 2.41527 +4.20462 5.27729 +6.32944 6.94729 +3.5736 5.21496 +4.48316 4.61828 +1.76915 2.43263 +2.42026 4.09159 +2.08762 2.43074 +5.48161 6.02473 +5.51826 7.47042 +2.78026 3.1552 +7.89469 9.49867 +3.09084 4.54697 +7.20417 7.42408 +5.36528 5.74851 +1.86239 2.41988 +1.55994 2.85743 +4.40182 4.6638 +7.91619 9.01242 +3.08119 3.74714 +1.54108 2.08538 +3.61461 3.64631 +8.76851 9.66257 +-0.645571 1.3366 +-0.707083 1.21005 +7.19571 8.23405 +5.42865 5.89329 +2.12897 2.59222 +0.603102 0.930391 +3.75025 4.63181 +6.14867 6.4526 +7.30947 7.51461 +7.83183 8.79802 +6.06658 8.53246 +1.67895 2.50063 +1.14179 2.04478 +8.59583 8.90112 +-0.918885 1.30717 +0.182607 0.613593 +3.3335 3.77196 +0.783053 2.4368 +6.49331 7.60104 +2.85101 3.28637 +7.42273 7.66905 +3.96433 5.02573 +8.26262 8.40749 +9.24451 9.32783 +4.89036 7.07214 +6.45431 6.96815 +5.20701 6.58747 +7.40142 7.98615 +4.19768 4.9831 +3.32546 3.88811 +-0.471996 0.967855 +9.36172 9.63532 +1.96831 3.00632 +7.537 9.72671 +4.67746 4.81135 +3.10782 4.93642 +4.94809 6.54855 +4.16763 5.25628 +9.04992 10.316 +0.668935 0.680886 +4.02935 4.84503 +5.32499 5.76636 +5.32267 7.15457 +5.18886 5.23491 +4.37053 5.36801 +2.39955 2.74657 +8.19764 8.86645 +4.24706 5.69703 +1.87851 2.36988 +0.886553 1.05064 +7.27428 7.90224 +9.08417 9.44879 +3.11534 4.02019 +6.3284 7.39925 +4.96029 5.59076 +2.58248 3.11741 +7.76513 8.13505 +4.93613 6.51523 +0.565355 1.70512 +2.12366 3.0319 +5.32422 6.84146 +-0.135396 1.08591 +3.7901 4.86303 +4.49677 5.41847 +0.615748 0.834712 +0.64784 1.81859 +6.65505 7.13894 +-1.12744 1.61017 +0.550814 1.24316 +6.66639 6.89866 +6.19271 8.17468 +3.09382 3.78684 +4.41221 4.95889 +7.96091 8.48824 +8.32129 10.2917 +2.13168 2.19835 +1.4635 2.38989 +5.78102 6.42215 +1.70153 3.20616 +5.35068 5.71016 +4.27702 4.37203 +5.13888 6.04764 +4.79644 5.37927 +6.75314 7.66368 +6.04484 6.84064 +4.34947 4.45643 +9.08755 10.396 +0.88804 2.17441 +6.86788 7.88301 +7.94296 8.61664 +8.02387 8.79591 +1.79024 2.40559 +5.50404 6.01044 +7.76772 8.1932 +1.174 1.23693 +6.20571 6.9224 +4.20863 4.48702 +4.16743 4.39075 +-0.11965 0.120778 +7.01234 7.52619 +5.91415 6.46151 +5.28713 5.72354 +6.26981 6.31237 +0.643056 1.43864 +1.62562 1.99875 +0.544992 0.721386 +6.92522 7.09165 +-0.107048 1.12273 +0.644674 0.91244 +8.56904 9.01883 +2.23079 2.56598 +9.79034 10.1123 +8.13788 8.4131 +1.86753 1.95236 +2.97577 3.33272 +8.57454 10.0193 +1.20043 1.53408 +3.43515 3.86571 +5.79075 6.41293 +1.71558 2.52845 +2.39907 3.46652 +9.08289 9.91182 +0.859644 1.07475 +5.30144 5.42157 +-0.441497 0.890794 +3.55044 4.14918 +-0.340115 1.19239 +6.5534 6.76908 +0.836514 2.09196 +8.15747 8.96484 +4.80087 5.14227 +7.72071 8.88223 +5.11901 5.65559 +4.44996 4.63562 +-0.328404 1.3002 +0.90759 1.34556 +5.94839 6.35058 +1.76504 1.78344 +1.32585 2.08994 +7.18641 8.20945 +0.62657 1.06025 +6.28086 6.40975 +5.05525 5.16143 +5.82694 8.07685 +6.23677 7.55394 +-0.226265 0.661443 +1.42599 2.36325 +9.04445 9.92971 +-0.169286 0.185741 +8.34636 10.9042 +9.52494 10.0475 +8.39989 10.1377 +3.89956 4.70428 +3.98673 4.97185 +5.43008 5.67936 +7.76475 7.98591 +4.46895 4.73188 +0.584662 1.54474 +2.12622 2.79994 +1.40578 2.2461 +1.45171 2.02105 +2.05665 3.04611 +2.29818 2.68118 +1.77344 2.98698 +4.92092 5.55302 +7.18758 8.37525 +8.83407 10.0565 +2.91182 4.71932 +6.47293 6.74664 +2.49238 3.69749 +0.487234 0.541003 +4.703 4.92744 +9.8867 9.94918 +1.7713 1.9792 +5.68316 6.90242 +5.62485 6.70656 +7.24837 9.60197 +7.71147 7.76519 +5.22324 5.30661 +9.11258 9.28071 +8.2827 8.90115 +8.90865 9.42138 +7.47233 8.72308 +4.89712 5.65153 +4.12392 4.20239 +5.65325 6.55887 +8.65945 9.05845 +7.9165 8.36489 +1.4952 2.43991 +5.49665 5.80793 +1.67206 2.55302 +0.943544 1.58521 +0.47 0.860959 +6.47638 7.43101 +4.38434 5.97278 +8.12782 9.10574 +5.78143 6.6539 +9.23616 9.40513 +1.6845 2.00736 +6.56955 7.37847 +7.42993 9.04718 +-0.179632 0.450904 +8.65819 9.07724 +7.86567 8.80824 +1.85428 2.7755 +2.29222 2.65374 +4.03614 4.51729 +6.9326 7.07635 +5.50807 6.498 +6.17637 7.26432 +8.7688 9.16308 +7.65 8.88604 +3.74495 4.29991 +8.5671 10.5661 +7.41964 8.21083 +8.04302 9.78783 +0.269663 0.317601 +8.29804 9.40991 +3.90673 4.22298 +8.82384 10.9441 +7.27081 8.19548 +1.30184 1.98993 +8.13028 8.92385 +7.21224 7.35137 +5.02122 5.69666 +0.817219 0.974073 +-0.128067 0.589359 +2.12137 2.74019 +5.24657 5.44714 +1.55805 3.10332 +9.91031 10.0748 +7.13941 7.9143 +-0.183908 0.934079 +3.987 4.11053 +3.26678 3.67608 +9.75921 10.1121 +0.755391 1.06346 +7.28479 7.49982 +1.37522 3.80623 +0.944351 1.46531 +9.49278 10.2372 +8.28946 8.67597 +9.43537 9.58003 +7.73357 8.756 +2.64043 2.8687 +4.70448 6.99929 +3.82199 3.89343 +3.43825 4.10908 +4.42362 5.69086 +8.08536 8.60142 +8.43208 9.31272 +7.5889 8.39208 +7.90112 7.9734 +6.10381 6.80568 +8.76283 8.80151 +1.46728 2.53288 +1.68884 2.47102 +7.63343 8.29838 +9.18852 9.5558 +0.977174 1.4792 +4.7577 5.74873 +4.66433 6.37375 +-0.0952277 0.378184 +5.30929 6.07469 +4.98811 5.16146 +3.0744 5.59799 +0.944909 1.25222 +1.38561 2.51277 +3.77811 4.23459 +2.11604 3.32458 +0.920929 1.17187 +5.23496 6.34905 +6.9953 7.65745 +4.81803 4.89553 +4.69301 5.36777 +-0.208926 2.6111 +7.97334 9.83269 +-0.396673 0.779988 +5.91367 6.47682 +6.27249 6.83533 +5.58931 6.89679 +2.03394 2.67025 +-0.197752 0.383167 +4.69751 7.695 +4.5989 6.07875 +3.7285 4.27396 +7.9807 8.27693 +-0.00248985 1.30934 +2.68016 3.916 +0.881558 1.14567 +4.77066 5.05302 +0.552268 0.919467 +2.46862 2.65199 +1.4009 2.51701 +-0.171185 1.28252 +9.27842 9.90243 +3.51778 3.57728 +6.10071 6.92163 +9.05387 10.0894 +5.52995 5.89082 +8.40216 9.0272 +9.02911 10.1602 +4.85818 7.38829 +1.6762 2.32334 +6.45416 8.62337 +5.44592 6.0245 +3.45876 3.94274 +9.07144 9.16725 +6.51885 7.6363 +7.92593 9.01986 +0.270702 1.57395 +6.11245 6.70173 +1.37658 2.19068 +2.42668 3.43827 +7.98226 8.43306 +3.72269 4.74654 +8.16252 8.58873 +8.81456 9.5363 +-0.338386 0.864811 +1.90693 2.25796 +3.5305 4.17475 +6.07997 7.67393 +0.53347 1.68815 +7.31182 8.44458 +7.77462 8.33613 +3.79975 4.15552 +9.08822 9.9771 +-0.101698 1.05442 +8.44869 9.95724 +-0.0318759 0.532673 +8.09238 9.51356 +5.51514 6.60799 +8.66528 10.3297 +8.25556 9.97893 +-0.220428 0.247563 +0.00453913 0.540444 +1.53599 1.61735 +3.77213 5.06896 +2.65332 2.75864 +6.05811 6.43112 +0.302534 0.803651 +0.393766 1.11611 +9.31035 9.62387 +0.568281 1.7765 +-0.721118 1.27387 +1.83573 2.62578 +1.39953 1.91158 +6.51883 8.52813 +2.60154 2.95054 +6.58322 9.37818 +5.61178 5.67661 +9.56511 10.2767 +9.09174 10.0697 +2.55846 3.39943 +8.38146 9.06138 +7.97019 8.18074 +6.1426 6.42787 +1.15876 1.55463 +2.93483 2.96376 +7.23883 7.29158 +9.64606 10.0674 +4.89825 6.70366 +7.35635 7.96328 +2.2702 2.36797 +-0.0464389 0.395244 +1.14883 2.10411 +4.7309 5.10593 +6.07946 7.37741 +5.50202 6.28822 +3.66574 3.96271 +1.9944 2.3862 +7.58159 7.59275 +1.98712 3.30587 +2.10317 2.89161 +9.66889 9.97287 +1.57327 2.15421 +8.14125 8.30983 +3.77185 4.12658 +8.51624 9.51485 +9.25211 9.722 +2.06312 3.0453 +9.34954 9.91254 +7.31475 8.89322 +7.85044 9.20242 +0.226243 1.28465 +0.0260868 0.575177 +9.40743 10.1655 +4.04324 5.05341 +1.02626 1.48332 +3.33074 3.72025 +9.2005 9.61387 +6.68317 7.14109 +6.82083 8.6312 +4.34816 4.50329 +-0.48874 0.975608 +4.26651 5.68526 +4.89731 5.57569 +2.68984 3.5661 +0.499714 1.01055 +9.01902 9.36142 +3.22067 4.59054 +0.65132 0.860512 +1.6791 2.36642 +8.28222 8.7579 +2.84349 3.24134 +5.64949 6.09512 +3.44026 4.43245 +2.60889 2.6248 +-0.00849234 0.984046 +7.5745 8.65675 +2.07464 2.6488 +2.59747 2.65772 +6.36828 7.42208 +3.83342 4.50127 +5.41167 5.7011 +6.53606 7.53796 +8.21975 9.56176 +1.90113 3.08684 +7.74402 7.82057 +4.26515 5.11327 +5.42743 5.59215 +8.69709 10.0912 +2.87019 3.94798 +9.27013 9.54627 +9.30568 10.2136 +9.02985 9.62917 +3.7589 4.59642 +6.59359 6.86939 +3.26574 4.83488 +5.14545 7.70086 +7.43163 8.05103 +5.72972 5.74457 +0.490113 1.31151 +7.018 7.42627 +6.22976 6.27589 +9.07732 9.30419 +4.3917 4.42663 +8.50298 10.3728 +6.18671 7.53619 +3.51053 4.097 +2.17172 3.56595 +6.08046 6.23691 +9.07361 10.9129 +3.95757 4.11333 +-0.136516 0.78995 +1.34923 3.47002 +0.0562579 0.686502 +9.10943 10.2731 +5.80174 6.16971 +7.86011 7.87649 +5.34384 5.51645 +6.32167 6.76387 +7.70566 8.28038 +-0.319903 0.867682 +-0.372564 0.570014 +8.83696 10.8439 +7.78947 9.38211 +9.25815 10.1092 +5.59721 5.67148 +0.234719 2.42489 +1.06314 2.87416 +1.75391 2.69799 +5.4536 6.66068 +1.35696 1.87102 +2.17418 3.1459 +7.61817 7.98287 +2.92194 3.18393 +7.68243 7.83261 +9.33163 10.5531 +1.14227 2.50228 +5.47911 5.70857 +9.88123 10.0758 +8.81249 8.83145 +6.02747 6.43183 +4.81158 5.79178 +6.65666 7.5047 +4.89085 5.56569 +0.935564 1.71547 +-0.0452879 1.16222 +4.03524 4.6206 +5.88518 6.02658 +2.06227 2.9581 +0.207246 2.2404 +2.81757 3.70318 +0.704257 1.98403 +2.38486 3.30039 +3.57073 4.78358 +1.53721 3.00546 +8.37852 8.39527 +1.54619 1.59789 +1.00447 1.40778 +5.31977 6.43861 +3.82175 3.83209 +3.37738 4.44002 +5.46644 5.97254 +3.88191 5.00688 +4.88046 5.39031 +4.15092 4.93679 +1.75182 2.07399 +1.16434 1.76541 +3.37032 4.29676 +3.1685 3.98533 +1.28787 1.59775 +5.86338 6.17993 +3.8645 4.25757 +1.83947 2.48092 +0.184795 0.586724 +3.13752 3.76447 +2.14264 3.03248 +5.78182 5.9029 +2.47969 3.8088 +2.59206 3.08362 +-0.354871 1.03627 +7.94041 8.05947 +9.48014 9.93817 +0.992727 1.48877 +6.1525 7.51387 +5.00071 6.15665 +7.42074 8.27606 +9.6539 9.83042 +1.08984 1.46387 +5.46282 6.95907 +4.74506 5.13968 +0.357565 1.91464 +9.07652 9.65474 +0.201095 0.646211 +7.04306 7.69131 +1.17728 1.2237 +5.92183 6.29165 +-0.41356 0.491524 +8.38339 10.4509 +8.08648 8.11344 +3.32474 3.39522 +5.762 5.83732 +2.26778 2.55548 +4.86127 5.92868 +3.75949 5.16608 +4.83431 5.88632 +2.65122 3.31344 +9.30295 9.38948 +6.03391 6.32749 +5.12035 5.59414 +5.68785 5.979 +7.89553 9.15202 +2.54445 2.74715 +2.36337 2.49709 +4.71661 6.12198 +3.72447 4.68735 +1.0541 1.53187 +3.45178 4.80929 +7.90773 8.26212 +8.1816 9.18627 +0.322569 0.871041 +7.24823 7.32699 +1.7003 2.78087 +9.70927 10.2515 +3.75922 4.01081 +1.06949 1.40253 +1.21774 1.4734 +6.02123 6.32973 +2.76396 3.09484 +2.80358 3.00026 +5.25666 6.31369 +4.71714 5.30669 +4.37906 4.50557 +7.40824 7.44969 +7.89081 9.18263 +8.8136 10.3074 +9.1757 9.37261 +7.1938 8.51137 +0.580081 2.32678 +2.02497 2.95434 +6.01446 6.78851 +8.54365 9.21454 +3.03567 3.27089 +0.650657 1.5716 +5.05518 6.36521 +1.64301 2.76399 +4.15989 4.34183 +3.72791 3.98156 +3.91372 4.06182 +3.04507 3.88871 +3.82596 4.25694 +3.36492 5.00402 +6.50019 8.17974 +3.54621 3.81009 +0.546921 2.09811 +5.1789 5.9826 +4.98983 6.31221 +2.47557 2.63878 +4.64568 4.81101 +9.1462 9.21888 +7.37417 7.5276 +2.21604 2.50113 +8.29804 10.2722 +5.1282 6.06353 +8.58281 10.1589 +6.47084 7.04085 +6.27806 6.72674 +7.11554 7.85687 +6.01085 6.02773 +5.46694 7.52872 +9.51078 9.85387 +3.36627 4.06552 +2.96126 5.12635 +3.09314 3.40691 +5.05456 6.62548 +7.56469 8.97053 +1.33727 2.87482 +5.6572 6.28169 +0.120924 0.296475 +7.09139 7.41322 +2.10076 3.28507 +8.74998 10.1094 +7.45072 9.50796 +7.75294 8.59218 +0.740374 2.44897 +7.63001 8.91562 +4.30743 4.81716 +6.40813 7.29159 +6.30213 7.35987 +6.44392 7.32584 +8.41155 9.4466 +-0.377892 0.689618 +5.88857 6.70983 +6.67779 7.70668 +4.831 5.17464 +2.62342 3.82764 +8.57453 9.29283 +7.32648 7.96725 +9.32937 9.9726 +7.30774 7.65754 +3.97456 4.59876 +5.73092 7.20962 +1.958 2.10551 +3.2115 3.81482 +5.76497 7.42425 +2.77219 3.29692 +4.95297 5.14843 +5.96367 6.3619 +2.49872 4.61736 +8.21817 8.23425 +2.13615 2.61877 +7.84121 9.55011 +8.63416 10.2773 +5.61084 6.32053 +4.86002 5.79944 +9.07858 10.688 +5.95829 6.42504 +3.3289 4.17849 +3.27989 4.91625 +8.28046 9.23021 +2.18691 2.6072 +1.3962 1.75013 +2.13627 3.73117 +2.11128 2.57303 +7.22357 7.50136 +7.43862 8.03136 +2.80578 3.02886 +0.176906 0.761142 +5.99314 6.6075 +1.90398 3.3925 +5.48264 6.73579 +7.18447 7.49811 +3.24434 5.05219 +5.53263 6.04178 +1.71172 2.45682 +0.297266 0.481632 +2.62582 3.36142 +0.243865 1.49321 +8.86142 10.169 +3.93193 4.39404 +4.98182 5.15675 +7.99209 9.73159 +8.18033 9.45596 +4.25235 4.41546 +1.59603 2.15581 +6.47724 8.69649 +5.24138 7.93131 +3.4267 3.49003 +0.0439912 0.316407 +1.99983 3.87206 +-0.103124 0.568771 +4.62451 4.80117 +2.89065 4.16315 +5.82817 7.43232 +6.89255 7.82189 +5.71037 6.81241 +4.34551 5.24905 +7.33931 7.3741 +-0.855192 1.27129 +8.94842 9.10813 +9.19877 9.68412 +6.42658 7.77968 +-0.0669636 0.430107 +6.40366 7.40701 +8.91175 9.24059 +3.21388 4.21676 +3.38557 3.79509 +4.24411 4.97032 +7.259 7.34896 +2.55995 3.18361 +8.77438 10.5503 +8.18685 9.79378 +2.78397 4.4563 +8.6891 9.38337 +6.51749 7.59374 +2.52346 3.46101 +8.40526 9.35647 +5.26942 6.33572 +4.15094 5.00668 +0.471666 1.53842 +7.63441 7.96745 +2.39974 3.7814 +2.71989 3.02994 +8.12085 8.33493 +6.19474 6.84381 +6.6133 8.31417 +5.1758 6.94983 +8.66241 8.79095 +6.10878 8.22083 +8.81883 9.08031 +8.28969 8.45176 +7.19851 8.37836 +1.5722 1.6836 +4.57814 6.95063 +7.66128 8.10631 +0.742483 3.08515 +1.15026 1.98074 +3.90133 4.12003 +7.61145 7.73433 +8.32187 10.2933 +0.407205 1.08089 +1.26545 2.60796 +2.70646 3.92753 +-0.196551 1.83536 +-0.413063 1.23838 +0.264484 0.556192 +6.30158 6.96097 +-0.66246 0.809062 +9.34243 10.3521 +8.70093 8.79679 +0.745195 1.92911 +9.12892 9.68193 +7.98533 8.30538 +6.23671 7.04296 +6.5603 6.95483 +7.08133 7.10563 +2.15769 2.41541 +8.24752 8.73978 +5.27693 5.61904 +0.317419 1.48404 +3.48029 5.46979 +7.38901 8.56554 +1.06587 1.62384 +5.54926 6.04924 +4.46577 6.48749 +5.349 6.15584 +8.04249 8.17359 +3.37651 3.56179 +3.64706 5.57403 +4.49844 5.26404 +3.93361 4.92128 +5.82184 6.29881 +0.984273 1.70318 +1.12773 1.80726 +3.11675 3.17451 +5.07913 5.46291 +0.615591 1.81465 +1.08948 2.77847 +7.97412 8.07365 +5.05207 5.82497 +0.0407709 0.558817 +6.11142 6.48205 +3.4461 3.57315 +8.6547 8.80553 +8.18965 9.64194 +5.55564 7.9703 +4.01776 4.16989 +2.4668 2.82018 +0.911925 2.56662 +4.68814 5.03614 +7.4899 8.49036 +8.40912 9.14001 +2.32725 3.16377 +0.0723972 1.42049 +6.6441 6.6953 +3.65586 4.38222 +6.35844 6.57833 +4.44435 5.73077 +1.81779 2.57257 +4.17692 4.59722 +8.54682 9.38058 +1.61135 1.81629 +3.91926 5.00536 +9.78302 9.85143 +1.25632 3.10345 +5.53191 6.08174 +-0.231868 0.676811 +1.03054 2.58105 +0.0402172 0.690608 +0.974571 1.25234 +5.22227 5.92302 +8.05843 10.1439 +8.48938 8.50755 +0.0965782 1.24008 +6.53821 7.47765 +0.189991 0.475204 +8.48963 8.54995 +9.68363 10.0534 +1.49381 2.71302 +6.75552 7.41283 +7.91075 9.15302 +0.520922 1.40928 +1.17957 2.11221 +4.00122 4.40686 +7.32467 7.9273 +6.39126 7.90248 +6.50534 8.19308 +7.19888 7.22234 +-0.136797 0.731889 +0.870318 1.25614 +2.07126 2.28297 +6.10995 7.60408 +3.02174 3.90102 +-0.657541 1.57517 +0.993121 2.66255 +7.27232 7.50832 +2.16079 3.75428 +9.27397 9.75098 +8.36865 8.5545 +4.56641 4.97607 +3.60746 4.34616 +6.31304 7.70611 +2.91442 3.7602 +4.85814 6.70407 +4.45876 5.67661 +8.06749 8.82229 +2.02826 3.59873 +1.92922 2.50088 +2.63867 3.48117 +2.17665 2.54826 +8.62674 9.10675 +0.96648 1.47671 +8.86336 9.53978 +5.52747 5.80829 +0.77099 3.06106 +2.2307 2.53877 +6.29165 6.63018 +4.44717 5.04651 +3.80894 4.63054 +7.47519 7.87072 +0.933668 1.9949 +-0.712945 1.21558 +7.30206 8.38376 +5.80281 7.00022 +7.96578 8.6558 +0.24063 0.706466 +4.41893 4.58472 +4.0132 4.92768 +5.29626 6.09397 +3.43602 4.00728 +0.780945 1.66499 +8.83861 9.15168 +9.06411 9.75544 +3.45618 3.62529 +9.51413 10.0148 +0.842106 1.75695 +1.06485 1.44192 +6.89987 8.05314 +7.89154 8.73313 +8.71675 9.79526 +2.40574 2.58062 +8.55952 8.78132 +5.61716 6.06282 +3.71059 3.77929 +2.50187 2.99137 +6.92852 7.23184 +7.00442 7.93869 +8.82232 8.8756 +4.10389 4.53702 +7.6907 7.77577 +9.31554 10.2674 +8.51082 8.70339 +4.83332 6.70311 +4.6904 5.42892 +4.71407 5.67695 +4.12047 4.44089 +7.51845 8.26858 +1.31781 1.9397 +6.26854 8.02093 +6.92072 7.77774 +0.438156 2.18909 +0.898035 1.72074 +3.81121 3.8643 +1.01676 1.34308 +9.28445 9.42801 +2.43133 4.43516 +4.33664 5.9904 +2.19178 2.37244 +1.5457 1.79785 +2.23781 2.6481 +6.8365 6.87073 +0.82568 2.74775 +9.59404 9.89262 +8.48394 9.15107 +6.16085 6.42224 +3.5667 5.97689 +4.16931 7.41638 +6.95636 7.0982 +6.87987 7.09233 +3.12619 3.14821 +7.76636 7.98459 +4.60371 5.59136 +3.92189 4.88302 +6.90694 8.19858 +3.85132 5.19015 +8.05045 8.32483 +4.8338 6.05032 +1.93576 3.18873 +2.4182 3.55039 +5.56905 5.8172 +4.18436 6.01283 +3.04944 3.85936 +7.83585 8.95233 +1.76281 3.0558 +3.44143 3.6317 +8.69887 9.40371 +5.67867 5.73236 +0.859809 1.76578 +6.92284 7.13601 +8.27495 9.13414 +5.44385 6.42599 +-0.941603 1.8215 +7.88161 8.79447 +0.965018 1.17732 +5.56442 5.79546 +8.79032 10.9909 +5.28632 5.79175 +4.80998 6.07002 +8.4021 9.81107 +3.16415 5.08682 +-0.212163 1.2052 +5.683 5.83625 +0.738527 1.31842 +2.03835 2.52756 +7.4543 8.91243 +-0.568869 1.44659 +3.58855 4.42371 +6.33058 7.18779 +-0.645579 1.94313 +2.18149 2.24157 +3.80281 4.67323 +5.14628 5.97452 +2.55239 3.45685 +3.56586 6.23355 +6.74752 7.19693 +8.99006 10.5533 +0.259833 0.99882 +8.9005 9.75401 +7.28058 8.41075 +4.57803 5.70104 +9.82823 9.90251 +6.94375 7.42033 +7.8878 8.81951 +5.01137 5.52693 +2.25503 2.28817 +6.65772 7.11107 +0.647512 2.04416 +4.34796 4.5706 +4.5395 4.91529 +2.65423 3.49531 +7.97384 8.78377 +5.53873 5.76806 +9.78641 10.1351 +6.01664 6.44407 +3.47406 3.75187 +4.59421 4.81804 +1.20641 2.00488 +2.48904 2.80768 +5.77372 6.10692 +2.49363 3.24499 +1.8483 2.62965 +2.28556 3.22209 +3.17819 4.51426 +3.5548 4.23276 +3.25239 3.57895 +0.613317 2.44862 +3.82234 4.78976 +4.72809 6.46528 +9.54107 10.4426 +9.20052 10.1921 +8.24152 9.89817 +5.17594 6.19462 +7.83364 8.17082 +5.67992 6.36464 +8.9943 10.1426 +2.20598 3.0081 +3.38199 5.16464 +0.599928 1.35804 +0.841211 1.60761 +5.29338 5.89919 +1.11061 2.29219 +3.41512 3.95907 +7.9375 10.0203 +8.73852 9.66917 +9.95092 10.0162 +4.02544 4.30219 +4.1461 5.37827 +1.08089 1.59196 +7.87513 8.21121 +7.85673 8.0973 +0.96237 1.56519 +2.45532 2.61678 +6.1829 6.23637 +0.135135 0.613518 +3.18324 3.78587 +5.64796 7.20194 +0.861169 1.71661 +9.66005 10.1169 +0.880774 1.12452 +1.29389 1.57658 +5.60299 5.89759 +5.53642 7.07306 +0.540268 1.31836 +6.60244 7.98105 +4.21877 4.57159 +3.15367 4.75356 +7.81055 8.40378 +8.00942 8.10861 +5.78071 6.35646 +3.15993 4.99293 +2.36526 2.78444 +8.1361 8.76071 +1.40066 2.96474 +-0.17906 1.05877 +5.94933 6.6808 +3.43187 4.05553 +3.02912 4.68942 +2.1506 2.29413 +2.3516 2.38305 +2.87496 3.0851 +6.71294 8.99858 +3.76177 5.52545 +1.58417 2.57063 +2.74646 4.27445 +5.48407 6.60696 +-0.133321 0.716559 +3.53886 3.58196 +2.28729 2.40198 +-0.209646 1.21263 +6.62795 7.32318 +0.714781 0.880466 +2.96831 4.05932 +6.00935 6.38896 +5.39798 6.11983 +8.47679 9.70468 +1.4339 1.74845 +2.35223 4.75732 +4.31357 4.9642 +5.26493 7.70538 +7.91888 8.94851 +6.51439 7.69469 +7.69015 7.85411 +3.94274 5.15373 +6.25852 7.32402 +2.73567 3.43236 +7.09564 8.42242 +2.55932 4.29066 +1.79489 1.84559 +8.86427 9.35669 +7.23854 8.27062 +7.8488 7.98307 +0.710888 2.22424 +0.0413624 1.10578 +1.54302 1.97696 +1.64924 3.01081 +8.15535 10.2397 +0.305662 1.63835 +8.20375 9.03123 +1.66617 2.08748 +4.01691 4.88505 +3.32856 4.10709 +5.15342 5.44616 +5.80751 7.38872 +0.485341 1.07648 +3.98267 4.20211 +6.96867 9.37655 +9.48055 9.85181 +8.39277 9.50424 +2.47589 2.79873 +3.48046 5.37417 +4.98279 6.01686 +1.29845 2.31199 +-0.204348 2.50289 +0.23488 1.00378 +6.26899 7.14823 +4.62903 5.49672 +0.199052 0.822066 +6.97297 7.69083 +4.23783 4.65198 +0.530497 0.839143 +6.61355 8.22831 +-0.0103941 2.16307 +0.148601 1.20044 +0.314438 0.67632 +3.43415 4.06208 +1.95498 3.25728 +4.23094 4.84942 +9.5493 10.0057 +2.64964 3.52073 +8.21388 9.1622 +-0.112496 0.47622 +7.97551 8.19546 +2.16155 2.6289 +0.38442 1.46032 +3.85675 3.91557 +1.00605 1.42016 +2.4853 3.53086 +-0.0765625 0.504366 +8.11302 8.46334 +7.18135 7.80218 +6.46466 8.12336 +3.75968 5.33954 +9.08789 9.73677 +6.47459 7.49454 +0.90148 1.47681 +3.44733 3.54163 +7.32968 7.909 +1.30055 2.75407 +8.78735 8.92461 +8.21764 8.59414 +0.888162 1.08404 +5.65195 6.26421 +6.23881 7.33284 +8.69731 9.88088 +3.55695 5.36909 +6.49248 7.02755 +2.31407 3.01952 +5.7803 6.1286 +6.30415 8.01577 +7.73864 8.27496 +0.741078 1.69184 +4.94671 5.68254 +3.28226 5.02894 +1.97446 2.60413 +3.26555 5.54754 +2.56179 3.41897 +3.20058 3.32486 +6.96915 7.69055 +6.89302 7.39856 +1.9659 2.61404 +1.31107 1.36867 +6.23573 6.33677 +0.17616 0.517772 +8.55548 8.79155 +9.61632 10.2651 +2.20331 2.34017 +6.93195 7.42939 +1.25398 2.23119 +1.06577 1.41048 +5.99156 7.09818 +3.34821 4.1271 +4.61618 6.90956 +2.30853 3.52875 +0.0518063 0.113732 +5.38513 6.09734 +1.73468 2.64838 +7.24679 7.63999 +4.18175 5.06728 +7.09602 7.13414 +9.06191 9.11605 +6.2309 7.67675 +3.96576 4.63237 +-0.552645 1.37948 +5.76964 6.89903 +4.9272 7.5832 +4.59003 6.49719 +4.12281 6.9664 +5.12256 5.58387 +1.78859 2.76954 +4.36808 5.05712 +8.41165 9.54483 +8.11513 8.43405 +8.42016 9.52715 +8.50598 9.34564 +1.80028 1.83558 +8.08502 8.43726 +6.96667 8.12021 +5.4726 6.26772 +7.1141 9.29989 +7.83324 8.1744 +8.74368 9.16491 +2.5515 3.01706 +5.92375 6.44495 +7.45628 8.41582 +9.04829 9.71503 +4.58856 4.75356 +7.26064 7.32462 +1.81695 2.40529 +6.88067 7.95052 +1.91408 2.02663 +1.32005 1.45025 +7.47733 8.42004 +4.99403 5.85297 +0.95744 2.28875 +-0.089503 0.536888 +1.09978 2.48865 +1.9959 3.098 +0.376116 0.448329 +3.98908 6.49684 +9.10178 9.51012 +5.41394 7.31529 +6.60708 7.59071 +4.38466 5.76203 +1.84355 2.60304 +0.658705 0.933522 +6.98725 7.05509 +5.60064 6.98804 +1.0603 1.1521 +4.06192 4.46156 +0.351018 1.00807 +9.17113 10.2192 +6.71641 6.74659 +8.85392 10.5272 +4.50816 5.22908 +1.13934 2.43196 +3.3746 3.57576 +7.62137 9.3234 +6.93482 7.16058 +5.66506 6.44324 +5.13364 5.86068 +1.97257 2.03803 +2.69746 2.73067 +0.989591 1.38342 +4.18819 4.69676 +4.31608 5.12265 +2.79556 4.87763 +3.55387 5.34421 +-0.112466 0.585639 +2.43156 2.70221 +5.88314 7.08322 +-0.450332 1.29858 +1.22202 2.46588 +6.74433 7.32925 +5.14596 5.37435 +6.76754 7.41799 +1.48762 2.45958 +4.57241 5.3382 +4.17465 5.02296 +6.48856 7.5576 +0.383566 0.823394 +8.50875 9.08734 +1.79393 2.24548 +5.06812 6.49508 +3.55364 3.61502 +5.58973 6.58885 +0.631097 2.10041 +0.323995 0.941782 +8.8798 10.1036 +6.37114 6.88202 +6.9393 7.83288 +3.09503 3.41759 +3.65269 3.70305 +5.61676 5.8924 +1.90199 2.38446 +4.23683 5.35609 +9.18649 9.88878 +8.28736 8.37734 +3.04805 5.03593 +8.02926 8.38975 +3.58161 4.01331 +3.20923 3.48207 +6.85118 8.78281 +5.06518 7.49843 +1.57456 3.05552 +3.0154 4.23782 +2.83557 3.24854 +1.29358 1.89328 +1.42911 2.72661 +3.17067 3.96651 +0.353554 1.48472 +3.46227 4.25611 +6.17639 7.24657 +5.60878 7.13562 +4.11129 5.52476 +9.17596 9.4123 +3.08339 3.65766 +4.083 4.63013 +0.628465 1.92141 +7.81989 8.39386 +3.35589 3.87531 +5.35974 5.41743 +4.48321 4.64376 +0.888177 1.37343 +8.49061 8.50063 +5.09078 6.01801 +9.65314 9.99342 +1.60502 3.0115 +1.37928 2.77642 +6.60322 8.94046 +6.74573 7.45157 +-0.291156 0.325249 +6.1518 6.66827 +5.38199 6.46959 +3.50128 5.22692 +1.31774 1.70159 +0.550546 1.48845 +7.51187 7.85496 +4.2014 5.23193 +3.88255 3.97209 +2.60555 2.84958 +5.15706 6.00036 +2.99284 3.27867 +0.395077 0.768383 +3.30863 3.60594 +0.0325231 0.379208 +6.55183 7.33346 +1.44554 2.95846 +0.245421 1.29751 +3.98808 5.41226 +5.90242 6.266 +4.11097 5.02597 +0.134753 0.929866 +0.609287 1.16311 +0.231832 1.06825 +6.22093 7.05584 +9.18429 9.80637 +0.544139 1.30185 +1.69143 2.90306 +6.75109 8.67893 +5.49641 6.76104 +8.91712 10.0271 +7.09126 8.12404 +8.82958 10.2847 +0.569249 0.69421 +3.59288 5.8053 +9.25068 9.4226 +8.51607 9.26259 +5.00906 5.17068 +1.83467 2.99102 +7.32006 7.64842 +0.405532 0.603773 +6.41882 6.60495 +0.721592 1.44375 +2.78393 4.46732 +7.14806 7.16117 +5.12868 5.27918 +2.74138 3.1737 +2.95394 4.26547 +7.82827 8.21028 +9.06982 10.7279 +0.108376 0.290131 +6.34574 6.97141 +4.39022 5.50801 +7.98339 8.79674 +3.80026 4.71831 +5.43594 5.66916 +1.6743 2.61476 +4.29763 5.47402 +7.95714 8.69311 +3.4152 3.7387 +8.01715 8.8941 +6.53723 7.44437 +-0.0222108 1.04503 +4.96242 6.01648 +1.70885 1.75511 +7.62434 8.53526 +6.82863 7.39782 +8.19967 9.22283 +1.99719 2.11323 +-0.0124079 0.240201 +4.48577 4.87935 +2.586 4.41666 +6.37848 6.67092 +4.39606 5.67983 +9.39761 10.1095 +7.10866 7.15796 +3.91993 4.52129 +5.10552 5.36997 +7.08963 8.32694 +9.12669 9.58509 +9.26894 10.1974 +0.737413 1.26523 +2.77833 5.28516 +3.19039 4.36857 +4.32954 5.45614 +4.98069 5.49295 +7.54745 8.76142 +5.70425 7.05749 +-0.250513 0.36578 +4.76997 5.89607 +2.03075 2.32111 +6.54141 6.55896 +4.19799 4.45091 +8.7796 9.11915 +5.75014 6.05646 +5.36885 5.42775 +-0.00433056 0.865304 +3.65169 5.4751 +0.23625 0.872926 +0.0386337 0.792214 +4.40245 4.56789 +6.44567 7.42162 +5.51394 5.98005 +3.50146 3.83147 +8.47573 9.85647 +7.91378 8.47044 +9.44297 9.90241 +5.962 6.68782 +4.49034 4.86927 +2.17774 3.47061 +8.80614 9.26595 +7.92096 8.13838 +7.80209 7.93317 +7.78915 8.29735 +6.98111 7.162 +0.491059 1.14901 +8.97965 9.38792 +3.30207 3.53207 +3.17127 4.43581 +3.97564 4.43746 +6.79008 7.17877 +5.61669 7.51263 +4.0853 5.38748 +4.42181 6.32041 +8.08599 8.9095 +2.46938 2.55499 +1.20692 2.06351 +1.98995 2.35216 +8.17116 9.17158 +7.53414 8.37086 +3.7744 4.46197 +3.29464 4.38 +7.33246 7.81959 +4.89572 6.2831 +-0.152496 1.56427 +0.636242 0.938556 +5.62066 6.06096 +9.42994 10.473 +8.95446 9.46311 +0.277891 2.80311 +6.92968 7.29845 +2.75677 3.02975 +2.2859 2.51308 +2.96683 3.03857 +6.44584 6.49518 +8.33607 8.60407 +7.20303 7.7616 +7.07205 7.46849 +2.35677 2.7904 +5.86404 6.12906 +2.42371 4.62735 +3.27237 4.11016 +0.0668578 0.644021 +6.77371 7.45187 +3.66596 5.21874 +0.718034 0.755944 +6.06162 7.05 +6.91473 7.09753 +5.0749 6.08914 +0.759874 1.11978 +8.54591 9.64997 +3.97266 4.70679 +1.51133 3.17164 +7.21772 7.69877 +8.00719 8.37052 +0.284003 0.38001 +4.08842 4.16227 +5.04461 5.79973 +4.60604 5.31979 +2.2461 2.28157 +6.25631 7.69766 +9.12404 9.67586 +7.73134 8.98923 +1.0513 1.46408 +9.17225 9.42567 +3.66795 4.29168 +8.84403 9.28497 +9.93613 9.94729 +3.16615 5.09374 +-0.149675 1.43397 +2.30855 2.48392 +0.843172 0.951801 +8.32945 8.8506 +8.97012 9.94697 +2.8559 2.92359 +-0.321715 0.89173 +7.48565 7.71775 +1.44301 1.47795 +6.6649 6.76187 +9.10721 9.93599 +1.82207 3.03935 +3.61893 4.5306 +2.53746 3.81243 +0.424528 1.29026 +9.51874 9.68841 +7.94954 8.14396 +7.49282 7.52655 +3.04604 3.69656 +9.45461 9.47212 +7.69209 8.16412 +0.607135 1.16564 +0.150291 0.450632 +3.28914 4.01085 +5.45597 6.02921 +8.16157 8.36605 +9.76573 10.2325 +0.151994 1.07074 +1.3748 1.68548 +2.29854 2.63593 +7.92162 8.68895 +1.28795 1.61949 +7.85469 8.26683 +4.32268 6.33174 +6.13964 6.3596 +1.25714 1.88002 +2.05006 2.28294 +8.31864 8.34151 +9.0613 10.0715 +-0.041568 0.25139 +6.79984 6.81686 +5.10674 5.70583 +5.92937 7.01652 +7.57649 8.05834 +0.937157 2.25362 +7.48567 7.59746 +2.33403 2.88942 +7.3805 7.73421 +5.586 5.75327 +0.828854 2.12988 +8.22741 8.59954 +9.69214 10.1207 +6.55359 7.08114 +1.85342 2.634 +6.08756 7.28893 +6.34993 6.93474 +8.93548 10.1463 +5.49445 5.8338 +1.47951 2.14646 +2.62089 2.75888 +2.35352 3.10539 +4.98774 5.28931 +4.92239 5.40697 +7.52674 8.78948 +4.52451 4.83819 +5.45854 5.75838 +5.51553 6.3901 +4.82905 6.44407 +6.20655 6.4483 +5.68116 7.06109 +7.97301 9.15827 +8.8854 9.91623 +9.60198 10.2449 +1.93322 2.67684 +0.441852 1.87646 +5.19981 5.71385 +2.54799 2.5809 +4.34591 5.02655 +7.54678 8.75202 +6.1496 7.19033 +1.13658 1.30756 +1.38724 2.08252 +2.13624 2.30419 +8.49196 9.41369 +-0.21387 0.685093 +2.47875 4.19982 +3.69093 4.00543 +5.70643 6.50331 +7.07443 8.83588 +6.85756 7.68937 +1.69241 1.83242 +0.140565 0.502156 +2.15007 3.23784 +4.97403 5.69757 +5.08315 6.25554 +3.45026 4.01942 +3.37482 4.73009 +7.4154 8.34013 +6.95399 7.59768 +8.07995 9.86199 +8.43993 8.88645 +7.66844 8.12742 +-0.0200687 0.435846 +4.47984 5.9416 +7.66804 10.0801 +4.14578 5.98717 +0.256533 0.89254 +6.43216 7.4474 +3.60295 4.79419 +3.90129 4.29812 +5.30606 5.58674 +9.11552 9.79229 +5.60702 5.85299 +2.39514 2.64865 +4.51164 4.60227 +6.31154 6.77441 +3.12239 3.13505 +7.50962 7.89478 +3.90928 4.88831 +9.64625 10.0629 +5.9465 6.02877 +2.08554 2.10477 +0.087547 0.34748 +2.34295 2.53703 +6.846 7.3043 +1.37869 2.11446 +4.03371 4.26278 +5.38623 6.40917 +4.75848 6.25417 +6.03478 6.15991 +-0.585543 1.2091 +2.52824 3.57712 +3.95687 5.40914 +4.42955 4.71909 +2.9328 3.98848 +5.40471 6.97056 +7.64789 9.30279 +6.19595 7.07492 +8.27328 9.41596 +8.29855 9.13665 +2.54035 3.10488 +8.25038 8.87903 +5.66599 5.88701 +7.40067 8.71195 +6.63762 6.67694 +-0.0163105 1.72666 +4.77743 6.60356 +0.567991 1.14977 +5.96841 6.42987 +3.02266 4.58424 +6.72121 7.35492 +7.51477 8.65223 +8.55055 8.81014 +5.59759 5.82816 +0.218944 1.82542 +1.03197 2.36652 +7.84302 9.1594 +2.11542 4.7332 +6.37618 6.92981 +1.34963 1.59353 +0.516281 1.08859 +-0.0151152 0.0624718 +6.45603 7.23063 +4.76865 5.46588 +7.5893 8.42021 +1.04534 1.99034 +2.62638 3.04997 +5.00254 5.98512 +7.7588 9.44547 +6.82186 7.34321 +8.7629 9.82272 +-0.309554 0.54858 +4.19843 4.92981 +5.62327 6.80846 +6.40599 7.6073 +6.1547 6.53898 +3.93941 4.44985 +3.28342 3.72778 +7.17256 7.23035 +2.31269 3.05437 +7.99132 8.20926 +7.19338 8.08381 +7.29139 7.96441 +4.25818 4.4208 +0.802894 0.81938 +0.990115 1.04066 +0.443898 0.490936 +3.44459 3.95977 +9.07812 10.3145 +7.86709 8.26338 +-0.230114 0.390748 +7.50905 8.49199 +-0.715424 1.97535 +2.92248 3.12903 +5.44209 6.62431 +0.991914 1.99037 +5.92275 6.7724 +9.10818 9.2797 +4.46434 4.83462 +4.21122 5.48353 +1.8721 3.40764 +7.04713 7.60526 +3.76581 4.76317 +7.00667 7.36475 +6.87244 7.39431 +7.6349 8.46695 +-0.0728922 0.351194 +5.02925 5.6834 +1.45779 2.83702 +0.339175 1.46574 +6.40414 6.9165 +6.30401 6.91007 +5.6392 5.78172 +5.63288 6.44639 +7.45285 8.89031 +4.09741 4.57929 +8.76728 9.06448 +1.62324 1.84552 +5.72509 6.54553 +8.65273 10.3652 +7.3362 7.8953 +8.96224 10.3113 +0.217316 1.7827 +1.28523 2.90127 +8.78746 9.11602 +8.6075 9.9606 +-0.647788 0.779976 +4.9702 5.47602 +4.15553 4.57497 +1.08174 2.80993 +4.01011 4.8145 +6.79603 7.2317 +4.3711 4.43566 +9.65087 9.79922 +8.19407 9.21784 +3.04008 4.94094 +6.0883 7.23919 +6.88708 6.97172 +0.438073 2.00665 +8.53083 8.83004 +4.22258 4.65233 +6.72856 7.61085 +3.17591 3.18978 +5.07955 5.6938 +2.09043 2.55351 +3.28085 4.43556 +7.29225 8.03925 +7.78034 7.82608 +6.59677 7.67719 +5.56032 6.38139 +8.72663 8.82535 +2.96505 3.11983 +1.67192 2.11727 +7.85386 8.49025 +6.30965 6.72799 +8.53082 9.3801 +2.8976 3.39972 +8.90427 9.44661 +-0.0665785 0.410254 +4.58099 5.81135 +1.88015 2.21838 +3.38693 4.10149 +7.46378 7.68246 +8.80985 9.72212 +6.54877 7.25642 +7.18249 7.71509 +7.41978 8.64805 +1.00839 1.78626 +0.39421 0.526751 +7.13516 7.28317 +7.28011 7.80573 +1.90158 2.49032 +1.66181 4.17994 +8.81106 9.21133 +9.46151 10.5007 +0.52585 0.575082 +7.66495 8.64072 +7.72794 8.50991 +4.92409 6.23879 +2.28769 3.21774 +3.62671 4.40932 +5.77688 7.31314 +8.94253 10.0664 +0.416618 0.635111 +1.81377 2.41356 +7.91755 8.83363 +1.62715 1.82626 +8.22065 9.51656 +0.020228 0.724724 +8.81119 9.95764 +8.66509 9.61079 +5.28201 5.32152 +3.95724 4.22138 +7.09339 7.77685 +9.63428 10.1514 +3.69117 3.779 +3.82195 4.76757 +5.75824 6.62265 +3.69984 4.75163 +3.58259 4.8788 +8.32635 8.85873 +5.81959 7.32506 +8.11265 9.14304 +2.20118 3.32511 +7.79582 8.52691 +6.5891 7.13584 +0.385393 0.440656 +1.13414 1.9951 +1.76482 2.69977 +4.76194 5.82757 +6.33633 7.5348 +4.7663 5.65083 +1.98298 3.01285 +0.956973 2.38629 +5.60955 7.65827 +9.11064 9.14351 +2.99933 3.37975 +3.36304 4.57437 +3.89886 4.50733 +8.73838 9.3514 +9.11824 9.66042 +1.47961 2.93909 +0.615297 1.13217 +1.70646 2.32478 +4.35168 4.99362 +0.986601 1.18332 +4.01551 4.92342 +7.68944 9.86838 +4.47611 4.85316 +0.051839 0.86288 +3.59624 5.5628 +7.08729 8.90374 +9.53464 9.9196 +4.69871 5.74189 +8.43146 10.6889 +3.23774 3.77777 +9.35399 9.62741 +1.15259 2.69451 +6.6368 7.33773 +5.26395 6.09857 +6.87415 7.21717 +-0.925645 1.06118 +8.49641 8.67659 +2.31486 3.25354 +2.51057 2.58303 +0.921997 1.48762 +6.29777 6.74738 +4.03945 4.27305 +7.1668 7.3471 +8.44572 8.80343 +7.16937 7.84526 +8.89008 9.4332 +7.01815 7.66319 +-0.420804 0.982878 +1.59755 1.64672 +0.700814 0.72579 +6.3138 7.37379 +8.49276 9.93522 +-0.795656 0.819657 +0.772253 1.05926 +0.917593 1.3917 +3.30076 4.12274 +-0.0237176 0.260552 +6.82385 7.49119 +6.98638 7.52012 +8.24915 9.08397 +4.17486 4.25908 +3.08435 4.64404 +8.17114 9.91412 +8.95923 9.3751 +0.596707 1.89462 +0.982917 1.40236 +6.79552 7.36657 +8.2599 9.69551 +8.85126 10.4342 +7.98967 9.14514 +0.766355 1.63286 +7.76211 7.99247 +5.23163 5.89338 +4.4707 5.50457 +9.257 9.27862 +2.11049 2.59654 +1.65501 2.06238 +0.551768 2.10873 +0.0285582 0.194421 +3.66153 3.85615 +5.07097 5.55806 +5.29145 5.80735 +2.03499 3.0863 +0.73171 2.29494 +2.63023 3.6417 +6.17478 6.25997 +5.79646 6.46363 +9.10633 10.5516 +7.23415 7.84823 +6.49951 7.1506 +9.94647 10.0242 +7.91236 8.09097 +7.8127 7.97662 +3.34238 3.42907 +8.50796 9.8311 +8.75792 8.98028 +9.34125 10.4441 +2.84413 3.71602 +1.49884 2.35652 +7.52317 9.18955 +9.5587 10.3525 +4.85436 6.1181 +5.91369 6.12194 +6.88463 8.34471 +1.51952 2.99156 +4.29022 5.12674 +8.0229 8.41246 +2.44841 3.04779 +7.59975 7.91485 +2.74491 3.62575 +0.0169968 0.240919 +5.85351 6.29039 +4.99825 5.93439 +2.153 3.35304 +1.19032 1.41763 +6.13337 7.80615 +7.05013 7.89364 +8.38056 9.92 +6.35525 6.64521 +3.93342 5.15885 +2.87656 3.47116 +3.56176 4.41159 +6.72084 7.9171 +8.03801 9.12442 +1.03329 2.56255 +7.64542 8.61709 +2.85627 2.89437 +8.8303 9.79838 +1.08032 2.34573 +7.51366 8.39169 +9.09685 10.3677 +6.753 7.41904 +-0.217662 1.42059 +6.72492 7.97553 +7.99325 8.8976 +0.765372 1.10894 +4.37958 6.04671 +8.72027 9.58928 +6.00234 7.29277 +8.43912 9.25356 +2.98816 3.17389 +0.4292 0.552167 +1.69827 2.80318 +5.99904 7.09981 +4.68367 5.87791 +-0.203208 1.09587 +2.65367 3.28472 +3.87051 3.88111 +6.36178 7.18853 +-0.0815935 0.200848 +6.82255 7.18488 +4.99295 5.08405 +2.67155 3.08447 +5.82099 6.77145 +8.76434 9.01086 +5.94982 6.18665 +3.23369 3.71743 +0.934129 2.73456 +1.13233 1.24208 +8.21931 9.03906 +6.25425 6.69972 +0.971299 4.21205 +5.68426 6.45281 +2.85786 3.3955 +8.17715 8.88439 +2.72802 5.01235 +6.12811 6.53711 +5.22878 6.45864 +0.453655 0.922032 +0.466162 0.85262 +2.40916 2.64759 +5.63583 6.37476 +2.18434 3.14105 +0.912811 2.08432 +8.9464 10.1515 +6.77323 7.27133 +0.7167 1.60579 +5.89813 6.32997 +7.66593 8.4611 +6.54145 6.88337 +5.95421 6.21188 +1.10383 1.92226 +5.37168 5.65707 +1.51874 1.66339 +4.60748 5.00384 +8.97354 10.5394 +2.05022 3.20373 +8.17316 8.19283 +2.33792 2.72643 +8.81577 9.3704 +5.95738 6.59855 +5.69025 6.17335 +6.91889 7.88142 +2.17529 2.81528 +6.65046 7.19698 +7.10694 8.78046 +2.09613 2.47484 +1.92423 2.25333 +-0.0906039 0.861376 +6.61481 7.70609 +6.7448 6.84276 +3.43655 5.28405 +6.05404 6.48902 +3.24637 3.36149 +5.69528 5.77157 +5.12352 5.31024 +7.65858 8.80828 +3.69209 4.4851 +0.25765 1.29637 +3.1537 4.13191 +3.12328 3.83765 +2.99798 4.8748 +4.49566 4.67827 +3.50822 4.03987 +8.00334 8.34084 +8.61039 9.00704 +0.0332147 0.166124 +4.55193 5.36546 +4.20308 4.31589 +0.955466 1.20095 +-0.382972 1.47625 +0.803913 1.01916 +3.78333 4.0707 +6.58604 6.70173 +3.02066 3.82562 +1.16515 2.2816 +7.87242 8.24214 +4.057 4.60368 +2.84714 3.59726 +2.77804 3.69136 +-0.139996 1.36416 +4.50647 6.37579 +8.86647 10.1549 +9.24372 10.1442 +0.743107 1.84722 +6.18761 7.65841 +0.214887 0.443938 +8.8513 9.55063 +4.04856 5.79916 +6.69671 7.10025 +6.97477 7.79702 +4.82551 5.10538 +0.821772 2.85828 +9.3086 9.74805 +5.45623 6.66668 +7.64296 8.67451 +7.53052 8.31024 +7.45352 7.5063 +1.31412 1.4979 +7.81176 8.48083 +0.228964 1.73207 +5.52579 5.93103 +6.58544 8.48938 +2.75407 4.18746 +3.21396 3.96298 +1.13806 2.34106 +0.899331 2.87945 +5.69016 6.61624 +2.48172 2.58082 +0.676004 1.43405 +3.41766 3.9503 +0.104554 0.298373 +6.50673 8.21831 +6.00349 6.69385 +9.62453 10.3147 +4.09379 6.02911 +-1.12803 1.68823 +1.83324 3.43133 +8.30576 9.09288 +-0.363911 0.405218 +1.91686 3.34928 +6.98331 7.15885 +-0.31591 0.996789 +0.145813 0.35408 +5.32016 6.13679 +6.99664 7.48644 +-0.140875 0.821045 +9.0119 9.19742 +1.69616 1.72453 +4.38064 5.07542 +6.85898 7.55478 +3.9145 4.27935 +5.77592 6.16806 +1.45345 3.01301 +4.13024 5.59662 +8.14557 8.41669 +4.00075 4.829 +-0.283024 1.59436 +5.92468 7.17507 +6.84458 7.18356 +1.06987 1.42839 +8.618 8.66235 +0.432802 1.59512 +3.78058 4.36051 +1.6113 4.21135 +6.73475 7.01057 +6.74819 6.90498 +6.93146 8.54681 +9.02605 9.91613 +3.888 4.00526 +1.07958 2.27915 +4.78456 5.10764 +3.92952 4.89555 +9.09348 9.30304 +6.73107 7.21036 +7.42366 7.73225 +4.04079 4.72919 +1.21726 1.34683 +8.82903 9.73504 +0.577663 1.00786 +1.56822 2.08675 +4.84315 5.44994 +1.01008 1.16524 +5.99782 6.01535 +0.996739 1.75305 +4.76128 6.39012 +8.93563 9.51972 +-0.0698166 0.453543 +5.9084 6.95139 +0.535401 0.692258 +4.80729 5.48335 +3.42581 4.76147 +3.58715 4.43541 +7.50236 7.71227 +5.19742 5.87901 +1.79752 2.43097 +7.29762 7.57608 +5.65169 6.47762 +6.02249 7.93642 +0.840131 2.81176 +6.2646 6.96911 +7.46014 8.17136 +9.79049 9.94054 +4.61094 5.35819 +7.30902 7.41873 +1.21883 1.84621 +6.41743 6.57736 +1.53114 1.62859 +6.73237 7.47083 +6.05618 7.56831 +7.63374 8.16821 +5.20839 6.05382 +0.619043 1.44065 +2.38657 4.88786 +3.88289 5.18788 +4.42283 4.51106 +9.15575 9.22388 +3.18678 3.72243 +3.20638 3.65935 +4.2219 4.97961 +4.63725 6.90959 +2.57123 2.59101 +4.08581 4.37325 +6.53926 6.80412 +1.77475 3.89149 +9.22854 10.426 +2.67375 4.36551 +3.17194 4.0433 +1.10304 2.0348 +3.67233 4.04957 +3.23526 3.5012 +5.17684 6.47301 +4.4 4.67662 +4.15842 5.85903 +5.88496 6.61616 +7.26489 7.51279 +4.17402 6.6997 +-0.540216 0.54573 +4.36063 4.60442 +9.18146 9.96239 +0.977216 2.42032 +9.09143 9.61178 +5.06686 6.23076 +2.04772 2.92048 +1.4154 2.00707 +7.80442 9.54824 +4.55549 4.7148 +7.56964 8.80172 +1.35347 3.21648 +9.12751 10.0605 +1.81735 2.06061 +5.63798 8.0918 +6.79492 7.98002 +9.23053 10.1299 +1.74639 2.02724 +3.71825 4.09879 +2.4995 3.42493 +4.1255 5.66758 +4.75493 6.99687 +8.22481 8.72036 +6.13689 7.53026 +5.41315 5.66358 +4.21425 5.62743 +6.22936 6.44392 +2.02303 2.96414 +-0.0655462 0.130508 +6.1487 6.70994 +4.36674 6.24985 +7.51129 7.63176 +7.9729 8.98613 +3.92117 4.15596 +4.54398 5.43399 +6.34248 6.92305 +-0.550253 1.16167 +9.15142 9.53717 +8.99354 9.65952 +6.28988 7.90053 +3.36505 3.782 +8.80005 9.70553 +1.99947 2.18573 +1.15023 2.07069 +0.253723 1.32958 +2.0392 2.93977 +2.89024 3.00836 +8.16735 8.2049 +1.49508 2.95258 +6.19092 7.44552 +2.33328 3.06758 +6.44166 7.4649 +7.34749 7.79488 +7.5557 8.04141 +2.76812 5.13617 +7.97308 9.25668 +4.73539 5.22234 +7.53377 8.41651 +-0.355405 1.36499 +4.72111 4.73744 +-1.22753 1.84842 +5.5033 5.63808 +3.95421 4.19313 +6.24752 6.98229 +4.49694 5.07277 +3.70871 4.30093 +1.31984 1.50116 +7.16044 8.70868 +2.44587 3.34659 +6.08322 7.20376 +2.75012 2.82555 +0.0394442 0.863634 +3.90896 4.73696 +4.77494 5.04158 +8.41473 8.82932 +1.7049 2.71024 +9.01684 10.1044 +4.57959 5.01066 +3.2484 4.21875 +1.11596 2.88792 +3.53616 4.14001 +5.80672 5.82478 +5.85844 7.70293 +6.18239 6.30124 +2.22913 3.23412 +2.97521 3.08481 +2.2749 3.70611 +2.3457 3.86609 +2.71695 4.04473 +7.22863 7.40115 +1.80428 2.39815 +1.80781 2.33028 +2.78662 3.14936 +9.40717 9.94906 +6.54968 6.80773 +2.76862 3.24492 +1.96034 2.87404 +3.53295 3.54927 +5.36042 5.67073 +8.63339 8.93752 +0.932415 1.70402 +4.32923 4.55594 +9.3491 10.4969 +0.121416 1.15499 +-0.172998 1.36319 +2.02349 2.29887 +1.75352 2.35329 +0.502555 2.01665 +6.71754 6.80014 +3.35175 3.93337 +7.17133 7.9851 +8.51299 9.95771 +5.86103 6.36734 +1.44593 3.46008 +4.49699 4.60855 +2.29261 3.10053 +6.68713 8.19499 +5.43776 6.84387 +8.58591 9.02134 +5.24746 6.15595 +1.3847 2.5074 +6.62143 7.07775 +1.7101 2.077 +9.70898 10.2789 +6.67451 7.92058 +2.56858 3.60374 +1.61917 2.60482 +1.77902 2.16908 +4.76209 6.00461 +3.8894 3.98269 +7.0278 7.276 +5.4866 5.59417 +1.69306 2.92506 +2.45744 3.76592 +2.5689 2.80611 +5.98283 6.06154 +9.5267 9.9626 +9.55652 10.4128 +6.6111 6.64606 +3.38826 4.26111 +3.61887 3.73455 +4.14924 6.13796 +7.15863 7.28212 +5.78984 6.56662 +2.09304 2.2681 +4.39867 4.88557 +6.20907 6.81034 +4.63336 4.91476 +0.939805 2.43621 +1.56774 5.13599 +8.40908 9.82058 +2.06273 2.20306 +2.53524 5.01482 +2.9314 3.23661 +2.48535 3.47368 +0.366389 1.4699 +8.81131 9.01654 +2.05102 2.87972 +1.9699 2.22723 +6.18333 6.98224 +1.3425 2.4443 +0.767883 1.77423 +3.1538 3.43248 +0.891006 0.903458 +5.7136 5.8713 +0.437569 1.37539 +3.98533 5.01646 +8.65764 9.89518 +3.74889 3.98561 +7.74507 8.30657 +8.24671 8.43006 +6.88467 7.42036 +1.99426 2.03522 +1.90486 2.04181 +1.12911 1.71807 +9.25253 10.105 +1.92989 2.0346 +5.60044 6.25585 +9.16848 10.087 +6.67824 6.72257 +1.88522 2.80222 +0.242758 0.852689 +5.09249 7.71484 +5.54974 6.44414 +7.66767 8.72936 +3.48884 3.83156 +3.4697 5.14646 +8.48582 8.7692 +6.76259 7.06897 +7.83856 8.62005 +5.81853 6.76571 +2.04803 2.94439 +6.85396 7.22985 +6.52449 7.39764 +9.26838 9.34809 +4.64449 5.64975 +7.51845 7.80279 +-1.27268 1.65344 +0.686101 4.20373 +7.80552 8.37119 +7.20419 8.35284 +9.33962 9.87975 +4.31238 5.58683 +2.39198 3.84398 +1.29248 2.59269 +4.71612 6.195 +5.27332 6.52174 +7.71492 7.84702 +8.18064 8.72233 +1.55223 2.31294 +6.34374 7.31758 +6.48966 6.92611 +2.62268 3.09895 +4.09064 5.06197 +2.66367 4.12126 +1.53391 2.93092 +8.64516 8.70655 +9.20047 9.28957 +4.00474 4.11716 +8.5418 9.45901 +8.73386 9.73253 +9.22596 9.63179 +1.34204 2.7834 +8.4489 9.21027 +7.75158 8.51085 +5.98856 6.11212 +1.29906 2.08111 +9.24315 9.76291 +6.84345 6.91607 +5.88294 5.90545 +3.03022 3.39941 +3.22222 3.4089 +1.12791 1.65898 +6.70232 7.36336 +8.60042 8.82377 +1.26451 1.30362 +2.76682 2.92693 +1.54763 2.19582 +6.5865 7.24173 +4.15242 4.21742 +8.39615 8.78524 +1.67017 2.08717 +9.03012 9.97041 +2.31463 2.45877 +8.29872 8.51813 +1.66689 2.51919 +-0.807606 1.47794 +1.31452 1.94418 +0.0739222 0.512106 +4.23577 4.25889 +7.45273 7.97505 +3.34234 3.46608 +7.97304 9.14131 +1.9029 2.99946 +8.84087 9.79689 +4.92769 5.68685 +2.74004 3.04513 +0.889257 2.20448 +3.10574 3.9758 +3.91547 4.32303 +7.17475 8.07377 +5.92903 8.03738 +1.57974 1.65527 +3.76339 4.2285 +2.28263 2.7559 +9.53105 9.87477 +2.10154 3.2222 +4.23683 5.34347 +1.38769 2.48482 +5.39838 5.51872 +8.50975 10.1382 +8.04108 9.21474 +8.5252 9.67823 +8.893 10.7726 +7.1294 8.18211 +1.15642 1.73882 +0.436911 0.756698 +3.66142 3.71659 +6.37686 6.7 +8.88506 8.99896 +2.31891 3.79061 +2.61615 2.81909 +1.35216 1.39571 +3.04217 3.52564 +7.8409 9.34099 +0.470596 1.49157 +6.94014 7.18365 +8.05483 8.49979 +8.18511 8.25608 +7.03597 8.45251 +2.47411 2.65172 +0.112716 0.193057 +4.45039 5.10584 +4.53906 5.80013 +5.11702 5.27151 +1.24211 1.90757 +4.64114 4.72912 +1.77254 3.45037 +-0.1275 0.99675 +5.69637 7.67722 +2.21252 2.44032 +3.89623 4.40192 +2.79904 3.15569 +8.37911 9.42424 +5.27199 6.2026 +1.84791 3.75411 +0.522801 0.54806 +3.83644 4.64785 +6.65497 7.55638 +6.75104 6.98564 +2.34979 2.98049 +8.27176 8.60459 +5.07773 5.44064 +1.16934 1.98872 +4.2914 5.37557 +6.83462 7.95408 +3.91405 5.73229 +7.77473 8.53538 +9.23441 9.90185 +4.03659 5.2473 +5.99336 7.8004 +4.2432 5.89276 +6.39847 7.81276 +9.13909 10.4164 +1.12009 2.5649 +2.35157 3.18468 +4.46918 5.55572 +3.82512 5.53666 +7.18238 8.10193 +8.40911 9.23639 +8.99555 10.4192 +6.69547 8.87825 +4.79012 5.34858 +9.23615 10.0986 +-0.590587 1.14603 +2.74289 3.48244 +-0.248403 1.1591 +3.35663 3.7229 +7.37504 7.6481 +6.64796 7.64695 +0.778081 2.41212 +4.49242 4.7772 +8.01419 8.109 +6.6494 7.76619 +8.86331 10.1205 +0.817273 0.937855 +8.00019 8.21556 +6.19405 6.54794 +6.11798 7.30421 +3.40164 4.28921 +5.31927 6.21584 +2.79377 3.40938 +3.59494 3.90321 +7.79218 10.3132 +2.99546 3.86111 +1.71916 3.40283 +6.1768 6.81915 +7.59629 8.68568 +1.59724 2.348 +6.20151 6.5391 +6.30798 6.70478 +0.489786 1.51322 +1.28396 1.86775 +5.18031 5.43007 +6.61276 7.70565 +1.4909 2.11165 +4.56163 5.49277 +1.93598 4.35147 +3.65568 5.00224 +1.68028 2.00363 +7.82874 8.67399 +1.23053 2.87598 +-0.164275 0.194491 +2.58349 4.01302 +1.23279 2.02984 +0.599702 1.09257 +9.50965 9.80164 +2.33108 3.58037 +4.38659 4.62378 +2.65097 2.87349 +0.0537058 0.576502 +4.20415 5.15693 +5.41458 5.98382 +4.37747 5.10347 +2.62536 2.70073 +6.96845 8.15356 +6.91533 8.41638 +9.36431 9.58863 +6.13019 7.25915 +2.7818 3.4951 +9.44641 10.1301 +2.68817 4.19772 +5.65664 5.6814 +8.25308 10.498 +3.50374 3.64458 +1.47063 1.78567 +8.21901 8.98152 +3.99261 4.47339 +2.51395 3.38788 +4.66178 5.24959 +9.08415 10.3467 +5.92351 7.20447 +1.74145 2.35957 +7.62653 8.96797 +6.43542 7.68775 +5.49047 6.56355 +4.9225 6.22555 +0.257967 0.704837 +3.42488 3.52873 +8.67606 9.77824 +5.12981 6.37856 +5.97359 6.32151 +1.58517 2.28129 +0.530687 1.54545 +7.04056 8.15296 +1.8541 3.1902 +9.46286 10.0098 +3.17967 4.02237 +3.49966 3.80271 +6.24894 6.49618 +1.19944 1.59215 +5.30422 6.94823 +7.49137 7.78584 +7.02669 8.16282 +2.21673 3.36471 +7.66183 8.34763 +4.13876 4.87421 +3.0199 4.07124 +8.40439 8.82943 +-0.274649 0.429602 +6.11215 7.65609 +3.34781 5.03006 +1.28231 1.77258 +7.57256 8.59456 +5.36208 5.81735 +7.18511 8.96618 +8.86053 9.49567 +5.39097 5.93211 +6.59094 7.26553 +3.69159 4.01914 +8.73797 8.81611 +1.41144 1.82827 +7.83555 8.07567 +6.13821 8.44907 +5.83432 6.48744 +2.93596 4.66271 +7.03215 7.59658 +1.65252 2.45337 +2.91358 4.90129 +8.94415 9.14642 +5.21005 6.1166 +0.33225 1.17039 +7.40089 8.07586 +9.30427 9.40776 +2.34188 2.81124 +1.02811 3.3344 +6.28117 7.62089 +4.80105 7.10049 +8.90252 10.0057 +2.20932 2.33093 +8.20746 10.6268 +4.31887 5.23945 +9.258 9.8985 +3.80742 4.15057 +1.11313 1.23711 +9.53067 9.70165 +7.95467 8.67187 +9.66031 9.83223 +3.61385 4.09571 +0.623148 0.652817 +7.77809 8.62118 +0.86157 1.98606 +3.12528 3.75815 +1.9363 3.22621 +8.23521 8.99175 +8.95406 10.4487 +3.38526 3.90652 +0.34281 2.0226 +0.739384 0.793829 +3.55637 3.96384 +6.1562 7.28647 +5.30211 7.51385 +1.46275 1.78688 +-0.0144662 0.868488 +0.0740443 0.119828 +9.26206 9.83923 +0.743397 1.40754 +4.68823 6.62985 +8.8291 9.17373 +4.66711 5.09313 +4.023 4.44994 +5.68937 5.79194 +8.04835 8.06763 +6.94662 8.00075 +0.774686 1.13428 +0.381819 2.34757 +2.1235 2.63524 +5.42795 6.89998 +6.07662 6.29083 +6.47821 6.7872 +2.58305 2.6192 +-0.598336 1.23458 +4.29089 5.43332 +8.09914 8.28229 +5.05925 5.35258 +0.181705 0.444466 +3.27849 4.79932 +0.310314 1.43125 +1.13836 2.76825 +1.2529 4.09336 +0.198106 0.608625 +1.77442 2.23777 +6.29823 6.64574 +1.22125 1.37929 +1.77592 3.04011 +1.43999 2.90926 +4.20495 5.32396 +4.98874 5.33211 +8.36483 8.67875 +5.65373 7.14132 +2.8303 3.05037 +3.41509 3.54032 +7.21702 7.85857 +5.79848 5.8913 +4.52711 5.65511 +2.04663 2.66919 +5.76363 6.77903 +-0.153046 0.77878 +4.37474 4.49936 +6.86786 7.81999 +8.92084 9.16368 +7.5975 8.56954 +0.197493 1.07503 +3.99803 4.67019 +9.35123 9.60094 +1.46442 2.4256 +5.21501 5.79612 +8.80879 8.99085 +-0.109252 1.30631 +7.34965 7.87947 +7.08703 8.12723 +0.985946 2.14663 +0.48521 0.856118 +6.57719 6.70623 +8.71165 8.72286 +3.16883 4.8714 +-0.21189 0.412944 +3.6526 4.37121 +0.364649 1.3363 +9.27722 9.35135 +3.47517 3.8793 +5.67149 6.28631 +6.52789 6.61039 +9.36323 10.4189 +4.30743 6.18638 +7.93653 9.4877 +8.24024 8.41475 +2.75692 3.13935 +8.80223 9.1489 +3.42656 3.90557 +8.96598 9.3217 +1.99582 4.84803 +5.1178 5.8688 +4.47901 5.73433 +7.30397 7.85527 +0.18463 0.656832 +7.80806 8.41666 +8.50023 9.42628 +7.67563 8.64756 +9.46783 9.52169 +2.06797 3.3107 +5.08863 5.10167 +0.82146 1.39055 +7.5428 8.04736 +9.09407 10.8208 +9.15219 9.99706 +1.61637 3.46354 +5.3812 5.96247 +9.34115 9.73575 +6.49221 7.30031 +1.56337 3.39704 +8.463 8.60841 +-0.322779 0.658242 +8.50173 8.72125 +0.854851 1.83405 +7.81945 8.12841 +2.60724 3.19985 +5.03714 5.55331 +1.85041 3.36816 +7.26119 7.64364 +5.75223 5.99653 +4.00026 4.43863 +5.00939 6.03009 +6.22879 6.6638 +6.44231 7.18622 +1.66002 1.88587 +2.59781 2.84919 +4.96399 5.40545 +5.70327 6.95018 +6.97141 7.08346 +3.98535 4.6179 +5.96795 7.14997 +5.07581 5.8262 +4.65665 4.98851 +8.65646 8.70986 +3.04175 3.19155 +0.796073 1.0952 +8.24859 8.57828 +5.26952 6.34245 +7.94685 8.78542 +0.193963 0.968524 +6.61159 6.80186 +9.37533 9.79195 +8.94048 9.74959 +5.77272 6.48616 +6.0092 7.86718 +2.52621 2.58938 +8.91347 9.22421 +4.20466 5.45909 +4.82157 5.09167 +7.35464 7.36611 +5.12413 6.45063 +2.12404 2.81187 +8.88875 9.20752 +2.59731 3.20587 +1.54772 2.08968 +6.70449 7.08952 +-0.0967146 0.888521 +3.10207 4.34815 +1.20807 2.35497 +6.00753 6.08492 +3.21837 4.00446 +4.34095 6.0963 +4.24821 4.79576 +4.49523 6.6669 +1.49483 2.52552 +0.0411497 0.641526 +8.3854 9.20954 +8.12419 8.93702 +0.0201515 1.06914 +1.57617 3.44176 +1.4173 1.76847 +5.42261 6.51539 +6.6744 8.46109 +3.05234 3.59179 +6.49059 7.24618 +7.01989 7.69901 +2.34664 2.90601 +9.17324 9.86754 +5.50919 5.70258 +2.40486 4.6009 +3.74368 4.00093 +6.9211 7.33554 +7.41358 8.7413 +8.78284 9.62033 +2.96753 3.01602 +-0.200693 0.535532 +6.4383 6.45049 +8.28835 9.42148 +4.2379 5.35128 +4.68397 5.04593 +5.7185 7.03177 +5.37494 6.43977 +2.99518 4.08138 +7.28064 7.54638 +9.10622 10.4907 +1.23839 1.50915 +6.7823 9.24533 +8.45679 8.62427 +0.106718 0.69304 +2.84119 3.50375 +3.60466 4.51338 +8.04709 8.19023 +3.31632 3.48054 +5.9027 7.46331 +-0.621072 1.13003 +8.57167 8.69262 +0.301047 1.42246 +1.24229 2.44616 +0.962706 1.55754 +8.77327 9.55275 +1.77899 2.44335 +0.368575 1.84726 +9.05918 9.07832 +6.61723 7.68015 +8.59899 8.80383 +-0.133927 0.20271 +5.69266 5.74809 +0.68202 1.52342 +7.17359 7.91482 +5.74049 7.34297 +7.88371 7.9683 +1.58749 2.26543 +3.96728 4.45988 +5.4354 6.88336 +1.68706 1.6976 +6.56907 7.40696 +0.518151 0.724124 +8.99155 9.36995 +6.00506 7.91529 +5.26967 6.11536 +2.37416 2.50887 +8.47983 9.31509 +2.38155 2.54346 +8.08415 9.65214 +1.00693 3.19203 +1.6523 1.73553 +6.85283 6.9958 +4.11425 4.90193 +1.39597 1.58725 +5.05551 5.19458 +5.89969 6.11394 +5.9148 7.26824 +9.32271 9.93989 +1.62911 2.58215 +5.43399 6.14203 +3.11393 3.58792 +8.57619 9.3788 +2.23349 2.7884 +8.09022 8.54326 +9.7114 9.87076 +5.91086 6.10885 +7.35805 7.57276 +0.650002 0.879866 +3.24977 3.75531 +2.73948 3.41051 +3.08006 4.62772 +3.71868 4.31519 +4.13905 5.78577 +1.77297 3.02983 +5.85931 5.89333 +3.68972 3.93193 +1.43922 2.98425 +6.51534 8.33386 +6.6821 7.50874 +1.2541 2.11722 +5.40634 5.54411 +4.55502 4.60346 +4.32484 4.68497 +3.40711 4.31975 +9.20893 10.0853 +6.12594 6.9009 +0.12664 0.347193 +7.53378 8.82258 +7.79572 8.91645 +2.50098 3.39701 +4.17873 4.97732 +1.05822 2.47032 +3.1012 4.97736 +8.42126 8.74568 +7.83301 8.17843 +9.26618 10.584 +3.02667 3.7128 +8.30654 8.69242 +2.87173 3.43275 +6.59917 7.54843 +7.03447 8.20283 +5.75718 6.40637 +2.62899 4.1855 +-0.520148 0.902194 +5.1538 5.61763 +1.25625 2.33142 +4.16336 4.3384 +3.01296 3.41026 +3.16515 3.26305 +2.40944 3.21897 +6.80742 8.57141 +1.15125 1.54824 +8.72251 9.50878 +3.15703 4.04482 +0.470308 0.726093 +0.199979 0.878243 +7.8908 9.17915 +6.91793 7.16038 +4.64783 5.00217 +2.21237 3.03073 +1.5825 1.63362 +3.18806 5.20795 +5.92725 5.95595 +4.65027 5.09868 +6.42204 6.87201 +8.08637 9.40221 +4.95542 6.16185 +7.45987 7.57979 +8.826 9.13961 +4.42078 5.27977 +7.26216 8.97585 +2.26919 3.33512 +9.4077 9.81908 +0.722223 1.03378 +-0.0497795 1.19355 +8.22686 9.31082 +0.0733766 0.93037 +7.47883 7.9062 +5.28731 5.74181 +1.78496 3.61348 +0.690987 0.764344 +2.56442 3.54999 +4.27944 5.43124 +4.04412 5.35376 +0.663756 1.88268 +1.73567 1.78553 +8.07666 9.41842 +7.70138 8.42873 +9.27113 9.55873 +0.982413 2.5565 +0.994807 1.02007 +5.01226 5.31923 +8.87435 10.0597 +1.74836 3.22578 +0.151528 0.191719 +5.82608 6.06438 +1.17239 1.59955 +3.18515 4.11049 +1.92258 3.70604 +1.63692 1.8266 +1.83542 2.66228 +2.21954 3.11425 +3.97546 4.3928 +0.731374 2.05705 +5.44809 5.96359 +9.85934 10.0553 +8.42169 9.63654 +6.68148 8.43446 +2.00014 3.3485 +0.735924 1.73 +1.61833 3.05643 +7.87934 8.67316 +8.67441 10.0032 +0.794573 1.2493 +6.11926 6.41441 +5.2715 5.82597 +9.41854 9.46625 +3.46299 4.06742 +5.6487 5.79053 +1.46503 3.43496 +0.9957 1.53939 +2.4714 3.1301 +0.887049 1.6196 +3.04884 3.19662 +1.24337 2.05758 +7.61142 8.55766 +0.998279 1.64425 +4.74917 5.85236 +2.97632 3.94611 +4.11786 5.62709 +7.40498 7.62083 +1.47854 3.64736 +2.1176 2.64511 +4.55533 5.89436 +7.44618 9.79926 +-0.410242 0.737348 +5.719 6.30861 +8.33692 8.38222 +8.78122 9.98195 +3.75452 4.26866 +2.23771 2.44985 +6.72455 7.61362 +5.9797 6.58846 +6.72885 7.60315 +-0.710302 1.18332 +7.73287 9.383 +6.61213 7.67394 +4.12945 5.68527 +-0.300887 0.341615 +5.77978 6.41534 +8.34001 9.96874 +1.62323 1.8283 +1.71788 2.23905 +7.43484 8.0418 +3.47322 3.8047 +3.47311 3.51261 +7.82093 8.86377 +2.46973 2.99125 +7.91166 8.55065 +3.39807 3.43599 +8.94792 10.0437 +7.70859 8.32487 +5.86852 7.13103 +7.64996 9.19033 +6.66742 7.8092 +7.88241 8.58675 +9.42939 10.3479 diff --git a/bottleneck/tests/data/test_012_B b/bottleneck/tests/data/test_012_B new file mode 100644 index 0000000..5f6e43c --- /dev/null +++ b/bottleneck/tests/data/test_012_B @@ -0,0 +1,5000 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 +2.04751 3.00998 +3.19365 3.9383 +8.09529 9.45596 +8.88173 9.5618 +0.609816 2.67806 +1.57288 2.60884 +1.68354 1.80124 +4.92058 5.9959 +1.48728 1.84885 +0.299669 0.413905 +9.02156 9.56731 +7.50854 8.49023 +0.667131 1.89987 +2.22472 2.58793 +5.84395 8.79426 +2.35839 2.66935 +3.43111 3.69982 +6.71023 7.36801 +6.75697 9.0991 +2.35352 2.85316 +6.73054 7.39006 +9.48673 10.1493 +6.71226 6.72805 +9.22083 9.71889 +8.36513 9.33921 +0.0652672 0.319993 +3.26467 4.60881 +7.62269 7.79878 +6.48608 6.69515 +6.21737 6.88645 +6.56094 6.9699 +1.61317 2.7167 +5.08621 6.29754 +2.24676 2.8076 +3.09943 3.93921 +9.74093 10.0968 +0.417699 1.6381 +9.2958 10.2973 +3.6663 4.1369 +0.0229943 0.448065 +9.2928 10.1833 +3.66334 4.22032 +0.812172 2.19952 +7.88025 8.71192 +8.69379 9.34922 +1.70691 2.95352 +8.28737 8.29985 +5.22491 5.354 +4.03526 4.14084 +6.49359 7.05924 +0.24853 1.44718 +7.86936 8.75135 +5.76 6.68919 +5.85437 6.14314 +5.86292 6.0516 +2.35692 2.91295 +0.0990674 1.29386 +2.9911 3.56188 +0.552671 0.638929 +5.80756 6.22761 +1.21067 1.77175 +4.51882 4.72936 +1.99969 2.89732 +3.65968 6.61987 +0.478582 1.33355 +0.259061 0.289813 +3.89264 5.02474 +0.349236 0.438003 +7.70442 8.1729 +7.90389 10.1876 +3.06898 3.15219 +4.77811 5.29095 +9.76561 9.89451 +4.14295 4.2489 +0.540224 2.28623 +9.60749 10.2284 +8.49555 9.00307 +7.89668 9.76886 +4.12631 4.70897 +7.87898 7.91814 +9.29858 9.52908 +9.24009 9.91544 +3.73498 4.70275 +5.44467 5.9274 +2.13453 4.85697 +2.29607 2.88771 +0.807842 1.82319 +0.319005 2.08473 +1.62 1.63649 +2.20431 3.23869 +2.00132 2.77136 +6.64752 6.71706 +8.12249 8.28379 +7.55541 7.7813 +3.51763 3.64484 +9.21075 10.2811 +2.24501 2.54426 +5.64566 6.46452 +6.72307 8.56698 +3.91728 4.60262 +4.02535 4.29548 +3.0499 3.53135 +1.30677 2.32194 +9.36908 9.90669 +3.92387 4.33848 +2.87312 3.08243 +4.49167 5.2749 +5.43143 6.74905 +6.94595 9.16539 +1.9784 2.00429 +9.42478 10.2226 +3.7185 3.96576 +9.37729 9.50574 +5.34283 6.89736 +4.95341 5.84626 +2.91654 4.28413 +8.26544 9.3076 +6.23114 7.20273 +1.02585 2.21446 +1.6718 2.29591 +2.28926 2.73452 +-0.648145 1.105 +1.44194 2.18562 +6.78584 8.37985 +2.00402 2.08248 +1.64076 2.04067 +0.0419044 0.455962 +5.51723 5.72098 +5.42117 6.81165 +5.70331 5.81707 +4.97889 5.60741 +3.38797 4.46846 +7.20995 7.66784 +3.45388 4.23386 +3.11057 4.35995 +3.29476 4.04676 +2.0519 2.94719 +5.37101 5.38271 +5.99383 6.64188 +7.48444 7.6377 +2.15043 3.05399 +1.54093 1.83799 +5.59223 5.87222 +5.8005 6.08042 +6.1208 7.22563 +1.2938 2.17454 +4.92405 5.0402 +6.91336 7.79688 +1.47978 1.99762 +9.00494 10.8315 +5.84805 6.15303 +4.95368 5.49096 +8.21704 8.31192 +0.715222 2.33517 +0.904183 2.54741 +3.42349 3.74906 +0.627978 2.37092 +8.41477 8.72651 +3.55373 5.58652 +4.12685 4.61533 +0.775274 1.41263 +4.78915 5.08639 +6.35791 8.15015 +2.88242 3.63509 +2.78526 3.07834 +0.39129 1.15933 +3.26615 4.74531 +8.78873 9.8888 +7.25612 7.45972 +4.97452 5.30012 +0.757255 1.35518 +1.29516 2.52446 +4.66838 4.96648 +-0.0720209 0.832726 +2.68276 3.21123 +8.44253 10.0311 +3.40809 4.70506 +1.09617 2.35452 +5.19302 6.73599 +1.25316 1.58101 +6.2056 7.10099 +7.7666 8.52777 +0.301239 1.37275 +0.522829 0.731575 +6.73869 6.96826 +2.41703 3.20567 +4.94617 6.22052 +5.41524 7.68272 +6.0408 6.29938 +0.0642067 0.600878 +6.32122 6.63505 +3.25427 4.70611 +5.88704 6.1678 +8.71533 9.08476 +6.25575 6.88392 +1.54462 1.56366 +3.95938 4.03326 +2.54671 3.66798 +8.48603 9.10156 +3.37369 4.65454 +5.25469 5.64636 +7.02624 7.36449 +8.17061 8.44321 +9.23147 10.1149 +1.45589 2.25886 +6.47702 8.25307 +7.69088 7.91753 +0.442832 0.616926 +8.35355 8.83222 +7.65142 9.58906 +4.04877 5.17345 +0.76012 1.8686 +6.54877 7.40058 +7.41774 7.65429 +8.69655 9.3325 +4.8302 6.25306 +1.77203 1.90284 +3.67485 4.94569 +6.60162 6.72031 +3.05924 3.35235 +0.0823162 1.3486 +8.42991 8.86331 +6.81596 6.83527 +-0.0174808 1.6745 +-0.758131 1.08928 +4.14423 5.46342 +9.26253 9.85714 +7.42749 8.58214 +4.88849 5.86936 +8.99339 9.38141 +8.85301 9.18285 +2.64303 3.45658 +7.1133 8.66473 +3.50745 3.8629 +7.81615 7.83244 +2.94991 3.8741 +7.91822 8.8362 +-0.0553088 1.19059 +7.35558 7.77948 +2.11257 2.20563 +8.57533 9.16338 +2.3515 3.13009 +4.13239 5.38696 +2.20763 2.93941 +7.2451 7.3211 +0.834388 1.57413 +4.47024 6.17855 +4.75947 6.80913 +2.99607 3.54732 +8.15998 8.80718 +8.94688 9.27971 +4.46335 4.9522 +5.30725 5.69786 +7.63989 7.86974 +6.69589 7.69565 +5.34018 6.08115 +8.59515 9.62264 +1.80557 3.22507 +8.62429 8.94242 +1.34532 1.95042 +8.60707 8.80741 +8.03275 9.40327 +4.30357 4.39095 +8.97954 10.7076 +2.18143 3.51825 +3.98695 5.62062 +2.48813 2.60622 +5.56957 6.43776 +5.18249 5.55459 +3.45373 3.64101 +-0.00345662 0.570597 +3.61127 4.69761 +9.37858 10.6205 +7.24635 8.19639 +4.70142 4.80735 +3.30055 5.14257 +0.860415 1.31635 +4.72924 5.46893 +7.47391 7.72644 +6.22287 6.57754 +0.181652 1.01366 +2.14494 2.80736 +2.16406 3.19383 +8.52991 9.22722 +8.74411 9.06935 +0.575831 1.02699 +2.47315 3.0331 +4.2872 4.59813 +5.82293 7.03604 +2.08982 2.25319 +7.3626 8.41994 +1.23867 3.10885 +7.397 7.78026 +6.78837 7.32977 +0.829368 1.56617 +9.23075 9.35172 +6.76562 7.23578 +0.42851 0.839401 +4.83626 5.5852 +0.150032 2.45322 +2.16811 2.47439 +5.60245 5.81188 +7.43707 7.46519 +0.167317 1.44642 +4.9732 7.58343 +8.67391 10.2957 +0.318592 0.639284 +3.365 4.25929 +7.83683 8.88895 +5.20557 5.30114 +0.940347 1.74022 +5.39149 7.13464 +1.10826 1.27913 +1.9147 2.31276 +0.935283 2.49181 +3.67898 4.33336 +5.10125 6.07734 +0.348807 0.839242 +0.310986 0.58381 +2.03594 2.43119 +5.49755 5.94215 +1.94885 3.34409 +9.66806 9.97883 +4.79099 5.45155 +4.81158 5.30001 +5.17667 5.90019 +9.64168 9.99177 +1.14899 1.22792 +0.466236 0.952985 +6.93679 7.72282 +2.97285 3.23931 +9.22517 9.24315 +7.25783 7.46414 +4.37304 4.51815 +4.01069 4.02979 +0.843132 1.80443 +4.78572 6.04237 +6.02471 6.38074 +4.99536 7.76852 +4.97442 5.17384 +0.731231 1.49497 +2.2797 2.90845 +9.13211 10.341 +4.19545 5.08597 +6.13127 7.09817 +2.65124 5.02208 +5.40235 7.12912 +6.86258 6.91991 +8.24317 8.55273 +7.6877 7.69875 +3.33922 3.53776 +0.089484 0.40755 +1.34909 1.68726 +8.43113 8.72899 +4.90038 5.55994 +0.308089 0.490555 +5.42628 7.1433 +2.11647 2.56987 +3.56934 4.1619 +8.35794 9.24416 +8.8645 9.69151 +5.10701 6.0036 +7.66385 7.8412 +2.89952 4.55221 +6.01533 6.38269 +-0.945182 1.07304 +1.79537 1.85576 +-0.0313338 0.501067 +8.85689 8.87522 +1.61143 1.7773 +9.53229 9.84943 +3.51669 3.81091 +-0.448016 1.10903 +3.16889 3.439 +4.30534 4.36372 +6.20158 8.09618 +2.20949 5.23616 +3.29459 4.17079 +3.90101 4.05611 +5.89688 6.85702 +0.734474 1.04471 +7.84341 8.02702 +8.69431 10.1086 +9.73194 9.92195 +7.63516 7.70631 +8.51416 9.33072 +-0.0712911 0.361001 +2.76979 3.22708 +5.34404 7.5165 +5.64429 5.79865 +0.0755012 0.363483 +5.05631 7.27153 +-0.60164 1.09659 +0.457228 0.876186 +4.27092 5.38033 +8.63891 9.04134 +6.29608 7.04242 +8.97795 9.93013 +5.00385 5.57737 +8.48068 9.44885 +7.35543 7.78492 +3.55698 4.01035 +-0.268117 0.649128 +0.633184 0.66254 +4.54216 4.81132 +6.15574 6.35276 +4.3663 6.36286 +1.45231 2.07039 +7.37031 7.9157 +5.30961 6.3506 +5.80757 5.81762 +4.91767 4.97519 +3.45667 3.60965 +1.7934 2.3807 +4.33289 5.41047 +1.16021 1.29979 +3.75172 4.53521 +3.10835 3.1275 +2.68167 3.00314 +4.10639 4.24094 +4.90776 5.74069 +7.30861 7.86666 +3.52822 3.70998 +5.22222 5.28033 +0.00866476 0.326377 +7.73247 8.61481 +4.25231 4.77499 +8.41148 8.54604 +2.95389 3.63497 +7.76126 9.69124 +6.41218 6.69682 +4.86285 6.44503 +1.84783 1.9065 +4.08788 4.11706 +9.17473 9.50133 +5.15091 5.78649 +1.27694 3.33579 +2.92648 3.37855 +9.37392 10.5123 +4.81878 6.34991 +8.38702 8.83716 +5.07771 6.33618 +1.47438 1.75588 +6.20935 7.11166 +1.08286 1.38 +1.40048 2.0157 +6.60355 7.26234 +5.28396 5.90003 +8.9525 9.59216 +-0.0305792 0.544664 +-0.571491 0.735471 +6.287 7.03679 +5.35225 5.4104 +0.095812 0.605976 +4.33523 4.4048 +6.13288 6.80949 +4.14654 5.5505 +-0.213214 0.260592 +7.56188 7.83088 +7.8132 8.65963 +8.02469 9.3254 +0.00641711 0.420562 +7.49269 8.15849 +9.26359 9.4366 +5.74008 7.86317 +8.62729 9.78825 +4.28946 6.20553 +3.19174 4.54991 +4.16992 4.25203 +2.46138 4.11583 +1.92971 2.16701 +3.43028 3.80842 +6.98297 7.28388 +7.51884 7.55947 +7.79102 9.44326 +0.416342 1.32311 +9.35398 9.85201 +8.72997 9.10384 +6.23398 6.88888 +7.46984 7.4875 +5.92603 6.66938 +1.77761 2.58697 +0.835966 2.06139 +9.63284 10.3565 +6.13677 6.42768 +0.151375 0.382404 +8.10315 8.13441 +5.52283 6.28113 +1.00873 2.44226 +2.5239 3.89871 +5.40599 6.72653 +3.43407 4.0068 +1.22444 1.26601 +7.04395 7.80599 +3.75987 3.77123 +6.43597 7.06249 +8.34435 8.87418 +8.25853 9.04009 +0.415321 2.32725 +0.639046 1.75525 +7.83226 8.12538 +9.55429 10.2734 +3.658 4.35867 +1.8588 3.93292 +7.38922 8.16823 +8.53626 9.23024 +0.848152 1.13412 +6.31667 7.2348 +3.81584 4.62621 +9.24748 10.7408 +2.75953 2.95288 +5.70188 6.62278 +4.22202 4.45368 +3.24616 3.88779 +1.05053 2.09846 +8.67718 9.52693 +2.14107 2.71959 +1.10518 2.69689 +5.01476 5.54139 +4.69244 5.20358 +8.88285 9.93012 +2.55228 2.77382 +6.72118 7.50057 +7.58999 8.71573 +1.83763 2.13481 +4.86135 5.27995 +4.39794 5.42117 +1.42512 2.98262 +4.80489 5.34701 +2.7993 5.13702 +7.52122 8.41729 +9.08613 9.37543 +1.1555 1.3935 +7.34071 8.0428 +8.33361 8.40349 +2.514 2.54741 +8.25732 8.41758 +1.65337 2.57964 +4.20527 5.06565 +0.723443 1.06987 +5.85836 6.64701 +7.908 8.07591 +5.01839 7.0105 +3.15908 5.10364 +4.3574 6.67192 +2.06662 2.46437 +7.5595 8.9108 +7.94919 9.20231 +4.11889 5.49714 +7.28151 7.51881 +1.30685 2.09479 +3.08479 4.47364 +4.50916 5.91511 +7.31605 7.63868 +3.14469 4.07035 +8.38431 8.87993 +7.42277 7.64967 +4.22472 4.26323 +8.49871 8.90746 +7.44431 8.09014 +8.35213 8.7504 +3.85634 4.37584 +9.12975 9.77042 +-0.326056 1.17374 +3.53802 4.06211 +6.81775 6.8467 +8.19106 8.64489 +4.20526 5.37727 +2.74081 3.72143 +0.49642 1.10775 +7.76606 8.00524 +4.79825 6.38926 +1.99478 3.20484 +4.69853 6.29508 +5.73058 7.18643 +8.11708 8.64257 +9.62375 9.84838 +5.95271 6.38989 +9.0193 9.93848 +3.91188 4.10834 +6.065 6.60546 +2.62354 3.60072 +8.53665 9.06824 +6.40691 7.44693 +1.62959 2.5825 +9.4128 9.87031 +6.24697 6.62684 +3.31136 3.45626 +4.80347 4.9935 +9.21711 9.53416 +-0.491547 1.72886 +4.75174 4.87217 +0.86329 1.53331 +2.4586 4.2578 +5.10301 6.2815 +5.08302 5.86788 +6.12434 6.78948 +9.68323 10.0973 +3.52576 4.40424 +4.9925 6.89084 +0.846638 1.80782 +1.09709 1.7685 +8.38592 9.03312 +9.56243 10.2682 +5.03592 6.6429 +7.8609 8.04599 +1.21404 1.31975 +7.47824 9.2063 +1.47849 2.68795 +1.2909 2.06381 +5.21288 5.54616 +6.27218 6.99345 +4.77622 5.08494 +3.30665 4.14735 +3.38947 3.55545 +7.71197 8.53162 +1.10565 1.50806 +0.7889 0.984689 +2.88598 3.33244 +5.70958 5.81232 +5.16567 6.24511 +6.91255 7.25784 +-0.401084 0.753156 +4.81138 6.20671 +1.67301 3.58501 +7.19478 8.25624 +1.24428 2.2523 +4.31631 5.33357 +0.589196 1.02017 +5.69207 6.97803 +2.3854 3.25501 +4.1362 4.91135 +8.9932 10.3184 +7.95871 8.45158 +4.03213 5.26347 +3.09506 4.06425 +-0.0310321 0.738171 +7.35733 7.61512 +2.48488 2.96253 +4.72098 5.69867 +5.5395 5.96914 +3.17854 4.283 +6.50012 7.33744 +1.93266 3.00941 +1.49319 2.71826 +9.0187 9.13099 +7.15259 7.40691 +8.71939 8.93257 +1.57203 3.11249 +0.933429 2.16903 +2.99663 3.71667 +2.06144 2.81311 +7.9072 8.2103 +0.490069 0.614737 +7.84111 9.70812 +1.15363 1.6421 +1.15475 1.43307 +8.2228 9.92116 +7.76825 8.40724 +6.15122 7.31322 +7.1427 7.49294 +2.30516 2.7019 +2.03336 4.03387 +8.3918 9.85707 +8.57214 9.59345 +3.8057 4.1119 +8.9223 9.38556 +9.32051 9.60504 +7.13349 7.69154 +1.71855 2.00425 +5.10333 6.0605 +-0.149137 0.80973 +0.466224 3.1698 +4.19165 4.29604 +1.64018 2.3161 +9.40397 9.89211 +5.21738 7.06323 +0.525526 1.0331 +8.06992 8.08704 +9.81539 10.0915 +9.33514 9.50521 +5.95494 6.54519 +9.21466 9.35909 +4.96603 5.18164 +3.89238 5.53056 +5.04546 6.32916 +8.63758 8.65805 +7.03226 7.57074 +0.32029 1.10893 +0.194176 0.992252 +8.79061 9.50848 +0.239137 0.300717 +7.7234 8.43747 +3.43679 4.28954 +8.31382 9.18928 +1.39612 1.67253 +6.95733 7.39846 +1.29129 2.12185 +7.93611 10.2305 +3.67764 4.17562 +1.38149 2.42407 +2.2847 2.48412 +9.28655 10.0661 +2.94115 3.21326 +7.04238 7.91536 +5.06012 5.61526 +8.95611 9.91736 +2.18524 3.44007 +1.0692 1.10987 +4.37019 5.18443 +5.82014 6.441 +1.68642 1.70458 +4.93783 4.9535 +9.42003 10.1196 +-0.356795 1.30987 +1.37778 2.80527 +9.54126 10.1758 +8.67413 10.5984 +0.914291 2.0697 +6.08696 7.09832 +2.82202 3.31103 +4.07818 5.50195 +2.85223 3.67449 +6.03006 7.10863 +8.84655 10.528 +5.08031 6.2001 +1.00272 2.74191 +0.169102 0.223253 +0.025089 1.26534 +-0.203339 0.64667 +0.899666 1.48885 +0.74235 1.49976 +6.28212 6.80412 +5.65159 5.93106 +2.1686 2.7445 +5.02936 5.43091 +8.07124 8.80499 +8.65696 8.95802 +7.68394 8.365 +8.65062 8.69146 +0.058248 1.19535 +5.74545 5.84057 +6.05244 6.52152 +9.3878 10.3328 +7.71379 8.88044 +3.32961 4.54105 +8.51987 8.62854 +4.10821 4.16902 +9.47639 9.78723 +4.72417 4.84793 +2.32867 2.94068 +9.52275 9.57815 +5.32867 6.96127 +4.32462 5.1508 +4.46919 6.45961 +8.62661 10.9533 +0.0244049 0.56156 +1.49207 1.73164 +7.03156 7.81168 +5.88587 5.89732 +8.43632 9.65085 +7.52612 8.06726 +4.82464 5.6193 +3.8062 3.90356 +2.42708 2.51646 +2.06458 2.45877 +0.427218 2.24283 +7.42616 8.11513 +0.617708 1.01833 +8.74218 9.03592 +-0.213346 0.599112 +9.05291 9.59124 +5.20365 5.54277 +2.85289 3.99509 +3.08468 4.58456 +0.136826 0.685254 +3.87191 3.99021 +0.970836 1.49673 +2.44355 2.53584 +8.88615 9.94545 +3.90591 4.52798 +1.52518 2.50658 +7.21268 9.07745 +0.767314 1.23833 +8.62975 9.42367 +6.71524 7.67686 +7.61205 8.48292 +5.312 5.65087 +4.75627 5.96261 +7.90674 8.0753 +7.37887 7.71478 +3.74483 5.52984 +2.7187 2.85544 +4.7902 5.62159 +2.89671 5.19815 +7.37268 8.72506 +7.11916 8.28301 +9.19814 9.75279 +1.2085 2.60113 +-0.632009 0.889734 +7.99858 8.39743 +6.48346 7.10822 +6.30616 7.06648 +5.56514 6.51183 +2.41505 3.56224 +6.83749 8.84447 +9.05111 9.46906 +7.77476 8.4091 +6.11378 6.31232 +4.42882 5.69917 +5.88107 8.052 +3.75437 4.08893 +2.70487 2.77664 +7.26028 9.77257 +1.44621 2.73267 +2.0384 2.60397 +2.95402 3.68949 +6.04766 6.4054 +0.716046 1.77698 +1.5084 1.72988 +2.58426 2.80376 +8.05255 8.59793 +6.06336 6.20709 +3.29813 4.31473 +2.53477 4.92554 +8.78711 9.88634 +9.26627 9.82082 +6.70683 6.81257 +8.25978 8.99788 +7.28054 7.64237 +5.14556 5.20711 +4.20431 5.87866 +8.96592 9.97597 +4.06216 4.41519 +8.49174 11.0491 +5.24547 6.03094 +4.65885 5.95835 +5.09606 6.34846 +6.30463 6.65933 +6.48022 9.56168 +1.38088 2.98143 +0.486911 1.16767 +8.16327 9.34821 +0.768885 0.782616 +4.51699 6.08086 +9.55086 9.70242 +2.86802 3.72489 +1.88496 2.18749 +4.31876 4.33726 +8.38871 9.45631 +8.80634 9.36198 +5.232 6.42399 +9.86919 10.0492 +3.61902 4.53086 +3.13118 4.42364 +2.69395 3.1816 +-0.303144 1.32309 +4.28871 4.36739 +3.8631 4.08745 +4.9291 4.98968 +7.14273 7.25505 +2.56623 2.59122 +6.01753 7.72265 +6.76051 7.53954 +6.76933 8.14741 +0.933137 1.83537 +7.9357 8.57904 +5.55847 5.59984 +4.25563 4.3345 +4.28087 5.21348 +8.88534 9.06554 +1.88575 2.94002 +5.26613 6.04562 +0.514249 1.45538 +0.130644 0.501645 +4.30564 4.86337 +1.57246 2.38451 +0.303814 1.77474 +4.22675 5.02783 +6.75381 6.78634 +5.64096 5.9725 +6.76159 6.98142 +2.35569 2.39119 +3.29794 4.95962 +6.55055 7.03366 +5.31474 5.69404 +9.01335 9.16988 +8.58306 9.37831 +7.06522 7.07778 +1.14695 1.74744 +3.15507 3.22865 +5.5925 7.14168 +2.14679 3.68767 +7.54789 9.71878 +1.5667 2.08742 +-0.604726 1.66718 +0.306012 0.54799 +2.61731 5.08257 +0.80957 1.74655 +8.22035 8.81637 +4.401 5.449 +8.89389 9.01988 +4.80574 4.9322 +2.19895 2.88565 +9.06688 10.8095 +1.23727 1.58699 +7.14836 7.92057 +4.65155 6.15149 +0.563061 2.16535 +7.66764 8.0341 +8.32324 8.42774 +4.54541 5.11069 +8.0237 8.09992 +7.26113 8.09404 +2.55196 3.20317 +8.1236 8.60951 +1.90437 3.23006 +0.888133 2.50365 +1.13618 1.69444 +2.60463 3.01696 +7.2311 7.73229 +5.06501 6.01487 +3.9893 4.10116 +1.45278 1.56937 +2.74601 3.80778 +9.40705 10.3843 +3.02533 3.52213 +8.7097 9.2268 +8.73145 10.5552 +2.56059 3.5742 +6.27328 7.57089 +3.23291 3.30811 +6.33804 7.20304 +7.63648 8.34564 +9.82053 9.93597 +3.14924 4.58629 +5.28253 6.33733 +1.99411 2.04104 +0.305593 0.420302 +5.39668 6.64188 +7.99992 9.37823 +5.25169 5.65987 +0.109291 0.875734 +3.08589 5.50296 +6.51358 6.62588 +5.34687 5.58204 +0.043587 0.932787 +-0.0264143 0.28677 +8.09722 8.37087 +5.46612 6.30285 +2.89146 3.49892 +6.73278 7.11762 +5.03068 5.90176 +1.7459 2.87727 +0.207707 0.448933 +7.00453 7.63105 +6.02789 7.87991 +8.1917 8.95854 +7.49014 8.73215 +8.48402 9.22063 +1.0467 2.4687 +0.241901 1.38802 +2.65867 2.81258 +5.46725 6.59448 +3.40578 3.75607 +4.2495 4.26392 +5.6608 6.213 +2.99705 3.88852 +6.17231 6.72018 +-0.17415 0.492739 +4.89596 6.49895 +4.68876 6.60218 +-0.0510568 1.46013 +8.87099 9.28179 +3.98894 4.5838 +-0.20015 1.59214 +8.80756 9.51828 +7.74921 8.53538 +-0.380041 0.440574 +2.69409 3.91466 +2.42747 4.56745 +6.25881 7.75647 +7.2941 7.77193 +2.60806 2.90251 +0.325028 1.22219 +8.29921 9.01416 +3.85524 5.45451 +5.2612 5.71877 +2.92849 3.73937 +8.6242 8.70808 +7.28153 7.35797 +1.65378 2.87917 +3.46034 4.24143 +3.99989 4.3199 +1.15266 3.60328 +4.8464 6.4887 +4.67021 4.68421 +6.96861 7.31554 +0.00723008 0.817047 +7.59589 8.88352 +5.56725 6.08465 +9.02409 9.19527 +5.81681 6.74193 +1.98221 2.98678 +8.76392 10.7646 +4.3903 4.50531 +1.0186 2.01838 +2.66674 2.74505 +2.41105 3.44579 +8.98295 9.18995 +8.14385 8.98779 +2.69613 3.60144 +0.445704 1.51319 +-0.634889 0.860409 +6.32737 7.10112 +7.88824 8.06838 +3.76271 4.43529 +7.66487 9.30221 +8.73974 9.59191 +3.08965 3.43006 +8.9518 9.96154 +0.727194 1.55228 +6.35214 7.12234 +2.71987 3.22996 +7.12786 7.4379 +-0.346107 0.837469 +8.47103 9.05987 +9.15744 10.628 +8.3237 10.093 +1.15052 1.16223 +6.95959 7.35423 +7.69488 8.44145 +4.21694 5.65913 +3.10562 3.37534 +9.73437 9.78252 +5.0458 5.53479 +7.80485 8.5163 +2.0442 3.75748 +-0.459177 0.498702 +7.38032 8.32195 +0.909659 2.11175 +7.08657 7.56877 +1.84997 3.10206 +4.2517 4.53819 +6.71655 7.04117 +1.06604 1.29153 +2.69273 3.31633 +2.19732 2.84826 +-0.723032 0.774865 +-0.289734 1.44645 +5.87194 7.71917 +1.01576 2.83685 +0.981927 0.998558 +3.07172 3.73201 +-0.112577 1.12642 +3.54063 3.67007 +7.21571 8.53815 +0.109957 0.839052 +6.86046 7.17211 +9.40878 9.69478 +0.989391 1.69046 +8.22287 8.8147 +1.48203 2.83308 +5.86418 8.0993 +0.749797 1.09852 +1.82996 2.50847 +0.28178 0.496017 +2.60694 3.00872 +8.6254 10.1698 +6.11641 6.41537 +7.19529 7.21342 +1.8214 2.17517 +0.991201 1.3788 +2.84924 3.12362 +5.75821 7.13843 +6.7106 7.35932 +6.6055 6.6829 +7.97105 8.58613 +1.56087 1.95845 +6.36782 7.10926 +2.43382 2.74699 +7.40509 8.8029 +8.42459 8.63142 +6.26128 7.55043 +4.6465 5.4431 +2.93214 3.29517 +0.157602 0.545214 +6.05931 6.72188 +1.7908 3.11731 +2.39217 3.58736 +7.07421 7.43852 +8.13419 9.74991 +9.53094 9.65319 +2.35726 3.68679 +-0.108561 0.874853 +6.87136 8.84157 +3.40803 4.58835 +7.50448 7.89932 +4.29762 5.53867 +0.863755 2.30032 +7.24847 7.95342 +2.89618 2.98849 +-0.928261 1.61922 +0.974105 2.91262 +6.99271 7.25856 +3.60995 5.01832 +1.26865 1.79704 +9.62217 9.80719 +1.02656 1.35514 +7.16502 7.32934 +3.12092 3.28857 +2.81374 3.84317 +8.73626 10.7585 +3.36982 3.61446 +5.08437 5.78949 +2.90218 3.0862 +9.2309 10.2523 +5.0967 5.48926 +9.73088 9.92708 +1.54013 2.78301 +6.73707 10.0789 +6.41735 6.838 +2.57935 3.04287 +5.719 6.70352 +5.42474 5.62732 +4.23904 4.69787 +4.16528 4.28736 +7.73477 8.84143 +4.90346 5.87324 +5.1969 6.14087 +3.48793 4.14182 +0.648493 1.07987 +6.88101 6.97932 +7.67342 8.74418 +5.16759 6.3871 +9.16292 9.49569 +8.77422 10.4817 +-0.358149 1.04178 +9.54616 10.3424 +3.12027 4.26504 +3.81223 4.73004 +1.2386 3.32247 +8.21963 8.42629 +9.10312 9.51016 +6.96107 7.43045 +2.98587 3.12365 +0.198165 0.211424 +5.19716 6.10856 +6.10553 6.3327 +3.98176 5.11099 +1.02512 1.04242 +4.27949 5.71947 +-0.457956 0.538807 +7.99877 9.48581 +5.88782 7.73303 +1.21496 2.85825 +8.46962 8.7862 +9.50182 10.1527 +5.85223 7.76234 +2.48368 2.52439 +2.35426 2.77405 +0.397056 0.482679 +0.160423 1.15786 +4.47109 4.8633 +4.74523 5.84196 +5.39177 5.75218 +9.00754 10.3249 +3.74813 4.03273 +3.08633 4.08426 +4.62672 5.29012 +1.92055 3.01442 +3.79279 4.5603 +9.52431 9.68334 +2.8126 3.32592 +-0.313688 0.490785 +9.06695 9.36835 +2.60321 4.14185 +4.40231 4.99535 +9.32205 10.1041 +5.3879 5.44349 +0.308728 1.0956 +9.05758 9.08283 +1.90313 2.50914 +7.1391 7.59459 +7.47357 7.95993 +1.25267 2.34827 +3.33222 4.36522 +8.78126 9.38611 +0.635979 1.62283 +8.3492 8.57545 +-0.572557 1.60517 +8.28855 9.03937 +3.47934 3.90271 +4.64498 5.43501 +0.872177 2.62011 +7.3893 7.58876 +2.14063 2.88063 +1.69361 1.75261 +4.19727 4.86483 +0.814676 1.27639 +8.19899 8.58203 +8.3394 8.99896 +9.31768 10.1694 +4.99218 5.19949 +4.2459 4.75266 +9.6314 9.64249 +4.038 4.75708 +7.92398 8.8579 +4.30747 4.54161 +7.51776 7.78258 +3.77611 5.1385 +3.53275 3.90278 +1.78619 2.12474 +3.18736 3.55159 +8.36759 8.52587 +5.52526 5.7843 +7.64174 8.09773 +4.37925 5.85699 +3.94295 5.31298 +-0.464623 0.795523 +7.02408 7.7048 +0.0690458 1.0008 +1.05445 1.32797 +0.126093 0.712612 +-0.809973 1.33869 +3.45568 3.96532 +0.433875 1.78679 +8.94667 9.65034 +1.98575 2.76936 +6.47974 7.67912 +2.74186 3.34153 +7.82655 9.32112 +4.71441 6.14932 +0.741177 1.76987 +8.05021 8.23239 +0.818503 0.882959 +7.13341 7.43399 +8.45939 8.93395 +4.44558 5.70161 +3.05657 3.86962 +8.75469 8.85537 +1.0922 2.23475 +6.00278 7.51598 +0.0530968 0.582206 +4.01788 5.48223 +1.30808 2.81869 +8.18848 8.59771 +2.43691 2.80685 +8.54045 10.6178 +7.58523 7.91634 +6.70183 7.49962 +5.81501 7.29783 +0.661853 1.58021 +6.50997 7.20411 +0.334292 1.40252 +-0.329585 0.742961 +2.38756 2.48935 +2.78114 3.58788 +7.97227 8.55379 +3.36753 4.57472 +5.14486 5.31457 +3.99691 5.47708 +6.36404 6.8741 +3.22519 4.63321 +1.80583 2.21824 +8.20747 9.42947 +5.90819 6.94368 +6.58559 6.85933 +2.99108 4.03832 +7.20963 9.6252 +3.10244 3.87265 +7.23018 7.91389 +7.18084 9.61063 +6.74145 6.86507 +8.40721 9.5751 +7.12352 9.45614 +2.06653 2.51786 +4.9155 5.04183 +1.34304 2.92777 +0.571315 1.17285 +8.05396 8.28214 +5.29142 6.24974 +8.93797 9.23051 +4.6108 5.45568 +6.46124 7.53124 +3.16695 4.37505 +2.76803 2.82764 +4.1531 4.84927 +8.19433 9.00383 +5.12114 6.22952 +2.2542 4.74849 +0.621192 0.871537 +1.37403 2.28895 +0.305704 1.3287 +8.70471 9.53085 +2.29164 3.56607 +2.42106 3.37382 +1.14309 2.03085 +9.17624 10.3281 +1.88864 2.70161 +0.932647 1.2473 +5.72385 6.55694 +5.25496 5.38675 +5.85771 6.69626 +7.37247 7.93094 +7.73499 7.98782 +4.91417 5.27506 +3.51127 3.84403 +6.96198 7.27686 +6.51176 7.74735 +4.19954 5.08222 +1.58115 1.83842 +2.11889 2.3408 +1.94427 2.00422 +5.59977 6.86555 +9.46942 10.3491 +9.18904 10.1988 +1.71938 3.01547 +4.3515 5.4951 +2.53792 5.85188 +0.3884 1.36228 +5.02469 5.62368 +6.82402 7.72203 +-0.320478 0.821539 +0.0885656 0.248783 +3.01725 3.44385 +6.63776 7.74386 +6.57899 7.9332 +4.82656 5.18327 +3.91909 4.43955 +0.0708319 0.101395 +2.59796 4.22775 +-0.433109 1.26978 +-0.434274 0.624336 +3.22018 4.25282 +4.63351 4.776 +8.889 9.56332 +5.35952 5.46531 +8.73832 9.22756 +2.03432 2.34194 +0.477994 1.43353 +1.2029 2.86844 +5.09945 5.76855 +8.89076 9.01771 +5.30284 6.31732 +1.56375 3.17543 +5.4773 6.36897 +5.30934 5.35073 +7.20096 7.7075 +6.51046 7.12888 +9.37127 10.0531 +-0.0484323 0.348687 +1.83241 2.2143 +8.28633 8.60462 +2.51014 3.65817 +3.27798 3.58685 +1.41567 2.23302 +7.50794 8.10378 +-0.0579575 2.10373 +-0.856005 0.96621 +2.96238 3.48434 +1.36304 1.90594 +2.9997 3.41214 +7.2763 8.087 +1.69207 2.74419 +5.41625 5.83917 +9.22139 9.53794 +1.17477 1.51576 +6.74597 7.90871 +0.678913 1.73759 +5.70863 5.7214 +8.88411 8.93377 +3.44409 4.54586 +0.958963 1.53878 +8.29904 9.3867 +2.52433 3.60238 +8.16257 8.21986 +2.11395 4.23455 +6.85451 7.40364 +0.20286 0.639736 +2.05848 2.49034 +0.547013 0.77336 +7.83609 8.11903 +2.16539 2.29286 +3.94232 4.31368 +8.53475 8.54519 +4.77462 6.4158 +4.08395 4.68214 +1.56902 2.23811 +1.61337 3.11768 +1.51181 1.65521 +0.0821202 2.09269 +4.77622 5.16243 +4.62148 5.75837 +0.613158 0.952696 +1.89128 3.04792 +7.57509 8.92834 +2.70465 4.2941 +4.95906 5.12442 +8.0927 8.17277 +0.796512 1.3215 +5.74134 6.45291 +9.68479 9.78978 +5.89261 6.2292 +6.11377 7.9339 +2.20571 2.67129 +3.46228 4.27058 +5.26723 6.2653 +4.04391 4.26562 +0.380382 0.818995 +7.58108 7.7618 +5.02375 6.13042 +4.20178 4.66297 +2.83039 3.0221 +2.36072 2.45545 +6.68854 9.20726 +2.91388 3.42464 +9.33373 9.73449 +7.75844 7.94625 +2.72414 2.89669 +6.65438 7.96623 +1.00647 1.05385 +2.63018 4.9432 +0.152187 1.60259 +8.86332 10.3631 +2.31523 2.6815 +8.00509 8.61794 +1.69711 1.75938 +8.65442 8.73697 +4.23917 4.32001 +9.66851 10.1925 +6.93943 7.49814 +8.51986 9.03561 +2.10317 2.5175 +0.539549 1.75683 +6.29423 7.93236 +8.64345 9.54556 +1.44069 1.6814 +9.10017 9.77088 +6.16731 7.40496 +0.570043 1.93192 +2.65761 3.88544 +1.46895 1.52688 +-0.369067 0.540647 +2.04868 2.72065 +2.1286 2.27858 +5.90157 6.16431 +1.55581 2.51851 +3.29705 3.81635 +3.4137 4.10991 +8.48699 10.1364 +8.43437 9.4642 +-0.037842 1.47589 +0.541735 1.7805 +0.499576 2.36065 +4.1415 4.72435 +4.77598 6.16872 +3.30388 3.61854 +6.43796 7.85966 +5.27157 5.70871 +0.919258 2.18653 +4.00961 4.07902 +3.78201 4.23596 +4.50464 4.791 +3.70253 5.30916 +8.59228 8.70036 +4.31103 5.69049 +5.31775 5.34378 +2.24198 2.64194 +6.66937 7.41675 +7.21753 8.42057 +4.35399 4.52398 +6.90698 7.30084 +3.44296 5.44378 +3.36719 4.89951 +3.38624 5.33856 +3.44877 3.53693 +5.81398 6.3016 +7.24655 7.33127 +3.86142 4.53134 +3.85894 6.88112 +6.45704 6.95699 +6.90997 8.24088 +5.68813 5.7611 +0.699911 0.824323 +6.73758 8.42517 +9.34644 10.07 +0.289929 1.30554 +8.30644 8.49113 +6.47667 7.16073 +4.28093 4.90236 +8.32678 8.57064 +7.09205 7.92316 +5.55599 5.63919 +1.0104 2.22875 +1.72237 3.53668 +2.54699 3.14823 +-0.668582 1.25485 +1.25582 1.37003 +1.35044 1.57807 +6.17083 6.30811 +0.618816 1.20065 +-0.540992 1.21634 +2.06673 4.28857 +9.03398 10.8112 +8.73735 9.22814 +1.30178 2.7599 +6.0221 7.34889 +8.30124 8.52159 +1.92023 3.34545 +2.99331 4.93358 +3.8412 3.93379 +1.455 2.77005 +0.538664 2.1118 +4.16926 4.26053 +0.699746 0.937609 +6.36024 6.6511 +2.34698 4.84463 +8.11109 8.76496 +4.05425 4.67773 +8.2284 9.78568 +1.64423 1.80353 +5.70109 6.93764 +7.2091 9.67224 +4.47015 5.23311 +4.29326 5.36144 +7.93151 8.96494 +4.61889 4.96487 +5.38473 5.43594 +9.35456 9.66489 +1.23737 3.04121 +1.16077 1.19519 +5.91037 7.55679 +6.88344 7.60181 +6.39705 8.65039 +1.61791 2.93041 +9.68285 10.1396 +9.03129 9.05839 +7.0683 8.29875 +7.19624 7.41696 +7.5266 8.38738 +-0.254571 1.01098 +1.30218 2.03222 +7.6432 7.73031 +4.99495 6.04757 +2.79394 3.29394 +0.31505 3.55963 +7.55382 8.18787 +6.00032 6.27664 +1.49355 1.79767 +5.21191 7.19537 +3.47816 3.75801 +2.10272 2.39494 +1.31887 1.93829 +7.14313 7.63055 +7.3141 7.77239 +6.03409 6.17265 +4.24946 4.53165 +0.0569272 2.56109 +8.44766 11.4872 +4.22879 4.28007 +6.92817 6.98775 +8.08859 9.0206 +-0.0748418 1.48605 +6.56698 7.0488 +4.46624 5.4952 +3.66085 4.05778 +6.44711 8.93943 +2.45735 2.49339 +0.0606673 0.416191 +-0.183838 0.750464 +7.08561 7.67275 +6.65423 6.90808 +0.0598735 0.364072 +5.2228 5.41543 +3.14042 3.19043 +2.40069 3.02829 +1.80441 2.1849 +3.47491 3.95775 +5.49162 6.63934 +2.03332 2.32288 +3.17234 5.25109 +2.58274 2.59951 +9.37994 9.97097 +4.71509 6.77966 +5.18915 6.84982 +6.12508 7.04354 +0.811202 1.98808 +1.46825 3.66984 +2.44386 4.15623 +7.60169 7.68242 +-0.43208 1.22222 +5.40569 5.66153 +0.391742 1.79408 +6.77742 8.43115 +9.12828 9.3851 +6.39541 6.80626 +5.17919 6.29326 +6.57263 8.12999 +3.439 4.62236 +8.40525 9.80086 +7.60986 7.70099 +1.32123 1.44213 +0.526574 1.92338 +9.57195 9.79591 +9.52103 9.63159 +3.79775 4.20608 +4.74446 4.89606 +9.00085 9.60025 +1.26279 2.08363 +4.13639 4.49232 +6.59409 7.18315 +1.0637 1.78425 +5.4213 6.87661 +4.24407 4.30987 +9.79732 10.1204 +4.24597 4.83541 +8.47705 8.5145 +4.34095 4.93842 +5.68168 6.96086 +7.48654 7.91072 +8.32005 8.45111 +5.24065 5.3032 +3.25982 3.94442 +5.58106 6.18764 +4.4243 5.58619 +6.36467 7.07082 +2.70051 3.56014 +5.94534 6.87688 +7.33638 7.7645 +4.57067 5.86652 +7.83993 8.36854 +9.03617 9.11629 +7.44672 7.95614 +6.05876 6.3594 +4.02496 4.97119 +3.01438 4.36109 +7.4932 7.92357 +7.51661 7.53354 +7.60692 8.49678 +1.76088 2.59103 +7.08578 7.39566 +4.83605 5.42933 +-0.186592 0.847663 +1.15879 2.33996 +8.11815 9.35472 +6.02584 7.62549 +0.881084 1.00015 +5.39067 6.27026 +0.910755 0.97444 +5.32174 5.65652 +7.69388 8.24928 +3.40521 3.7615 +5.60321 6.92388 +8.25096 8.34324 +0.00108913 2.16897 +0.508035 0.66573 +-0.0517816 0.0876197 +3.26472 4.30955 +1.99494 2.14903 +2.089 4.32368 +5.17378 5.75964 +2.8779 3.54361 +6.56459 6.90645 +1.43196 2.88337 +1.48917 1.94009 +3.40807 4.25784 +8.0334 8.13458 +8.22254 9.6175 +2.96308 3.14349 +5.04768 5.71252 +3.9977 4.72614 +1.44384 1.60782 +7.78147 8.19817 +7.03854 7.50085 +5.90747 7.06091 +2.89169 4.31831 +2.46167 3.16529 +9.13228 9.1504 +2.57975 3.05313 +5.75976 6.52958 +8.10499 8.98982 +8.43162 8.76377 +0.422917 0.668254 +1.69046 2.09962 +5.50386 6.66954 +0.0897183 0.564514 +3.50103 4.1041 +3.91918 4.52559 +4.39297 6.18876 +3.90396 4.90868 +9.69362 9.85528 +6.27994 6.95062 +8.01563 9.09433 +8.25641 9.72944 +8.22072 8.35423 +1.27059 1.61352 +8.53312 8.96235 +3.49185 3.9042 +5.79579 6.046 +0.489013 1.2147 +4.00074 4.177 +2.66625 2.93036 +7.20267 9.34958 +7.44659 8.54707 +8.99915 10.1143 +7.59922 7.82031 +8.38502 9.03222 +0.160075 0.294398 +4.14549 4.3927 +9.35554 10.248 +-0.159435 0.467922 +2.17272 3.72336 +8.63811 8.79976 +4.23215 4.66461 +6.99516 8.2035 +6.45212 7.88791 +6.20141 6.28633 +7.69396 8.82204 +4.50807 5.96315 +8.51725 8.89286 +0.939492 2.12064 +7.4615 7.62666 +8.46681 9.11769 +3.92828 5.40884 +9.05622 9.40015 +0.229625 0.860838 +2.05694 2.52113 +-0.217927 0.574255 +9.55146 10.3256 +8.31497 8.3417 +3.52833 4.47013 +7.7131 8.52058 +2.15462 2.66777 +5.7674 6.17553 +3.3358 4.10589 +2.06642 3.00412 +2.43387 2.85242 +5.09473 5.84276 +7.3287 7.54846 +4.64254 5.11465 +4.05785 4.93614 +4.25413 5.43513 +2.96476 3.15378 +3.53732 4.48239 +2.34137 4.01272 +2.24879 3.40626 +3.43323 4.49055 +0.871415 1.33068 +0.508929 1.65611 +4.92057 4.94743 +7.03376 7.35193 +5.73043 6.47264 +7.82417 9.93642 +5.24102 5.9178 +2.38528 4.1676 +6.27437 7.19631 +9.29267 9.53262 +4.10098 5.24964 +0.383714 0.833317 +5.97628 7.92987 +8.15799 8.96819 +8.1687 8.29862 +8.16289 10.5149 +7.38205 7.89765 +3.81883 4.15607 +9.46915 9.61755 +1.50756 1.51863 +2.34236 2.84689 +0.398473 1.15027 +1.05302 1.49155 +8.71687 9.35232 +1.0502 1.40395 +7.83685 8.76302 +7.7731 8.46899 +5.56618 5.97458 +2.90035 4.12043 +6.40644 6.68706 +3.95201 4.37075 +7.1831 7.67748 +9.42789 10.0914 +5.45198 7.01256 +8.64609 9.45756 +6.01864 6.31515 +7.64621 8.65533 +5.45654 5.76553 +2.04332 2.75476 +5.49454 5.85693 +6.13688 6.21927 +2.66255 2.7385 +4.8326 6.43772 +9.12704 9.45287 +-0.294488 0.318697 +2.26979 2.35516 +4.12949 5.58506 +3.01416 3.62246 +6.64697 7.10221 +6.44307 6.82985 +4.10484 4.73148 +7.42589 7.6029 +5.33055 5.50395 +2.46474 3.05847 +5.43677 5.59206 +2.13807 2.3988 +-0.38424 1.8121 +0.00916704 0.219304 +8.62621 10.2262 +3.33927 4.51169 +5.45656 7.13165 +5.29253 6.57917 +3.51704 3.9421 +8.63729 9.13361 +3.92626 4.3469 +6.83104 7.52695 +1.22258 2.28191 +0.447646 0.789809 +7.96543 8.54328 +2.24269 2.42571 +4.4161 5.40481 +0.813992 2.21792 +0.694664 0.974182 +6.50017 6.88902 +4.00723 4.65882 +9.05784 9.85062 +6.80276 6.98196 +0.105446 0.379881 +0.416982 0.53336 +9.01269 9.55204 +3.27197 4.23315 +6.7017 6.89704 +4.21512 4.42378 +4.86735 6.90949 +4.52235 5.36878 +2.62205 3.55746 +-0.551048 0.555476 +1.63274 2.71251 +4.26739 4.88085 +8.23129 9.77405 +2.49409 3.96851 +6.66387 6.88886 +7.72383 8.90611 +3.18511 3.27281 +0.73722 1.64435 +7.90329 9.02868 +6.94845 7.06773 +0.509461 1.54928 +4.63885 5.51652 +9.24395 9.5121 +1.00007 1.57161 +5.31349 5.45437 +0.929284 1.71034 +7.05985 7.63288 +7.38418 7.45373 +4.14937 6.5167 +7.49989 8.6081 +9.28313 9.57721 +4.41285 5.1497 +2.96148 3.09221 +1.58256 1.66419 +4.45116 5.43488 +5.70927 7.11699 +3.61105 3.93153 +5.92285 6.63773 +3.50065 4.48453 +7.97338 8.96464 +0.541394 0.965435 +4.46469 5.03925 +7.33695 7.6484 +9.64234 9.6938 +4.16378 4.17886 +7.10741 7.31549 +1.51829 2.62477 +2.1892 2.9684 +9.23767 10.0462 +7.87649 7.97087 +7.05385 7.85952 +6.91232 7.50277 +6.60185 7.81572 +2.27112 3.90211 +5.74452 8.2018 +6.25117 6.26911 +0.525893 1.53447 +0.392956 0.959233 +3.51591 4.71055 +3.10449 5.41156 +7.35964 7.65642 +2.89831 3.54334 +3.42338 3.68259 +4.75496 5.51419 +3.8792 4.48395 +2.18007 4.13236 +3.15798 3.16864 +8.91248 9.21598 +8.54636 9.34037 +7.93697 9.79709 +6.40205 8.9653 +9.67332 10.2252 +4.31771 5.25423 +7.27485 7.3725 +6.22971 7.11411 +1.16538 2.16762 +1.40443 1.6876 +3.14915 4.58847 +7.13761 8.72165 +4.38448 5.88699 +7.98309 9.19449 +8.491 9.05597 +5.55043 6.19359 +2.44006 3.36071 +9.56522 9.79903 +1.86129 2.00225 +1.65239 2.11478 +7.59392 8.4655 +2.44709 2.68538 +6.80932 7.04694 +8.8212 9.4182 +0.276845 0.956468 +8.17008 8.5538 +0.77864 2.06897 +6.78458 7.68692 +0.504907 2.67518 +5.56963 6.9058 +3.42691 3.5414 +2.52065 2.71583 +5.09924 6.26696 +0.223724 0.610039 +3.61258 5.29324 +0.388393 3.11131 +2.87763 4.45415 +8.26438 10.1169 +5.89742 8.17506 +1.89686 2.66651 +5.33662 5.68228 +3.37496 5.67291 +2.25713 2.36127 +0.402185 0.716342 +6.4231 6.79227 +3.22707 4.69314 +7.85092 8.77413 +3.31322 3.72455 +5.43021 7.7167 +8.5883 9.00864 +1.21371 1.71836 +6.35584 7.9706 +5.44438 5.50414 +5.31325 6.11217 +6.08888 6.78794 +7.70604 8.13257 +1.29858 2.48753 +5.54083 6.38817 +8.23948 9.82646 +7.5575 9.0224 +8.00415 9.39763 +0.488455 1.55358 +4.48727 5.20741 +6.46648 7.02349 +0.355939 0.611119 +9.4892 10.2189 +2.61893 2.82832 +0.268193 1.24687 +3.01964 5.19554 +6.29954 7.42795 +8.70796 9.48366 +5.39307 6.64597 +2.47001 2.60746 +5.30949 7.46529 +6.07973 6.16835 +0.764507 1.6144 +7.94123 8.52143 +1.88244 1.96592 +6.42103 7.02205 +7.673 7.73208 +6.66891 7.80675 +6.9305 7.5431 +6.62335 6.93873 +4.34846 5.77621 +0.49878 2.82928 +2.65221 2.80109 +7.45348 7.74372 +4.10129 5.26894 +3.87782 4.19855 +4.62113 5.22658 +2.84558 2.88185 +2.53209 2.86065 +8.94932 9.21967 +6.48046 6.89614 +5.81885 6.66829 +6.49129 6.62015 +8.5663 9.58685 +2.43346 3.89849 +9.36561 9.45886 +1.40232 2.65 +6.66 6.74041 +2.87007 3.49668 +4.71138 6.0184 +5.03638 6.08494 +7.77735 8.14253 +1.0301 1.27179 +2.58337 4.04699 +6.95419 7.89775 +7.81164 8.62551 +3.37669 3.96217 +4.68541 5.58692 +4.79697 6.34841 +3.95334 4.81962 +9.44006 10.0941 +4.91098 5.12386 +8.44273 10.1565 +3.6685 3.73156 +5.07599 5.33357 +-0.138235 0.260923 +2.71154 3.45603 +5.75096 6.16127 +4.4775 4.64308 +6.80557 8.97442 +5.49408 5.76652 +8.31937 9.12886 +3.26479 5.51673 +2.57425 3.03145 +2.42465 3.92714 +7.86505 8.50835 +3.29229 3.43549 +4.08537 4.69709 +7.83885 8.60616 +1.61622 2.72716 +9.10228 9.41907 +8.49325 9.46612 +-0.174644 0.351716 +1.95648 2.14825 +8.28844 8.4428 +4.35888 5.59521 +5.1396 5.22537 +0.330835 0.879566 +6.14972 6.82967 +3.14811 4.89049 +-0.231668 1.08277 +3.13526 4.94545 +8.32674 8.91046 +5.22364 5.48006 +9.84318 9.88416 +-1.07813 1.6965 +1.5095 2.0328 +8.03716 8.2792 +-1.01307 1.46703 +8.22096 9.0055 +8.9917 9.0415 +5.60623 6.74537 +3.15991 3.19314 +3.13863 3.26451 +0.739618 0.896958 +0.67599 1.18486 +3.37355 4.06303 +0.38605 0.410067 +3.03297 3.46387 +3.45867 3.79806 +8.67249 9.53278 +-0.213855 0.787363 +1.52316 2.61117 +8.31846 8.59736 +4.84685 4.94042 +7.41901 7.82623 +4.99029 5.09747 +5.3637 5.37612 +3.22123 4.77749 +3.21668 5.74743 +3.48748 4.59962 +8.00016 8.56269 +1.63631 2.42239 +1.05159 3.72319 +7.22643 7.95706 +5.65694 5.99195 +9.4469 9.66915 +0.857984 1.59867 +4.05869 5.69955 +2.65788 3.07259 +1.8038 3.38748 +3.91934 4.89922 +6.18534 6.70342 +2.85076 3.20176 +8.1897 9.9614 +0.685531 2.05322 +3.31097 4.00809 +8.26537 8.63475 +2.90508 4.07797 +1.25213 2.31285 +3.05752 4.03741 +-0.481913 0.605629 +1.87958 2.19386 +7.28689 7.76316 +4.82075 5.20688 +-0.08115 0.31839 +3.50085 5.89363 +1.31184 3.30269 +4.03137 4.81493 +6.11688 6.13923 +7.93584 8.43321 +4.9838 5.3733 +3.8174 4.11979 +8.56196 9.02824 +2.87809 3.89589 +7.95309 8.05432 +3.47469 3.63716 +6.61009 7.12576 +8.87374 9.79588 +7.31513 7.99089 +5.78084 6.68535 +4.96985 5.59877 +2.20236 2.52473 +0.661014 1.11035 +6.36183 6.58403 +6.67947 6.85093 +-0.242005 0.513902 +0.442966 1.72024 +6.4587 6.74016 +6.67958 8.0837 +8.98524 9.56405 +6.91409 7.59877 +3.73596 3.97705 +5.51193 5.96437 +3.72029 4.50126 +3.09896 3.23616 +8.83312 8.91774 +0.32173 0.486199 +4.21092 4.59955 +2.61616 4.07081 +1.89049 2.65559 +4.96401 5.00629 +9.33156 9.70914 +3.72455 4.61054 +8.91265 9.6563 +7.12401 8.04324 +6.65393 7.25572 +1.04032 1.24927 +3.0174 5.56006 +1.47645 2.26867 +3.49833 4.37416 +6.16877 6.34452 +6.47417 6.90595 +4.27056 4.92535 +7.60439 9.35352 +0.426219 0.754405 +8.5291 8.68579 +5.84717 6.64632 +1.99513 2.5284 +5.10669 7.83064 +6.99006 7.37272 +0.871836 1.5934 +3.6572 4.38875 +0.154617 0.290737 +5.91634 6.50415 +5.33982 5.45293 +6.92602 6.94691 +0.349512 1.61427 +8.02048 8.99943 +5.75598 7.34946 +5.86948 6.51327 +5.11707 5.6181 +6.27656 7.10043 +8.48922 9.73833 +8.35863 8.69746 +6.67829 7.07852 +8.51257 9.50383 +3.76636 4.33757 +4.82804 5.57166 +5.17892 5.61254 +1.35188 1.94069 +6.04969 6.06833 +5.34181 5.82455 +5.71714 6.71234 +0.966462 2.56278 +7.95169 8.15951 +6.53583 6.89673 +6.73246 8.34493 +8.71111 9.76467 +7.53215 9.56537 +0.619041 0.736713 +9.24399 9.50151 +8.57184 9.88538 +2.82682 3.77294 +4.2649 4.84602 +8.6621 8.96426 +8.04469 8.3189 +7.81877 8.42944 +2.78031 5.16589 +1.23076 1.43577 +8.35385 8.49632 +3.27901 3.66774 +0.595941 1.41354 +3.37123 5.16685 +9.11003 9.95515 +-0.25959 0.32069 +1.44153 1.70148 +1.61595 1.70799 +7.8201 8.53423 +8.5402 9.36947 +8.39125 9.8221 +6.2909 6.35773 +0.000933745 0.920054 +-0.21358 0.491025 +4.00874 4.03866 +3.43552 3.55874 +7.85942 7.98987 +7.6681 8.06748 +6.19541 7.14765 +8.53891 8.96393 +2.38789 3.26866 +-0.0162847 1.18379 +1.04764 1.52755 +0.400798 0.55475 +6.32001 6.94897 +5.9692 6.2012 +1.20784 2.67873 +3.58247 4.46372 +-0.229647 0.559407 +5.65979 5.73489 +2.32795 2.78462 +0.706144 1.55147 +4.56527 4.6636 +5.98901 7.20908 +9.27329 9.95152 +1.31296 1.70529 +5.82933 6.41329 +4.17452 5.29881 +4.15885 5.25117 +0.35549 1.3511 +1.0591 2.4463 +8.87597 9.55625 +6.66826 8.57255 +0.355945 1.40613 +5.39729 6.10218 +3.78791 4.37501 +9.53885 9.87184 +2.67568 2.82552 +4.44836 4.52939 +5.96764 7.40168 +6.35578 6.98546 +0.636857 1.19517 +3.3986 5.55448 +1.46493 2.66884 +-0.0676901 1.80921 +7.83396 8.53452 +8.3508 9.04561 +4.03407 6.0066 +0.997538 3.30635 +7.83064 8.03466 +4.57652 4.97461 +3.85952 4.15471 +0.960261 2.1069 +0.522458 1.52989 +8.81627 9.00768 +0.172256 1.29455 +5.69294 6.15752 +6.86391 7.75307 +2.32429 2.95415 +1.83191 1.90364 +0.400855 0.705649 +5.23264 5.39972 +5.19047 5.79842 +2.40804 2.89401 +0.462887 1.43874 +6.70213 7.90229 +4.37985 4.95797 +3.73768 4.30645 +0.756797 2.11146 +0.458724 0.472099 +3.93098 6.47147 +5.5294 6.00365 +2.97106 3.42174 +5.75875 5.80235 +7.96799 9.02105 +5.36254 7.22823 +6.56124 7.39973 +9.49234 9.57879 +2.87576 3.59509 +3.49182 4.28124 +8.68021 9.94486 +9.60199 10.1276 +9.70115 9.81776 +3.09609 3.98732 +5.00113 8.15031 +5.21248 5.74835 +9.23337 9.5696 +2.92777 3.56297 +2.52044 3.04905 +4.79908 5.05762 +1.98626 3.69659 +4.78726 6.20637 +7.39711 7.42831 +4.44319 4.78716 +9.28452 10.0832 +8.00774 8.85707 +9.22947 10.0523 +4.38653 4.86012 +5.15285 5.23106 +8.95413 9.75947 +2.90286 3.32407 +0.348694 1.39738 +-0.0660432 0.293424 +4.09079 4.2922 +6.0407 7.23031 +2.83771 3.72237 +8.54697 9.38898 +2.16742 3.45018 +8.83255 9.30343 +3.59112 3.6531 +7.53452 7.81898 +7.11781 7.19773 +8.2892 10.0259 +4.91072 5.06031 +5.8232 7.25924 +7.0641 8.31604 +9.477 9.63892 +5.8003 6.58306 +9.63988 10.2754 +0.654364 1.02398 +5.9488 6.85043 +7.86867 8.99891 +9.202 9.46902 +4.17932 4.20271 +6.50328 6.71085 +7.19848 8.15579 +5.62459 5.75449 +-0.159668 0.791409 +7.55683 8.7315 +1.03278 1.423 +0.751457 0.808785 +6.2203 6.50634 +1.64418 2.98238 +6.87468 7.00652 +6.36966 6.7117 +7.69893 8.89535 +0.419794 1.05032 +2.73928 4.31548 +0.409245 1.55228 +6.03905 6.39323 +0.409695 0.789834 +4.39148 4.40935 +1.14673 3.23607 +5.85562 6.44503 +6.87394 6.88742 +3.761 4.35136 +7.2208 8.01436 +6.49839 6.54002 +4.70791 5.91886 +4.24906 5.96619 +2.53482 3.91496 +-0.369254 0.69193 +4.81351 6.31088 +9.76066 10.0736 +1.4413 1.55942 +7.21917 8.88908 +6.03521 7.56826 +1.25568 1.42024 +5.47575 6.04431 +1.43099 1.99979 +5.1004 6.04088 +6.54798 6.56118 +1.0142 3.1564 +1.75267 2.1453 +1.28133 1.36044 +9.60996 10.0563 +1.14397 1.50247 +6.86688 7.08724 +8.38287 9.18041 +0.132076 1.27657 +6.52553 6.9301 +0.223917 1.41325 +1.18902 1.79753 +1.40084 1.75678 +1.94524 2.51929 +1.98276 2.62875 +0.763281 1.05483 +7.97952 8.51249 +1.059 3.05463 +5.33401 5.85094 +8.37442 8.64374 +6.62865 6.67315 +1.01707 1.64386 +0.113335 2.23523 +6.71906 8.00216 +-0.886574 1.29366 +4.20078 4.85294 +8.43336 9.06988 +3.55413 4.40768 +6.69076 9.01132 +6.18982 7.14109 +7.14381 7.7046 +8.63195 9.47031 +8.88052 9.84886 +3.34443 3.62637 +4.5862 4.72832 +4.95757 5.23571 +2.85993 4.04966 +1.43846 2.27425 +5.43112 6.30496 +-0.452609 1.55525 +7.17706 7.71287 +5.78537 5.79579 +8.51102 8.9466 +-0.472904 0.810489 +3.83688 4.24045 +8.04432 9.04582 +1.57259 3.37136 +1.22231 1.33582 +5.73006 6.26477 +2.90855 4.22125 +9.39717 9.4287 +3.63873 4.16094 +0.442035 2.08889 +0.294491 1.31124 +3.14755 3.86305 +6.57634 9.44898 +2.19051 2.41878 +4.99277 5.12569 +4.10425 4.9423 +4.83547 5.62769 +5.73879 5.78179 +8.90329 9.81905 +5.60168 6.17538 +5.83843 6.66128 +1.84271 2.57406 +3.01047 3.33662 +2.85037 3.79158 +3.49007 4.46877 +8.58942 9.51529 +0.613753 1.12824 +8.23757 9.54707 +9.27134 9.4196 +6.27126 6.56417 +2.17206 2.33018 +3.53588 5.17162 +8.6312 10.0868 +5.76342 6.66164 +9.01501 9.90984 +3.22004 4.18954 +4.37918 4.68595 +2.00928 3.49815 +6.64229 7.06693 +2.85962 4.58794 +8.45587 9.8897 +2.8481 3.65956 +8.65849 8.67336 +6.48486 6.58637 +5.82336 7.45254 +4.02267 4.59696 +2.24997 2.83815 +8.16201 8.55518 +7.40645 9.07085 +1.43137 1.50333 +8.7212 10.9419 +1.50523 2.44124 +1.92455 2.85819 +4.50866 4.53052 +5.75781 5.81275 +1.71013 2.0282 +9.31592 9.9015 +6.14972 8.18798 +1.85705 2.20068 +4.80971 5.10509 +3.31201 3.58168 +8.61824 9.31861 +7.19497 7.86933 +3.25381 4.53472 +5.62799 6.29537 +9.00659 10.021 +9.15156 9.74827 +2.0324 2.80741 +0.714403 1.00476 +1.26522 1.80417 +-0.362995 0.41758 +7.08785 7.71544 +5.55685 5.74045 +0.428866 3.03773 +7.61574 8.94894 +9.07256 9.69772 +4.49537 5.06822 +5.66388 6.48899 +1.69126 2.69607 +9.90539 10.0783 +6.56455 8.27128 +6.61988 7.86616 +7.42012 7.64493 +2.99922 3.35282 +4.69379 5.18947 +0.87894 1.30518 +9.47632 9.61234 +0.665754 0.855958 +-0.422778 2.11197 +3.38786 4.15441 +7.57236 8.75855 +1.89832 3.50224 +-0.185929 1.0777 +3.32911 5.53465 +6.91111 8.69247 +6.97456 7.86905 +4.75518 5.0948 +4.23733 5.83368 +8.52456 8.56086 +0.0978267 0.136564 +7.4668 7.99757 +5.52851 5.80858 +8.5833 8.88589 +5.10603 6.41348 +4.70682 6.59981 +8.60265 9.19477 +5.04514 6.24014 +4.49041 4.88669 +7.40925 9.15624 +0.80364 1.35315 +7.11604 8.01153 +0.267749 0.714089 +0.121521 0.822226 +9.30556 9.81307 +2.11398 2.92567 +5.97722 6.08022 +7.13483 7.22211 +8.00161 9.27274 +4.87681 5.51654 +3.11843 3.84311 +5.17747 5.98482 +3.6077 4.46306 +1.37454 2.2443 +4.93385 5.96357 +2.92184 4.0964 +4.88767 5.56353 +2.87394 3.76336 +0.326521 0.622872 +2.42056 2.45007 +-0.527891 0.827211 +6.73151 7.20155 +1.82048 2.54905 +1.35563 1.88701 +3.64202 4.10669 +5.22846 5.23953 +6.06271 6.46993 +2.71418 3.2081 +6.41179 7.57176 +7.45823 7.79609 +1.01227 1.39137 +9.0872 9.20132 +5.083 5.64038 +5.63236 5.97945 +-0.317645 0.822313 +0.865396 2.65587 +5.71839 5.98983 +1.50978 2.08611 +2.95824 3.70996 +0.264301 1.02233 +8.22351 8.98589 +4.87805 5.24127 +2.31329 3.46752 +6.19539 6.69676 +5.18643 5.40947 +7.15453 7.66643 +1.20694 2.25111 +7.87378 7.89093 +5.16514 5.604 +8.68354 9.01395 +7.33753 9.37499 +2.94627 4.06036 +8.64337 8.85727 +0.0353092 1.0128 +6.98437 7.35718 +6.77073 6.79959 +3.13559 3.70735 +7.40139 8.27017 +4.01174 4.39788 +3.22281 5.11647 +7.79256 8.58737 +0.642233 1.39694 +7.18603 8.69453 +3.37803 3.59355 +0.762287 0.84262 +4.21823 4.52565 +0.894924 1.35434 +0.844327 1.19938 +5.57958 7.05431 +-0.631066 1.55134 +3.78962 4.17935 +9.15329 10.4824 +5.47536 5.52975 +8.81243 9.16088 +4.45989 4.94123 +8.68235 9.45112 +8.04719 10.3938 +8.87349 9.40483 +0.502543 0.570283 +2.08512 2.47652 +-0.654512 0.804355 +3.68569 5.21711 +5.33017 5.80226 +3.44991 5.31415 +-0.00417763 2.95077 +7.17784 7.9318 +1.2721 1.31642 +5.24415 5.64173 +2.79434 3.28746 +4.54991 6.49276 +4.74707 5.12555 +7.36365 8.15777 +0.913049 1.79828 +1.47498 1.83425 +2.64271 3.38567 +4.78159 5.44718 +7.6087 7.66442 +-0.484393 0.909893 +3.16824 3.23757 +4.43021 5.90284 +4.25954 4.74995 +6.58742 7.24125 +1.86151 2.27069 +3.16459 4.5945 +1.06471 2.08965 +3.31028 3.83029 +1.52593 2.47521 +0.703789 1.42451 +1.47969 1.68923 +2.92352 4.24089 +9.84088 9.93485 +3.18205 4.27817 +7.39345 7.78945 +3.78808 5.41572 +4.38624 6.75693 +6.93065 7.16977 +1.01289 2.19807 +3.37006 3.54196 +5.50238 5.58285 +-0.225113 1.99347 +1.67796 1.86943 +6.1999 6.35102 +3.80494 4.74814 +1.13294 2.02639 +1.1965 2.6548 +-0.284453 0.856092 +4.26565 5.02196 +9.66948 9.88874 +6.20287 6.25528 +4.38154 6.65806 +3.77411 4.3075 +5.77177 6.78486 +9.16311 9.816 +3.22861 3.42009 +3.36573 4.34724 +6.76951 7.58025 +4.83813 5.23042 +3.87192 4.37372 +5.56859 5.90066 +-0.368163 1.4593 +5.44031 7.81671 +2.66342 2.99253 +6.11846 7.69499 +4.98811 5.17531 +4.45078 4.67513 +4.88206 4.94128 +2.51813 3.0268 +0.461292 1.15264 +2.34766 4.48652 +0.198819 2.23425 +6.85634 6.98248 +0.912438 1.81872 +4.84933 6.34912 +5.15613 5.82891 +0.172772 0.994083 +3.37381 3.64549 +1.98836 3.2697 +1.64344 2.06049 +0.766585 3.09305 +7.8979 8.28046 +4.34856 5.01341 +6.69809 7.24239 +5.19034 7.04959 +5.3747 6.92123 +7.8893 10.1251 +6.11207 6.99125 +5.37115 6.84111 +9.04786 9.11002 +6.45326 6.64415 +-0.76294 0.92832 +0.980411 1.8166 +3.05536 3.50031 +6.10827 7.55786 +6.57848 9.06264 +7.66855 8.861 +4.80276 4.82283 +1.99932 3.2877 +9.45229 9.80653 +0.457474 0.778684 +5.44444 5.95239 +5.60974 8.05169 +7.64656 7.79632 +6.78372 7.65134 +6.93878 7.82023 +9.08292 9.55308 +9.16329 9.25802 +1.4909 2.38688 +4.31881 5.3564 +5.12535 5.60119 +2.44591 2.54637 +7.36929 7.80452 +2.13707 2.97655 +9.73557 9.94588 +1.96637 3.36097 +0.857068 2.29643 +5.58224 5.91142 +8.90714 9.0255 +9.77988 10.0711 +0.41121 0.970955 +-0.518356 0.91447 +7.58725 7.71255 +8.1435 8.78712 +6.5487 7.17991 +4.94961 5.50283 +8.14086 9.03281 +3.51281 5.24806 +3.5786 3.84066 +6.27435 8.37735 +8.65263 9.5555 +2.87484 3.56117 +5.57707 6.55879 +-0.111276 0.264178 +3.60894 4.15477 +2.82322 3.64397 +8.40669 9.1127 +8.43089 10.5298 +1.38472 2.2453 +1.74464 2.00472 +4.01588 4.67572 +0.408869 0.938602 +2.06155 3.46067 +4.4871 5.08963 +2.4435 3.87355 +1.32864 2.55801 +4.78579 5.26122 +7.43027 7.57749 +6.90971 7.32716 +8.01095 9.46872 +9.41627 10.524 +8.83143 10.4474 +0.631816 1.75513 +1.72965 2.17123 +-0.513239 1.1886 +6.75616 6.7984 +2.49278 4.26493 +0.230011 0.966298 +3.78506 4.95013 +2.03886 3.14808 +7.87309 10.5637 +3.54564 3.58055 +1.91974 2.9194 +4.8503 4.98668 +4.66494 4.83558 +7.57916 8.24358 +4.78743 5.38547 +2.81034 3.34534 +1.00297 2.0138 +6.87593 7.17736 +3.93157 5.0655 +3.10361 4.05519 +8.22876 8.38326 +7.48377 8.31026 +2.23106 3.4905 +0.130934 0.606709 +1.22344 2.55898 +7.55829 7.92597 +4.10977 4.86263 +0.122756 0.264176 +3.8357 4.15854 +1.28414 2.13031 +0.280029 0.805504 +2.88245 4.1704 +5.57936 6.94781 +6.22719 6.33201 +-0.761013 1.16475 +6.16636 7.12566 +2.98935 3.192 +2.23263 2.34362 +3.9082 4.11692 +2.66865 3.5275 +1.87676 2.43966 +4.60035 5.39332 +2.74287 3.73097 +2.81953 3.96666 +5.73644 6.04042 +4.02179 4.52419 +3.26438 4.07346 +1.22509 2.13719 +7.91885 9.71846 +1.28152 1.48079 +7.97918 9.26344 +8.75682 9.8677 +7.25678 7.45362 +8.16161 8.87066 +1.21873 2.37224 +7.76739 9.06346 +3.89932 5.03406 +3.53901 4.37006 +2.93795 4.04333 +6.36543 6.72985 +4.72622 4.98804 +1.86205 1.99008 +0.784581 2.05264 +0.978519 2.91723 +3.9067 6.47195 +0.735425 2.38151 +8.37394 8.41609 +6.91804 7.23374 +9.39259 10.1026 +7.28732 7.43466 +4.75982 5.44264 +6.71504 7.53933 +2.17125 2.54358 +0.703562 1.39087 +-0.221711 0.541965 +9.22839 9.39159 +9.53465 9.97585 +1.44304 2.53666 +7.886 8.85051 +9.33174 10.1632 +2.60898 3.42889 +1.73658 2.02589 +6.31651 6.77762 +7.26755 8.34499 +9.01312 10.9837 +7.47361 8.96251 +7.98365 8.02586 +1.40065 3.44891 +9.44617 9.55391 +8.24265 9.34849 +9.366 10.4216 +0.375354 1.17522 +3.37114 3.38278 +-0.742469 1.07634 +4.29988 4.81879 +4.18605 7.21928 +7.41047 8.29198 +6.68173 7.60225 +3.24292 3.30695 +1.8951 3.42167 +3.97359 4.2857 +4.72621 5.80575 +4.75014 5.02239 +6.43454 6.94568 +7.16601 8.10355 +2.16685 2.23666 +6.70852 8.63284 +8.16988 8.95848 +0.277002 1.30648 +1.5803 2.28632 +2.22634 2.34679 +0.200623 0.814959 +5.27457 6.51651 +2.49533 2.90705 +6.48922 6.69528 +8.18879 8.63551 +2.75159 3.633 +0.884853 1.56434 +1.87488 3.98951 +4.24783 5.17713 +6.22499 6.56095 +5.68238 5.99272 +3.75553 3.85012 +4.87543 5.39966 +6.62671 8.72493 +3.50262 4.05131 +5.38952 5.4974 +7.84971 7.94051 +5.39123 6.66564 +5.43986 6.17256 +7.48968 7.7677 +4.2685 4.57296 +1.75169 4.11058 +5.03634 5.16102 +4.68003 4.84715 +8.36249 9.98761 +8.94297 10.6969 +6.21572 6.24305 +7.90303 8.0672 +7.90426 8.41244 +5.98512 7.93187 +5.13297 5.27136 +6.58367 7.4971 +4.72663 5.22956 +7.99667 8.59246 +4.3303 5.92188 +1.3132 1.80875 +7.70104 9.20947 +1.78862 2.00473 +9.63678 9.65571 +-0.264416 0.318054 +2.70004 3.40777 +2.74642 3.73608 +3.6494 3.6743 +8.03113 9.22851 +1.07526 1.3116 +4.05436 5.33291 +4.60907 6.03605 +7.83426 9.10358 +2.27997 2.77309 +5.63139 6.92616 +4.40717 5.25214 +1.98986 3.5062 +2.42393 2.9584 +1.94336 3.08456 +1.20185 3.01827 +0.641733 2.10095 +7.25046 8.29391 +0.640392 1.26451 +3.9588 4.85492 +6.83036 7.41101 +6.48581 7.08757 +6.48734 8.47856 +9.55084 10.3774 +-0.173137 1.26574 +2.32702 2.58775 +2.7463 3.13914 +7.86951 8.62807 +5.96916 7.92759 +0.217046 1.70373 +1.04207 1.05755 +4.79058 5.07902 +4.19024 5.35395 +9.00175 9.83715 +8.37554 9.275 +4.5204 4.82999 +3.49936 4.75519 +7.07916 7.74619 +6.66726 7.35282 +7.39513 8.55523 +7.50381 9.60708 +1.39304 2.26927 +2.84101 4.76376 +1.21779 1.59353 +4.7893 5.70143 +9.12195 9.57131 +5.40461 6.15443 +2.86445 4.26837 +8.01324 10.9082 +2.96659 3.8042 +2.4897 4.59323 +6.37887 7.15878 +7.00143 7.6419 +3.22491 3.41843 +1.22852 3.31783 +2.09881 2.56121 +4.43205 4.67051 +4.39328 4.66715 +2.38355 3.39058 +0.638802 1.59399 +5.32717 5.81376 +8.00353 9.72007 +8.77281 9.81649 +8.95552 9.86609 +2.90915 3.96556 +3.88176 4.93124 +6.45945 7.69942 +-0.108577 1.57424 +0.304992 0.320561 +6.47789 6.5515 +1.98211 2.05312 +6.2741 7.35626 +9.45057 9.67918 +5.2916 5.48037 +0.158802 0.712187 +6.42002 6.84323 +9.11085 9.13063 +9.42446 9.95882 +6.03624 6.96469 +9.2473 9.6286 +7.10342 8.71163 +3.34072 3.35187 +7.4602 8.58506 +8.7963 8.81873 +0.323615 2.22687 +0.326746 1.76681 +2.20062 2.76862 +7.55181 7.85006 +0.941035 1.28117 +8.76643 9.60019 +9.19731 9.33092 +6.0479 6.57293 +6.12725 6.24356 +7.53078 8.92488 +3.1841 3.48283 +1.85544 2.01888 +7.3849 9.29183 +5.03915 5.27721 +4.77142 5.46282 +-0.291696 1.14641 +1.61367 2.20867 +5.31853 6.69431 +2.52731 3.13139 +4.86677 5.18106 +4.50183 4.60969 +5.95881 6.09964 +2.41939 4.42026 +6.92003 7.17891 +4.29584 5.48557 +8.02803 9.06315 +2.82326 3.49599 +5.8647 5.87561 +2.38814 3.62688 +6.32418 7.17662 +5.99907 6.5059 +3.84698 4.14446 +9.80728 9.82132 +5.2366 6.30871 +9.81878 9.91004 +1.53024 1.83525 +2.98035 3.68531 +4.5418 6.98786 +5.19561 5.9846 +0.946068 1.46672 +3.26948 4.71928 +6.13476 7.68682 +8.36934 9.65072 +6.40074 7.14762 +1.01349 1.80493 +8.4514 10.25 +-0.180382 0.682704 +1.03041 1.63565 +5.64642 6.96069 +2.73598 3.67485 +5.8705 6.66157 +4.68343 4.7176 +5.83787 7.6818 +1.42529 2.234 +3.73726 4.19241 +5.38341 5.81884 +1.13088 1.69073 +0.968034 1.98828 +1.06007 1.11039 +3.50129 4.51807 +5.83133 6.77904 +-0.334945 1.29129 +0.326706 1.16015 +9.15028 10.4391 +5.13047 6.79712 +1.06952 1.38997 +5.79345 6.49898 +7.88149 8.5143 +8.00404 8.09794 +8.22725 8.28904 +6.38406 6.61356 +6.32166 6.73458 +7.17066 7.32049 +1.64338 3.79327 +7.92135 8.55568 +7.15578 7.42231 +6.70701 7.65427 +5.76608 7.63064 +3.54163 4.08662 +3.81402 6.76906 +4.5998 4.61865 +9.01471 9.18718 +5.21234 5.73335 +0.946018 1.39917 +6.99714 8.29739 +5.64458 6.93965 +3.39809 5.70907 +6.32284 6.83604 +8.50347 8.53097 +3.90118 4.85721 +9.41198 9.62076 +4.41514 5.55152 +7.69979 7.81249 +5.34434 5.37105 +7.25274 7.76114 +7.67383 7.92718 +5.82851 6.29417 +0.935651 1.2842 +0.639586 0.786771 +6.39823 8.31226 +3.67546 4.89035 +9.20323 9.57287 +2.33896 2.99576 +8.51933 8.80243 +0.983098 1.11084 +8.48215 9.42998 +7.29586 7.3914 +2.00695 2.89046 +2.60909 2.62433 +2.04118 2.92033 +7.60386 9.01419 +7.32896 7.73342 +9.51693 9.54891 +5.1323 5.24962 +6.35326 7.18302 +2.50952 3.51872 +3.4149 3.57431 +9.18412 10.4976 +5.68123 6.42697 +5.87758 6.0124 +6.3202 6.64588 +8.2547 9.98176 +5.50949 5.7854 +0.0824268 0.128178 +2.17292 3.76233 +7.22786 7.68214 +5.09326 6.4151 +4.30171 4.86688 +2.39206 3.47399 +7.95152 8.35556 +2.40133 2.936 +2.77819 3.87516 +3.252 4.33376 +9.54269 9.7513 +6.6747 6.73043 +0.611474 1.97158 +7.65864 8.53689 +1.58345 1.8017 +2.56917 2.8152 +8.5424 8.8301 +4.98159 5.44499 +5.82482 6.03578 +3.55509 4.90785 +5.77028 5.94747 +0.163965 1.1379 +2.85039 2.94261 +4.24343 4.67273 +3.22636 4.06084 +6.03662 6.21018 +4.55495 5.07697 +1.91173 2.51739 +6.54894 7.24036 +5.55502 6.92676 +0.245707 0.586188 +2.28044 3.29563 +4.71378 5.25198 +8.28953 8.44891 +9.42282 10.179 +5.0548 5.73614 +6.3203 6.43659 +6.54178 8.82077 +3.67181 4.17365 +8.51445 8.96445 +1.69648 2.84524 +0.194222 0.920147 +2.48533 2.59803 +1.66002 1.6739 +4.79833 4.95404 +1.09801 1.11009 +6.62529 7.4066 +8.0099 8.37262 +3.55429 4.11824 +6.2666 7.12137 +7.83222 8.01342 +9.37156 9.72961 +1.1647 4.04434 +4.50719 5.09068 +3.25175 3.75482 +8.28659 9.30848 +7.30009 8.60755 +-1.12073 1.21016 +0.310087 0.725712 +8.3746 9.13511 +9.11925 10.2234 +9.68703 9.7137 +0.603098 0.844291 +5.88373 6.99327 +0.852802 1.43297 +3.7463 5.82283 +7.69639 8.25446 +-0.337322 0.977113 +8.76606 9.16618 +3.43527 3.6616 +3.93587 5.39471 +5.66569 7.20462 +5.34999 5.7193 +3.25589 3.706 +1.52012 2.55985 +4.74228 5.43725 +5.15323 5.51652 +7.77237 8.33717 +-0.0514419 0.914127 +9.27182 9.59476 +8.14192 9.74859 +6.42702 7.20331 +7.51351 7.68358 +7.0947 7.46059 +7.97635 8.59449 +2.39931 2.66008 +5.79481 5.94673 +4.41054 4.81613 +2.72202 3.61239 +2.86039 3.44719 +1.81115 3.28151 +-0.566995 0.734214 +9.61998 9.72024 +7.4163 7.61821 +0.42522 0.552659 +3.17617 4.36942 +0.740294 1.36953 +7.13755 8.39966 +0.219186 0.892588 +3.78307 5.2905 +0.783026 1.76155 +3.01893 3.33055 +3.12143 3.5713 +-0.792679 0.92539 +0.668572 1.12961 +3.88619 4.30545 +7.59276 8.1776 +4.71509 5.05622 +6.53406 7.04242 +1.581 2.21984 +4.7144 5.51372 +2.76338 3.50211 +0.16364 0.293599 +5.92365 6.10636 +3.11174 4.29165 +5.49295 6.48717 +-0.503239 0.795707 +7.30558 8.12408 +2.10674 4.13456 +7.11985 8.01932 +1.34672 1.48739 +4.05778 5.69084 +2.83686 2.9115 +6.4471 6.53909 +0.467374 1.84371 +2.76467 2.94177 +4.87867 5.33932 +0.892878 1.96273 +1.13934 2.27205 +7.76918 8.39409 +6.72181 7.43901 +7.0836 8.68472 +7.12924 7.56332 +0.689172 1.62922 +9.41146 9.91043 +0.398265 1.27579 +6.29966 7.4874 +5.09438 5.65334 +6.04623 6.4687 +5.75305 6.89731 +0.308118 0.459501 +3.63692 4.30501 +3.1755 3.71009 +7.32787 7.52785 +2.23235 4.09978 +2.71191 2.91513 +0.209457 0.840713 +7.31489 7.38296 +6.21245 6.91111 +5.75983 5.96049 +5.92056 8.24518 +-0.354452 0.489638 +4.05894 5.34828 +1.56299 1.57414 +2.85083 3.27455 +8.78323 10.0012 +0.208502 1.26471 +6.10824 6.79285 +5.55114 8.03968 +6.13077 6.32342 +7.34865 7.82592 +3.94835 4.75016 +7.8268 8.72249 +4.85131 5.07903 +5.40398 6.0134 +2.85971 3.85293 +0.126379 1.45545 +3.15768 4.28388 +9.64566 9.70016 +4.47514 6.31064 +6.44995 7.2894 +4.70992 6.13777 +3.91128 4.22263 +7.35627 8.07739 +2.49215 2.68749 +8.09946 9.16929 +0.925679 1.92784 +8.48437 8.63892 +7.2255 9.18109 +-0.00840282 0.0168954 +5.91933 6.6274 +4.16086 4.64302 +8.27009 8.47868 +1.73372 2.93094 +8.17421 9.17705 +9.19136 9.43222 +0.0653594 0.648416 +8.69 8.96184 +8.99355 9.40832 +6.25088 6.26945 +6.72391 7.38424 +9.59708 10.3496 +6.00971 6.18818 +4.64468 5.75797 +3.64832 5.30079 +5.99378 7.8792 +6.5388 6.99379 +7.31694 8.43802 +3.66227 4.92638 +9.55964 10.3796 +-0.14433 0.29095 +3.56716 3.71252 +3.82062 4.27788 +8.10405 9.35275 +7.17891 7.46539 +1.17698 1.29602 +4.48829 5.03134 +7.18025 8.13852 +9.42388 10.3634 +5.2158 6.17469 +5.22926 6.52397 +5.16731 6.40625 +6.53348 7.269 +2.07834 2.39172 +9.65044 10.1519 +8.64551 10.1294 +9.29006 10.5993 +1.50639 2.83173 +5.71675 5.99216 +3.0783 3.35571 +0.115401 1.31431 +8.03988 8.11942 +3.11917 4.53956 +1.14552 1.1646 +5.34782 6.43017 +0.0701702 1.0368 +0.183335 0.440704 +6.33438 7.71607 +2.11533 2.64323 +7.12104 7.13366 +7.21548 8.26968 +3.13445 4.13568 +4.57452 4.74602 +2.60889 3.69846 +7.21184 7.47573 +6.87651 7.03405 +2.65431 3.94352 +1.50006 1.70087 +6.16344 7.54429 +7.02057 7.73067 +8.27833 9.01489 +0.500833 0.597845 +8.34751 9.88925 +2.80242 2.91837 +5.29424 6.079 +8.36276 9.10074 +0.216887 0.268335 +1.30798 3.16393 +3.93851 4.22658 +2.58028 3.14744 +9.31131 10.3451 +7.37262 8.84852 +4.45306 5.6723 +3.74535 4.0721 +4.90174 5.63875 +3.41847 4.65199 +3.10265 3.82548 +6.56126 6.97557 +2.57449 2.95098 +7.97418 9.06301 +9.2203 9.66829 +4.64922 4.96305 +8.83034 10.115 +6.6685 6.89847 +7.36585 7.48669 +8.66761 9.39287 +0.562216 0.961875 +7.56292 7.81006 +8.50715 8.95572 +0.572825 2.24755 +5.9367 6.06766 +-0.769578 0.776163 +4.48224 4.9553 +8.21069 9.29643 +8.57206 9.47175 +1.10032 1.21371 +3.76306 3.87152 +6.46197 8.18457 +6.96501 9.70727 +3.42357 3.93484 +0.818601 2.42743 +-0.119739 0.397938 +-0.378761 0.523892 +8.03394 9.35409 +3.60283 3.98864 +2.21789 2.70607 +-0.255329 0.319063 +6.20806 6.22609 +7.1283 8.04391 +3.73565 4.03638 +8.5374 9.10987 +5.22675 5.35072 +7.51777 7.58439 +9.12636 10.4159 +9.15003 9.40672 +0.217863 1.19883 +9.42416 9.9178 +2.55337 3.8088 +7.03655 7.98242 +9.17171 9.8047 +0.110162 0.722738 +3.16467 3.58897 +6.47244 7.12961 +1.0456 1.65614 +1.58456 1.62844 +1.79039 1.84035 +6.24286 7.07838 +9.08631 9.11684 +3.05068 3.40838 +2.81212 4.03665 +2.52011 3.09841 +8.06001 8.16356 +7.07649 7.52685 +2.47666 2.86548 +8.66241 8.95103 +-0.298116 0.662697 +0.822443 2.46125 +2.07619 2.33674 +4.84135 6.21034 +7.49625 8.13026 +7.85854 8.29618 +3.01722 3.37062 +6.54393 7.30306 +2.21113 2.30166 +8.32138 8.57349 +6.2995 6.33514 +3.0018 3.56886 +4.63378 5.52214 +6.71908 8.96715 +2.29809 2.95581 +8.34947 8.71096 +4.96902 5.32075 +9.51051 9.72733 +3.311 4.77789 +3.50233 3.66309 +4.95177 5.76002 +6.12876 7.22391 +6.27743 6.79393 +3.60638 3.6833 +5.20305 5.50848 +7.16065 8.88358 +9.45049 10.2539 +6.16892 7.0314 +8.08479 9.74516 +0.0717867 0.669987 +2.17569 3.34098 +4.81716 5.7509 +7.63999 8.01157 +5.87228 6.60363 +3.39621 4.35575 +4.96079 5.07901 +7.57639 8.82003 +8.27285 8.52609 +0.665858 1.64782 +1.74256 2.07126 +6.19512 6.4258 +0.664592 1.30896 +0.180682 1.43746 +6.46752 6.81303 +2.55562 3.08708 +9.33695 9.63312 +6.33821 6.77092 +7.88252 8.55026 +8.17937 8.45385 +-0.415294 0.793096 +5.22077 5.54553 +8.67808 9.10041 +1.72096 1.92024 +0.492778 1.48076 +2.29514 2.88531 +0.0934389 1.37614 +8.40297 9.11121 +3.66605 3.91717 +-0.274468 0.867811 +9.41428 9.56659 +1.22657 2.12792 +8.71336 9.85384 +5.09347 5.42905 +2.02877 2.36652 +5.99112 7.40703 +0.911618 3.48138 +4.84352 5.11131 +1.16309 2.08613 +5.58561 5.84805 +0.663543 1.08921 +1.83189 3.93269 +4.07731 4.38879 +4.04789 4.9989 +2.09457 3.61279 +2.00982 2.94396 +7.37537 7.66574 +5.08648 5.80122 +9.19959 10.2263 +4.26136 4.86194 +6.67875 7.61134 +1.27462 2.48399 +7.2237 7.82324 +-0.0141009 0.0441377 +8.32069 8.36192 +2.82562 3.0717 +-0.528918 1.25301 +1.90486 3.04714 +1.34489 1.75301 +3.14332 4.03322 +8.55351 10.8681 +9.09824 10.3828 +0.496868 0.622499 +7.11112 7.62765 +0.335233 0.528962 +6.71335 7.13937 +6.78574 7.71172 +9.13568 9.22251 +7.10299 7.64765 +3.64747 4.06685 +8.64041 9.40111 +2.43515 2.93081 +2.95476 3.68588 +0.0863751 0.777976 +6.5891 8.18165 +8.80986 10.0735 +0.568868 1.63785 +4.41677 5.42049 +8.72857 9.88426 +3.67467 4.25442 +8.98168 10.1087 +5.08611 5.50098 +1.28982 2.34422 +-0.914176 0.969847 +4.35042 4.42735 +4.02282 5.08164 +9.00566 9.4791 +2.71821 3.24065 +3.20252 3.24988 +8.61559 9.6733 +3.15157 4.7685 +3.59348 4.67872 +0.286864 0.36279 +8.40374 10.528 +7.53647 8.13523 +6.81591 6.90226 +7.68111 9.10704 +8.37958 8.73818 +3.25808 4.40893 +1.50348 3.00641 +0.20803 1.40949 +3.93771 4.84177 +2.79232 3.35329 +4.2666 4.63588 +0.341784 1.46241 +1.53063 2.06724 +8.58212 8.86194 +8.95411 9.70651 +8.71591 9.26292 +6.66088 6.7009 +3.95881 5.93917 +8.5823 8.76007 +-0.308958 0.34174 +1.03188 1.37677 +7.52675 9.84031 +4.27952 4.32984 +1.83465 2.27607 +8.12096 8.64922 +2.22605 4.40067 +0.00929139 0.871342 +0.376531 1.29354 +3.5257 4.30165 +1.95846 4.09589 +-0.200922 0.799272 +0.24432 1.76673 +4.73477 5.06514 +8.97059 9.2276 +2.89618 2.93969 +0.168256 1.03325 +3.44522 3.83622 +2.74889 2.76042 +6.07155 6.7979 +9.06484 9.09804 +7.56658 9.29215 +4.3084 5.45621 +-0.0786996 1.12809 +8.48249 9.74107 +6.4196 6.61469 +1.57119 1.87612 +3.15463 3.86251 +2.0089 2.57741 +6.53618 7.12035 +7.07901 7.29396 +0.114756 0.887413 +8.90806 9.65731 +4.0921 5.23407 +2.63441 2.92344 +4.31769 4.98832 +8.90336 9.26837 +8.25313 8.91204 +2.87758 4.00212 +-0.708243 0.789072 +3.28656 4.55872 +5.73177 5.80293 +5.40596 5.5844 +4.09318 4.57774 +6.16178 7.00613 +8.5514 10.5495 +6.83987 7.3056 +1.06341 1.97923 +7.82153 9.00722 +0.923069 1.42337 +1.83408 2.82331 +5.75305 7.23576 +0.241909 0.96721 +1.16645 2.10491 +5.41819 6.09839 +7.49242 7.69495 +0.347233 0.383681 +2.33245 2.53467 +4.91249 5.27759 +8.11182 9.2758 +0.0955456 0.548659 +-0.359909 0.48055 +1.64759 3.47097 +6.37855 7.40015 +0.423283 2.08857 +4.10068 4.46856 +2.58389 2.69626 +0.848483 2.72258 +8.67321 8.88903 +2.07607 3.42398 +3.11033 3.80741 +2.24735 3.48626 +8.11883 8.7687 +0.29959 1.41603 +4.84924 5.13641 +1.44102 1.74592 +1.13437 2.50296 +1.75876 3.09859 +4.75363 5.90838 +7.36423 8.20074 +5.51578 6.42652 +0.915633 1.86015 +9.44679 10.3479 +2.61691 3.60215 +6.26524 7.2538 +2.74326 3.12649 +5.83934 6.98592 +9.1111 10.4891 +2.27066 2.82709 +8.19359 8.67233 +0.834236 1.7066 +6.19288 7.21392 +-0.249843 0.891821 +2.5652 3.25132 +5.25356 5.88905 +3.99545 4.18918 +1.93186 2.51527 +4.44621 4.82421 +5.89181 7.36963 +2.77321 3.60627 +2.76444 3.88016 +2.50062 2.66105 +1.14846 1.66146 +2.951 4.81656 +3.81976 4.01061 +4.75674 5.59916 +6.74092 7.08289 +2.09989 2.32514 +0.220723 0.865303 +5.48107 5.71875 +1.48372 2.88941 +0.484577 1.12051 +8.93618 9.7185 +1.89769 3.65655 +2.0129 3.55214 +9.23173 10.3694 +0.286189 1.22753 +0.453785 1.55541 +2.24068 2.6541 +8.80917 10.4969 +7.12801 7.15222 +9.25745 9.9103 +5.73429 6.76901 +7.54454 8.47157 +1.96008 3.74997 +8.00837 9.25665 +1.66384 2.07613 +5.53014 5.97461 +-1.32495 1.33319 +4.58479 5.2263 +7.92048 8.75668 +6.87595 7.02522 +0.157713 0.389585 +7.48277 7.51261 +8.10714 8.38399 +0.0802723 0.587088 +1.13024 1.71135 +5.71769 6.84757 +3.08261 4.31054 +2.95952 5.09762 +6.62815 7.44256 +5.0805 5.8499 +3.38489 3.73265 +1.10644 2.18331 +4.70493 7.31686 +2.2253 2.6338 +0.778359 1.6265 +6.94211 7.2149 +4.20976 4.99342 +7.47792 7.67881 +7.06219 8.76137 +4.97677 6.12206 +6.30829 6.69361 +6.19977 6.76781 +9.67636 10.2172 +3.41958 3.69137 +0.374486 0.943711 +4.00837 4.80107 +8.85401 10.1325 +6.0938 7.8919 +1.51055 3.08998 +8.94594 10.3139 +1.06714 2.65511 +0.703202 0.850595 +4.87735 6.00659 +8.3067 8.39924 +7.78071 8.3155 +1.98737 2.81116 +6.86323 8.07974 +1.03479 1.34584 +0.490512 0.670211 +5.82122 6.1901 +5.50836 6.63385 +7.9192 8.9606 +0.913719 2.18983 +4.97151 5.70909 +4.19907 4.37712 +2.01188 2.63318 +7.84813 9.3771 +5.32667 7.48502 +8.50951 10.1006 +-0.551637 0.930509 +1.06511 2.23353 +1.91111 3.42663 +9.37528 9.55327 +7.27975 7.38741 +3.46676 4.83165 +7.36137 8.70333 +-0.295762 0.623228 +8.48558 8.81076 +2.71689 3.41873 +6.49265 8.11042 +5.25516 5.57336 +6.10462 7.05991 +8.76997 9.15164 +7.86196 8.30651 +7.82765 9.24604 +5.98573 6.34182 +6.45367 7.47857 +3.27018 5.10835 +1.3079 2.37423 +-0.261387 0.338113 +7.60683 8.81791 +4.7346 7.41988 +5.25597 5.28517 +3.76704 4.52226 +3.91774 6.66976 +5.69618 8.92667 +1.86148 3.07531 +5.57404 6.51438 +9.39049 9.77921 +2.38692 4.21416 +6.84909 7.23633 +7.2379 7.58761 +4.73485 6.11606 +7.80013 8.08105 +1.72701 3.40244 +2.44475 4.4072 +9.72565 9.77726 +3.35288 4.06493 +8.91215 9.92325 +8.67991 9.65865 +0.253195 0.764339 +4.23564 5.59497 +1.84752 2.14986 +-0.502957 0.528737 +1.32656 2.11347 +9.81563 10.0213 +7.60114 8.05035 +8.51797 8.83342 +-0.394604 1.41267 +7.71614 8.63514 +0.530249 0.968898 +2.90463 3.01675 +7.58098 8.71658 +-0.253747 1.28827 +1.832 2.39006 +7.2268 7.27225 +3.84076 4.66703 +2.2564 2.73185 +7.31508 8.46008 +4.99387 5.64948 +7.21239 7.79983 +7.60231 7.8473 +0.555482 1.41892 +1.25539 1.73665 +8.41561 8.96404 +5.06771 5.17664 +0.0655744 2.10718 +8.00222 8.65909 +7.48841 7.83609 +6.30909 6.89448 +9.1697 9.55942 +1.36259 2.22582 +-0.923854 0.994771 +3.43724 4.64053 +8.09411 8.19574 +4.84869 5.52805 +2.69802 3.4119 +9.0613 9.29405 +0.565216 0.687165 +5.93495 6.57426 +1.86925 2.75493 +1.41068 2.00824 +1.60612 1.62471 +3.11499 5.89909 +2.69806 3.90538 +3.76301 4.22135 +3.30065 4.70725 +5.56461 7.02137 +8.35335 8.99287 +4.79259 4.88508 +6.7911 7.52912 +8.14843 8.28583 +3.67629 5.06406 +5.71462 7.04747 +9.06721 9.99733 +4.87932 6.8586 +8.00814 9.57664 +7.03069 7.51623 +9.0989 9.57644 +2.70873 3.91296 +1.64425 1.7007 +6.53716 6.99033 +8.29874 8.74509 +1.88941 2.57626 +4.65337 5.23247 +9.04723 9.06665 +3.52258 3.61496 +1.1207 1.80143 +0.680601 1.98384 +2.94593 5.38692 +2.65685 2.67932 +9.00469 10.2054 +6.44318 7.2657 +4.66656 5.33893 +3.41719 4.72453 +3.12403 4.21748 +6.67973 6.81775 +3.54347 4.14978 +3.02554 3.50812 +3.91883 3.93657 +7.31721 7.89895 +1.86275 2.85473 +6.23266 6.4449 +7.59855 9.38013 +9.07084 9.49309 +0.557656 2.6851 +6.899 7.37693 +4.23162 5.84314 +8.54108 9.37672 +3.9513 4.79746 +7.299 8.29678 +5.58879 5.88551 +9.14992 9.22385 +9.1914 9.31788 +4.95663 5.56316 +2.16516 2.39538 +0.722262 1.89664 +7.76447 7.80026 +2.77772 3.39136 +9.59513 9.78635 +1.02728 1.2181 +7.32631 7.56611 +7.37389 7.46163 +6.87949 8.18689 +8.95602 9.81169 +5.85364 6.63434 +0.129136 2.13484 +7.09608 7.71167 +7.1487 8.34258 +7.48738 8.3172 +8.77247 9.95985 +7.6706 9.56828 +8.14268 8.61726 +6.5455 7.90871 +4.57866 4.78453 +3.63937 4.42349 +5.18905 5.36516 +4.68884 5.62995 +5.88338 7.83824 +-0.002979 0.145818 +4.42981 4.77141 +0.558593 1.07999 +6.91713 7.36159 +5.13948 6.20805 +3.34368 4.07112 +7.27365 7.8383 +9.6898 9.9514 +6.14332 6.75102 +2.16534 2.78843 +2.8007 4.37952 +7.67047 7.72955 +8.77377 9.85092 +1.26087 1.55193 +6.29788 6.58511 +7.68178 9.05777 +0.383336 1.21247 +2.55185 4.30874 +8.91971 9.21836 +3.67638 4.68596 +8.13843 9.13684 +-0.424353 1.97502 +2.71499 2.93977 +0.104447 0.387901 +4.09592 4.67009 +0.808593 0.920798 +5.01258 6.30662 +4.97668 6.57412 +8.44135 9.03816 +2.78932 3.72809 +6.71337 7.15128 +4.27234 4.50127 +6.78266 9.70351 +6.48026 7.51491 +7.36296 8.42283 +4.80339 7.3704 +6.24735 7.3132 +0.134626 0.364187 +2.73854 4.09422 +0.809997 1.19657 +6.41154 6.50244 +7.16847 8.56485 +1.53582 3.33985 +1.92874 2.86427 +6.95941 7.01378 +5.8592 6.54917 +2.51802 2.75622 +3.3894 3.6957 +2.2547 2.64693 +8.62054 9.1951 +8.86378 10.0003 +1.87892 2.28732 +3.83146 4.21484 +1.53262 1.99692 +7.86048 7.93125 +1.79437 2.68269 +3.92781 4.24119 +5.43044 5.47935 +0.322904 0.618854 +3.42383 5.18531 +4.00989 5.83612 +7.06304 8.76582 +5.88039 6.77654 +8.638 8.9479 +1.73391 2.09002 +1.04861 2.84779 +-0.313019 0.557659 +3.35245 4.1308 +9.05373 9.57205 +5.85684 6.49193 +6.00719 6.86421 +4.25244 4.65772 +5.15865 5.61529 +8.78498 9.77544 +8.33803 9.26452 +3.42915 4.92279 +8.29884 8.94035 +5.10232 5.35924 +4.33571 4.86695 +7.86184 7.90029 +7.34345 7.36214 +0.201624 0.800371 +9.05882 10.5503 +4.32188 5.03154 +-0.0456982 1.22298 +2.90921 3.60013 +1.69306 2.36564 +7.79029 9.15059 +4.65205 5.06538 +6.34552 8.32176 +7.92695 9.32585 +7.17903 8.09903 +9.53561 9.60287 +0.365723 1.23929 +0.542889 0.849053 +8.15061 8.93512 +6.40042 6.41053 +5.82666 6.5488 +1.00893 1.83717 +1.76021 2.11893 +7.61076 8.6242 +2.32513 3.4856 +4.39023 6.01094 +-0.11754 0.421848 +6.76371 6.94513 +4.67607 5.58732 +-0.201992 0.765553 +7.42926 7.44429 +2.57485 2.85339 +2.74138 4.13421 +8.21645 9.18107 +6.28184 6.4996 +7.129 7.74678 +7.76842 8.74924 +3.5359 4.35892 +3.04103 3.24376 +2.29389 2.92164 +6.96306 7.64415 +8.82053 9.04584 +1.19911 2.06167 +5.91357 7.6773 +0.150241 1.23291 +4.48681 5.41762 +6.89156 8.13443 +5.37828 5.79944 +2.13694 2.91102 +1.35932 2.08272 +6.14309 6.23278 +4.03202 5.88521 +7.23417 7.43704 +1.2501 2.60793 +2.12334 3.65727 +7.05722 8.77078 +0.437873 0.585933 +6.33338 9.16643 +2.44724 4.40234 +2.92012 3.64047 +1.2039 3.25195 +8.6611 10.0398 +8.0088 9.13622 +5.96562 7.08515 +5.45181 6.65246 +0.742546 2.38958 +4.12919 4.93571 +0.428823 0.84483 +1.45226 2.5869 +9.50727 10.0211 +7.69194 8.66273 +1.25706 2.44554 +5.23247 5.47762 +0.499178 1.70722 +7.26569 8.72467 +3.59815 5.50022 +1.03601 2.43445 +0.092414 0.927635 +3.7917 3.995 +6.21977 8.40398 +3.1513 3.81188 +9.80482 10.0951 +8.65564 9.33687 +2.06164 3.49152 +2.09754 2.34929 +0.66126 2.31888 +5.34832 6.82603 +7.91038 8.59105 +0.695523 0.800961 +2.33406 2.71629 +8.37774 10.9253 +9.7682 10.106 +9.44382 9.5743 +8.78009 9.47645 +1.87309 3.04127 +1.86724 2.13913 +3.30049 3.52416 +7.18508 7.6648 +1.3736 2.12153 +2.41879 5.06716 +1.87815 2.29743 +1.76646 2.06335 +9.73034 9.95475 +0.497489 0.686102 +6.96908 7.17338 +9.23111 10.0148 +3.30981 4.21787 +9.53311 10.3734 +-0.067709 0.147251 +8.44557 8.82047 +7.10407 7.47639 +0.834352 1.36908 +9.1598 10.6508 +4.22018 4.38279 +3.8295 3.95462 +3.97302 4.97247 +1.55856 2.31013 +0.0217962 0.486978 +1.69845 2.65786 +-0.489562 0.582187 +5.10621 5.6055 +9.8478 9.85919 +6.15389 6.92324 +7.11469 8.0418 +3.20625 3.78209 +5.93389 7.66892 +1.15134 1.18023 +6.84797 7.4239 +2.9483 3.22279 +-0.43205 0.764755 +7.17846 7.33313 +5.4729 8.26894 +6.19512 7.32132 +0.591934 0.767568 +0.49266 1.80691 +9.08272 9.72242 +5.85683 6.36905 +5.27625 7.13913 +3.60853 3.98155 +0.642811 1.10253 +1.27117 1.5329 +8.76096 9.61776 +4.9498 5.12847 +7.53282 7.80438 +1.40487 1.65657 +3.45329 3.84307 +3.25698 3.49614 +2.38651 2.89802 +8.23114 8.99016 +9.58516 10.4145 +5.5185 6.27733 +0.583068 0.892249 +1.93142 2.35084 +7.94845 9.22667 +2.47963 3.9005 +3.46106 3.86301 +7.77744 8.43735 +1.41072 1.73969 +9.12904 10.4307 +3.52227 3.66861 +5.4743 5.86487 +-0.51727 1.63657 +5.09861 7.03162 +5.14763 5.93411 +3.23526 3.47376 +0.9702 1.74063 +9.28366 10.3322 +1.80257 1.92265 +8.63597 9.08467 +4.16006 4.97753 +6.37418 6.39374 +5.82376 6.62429 +7.74751 8.68962 +1.63821 2.53399 +4.9864 6.40969 +0.680772 0.995608 +3.74344 3.83319 +0.898055 1.8593 +2.36839 2.39307 +7.21046 7.51006 +0.60893 2.91523 +3.15017 4.30412 +5.02219 6.28886 +4.60541 4.73379 +8.41196 8.58978 +8.84706 10.8198 +6.95807 7.54952 +5.54729 6.9315 +4.62574 4.73423 +3.35252 3.59865 +1.02207 1.71791 +3.16408 3.73993 +0.639222 1.69519 +7.57978 8.05813 +2.41371 2.77174 +8.65544 10.093 +6.31988 6.70758 +6.5301 8.39328 +0.578825 1.20331 +1.1243 2.07824 +5.86555 6.72397 +6.37103 6.81736 +1.12086 3.46541 +2.59503 3.44073 +5.27128 5.3616 +2.87331 3.4352 +5.48408 6.67916 +3.36016 4.09125 +0.813671 0.9811 +0.812162 3.22209 +6.85104 6.86306 +0.671311 0.979685 +2.75962 2.82659 +2.42186 2.49827 +7.82974 9.59669 +3.48851 3.60085 +8.47775 10.9574 +8.6863 10.6155 +0.196484 1.07469 +1.19293 1.45012 +5.79166 6.18466 +6.51597 6.6793 +9.78341 10.1992 +8.17879 9.59257 +6.96178 8.73165 +4.09161 4.31908 +3.19514 3.4072 +5.5101 6.32978 +0.188435 1.84481 +9.41738 10.0379 +1.46994 1.6294 +4.21915 5.39529 +5.46567 5.86638 +8.19414 9.201 +4.38616 4.55193 +2.31105 2.73345 +6.05897 6.12297 +8.84135 9.74232 +9.44943 10.2225 +3.27501 3.66059 +0.524904 1.74374 +7.7228 8.43799 +5.13274 5.82863 +8.2787 8.94491 +1.61463 2.03499 +7.04346 8.69977 +0.938308 2.38676 +0.00208037 0.0186158 +1.98744 2.05864 +7.05787 8.16211 +1.68383 2.04684 +2.24812 2.28257 +0.685061 1.2947 +2.25379 2.92827 +6.0052 6.24797 +7.06213 7.86344 +0.751849 2.96376 +0.0977921 0.513746 +8.43792 9.10545 +2.80769 3.09276 +9.19308 9.59741 +4.74365 4.99708 +8.41385 8.58422 +4.28093 5.9281 +4.26205 4.75417 +1.48035 1.61363 +1.4264 1.80922 +3.48365 4.52935 +1.78396 2.96351 +8.4134 8.96536 +8.65646 9.34781 +1.88027 2.97804 +8.92531 9.02743 +6.91815 7.88895 +5.68023 7.37521 +3.93105 4.6123 +0.385874 1.30785 +1.80151 2.24385 +8.43781 9.33927 +6.69643 8.001 +6.12062 6.673 +4.8316 6.63067 +9.00443 9.08204 +1.5651 2.65023 +3.57517 4.40231 +5.85127 8.02219 +8.02586 10.018 +2.00514 2.75138 +6.32104 7.84285 +8.90914 9.78319 +4.91325 6.27817 +3.87406 4.80327 +8.57887 9.30685 +1.40351 1.71079 +-0.217977 0.224497 +8.37711 9.56393 +5.54644 5.77714 +8.18206 8.36015 +0.774967 1.97899 +9.10434 10.1721 +9.39621 10.1135 +4.80108 4.90605 +9.45978 9.96227 +2.85412 4.05215 +5.71985 7.16735 +2.35081 2.82214 +9.34881 10.5899 +7.13014 7.82872 +4.54931 4.89725 +9.41397 9.9131 +8.90226 9.55276 +8.27995 9.83651 +9.2767 9.6053 +0.388751 1.40317 +5.01478 5.88869 +6.41521 7.21754 +1.22552 1.39067 +3.75771 3.81571 +4.39362 6.04592 +8.82639 8.84544 +4.59289 4.89208 +1.52235 1.64285 +1.85893 4.52056 +1.91781 2.78253 +3.34677 4.54987 +9.26905 10.6019 +7.10958 8.02083 +0.765257 1.66957 +2.17169 2.70214 +4.2293 6.38089 +1.41111 2.45992 +5.76864 6.85715 +2.19944 2.93182 +9.03727 9.6454 +3.82652 4.35225 +2.52642 3.09725 +7.77868 9.35844 +0.337665 1.00787 +1.92021 2.04418 +4.41862 5.95486 +9.47606 9.62386 +1.12113 1.55658 +5.26701 7.09712 +8.81478 9.34863 +6.29447 7.43847 +2.82379 3.57268 +7.9735 8.79936 +3.30176 5.50666 +6.36009 6.8864 +4.13583 5.00627 +0.510514 0.882245 +6.93864 7.78543 +2.04039 2.4298 +3.18337 3.19424 +4.20059 4.67088 +0.316687 0.707377 +0.169106 1.68194 +8.26665 10.2362 +1.1124 1.78306 +2.84603 3.33142 +9.48756 9.96651 +9.4301 9.7316 +0.234674 1.23981 +0.493232 0.522565 +1.342 1.41739 +2.57196 4.08221 +1.54201 2.52284 +5.32049 6.00052 +8.54218 8.59452 +-0.030524 1.64476 +2.31645 2.72528 +4.71898 4.92827 +0.0872997 1.74969 +0.994278 1.76964 +1.34411 2.77952 +0.156817 2.10245 +5.78094 6.34389 +3.09336 3.10563 +8.14245 9.0928 +9.34202 9.75484 +9.78415 10.0211 +4.68383 5.19384 +6.09441 7.90512 +6.74941 6.76118 +1.78693 1.91697 +2.34369 2.62141 +-0.20756 0.829082 +3.57681 5.11448 +2.44234 4.45153 +4.84521 5.31902 +1.80487 3.64498 +2.46125 3.02549 +-0.334514 0.64288 +8.06406 8.49886 +1.74559 2.54474 +6.05883 6.46529 +9.00014 10.2271 +8.00064 8.5061 +0.909467 0.980765 +8.65862 8.69736 +8.11457 8.77049 +3.93237 5.02485 +4.64507 5.34852 +3.92405 4.19449 +5.02381 5.21722 +3.76203 3.78396 +6.74925 7.34781 +8.2556 8.63585 +3.92521 3.99739 +1.44641 2.31509 +0.23516 0.917239 +4.4614 6.35489 +3.33221 3.95247 +1.73289 2.07919 +6.92385 7.55052 +8.74351 9.41125 +9.41451 10.1785 +7.4001 8.81081 +2.97038 3.12524 +7.26043 7.77569 +5.56625 5.59344 +5.70977 6.33362 +7.61443 8.43218 +1.05308 1.82947 +0.377602 1.57633 +6.42483 7.51505 +4.73011 5.43693 +7.72 8.09098 +9.20063 9.82287 +6.88273 7.35327 +6.88423 7.68356 +3.55293 3.6227 +0.947096 1.76021 +3.66411 5.67117 +9.31422 10.1035 +6.84847 6.98956 +2.16221 4.45806 +0.853284 3.15932 +2.48673 2.89793 +3.37633 3.90938 +1.6141 1.66363 +1.6658 3.01723 +0.419408 1.01736 +0.712239 0.791538 +2.25249 3.62425 +8.09772 10.2367 +1.46651 1.48148 +1.73233 2.0489 +7.42679 9.23232 +7.97446 9.53281 +2.74677 4.03955 +-0.169412 0.872795 +4.90663 5.40277 +7.62122 9.49334 +6.55971 7.34259 +3.71957 5.03775 +3.33226 4.06459 +0.634912 1.52603 +3.65506 4.09318 +4.31463 4.60534 +8.58287 9.85385 +0.334759 0.7232 +2.14027 2.866 +6.06611 6.3625 +2.53013 3.18764 +4.30913 4.89247 +6.53234 6.92328 +7.66419 8.61762 +1.37598 2.26754 +8.06279 8.80692 +5.28688 5.70608 +0.509396 1.34606 +8.80589 9.29765 +9.3801 10.3988 +0.402662 0.597735 +5.87213 6.63371 +2.79136 3.763 +6.20615 7.25189 +7.54065 9.62156 +4.12107 5.04454 +5.60294 6.69246 +1.20845 1.49272 +1.75679 2.56397 +2.83939 3.85147 +6.21362 6.71341 +9.01824 9.2388 +4.66617 5.04944 +1.48766 2.55674 +8.89442 9.42175 +5.29411 5.39531 +6.66271 8.68733 +0.730461 1.42466 +6.22927 6.55086 +0.566776 1.17299 +3.06104 4.17775 +5.28026 5.73966 +5.76071 7.61585 +7.83786 9.58106 +6.32199 6.46961 +8.89555 9.17429 +3.85772 4.97805 +6.63352 8.79211 +7.87234 7.94131 +6.53479 7.87979 +3.90293 4.50376 +6.21371 7.31788 +1.00497 1.75003 +6.90351 8.02435 +2.29142 3.9809 +6.26632 6.45283 +-0.0354471 1.31727 +8.80046 9.20169 +7.86905 8.36819 +0.848737 1.82393 +7.98136 9.40712 +3.97765 4.95399 +8.70252 9.26275 +3.13412 4.29389 +2.06446 3.55839 +7.67918 8.44509 +5.96082 6.40336 +1.20461 2.36924 +4.76741 5.74978 +9.41217 9.94305 +7.36736 8.07119 +3.44102 3.56957 +3.59893 4.52751 +4.2613 6.41628 +1.65321 3.02235 +3.70067 3.86657 +0.0176327 1.1215 +4.13592 4.88595 +8.73668 9.0834 +1.80944 2.95584 +6.05721 6.93009 +5.08206 5.38626 +1.86749 1.89392 +3.58284 4.10506 +0.0885586 1.47709 +5.46502 5.93066 +8.45338 8.47878 +3.46789 4.02317 +0.975506 1.15814 +7.12758 7.60073 +7.99582 8.56746 +3.11435 3.83805 +4.51166 4.52472 +8.39096 8.75934 +8.42208 9.66019 +2.48498 4.73703 +3.50301 4.81264 +6.40196 7.0733 +8.52138 8.82265 +1.49822 1.74634 +7.08547 7.93508 +3.47832 4.42948 +6.08646 6.20865 +4.46334 4.65278 +3.80008 4.08214 +3.4853 5.44308 +5.48109 6.18681 +6.59161 8.04307 +7.36554 7.38201 +5.2144 5.31725 +4.62607 7.25804 +1.24345 1.81263 +5.49248 8.16867 +6.4056 8.26316 +7.67828 8.56923 +2.46187 2.56974 +2.22942 3.27248 +7.14933 8.06682 +2.3236 2.95462 +4.18028 4.80535 +4.981 5.54215 +7.23261 7.34863 +4.96309 6.06396 +4.24402 4.44364 +0.917707 1.32687 +1.19806 1.65106 +3.7725 5.31412 +9.70021 9.84203 +5.99824 7.77474 +3.32636 3.84266 +8.59841 9.07653 +7.9916 9.14415 +0.786519 1.84655 +0.166394 1.47834 +2.87633 3.52808 +7.53804 9.56807 +6.14406 6.16189 +1.63428 3.96845 +1.10307 1.58897 +1.30032 2.85313 +7.89803 8.32723 +8.77593 8.90136 +1.68804 2.69447 +4.5956 4.6743 +7.39643 8.29839 +6.93629 7.82243 +6.10289 7.677 +1.83835 2.34295 +1.04506 1.91684 +8.95277 9.43817 +0.36153 0.643665 +1.02408 3.18963 +4.02972 4.40301 +2.80428 2.82552 +6.51718 6.64956 +0.185341 1.56607 +6.1658 7.59364 +4.09288 4.11687 +6.90205 7.16338 +5.0755 5.39478 +4.5614 4.83286 +5.8489 8.76295 +9.70079 10.0431 +8.44334 8.54714 +3.00139 3.66327 +5.34458 6.38895 +7.11481 7.96865 +4.66776 5.15678 +0.390138 0.53352 +2.01116 3.32839 +6.78761 6.97068 +4.57477 5.0724 +1.14098 1.36134 +7.4559 8.30327 +0.700932 2.40437 +1.90469 1.99046 +4.30064 5.11485 +7.84433 8.48543 +5.96212 7.49882 +3.93055 3.96317 +0.546327 1.04814 +8.96011 9.0404 +7.89255 8.06149 +0.669924 2.6944 +-0.00972314 0.837474 +6.07199 6.37467 +2.73659 3.19833 +5.9576 7.10966 +9.1316 9.14737 +5.26101 6.59184 +5.77697 8.08876 +0.68623 0.782805 +0.842619 1.39893 +5.82075 6.15957 +4.36394 4.88479 +7.1828 7.90107 +3.3331 4.39923 +6.54243 7.24966 +2.809 2.96491 +4.18514 4.61948 +4.95453 5.33929 +8.33288 9.52867 +9.05785 10.4276 +2.58917 4.74403 +1.34279 1.89014 +4.93626 5.75424 +7.75031 7.92788 +9.00904 9.02402 +3.91286 5.15124 +6.98486 7.34688 +-0.173169 0.415019 +0.652242 1.51556 +3.50184 5.30486 +3.72563 4.09022 +4.60463 6.58985 +3.34219 4.31833 +2.55445 2.58651 +6.14573 6.3669 +4.52336 6.37342 +9.37606 9.76836 +2.4198 3.36929 +2.89109 3.66974 +5.62463 6.05989 +0.674219 1.84165 +0.590017 1.71153 +1.54622 2.10277 +6.48003 6.55663 +3.56355 3.98573 +0.743671 1.87049 +3.27833 6.0722 +4.76267 6.9967 +2.80188 4.03037 +0.372694 0.482111 +5.73987 5.9529 +8.84732 9.49033 +0.833944 1.8157 +4.06126 4.36615 +0.884619 2.34622 +6.86723 6.99141 +8.07737 9.05193 +8.35903 9.00761 +8.84777 9.74001 +8.58058 9.05479 +8.28076 8.44566 +4.55155 5.65475 +2.44314 3.38966 +3.22172 4.50395 +7.1808 7.90376 +0.639636 1.72606 +5.46807 5.94322 +9.02146 9.87864 +-0.628472 0.655557 +4.29775 5.9553 +6.77525 7.38152 +6.51827 6.93542 +8.95252 9.52939 +0.755406 1.19973 +7.69455 7.86912 +0.170143 1.12949 +7.69254 8.08221 +2.08238 3.27051 +1.28662 1.78628 +1.21208 2.79391 +-0.155739 1.7071 +8.28833 9.10011 +5.77789 6.6954 +1.98395 2.35216 +5.77469 6.05177 +2.77565 5.81092 +-1.53416 2.30576 +6.93529 8.04506 +3.91553 4.55593 +5.57201 6.29071 +1.54149 1.86613 +4.09163 4.31234 +8.47834 11.1229 +5.70376 7.02981 +2.24683 3.79925 +5.4793 6.41036 +5.27644 6.81729 +0.13273 0.371437 +1.22959 1.41618 +0.551957 1.03276 +2.01269 2.4018 +8.77113 9.09395 +8.11753 8.46262 +0.39406 0.783705 +5.35964 5.48227 +7.24727 8.23233 +7.74525 8.85748 +0.0115736 0.882607 +1.78575 2.19684 +8.32514 9.0503 +3.11074 3.34975 +0.847464 2.13237 +0.310898 0.393528 +8.68841 10.518 +1.10032 1.83755 +2.42286 3.02554 +1.16364 2.80986 +1.46419 2.11421 +7.46021 7.90273 +6.86556 7.62542 +1.91466 3.79843 +3.1056 3.83969 +3.41591 4.26565 +0.285122 1.21372 +3.75441 5.52385 +1.07643 2.63403 +6.17341 7.67244 +9.13122 9.5132 +4.39696 6.15885 +3.7207 4.07729 +6.80782 7.1958 +6.65933 6.67105 +8.51535 8.7263 +5.98305 7.17759 +2.19609 2.46108 +8.21186 8.96908 +2.94729 3.60562 +3.31907 3.9297 +0.463492 0.626603 +2.62143 3.55089 +5.76898 6.79002 +1.45502 1.56525 +4.80797 5.62389 +5.87337 6.70588 +2.92765 3.50929 +0.412987 0.951057 +3.64594 4.40269 +-0.043401 0.502176 +4.54802 5.44613 +1.20218 1.8732 +2.75547 2.96745 +7.10348 7.7945 +9.74845 9.98835 +4.83718 6.4836 +2.30563 2.5903 +4.74016 6.30789 +6.42192 6.93329 +5.37294 6.73938 +2.4365 3.05787 +1.08283 3.79193 +4.90426 5.93563 +3.8874 4.83301 +0.13909 0.983027 +4.07407 5.61421 +8.62875 10.6851 +8.10233 8.29952 +2.23047 2.4691 +7.34617 7.39475 +1.66309 2.3032 +7.11207 10.0686 +4.52412 6.38666 +2.48323 2.96878 +7.47877 8.86547 +2.67607 4.33436 +6.83659 8.21075 +2.87313 3.39011 +2.81911 4.07729 +0.227877 0.657898 +6.57843 7.14311 +-0.591405 1.56925 +7.08018 7.59 +9.09558 9.3923 +9.48544 9.79474 +0.740233 2.33129 +8.51111 11.134 +7.79219 8.0281 +1.73821 1.89316 +9.21077 9.29488 +5.38354 6.46025 +4.30403 4.5472 +0.0893758 0.919238 +7.94464 8.51053 +5.27119 6.3741 +5.22476 6.00588 diff --git a/bottleneck/tests/data/test_013_A b/bottleneck/tests/data/test_013_A new file mode 100644 index 0000000..51cff1c --- /dev/null +++ b/bottleneck/tests/data/test_013_A @@ -0,0 +1,5 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 diff --git a/bottleneck/tests/data/test_013_B b/bottleneck/tests/data/test_013_B new file mode 100644 index 0000000..be62ed3 --- /dev/null +++ b/bottleneck/tests/data/test_013_B @@ -0,0 +1,5 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 diff --git a/bottleneck/tests/data/test_014_A b/bottleneck/tests/data/test_014_A new file mode 100644 index 0000000..f7f90ff --- /dev/null +++ b/bottleneck/tests/data/test_014_A @@ -0,0 +1 @@ +1.0 1.0 diff --git a/bottleneck/tests/data/test_014_B b/bottleneck/tests/data/test_014_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/test_014_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/test_015_A b/bottleneck/tests/data/test_015_A new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/test_015_A @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/test_015_B b/bottleneck/tests/data/test_015_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/test_015_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/test_016_A b/bottleneck/tests/data/test_016_A new file mode 100644 index 0000000..151d4b1 --- /dev/null +++ b/bottleneck/tests/data/test_016_A @@ -0,0 +1,220 @@ +1.391781911475341 1.391781911475341 +1.395142124726278 1.395142124726278 +1.514181227875788 1.514181227875788 +1.528291566797427 1.528291566797427 +1.585389310674157 1.585389310674157 +1.629232116709072 1.629232116709072 +1.641428662445941 1.641428662445941 +1.646998748860116 1.646998748860116 +1.652915988616469 1.652915988616469 +1.69199679556404 1.69199679556404 +1.705727462482595 1.705727462482595 +1.706819293048617 1.706819293048617 +1.720175733750729 1.720175733750729 +1.728031840308488 1.728031840308488 +1.73797421040929 1.73797421040929 +1.739519744204842 1.739519744204842 +1.76132425248022 1.76132425248022 +1.767766952966369 1.767766952966369 +1.792444271021371 1.792444271021371 +1.831487552809192 1.831487552809192 +1.837086616049901 1.837086616049901 +1.851186504948943 1.851186504948943 +1.860502132730509 1.860502132730509 +1.8619433117852 1.8619433117852 +1.878229072834972 1.878229072834972 +1.880655074837347 1.880655074837347 +1.883647832802556 1.883647832802556 +1.884127769927503 1.884127769927503 +1.892969784466709 1.892969784466709 +1.916936460787894 1.916936460787894 +1.931545068229315 1.931545068229315 +1.937626522143119 1.937626522143119 +1.942267721488891 1.942267721488891 +1.963295334827521 1.963295334827521 +1.975655395743736 1.975655395743736 +1.981448090925679 1.981448090925679 +1.986220565173897 1.986220565173897 +1.98709020812351 1.98709020812351 +1.989420269013254 1.989420269013254 +2.007874648480185 2.007874648480185 +2.012179388983059 2.012179388983059 +2.019051972834053 2.019051972834053 +2.023278848058142 2.023278848058142 +2.026190677562545 2.026190677562545 +2.041594763633561 2.041594763633561 +2.042508934597344 2.042508934597344 +2.04305394648524 2.04305394648524 +2.052514683218775 2.052514683218775 +2.059038785694094 2.059038785694094 +2.062577320792516 2.062577320792516 +2.063488177732052 2.063488177732052 +2.067806664626417 2.067806664626417 +2.073013782498534 2.073013782498534 +2.08646120854976 2.08646120854976 +2.098476357223667 2.098476357223667 +2.101378199886176 2.101378199886176 +2.101927506425904 2.101927506425904 +2.12671744783454 2.12671744783454 +2.143966150630584 2.143966150630584 +2.145312642688415 2.145312642688415 +2.148704396208969 2.148704396208969 +2.153092682531471 2.153092682531471 +2.157553654759374 2.157553654759374 +2.176659075756566 2.176659075756566 +2.177260578806816 2.177260578806816 +2.179141269427014 2.179141269427014 +2.201895416482074 2.201895416482074 +2.202563945779844 2.202563945779844 +2.205113735193028 2.205113735193028 +2.207345865351049 2.207345865351049 +2.208922099676958 2.208922099676958 +2.218057898922937 2.218057898922937 +2.228610453267036 2.228610453267036 +2.241314066596301 2.241314066596301 +2.242145210071643 2.242145210071643 +2.253976266568437 2.253976266568437 +2.255324860119305 2.255324860119305 +2.271300972641221 2.271300972641221 +2.279438361991067 2.279438361991067 +2.286592331830957 2.286592331830957 +2.287159411646074 2.287159411646074 +2.296653147995115 2.296653147995115 +2.301754785182811 2.301754785182811 +2.30409930499031 2.30409930499031 +2.32141477565108 2.32141477565108 +2.347789281926012 2.347789281926012 +2.347827987256373 2.347827987256373 +2.349391321950732 2.349391321950732 +2.350129292983257 2.350129292983257 +2.358679083392328 2.358679083392328 +2.372845273125388 2.372845273125388 +2.385040766846267 2.385040766846267 +2.42114588843816 2.42114588843816 +2.425116524931602 2.425116524931602 +2.426518521893022 2.426518521893022 +2.43211651886311 2.43211651886311 +2.441302771998711 2.441302771998711 +2.446429340510857 2.446429340510857 +2.446547553904861 2.446547553904861 +2.45764765793376 2.45764765793376 +2.461222149682938 2.461222149682938 +2.467900747394114 2.467900747394114 +2.473214152160872 2.473214152160872 +2.5 2.5 +2.503557913626332 2.503557913626332 +2.504315621146863 2.504315621146863 +2.515634290122204 2.515634290122204 +2.516231935083851 2.516231935083851 +2.517558892374071 2.517558892374071 +2.526325773757754 2.526325773757754 +2.531164001388939 2.531164001388939 +2.53128061055404 2.53128061055404 +2.539387277827314 2.539387277827314 +2.540864599180268 2.540864599180268 +2.548084457784768 2.548084457784768 +2.548923292215475 2.548923292215475 +2.551730202825644 2.551730202825644 +2.553178578801818 2.553178578801818 +2.560295747947446 2.560295747947446 +2.566321603108612 2.566321603108612 +2.568932286976676 2.568932286976676 +2.574887688783916 2.574887688783916 +2.581809142325336 2.581809142325336 +2.584541960262555 2.584541960262555 +2.585511915815223 2.585511915815223 +2.592970592044868 2.592970592044868 +2.596055336381078 2.596055336381078 +2.598560573626668 2.598560573626668 +2.614019084614256 2.614019084614256 +2.618463725327216 2.618463725327216 +2.622883674481145 2.622883674481145 +2.627791161528314 2.627791161528314 +2.63535653879261 2.63535653879261 +2.654825898255443 2.654825898255443 +2.660423271276714 2.660423271276714 +2.667148030102869 2.667148030102869 +2.67012591760915 2.67012591760915 +2.698712599567882 2.698712599567882 +2.72180967799905 2.72180967799905 +2.732466204434637 2.732466204434637 +2.734187392905275 2.734187392905275 +2.737296308103857 2.737296308103857 +2.745724923243991 2.745724923243991 +2.749541709159369 2.749541709159369 +2.752925621447035 2.752925621447035 +2.754183973113479 2.754183973113479 +2.763972022430258 2.763972022430258 +2.766941997926879 2.766941997926879 +2.773850925522978 2.773850925522978 +2.777506755238121 2.777506755238121 +2.780333194223143 2.780333194223143 +2.783060349483276 2.783060349483276 +2.78679029681548 2.78679029681548 +2.786792895521339 2.786792895521339 +2.795170825459034 2.795170825459034 +2.801104989227437 2.801104989227437 +2.80525433080833 2.80525433080833 +2.805376738133109 2.805376738133109 +2.806844454092663 2.806844454092663 +2.811611818684648 2.811611818684648 +2.811994908451803 2.811994908451803 +2.816002798930236 2.816002798930236 +2.816814002472584 2.816814002472584 +2.818569391261086 2.818569391261086 +2.821660827076439 2.821660827076439 +2.822317588351085 2.822317588351085 +2.824910409962511 2.824910409962511 +2.829322097471409 2.829322097471409 +2.833852169620359 2.833852169620359 +2.839287537694811 2.839287537694811 +2.841714730677953 2.841714730677953 +2.841715058318205 2.841715058318205 +2.851653306950001 2.851653306950001 +2.853639002902003 2.853639002902003 +2.85515962291442 2.85515962291442 +2.855333736885793 2.855333736885793 +2.872540314564304 2.872540314564304 +2.879449214478037 2.879449214478037 +2.881003856158217 2.881003856158217 +2.881074731438092 2.881074731438092 +2.893589165559115 2.893589165559115 +2.898664743213686 2.898664743213686 +2.90387832180792 2.90387832180792 +2.919095859678745 2.919095859678745 +2.924945175440496 2.924945175440496 +2.931795145696962 2.931795145696962 +2.932285006979528 2.932285006979528 +2.934606807227626 2.934606807227626 +2.936392671567475 2.936392671567475 +2.953794710898493 2.953794710898493 +2.958055395706548 2.958055395706548 +2.960407744013656 2.960407744013656 +2.960759715914242 2.960759715914242 +2.969702548922556 2.969702548922556 +2.970149844982665 2.970149844982665 +2.978953970679893 2.978953970679893 +2.979075864664287 2.979075864664287 +2.984665519558418 2.984665519558418 +3.04548240149063 3.04548240149063 +3.050688336416719 3.050688336416719 +3.05773927378742 3.05773927378742 +3.059596740753369 3.059596740753369 +3.059762479996741 3.059762479996741 +3.088543279751235 3.088543279751235 +3.093580813520995 3.093580813520995 +3.104787362108069 3.104787362108069 +3.173380191779681 3.173380191779681 +3.583124637167399 3.583124637167399 +3.630658112409034 3.630658112409034 +3.631421639368965 3.631421639368965 +3.751087101339956 3.751087101339956 +3.800845709568037 3.800845709568037 +3.846558940956666 3.846558940956666 +4 4 +4 4 +4.076238038291317 4.076238038291317 +4.455547086147983 4.455547086147983 +5.356087357608394 5.356087357608394 +5.54364842773721 5.54364842773721 +7.587654388717225 7.587654388717225 diff --git a/bottleneck/tests/data/test_016_B b/bottleneck/tests/data/test_016_B new file mode 100644 index 0000000..bb8655a --- /dev/null +++ b/bottleneck/tests/data/test_016_B @@ -0,0 +1,193 @@ +1.167089173446239 1.167089173446239 +1.256234452640111 1.256234452640111 +1.303693422257498 1.303693422257498 +1.413255970488646 1.413255970488646 +1.697910382446573 1.697910382446573 +1.718844728805093 1.718844728805093 +1.734124820632724 1.734124820632724 +1.749572938304276 1.749572938304276 +1.770320424526358 1.770320424526358 +1.786344763036807 1.786344763036807 +1.810054737907635 1.810054737907635 +1.815127306170105 1.815127306170105 +1.837806648681218 1.837806648681218 +1.870552189043019 1.870552189043019 +1.897240351979503 1.897240351979503 +1.935562152643027 1.935562152643027 +1.952562418976663 1.952562418976663 +1.959552126104175 1.959552126104175 +1.979899732318601 1.979899732318601 +2.00044500769347 2.00044500769347 +2.028951227523087 2.028951227523087 +2.037678749316724 2.037678749316724 +2.047911420446857 2.047911420446857 +2.075181804515723 2.075181804515723 +2.077245386452578 2.077245386452578 +2.084751316684838 2.084751316684838 +2.084860886126203 2.084860886126203 +2.103286477421968 2.103286477421968 +2.106856827309345 2.106856827309345 +2.113139266068691 2.113139266068691 +2.114594962503455 2.114594962503455 +2.115917727493158 2.115917727493158 +2.122335878797089 2.122335878797089 +2.127359082726206 2.127359082726206 +2.131673381033273 2.131673381033273 +2.155015793320908 2.155015793320908 +2.162480684365264 2.162480684365264 +2.195207236194009 2.195207236194009 +2.203279931784429 2.203279931784429 +2.205567995563669 2.205567995563669 +2.212933962936773 2.212933962936773 +2.215081271089993 2.215081271089993 +2.225989037578865 2.225989037578865 +2.24218929203347 2.24218929203347 +2.246321319993257 2.246321319993257 +2.280059407166517 2.280059407166517 +2.284117669032543 2.284117669032543 +2.293233992770926 2.293233992770926 +2.298815356955373 2.298815356955373 +2.300542634724628 2.300542634724628 +2.326408290042679 2.326408290042679 +2.328797162040625 2.328797162040625 +2.36025798094028 2.36025798094028 +2.365031313604634 2.365031313604634 +2.372266311053883 2.372266311053883 +2.400053902049271 2.400053902049271 +2.409134054334209 2.409134054334209 +2.411368235895246 2.411368235895246 +2.415934766378347 2.415934766378347 +2.420989857074179 2.420989857074179 +2.422520269961376 2.422520269961376 +2.43377629944218 2.43377629944218 +2.449308615746858 2.449308615746858 +2.452936540056068 2.452936540056068 +2.453698388060092 2.453698388060092 +2.454711357943602 2.454711357943602 +2.459202673400056 2.459202673400056 +2.493778305287384 2.493778305287384 +2.537394117473177 2.537394117473177 +2.544674753106669 2.544674753106669 +2.558904304820755 2.558904304820755 +2.563089994365716 2.563089994365716 +2.565476194422898 2.565476194422898 +2.599756049189921 2.599756049189921 +2.603619661709009 2.603619661709009 +2.609775379385211 2.609775379385211 +2.622552038976658 2.622552038976658 +2.623798471910885 2.623798471910885 +2.635711198661633 2.635711198661633 +2.644229304223612 2.644229304223612 +2.661919064427223 2.661919064427223 +2.666783921498494 2.666783921498494 +2.675503310152301 2.675503310152301 +2.684228699964661 2.684228699964661 +2.696854617267681 2.696854617267681 +2.700538654666735 2.700538654666735 +2.744886611436907 2.744886611436907 +2.748618547996708 2.748618547996708 +2.757981496641135 2.757981496641135 +2.774766825791652 2.774766825791652 +2.784491736143893 2.784491736143893 +2.796482184304273 2.796482184304273 +2.800849254751463 2.800849254751463 +2.816963410000067 2.816963410000067 +2.825207379914743 2.825207379914743 +2.831286409028398 2.831286409028398 +2.844827082550712 2.844827082550712 +2.853558438121966 2.853558438121966 +2.859806035663089 2.859806035663089 +2.878956033959891 2.878956033959891 +2.886422825109222 2.886422825109222 +2.891566924618832 2.891566924618832 +2.892028419188578 2.892028419188578 +2.893138900330932 2.893138900330932 +2.894250936382814 2.894250936382814 +2.90112201577666 2.90112201577666 +2.902172795370005 2.902172795370005 +2.90967533504119 2.90967533504119 +2.919687125962211 2.919687125962211 +2.923711238894001 2.923711238894001 +2.929041907338841 2.929041907338841 +2.938734873084349 2.938734873084349 +2.939642428979572 2.939642428979572 +2.943010909640486 2.943010909640486 +2.944210926048103 2.944210926048103 +2.951091358234723 2.951091358234723 +2.953950275008233 2.953950275008233 +2.966943157369611 2.966943157369611 +2.982522008227535 2.982522008227535 +2.992174049247434 2.992174049247434 +2.993098995839607 2.993098995839607 +2.995311055519335 2.995311055519335 +2.996708164866609 2.996708164866609 +2.999922110096644 2.999922110096644 +3 3 +3.000364533251431 3.000364533251431 +3.003840990677832 3.003840990677832 +3.006672301312824 3.006672301312824 +3.016489409140306 3.016489409140306 +3.021123787004333 3.021123787004333 +3.039117818612596 3.039117818612596 +3.039555193616473 3.039555193616473 +3.049952247267922 3.049952247267922 +3.057673482371216 3.057673482371216 +3.06920083507411 3.06920083507411 +3.075505231082782 3.075505231082782 +3.079038628197304 3.079038628197304 +3.084265889701239 3.084265889701239 +3.086837468106297 3.086837468106297 +3.103873984398081 3.103873984398081 +3.11528125482979 3.11528125482979 +3.119720021802376 3.119720021802376 +3.132543753577128 3.132543753577128 +3.141822873359038 3.141822873359038 +3.143502053175705 3.143502053175705 +3.153232877003746 3.153232877003746 +3.157586960809866 3.157586960809866 +3.157966892275408 3.157966892275408 +3.163583225161638 3.163583225161638 +3.178188125342772 3.178188125342772 +3.178475867931057 3.178475867931057 +3.179372297765929 3.179372297765929 +3.186437137237586 3.186437137237586 +3.188053957464282 3.188053957464282 +3.199351610026191 3.199351610026191 +3.204566427513051 3.204566427513051 +3.22885278850648 3.22885278850648 +3.229088648916556 3.229088648916556 +3.236685523936269 3.236685523936269 +3.239854786600373 3.239854786600373 +3.255809161351669 3.255809161351669 +3.287718056143732 3.287718056143732 +3.294038308299402 3.294038308299402 +3.313688277153076 3.313688277153076 +3.325783245946608 3.325783245946608 +3.331072954808429 3.331072954808429 +3.354962852285211 3.354962852285211 +3.357502741262644 3.357502741262644 +3.373668509804576 3.373668509804576 +3.408653045775418 3.408653045775418 +3.416281541503763 3.416281541503763 +3.443144279972986 3.443144279972986 +3.492970564191033 3.492970564191033 +3.493767805580122 3.493767805580122 +3.559084134799019 3.559084134799019 +3.559898699300211 3.559898699300211 +3.833585501974904 3.833585501974904 +4.099502076836052 4.099502076836052 +4.484082147277348 4.484082147277348 +4.505718324707756 4.505718324707756 +4.891723119528026 4.891723119528026 +5.065300494905414 5.065300494905414 +5.188599238535201 5.188599238535201 +5.36134479630535 5.36134479630535 +5.609786508140671 5.609786508140671 +7.08640314680382 7.08640314680382 +7.113765883549079 7.113765883549079 +7.328944131981744 7.328944131981744 +7.63625182217108 7.63625182217108 +7.716743341311718 7.716743341311718 +7.938093404092351 7.938093404092351 +8.112783377863046 8.112783377863046 +8.131485096731454 8.131485096731454 diff --git a/bottleneck/tests/data/test_100_A b/bottleneck/tests/data/test_100_A new file mode 100644 index 0000000..e02a950 --- /dev/null +++ b/bottleneck/tests/data/test_100_A @@ -0,0 +1,2 @@ +0 3 +6 12 diff --git a/bottleneck/tests/data/test_100_B b/bottleneck/tests/data/test_100_B new file mode 100644 index 0000000..f757173 --- /dev/null +++ b/bottleneck/tests/data/test_100_B @@ -0,0 +1,2 @@ +3 5 +5 13 diff --git a/bottleneck/tests/data/test_101_A b/bottleneck/tests/data/test_101_A new file mode 100644 index 0000000..5fe22b1 --- /dev/null +++ b/bottleneck/tests/data/test_101_A @@ -0,0 +1,2 @@ +8 11 +9 11 diff --git a/bottleneck/tests/data/test_101_B b/bottleneck/tests/data/test_101_B new file mode 100644 index 0000000..ea19ef6 --- /dev/null +++ b/bottleneck/tests/data/test_101_B @@ -0,0 +1,2 @@ +3 6 +5 8 diff --git a/bottleneck/tests/data/test_102_A b/bottleneck/tests/data/test_102_A new file mode 100644 index 0000000..1cd65e9 --- /dev/null +++ b/bottleneck/tests/data/test_102_A @@ -0,0 +1,2 @@ +7 8 +9 16 diff --git a/bottleneck/tests/data/test_102_B b/bottleneck/tests/data/test_102_B new file mode 100644 index 0000000..3ffa9cb --- /dev/null +++ b/bottleneck/tests/data/test_102_B @@ -0,0 +1,2 @@ +1 10 +9 12 diff --git a/bottleneck/tests/data/test_103_A b/bottleneck/tests/data/test_103_A new file mode 100644 index 0000000..d4c86c9 --- /dev/null +++ b/bottleneck/tests/data/test_103_A @@ -0,0 +1,2 @@ +5 7 +10 15 diff --git a/bottleneck/tests/data/test_103_B b/bottleneck/tests/data/test_103_B new file mode 100644 index 0000000..c9a898a --- /dev/null +++ b/bottleneck/tests/data/test_103_B @@ -0,0 +1,2 @@ +1 2 +1 7 diff --git a/bottleneck/tests/data/test_104_A b/bottleneck/tests/data/test_104_A new file mode 100644 index 0000000..373ae44 --- /dev/null +++ b/bottleneck/tests/data/test_104_A @@ -0,0 +1,2 @@ +6 11 +3 6 diff --git a/bottleneck/tests/data/test_104_B b/bottleneck/tests/data/test_104_B new file mode 100644 index 0000000..e382a3b --- /dev/null +++ b/bottleneck/tests/data/test_104_B @@ -0,0 +1,2 @@ +3 9 +10 17 diff --git a/bottleneck/tests/data/test_105_A b/bottleneck/tests/data/test_105_A new file mode 100644 index 0000000..21b1cc4 --- /dev/null +++ b/bottleneck/tests/data/test_105_A @@ -0,0 +1,2 @@ +5 14 +2 7 diff --git a/bottleneck/tests/data/test_105_B b/bottleneck/tests/data/test_105_B new file mode 100644 index 0000000..3ab6543 --- /dev/null +++ b/bottleneck/tests/data/test_105_B @@ -0,0 +1,2 @@ +5 12 +3 12 diff --git a/bottleneck/tests/data/test_106_A b/bottleneck/tests/data/test_106_A new file mode 100644 index 0000000..8d3ffb8 --- /dev/null +++ b/bottleneck/tests/data/test_106_A @@ -0,0 +1,2 @@ +7 11 +7 15 diff --git a/bottleneck/tests/data/test_106_B b/bottleneck/tests/data/test_106_B new file mode 100644 index 0000000..760ada5 --- /dev/null +++ b/bottleneck/tests/data/test_106_B @@ -0,0 +1,2 @@ +4 12 +6 13 diff --git a/bottleneck/tests/data/test_107_A b/bottleneck/tests/data/test_107_A new file mode 100644 index 0000000..79a621d --- /dev/null +++ b/bottleneck/tests/data/test_107_A @@ -0,0 +1,2 @@ +9 19 +1 7 diff --git a/bottleneck/tests/data/test_107_B b/bottleneck/tests/data/test_107_B new file mode 100644 index 0000000..43e4294 --- /dev/null +++ b/bottleneck/tests/data/test_107_B @@ -0,0 +1,2 @@ +0 1 +1 3 diff --git a/bottleneck/tests/data/test_108_A b/bottleneck/tests/data/test_108_A new file mode 100644 index 0000000..c2035e5 --- /dev/null +++ b/bottleneck/tests/data/test_108_A @@ -0,0 +1,2 @@ +9 19 +7 16 diff --git a/bottleneck/tests/data/test_108_B b/bottleneck/tests/data/test_108_B new file mode 100644 index 0000000..618c2c8 --- /dev/null +++ b/bottleneck/tests/data/test_108_B @@ -0,0 +1,2 @@ +5 13 +0 9 diff --git a/bottleneck/tests/data/test_109_A b/bottleneck/tests/data/test_109_A new file mode 100644 index 0000000..d16f551 --- /dev/null +++ b/bottleneck/tests/data/test_109_A @@ -0,0 +1,2 @@ +8 9 +3 10 diff --git a/bottleneck/tests/data/test_109_B b/bottleneck/tests/data/test_109_B new file mode 100644 index 0000000..02f9518 --- /dev/null +++ b/bottleneck/tests/data/test_109_B @@ -0,0 +1,2 @@ +4 9 +6 13 diff --git a/bottleneck/tests/data/test_110_A b/bottleneck/tests/data/test_110_A new file mode 100644 index 0000000..f013fd8 --- /dev/null +++ b/bottleneck/tests/data/test_110_A @@ -0,0 +1,2 @@ +3 5 +1 10 diff --git a/bottleneck/tests/data/test_110_B b/bottleneck/tests/data/test_110_B new file mode 100644 index 0000000..f443b07 --- /dev/null +++ b/bottleneck/tests/data/test_110_B @@ -0,0 +1,2 @@ +7 10 +3 5 diff --git a/bottleneck/tests/data/test_111_A b/bottleneck/tests/data/test_111_A new file mode 100644 index 0000000..fcadd44 --- /dev/null +++ b/bottleneck/tests/data/test_111_A @@ -0,0 +1,2 @@ +10 19 +3 4 diff --git a/bottleneck/tests/data/test_111_B b/bottleneck/tests/data/test_111_B new file mode 100644 index 0000000..569a5d5 --- /dev/null +++ b/bottleneck/tests/data/test_111_B @@ -0,0 +1,2 @@ +5 6 +10 15 diff --git a/bottleneck/tests/data/test_112_A b/bottleneck/tests/data/test_112_A new file mode 100644 index 0000000..7d421ec --- /dev/null +++ b/bottleneck/tests/data/test_112_A @@ -0,0 +1,2 @@ +1 5 +7 8 diff --git a/bottleneck/tests/data/test_112_B b/bottleneck/tests/data/test_112_B new file mode 100644 index 0000000..ec7a9a1 --- /dev/null +++ b/bottleneck/tests/data/test_112_B @@ -0,0 +1,2 @@ +4 11 +9 17 diff --git a/bottleneck/tests/data/test_113_A b/bottleneck/tests/data/test_113_A new file mode 100644 index 0000000..c3b3312 --- /dev/null +++ b/bottleneck/tests/data/test_113_A @@ -0,0 +1,2 @@ +5 12 +0 3 diff --git a/bottleneck/tests/data/test_113_B b/bottleneck/tests/data/test_113_B new file mode 100644 index 0000000..ca287ff --- /dev/null +++ b/bottleneck/tests/data/test_113_B @@ -0,0 +1,2 @@ +3 13 +6 11 diff --git a/bottleneck/tests/data/test_114_A b/bottleneck/tests/data/test_114_A new file mode 100644 index 0000000..112e9d3 --- /dev/null +++ b/bottleneck/tests/data/test_114_A @@ -0,0 +1,2 @@ +6 15 +2 6 diff --git a/bottleneck/tests/data/test_114_B b/bottleneck/tests/data/test_114_B new file mode 100644 index 0000000..dabf69d --- /dev/null +++ b/bottleneck/tests/data/test_114_B @@ -0,0 +1,2 @@ +6 7 +1 4 diff --git a/bottleneck/tests/data/test_115_A b/bottleneck/tests/data/test_115_A new file mode 100644 index 0000000..c467eae --- /dev/null +++ b/bottleneck/tests/data/test_115_A @@ -0,0 +1,2 @@ +10 18 +0 1 diff --git a/bottleneck/tests/data/test_115_B b/bottleneck/tests/data/test_115_B new file mode 100644 index 0000000..e14dd59 --- /dev/null +++ b/bottleneck/tests/data/test_115_B @@ -0,0 +1,2 @@ +2 3 +4 8 diff --git a/bottleneck/tests/data/test_116_A b/bottleneck/tests/data/test_116_A new file mode 100644 index 0000000..1828c98 --- /dev/null +++ b/bottleneck/tests/data/test_116_A @@ -0,0 +1,2 @@ +8 9 +9 14 diff --git a/bottleneck/tests/data/test_116_B b/bottleneck/tests/data/test_116_B new file mode 100644 index 0000000..f63039f --- /dev/null +++ b/bottleneck/tests/data/test_116_B @@ -0,0 +1,2 @@ +5 13 +9 18 diff --git a/bottleneck/tests/data/test_117_A b/bottleneck/tests/data/test_117_A new file mode 100644 index 0000000..280d9bc --- /dev/null +++ b/bottleneck/tests/data/test_117_A @@ -0,0 +1,2 @@ +10 15 +9 14 diff --git a/bottleneck/tests/data/test_117_B b/bottleneck/tests/data/test_117_B new file mode 100644 index 0000000..595260c --- /dev/null +++ b/bottleneck/tests/data/test_117_B @@ -0,0 +1,2 @@ +9 15 +6 11 diff --git a/bottleneck/tests/data/test_118_A b/bottleneck/tests/data/test_118_A new file mode 100644 index 0000000..2ecae80 --- /dev/null +++ b/bottleneck/tests/data/test_118_A @@ -0,0 +1,2 @@ +9 10 +4 11 diff --git a/bottleneck/tests/data/test_118_B b/bottleneck/tests/data/test_118_B new file mode 100644 index 0000000..13fc15b --- /dev/null +++ b/bottleneck/tests/data/test_118_B @@ -0,0 +1,2 @@ +5 14 +7 13 diff --git a/bottleneck/tests/data/test_119_A b/bottleneck/tests/data/test_119_A new file mode 100644 index 0000000..db12f3c --- /dev/null +++ b/bottleneck/tests/data/test_119_A @@ -0,0 +1,2 @@ +2 12 +2 5 diff --git a/bottleneck/tests/data/test_119_B b/bottleneck/tests/data/test_119_B new file mode 100644 index 0000000..79ccbdd --- /dev/null +++ b/bottleneck/tests/data/test_119_B @@ -0,0 +1,2 @@ +2 7 +2 3 diff --git a/bottleneck/tests/data/test_120_A b/bottleneck/tests/data/test_120_A new file mode 100644 index 0000000..cd31ead --- /dev/null +++ b/bottleneck/tests/data/test_120_A @@ -0,0 +1,3 @@ +5 13 +9 10 +3 4 diff --git a/bottleneck/tests/data/test_120_B b/bottleneck/tests/data/test_120_B new file mode 100644 index 0000000..148cbca --- /dev/null +++ b/bottleneck/tests/data/test_120_B @@ -0,0 +1,3 @@ +2 6 +5 6 +3 12 diff --git a/bottleneck/tests/data/test_121_A b/bottleneck/tests/data/test_121_A new file mode 100644 index 0000000..864cde5 --- /dev/null +++ b/bottleneck/tests/data/test_121_A @@ -0,0 +1,3 @@ +10 16 +7 14 +5 8 diff --git a/bottleneck/tests/data/test_121_B b/bottleneck/tests/data/test_121_B new file mode 100644 index 0000000..cc2c1dc --- /dev/null +++ b/bottleneck/tests/data/test_121_B @@ -0,0 +1,3 @@ +9 15 +5 10 +0 3 diff --git a/bottleneck/tests/data/test_122_A b/bottleneck/tests/data/test_122_A new file mode 100644 index 0000000..681d074 --- /dev/null +++ b/bottleneck/tests/data/test_122_A @@ -0,0 +1,3 @@ +5 6 +8 9 +5 11 diff --git a/bottleneck/tests/data/test_122_B b/bottleneck/tests/data/test_122_B new file mode 100644 index 0000000..e8681e6 --- /dev/null +++ b/bottleneck/tests/data/test_122_B @@ -0,0 +1,3 @@ +7 8 +0 1 +6 12 diff --git a/bottleneck/tests/data/test_123_A b/bottleneck/tests/data/test_123_A new file mode 100644 index 0000000..2c53b51 --- /dev/null +++ b/bottleneck/tests/data/test_123_A @@ -0,0 +1,3 @@ +5 8 +4 6 +9 10 diff --git a/bottleneck/tests/data/test_123_B b/bottleneck/tests/data/test_123_B new file mode 100644 index 0000000..0acdfb7 --- /dev/null +++ b/bottleneck/tests/data/test_123_B @@ -0,0 +1,3 @@ +9 14 +5 14 +4 5 diff --git a/bottleneck/tests/data/test_124_A b/bottleneck/tests/data/test_124_A new file mode 100644 index 0000000..f43cb9a --- /dev/null +++ b/bottleneck/tests/data/test_124_A @@ -0,0 +1,3 @@ +0 1 +8 16 +4 7 diff --git a/bottleneck/tests/data/test_124_B b/bottleneck/tests/data/test_124_B new file mode 100644 index 0000000..51dd494 --- /dev/null +++ b/bottleneck/tests/data/test_124_B @@ -0,0 +1,3 @@ +7 8 +0 1 +4 6 diff --git a/bottleneck/tests/data/test_125_A b/bottleneck/tests/data/test_125_A new file mode 100644 index 0000000..e0b6720 --- /dev/null +++ b/bottleneck/tests/data/test_125_A @@ -0,0 +1,3 @@ +9 11 +6 13 +1 10 diff --git a/bottleneck/tests/data/test_125_B b/bottleneck/tests/data/test_125_B new file mode 100644 index 0000000..cf4f98c --- /dev/null +++ b/bottleneck/tests/data/test_125_B @@ -0,0 +1,3 @@ +7 16 +10 11 +7 16 diff --git a/bottleneck/tests/data/test_126_A b/bottleneck/tests/data/test_126_A new file mode 100644 index 0000000..f504606 --- /dev/null +++ b/bottleneck/tests/data/test_126_A @@ -0,0 +1,3 @@ +4 8 +5 14 +1 6 diff --git a/bottleneck/tests/data/test_126_B b/bottleneck/tests/data/test_126_B new file mode 100644 index 0000000..f5b5fda --- /dev/null +++ b/bottleneck/tests/data/test_126_B @@ -0,0 +1,3 @@ +1 2 +8 12 +7 8 diff --git a/bottleneck/tests/data/test_127_A b/bottleneck/tests/data/test_127_A new file mode 100644 index 0000000..20f8541 --- /dev/null +++ b/bottleneck/tests/data/test_127_A @@ -0,0 +1,3 @@ +7 8 +10 15 +3 4 diff --git a/bottleneck/tests/data/test_127_B b/bottleneck/tests/data/test_127_B new file mode 100644 index 0000000..36f6cf3 --- /dev/null +++ b/bottleneck/tests/data/test_127_B @@ -0,0 +1,3 @@ +0 1 +8 11 +2 3 diff --git a/bottleneck/tests/data/test_128_A b/bottleneck/tests/data/test_128_A new file mode 100644 index 0000000..9e2c50e --- /dev/null +++ b/bottleneck/tests/data/test_128_A @@ -0,0 +1,3 @@ +9 17 +0 4 +0 3 diff --git a/bottleneck/tests/data/test_128_B b/bottleneck/tests/data/test_128_B new file mode 100644 index 0000000..0fdae08 --- /dev/null +++ b/bottleneck/tests/data/test_128_B @@ -0,0 +1,3 @@ +10 18 +7 10 +1 2 diff --git a/bottleneck/tests/data/test_129_A b/bottleneck/tests/data/test_129_A new file mode 100644 index 0000000..dc289de --- /dev/null +++ b/bottleneck/tests/data/test_129_A @@ -0,0 +1,3 @@ +8 17 +5 10 +9 16 diff --git a/bottleneck/tests/data/test_129_B b/bottleneck/tests/data/test_129_B new file mode 100644 index 0000000..3216111 --- /dev/null +++ b/bottleneck/tests/data/test_129_B @@ -0,0 +1,3 @@ +10 19 +8 17 +2 11 diff --git a/bottleneck/tests/data/test_130_A b/bottleneck/tests/data/test_130_A new file mode 100644 index 0000000..db70054 --- /dev/null +++ b/bottleneck/tests/data/test_130_A @@ -0,0 +1,3 @@ +10 11 +10 19 +4 6 diff --git a/bottleneck/tests/data/test_130_B b/bottleneck/tests/data/test_130_B new file mode 100644 index 0000000..80c5a30 --- /dev/null +++ b/bottleneck/tests/data/test_130_B @@ -0,0 +1,3 @@ +4 14 +0 8 +3 9 diff --git a/bottleneck/tests/data/test_131_A b/bottleneck/tests/data/test_131_A new file mode 100644 index 0000000..720cdb3 --- /dev/null +++ b/bottleneck/tests/data/test_131_A @@ -0,0 +1,3 @@ +9 15 +3 4 +2 5 diff --git a/bottleneck/tests/data/test_131_B b/bottleneck/tests/data/test_131_B new file mode 100644 index 0000000..55bb437 --- /dev/null +++ b/bottleneck/tests/data/test_131_B @@ -0,0 +1,3 @@ +10 20 +10 15 +7 10 diff --git a/bottleneck/tests/data/test_132_A b/bottleneck/tests/data/test_132_A new file mode 100644 index 0000000..dec8f13 --- /dev/null +++ b/bottleneck/tests/data/test_132_A @@ -0,0 +1,3 @@ +6 16 +2 4 +10 11 diff --git a/bottleneck/tests/data/test_132_B b/bottleneck/tests/data/test_132_B new file mode 100644 index 0000000..8844484 --- /dev/null +++ b/bottleneck/tests/data/test_132_B @@ -0,0 +1,3 @@ +6 8 +5 14 +3 4 diff --git a/bottleneck/tests/data/test_133_A b/bottleneck/tests/data/test_133_A new file mode 100644 index 0000000..b46cb4f --- /dev/null +++ b/bottleneck/tests/data/test_133_A @@ -0,0 +1,3 @@ +4 10 +9 15 +1 7 diff --git a/bottleneck/tests/data/test_133_B b/bottleneck/tests/data/test_133_B new file mode 100644 index 0000000..7a5d26a --- /dev/null +++ b/bottleneck/tests/data/test_133_B @@ -0,0 +1,3 @@ +4 5 +3 6 +1 10 diff --git a/bottleneck/tests/data/test_134_A b/bottleneck/tests/data/test_134_A new file mode 100644 index 0000000..4abd1e5 --- /dev/null +++ b/bottleneck/tests/data/test_134_A @@ -0,0 +1,3 @@ +1 4 +6 13 +10 15 diff --git a/bottleneck/tests/data/test_134_B b/bottleneck/tests/data/test_134_B new file mode 100644 index 0000000..aed169c --- /dev/null +++ b/bottleneck/tests/data/test_134_B @@ -0,0 +1,3 @@ +8 17 +8 16 +7 12 diff --git a/bottleneck/tests/data/test_135_A b/bottleneck/tests/data/test_135_A new file mode 100644 index 0000000..bbe9e95 --- /dev/null +++ b/bottleneck/tests/data/test_135_A @@ -0,0 +1,3 @@ +7 15 +1 4 +2 6 diff --git a/bottleneck/tests/data/test_135_B b/bottleneck/tests/data/test_135_B new file mode 100644 index 0000000..3c84c03 --- /dev/null +++ b/bottleneck/tests/data/test_135_B @@ -0,0 +1,3 @@ +6 10 +2 8 +1 7 diff --git a/bottleneck/tests/data/test_136_A b/bottleneck/tests/data/test_136_A new file mode 100644 index 0000000..a68856e --- /dev/null +++ b/bottleneck/tests/data/test_136_A @@ -0,0 +1,3 @@ +0 1 +9 14 +7 11 diff --git a/bottleneck/tests/data/test_136_B b/bottleneck/tests/data/test_136_B new file mode 100644 index 0000000..c03df54 --- /dev/null +++ b/bottleneck/tests/data/test_136_B @@ -0,0 +1,3 @@ +4 6 +3 4 +8 12 diff --git a/bottleneck/tests/data/test_137_A b/bottleneck/tests/data/test_137_A new file mode 100644 index 0000000..179d357 --- /dev/null +++ b/bottleneck/tests/data/test_137_A @@ -0,0 +1,3 @@ +5 6 +7 14 +5 9 diff --git a/bottleneck/tests/data/test_137_B b/bottleneck/tests/data/test_137_B new file mode 100644 index 0000000..42541ae --- /dev/null +++ b/bottleneck/tests/data/test_137_B @@ -0,0 +1,3 @@ +10 16 +1 3 +6 7 diff --git a/bottleneck/tests/data/test_138_A b/bottleneck/tests/data/test_138_A new file mode 100644 index 0000000..9c39dfb --- /dev/null +++ b/bottleneck/tests/data/test_138_A @@ -0,0 +1,3 @@ +0 4 +9 14 +10 20 diff --git a/bottleneck/tests/data/test_138_B b/bottleneck/tests/data/test_138_B new file mode 100644 index 0000000..826d759 --- /dev/null +++ b/bottleneck/tests/data/test_138_B @@ -0,0 +1,3 @@ +8 13 +7 8 +10 18 diff --git a/bottleneck/tests/data/test_139_A b/bottleneck/tests/data/test_139_A new file mode 100644 index 0000000..7f74c9f --- /dev/null +++ b/bottleneck/tests/data/test_139_A @@ -0,0 +1,3 @@ +6 7 +9 14 +4 5 diff --git a/bottleneck/tests/data/test_139_B b/bottleneck/tests/data/test_139_B new file mode 100644 index 0000000..ba4ab64 --- /dev/null +++ b/bottleneck/tests/data/test_139_B @@ -0,0 +1,3 @@ +9 11 +7 11 +9 10 diff --git a/bottleneck/tests/data/test_140_A b/bottleneck/tests/data/test_140_A new file mode 100644 index 0000000..fec44cc --- /dev/null +++ b/bottleneck/tests/data/test_140_A @@ -0,0 +1,4 @@ +9 11 +6 7 +4 12 +1 8 diff --git a/bottleneck/tests/data/test_140_B b/bottleneck/tests/data/test_140_B new file mode 100644 index 0000000..af8aa1c --- /dev/null +++ b/bottleneck/tests/data/test_140_B @@ -0,0 +1,4 @@ +9 10 +1 2 +2 10 +2 8 diff --git a/bottleneck/tests/data/test_141_A b/bottleneck/tests/data/test_141_A new file mode 100644 index 0000000..db65086 --- /dev/null +++ b/bottleneck/tests/data/test_141_A @@ -0,0 +1,4 @@ +7 13 +2 12 +5 13 +6 8 diff --git a/bottleneck/tests/data/test_141_B b/bottleneck/tests/data/test_141_B new file mode 100644 index 0000000..022c192 --- /dev/null +++ b/bottleneck/tests/data/test_141_B @@ -0,0 +1,4 @@ +5 10 +9 12 +10 18 +8 11 diff --git a/bottleneck/tests/data/test_142_A b/bottleneck/tests/data/test_142_A new file mode 100644 index 0000000..10bbe2d --- /dev/null +++ b/bottleneck/tests/data/test_142_A @@ -0,0 +1,4 @@ +6 15 +4 5 +6 9 +8 17 diff --git a/bottleneck/tests/data/test_142_B b/bottleneck/tests/data/test_142_B new file mode 100644 index 0000000..82b6b28 --- /dev/null +++ b/bottleneck/tests/data/test_142_B @@ -0,0 +1,4 @@ +8 12 +8 11 +3 5 +8 17 diff --git a/bottleneck/tests/data/test_143_A b/bottleneck/tests/data/test_143_A new file mode 100644 index 0000000..1db8047 --- /dev/null +++ b/bottleneck/tests/data/test_143_A @@ -0,0 +1,4 @@ +5 6 +0 2 +5 10 +6 10 diff --git a/bottleneck/tests/data/test_143_B b/bottleneck/tests/data/test_143_B new file mode 100644 index 0000000..5c5a6a7 --- /dev/null +++ b/bottleneck/tests/data/test_143_B @@ -0,0 +1,4 @@ +8 14 +5 7 +1 11 +4 10 diff --git a/bottleneck/tests/data/test_144_A b/bottleneck/tests/data/test_144_A new file mode 100644 index 0000000..594f4c4 --- /dev/null +++ b/bottleneck/tests/data/test_144_A @@ -0,0 +1,4 @@ +10 15 +6 13 +1 2 +1 6 diff --git a/bottleneck/tests/data/test_144_B b/bottleneck/tests/data/test_144_B new file mode 100644 index 0000000..aa3cd6d --- /dev/null +++ b/bottleneck/tests/data/test_144_B @@ -0,0 +1,4 @@ +0 8 +10 13 +9 18 +8 11 diff --git a/bottleneck/tests/data/test_145_A b/bottleneck/tests/data/test_145_A new file mode 100644 index 0000000..41ea529 --- /dev/null +++ b/bottleneck/tests/data/test_145_A @@ -0,0 +1,4 @@ +2 10 +3 11 +10 17 +3 8 diff --git a/bottleneck/tests/data/test_145_B b/bottleneck/tests/data/test_145_B new file mode 100644 index 0000000..5bcbaf0 --- /dev/null +++ b/bottleneck/tests/data/test_145_B @@ -0,0 +1,4 @@ +6 13 +10 15 +7 15 +6 10 diff --git a/bottleneck/tests/data/test_146_A b/bottleneck/tests/data/test_146_A new file mode 100644 index 0000000..18c1b4a --- /dev/null +++ b/bottleneck/tests/data/test_146_A @@ -0,0 +1,4 @@ +3 5 +6 11 +1 8 +2 5 diff --git a/bottleneck/tests/data/test_146_B b/bottleneck/tests/data/test_146_B new file mode 100644 index 0000000..24e5821 --- /dev/null +++ b/bottleneck/tests/data/test_146_B @@ -0,0 +1,4 @@ +5 12 +4 10 +5 11 +2 7 diff --git a/bottleneck/tests/data/test_147_A b/bottleneck/tests/data/test_147_A new file mode 100644 index 0000000..bce747d --- /dev/null +++ b/bottleneck/tests/data/test_147_A @@ -0,0 +1,4 @@ +9 11 +1 2 +10 12 +10 15 diff --git a/bottleneck/tests/data/test_147_B b/bottleneck/tests/data/test_147_B new file mode 100644 index 0000000..c545851 --- /dev/null +++ b/bottleneck/tests/data/test_147_B @@ -0,0 +1,4 @@ +4 6 +7 14 +4 12 +7 10 diff --git a/bottleneck/tests/data/test_148_A b/bottleneck/tests/data/test_148_A new file mode 100644 index 0000000..cd7482f --- /dev/null +++ b/bottleneck/tests/data/test_148_A @@ -0,0 +1,4 @@ +5 9 +0 7 +7 11 +7 13 diff --git a/bottleneck/tests/data/test_148_B b/bottleneck/tests/data/test_148_B new file mode 100644 index 0000000..a761bd3 --- /dev/null +++ b/bottleneck/tests/data/test_148_B @@ -0,0 +1,4 @@ +7 9 +2 8 +1 2 +4 11 diff --git a/bottleneck/tests/data/test_149_A b/bottleneck/tests/data/test_149_A new file mode 100644 index 0000000..81fff07 --- /dev/null +++ b/bottleneck/tests/data/test_149_A @@ -0,0 +1,4 @@ +2 4 +1 9 +7 13 +4 14 diff --git a/bottleneck/tests/data/test_149_B b/bottleneck/tests/data/test_149_B new file mode 100644 index 0000000..1acd048 --- /dev/null +++ b/bottleneck/tests/data/test_149_B @@ -0,0 +1,4 @@ +9 12 +0 6 +4 10 +0 4 diff --git a/bottleneck/tests/data/test_150_A b/bottleneck/tests/data/test_150_A new file mode 100644 index 0000000..8f4862d --- /dev/null +++ b/bottleneck/tests/data/test_150_A @@ -0,0 +1,4 @@ +9 11 +7 16 +0 1 +0 3 diff --git a/bottleneck/tests/data/test_150_B b/bottleneck/tests/data/test_150_B new file mode 100644 index 0000000..d55101f --- /dev/null +++ b/bottleneck/tests/data/test_150_B @@ -0,0 +1,4 @@ +7 14 +4 5 +7 16 +8 14 diff --git a/bottleneck/tests/data/test_151_A b/bottleneck/tests/data/test_151_A new file mode 100644 index 0000000..1915b6a --- /dev/null +++ b/bottleneck/tests/data/test_151_A @@ -0,0 +1,4 @@ +3 13 +10 11 +7 14 +2 11 diff --git a/bottleneck/tests/data/test_151_B b/bottleneck/tests/data/test_151_B new file mode 100644 index 0000000..065a2c7 --- /dev/null +++ b/bottleneck/tests/data/test_151_B @@ -0,0 +1,4 @@ +6 9 +10 15 +7 8 +7 12 diff --git a/bottleneck/tests/data/test_152_A b/bottleneck/tests/data/test_152_A new file mode 100644 index 0000000..43ed98e --- /dev/null +++ b/bottleneck/tests/data/test_152_A @@ -0,0 +1,4 @@ +10 11 +2 5 +2 5 +0 3 diff --git a/bottleneck/tests/data/test_152_B b/bottleneck/tests/data/test_152_B new file mode 100644 index 0000000..5e179b7 --- /dev/null +++ b/bottleneck/tests/data/test_152_B @@ -0,0 +1,4 @@ +4 8 +5 12 +6 8 +3 5 diff --git a/bottleneck/tests/data/test_153_A b/bottleneck/tests/data/test_153_A new file mode 100644 index 0000000..16f5a34 --- /dev/null +++ b/bottleneck/tests/data/test_153_A @@ -0,0 +1,4 @@ +0 9 +10 11 +10 16 +1 9 diff --git a/bottleneck/tests/data/test_153_B b/bottleneck/tests/data/test_153_B new file mode 100644 index 0000000..a82ae69 --- /dev/null +++ b/bottleneck/tests/data/test_153_B @@ -0,0 +1,4 @@ +0 3 +3 10 +6 14 +4 7 diff --git a/bottleneck/tests/data/test_154_A b/bottleneck/tests/data/test_154_A new file mode 100644 index 0000000..73246c1 --- /dev/null +++ b/bottleneck/tests/data/test_154_A @@ -0,0 +1,4 @@ +2 5 +5 15 +2 5 +3 7 diff --git a/bottleneck/tests/data/test_154_B b/bottleneck/tests/data/test_154_B new file mode 100644 index 0000000..6650b45 --- /dev/null +++ b/bottleneck/tests/data/test_154_B @@ -0,0 +1,4 @@ +3 4 +9 16 +5 12 +1 6 diff --git a/bottleneck/tests/data/test_155_A b/bottleneck/tests/data/test_155_A new file mode 100644 index 0000000..9ce2859 --- /dev/null +++ b/bottleneck/tests/data/test_155_A @@ -0,0 +1,4 @@ +10 14 +7 10 +9 10 +4 12 diff --git a/bottleneck/tests/data/test_155_B b/bottleneck/tests/data/test_155_B new file mode 100644 index 0000000..c852368 --- /dev/null +++ b/bottleneck/tests/data/test_155_B @@ -0,0 +1,4 @@ +6 10 +2 8 +4 8 +1 11 diff --git a/bottleneck/tests/data/test_156_A b/bottleneck/tests/data/test_156_A new file mode 100644 index 0000000..e79fcd1 --- /dev/null +++ b/bottleneck/tests/data/test_156_A @@ -0,0 +1,4 @@ +2 4 +6 12 +1 9 +4 14 diff --git a/bottleneck/tests/data/test_156_B b/bottleneck/tests/data/test_156_B new file mode 100644 index 0000000..05cd916 --- /dev/null +++ b/bottleneck/tests/data/test_156_B @@ -0,0 +1,4 @@ +2 12 +7 12 +7 11 +2 4 diff --git a/bottleneck/tests/data/test_157_A b/bottleneck/tests/data/test_157_A new file mode 100644 index 0000000..257f007 --- /dev/null +++ b/bottleneck/tests/data/test_157_A @@ -0,0 +1,4 @@ +8 17 +7 9 +10 16 +1 9 diff --git a/bottleneck/tests/data/test_157_B b/bottleneck/tests/data/test_157_B new file mode 100644 index 0000000..da76a0c --- /dev/null +++ b/bottleneck/tests/data/test_157_B @@ -0,0 +1,4 @@ +9 11 +3 6 +0 3 +2 3 diff --git a/bottleneck/tests/data/test_158_A b/bottleneck/tests/data/test_158_A new file mode 100644 index 0000000..ec64dab --- /dev/null +++ b/bottleneck/tests/data/test_158_A @@ -0,0 +1,4 @@ +2 4 +9 15 +8 16 +8 11 diff --git a/bottleneck/tests/data/test_158_B b/bottleneck/tests/data/test_158_B new file mode 100644 index 0000000..407c843 --- /dev/null +++ b/bottleneck/tests/data/test_158_B @@ -0,0 +1,4 @@ +10 17 +10 15 +1 8 +10 17 diff --git a/bottleneck/tests/data/test_159_A b/bottleneck/tests/data/test_159_A new file mode 100644 index 0000000..bbf8d13 --- /dev/null +++ b/bottleneck/tests/data/test_159_A @@ -0,0 +1,4 @@ +9 13 +5 6 +3 6 +5 7 diff --git a/bottleneck/tests/data/test_159_B b/bottleneck/tests/data/test_159_B new file mode 100644 index 0000000..fbe6d45 --- /dev/null +++ b/bottleneck/tests/data/test_159_B @@ -0,0 +1,4 @@ +2 5 +4 5 +9 14 +10 11 diff --git a/bottleneck/tests/data/test_160_A b/bottleneck/tests/data/test_160_A new file mode 100644 index 0000000..c712c5a --- /dev/null +++ b/bottleneck/tests/data/test_160_A @@ -0,0 +1,5 @@ +3 10 +1 10 +5 15 +0 9 +8 9 diff --git a/bottleneck/tests/data/test_160_B b/bottleneck/tests/data/test_160_B new file mode 100644 index 0000000..90edf6f --- /dev/null +++ b/bottleneck/tests/data/test_160_B @@ -0,0 +1,5 @@ +3 11 +0 8 +0 3 +4 7 +1 11 diff --git a/bottleneck/tests/data/test_161_A b/bottleneck/tests/data/test_161_A new file mode 100644 index 0000000..4cbae18 --- /dev/null +++ b/bottleneck/tests/data/test_161_A @@ -0,0 +1,5 @@ +9 11 +8 10 +3 6 +4 14 +5 10 diff --git a/bottleneck/tests/data/test_161_B b/bottleneck/tests/data/test_161_B new file mode 100644 index 0000000..e166afb --- /dev/null +++ b/bottleneck/tests/data/test_161_B @@ -0,0 +1,5 @@ +0 3 +8 14 +8 13 +0 2 +1 2 diff --git a/bottleneck/tests/data/test_162_A b/bottleneck/tests/data/test_162_A new file mode 100644 index 0000000..e16e9a3 --- /dev/null +++ b/bottleneck/tests/data/test_162_A @@ -0,0 +1,5 @@ +4 5 +7 17 +4 8 +10 16 +4 7 diff --git a/bottleneck/tests/data/test_162_B b/bottleneck/tests/data/test_162_B new file mode 100644 index 0000000..78ab6a3 --- /dev/null +++ b/bottleneck/tests/data/test_162_B @@ -0,0 +1,5 @@ +6 14 +9 10 +1 9 +7 17 +7 8 diff --git a/bottleneck/tests/data/test_163_A b/bottleneck/tests/data/test_163_A new file mode 100644 index 0000000..6836e59 --- /dev/null +++ b/bottleneck/tests/data/test_163_A @@ -0,0 +1,5 @@ +6 12 +6 11 +7 15 +9 11 +1 6 diff --git a/bottleneck/tests/data/test_163_B b/bottleneck/tests/data/test_163_B new file mode 100644 index 0000000..9d9e6e2 --- /dev/null +++ b/bottleneck/tests/data/test_163_B @@ -0,0 +1,5 @@ +0 6 +1 11 +2 3 +7 14 +7 10 diff --git a/bottleneck/tests/data/test_164_A b/bottleneck/tests/data/test_164_A new file mode 100644 index 0000000..a4187bd --- /dev/null +++ b/bottleneck/tests/data/test_164_A @@ -0,0 +1,5 @@ +0 2 +6 14 +7 16 +9 10 +2 6 diff --git a/bottleneck/tests/data/test_164_B b/bottleneck/tests/data/test_164_B new file mode 100644 index 0000000..8597409 --- /dev/null +++ b/bottleneck/tests/data/test_164_B @@ -0,0 +1,5 @@ +2 10 +5 13 +4 13 +4 6 +8 16 diff --git a/bottleneck/tests/data/test_165_A b/bottleneck/tests/data/test_165_A new file mode 100644 index 0000000..15b9f15 --- /dev/null +++ b/bottleneck/tests/data/test_165_A @@ -0,0 +1,5 @@ +1 9 +6 15 +6 7 +10 18 +6 7 diff --git a/bottleneck/tests/data/test_165_B b/bottleneck/tests/data/test_165_B new file mode 100644 index 0000000..8056eab --- /dev/null +++ b/bottleneck/tests/data/test_165_B @@ -0,0 +1,5 @@ +8 15 +3 13 +8 17 +1 9 +9 18 diff --git a/bottleneck/tests/data/test_166_A b/bottleneck/tests/data/test_166_A new file mode 100644 index 0000000..8257649 --- /dev/null +++ b/bottleneck/tests/data/test_166_A @@ -0,0 +1,5 @@ +2 10 +4 12 +0 4 +10 18 +3 11 diff --git a/bottleneck/tests/data/test_166_B b/bottleneck/tests/data/test_166_B new file mode 100644 index 0000000..02499eb --- /dev/null +++ b/bottleneck/tests/data/test_166_B @@ -0,0 +1,5 @@ +0 6 +6 16 +3 11 +10 19 +5 15 diff --git a/bottleneck/tests/data/test_167_A b/bottleneck/tests/data/test_167_A new file mode 100644 index 0000000..416f645 --- /dev/null +++ b/bottleneck/tests/data/test_167_A @@ -0,0 +1,5 @@ +4 7 +0 5 +1 9 +7 8 +4 10 diff --git a/bottleneck/tests/data/test_167_B b/bottleneck/tests/data/test_167_B new file mode 100644 index 0000000..2ab78e5 --- /dev/null +++ b/bottleneck/tests/data/test_167_B @@ -0,0 +1,5 @@ +3 13 +3 13 +4 12 +4 13 +3 10 diff --git a/bottleneck/tests/data/test_168_A b/bottleneck/tests/data/test_168_A new file mode 100644 index 0000000..57f9e66 --- /dev/null +++ b/bottleneck/tests/data/test_168_A @@ -0,0 +1,5 @@ +9 10 +3 8 +7 17 +10 11 +5 7 diff --git a/bottleneck/tests/data/test_168_B b/bottleneck/tests/data/test_168_B new file mode 100644 index 0000000..6d5d9c5 --- /dev/null +++ b/bottleneck/tests/data/test_168_B @@ -0,0 +1,5 @@ +10 18 +1 9 +4 9 +4 14 +8 14 diff --git a/bottleneck/tests/data/test_169_A b/bottleneck/tests/data/test_169_A new file mode 100644 index 0000000..7db2396 --- /dev/null +++ b/bottleneck/tests/data/test_169_A @@ -0,0 +1,5 @@ +9 12 +10 14 +10 17 +5 6 +4 5 diff --git a/bottleneck/tests/data/test_169_B b/bottleneck/tests/data/test_169_B new file mode 100644 index 0000000..58d7cec --- /dev/null +++ b/bottleneck/tests/data/test_169_B @@ -0,0 +1,5 @@ +0 2 +9 10 +4 11 +10 13 +2 5 diff --git a/bottleneck/tests/data/test_170_A b/bottleneck/tests/data/test_170_A new file mode 100644 index 0000000..7d30592 --- /dev/null +++ b/bottleneck/tests/data/test_170_A @@ -0,0 +1,5 @@ +5 11 +8 14 +6 13 +1 11 +6 15 diff --git a/bottleneck/tests/data/test_170_B b/bottleneck/tests/data/test_170_B new file mode 100644 index 0000000..86d8ccc --- /dev/null +++ b/bottleneck/tests/data/test_170_B @@ -0,0 +1,5 @@ +1 3 +1 3 +4 7 +7 15 +5 13 diff --git a/bottleneck/tests/data/test_171_A b/bottleneck/tests/data/test_171_A new file mode 100644 index 0000000..30ce17c --- /dev/null +++ b/bottleneck/tests/data/test_171_A @@ -0,0 +1,5 @@ +0 7 +3 5 +4 14 +8 14 +3 12 diff --git a/bottleneck/tests/data/test_171_B b/bottleneck/tests/data/test_171_B new file mode 100644 index 0000000..487dcb5 --- /dev/null +++ b/bottleneck/tests/data/test_171_B @@ -0,0 +1,5 @@ +7 13 +3 7 +0 5 +4 14 +5 12 diff --git a/bottleneck/tests/data/test_172_A b/bottleneck/tests/data/test_172_A new file mode 100644 index 0000000..69232cf --- /dev/null +++ b/bottleneck/tests/data/test_172_A @@ -0,0 +1,5 @@ +3 4 +7 10 +8 14 +9 11 +2 12 diff --git a/bottleneck/tests/data/test_172_B b/bottleneck/tests/data/test_172_B new file mode 100644 index 0000000..1ab31ab --- /dev/null +++ b/bottleneck/tests/data/test_172_B @@ -0,0 +1,5 @@ +7 9 +8 10 +9 13 +3 9 +3 7 diff --git a/bottleneck/tests/data/test_173_A b/bottleneck/tests/data/test_173_A new file mode 100644 index 0000000..d88d368 --- /dev/null +++ b/bottleneck/tests/data/test_173_A @@ -0,0 +1,5 @@ +5 8 +7 9 +7 11 +1 9 +5 6 diff --git a/bottleneck/tests/data/test_173_B b/bottleneck/tests/data/test_173_B new file mode 100644 index 0000000..a331c9c --- /dev/null +++ b/bottleneck/tests/data/test_173_B @@ -0,0 +1,5 @@ +1 5 +6 9 +2 5 +1 4 +6 10 diff --git a/bottleneck/tests/data/test_174_A b/bottleneck/tests/data/test_174_A new file mode 100644 index 0000000..a97b65b --- /dev/null +++ b/bottleneck/tests/data/test_174_A @@ -0,0 +1,5 @@ +4 14 +2 7 +9 19 +6 9 +0 2 diff --git a/bottleneck/tests/data/test_174_B b/bottleneck/tests/data/test_174_B new file mode 100644 index 0000000..98da402 --- /dev/null +++ b/bottleneck/tests/data/test_174_B @@ -0,0 +1,5 @@ +4 11 +10 17 +7 8 +0 8 +3 9 diff --git a/bottleneck/tests/data/test_175_A b/bottleneck/tests/data/test_175_A new file mode 100644 index 0000000..dc8bedd --- /dev/null +++ b/bottleneck/tests/data/test_175_A @@ -0,0 +1,5 @@ +8 11 +5 11 +7 13 +8 14 +4 12 diff --git a/bottleneck/tests/data/test_175_B b/bottleneck/tests/data/test_175_B new file mode 100644 index 0000000..b5bd41f --- /dev/null +++ b/bottleneck/tests/data/test_175_B @@ -0,0 +1,5 @@ +4 12 +10 20 +10 20 +3 13 +9 16 diff --git a/bottleneck/tests/data/test_176_A b/bottleneck/tests/data/test_176_A new file mode 100644 index 0000000..dff782a --- /dev/null +++ b/bottleneck/tests/data/test_176_A @@ -0,0 +1,5 @@ +10 13 +9 10 +8 15 +5 9 +5 13 diff --git a/bottleneck/tests/data/test_176_B b/bottleneck/tests/data/test_176_B new file mode 100644 index 0000000..8724366 --- /dev/null +++ b/bottleneck/tests/data/test_176_B @@ -0,0 +1,5 @@ +2 8 +6 7 +0 9 +5 11 +4 12 diff --git a/bottleneck/tests/data/test_177_A b/bottleneck/tests/data/test_177_A new file mode 100644 index 0000000..556caf8 --- /dev/null +++ b/bottleneck/tests/data/test_177_A @@ -0,0 +1,5 @@ +4 7 +2 3 +6 7 +2 4 +0 7 diff --git a/bottleneck/tests/data/test_177_B b/bottleneck/tests/data/test_177_B new file mode 100644 index 0000000..91583a5 --- /dev/null +++ b/bottleneck/tests/data/test_177_B @@ -0,0 +1,5 @@ +8 17 +10 13 +4 6 +3 8 +0 5 diff --git a/bottleneck/tests/data/test_178_A b/bottleneck/tests/data/test_178_A new file mode 100644 index 0000000..e223edb --- /dev/null +++ b/bottleneck/tests/data/test_178_A @@ -0,0 +1,5 @@ +2 3 +9 15 +8 10 +7 15 +5 11 diff --git a/bottleneck/tests/data/test_178_B b/bottleneck/tests/data/test_178_B new file mode 100644 index 0000000..2ab0b73 --- /dev/null +++ b/bottleneck/tests/data/test_178_B @@ -0,0 +1,5 @@ +10 17 +2 9 +0 9 +8 12 +4 14 diff --git a/bottleneck/tests/data/test_179_A b/bottleneck/tests/data/test_179_A new file mode 100644 index 0000000..7b11730 --- /dev/null +++ b/bottleneck/tests/data/test_179_A @@ -0,0 +1,5 @@ +3 13 +5 14 +7 14 +3 11 +10 15 diff --git a/bottleneck/tests/data/test_179_B b/bottleneck/tests/data/test_179_B new file mode 100644 index 0000000..e160b9f --- /dev/null +++ b/bottleneck/tests/data/test_179_B @@ -0,0 +1,5 @@ +2 9 +2 10 +1 4 +3 6 +0 7 diff --git a/bottleneck/tests/data/test_180_A b/bottleneck/tests/data/test_180_A new file mode 100644 index 0000000..a830fb1 --- /dev/null +++ b/bottleneck/tests/data/test_180_A @@ -0,0 +1,6 @@ +9 19 +6 7 +9 17 +0 3 +7 8 +8 14 diff --git a/bottleneck/tests/data/test_180_B b/bottleneck/tests/data/test_180_B new file mode 100644 index 0000000..0ed2108 --- /dev/null +++ b/bottleneck/tests/data/test_180_B @@ -0,0 +1,6 @@ +0 10 +1 11 +10 12 +5 6 +10 16 +5 14 diff --git a/bottleneck/tests/data/test_181_A b/bottleneck/tests/data/test_181_A new file mode 100644 index 0000000..e29de9c --- /dev/null +++ b/bottleneck/tests/data/test_181_A @@ -0,0 +1,6 @@ +1 4 +1 2 +9 19 +3 6 +8 11 +4 8 diff --git a/bottleneck/tests/data/test_181_B b/bottleneck/tests/data/test_181_B new file mode 100644 index 0000000..dacaa51 --- /dev/null +++ b/bottleneck/tests/data/test_181_B @@ -0,0 +1,6 @@ +6 11 +8 15 +8 12 +10 11 +4 7 +5 10 diff --git a/bottleneck/tests/data/test_182_A b/bottleneck/tests/data/test_182_A new file mode 100644 index 0000000..e545af0 --- /dev/null +++ b/bottleneck/tests/data/test_182_A @@ -0,0 +1,6 @@ +8 10 +2 6 +6 14 +5 6 +6 7 +0 2 diff --git a/bottleneck/tests/data/test_182_B b/bottleneck/tests/data/test_182_B new file mode 100644 index 0000000..ffee041 --- /dev/null +++ b/bottleneck/tests/data/test_182_B @@ -0,0 +1,6 @@ +8 11 +6 8 +0 5 +7 13 +6 9 +10 19 diff --git a/bottleneck/tests/data/test_183_A b/bottleneck/tests/data/test_183_A new file mode 100644 index 0000000..0681b8d --- /dev/null +++ b/bottleneck/tests/data/test_183_A @@ -0,0 +1,6 @@ +8 13 +5 7 +1 5 +5 11 +3 7 +0 3 diff --git a/bottleneck/tests/data/test_183_B b/bottleneck/tests/data/test_183_B new file mode 100644 index 0000000..da3af74 --- /dev/null +++ b/bottleneck/tests/data/test_183_B @@ -0,0 +1,6 @@ +10 20 +6 11 +9 10 +1 4 +0 8 +7 14 diff --git a/bottleneck/tests/data/test_184_A b/bottleneck/tests/data/test_184_A new file mode 100644 index 0000000..a252760 --- /dev/null +++ b/bottleneck/tests/data/test_184_A @@ -0,0 +1,6 @@ +3 7 +1 10 +2 5 +0 5 +1 4 +2 3 diff --git a/bottleneck/tests/data/test_184_B b/bottleneck/tests/data/test_184_B new file mode 100644 index 0000000..788be62 --- /dev/null +++ b/bottleneck/tests/data/test_184_B @@ -0,0 +1,6 @@ +8 14 +10 11 +3 5 +5 9 +6 8 +9 10 diff --git a/bottleneck/tests/data/test_185_A b/bottleneck/tests/data/test_185_A new file mode 100644 index 0000000..8922d7a --- /dev/null +++ b/bottleneck/tests/data/test_185_A @@ -0,0 +1,6 @@ +4 10 +8 10 +5 9 +9 13 +9 18 +8 14 diff --git a/bottleneck/tests/data/test_185_B b/bottleneck/tests/data/test_185_B new file mode 100644 index 0000000..fc90091 --- /dev/null +++ b/bottleneck/tests/data/test_185_B @@ -0,0 +1,6 @@ +0 10 +4 5 +3 10 +1 11 +4 9 +4 14 diff --git a/bottleneck/tests/data/test_186_A b/bottleneck/tests/data/test_186_A new file mode 100644 index 0000000..894dc49 --- /dev/null +++ b/bottleneck/tests/data/test_186_A @@ -0,0 +1,6 @@ +1 8 +10 11 +3 10 +8 9 +3 13 +9 13 diff --git a/bottleneck/tests/data/test_186_B b/bottleneck/tests/data/test_186_B new file mode 100644 index 0000000..c0b49c0 --- /dev/null +++ b/bottleneck/tests/data/test_186_B @@ -0,0 +1,6 @@ +6 15 +8 9 +4 7 +0 10 +1 9 +1 2 diff --git a/bottleneck/tests/data/test_187_A b/bottleneck/tests/data/test_187_A new file mode 100644 index 0000000..f2181af --- /dev/null +++ b/bottleneck/tests/data/test_187_A @@ -0,0 +1,6 @@ +9 11 +8 11 +10 11 +3 8 +7 17 +3 5 diff --git a/bottleneck/tests/data/test_187_B b/bottleneck/tests/data/test_187_B new file mode 100644 index 0000000..ab13d0f --- /dev/null +++ b/bottleneck/tests/data/test_187_B @@ -0,0 +1,6 @@ +6 10 +10 19 +5 11 +6 13 +10 16 +10 20 diff --git a/bottleneck/tests/data/test_188_A b/bottleneck/tests/data/test_188_A new file mode 100644 index 0000000..8290582 --- /dev/null +++ b/bottleneck/tests/data/test_188_A @@ -0,0 +1,6 @@ +4 9 +10 20 +0 4 +5 6 +8 9 +5 6 diff --git a/bottleneck/tests/data/test_188_B b/bottleneck/tests/data/test_188_B new file mode 100644 index 0000000..6acfc2e --- /dev/null +++ b/bottleneck/tests/data/test_188_B @@ -0,0 +1,6 @@ +9 19 +6 11 +0 2 +5 12 +3 11 +7 11 diff --git a/bottleneck/tests/data/test_189_A b/bottleneck/tests/data/test_189_A new file mode 100644 index 0000000..468967c --- /dev/null +++ b/bottleneck/tests/data/test_189_A @@ -0,0 +1,6 @@ +8 11 +4 8 +6 7 +9 15 +10 11 +2 3 diff --git a/bottleneck/tests/data/test_189_B b/bottleneck/tests/data/test_189_B new file mode 100644 index 0000000..299edf6 --- /dev/null +++ b/bottleneck/tests/data/test_189_B @@ -0,0 +1,6 @@ +6 10 +2 6 +2 9 +1 3 +7 10 +8 15 diff --git a/bottleneck/tests/data/test_190_A b/bottleneck/tests/data/test_190_A new file mode 100644 index 0000000..01b3e3c --- /dev/null +++ b/bottleneck/tests/data/test_190_A @@ -0,0 +1,6 @@ +8 17 +9 10 +1 3 +9 16 +7 10 +8 14 diff --git a/bottleneck/tests/data/test_190_B b/bottleneck/tests/data/test_190_B new file mode 100644 index 0000000..26d2d2a --- /dev/null +++ b/bottleneck/tests/data/test_190_B @@ -0,0 +1,6 @@ +8 9 +10 15 +10 12 +8 14 +4 5 +4 10 diff --git a/bottleneck/tests/data/test_191_A b/bottleneck/tests/data/test_191_A new file mode 100644 index 0000000..e89e4b8 --- /dev/null +++ b/bottleneck/tests/data/test_191_A @@ -0,0 +1,6 @@ +10 15 +2 7 +9 16 +6 14 +6 12 +4 13 diff --git a/bottleneck/tests/data/test_191_B b/bottleneck/tests/data/test_191_B new file mode 100644 index 0000000..80022bc --- /dev/null +++ b/bottleneck/tests/data/test_191_B @@ -0,0 +1,6 @@ +8 18 +5 11 +2 7 +7 16 +6 9 +7 17 diff --git a/bottleneck/tests/data/test_192_A b/bottleneck/tests/data/test_192_A new file mode 100644 index 0000000..8e0e64f --- /dev/null +++ b/bottleneck/tests/data/test_192_A @@ -0,0 +1,6 @@ +9 15 +1 9 +2 11 +1 8 +9 11 +7 8 diff --git a/bottleneck/tests/data/test_192_B b/bottleneck/tests/data/test_192_B new file mode 100644 index 0000000..dcfe162 --- /dev/null +++ b/bottleneck/tests/data/test_192_B @@ -0,0 +1,6 @@ +8 16 +10 17 +8 9 +2 9 +2 12 +7 11 diff --git a/bottleneck/tests/data/test_193_A b/bottleneck/tests/data/test_193_A new file mode 100644 index 0000000..6c2bcc8 --- /dev/null +++ b/bottleneck/tests/data/test_193_A @@ -0,0 +1,6 @@ +5 10 +4 13 +6 7 +7 8 +7 8 +6 12 diff --git a/bottleneck/tests/data/test_193_B b/bottleneck/tests/data/test_193_B new file mode 100644 index 0000000..fb271c9 --- /dev/null +++ b/bottleneck/tests/data/test_193_B @@ -0,0 +1,6 @@ +7 12 +2 5 +9 18 +1 6 +7 16 +1 5 diff --git a/bottleneck/tests/data/test_194_A b/bottleneck/tests/data/test_194_A new file mode 100644 index 0000000..2de1094 --- /dev/null +++ b/bottleneck/tests/data/test_194_A @@ -0,0 +1,6 @@ +9 14 +7 12 +3 10 +1 9 +3 10 +0 1 diff --git a/bottleneck/tests/data/test_194_B b/bottleneck/tests/data/test_194_B new file mode 100644 index 0000000..5879993 --- /dev/null +++ b/bottleneck/tests/data/test_194_B @@ -0,0 +1,6 @@ +6 15 +4 9 +3 7 +2 3 +0 2 +2 12 diff --git a/bottleneck/tests/data/test_195_A b/bottleneck/tests/data/test_195_A new file mode 100644 index 0000000..d109838 --- /dev/null +++ b/bottleneck/tests/data/test_195_A @@ -0,0 +1,6 @@ +0 9 +7 8 +9 15 +2 6 +3 8 +9 15 diff --git a/bottleneck/tests/data/test_195_B b/bottleneck/tests/data/test_195_B new file mode 100644 index 0000000..6c66513 --- /dev/null +++ b/bottleneck/tests/data/test_195_B @@ -0,0 +1,6 @@ +3 9 +2 3 +3 10 +7 16 +4 7 +1 6 diff --git a/bottleneck/tests/data/test_196_A b/bottleneck/tests/data/test_196_A new file mode 100644 index 0000000..4094acd --- /dev/null +++ b/bottleneck/tests/data/test_196_A @@ -0,0 +1,6 @@ +6 8 +8 12 +0 4 +3 11 +4 14 +9 14 diff --git a/bottleneck/tests/data/test_196_B b/bottleneck/tests/data/test_196_B new file mode 100644 index 0000000..e5ed3ad --- /dev/null +++ b/bottleneck/tests/data/test_196_B @@ -0,0 +1,6 @@ +4 10 +2 3 +7 8 +2 8 +5 12 +9 10 diff --git a/bottleneck/tests/data/test_197_A b/bottleneck/tests/data/test_197_A new file mode 100644 index 0000000..771897b --- /dev/null +++ b/bottleneck/tests/data/test_197_A @@ -0,0 +1,6 @@ +4 10 +9 11 +0 6 +4 8 +9 14 +9 14 diff --git a/bottleneck/tests/data/test_197_B b/bottleneck/tests/data/test_197_B new file mode 100644 index 0000000..1cfe6aa --- /dev/null +++ b/bottleneck/tests/data/test_197_B @@ -0,0 +1,6 @@ +7 13 +6 7 +5 11 +3 13 +6 14 +10 15 diff --git a/bottleneck/tests/data/test_198_A b/bottleneck/tests/data/test_198_A new file mode 100644 index 0000000..6966ac4 --- /dev/null +++ b/bottleneck/tests/data/test_198_A @@ -0,0 +1,6 @@ +10 17 +3 7 +7 8 +9 15 +0 3 +10 20 diff --git a/bottleneck/tests/data/test_198_B b/bottleneck/tests/data/test_198_B new file mode 100644 index 0000000..6e9d9d4 --- /dev/null +++ b/bottleneck/tests/data/test_198_B @@ -0,0 +1,6 @@ +3 11 +4 7 +6 15 +8 15 +7 10 +2 10 diff --git a/bottleneck/tests/data/test_199_A b/bottleneck/tests/data/test_199_A new file mode 100644 index 0000000..8556563 --- /dev/null +++ b/bottleneck/tests/data/test_199_A @@ -0,0 +1,6 @@ +7 17 +3 13 +10 15 +9 17 +7 8 +5 14 diff --git a/bottleneck/tests/data/test_199_B b/bottleneck/tests/data/test_199_B new file mode 100644 index 0000000..a43e0df --- /dev/null +++ b/bottleneck/tests/data/test_199_B @@ -0,0 +1,6 @@ +7 17 +7 17 +9 14 +4 13 +1 8 +1 10 diff --git a/bottleneck/tests/data/test_200_A b/bottleneck/tests/data/test_200_A new file mode 100644 index 0000000..b0a7fbd --- /dev/null +++ b/bottleneck/tests/data/test_200_A @@ -0,0 +1,7 @@ +9 10 +0 10 +7 8 +1 6 +8 14 +0 3 +6 9 diff --git a/bottleneck/tests/data/test_200_B b/bottleneck/tests/data/test_200_B new file mode 100644 index 0000000..fcbab9a --- /dev/null +++ b/bottleneck/tests/data/test_200_B @@ -0,0 +1,7 @@ +2 7 +0 7 +2 4 +8 12 +7 12 +10 16 +5 6 diff --git a/bottleneck/tests/data/test_201_A b/bottleneck/tests/data/test_201_A new file mode 100644 index 0000000..07d880d --- /dev/null +++ b/bottleneck/tests/data/test_201_A @@ -0,0 +1,7 @@ +4 5 +1 7 +0 8 +4 5 +9 14 +8 9 +2 10 diff --git a/bottleneck/tests/data/test_201_B b/bottleneck/tests/data/test_201_B new file mode 100644 index 0000000..70b22f4 --- /dev/null +++ b/bottleneck/tests/data/test_201_B @@ -0,0 +1,7 @@ +5 6 +6 16 +1 2 +2 3 +4 12 +6 15 +8 18 diff --git a/bottleneck/tests/data/test_202_A b/bottleneck/tests/data/test_202_A new file mode 100644 index 0000000..b8fe1b9 --- /dev/null +++ b/bottleneck/tests/data/test_202_A @@ -0,0 +1,7 @@ +0 6 +4 14 +9 10 +9 18 +5 12 +5 12 +1 7 diff --git a/bottleneck/tests/data/test_202_B b/bottleneck/tests/data/test_202_B new file mode 100644 index 0000000..ee6e2e0 --- /dev/null +++ b/bottleneck/tests/data/test_202_B @@ -0,0 +1,7 @@ +5 6 +7 17 +1 6 +3 11 +7 15 +10 20 +3 4 diff --git a/bottleneck/tests/data/test_203_A b/bottleneck/tests/data/test_203_A new file mode 100644 index 0000000..71a1737 --- /dev/null +++ b/bottleneck/tests/data/test_203_A @@ -0,0 +1,7 @@ +4 9 +10 20 +5 9 +0 9 +0 8 +5 9 +0 10 diff --git a/bottleneck/tests/data/test_203_B b/bottleneck/tests/data/test_203_B new file mode 100644 index 0000000..d217cda --- /dev/null +++ b/bottleneck/tests/data/test_203_B @@ -0,0 +1,7 @@ +3 12 +1 9 +9 17 +7 14 +6 10 +10 20 +7 12 diff --git a/bottleneck/tests/data/test_204_A b/bottleneck/tests/data/test_204_A new file mode 100644 index 0000000..011da68 --- /dev/null +++ b/bottleneck/tests/data/test_204_A @@ -0,0 +1,7 @@ +9 14 +2 3 +9 14 +6 7 +2 3 +6 13 +10 11 diff --git a/bottleneck/tests/data/test_204_B b/bottleneck/tests/data/test_204_B new file mode 100644 index 0000000..c5d6236 --- /dev/null +++ b/bottleneck/tests/data/test_204_B @@ -0,0 +1,7 @@ +9 10 +0 4 +4 7 +8 15 +8 9 +7 10 +10 11 diff --git a/bottleneck/tests/data/test_205_A b/bottleneck/tests/data/test_205_A new file mode 100644 index 0000000..d082be1 --- /dev/null +++ b/bottleneck/tests/data/test_205_A @@ -0,0 +1,7 @@ +8 17 +9 12 +2 11 +0 8 +10 11 +0 7 +8 18 diff --git a/bottleneck/tests/data/test_205_B b/bottleneck/tests/data/test_205_B new file mode 100644 index 0000000..30a242c --- /dev/null +++ b/bottleneck/tests/data/test_205_B @@ -0,0 +1,7 @@ +10 17 +9 18 +6 11 +6 7 +10 17 +3 13 +8 17 diff --git a/bottleneck/tests/data/test_206_A b/bottleneck/tests/data/test_206_A new file mode 100644 index 0000000..15ee45b --- /dev/null +++ b/bottleneck/tests/data/test_206_A @@ -0,0 +1,7 @@ +5 7 +8 17 +4 7 +7 17 +9 11 +0 8 +9 10 diff --git a/bottleneck/tests/data/test_206_B b/bottleneck/tests/data/test_206_B new file mode 100644 index 0000000..f8c89ef --- /dev/null +++ b/bottleneck/tests/data/test_206_B @@ -0,0 +1,7 @@ +5 15 +9 17 +10 13 +6 13 +0 6 +10 16 +8 15 diff --git a/bottleneck/tests/data/test_207_A b/bottleneck/tests/data/test_207_A new file mode 100644 index 0000000..2015b9e --- /dev/null +++ b/bottleneck/tests/data/test_207_A @@ -0,0 +1,7 @@ +4 9 +9 17 +9 10 +9 15 +2 3 +8 13 +9 13 diff --git a/bottleneck/tests/data/test_207_B b/bottleneck/tests/data/test_207_B new file mode 100644 index 0000000..036a8ca --- /dev/null +++ b/bottleneck/tests/data/test_207_B @@ -0,0 +1,7 @@ +10 18 +1 3 +10 15 +5 14 +7 15 +0 1 +10 13 diff --git a/bottleneck/tests/data/test_208_A b/bottleneck/tests/data/test_208_A new file mode 100644 index 0000000..a1e6af4 --- /dev/null +++ b/bottleneck/tests/data/test_208_A @@ -0,0 +1,7 @@ +6 14 +2 7 +6 16 +7 14 +8 13 +2 5 +5 9 diff --git a/bottleneck/tests/data/test_208_B b/bottleneck/tests/data/test_208_B new file mode 100644 index 0000000..f21e91b --- /dev/null +++ b/bottleneck/tests/data/test_208_B @@ -0,0 +1,7 @@ +3 10 +8 16 +2 11 +10 18 +2 6 +3 7 +3 8 diff --git a/bottleneck/tests/data/test_209_A b/bottleneck/tests/data/test_209_A new file mode 100644 index 0000000..545aae9 --- /dev/null +++ b/bottleneck/tests/data/test_209_A @@ -0,0 +1,7 @@ +10 18 +5 8 +4 7 +10 16 +4 10 +2 9 +1 6 diff --git a/bottleneck/tests/data/test_209_B b/bottleneck/tests/data/test_209_B new file mode 100644 index 0000000..2cf3171 --- /dev/null +++ b/bottleneck/tests/data/test_209_B @@ -0,0 +1,7 @@ +10 11 +1 2 +0 6 +10 11 +9 11 +10 17 +1 2 diff --git a/bottleneck/tests/data/test_210_A b/bottleneck/tests/data/test_210_A new file mode 100644 index 0000000..799debc --- /dev/null +++ b/bottleneck/tests/data/test_210_A @@ -0,0 +1,7 @@ +1 3 +6 7 +10 11 +7 16 +4 5 +2 5 +10 18 diff --git a/bottleneck/tests/data/test_210_B b/bottleneck/tests/data/test_210_B new file mode 100644 index 0000000..7cb0519 --- /dev/null +++ b/bottleneck/tests/data/test_210_B @@ -0,0 +1,7 @@ +3 7 +5 13 +6 11 +0 10 +10 18 +8 9 +1 4 diff --git a/bottleneck/tests/data/test_211_A b/bottleneck/tests/data/test_211_A new file mode 100644 index 0000000..6715acb --- /dev/null +++ b/bottleneck/tests/data/test_211_A @@ -0,0 +1,7 @@ +9 15 +1 5 +10 11 +2 6 +6 8 +2 9 +8 11 diff --git a/bottleneck/tests/data/test_211_B b/bottleneck/tests/data/test_211_B new file mode 100644 index 0000000..9c7890f --- /dev/null +++ b/bottleneck/tests/data/test_211_B @@ -0,0 +1,7 @@ +5 7 +3 9 +1 3 +1 2 +4 5 +4 7 +3 7 diff --git a/bottleneck/tests/data/test_212_A b/bottleneck/tests/data/test_212_A new file mode 100644 index 0000000..e3d327a --- /dev/null +++ b/bottleneck/tests/data/test_212_A @@ -0,0 +1,7 @@ +3 6 +8 12 +7 15 +6 11 +9 16 +4 8 +7 12 diff --git a/bottleneck/tests/data/test_212_B b/bottleneck/tests/data/test_212_B new file mode 100644 index 0000000..ee57410 --- /dev/null +++ b/bottleneck/tests/data/test_212_B @@ -0,0 +1,7 @@ +9 17 +1 2 +10 17 +1 10 +5 8 +5 7 +7 10 diff --git a/bottleneck/tests/data/test_213_A b/bottleneck/tests/data/test_213_A new file mode 100644 index 0000000..4b904df --- /dev/null +++ b/bottleneck/tests/data/test_213_A @@ -0,0 +1,7 @@ +4 8 +0 2 +0 7 +0 4 +6 15 +8 14 +3 10 diff --git a/bottleneck/tests/data/test_213_B b/bottleneck/tests/data/test_213_B new file mode 100644 index 0000000..f5188b4 --- /dev/null +++ b/bottleneck/tests/data/test_213_B @@ -0,0 +1,7 @@ +8 9 +8 13 +9 10 +2 12 +4 7 +7 8 +3 12 diff --git a/bottleneck/tests/data/test_214_A b/bottleneck/tests/data/test_214_A new file mode 100644 index 0000000..3914579 --- /dev/null +++ b/bottleneck/tests/data/test_214_A @@ -0,0 +1,7 @@ +4 10 +7 8 +8 15 +1 4 +6 13 +8 15 +8 9 diff --git a/bottleneck/tests/data/test_214_B b/bottleneck/tests/data/test_214_B new file mode 100644 index 0000000..f75c54f --- /dev/null +++ b/bottleneck/tests/data/test_214_B @@ -0,0 +1,7 @@ +5 12 +2 12 +5 10 +1 8 +10 19 +0 6 +3 9 diff --git a/bottleneck/tests/data/test_215_A b/bottleneck/tests/data/test_215_A new file mode 100644 index 0000000..a8d6070 --- /dev/null +++ b/bottleneck/tests/data/test_215_A @@ -0,0 +1,7 @@ +3 4 +4 5 +3 9 +7 15 +9 12 +1 2 +4 12 diff --git a/bottleneck/tests/data/test_215_B b/bottleneck/tests/data/test_215_B new file mode 100644 index 0000000..d956b59 --- /dev/null +++ b/bottleneck/tests/data/test_215_B @@ -0,0 +1,7 @@ +4 13 +5 7 +2 6 +9 12 +0 6 +0 1 +6 12 diff --git a/bottleneck/tests/data/test_216_A b/bottleneck/tests/data/test_216_A new file mode 100644 index 0000000..67c5e86 --- /dev/null +++ b/bottleneck/tests/data/test_216_A @@ -0,0 +1,7 @@ +10 13 +10 17 +5 10 +4 6 +9 12 +6 9 +2 6 diff --git a/bottleneck/tests/data/test_216_B b/bottleneck/tests/data/test_216_B new file mode 100644 index 0000000..802850d --- /dev/null +++ b/bottleneck/tests/data/test_216_B @@ -0,0 +1,7 @@ +3 9 +9 13 +1 2 +4 13 +1 8 +0 2 +1 2 diff --git a/bottleneck/tests/data/test_217_A b/bottleneck/tests/data/test_217_A new file mode 100644 index 0000000..a37f46d --- /dev/null +++ b/bottleneck/tests/data/test_217_A @@ -0,0 +1,7 @@ +3 7 +1 4 +3 8 +1 2 +1 3 +8 9 +5 14 diff --git a/bottleneck/tests/data/test_217_B b/bottleneck/tests/data/test_217_B new file mode 100644 index 0000000..4cac64e --- /dev/null +++ b/bottleneck/tests/data/test_217_B @@ -0,0 +1,7 @@ +3 12 +9 10 +9 10 +5 14 +0 8 +5 8 +2 5 diff --git a/bottleneck/tests/data/test_218_A b/bottleneck/tests/data/test_218_A new file mode 100644 index 0000000..7ca83bc --- /dev/null +++ b/bottleneck/tests/data/test_218_A @@ -0,0 +1,7 @@ +7 11 +6 14 +9 19 +6 8 +2 7 +4 8 +2 8 diff --git a/bottleneck/tests/data/test_218_B b/bottleneck/tests/data/test_218_B new file mode 100644 index 0000000..7c188f2 --- /dev/null +++ b/bottleneck/tests/data/test_218_B @@ -0,0 +1,7 @@ +2 4 +8 16 +3 13 +3 12 +1 11 +0 1 +5 7 diff --git a/bottleneck/tests/data/test_219_A b/bottleneck/tests/data/test_219_A new file mode 100644 index 0000000..275bc18 --- /dev/null +++ b/bottleneck/tests/data/test_219_A @@ -0,0 +1,7 @@ +3 4 +8 10 +5 6 +3 7 +9 12 +5 6 +0 1 diff --git a/bottleneck/tests/data/test_219_B b/bottleneck/tests/data/test_219_B new file mode 100644 index 0000000..be6ab2a --- /dev/null +++ b/bottleneck/tests/data/test_219_B @@ -0,0 +1,7 @@ +7 16 +1 2 +4 12 +9 17 +10 11 +9 14 +10 16 diff --git a/bottleneck/tests/data/test_220_A b/bottleneck/tests/data/test_220_A new file mode 100644 index 0000000..3b9ea09 --- /dev/null +++ b/bottleneck/tests/data/test_220_A @@ -0,0 +1,8 @@ +8 18 +6 9 +7 12 +8 14 +7 8 +4 11 +9 18 +4 8 diff --git a/bottleneck/tests/data/test_220_B b/bottleneck/tests/data/test_220_B new file mode 100644 index 0000000..8e97d15 --- /dev/null +++ b/bottleneck/tests/data/test_220_B @@ -0,0 +1,8 @@ +9 19 +5 9 +8 9 +2 10 +3 9 +2 5 +6 15 +9 14 diff --git a/bottleneck/tests/data/test_221_A b/bottleneck/tests/data/test_221_A new file mode 100644 index 0000000..2e229a8 --- /dev/null +++ b/bottleneck/tests/data/test_221_A @@ -0,0 +1,8 @@ +9 17 +4 10 +3 5 +9 18 +3 10 +9 18 +5 12 +0 10 diff --git a/bottleneck/tests/data/test_221_B b/bottleneck/tests/data/test_221_B new file mode 100644 index 0000000..e3c3c1b --- /dev/null +++ b/bottleneck/tests/data/test_221_B @@ -0,0 +1,8 @@ +1 3 +1 2 +2 6 +10 19 +4 14 +10 18 +4 9 +9 19 diff --git a/bottleneck/tests/data/test_222_A b/bottleneck/tests/data/test_222_A new file mode 100644 index 0000000..fcb6c7f --- /dev/null +++ b/bottleneck/tests/data/test_222_A @@ -0,0 +1,8 @@ +9 13 +6 10 +10 17 +9 14 +7 16 +2 4 +5 11 +10 13 diff --git a/bottleneck/tests/data/test_222_B b/bottleneck/tests/data/test_222_B new file mode 100644 index 0000000..512f188 --- /dev/null +++ b/bottleneck/tests/data/test_222_B @@ -0,0 +1,8 @@ +1 11 +0 1 +8 10 +0 6 +9 19 +3 4 +2 6 +9 10 diff --git a/bottleneck/tests/data/test_223_A b/bottleneck/tests/data/test_223_A new file mode 100644 index 0000000..6f6cef5 --- /dev/null +++ b/bottleneck/tests/data/test_223_A @@ -0,0 +1,8 @@ +0 8 +2 6 +3 13 +9 16 +4 7 +4 14 +7 17 +6 7 diff --git a/bottleneck/tests/data/test_223_B b/bottleneck/tests/data/test_223_B new file mode 100644 index 0000000..07803f6 --- /dev/null +++ b/bottleneck/tests/data/test_223_B @@ -0,0 +1,8 @@ +7 9 +3 10 +0 9 +0 1 +1 5 +2 8 +0 1 +10 18 diff --git a/bottleneck/tests/data/test_224_A b/bottleneck/tests/data/test_224_A new file mode 100644 index 0000000..f33d061 --- /dev/null +++ b/bottleneck/tests/data/test_224_A @@ -0,0 +1,8 @@ +5 12 +0 6 +5 11 +9 17 +9 10 +0 10 +0 4 +8 13 diff --git a/bottleneck/tests/data/test_224_B b/bottleneck/tests/data/test_224_B new file mode 100644 index 0000000..1b9ef36 --- /dev/null +++ b/bottleneck/tests/data/test_224_B @@ -0,0 +1,8 @@ +8 14 +3 13 +3 4 +9 19 +8 16 +5 9 +4 14 +2 4 diff --git a/bottleneck/tests/data/test_225_A b/bottleneck/tests/data/test_225_A new file mode 100644 index 0000000..cc0d576 --- /dev/null +++ b/bottleneck/tests/data/test_225_A @@ -0,0 +1,8 @@ +0 1 +9 17 +3 12 +9 19 +8 15 +7 15 +6 10 +1 10 diff --git a/bottleneck/tests/data/test_225_B b/bottleneck/tests/data/test_225_B new file mode 100644 index 0000000..b810b48 --- /dev/null +++ b/bottleneck/tests/data/test_225_B @@ -0,0 +1,8 @@ +8 11 +4 8 +8 14 +3 8 +2 10 +8 15 +5 14 +6 16 diff --git a/bottleneck/tests/data/test_226_A b/bottleneck/tests/data/test_226_A new file mode 100644 index 0000000..e39728a --- /dev/null +++ b/bottleneck/tests/data/test_226_A @@ -0,0 +1,8 @@ +10 12 +3 5 +10 13 +6 8 +8 14 +8 15 +8 17 +3 8 diff --git a/bottleneck/tests/data/test_226_B b/bottleneck/tests/data/test_226_B new file mode 100644 index 0000000..601abce --- /dev/null +++ b/bottleneck/tests/data/test_226_B @@ -0,0 +1,8 @@ +3 4 +9 19 +3 7 +9 10 +1 4 +7 12 +0 1 +4 13 diff --git a/bottleneck/tests/data/test_227_A b/bottleneck/tests/data/test_227_A new file mode 100644 index 0000000..e98b204 --- /dev/null +++ b/bottleneck/tests/data/test_227_A @@ -0,0 +1,8 @@ +10 11 +8 9 +2 8 +5 14 +6 16 +3 9 +7 8 +0 7 diff --git a/bottleneck/tests/data/test_227_B b/bottleneck/tests/data/test_227_B new file mode 100644 index 0000000..3d5a25e --- /dev/null +++ b/bottleneck/tests/data/test_227_B @@ -0,0 +1,8 @@ +7 8 +9 14 +2 7 +7 17 +5 13 +4 6 +3 4 +6 16 diff --git a/bottleneck/tests/data/test_228_A b/bottleneck/tests/data/test_228_A new file mode 100644 index 0000000..a3edeae --- /dev/null +++ b/bottleneck/tests/data/test_228_A @@ -0,0 +1,8 @@ +9 10 +1 6 +8 10 +0 9 +0 2 +7 13 +10 20 +1 10 diff --git a/bottleneck/tests/data/test_228_B b/bottleneck/tests/data/test_228_B new file mode 100644 index 0000000..64f78ac --- /dev/null +++ b/bottleneck/tests/data/test_228_B @@ -0,0 +1,8 @@ +4 6 +9 12 +5 11 +9 16 +8 9 +7 16 +4 10 +3 4 diff --git a/bottleneck/tests/data/test_229_A b/bottleneck/tests/data/test_229_A new file mode 100644 index 0000000..c832a04 --- /dev/null +++ b/bottleneck/tests/data/test_229_A @@ -0,0 +1,8 @@ +9 12 +1 10 +6 14 +4 9 +7 11 +3 12 +6 8 +4 12 diff --git a/bottleneck/tests/data/test_229_B b/bottleneck/tests/data/test_229_B new file mode 100644 index 0000000..0f232d0 --- /dev/null +++ b/bottleneck/tests/data/test_229_B @@ -0,0 +1,8 @@ +7 13 +2 11 +6 10 +6 10 +7 15 +10 14 +10 13 +10 14 diff --git a/bottleneck/tests/data/test_230_A b/bottleneck/tests/data/test_230_A new file mode 100644 index 0000000..11d75a8 --- /dev/null +++ b/bottleneck/tests/data/test_230_A @@ -0,0 +1,8 @@ +9 16 +3 5 +3 11 +0 7 +0 2 +10 16 +4 6 +8 16 diff --git a/bottleneck/tests/data/test_230_B b/bottleneck/tests/data/test_230_B new file mode 100644 index 0000000..f30b9d0 --- /dev/null +++ b/bottleneck/tests/data/test_230_B @@ -0,0 +1,8 @@ +4 11 +7 14 +8 17 +6 13 +0 1 +6 10 +8 10 +1 6 diff --git a/bottleneck/tests/data/test_231_A b/bottleneck/tests/data/test_231_A new file mode 100644 index 0000000..8d21ce3 --- /dev/null +++ b/bottleneck/tests/data/test_231_A @@ -0,0 +1,8 @@ +2 9 +1 11 +10 20 +7 16 +7 9 +0 7 +6 7 +6 7 diff --git a/bottleneck/tests/data/test_231_B b/bottleneck/tests/data/test_231_B new file mode 100644 index 0000000..f5d94fe --- /dev/null +++ b/bottleneck/tests/data/test_231_B @@ -0,0 +1,8 @@ +7 10 +10 19 +8 9 +5 12 +7 17 +3 5 +10 11 +0 1 diff --git a/bottleneck/tests/data/test_232_A b/bottleneck/tests/data/test_232_A new file mode 100644 index 0000000..ccad736 --- /dev/null +++ b/bottleneck/tests/data/test_232_A @@ -0,0 +1,8 @@ +1 6 +5 9 +9 10 +0 9 +0 8 +10 11 +2 7 +6 7 diff --git a/bottleneck/tests/data/test_232_B b/bottleneck/tests/data/test_232_B new file mode 100644 index 0000000..f132580 --- /dev/null +++ b/bottleneck/tests/data/test_232_B @@ -0,0 +1,8 @@ +5 8 +4 5 +10 17 +10 16 +4 10 +5 14 +5 6 +0 7 diff --git a/bottleneck/tests/data/test_233_A b/bottleneck/tests/data/test_233_A new file mode 100644 index 0000000..fd2fa4e --- /dev/null +++ b/bottleneck/tests/data/test_233_A @@ -0,0 +1,8 @@ +9 13 +2 6 +0 1 +6 14 +9 13 +0 1 +6 9 +2 9 diff --git a/bottleneck/tests/data/test_233_B b/bottleneck/tests/data/test_233_B new file mode 100644 index 0000000..3dc34c6 --- /dev/null +++ b/bottleneck/tests/data/test_233_B @@ -0,0 +1,8 @@ +8 12 +5 12 +1 5 +10 13 +1 7 +8 14 +7 15 +1 8 diff --git a/bottleneck/tests/data/test_234_A b/bottleneck/tests/data/test_234_A new file mode 100644 index 0000000..6ff3442 --- /dev/null +++ b/bottleneck/tests/data/test_234_A @@ -0,0 +1,8 @@ +0 7 +5 13 +10 20 +1 2 +9 10 +10 17 +1 2 +0 7 diff --git a/bottleneck/tests/data/test_234_B b/bottleneck/tests/data/test_234_B new file mode 100644 index 0000000..36a2966 --- /dev/null +++ b/bottleneck/tests/data/test_234_B @@ -0,0 +1,8 @@ +2 12 +1 2 +3 4 +1 4 +0 7 +7 8 +8 13 +9 18 diff --git a/bottleneck/tests/data/test_235_A b/bottleneck/tests/data/test_235_A new file mode 100644 index 0000000..40aec79 --- /dev/null +++ b/bottleneck/tests/data/test_235_A @@ -0,0 +1,8 @@ +4 7 +10 11 +7 12 +2 7 +8 11 +9 11 +8 12 +7 16 diff --git a/bottleneck/tests/data/test_235_B b/bottleneck/tests/data/test_235_B new file mode 100644 index 0000000..910422b --- /dev/null +++ b/bottleneck/tests/data/test_235_B @@ -0,0 +1,8 @@ +1 3 +9 15 +10 20 +6 16 +2 8 +3 9 +8 10 +9 14 diff --git a/bottleneck/tests/data/test_236_A b/bottleneck/tests/data/test_236_A new file mode 100644 index 0000000..8ca54db --- /dev/null +++ b/bottleneck/tests/data/test_236_A @@ -0,0 +1,8 @@ +5 11 +10 15 +7 9 +8 14 +0 5 +1 7 +2 3 +6 11 diff --git a/bottleneck/tests/data/test_236_B b/bottleneck/tests/data/test_236_B new file mode 100644 index 0000000..0855757 --- /dev/null +++ b/bottleneck/tests/data/test_236_B @@ -0,0 +1,8 @@ +4 5 +1 8 +1 2 +1 4 +8 17 +2 5 +3 10 +1 2 diff --git a/bottleneck/tests/data/test_237_A b/bottleneck/tests/data/test_237_A new file mode 100644 index 0000000..18a69fa --- /dev/null +++ b/bottleneck/tests/data/test_237_A @@ -0,0 +1,8 @@ +1 6 +3 6 +4 8 +0 3 +7 14 +6 7 +2 5 +6 13 diff --git a/bottleneck/tests/data/test_237_B b/bottleneck/tests/data/test_237_B new file mode 100644 index 0000000..b2ad13f --- /dev/null +++ b/bottleneck/tests/data/test_237_B @@ -0,0 +1,8 @@ +3 8 +6 16 +3 11 +6 15 +7 14 +6 11 +3 5 +8 14 diff --git a/bottleneck/tests/data/test_238_A b/bottleneck/tests/data/test_238_A new file mode 100644 index 0000000..d9011b0 --- /dev/null +++ b/bottleneck/tests/data/test_238_A @@ -0,0 +1,8 @@ +7 16 +3 12 +4 7 +7 13 +6 9 +5 8 +5 9 +3 4 diff --git a/bottleneck/tests/data/test_238_B b/bottleneck/tests/data/test_238_B new file mode 100644 index 0000000..788cf40 --- /dev/null +++ b/bottleneck/tests/data/test_238_B @@ -0,0 +1,8 @@ +5 6 +0 10 +2 5 +1 2 +9 16 +0 8 +0 3 +5 12 diff --git a/bottleneck/tests/data/test_239_A b/bottleneck/tests/data/test_239_A new file mode 100644 index 0000000..dbb3bec --- /dev/null +++ b/bottleneck/tests/data/test_239_A @@ -0,0 +1,8 @@ +2 10 +1 6 +10 20 +7 10 +2 7 +4 11 +0 5 +6 13 diff --git a/bottleneck/tests/data/test_239_B b/bottleneck/tests/data/test_239_B new file mode 100644 index 0000000..a0c12ac --- /dev/null +++ b/bottleneck/tests/data/test_239_B @@ -0,0 +1,8 @@ +1 5 +1 3 +5 8 +9 16 +8 17 +9 13 +3 4 +4 7 diff --git a/bottleneck/tests/data/test_240_A b/bottleneck/tests/data/test_240_A new file mode 100644 index 0000000..2386a27 --- /dev/null +++ b/bottleneck/tests/data/test_240_A @@ -0,0 +1,9 @@ +0 1 +10 15 +6 7 +5 14 +10 15 +9 12 +0 4 +10 11 +3 10 diff --git a/bottleneck/tests/data/test_240_B b/bottleneck/tests/data/test_240_B new file mode 100644 index 0000000..15439fb --- /dev/null +++ b/bottleneck/tests/data/test_240_B @@ -0,0 +1,9 @@ +0 3 +3 6 +2 12 +3 4 +9 13 +0 3 +0 7 +10 17 +6 15 diff --git a/bottleneck/tests/data/test_241_A b/bottleneck/tests/data/test_241_A new file mode 100644 index 0000000..8ed0c54 --- /dev/null +++ b/bottleneck/tests/data/test_241_A @@ -0,0 +1,9 @@ +1 10 +10 14 +3 4 +3 6 +7 12 +1 3 +9 14 +0 2 +1 11 diff --git a/bottleneck/tests/data/test_241_B b/bottleneck/tests/data/test_241_B new file mode 100644 index 0000000..fdac53a --- /dev/null +++ b/bottleneck/tests/data/test_241_B @@ -0,0 +1,9 @@ +7 8 +8 14 +10 20 +10 16 +2 7 +0 8 +7 17 +1 2 +5 6 diff --git a/bottleneck/tests/data/test_242_A b/bottleneck/tests/data/test_242_A new file mode 100644 index 0000000..e1af329 --- /dev/null +++ b/bottleneck/tests/data/test_242_A @@ -0,0 +1,9 @@ +0 3 +2 4 +5 14 +4 8 +0 7 +3 13 +5 11 +5 7 +10 19 diff --git a/bottleneck/tests/data/test_242_B b/bottleneck/tests/data/test_242_B new file mode 100644 index 0000000..b45d054 --- /dev/null +++ b/bottleneck/tests/data/test_242_B @@ -0,0 +1,9 @@ +5 6 +6 13 +7 12 +2 10 +0 9 +2 11 +2 9 +8 10 +10 13 diff --git a/bottleneck/tests/data/test_243_A b/bottleneck/tests/data/test_243_A new file mode 100644 index 0000000..ed2d61b --- /dev/null +++ b/bottleneck/tests/data/test_243_A @@ -0,0 +1,9 @@ +4 6 +10 11 +4 7 +8 14 +1 4 +9 15 +8 10 +4 11 +7 10 diff --git a/bottleneck/tests/data/test_243_B b/bottleneck/tests/data/test_243_B new file mode 100644 index 0000000..f0b5359 --- /dev/null +++ b/bottleneck/tests/data/test_243_B @@ -0,0 +1,9 @@ +7 8 +1 9 +7 10 +5 6 +3 11 +10 12 +1 8 +3 13 +0 9 diff --git a/bottleneck/tests/data/test_244_A b/bottleneck/tests/data/test_244_A new file mode 100644 index 0000000..1d1e4a7 --- /dev/null +++ b/bottleneck/tests/data/test_244_A @@ -0,0 +1,9 @@ +4 14 +3 8 +0 3 +3 12 +9 16 +4 7 +6 12 +7 8 +5 13 diff --git a/bottleneck/tests/data/test_244_B b/bottleneck/tests/data/test_244_B new file mode 100644 index 0000000..5d9748f --- /dev/null +++ b/bottleneck/tests/data/test_244_B @@ -0,0 +1,9 @@ +3 7 +3 8 +5 15 +4 7 +1 2 +0 10 +6 15 +8 9 +4 5 diff --git a/bottleneck/tests/data/test_245_A b/bottleneck/tests/data/test_245_A new file mode 100644 index 0000000..f17d580 --- /dev/null +++ b/bottleneck/tests/data/test_245_A @@ -0,0 +1,9 @@ +5 6 +3 11 +7 9 +1 7 +5 14 +4 7 +9 19 +1 7 +4 6 diff --git a/bottleneck/tests/data/test_245_B b/bottleneck/tests/data/test_245_B new file mode 100644 index 0000000..4b67caa --- /dev/null +++ b/bottleneck/tests/data/test_245_B @@ -0,0 +1,9 @@ +1 2 +6 7 +7 13 +1 9 +9 13 +2 8 +2 4 +4 5 +4 7 diff --git a/bottleneck/tests/data/test_246_A b/bottleneck/tests/data/test_246_A new file mode 100644 index 0000000..b4ddade --- /dev/null +++ b/bottleneck/tests/data/test_246_A @@ -0,0 +1,9 @@ +10 15 +3 10 +2 7 +1 6 +2 3 +2 9 +9 10 +9 12 +8 18 diff --git a/bottleneck/tests/data/test_246_B b/bottleneck/tests/data/test_246_B new file mode 100644 index 0000000..6e0c12d --- /dev/null +++ b/bottleneck/tests/data/test_246_B @@ -0,0 +1,9 @@ +4 9 +4 7 +6 11 +7 10 +0 3 +7 14 +7 17 +4 6 +10 15 diff --git a/bottleneck/tests/data/test_247_A b/bottleneck/tests/data/test_247_A new file mode 100644 index 0000000..4832963 --- /dev/null +++ b/bottleneck/tests/data/test_247_A @@ -0,0 +1,9 @@ +5 14 +9 19 +4 5 +3 4 +2 7 +9 12 +10 11 +7 12 +8 12 diff --git a/bottleneck/tests/data/test_247_B b/bottleneck/tests/data/test_247_B new file mode 100644 index 0000000..17cc1f0 --- /dev/null +++ b/bottleneck/tests/data/test_247_B @@ -0,0 +1,9 @@ +4 12 +2 7 +1 2 +9 19 +4 14 +6 12 +8 11 +5 12 +9 10 diff --git a/bottleneck/tests/data/test_248_A b/bottleneck/tests/data/test_248_A new file mode 100644 index 0000000..adbf3d6 --- /dev/null +++ b/bottleneck/tests/data/test_248_A @@ -0,0 +1,9 @@ +8 9 +8 15 +2 12 +0 1 +8 14 +0 5 +7 17 +7 12 +7 10 diff --git a/bottleneck/tests/data/test_248_B b/bottleneck/tests/data/test_248_B new file mode 100644 index 0000000..39ee264 --- /dev/null +++ b/bottleneck/tests/data/test_248_B @@ -0,0 +1,9 @@ +6 11 +1 10 +6 16 +10 13 +3 13 +10 16 +8 14 +8 16 +1 5 diff --git a/bottleneck/tests/data/test_249_A b/bottleneck/tests/data/test_249_A new file mode 100644 index 0000000..2b8a639 --- /dev/null +++ b/bottleneck/tests/data/test_249_A @@ -0,0 +1,9 @@ +2 7 +2 4 +7 17 +2 11 +6 12 +3 12 +2 8 +5 6 +0 1 diff --git a/bottleneck/tests/data/test_249_B b/bottleneck/tests/data/test_249_B new file mode 100644 index 0000000..06b036c --- /dev/null +++ b/bottleneck/tests/data/test_249_B @@ -0,0 +1,9 @@ +0 1 +8 11 +9 13 +3 11 +3 13 +7 15 +2 6 +4 5 +3 4 diff --git a/bottleneck/tests/data/test_250_A b/bottleneck/tests/data/test_250_A new file mode 100644 index 0000000..6934dd8 --- /dev/null +++ b/bottleneck/tests/data/test_250_A @@ -0,0 +1,9 @@ +0 8 +7 14 +5 12 +7 15 +9 19 +8 14 +6 15 +10 11 +9 19 diff --git a/bottleneck/tests/data/test_250_B b/bottleneck/tests/data/test_250_B new file mode 100644 index 0000000..0d387ac --- /dev/null +++ b/bottleneck/tests/data/test_250_B @@ -0,0 +1,9 @@ +8 13 +7 14 +0 6 +4 14 +7 17 +6 8 +5 13 +0 1 +5 10 diff --git a/bottleneck/tests/data/test_251_A b/bottleneck/tests/data/test_251_A new file mode 100644 index 0000000..6fb7509 --- /dev/null +++ b/bottleneck/tests/data/test_251_A @@ -0,0 +1,9 @@ +1 8 +6 13 +1 6 +10 15 +7 8 +3 6 +3 11 +7 12 +4 9 diff --git a/bottleneck/tests/data/test_251_B b/bottleneck/tests/data/test_251_B new file mode 100644 index 0000000..4ea7b4a --- /dev/null +++ b/bottleneck/tests/data/test_251_B @@ -0,0 +1,9 @@ +5 11 +6 12 +2 9 +5 6 +0 5 +0 2 +6 10 +4 10 +10 19 diff --git a/bottleneck/tests/data/test_252_A b/bottleneck/tests/data/test_252_A new file mode 100644 index 0000000..0076fb9 --- /dev/null +++ b/bottleneck/tests/data/test_252_A @@ -0,0 +1,9 @@ +4 8 +5 15 +0 10 +8 15 +1 8 +4 6 +5 13 +7 10 +0 1 diff --git a/bottleneck/tests/data/test_252_B b/bottleneck/tests/data/test_252_B new file mode 100644 index 0000000..cf7fab7 --- /dev/null +++ b/bottleneck/tests/data/test_252_B @@ -0,0 +1,9 @@ +2 3 +4 6 +0 9 +4 7 +4 11 +6 10 +9 11 +1 5 +3 4 diff --git a/bottleneck/tests/data/test_253_A b/bottleneck/tests/data/test_253_A new file mode 100644 index 0000000..0916538 --- /dev/null +++ b/bottleneck/tests/data/test_253_A @@ -0,0 +1,9 @@ +9 18 +1 10 +7 12 +0 6 +2 4 +1 10 +2 4 +1 2 +2 11 diff --git a/bottleneck/tests/data/test_253_B b/bottleneck/tests/data/test_253_B new file mode 100644 index 0000000..3ee1874 --- /dev/null +++ b/bottleneck/tests/data/test_253_B @@ -0,0 +1,9 @@ +9 12 +6 11 +0 1 +6 7 +2 5 +6 8 +10 20 +9 17 +8 15 diff --git a/bottleneck/tests/data/test_254_A b/bottleneck/tests/data/test_254_A new file mode 100644 index 0000000..85af9cb --- /dev/null +++ b/bottleneck/tests/data/test_254_A @@ -0,0 +1,9 @@ +1 9 +2 10 +4 7 +4 14 +3 9 +1 11 +7 16 +10 11 +5 15 diff --git a/bottleneck/tests/data/test_254_B b/bottleneck/tests/data/test_254_B new file mode 100644 index 0000000..573f5c5 --- /dev/null +++ b/bottleneck/tests/data/test_254_B @@ -0,0 +1,9 @@ +9 13 +0 1 +8 9 +8 9 +3 10 +5 14 +6 12 +3 5 +2 3 diff --git a/bottleneck/tests/data/test_255_A b/bottleneck/tests/data/test_255_A new file mode 100644 index 0000000..2fc0a84 --- /dev/null +++ b/bottleneck/tests/data/test_255_A @@ -0,0 +1,9 @@ +10 11 +4 8 +2 10 +2 10 +3 8 +6 7 +8 14 +2 10 +4 11 diff --git a/bottleneck/tests/data/test_255_B b/bottleneck/tests/data/test_255_B new file mode 100644 index 0000000..04e0521 --- /dev/null +++ b/bottleneck/tests/data/test_255_B @@ -0,0 +1,9 @@ +5 13 +8 12 +8 9 +4 10 +7 8 +1 7 +3 11 +10 15 +5 10 diff --git a/bottleneck/tests/data/test_256_A b/bottleneck/tests/data/test_256_A new file mode 100644 index 0000000..bb1df33 --- /dev/null +++ b/bottleneck/tests/data/test_256_A @@ -0,0 +1,9 @@ +6 7 +7 8 +10 16 +2 5 +5 15 +7 9 +10 15 +9 18 +4 9 diff --git a/bottleneck/tests/data/test_256_B b/bottleneck/tests/data/test_256_B new file mode 100644 index 0000000..a9bb2f8 --- /dev/null +++ b/bottleneck/tests/data/test_256_B @@ -0,0 +1,9 @@ +0 10 +7 9 +9 10 +7 8 +1 2 +2 4 +8 15 +3 7 +0 2 diff --git a/bottleneck/tests/data/test_257_A b/bottleneck/tests/data/test_257_A new file mode 100644 index 0000000..ac06787 --- /dev/null +++ b/bottleneck/tests/data/test_257_A @@ -0,0 +1,9 @@ +6 14 +9 16 +9 18 +4 7 +8 15 +7 9 +9 17 +1 2 +10 17 diff --git a/bottleneck/tests/data/test_257_B b/bottleneck/tests/data/test_257_B new file mode 100644 index 0000000..93ab86c --- /dev/null +++ b/bottleneck/tests/data/test_257_B @@ -0,0 +1,9 @@ +2 3 +3 6 +10 13 +7 14 +0 8 +0 2 +9 12 +1 7 +0 1 diff --git a/bottleneck/tests/data/test_258_A b/bottleneck/tests/data/test_258_A new file mode 100644 index 0000000..b00d4c3 --- /dev/null +++ b/bottleneck/tests/data/test_258_A @@ -0,0 +1,9 @@ +4 11 +0 6 +5 6 +2 4 +2 7 +8 11 +3 8 +3 4 +7 10 diff --git a/bottleneck/tests/data/test_258_B b/bottleneck/tests/data/test_258_B new file mode 100644 index 0000000..f3ab79e --- /dev/null +++ b/bottleneck/tests/data/test_258_B @@ -0,0 +1,9 @@ +6 15 +5 10 +9 10 +4 10 +7 8 +2 8 +8 18 +9 18 +5 9 diff --git a/bottleneck/tests/data/test_259_A b/bottleneck/tests/data/test_259_A new file mode 100644 index 0000000..30c4a56 --- /dev/null +++ b/bottleneck/tests/data/test_259_A @@ -0,0 +1,9 @@ +4 5 +0 1 +4 7 +5 14 +2 8 +0 1 +9 13 +5 9 +10 13 diff --git a/bottleneck/tests/data/test_259_B b/bottleneck/tests/data/test_259_B new file mode 100644 index 0000000..8cb51f7 --- /dev/null +++ b/bottleneck/tests/data/test_259_B @@ -0,0 +1,9 @@ +6 15 +9 18 +7 8 +9 16 +9 15 +5 15 +9 10 +6 10 +5 6 diff --git a/bottleneck/tests/data/test_260_A b/bottleneck/tests/data/test_260_A new file mode 100644 index 0000000..83740c1 --- /dev/null +++ b/bottleneck/tests/data/test_260_A @@ -0,0 +1,10 @@ +1 4 +2 5 +3 7 +7 9 +4 13 +8 15 +10 19 +9 14 +10 18 +10 17 diff --git a/bottleneck/tests/data/test_260_B b/bottleneck/tests/data/test_260_B new file mode 100644 index 0000000..18e1128 --- /dev/null +++ b/bottleneck/tests/data/test_260_B @@ -0,0 +1,10 @@ +0 4 +8 15 +4 6 +10 13 +6 7 +7 10 +8 13 +2 7 +4 13 +3 5 diff --git a/bottleneck/tests/data/test_261_A b/bottleneck/tests/data/test_261_A new file mode 100644 index 0000000..259e18a --- /dev/null +++ b/bottleneck/tests/data/test_261_A @@ -0,0 +1,10 @@ +8 11 +6 11 +9 16 +7 17 +7 14 +9 11 +0 1 +9 14 +6 14 +0 10 diff --git a/bottleneck/tests/data/test_261_B b/bottleneck/tests/data/test_261_B new file mode 100644 index 0000000..2be943f --- /dev/null +++ b/bottleneck/tests/data/test_261_B @@ -0,0 +1,10 @@ +8 18 +5 7 +9 12 +7 10 +3 6 +4 14 +9 15 +8 14 +1 9 +0 5 diff --git a/bottleneck/tests/data/test_262_A b/bottleneck/tests/data/test_262_A new file mode 100644 index 0000000..ccb706b --- /dev/null +++ b/bottleneck/tests/data/test_262_A @@ -0,0 +1,10 @@ +1 8 +6 16 +7 13 +10 13 +7 11 +10 15 +10 17 +8 17 +0 3 +5 6 diff --git a/bottleneck/tests/data/test_262_B b/bottleneck/tests/data/test_262_B new file mode 100644 index 0000000..944d288 --- /dev/null +++ b/bottleneck/tests/data/test_262_B @@ -0,0 +1,10 @@ +9 18 +7 8 +0 8 +8 15 +6 14 +6 11 +6 16 +7 17 +3 4 +4 7 diff --git a/bottleneck/tests/data/test_263_A b/bottleneck/tests/data/test_263_A new file mode 100644 index 0000000..6262062 --- /dev/null +++ b/bottleneck/tests/data/test_263_A @@ -0,0 +1,10 @@ +0 9 +10 11 +4 13 +9 13 +4 6 +7 13 +4 5 +7 9 +10 11 +10 18 diff --git a/bottleneck/tests/data/test_263_B b/bottleneck/tests/data/test_263_B new file mode 100644 index 0000000..c9f8716 --- /dev/null +++ b/bottleneck/tests/data/test_263_B @@ -0,0 +1,10 @@ +2 6 +6 13 +2 12 +3 13 +5 6 +10 16 +9 18 +9 16 +10 18 +10 20 diff --git a/bottleneck/tests/data/test_264_A b/bottleneck/tests/data/test_264_A new file mode 100644 index 0000000..8c79b6d --- /dev/null +++ b/bottleneck/tests/data/test_264_A @@ -0,0 +1,10 @@ +3 11 +3 4 +8 12 +2 10 +7 12 +2 10 +10 13 +4 8 +2 9 +10 11 diff --git a/bottleneck/tests/data/test_264_B b/bottleneck/tests/data/test_264_B new file mode 100644 index 0000000..9b92607 --- /dev/null +++ b/bottleneck/tests/data/test_264_B @@ -0,0 +1,10 @@ +7 11 +2 7 +4 12 +9 10 +10 12 +8 15 +8 12 +6 7 +2 11 +10 11 diff --git a/bottleneck/tests/data/test_265_A b/bottleneck/tests/data/test_265_A new file mode 100644 index 0000000..4de3ff9 --- /dev/null +++ b/bottleneck/tests/data/test_265_A @@ -0,0 +1,10 @@ +0 4 +1 2 +6 11 +9 19 +0 6 +9 19 +0 5 +4 5 +7 11 +9 14 diff --git a/bottleneck/tests/data/test_265_B b/bottleneck/tests/data/test_265_B new file mode 100644 index 0000000..f03f49f --- /dev/null +++ b/bottleneck/tests/data/test_265_B @@ -0,0 +1,10 @@ +1 7 +5 10 +5 10 +4 6 +0 7 +4 12 +8 11 +10 15 +2 11 +8 17 diff --git a/bottleneck/tests/data/test_266_A b/bottleneck/tests/data/test_266_A new file mode 100644 index 0000000..95754d3 --- /dev/null +++ b/bottleneck/tests/data/test_266_A @@ -0,0 +1,10 @@ +7 8 +3 12 +0 5 +0 6 +1 5 +9 17 +6 11 +3 5 +2 11 +5 7 diff --git a/bottleneck/tests/data/test_266_B b/bottleneck/tests/data/test_266_B new file mode 100644 index 0000000..5a2d560 --- /dev/null +++ b/bottleneck/tests/data/test_266_B @@ -0,0 +1,10 @@ +10 17 +5 13 +9 10 +3 4 +4 10 +6 12 +0 7 +6 14 +1 6 +4 10 diff --git a/bottleneck/tests/data/test_267_A b/bottleneck/tests/data/test_267_A new file mode 100644 index 0000000..d2c663e --- /dev/null +++ b/bottleneck/tests/data/test_267_A @@ -0,0 +1,10 @@ +3 4 +10 20 +2 10 +1 7 +0 4 +0 10 +0 8 +3 4 +9 19 +7 13 diff --git a/bottleneck/tests/data/test_267_B b/bottleneck/tests/data/test_267_B new file mode 100644 index 0000000..aebae2b --- /dev/null +++ b/bottleneck/tests/data/test_267_B @@ -0,0 +1,10 @@ +2 11 +4 5 +1 10 +3 9 +6 11 +0 8 +2 3 +0 3 +6 11 +7 12 diff --git a/bottleneck/tests/data/test_268_A b/bottleneck/tests/data/test_268_A new file mode 100644 index 0000000..d0e9835 --- /dev/null +++ b/bottleneck/tests/data/test_268_A @@ -0,0 +1,10 @@ +3 4 +10 17 +8 17 +0 2 +4 8 +0 8 +4 5 +5 6 +1 2 +1 7 diff --git a/bottleneck/tests/data/test_268_B b/bottleneck/tests/data/test_268_B new file mode 100644 index 0000000..ac0c242 --- /dev/null +++ b/bottleneck/tests/data/test_268_B @@ -0,0 +1,10 @@ +3 11 +3 6 +1 2 +8 9 +2 5 +4 13 +4 9 +9 18 +9 15 +9 13 diff --git a/bottleneck/tests/data/test_269_A b/bottleneck/tests/data/test_269_A new file mode 100644 index 0000000..62a1a47 --- /dev/null +++ b/bottleneck/tests/data/test_269_A @@ -0,0 +1,10 @@ +10 17 +10 18 +3 10 +6 8 +3 5 +5 11 +5 12 +9 13 +6 16 +2 11 diff --git a/bottleneck/tests/data/test_269_B b/bottleneck/tests/data/test_269_B new file mode 100644 index 0000000..ecf44f6 --- /dev/null +++ b/bottleneck/tests/data/test_269_B @@ -0,0 +1,10 @@ +3 8 +2 9 +1 6 +8 11 +10 18 +4 12 +0 2 +0 1 +0 8 +0 4 diff --git a/bottleneck/tests/data/test_270_A b/bottleneck/tests/data/test_270_A new file mode 100644 index 0000000..6bd9f37 --- /dev/null +++ b/bottleneck/tests/data/test_270_A @@ -0,0 +1,10 @@ +6 16 +3 8 +6 7 +5 10 +7 17 +1 2 +10 19 +10 18 +4 9 +9 14 diff --git a/bottleneck/tests/data/test_270_B b/bottleneck/tests/data/test_270_B new file mode 100644 index 0000000..5e177c7 --- /dev/null +++ b/bottleneck/tests/data/test_270_B @@ -0,0 +1,10 @@ +8 14 +10 14 +6 7 +3 8 +9 10 +3 7 +2 3 +2 3 +10 19 +8 15 diff --git a/bottleneck/tests/data/test_271_A b/bottleneck/tests/data/test_271_A new file mode 100644 index 0000000..12f7492 --- /dev/null +++ b/bottleneck/tests/data/test_271_A @@ -0,0 +1,10 @@ +0 7 +0 6 +3 10 +3 6 +1 10 +10 11 +3 13 +9 16 +9 15 +10 20 diff --git a/bottleneck/tests/data/test_271_B b/bottleneck/tests/data/test_271_B new file mode 100644 index 0000000..1af6dd6 --- /dev/null +++ b/bottleneck/tests/data/test_271_B @@ -0,0 +1,10 @@ +9 10 +9 16 +10 14 +1 4 +8 14 +10 11 +9 10 +3 7 +6 14 +7 8 diff --git a/bottleneck/tests/data/test_272_A b/bottleneck/tests/data/test_272_A new file mode 100644 index 0000000..b6b67f0 --- /dev/null +++ b/bottleneck/tests/data/test_272_A @@ -0,0 +1,10 @@ +9 17 +6 16 +6 8 +1 2 +7 12 +1 4 +0 9 +9 16 +8 10 +10 11 diff --git a/bottleneck/tests/data/test_272_B b/bottleneck/tests/data/test_272_B new file mode 100644 index 0000000..9b12c0e --- /dev/null +++ b/bottleneck/tests/data/test_272_B @@ -0,0 +1,10 @@ +1 11 +9 14 +8 9 +3 11 +7 15 +0 5 +0 8 +5 11 +0 1 +10 11 diff --git a/bottleneck/tests/data/test_273_A b/bottleneck/tests/data/test_273_A new file mode 100644 index 0000000..6ae8fde --- /dev/null +++ b/bottleneck/tests/data/test_273_A @@ -0,0 +1,10 @@ +2 10 +8 9 +10 19 +3 7 +4 5 +1 8 +0 5 +6 9 +0 1 +4 10 diff --git a/bottleneck/tests/data/test_273_B b/bottleneck/tests/data/test_273_B new file mode 100644 index 0000000..42955e8 --- /dev/null +++ b/bottleneck/tests/data/test_273_B @@ -0,0 +1,10 @@ +9 19 +0 2 +0 1 +2 9 +7 9 +2 7 +3 6 +9 10 +2 3 +0 9 diff --git a/bottleneck/tests/data/test_274_A b/bottleneck/tests/data/test_274_A new file mode 100644 index 0000000..78e099d --- /dev/null +++ b/bottleneck/tests/data/test_274_A @@ -0,0 +1,10 @@ +0 1 +10 11 +4 6 +9 15 +9 19 +4 7 +8 17 +0 7 +7 17 +4 14 diff --git a/bottleneck/tests/data/test_274_B b/bottleneck/tests/data/test_274_B new file mode 100644 index 0000000..59cac0c --- /dev/null +++ b/bottleneck/tests/data/test_274_B @@ -0,0 +1,10 @@ +4 12 +2 7 +0 5 +3 10 +7 15 +3 8 +8 14 +8 11 +6 14 +6 16 diff --git a/bottleneck/tests/data/test_275_A b/bottleneck/tests/data/test_275_A new file mode 100644 index 0000000..9593ad1 --- /dev/null +++ b/bottleneck/tests/data/test_275_A @@ -0,0 +1,10 @@ +7 13 +2 3 +10 11 +5 10 +6 11 +10 16 +5 10 +5 9 +10 18 +10 11 diff --git a/bottleneck/tests/data/test_275_B b/bottleneck/tests/data/test_275_B new file mode 100644 index 0000000..46d793b --- /dev/null +++ b/bottleneck/tests/data/test_275_B @@ -0,0 +1,10 @@ +9 19 +10 11 +8 9 +7 8 +4 8 +0 2 +4 12 +6 16 +4 9 +8 9 diff --git a/bottleneck/tests/data/test_276_A b/bottleneck/tests/data/test_276_A new file mode 100644 index 0000000..546a9ad --- /dev/null +++ b/bottleneck/tests/data/test_276_A @@ -0,0 +1,10 @@ +6 16 +2 3 +0 6 +9 18 +3 13 +1 5 +1 6 +3 4 +7 11 +0 1 diff --git a/bottleneck/tests/data/test_276_B b/bottleneck/tests/data/test_276_B new file mode 100644 index 0000000..3b63537 --- /dev/null +++ b/bottleneck/tests/data/test_276_B @@ -0,0 +1,10 @@ +9 17 +8 9 +7 10 +2 10 +2 11 +2 7 +6 11 +7 12 +10 18 +4 14 diff --git a/bottleneck/tests/data/test_277_A b/bottleneck/tests/data/test_277_A new file mode 100644 index 0000000..41ee575 --- /dev/null +++ b/bottleneck/tests/data/test_277_A @@ -0,0 +1,10 @@ +6 8 +6 15 +0 10 +9 10 +5 10 +4 10 +0 5 +5 9 +8 9 +2 5 diff --git a/bottleneck/tests/data/test_277_B b/bottleneck/tests/data/test_277_B new file mode 100644 index 0000000..84ade69 --- /dev/null +++ b/bottleneck/tests/data/test_277_B @@ -0,0 +1,10 @@ +0 2 +4 7 +3 12 +8 13 +2 3 +9 18 +8 16 +2 3 +10 20 +4 10 diff --git a/bottleneck/tests/data/test_278_A b/bottleneck/tests/data/test_278_A new file mode 100644 index 0000000..d2e3a7a --- /dev/null +++ b/bottleneck/tests/data/test_278_A @@ -0,0 +1,10 @@ +8 10 +6 7 +9 19 +6 11 +4 6 +0 8 +5 6 +5 10 +1 10 +2 7 diff --git a/bottleneck/tests/data/test_278_B b/bottleneck/tests/data/test_278_B new file mode 100644 index 0000000..0046a8a --- /dev/null +++ b/bottleneck/tests/data/test_278_B @@ -0,0 +1,10 @@ +1 2 +0 8 +9 19 +4 13 +0 10 +7 15 +2 3 +10 17 +2 12 +10 17 diff --git a/bottleneck/tests/data/test_279_A b/bottleneck/tests/data/test_279_A new file mode 100644 index 0000000..4e5619f --- /dev/null +++ b/bottleneck/tests/data/test_279_A @@ -0,0 +1,10 @@ +5 9 +4 8 +5 7 +0 2 +8 17 +5 12 +3 5 +1 3 +3 10 +7 10 diff --git a/bottleneck/tests/data/test_279_B b/bottleneck/tests/data/test_279_B new file mode 100644 index 0000000..7ae40fa --- /dev/null +++ b/bottleneck/tests/data/test_279_B @@ -0,0 +1,10 @@ +9 11 +2 5 +5 15 +4 11 +5 11 +9 10 +2 8 +10 14 +6 16 +7 16 diff --git a/bottleneck/tests/data/test_280_A b/bottleneck/tests/data/test_280_A new file mode 100644 index 0000000..3ac2922 --- /dev/null +++ b/bottleneck/tests/data/test_280_A @@ -0,0 +1,20 @@ +5 8 +10 11 +0 1 +8 18 +0 7 +2 12 +3 6 +10 20 +9 14 +4 9 +6 7 +4 13 +3 4 +10 13 +6 7 +8 17 +8 9 +5 7 +5 6 +3 11 diff --git a/bottleneck/tests/data/test_280_B b/bottleneck/tests/data/test_280_B new file mode 100644 index 0000000..c5485cf --- /dev/null +++ b/bottleneck/tests/data/test_280_B @@ -0,0 +1,20 @@ +9 16 +6 7 +4 12 +9 10 +5 12 +5 14 +1 4 +8 17 +4 14 +8 15 +6 14 +3 13 +7 17 +4 7 +0 2 +9 17 +3 4 +6 11 +0 10 +2 3 diff --git a/bottleneck/tests/data/test_281_A b/bottleneck/tests/data/test_281_A new file mode 100644 index 0000000..e9a4644 --- /dev/null +++ b/bottleneck/tests/data/test_281_A @@ -0,0 +1,20 @@ +2 4 +3 4 +7 10 +9 14 +9 16 +8 10 +2 3 +0 10 +10 14 +7 14 +4 7 +4 6 +5 11 +1 7 +3 10 +7 8 +6 11 +0 1 +8 9 +7 16 diff --git a/bottleneck/tests/data/test_281_B b/bottleneck/tests/data/test_281_B new file mode 100644 index 0000000..f219b2a --- /dev/null +++ b/bottleneck/tests/data/test_281_B @@ -0,0 +1,20 @@ +5 15 +8 17 +0 5 +5 11 +7 13 +5 9 +4 7 +3 9 +6 9 +2 10 +4 9 +6 13 +8 17 +8 12 +10 15 +4 11 +3 11 +0 2 +3 8 +1 6 diff --git a/bottleneck/tests/data/test_282_A b/bottleneck/tests/data/test_282_A new file mode 100644 index 0000000..946f3f2 --- /dev/null +++ b/bottleneck/tests/data/test_282_A @@ -0,0 +1,20 @@ +7 17 +1 10 +7 12 +2 12 +1 2 +2 11 +2 6 +7 10 +9 18 +2 12 +3 12 +8 9 +0 10 +5 6 +3 9 +9 13 +0 7 +6 7 +0 2 +4 13 diff --git a/bottleneck/tests/data/test_282_B b/bottleneck/tests/data/test_282_B new file mode 100644 index 0000000..ac3c7c8 --- /dev/null +++ b/bottleneck/tests/data/test_282_B @@ -0,0 +1,20 @@ +0 8 +10 18 +4 11 +1 10 +4 9 +4 8 +3 9 +0 6 +9 12 +9 10 +9 15 +0 3 +2 11 +6 11 +2 8 +1 3 +8 16 +0 5 +9 18 +4 11 diff --git a/bottleneck/tests/data/test_283_A b/bottleneck/tests/data/test_283_A new file mode 100644 index 0000000..0c4676e --- /dev/null +++ b/bottleneck/tests/data/test_283_A @@ -0,0 +1,20 @@ +4 12 +6 9 +7 12 +10 16 +10 11 +1 2 +0 5 +4 7 +3 12 +4 7 +10 11 +3 5 +10 16 +6 7 +10 18 +7 8 +10 11 +4 10 +6 14 +2 4 diff --git a/bottleneck/tests/data/test_283_B b/bottleneck/tests/data/test_283_B new file mode 100644 index 0000000..23a83e7 --- /dev/null +++ b/bottleneck/tests/data/test_283_B @@ -0,0 +1,20 @@ +9 16 +7 17 +2 7 +0 1 +9 17 +8 10 +8 15 +10 17 +6 12 +7 8 +1 8 +2 12 +8 9 +3 6 +6 12 +3 6 +3 5 +2 6 +10 11 +7 13 diff --git a/bottleneck/tests/data/test_284_A b/bottleneck/tests/data/test_284_A new file mode 100644 index 0000000..4cec19a --- /dev/null +++ b/bottleneck/tests/data/test_284_A @@ -0,0 +1,20 @@ +9 13 +2 11 +2 4 +6 7 +6 14 +6 13 +7 14 +0 8 +3 4 +2 9 +4 10 +4 11 +6 15 +1 3 +5 9 +4 5 +4 13 +7 11 +9 15 +7 16 diff --git a/bottleneck/tests/data/test_284_B b/bottleneck/tests/data/test_284_B new file mode 100644 index 0000000..f09aa28 --- /dev/null +++ b/bottleneck/tests/data/test_284_B @@ -0,0 +1,20 @@ +9 11 +7 10 +3 5 +0 1 +5 11 +2 10 +3 5 +2 4 +7 15 +3 4 +10 13 +1 3 +8 14 +0 8 +1 11 +5 13 +0 1 +2 3 +0 6 +2 6 diff --git a/bottleneck/tests/data/test_285_A b/bottleneck/tests/data/test_285_A new file mode 100644 index 0000000..8e27a5a --- /dev/null +++ b/bottleneck/tests/data/test_285_A @@ -0,0 +1,20 @@ +7 9 +7 12 +7 16 +4 14 +1 8 +3 13 +7 15 +4 5 +10 18 +10 16 +5 6 +6 12 +3 13 +5 9 +7 15 +1 2 +10 14 +5 6 +6 12 +3 9 diff --git a/bottleneck/tests/data/test_285_B b/bottleneck/tests/data/test_285_B new file mode 100644 index 0000000..16a8754 --- /dev/null +++ b/bottleneck/tests/data/test_285_B @@ -0,0 +1,20 @@ +4 5 +4 9 +10 19 +1 5 +3 9 +10 11 +0 1 +2 12 +1 8 +7 15 +5 9 +8 10 +7 10 +9 18 +4 9 +3 10 +7 15 +7 14 +2 4 +5 7 diff --git a/bottleneck/tests/data/test_286_A b/bottleneck/tests/data/test_286_A new file mode 100644 index 0000000..f8083ac --- /dev/null +++ b/bottleneck/tests/data/test_286_A @@ -0,0 +1,20 @@ +5 6 +10 11 +2 10 +0 6 +4 5 +7 8 +2 10 +4 12 +0 1 +7 15 +2 10 +10 13 +1 10 +9 14 +2 6 +2 8 +6 15 +3 4 +4 6 +2 11 diff --git a/bottleneck/tests/data/test_286_B b/bottleneck/tests/data/test_286_B new file mode 100644 index 0000000..6ba8e74 --- /dev/null +++ b/bottleneck/tests/data/test_286_B @@ -0,0 +1,20 @@ +7 8 +3 4 +7 15 +10 14 +4 12 +4 8 +8 12 +4 8 +1 4 +10 12 +0 2 +0 1 +6 12 +7 11 +9 16 +3 11 +2 4 +10 14 +2 10 +6 8 diff --git a/bottleneck/tests/data/test_287_A b/bottleneck/tests/data/test_287_A new file mode 100644 index 0000000..5dd8f38 --- /dev/null +++ b/bottleneck/tests/data/test_287_A @@ -0,0 +1,20 @@ +10 20 +8 9 +0 4 +6 14 +1 4 +3 7 +0 3 +10 13 +7 9 +4 6 +7 14 +3 13 +10 17 +4 13 +9 18 +2 3 +1 11 +10 16 +6 12 +4 13 diff --git a/bottleneck/tests/data/test_287_B b/bottleneck/tests/data/test_287_B new file mode 100644 index 0000000..6fff124 --- /dev/null +++ b/bottleneck/tests/data/test_287_B @@ -0,0 +1,20 @@ +0 2 +6 7 +8 9 +2 10 +0 4 +7 8 +0 9 +1 4 +6 11 +0 2 +5 7 +9 18 +9 16 +5 14 +3 4 +5 14 +3 4 +6 9 +1 5 +7 10 diff --git a/bottleneck/tests/data/test_288_A b/bottleneck/tests/data/test_288_A new file mode 100644 index 0000000..567d877 --- /dev/null +++ b/bottleneck/tests/data/test_288_A @@ -0,0 +1,20 @@ +8 12 +4 9 +5 14 +7 8 +4 11 +5 15 +2 10 +1 3 +0 7 +3 5 +1 3 +1 7 +8 13 +7 10 +5 6 +7 10 +3 6 +10 20 +10 17 +4 14 diff --git a/bottleneck/tests/data/test_288_B b/bottleneck/tests/data/test_288_B new file mode 100644 index 0000000..1d50cf6 --- /dev/null +++ b/bottleneck/tests/data/test_288_B @@ -0,0 +1,20 @@ +6 14 +8 11 +5 13 +1 10 +9 12 +9 19 +4 14 +0 2 +8 16 +1 10 +3 9 +0 3 +2 5 +2 4 +5 8 +2 11 +3 5 +6 16 +7 11 +5 11 diff --git a/bottleneck/tests/data/test_289_A b/bottleneck/tests/data/test_289_A new file mode 100644 index 0000000..39c74ff --- /dev/null +++ b/bottleneck/tests/data/test_289_A @@ -0,0 +1,20 @@ +3 4 +5 13 +8 18 +9 18 +4 10 +2 8 +1 10 +10 17 +2 3 +10 15 +2 3 +4 6 +7 8 +7 9 +8 12 +7 9 +8 15 +6 9 +0 2 +8 17 diff --git a/bottleneck/tests/data/test_289_B b/bottleneck/tests/data/test_289_B new file mode 100644 index 0000000..cb24888 --- /dev/null +++ b/bottleneck/tests/data/test_289_B @@ -0,0 +1,20 @@ +1 11 +10 18 +6 16 +7 14 +8 16 +9 11 +2 3 +8 12 +4 5 +7 14 +5 10 +7 8 +2 12 +5 9 +0 1 +10 19 +1 5 +10 20 +3 10 +9 11 diff --git a/bottleneck/tests/data/test_290_A b/bottleneck/tests/data/test_290_A new file mode 100644 index 0000000..21e124b --- /dev/null +++ b/bottleneck/tests/data/test_290_A @@ -0,0 +1,20 @@ +8 15 +6 10 +4 5 +10 20 +3 8 +0 10 +0 2 +3 9 +1 10 +3 11 +5 12 +6 7 +6 8 +3 6 +8 9 +9 15 +2 12 +8 12 +3 11 +4 9 diff --git a/bottleneck/tests/data/test_290_B b/bottleneck/tests/data/test_290_B new file mode 100644 index 0000000..d705f0e --- /dev/null +++ b/bottleneck/tests/data/test_290_B @@ -0,0 +1,20 @@ +8 10 +1 2 +5 6 +2 9 +6 15 +3 8 +6 7 +4 11 +2 3 +10 14 +3 4 +3 4 +1 2 +2 11 +2 6 +6 7 +1 4 +8 16 +4 5 +9 12 diff --git a/bottleneck/tests/data/test_291_A b/bottleneck/tests/data/test_291_A new file mode 100644 index 0000000..0ba0226 --- /dev/null +++ b/bottleneck/tests/data/test_291_A @@ -0,0 +1,20 @@ +10 11 +4 5 +4 13 +4 10 +9 13 +3 4 +8 13 +9 15 +2 8 +9 16 +8 14 +8 18 +1 6 +0 8 +8 16 +5 6 +9 19 +8 15 +8 13 +8 16 diff --git a/bottleneck/tests/data/test_291_B b/bottleneck/tests/data/test_291_B new file mode 100644 index 0000000..1c933ef --- /dev/null +++ b/bottleneck/tests/data/test_291_B @@ -0,0 +1,20 @@ +2 9 +4 13 +8 13 +10 13 +8 18 +8 13 +5 14 +1 6 +5 6 +7 8 +2 12 +5 6 +6 10 +7 10 +0 6 +10 14 +2 3 +10 18 +5 12 +4 5 diff --git a/bottleneck/tests/data/test_292_A b/bottleneck/tests/data/test_292_A new file mode 100644 index 0000000..1929d2e --- /dev/null +++ b/bottleneck/tests/data/test_292_A @@ -0,0 +1,20 @@ +7 8 +5 15 +7 11 +6 15 +2 8 +8 9 +7 9 +0 2 +4 8 +2 10 +0 2 +2 4 +1 3 +6 10 +2 10 +2 9 +10 13 +7 8 +5 8 +9 11 diff --git a/bottleneck/tests/data/test_292_B b/bottleneck/tests/data/test_292_B new file mode 100644 index 0000000..305f8b8 --- /dev/null +++ b/bottleneck/tests/data/test_292_B @@ -0,0 +1,20 @@ +4 6 +3 9 +8 12 +5 15 +10 12 +4 10 +4 6 +4 6 +0 8 +8 14 +7 14 +4 13 +4 10 +5 12 +10 19 +0 7 +3 10 +10 15 +0 2 +10 11 diff --git a/bottleneck/tests/data/test_293_A b/bottleneck/tests/data/test_293_A new file mode 100644 index 0000000..752bd33 --- /dev/null +++ b/bottleneck/tests/data/test_293_A @@ -0,0 +1,20 @@ +8 15 +5 15 +10 11 +6 7 +10 13 +9 10 +6 8 +9 18 +0 4 +2 4 +2 9 +6 15 +0 1 +5 12 +7 12 +2 9 +3 13 +4 10 +10 16 +2 9 diff --git a/bottleneck/tests/data/test_293_B b/bottleneck/tests/data/test_293_B new file mode 100644 index 0000000..6ce5afb --- /dev/null +++ b/bottleneck/tests/data/test_293_B @@ -0,0 +1,20 @@ +2 10 +8 11 +6 16 +0 10 +2 3 +10 17 +1 2 +7 16 +3 7 +0 3 +8 9 +2 7 +7 17 +3 13 +2 7 +5 11 +6 9 +10 20 +2 4 +3 8 diff --git a/bottleneck/tests/data/test_294_A b/bottleneck/tests/data/test_294_A new file mode 100644 index 0000000..556a43e --- /dev/null +++ b/bottleneck/tests/data/test_294_A @@ -0,0 +1,20 @@ +5 13 +4 12 +6 7 +10 16 +5 14 +3 10 +2 10 +7 11 +5 15 +0 1 +4 14 +3 12 +0 8 +10 13 +0 1 +3 9 +5 6 +7 11 +4 13 +9 11 diff --git a/bottleneck/tests/data/test_294_B b/bottleneck/tests/data/test_294_B new file mode 100644 index 0000000..5a0896c --- /dev/null +++ b/bottleneck/tests/data/test_294_B @@ -0,0 +1,20 @@ +1 10 +6 16 +6 10 +4 12 +6 12 +0 6 +3 9 +3 12 +5 14 +9 17 +10 18 +3 13 +2 10 +8 9 +9 16 +8 14 +5 12 +4 6 +9 10 +7 12 diff --git a/bottleneck/tests/data/test_295_A b/bottleneck/tests/data/test_295_A new file mode 100644 index 0000000..53b904f --- /dev/null +++ b/bottleneck/tests/data/test_295_A @@ -0,0 +1,20 @@ +2 10 +10 20 +9 16 +2 9 +2 7 +7 11 +8 11 +10 12 +4 9 +4 13 +6 12 +7 8 +4 8 +7 15 +2 9 +9 11 +10 13 +9 19 +7 14 +5 13 diff --git a/bottleneck/tests/data/test_295_B b/bottleneck/tests/data/test_295_B new file mode 100644 index 0000000..61d13ff --- /dev/null +++ b/bottleneck/tests/data/test_295_B @@ -0,0 +1,20 @@ +3 13 +3 13 +8 17 +1 6 +3 9 +3 10 +5 12 +9 10 +5 7 +9 16 +2 6 +0 1 +4 8 +1 3 +5 15 +6 7 +7 10 +1 3 +5 13 +1 7 diff --git a/bottleneck/tests/data/test_296_A b/bottleneck/tests/data/test_296_A new file mode 100644 index 0000000..444d20f --- /dev/null +++ b/bottleneck/tests/data/test_296_A @@ -0,0 +1,20 @@ +0 6 +4 10 +10 13 +0 6 +1 6 +10 19 +6 13 +1 2 +5 13 +6 14 +4 12 +1 8 +6 16 +2 9 +9 11 +9 19 +1 10 +3 4 +2 11 +4 8 diff --git a/bottleneck/tests/data/test_296_B b/bottleneck/tests/data/test_296_B new file mode 100644 index 0000000..476d729 --- /dev/null +++ b/bottleneck/tests/data/test_296_B @@ -0,0 +1,20 @@ +1 3 +7 9 +4 10 +10 11 +0 5 +4 12 +1 2 +7 14 +10 19 +8 9 +3 12 +1 2 +1 5 +0 1 +10 17 +9 17 +1 7 +2 5 +2 5 +4 13 diff --git a/bottleneck/tests/data/test_297_A b/bottleneck/tests/data/test_297_A new file mode 100644 index 0000000..745d7f6 --- /dev/null +++ b/bottleneck/tests/data/test_297_A @@ -0,0 +1,20 @@ +6 9 +1 3 +7 10 +9 14 +9 18 +8 12 +2 3 +5 15 +8 14 +3 12 +5 6 +7 15 +6 16 +8 18 +6 13 +6 7 +3 8 +2 3 +9 13 +9 14 diff --git a/bottleneck/tests/data/test_297_B b/bottleneck/tests/data/test_297_B new file mode 100644 index 0000000..99b1ccc --- /dev/null +++ b/bottleneck/tests/data/test_297_B @@ -0,0 +1,20 @@ +4 11 +9 18 +9 11 +2 7 +2 9 +4 12 +4 13 +10 18 +8 10 +2 5 +9 15 +2 9 +10 15 +6 15 +9 12 +10 20 +9 16 +8 11 +0 1 +2 12 diff --git a/bottleneck/tests/data/test_298_A b/bottleneck/tests/data/test_298_A new file mode 100644 index 0000000..d35fccc --- /dev/null +++ b/bottleneck/tests/data/test_298_A @@ -0,0 +1,20 @@ +0 6 +9 10 +4 5 +7 13 +10 19 +7 12 +10 20 +2 6 +7 13 +7 8 +9 10 +4 8 +9 10 +7 14 +9 19 +10 16 +3 7 +2 3 +1 5 +3 4 diff --git a/bottleneck/tests/data/test_298_B b/bottleneck/tests/data/test_298_B new file mode 100644 index 0000000..5cf0d1c --- /dev/null +++ b/bottleneck/tests/data/test_298_B @@ -0,0 +1,20 @@ +4 10 +6 8 +2 3 +6 15 +9 16 +10 11 +7 13 +5 6 +2 9 +6 13 +8 14 +9 15 +10 15 +10 12 +9 18 +3 4 +6 7 +1 9 +4 10 +3 7 diff --git a/bottleneck/tests/data/test_299_A b/bottleneck/tests/data/test_299_A new file mode 100644 index 0000000..3506828 --- /dev/null +++ b/bottleneck/tests/data/test_299_A @@ -0,0 +1,20 @@ +9 10 +1 6 +7 16 +9 13 +3 8 +6 11 +1 9 +5 14 +3 7 +3 10 +5 11 +1 7 +1 5 +0 6 +6 14 +8 11 +10 13 +9 17 +4 10 +9 14 diff --git a/bottleneck/tests/data/test_299_B b/bottleneck/tests/data/test_299_B new file mode 100644 index 0000000..3600634 --- /dev/null +++ b/bottleneck/tests/data/test_299_B @@ -0,0 +1,20 @@ +0 9 +7 13 +8 14 +8 9 +7 17 +0 5 +1 10 +0 5 +3 4 +10 19 +6 14 +8 9 +9 14 +1 6 +9 14 +3 5 +4 5 +8 18 +10 14 +10 18 diff --git a/bottleneck/tests/data/test_300_A b/bottleneck/tests/data/test_300_A new file mode 100644 index 0000000..2ab4a1e --- /dev/null +++ b/bottleneck/tests/data/test_300_A @@ -0,0 +1,30 @@ +8 10 +1 4 +9 12 +0 1 +0 5 +2 9 +7 13 +6 7 +3 8 +2 7 +6 8 +8 12 +1 2 +0 1 +5 10 +4 5 +9 13 +8 15 +6 8 +9 17 +7 10 +8 16 +10 11 +6 8 +6 8 +5 11 +1 4 +9 13 +2 4 +2 3 diff --git a/bottleneck/tests/data/test_300_B b/bottleneck/tests/data/test_300_B new file mode 100644 index 0000000..a54300d --- /dev/null +++ b/bottleneck/tests/data/test_300_B @@ -0,0 +1,30 @@ +9 10 +9 11 +6 10 +1 3 +5 8 +7 12 +4 9 +7 11 +1 9 +6 15 +3 9 +3 10 +1 6 +8 15 +1 11 +1 2 +10 11 +6 7 +7 8 +0 3 +10 11 +3 9 +3 9 +5 6 +0 4 +6 9 +2 3 +1 2 +10 11 +4 14 diff --git a/bottleneck/tests/data/test_301_A b/bottleneck/tests/data/test_301_A new file mode 100644 index 0000000..85f8ae5 --- /dev/null +++ b/bottleneck/tests/data/test_301_A @@ -0,0 +1,30 @@ +4 10 +5 9 +6 12 +0 1 +4 7 +4 6 +9 19 +4 9 +2 7 +4 13 +6 7 +4 5 +0 10 +7 8 +3 4 +8 12 +0 9 +8 14 +7 13 +8 14 +1 2 +4 5 +10 14 +4 5 +3 11 +7 12 +9 16 +0 1 +9 19 +9 15 diff --git a/bottleneck/tests/data/test_301_B b/bottleneck/tests/data/test_301_B new file mode 100644 index 0000000..4d9ef19 --- /dev/null +++ b/bottleneck/tests/data/test_301_B @@ -0,0 +1,30 @@ +5 15 +2 9 +3 4 +2 12 +10 17 +0 7 +5 8 +5 7 +7 16 +2 4 +4 8 +1 4 +5 15 +1 2 +2 12 +0 10 +9 10 +2 11 +7 8 +10 19 +1 11 +10 14 +8 11 +6 7 +3 7 +8 16 +3 11 +7 13 +5 10 +8 10 diff --git a/bottleneck/tests/data/test_302_A b/bottleneck/tests/data/test_302_A new file mode 100644 index 0000000..be0e810 --- /dev/null +++ b/bottleneck/tests/data/test_302_A @@ -0,0 +1,30 @@ +7 13 +9 18 +1 11 +5 11 +2 3 +5 10 +1 3 +1 9 +7 11 +5 15 +4 5 +3 5 +9 13 +5 13 +10 14 +7 8 +10 19 +4 5 +2 12 +3 7 +3 4 +8 16 +6 16 +6 7 +6 11 +0 2 +0 8 +7 17 +9 17 +0 3 diff --git a/bottleneck/tests/data/test_302_B b/bottleneck/tests/data/test_302_B new file mode 100644 index 0000000..38806fc --- /dev/null +++ b/bottleneck/tests/data/test_302_B @@ -0,0 +1,30 @@ +9 17 +3 4 +7 14 +1 6 +8 18 +2 8 +8 16 +9 19 +2 5 +10 18 +9 15 +5 13 +3 13 +7 8 +1 3 +9 10 +0 8 +6 14 +10 11 +4 14 +4 14 +4 8 +2 4 +1 9 +7 8 +6 13 +8 9 +5 11 +10 18 +7 10 diff --git a/bottleneck/tests/data/test_303_A b/bottleneck/tests/data/test_303_A new file mode 100644 index 0000000..b277929 --- /dev/null +++ b/bottleneck/tests/data/test_303_A @@ -0,0 +1,30 @@ +4 10 +2 11 +1 5 +9 18 +9 16 +8 11 +9 13 +1 11 +1 11 +9 13 +6 10 +6 15 +0 2 +0 1 +6 10 +1 3 +0 6 +7 8 +3 6 +4 11 +7 14 +8 16 +6 7 +6 7 +6 11 +0 4 +7 12 +1 5 +2 8 +0 1 diff --git a/bottleneck/tests/data/test_303_B b/bottleneck/tests/data/test_303_B new file mode 100644 index 0000000..2cff171 --- /dev/null +++ b/bottleneck/tests/data/test_303_B @@ -0,0 +1,30 @@ +7 8 +5 11 +8 15 +2 3 +10 11 +7 17 +0 10 +5 10 +6 8 +4 8 +7 8 +5 12 +8 15 +5 11 +4 9 +9 17 +7 13 +8 13 +6 7 +3 11 +1 6 +6 8 +1 8 +5 10 +9 19 +8 9 +7 17 +1 6 +10 13 +10 19 diff --git a/bottleneck/tests/data/test_304_A b/bottleneck/tests/data/test_304_A new file mode 100644 index 0000000..2c3de43 --- /dev/null +++ b/bottleneck/tests/data/test_304_A @@ -0,0 +1,30 @@ +0 2 +8 14 +1 2 +0 8 +0 6 +4 8 +5 12 +3 4 +2 3 +0 6 +10 11 +0 4 +0 10 +9 16 +9 10 +5 6 +6 11 +8 9 +0 1 +6 13 +8 18 +4 10 +9 18 +1 6 +5 7 +1 8 +9 13 +5 12 +4 5 +7 8 diff --git a/bottleneck/tests/data/test_304_B b/bottleneck/tests/data/test_304_B new file mode 100644 index 0000000..24402f6 --- /dev/null +++ b/bottleneck/tests/data/test_304_B @@ -0,0 +1,30 @@ +5 15 +2 7 +8 13 +4 5 +2 3 +6 9 +8 12 +8 12 +9 18 +10 12 +3 8 +5 9 +2 12 +9 19 +6 13 +6 12 +10 14 +0 2 +2 3 +1 10 +8 13 +10 20 +3 5 +1 8 +0 6 +2 3 +8 9 +5 6 +9 17 +6 9 diff --git a/bottleneck/tests/data/test_305_A b/bottleneck/tests/data/test_305_A new file mode 100644 index 0000000..aa88ed8 --- /dev/null +++ b/bottleneck/tests/data/test_305_A @@ -0,0 +1,30 @@ +1 5 +6 7 +7 15 +4 11 +9 12 +8 10 +4 7 +10 17 +9 10 +7 15 +4 7 +8 12 +9 10 +10 15 +1 5 +4 5 +2 10 +2 3 +4 14 +8 17 +1 10 +7 10 +2 4 +6 15 +8 10 +10 20 +3 7 +2 4 +6 10 +2 5 diff --git a/bottleneck/tests/data/test_305_B b/bottleneck/tests/data/test_305_B new file mode 100644 index 0000000..8edd827 --- /dev/null +++ b/bottleneck/tests/data/test_305_B @@ -0,0 +1,30 @@ +8 13 +10 11 +0 1 +8 13 +2 3 +9 10 +0 4 +3 9 +8 11 +7 12 +3 8 +8 10 +10 14 +2 4 +1 7 +7 10 +6 7 +7 17 +6 14 +0 6 +8 17 +9 14 +2 7 +0 2 +3 12 +7 16 +10 16 +9 13 +8 13 +1 2 diff --git a/bottleneck/tests/data/test_306_A b/bottleneck/tests/data/test_306_A new file mode 100644 index 0000000..8baa725 --- /dev/null +++ b/bottleneck/tests/data/test_306_A @@ -0,0 +1,30 @@ +3 13 +1 8 +7 14 +5 7 +0 1 +10 17 +5 8 +4 5 +6 8 +9 10 +3 10 +9 15 +8 18 +8 14 +5 15 +8 13 +8 9 +7 13 +1 8 +7 13 +3 9 +6 12 +6 9 +2 7 +7 10 +3 9 +8 13 +5 14 +10 11 +2 6 diff --git a/bottleneck/tests/data/test_306_B b/bottleneck/tests/data/test_306_B new file mode 100644 index 0000000..b33f874 --- /dev/null +++ b/bottleneck/tests/data/test_306_B @@ -0,0 +1,30 @@ +8 10 +8 12 +6 9 +9 11 +5 7 +2 12 +0 9 +10 13 +0 1 +3 13 +1 6 +0 4 +2 12 +4 10 +10 14 +4 5 +9 10 +1 6 +4 12 +4 7 +4 13 +0 5 +10 17 +3 5 +2 3 +5 6 +7 11 +10 12 +2 9 +6 8 diff --git a/bottleneck/tests/data/test_307_A b/bottleneck/tests/data/test_307_A new file mode 100644 index 0000000..bce4bc1 --- /dev/null +++ b/bottleneck/tests/data/test_307_A @@ -0,0 +1,30 @@ +0 1 +9 18 +5 7 +2 7 +2 8 +10 17 +9 16 +9 16 +1 6 +7 15 +5 10 +1 2 +8 14 +0 1 +5 6 +2 8 +3 4 +5 12 +4 6 +5 12 +7 11 +8 9 +3 10 +6 13 +0 7 +0 4 +7 16 +10 16 +8 12 +6 8 diff --git a/bottleneck/tests/data/test_307_B b/bottleneck/tests/data/test_307_B new file mode 100644 index 0000000..fd4fcb5 --- /dev/null +++ b/bottleneck/tests/data/test_307_B @@ -0,0 +1,30 @@ +2 5 +3 9 +0 10 +10 14 +4 9 +0 1 +1 9 +3 13 +4 5 +10 16 +5 8 +8 15 +0 5 +0 9 +9 11 +2 3 +10 20 +8 9 +7 15 +4 13 +1 9 +5 8 +7 17 +3 5 +10 16 +2 11 +4 6 +3 7 +7 15 +5 10 diff --git a/bottleneck/tests/data/test_308_A b/bottleneck/tests/data/test_308_A new file mode 100644 index 0000000..55ab2aa --- /dev/null +++ b/bottleneck/tests/data/test_308_A @@ -0,0 +1,30 @@ +3 5 +6 16 +0 3 +0 10 +6 7 +2 6 +7 12 +0 7 +6 9 +6 12 +0 4 +3 12 +2 10 +5 8 +10 16 +8 12 +0 8 +2 3 +6 12 +7 8 +0 4 +2 9 +0 8 +4 7 +10 16 +6 8 +9 14 +6 9 +0 1 +0 1 diff --git a/bottleneck/tests/data/test_308_B b/bottleneck/tests/data/test_308_B new file mode 100644 index 0000000..cdf0c84 --- /dev/null +++ b/bottleneck/tests/data/test_308_B @@ -0,0 +1,30 @@ +3 11 +1 4 +0 3 +9 15 +2 8 +6 12 +3 13 +0 4 +1 5 +8 18 +6 15 +0 5 +6 16 +4 6 +3 11 +4 5 +0 1 +0 10 +4 6 +0 1 +6 7 +6 7 +8 9 +7 13 +8 15 +3 4 +1 7 +4 13 +6 16 +3 12 diff --git a/bottleneck/tests/data/test_309_A b/bottleneck/tests/data/test_309_A new file mode 100644 index 0000000..20cee09 --- /dev/null +++ b/bottleneck/tests/data/test_309_A @@ -0,0 +1,30 @@ +5 15 +2 4 +5 11 +3 13 +5 15 +8 13 +1 10 +2 10 +7 8 +0 7 +9 13 +10 13 +4 14 +0 3 +10 17 +2 7 +5 15 +1 10 +9 11 +7 10 +10 15 +5 7 +0 4 +0 8 +1 2 +8 16 +3 10 +8 16 +3 4 +5 6 diff --git a/bottleneck/tests/data/test_309_B b/bottleneck/tests/data/test_309_B new file mode 100644 index 0000000..86fe46e --- /dev/null +++ b/bottleneck/tests/data/test_309_B @@ -0,0 +1,30 @@ +2 4 +9 17 +4 11 +3 9 +8 13 +6 7 +0 8 +10 15 +10 13 +7 12 +7 14 +9 10 +0 10 +6 7 +6 13 +2 4 +2 3 +6 10 +9 19 +7 17 +2 6 +3 10 +8 17 +8 13 +1 6 +6 16 +10 11 +7 9 +6 13 +9 15 diff --git a/bottleneck/tests/data/test_310_A b/bottleneck/tests/data/test_310_A new file mode 100644 index 0000000..320f176 --- /dev/null +++ b/bottleneck/tests/data/test_310_A @@ -0,0 +1,30 @@ +7 12 +8 15 +10 13 +4 5 +10 12 +6 14 +5 7 +1 8 +10 19 +0 4 +0 5 +10 11 +3 12 +0 6 +8 11 +6 15 +10 16 +1 2 +8 10 +4 5 +10 17 +9 15 +7 9 +7 11 +5 11 +9 13 +0 3 +4 7 +3 4 +10 18 diff --git a/bottleneck/tests/data/test_310_B b/bottleneck/tests/data/test_310_B new file mode 100644 index 0000000..3bcf21c --- /dev/null +++ b/bottleneck/tests/data/test_310_B @@ -0,0 +1,30 @@ +8 10 +1 11 +4 8 +4 14 +3 13 +1 5 +1 9 +3 8 +0 7 +9 10 +1 4 +0 1 +7 17 +6 9 +4 6 +6 9 +2 12 +2 10 +8 14 +7 13 +1 9 +8 14 +1 6 +3 11 +5 8 +5 12 +2 10 +0 6 +4 5 +3 13 diff --git a/bottleneck/tests/data/test_311_A b/bottleneck/tests/data/test_311_A new file mode 100644 index 0000000..d98eb28 --- /dev/null +++ b/bottleneck/tests/data/test_311_A @@ -0,0 +1,30 @@ +2 11 +6 10 +1 4 +2 7 +2 3 +9 15 +2 3 +9 12 +2 3 +5 15 +9 17 +2 6 +0 8 +4 7 +0 5 +0 9 +7 12 +7 12 +9 12 +6 9 +7 16 +1 2 +0 8 +4 12 +2 11 +9 13 +2 7 +5 15 +5 6 +4 10 diff --git a/bottleneck/tests/data/test_311_B b/bottleneck/tests/data/test_311_B new file mode 100644 index 0000000..311ede4 --- /dev/null +++ b/bottleneck/tests/data/test_311_B @@ -0,0 +1,30 @@ +2 3 +7 15 +6 12 +10 18 +10 14 +10 11 +8 9 +1 9 +5 11 +0 1 +10 19 +8 14 +10 12 +8 13 +7 14 +3 5 +10 14 +8 17 +9 10 +7 16 +2 3 +1 7 +9 15 +8 12 +0 1 +6 11 +8 15 +8 13 +2 8 +3 12 diff --git a/bottleneck/tests/data/test_312_A b/bottleneck/tests/data/test_312_A new file mode 100644 index 0000000..2745003 --- /dev/null +++ b/bottleneck/tests/data/test_312_A @@ -0,0 +1,30 @@ +7 12 +0 7 +4 14 +0 6 +10 11 +8 9 +5 14 +5 6 +9 12 +4 8 +2 3 +1 4 +8 10 +2 8 +9 13 +7 12 +10 17 +1 2 +4 8 +3 5 +7 8 +1 5 +6 7 +7 16 +6 10 +10 17 +10 20 +2 5 +4 13 +2 9 diff --git a/bottleneck/tests/data/test_312_B b/bottleneck/tests/data/test_312_B new file mode 100644 index 0000000..4a7645b --- /dev/null +++ b/bottleneck/tests/data/test_312_B @@ -0,0 +1,30 @@ +8 9 +4 10 +9 19 +5 13 +6 12 +4 6 +5 11 +5 6 +3 12 +7 10 +5 12 +7 8 +3 13 +5 14 +4 9 +6 15 +5 14 +4 13 +1 9 +5 13 +5 12 +1 10 +3 4 +7 13 +3 12 +7 11 +4 5 +7 9 +0 4 +0 9 diff --git a/bottleneck/tests/data/test_313_A b/bottleneck/tests/data/test_313_A new file mode 100644 index 0000000..db46821 --- /dev/null +++ b/bottleneck/tests/data/test_313_A @@ -0,0 +1,30 @@ +8 14 +10 15 +7 16 +8 9 +1 10 +8 16 +0 10 +2 3 +4 8 +1 7 +2 6 +5 15 +0 7 +5 6 +0 9 +2 3 +5 6 +9 12 +3 7 +8 10 +10 17 +3 12 +10 13 +4 12 +2 8 +8 14 +6 10 +4 6 +0 7 +8 11 diff --git a/bottleneck/tests/data/test_313_B b/bottleneck/tests/data/test_313_B new file mode 100644 index 0000000..d387050 --- /dev/null +++ b/bottleneck/tests/data/test_313_B @@ -0,0 +1,30 @@ +4 10 +4 11 +4 5 +2 8 +3 6 +1 5 +8 18 +1 4 +7 8 +5 8 +7 15 +10 18 +6 10 +9 17 +6 15 +0 7 +10 19 +8 10 +4 9 +5 14 +5 9 +4 5 +5 12 +5 9 +0 1 +7 9 +2 4 +0 7 +9 18 +8 11 diff --git a/bottleneck/tests/data/test_314_A b/bottleneck/tests/data/test_314_A new file mode 100644 index 0000000..03ad5db --- /dev/null +++ b/bottleneck/tests/data/test_314_A @@ -0,0 +1,30 @@ +10 11 +10 11 +9 12 +2 11 +8 17 +3 10 +8 10 +10 14 +5 9 +5 6 +10 11 +9 17 +10 19 +3 8 +6 15 +10 20 +0 9 +8 12 +7 13 +4 6 +9 10 +6 15 +1 9 +3 9 +10 11 +10 15 +4 9 +8 13 +9 10 +6 9 diff --git a/bottleneck/tests/data/test_314_B b/bottleneck/tests/data/test_314_B new file mode 100644 index 0000000..eaa46d9 --- /dev/null +++ b/bottleneck/tests/data/test_314_B @@ -0,0 +1,30 @@ +10 20 +2 12 +8 13 +0 7 +6 7 +10 15 +10 20 +5 15 +7 8 +3 10 +5 7 +3 10 +0 4 +10 17 +4 9 +5 14 +9 16 +3 4 +6 7 +4 12 +4 10 +9 10 +0 10 +10 11 +1 6 +8 16 +7 16 +10 12 +6 13 +3 7 diff --git a/bottleneck/tests/data/test_315_A b/bottleneck/tests/data/test_315_A new file mode 100644 index 0000000..fa49507 --- /dev/null +++ b/bottleneck/tests/data/test_315_A @@ -0,0 +1,30 @@ +9 16 +10 18 +6 7 +9 12 +1 5 +10 20 +9 14 +4 5 +7 13 +6 12 +1 9 +10 12 +5 8 +10 12 +7 16 +10 16 +1 9 +3 10 +1 4 +1 3 +0 6 +7 13 +1 2 +3 8 +6 13 +6 8 +3 10 +0 1 +9 18 +0 10 diff --git a/bottleneck/tests/data/test_315_B b/bottleneck/tests/data/test_315_B new file mode 100644 index 0000000..d5390e2 --- /dev/null +++ b/bottleneck/tests/data/test_315_B @@ -0,0 +1,30 @@ +1 2 +2 8 +0 2 +9 18 +1 11 +3 6 +6 7 +0 1 +8 14 +6 8 +5 6 +9 17 +5 6 +7 13 +7 9 +9 10 +7 15 +9 11 +3 4 +0 3 +8 16 +0 10 +8 15 +1 11 +8 16 +1 6 +9 17 +10 19 +7 10 +7 9 diff --git a/bottleneck/tests/data/test_316_A b/bottleneck/tests/data/test_316_A new file mode 100644 index 0000000..57ff91f --- /dev/null +++ b/bottleneck/tests/data/test_316_A @@ -0,0 +1,30 @@ +6 16 +4 10 +6 10 +8 11 +1 2 +0 5 +7 16 +4 9 +9 11 +0 2 +0 7 +10 18 +3 6 +9 15 +8 15 +5 9 +7 17 +5 12 +9 19 +10 20 +1 2 +1 11 +3 4 +6 15 +10 18 +3 11 +10 19 +5 6 +1 5 +3 12 diff --git a/bottleneck/tests/data/test_316_B b/bottleneck/tests/data/test_316_B new file mode 100644 index 0000000..407332e --- /dev/null +++ b/bottleneck/tests/data/test_316_B @@ -0,0 +1,30 @@ +4 7 +10 11 +3 4 +2 12 +3 4 +8 13 +3 4 +3 11 +10 11 +9 17 +5 12 +6 14 +10 17 +8 12 +8 9 +4 6 +10 14 +4 11 +5 10 +5 14 +6 7 +0 1 +8 13 +8 12 +3 8 +0 9 +7 8 +8 13 +10 11 +3 7 diff --git a/bottleneck/tests/data/test_317_A b/bottleneck/tests/data/test_317_A new file mode 100644 index 0000000..4b6204e --- /dev/null +++ b/bottleneck/tests/data/test_317_A @@ -0,0 +1,30 @@ +5 6 +1 6 +6 10 +8 16 +7 15 +2 4 +8 17 +5 12 +0 2 +7 17 +2 11 +0 2 +8 10 +8 9 +0 8 +5 10 +2 9 +3 6 +8 9 +9 17 +4 12 +7 9 +1 11 +2 10 +9 19 +10 13 +7 10 +5 8 +5 8 +2 5 diff --git a/bottleneck/tests/data/test_317_B b/bottleneck/tests/data/test_317_B new file mode 100644 index 0000000..b30729a --- /dev/null +++ b/bottleneck/tests/data/test_317_B @@ -0,0 +1,30 @@ +4 9 +0 7 +10 11 +4 5 +2 11 +4 9 +7 17 +7 14 +10 18 +2 6 +2 8 +2 7 +1 11 +5 14 +2 3 +6 9 +2 12 +1 4 +5 6 +5 11 +8 17 +4 12 +3 8 +1 4 +9 13 +0 7 +3 9 +3 4 +5 6 +3 11 diff --git a/bottleneck/tests/data/test_318_A b/bottleneck/tests/data/test_318_A new file mode 100644 index 0000000..2ea4ad5 --- /dev/null +++ b/bottleneck/tests/data/test_318_A @@ -0,0 +1,30 @@ +4 13 +0 5 +5 12 +3 8 +9 17 +6 16 +7 8 +9 14 +9 19 +6 15 +2 8 +1 2 +10 18 +5 11 +5 6 +8 10 +3 7 +1 11 +9 12 +8 9 +10 20 +2 6 +8 16 +9 19 +10 11 +7 11 +9 10 +8 18 +6 14 +2 4 diff --git a/bottleneck/tests/data/test_318_B b/bottleneck/tests/data/test_318_B new file mode 100644 index 0000000..64fd49d --- /dev/null +++ b/bottleneck/tests/data/test_318_B @@ -0,0 +1,30 @@ +10 13 +6 16 +3 11 +10 20 +1 9 +1 10 +4 5 +5 10 +10 11 +1 8 +7 9 +10 11 +4 10 +0 8 +4 13 +7 9 +7 9 +7 15 +9 17 +2 11 +0 1 +6 13 +1 2 +10 13 +10 18 +7 12 +8 15 +4 10 +5 13 +3 11 diff --git a/bottleneck/tests/data/test_319_A b/bottleneck/tests/data/test_319_A new file mode 100644 index 0000000..f7ffeda --- /dev/null +++ b/bottleneck/tests/data/test_319_A @@ -0,0 +1,30 @@ +8 12 +6 14 +2 8 +9 18 +10 16 +8 17 +5 15 +6 7 +1 7 +6 7 +7 9 +9 10 +4 9 +9 14 +6 11 +7 8 +8 14 +6 7 +5 14 +2 10 +0 1 +0 6 +4 5 +1 5 +4 13 +6 14 +5 14 +9 11 +0 7 +3 6 diff --git a/bottleneck/tests/data/test_319_B b/bottleneck/tests/data/test_319_B new file mode 100644 index 0000000..5529fa0 --- /dev/null +++ b/bottleneck/tests/data/test_319_B @@ -0,0 +1,30 @@ +6 7 +5 6 +4 5 +0 4 +5 6 +9 11 +1 2 +8 16 +4 9 +8 10 +7 9 +4 5 +5 15 +0 7 +8 14 +10 15 +5 7 +1 6 +5 6 +5 11 +1 10 +0 5 +5 15 +5 10 +0 2 +10 13 +0 9 +3 9 +10 11 +1 10 diff --git a/bottleneck/tests/data/test_320_A b/bottleneck/tests/data/test_320_A new file mode 100644 index 0000000..c7c7380 --- /dev/null +++ b/bottleneck/tests/data/test_320_A @@ -0,0 +1,50 @@ +5 6 +0 6 +6 10 +5 10 +0 9 +0 4 +10 11 +7 13 +0 2 +4 8 +1 2 +4 13 +8 15 +1 7 +3 4 +5 14 +0 6 +7 16 +2 12 +3 11 +0 1 +3 4 +10 16 +3 8 +0 3 +1 9 +9 14 +5 6 +1 11 +6 9 +6 12 +0 6 +9 13 +4 8 +8 10 +4 9 +7 15 +5 7 +1 2 +8 15 +5 6 +6 12 +0 7 +0 9 +5 12 +1 3 +5 7 +4 12 +7 14 +9 16 diff --git a/bottleneck/tests/data/test_320_B b/bottleneck/tests/data/test_320_B new file mode 100644 index 0000000..2807b27 --- /dev/null +++ b/bottleneck/tests/data/test_320_B @@ -0,0 +1,50 @@ +9 17 +7 13 +7 14 +7 10 +7 12 +2 10 +8 9 +0 1 +0 10 +0 8 +1 4 +2 11 +4 13 +8 13 +4 11 +1 5 +5 6 +2 4 +9 17 +5 15 +5 8 +7 9 +8 14 +9 10 +5 13 +8 13 +8 17 +1 11 +4 7 +3 10 +3 8 +10 20 +7 8 +10 15 +3 5 +8 12 +1 2 +7 16 +7 17 +1 10 +2 8 +4 12 +9 15 +5 7 +4 8 +5 14 +6 15 +7 16 +2 8 +5 14 diff --git a/bottleneck/tests/data/test_321_A b/bottleneck/tests/data/test_321_A new file mode 100644 index 0000000..b24cee9 --- /dev/null +++ b/bottleneck/tests/data/test_321_A @@ -0,0 +1,50 @@ +1 6 +1 7 +1 2 +4 13 +8 15 +1 10 +10 17 +7 17 +0 6 +7 15 +7 13 +9 14 +9 16 +7 12 +5 8 +6 16 +1 3 +8 13 +2 6 +2 10 +2 11 +0 1 +7 15 +4 6 +10 14 +9 10 +0 3 +9 10 +3 9 +7 10 +5 6 +8 18 +2 9 +9 17 +7 12 +9 18 +2 5 +6 8 +7 14 +9 13 +8 16 +9 19 +2 11 +9 16 +6 7 +5 6 +9 17 +8 15 +3 4 +7 14 diff --git a/bottleneck/tests/data/test_321_B b/bottleneck/tests/data/test_321_B new file mode 100644 index 0000000..be6f00b --- /dev/null +++ b/bottleneck/tests/data/test_321_B @@ -0,0 +1,50 @@ +3 8 +8 13 +10 11 +9 11 +10 18 +3 10 +5 10 +9 18 +5 11 +5 7 +9 15 +10 13 +5 7 +6 14 +10 17 +4 10 +10 12 +10 17 +6 16 +3 8 +5 13 +9 12 +9 10 +10 12 +9 14 +7 16 +7 16 +10 14 +7 14 +3 4 +3 4 +8 18 +9 14 +5 9 +2 12 +9 17 +0 7 +2 4 +10 11 +7 14 +0 8 +1 9 +5 6 +2 4 +5 8 +3 12 +3 5 +1 5 +0 6 +4 14 diff --git a/bottleneck/tests/data/test_322_A b/bottleneck/tests/data/test_322_A new file mode 100644 index 0000000..18eed8e --- /dev/null +++ b/bottleneck/tests/data/test_322_A @@ -0,0 +1,50 @@ +8 12 +6 11 +2 8 +0 2 +5 14 +6 8 +1 3 +5 9 +5 10 +6 13 +3 6 +10 14 +2 10 +8 11 +3 13 +3 8 +0 10 +0 3 +8 11 +2 12 +1 2 +10 11 +1 2 +7 16 +1 4 +8 11 +5 7 +8 17 +5 11 +3 8 +5 10 +1 4 +3 5 +4 5 +7 10 +4 13 +1 7 +0 1 +0 7 +6 16 +8 16 +4 11 +2 3 +10 13 +2 8 +7 9 +5 6 +4 10 +1 10 +0 7 diff --git a/bottleneck/tests/data/test_322_B b/bottleneck/tests/data/test_322_B new file mode 100644 index 0000000..f829c84 --- /dev/null +++ b/bottleneck/tests/data/test_322_B @@ -0,0 +1,50 @@ +1 9 +1 8 +6 12 +8 18 +9 17 +5 7 +3 8 +10 11 +10 19 +8 14 +6 8 +6 13 +3 5 +7 16 +0 5 +1 10 +1 2 +0 2 +6 7 +8 17 +4 12 +0 3 +6 8 +0 6 +9 10 +10 11 +8 15 +4 7 +1 11 +7 10 +3 11 +6 16 +2 7 +8 9 +10 18 +0 5 +1 4 +10 12 +3 9 +7 8 +10 14 +7 14 +6 13 +9 16 +5 15 +0 2 +5 12 +9 10 +2 10 +6 7 diff --git a/bottleneck/tests/data/test_323_A b/bottleneck/tests/data/test_323_A new file mode 100644 index 0000000..c452dff --- /dev/null +++ b/bottleneck/tests/data/test_323_A @@ -0,0 +1,50 @@ +2 3 +8 16 +7 16 +7 8 +10 11 +2 12 +5 13 +5 14 +9 10 +7 8 +2 12 +0 9 +1 11 +6 12 +9 19 +6 12 +8 10 +7 10 +10 19 +0 2 +6 12 +2 11 +9 10 +0 9 +9 15 +4 11 +2 5 +4 10 +5 10 +0 7 +8 14 +1 4 +9 16 +1 10 +10 12 +3 10 +2 5 +2 12 +10 15 +0 7 +9 14 +7 8 +5 6 +8 18 +0 5 +0 10 +5 13 +7 11 +9 19 +4 11 diff --git a/bottleneck/tests/data/test_323_B b/bottleneck/tests/data/test_323_B new file mode 100644 index 0000000..4a7c144 --- /dev/null +++ b/bottleneck/tests/data/test_323_B @@ -0,0 +1,50 @@ +3 4 +3 12 +0 3 +0 5 +2 4 +5 8 +5 10 +8 18 +6 15 +1 9 +8 15 +5 11 +8 13 +4 6 +9 18 +3 4 +10 18 +2 11 +3 10 +3 4 +9 12 +6 13 +7 15 +7 11 +6 9 +3 11 +8 11 +8 13 +9 14 +5 14 +1 7 +6 14 +0 1 +10 17 +0 3 +10 13 +0 1 +3 4 +1 7 +4 6 +7 14 +2 12 +8 10 +3 8 +8 18 +8 18 +8 14 +5 9 +10 18 +5 7 diff --git a/bottleneck/tests/data/test_324_A b/bottleneck/tests/data/test_324_A new file mode 100644 index 0000000..330da65 --- /dev/null +++ b/bottleneck/tests/data/test_324_A @@ -0,0 +1,50 @@ +0 3 +8 9 +4 7 +1 5 +4 5 +5 7 +5 11 +5 9 +2 4 +9 16 +9 15 +7 13 +5 10 +3 11 +8 12 +8 14 +4 7 +6 9 +5 12 +7 11 +4 9 +8 18 +8 13 +3 9 +5 12 +3 12 +3 4 +2 3 +9 17 +0 7 +4 8 +5 13 +1 4 +1 4 +5 6 +3 12 +3 4 +8 14 +3 13 +7 10 +3 4 +9 15 +4 10 +9 17 +5 8 +2 6 +2 9 +1 3 +6 12 +0 2 diff --git a/bottleneck/tests/data/test_324_B b/bottleneck/tests/data/test_324_B new file mode 100644 index 0000000..4fb3fef --- /dev/null +++ b/bottleneck/tests/data/test_324_B @@ -0,0 +1,50 @@ +3 9 +2 3 +5 12 +1 8 +5 10 +3 5 +1 2 +6 13 +10 17 +5 14 +7 13 +2 6 +4 5 +2 12 +3 12 +4 9 +7 14 +5 7 +6 7 +4 7 +1 9 +4 13 +10 19 +2 11 +3 9 +10 16 +2 7 +3 5 +5 12 +7 14 +0 10 +4 5 +8 18 +1 5 +7 14 +4 13 +4 7 +6 9 +6 12 +2 11 +4 12 +4 5 +7 17 +8 13 +3 4 +2 6 +6 14 +5 6 +5 6 +6 13 diff --git a/bottleneck/tests/data/test_325_A b/bottleneck/tests/data/test_325_A new file mode 100644 index 0000000..0e38bad --- /dev/null +++ b/bottleneck/tests/data/test_325_A @@ -0,0 +1,50 @@ +6 9 +5 6 +7 17 +4 13 +6 12 +3 9 +3 9 +2 11 +0 3 +4 5 +6 11 +6 7 +8 12 +4 5 +10 11 +9 10 +0 3 +4 6 +0 8 +6 13 +8 12 +7 14 +0 1 +0 1 +8 9 +9 14 +10 12 +3 6 +4 5 +5 13 +10 13 +8 16 +8 16 +2 6 +3 4 +8 16 +2 6 +8 17 +7 11 +0 2 +5 12 +5 9 +5 12 +1 11 +3 10 +5 12 +5 7 +4 5 +4 6 +4 11 diff --git a/bottleneck/tests/data/test_325_B b/bottleneck/tests/data/test_325_B new file mode 100644 index 0000000..807bb12 --- /dev/null +++ b/bottleneck/tests/data/test_325_B @@ -0,0 +1,50 @@ +6 12 +6 12 +5 13 +10 13 +9 16 +4 11 +9 15 +1 9 +2 3 +9 19 +5 8 +10 11 +9 15 +10 13 +9 15 +6 10 +1 5 +9 12 +5 11 +5 8 +10 19 +9 13 +2 3 +7 10 +6 8 +5 12 +7 16 +2 12 +2 6 +10 15 +0 1 +2 10 +10 11 +0 6 +6 13 +3 13 +8 12 +10 11 +10 14 +4 13 +6 13 +0 4 +9 15 +5 15 +6 13 +9 10 +10 15 +2 10 +6 16 +1 9 diff --git a/bottleneck/tests/data/test_326_A b/bottleneck/tests/data/test_326_A new file mode 100644 index 0000000..2cb897b --- /dev/null +++ b/bottleneck/tests/data/test_326_A @@ -0,0 +1,50 @@ +10 12 +3 12 +0 1 +2 7 +3 9 +6 14 +9 19 +3 7 +8 10 +1 2 +4 7 +1 4 +5 6 +10 16 +6 11 +4 9 +5 10 +5 6 +5 10 +3 6 +6 15 +3 7 +9 19 +4 6 +9 19 +4 13 +8 18 +10 12 +9 13 +1 3 +9 16 +9 10 +5 10 +6 12 +8 10 +3 9 +1 8 +7 8 +7 11 +9 13 +0 1 +9 12 +5 14 +10 13 +1 4 +0 8 +9 19 +4 11 +4 13 +7 11 diff --git a/bottleneck/tests/data/test_326_B b/bottleneck/tests/data/test_326_B new file mode 100644 index 0000000..6b37e39 --- /dev/null +++ b/bottleneck/tests/data/test_326_B @@ -0,0 +1,50 @@ +1 8 +6 14 +7 9 +5 14 +8 12 +9 19 +0 5 +0 2 +9 10 +2 3 +4 9 +9 10 +9 10 +7 15 +1 4 +1 6 +9 16 +8 12 +2 9 +9 15 +7 8 +7 13 +0 1 +4 14 +7 17 +4 10 +7 12 +9 10 +5 12 +4 9 +7 8 +3 10 +10 11 +9 19 +1 2 +5 13 +6 13 +6 11 +6 8 +2 9 +5 9 +4 12 +10 18 +5 9 +9 12 +1 11 +7 8 +3 5 +7 17 +3 9 diff --git a/bottleneck/tests/data/test_327_A b/bottleneck/tests/data/test_327_A new file mode 100644 index 0000000..0d54292 --- /dev/null +++ b/bottleneck/tests/data/test_327_A @@ -0,0 +1,50 @@ +8 17 +4 7 +1 11 +9 10 +4 7 +0 9 +10 13 +5 7 +2 6 +7 9 +8 9 +5 8 +4 5 +3 9 +5 13 +10 17 +1 4 +7 15 +1 6 +10 17 +3 11 +10 11 +1 6 +3 12 +5 10 +8 14 +2 11 +6 11 +9 14 +7 16 +1 9 +8 9 +0 5 +4 13 +4 5 +1 3 +10 17 +10 13 +7 11 +4 9 +7 8 +7 15 +0 10 +3 4 +2 3 +6 16 +10 18 +6 13 +9 11 +6 16 diff --git a/bottleneck/tests/data/test_327_B b/bottleneck/tests/data/test_327_B new file mode 100644 index 0000000..548eb3f --- /dev/null +++ b/bottleneck/tests/data/test_327_B @@ -0,0 +1,50 @@ +1 6 +10 11 +1 9 +6 10 +7 17 +9 11 +7 10 +6 10 +4 13 +7 17 +7 11 +3 4 +2 5 +0 8 +8 10 +7 9 +3 7 +4 12 +8 10 +4 6 +9 17 +1 2 +1 5 +6 11 +0 4 +5 8 +5 6 +7 13 +5 10 +4 5 +8 17 +10 12 +7 8 +3 13 +2 3 +3 9 +10 17 +0 1 +0 1 +9 16 +7 8 +3 4 +1 10 +4 13 +1 2 +9 10 +1 2 +5 14 +2 6 +1 5 diff --git a/bottleneck/tests/data/test_328_A b/bottleneck/tests/data/test_328_A new file mode 100644 index 0000000..810b747 --- /dev/null +++ b/bottleneck/tests/data/test_328_A @@ -0,0 +1,50 @@ +2 11 +0 5 +2 6 +5 14 +1 10 +10 12 +0 1 +4 5 +1 2 +8 16 +8 9 +4 13 +2 3 +4 6 +4 14 +0 5 +5 15 +7 12 +5 8 +5 6 +10 15 +7 8 +3 9 +0 10 +4 5 +4 7 +1 9 +10 13 +0 1 +9 10 +2 9 +2 3 +8 16 +4 5 +9 11 +2 9 +7 14 +8 11 +5 8 +10 19 +4 7 +5 14 +0 5 +4 5 +2 5 +3 8 +10 20 +1 11 +4 14 +3 11 diff --git a/bottleneck/tests/data/test_328_B b/bottleneck/tests/data/test_328_B new file mode 100644 index 0000000..e781d51 --- /dev/null +++ b/bottleneck/tests/data/test_328_B @@ -0,0 +1,50 @@ +3 10 +5 8 +4 10 +4 5 +4 11 +4 6 +0 5 +7 11 +6 16 +3 4 +7 14 +1 7 +10 11 +10 11 +2 3 +2 11 +9 12 +2 3 +5 6 +2 4 +2 8 +7 9 +10 14 +4 13 +2 9 +10 11 +6 13 +5 8 +1 8 +7 11 +7 8 +10 17 +9 10 +3 8 +2 4 +10 14 +4 9 +10 19 +9 11 +3 5 +10 20 +9 10 +3 6 +6 15 +6 14 +9 19 +9 11 +5 12 +3 8 +3 9 diff --git a/bottleneck/tests/data/test_329_A b/bottleneck/tests/data/test_329_A new file mode 100644 index 0000000..b02fd14 --- /dev/null +++ b/bottleneck/tests/data/test_329_A @@ -0,0 +1,50 @@ +8 13 +4 13 +0 1 +6 12 +3 12 +0 1 +7 8 +4 12 +2 6 +7 11 +4 8 +3 5 +2 6 +5 12 +2 12 +1 10 +3 10 +2 3 +3 10 +3 4 +2 4 +7 8 +9 16 +3 5 +5 6 +6 11 +3 12 +2 4 +10 11 +8 11 +8 11 +2 9 +0 6 +4 7 +0 1 +2 3 +2 5 +8 16 +8 9 +2 11 +6 16 +6 12 +10 17 +6 11 +3 9 +2 9 +10 11 +9 12 +4 5 +2 6 diff --git a/bottleneck/tests/data/test_329_B b/bottleneck/tests/data/test_329_B new file mode 100644 index 0000000..0ca3fcd --- /dev/null +++ b/bottleneck/tests/data/test_329_B @@ -0,0 +1,50 @@ +0 9 +5 6 +0 5 +9 12 +10 20 +9 12 +7 14 +9 19 +2 3 +5 14 +0 4 +2 3 +8 9 +0 5 +2 5 +9 10 +3 4 +1 7 +7 13 +10 13 +2 11 +9 18 +0 5 +5 13 +1 9 +10 19 +3 5 +2 6 +0 4 +8 13 +10 11 +5 13 +0 2 +0 1 +6 16 +5 8 +8 9 +2 10 +0 3 +4 14 +8 11 +7 14 +1 2 +1 3 +3 5 +3 10 +9 17 +3 6 +3 4 +1 10 diff --git a/bottleneck/tests/data/test_330_A b/bottleneck/tests/data/test_330_A new file mode 100644 index 0000000..4cdb2c9 --- /dev/null +++ b/bottleneck/tests/data/test_330_A @@ -0,0 +1,50 @@ +7 13 +2 8 +2 4 +5 15 +4 10 +9 17 +2 9 +9 12 +6 7 +6 7 +5 15 +4 5 +5 6 +4 6 +0 7 +4 7 +0 2 +8 18 +1 11 +10 11 +5 13 +3 5 +3 11 +0 1 +1 2 +10 14 +1 6 +2 3 +5 15 +3 13 +8 10 +6 15 +10 14 +3 10 +7 17 +4 14 +2 8 +10 11 +9 18 +10 15 +6 12 +4 8 +0 7 +9 11 +6 7 +1 8 +10 15 +0 6 +1 7 +7 16 diff --git a/bottleneck/tests/data/test_330_B b/bottleneck/tests/data/test_330_B new file mode 100644 index 0000000..01f1570 --- /dev/null +++ b/bottleneck/tests/data/test_330_B @@ -0,0 +1,50 @@ +7 10 +4 5 +2 9 +1 2 +7 10 +4 6 +1 9 +6 16 +0 1 +9 14 +6 11 +10 16 +6 9 +0 6 +0 5 +10 12 +4 14 +7 8 +0 3 +9 18 +8 14 +4 7 +1 9 +2 5 +8 9 +9 10 +2 6 +1 11 +2 8 +4 10 +0 4 +2 9 +3 4 +0 10 +5 14 +4 12 +5 11 +4 7 +2 9 +7 16 +8 14 +8 12 +2 9 +4 11 +4 7 +0 1 +6 7 +5 6 +4 12 +2 4 diff --git a/bottleneck/tests/data/test_331_A b/bottleneck/tests/data/test_331_A new file mode 100644 index 0000000..a271a66 --- /dev/null +++ b/bottleneck/tests/data/test_331_A @@ -0,0 +1,50 @@ +10 17 +0 8 +5 8 +10 11 +8 9 +10 13 +10 20 +6 7 +7 12 +0 8 +4 7 +0 10 +8 9 +1 9 +3 8 +10 12 +7 12 +9 18 +6 13 +3 9 +5 9 +6 7 +9 18 +10 17 +6 14 +4 8 +5 14 +10 17 +10 11 +7 16 +5 11 +8 10 +7 14 +6 8 +10 17 +7 8 +3 5 +0 2 +4 10 +8 9 +1 2 +3 12 +1 4 +2 6 +0 1 +0 10 +9 10 +5 6 +5 9 +10 15 diff --git a/bottleneck/tests/data/test_331_B b/bottleneck/tests/data/test_331_B new file mode 100644 index 0000000..72a1a7b --- /dev/null +++ b/bottleneck/tests/data/test_331_B @@ -0,0 +1,50 @@ +5 6 +9 13 +9 17 +8 9 +8 18 +4 14 +8 9 +6 9 +1 5 +8 15 +6 7 +0 1 +5 12 +9 15 +10 16 +2 4 +3 6 +10 14 +10 13 +3 10 +7 13 +9 13 +6 16 +2 3 +6 10 +8 12 +0 9 +2 3 +5 13 +10 12 +1 5 +5 11 +2 6 +1 10 +7 11 +4 5 +5 14 +1 10 +10 15 +3 11 +2 6 +4 10 +6 13 +1 9 +3 10 +6 15 +2 8 +8 14 +4 7 +9 14 diff --git a/bottleneck/tests/data/test_332_A b/bottleneck/tests/data/test_332_A new file mode 100644 index 0000000..c1e999a --- /dev/null +++ b/bottleneck/tests/data/test_332_A @@ -0,0 +1,50 @@ +5 13 +10 20 +4 5 +4 5 +3 13 +9 13 +6 8 +10 11 +3 8 +6 9 +4 5 +2 10 +10 17 +4 13 +8 12 +7 13 +2 4 +10 16 +3 11 +7 16 +5 6 +5 11 +3 6 +8 10 +2 3 +6 9 +1 3 +5 9 +7 16 +6 11 +4 14 +6 15 +10 18 +10 15 +1 10 +2 12 +6 14 +3 12 +0 5 +5 8 +4 14 +9 13 +7 14 +8 9 +8 17 +9 19 +6 15 +5 15 +1 8 +7 12 diff --git a/bottleneck/tests/data/test_332_B b/bottleneck/tests/data/test_332_B new file mode 100644 index 0000000..1f4686e --- /dev/null +++ b/bottleneck/tests/data/test_332_B @@ -0,0 +1,50 @@ +10 11 +5 11 +0 10 +5 9 +4 7 +10 14 +7 12 +10 19 +1 7 +4 8 +3 12 +10 20 +0 3 +4 11 +8 11 +3 13 +0 9 +6 8 +4 12 +6 9 +5 8 +9 12 +7 12 +8 14 +6 11 +0 5 +4 7 +10 19 +9 10 +10 11 +4 8 +10 14 +2 11 +10 11 +3 5 +0 6 +10 20 +9 19 +5 14 +4 11 +7 9 +9 15 +2 3 +2 4 +8 14 +10 14 +9 16 +2 7 +9 17 +7 13 diff --git a/bottleneck/tests/data/test_333_A b/bottleneck/tests/data/test_333_A new file mode 100644 index 0000000..c1cc126 --- /dev/null +++ b/bottleneck/tests/data/test_333_A @@ -0,0 +1,50 @@ +7 12 +4 10 +2 5 +3 12 +8 15 +0 9 +0 6 +9 12 +6 16 +10 18 +5 13 +10 11 +2 3 +9 14 +10 19 +2 11 +9 10 +5 15 +9 19 +1 2 +7 8 +1 5 +8 10 +8 9 +2 3 +7 8 +3 4 +2 6 +0 10 +10 17 +7 16 +6 8 +1 2 +9 10 +10 19 +4 5 +4 10 +2 4 +8 11 +2 7 +2 7 +0 5 +3 7 +7 16 +5 15 +4 11 +7 16 +0 6 +7 8 +1 2 diff --git a/bottleneck/tests/data/test_333_B b/bottleneck/tests/data/test_333_B new file mode 100644 index 0000000..fd22364 --- /dev/null +++ b/bottleneck/tests/data/test_333_B @@ -0,0 +1,50 @@ +0 3 +10 20 +6 13 +9 16 +3 4 +4 13 +2 3 +3 8 +5 13 +10 11 +3 5 +3 5 +7 10 +1 4 +1 2 +8 18 +0 10 +6 16 +5 8 +7 15 +4 10 +1 11 +5 9 +5 13 +1 2 +1 9 +3 8 +6 16 +7 8 +0 8 +9 15 +4 5 +10 11 +0 5 +2 5 +1 8 +10 16 +2 9 +8 14 +6 10 +9 18 +7 8 +9 16 +4 12 +10 15 +3 10 +6 10 +2 5 +4 14 +3 4 diff --git a/bottleneck/tests/data/test_334_A b/bottleneck/tests/data/test_334_A new file mode 100644 index 0000000..914d6c3 --- /dev/null +++ b/bottleneck/tests/data/test_334_A @@ -0,0 +1,50 @@ +8 13 +10 20 +2 3 +7 15 +9 17 +2 12 +5 6 +2 5 +6 13 +10 20 +3 8 +1 9 +3 13 +10 11 +1 5 +7 11 +5 15 +5 6 +9 11 +3 5 +3 8 +6 16 +8 12 +4 7 +0 4 +8 12 +5 15 +9 14 +5 6 +3 4 +1 8 +2 7 +4 7 +8 18 +3 9 +0 5 +0 10 +8 10 +8 14 +3 13 +3 9 +9 17 +5 15 +7 16 +1 9 +0 2 +1 9 +9 12 +5 13 +9 19 diff --git a/bottleneck/tests/data/test_334_B b/bottleneck/tests/data/test_334_B new file mode 100644 index 0000000..27524b9 --- /dev/null +++ b/bottleneck/tests/data/test_334_B @@ -0,0 +1,50 @@ +10 11 +9 14 +2 11 +10 17 +9 15 +4 9 +7 16 +9 12 +8 12 +7 11 +6 16 +3 12 +0 4 +9 15 +3 10 +2 9 +2 3 +6 7 +3 9 +5 8 +6 8 +4 5 +9 14 +6 10 +1 10 +10 12 +8 10 +7 12 +3 9 +4 9 +4 11 +5 10 +9 11 +7 8 +6 16 +8 17 +9 14 +4 14 +2 4 +1 2 +9 11 +7 13 +9 10 +2 9 +2 12 +2 4 +9 16 +7 17 +3 11 +8 9 diff --git a/bottleneck/tests/data/test_335_A b/bottleneck/tests/data/test_335_A new file mode 100644 index 0000000..1a400bc --- /dev/null +++ b/bottleneck/tests/data/test_335_A @@ -0,0 +1,50 @@ +0 2 +6 11 +7 11 +7 12 +7 11 +9 10 +6 14 +4 5 +5 7 +7 16 +2 3 +10 15 +10 19 +9 16 +6 15 +7 14 +8 18 +7 15 +8 14 +10 11 +10 11 +5 9 +0 10 +9 11 +9 19 +0 6 +2 10 +8 15 +1 7 +5 12 +3 4 +1 6 +0 2 +9 16 +9 19 +10 16 +6 9 +1 9 +6 7 +9 10 +8 14 +4 8 +9 10 +1 10 +5 6 +9 11 +7 16 +0 9 +7 13 +7 9 diff --git a/bottleneck/tests/data/test_335_B b/bottleneck/tests/data/test_335_B new file mode 100644 index 0000000..93c3211 --- /dev/null +++ b/bottleneck/tests/data/test_335_B @@ -0,0 +1,50 @@ +8 14 +9 15 +6 11 +4 14 +2 3 +7 13 +5 11 +8 14 +1 8 +9 12 +0 10 +3 5 +10 11 +0 2 +5 13 +6 12 +8 11 +4 10 +5 14 +6 15 +9 19 +4 6 +4 5 +9 16 +5 9 +5 6 +7 14 +9 11 +9 18 +1 9 +1 4 +6 12 +2 10 +8 14 +1 11 +2 4 +9 16 +3 9 +2 11 +7 12 +6 9 +0 8 +9 17 +9 15 +10 12 +0 7 +6 9 +8 13 +10 18 +6 15 diff --git a/bottleneck/tests/data/test_336_A b/bottleneck/tests/data/test_336_A new file mode 100644 index 0000000..5410dc3 --- /dev/null +++ b/bottleneck/tests/data/test_336_A @@ -0,0 +1,50 @@ +4 7 +9 16 +2 5 +0 8 +0 9 +10 11 +7 11 +2 3 +6 13 +6 9 +2 8 +7 16 +2 6 +5 14 +6 9 +7 17 +1 8 +0 4 +7 13 +9 13 +10 16 +0 2 +7 16 +8 17 +7 11 +6 7 +2 12 +5 12 +9 17 +6 7 +1 5 +9 12 +7 10 +6 11 +7 16 +6 11 +6 7 +2 6 +1 8 +10 14 +5 6 +2 7 +5 6 +2 11 +8 10 +6 10 +3 12 +3 11 +8 12 +8 10 diff --git a/bottleneck/tests/data/test_336_B b/bottleneck/tests/data/test_336_B new file mode 100644 index 0000000..8b60a46 --- /dev/null +++ b/bottleneck/tests/data/test_336_B @@ -0,0 +1,50 @@ +6 15 +8 10 +0 10 +5 10 +1 10 +8 17 +2 9 +7 9 +9 12 +7 8 +8 9 +7 8 +4 14 +10 17 +3 8 +2 7 +1 10 +6 13 +9 16 +6 13 +2 4 +4 12 +2 3 +3 10 +6 13 +6 11 +6 13 +9 17 +4 5 +0 1 +5 6 +0 7 +1 8 +5 9 +0 7 +0 3 +8 10 +4 6 +10 16 +1 9 +1 10 +7 12 +1 3 +6 10 +5 6 +9 10 +6 7 +5 7 +8 12 +0 9 diff --git a/bottleneck/tests/data/test_337_A b/bottleneck/tests/data/test_337_A new file mode 100644 index 0000000..652b5f1 --- /dev/null +++ b/bottleneck/tests/data/test_337_A @@ -0,0 +1,50 @@ +3 5 +1 2 +6 14 +10 18 +3 10 +1 11 +1 7 +2 11 +1 2 +0 7 +2 8 +9 14 +8 10 +1 3 +5 11 +7 8 +6 14 +8 17 +2 10 +7 15 +0 2 +4 12 +10 18 +10 11 +2 6 +3 9 +0 4 +5 15 +4 10 +8 14 +5 12 +10 11 +9 16 +9 14 +3 4 +3 5 +1 10 +3 4 +10 11 +1 6 +6 10 +1 8 +9 10 +1 6 +5 6 +5 6 +3 13 +10 19 +5 9 +4 12 diff --git a/bottleneck/tests/data/test_337_B b/bottleneck/tests/data/test_337_B new file mode 100644 index 0000000..eba21bc --- /dev/null +++ b/bottleneck/tests/data/test_337_B @@ -0,0 +1,50 @@ +0 7 +2 4 +5 14 +7 8 +10 18 +4 13 +2 9 +8 16 +1 9 +5 9 +6 13 +0 1 +10 17 +4 9 +8 15 +1 9 +9 17 +5 14 +7 14 +5 12 +9 18 +8 15 +3 12 +7 17 +1 4 +5 7 +5 15 +3 6 +2 5 +1 2 +4 6 +6 15 +3 7 +4 5 +1 9 +7 8 +10 14 +9 18 +9 13 +9 11 +2 6 +8 10 +2 8 +0 9 +0 10 +1 5 +0 1 +6 9 +6 10 +0 3 diff --git a/bottleneck/tests/data/test_338_A b/bottleneck/tests/data/test_338_A new file mode 100644 index 0000000..567256f --- /dev/null +++ b/bottleneck/tests/data/test_338_A @@ -0,0 +1,50 @@ +9 16 +3 6 +8 18 +7 15 +5 7 +8 14 +2 6 +10 12 +1 5 +5 8 +2 11 +1 3 +7 15 +5 13 +10 16 +1 11 +4 6 +7 8 +4 5 +5 11 +7 12 +6 12 +7 15 +8 16 +4 14 +1 6 +4 13 +3 12 +0 1 +3 6 +4 5 +4 11 +8 9 +0 7 +2 10 +9 17 +1 11 +5 9 +1 8 +10 11 +1 7 +6 8 +7 16 +1 4 +10 17 +2 8 +6 10 +10 14 +1 11 +5 15 diff --git a/bottleneck/tests/data/test_338_B b/bottleneck/tests/data/test_338_B new file mode 100644 index 0000000..82c3d80 --- /dev/null +++ b/bottleneck/tests/data/test_338_B @@ -0,0 +1,50 @@ +1 2 +10 14 +5 6 +8 17 +9 17 +1 6 +4 10 +3 13 +7 15 +5 6 +8 10 +2 5 +3 13 +5 15 +2 4 +8 10 +2 9 +1 3 +6 12 +3 6 +2 12 +2 10 +3 11 +0 2 +4 12 +7 12 +3 5 +6 7 +9 17 +8 9 +3 12 +10 20 +2 10 +3 5 +2 11 +7 17 +3 12 +2 6 +9 11 +4 12 +0 8 +9 11 +1 4 +2 7 +7 16 +0 8 +4 13 +4 5 +8 14 +8 11 diff --git a/bottleneck/tests/data/test_339_A b/bottleneck/tests/data/test_339_A new file mode 100644 index 0000000..9148a9c --- /dev/null +++ b/bottleneck/tests/data/test_339_A @@ -0,0 +1,50 @@ +3 4 +10 13 +6 8 +8 10 +2 3 +3 6 +10 19 +6 14 +6 9 +0 8 +5 7 +10 15 +9 17 +2 3 +9 14 +6 14 +1 11 +4 9 +2 3 +9 16 +6 11 +3 8 +6 9 +10 12 +1 3 +3 13 +7 14 +4 9 +8 11 +7 9 +1 2 +9 11 +8 17 +0 2 +9 19 +5 14 +6 8 +10 14 +7 13 +0 10 +4 5 +0 9 +2 9 +0 5 +9 15 +3 9 +3 7 +7 16 +1 2 +10 18 diff --git a/bottleneck/tests/data/test_339_B b/bottleneck/tests/data/test_339_B new file mode 100644 index 0000000..385967f --- /dev/null +++ b/bottleneck/tests/data/test_339_B @@ -0,0 +1,50 @@ +2 9 +3 4 +1 5 +8 12 +8 12 +5 14 +4 9 +4 10 +5 8 +3 8 +9 10 +0 3 +1 10 +0 7 +6 13 +4 7 +10 20 +7 8 +5 8 +9 18 +1 6 +5 8 +4 8 +7 12 +7 17 +10 18 +9 10 +8 16 +8 13 +7 16 +9 18 +0 1 +7 8 +3 13 +3 4 +1 8 +6 14 +5 14 +3 6 +6 9 +7 15 +5 13 +6 15 +2 12 +9 19 +7 15 +0 4 +3 12 +9 11 +10 11 diff --git a/bottleneck/tests/data/test_340_A b/bottleneck/tests/data/test_340_A new file mode 100644 index 0000000..4af25b1 --- /dev/null +++ b/bottleneck/tests/data/test_340_A @@ -0,0 +1,100 @@ +0 5 +10 19 +1 4 +6 9 +1 6 +3 11 +4 10 +9 12 +1 10 +7 12 +8 11 +3 4 +8 18 +9 15 +0 2 +9 12 +1 6 +0 8 +4 5 +2 10 +0 2 +4 10 +6 7 +7 13 +2 3 +0 9 +5 6 +0 10 +5 7 +6 15 +9 15 +1 2 +2 3 +9 14 +8 18 +4 10 +7 15 +5 8 +3 11 +10 14 +4 12 +8 13 +8 17 +2 4 +0 9 +10 19 +3 4 +0 5 +8 15 +1 9 +8 11 +9 16 +0 1 +3 6 +4 6 +2 9 +3 9 +5 11 +1 8 +6 12 +10 19 +5 6 +3 12 +0 2 +9 17 +0 3 +0 4 +10 20 +8 14 +2 10 +3 7 +7 12 +2 4 +8 9 +1 7 +3 13 +1 5 +6 7 +10 13 +9 10 +6 15 +9 11 +0 10 +6 8 +8 9 +5 9 +10 16 +5 11 +7 13 +2 6 +2 3 +5 7 +4 10 +9 19 +7 10 +1 8 +2 9 +10 13 +10 12 +7 11 diff --git a/bottleneck/tests/data/test_340_B b/bottleneck/tests/data/test_340_B new file mode 100644 index 0000000..0e3fa2a --- /dev/null +++ b/bottleneck/tests/data/test_340_B @@ -0,0 +1,100 @@ +7 11 +8 16 +1 4 +8 12 +9 19 +2 5 +2 8 +2 9 +0 4 +1 9 +5 7 +5 9 +10 14 +1 9 +3 10 +0 8 +10 11 +2 10 +2 11 +9 15 +0 1 +0 10 +3 10 +5 12 +5 12 +1 2 +7 12 +0 1 +1 4 +6 15 +1 5 +9 13 +9 17 +9 19 +8 9 +4 6 +1 10 +5 9 +2 3 +7 8 +1 5 +1 4 +8 9 +6 14 +2 9 +1 8 +4 10 +8 10 +1 11 +7 10 +8 13 +5 9 +9 19 +8 9 +3 6 +10 11 +7 8 +3 8 +6 9 +4 12 +10 19 +5 8 +1 9 +8 13 +2 4 +1 8 +7 16 +3 9 +0 3 +1 4 +8 17 +8 9 +5 12 +9 19 +2 8 +0 1 +1 2 +6 10 +1 7 +7 15 +4 8 +2 5 +3 13 +4 7 +9 12 +8 15 +10 12 +9 12 +5 13 +6 15 +1 3 +4 9 +9 16 +7 8 +2 12 +10 19 +1 9 +2 5 +5 6 +9 12 diff --git a/bottleneck/tests/data/test_341_A b/bottleneck/tests/data/test_341_A new file mode 100644 index 0000000..932688b --- /dev/null +++ b/bottleneck/tests/data/test_341_A @@ -0,0 +1,100 @@ +6 15 +6 7 +3 11 +8 15 +2 10 +10 13 +6 16 +9 10 +8 15 +3 12 +10 14 +1 8 +8 17 +1 8 +4 10 +7 12 +1 10 +7 10 +8 18 +3 5 +1 3 +1 6 +0 3 +10 19 +8 18 +4 7 +1 3 +2 8 +1 10 +4 13 +10 13 +10 17 +0 4 +6 12 +4 5 +3 8 +2 4 +4 10 +5 11 +9 14 +5 15 +2 11 +4 12 +5 11 +7 16 +5 7 +4 7 +6 7 +2 6 +3 12 +10 15 +7 12 +1 9 +0 1 +5 8 +1 8 +5 12 +1 3 +2 3 +4 10 +2 10 +10 19 +2 3 +4 13 +10 14 +3 4 +0 10 +5 7 +10 11 +8 11 +6 11 +7 17 +3 4 +0 6 +9 11 +3 12 +5 12 +9 10 +6 8 +4 11 +3 7 +2 6 +9 10 +8 18 +10 11 +2 9 +4 9 +4 13 +0 5 +10 17 +5 6 +6 16 +0 3 +0 8 +5 15 +5 12 +3 10 +8 11 +10 17 +4 6 diff --git a/bottleneck/tests/data/test_341_B b/bottleneck/tests/data/test_341_B new file mode 100644 index 0000000..68cc4b9 --- /dev/null +++ b/bottleneck/tests/data/test_341_B @@ -0,0 +1,100 @@ +9 15 +10 18 +2 5 +5 7 +3 13 +6 13 +0 1 +2 12 +2 11 +3 4 +3 5 +1 9 +4 7 +10 12 +3 8 +9 17 +10 20 +5 7 +3 5 +9 18 +9 12 +3 5 +0 7 +1 2 +6 14 +7 8 +0 2 +3 11 +10 18 +7 10 +0 4 +10 11 +6 12 +8 16 +7 17 +0 8 +0 10 +9 16 +8 15 +5 6 +5 10 +4 8 +4 10 +1 11 +6 7 +6 9 +1 10 +3 5 +10 20 +10 11 +2 8 +10 13 +9 14 +8 11 +10 11 +7 16 +8 10 +8 17 +5 14 +0 7 +7 8 +4 8 +6 14 +2 5 +10 15 +2 10 +2 4 +8 13 +6 14 +2 3 +7 8 +8 13 +4 8 +1 6 +1 9 +0 1 +7 14 +10 11 +2 7 +5 15 +0 4 +1 7 +0 6 +6 13 +6 15 +1 2 +2 4 +8 9 +0 1 +3 4 +8 9 +9 11 +9 16 +8 17 +1 3 +8 10 +8 9 +8 15 +1 3 +7 16 diff --git a/bottleneck/tests/data/test_342_A b/bottleneck/tests/data/test_342_A new file mode 100644 index 0000000..04cdc19 --- /dev/null +++ b/bottleneck/tests/data/test_342_A @@ -0,0 +1,100 @@ +4 8 +4 5 +1 9 +4 13 +2 10 +7 15 +6 7 +8 17 +1 8 +6 7 +9 19 +8 12 +10 18 +5 7 +8 13 +9 12 +9 14 +1 2 +7 11 +9 11 +6 15 +2 12 +6 10 +0 7 +1 10 +2 5 +8 11 +3 13 +3 11 +3 10 +6 14 +1 10 +4 6 +3 13 +5 10 +3 9 +9 16 +3 4 +0 2 +9 10 +10 16 +5 12 +6 11 +4 7 +9 18 +10 16 +5 7 +6 12 +0 7 +5 9 +8 18 +4 7 +2 6 +8 17 +7 10 +7 10 +6 11 +8 9 +3 7 +8 16 +4 9 +6 12 +0 6 +4 12 +10 15 +10 17 +10 20 +3 11 +2 12 +0 9 +3 12 +4 5 +5 7 +3 7 +0 4 +5 9 +1 7 +6 13 +9 13 +8 9 +0 6 +3 10 +1 11 +0 2 +0 6 +3 9 +2 7 +4 7 +8 14 +2 7 +2 4 +4 7 +1 7 +10 13 +6 16 +5 15 +7 17 +7 10 +3 5 +7 10 diff --git a/bottleneck/tests/data/test_342_B b/bottleneck/tests/data/test_342_B new file mode 100644 index 0000000..e6aae99 --- /dev/null +++ b/bottleneck/tests/data/test_342_B @@ -0,0 +1,100 @@ +9 16 +6 15 +1 4 +0 1 +3 5 +2 3 +10 20 +3 7 +0 10 +3 13 +7 8 +4 6 +7 14 +8 9 +8 14 +10 20 +1 9 +4 14 +4 5 +2 6 +6 8 +1 10 +7 14 +8 10 +4 8 +7 8 +7 12 +6 16 +6 7 +9 19 +8 12 +1 9 +1 3 +10 16 +3 6 +2 8 +0 2 +7 15 +2 3 +8 13 +5 8 +1 2 +10 11 +4 11 +5 12 +10 15 +7 8 +2 5 +6 13 +8 17 +8 14 +4 8 +6 11 +5 6 +0 7 +0 5 +8 13 +1 2 +6 11 +6 11 +8 9 +4 5 +4 8 +0 5 +3 9 +1 3 +8 9 +10 16 +8 17 +8 17 +3 4 +3 5 +8 12 +9 10 +9 10 +8 14 +3 10 +5 9 +1 4 +9 19 +0 2 +7 8 +6 8 +7 12 +6 12 +0 1 +9 11 +3 11 +5 6 +0 8 +2 4 +1 7 +3 4 +0 3 +9 17 +2 9 +1 6 +2 6 +7 15 +1 4 diff --git a/bottleneck/tests/data/test_343_A b/bottleneck/tests/data/test_343_A new file mode 100644 index 0000000..9759369 --- /dev/null +++ b/bottleneck/tests/data/test_343_A @@ -0,0 +1,100 @@ +5 13 +5 9 +2 3 +6 14 +1 2 +3 6 +1 3 +9 14 +0 6 +1 8 +9 10 +4 5 +10 19 +6 13 +7 8 +10 16 +6 7 +10 18 +8 11 +2 8 +8 9 +5 10 +1 2 +10 14 +10 12 +8 17 +7 12 +9 12 +1 5 +2 4 +8 13 +2 11 +0 5 +4 8 +2 12 +2 10 +6 15 +1 2 +8 11 +8 18 +8 9 +7 9 +5 7 +0 10 +4 10 +5 13 +8 16 +5 11 +8 16 +7 9 +2 11 +8 12 +8 10 +9 16 +7 8 +5 15 +0 1 +6 7 +7 8 +6 7 +7 13 +9 16 +9 15 +3 11 +4 10 +2 10 +3 13 +0 1 +7 10 +9 10 +8 10 +3 4 +1 4 +1 6 +4 7 +4 10 +6 11 +10 13 +7 10 +9 14 +9 15 +7 9 +3 10 +6 8 +5 15 +8 11 +7 14 +8 18 +9 13 +9 15 +10 17 +3 13 +5 7 +8 16 +4 12 +9 10 +6 12 +1 9 +0 6 +5 11 diff --git a/bottleneck/tests/data/test_343_B b/bottleneck/tests/data/test_343_B new file mode 100644 index 0000000..e338ab2 --- /dev/null +++ b/bottleneck/tests/data/test_343_B @@ -0,0 +1,100 @@ +2 12 +5 9 +5 6 +10 19 +2 6 +6 14 +8 18 +6 9 +2 10 +5 7 +0 6 +7 10 +7 14 +10 15 +10 16 +6 16 +7 16 +3 8 +2 4 +2 11 +10 19 +7 15 +8 9 +7 11 +10 20 +9 11 +3 6 +6 15 +5 14 +2 3 +1 3 +5 11 +3 8 +2 9 +1 3 +10 20 +6 11 +0 9 +6 9 +0 5 +9 10 +2 7 +8 14 +9 19 +2 7 +10 11 +0 6 +4 7 +10 16 +9 12 +7 16 +5 12 +1 8 +4 12 +1 2 +1 8 +9 13 +9 14 +8 9 +4 9 +4 11 +9 19 +5 15 +2 3 +9 10 +8 15 +7 8 +9 10 +5 12 +2 12 +0 1 +3 4 +3 5 +5 14 +10 18 +3 10 +0 1 +9 10 +4 6 +10 18 +9 17 +6 7 +8 15 +3 11 +7 8 +6 12 +5 11 +0 10 +5 8 +6 15 +6 13 +0 4 +4 13 +6 9 +0 1 +0 1 +3 10 +8 17 +0 8 +9 18 diff --git a/bottleneck/tests/data/test_344_A b/bottleneck/tests/data/test_344_A new file mode 100644 index 0000000..e8e81ab --- /dev/null +++ b/bottleneck/tests/data/test_344_A @@ -0,0 +1,100 @@ +2 11 +2 7 +2 7 +1 11 +2 6 +0 9 +2 8 +2 12 +0 9 +5 10 +6 10 +2 4 +9 19 +0 6 +0 6 +9 18 +6 7 +3 13 +3 9 +1 4 +1 9 +1 11 +9 19 +8 9 +7 13 +5 13 +10 14 +10 12 +1 3 +10 17 +2 4 +8 9 +8 18 +7 15 +3 13 +10 19 +0 2 +0 10 +2 7 +5 6 +9 14 +0 4 +7 14 +10 11 +3 5 +0 2 +8 18 +4 5 +10 16 +9 18 +6 16 +4 8 +3 4 +2 7 +4 14 +4 10 +4 10 +10 14 +8 9 +7 16 +1 7 +4 14 +6 7 +3 4 +9 10 +2 3 +7 13 +10 13 +10 14 +3 8 +0 6 +3 4 +1 10 +6 12 +4 6 +3 9 +3 9 +5 11 +10 13 +2 5 +9 16 +4 14 +3 5 +0 1 +10 19 +9 16 +10 14 +0 4 +1 3 +6 8 +7 14 +1 11 +0 6 +1 5 +8 9 +8 11 +7 16 +10 11 +1 7 +2 12 diff --git a/bottleneck/tests/data/test_344_B b/bottleneck/tests/data/test_344_B new file mode 100644 index 0000000..af72be5 --- /dev/null +++ b/bottleneck/tests/data/test_344_B @@ -0,0 +1,100 @@ +10 11 +8 9 +3 12 +2 10 +1 6 +4 8 +8 11 +7 17 +8 18 +9 10 +5 6 +2 9 +8 10 +1 8 +3 13 +5 12 +8 14 +7 14 +2 12 +10 15 +0 7 +7 8 +8 17 +8 10 +4 8 +6 7 +6 8 +2 3 +5 15 +2 11 +10 18 +6 13 +1 2 +6 16 +2 8 +8 11 +9 18 +8 14 +6 16 +10 20 +8 9 +0 7 +1 5 +7 16 +10 17 +1 2 +2 5 +2 6 +3 4 +7 9 +5 8 +5 7 +5 7 +1 11 +7 10 +7 17 +7 14 +5 7 +10 20 +0 2 +5 9 +0 1 +4 12 +5 6 +5 6 +2 9 +0 10 +10 11 +2 7 +8 9 +5 6 +0 2 +4 10 +6 13 +5 15 +9 11 +3 9 +6 10 +0 4 +6 9 +6 16 +10 15 +6 16 +0 8 +4 12 +10 15 +6 11 +8 11 +8 9 +3 12 +4 11 +5 11 +10 14 +9 14 +3 12 +7 8 +2 7 +8 12 +8 9 +4 12 diff --git a/bottleneck/tests/data/test_345_A b/bottleneck/tests/data/test_345_A new file mode 100644 index 0000000..584e4ed --- /dev/null +++ b/bottleneck/tests/data/test_345_A @@ -0,0 +1,100 @@ +2 6 +6 16 +7 11 +0 4 +4 5 +3 9 +9 10 +6 12 +1 3 +9 16 +6 15 +10 14 +4 6 +6 7 +1 7 +2 8 +3 10 +9 10 +0 10 +0 1 +10 11 +3 8 +4 10 +9 15 +6 9 +0 3 +1 7 +1 3 +4 5 +8 12 +2 3 +6 14 +8 14 +1 9 +10 17 +4 5 +3 7 +9 10 +4 7 +7 12 +10 11 +6 11 +0 7 +6 8 +5 15 +1 5 +7 11 +5 7 +10 11 +9 14 +0 3 +8 12 +10 20 +0 10 +5 14 +5 8 +9 10 +3 12 +0 8 +1 11 +3 6 +3 5 +10 14 +3 12 +5 9 +5 13 +6 16 +7 15 +9 17 +7 12 +1 10 +7 10 +6 8 +3 12 +4 12 +5 9 +1 7 +7 16 +8 10 +1 11 +2 11 +4 10 +7 8 +5 15 +2 5 +3 10 +8 12 +9 12 +2 3 +0 3 +10 12 +0 10 +10 14 +4 6 +10 11 +8 17 +6 8 +10 16 +9 18 +5 7 diff --git a/bottleneck/tests/data/test_345_B b/bottleneck/tests/data/test_345_B new file mode 100644 index 0000000..8c3e758 --- /dev/null +++ b/bottleneck/tests/data/test_345_B @@ -0,0 +1,100 @@ +2 5 +8 13 +1 3 +4 13 +3 12 +1 9 +8 14 +4 13 +9 14 +8 14 +7 16 +8 14 +7 8 +0 9 +3 12 +9 14 +9 10 +2 3 +3 6 +6 15 +9 15 +6 12 +0 6 +9 12 +4 9 +5 14 +9 13 +8 9 +5 15 +2 7 +8 10 +0 2 +7 11 +5 10 +7 15 +5 6 +1 8 +7 9 +9 15 +3 10 +1 2 +3 6 +0 5 +6 16 +2 8 +9 10 +4 11 +2 3 +4 8 +5 11 +9 15 +2 7 +5 14 +10 18 +1 3 +9 14 +10 16 +3 8 +9 14 +1 3 +9 13 +2 7 +1 2 +7 13 +1 8 +2 5 +4 5 +3 5 +1 2 +10 13 +6 16 +10 15 +1 7 +10 12 +0 10 +7 12 +9 14 +4 5 +4 5 +6 9 +9 19 +5 12 +9 10 +9 19 +10 18 +8 11 +7 17 +0 3 +3 13 +3 11 +4 8 +6 11 +1 6 +0 9 +9 12 +8 13 +1 10 +7 13 +6 12 +4 8 diff --git a/bottleneck/tests/data/test_346_A b/bottleneck/tests/data/test_346_A new file mode 100644 index 0000000..ab26e2f --- /dev/null +++ b/bottleneck/tests/data/test_346_A @@ -0,0 +1,100 @@ +10 11 +1 11 +1 9 +0 5 +1 3 +10 18 +0 5 +4 5 +1 8 +8 16 +5 6 +9 13 +6 13 +4 5 +7 14 +8 9 +4 5 +9 11 +6 9 +9 18 +10 15 +8 15 +10 12 +3 7 +10 14 +3 9 +10 12 +3 9 +0 10 +5 8 +7 17 +8 11 +6 7 +10 17 +0 8 +0 1 +0 9 +8 10 +7 15 +8 17 +0 4 +0 3 +10 11 +7 10 +4 13 +4 9 +3 4 +4 5 +4 12 +4 11 +5 11 +3 4 +10 16 +0 2 +0 6 +8 10 +9 11 +7 15 +7 9 +5 11 +9 15 +7 8 +7 16 +4 14 +2 3 +5 8 +2 3 +9 15 +8 15 +6 15 +1 6 +2 5 +4 13 +6 12 +7 8 +0 2 +8 14 +4 9 +10 11 +10 16 +3 10 +7 16 +9 13 +1 2 +7 12 +3 5 +5 6 +4 12 +9 11 +6 7 +2 8 +9 10 +7 8 +0 6 +1 2 +5 9 +3 10 +3 13 +2 9 +2 9 diff --git a/bottleneck/tests/data/test_346_B b/bottleneck/tests/data/test_346_B new file mode 100644 index 0000000..5e30972 --- /dev/null +++ b/bottleneck/tests/data/test_346_B @@ -0,0 +1,100 @@ +8 15 +1 8 +10 15 +8 13 +9 16 +3 13 +3 5 +1 8 +8 16 +6 12 +7 16 +4 14 +3 9 +0 8 +9 18 +4 14 +1 10 +6 12 +4 5 +10 14 +3 6 +9 10 +1 4 +6 16 +8 17 +6 7 +0 5 +1 9 +3 7 +8 14 +9 17 +10 15 +3 10 +4 14 +9 10 +9 16 +4 9 +2 12 +4 5 +6 14 +3 12 +10 16 +10 14 +6 12 +2 11 +4 11 +1 10 +5 6 +3 13 +10 19 +4 8 +0 2 +7 9 +6 7 +10 12 +9 18 +2 8 +6 9 +2 6 +4 11 +9 18 +8 14 +10 16 +9 13 +4 5 +1 6 +9 15 +8 9 +10 14 +1 2 +9 17 +10 15 +5 8 +8 11 +8 9 +10 17 +2 4 +5 6 +1 4 +1 4 +5 15 +7 13 +6 12 +10 12 +7 13 +9 10 +5 9 +0 5 +1 7 +2 3 +9 14 +4 10 +8 9 +3 12 +2 3 +4 11 +10 20 +10 13 +3 9 +8 16 diff --git a/bottleneck/tests/data/test_347_A b/bottleneck/tests/data/test_347_A new file mode 100644 index 0000000..0cfd08b --- /dev/null +++ b/bottleneck/tests/data/test_347_A @@ -0,0 +1,100 @@ +0 3 +9 14 +9 11 +1 3 +7 8 +4 12 +7 8 +10 20 +8 13 +2 5 +8 9 +5 14 +8 9 +5 11 +10 14 +7 15 +4 9 +4 10 +1 2 +2 6 +6 12 +0 1 +7 8 +10 13 +4 9 +0 3 +2 3 +0 4 +3 6 +7 13 +0 1 +10 13 +3 4 +1 2 +0 5 +9 12 +1 11 +8 17 +3 4 +3 7 +4 9 +1 2 +1 9 +4 14 +10 11 +3 11 +8 9 +2 6 +4 7 +8 13 +7 10 +0 1 +10 19 +7 13 +6 11 +1 10 +4 12 +9 14 +5 12 +3 13 +0 1 +2 3 +4 8 +5 11 +8 18 +5 6 +0 3 +0 3 +5 8 +10 11 +3 9 +0 4 +8 11 +5 14 +3 7 +9 10 +6 7 +8 14 +9 18 +6 11 +7 8 +6 10 +4 9 +4 9 +9 14 +6 13 +6 13 +10 17 +7 17 +8 15 +7 9 +4 9 +4 14 +0 1 +5 15 +4 8 +0 7 +4 5 +7 16 +4 9 diff --git a/bottleneck/tests/data/test_347_B b/bottleneck/tests/data/test_347_B new file mode 100644 index 0000000..66d57ea --- /dev/null +++ b/bottleneck/tests/data/test_347_B @@ -0,0 +1,100 @@ +10 11 +6 15 +5 11 +8 9 +8 12 +4 7 +6 7 +6 11 +10 16 +6 15 +9 19 +7 16 +10 12 +0 1 +9 13 +9 10 +10 15 +6 10 +10 12 +7 10 +9 17 +2 3 +10 19 +2 3 +5 13 +7 9 +9 16 +9 18 +9 16 +4 10 +1 11 +6 7 +9 10 +6 7 +3 4 +8 15 +6 16 +8 9 +6 8 +8 10 +0 6 +7 9 +5 10 +3 6 +1 5 +6 7 +6 9 +4 13 +5 7 +8 17 +10 16 +9 19 +5 9 +2 3 +6 7 +7 16 +4 10 +3 10 +6 9 +3 11 +9 18 +7 15 +8 16 +6 9 +8 10 +6 10 +0 3 +1 2 +2 3 +5 11 +5 9 +1 11 +10 11 +0 10 +9 14 +1 5 +3 4 +3 10 +6 12 +0 7 +5 9 +9 12 +8 16 +7 12 +1 11 +9 11 +5 15 +10 19 +2 8 +5 15 +4 6 +3 10 +4 13 +0 9 +5 6 +6 10 +2 3 +3 12 +1 10 +6 7 diff --git a/bottleneck/tests/data/test_348_A b/bottleneck/tests/data/test_348_A new file mode 100644 index 0000000..8cef3ff --- /dev/null +++ b/bottleneck/tests/data/test_348_A @@ -0,0 +1,100 @@ +8 16 +2 7 +7 12 +0 9 +9 12 +8 18 +1 3 +2 6 +3 8 +2 6 +3 11 +5 10 +8 9 +0 7 +5 11 +3 10 +3 7 +2 12 +5 12 +6 12 +3 9 +2 9 +1 2 +9 12 +0 9 +9 16 +6 10 +6 10 +2 4 +2 10 +7 8 +8 15 +4 14 +3 5 +8 10 +7 9 +10 19 +8 16 +7 8 +3 4 +8 13 +3 13 +0 1 +7 16 +7 13 +0 7 +7 11 +3 10 +4 14 +4 7 +1 2 +10 13 +8 14 +5 15 +7 11 +6 14 +9 10 +6 15 +2 12 +4 13 +1 4 +6 11 +1 2 +2 7 +3 4 +3 4 +2 8 +2 10 +8 18 +9 12 +9 13 +8 9 +4 10 +5 6 +6 10 +8 9 +5 15 +3 7 +2 10 +1 5 +6 7 +4 5 +5 8 +10 17 +5 8 +10 19 +5 15 +3 10 +8 18 +0 2 +9 13 +2 11 +1 7 +4 12 +5 7 +4 10 +5 13 +3 4 +7 15 +0 1 diff --git a/bottleneck/tests/data/test_348_B b/bottleneck/tests/data/test_348_B new file mode 100644 index 0000000..5db1829 --- /dev/null +++ b/bottleneck/tests/data/test_348_B @@ -0,0 +1,100 @@ +8 18 +0 10 +5 12 +5 13 +5 6 +7 14 +3 9 +2 7 +0 1 +4 11 +10 11 +10 17 +7 8 +5 6 +1 6 +10 15 +8 9 +8 11 +5 6 +7 9 +4 6 +10 13 +6 14 +1 2 +5 6 +7 15 +1 9 +10 12 +9 10 +4 9 +7 10 +7 9 +8 16 +1 9 +5 10 +10 17 +4 5 +8 10 +5 15 +7 14 +5 10 +1 11 +7 11 +8 16 +1 10 +10 17 +2 6 +7 12 +4 5 +2 6 +0 7 +2 9 +10 11 +10 20 +7 17 +9 17 +2 8 +7 11 +2 4 +2 7 +7 10 +10 16 +6 13 +1 3 +2 10 +9 19 +2 12 +6 12 +4 5 +9 17 +1 6 +0 1 +4 10 +8 12 +0 8 +10 19 +2 11 +3 4 +0 1 +1 9 +9 14 +4 8 +2 10 +0 3 +7 15 +8 12 +7 15 +5 7 +8 11 +5 12 +2 11 +9 14 +10 12 +1 11 +7 9 +10 11 +1 5 +2 8 +6 15 +1 5 diff --git a/bottleneck/tests/data/test_349_A b/bottleneck/tests/data/test_349_A new file mode 100644 index 0000000..a3d008e --- /dev/null +++ b/bottleneck/tests/data/test_349_A @@ -0,0 +1,100 @@ +9 18 +5 7 +10 20 +5 6 +8 12 +5 6 +7 14 +9 17 +9 11 +6 7 +3 4 +1 2 +7 9 +1 8 +3 6 +10 13 +2 9 +9 10 +0 8 +3 12 +2 12 +0 6 +7 16 +8 16 +7 8 +10 12 +6 7 +10 13 +3 9 +2 3 +8 14 +4 8 +7 12 +6 12 +6 16 +1 8 +7 13 +2 10 +9 16 +3 10 +0 8 +10 11 +1 2 +5 12 +10 20 +3 10 +7 14 +2 12 +2 10 +4 7 +6 15 +6 7 +3 13 +5 12 +6 9 +5 6 +10 17 +6 7 +4 5 +10 11 +9 13 +6 14 +4 9 +4 7 +5 9 +6 11 +10 13 +5 15 +3 6 +1 7 +7 12 +6 7 +3 9 +5 9 +0 2 +10 14 +3 4 +6 16 +5 13 +2 7 +9 16 +0 6 +9 11 +0 3 +1 10 +3 6 +10 16 +4 10 +10 11 +9 14 +3 13 +0 3 +8 10 +8 18 +5 13 +5 11 +9 18 +1 3 +8 12 +5 6 diff --git a/bottleneck/tests/data/test_349_B b/bottleneck/tests/data/test_349_B new file mode 100644 index 0000000..d66b5eb --- /dev/null +++ b/bottleneck/tests/data/test_349_B @@ -0,0 +1,100 @@ +8 9 +2 3 +7 8 +4 14 +8 15 +3 8 +5 9 +1 3 +7 9 +0 5 +6 11 +3 12 +9 12 +4 10 +7 8 +10 14 +4 9 +5 6 +3 8 +7 15 +2 9 +3 4 +8 14 +7 11 +5 6 +10 19 +8 13 +2 5 +0 9 +0 8 +8 13 +4 8 +10 17 +10 14 +8 17 +2 6 +9 10 +6 10 +8 9 +0 2 +10 18 +6 9 +10 17 +0 3 +8 13 +9 12 +4 5 +8 14 +9 10 +1 2 +2 10 +8 15 +3 12 +4 9 +5 12 +3 11 +2 6 +3 7 +2 4 +5 10 +10 13 +2 4 +4 5 +1 2 +2 8 +2 3 +5 10 +6 7 +9 18 +8 9 +7 12 +2 4 +7 9 +7 14 +8 10 +10 11 +8 13 +10 15 +6 12 +10 16 +9 12 +9 16 +1 5 +2 9 +6 8 +8 10 +0 1 +1 3 +10 11 +7 16 +5 9 +7 13 +7 15 +6 10 +1 4 +10 15 +2 7 +2 7 +8 9 +3 13 diff --git a/bottleneck/tests/data/test_350_A b/bottleneck/tests/data/test_350_A new file mode 100644 index 0000000..734d037 --- /dev/null +++ b/bottleneck/tests/data/test_350_A @@ -0,0 +1,100 @@ +4 13 +9 10 +7 11 +3 10 +1 9 +3 4 +3 11 +7 13 +9 15 +7 8 +7 14 +0 10 +1 6 +7 10 +3 4 +1 2 +7 12 +7 17 +3 11 +4 9 +7 16 +10 11 +3 13 +3 7 +4 5 +3 7 +6 9 +9 10 +0 8 +9 16 +10 13 +5 13 +3 8 +6 9 +10 11 +9 16 +10 11 +5 15 +9 13 +0 1 +10 17 +1 2 +10 20 +0 2 +9 17 +4 9 +10 16 +3 5 +9 18 +2 6 +4 12 +3 12 +7 9 +2 11 +5 13 +2 5 +0 5 +3 9 +3 7 +2 6 +8 15 +1 9 +3 4 +5 10 +3 4 +9 19 +6 8 +9 10 +3 13 +4 5 +1 4 +10 11 +9 13 +8 10 +10 12 +6 8 +1 6 +9 10 +1 5 +1 2 +8 9 +2 9 +3 4 +1 10 +0 7 +0 1 +1 10 +7 8 +4 11 +9 12 +7 17 +8 9 +4 8 +8 11 +9 16 +4 7 +3 5 +3 6 +5 6 +0 9 diff --git a/bottleneck/tests/data/test_350_B b/bottleneck/tests/data/test_350_B new file mode 100644 index 0000000..3cf03c4 --- /dev/null +++ b/bottleneck/tests/data/test_350_B @@ -0,0 +1,100 @@ +10 11 +7 8 +10 13 +1 2 +0 1 +9 10 +10 18 +9 18 +1 9 +0 10 +10 11 +10 14 +0 2 +8 17 +7 17 +8 13 +0 3 +4 11 +5 7 +9 14 +5 14 +1 4 +5 9 +3 5 +10 18 +3 13 +3 4 +4 7 +3 7 +8 13 +1 11 +0 3 +1 4 +10 20 +4 5 +0 9 +9 13 +6 12 +9 19 +7 16 +2 3 +5 6 +1 9 +0 8 +2 4 +8 15 +0 7 +5 6 +4 8 +2 6 +1 2 +8 10 +2 10 +0 1 +8 13 +10 12 +1 8 +2 8 +2 4 +9 12 +7 8 +6 14 +3 9 +1 6 +7 13 +4 7 +10 17 +7 8 +9 12 +8 10 +6 13 +5 14 +5 13 +10 14 +9 13 +1 2 +2 3 +7 11 +6 13 +10 11 +1 9 +1 3 +7 14 +5 14 +2 3 +3 6 +9 11 +10 15 +0 6 +8 16 +4 11 +1 8 +3 8 +2 5 +6 13 +3 6 +7 8 +10 15 +7 10 +3 4 diff --git a/bottleneck/tests/data/test_351_A b/bottleneck/tests/data/test_351_A new file mode 100644 index 0000000..3989d6c --- /dev/null +++ b/bottleneck/tests/data/test_351_A @@ -0,0 +1,100 @@ +2 11 +9 18 +7 13 +10 12 +5 10 +8 11 +10 11 +0 1 +6 13 +2 12 +5 13 +6 8 +2 3 +4 6 +4 10 +5 12 +7 12 +6 13 +6 13 +7 17 +6 10 +6 14 +8 9 +1 9 +0 10 +7 10 +3 12 +9 14 +2 10 +10 14 +1 7 +1 6 +2 12 +7 13 +3 6 +4 5 +2 9 +7 8 +1 2 +8 12 +6 11 +7 8 +10 13 +3 10 +4 12 +5 8 +9 15 +8 15 +4 11 +6 7 +6 8 +9 18 +2 3 +10 20 +0 5 +10 20 +4 13 +10 12 +7 17 +8 16 +2 10 +9 11 +5 11 +5 15 +2 5 +3 12 +5 8 +6 9 +10 11 +3 8 +5 15 +3 13 +10 15 +8 10 +4 9 +4 6 +8 10 +8 17 +0 1 +1 2 +1 8 +7 14 +0 1 +1 5 +6 7 +1 6 +9 14 +8 12 +0 1 +2 10 +0 8 +4 10 +0 8 +3 4 +7 11 +9 13 +0 5 +3 9 +4 9 +2 4 diff --git a/bottleneck/tests/data/test_351_B b/bottleneck/tests/data/test_351_B new file mode 100644 index 0000000..b1c32d7 --- /dev/null +++ b/bottleneck/tests/data/test_351_B @@ -0,0 +1,100 @@ +9 18 +7 9 +6 14 +2 10 +6 7 +9 13 +3 12 +6 7 +4 7 +6 9 +3 4 +7 17 +0 9 +3 8 +0 3 +3 13 +10 15 +1 5 +1 7 +4 10 +2 9 +9 12 +4 11 +10 16 +2 7 +9 17 +1 8 +9 12 +5 8 +10 13 +2 11 +8 9 +5 6 +0 6 +0 5 +2 3 +9 12 +9 13 +8 10 +4 6 +1 4 +7 9 +4 5 +8 9 +5 7 +4 14 +5 9 +3 11 +4 8 +3 10 +4 13 +6 14 +6 13 +6 16 +9 18 +4 14 +3 4 +6 12 +2 6 +8 16 +9 13 +0 4 +9 18 +7 17 +0 5 +0 2 +7 8 +8 10 +0 1 +10 17 +2 7 +10 14 +7 9 +3 10 +1 11 +2 4 +7 13 +5 8 +2 7 +4 9 +8 14 +1 6 +2 4 +4 5 +6 12 +8 9 +0 4 +4 5 +0 7 +9 12 +8 9 +4 9 +8 9 +9 18 +3 10 +0 3 +10 16 +3 9 +3 7 +3 13 diff --git a/bottleneck/tests/data/test_352_A b/bottleneck/tests/data/test_352_A new file mode 100644 index 0000000..df81454 --- /dev/null +++ b/bottleneck/tests/data/test_352_A @@ -0,0 +1,100 @@ +8 12 +1 7 +7 15 +10 15 +5 8 +1 7 +1 2 +1 7 +6 10 +6 12 +8 16 +0 10 +4 8 +1 2 +6 13 +7 11 +5 11 +5 6 +0 1 +8 17 +0 2 +0 4 +9 16 +9 16 +10 13 +5 12 +3 11 +4 9 +9 12 +9 13 +1 5 +1 2 +2 6 +1 7 +8 17 +7 8 +4 9 +9 13 +1 8 +7 9 +0 10 +7 8 +9 15 +5 11 +0 4 +6 9 +0 10 +10 19 +6 11 +0 10 +7 16 +9 10 +2 5 +6 7 +6 11 +5 14 +9 10 +6 11 +8 12 +7 11 +4 12 +9 11 +1 4 +5 7 +6 8 +3 4 +8 15 +2 5 +8 13 +1 2 +4 5 +5 12 +6 15 +6 10 +1 8 +0 9 +0 2 +9 18 +7 14 +4 8 +5 10 +0 10 +9 10 +0 10 +10 14 +0 1 +7 8 +9 14 +8 11 +8 12 +8 14 +7 16 +4 7 +4 14 +0 4 +2 3 +6 16 +9 16 +6 12 +8 17 diff --git a/bottleneck/tests/data/test_352_B b/bottleneck/tests/data/test_352_B new file mode 100644 index 0000000..9b30bae --- /dev/null +++ b/bottleneck/tests/data/test_352_B @@ -0,0 +1,100 @@ +2 10 +0 1 +10 15 +7 14 +2 3 +0 9 +1 4 +5 6 +1 4 +2 8 +2 4 +0 6 +2 8 +0 1 +10 14 +5 11 +0 6 +10 17 +2 9 +10 16 +7 14 +4 11 +6 7 +3 6 +7 16 +2 8 +0 3 +1 2 +5 7 +10 12 +5 6 +1 3 +5 14 +5 14 +6 13 +8 16 +0 10 +6 12 +9 17 +3 5 +4 10 +3 6 +1 9 +1 9 +8 17 +3 4 +0 1 +1 9 +9 11 +6 7 +0 7 +3 4 +9 15 +9 13 +0 5 +1 10 +6 15 +10 19 +5 14 +1 11 +6 12 +4 13 +4 11 +2 3 +7 11 +2 5 +0 6 +0 2 +10 11 +1 5 +6 7 +2 10 +9 17 +0 5 +8 13 +2 12 +6 7 +1 6 +9 17 +8 14 +0 10 +1 2 +2 3 +2 10 +2 12 +4 6 +8 9 +7 8 +6 10 +7 17 +8 17 +10 19 +4 6 +7 9 +2 12 +2 10 +8 15 +0 4 +1 6 +2 5 diff --git a/bottleneck/tests/data/test_353_A b/bottleneck/tests/data/test_353_A new file mode 100644 index 0000000..3dda9d1 --- /dev/null +++ b/bottleneck/tests/data/test_353_A @@ -0,0 +1,100 @@ +1 11 +3 5 +3 5 +2 3 +9 10 +0 9 +6 9 +0 8 +8 10 +6 12 +1 10 +1 2 +0 8 +8 18 +0 7 +3 4 +2 7 +8 15 +1 5 +1 9 +2 11 +7 11 +3 12 +4 6 +0 2 +8 16 +0 1 +10 18 +4 9 +8 18 +1 8 +5 7 +8 16 +1 2 +4 10 +9 18 +3 5 +5 8 +2 10 +3 8 +8 16 +10 12 +0 1 +0 9 +3 7 +3 4 +3 6 +3 9 +8 10 +2 12 +6 10 +3 13 +2 6 +9 10 +6 10 +9 19 +3 5 +4 6 +8 9 +2 3 +5 6 +3 4 +3 7 +7 17 +8 12 +5 6 +1 2 +0 1 +6 10 +7 9 +5 15 +7 14 +2 9 +1 5 +4 5 +0 9 +1 9 +7 8 +1 7 +2 3 +10 16 +5 6 +5 10 +0 9 +1 11 +7 10 +7 17 +10 19 +1 2 +9 19 +10 14 +7 11 +9 14 +8 17 +1 2 +7 16 +2 9 +9 16 +3 4 +0 1 diff --git a/bottleneck/tests/data/test_353_B b/bottleneck/tests/data/test_353_B new file mode 100644 index 0000000..16ed654 --- /dev/null +++ b/bottleneck/tests/data/test_353_B @@ -0,0 +1,100 @@ +1 9 +1 9 +9 14 +7 9 +9 18 +6 13 +1 2 +5 15 +7 8 +8 15 +5 11 +9 13 +1 8 +4 6 +10 11 +6 7 +4 10 +0 4 +3 7 +0 1 +10 11 +7 13 +0 2 +4 5 +10 18 +8 13 +4 11 +8 18 +8 15 +1 10 +6 13 +5 8 +10 15 +7 14 +2 3 +10 19 +5 8 +2 3 +7 14 +1 7 +1 9 +6 12 +2 8 +3 11 +5 13 +2 3 +10 16 +10 15 +2 10 +10 18 +3 6 +0 6 +1 4 +6 11 +1 3 +8 9 +8 16 +0 2 +8 12 +9 10 +1 4 +0 3 +0 2 +5 14 +3 11 +7 12 +7 17 +5 6 +10 16 +3 4 +0 6 +0 3 +0 1 +3 13 +6 7 +4 9 +7 9 +0 1 +10 13 +8 12 +0 6 +2 8 +10 13 +2 3 +7 13 +9 19 +4 7 +10 16 +1 5 +2 11 +3 13 +8 13 +3 9 +3 9 +3 13 +7 15 +0 2 +2 6 +7 14 +1 4 diff --git a/bottleneck/tests/data/test_354_A b/bottleneck/tests/data/test_354_A new file mode 100644 index 0000000..c701ef2 --- /dev/null +++ b/bottleneck/tests/data/test_354_A @@ -0,0 +1,100 @@ +6 16 +5 15 +0 2 +8 18 +10 15 +0 2 +3 5 +6 14 +1 9 +3 12 +6 8 +2 3 +2 11 +8 14 +10 15 +3 5 +10 12 +1 4 +3 4 +8 15 +10 15 +6 15 +10 16 +10 17 +3 11 +10 17 +2 3 +2 10 +5 9 +5 9 +8 16 +0 7 +7 15 +1 3 +0 1 +10 17 +10 12 +0 8 +4 11 +1 8 +5 8 +0 10 +2 4 +1 2 +7 11 +7 14 +4 5 +7 16 +3 7 +5 7 +8 9 +8 12 +2 3 +6 16 +6 16 +5 7 +5 14 +0 10 +9 16 +9 11 +6 16 +5 14 +5 11 +8 9 +4 10 +5 6 +1 2 +6 15 +1 5 +9 10 +8 9 +0 8 +4 5 +10 19 +7 11 +8 18 +3 4 +7 8 +2 9 +6 11 +1 2 +7 16 +0 2 +1 10 +10 11 +4 5 +9 12 +8 13 +1 11 +4 8 +0 1 +9 15 +0 7 +2 4 +1 6 +1 10 +8 15 +8 18 +8 10 +9 17 diff --git a/bottleneck/tests/data/test_354_B b/bottleneck/tests/data/test_354_B new file mode 100644 index 0000000..0a21b24 --- /dev/null +++ b/bottleneck/tests/data/test_354_B @@ -0,0 +1,100 @@ +7 8 +3 12 +9 19 +5 13 +8 9 +4 14 +10 12 +1 4 +1 5 +8 16 +5 10 +7 10 +5 9 +4 7 +6 9 +6 7 +0 1 +7 8 +1 7 +9 19 +7 8 +3 13 +10 18 +8 13 +3 13 +6 15 +2 3 +3 13 +1 8 +9 18 +4 9 +9 10 +10 18 +6 9 +8 17 +1 5 +3 8 +1 11 +7 12 +0 1 +4 5 +7 16 +6 11 +3 5 +5 14 +6 11 +3 10 +7 8 +8 11 +7 13 +10 17 +1 9 +7 14 +1 10 +3 12 +7 15 +1 4 +7 10 +0 5 +3 9 +5 12 +7 16 +5 6 +0 10 +0 1 +3 5 +0 7 +1 6 +4 5 +3 8 +1 8 +2 3 +10 20 +4 10 +7 11 +0 4 +4 6 +5 8 +10 17 +9 10 +0 3 +0 3 +5 9 +9 19 +8 14 +9 14 +4 11 +10 17 +7 9 +6 7 +10 19 +9 10 +3 8 +2 11 +4 14 +9 16 +2 8 +2 5 +5 11 +10 18 diff --git a/bottleneck/tests/data/test_355_A b/bottleneck/tests/data/test_355_A new file mode 100644 index 0000000..48d49bd --- /dev/null +++ b/bottleneck/tests/data/test_355_A @@ -0,0 +1,100 @@ +6 9 +0 2 +2 6 +4 6 +5 7 +8 14 +10 15 +8 9 +6 14 +9 15 +6 12 +1 9 +4 7 +1 4 +3 8 +0 2 +6 16 +6 7 +5 7 +9 11 +10 20 +3 11 +9 13 +2 5 +0 3 +7 14 +7 8 +10 18 +5 7 +4 11 +0 10 +7 16 +1 8 +7 15 +3 4 +3 5 +8 13 +9 12 +5 10 +9 13 +5 11 +8 16 +3 4 +4 11 +9 18 +1 3 +10 14 +5 6 +5 10 +8 11 +8 10 +7 14 +3 6 +9 17 +0 3 +0 2 +2 11 +4 8 +0 6 +7 14 +10 11 +5 7 +9 18 +2 8 +4 5 +1 11 +0 9 +9 10 +3 12 +10 19 +3 7 +7 14 +1 3 +8 9 +9 13 +0 8 +5 11 +6 13 +5 10 +10 15 +8 15 +6 12 +2 6 +2 4 +4 9 +3 6 +9 10 +5 10 +10 15 +9 17 +5 10 +6 11 +2 8 +4 5 +5 15 +2 3 +7 14 +4 10 +4 11 +8 10 diff --git a/bottleneck/tests/data/test_355_B b/bottleneck/tests/data/test_355_B new file mode 100644 index 0000000..cd9cec5 --- /dev/null +++ b/bottleneck/tests/data/test_355_B @@ -0,0 +1,100 @@ +4 11 +9 14 +8 12 +3 5 +5 11 +7 15 +7 15 +1 10 +1 6 +4 13 +7 8 +5 7 +1 2 +3 13 +2 5 +4 10 +6 7 +10 11 +2 6 +1 10 +4 5 +10 18 +5 9 +0 3 +8 9 +5 13 +4 5 +1 2 +4 9 +1 11 +5 15 +9 11 +2 3 +0 1 +4 11 +6 10 +8 10 +2 8 +3 5 +4 8 +10 20 +0 5 +3 13 +2 8 +0 10 +2 7 +10 11 +0 2 +8 12 +1 10 +3 9 +2 8 +6 7 +10 17 +4 5 +2 7 +5 8 +10 20 +5 13 +10 19 +4 13 +1 9 +6 12 +3 4 +4 5 +8 18 +7 14 +1 10 +7 14 +5 9 +1 6 +6 14 +7 8 +5 12 +4 14 +1 7 +2 8 +6 11 +7 13 +3 10 +3 4 +3 11 +9 10 +1 11 +9 10 +2 8 +10 19 +3 6 +10 13 +4 5 +7 16 +2 7 +4 7 +9 15 +9 17 +4 8 +5 8 +4 8 +0 1 +10 17 diff --git a/bottleneck/tests/data/test_356_A b/bottleneck/tests/data/test_356_A new file mode 100644 index 0000000..cb92f38 --- /dev/null +++ b/bottleneck/tests/data/test_356_A @@ -0,0 +1,100 @@ +7 12 +5 6 +6 13 +1 6 +9 10 +10 11 +2 9 +4 14 +4 11 +5 14 +4 13 +6 12 +7 13 +8 9 +5 11 +6 14 +9 13 +0 3 +7 11 +3 13 +2 5 +0 6 +1 8 +3 9 +8 17 +1 7 +10 19 +0 4 +8 18 +0 7 +1 3 +1 10 +0 6 +1 5 +3 11 +0 3 +7 13 +10 11 +2 4 +2 5 +4 11 +4 14 +0 6 +2 11 +6 11 +3 4 +2 6 +6 16 +6 8 +9 13 +8 12 +7 16 +9 16 +4 8 +1 8 +9 19 +7 13 +9 19 +5 6 +3 10 +2 10 +2 10 +9 11 +9 18 +7 13 +7 11 +5 8 +8 13 +8 10 +7 13 +7 17 +6 15 +5 8 +5 9 +5 9 +7 10 +4 10 +9 13 +6 16 +4 12 +5 6 +9 17 +1 2 +2 7 +5 11 +2 12 +10 16 +1 10 +10 19 +5 9 +10 19 +5 10 +10 13 +10 13 +6 7 +10 19 +2 10 +4 6 +3 5 +1 11 diff --git a/bottleneck/tests/data/test_356_B b/bottleneck/tests/data/test_356_B new file mode 100644 index 0000000..365ed3f --- /dev/null +++ b/bottleneck/tests/data/test_356_B @@ -0,0 +1,100 @@ +6 11 +8 12 +7 8 +3 4 +9 12 +8 15 +4 5 +8 18 +2 3 +0 2 +8 11 +1 2 +2 8 +9 13 +6 10 +10 20 +0 3 +7 12 +7 11 +10 20 +6 10 +8 14 +5 6 +5 10 +8 12 +6 16 +1 11 +3 9 +7 17 +8 17 +5 11 +6 16 +5 9 +9 19 +7 11 +0 8 +8 17 +6 13 +0 5 +10 19 +3 8 +0 8 +0 9 +9 16 +8 12 +3 4 +2 3 +1 2 +6 11 +3 4 +2 4 +3 11 +4 11 +8 15 +7 9 +8 10 +4 14 +9 12 +9 16 +1 2 +7 13 +5 11 +1 8 +9 12 +0 5 +10 13 +9 11 +5 14 +0 9 +10 20 +7 8 +4 10 +0 3 +3 12 +8 17 +1 9 +5 9 +2 3 +1 8 +6 7 +3 4 +1 8 +7 10 +1 10 +0 1 +4 6 +8 11 +9 13 +5 6 +10 14 +10 16 +1 6 +5 9 +10 20 +7 13 +3 11 +0 3 +0 7 +6 12 +1 9 diff --git a/bottleneck/tests/data/test_357_A b/bottleneck/tests/data/test_357_A new file mode 100644 index 0000000..de1e8eb --- /dev/null +++ b/bottleneck/tests/data/test_357_A @@ -0,0 +1,100 @@ +6 11 +4 11 +5 10 +8 9 +4 12 +10 17 +0 1 +9 15 +3 7 +6 13 +7 8 +3 4 +4 12 +8 9 +2 4 +10 20 +3 4 +6 16 +6 16 +4 12 +5 6 +9 12 +1 8 +6 14 +8 13 +2 10 +4 14 +3 5 +7 12 +2 7 +3 6 +1 2 +4 5 +7 13 +3 8 +6 9 +4 9 +6 7 +1 6 +8 10 +10 15 +3 6 +10 19 +8 14 +8 9 +4 7 +7 11 +4 11 +2 5 +0 7 +10 13 +4 6 +5 6 +7 16 +2 10 +8 18 +4 5 +9 10 +8 9 +8 14 +0 1 +5 15 +2 9 +6 7 +8 10 +10 14 +8 11 +5 8 +1 5 +9 15 +3 10 +5 10 +1 5 +4 6 +3 11 +6 7 +9 12 +5 11 +1 6 +6 14 +0 5 +3 12 +2 10 +7 12 +7 15 +1 11 +8 12 +3 7 +10 14 +8 9 +8 9 +9 10 +2 12 +3 4 +1 10 +9 15 +1 7 +10 14 +1 3 +10 14 diff --git a/bottleneck/tests/data/test_357_B b/bottleneck/tests/data/test_357_B new file mode 100644 index 0000000..1c68b90 --- /dev/null +++ b/bottleneck/tests/data/test_357_B @@ -0,0 +1,100 @@ +8 10 +0 5 +6 15 +7 17 +6 14 +3 4 +3 5 +0 9 +1 5 +1 2 +2 3 +6 7 +9 10 +3 13 +9 13 +8 11 +5 7 +2 11 +7 9 +10 11 +9 11 +10 12 +4 10 +8 9 +4 12 +8 11 +5 14 +0 1 +8 9 +9 13 +6 14 +7 10 +10 17 +2 10 +9 17 +8 16 +1 3 +9 19 +0 1 +7 15 +2 8 +1 2 +0 1 +2 3 +7 8 +6 11 +10 20 +3 12 +6 11 +7 9 +5 8 +5 14 +3 12 +8 17 +10 15 +9 14 +8 9 +7 13 +9 12 +1 7 +5 11 +5 11 +6 8 +8 9 +5 6 +3 10 +3 4 +1 3 +3 10 +7 8 +1 9 +3 13 +3 10 +7 14 +4 14 +1 10 +0 10 +9 10 +10 15 +1 2 +8 10 +3 4 +2 4 +2 3 +7 13 +3 6 +8 14 +5 6 +3 11 +8 14 +0 5 +3 10 +7 11 +3 11 +10 19 +8 9 +0 1 +10 20 +7 8 +0 8 diff --git a/bottleneck/tests/data/test_358_A b/bottleneck/tests/data/test_358_A new file mode 100644 index 0000000..2297dae --- /dev/null +++ b/bottleneck/tests/data/test_358_A @@ -0,0 +1,100 @@ +7 12 +6 15 +1 4 +1 5 +7 9 +7 16 +0 2 +2 3 +6 12 +1 9 +9 12 +6 8 +8 9 +2 3 +6 11 +4 6 +7 11 +7 10 +8 9 +5 8 +6 8 +0 6 +9 18 +0 1 +7 14 +7 9 +7 14 +10 15 +3 10 +7 16 +8 15 +6 12 +7 9 +6 11 +3 8 +3 4 +4 6 +5 11 +10 16 +7 9 +2 8 +1 6 +8 9 +7 8 +7 14 +9 19 +4 9 +0 1 +3 4 +5 11 +2 12 +3 9 +9 16 +3 5 +0 8 +7 13 +7 17 +0 1 +4 12 +7 15 +8 11 +8 18 +4 8 +8 12 +8 18 +4 12 +4 10 +6 12 +9 14 +6 12 +9 11 +6 7 +0 5 +1 6 +8 17 +5 9 +5 14 +5 10 +9 19 +6 11 +3 4 +4 14 +1 11 +1 4 +10 19 +6 13 +3 4 +2 3 +2 7 +1 11 +5 11 +6 14 +1 6 +8 9 +7 8 +1 9 +2 8 +3 10 +10 17 +4 5 diff --git a/bottleneck/tests/data/test_358_B b/bottleneck/tests/data/test_358_B new file mode 100644 index 0000000..e2d7d03 --- /dev/null +++ b/bottleneck/tests/data/test_358_B @@ -0,0 +1,100 @@ +6 7 +6 12 +10 13 +3 6 +9 10 +8 11 +3 13 +3 4 +10 16 +8 9 +3 5 +1 8 +4 5 +8 13 +9 18 +3 11 +3 13 +8 12 +7 11 +0 2 +4 7 +8 13 +7 16 +0 10 +1 9 +8 18 +1 9 +3 12 +1 10 +0 9 +9 16 +8 14 +0 7 +9 10 +0 3 +3 4 +6 8 +8 17 +9 16 +5 7 +0 2 +6 7 +1 6 +6 13 +4 5 +8 12 +9 14 +6 16 +9 14 +10 20 +4 14 +0 3 +9 18 +1 11 +6 13 +3 10 +9 13 +9 17 +6 16 +5 8 +3 4 +2 8 +9 15 +6 10 +8 18 +4 5 +3 5 +2 8 +3 11 +9 10 +3 11 +4 11 +9 12 +1 11 +0 10 +0 9 +8 12 +0 3 +9 14 +8 12 +6 14 +10 16 +3 8 +5 11 +1 6 +10 17 +0 2 +9 17 +8 10 +10 11 +9 13 +0 10 +5 11 +9 10 +4 5 +5 7 +4 14 +0 6 +0 1 +5 15 diff --git a/bottleneck/tests/data/test_359_A b/bottleneck/tests/data/test_359_A new file mode 100644 index 0000000..6e990e4 --- /dev/null +++ b/bottleneck/tests/data/test_359_A @@ -0,0 +1,100 @@ +7 8 +8 11 +7 8 +5 6 +4 5 +4 5 +7 8 +3 8 +2 8 +8 10 +2 3 +6 7 +0 5 +2 4 +8 17 +7 15 +8 9 +6 7 +10 11 +7 14 +9 10 +0 8 +3 7 +3 13 +3 12 +4 10 +9 17 +9 19 +5 14 +2 8 +9 19 +4 11 +2 12 +0 2 +4 12 +5 13 +1 3 +6 15 +2 12 +3 4 +0 10 +1 2 +9 19 +5 14 +3 7 +0 7 +10 12 +1 11 +1 8 +0 1 +5 11 +3 4 +1 4 +2 6 +8 12 +9 13 +10 13 +0 7 +9 18 +5 6 +2 4 +10 14 +7 8 +5 15 +9 10 +5 13 +0 9 +4 6 +2 3 +2 11 +9 15 +4 11 +1 7 +4 9 +6 14 +8 15 +3 11 +3 6 +8 13 +6 12 +7 9 +10 20 +9 19 +6 7 +2 12 +0 10 +10 13 +10 13 +5 15 +4 14 +9 15 +0 7 +7 13 +9 10 +5 10 +8 10 +8 17 +8 17 +0 9 +0 1 diff --git a/bottleneck/tests/data/test_359_B b/bottleneck/tests/data/test_359_B new file mode 100644 index 0000000..97c1bfe --- /dev/null +++ b/bottleneck/tests/data/test_359_B @@ -0,0 +1,100 @@ +9 12 +2 11 +9 10 +10 12 +2 7 +4 7 +0 1 +9 11 +10 15 +4 12 +9 15 +9 18 +10 20 +7 8 +6 8 +10 20 +9 10 +8 18 +7 17 +3 4 +5 6 +1 8 +3 4 +9 18 +9 13 +5 15 +9 10 +5 11 +5 11 +9 11 +2 5 +9 16 +7 8 +0 4 +3 11 +1 7 +0 10 +5 12 +5 15 +2 3 +10 19 +9 12 +1 3 +5 11 +3 8 +9 15 +2 12 +9 16 +7 9 +1 2 +1 8 +4 13 +4 8 +0 1 +2 6 +1 6 +8 10 +6 12 +8 16 +8 17 +4 12 +9 12 +0 8 +3 10 +6 13 +4 5 +1 9 +5 9 +0 6 +6 7 +1 10 +7 17 +4 7 +5 15 +2 4 +9 14 +7 17 +5 13 +9 11 +0 7 +1 9 +3 8 +5 14 +1 7 +3 11 +1 10 +8 12 +10 11 +0 7 +7 14 +6 14 +0 10 +3 5 +10 18 +3 10 +6 7 +1 3 +1 3 +8 16 +7 16 diff --git a/bottleneck/tests/data/test_360_A b/bottleneck/tests/data/test_360_A new file mode 100644 index 0000000..d271aaa --- /dev/null +++ b/bottleneck/tests/data/test_360_A @@ -0,0 +1,2 @@ +84 85 +52 129 diff --git a/bottleneck/tests/data/test_360_B b/bottleneck/tests/data/test_360_B new file mode 100644 index 0000000..2408922 --- /dev/null +++ b/bottleneck/tests/data/test_360_B @@ -0,0 +1,2 @@ +74 97 +83 94 diff --git a/bottleneck/tests/data/test_361_A b/bottleneck/tests/data/test_361_A new file mode 100644 index 0000000..b4eea74 --- /dev/null +++ b/bottleneck/tests/data/test_361_A @@ -0,0 +1,2 @@ +97 159 +60 73 diff --git a/bottleneck/tests/data/test_361_B b/bottleneck/tests/data/test_361_B new file mode 100644 index 0000000..3680b00 --- /dev/null +++ b/bottleneck/tests/data/test_361_B @@ -0,0 +1,2 @@ +47 60 +95 167 diff --git a/bottleneck/tests/data/test_362_A b/bottleneck/tests/data/test_362_A new file mode 100644 index 0000000..1c4803d --- /dev/null +++ b/bottleneck/tests/data/test_362_A @@ -0,0 +1,2 @@ +85 121 +2 61 diff --git a/bottleneck/tests/data/test_362_B b/bottleneck/tests/data/test_362_B new file mode 100644 index 0000000..37fc7aa --- /dev/null +++ b/bottleneck/tests/data/test_362_B @@ -0,0 +1,2 @@ +41 67 +80 101 diff --git a/bottleneck/tests/data/test_363_A b/bottleneck/tests/data/test_363_A new file mode 100644 index 0000000..909ac51 --- /dev/null +++ b/bottleneck/tests/data/test_363_A @@ -0,0 +1,2 @@ +77 159 +60 118 diff --git a/bottleneck/tests/data/test_363_B b/bottleneck/tests/data/test_363_B new file mode 100644 index 0000000..4c76429 --- /dev/null +++ b/bottleneck/tests/data/test_363_B @@ -0,0 +1,2 @@ +52 73 +71 103 diff --git a/bottleneck/tests/data/test_364_A b/bottleneck/tests/data/test_364_A new file mode 100644 index 0000000..a6e34b7 --- /dev/null +++ b/bottleneck/tests/data/test_364_A @@ -0,0 +1,2 @@ +20 21 +70 88 diff --git a/bottleneck/tests/data/test_364_B b/bottleneck/tests/data/test_364_B new file mode 100644 index 0000000..ba5c4bf --- /dev/null +++ b/bottleneck/tests/data/test_364_B @@ -0,0 +1,2 @@ +65 72 +81 164 diff --git a/bottleneck/tests/data/test_365_A b/bottleneck/tests/data/test_365_A new file mode 100644 index 0000000..6c9d44c --- /dev/null +++ b/bottleneck/tests/data/test_365_A @@ -0,0 +1,2 @@ +9 64 +48 115 diff --git a/bottleneck/tests/data/test_365_B b/bottleneck/tests/data/test_365_B new file mode 100644 index 0000000..f9e51a7 --- /dev/null +++ b/bottleneck/tests/data/test_365_B @@ -0,0 +1,2 @@ +87 125 +74 132 diff --git a/bottleneck/tests/data/test_366_A b/bottleneck/tests/data/test_366_A new file mode 100644 index 0000000..fbf146c --- /dev/null +++ b/bottleneck/tests/data/test_366_A @@ -0,0 +1,2 @@ +97 162 +27 43 diff --git a/bottleneck/tests/data/test_366_B b/bottleneck/tests/data/test_366_B new file mode 100644 index 0000000..7385b5f --- /dev/null +++ b/bottleneck/tests/data/test_366_B @@ -0,0 +1,2 @@ +51 149 +65 126 diff --git a/bottleneck/tests/data/test_367_A b/bottleneck/tests/data/test_367_A new file mode 100644 index 0000000..48190bb --- /dev/null +++ b/bottleneck/tests/data/test_367_A @@ -0,0 +1,2 @@ +36 104 +19 85 diff --git a/bottleneck/tests/data/test_367_B b/bottleneck/tests/data/test_367_B new file mode 100644 index 0000000..7e26c08 --- /dev/null +++ b/bottleneck/tests/data/test_367_B @@ -0,0 +1,2 @@ +96 171 +17 21 diff --git a/bottleneck/tests/data/test_368_A b/bottleneck/tests/data/test_368_A new file mode 100644 index 0000000..4b4767d --- /dev/null +++ b/bottleneck/tests/data/test_368_A @@ -0,0 +1,2 @@ +72 156 +84 129 diff --git a/bottleneck/tests/data/test_368_B b/bottleneck/tests/data/test_368_B new file mode 100644 index 0000000..3c72417 --- /dev/null +++ b/bottleneck/tests/data/test_368_B @@ -0,0 +1,2 @@ +32 71 +88 129 diff --git a/bottleneck/tests/data/test_369_A b/bottleneck/tests/data/test_369_A new file mode 100644 index 0000000..d8a01b6 --- /dev/null +++ b/bottleneck/tests/data/test_369_A @@ -0,0 +1,2 @@ +56 128 +69 161 diff --git a/bottleneck/tests/data/test_369_B b/bottleneck/tests/data/test_369_B new file mode 100644 index 0000000..9f7da60 --- /dev/null +++ b/bottleneck/tests/data/test_369_B @@ -0,0 +1,2 @@ +3 84 +92 119 diff --git a/bottleneck/tests/data/test_370_A b/bottleneck/tests/data/test_370_A new file mode 100644 index 0000000..bdc8979 --- /dev/null +++ b/bottleneck/tests/data/test_370_A @@ -0,0 +1,2 @@ +49 140 +100 135 diff --git a/bottleneck/tests/data/test_370_B b/bottleneck/tests/data/test_370_B new file mode 100644 index 0000000..e145eb4 --- /dev/null +++ b/bottleneck/tests/data/test_370_B @@ -0,0 +1,2 @@ +28 51 +55 70 diff --git a/bottleneck/tests/data/test_371_A b/bottleneck/tests/data/test_371_A new file mode 100644 index 0000000..208a164 --- /dev/null +++ b/bottleneck/tests/data/test_371_A @@ -0,0 +1,2 @@ +93 154 +54 138 diff --git a/bottleneck/tests/data/test_371_B b/bottleneck/tests/data/test_371_B new file mode 100644 index 0000000..7a2fc8a --- /dev/null +++ b/bottleneck/tests/data/test_371_B @@ -0,0 +1,2 @@ +31 81 +88 143 diff --git a/bottleneck/tests/data/test_372_A b/bottleneck/tests/data/test_372_A new file mode 100644 index 0000000..dd3597a --- /dev/null +++ b/bottleneck/tests/data/test_372_A @@ -0,0 +1,2 @@ +3 92 +88 127 diff --git a/bottleneck/tests/data/test_372_B b/bottleneck/tests/data/test_372_B new file mode 100644 index 0000000..225c36e --- /dev/null +++ b/bottleneck/tests/data/test_372_B @@ -0,0 +1,2 @@ +6 95 +54 74 diff --git a/bottleneck/tests/data/test_373_A b/bottleneck/tests/data/test_373_A new file mode 100644 index 0000000..0a84fd2 --- /dev/null +++ b/bottleneck/tests/data/test_373_A @@ -0,0 +1,2 @@ +80 109 +36 96 diff --git a/bottleneck/tests/data/test_373_B b/bottleneck/tests/data/test_373_B new file mode 100644 index 0000000..b790337 --- /dev/null +++ b/bottleneck/tests/data/test_373_B @@ -0,0 +1,2 @@ +64 106 +12 78 diff --git a/bottleneck/tests/data/test_374_A b/bottleneck/tests/data/test_374_A new file mode 100644 index 0000000..0df06a4 --- /dev/null +++ b/bottleneck/tests/data/test_374_A @@ -0,0 +1,2 @@ +91 158 +15 61 diff --git a/bottleneck/tests/data/test_374_B b/bottleneck/tests/data/test_374_B new file mode 100644 index 0000000..7bd1bdd --- /dev/null +++ b/bottleneck/tests/data/test_374_B @@ -0,0 +1,2 @@ +85 155 +5 64 diff --git a/bottleneck/tests/data/test_375_A b/bottleneck/tests/data/test_375_A new file mode 100644 index 0000000..77cd274 --- /dev/null +++ b/bottleneck/tests/data/test_375_A @@ -0,0 +1,2 @@ +77 154 +15 27 diff --git a/bottleneck/tests/data/test_375_B b/bottleneck/tests/data/test_375_B new file mode 100644 index 0000000..db3c6ee --- /dev/null +++ b/bottleneck/tests/data/test_375_B @@ -0,0 +1,2 @@ +81 144 +44 79 diff --git a/bottleneck/tests/data/test_376_A b/bottleneck/tests/data/test_376_A new file mode 100644 index 0000000..aca7402 --- /dev/null +++ b/bottleneck/tests/data/test_376_A @@ -0,0 +1,2 @@ +20 47 +61 129 diff --git a/bottleneck/tests/data/test_376_B b/bottleneck/tests/data/test_376_B new file mode 100644 index 0000000..5bbae78 --- /dev/null +++ b/bottleneck/tests/data/test_376_B @@ -0,0 +1,2 @@ +41 98 +76 137 diff --git a/bottleneck/tests/data/test_377_A b/bottleneck/tests/data/test_377_A new file mode 100644 index 0000000..707adfd --- /dev/null +++ b/bottleneck/tests/data/test_377_A @@ -0,0 +1,2 @@ +91 123 +17 50 diff --git a/bottleneck/tests/data/test_377_B b/bottleneck/tests/data/test_377_B new file mode 100644 index 0000000..afbe113 --- /dev/null +++ b/bottleneck/tests/data/test_377_B @@ -0,0 +1,2 @@ +45 116 +18 98 diff --git a/bottleneck/tests/data/test_378_A b/bottleneck/tests/data/test_378_A new file mode 100644 index 0000000..7ac23e9 --- /dev/null +++ b/bottleneck/tests/data/test_378_A @@ -0,0 +1,2 @@ +98 183 +5 58 diff --git a/bottleneck/tests/data/test_378_B b/bottleneck/tests/data/test_378_B new file mode 100644 index 0000000..328b726 --- /dev/null +++ b/bottleneck/tests/data/test_378_B @@ -0,0 +1,2 @@ +58 154 +82 148 diff --git a/bottleneck/tests/data/test_379_A b/bottleneck/tests/data/test_379_A new file mode 100644 index 0000000..0f57258 --- /dev/null +++ b/bottleneck/tests/data/test_379_A @@ -0,0 +1,2 @@ +73 133 +38 52 diff --git a/bottleneck/tests/data/test_379_B b/bottleneck/tests/data/test_379_B new file mode 100644 index 0000000..45e35ba --- /dev/null +++ b/bottleneck/tests/data/test_379_B @@ -0,0 +1,2 @@ +46 95 +50 110 diff --git a/bottleneck/tests/data/test_380_A b/bottleneck/tests/data/test_380_A new file mode 100644 index 0000000..a6d1d31 --- /dev/null +++ b/bottleneck/tests/data/test_380_A @@ -0,0 +1,3 @@ +42 50 +67 107 +6 85 diff --git a/bottleneck/tests/data/test_380_B b/bottleneck/tests/data/test_380_B new file mode 100644 index 0000000..023f533 --- /dev/null +++ b/bottleneck/tests/data/test_380_B @@ -0,0 +1,3 @@ +31 126 +78 132 +15 92 diff --git a/bottleneck/tests/data/test_381_A b/bottleneck/tests/data/test_381_A new file mode 100644 index 0000000..0b5985d --- /dev/null +++ b/bottleneck/tests/data/test_381_A @@ -0,0 +1,3 @@ +7 43 +49 69 +94 119 diff --git a/bottleneck/tests/data/test_381_B b/bottleneck/tests/data/test_381_B new file mode 100644 index 0000000..1f5ffef --- /dev/null +++ b/bottleneck/tests/data/test_381_B @@ -0,0 +1,3 @@ +98 101 +89 113 +80 157 diff --git a/bottleneck/tests/data/test_382_A b/bottleneck/tests/data/test_382_A new file mode 100644 index 0000000..e155629 --- /dev/null +++ b/bottleneck/tests/data/test_382_A @@ -0,0 +1,3 @@ +60 119 +40 77 +52 101 diff --git a/bottleneck/tests/data/test_382_B b/bottleneck/tests/data/test_382_B new file mode 100644 index 0000000..5273c5f --- /dev/null +++ b/bottleneck/tests/data/test_382_B @@ -0,0 +1,3 @@ +9 47 +74 170 +88 93 diff --git a/bottleneck/tests/data/test_383_A b/bottleneck/tests/data/test_383_A new file mode 100644 index 0000000..7579cf6 --- /dev/null +++ b/bottleneck/tests/data/test_383_A @@ -0,0 +1,3 @@ +45 55 +12 57 +38 111 diff --git a/bottleneck/tests/data/test_383_B b/bottleneck/tests/data/test_383_B new file mode 100644 index 0000000..050e76d --- /dev/null +++ b/bottleneck/tests/data/test_383_B @@ -0,0 +1,3 @@ +61 126 +14 94 +58 81 diff --git a/bottleneck/tests/data/test_384_A b/bottleneck/tests/data/test_384_A new file mode 100644 index 0000000..5ba83b2 --- /dev/null +++ b/bottleneck/tests/data/test_384_A @@ -0,0 +1,3 @@ +21 105 +7 55 +95 108 diff --git a/bottleneck/tests/data/test_384_B b/bottleneck/tests/data/test_384_B new file mode 100644 index 0000000..f1a0074 --- /dev/null +++ b/bottleneck/tests/data/test_384_B @@ -0,0 +1,3 @@ +73 93 +20 52 +99 187 diff --git a/bottleneck/tests/data/test_385_A b/bottleneck/tests/data/test_385_A new file mode 100644 index 0000000..195db5d --- /dev/null +++ b/bottleneck/tests/data/test_385_A @@ -0,0 +1,3 @@ +28 66 +4 72 +57 155 diff --git a/bottleneck/tests/data/test_385_B b/bottleneck/tests/data/test_385_B new file mode 100644 index 0000000..9234688 --- /dev/null +++ b/bottleneck/tests/data/test_385_B @@ -0,0 +1,3 @@ +75 175 +55 79 +89 178 diff --git a/bottleneck/tests/data/test_386_A b/bottleneck/tests/data/test_386_A new file mode 100644 index 0000000..7a9281c --- /dev/null +++ b/bottleneck/tests/data/test_386_A @@ -0,0 +1,3 @@ +65 87 +11 33 +17 45 diff --git a/bottleneck/tests/data/test_386_B b/bottleneck/tests/data/test_386_B new file mode 100644 index 0000000..86a3caf --- /dev/null +++ b/bottleneck/tests/data/test_386_B @@ -0,0 +1,3 @@ +83 93 +13 46 +67 68 diff --git a/bottleneck/tests/data/test_387_A b/bottleneck/tests/data/test_387_A new file mode 100644 index 0000000..ff92400 --- /dev/null +++ b/bottleneck/tests/data/test_387_A @@ -0,0 +1,3 @@ +33 68 +20 115 +21 25 diff --git a/bottleneck/tests/data/test_387_B b/bottleneck/tests/data/test_387_B new file mode 100644 index 0000000..c2e44a4 --- /dev/null +++ b/bottleneck/tests/data/test_387_B @@ -0,0 +1,3 @@ +44 45 +24 66 +6 45 diff --git a/bottleneck/tests/data/test_388_A b/bottleneck/tests/data/test_388_A new file mode 100644 index 0000000..62b75be --- /dev/null +++ b/bottleneck/tests/data/test_388_A @@ -0,0 +1,3 @@ +89 163 +54 98 +45 86 diff --git a/bottleneck/tests/data/test_388_B b/bottleneck/tests/data/test_388_B new file mode 100644 index 0000000..025fdc6 --- /dev/null +++ b/bottleneck/tests/data/test_388_B @@ -0,0 +1,3 @@ +83 139 +91 174 +74 93 diff --git a/bottleneck/tests/data/test_389_A b/bottleneck/tests/data/test_389_A new file mode 100644 index 0000000..5fa0b26 --- /dev/null +++ b/bottleneck/tests/data/test_389_A @@ -0,0 +1,3 @@ +93 165 +72 168 +84 113 diff --git a/bottleneck/tests/data/test_389_B b/bottleneck/tests/data/test_389_B new file mode 100644 index 0000000..7ebd7f3 --- /dev/null +++ b/bottleneck/tests/data/test_389_B @@ -0,0 +1,3 @@ +88 140 +82 133 +69 110 diff --git a/bottleneck/tests/data/test_390_A b/bottleneck/tests/data/test_390_A new file mode 100644 index 0000000..9f2c33d --- /dev/null +++ b/bottleneck/tests/data/test_390_A @@ -0,0 +1,3 @@ +90 139 +28 95 +66 131 diff --git a/bottleneck/tests/data/test_390_B b/bottleneck/tests/data/test_390_B new file mode 100644 index 0000000..833af00 --- /dev/null +++ b/bottleneck/tests/data/test_390_B @@ -0,0 +1,3 @@ +79 116 +46 68 +39 102 diff --git a/bottleneck/tests/data/test_391_A b/bottleneck/tests/data/test_391_A new file mode 100644 index 0000000..f353fda --- /dev/null +++ b/bottleneck/tests/data/test_391_A @@ -0,0 +1,3 @@ +38 51 +43 103 +80 129 diff --git a/bottleneck/tests/data/test_391_B b/bottleneck/tests/data/test_391_B new file mode 100644 index 0000000..edff01f --- /dev/null +++ b/bottleneck/tests/data/test_391_B @@ -0,0 +1,3 @@ +22 116 +2 92 +13 109 diff --git a/bottleneck/tests/data/test_392_A b/bottleneck/tests/data/test_392_A new file mode 100644 index 0000000..317da32 --- /dev/null +++ b/bottleneck/tests/data/test_392_A @@ -0,0 +1,3 @@ +10 15 +48 118 +86 151 diff --git a/bottleneck/tests/data/test_392_B b/bottleneck/tests/data/test_392_B new file mode 100644 index 0000000..c8cb61c --- /dev/null +++ b/bottleneck/tests/data/test_392_B @@ -0,0 +1,3 @@ +73 173 +27 46 +73 146 diff --git a/bottleneck/tests/data/test_393_A b/bottleneck/tests/data/test_393_A new file mode 100644 index 0000000..10b537c --- /dev/null +++ b/bottleneck/tests/data/test_393_A @@ -0,0 +1,3 @@ +68 103 +89 121 +98 113 diff --git a/bottleneck/tests/data/test_393_B b/bottleneck/tests/data/test_393_B new file mode 100644 index 0000000..24bc23a --- /dev/null +++ b/bottleneck/tests/data/test_393_B @@ -0,0 +1,3 @@ +68 100 +41 63 +12 41 diff --git a/bottleneck/tests/data/test_394_A b/bottleneck/tests/data/test_394_A new file mode 100644 index 0000000..e626e4a --- /dev/null +++ b/bottleneck/tests/data/test_394_A @@ -0,0 +1,3 @@ +16 63 +5 58 +73 84 diff --git a/bottleneck/tests/data/test_394_B b/bottleneck/tests/data/test_394_B new file mode 100644 index 0000000..24e086f --- /dev/null +++ b/bottleneck/tests/data/test_394_B @@ -0,0 +1,3 @@ +86 134 +41 102 +14 107 diff --git a/bottleneck/tests/data/test_395_A b/bottleneck/tests/data/test_395_A new file mode 100644 index 0000000..fa5d9e1 --- /dev/null +++ b/bottleneck/tests/data/test_395_A @@ -0,0 +1,3 @@ +76 152 +99 166 +91 110 diff --git a/bottleneck/tests/data/test_395_B b/bottleneck/tests/data/test_395_B new file mode 100644 index 0000000..8cc1049 --- /dev/null +++ b/bottleneck/tests/data/test_395_B @@ -0,0 +1,3 @@ +42 109 +54 89 +51 113 diff --git a/bottleneck/tests/data/test_396_A b/bottleneck/tests/data/test_396_A new file mode 100644 index 0000000..ab2ac42 --- /dev/null +++ b/bottleneck/tests/data/test_396_A @@ -0,0 +1,3 @@ +0 22 +81 139 +26 41 diff --git a/bottleneck/tests/data/test_396_B b/bottleneck/tests/data/test_396_B new file mode 100644 index 0000000..dd8a3d4 --- /dev/null +++ b/bottleneck/tests/data/test_396_B @@ -0,0 +1,3 @@ +76 123 +23 24 +23 118 diff --git a/bottleneck/tests/data/test_397_A b/bottleneck/tests/data/test_397_A new file mode 100644 index 0000000..683bdca --- /dev/null +++ b/bottleneck/tests/data/test_397_A @@ -0,0 +1,3 @@ +53 128 +82 162 +34 127 diff --git a/bottleneck/tests/data/test_397_B b/bottleneck/tests/data/test_397_B new file mode 100644 index 0000000..a7b2d72 --- /dev/null +++ b/bottleneck/tests/data/test_397_B @@ -0,0 +1,3 @@ +49 95 +82 140 +21 92 diff --git a/bottleneck/tests/data/test_398_A b/bottleneck/tests/data/test_398_A new file mode 100644 index 0000000..d802d50 --- /dev/null +++ b/bottleneck/tests/data/test_398_A @@ -0,0 +1,3 @@ +37 98 +42 125 +79 99 diff --git a/bottleneck/tests/data/test_398_B b/bottleneck/tests/data/test_398_B new file mode 100644 index 0000000..9e5b5e1 --- /dev/null +++ b/bottleneck/tests/data/test_398_B @@ -0,0 +1,3 @@ +48 91 +49 115 +65 158 diff --git a/bottleneck/tests/data/test_399_A b/bottleneck/tests/data/test_399_A new file mode 100644 index 0000000..204dfdf --- /dev/null +++ b/bottleneck/tests/data/test_399_A @@ -0,0 +1,3 @@ +87 153 +22 28 +68 72 diff --git a/bottleneck/tests/data/test_399_B b/bottleneck/tests/data/test_399_B new file mode 100644 index 0000000..58cb084 --- /dev/null +++ b/bottleneck/tests/data/test_399_B @@ -0,0 +1,3 @@ +33 93 +3 10 +21 32 diff --git a/bottleneck/tests/data/test_400_A b/bottleneck/tests/data/test_400_A new file mode 100644 index 0000000..b867cf5 --- /dev/null +++ b/bottleneck/tests/data/test_400_A @@ -0,0 +1,4 @@ +55 89 +35 85 +62 84 +84 151 diff --git a/bottleneck/tests/data/test_400_B b/bottleneck/tests/data/test_400_B new file mode 100644 index 0000000..18df91d --- /dev/null +++ b/bottleneck/tests/data/test_400_B @@ -0,0 +1,4 @@ +37 89 +45 56 +4 79 +86 139 diff --git a/bottleneck/tests/data/test_401_A b/bottleneck/tests/data/test_401_A new file mode 100644 index 0000000..0f03308 --- /dev/null +++ b/bottleneck/tests/data/test_401_A @@ -0,0 +1,4 @@ +15 34 +2 72 +14 50 +58 86 diff --git a/bottleneck/tests/data/test_401_B b/bottleneck/tests/data/test_401_B new file mode 100644 index 0000000..b517be8 --- /dev/null +++ b/bottleneck/tests/data/test_401_B @@ -0,0 +1,4 @@ +85 97 +24 54 +44 45 +75 171 diff --git a/bottleneck/tests/data/test_402_A b/bottleneck/tests/data/test_402_A new file mode 100644 index 0000000..6a6f79f --- /dev/null +++ b/bottleneck/tests/data/test_402_A @@ -0,0 +1,4 @@ +97 167 +17 65 +82 157 +88 110 diff --git a/bottleneck/tests/data/test_402_B b/bottleneck/tests/data/test_402_B new file mode 100644 index 0000000..6585f2b --- /dev/null +++ b/bottleneck/tests/data/test_402_B @@ -0,0 +1,4 @@ +69 87 +32 52 +71 92 +38 91 diff --git a/bottleneck/tests/data/test_403_A b/bottleneck/tests/data/test_403_A new file mode 100644 index 0000000..8b5929a --- /dev/null +++ b/bottleneck/tests/data/test_403_A @@ -0,0 +1,4 @@ +75 84 +86 184 +46 132 +79 136 diff --git a/bottleneck/tests/data/test_403_B b/bottleneck/tests/data/test_403_B new file mode 100644 index 0000000..71f089f --- /dev/null +++ b/bottleneck/tests/data/test_403_B @@ -0,0 +1,4 @@ +41 132 +44 72 +6 105 +91 187 diff --git a/bottleneck/tests/data/test_404_A b/bottleneck/tests/data/test_404_A new file mode 100644 index 0000000..10add8e --- /dev/null +++ b/bottleneck/tests/data/test_404_A @@ -0,0 +1,4 @@ +28 95 +43 126 +75 105 +2 101 diff --git a/bottleneck/tests/data/test_404_B b/bottleneck/tests/data/test_404_B new file mode 100644 index 0000000..b38a7a7 --- /dev/null +++ b/bottleneck/tests/data/test_404_B @@ -0,0 +1,4 @@ +49 56 +50 116 +54 132 +55 94 diff --git a/bottleneck/tests/data/test_405_A b/bottleneck/tests/data/test_405_A new file mode 100644 index 0000000..6cab1bd --- /dev/null +++ b/bottleneck/tests/data/test_405_A @@ -0,0 +1,4 @@ +53 120 +12 15 +80 83 +79 96 diff --git a/bottleneck/tests/data/test_405_B b/bottleneck/tests/data/test_405_B new file mode 100644 index 0000000..96645aa --- /dev/null +++ b/bottleneck/tests/data/test_405_B @@ -0,0 +1,4 @@ +41 113 +17 18 +22 39 +89 135 diff --git a/bottleneck/tests/data/test_406_A b/bottleneck/tests/data/test_406_A new file mode 100644 index 0000000..cf08c48 --- /dev/null +++ b/bottleneck/tests/data/test_406_A @@ -0,0 +1,4 @@ +88 168 +26 35 +96 126 +84 102 diff --git a/bottleneck/tests/data/test_406_B b/bottleneck/tests/data/test_406_B new file mode 100644 index 0000000..b4ca0a0 --- /dev/null +++ b/bottleneck/tests/data/test_406_B @@ -0,0 +1,4 @@ +81 173 +76 111 +2 15 +44 142 diff --git a/bottleneck/tests/data/test_407_A b/bottleneck/tests/data/test_407_A new file mode 100644 index 0000000..2372aba --- /dev/null +++ b/bottleneck/tests/data/test_407_A @@ -0,0 +1,4 @@ +55 92 +95 170 +51 149 +76 156 diff --git a/bottleneck/tests/data/test_407_B b/bottleneck/tests/data/test_407_B new file mode 100644 index 0000000..bd43334 --- /dev/null +++ b/bottleneck/tests/data/test_407_B @@ -0,0 +1,4 @@ +55 100 +17 86 +37 66 +97 131 diff --git a/bottleneck/tests/data/test_408_A b/bottleneck/tests/data/test_408_A new file mode 100644 index 0000000..91652d4 --- /dev/null +++ b/bottleneck/tests/data/test_408_A @@ -0,0 +1,4 @@ +3 9 +50 134 +50 115 +30 82 diff --git a/bottleneck/tests/data/test_408_B b/bottleneck/tests/data/test_408_B new file mode 100644 index 0000000..5f936a7 --- /dev/null +++ b/bottleneck/tests/data/test_408_B @@ -0,0 +1,4 @@ +57 103 +83 173 +20 58 +74 93 diff --git a/bottleneck/tests/data/test_409_A b/bottleneck/tests/data/test_409_A new file mode 100644 index 0000000..b4d01d2 --- /dev/null +++ b/bottleneck/tests/data/test_409_A @@ -0,0 +1,4 @@ +87 144 +33 79 +44 110 +42 92 diff --git a/bottleneck/tests/data/test_409_B b/bottleneck/tests/data/test_409_B new file mode 100644 index 0000000..4e15e41 --- /dev/null +++ b/bottleneck/tests/data/test_409_B @@ -0,0 +1,4 @@ +2 39 +82 170 +1 40 +50 115 diff --git a/bottleneck/tests/data/test_410_A b/bottleneck/tests/data/test_410_A new file mode 100644 index 0000000..c02ab24 --- /dev/null +++ b/bottleneck/tests/data/test_410_A @@ -0,0 +1,4 @@ +15 80 +70 160 +52 144 +100 134 diff --git a/bottleneck/tests/data/test_410_B b/bottleneck/tests/data/test_410_B new file mode 100644 index 0000000..d000095 --- /dev/null +++ b/bottleneck/tests/data/test_410_B @@ -0,0 +1,4 @@ +87 144 +43 91 +68 77 +79 172 diff --git a/bottleneck/tests/data/test_411_A b/bottleneck/tests/data/test_411_A new file mode 100644 index 0000000..8130c4a --- /dev/null +++ b/bottleneck/tests/data/test_411_A @@ -0,0 +1,4 @@ +81 158 +50 142 +83 129 +74 85 diff --git a/bottleneck/tests/data/test_411_B b/bottleneck/tests/data/test_411_B new file mode 100644 index 0000000..e53f61f --- /dev/null +++ b/bottleneck/tests/data/test_411_B @@ -0,0 +1,4 @@ +31 115 +57 108 +83 135 +2 26 diff --git a/bottleneck/tests/data/test_412_A b/bottleneck/tests/data/test_412_A new file mode 100644 index 0000000..34a88b0 --- /dev/null +++ b/bottleneck/tests/data/test_412_A @@ -0,0 +1,4 @@ +5 31 +39 91 +24 75 +93 128 diff --git a/bottleneck/tests/data/test_412_B b/bottleneck/tests/data/test_412_B new file mode 100644 index 0000000..a163ece --- /dev/null +++ b/bottleneck/tests/data/test_412_B @@ -0,0 +1,4 @@ +0 76 +97 144 +55 92 +1 67 diff --git a/bottleneck/tests/data/test_413_A b/bottleneck/tests/data/test_413_A new file mode 100644 index 0000000..61d6f70 --- /dev/null +++ b/bottleneck/tests/data/test_413_A @@ -0,0 +1,4 @@ +44 111 +69 88 +8 80 +78 113 diff --git a/bottleneck/tests/data/test_413_B b/bottleneck/tests/data/test_413_B new file mode 100644 index 0000000..5b9dc54 --- /dev/null +++ b/bottleneck/tests/data/test_413_B @@ -0,0 +1,4 @@ +87 159 +53 114 +70 136 +63 103 diff --git a/bottleneck/tests/data/test_414_A b/bottleneck/tests/data/test_414_A new file mode 100644 index 0000000..933f1e4 --- /dev/null +++ b/bottleneck/tests/data/test_414_A @@ -0,0 +1,4 @@ +39 44 +29 113 +85 158 +59 77 diff --git a/bottleneck/tests/data/test_414_B b/bottleneck/tests/data/test_414_B new file mode 100644 index 0000000..b54a5fe --- /dev/null +++ b/bottleneck/tests/data/test_414_B @@ -0,0 +1,4 @@ +14 109 +5 90 +85 134 +60 88 diff --git a/bottleneck/tests/data/test_415_A b/bottleneck/tests/data/test_415_A new file mode 100644 index 0000000..bbce6b8 --- /dev/null +++ b/bottleneck/tests/data/test_415_A @@ -0,0 +1,4 @@ +23 70 +40 46 +21 109 +50 149 diff --git a/bottleneck/tests/data/test_415_B b/bottleneck/tests/data/test_415_B new file mode 100644 index 0000000..3943a46 --- /dev/null +++ b/bottleneck/tests/data/test_415_B @@ -0,0 +1,4 @@ +14 80 +74 154 +50 70 +90 173 diff --git a/bottleneck/tests/data/test_416_A b/bottleneck/tests/data/test_416_A new file mode 100644 index 0000000..c7a9a3d --- /dev/null +++ b/bottleneck/tests/data/test_416_A @@ -0,0 +1,4 @@ +23 53 +20 94 +89 105 +98 146 diff --git a/bottleneck/tests/data/test_416_B b/bottleneck/tests/data/test_416_B new file mode 100644 index 0000000..6e8c430 --- /dev/null +++ b/bottleneck/tests/data/test_416_B @@ -0,0 +1,4 @@ +73 74 +62 124 +95 126 +62 141 diff --git a/bottleneck/tests/data/test_417_A b/bottleneck/tests/data/test_417_A new file mode 100644 index 0000000..6e5688c --- /dev/null +++ b/bottleneck/tests/data/test_417_A @@ -0,0 +1,4 @@ +66 148 +86 117 +4 32 +95 146 diff --git a/bottleneck/tests/data/test_417_B b/bottleneck/tests/data/test_417_B new file mode 100644 index 0000000..2bfa9c2 --- /dev/null +++ b/bottleneck/tests/data/test_417_B @@ -0,0 +1,4 @@ +87 111 +23 122 +62 95 +12 22 diff --git a/bottleneck/tests/data/test_418_A b/bottleneck/tests/data/test_418_A new file mode 100644 index 0000000..9ab98de --- /dev/null +++ b/bottleneck/tests/data/test_418_A @@ -0,0 +1,4 @@ +29 122 +71 102 +70 109 +43 120 diff --git a/bottleneck/tests/data/test_418_B b/bottleneck/tests/data/test_418_B new file mode 100644 index 0000000..f3231de --- /dev/null +++ b/bottleneck/tests/data/test_418_B @@ -0,0 +1,4 @@ +45 121 +58 64 +57 105 +41 138 diff --git a/bottleneck/tests/data/test_419_A b/bottleneck/tests/data/test_419_A new file mode 100644 index 0000000..825d191 --- /dev/null +++ b/bottleneck/tests/data/test_419_A @@ -0,0 +1,4 @@ +28 111 +100 167 +17 59 +10 38 diff --git a/bottleneck/tests/data/test_419_B b/bottleneck/tests/data/test_419_B new file mode 100644 index 0000000..101be4f --- /dev/null +++ b/bottleneck/tests/data/test_419_B @@ -0,0 +1,4 @@ +63 99 +78 143 +67 150 +24 77 diff --git a/bottleneck/tests/data/test_420_A b/bottleneck/tests/data/test_420_A new file mode 100644 index 0000000..455d829 --- /dev/null +++ b/bottleneck/tests/data/test_420_A @@ -0,0 +1,5 @@ +89 160 +26 36 +37 61 +95 137 +41 68 diff --git a/bottleneck/tests/data/test_420_B b/bottleneck/tests/data/test_420_B new file mode 100644 index 0000000..27e1c6d --- /dev/null +++ b/bottleneck/tests/data/test_420_B @@ -0,0 +1,5 @@ +100 185 +31 112 +78 129 +49 143 +74 171 diff --git a/bottleneck/tests/data/test_421_A b/bottleneck/tests/data/test_421_A new file mode 100644 index 0000000..c08ddf1 --- /dev/null +++ b/bottleneck/tests/data/test_421_A @@ -0,0 +1,5 @@ +27 127 +2 101 +42 52 +5 81 +4 62 diff --git a/bottleneck/tests/data/test_421_B b/bottleneck/tests/data/test_421_B new file mode 100644 index 0000000..37cbda8 --- /dev/null +++ b/bottleneck/tests/data/test_421_B @@ -0,0 +1,5 @@ +27 40 +67 78 +50 122 +41 95 +1 63 diff --git a/bottleneck/tests/data/test_422_A b/bottleneck/tests/data/test_422_A new file mode 100644 index 0000000..348a116 --- /dev/null +++ b/bottleneck/tests/data/test_422_A @@ -0,0 +1,5 @@ +54 143 +21 24 +96 180 +13 113 +93 134 diff --git a/bottleneck/tests/data/test_422_B b/bottleneck/tests/data/test_422_B new file mode 100644 index 0000000..0f33ae9 --- /dev/null +++ b/bottleneck/tests/data/test_422_B @@ -0,0 +1,5 @@ +5 18 +63 106 +29 94 +59 155 +66 155 diff --git a/bottleneck/tests/data/test_423_A b/bottleneck/tests/data/test_423_A new file mode 100644 index 0000000..b3b448e --- /dev/null +++ b/bottleneck/tests/data/test_423_A @@ -0,0 +1,5 @@ +47 88 +80 138 +75 129 +2 90 +58 133 diff --git a/bottleneck/tests/data/test_423_B b/bottleneck/tests/data/test_423_B new file mode 100644 index 0000000..873a875 --- /dev/null +++ b/bottleneck/tests/data/test_423_B @@ -0,0 +1,5 @@ +77 129 +99 174 +93 104 +71 93 +18 26 diff --git a/bottleneck/tests/data/test_424_A b/bottleneck/tests/data/test_424_A new file mode 100644 index 0000000..ab20fc1 --- /dev/null +++ b/bottleneck/tests/data/test_424_A @@ -0,0 +1,5 @@ +73 167 +50 133 +25 41 +46 87 +27 93 diff --git a/bottleneck/tests/data/test_424_B b/bottleneck/tests/data/test_424_B new file mode 100644 index 0000000..a0f5059 --- /dev/null +++ b/bottleneck/tests/data/test_424_B @@ -0,0 +1,5 @@ +71 113 +54 63 +0 33 +27 127 +14 79 diff --git a/bottleneck/tests/data/test_425_A b/bottleneck/tests/data/test_425_A new file mode 100644 index 0000000..7116974 --- /dev/null +++ b/bottleneck/tests/data/test_425_A @@ -0,0 +1,5 @@ +90 168 +44 63 +83 88 +80 81 +13 94 diff --git a/bottleneck/tests/data/test_425_B b/bottleneck/tests/data/test_425_B new file mode 100644 index 0000000..6f1e713 --- /dev/null +++ b/bottleneck/tests/data/test_425_B @@ -0,0 +1,5 @@ +66 161 +99 137 +71 147 +58 80 +42 96 diff --git a/bottleneck/tests/data/test_426_A b/bottleneck/tests/data/test_426_A new file mode 100644 index 0000000..6404cdd --- /dev/null +++ b/bottleneck/tests/data/test_426_A @@ -0,0 +1,5 @@ +90 161 +75 121 +54 111 +21 84 +73 106 diff --git a/bottleneck/tests/data/test_426_B b/bottleneck/tests/data/test_426_B new file mode 100644 index 0000000..06fbc21 --- /dev/null +++ b/bottleneck/tests/data/test_426_B @@ -0,0 +1,5 @@ +82 109 +85 100 +26 92 +52 91 +23 83 diff --git a/bottleneck/tests/data/test_427_A b/bottleneck/tests/data/test_427_A new file mode 100644 index 0000000..ab36b49 --- /dev/null +++ b/bottleneck/tests/data/test_427_A @@ -0,0 +1,5 @@ +15 28 +39 93 +1 43 +16 98 +81 167 diff --git a/bottleneck/tests/data/test_427_B b/bottleneck/tests/data/test_427_B new file mode 100644 index 0000000..eb34e17 --- /dev/null +++ b/bottleneck/tests/data/test_427_B @@ -0,0 +1,5 @@ +57 70 +99 181 +26 81 +13 32 +95 153 diff --git a/bottleneck/tests/data/test_428_A b/bottleneck/tests/data/test_428_A new file mode 100644 index 0000000..12957ab --- /dev/null +++ b/bottleneck/tests/data/test_428_A @@ -0,0 +1,5 @@ +85 155 +86 173 +63 88 +50 84 +75 85 diff --git a/bottleneck/tests/data/test_428_B b/bottleneck/tests/data/test_428_B new file mode 100644 index 0000000..b0fd1c4 --- /dev/null +++ b/bottleneck/tests/data/test_428_B @@ -0,0 +1,5 @@ +70 113 +92 93 +57 103 +40 81 +9 47 diff --git a/bottleneck/tests/data/test_429_A b/bottleneck/tests/data/test_429_A new file mode 100644 index 0000000..0cdda41 --- /dev/null +++ b/bottleneck/tests/data/test_429_A @@ -0,0 +1,5 @@ +90 165 +83 128 +5 28 +68 121 +1 67 diff --git a/bottleneck/tests/data/test_429_B b/bottleneck/tests/data/test_429_B new file mode 100644 index 0000000..0180a92 --- /dev/null +++ b/bottleneck/tests/data/test_429_B @@ -0,0 +1,5 @@ +31 34 +88 147 +17 91 +46 138 +13 81 diff --git a/bottleneck/tests/data/test_430_A b/bottleneck/tests/data/test_430_A new file mode 100644 index 0000000..03029c6 --- /dev/null +++ b/bottleneck/tests/data/test_430_A @@ -0,0 +1,5 @@ +85 181 +93 118 +77 167 +39 110 +21 22 diff --git a/bottleneck/tests/data/test_430_B b/bottleneck/tests/data/test_430_B new file mode 100644 index 0000000..9c58f1f --- /dev/null +++ b/bottleneck/tests/data/test_430_B @@ -0,0 +1,5 @@ +59 88 +28 29 +56 57 +3 73 +78 93 diff --git a/bottleneck/tests/data/test_431_A b/bottleneck/tests/data/test_431_A new file mode 100644 index 0000000..272ec7d --- /dev/null +++ b/bottleneck/tests/data/test_431_A @@ -0,0 +1,5 @@ +26 28 +90 172 +46 118 +25 102 +78 141 diff --git a/bottleneck/tests/data/test_431_B b/bottleneck/tests/data/test_431_B new file mode 100644 index 0000000..9ccc9d1 --- /dev/null +++ b/bottleneck/tests/data/test_431_B @@ -0,0 +1,5 @@ +25 107 +61 128 +24 111 +47 48 +70 96 diff --git a/bottleneck/tests/data/test_432_A b/bottleneck/tests/data/test_432_A new file mode 100644 index 0000000..91dbacb --- /dev/null +++ b/bottleneck/tests/data/test_432_A @@ -0,0 +1,5 @@ +53 78 +16 74 +6 106 +46 145 +33 41 diff --git a/bottleneck/tests/data/test_432_B b/bottleneck/tests/data/test_432_B new file mode 100644 index 0000000..47afd85 --- /dev/null +++ b/bottleneck/tests/data/test_432_B @@ -0,0 +1,5 @@ +16 100 +70 119 +42 137 +94 164 +94 105 diff --git a/bottleneck/tests/data/test_433_A b/bottleneck/tests/data/test_433_A new file mode 100644 index 0000000..1577e13 --- /dev/null +++ b/bottleneck/tests/data/test_433_A @@ -0,0 +1,5 @@ +30 97 +79 93 +42 97 +88 140 +85 131 diff --git a/bottleneck/tests/data/test_433_B b/bottleneck/tests/data/test_433_B new file mode 100644 index 0000000..f63aea0 --- /dev/null +++ b/bottleneck/tests/data/test_433_B @@ -0,0 +1,5 @@ +38 55 +29 129 +30 97 +11 43 +26 59 diff --git a/bottleneck/tests/data/test_434_A b/bottleneck/tests/data/test_434_A new file mode 100644 index 0000000..5ef7655 --- /dev/null +++ b/bottleneck/tests/data/test_434_A @@ -0,0 +1,5 @@ +63 102 +32 38 +98 179 +89 136 +39 67 diff --git a/bottleneck/tests/data/test_434_B b/bottleneck/tests/data/test_434_B new file mode 100644 index 0000000..a089420 --- /dev/null +++ b/bottleneck/tests/data/test_434_B @@ -0,0 +1,5 @@ +92 101 +9 11 +47 138 +95 176 +8 87 diff --git a/bottleneck/tests/data/test_435_A b/bottleneck/tests/data/test_435_A new file mode 100644 index 0000000..9021906 --- /dev/null +++ b/bottleneck/tests/data/test_435_A @@ -0,0 +1,5 @@ +34 98 +33 80 +18 85 +36 100 +60 64 diff --git a/bottleneck/tests/data/test_435_B b/bottleneck/tests/data/test_435_B new file mode 100644 index 0000000..225d87c --- /dev/null +++ b/bottleneck/tests/data/test_435_B @@ -0,0 +1,5 @@ +96 175 +12 80 +79 166 +28 88 +81 150 diff --git a/bottleneck/tests/data/test_436_A b/bottleneck/tests/data/test_436_A new file mode 100644 index 0000000..4004cfe --- /dev/null +++ b/bottleneck/tests/data/test_436_A @@ -0,0 +1,5 @@ +59 101 +23 98 +15 108 +65 119 +67 91 diff --git a/bottleneck/tests/data/test_436_B b/bottleneck/tests/data/test_436_B new file mode 100644 index 0000000..8fbd097 --- /dev/null +++ b/bottleneck/tests/data/test_436_B @@ -0,0 +1,5 @@ +23 86 +58 123 +18 62 +100 165 +6 105 diff --git a/bottleneck/tests/data/test_437_A b/bottleneck/tests/data/test_437_A new file mode 100644 index 0000000..8210316 --- /dev/null +++ b/bottleneck/tests/data/test_437_A @@ -0,0 +1,5 @@ +10 38 +90 165 +35 122 +100 170 +62 93 diff --git a/bottleneck/tests/data/test_437_B b/bottleneck/tests/data/test_437_B new file mode 100644 index 0000000..c7e55b3 --- /dev/null +++ b/bottleneck/tests/data/test_437_B @@ -0,0 +1,5 @@ +27 73 +87 187 +78 176 +44 82 +58 77 diff --git a/bottleneck/tests/data/test_438_A b/bottleneck/tests/data/test_438_A new file mode 100644 index 0000000..e2f48a4 --- /dev/null +++ b/bottleneck/tests/data/test_438_A @@ -0,0 +1,5 @@ +14 74 +65 127 +21 51 +19 42 +58 96 diff --git a/bottleneck/tests/data/test_438_B b/bottleneck/tests/data/test_438_B new file mode 100644 index 0000000..eb84689 --- /dev/null +++ b/bottleneck/tests/data/test_438_B @@ -0,0 +1,5 @@ +97 165 +49 116 +73 83 +6 8 +99 153 diff --git a/bottleneck/tests/data/test_439_A b/bottleneck/tests/data/test_439_A new file mode 100644 index 0000000..fc36518 --- /dev/null +++ b/bottleneck/tests/data/test_439_A @@ -0,0 +1,5 @@ +66 120 +59 119 +40 56 +42 120 +48 140 diff --git a/bottleneck/tests/data/test_439_B b/bottleneck/tests/data/test_439_B new file mode 100644 index 0000000..b9de5b7 --- /dev/null +++ b/bottleneck/tests/data/test_439_B @@ -0,0 +1,5 @@ +25 94 +94 157 +64 156 +79 100 +28 98 diff --git a/bottleneck/tests/data/test_440_A b/bottleneck/tests/data/test_440_A new file mode 100644 index 0000000..4f0cdc2 --- /dev/null +++ b/bottleneck/tests/data/test_440_A @@ -0,0 +1,6 @@ +25 32 +90 153 +23 86 +4 29 +52 124 +17 75 diff --git a/bottleneck/tests/data/test_440_B b/bottleneck/tests/data/test_440_B new file mode 100644 index 0000000..c06754e --- /dev/null +++ b/bottleneck/tests/data/test_440_B @@ -0,0 +1,6 @@ +47 132 +64 156 +96 149 +31 94 +86 94 +40 63 diff --git a/bottleneck/tests/data/test_441_A b/bottleneck/tests/data/test_441_A new file mode 100644 index 0000000..f1d7779 --- /dev/null +++ b/bottleneck/tests/data/test_441_A @@ -0,0 +1,6 @@ +45 121 +61 95 +57 68 +10 82 +90 147 +80 179 diff --git a/bottleneck/tests/data/test_441_B b/bottleneck/tests/data/test_441_B new file mode 100644 index 0000000..039c8db --- /dev/null +++ b/bottleneck/tests/data/test_441_B @@ -0,0 +1,6 @@ +97 122 +44 109 +15 48 +49 106 +30 65 +66 70 diff --git a/bottleneck/tests/data/test_442_A b/bottleneck/tests/data/test_442_A new file mode 100644 index 0000000..9a22bd2 --- /dev/null +++ b/bottleneck/tests/data/test_442_A @@ -0,0 +1,6 @@ +44 47 +6 81 +66 163 +74 144 +66 135 +62 63 diff --git a/bottleneck/tests/data/test_442_B b/bottleneck/tests/data/test_442_B new file mode 100644 index 0000000..9663228 --- /dev/null +++ b/bottleneck/tests/data/test_442_B @@ -0,0 +1,6 @@ +41 65 +52 109 +96 175 +80 93 +32 78 +97 124 diff --git a/bottleneck/tests/data/test_443_A b/bottleneck/tests/data/test_443_A new file mode 100644 index 0000000..27d9885 --- /dev/null +++ b/bottleneck/tests/data/test_443_A @@ -0,0 +1,6 @@ +19 38 +86 142 +86 132 +32 118 +73 138 +25 83 diff --git a/bottleneck/tests/data/test_443_B b/bottleneck/tests/data/test_443_B new file mode 100644 index 0000000..c084218 --- /dev/null +++ b/bottleneck/tests/data/test_443_B @@ -0,0 +1,6 @@ +78 165 +88 138 +5 29 +81 109 +4 96 +69 130 diff --git a/bottleneck/tests/data/test_444_A b/bottleneck/tests/data/test_444_A new file mode 100644 index 0000000..86dfb79 --- /dev/null +++ b/bottleneck/tests/data/test_444_A @@ -0,0 +1,6 @@ +22 23 +59 111 +65 91 +0 56 +92 156 +67 69 diff --git a/bottleneck/tests/data/test_444_B b/bottleneck/tests/data/test_444_B new file mode 100644 index 0000000..b7f54f9 --- /dev/null +++ b/bottleneck/tests/data/test_444_B @@ -0,0 +1,6 @@ +20 39 +0 44 +34 84 +3 30 +70 96 +92 127 diff --git a/bottleneck/tests/data/test_445_A b/bottleneck/tests/data/test_445_A new file mode 100644 index 0000000..6ec29f6 --- /dev/null +++ b/bottleneck/tests/data/test_445_A @@ -0,0 +1,6 @@ +49 64 +36 102 +43 120 +98 194 +65 110 +49 89 diff --git a/bottleneck/tests/data/test_445_B b/bottleneck/tests/data/test_445_B new file mode 100644 index 0000000..7e5ce8e --- /dev/null +++ b/bottleneck/tests/data/test_445_B @@ -0,0 +1,6 @@ +84 88 +42 132 +26 36 +11 91 +17 114 +37 70 diff --git a/bottleneck/tests/data/test_446_A b/bottleneck/tests/data/test_446_A new file mode 100644 index 0000000..2e66159 --- /dev/null +++ b/bottleneck/tests/data/test_446_A @@ -0,0 +1,6 @@ +48 147 +86 146 +42 64 +39 111 +71 113 +59 63 diff --git a/bottleneck/tests/data/test_446_B b/bottleneck/tests/data/test_446_B new file mode 100644 index 0000000..b4a4baa --- /dev/null +++ b/bottleneck/tests/data/test_446_B @@ -0,0 +1,6 @@ +14 15 +64 163 +23 41 +4 90 +3 23 +66 68 diff --git a/bottleneck/tests/data/test_447_A b/bottleneck/tests/data/test_447_A new file mode 100644 index 0000000..adbca26 --- /dev/null +++ b/bottleneck/tests/data/test_447_A @@ -0,0 +1,6 @@ +91 119 +93 186 +11 53 +85 87 +8 50 +69 84 diff --git a/bottleneck/tests/data/test_447_B b/bottleneck/tests/data/test_447_B new file mode 100644 index 0000000..c996a99 --- /dev/null +++ b/bottleneck/tests/data/test_447_B @@ -0,0 +1,6 @@ +67 71 +77 143 +48 103 +80 121 +73 107 +18 36 diff --git a/bottleneck/tests/data/test_448_A b/bottleneck/tests/data/test_448_A new file mode 100644 index 0000000..3b1d2ac --- /dev/null +++ b/bottleneck/tests/data/test_448_A @@ -0,0 +1,6 @@ +99 127 +80 81 +72 138 +40 123 +76 120 +13 52 diff --git a/bottleneck/tests/data/test_448_B b/bottleneck/tests/data/test_448_B new file mode 100644 index 0000000..358c96b --- /dev/null +++ b/bottleneck/tests/data/test_448_B @@ -0,0 +1,6 @@ +94 105 +31 105 +2 50 +91 132 +63 86 +81 116 diff --git a/bottleneck/tests/data/test_449_A b/bottleneck/tests/data/test_449_A new file mode 100644 index 0000000..1b9fdde --- /dev/null +++ b/bottleneck/tests/data/test_449_A @@ -0,0 +1,6 @@ +99 164 +24 78 +75 119 +62 129 +93 117 +34 124 diff --git a/bottleneck/tests/data/test_449_B b/bottleneck/tests/data/test_449_B new file mode 100644 index 0000000..39ca7bf --- /dev/null +++ b/bottleneck/tests/data/test_449_B @@ -0,0 +1,6 @@ +5 101 +53 86 +58 92 +99 198 +48 57 +34 102 diff --git a/bottleneck/tests/data/test_450_A b/bottleneck/tests/data/test_450_A new file mode 100644 index 0000000..c97d1bd --- /dev/null +++ b/bottleneck/tests/data/test_450_A @@ -0,0 +1,6 @@ +98 112 +27 55 +36 69 +5 32 +36 85 +24 90 diff --git a/bottleneck/tests/data/test_450_B b/bottleneck/tests/data/test_450_B new file mode 100644 index 0000000..038d497 --- /dev/null +++ b/bottleneck/tests/data/test_450_B @@ -0,0 +1,6 @@ +66 156 +74 158 +85 136 +4 53 +61 93 +13 37 diff --git a/bottleneck/tests/data/test_451_A b/bottleneck/tests/data/test_451_A new file mode 100644 index 0000000..1c77ff4 --- /dev/null +++ b/bottleneck/tests/data/test_451_A @@ -0,0 +1,6 @@ +83 99 +42 129 +82 117 +35 132 +1 101 +53 115 diff --git a/bottleneck/tests/data/test_451_B b/bottleneck/tests/data/test_451_B new file mode 100644 index 0000000..37c9b78 --- /dev/null +++ b/bottleneck/tests/data/test_451_B @@ -0,0 +1,6 @@ +18 102 +62 111 +17 40 +78 135 +20 23 +69 77 diff --git a/bottleneck/tests/data/test_452_A b/bottleneck/tests/data/test_452_A new file mode 100644 index 0000000..24159ea --- /dev/null +++ b/bottleneck/tests/data/test_452_A @@ -0,0 +1,6 @@ +12 65 +2 42 +61 93 +22 31 +66 139 +44 106 diff --git a/bottleneck/tests/data/test_452_B b/bottleneck/tests/data/test_452_B new file mode 100644 index 0000000..602fb45 --- /dev/null +++ b/bottleneck/tests/data/test_452_B @@ -0,0 +1,6 @@ +88 156 +1 91 +7 42 +83 94 +50 133 +82 146 diff --git a/bottleneck/tests/data/test_453_A b/bottleneck/tests/data/test_453_A new file mode 100644 index 0000000..aa29541 --- /dev/null +++ b/bottleneck/tests/data/test_453_A @@ -0,0 +1,6 @@ +39 50 +28 76 +83 87 +27 38 +85 120 +57 78 diff --git a/bottleneck/tests/data/test_453_B b/bottleneck/tests/data/test_453_B new file mode 100644 index 0000000..7cce047 --- /dev/null +++ b/bottleneck/tests/data/test_453_B @@ -0,0 +1,6 @@ +59 106 +28 69 +91 189 +43 57 +32 33 +75 156 diff --git a/bottleneck/tests/data/test_454_A b/bottleneck/tests/data/test_454_A new file mode 100644 index 0000000..3e5e41b --- /dev/null +++ b/bottleneck/tests/data/test_454_A @@ -0,0 +1,6 @@ +32 39 +6 50 +72 153 +38 115 +23 45 +18 34 diff --git a/bottleneck/tests/data/test_454_B b/bottleneck/tests/data/test_454_B new file mode 100644 index 0000000..e5e2305 --- /dev/null +++ b/bottleneck/tests/data/test_454_B @@ -0,0 +1,6 @@ +83 180 +76 118 +76 114 +95 192 +19 53 +42 81 diff --git a/bottleneck/tests/data/test_455_A b/bottleneck/tests/data/test_455_A new file mode 100644 index 0000000..d06d256 --- /dev/null +++ b/bottleneck/tests/data/test_455_A @@ -0,0 +1,6 @@ +80 110 +12 104 +89 151 +71 168 +91 95 +27 55 diff --git a/bottleneck/tests/data/test_455_B b/bottleneck/tests/data/test_455_B new file mode 100644 index 0000000..afdab0b --- /dev/null +++ b/bottleneck/tests/data/test_455_B @@ -0,0 +1,6 @@ +68 166 +33 38 +66 158 +72 93 +66 96 +82 88 diff --git a/bottleneck/tests/data/test_456_A b/bottleneck/tests/data/test_456_A new file mode 100644 index 0000000..7a30bf3 --- /dev/null +++ b/bottleneck/tests/data/test_456_A @@ -0,0 +1,6 @@ +72 114 +8 79 +19 50 +72 134 +94 108 +5 24 diff --git a/bottleneck/tests/data/test_456_B b/bottleneck/tests/data/test_456_B new file mode 100644 index 0000000..a1a1329 --- /dev/null +++ b/bottleneck/tests/data/test_456_B @@ -0,0 +1,6 @@ +86 114 +38 105 +46 98 +20 90 +98 118 +52 142 diff --git a/bottleneck/tests/data/test_457_A b/bottleneck/tests/data/test_457_A new file mode 100644 index 0000000..d5339ec --- /dev/null +++ b/bottleneck/tests/data/test_457_A @@ -0,0 +1,6 @@ +70 109 +61 79 +55 152 +88 187 +64 136 +71 110 diff --git a/bottleneck/tests/data/test_457_B b/bottleneck/tests/data/test_457_B new file mode 100644 index 0000000..e96c110 --- /dev/null +++ b/bottleneck/tests/data/test_457_B @@ -0,0 +1,6 @@ +57 128 +47 82 +87 96 +97 132 +23 41 +6 104 diff --git a/bottleneck/tests/data/test_458_A b/bottleneck/tests/data/test_458_A new file mode 100644 index 0000000..a9287b2 --- /dev/null +++ b/bottleneck/tests/data/test_458_A @@ -0,0 +1,6 @@ +43 63 +79 80 +77 142 +50 116 +43 46 +45 139 diff --git a/bottleneck/tests/data/test_458_B b/bottleneck/tests/data/test_458_B new file mode 100644 index 0000000..63b7c63 --- /dev/null +++ b/bottleneck/tests/data/test_458_B @@ -0,0 +1,6 @@ +69 79 +9 64 +29 115 +33 87 +5 100 +24 71 diff --git a/bottleneck/tests/data/test_459_A b/bottleneck/tests/data/test_459_A new file mode 100644 index 0000000..f8a82f8 --- /dev/null +++ b/bottleneck/tests/data/test_459_A @@ -0,0 +1,6 @@ +90 94 +75 107 +80 88 +35 98 +53 84 +78 93 diff --git a/bottleneck/tests/data/test_459_B b/bottleneck/tests/data/test_459_B new file mode 100644 index 0000000..dc645ee --- /dev/null +++ b/bottleneck/tests/data/test_459_B @@ -0,0 +1,6 @@ +95 101 +29 59 +32 77 +17 19 +92 108 +6 19 diff --git a/bottleneck/tests/data/test_460_A b/bottleneck/tests/data/test_460_A new file mode 100644 index 0000000..000c14e --- /dev/null +++ b/bottleneck/tests/data/test_460_A @@ -0,0 +1,7 @@ +88 127 +65 145 +59 149 +69 152 +61 146 +28 90 +21 104 diff --git a/bottleneck/tests/data/test_460_B b/bottleneck/tests/data/test_460_B new file mode 100644 index 0000000..4a7d4a3 --- /dev/null +++ b/bottleneck/tests/data/test_460_B @@ -0,0 +1,7 @@ +47 131 +59 153 +24 95 +63 96 +6 102 +91 98 +31 118 diff --git a/bottleneck/tests/data/test_461_A b/bottleneck/tests/data/test_461_A new file mode 100644 index 0000000..aaebf2d --- /dev/null +++ b/bottleneck/tests/data/test_461_A @@ -0,0 +1,7 @@ +57 67 +75 82 +63 88 +57 139 +67 103 +15 68 +100 117 diff --git a/bottleneck/tests/data/test_461_B b/bottleneck/tests/data/test_461_B new file mode 100644 index 0000000..183fa51 --- /dev/null +++ b/bottleneck/tests/data/test_461_B @@ -0,0 +1,7 @@ +47 127 +9 35 +14 75 +29 92 +76 171 +9 56 +56 86 diff --git a/bottleneck/tests/data/test_462_A b/bottleneck/tests/data/test_462_A new file mode 100644 index 0000000..df1936d --- /dev/null +++ b/bottleneck/tests/data/test_462_A @@ -0,0 +1,7 @@ +0 90 +50 113 +73 149 +86 105 +20 105 +14 75 +41 115 diff --git a/bottleneck/tests/data/test_462_B b/bottleneck/tests/data/test_462_B new file mode 100644 index 0000000..5be3bf0 --- /dev/null +++ b/bottleneck/tests/data/test_462_B @@ -0,0 +1,7 @@ +88 133 +47 100 +27 48 +54 153 +91 116 +90 150 +0 82 diff --git a/bottleneck/tests/data/test_463_A b/bottleneck/tests/data/test_463_A new file mode 100644 index 0000000..c8776fe --- /dev/null +++ b/bottleneck/tests/data/test_463_A @@ -0,0 +1,7 @@ +34 67 +34 92 +53 99 +64 155 +92 157 +16 55 +75 156 diff --git a/bottleneck/tests/data/test_463_B b/bottleneck/tests/data/test_463_B new file mode 100644 index 0000000..a9f1273 --- /dev/null +++ b/bottleneck/tests/data/test_463_B @@ -0,0 +1,7 @@ +20 72 +99 146 +70 158 +4 38 +92 102 +20 32 +47 135 diff --git a/bottleneck/tests/data/test_464_A b/bottleneck/tests/data/test_464_A new file mode 100644 index 0000000..98ff6a9 --- /dev/null +++ b/bottleneck/tests/data/test_464_A @@ -0,0 +1,7 @@ +69 149 +52 115 +32 82 +22 60 +55 56 +80 116 +62 72 diff --git a/bottleneck/tests/data/test_464_B b/bottleneck/tests/data/test_464_B new file mode 100644 index 0000000..0e57b03 --- /dev/null +++ b/bottleneck/tests/data/test_464_B @@ -0,0 +1,7 @@ +81 121 +17 86 +57 141 +13 15 +66 80 +66 107 +76 80 diff --git a/bottleneck/tests/data/test_465_A b/bottleneck/tests/data/test_465_A new file mode 100644 index 0000000..b164c7a --- /dev/null +++ b/bottleneck/tests/data/test_465_A @@ -0,0 +1,7 @@ +8 34 +48 141 +61 122 +56 130 +58 158 +51 81 +32 100 diff --git a/bottleneck/tests/data/test_465_B b/bottleneck/tests/data/test_465_B new file mode 100644 index 0000000..610a2a5 --- /dev/null +++ b/bottleneck/tests/data/test_465_B @@ -0,0 +1,7 @@ +8 89 +62 160 +27 109 +94 112 +59 140 +51 69 +52 136 diff --git a/bottleneck/tests/data/test_466_A b/bottleneck/tests/data/test_466_A new file mode 100644 index 0000000..3c0052c --- /dev/null +++ b/bottleneck/tests/data/test_466_A @@ -0,0 +1,7 @@ +54 113 +15 32 +94 138 +42 132 +84 136 +81 135 +4 62 diff --git a/bottleneck/tests/data/test_466_B b/bottleneck/tests/data/test_466_B new file mode 100644 index 0000000..e8c16f8 --- /dev/null +++ b/bottleneck/tests/data/test_466_B @@ -0,0 +1,7 @@ +51 116 +81 147 +11 51 +76 148 +90 100 +3 100 +62 138 diff --git a/bottleneck/tests/data/test_467_A b/bottleneck/tests/data/test_467_A new file mode 100644 index 0000000..69280bb --- /dev/null +++ b/bottleneck/tests/data/test_467_A @@ -0,0 +1,7 @@ +40 43 +46 99 +90 137 +93 122 +38 45 +87 134 +48 146 diff --git a/bottleneck/tests/data/test_467_B b/bottleneck/tests/data/test_467_B new file mode 100644 index 0000000..c857912 --- /dev/null +++ b/bottleneck/tests/data/test_467_B @@ -0,0 +1,7 @@ +22 23 +57 100 +84 162 +30 92 +65 75 +97 133 +47 117 diff --git a/bottleneck/tests/data/test_468_A b/bottleneck/tests/data/test_468_A new file mode 100644 index 0000000..9f92c43 --- /dev/null +++ b/bottleneck/tests/data/test_468_A @@ -0,0 +1,7 @@ +93 128 +20 66 +72 134 +97 111 +64 99 +17 47 +12 58 diff --git a/bottleneck/tests/data/test_468_B b/bottleneck/tests/data/test_468_B new file mode 100644 index 0000000..b20cdf4 --- /dev/null +++ b/bottleneck/tests/data/test_468_B @@ -0,0 +1,7 @@ +84 156 +42 142 +28 43 +83 179 +15 81 +51 113 +56 136 diff --git a/bottleneck/tests/data/test_469_A b/bottleneck/tests/data/test_469_A new file mode 100644 index 0000000..842bb69 --- /dev/null +++ b/bottleneck/tests/data/test_469_A @@ -0,0 +1,7 @@ +60 115 +77 137 +40 98 +11 59 +16 29 +60 98 +86 149 diff --git a/bottleneck/tests/data/test_469_B b/bottleneck/tests/data/test_469_B new file mode 100644 index 0000000..e6de4fe --- /dev/null +++ b/bottleneck/tests/data/test_469_B @@ -0,0 +1,7 @@ +28 101 +15 65 +55 67 +40 73 +14 69 +87 117 +83 137 diff --git a/bottleneck/tests/data/test_470_A b/bottleneck/tests/data/test_470_A new file mode 100644 index 0000000..5f2fd6b --- /dev/null +++ b/bottleneck/tests/data/test_470_A @@ -0,0 +1,7 @@ +1 17 +80 137 +31 128 +78 83 +95 188 +94 150 +7 103 diff --git a/bottleneck/tests/data/test_470_B b/bottleneck/tests/data/test_470_B new file mode 100644 index 0000000..5db84e8 --- /dev/null +++ b/bottleneck/tests/data/test_470_B @@ -0,0 +1,7 @@ +85 178 +3 52 +99 189 +95 115 +98 183 +0 60 +22 120 diff --git a/bottleneck/tests/data/test_471_A b/bottleneck/tests/data/test_471_A new file mode 100644 index 0000000..e88e5ff --- /dev/null +++ b/bottleneck/tests/data/test_471_A @@ -0,0 +1,7 @@ +58 107 +6 86 +44 47 +12 97 +48 133 +89 111 +94 155 diff --git a/bottleneck/tests/data/test_471_B b/bottleneck/tests/data/test_471_B new file mode 100644 index 0000000..26065c0 --- /dev/null +++ b/bottleneck/tests/data/test_471_B @@ -0,0 +1,7 @@ +51 115 +25 51 +77 165 +21 116 +19 21 +11 77 +5 9 diff --git a/bottleneck/tests/data/test_472_A b/bottleneck/tests/data/test_472_A new file mode 100644 index 0000000..bd2ec1a --- /dev/null +++ b/bottleneck/tests/data/test_472_A @@ -0,0 +1,7 @@ +68 75 +12 88 +15 84 +33 120 +76 160 +23 56 +16 116 diff --git a/bottleneck/tests/data/test_472_B b/bottleneck/tests/data/test_472_B new file mode 100644 index 0000000..3914a18 --- /dev/null +++ b/bottleneck/tests/data/test_472_B @@ -0,0 +1,7 @@ +75 129 +58 68 +36 119 +11 59 +25 42 +50 65 +12 28 diff --git a/bottleneck/tests/data/test_473_A b/bottleneck/tests/data/test_473_A new file mode 100644 index 0000000..d8e4ed1 --- /dev/null +++ b/bottleneck/tests/data/test_473_A @@ -0,0 +1,7 @@ +86 119 +34 71 +91 182 +97 170 +73 104 +71 160 +26 120 diff --git a/bottleneck/tests/data/test_473_B b/bottleneck/tests/data/test_473_B new file mode 100644 index 0000000..1ce2c2f --- /dev/null +++ b/bottleneck/tests/data/test_473_B @@ -0,0 +1,7 @@ +53 111 +78 111 +99 134 +42 70 +70 84 +52 85 +55 154 diff --git a/bottleneck/tests/data/test_474_A b/bottleneck/tests/data/test_474_A new file mode 100644 index 0000000..30c9ad1 --- /dev/null +++ b/bottleneck/tests/data/test_474_A @@ -0,0 +1,7 @@ +84 139 +74 167 +0 76 +6 33 +73 165 +80 173 +28 38 diff --git a/bottleneck/tests/data/test_474_B b/bottleneck/tests/data/test_474_B new file mode 100644 index 0000000..35c507a --- /dev/null +++ b/bottleneck/tests/data/test_474_B @@ -0,0 +1,7 @@ +76 134 +38 118 +37 87 +61 110 +59 79 +67 75 +45 100 diff --git a/bottleneck/tests/data/test_475_A b/bottleneck/tests/data/test_475_A new file mode 100644 index 0000000..05023db --- /dev/null +++ b/bottleneck/tests/data/test_475_A @@ -0,0 +1,7 @@ +17 92 +69 112 +37 83 +62 116 +69 85 +63 92 +31 55 diff --git a/bottleneck/tests/data/test_475_B b/bottleneck/tests/data/test_475_B new file mode 100644 index 0000000..0fcc2d0 --- /dev/null +++ b/bottleneck/tests/data/test_475_B @@ -0,0 +1,7 @@ +18 105 +66 104 +36 67 +50 61 +44 118 +75 99 +41 49 diff --git a/bottleneck/tests/data/test_476_A b/bottleneck/tests/data/test_476_A new file mode 100644 index 0000000..0c4ede1 --- /dev/null +++ b/bottleneck/tests/data/test_476_A @@ -0,0 +1,7 @@ +14 109 +64 142 +98 152 +34 115 +47 100 +85 99 +0 7 diff --git a/bottleneck/tests/data/test_476_B b/bottleneck/tests/data/test_476_B new file mode 100644 index 0000000..ae68bae --- /dev/null +++ b/bottleneck/tests/data/test_476_B @@ -0,0 +1,7 @@ +99 172 +23 91 +0 80 +89 102 +21 56 +86 169 +48 116 diff --git a/bottleneck/tests/data/test_477_A b/bottleneck/tests/data/test_477_A new file mode 100644 index 0000000..719e1b7 --- /dev/null +++ b/bottleneck/tests/data/test_477_A @@ -0,0 +1,7 @@ +2 87 +9 51 +78 81 +26 122 +54 126 +66 128 +88 139 diff --git a/bottleneck/tests/data/test_477_B b/bottleneck/tests/data/test_477_B new file mode 100644 index 0000000..6c2e706 --- /dev/null +++ b/bottleneck/tests/data/test_477_B @@ -0,0 +1,7 @@ +9 55 +60 64 +26 57 +6 74 +70 103 +84 87 +35 56 diff --git a/bottleneck/tests/data/test_478_A b/bottleneck/tests/data/test_478_A new file mode 100644 index 0000000..61b09a8 --- /dev/null +++ b/bottleneck/tests/data/test_478_A @@ -0,0 +1,7 @@ +76 114 +41 48 +16 34 +28 80 +100 119 +57 64 +53 104 diff --git a/bottleneck/tests/data/test_478_B b/bottleneck/tests/data/test_478_B new file mode 100644 index 0000000..a302122 --- /dev/null +++ b/bottleneck/tests/data/test_478_B @@ -0,0 +1,7 @@ +81 179 +64 112 +9 49 +64 132 +15 81 +97 137 +17 39 diff --git a/bottleneck/tests/data/test_479_A b/bottleneck/tests/data/test_479_A new file mode 100644 index 0000000..b956a54 --- /dev/null +++ b/bottleneck/tests/data/test_479_A @@ -0,0 +1,7 @@ +31 104 +56 83 +21 87 +76 135 +63 126 +89 134 +74 159 diff --git a/bottleneck/tests/data/test_479_B b/bottleneck/tests/data/test_479_B new file mode 100644 index 0000000..10d8948 --- /dev/null +++ b/bottleneck/tests/data/test_479_B @@ -0,0 +1,7 @@ +98 131 +8 98 +96 101 +78 146 +6 35 +88 116 +82 88 diff --git a/bottleneck/tests/data/test_480_A b/bottleneck/tests/data/test_480_A new file mode 100644 index 0000000..6ad5182 --- /dev/null +++ b/bottleneck/tests/data/test_480_A @@ -0,0 +1,8 @@ +75 137 +100 185 +65 142 +7 8 +25 44 +39 108 +94 99 +6 78 diff --git a/bottleneck/tests/data/test_480_B b/bottleneck/tests/data/test_480_B new file mode 100644 index 0000000..246f278 --- /dev/null +++ b/bottleneck/tests/data/test_480_B @@ -0,0 +1,8 @@ +80 156 +94 180 +55 143 +39 93 +72 170 +76 176 +72 160 +36 59 diff --git a/bottleneck/tests/data/test_481_A b/bottleneck/tests/data/test_481_A new file mode 100644 index 0000000..8e414ab --- /dev/null +++ b/bottleneck/tests/data/test_481_A @@ -0,0 +1,8 @@ +4 61 +27 91 +83 153 +1 25 +25 33 +71 76 +5 103 +8 34 diff --git a/bottleneck/tests/data/test_481_B b/bottleneck/tests/data/test_481_B new file mode 100644 index 0000000..5596312 --- /dev/null +++ b/bottleneck/tests/data/test_481_B @@ -0,0 +1,8 @@ +59 143 +99 148 +21 32 +60 71 +16 51 +78 90 +11 77 +56 145 diff --git a/bottleneck/tests/data/test_482_A b/bottleneck/tests/data/test_482_A new file mode 100644 index 0000000..b40bc32 --- /dev/null +++ b/bottleneck/tests/data/test_482_A @@ -0,0 +1,8 @@ +56 139 +4 18 +16 47 +99 186 +16 63 +44 50 +99 187 +30 85 diff --git a/bottleneck/tests/data/test_482_B b/bottleneck/tests/data/test_482_B new file mode 100644 index 0000000..04b23b5 --- /dev/null +++ b/bottleneck/tests/data/test_482_B @@ -0,0 +1,8 @@ +84 162 +22 52 +12 98 +59 106 +86 155 +93 108 +75 119 +18 20 diff --git a/bottleneck/tests/data/test_483_A b/bottleneck/tests/data/test_483_A new file mode 100644 index 0000000..7ef0f99 --- /dev/null +++ b/bottleneck/tests/data/test_483_A @@ -0,0 +1,8 @@ +10 13 +53 81 +57 151 +81 148 +91 132 +9 89 +11 65 +29 85 diff --git a/bottleneck/tests/data/test_483_B b/bottleneck/tests/data/test_483_B new file mode 100644 index 0000000..eabdee1 --- /dev/null +++ b/bottleneck/tests/data/test_483_B @@ -0,0 +1,8 @@ +87 187 +79 111 +41 93 +54 76 +27 86 +97 150 +97 185 +36 37 diff --git a/bottleneck/tests/data/test_484_A b/bottleneck/tests/data/test_484_A new file mode 100644 index 0000000..11fa5dd --- /dev/null +++ b/bottleneck/tests/data/test_484_A @@ -0,0 +1,8 @@ +58 147 +24 70 +83 171 +78 91 +55 86 +83 168 +40 125 +75 121 diff --git a/bottleneck/tests/data/test_484_B b/bottleneck/tests/data/test_484_B new file mode 100644 index 0000000..2dda740 --- /dev/null +++ b/bottleneck/tests/data/test_484_B @@ -0,0 +1,8 @@ +55 66 +48 100 +69 123 +84 152 +56 155 +87 99 +83 167 +39 49 diff --git a/bottleneck/tests/data/test_485_A b/bottleneck/tests/data/test_485_A new file mode 100644 index 0000000..bd500dd --- /dev/null +++ b/bottleneck/tests/data/test_485_A @@ -0,0 +1,8 @@ +64 81 +52 69 +62 74 +3 79 +24 117 +81 133 +5 37 +53 90 diff --git a/bottleneck/tests/data/test_485_B b/bottleneck/tests/data/test_485_B new file mode 100644 index 0000000..a117670 --- /dev/null +++ b/bottleneck/tests/data/test_485_B @@ -0,0 +1,8 @@ +80 97 +10 69 +49 123 +28 123 +92 135 +19 107 +7 53 +99 165 diff --git a/bottleneck/tests/data/test_486_A b/bottleneck/tests/data/test_486_A new file mode 100644 index 0000000..4dcc3ca --- /dev/null +++ b/bottleneck/tests/data/test_486_A @@ -0,0 +1,8 @@ +76 162 +58 117 +91 152 +96 137 +45 49 +64 156 +35 64 +42 114 diff --git a/bottleneck/tests/data/test_486_B b/bottleneck/tests/data/test_486_B new file mode 100644 index 0000000..c808dc5 --- /dev/null +++ b/bottleneck/tests/data/test_486_B @@ -0,0 +1,8 @@ +35 95 +0 78 +61 78 +100 110 +100 106 +56 91 +97 133 +87 176 diff --git a/bottleneck/tests/data/test_487_A b/bottleneck/tests/data/test_487_A new file mode 100644 index 0000000..7250b20 --- /dev/null +++ b/bottleneck/tests/data/test_487_A @@ -0,0 +1,8 @@ +78 114 +95 110 +22 47 +95 181 +6 76 +47 89 +10 27 +69 102 diff --git a/bottleneck/tests/data/test_487_B b/bottleneck/tests/data/test_487_B new file mode 100644 index 0000000..b0a4119 --- /dev/null +++ b/bottleneck/tests/data/test_487_B @@ -0,0 +1,8 @@ +31 113 +71 115 +10 97 +97 101 +30 61 +79 157 +56 89 +96 184 diff --git a/bottleneck/tests/data/test_488_A b/bottleneck/tests/data/test_488_A new file mode 100644 index 0000000..92f19ab --- /dev/null +++ b/bottleneck/tests/data/test_488_A @@ -0,0 +1,8 @@ +7 28 +32 59 +64 84 +71 156 +89 166 +67 154 +54 89 +49 78 diff --git a/bottleneck/tests/data/test_488_B b/bottleneck/tests/data/test_488_B new file mode 100644 index 0000000..712480d --- /dev/null +++ b/bottleneck/tests/data/test_488_B @@ -0,0 +1,8 @@ +54 128 +20 59 +64 135 +80 106 +35 88 +93 187 +4 5 +73 126 diff --git a/bottleneck/tests/data/test_489_A b/bottleneck/tests/data/test_489_A new file mode 100644 index 0000000..f1c9abf --- /dev/null +++ b/bottleneck/tests/data/test_489_A @@ -0,0 +1,8 @@ +52 74 +59 74 +83 84 +51 135 +41 132 +29 113 +7 65 +97 176 diff --git a/bottleneck/tests/data/test_489_B b/bottleneck/tests/data/test_489_B new file mode 100644 index 0000000..5c5316f --- /dev/null +++ b/bottleneck/tests/data/test_489_B @@ -0,0 +1,8 @@ +43 126 +23 64 +16 111 +96 97 +84 112 +39 85 +33 74 +39 97 diff --git a/bottleneck/tests/data/test_490_A b/bottleneck/tests/data/test_490_A new file mode 100644 index 0000000..e907d09 --- /dev/null +++ b/bottleneck/tests/data/test_490_A @@ -0,0 +1,8 @@ +93 146 +47 99 +6 55 +19 66 +15 28 +2 93 +97 143 +52 125 diff --git a/bottleneck/tests/data/test_490_B b/bottleneck/tests/data/test_490_B new file mode 100644 index 0000000..6368e47 --- /dev/null +++ b/bottleneck/tests/data/test_490_B @@ -0,0 +1,8 @@ +82 172 +98 155 +73 119 +50 133 +13 84 +53 73 +5 21 +82 83 diff --git a/bottleneck/tests/data/test_491_A b/bottleneck/tests/data/test_491_A new file mode 100644 index 0000000..9fdc2fb --- /dev/null +++ b/bottleneck/tests/data/test_491_A @@ -0,0 +1,8 @@ +12 35 +75 82 +45 91 +18 27 +99 178 +35 37 +46 113 +70 94 diff --git a/bottleneck/tests/data/test_491_B b/bottleneck/tests/data/test_491_B new file mode 100644 index 0000000..09cd4ac --- /dev/null +++ b/bottleneck/tests/data/test_491_B @@ -0,0 +1,8 @@ +76 121 +84 172 +70 167 +57 143 +4 52 +69 159 +10 100 +96 153 diff --git a/bottleneck/tests/data/test_492_A b/bottleneck/tests/data/test_492_A new file mode 100644 index 0000000..434683d --- /dev/null +++ b/bottleneck/tests/data/test_492_A @@ -0,0 +1,8 @@ +21 92 +42 105 +79 166 +41 78 +72 87 +25 49 +78 104 +60 115 diff --git a/bottleneck/tests/data/test_492_B b/bottleneck/tests/data/test_492_B new file mode 100644 index 0000000..3f6f5fa --- /dev/null +++ b/bottleneck/tests/data/test_492_B @@ -0,0 +1,8 @@ +80 94 +66 106 +36 79 +12 20 +28 36 +94 155 +62 100 +77 136 diff --git a/bottleneck/tests/data/test_493_A b/bottleneck/tests/data/test_493_A new file mode 100644 index 0000000..12cfc64 --- /dev/null +++ b/bottleneck/tests/data/test_493_A @@ -0,0 +1,8 @@ +14 46 +79 109 +49 92 +100 181 +32 44 +15 16 +59 62 +66 127 diff --git a/bottleneck/tests/data/test_493_B b/bottleneck/tests/data/test_493_B new file mode 100644 index 0000000..43dcf08 --- /dev/null +++ b/bottleneck/tests/data/test_493_B @@ -0,0 +1,8 @@ +18 21 +74 155 +36 57 +28 41 +15 40 +94 133 +72 153 +42 135 diff --git a/bottleneck/tests/data/test_494_A b/bottleneck/tests/data/test_494_A new file mode 100644 index 0000000..b35b505 --- /dev/null +++ b/bottleneck/tests/data/test_494_A @@ -0,0 +1,8 @@ +31 40 +44 129 +74 92 +41 132 +79 105 +18 58 +93 123 +8 39 diff --git a/bottleneck/tests/data/test_494_B b/bottleneck/tests/data/test_494_B new file mode 100644 index 0000000..fb70ed6 --- /dev/null +++ b/bottleneck/tests/data/test_494_B @@ -0,0 +1,8 @@ +86 165 +30 101 +85 185 +15 71 +75 175 +61 141 +43 81 +90 128 diff --git a/bottleneck/tests/data/test_495_A b/bottleneck/tests/data/test_495_A new file mode 100644 index 0000000..c244b7a --- /dev/null +++ b/bottleneck/tests/data/test_495_A @@ -0,0 +1,8 @@ +90 133 +48 84 +48 126 +0 80 +8 17 +60 82 +17 48 +9 74 diff --git a/bottleneck/tests/data/test_495_B b/bottleneck/tests/data/test_495_B new file mode 100644 index 0000000..4bd121d --- /dev/null +++ b/bottleneck/tests/data/test_495_B @@ -0,0 +1,8 @@ +19 25 +39 63 +0 3 +39 86 +72 91 +27 85 +97 141 +79 174 diff --git a/bottleneck/tests/data/test_496_A b/bottleneck/tests/data/test_496_A new file mode 100644 index 0000000..cc2cc0b --- /dev/null +++ b/bottleneck/tests/data/test_496_A @@ -0,0 +1,8 @@ +79 127 +84 146 +58 143 +28 68 +35 100 +38 126 +24 89 +32 70 diff --git a/bottleneck/tests/data/test_496_B b/bottleneck/tests/data/test_496_B new file mode 100644 index 0000000..5b8aeaa --- /dev/null +++ b/bottleneck/tests/data/test_496_B @@ -0,0 +1,8 @@ +9 61 +68 125 +4 98 +98 99 +49 67 +41 50 +38 61 +24 44 diff --git a/bottleneck/tests/data/test_497_A b/bottleneck/tests/data/test_497_A new file mode 100644 index 0000000..b3b511d --- /dev/null +++ b/bottleneck/tests/data/test_497_A @@ -0,0 +1,8 @@ +19 24 +89 174 +47 137 +93 131 +50 127 +6 34 +99 118 +86 98 diff --git a/bottleneck/tests/data/test_497_B b/bottleneck/tests/data/test_497_B new file mode 100644 index 0000000..8870c73 --- /dev/null +++ b/bottleneck/tests/data/test_497_B @@ -0,0 +1,8 @@ +0 69 +39 100 +58 156 +37 74 +47 62 +81 172 +81 175 +56 147 diff --git a/bottleneck/tests/data/test_498_A b/bottleneck/tests/data/test_498_A new file mode 100644 index 0000000..5bef5fa --- /dev/null +++ b/bottleneck/tests/data/test_498_A @@ -0,0 +1,8 @@ +55 140 +94 160 +22 35 +42 89 +50 127 +8 59 +25 87 +35 103 diff --git a/bottleneck/tests/data/test_498_B b/bottleneck/tests/data/test_498_B new file mode 100644 index 0000000..b1ed38a --- /dev/null +++ b/bottleneck/tests/data/test_498_B @@ -0,0 +1,8 @@ +88 164 +14 29 +13 19 +3 49 +86 107 +62 138 +72 77 +2 22 diff --git a/bottleneck/tests/data/test_499_A b/bottleneck/tests/data/test_499_A new file mode 100644 index 0000000..a24f367 --- /dev/null +++ b/bottleneck/tests/data/test_499_A @@ -0,0 +1,8 @@ +35 68 +22 25 +87 132 +23 119 +64 131 +13 106 +8 22 +83 169 diff --git a/bottleneck/tests/data/test_499_B b/bottleneck/tests/data/test_499_B new file mode 100644 index 0000000..24d0d92 --- /dev/null +++ b/bottleneck/tests/data/test_499_B @@ -0,0 +1,8 @@ +27 105 +66 84 +76 101 +96 126 +40 103 +82 159 +41 45 +58 97 diff --git a/bottleneck/tests/data/test_500_A b/bottleneck/tests/data/test_500_A new file mode 100644 index 0000000..ed86941 --- /dev/null +++ b/bottleneck/tests/data/test_500_A @@ -0,0 +1,9 @@ +96 120 +81 139 +35 58 +14 38 +23 33 +44 97 +26 61 +47 74 +75 124 diff --git a/bottleneck/tests/data/test_500_B b/bottleneck/tests/data/test_500_B new file mode 100644 index 0000000..58f0cd6 --- /dev/null +++ b/bottleneck/tests/data/test_500_B @@ -0,0 +1,9 @@ +57 153 +7 107 +56 78 +67 90 +14 86 +97 112 +5 45 +55 151 +51 133 diff --git a/bottleneck/tests/data/test_501_A b/bottleneck/tests/data/test_501_A new file mode 100644 index 0000000..b6f9335 --- /dev/null +++ b/bottleneck/tests/data/test_501_A @@ -0,0 +1,9 @@ +57 145 +1 34 +98 129 +25 26 +19 94 +90 187 +62 160 +70 115 +88 160 diff --git a/bottleneck/tests/data/test_501_B b/bottleneck/tests/data/test_501_B new file mode 100644 index 0000000..af0d32b --- /dev/null +++ b/bottleneck/tests/data/test_501_B @@ -0,0 +1,9 @@ +77 100 +34 41 +79 99 +27 65 +30 69 +58 96 +98 195 +45 144 +82 147 diff --git a/bottleneck/tests/data/test_502_A b/bottleneck/tests/data/test_502_A new file mode 100644 index 0000000..64c4bfe --- /dev/null +++ b/bottleneck/tests/data/test_502_A @@ -0,0 +1,9 @@ +78 102 +66 134 +42 104 +17 68 +33 113 +84 160 +86 119 +32 73 +6 19 diff --git a/bottleneck/tests/data/test_502_B b/bottleneck/tests/data/test_502_B new file mode 100644 index 0000000..4b1bb48 --- /dev/null +++ b/bottleneck/tests/data/test_502_B @@ -0,0 +1,9 @@ +2 25 +80 119 +56 147 +94 99 +51 116 +29 109 +89 180 +45 75 +93 170 diff --git a/bottleneck/tests/data/test_503_A b/bottleneck/tests/data/test_503_A new file mode 100644 index 0000000..7686e8d --- /dev/null +++ b/bottleneck/tests/data/test_503_A @@ -0,0 +1,9 @@ +53 55 +1 67 +100 128 +27 39 +17 62 +66 98 +49 85 +13 14 +72 91 diff --git a/bottleneck/tests/data/test_503_B b/bottleneck/tests/data/test_503_B new file mode 100644 index 0000000..c662290 --- /dev/null +++ b/bottleneck/tests/data/test_503_B @@ -0,0 +1,9 @@ +74 110 +99 192 +22 56 +19 40 +63 99 +31 44 +28 122 +89 161 +85 184 diff --git a/bottleneck/tests/data/test_504_A b/bottleneck/tests/data/test_504_A new file mode 100644 index 0000000..7b0bcd8 --- /dev/null +++ b/bottleneck/tests/data/test_504_A @@ -0,0 +1,9 @@ +52 60 +30 76 +55 91 +83 91 +23 53 +64 68 +12 106 +54 99 +0 83 diff --git a/bottleneck/tests/data/test_504_B b/bottleneck/tests/data/test_504_B new file mode 100644 index 0000000..1fb9704 --- /dev/null +++ b/bottleneck/tests/data/test_504_B @@ -0,0 +1,9 @@ +10 57 +0 87 +74 85 +13 91 +48 59 +21 109 +85 141 +70 151 +24 103 diff --git a/bottleneck/tests/data/test_505_A b/bottleneck/tests/data/test_505_A new file mode 100644 index 0000000..fd80b53 --- /dev/null +++ b/bottleneck/tests/data/test_505_A @@ -0,0 +1,9 @@ +90 183 +100 112 +33 120 +94 114 +96 190 +70 109 +22 102 +71 126 +99 150 diff --git a/bottleneck/tests/data/test_505_B b/bottleneck/tests/data/test_505_B new file mode 100644 index 0000000..9bd046e --- /dev/null +++ b/bottleneck/tests/data/test_505_B @@ -0,0 +1,9 @@ +18 83 +61 159 +73 138 +51 137 +20 96 +89 185 +13 52 +54 134 +24 35 diff --git a/bottleneck/tests/data/test_506_A b/bottleneck/tests/data/test_506_A new file mode 100644 index 0000000..1f5e9ac --- /dev/null +++ b/bottleneck/tests/data/test_506_A @@ -0,0 +1,9 @@ +95 117 +41 138 +52 118 +82 163 +9 22 +58 156 +7 74 +24 42 +96 158 diff --git a/bottleneck/tests/data/test_506_B b/bottleneck/tests/data/test_506_B new file mode 100644 index 0000000..0dc89b8 --- /dev/null +++ b/bottleneck/tests/data/test_506_B @@ -0,0 +1,9 @@ +91 134 +78 119 +94 141 +5 57 +34 55 +43 101 +27 116 +41 72 +98 126 diff --git a/bottleneck/tests/data/test_507_A b/bottleneck/tests/data/test_507_A new file mode 100644 index 0000000..a6d164e --- /dev/null +++ b/bottleneck/tests/data/test_507_A @@ -0,0 +1,9 @@ +34 62 +21 105 +41 63 +74 99 +52 95 +89 100 +11 82 +74 83 +78 132 diff --git a/bottleneck/tests/data/test_507_B b/bottleneck/tests/data/test_507_B new file mode 100644 index 0000000..b39a7fe --- /dev/null +++ b/bottleneck/tests/data/test_507_B @@ -0,0 +1,9 @@ +49 76 +24 57 +25 101 +9 99 +65 146 +23 43 +89 165 +63 138 +50 76 diff --git a/bottleneck/tests/data/test_508_A b/bottleneck/tests/data/test_508_A new file mode 100644 index 0000000..c837ce3 --- /dev/null +++ b/bottleneck/tests/data/test_508_A @@ -0,0 +1,9 @@ +59 141 +59 74 +0 5 +11 105 +15 58 +43 117 +47 93 +60 149 +69 92 diff --git a/bottleneck/tests/data/test_508_B b/bottleneck/tests/data/test_508_B new file mode 100644 index 0000000..733b5a0 --- /dev/null +++ b/bottleneck/tests/data/test_508_B @@ -0,0 +1,9 @@ +29 104 +50 67 +43 82 +86 102 +45 81 +19 106 +74 124 +77 150 +80 104 diff --git a/bottleneck/tests/data/test_509_A b/bottleneck/tests/data/test_509_A new file mode 100644 index 0000000..98137f3 --- /dev/null +++ b/bottleneck/tests/data/test_509_A @@ -0,0 +1,9 @@ +40 74 +89 138 +20 44 +56 65 +12 14 +87 149 +23 123 +12 28 +56 146 diff --git a/bottleneck/tests/data/test_509_B b/bottleneck/tests/data/test_509_B new file mode 100644 index 0000000..1edd08c --- /dev/null +++ b/bottleneck/tests/data/test_509_B @@ -0,0 +1,9 @@ +89 153 +20 65 +87 128 +27 101 +23 71 +6 53 +50 128 +16 108 +92 157 diff --git a/bottleneck/tests/data/test_510_A b/bottleneck/tests/data/test_510_A new file mode 100644 index 0000000..b1e0e68 --- /dev/null +++ b/bottleneck/tests/data/test_510_A @@ -0,0 +1,9 @@ +67 70 +99 197 +62 111 +25 59 +61 131 +34 108 +99 185 +73 125 +76 130 diff --git a/bottleneck/tests/data/test_510_B b/bottleneck/tests/data/test_510_B new file mode 100644 index 0000000..8e48152 --- /dev/null +++ b/bottleneck/tests/data/test_510_B @@ -0,0 +1,9 @@ +72 74 +57 126 +32 106 +55 88 +75 167 +5 34 +46 72 +86 104 +30 129 diff --git a/bottleneck/tests/data/test_511_A b/bottleneck/tests/data/test_511_A new file mode 100644 index 0000000..a2c6b34 --- /dev/null +++ b/bottleneck/tests/data/test_511_A @@ -0,0 +1,9 @@ +10 56 +84 163 +34 131 +32 106 +61 84 +71 106 +17 32 +23 43 +44 79 diff --git a/bottleneck/tests/data/test_511_B b/bottleneck/tests/data/test_511_B new file mode 100644 index 0000000..ff48216 --- /dev/null +++ b/bottleneck/tests/data/test_511_B @@ -0,0 +1,9 @@ +57 66 +89 124 +93 120 +72 119 +83 125 +1 17 +25 97 +32 90 +89 135 diff --git a/bottleneck/tests/data/test_512_A b/bottleneck/tests/data/test_512_A new file mode 100644 index 0000000..8f875d8 --- /dev/null +++ b/bottleneck/tests/data/test_512_A @@ -0,0 +1,9 @@ +88 136 +21 65 +12 82 +35 48 +97 127 +38 89 +69 71 +47 107 +91 127 diff --git a/bottleneck/tests/data/test_512_B b/bottleneck/tests/data/test_512_B new file mode 100644 index 0000000..c6988c1 --- /dev/null +++ b/bottleneck/tests/data/test_512_B @@ -0,0 +1,9 @@ +59 98 +88 114 +90 122 +83 147 +95 153 +9 56 +14 54 +25 70 +47 60 diff --git a/bottleneck/tests/data/test_513_A b/bottleneck/tests/data/test_513_A new file mode 100644 index 0000000..844c16d --- /dev/null +++ b/bottleneck/tests/data/test_513_A @@ -0,0 +1,9 @@ +34 45 +64 149 +94 147 +34 73 +15 91 +2 53 +46 99 +70 100 +28 62 diff --git a/bottleneck/tests/data/test_513_B b/bottleneck/tests/data/test_513_B new file mode 100644 index 0000000..ee75f8c --- /dev/null +++ b/bottleneck/tests/data/test_513_B @@ -0,0 +1,9 @@ +14 50 +76 112 +46 60 +45 94 +73 150 +79 128 +5 72 +44 87 +25 97 diff --git a/bottleneck/tests/data/test_514_A b/bottleneck/tests/data/test_514_A new file mode 100644 index 0000000..9b58831 --- /dev/null +++ b/bottleneck/tests/data/test_514_A @@ -0,0 +1,9 @@ +4 78 +32 82 +56 106 +56 135 +0 1 +18 103 +29 65 +50 82 +68 82 diff --git a/bottleneck/tests/data/test_514_B b/bottleneck/tests/data/test_514_B new file mode 100644 index 0000000..39c6534 --- /dev/null +++ b/bottleneck/tests/data/test_514_B @@ -0,0 +1,9 @@ +34 63 +63 145 +40 63 +3 93 +57 123 +32 51 +100 115 +23 32 +21 23 diff --git a/bottleneck/tests/data/test_515_A b/bottleneck/tests/data/test_515_A new file mode 100644 index 0000000..fc2578b --- /dev/null +++ b/bottleneck/tests/data/test_515_A @@ -0,0 +1,9 @@ +32 33 +77 131 +64 160 +26 35 +77 106 +69 70 +98 106 +29 107 +65 69 diff --git a/bottleneck/tests/data/test_515_B b/bottleneck/tests/data/test_515_B new file mode 100644 index 0000000..715f6e5 --- /dev/null +++ b/bottleneck/tests/data/test_515_B @@ -0,0 +1,9 @@ +86 101 +89 138 +100 133 +81 103 +9 16 +79 133 +30 113 +98 195 +2 86 diff --git a/bottleneck/tests/data/test_516_A b/bottleneck/tests/data/test_516_A new file mode 100644 index 0000000..bd37e5d --- /dev/null +++ b/bottleneck/tests/data/test_516_A @@ -0,0 +1,9 @@ +80 178 +95 153 +66 133 +12 74 +59 87 +85 165 +36 89 +57 145 +85 177 diff --git a/bottleneck/tests/data/test_516_B b/bottleneck/tests/data/test_516_B new file mode 100644 index 0000000..8d23127 --- /dev/null +++ b/bottleneck/tests/data/test_516_B @@ -0,0 +1,9 @@ +29 85 +39 41 +50 99 +16 76 +82 131 +20 107 +20 25 +91 105 +98 172 diff --git a/bottleneck/tests/data/test_517_A b/bottleneck/tests/data/test_517_A new file mode 100644 index 0000000..17ca01c --- /dev/null +++ b/bottleneck/tests/data/test_517_A @@ -0,0 +1,9 @@ +39 41 +60 128 +14 32 +52 138 +74 79 +52 100 +4 39 +53 145 +33 127 diff --git a/bottleneck/tests/data/test_517_B b/bottleneck/tests/data/test_517_B new file mode 100644 index 0000000..ba82599 --- /dev/null +++ b/bottleneck/tests/data/test_517_B @@ -0,0 +1,9 @@ +31 113 +54 116 +69 151 +9 18 +60 62 +0 22 +93 162 +15 62 +63 148 diff --git a/bottleneck/tests/data/test_518_A b/bottleneck/tests/data/test_518_A new file mode 100644 index 0000000..bb1711c --- /dev/null +++ b/bottleneck/tests/data/test_518_A @@ -0,0 +1,9 @@ +49 70 +63 113 +60 158 +17 111 +37 112 +35 101 +3 51 +89 126 +91 129 diff --git a/bottleneck/tests/data/test_518_B b/bottleneck/tests/data/test_518_B new file mode 100644 index 0000000..5b2e95a --- /dev/null +++ b/bottleneck/tests/data/test_518_B @@ -0,0 +1,9 @@ +7 97 +72 146 +59 147 +89 103 +72 169 +43 65 +29 98 +28 44 +14 40 diff --git a/bottleneck/tests/data/test_519_A b/bottleneck/tests/data/test_519_A new file mode 100644 index 0000000..f0cb6ea --- /dev/null +++ b/bottleneck/tests/data/test_519_A @@ -0,0 +1,9 @@ +6 92 +25 100 +99 156 +12 89 +3 102 +32 107 +13 40 +79 94 +33 118 diff --git a/bottleneck/tests/data/test_519_B b/bottleneck/tests/data/test_519_B new file mode 100644 index 0000000..03396db --- /dev/null +++ b/bottleneck/tests/data/test_519_B @@ -0,0 +1,9 @@ +32 46 +61 155 +98 180 +10 89 +86 127 +0 4 +51 65 +9 85 +32 85 diff --git a/bottleneck/tests/data/test_520_A b/bottleneck/tests/data/test_520_A new file mode 100644 index 0000000..9353285 --- /dev/null +++ b/bottleneck/tests/data/test_520_A @@ -0,0 +1,10 @@ +91 117 +68 132 +36 70 +20 75 +47 97 +50 84 +9 79 +63 70 +0 48 +15 75 diff --git a/bottleneck/tests/data/test_520_B b/bottleneck/tests/data/test_520_B new file mode 100644 index 0000000..1e328cd --- /dev/null +++ b/bottleneck/tests/data/test_520_B @@ -0,0 +1,10 @@ +35 51 +16 23 +4 91 +69 133 +21 30 +80 169 +55 100 +34 76 +24 30 +97 167 diff --git a/bottleneck/tests/data/test_521_A b/bottleneck/tests/data/test_521_A new file mode 100644 index 0000000..d0bea91 --- /dev/null +++ b/bottleneck/tests/data/test_521_A @@ -0,0 +1,10 @@ +22 45 +99 100 +34 81 +41 104 +1 25 +3 93 +26 88 +4 23 +97 159 +7 19 diff --git a/bottleneck/tests/data/test_521_B b/bottleneck/tests/data/test_521_B new file mode 100644 index 0000000..5e584b0 --- /dev/null +++ b/bottleneck/tests/data/test_521_B @@ -0,0 +1,10 @@ +2 40 +31 85 +57 105 +28 61 +18 111 +95 115 +0 66 +81 167 +96 174 +85 170 diff --git a/bottleneck/tests/data/test_522_A b/bottleneck/tests/data/test_522_A new file mode 100644 index 0000000..5631735 --- /dev/null +++ b/bottleneck/tests/data/test_522_A @@ -0,0 +1,10 @@ +99 187 +92 127 +69 157 +82 161 +94 141 +97 108 +70 94 +20 39 +87 172 +87 122 diff --git a/bottleneck/tests/data/test_522_B b/bottleneck/tests/data/test_522_B new file mode 100644 index 0000000..903bcdc --- /dev/null +++ b/bottleneck/tests/data/test_522_B @@ -0,0 +1,10 @@ +39 51 +28 81 +77 78 +17 52 +42 124 +34 37 +96 117 +39 98 +65 142 +4 72 diff --git a/bottleneck/tests/data/test_523_A b/bottleneck/tests/data/test_523_A new file mode 100644 index 0000000..b4da958 --- /dev/null +++ b/bottleneck/tests/data/test_523_A @@ -0,0 +1,10 @@ +73 158 +5 34 +4 67 +88 109 +46 137 +86 152 +61 113 +61 93 +71 77 +65 157 diff --git a/bottleneck/tests/data/test_523_B b/bottleneck/tests/data/test_523_B new file mode 100644 index 0000000..bcc7438 --- /dev/null +++ b/bottleneck/tests/data/test_523_B @@ -0,0 +1,10 @@ +54 78 +6 86 +63 130 +90 183 +59 89 +96 151 +93 117 +74 147 +20 93 +26 110 diff --git a/bottleneck/tests/data/test_524_A b/bottleneck/tests/data/test_524_A new file mode 100644 index 0000000..e260687 --- /dev/null +++ b/bottleneck/tests/data/test_524_A @@ -0,0 +1,10 @@ +25 116 +12 34 +31 39 +56 152 +47 147 +67 112 +60 146 +77 112 +71 120 +67 75 diff --git a/bottleneck/tests/data/test_524_B b/bottleneck/tests/data/test_524_B new file mode 100644 index 0000000..92a2d76 --- /dev/null +++ b/bottleneck/tests/data/test_524_B @@ -0,0 +1,10 @@ +2 10 +32 42 +24 123 +24 32 +84 135 +49 148 +100 181 +81 137 +63 96 +13 16 diff --git a/bottleneck/tests/data/test_525_A b/bottleneck/tests/data/test_525_A new file mode 100644 index 0000000..25d9d8f --- /dev/null +++ b/bottleneck/tests/data/test_525_A @@ -0,0 +1,10 @@ +51 101 +67 155 +84 155 +67 151 +39 122 +93 167 +83 117 +20 67 +39 136 +54 116 diff --git a/bottleneck/tests/data/test_525_B b/bottleneck/tests/data/test_525_B new file mode 100644 index 0000000..d61ee84 --- /dev/null +++ b/bottleneck/tests/data/test_525_B @@ -0,0 +1,10 @@ +69 120 +93 141 +65 96 +8 81 +27 110 +94 178 +9 89 +1 91 +77 86 +33 49 diff --git a/bottleneck/tests/data/test_526_A b/bottleneck/tests/data/test_526_A new file mode 100644 index 0000000..985ba29 --- /dev/null +++ b/bottleneck/tests/data/test_526_A @@ -0,0 +1,10 @@ +10 27 +53 116 +71 93 +88 122 +45 87 +82 167 +89 105 +20 101 +25 71 +61 124 diff --git a/bottleneck/tests/data/test_526_B b/bottleneck/tests/data/test_526_B new file mode 100644 index 0000000..2ebf00a --- /dev/null +++ b/bottleneck/tests/data/test_526_B @@ -0,0 +1,10 @@ +70 95 +68 69 +13 105 +58 156 +51 97 +64 106 +87 95 +63 85 +62 79 +82 87 diff --git a/bottleneck/tests/data/test_527_A b/bottleneck/tests/data/test_527_A new file mode 100644 index 0000000..802b177 --- /dev/null +++ b/bottleneck/tests/data/test_527_A @@ -0,0 +1,10 @@ +5 27 +91 164 +68 91 +11 72 +37 66 +12 27 +30 47 +54 58 +34 80 +43 133 diff --git a/bottleneck/tests/data/test_527_B b/bottleneck/tests/data/test_527_B new file mode 100644 index 0000000..a04d9f1 --- /dev/null +++ b/bottleneck/tests/data/test_527_B @@ -0,0 +1,10 @@ +88 156 +74 105 +64 69 +96 127 +10 93 +52 107 +58 134 +18 108 +80 108 +93 161 diff --git a/bottleneck/tests/data/test_528_A b/bottleneck/tests/data/test_528_A new file mode 100644 index 0000000..da776dc --- /dev/null +++ b/bottleneck/tests/data/test_528_A @@ -0,0 +1,10 @@ +36 107 +14 86 +45 96 +22 58 +57 103 +92 138 +65 150 +33 94 +40 79 +50 54 diff --git a/bottleneck/tests/data/test_528_B b/bottleneck/tests/data/test_528_B new file mode 100644 index 0000000..5329277 --- /dev/null +++ b/bottleneck/tests/data/test_528_B @@ -0,0 +1,10 @@ +39 122 +19 43 +88 130 +48 106 +27 69 +93 140 +1 23 +50 94 +87 139 +97 151 diff --git a/bottleneck/tests/data/test_529_A b/bottleneck/tests/data/test_529_A new file mode 100644 index 0000000..ebbf6fa --- /dev/null +++ b/bottleneck/tests/data/test_529_A @@ -0,0 +1,10 @@ +80 140 +0 97 +28 29 +15 85 +21 35 +34 74 +26 27 +91 135 +21 36 +33 117 diff --git a/bottleneck/tests/data/test_529_B b/bottleneck/tests/data/test_529_B new file mode 100644 index 0000000..6e0f836 --- /dev/null +++ b/bottleneck/tests/data/test_529_B @@ -0,0 +1,10 @@ +22 46 +0 79 +33 86 +14 99 +71 108 +83 91 +40 69 +36 45 +42 112 +44 75 diff --git a/bottleneck/tests/data/test_530_A b/bottleneck/tests/data/test_530_A new file mode 100644 index 0000000..904eac4 --- /dev/null +++ b/bottleneck/tests/data/test_530_A @@ -0,0 +1,10 @@ +89 119 +35 104 +90 95 +6 77 +44 71 +46 100 +40 127 +11 52 +28 81 +39 73 diff --git a/bottleneck/tests/data/test_530_B b/bottleneck/tests/data/test_530_B new file mode 100644 index 0000000..f4cfc4c --- /dev/null +++ b/bottleneck/tests/data/test_530_B @@ -0,0 +1,10 @@ +79 179 +39 89 +5 67 +39 66 +88 162 +82 97 +80 156 +91 182 +44 110 +56 67 diff --git a/bottleneck/tests/data/test_531_A b/bottleneck/tests/data/test_531_A new file mode 100644 index 0000000..416eb0a --- /dev/null +++ b/bottleneck/tests/data/test_531_A @@ -0,0 +1,10 @@ +33 133 +73 98 +77 129 +21 118 +9 21 +68 166 +13 46 +53 84 +48 75 +24 90 diff --git a/bottleneck/tests/data/test_531_B b/bottleneck/tests/data/test_531_B new file mode 100644 index 0000000..afb424a --- /dev/null +++ b/bottleneck/tests/data/test_531_B @@ -0,0 +1,10 @@ +89 148 +25 112 +86 132 +78 106 +57 70 +92 160 +67 86 +94 123 +12 26 +65 117 diff --git a/bottleneck/tests/data/test_532_A b/bottleneck/tests/data/test_532_A new file mode 100644 index 0000000..7eb97c1 --- /dev/null +++ b/bottleneck/tests/data/test_532_A @@ -0,0 +1,10 @@ +8 62 +77 140 +23 60 +13 93 +67 74 +59 152 +22 65 +16 17 +97 98 +76 91 diff --git a/bottleneck/tests/data/test_532_B b/bottleneck/tests/data/test_532_B new file mode 100644 index 0000000..e86a6a0 --- /dev/null +++ b/bottleneck/tests/data/test_532_B @@ -0,0 +1,10 @@ +66 111 +54 74 +95 142 +96 167 +63 84 +76 84 +53 59 +97 130 +20 68 +5 58 diff --git a/bottleneck/tests/data/test_533_A b/bottleneck/tests/data/test_533_A new file mode 100644 index 0000000..0462a89 --- /dev/null +++ b/bottleneck/tests/data/test_533_A @@ -0,0 +1,10 @@ +66 103 +20 42 +30 31 +61 90 +31 129 +49 53 +2 3 +78 122 +36 103 +59 63 diff --git a/bottleneck/tests/data/test_533_B b/bottleneck/tests/data/test_533_B new file mode 100644 index 0000000..d077aa2 --- /dev/null +++ b/bottleneck/tests/data/test_533_B @@ -0,0 +1,10 @@ +51 121 +9 63 +71 121 +66 100 +89 111 +15 23 +98 110 +15 96 +4 52 +96 119 diff --git a/bottleneck/tests/data/test_534_A b/bottleneck/tests/data/test_534_A new file mode 100644 index 0000000..a5c6b69 --- /dev/null +++ b/bottleneck/tests/data/test_534_A @@ -0,0 +1,10 @@ +84 177 +8 103 +81 176 +0 71 +4 80 +59 123 +42 63 +1 98 +86 169 +31 97 diff --git a/bottleneck/tests/data/test_534_B b/bottleneck/tests/data/test_534_B new file mode 100644 index 0000000..10d4e7b --- /dev/null +++ b/bottleneck/tests/data/test_534_B @@ -0,0 +1,10 @@ +8 56 +35 95 +62 104 +26 105 +32 52 +1 48 +87 150 +61 77 +12 66 +62 96 diff --git a/bottleneck/tests/data/test_535_A b/bottleneck/tests/data/test_535_A new file mode 100644 index 0000000..faaf29f --- /dev/null +++ b/bottleneck/tests/data/test_535_A @@ -0,0 +1,10 @@ +40 53 +9 46 +94 119 +85 113 +2 97 +62 162 +74 89 +87 118 +76 120 +33 39 diff --git a/bottleneck/tests/data/test_535_B b/bottleneck/tests/data/test_535_B new file mode 100644 index 0000000..108c8a3 --- /dev/null +++ b/bottleneck/tests/data/test_535_B @@ -0,0 +1,10 @@ +6 82 +22 100 +2 82 +71 123 +91 179 +14 107 +28 38 +71 83 +6 60 +1 5 diff --git a/bottleneck/tests/data/test_536_A b/bottleneck/tests/data/test_536_A new file mode 100644 index 0000000..320f5af --- /dev/null +++ b/bottleneck/tests/data/test_536_A @@ -0,0 +1,10 @@ +87 179 +24 37 +14 64 +10 103 +92 160 +96 136 +86 171 +21 54 +22 32 +71 169 diff --git a/bottleneck/tests/data/test_536_B b/bottleneck/tests/data/test_536_B new file mode 100644 index 0000000..9ce91f5 --- /dev/null +++ b/bottleneck/tests/data/test_536_B @@ -0,0 +1,10 @@ +73 151 +54 87 +79 166 +69 149 +77 132 +49 149 +86 107 +72 119 +35 77 +52 56 diff --git a/bottleneck/tests/data/test_537_A b/bottleneck/tests/data/test_537_A new file mode 100644 index 0000000..c41e293 --- /dev/null +++ b/bottleneck/tests/data/test_537_A @@ -0,0 +1,10 @@ +4 80 +18 78 +55 56 +32 118 +79 151 +5 78 +11 12 +89 113 +99 120 +26 85 diff --git a/bottleneck/tests/data/test_537_B b/bottleneck/tests/data/test_537_B new file mode 100644 index 0000000..a10f64d --- /dev/null +++ b/bottleneck/tests/data/test_537_B @@ -0,0 +1,10 @@ +53 138 +80 135 +34 112 +20 46 +79 122 +21 87 +82 83 +91 112 +59 139 +9 97 diff --git a/bottleneck/tests/data/test_538_A b/bottleneck/tests/data/test_538_A new file mode 100644 index 0000000..0d98495 --- /dev/null +++ b/bottleneck/tests/data/test_538_A @@ -0,0 +1,10 @@ +68 91 +38 132 +6 57 +24 46 +71 79 +61 129 +59 82 +15 105 +77 79 +44 117 diff --git a/bottleneck/tests/data/test_538_B b/bottleneck/tests/data/test_538_B new file mode 100644 index 0000000..6dde6f3 --- /dev/null +++ b/bottleneck/tests/data/test_538_B @@ -0,0 +1,10 @@ +0 89 +73 128 +54 150 +79 98 +62 137 +51 66 +67 99 +31 100 +68 105 +19 30 diff --git a/bottleneck/tests/data/test_539_A b/bottleneck/tests/data/test_539_A new file mode 100644 index 0000000..a844d1c --- /dev/null +++ b/bottleneck/tests/data/test_539_A @@ -0,0 +1,10 @@ +72 140 +32 108 +64 99 +78 130 +74 122 +92 134 +71 75 +14 89 +86 134 +1 36 diff --git a/bottleneck/tests/data/test_539_B b/bottleneck/tests/data/test_539_B new file mode 100644 index 0000000..824a004 --- /dev/null +++ b/bottleneck/tests/data/test_539_B @@ -0,0 +1,10 @@ +2 56 +57 82 +6 38 +60 68 +80 101 +27 57 +56 133 +45 75 +42 103 +38 78 diff --git a/bottleneck/tests/data/test_540_A b/bottleneck/tests/data/test_540_A new file mode 100644 index 0000000..26bd782 --- /dev/null +++ b/bottleneck/tests/data/test_540_A @@ -0,0 +1,20 @@ +98 163 +65 109 +99 135 +11 83 +36 76 +57 84 +97 180 +22 87 +27 51 +92 190 +66 102 +32 76 +78 125 +70 144 +72 127 +50 51 +34 112 +3 39 +37 79 +55 143 diff --git a/bottleneck/tests/data/test_540_B b/bottleneck/tests/data/test_540_B new file mode 100644 index 0000000..224839d --- /dev/null +++ b/bottleneck/tests/data/test_540_B @@ -0,0 +1,20 @@ +90 182 +48 122 +34 109 +78 115 +60 110 +78 134 +58 59 +14 27 +48 94 +63 100 +88 171 +29 123 +20 61 +66 115 +46 61 +5 74 +94 189 +46 80 +85 88 +9 75 diff --git a/bottleneck/tests/data/test_541_A b/bottleneck/tests/data/test_541_A new file mode 100644 index 0000000..fe8039b --- /dev/null +++ b/bottleneck/tests/data/test_541_A @@ -0,0 +1,20 @@ +79 102 +50 71 +80 116 +35 44 +54 112 +89 90 +16 90 +14 30 +44 122 +98 135 +45 68 +46 125 +0 11 +46 94 +75 79 +76 89 +15 82 +84 95 +49 61 +68 123 diff --git a/bottleneck/tests/data/test_541_B b/bottleneck/tests/data/test_541_B new file mode 100644 index 0000000..c33af0e --- /dev/null +++ b/bottleneck/tests/data/test_541_B @@ -0,0 +1,20 @@ +39 108 +72 146 +49 50 +31 72 +84 104 +72 90 +57 81 +14 74 +69 74 +88 157 +9 65 +34 46 +44 87 +39 65 +14 77 +22 116 +5 58 +43 113 +62 120 +85 118 diff --git a/bottleneck/tests/data/test_542_A b/bottleneck/tests/data/test_542_A new file mode 100644 index 0000000..d45ea52 --- /dev/null +++ b/bottleneck/tests/data/test_542_A @@ -0,0 +1,20 @@ +17 49 +64 156 +91 96 +83 142 +90 118 +20 59 +26 69 +82 118 +94 179 +1 20 +81 123 +89 165 +17 71 +60 85 +56 147 +94 175 +82 148 +31 118 +51 95 +12 41 diff --git a/bottleneck/tests/data/test_542_B b/bottleneck/tests/data/test_542_B new file mode 100644 index 0000000..9dcdf8a --- /dev/null +++ b/bottleneck/tests/data/test_542_B @@ -0,0 +1,20 @@ +21 47 +41 90 +78 121 +36 93 +8 108 +78 117 +31 92 +97 102 +12 96 +83 89 +36 85 +2 81 +24 86 +26 105 +10 99 +59 101 +45 98 +94 162 +57 60 +29 81 diff --git a/bottleneck/tests/data/test_543_A b/bottleneck/tests/data/test_543_A new file mode 100644 index 0000000..511fbc1 --- /dev/null +++ b/bottleneck/tests/data/test_543_A @@ -0,0 +1,20 @@ +92 188 +94 159 +77 175 +13 23 +92 186 +85 144 +100 191 +34 48 +58 103 +74 113 +73 95 +34 66 +2 98 +80 95 +82 140 +38 133 +67 121 +65 70 +83 86 +90 143 diff --git a/bottleneck/tests/data/test_543_B b/bottleneck/tests/data/test_543_B new file mode 100644 index 0000000..879080c --- /dev/null +++ b/bottleneck/tests/data/test_543_B @@ -0,0 +1,20 @@ +100 168 +52 97 +35 39 +4 38 +42 55 +47 117 +49 145 +16 48 +99 145 +45 54 +69 129 +8 103 +47 108 +25 70 +93 148 +96 133 +44 49 +94 115 +48 53 +44 109 diff --git a/bottleneck/tests/data/test_544_A b/bottleneck/tests/data/test_544_A new file mode 100644 index 0000000..a355d41 --- /dev/null +++ b/bottleneck/tests/data/test_544_A @@ -0,0 +1,20 @@ +31 114 +22 94 +10 88 +82 134 +28 106 +90 188 +78 130 +87 176 +99 155 +71 116 +39 105 +8 40 +96 184 +53 100 +77 79 +26 96 +30 116 +82 167 +62 122 +95 152 diff --git a/bottleneck/tests/data/test_544_B b/bottleneck/tests/data/test_544_B new file mode 100644 index 0000000..83587cf --- /dev/null +++ b/bottleneck/tests/data/test_544_B @@ -0,0 +1,20 @@ +75 125 +7 26 +61 102 +98 99 +12 88 +49 63 +46 61 +77 111 +13 56 +37 89 +7 84 +51 69 +86 142 +98 140 +91 122 +10 65 +9 33 +6 70 +95 101 +26 111 diff --git a/bottleneck/tests/data/test_545_A b/bottleneck/tests/data/test_545_A new file mode 100644 index 0000000..c5351d7 --- /dev/null +++ b/bottleneck/tests/data/test_545_A @@ -0,0 +1,20 @@ +52 89 +34 54 +44 124 +82 128 +75 104 +26 120 +77 159 +11 42 +75 153 +89 189 +52 73 +43 128 +45 132 +80 160 +53 55 +76 122 +96 114 +64 109 +20 119 +99 145 diff --git a/bottleneck/tests/data/test_545_B b/bottleneck/tests/data/test_545_B new file mode 100644 index 0000000..0c60c17 --- /dev/null +++ b/bottleneck/tests/data/test_545_B @@ -0,0 +1,20 @@ +74 118 +29 69 +19 82 +50 124 +82 155 +15 63 +35 51 +38 52 +11 105 +70 114 +19 86 +91 157 +98 151 +14 83 +39 126 +38 52 +57 68 +79 137 +21 66 +68 92 diff --git a/bottleneck/tests/data/test_546_A b/bottleneck/tests/data/test_546_A new file mode 100644 index 0000000..4391c84 --- /dev/null +++ b/bottleneck/tests/data/test_546_A @@ -0,0 +1,20 @@ +60 91 +46 132 +27 127 +4 36 +66 116 +73 113 +56 98 +29 66 +38 88 +18 24 +19 52 +32 119 +39 81 +71 110 +24 46 +81 90 +80 111 +47 88 +94 142 +42 47 diff --git a/bottleneck/tests/data/test_546_B b/bottleneck/tests/data/test_546_B new file mode 100644 index 0000000..3d3dec6 --- /dev/null +++ b/bottleneck/tests/data/test_546_B @@ -0,0 +1,20 @@ +82 101 +14 80 +56 78 +28 113 +61 125 +70 88 +30 47 +88 176 +84 169 +15 92 +17 19 +33 61 +33 34 +60 142 +7 8 +5 34 +99 140 +35 113 +14 46 +74 112 diff --git a/bottleneck/tests/data/test_547_A b/bottleneck/tests/data/test_547_A new file mode 100644 index 0000000..1388d05 --- /dev/null +++ b/bottleneck/tests/data/test_547_A @@ -0,0 +1,20 @@ +36 57 +27 86 +11 103 +73 132 +5 58 +59 66 +26 35 +0 18 +47 138 +49 118 +23 79 +12 99 +9 35 +15 79 +18 25 +94 137 +8 50 +68 78 +79 179 +31 121 diff --git a/bottleneck/tests/data/test_547_B b/bottleneck/tests/data/test_547_B new file mode 100644 index 0000000..dbb925d --- /dev/null +++ b/bottleneck/tests/data/test_547_B @@ -0,0 +1,20 @@ +24 75 +28 29 +35 81 +81 178 +25 79 +78 106 +23 93 +57 151 +96 135 +85 151 +73 149 +37 98 +10 24 +30 61 +39 67 +68 74 +57 79 +66 160 +60 151 +66 139 diff --git a/bottleneck/tests/data/test_548_A b/bottleneck/tests/data/test_548_A new file mode 100644 index 0000000..08c858e --- /dev/null +++ b/bottleneck/tests/data/test_548_A @@ -0,0 +1,20 @@ +15 24 +24 72 +67 142 +71 97 +26 61 +99 158 +61 82 +100 198 +51 114 +10 98 +46 93 +74 171 +14 75 +85 101 +30 40 +37 42 +2 16 +48 64 +48 99 +77 170 diff --git a/bottleneck/tests/data/test_548_B b/bottleneck/tests/data/test_548_B new file mode 100644 index 0000000..b6dda3a --- /dev/null +++ b/bottleneck/tests/data/test_548_B @@ -0,0 +1,20 @@ +51 59 +99 108 +89 148 +82 96 +55 117 +52 148 +74 133 +37 99 +6 71 +0 15 +100 170 +28 56 +12 39 +61 98 +24 92 +18 88 +63 158 +91 129 +79 154 +39 85 diff --git a/bottleneck/tests/data/test_549_A b/bottleneck/tests/data/test_549_A new file mode 100644 index 0000000..b0d5ddf --- /dev/null +++ b/bottleneck/tests/data/test_549_A @@ -0,0 +1,20 @@ +35 44 +1 25 +100 168 +81 169 +40 84 +28 37 +50 58 +60 122 +4 27 +2 99 +67 145 +51 111 +96 148 +47 65 +64 159 +54 114 +90 113 +4 36 +94 178 +19 20 diff --git a/bottleneck/tests/data/test_549_B b/bottleneck/tests/data/test_549_B new file mode 100644 index 0000000..a44a982 --- /dev/null +++ b/bottleneck/tests/data/test_549_B @@ -0,0 +1,20 @@ +68 146 +8 27 +6 64 +76 113 +71 89 +29 65 +74 133 +52 57 +21 26 +2 39 +95 194 +67 113 +14 20 +90 160 +93 171 +72 97 +57 157 +23 42 +13 70 +17 44 diff --git a/bottleneck/tests/data/test_550_A b/bottleneck/tests/data/test_550_A new file mode 100644 index 0000000..b8ba8e8 --- /dev/null +++ b/bottleneck/tests/data/test_550_A @@ -0,0 +1,20 @@ +76 145 +38 79 +44 90 +71 155 +48 63 +88 125 +36 107 +91 136 +25 33 +49 57 +37 70 +69 116 +63 64 +70 118 +43 115 +80 99 +42 71 +86 91 +96 166 +69 121 diff --git a/bottleneck/tests/data/test_550_B b/bottleneck/tests/data/test_550_B new file mode 100644 index 0000000..ed900f0 --- /dev/null +++ b/bottleneck/tests/data/test_550_B @@ -0,0 +1,20 @@ +25 66 +55 107 +62 87 +15 49 +46 99 +25 39 +73 94 +43 126 +85 163 +12 96 +48 127 +21 26 +40 45 +88 188 +77 109 +38 44 +0 66 +57 59 +85 104 +32 54 diff --git a/bottleneck/tests/data/test_551_A b/bottleneck/tests/data/test_551_A new file mode 100644 index 0000000..3002ec2 --- /dev/null +++ b/bottleneck/tests/data/test_551_A @@ -0,0 +1,20 @@ +68 98 +42 48 +4 5 +6 82 +41 83 +94 141 +17 48 +33 105 +71 162 +55 95 +43 132 +81 162 +6 32 +88 101 +76 85 +36 70 +42 45 +60 122 +83 127 +100 148 diff --git a/bottleneck/tests/data/test_551_B b/bottleneck/tests/data/test_551_B new file mode 100644 index 0000000..5a9b2de --- /dev/null +++ b/bottleneck/tests/data/test_551_B @@ -0,0 +1,20 @@ +58 109 +88 154 +56 66 +76 142 +86 125 +95 181 +46 85 +15 43 +55 79 +77 104 +45 113 +66 74 +64 100 +45 138 +6 62 +36 79 +77 106 +82 115 +15 110 +62 156 diff --git a/bottleneck/tests/data/test_552_A b/bottleneck/tests/data/test_552_A new file mode 100644 index 0000000..19de840 --- /dev/null +++ b/bottleneck/tests/data/test_552_A @@ -0,0 +1,20 @@ +10 104 +23 89 +7 13 +66 150 +92 157 +22 43 +35 62 +96 187 +84 89 +75 160 +88 118 +74 99 +43 138 +20 37 +90 176 +85 157 +90 168 +63 157 +59 106 +68 92 diff --git a/bottleneck/tests/data/test_552_B b/bottleneck/tests/data/test_552_B new file mode 100644 index 0000000..54b3e00 --- /dev/null +++ b/bottleneck/tests/data/test_552_B @@ -0,0 +1,20 @@ +57 121 +94 173 +84 133 +61 106 +71 130 +44 114 +55 73 +100 144 +91 126 +60 109 +44 92 +23 87 +52 116 +24 25 +10 93 +60 140 +11 55 +96 155 +76 165 +38 129 diff --git a/bottleneck/tests/data/test_553_A b/bottleneck/tests/data/test_553_A new file mode 100644 index 0000000..deff96a --- /dev/null +++ b/bottleneck/tests/data/test_553_A @@ -0,0 +1,20 @@ +1 4 +23 91 +97 103 +6 68 +13 25 +9 18 +65 122 +91 154 +41 76 +86 132 +31 62 +93 167 +45 50 +70 166 +38 113 +52 132 +77 161 +13 60 +39 65 +60 69 diff --git a/bottleneck/tests/data/test_553_B b/bottleneck/tests/data/test_553_B new file mode 100644 index 0000000..ee7ce9b --- /dev/null +++ b/bottleneck/tests/data/test_553_B @@ -0,0 +1,20 @@ +51 60 +76 151 +87 157 +49 110 +78 112 +3 59 +55 98 +26 121 +69 158 +15 63 +70 109 +30 46 +23 75 +65 138 +87 120 +7 46 +99 187 +43 69 +73 161 +37 93 diff --git a/bottleneck/tests/data/test_554_A b/bottleneck/tests/data/test_554_A new file mode 100644 index 0000000..da38226 --- /dev/null +++ b/bottleneck/tests/data/test_554_A @@ -0,0 +1,20 @@ +69 134 +81 159 +100 168 +96 111 +46 134 +56 61 +8 31 +63 119 +57 137 +16 84 +5 51 +79 128 +20 117 +85 136 +34 88 +23 73 +3 87 +10 34 +72 120 +36 71 diff --git a/bottleneck/tests/data/test_554_B b/bottleneck/tests/data/test_554_B new file mode 100644 index 0000000..8583236 --- /dev/null +++ b/bottleneck/tests/data/test_554_B @@ -0,0 +1,20 @@ +14 62 +54 74 +87 164 +57 87 +70 113 +5 75 +86 185 +3 69 +36 52 +31 93 +85 104 +4 97 +89 149 +19 92 +70 120 +13 18 +48 72 +100 152 +35 48 +94 191 diff --git a/bottleneck/tests/data/test_555_A b/bottleneck/tests/data/test_555_A new file mode 100644 index 0000000..87cd93d --- /dev/null +++ b/bottleneck/tests/data/test_555_A @@ -0,0 +1,20 @@ +23 58 +71 106 +56 155 +37 85 +88 186 +12 75 +23 86 +17 92 +30 96 +13 54 +53 152 +84 153 +15 22 +67 86 +93 147 +17 117 +99 170 +75 108 +18 118 +71 131 diff --git a/bottleneck/tests/data/test_555_B b/bottleneck/tests/data/test_555_B new file mode 100644 index 0000000..2b8c351 --- /dev/null +++ b/bottleneck/tests/data/test_555_B @@ -0,0 +1,20 @@ +9 71 +95 131 +85 156 +86 142 +10 54 +56 119 +49 100 +30 50 +7 64 +27 82 +14 85 +33 35 +22 52 +92 171 +36 62 +85 133 +4 14 +47 124 +70 131 +14 29 diff --git a/bottleneck/tests/data/test_556_A b/bottleneck/tests/data/test_556_A new file mode 100644 index 0000000..182965d --- /dev/null +++ b/bottleneck/tests/data/test_556_A @@ -0,0 +1,20 @@ +79 147 +83 144 +20 30 +92 185 +29 40 +46 90 +21 106 +15 24 +16 63 +62 67 +18 106 +52 127 +47 64 +15 84 +10 87 +16 102 +89 139 +64 68 +57 128 +37 120 diff --git a/bottleneck/tests/data/test_556_B b/bottleneck/tests/data/test_556_B new file mode 100644 index 0000000..f2e3409 --- /dev/null +++ b/bottleneck/tests/data/test_556_B @@ -0,0 +1,20 @@ +84 125 +37 84 +38 46 +32 59 +36 76 +95 107 +82 144 +81 121 +72 145 +1 100 +70 143 +76 167 +8 26 +51 90 +74 165 +88 89 +56 155 +95 165 +24 109 +45 141 diff --git a/bottleneck/tests/data/test_557_A b/bottleneck/tests/data/test_557_A new file mode 100644 index 0000000..ac233bb --- /dev/null +++ b/bottleneck/tests/data/test_557_A @@ -0,0 +1,20 @@ +47 91 +57 100 +93 157 +12 91 +95 109 +26 103 +55 78 +58 106 +5 96 +25 85 +76 97 +20 78 +85 160 +71 144 +81 145 +58 59 +49 86 +31 35 +89 156 +15 82 diff --git a/bottleneck/tests/data/test_557_B b/bottleneck/tests/data/test_557_B new file mode 100644 index 0000000..f838403 --- /dev/null +++ b/bottleneck/tests/data/test_557_B @@ -0,0 +1,20 @@ +31 112 +70 120 +12 49 +95 96 +27 87 +50 120 +78 115 +22 108 +54 82 +31 109 +51 74 +55 140 +7 92 +88 133 +61 82 +90 183 +33 64 +90 121 +26 47 +98 120 diff --git a/bottleneck/tests/data/test_558_A b/bottleneck/tests/data/test_558_A new file mode 100644 index 0000000..7108d09 --- /dev/null +++ b/bottleneck/tests/data/test_558_A @@ -0,0 +1,20 @@ +57 115 +32 131 +32 111 +46 104 +8 12 +20 69 +65 89 +8 37 +88 153 +61 63 +86 139 +74 88 +3 62 +58 104 +31 100 +29 81 +55 59 +11 18 +63 103 +56 110 diff --git a/bottleneck/tests/data/test_558_B b/bottleneck/tests/data/test_558_B new file mode 100644 index 0000000..dd19869 --- /dev/null +++ b/bottleneck/tests/data/test_558_B @@ -0,0 +1,20 @@ +43 134 +43 44 +56 124 +97 118 +34 68 +56 140 +41 140 +24 95 +57 91 +22 28 +94 158 +69 141 +94 110 +7 41 +39 59 +69 107 +76 163 +30 105 +96 142 +46 127 diff --git a/bottleneck/tests/data/test_559_A b/bottleneck/tests/data/test_559_A new file mode 100644 index 0000000..46f07b4 --- /dev/null +++ b/bottleneck/tests/data/test_559_A @@ -0,0 +1,20 @@ +21 99 +7 104 +89 130 +91 181 +19 90 +57 146 +15 60 +66 123 +13 58 +3 57 +39 114 +4 53 +80 125 +83 132 +81 98 +14 99 +81 175 +49 92 +39 125 +31 111 diff --git a/bottleneck/tests/data/test_559_B b/bottleneck/tests/data/test_559_B new file mode 100644 index 0000000..b747fb8 --- /dev/null +++ b/bottleneck/tests/data/test_559_B @@ -0,0 +1,20 @@ +13 43 +81 86 +45 84 +84 111 +39 83 +85 115 +70 150 +97 192 +70 107 +21 74 +71 73 +98 184 +14 114 +63 126 +21 59 +53 147 +70 114 +30 56 +34 35 +61 133 diff --git a/bottleneck/tests/data/test_560_A b/bottleneck/tests/data/test_560_A new file mode 100644 index 0000000..9b704ae --- /dev/null +++ b/bottleneck/tests/data/test_560_A @@ -0,0 +1,30 @@ +35 126 +34 37 +78 84 +70 127 +97 106 +42 49 +49 105 +50 150 +80 140 +30 128 +90 136 +77 173 +42 98 +17 97 +100 181 +30 45 +6 40 +30 75 +66 148 +13 66 +39 113 +53 106 +65 133 +1 17 +61 123 +37 114 +1 77 +6 19 +8 11 +20 95 diff --git a/bottleneck/tests/data/test_560_B b/bottleneck/tests/data/test_560_B new file mode 100644 index 0000000..d4ece9d --- /dev/null +++ b/bottleneck/tests/data/test_560_B @@ -0,0 +1,30 @@ +100 150 +25 32 +99 187 +42 117 +60 84 +22 104 +15 113 +29 58 +91 185 +92 120 +95 133 +42 67 +62 148 +79 122 +27 66 +14 75 +44 142 +10 25 +54 149 +31 38 +97 161 +63 115 +29 76 +100 102 +59 72 +54 140 +8 108 +12 83 +54 127 +43 95 diff --git a/bottleneck/tests/data/test_561_A b/bottleneck/tests/data/test_561_A new file mode 100644 index 0000000..81a3e31 --- /dev/null +++ b/bottleneck/tests/data/test_561_A @@ -0,0 +1,30 @@ +13 66 +67 124 +99 163 +91 163 +42 140 +96 153 +6 77 +6 83 +84 166 +48 79 +50 79 +63 111 +21 85 +55 117 +62 160 +4 101 +30 75 +42 87 +58 60 +88 178 +43 54 +90 120 +72 147 +30 70 +13 66 +89 166 +83 149 +69 160 +66 83 +89 142 diff --git a/bottleneck/tests/data/test_561_B b/bottleneck/tests/data/test_561_B new file mode 100644 index 0000000..c60b08c --- /dev/null +++ b/bottleneck/tests/data/test_561_B @@ -0,0 +1,30 @@ +61 97 +8 94 +32 68 +55 101 +24 56 +25 30 +33 79 +16 111 +72 82 +42 86 +93 143 +94 163 +69 168 +68 100 +3 102 +9 72 +6 74 +4 46 +97 130 +15 27 +12 33 +62 67 +37 74 +0 76 +14 102 +33 95 +46 131 +89 90 +79 97 +100 109 diff --git a/bottleneck/tests/data/test_562_A b/bottleneck/tests/data/test_562_A new file mode 100644 index 0000000..6dadf55 --- /dev/null +++ b/bottleneck/tests/data/test_562_A @@ -0,0 +1,30 @@ +12 41 +99 100 +15 60 +95 108 +9 108 +4 5 +96 161 +88 168 +12 106 +78 167 +80 164 +69 130 +88 161 +49 134 +18 76 +54 134 +45 136 +22 50 +21 78 +17 88 +46 117 +97 174 +25 95 +8 9 +43 123 +25 107 +58 73 +2 7 +89 152 +81 114 diff --git a/bottleneck/tests/data/test_562_B b/bottleneck/tests/data/test_562_B new file mode 100644 index 0000000..48eaf77 --- /dev/null +++ b/bottleneck/tests/data/test_562_B @@ -0,0 +1,30 @@ +5 104 +17 105 +43 120 +87 88 +35 71 +47 55 +57 87 +66 119 +26 114 +4 9 +29 70 +40 95 +61 73 +20 31 +85 148 +47 59 +34 43 +36 50 +70 77 +30 47 +36 56 +9 55 +35 127 +36 84 +83 118 +90 98 +69 85 +34 104 +76 127 +78 99 diff --git a/bottleneck/tests/data/test_563_A b/bottleneck/tests/data/test_563_A new file mode 100644 index 0000000..954685e --- /dev/null +++ b/bottleneck/tests/data/test_563_A @@ -0,0 +1,30 @@ +51 145 +19 119 +94 179 +8 35 +90 155 +34 39 +55 96 +19 27 +84 95 +12 52 +14 101 +72 143 +1 14 +88 138 +95 109 +85 134 +54 149 +35 85 +50 55 +93 173 +81 108 +14 112 +23 67 +13 14 +21 37 +89 177 +63 163 +2 89 +5 61 +18 76 diff --git a/bottleneck/tests/data/test_563_B b/bottleneck/tests/data/test_563_B new file mode 100644 index 0000000..c3d7844 --- /dev/null +++ b/bottleneck/tests/data/test_563_B @@ -0,0 +1,30 @@ +40 75 +52 88 +0 33 +63 134 +19 77 +34 106 +67 164 +6 61 +67 144 +41 105 +30 108 +17 24 +97 105 +61 90 +45 80 +34 52 +58 140 +46 52 +4 13 +43 143 +74 168 +85 148 +24 55 +80 84 +3 56 +39 138 +1 30 +14 20 +14 91 +42 48 diff --git a/bottleneck/tests/data/test_564_A b/bottleneck/tests/data/test_564_A new file mode 100644 index 0000000..a39b7ae --- /dev/null +++ b/bottleneck/tests/data/test_564_A @@ -0,0 +1,30 @@ +85 112 +83 119 +84 128 +36 100 +18 112 +83 89 +17 80 +68 147 +32 76 +42 46 +29 89 +9 49 +40 135 +65 75 +69 113 +87 184 +81 103 +13 81 +44 99 +17 51 +99 102 +86 89 +29 124 +52 140 +19 54 +73 173 +89 172 +6 33 +80 139 +52 58 diff --git a/bottleneck/tests/data/test_564_B b/bottleneck/tests/data/test_564_B new file mode 100644 index 0000000..22adad2 --- /dev/null +++ b/bottleneck/tests/data/test_564_B @@ -0,0 +1,30 @@ +56 66 +92 164 +7 68 +87 135 +45 70 +94 109 +32 103 +44 73 +36 124 +50 139 +88 102 +17 116 +3 61 +90 149 +41 62 +13 42 +19 51 +96 105 +55 143 +67 165 +44 129 +72 171 +20 51 +36 119 +35 96 +33 107 +48 106 +9 30 +36 110 +90 114 diff --git a/bottleneck/tests/data/test_565_A b/bottleneck/tests/data/test_565_A new file mode 100644 index 0000000..34eb265 --- /dev/null +++ b/bottleneck/tests/data/test_565_A @@ -0,0 +1,30 @@ +33 61 +68 78 +90 98 +66 127 +93 152 +21 29 +49 52 +78 171 +42 55 +95 159 +82 141 +85 152 +22 25 +71 132 +24 75 +3 82 +42 131 +24 73 +89 155 +32 132 +77 159 +97 165 +89 92 +50 82 +52 102 +11 64 +47 135 +45 89 +11 52 +11 25 diff --git a/bottleneck/tests/data/test_565_B b/bottleneck/tests/data/test_565_B new file mode 100644 index 0000000..da5ed1d --- /dev/null +++ b/bottleneck/tests/data/test_565_B @@ -0,0 +1,30 @@ +46 66 +86 178 +19 102 +97 140 +22 97 +49 97 +6 48 +23 105 +92 157 +85 103 +67 167 +29 44 +88 183 +85 184 +90 93 +23 113 +30 106 +32 130 +81 154 +76 141 +75 101 +26 84 +9 77 +53 73 +23 84 +83 85 +6 44 +29 31 +26 107 +61 114 diff --git a/bottleneck/tests/data/test_566_A b/bottleneck/tests/data/test_566_A new file mode 100644 index 0000000..55d0a13 --- /dev/null +++ b/bottleneck/tests/data/test_566_A @@ -0,0 +1,30 @@ +4 34 +20 53 +59 101 +40 70 +29 58 +67 107 +92 122 +35 120 +34 98 +34 79 +17 20 +12 53 +69 167 +19 88 +92 118 +21 73 +54 78 +0 83 +41 127 +34 59 +41 106 +4 102 +46 48 +99 189 +15 25 +17 19 +25 33 +25 108 +25 105 +64 99 diff --git a/bottleneck/tests/data/test_566_B b/bottleneck/tests/data/test_566_B new file mode 100644 index 0000000..57c08b6 --- /dev/null +++ b/bottleneck/tests/data/test_566_B @@ -0,0 +1,30 @@ +36 121 +5 33 +47 137 +95 158 +43 105 +4 15 +0 59 +30 36 +29 106 +58 126 +81 129 +63 108 +52 147 +80 163 +93 94 +32 122 +12 92 +74 135 +25 28 +11 107 +91 182 +68 90 +90 106 +96 126 +83 117 +57 147 +89 181 +36 107 +24 68 +83 131 diff --git a/bottleneck/tests/data/test_567_A b/bottleneck/tests/data/test_567_A new file mode 100644 index 0000000..3304c25 --- /dev/null +++ b/bottleneck/tests/data/test_567_A @@ -0,0 +1,30 @@ +67 79 +12 58 +33 85 +25 70 +79 128 +34 59 +22 45 +100 102 +25 57 +30 113 +77 89 +74 83 +43 138 +30 81 +26 64 +91 94 +83 149 +83 119 +44 46 +79 105 +49 140 +58 110 +92 104 +8 65 +40 52 +46 60 +9 17 +25 47 +25 125 +95 109 diff --git a/bottleneck/tests/data/test_567_B b/bottleneck/tests/data/test_567_B new file mode 100644 index 0000000..4a8f5fa --- /dev/null +++ b/bottleneck/tests/data/test_567_B @@ -0,0 +1,30 @@ +46 93 +85 165 +2 24 +29 81 +88 99 +94 109 +78 82 +54 69 +43 139 +3 40 +37 117 +98 138 +12 71 +75 84 +9 100 +56 65 +97 146 +56 105 +17 82 +11 44 +93 100 +6 99 +32 128 +9 35 +9 41 +66 123 +66 163 +34 110 +47 82 +15 97 diff --git a/bottleneck/tests/data/test_568_A b/bottleneck/tests/data/test_568_A new file mode 100644 index 0000000..e6e0ecb --- /dev/null +++ b/bottleneck/tests/data/test_568_A @@ -0,0 +1,30 @@ +20 98 +14 51 +82 116 +80 117 +96 109 +61 101 +44 75 +76 80 +64 96 +100 158 +13 89 +84 138 +0 16 +94 138 +32 117 +68 157 +7 24 +1 56 +72 101 +47 128 +85 90 +66 155 +33 106 +97 144 +50 139 +10 54 +23 77 +87 106 +37 104 +11 37 diff --git a/bottleneck/tests/data/test_568_B b/bottleneck/tests/data/test_568_B new file mode 100644 index 0000000..081ff5e --- /dev/null +++ b/bottleneck/tests/data/test_568_B @@ -0,0 +1,30 @@ +49 147 +26 112 +32 71 +30 50 +77 136 +10 110 +50 71 +14 110 +4 24 +64 125 +54 121 +58 142 +50 51 +0 63 +7 96 +49 146 +64 111 +53 122 +2 84 +56 102 +44 102 +5 78 +61 90 +32 92 +99 157 +100 188 +37 70 +6 7 +58 139 +52 138 diff --git a/bottleneck/tests/data/test_569_A b/bottleneck/tests/data/test_569_A new file mode 100644 index 0000000..7fc96cf --- /dev/null +++ b/bottleneck/tests/data/test_569_A @@ -0,0 +1,30 @@ +83 116 +33 112 +58 86 +3 65 +21 46 +51 58 +47 138 +88 112 +4 84 +4 8 +46 74 +74 132 +54 120 +2 68 +99 119 +5 43 +5 61 +54 75 +83 169 +100 192 +47 133 +27 28 +44 128 +19 77 +60 160 +46 55 +78 169 +16 82 +60 97 +57 60 diff --git a/bottleneck/tests/data/test_569_B b/bottleneck/tests/data/test_569_B new file mode 100644 index 0000000..b732aac --- /dev/null +++ b/bottleneck/tests/data/test_569_B @@ -0,0 +1,30 @@ +51 97 +59 91 +9 11 +49 50 +54 111 +44 132 +22 53 +11 80 +22 101 +76 79 +29 112 +99 123 +67 116 +69 110 +27 51 +22 55 +3 58 +43 84 +18 68 +88 134 +28 29 +70 137 +36 37 +85 168 +4 69 +50 99 +27 117 +12 69 +55 127 +23 28 diff --git a/bottleneck/tests/data/test_570_A b/bottleneck/tests/data/test_570_A new file mode 100644 index 0000000..371835b --- /dev/null +++ b/bottleneck/tests/data/test_570_A @@ -0,0 +1,30 @@ +30 76 +17 43 +84 85 +45 52 +85 117 +95 172 +36 58 +6 12 +70 147 +82 114 +67 163 +1 85 +1 92 +23 80 +58 60 +42 123 +100 148 +52 127 +45 49 +33 47 +48 124 +77 169 +5 64 +24 49 +16 40 +83 130 +86 121 +73 157 +88 124 +59 80 diff --git a/bottleneck/tests/data/test_570_B b/bottleneck/tests/data/test_570_B new file mode 100644 index 0000000..3ce3450 --- /dev/null +++ b/bottleneck/tests/data/test_570_B @@ -0,0 +1,30 @@ +44 134 +28 120 +0 58 +32 41 +64 82 +7 91 +32 123 +22 46 +87 159 +3 13 +79 102 +37 80 +77 91 +64 126 +43 128 +53 107 +50 89 +15 111 +37 101 +6 51 +11 41 +66 110 +99 191 +8 53 +12 59 +53 91 +9 51 +47 57 +35 88 +83 134 diff --git a/bottleneck/tests/data/test_571_A b/bottleneck/tests/data/test_571_A new file mode 100644 index 0000000..6b58a17 --- /dev/null +++ b/bottleneck/tests/data/test_571_A @@ -0,0 +1,30 @@ +73 83 +85 94 +20 39 +62 71 +100 146 +84 95 +21 64 +62 136 +49 90 +39 129 +92 156 +27 105 +48 66 +5 100 +86 186 +74 118 +93 173 +93 143 +91 173 +5 59 +75 78 +98 106 +37 125 +24 60 +24 117 +83 131 +69 137 +1 54 +81 154 +26 124 diff --git a/bottleneck/tests/data/test_571_B b/bottleneck/tests/data/test_571_B new file mode 100644 index 0000000..0bb3b3e --- /dev/null +++ b/bottleneck/tests/data/test_571_B @@ -0,0 +1,30 @@ +90 159 +93 97 +57 109 +87 127 +96 185 +53 142 +59 125 +54 132 +26 48 +54 150 +63 65 +36 50 +3 19 +19 95 +47 76 +25 36 +34 70 +63 126 +99 199 +11 38 +96 120 +89 162 +55 125 +3 98 +11 31 +18 103 +68 101 +47 68 +45 48 +36 59 diff --git a/bottleneck/tests/data/test_572_A b/bottleneck/tests/data/test_572_A new file mode 100644 index 0000000..052ddfe --- /dev/null +++ b/bottleneck/tests/data/test_572_A @@ -0,0 +1,30 @@ +83 96 +59 158 +99 133 +98 139 +71 163 +95 138 +83 97 +46 72 +23 29 +49 133 +60 63 +6 84 +33 86 +33 71 +99 188 +51 61 +79 150 +38 61 +68 147 +98 170 +77 131 +32 97 +57 119 +36 37 +66 75 +37 68 +72 150 +42 99 +28 90 +56 123 diff --git a/bottleneck/tests/data/test_572_B b/bottleneck/tests/data/test_572_B new file mode 100644 index 0000000..d816eab --- /dev/null +++ b/bottleneck/tests/data/test_572_B @@ -0,0 +1,30 @@ +44 61 +72 88 +8 15 +78 155 +90 99 +87 106 +50 57 +60 126 +75 175 +81 135 +94 181 +6 52 +64 152 +63 79 +23 105 +88 104 +68 145 +9 26 +23 68 +49 144 +5 9 +62 156 +6 94 +61 159 +82 130 +26 84 +78 110 +27 75 +41 123 +56 147 diff --git a/bottleneck/tests/data/test_573_A b/bottleneck/tests/data/test_573_A new file mode 100644 index 0000000..fe68d64 --- /dev/null +++ b/bottleneck/tests/data/test_573_A @@ -0,0 +1,30 @@ +43 94 +41 75 +26 69 +43 58 +64 94 +54 98 +19 106 +99 119 +52 115 +79 88 +77 84 +96 118 +55 80 +47 114 +64 137 +79 158 +38 60 +79 136 +57 82 +17 103 +28 82 +28 35 +74 86 +99 121 +96 176 +0 55 +2 76 +85 155 +9 40 +76 118 diff --git a/bottleneck/tests/data/test_573_B b/bottleneck/tests/data/test_573_B new file mode 100644 index 0000000..9824068 --- /dev/null +++ b/bottleneck/tests/data/test_573_B @@ -0,0 +1,30 @@ +60 107 +11 66 +34 94 +40 87 +1 4 +43 67 +25 76 +73 108 +86 178 +25 58 +95 99 +82 97 +13 54 +58 88 +38 78 +44 131 +92 99 +5 88 +98 120 +56 112 +45 112 +69 110 +48 121 +53 83 +20 52 +3 45 +49 126 +13 17 +30 83 +97 121 diff --git a/bottleneck/tests/data/test_574_A b/bottleneck/tests/data/test_574_A new file mode 100644 index 0000000..9dbb066 --- /dev/null +++ b/bottleneck/tests/data/test_574_A @@ -0,0 +1,30 @@ +21 109 +12 79 +44 58 +0 97 +30 124 +58 154 +91 150 +1 92 +34 43 +18 109 +10 11 +0 84 +30 56 +66 166 +43 80 +77 167 +61 94 +58 136 +20 110 +84 144 +100 182 +8 80 +79 124 +89 164 +61 84 +69 129 +30 111 +67 105 +69 70 +38 108 diff --git a/bottleneck/tests/data/test_574_B b/bottleneck/tests/data/test_574_B new file mode 100644 index 0000000..dc0f4c7 --- /dev/null +++ b/bottleneck/tests/data/test_574_B @@ -0,0 +1,30 @@ +24 53 +49 112 +58 149 +49 136 +66 149 +10 87 +36 113 +66 144 +87 150 +20 40 +41 136 +80 111 +99 199 +76 131 +7 72 +99 122 +93 124 +5 8 +97 105 +23 27 +82 102 +30 84 +62 143 +8 48 +40 119 +29 62 +11 68 +75 128 +68 124 +23 26 diff --git a/bottleneck/tests/data/test_575_A b/bottleneck/tests/data/test_575_A new file mode 100644 index 0000000..7703382 --- /dev/null +++ b/bottleneck/tests/data/test_575_A @@ -0,0 +1,30 @@ +78 141 +24 58 +30 120 +71 72 +4 21 +30 61 +7 52 +16 91 +58 109 +28 97 +46 86 +65 134 +86 151 +77 134 +6 32 +31 83 +84 180 +53 118 +78 108 +88 115 +75 137 +92 149 +57 120 +94 109 +59 131 +5 36 +39 91 +65 138 +96 167 +87 164 diff --git a/bottleneck/tests/data/test_575_B b/bottleneck/tests/data/test_575_B new file mode 100644 index 0000000..a5ba6b7 --- /dev/null +++ b/bottleneck/tests/data/test_575_B @@ -0,0 +1,30 @@ +77 176 +11 43 +38 70 +64 163 +70 101 +18 66 +50 119 +30 48 +18 88 +85 106 +50 56 +42 134 +25 92 +5 53 +86 101 +44 91 +61 127 +42 55 +31 103 +15 23 +93 117 +45 68 +39 84 +64 135 +86 109 +82 174 +72 73 +43 73 +37 41 +71 76 diff --git a/bottleneck/tests/data/test_576_A b/bottleneck/tests/data/test_576_A new file mode 100644 index 0000000..57eb281 --- /dev/null +++ b/bottleneck/tests/data/test_576_A @@ -0,0 +1,30 @@ +61 135 +79 123 +27 28 +4 48 +44 120 +40 69 +28 82 +4 45 +28 82 +70 145 +14 102 +84 169 +89 121 +67 137 +65 141 +39 60 +97 162 +90 187 +23 78 +71 168 +76 98 +85 101 +9 86 +57 89 +86 109 +55 62 +90 101 +82 110 +100 153 +33 67 diff --git a/bottleneck/tests/data/test_576_B b/bottleneck/tests/data/test_576_B new file mode 100644 index 0000000..fa63de8 --- /dev/null +++ b/bottleneck/tests/data/test_576_B @@ -0,0 +1,30 @@ +83 145 +27 62 +71 125 +78 175 +11 55 +81 94 +91 141 +27 103 +68 97 +54 89 +68 143 +50 100 +65 85 +84 179 +83 96 +44 121 +13 86 +29 86 +72 172 +95 140 +83 161 +83 100 +98 167 +8 66 +75 101 +6 50 +10 58 +5 57 +51 77 +87 140 diff --git a/bottleneck/tests/data/test_577_A b/bottleneck/tests/data/test_577_A new file mode 100644 index 0000000..d086e3f --- /dev/null +++ b/bottleneck/tests/data/test_577_A @@ -0,0 +1,30 @@ +65 94 +1 2 +30 31 +91 131 +75 170 +38 85 +51 73 +78 155 +43 141 +54 109 +53 54 +36 74 +75 80 +51 144 +33 127 +31 89 +0 10 +18 87 +11 18 +51 126 +64 91 +7 51 +26 71 +92 160 +24 44 +0 58 +3 78 +2 67 +12 88 +68 130 diff --git a/bottleneck/tests/data/test_577_B b/bottleneck/tests/data/test_577_B new file mode 100644 index 0000000..e48e09a --- /dev/null +++ b/bottleneck/tests/data/test_577_B @@ -0,0 +1,30 @@ +90 189 +96 195 +64 91 +81 84 +42 76 +17 19 +76 77 +64 149 +85 99 +90 147 +60 95 +59 155 +29 121 +27 104 +10 72 +32 79 +44 129 +9 70 +68 136 +9 75 +27 89 +70 148 +77 149 +8 91 +24 84 +90 123 +86 105 +64 94 +84 109 +31 51 diff --git a/bottleneck/tests/data/test_578_A b/bottleneck/tests/data/test_578_A new file mode 100644 index 0000000..8b9a6fe --- /dev/null +++ b/bottleneck/tests/data/test_578_A @@ -0,0 +1,30 @@ +9 99 +58 83 +62 110 +32 102 +86 169 +95 131 +1 6 +1 55 +88 154 +67 95 +21 22 +31 118 +15 52 +64 92 +36 87 +18 106 +71 150 +10 55 +67 97 +53 145 +31 40 +33 62 +79 116 +70 110 +96 145 +86 182 +43 116 +54 145 +100 172 +74 84 diff --git a/bottleneck/tests/data/test_578_B b/bottleneck/tests/data/test_578_B new file mode 100644 index 0000000..636f20d --- /dev/null +++ b/bottleneck/tests/data/test_578_B @@ -0,0 +1,30 @@ +33 36 +89 175 +83 151 +61 138 +4 15 +9 58 +38 111 +29 117 +22 79 +26 86 +48 55 +65 134 +60 84 +23 96 +69 149 +29 48 +38 137 +39 51 +88 112 +14 41 +29 119 +52 56 +55 96 +58 127 +78 148 +44 64 +35 108 +69 124 +6 80 +43 77 diff --git a/bottleneck/tests/data/test_579_A b/bottleneck/tests/data/test_579_A new file mode 100644 index 0000000..99bbb96 --- /dev/null +++ b/bottleneck/tests/data/test_579_A @@ -0,0 +1,30 @@ +90 170 +5 32 +49 116 +37 88 +19 64 +81 177 +39 77 +37 123 +53 127 +31 76 +67 114 +51 125 +48 121 +59 62 +31 119 +35 90 +100 117 +33 130 +22 74 +23 41 +71 159 +3 57 +22 61 +86 123 +91 115 +66 92 +39 104 +85 134 +72 160 +6 94 diff --git a/bottleneck/tests/data/test_579_B b/bottleneck/tests/data/test_579_B new file mode 100644 index 0000000..6d3e9b6 --- /dev/null +++ b/bottleneck/tests/data/test_579_B @@ -0,0 +1,30 @@ +76 123 +2 17 +41 123 +62 138 +40 70 +92 164 +70 105 +63 109 +14 23 +26 109 +78 141 +85 162 +37 49 +27 96 +62 68 +80 136 +30 72 +44 85 +59 122 +42 137 +67 140 +81 181 +43 84 +91 108 +71 86 +30 45 +76 94 +25 57 +25 71 +70 90 diff --git a/bottleneck/tests/data/test_580_A b/bottleneck/tests/data/test_580_A new file mode 100644 index 0000000..b8d1c86 --- /dev/null +++ b/bottleneck/tests/data/test_580_A @@ -0,0 +1,50 @@ +34 78 +25 82 +42 132 +77 154 +15 52 +54 69 +68 78 +36 111 +9 24 +30 53 +53 117 +84 163 +91 124 +13 76 +20 59 +67 151 +17 103 +76 156 +3 41 +2 37 +65 158 +67 75 +42 125 +83 115 +47 147 +13 44 +83 133 +92 146 +57 125 +66 103 +55 69 +39 63 +16 63 +98 108 +23 93 +12 30 +7 70 +70 131 +49 127 +83 90 +97 171 +35 81 +78 130 +88 143 +62 124 +2 40 +66 110 +51 61 +2 25 +69 74 diff --git a/bottleneck/tests/data/test_580_B b/bottleneck/tests/data/test_580_B new file mode 100644 index 0000000..1fd48af --- /dev/null +++ b/bottleneck/tests/data/test_580_B @@ -0,0 +1,50 @@ +60 156 +65 78 +70 102 +52 113 +64 154 +45 126 +45 86 +6 49 +7 93 +99 127 +15 33 +1 36 +12 30 +30 89 +41 84 +66 131 +8 23 +0 9 +95 149 +47 83 +69 165 +79 91 +74 125 +59 77 +93 137 +33 119 +24 113 +98 116 +10 70 +57 124 +97 126 +48 113 +30 67 +2 15 +56 86 +75 111 +81 82 +99 196 +69 105 +51 147 +5 69 +40 136 +79 147 +44 136 +95 194 +67 93 +0 46 +26 90 +58 115 +40 87 diff --git a/bottleneck/tests/data/test_581_A b/bottleneck/tests/data/test_581_A new file mode 100644 index 0000000..cf1555c --- /dev/null +++ b/bottleneck/tests/data/test_581_A @@ -0,0 +1,50 @@ +79 87 +81 162 +7 74 +53 79 +19 50 +30 106 +68 155 +17 79 +75 90 +55 71 +30 127 +57 145 +78 80 +11 96 +16 47 +56 131 +45 46 +75 136 +17 75 +72 74 +27 114 +28 112 +31 123 +37 110 +89 159 +57 85 +49 52 +72 130 +68 86 +88 152 +5 66 +67 71 +51 91 +72 82 +3 21 +21 38 +47 86 +37 108 +35 123 +49 119 +36 97 +36 119 +9 48 +16 36 +32 37 +38 68 +82 147 +39 79 +23 101 +33 104 diff --git a/bottleneck/tests/data/test_581_B b/bottleneck/tests/data/test_581_B new file mode 100644 index 0000000..853ac92 --- /dev/null +++ b/bottleneck/tests/data/test_581_B @@ -0,0 +1,50 @@ +94 181 +38 90 +83 137 +36 93 +8 53 +59 118 +21 110 +94 175 +18 40 +94 120 +46 81 +54 145 +13 37 +36 100 +73 86 +67 166 +91 187 +11 15 +45 124 +23 29 +89 125 +78 101 +83 98 +52 73 +39 62 +15 86 +80 140 +100 181 +50 55 +80 124 +27 29 +19 76 +92 167 +12 57 +63 134 +45 46 +42 110 +93 179 +31 130 +59 137 +7 99 +77 107 +59 127 +82 160 +27 70 +100 200 +80 101 +16 97 +93 184 +15 48 diff --git a/bottleneck/tests/data/test_582_A b/bottleneck/tests/data/test_582_A new file mode 100644 index 0000000..dcabc9f --- /dev/null +++ b/bottleneck/tests/data/test_582_A @@ -0,0 +1,50 @@ +85 106 +23 89 +31 90 +4 42 +45 104 +100 137 +32 115 +65 112 +25 82 +75 158 +74 147 +6 106 +92 179 +91 110 +94 150 +9 19 +91 110 +82 108 +39 90 +49 69 +73 89 +61 68 +22 85 +13 57 +86 102 +23 43 +29 65 +3 72 +85 131 +71 80 +83 89 +73 119 +28 46 +33 101 +18 24 +38 69 +50 51 +84 85 +75 175 +99 153 +84 86 +97 100 +68 115 +91 108 +62 77 +54 80 +7 49 +26 29 +53 101 +64 73 diff --git a/bottleneck/tests/data/test_582_B b/bottleneck/tests/data/test_582_B new file mode 100644 index 0000000..9420fa9 --- /dev/null +++ b/bottleneck/tests/data/test_582_B @@ -0,0 +1,50 @@ +99 153 +54 92 +64 65 +40 117 +28 70 +33 105 +70 105 +72 109 +9 34 +72 151 +1 46 +57 133 +51 72 +52 119 +44 92 +13 71 +96 191 +80 123 +47 121 +84 162 +69 111 +15 35 +41 45 +23 86 +36 107 +6 18 +63 118 +4 50 +84 107 +90 132 +74 127 +14 37 +75 167 +42 81 +53 76 +32 88 +2 70 +87 129 +7 8 +6 35 +70 115 +69 137 +80 174 +24 107 +66 116 +22 110 +4 90 +0 41 +63 160 +99 142 diff --git a/bottleneck/tests/data/test_583_A b/bottleneck/tests/data/test_583_A new file mode 100644 index 0000000..cc36f56 --- /dev/null +++ b/bottleneck/tests/data/test_583_A @@ -0,0 +1,50 @@ +99 127 +62 97 +4 61 +70 121 +74 149 +79 158 +98 193 +22 53 +66 89 +45 58 +49 80 +56 89 +48 124 +100 166 +76 143 +32 33 +15 59 +16 91 +32 33 +1 21 +73 169 +84 171 +49 69 +52 146 +10 57 +26 112 +54 76 +92 125 +47 49 +53 107 +2 69 +99 186 +67 79 +13 113 +54 73 +1 72 +4 20 +43 112 +0 89 +77 150 +31 61 +24 29 +75 169 +56 143 +88 133 +37 38 +90 160 +97 189 +39 72 +30 38 diff --git a/bottleneck/tests/data/test_583_B b/bottleneck/tests/data/test_583_B new file mode 100644 index 0000000..d021fb3 --- /dev/null +++ b/bottleneck/tests/data/test_583_B @@ -0,0 +1,50 @@ +26 43 +87 160 +74 100 +69 139 +72 87 +22 58 +0 3 +67 133 +52 56 +67 97 +42 117 +30 44 +67 119 +91 164 +45 65 +35 127 +80 91 +75 160 +11 68 +86 92 +24 79 +90 156 +91 94 +64 114 +55 66 +72 80 +36 78 +85 114 +27 69 +40 75 +65 152 +48 106 +72 105 +63 109 +37 108 +48 84 +81 147 +14 91 +46 94 +6 14 +28 100 +41 103 +21 92 +40 111 +42 106 +86 136 +97 113 +24 79 +77 99 +80 89 diff --git a/bottleneck/tests/data/test_584_A b/bottleneck/tests/data/test_584_A new file mode 100644 index 0000000..c934a50 --- /dev/null +++ b/bottleneck/tests/data/test_584_A @@ -0,0 +1,50 @@ +15 100 +30 70 +46 69 +99 128 +25 93 +75 90 +6 31 +47 141 +51 99 +98 133 +50 69 +3 27 +16 91 +36 95 +29 73 +26 76 +24 45 +9 105 +21 103 +46 81 +91 156 +77 141 +36 72 +92 122 +48 98 +34 105 +80 172 +92 136 +16 81 +30 100 +13 111 +1 51 +1 52 +66 140 +81 96 +18 69 +37 123 +82 132 +64 114 +6 26 +46 70 +39 74 +20 108 +70 128 +43 86 +50 71 +73 98 +42 74 +52 79 +42 101 diff --git a/bottleneck/tests/data/test_584_B b/bottleneck/tests/data/test_584_B new file mode 100644 index 0000000..9f07efc --- /dev/null +++ b/bottleneck/tests/data/test_584_B @@ -0,0 +1,50 @@ +99 143 +58 93 +32 121 +23 112 +64 102 +73 110 +76 128 +18 108 +17 97 +82 97 +40 138 +43 92 +18 33 +36 60 +2 27 +67 132 +45 79 +40 78 +90 97 +98 163 +16 86 +74 83 +98 154 +7 74 +3 41 +43 55 +69 123 +54 154 +96 143 +66 98 +26 52 +6 47 +45 84 +17 50 +32 78 +15 25 +46 133 +41 115 +54 144 +19 39 +71 150 +77 133 +42 90 +100 165 +73 113 +63 67 +19 106 +11 18 +11 73 +67 69 diff --git a/bottleneck/tests/data/test_585_A b/bottleneck/tests/data/test_585_A new file mode 100644 index 0000000..903e5b1 --- /dev/null +++ b/bottleneck/tests/data/test_585_A @@ -0,0 +1,50 @@ +50 147 +39 41 +59 153 +79 105 +90 122 +21 31 +34 51 +27 64 +77 125 +46 115 +92 164 +81 167 +91 182 +15 87 +39 115 +43 113 +29 115 +9 60 +81 95 +45 89 +36 101 +29 41 +68 132 +40 110 +33 92 +2 3 +27 113 +90 152 +35 109 +48 90 +63 160 +46 102 +61 146 +48 68 +23 98 +53 91 +80 101 +50 55 +78 163 +89 126 +62 145 +64 129 +18 31 +27 110 +58 91 +6 20 +84 103 +54 120 +87 162 +97 144 diff --git a/bottleneck/tests/data/test_585_B b/bottleneck/tests/data/test_585_B new file mode 100644 index 0000000..69f116a --- /dev/null +++ b/bottleneck/tests/data/test_585_B @@ -0,0 +1,50 @@ +41 56 +85 176 +84 155 +25 40 +33 60 +84 92 +66 123 +63 66 +24 60 +4 51 +74 84 +13 70 +4 15 +86 102 +29 120 +62 70 +29 94 +11 20 +71 162 +87 165 +24 118 +65 93 +28 97 +54 151 +42 126 +55 86 +50 150 +5 35 +80 103 +94 158 +85 147 +73 95 +26 96 +67 151 +38 102 +42 72 +8 36 +78 165 +15 16 +35 67 +0 64 +35 70 +15 69 +75 96 +17 44 +42 66 +41 68 +80 88 +35 128 +34 113 diff --git a/bottleneck/tests/data/test_586_A b/bottleneck/tests/data/test_586_A new file mode 100644 index 0000000..ed8b673 --- /dev/null +++ b/bottleneck/tests/data/test_586_A @@ -0,0 +1,50 @@ +62 74 +15 108 +49 131 +94 134 +5 6 +24 120 +35 79 +48 73 +84 170 +67 86 +30 98 +6 12 +60 107 +8 106 +6 57 +69 74 +24 120 +20 52 +78 147 +24 124 +76 87 +7 46 +20 115 +68 98 +51 87 +87 147 +83 93 +15 108 +70 103 +63 65 +70 90 +52 112 +54 107 +86 114 +58 137 +93 148 +43 120 +3 55 +20 97 +14 25 +59 111 +68 119 +78 165 +16 50 +3 5 +89 173 +84 181 +93 184 +89 185 +23 61 diff --git a/bottleneck/tests/data/test_586_B b/bottleneck/tests/data/test_586_B new file mode 100644 index 0000000..715be5e --- /dev/null +++ b/bottleneck/tests/data/test_586_B @@ -0,0 +1,50 @@ +5 85 +46 116 +51 79 +20 36 +51 96 +83 170 +40 116 +40 128 +55 92 +51 127 +45 111 +56 65 +16 56 +30 52 +38 84 +56 70 +48 88 +0 6 +99 148 +64 159 +30 101 +14 51 +49 116 +66 71 +9 78 +4 35 +84 128 +39 58 +85 96 +54 60 +14 89 +2 46 +40 120 +76 117 +14 80 +47 118 +86 175 +35 126 +77 112 +75 150 +14 52 +90 169 +25 32 +73 95 +92 157 +5 34 +62 131 +16 26 +5 103 +73 106 diff --git a/bottleneck/tests/data/test_587_A b/bottleneck/tests/data/test_587_A new file mode 100644 index 0000000..883ddd7 --- /dev/null +++ b/bottleneck/tests/data/test_587_A @@ -0,0 +1,50 @@ +66 164 +74 81 +56 140 +77 143 +72 139 +77 113 +59 106 +37 42 +58 158 +46 52 +7 30 +73 107 +46 70 +35 120 +74 103 +71 117 +26 93 +11 68 +35 60 +91 151 +33 122 +30 106 +43 134 +90 131 +32 95 +8 72 +4 39 +17 115 +22 32 +28 100 +37 126 +84 152 +72 107 +68 157 +95 193 +93 191 +56 154 +39 42 +5 45 +62 121 +73 166 +14 51 +89 140 +76 166 +85 150 +18 112 +22 103 +65 147 +96 181 +55 123 diff --git a/bottleneck/tests/data/test_587_B b/bottleneck/tests/data/test_587_B new file mode 100644 index 0000000..589512c --- /dev/null +++ b/bottleneck/tests/data/test_587_B @@ -0,0 +1,50 @@ +4 57 +12 64 +65 153 +73 111 +37 134 +11 54 +78 176 +33 77 +31 131 +14 101 +25 107 +83 112 +17 92 +59 139 +4 104 +82 114 +18 64 +13 72 +1 96 +72 112 +19 90 +23 34 +46 63 +45 79 +88 89 +16 105 +100 191 +31 46 +45 133 +86 119 +17 18 +59 140 +49 97 +31 47 +98 154 +70 99 +61 75 +31 34 +4 19 +46 122 +55 57 +81 171 +25 61 +18 89 +0 11 +48 79 +94 128 +73 122 +17 56 +19 39 diff --git a/bottleneck/tests/data/test_588_A b/bottleneck/tests/data/test_588_A new file mode 100644 index 0000000..c486b96 --- /dev/null +++ b/bottleneck/tests/data/test_588_A @@ -0,0 +1,50 @@ +96 166 +5 58 +87 143 +50 104 +31 106 +80 106 +99 106 +46 52 +42 127 +10 86 +17 18 +20 94 +49 65 +10 75 +85 132 +13 54 +75 123 +8 13 +83 153 +25 47 +57 135 +14 57 +1 37 +29 34 +13 26 +52 94 +62 97 +93 153 +69 84 +87 88 +73 100 +54 97 +11 72 +51 143 +66 94 +85 178 +60 73 +36 126 +99 134 +23 68 +72 134 +81 138 +28 42 +65 84 +11 28 +15 38 +18 51 +79 149 +76 114 +33 53 diff --git a/bottleneck/tests/data/test_588_B b/bottleneck/tests/data/test_588_B new file mode 100644 index 0000000..13829bc --- /dev/null +++ b/bottleneck/tests/data/test_588_B @@ -0,0 +1,50 @@ +87 173 +41 85 +10 87 +43 78 +99 128 +35 64 +28 66 +9 67 +100 194 +22 89 +0 15 +77 90 +59 60 +92 93 +32 84 +62 112 +54 151 +46 47 +52 94 +17 113 +21 100 +5 48 +87 114 +71 112 +2 67 +65 120 +26 74 +69 132 +47 83 +14 20 +5 13 +56 137 +57 79 +76 132 +30 31 +89 145 +84 130 +78 158 +44 76 +70 125 +95 127 +6 53 +17 110 +93 158 +61 94 +32 111 +20 113 +26 105 +63 112 +36 37 diff --git a/bottleneck/tests/data/test_589_A b/bottleneck/tests/data/test_589_A new file mode 100644 index 0000000..7743778 --- /dev/null +++ b/bottleneck/tests/data/test_589_A @@ -0,0 +1,50 @@ +71 126 +62 78 +69 164 +34 56 +82 167 +61 138 +63 94 +17 27 +81 135 +94 145 +24 39 +93 134 +99 152 +38 91 +27 100 +21 115 +69 120 +8 42 +93 122 +87 155 +18 104 +0 2 +41 104 +63 159 +93 139 +74 167 +3 94 +68 92 +30 44 +24 101 +8 104 +8 61 +59 111 +53 91 +43 68 +52 143 +11 48 +74 152 +20 115 +27 100 +65 81 +63 67 +84 85 +16 30 +71 80 +58 116 +95 188 +96 106 +7 94 +38 45 diff --git a/bottleneck/tests/data/test_589_B b/bottleneck/tests/data/test_589_B new file mode 100644 index 0000000..bbd5038 --- /dev/null +++ b/bottleneck/tests/data/test_589_B @@ -0,0 +1,50 @@ +28 114 +87 171 +0 35 +94 100 +98 147 +53 68 +64 95 +54 145 +45 76 +22 98 +83 155 +31 89 +27 79 +32 37 +28 58 +77 139 +87 143 +80 152 +25 28 +61 123 +0 4 +25 42 +64 159 +34 37 +84 153 +13 93 +25 69 +80 112 +89 163 +18 77 +35 119 +35 114 +39 60 +90 187 +0 33 +11 80 +52 140 +59 73 +92 168 +76 91 +49 88 +80 130 +37 104 +65 146 +14 56 +66 95 +87 182 +12 102 +78 135 +73 143 diff --git a/bottleneck/tests/data/test_590_A b/bottleneck/tests/data/test_590_A new file mode 100644 index 0000000..3dfb2df --- /dev/null +++ b/bottleneck/tests/data/test_590_A @@ -0,0 +1,50 @@ +31 67 +88 180 +59 105 +31 117 +19 50 +43 59 +9 60 +4 58 +80 144 +47 71 +63 139 +14 68 +38 136 +8 52 +35 81 +56 116 +81 168 +56 99 +95 142 +24 121 +29 100 +88 174 +47 95 +40 93 +7 25 +3 84 +48 94 +90 128 +59 137 +96 164 +95 115 +69 105 +81 139 +59 65 +66 71 +53 84 +20 59 +29 61 +77 150 +48 138 +41 125 +53 86 +5 86 +42 69 +17 54 +70 105 +69 148 +18 58 +72 100 +67 77 diff --git a/bottleneck/tests/data/test_590_B b/bottleneck/tests/data/test_590_B new file mode 100644 index 0000000..18d6a7f --- /dev/null +++ b/bottleneck/tests/data/test_590_B @@ -0,0 +1,50 @@ +79 84 +10 56 +10 18 +78 175 +50 74 +8 104 +77 116 +5 45 +48 116 +17 92 +72 159 +66 113 +51 140 +60 101 +76 120 +52 75 +3 71 +31 53 +75 156 +93 172 +4 93 +11 42 +89 167 +19 49 +62 119 +55 97 +39 68 +74 140 +64 97 +97 154 +30 98 +16 59 +18 68 +66 139 +9 44 +56 74 +61 82 +51 115 +45 51 +89 121 +71 134 +82 119 +13 113 +36 43 +21 121 +24 115 +37 65 +99 100 +36 135 +37 96 diff --git a/bottleneck/tests/data/test_591_A b/bottleneck/tests/data/test_591_A new file mode 100644 index 0000000..411c1bb --- /dev/null +++ b/bottleneck/tests/data/test_591_A @@ -0,0 +1,50 @@ +13 93 +48 89 +12 53 +4 87 +91 181 +15 16 +29 59 +38 57 +8 29 +73 165 +29 44 +45 67 +24 74 +50 91 +88 162 +30 105 +80 134 +58 61 +69 135 +31 107 +0 15 +17 115 +72 74 +45 50 +75 115 +76 97 +61 89 +45 112 +59 97 +32 50 +85 88 +35 124 +95 112 +76 147 +69 84 +12 47 +100 154 +92 163 +4 55 +23 76 +85 100 +96 170 +28 87 +17 116 +44 57 +22 118 +51 134 +32 91 +8 14 +25 80 diff --git a/bottleneck/tests/data/test_591_B b/bottleneck/tests/data/test_591_B new file mode 100644 index 0000000..cc96d2f --- /dev/null +++ b/bottleneck/tests/data/test_591_B @@ -0,0 +1,50 @@ +85 150 +85 96 +57 94 +13 112 +48 89 +7 17 +47 136 +96 173 +100 144 +12 76 +75 90 +51 116 +33 72 +21 65 +41 66 +80 104 +4 53 +71 72 +52 77 +93 94 +20 76 +29 101 +47 104 +33 87 +47 48 +73 161 +32 37 +4 74 +30 57 +56 109 +95 138 +76 135 +70 160 +59 136 +29 105 +75 169 +100 154 +67 139 +28 104 +89 121 +1 18 +7 47 +100 134 +3 4 +29 85 +79 129 +48 89 +97 191 +60 153 +100 199 diff --git a/bottleneck/tests/data/test_592_A b/bottleneck/tests/data/test_592_A new file mode 100644 index 0000000..bac0698 --- /dev/null +++ b/bottleneck/tests/data/test_592_A @@ -0,0 +1,50 @@ +59 132 +83 149 +50 62 +45 103 +28 32 +74 163 +78 151 +19 85 +26 113 +42 136 +87 123 +49 108 +7 69 +45 84 +96 153 +50 112 +3 72 +91 136 +16 79 +56 105 +92 170 +92 177 +15 57 +13 104 +90 112 +16 87 +99 154 +91 174 +49 76 +39 137 +38 59 +25 33 +88 113 +85 136 +38 67 +44 73 +75 166 +60 131 +56 155 +86 105 +69 75 +54 108 +8 79 +68 103 +56 133 +29 91 +57 77 +42 109 +97 170 +89 92 diff --git a/bottleneck/tests/data/test_592_B b/bottleneck/tests/data/test_592_B new file mode 100644 index 0000000..bc8a8c6 --- /dev/null +++ b/bottleneck/tests/data/test_592_B @@ -0,0 +1,50 @@ +73 140 +34 69 +82 101 +44 70 +26 87 +76 151 +18 43 +14 83 +35 126 +31 86 +59 125 +89 160 +33 38 +38 79 +54 77 +51 91 +75 87 +4 94 +2 23 +75 152 +1 8 +65 100 +60 80 +62 96 +40 116 +0 66 +10 99 +21 48 +98 161 +0 35 +18 25 +61 68 +58 152 +97 161 +43 99 +25 35 +55 59 +78 151 +6 94 +17 60 +98 142 +81 119 +2 29 +0 95 +55 141 +29 99 +14 44 +32 68 +31 107 +26 74 diff --git a/bottleneck/tests/data/test_593_A b/bottleneck/tests/data/test_593_A new file mode 100644 index 0000000..e62ec21 --- /dev/null +++ b/bottleneck/tests/data/test_593_A @@ -0,0 +1,50 @@ +15 96 +50 89 +53 59 +42 45 +76 150 +24 110 +27 126 +26 79 +93 132 +65 100 +38 134 +14 68 +88 130 +92 120 +36 122 +24 77 +11 102 +56 91 +12 77 +89 131 +57 137 +86 173 +38 66 +7 27 +49 134 +38 81 +100 122 +85 98 +96 147 +25 80 +49 88 +32 127 +42 122 +3 11 +25 59 +11 31 +82 151 +97 187 +55 99 +11 71 +14 28 +80 105 +4 74 +89 113 +99 127 +40 75 +86 121 +44 52 +74 123 +51 105 diff --git a/bottleneck/tests/data/test_593_B b/bottleneck/tests/data/test_593_B new file mode 100644 index 0000000..a5150da --- /dev/null +++ b/bottleneck/tests/data/test_593_B @@ -0,0 +1,50 @@ +70 127 +81 175 +6 42 +67 74 +18 95 +32 33 +98 188 +25 67 +99 170 +60 119 +35 79 +20 42 +28 64 +92 129 +26 110 +95 123 +37 130 +25 97 +44 136 +30 78 +42 72 +52 139 +80 177 +44 143 +79 122 +100 198 +74 90 +15 73 +48 63 +66 146 +77 168 +28 66 +72 103 +23 77 +84 133 +37 127 +70 139 +85 129 +13 32 +57 151 +26 83 +7 45 +14 16 +23 70 +94 117 +71 148 +9 89 +20 109 +64 85 +27 106 diff --git a/bottleneck/tests/data/test_594_A b/bottleneck/tests/data/test_594_A new file mode 100644 index 0000000..ca81d4c --- /dev/null +++ b/bottleneck/tests/data/test_594_A @@ -0,0 +1,50 @@ +49 127 +45 58 +50 143 +52 55 +32 102 +79 154 +36 134 +61 161 +41 134 +31 71 +51 86 +88 135 +68 93 +30 68 +8 80 +3 68 +36 101 +15 73 +51 132 +95 180 +27 43 +28 56 +58 73 +32 108 +85 179 +11 17 +65 159 +6 40 +27 53 +72 151 +66 114 +17 56 +84 95 +35 80 +85 110 +97 167 +74 84 +96 134 +76 117 +61 99 +20 91 +89 114 +1 32 +0 29 +71 138 +53 123 +78 96 +57 138 +7 89 +92 105 diff --git a/bottleneck/tests/data/test_594_B b/bottleneck/tests/data/test_594_B new file mode 100644 index 0000000..d366e85 --- /dev/null +++ b/bottleneck/tests/data/test_594_B @@ -0,0 +1,50 @@ +46 86 +23 69 +40 50 +66 89 +63 123 +23 108 +61 79 +59 144 +60 156 +49 88 +60 92 +65 101 +56 64 +3 53 +84 141 +39 79 +36 101 +8 82 +61 138 +29 78 +14 108 +29 122 +93 124 +53 95 +70 89 +10 102 +10 104 +23 27 +6 53 +8 41 +86 164 +8 41 +51 120 +27 63 +33 60 +62 99 +56 119 +58 84 +39 118 +25 86 +6 67 +50 56 +91 173 +71 121 +28 51 +88 142 +90 186 +69 149 +87 102 +60 129 diff --git a/bottleneck/tests/data/test_595_A b/bottleneck/tests/data/test_595_A new file mode 100644 index 0000000..805de28 --- /dev/null +++ b/bottleneck/tests/data/test_595_A @@ -0,0 +1,50 @@ +39 91 +72 162 +80 123 +46 113 +51 65 +80 149 +72 132 +27 124 +17 111 +17 71 +86 120 +82 102 +71 117 +33 86 +15 84 +76 146 +69 102 +97 153 +91 185 +5 53 +61 95 +85 107 +92 101 +80 113 +12 63 +62 111 +29 109 +33 77 +91 134 +49 138 +30 57 +70 106 +98 110 +87 168 +76 140 +20 109 +58 71 +56 99 +49 117 +60 118 +63 149 +9 92 +14 94 +12 52 +21 37 +37 91 +65 107 +98 101 +71 131 +54 108 diff --git a/bottleneck/tests/data/test_595_B b/bottleneck/tests/data/test_595_B new file mode 100644 index 0000000..c458a54 --- /dev/null +++ b/bottleneck/tests/data/test_595_B @@ -0,0 +1,50 @@ +92 101 +74 76 +47 115 +99 119 +19 44 +57 156 +21 59 +12 86 +92 168 +73 148 +92 164 +47 130 +32 96 +22 116 +58 99 +85 169 +66 147 +31 117 +17 107 +83 158 +10 54 +95 129 +88 158 +72 78 +98 125 +99 170 +22 79 +10 16 +2 31 +52 62 +16 40 +31 103 +38 100 +32 82 +71 133 +55 135 +74 158 +13 45 +6 12 +13 43 +44 57 +25 51 +88 112 +35 66 +31 83 +28 59 +44 103 +40 131 +100 124 +21 107 diff --git a/bottleneck/tests/data/test_596_A b/bottleneck/tests/data/test_596_A new file mode 100644 index 0000000..3a32cf7 --- /dev/null +++ b/bottleneck/tests/data/test_596_A @@ -0,0 +1,50 @@ +95 140 +26 108 +52 84 +39 95 +18 48 +29 105 +64 114 +75 103 +59 80 +11 95 +41 52 +43 123 +51 77 +31 54 +64 130 +23 79 +82 102 +53 94 +13 14 +19 74 +74 109 +71 140 +93 94 +76 82 +43 48 +46 70 +53 121 +35 68 +30 32 +13 53 +28 60 +51 111 +64 142 +84 153 +15 79 +89 140 +39 136 +15 37 +35 115 +15 105 +16 62 +3 77 +93 107 +88 104 +56 113 +59 142 +11 52 +22 64 +66 138 +32 75 diff --git a/bottleneck/tests/data/test_596_B b/bottleneck/tests/data/test_596_B new file mode 100644 index 0000000..1b9c765 --- /dev/null +++ b/bottleneck/tests/data/test_596_B @@ -0,0 +1,50 @@ +73 154 +65 99 +56 77 +56 70 +67 75 +4 26 +31 64 +89 106 +73 91 +31 43 +98 185 +50 138 +79 131 +47 73 +16 55 +35 98 +24 100 +67 72 +44 95 +66 101 +40 91 +53 90 +6 67 +57 67 +15 111 +2 43 +3 18 +35 116 +44 138 +46 85 +31 41 +16 17 +61 96 +90 100 +45 129 +97 172 +38 70 +47 136 +26 56 +0 95 +100 155 +48 110 +4 60 +16 29 +74 103 +63 113 +93 98 +73 94 +15 86 +40 86 diff --git a/bottleneck/tests/data/test_597_A b/bottleneck/tests/data/test_597_A new file mode 100644 index 0000000..984cc9f --- /dev/null +++ b/bottleneck/tests/data/test_597_A @@ -0,0 +1,50 @@ +75 141 +50 130 +82 143 +98 128 +15 107 +9 22 +27 64 +2 51 +14 42 +15 27 +39 110 +50 95 +62 91 +80 85 +89 92 +56 78 +94 114 +68 130 +80 93 +12 25 +86 88 +33 73 +38 79 +28 100 +65 139 +22 59 +70 169 +45 118 +77 87 +46 49 +87 122 +50 109 +6 101 +8 21 +0 32 +16 81 +89 167 +83 85 +91 185 +85 120 +87 128 +20 58 +76 112 +13 60 +8 15 +93 172 +12 92 +51 132 +92 140 +83 167 diff --git a/bottleneck/tests/data/test_597_B b/bottleneck/tests/data/test_597_B new file mode 100644 index 0000000..d84920c --- /dev/null +++ b/bottleneck/tests/data/test_597_B @@ -0,0 +1,50 @@ +89 118 +56 104 +78 101 +56 103 +13 94 +98 186 +99 137 +58 90 +61 154 +0 12 +7 23 +77 158 +66 157 +70 91 +10 38 +14 23 +21 92 +89 189 +84 105 +79 130 +17 27 +93 102 +62 82 +60 84 +18 28 +49 143 +70 157 +54 119 +32 124 +17 89 +1 49 +4 53 +76 109 +61 113 +71 90 +4 95 +78 125 +21 110 +2 72 +26 106 +35 55 +76 90 +80 127 +80 137 +30 63 +12 81 +48 93 +27 123 +24 57 +56 120 diff --git a/bottleneck/tests/data/test_598_A b/bottleneck/tests/data/test_598_A new file mode 100644 index 0000000..4c4fa46 --- /dev/null +++ b/bottleneck/tests/data/test_598_A @@ -0,0 +1,50 @@ +62 152 +79 161 +64 158 +93 154 +51 99 +69 113 +21 62 +66 156 +48 137 +66 121 +78 165 +56 107 +87 141 +87 159 +42 50 +61 72 +31 61 +26 125 +33 118 +32 88 +98 110 +75 103 +67 130 +94 192 +97 153 +3 4 +48 136 +56 57 +43 53 +29 113 +82 110 +90 103 +54 93 +53 106 +75 143 +32 44 +85 147 +50 72 +22 71 +49 96 +49 132 +32 113 +24 58 +58 142 +60 106 +100 163 +45 123 +27 31 +41 76 +14 40 diff --git a/bottleneck/tests/data/test_598_B b/bottleneck/tests/data/test_598_B new file mode 100644 index 0000000..974d069 --- /dev/null +++ b/bottleneck/tests/data/test_598_B @@ -0,0 +1,50 @@ +8 45 +47 75 +81 128 +60 100 +13 40 +47 96 +97 169 +28 93 +36 92 +80 175 +41 121 +24 55 +94 100 +69 82 +53 97 +64 119 +53 151 +30 51 +11 82 +77 118 +66 113 +54 92 +23 100 +79 82 +44 122 +93 185 +75 169 +98 99 +69 163 +28 100 +66 70 +69 98 +80 99 +23 79 +100 134 +67 126 +57 138 +79 116 +25 44 +48 142 +26 123 +14 51 +93 151 +68 71 +6 27 +4 64 +63 128 +88 166 +59 70 +19 80 diff --git a/bottleneck/tests/data/test_599_A b/bottleneck/tests/data/test_599_A new file mode 100644 index 0000000..984a0ed --- /dev/null +++ b/bottleneck/tests/data/test_599_A @@ -0,0 +1,50 @@ +6 64 +55 70 +74 171 +88 144 +91 170 +61 75 +1 42 +69 72 +99 112 +100 113 +97 165 +78 83 +12 90 +19 103 +91 134 +78 121 +31 75 +57 139 +2 15 +84 129 +73 139 +24 71 +56 135 +17 117 +26 66 +46 110 +21 97 +24 111 +100 177 +59 132 +13 14 +12 73 +4 51 +49 89 +27 82 +23 107 +84 112 +8 52 +96 172 +97 133 +40 80 +21 32 +65 149 +61 125 +92 133 +89 119 +28 37 +46 106 +95 190 +78 91 diff --git a/bottleneck/tests/data/test_599_B b/bottleneck/tests/data/test_599_B new file mode 100644 index 0000000..aaea2a7 --- /dev/null +++ b/bottleneck/tests/data/test_599_B @@ -0,0 +1,50 @@ +83 144 +54 114 +6 83 +53 109 +60 159 +33 90 +72 83 +3 5 +72 170 +60 116 +75 172 +19 107 +11 36 +36 109 +25 59 +22 100 +30 127 +57 119 +28 87 +81 144 +10 53 +2 27 +71 117 +60 84 +95 99 +77 81 +56 67 +67 85 +32 42 +28 45 +81 148 +6 33 +60 146 +83 86 +30 48 +89 105 +26 53 +65 89 +41 94 +47 84 +88 130 +51 95 +65 74 +98 107 +99 180 +80 107 +89 94 +25 36 +83 106 +24 112 diff --git a/bottleneck/tests/data/test_600_A b/bottleneck/tests/data/test_600_A new file mode 100644 index 0000000..13c5659 --- /dev/null +++ b/bottleneck/tests/data/test_600_A @@ -0,0 +1,100 @@ +77 125 +40 107 +52 73 +65 77 +96 158 +26 106 +61 138 +1 10 +56 151 +91 161 +1 20 +100 172 +69 152 +26 57 +33 96 +21 98 +2 24 +54 115 +35 116 +17 31 +21 50 +36 93 +61 74 +98 122 +96 151 +90 168 +49 69 +23 24 +2 67 +28 123 +95 181 +60 81 +33 96 +25 103 +44 114 +84 128 +1 45 +90 154 +34 83 +57 149 +49 109 +57 121 +47 74 +57 77 +37 132 +44 48 +61 98 +37 60 +66 84 +71 73 +30 121 +50 150 +44 99 +86 179 +99 137 +53 125 +85 136 +56 126 +99 163 +43 132 +1 66 +90 132 +27 40 +2 10 +65 115 +39 68 +17 89 +90 153 +22 102 +28 78 +56 101 +89 184 +88 125 +83 85 +75 144 +26 89 +56 108 +83 173 +90 106 +7 72 +97 173 +94 131 +31 104 +95 148 +100 102 +37 82 +86 128 +29 56 +54 109 +81 157 +82 126 +62 71 +33 116 +86 126 +20 103 +34 131 +93 107 +26 104 +31 91 +23 115 diff --git a/bottleneck/tests/data/test_600_B b/bottleneck/tests/data/test_600_B new file mode 100644 index 0000000..5de1dfa --- /dev/null +++ b/bottleneck/tests/data/test_600_B @@ -0,0 +1,100 @@ +99 168 +39 113 +73 109 +91 101 +67 144 +17 57 +3 59 +81 155 +100 159 +48 110 +98 128 +73 167 +55 135 +42 140 +84 129 +18 97 +92 103 +33 86 +68 84 +83 111 +72 111 +97 179 +8 58 +6 80 +21 99 +81 124 +37 85 +19 48 +11 14 +53 122 +16 74 +75 113 +47 74 +87 166 +45 69 +51 68 +74 122 +10 47 +50 90 +66 114 +24 115 +40 65 +74 136 +72 146 +24 114 +48 91 +56 68 +78 102 +30 64 +75 159 +16 101 +58 150 +69 126 +80 136 +6 96 +53 121 +15 115 +76 81 +36 59 +63 68 +85 142 +7 50 +20 83 +9 40 +98 163 +70 165 +88 177 +85 149 +0 17 +30 124 +40 113 +35 91 +66 117 +94 108 +11 106 +78 88 +42 107 +60 121 +55 119 +78 110 +0 76 +63 130 +10 105 +23 68 +13 81 +60 142 +3 81 +53 90 +26 99 +95 165 +52 126 +41 70 +6 29 +14 103 +88 170 +79 102 +9 98 +27 124 +12 60 +59 145 diff --git a/bottleneck/tests/data/test_601_A b/bottleneck/tests/data/test_601_A new file mode 100644 index 0000000..9f57dd0 --- /dev/null +++ b/bottleneck/tests/data/test_601_A @@ -0,0 +1,100 @@ +49 135 +27 47 +45 83 +13 49 +15 80 +78 84 +54 128 +20 24 +75 121 +52 90 +15 64 +19 101 +35 80 +35 69 +49 122 +21 49 +51 75 +41 95 +91 162 +26 101 +54 104 +65 164 +74 100 +6 51 +58 68 +99 148 +55 87 +35 51 +51 77 +22 117 +78 141 +80 135 +66 145 +80 145 +68 112 +35 97 +63 91 +10 62 +1 73 +40 106 +76 77 +8 93 +94 136 +57 157 +16 43 +46 92 +49 77 +44 49 +51 120 +68 133 +41 73 +72 109 +42 59 +11 13 +19 86 +24 49 +11 105 +93 113 +81 160 +5 99 +78 159 +37 97 +68 120 +54 111 +41 49 +33 123 +27 35 +71 101 +55 70 +99 183 +68 121 +62 92 +47 53 +4 6 +56 110 +96 113 +85 122 +85 92 +31 97 +1 62 +25 67 +30 39 +16 23 +97 148 +21 22 +21 46 +85 134 +19 23 +12 56 +16 40 +59 138 +9 63 +31 46 +88 161 +72 74 +28 45 +57 95 +90 164 +89 106 +49 134 diff --git a/bottleneck/tests/data/test_601_B b/bottleneck/tests/data/test_601_B new file mode 100644 index 0000000..64d7ef8 --- /dev/null +++ b/bottleneck/tests/data/test_601_B @@ -0,0 +1,100 @@ +45 101 +84 90 +70 98 +64 109 +100 111 +82 87 +26 54 +18 90 +84 133 +92 145 +68 139 +90 154 +85 104 +34 76 +30 79 +21 99 +2 85 +20 75 +12 57 +62 102 +69 148 +18 116 +28 97 +52 88 +40 68 +21 26 +66 73 +8 68 +31 130 +83 174 +89 156 +38 43 +62 153 +4 34 +85 123 +51 99 +39 119 +99 149 +19 81 +51 79 +51 136 +25 52 +63 80 +91 166 +62 126 +86 102 +16 39 +0 66 +26 107 +55 89 +72 100 +73 106 +82 129 +77 112 +44 81 +94 118 +57 136 +1 13 +43 52 +24 112 +39 129 +28 97 +41 105 +59 150 +21 84 +38 92 +39 91 +25 36 +52 125 +56 119 +99 171 +51 142 +6 34 +44 77 +100 170 +23 43 +76 138 +67 77 +26 116 +18 49 +25 92 +42 138 +22 41 +48 112 +81 89 +51 67 +64 90 +51 94 +75 147 +49 96 +47 102 +31 114 +7 92 +48 81 +40 41 +84 117 +34 118 +9 27 +86 145 +56 69 diff --git a/bottleneck/tests/data/test_602_A b/bottleneck/tests/data/test_602_A new file mode 100644 index 0000000..df83de7 --- /dev/null +++ b/bottleneck/tests/data/test_602_A @@ -0,0 +1,100 @@ +8 77 +68 127 +23 104 +15 96 +58 68 +5 77 +70 105 +13 49 +60 133 +31 122 +74 75 +80 132 +72 107 +44 52 +31 124 +32 36 +62 146 +51 98 +31 118 +45 107 +53 85 +76 152 +67 161 +51 92 +10 23 +89 183 +73 117 +47 112 +42 97 +68 101 +82 86 +32 61 +39 134 +9 109 +31 83 +95 137 +82 155 +34 39 +5 6 +24 108 +94 150 +22 68 +95 172 +12 92 +59 107 +31 59 +0 40 +53 64 +32 73 +69 134 +21 63 +13 107 +10 82 +3 94 +85 147 +51 127 +91 169 +17 87 +80 137 +90 178 +89 185 +56 103 +13 18 +83 84 +34 77 +50 148 +1 10 +80 141 +92 191 +9 21 +85 172 +11 50 +98 134 +12 99 +81 137 +66 90 +32 109 +22 73 +39 130 +38 52 +24 68 +71 113 +84 90 +79 102 +92 192 +47 105 +70 132 +4 45 +57 123 +60 125 +48 56 +19 110 +40 130 +36 114 +55 92 +1 66 +77 131 +96 172 +34 85 +79 102 diff --git a/bottleneck/tests/data/test_602_B b/bottleneck/tests/data/test_602_B new file mode 100644 index 0000000..fb19e1c --- /dev/null +++ b/bottleneck/tests/data/test_602_B @@ -0,0 +1,100 @@ +4 97 +46 76 +86 104 +38 75 +73 124 +7 52 +42 105 +72 132 +14 114 +38 136 +77 91 +72 92 +36 64 +53 121 +57 62 +20 49 +55 78 +82 151 +9 95 +6 20 +10 51 +50 110 +38 100 +69 150 +80 102 +78 93 +94 157 +7 55 +39 121 +80 136 +24 49 +33 95 +99 150 +55 119 +97 188 +73 82 +26 42 +84 92 +5 103 +88 167 +7 54 +35 74 +68 141 +31 56 +98 182 +38 116 +0 63 +29 39 +19 62 +41 91 +50 81 +37 106 +22 65 +19 113 +55 125 +59 79 +29 75 +6 48 +12 101 +37 102 +48 126 +34 71 +63 90 +87 139 +97 147 +86 143 +22 69 +7 17 +9 93 +82 109 +12 55 +88 126 +97 102 +6 70 +6 21 +39 105 +4 103 +46 139 +38 111 +44 45 +17 31 +79 150 +83 96 +97 101 +66 152 +15 84 +82 99 +2 102 +62 123 +8 101 +32 92 +76 158 +20 26 +20 106 +17 75 +70 89 +13 22 +57 87 +6 27 +16 25 diff --git a/bottleneck/tests/data/test_603_A b/bottleneck/tests/data/test_603_A new file mode 100644 index 0000000..a81f6cb --- /dev/null +++ b/bottleneck/tests/data/test_603_A @@ -0,0 +1,100 @@ +59 86 +86 166 +73 114 +3 10 +36 59 +0 33 +24 25 +51 70 +83 129 +7 60 +47 58 +20 97 +30 96 +61 161 +83 143 +83 127 +100 188 +6 28 +18 44 +53 54 +58 94 +53 97 +36 86 +83 133 +37 83 +79 125 +19 104 +67 156 +6 99 +44 128 +37 64 +35 92 +36 126 +55 155 +16 48 +37 108 +72 119 +96 111 +10 83 +96 143 +31 65 +41 138 +94 148 +41 74 +6 92 +53 133 +98 113 +2 71 +15 52 +28 54 +46 58 +81 109 +24 85 +60 159 +61 68 +46 96 +45 138 +99 117 +82 145 +69 121 +15 53 +74 174 +51 114 +100 145 +26 82 +32 115 +72 169 +48 144 +75 172 +65 114 +49 74 +45 119 +31 122 +59 146 +62 67 +43 46 +6 69 +23 25 +76 176 +68 164 +36 113 +26 106 +46 134 +71 151 +59 121 +10 99 +71 167 +82 162 +62 79 +97 127 +68 115 +46 90 +83 156 +12 39 +61 87 +90 187 +0 84 +44 85 +41 93 +98 187 diff --git a/bottleneck/tests/data/test_603_B b/bottleneck/tests/data/test_603_B new file mode 100644 index 0000000..0ea6eda --- /dev/null +++ b/bottleneck/tests/data/test_603_B @@ -0,0 +1,100 @@ +67 101 +34 55 +8 100 +52 112 +78 120 +15 71 +17 58 +83 109 +41 137 +41 107 +26 125 +87 111 +82 141 +77 78 +24 50 +49 78 +79 88 +91 110 +75 78 +84 91 +100 199 +34 70 +66 154 +23 34 +46 73 +43 94 +23 65 +89 175 +44 46 +13 24 +8 95 +94 162 +13 27 +74 102 +80 156 +77 124 +44 100 +13 52 +32 43 +23 38 +87 162 +24 52 +67 103 +97 146 +79 94 +21 100 +97 186 +38 39 +67 123 +99 197 +29 46 +52 139 +1 80 +5 34 +67 86 +49 122 +45 50 +64 80 +73 154 +85 164 +23 42 +93 123 +54 123 +63 64 +84 162 +86 103 +47 117 +32 112 +60 152 +96 111 +79 97 +86 130 +0 98 +65 161 +55 83 +73 139 +82 133 +9 108 +24 123 +92 132 +87 91 +23 40 +55 116 +91 176 +49 100 +25 58 +4 65 +28 39 +3 74 +22 37 +34 128 +98 154 +32 122 +9 84 +53 79 +47 61 +76 82 +11 34 +65 128 +28 82 diff --git a/bottleneck/tests/data/test_604_A b/bottleneck/tests/data/test_604_A new file mode 100644 index 0000000..11a7c84 --- /dev/null +++ b/bottleneck/tests/data/test_604_A @@ -0,0 +1,100 @@ +90 168 +97 169 +3 20 +65 71 +61 105 +6 56 +50 122 +9 12 +15 51 +73 121 +54 118 +27 121 +97 135 +38 100 +35 69 +40 57 +64 159 +37 125 +79 116 +11 54 +66 72 +76 162 +69 154 +35 77 +91 177 +77 111 +67 145 +59 100 +94 130 +75 135 +53 106 +43 106 +100 130 +81 159 +14 107 +52 91 +47 136 +83 133 +16 63 +11 98 +4 6 +98 120 +98 117 +69 90 +24 108 +74 138 +100 105 +9 16 +55 81 +86 154 +6 99 +82 85 +86 176 +57 79 +83 136 +70 135 +30 85 +73 126 +73 164 +20 89 +42 93 +97 150 +6 69 +26 66 +43 129 +84 117 +75 132 +68 98 +29 111 +57 140 +15 107 +75 141 +97 180 +47 130 +31 72 +56 150 +30 75 +86 106 +49 50 +16 38 +40 68 +99 176 +10 56 +89 128 +97 124 +35 134 +82 137 +34 97 +34 40 +34 43 +71 149 +33 113 +6 80 +69 160 +54 148 +88 131 +98 141 +91 112 +25 106 +68 149 diff --git a/bottleneck/tests/data/test_604_B b/bottleneck/tests/data/test_604_B new file mode 100644 index 0000000..6e14339 --- /dev/null +++ b/bottleneck/tests/data/test_604_B @@ -0,0 +1,100 @@ +4 69 +24 43 +68 72 +33 77 +96 106 +48 134 +18 38 +1 28 +12 112 +70 76 +6 16 +19 65 +35 49 +91 95 +50 147 +94 174 +87 124 +27 29 +17 116 +50 120 +83 183 +60 129 +92 120 +67 125 +60 73 +17 60 +10 12 +65 158 +19 100 +44 92 +86 139 +98 184 +67 100 +28 115 +16 94 +36 94 +40 99 +20 115 +94 149 +80 135 +47 109 +39 53 +62 159 +25 78 +30 118 +71 89 +86 166 +85 159 +58 120 +45 64 +73 156 +66 107 +31 88 +53 88 +67 167 +49 144 +60 71 +69 151 +44 111 +43 93 +95 102 +78 150 +98 120 +22 92 +70 76 +1 98 +25 44 +93 166 +16 100 +94 134 +37 99 +4 70 +32 47 +61 136 +30 95 +99 133 +91 163 +32 112 +78 91 +55 62 +16 33 +13 48 +45 75 +96 155 +20 82 +39 57 +22 51 +7 31 +73 90 +49 55 +32 65 +16 22 +33 71 +80 97 +85 154 +100 172 +86 114 +98 191 +2 7 +35 113 diff --git a/bottleneck/tests/data/test_605_A b/bottleneck/tests/data/test_605_A new file mode 100644 index 0000000..522dbf9 --- /dev/null +++ b/bottleneck/tests/data/test_605_A @@ -0,0 +1,100 @@ +59 77 +22 53 +70 99 +32 126 +63 100 +72 89 +93 150 +70 83 +35 53 +96 128 +55 151 +30 96 +6 85 +80 131 +76 80 +36 79 +50 72 +70 134 +20 77 +27 33 +35 37 +44 55 +91 165 +68 132 +52 141 +81 142 +43 106 +46 55 +55 100 +21 86 +100 130 +97 173 +56 142 +26 36 +54 68 +17 23 +57 124 +65 122 +11 30 +70 96 +46 47 +52 114 +65 104 +24 39 +2 102 +91 181 +66 107 +27 120 +24 38 +33 94 +87 166 +35 78 +38 92 +56 125 +15 50 +95 129 +85 174 +53 126 +76 171 +71 154 +67 86 +61 133 +99 183 +92 102 +83 103 +80 174 +63 109 +37 60 +12 78 +30 56 +19 117 +33 99 +3 94 +18 52 +44 133 +53 55 +37 95 +43 92 +64 127 +12 79 +65 129 +48 92 +92 136 +25 64 +83 91 +22 91 +66 96 +33 37 +8 45 +4 5 +21 107 +72 171 +6 14 +75 124 +79 140 +52 114 +61 62 +89 151 +98 102 +4 46 diff --git a/bottleneck/tests/data/test_605_B b/bottleneck/tests/data/test_605_B new file mode 100644 index 0000000..34f19db --- /dev/null +++ b/bottleneck/tests/data/test_605_B @@ -0,0 +1,100 @@ +17 96 +1 57 +57 149 +10 24 +76 155 +3 81 +66 101 +79 85 +17 91 +78 105 +78 155 +91 167 +63 84 +41 45 +12 50 +49 107 +13 31 +93 175 +93 105 +33 46 +70 121 +36 57 +43 103 +44 99 +54 91 +25 65 +26 27 +64 119 +94 161 +29 115 +0 14 +81 152 +15 83 +4 50 +56 132 +27 50 +42 61 +28 39 +2 38 +55 87 +52 91 +70 160 +57 94 +32 41 +52 142 +28 37 +81 92 +89 91 +79 127 +94 179 +45 128 +92 120 +61 124 +61 143 +12 31 +2 36 +42 48 +25 55 +89 184 +56 57 +90 154 +55 94 +70 104 +35 135 +10 39 +45 63 +72 102 +0 12 +45 71 +84 126 +89 146 +52 100 +14 93 +16 42 +89 186 +50 77 +64 75 +29 52 +14 81 +55 73 +69 105 +47 144 +70 102 +59 76 +81 94 +63 163 +19 55 +70 146 +58 118 +56 96 +74 93 +24 30 +100 190 +80 115 +88 172 +0 31 +83 124 +53 153 +68 70 +73 108 diff --git a/bottleneck/tests/data/test_606_A b/bottleneck/tests/data/test_606_A new file mode 100644 index 0000000..2f4dec4 --- /dev/null +++ b/bottleneck/tests/data/test_606_A @@ -0,0 +1,100 @@ +49 104 +89 185 +56 72 +44 117 +27 73 +64 87 +30 44 +89 150 +73 105 +80 156 +48 145 +36 87 +62 122 +85 97 +51 144 +48 137 +61 132 +47 66 +78 134 +17 101 +66 119 +74 82 +96 99 +56 57 +66 109 +13 103 +6 40 +55 78 +77 130 +92 133 +65 74 +8 9 +29 123 +6 61 +41 138 +21 98 +85 107 +99 108 +79 95 +93 161 +9 20 +58 150 +33 93 +2 48 +38 40 +83 153 +33 92 +94 155 +44 96 +17 102 +68 99 +32 69 +73 126 +5 43 +86 181 +2 38 +65 163 +86 164 +49 132 +41 86 +96 186 +87 145 +12 81 +11 73 +77 87 +22 116 +14 21 +56 82 +61 120 +2 24 +67 71 +33 93 +89 132 +14 102 +12 29 +7 38 +12 88 +76 123 +46 75 +79 99 +49 74 +27 35 +8 47 +33 84 +79 171 +72 83 +79 106 +96 152 +86 164 +100 128 +7 97 +70 128 +89 156 +15 17 +86 126 +65 110 +53 80 +51 81 +36 85 +50 82 diff --git a/bottleneck/tests/data/test_606_B b/bottleneck/tests/data/test_606_B new file mode 100644 index 0000000..62417b1 --- /dev/null +++ b/bottleneck/tests/data/test_606_B @@ -0,0 +1,100 @@ +35 135 +1 41 +63 72 +43 98 +37 71 +24 87 +14 105 +66 67 +12 79 +60 145 +20 72 +0 70 +67 149 +22 30 +86 151 +20 106 +38 74 +58 133 +40 103 +34 111 +81 126 +55 74 +49 133 +44 128 +54 86 +15 82 +84 89 +87 121 +95 135 +53 104 +91 157 +7 101 +45 124 +87 162 +73 164 +60 123 +77 81 +69 78 +44 118 +0 79 +66 106 +67 85 +85 168 +93 122 +0 42 +10 66 +9 23 +29 80 +46 76 +75 126 +2 32 +99 143 +24 90 +31 120 +73 98 +42 57 +67 86 +44 99 +65 135 +100 167 +33 43 +10 29 +36 63 +79 178 +82 85 +35 49 +24 57 +66 142 +2 29 +73 149 +16 76 +27 53 +86 88 +36 75 +54 56 +11 82 +87 183 +33 72 +84 94 +96 108 +13 63 +34 98 +76 173 +57 114 +63 149 +74 131 +20 21 +48 100 +92 98 +3 41 +66 138 +90 130 +62 152 +26 101 +28 102 +41 139 +85 167 +68 84 +64 74 +64 136 diff --git a/bottleneck/tests/data/test_607_A b/bottleneck/tests/data/test_607_A new file mode 100644 index 0000000..abc3b6b --- /dev/null +++ b/bottleneck/tests/data/test_607_A @@ -0,0 +1,100 @@ +82 154 +80 107 +94 156 +55 58 +84 183 +82 128 +35 97 +32 105 +12 104 +17 57 +54 67 +59 103 +22 106 +50 122 +31 93 +33 123 +9 105 +78 140 +15 101 +67 117 +34 119 +96 123 +71 169 +91 93 +99 119 +85 169 +59 69 +85 169 +32 76 +62 134 +21 77 +79 141 +5 63 +9 72 +21 41 +2 95 +16 92 +22 54 +44 58 +1 24 +26 54 +33 93 +85 135 +74 110 +63 81 +64 113 +3 21 +24 92 +78 82 +54 63 +66 83 +22 38 +41 59 +99 156 +26 34 +67 78 +9 22 +15 62 +25 43 +0 93 +43 44 +54 63 +16 40 +62 136 +35 85 +80 179 +4 103 +21 73 +91 119 +99 188 +16 42 +63 64 +76 137 +58 61 +20 39 +61 72 +0 9 +7 41 +11 61 +39 124 +70 153 +97 121 +66 166 +7 72 +65 140 +96 140 +60 87 +34 35 +14 15 +17 41 +33 69 +5 101 +49 109 +79 102 +22 57 +50 126 +24 119 +76 166 +84 93 +34 70 diff --git a/bottleneck/tests/data/test_607_B b/bottleneck/tests/data/test_607_B new file mode 100644 index 0000000..0f79931 --- /dev/null +++ b/bottleneck/tests/data/test_607_B @@ -0,0 +1,100 @@ +23 33 +0 85 +33 82 +21 38 +41 75 +94 128 +35 107 +9 76 +65 74 +71 133 +83 173 +94 109 +58 83 +61 68 +44 111 +67 107 +97 152 +100 167 +94 105 +94 95 +9 37 +18 47 +87 141 +81 153 +57 90 +10 19 +67 137 +11 75 +86 139 +39 72 +13 51 +65 155 +56 98 +91 149 +58 68 +6 89 +39 95 +82 150 +97 129 +26 73 +87 112 +37 117 +73 137 +68 73 +4 88 +2 70 +79 112 +59 123 +31 93 +36 77 +95 158 +25 52 +33 47 +69 112 +73 160 +95 138 +15 56 +31 96 +1 2 +9 41 +59 129 +48 55 +52 111 +51 139 +38 115 +100 198 +30 46 +77 105 +43 115 +66 151 +69 70 +93 98 +19 59 +10 59 +10 59 +51 89 +21 58 +48 75 +57 58 +0 34 +48 110 +87 152 +9 44 +19 73 +8 76 +82 165 +4 51 +9 24 +62 105 +97 147 +28 102 +37 77 +25 55 +77 86 +80 87 +81 172 +99 152 +57 107 +61 154 +45 93 diff --git a/bottleneck/tests/data/test_608_A b/bottleneck/tests/data/test_608_A new file mode 100644 index 0000000..a4beccc --- /dev/null +++ b/bottleneck/tests/data/test_608_A @@ -0,0 +1,100 @@ +91 111 +71 96 +84 176 +57 123 +7 22 +4 76 +83 171 +79 172 +96 173 +75 76 +19 98 +91 135 +13 54 +10 13 +2 53 +65 128 +96 133 +54 64 +43 112 +72 139 +32 33 +45 89 +82 174 +36 79 +5 89 +90 114 +41 90 +16 30 +78 177 +64 77 +40 67 +57 129 +29 51 +53 54 +86 90 +64 116 +87 92 +73 76 +35 108 +25 81 +57 155 +55 123 +56 99 +96 103 +88 93 +28 101 +74 106 +76 166 +28 126 +34 41 +75 91 +19 119 +59 108 +29 121 +0 66 +9 25 +68 150 +26 51 +19 47 +34 55 +37 127 +66 80 +23 52 +8 19 +65 128 +44 109 +16 70 +17 114 +29 31 +40 100 +20 42 +61 121 +89 153 +35 104 +5 81 +33 95 +17 29 +93 132 +72 133 +100 102 +54 109 +23 53 +85 87 +64 69 +20 67 +30 34 +96 143 +40 134 +60 86 +40 91 +92 133 +73 141 +70 117 +43 78 +52 83 +27 114 +2 88 +48 121 +40 66 +96 159 diff --git a/bottleneck/tests/data/test_608_B b/bottleneck/tests/data/test_608_B new file mode 100644 index 0000000..94f4c9a --- /dev/null +++ b/bottleneck/tests/data/test_608_B @@ -0,0 +1,100 @@ +69 152 +69 122 +74 138 +60 95 +88 127 +98 124 +99 193 +82 85 +17 78 +57 130 +50 71 +62 94 +7 39 +89 137 +26 69 +71 146 +9 73 +37 55 +25 111 +65 145 +94 157 +92 99 +31 51 +50 112 +87 99 +64 76 +55 126 +6 56 +48 124 +89 147 +16 18 +93 172 +53 152 +90 102 +25 123 +81 110 +1 93 +74 150 +61 73 +39 100 +74 148 +58 152 +21 94 +39 112 +96 161 +4 85 +61 79 +90 150 +2 42 +100 110 +81 161 +56 71 +90 162 +2 30 +69 80 +33 99 +27 43 +56 74 +57 138 +63 162 +51 121 +80 153 +75 174 +4 29 +91 122 +45 145 +72 74 +66 130 +13 79 +9 91 +59 100 +35 114 +100 124 +40 80 +40 134 +72 123 +43 63 +43 81 +37 83 +74 128 +5 86 +54 66 +88 133 +6 93 +98 166 +8 104 +100 199 +56 130 +88 128 +41 97 +8 17 +44 123 +7 51 +33 59 +0 80 +16 69 +16 55 +77 141 +75 108 +84 117 diff --git a/bottleneck/tests/data/test_609_A b/bottleneck/tests/data/test_609_A new file mode 100644 index 0000000..a8e841e --- /dev/null +++ b/bottleneck/tests/data/test_609_A @@ -0,0 +1,100 @@ +52 69 +8 75 +78 173 +64 147 +34 126 +24 107 +83 158 +79 135 +39 119 +72 163 +12 78 +45 107 +7 27 +8 48 +65 133 +43 99 +92 116 +46 61 +78 94 +73 122 +30 89 +27 50 +46 142 +58 92 +7 73 +52 123 +53 77 +28 115 +28 111 +65 159 +95 131 +58 82 +47 103 +31 110 +15 37 +90 139 +76 128 +88 131 +76 145 +96 165 +77 154 +11 36 +36 63 +25 122 +100 144 +13 15 +7 65 +50 128 +97 104 +98 183 +39 81 +55 89 +76 78 +46 87 +2 43 +86 151 +61 130 +40 122 +72 111 +14 113 +26 89 +43 61 +80 176 +83 170 +78 153 +93 171 +87 142 +98 101 +60 71 +24 93 +18 94 +86 103 +22 42 +14 104 +2 85 +26 78 +98 190 +91 191 +9 68 +46 124 +50 105 +0 38 +62 138 +26 27 +78 168 +80 87 +64 68 +64 129 +10 48 +77 171 +79 129 +53 89 +30 92 +71 125 +26 125 +12 112 +96 134 +27 114 +62 91 +10 11 diff --git a/bottleneck/tests/data/test_609_B b/bottleneck/tests/data/test_609_B new file mode 100644 index 0000000..574351a --- /dev/null +++ b/bottleneck/tests/data/test_609_B @@ -0,0 +1,100 @@ +64 90 +2 6 +69 77 +35 119 +59 88 +27 127 +39 134 +68 155 +92 151 +5 84 +79 125 +37 66 +31 116 +48 97 +63 88 +92 176 +36 98 +97 135 +67 130 +21 44 +42 114 +42 114 +56 93 +4 78 +91 128 +87 94 +35 69 +5 25 +46 72 +91 151 +96 180 +87 165 +24 32 +72 134 +78 150 +0 3 +100 197 +84 95 +6 31 +61 97 +25 26 +46 114 +91 152 +64 82 +75 78 +73 134 +43 58 +66 157 +82 130 +66 96 +49 61 +55 82 +25 39 +58 153 +93 184 +17 113 +51 123 +51 77 +61 106 +26 111 +94 187 +28 77 +5 95 +100 123 +0 74 +55 91 +60 76 +2 43 +58 110 +82 153 +22 100 +13 92 +7 22 +82 153 +71 84 +16 26 +3 45 +80 97 +51 143 +99 191 +38 67 +14 112 +4 11 +72 141 +4 34 +86 115 +74 134 +53 102 +87 116 +51 119 +5 105 +62 103 +32 116 +64 152 +41 52 +1 38 +3 57 +50 133 +57 132 +57 93 diff --git a/bottleneck/tests/data/test_610_A b/bottleneck/tests/data/test_610_A new file mode 100644 index 0000000..c37fa9c --- /dev/null +++ b/bottleneck/tests/data/test_610_A @@ -0,0 +1,100 @@ +4 71 +61 90 +58 59 +14 102 +53 142 +94 103 +47 71 +72 115 +33 113 +64 142 +82 115 +65 85 +34 101 +78 93 +68 109 +84 112 +45 80 +30 83 +100 164 +88 158 +2 10 +56 135 +22 41 +11 21 +77 128 +34 110 +8 54 +91 184 +57 120 +100 187 +76 115 +52 83 +48 54 +78 173 +10 84 +85 185 +44 129 +100 132 +52 58 +23 84 +65 70 +54 73 +92 167 +91 103 +73 112 +11 85 +38 78 +78 105 +7 22 +3 85 +57 125 +45 77 +15 99 +87 104 +2 70 +11 111 +40 75 +33 47 +99 186 +24 87 +20 78 +14 92 +71 135 +23 30 +58 95 +51 112 +8 21 +75 138 +78 102 +0 48 +86 106 +18 28 +4 103 +75 81 +96 126 +16 88 +83 120 +87 182 +35 48 +31 58 +46 71 +52 73 +71 89 +20 92 +33 107 +10 62 +29 37 +6 22 +0 81 +33 35 +0 81 +20 82 +18 39 +19 84 +88 166 +49 95 +64 74 +58 139 +20 21 +49 105 diff --git a/bottleneck/tests/data/test_610_B b/bottleneck/tests/data/test_610_B new file mode 100644 index 0000000..0745255 --- /dev/null +++ b/bottleneck/tests/data/test_610_B @@ -0,0 +1,100 @@ +44 136 +49 63 +56 122 +67 109 +38 136 +87 96 +23 34 +53 130 +94 108 +67 81 +58 88 +74 158 +20 86 +34 42 +76 128 +33 61 +92 156 +97 107 +39 111 +93 165 +56 144 +36 121 +2 34 +90 136 +91 185 +76 125 +13 26 +59 108 +39 131 +65 138 +49 145 +86 179 +56 138 +62 128 +37 106 +11 22 +27 39 +39 116 +83 127 +20 51 +10 20 +14 79 +96 107 +44 122 +85 122 +85 112 +75 95 +55 100 +56 111 +46 127 +72 157 +49 71 +32 126 +90 144 +94 95 +34 81 +21 64 +37 84 +40 103 +53 76 +88 102 +63 73 +28 31 +42 43 +29 50 +17 61 +59 156 +97 164 +22 50 +45 128 +65 159 +56 123 +10 82 +76 132 +9 86 +97 180 +34 62 +63 70 +68 127 +52 104 +75 168 +54 66 +67 154 +94 113 +34 76 +12 106 +34 69 +31 130 +70 105 +27 52 +47 71 +36 128 +68 156 +47 134 +12 79 +42 139 +85 138 +37 91 +43 68 +23 81 diff --git a/bottleneck/tests/data/test_611_A b/bottleneck/tests/data/test_611_A new file mode 100644 index 0000000..f7cfbbe --- /dev/null +++ b/bottleneck/tests/data/test_611_A @@ -0,0 +1,100 @@ +79 154 +81 116 +71 125 +5 48 +85 176 +76 115 +3 87 +85 102 +17 116 +49 80 +95 183 +82 92 +23 60 +66 97 +4 37 +81 90 +24 50 +64 136 +54 86 +87 160 +33 102 +40 80 +82 127 +97 118 +68 76 +99 160 +92 107 +14 80 +5 45 +42 83 +40 108 +77 163 +39 105 +91 176 +45 73 +96 169 +78 176 +12 90 +53 135 +87 124 +79 172 +52 65 +26 86 +65 112 +1 60 +57 131 +65 135 +45 57 +28 71 +40 50 +17 110 +95 112 +59 156 +38 86 +63 78 +60 112 +28 108 +18 72 +18 91 +33 94 +41 105 +2 37 +36 93 +49 103 +57 131 +10 108 +29 64 +73 83 +79 85 +30 115 +93 111 +47 90 +41 47 +90 158 +72 137 +55 65 +55 136 +40 52 +38 49 +33 57 +82 125 +53 139 +42 87 +43 55 +16 54 +45 61 +6 92 +21 37 +33 84 +37 137 +39 87 +19 70 +62 79 +9 15 +16 48 +39 131 +59 130 +80 94 +56 126 +76 95 diff --git a/bottleneck/tests/data/test_611_B b/bottleneck/tests/data/test_611_B new file mode 100644 index 0000000..ffc3bf6 --- /dev/null +++ b/bottleneck/tests/data/test_611_B @@ -0,0 +1,100 @@ +15 50 +61 137 +52 63 +72 148 +89 101 +93 143 +56 127 +30 99 +72 120 +92 114 +53 106 +43 72 +80 116 +67 136 +33 98 +63 111 +39 55 +84 170 +55 106 +1 8 +96 157 +85 143 +30 95 +66 132 +45 51 +36 128 +69 141 +1 31 +20 97 +14 47 +66 163 +44 125 +45 75 +86 185 +13 78 +28 31 +6 14 +96 108 +62 99 +29 120 +11 20 +55 107 +9 19 +32 105 +4 60 +92 160 +29 80 +68 113 +63 161 +78 95 +24 96 +98 128 +28 81 +87 175 +81 165 +70 137 +55 83 +38 43 +96 158 +40 100 +15 21 +66 70 +22 103 +37 106 +61 126 +52 151 +92 113 +36 61 +11 106 +81 141 +38 135 +48 142 +8 16 +88 89 +80 178 +100 160 +43 91 +71 122 +2 79 +21 27 +74 82 +3 6 +56 109 +94 175 +78 153 +32 117 +78 135 +14 53 +68 70 +53 115 +59 143 +41 63 +18 111 +28 109 +30 65 +42 132 +91 135 +5 43 +47 144 +53 103 diff --git a/bottleneck/tests/data/test_612_A b/bottleneck/tests/data/test_612_A new file mode 100644 index 0000000..1d08d30 --- /dev/null +++ b/bottleneck/tests/data/test_612_A @@ -0,0 +1,100 @@ +29 103 +5 54 +70 158 +33 82 +96 190 +84 184 +49 139 +37 47 +96 159 +75 126 +37 67 +5 28 +41 44 +64 107 +0 88 +32 35 +41 42 +11 14 +82 107 +36 111 +35 80 +69 142 +22 85 +95 191 +48 102 +78 135 +74 151 +71 73 +92 114 +95 152 +52 85 +52 95 +72 147 +33 133 +57 148 +90 155 +94 192 +97 108 +84 172 +3 46 +36 112 +72 129 +80 132 +17 41 +67 113 +27 77 +45 86 +56 135 +41 65 +13 53 +52 84 +54 101 +34 74 +25 99 +86 87 +36 136 +82 124 +5 95 +86 150 +76 90 +66 127 +54 110 +76 82 +82 101 +75 139 +2 28 +68 156 +38 60 +51 75 +96 161 +98 143 +38 66 +43 67 +72 112 +25 27 +96 195 +24 26 +46 85 +71 157 +12 47 +46 92 +72 109 +14 65 +68 144 +53 56 +61 105 +18 111 +51 95 +18 28 +39 121 +67 71 +42 58 +25 106 +88 169 +66 150 +47 114 +36 61 +12 101 +64 137 +8 31 diff --git a/bottleneck/tests/data/test_612_B b/bottleneck/tests/data/test_612_B new file mode 100644 index 0000000..712c645 --- /dev/null +++ b/bottleneck/tests/data/test_612_B @@ -0,0 +1,100 @@ +51 131 +46 143 +100 147 +25 81 +73 151 +74 80 +50 143 +91 157 +46 56 +67 152 +67 75 +78 137 +33 90 +17 45 +82 165 +64 97 +85 168 +44 130 +93 140 +80 137 +68 76 +82 177 +21 60 +73 82 +28 41 +45 121 +6 100 +72 83 +27 74 +53 69 +7 8 +7 93 +30 57 +38 98 +38 44 +58 81 +70 168 +15 112 +25 66 +80 122 +24 38 +60 149 +29 116 +54 75 +53 142 +48 111 +0 21 +82 151 +74 118 +93 155 +14 69 +7 70 +30 125 +9 73 +21 54 +97 144 +14 26 +27 95 +25 74 +60 75 +44 95 +94 168 +82 108 +97 129 +7 49 +86 95 +92 97 +98 166 +31 82 +33 90 +24 47 +48 147 +66 117 +26 66 +29 114 +84 166 +62 127 +72 132 +20 37 +77 170 +21 89 +1 9 +74 83 +96 192 +40 117 +3 8 +38 72 +88 156 +66 109 +22 52 +14 39 +51 92 +65 123 +81 119 +28 43 +75 170 +94 159 +20 96 +63 109 +17 106 diff --git a/bottleneck/tests/data/test_613_A b/bottleneck/tests/data/test_613_A new file mode 100644 index 0000000..909c462 --- /dev/null +++ b/bottleneck/tests/data/test_613_A @@ -0,0 +1,100 @@ +43 47 +47 132 +11 66 +37 81 +99 108 +46 54 +47 80 +96 121 +12 18 +56 128 +7 75 +27 104 +43 110 +100 127 +28 29 +75 174 +62 105 +0 13 +43 62 +5 43 +8 27 +54 56 +43 103 +41 105 +96 156 +42 48 +97 134 +25 67 +79 144 +25 29 +99 140 +98 128 +45 144 +37 46 +4 98 +92 121 +12 77 +14 97 +92 119 +72 167 +14 36 +92 101 +30 38 +94 100 +42 55 +8 97 +8 78 +78 135 +46 83 +78 126 +30 58 +80 175 +49 130 +67 85 +4 24 +100 188 +36 49 +88 179 +45 69 +80 89 +1 73 +30 88 +44 124 +29 81 +15 100 +35 70 +29 87 +73 152 +64 102 +47 136 +50 68 +75 127 +80 152 +34 44 +78 167 +98 162 +18 45 +19 60 +90 120 +68 106 +98 198 +61 130 +3 41 +90 100 +22 68 +19 57 +59 88 +19 77 +60 92 +38 61 +7 45 +23 87 +71 155 +23 57 +97 177 +58 128 +77 109 +13 112 +37 129 +54 61 diff --git a/bottleneck/tests/data/test_613_B b/bottleneck/tests/data/test_613_B new file mode 100644 index 0000000..9569b49 --- /dev/null +++ b/bottleneck/tests/data/test_613_B @@ -0,0 +1,100 @@ +22 108 +62 83 +61 105 +95 188 +77 78 +7 45 +83 149 +1 65 +14 16 +30 89 +84 112 +29 123 +73 173 +5 35 +37 58 +11 56 +83 125 +71 165 +53 103 +88 176 +28 88 +71 141 +93 170 +95 187 +15 84 +57 70 +19 118 +14 51 +37 117 +69 131 +97 143 +20 117 +54 99 +54 146 +62 104 +76 155 +23 75 +77 155 +23 117 +30 42 +97 137 +44 107 +24 33 +99 188 +30 38 +60 129 +83 102 +95 120 +37 71 +72 106 +90 149 +16 73 +97 127 +81 98 +39 101 +64 149 +43 112 +90 182 +8 93 +36 50 +33 45 +63 78 +25 103 +78 125 +47 143 +83 141 +66 153 +51 125 +53 83 +94 125 +99 199 +67 109 +67 99 +29 55 +68 148 +91 159 +65 96 +25 84 +63 134 +40 136 +94 173 +67 154 +14 107 +73 153 +24 79 +85 116 +66 104 +98 166 +0 42 +100 148 +74 168 +31 86 +42 62 +83 182 +48 131 +18 94 +90 134 +84 150 +78 175 +27 121 diff --git a/bottleneck/tests/data/test_614_A b/bottleneck/tests/data/test_614_A new file mode 100644 index 0000000..29c02c8 --- /dev/null +++ b/bottleneck/tests/data/test_614_A @@ -0,0 +1,100 @@ +24 124 +56 99 +57 147 +95 161 +39 104 +63 154 +82 105 +65 89 +82 122 +62 129 +88 181 +75 121 +32 33 +44 68 +12 28 +36 131 +63 64 +23 72 +92 159 +80 112 +2 92 +48 110 +50 98 +23 50 +20 72 +32 39 +32 86 +51 63 +47 114 +61 71 +32 78 +43 110 +69 157 +79 122 +35 48 +74 85 +15 62 +14 72 +29 62 +37 61 +56 75 +35 88 +70 84 +37 91 +45 139 +16 33 +76 145 +8 70 +87 128 +91 183 +29 47 +37 48 +13 102 +88 142 +10 75 +35 109 +84 178 +88 118 +85 93 +17 113 +30 49 +13 47 +83 129 +60 106 +92 154 +29 90 +93 135 +33 66 +60 117 +36 92 +1 22 +13 76 +5 102 +7 102 +76 154 +78 133 +72 135 +93 146 +37 47 +44 103 +68 102 +81 136 +51 58 +92 172 +43 119 +92 140 +62 116 +15 84 +58 82 +94 119 +74 131 +5 42 +37 56 +28 127 +82 85 +60 107 +18 98 +1 80 +95 129 +96 101 diff --git a/bottleneck/tests/data/test_614_B b/bottleneck/tests/data/test_614_B new file mode 100644 index 0000000..f34b836 --- /dev/null +++ b/bottleneck/tests/data/test_614_B @@ -0,0 +1,100 @@ +28 55 +77 152 +40 97 +23 116 +61 120 +59 143 +27 48 +32 88 +92 117 +66 145 +83 132 +2 51 +57 82 +47 122 +7 40 +68 150 +86 156 +68 122 +74 94 +92 113 +14 46 +61 116 +42 133 +15 55 +9 24 +49 70 +41 108 +20 45 +93 177 +87 144 +81 161 +11 60 +64 92 +24 69 +50 79 +39 82 +28 116 +62 122 +38 48 +64 75 +51 62 +22 34 +10 96 +61 73 +72 146 +10 62 +61 86 +5 41 +43 106 +25 66 +30 55 +91 112 +30 76 +96 176 +84 148 +17 81 +51 127 +90 106 +100 177 +67 129 +23 84 +49 99 +100 124 +11 59 +54 106 +19 113 +76 96 +10 96 +15 114 +83 143 +29 57 +82 143 +32 64 +6 73 +94 142 +22 52 +93 100 +57 154 +100 110 +90 165 +69 110 +54 118 +38 47 +92 142 +45 65 +0 19 +100 196 +71 136 +16 78 +53 148 +76 83 +49 81 +86 148 +59 152 +13 69 +25 101 +57 102 +89 113 +15 17 +1 2 diff --git a/bottleneck/tests/data/test_615_A b/bottleneck/tests/data/test_615_A new file mode 100644 index 0000000..d1b55eb --- /dev/null +++ b/bottleneck/tests/data/test_615_A @@ -0,0 +1,100 @@ +98 121 +87 153 +92 109 +60 122 +16 78 +1 43 +29 68 +93 186 +35 121 +95 183 +47 59 +98 129 +57 129 +82 134 +10 104 +20 60 +74 125 +97 158 +96 142 +71 88 +94 192 +37 132 +50 114 +65 96 +43 128 +27 48 +96 180 +10 22 +39 129 +28 29 +36 136 +1 65 +0 80 +3 99 +31 44 +35 94 +73 82 +91 155 +67 166 +36 78 +92 183 +74 157 +46 123 +31 68 +62 72 +21 83 +7 70 +49 137 +23 79 +48 132 +78 171 +51 80 +41 54 +59 108 +82 156 +42 136 +92 163 +27 90 +82 128 +95 96 +20 74 +26 40 +36 86 +29 35 +84 168 +82 151 +80 123 +58 109 +37 74 +53 86 +55 124 +24 91 +52 113 +79 126 +3 82 +68 124 +91 142 +48 85 +36 131 +7 61 +69 150 +66 77 +64 142 +91 95 +11 25 +71 162 +51 58 +20 104 +61 152 +2 19 +26 27 +41 58 +46 102 +29 41 +13 36 +93 145 +7 35 +54 102 +98 158 +85 93 diff --git a/bottleneck/tests/data/test_615_B b/bottleneck/tests/data/test_615_B new file mode 100644 index 0000000..ab204be --- /dev/null +++ b/bottleneck/tests/data/test_615_B @@ -0,0 +1,100 @@ +11 38 +73 143 +46 112 +28 29 +68 96 +49 111 +90 154 +98 189 +25 45 +40 129 +76 104 +72 79 +100 121 +3 73 +73 83 +51 84 +81 102 +55 91 +60 96 +54 139 +80 131 +4 84 +97 125 +75 132 +39 84 +90 153 +29 61 +27 31 +14 71 +86 112 +52 87 +1 100 +66 69 +16 51 +70 93 +91 139 +80 140 +92 144 +20 42 +45 122 +27 115 +51 112 +61 94 +54 140 +85 159 +0 99 +31 59 +9 24 +31 122 +5 13 +51 85 +22 65 +14 42 +79 120 +40 43 +13 85 +78 147 +47 48 +87 109 +94 187 +2 74 +36 95 +41 72 +85 105 +36 103 +41 94 +27 90 +66 72 +42 89 +93 170 +84 151 +66 96 +65 162 +2 3 +25 45 +50 77 +20 78 +21 50 +93 119 +76 150 +65 93 +11 68 +42 61 +28 92 +39 129 +92 112 +91 187 +48 97 +59 62 +0 31 +57 107 +83 140 +80 82 +87 135 +35 48 +23 57 +79 166 +7 81 +97 121 +97 98 diff --git a/bottleneck/tests/data/test_616_A b/bottleneck/tests/data/test_616_A new file mode 100644 index 0000000..2b99b87 --- /dev/null +++ b/bottleneck/tests/data/test_616_A @@ -0,0 +1,100 @@ +74 170 +100 122 +43 126 +66 162 +54 71 +31 122 +49 55 +100 194 +68 142 +83 94 +4 55 +20 79 +90 117 +67 143 +50 51 +40 123 +21 64 +41 114 +35 44 +75 169 +82 162 +52 138 +69 99 +53 107 +36 95 +99 118 +55 69 +86 102 +70 75 +5 94 +55 133 +79 141 +100 171 +6 73 +22 99 +92 185 +5 94 +34 131 +50 143 +97 184 +51 106 +82 158 +85 173 +81 163 +59 85 +50 93 +49 60 +94 128 +83 167 +29 44 +85 164 +62 138 +33 92 +32 114 +74 80 +64 124 +30 117 +22 116 +37 80 +87 142 +65 143 +0 95 +93 131 +70 168 +35 90 +74 169 +79 173 +49 99 +33 120 +30 63 +57 113 +72 97 +71 127 +53 61 +77 139 +85 159 +0 80 +51 120 +3 76 +65 88 +63 121 +55 73 +23 92 +29 98 +2 31 +65 112 +15 86 +47 86 +100 146 +21 49 +76 158 +75 130 +65 141 +73 112 +6 90 +29 110 +89 93 +99 106 +95 135 +39 101 diff --git a/bottleneck/tests/data/test_616_B b/bottleneck/tests/data/test_616_B new file mode 100644 index 0000000..55a8c9f --- /dev/null +++ b/bottleneck/tests/data/test_616_B @@ -0,0 +1,100 @@ +22 54 +34 134 +72 81 +63 68 +99 119 +35 79 +86 177 +39 120 +68 128 +50 115 +59 119 +60 125 +19 91 +82 118 +81 100 +46 144 +99 152 +7 81 +81 113 +29 93 +68 86 +15 54 +52 67 +85 182 +44 76 +2 55 +51 146 +19 32 +39 111 +41 116 +83 112 +97 190 +83 94 +85 133 +31 103 +55 92 +99 150 +49 136 +72 138 +1 53 +25 89 +37 106 +49 149 +2 10 +39 90 +85 143 +4 17 +8 69 +59 120 +70 80 +73 96 +80 119 +57 86 +30 59 +52 60 +13 93 +16 92 +45 103 +14 27 +4 30 +81 117 +22 39 +14 78 +42 120 +19 118 +97 115 +74 164 +70 158 +12 63 +38 79 +80 150 +37 111 +71 97 +7 13 +73 162 +31 75 +61 98 +54 89 +73 110 +87 137 +61 126 +23 71 +97 146 +20 47 +98 181 +63 69 +4 102 +11 50 +17 46 +19 22 +70 167 +98 147 +99 153 +93 144 +44 72 +67 117 +46 133 +15 48 +64 135 +55 122 diff --git a/bottleneck/tests/data/test_617_A b/bottleneck/tests/data/test_617_A new file mode 100644 index 0000000..9eb04ba --- /dev/null +++ b/bottleneck/tests/data/test_617_A @@ -0,0 +1,100 @@ +91 153 +68 149 +3 63 +83 160 +15 40 +13 60 +92 126 +96 190 +2 94 +75 89 +100 141 +12 107 +66 104 +57 120 +65 91 +91 191 +12 93 +50 66 +30 85 +4 5 +63 124 +69 145 +50 131 +61 94 +23 33 +27 91 +43 46 +67 131 +90 106 +47 128 +99 109 +76 133 +62 89 +68 95 +72 125 +37 55 +10 14 +6 55 +9 13 +99 168 +14 47 +24 62 +27 112 +92 133 +95 166 +36 76 +67 152 +72 94 +72 158 +77 175 +93 143 +38 78 +20 71 +68 122 +39 111 +49 120 +0 62 +52 127 +51 142 +81 168 +63 117 +33 52 +47 48 +4 66 +92 166 +51 120 +77 80 +54 89 +83 124 +90 126 +93 122 +6 83 +63 111 +95 146 +3 57 +39 117 +76 105 +71 76 +13 88 +94 185 +77 147 +47 147 +60 123 +64 134 +97 110 +99 111 +75 119 +15 35 +82 130 +92 129 +27 108 +93 94 +91 138 +43 101 +90 160 +90 155 +27 88 +2 17 +20 43 +9 94 diff --git a/bottleneck/tests/data/test_617_B b/bottleneck/tests/data/test_617_B new file mode 100644 index 0000000..eb300a8 --- /dev/null +++ b/bottleneck/tests/data/test_617_B @@ -0,0 +1,100 @@ +100 145 +51 93 +52 55 +73 86 +99 166 +80 151 +75 83 +81 105 +10 11 +52 110 +32 102 +38 124 +83 168 +55 116 +47 101 +71 90 +78 163 +19 98 +58 135 +54 137 +79 114 +91 102 +96 119 +9 10 +30 82 +15 60 +69 106 +56 125 +0 7 +71 74 +37 79 +80 102 +89 177 +43 92 +80 94 +9 92 +37 69 +6 95 +85 111 +27 38 +95 138 +92 157 +51 57 +79 96 +67 123 +56 70 +69 153 +82 151 +96 192 +12 34 +66 78 +75 154 +91 135 +79 179 +67 153 +45 86 +88 144 +91 109 +60 115 +92 176 +45 110 +35 117 +58 61 +91 147 +80 86 +9 80 +65 125 +75 78 +29 105 +69 148 +55 138 +54 60 +89 139 +98 131 +73 104 +29 127 +63 123 +7 69 +82 152 +6 92 +20 37 +41 112 +82 182 +73 128 +48 106 +60 98 +35 65 +13 42 +49 52 +8 36 +6 18 +42 70 +16 60 +30 56 +78 120 +80 94 +38 92 +19 52 +78 89 +49 131 diff --git a/bottleneck/tests/data/test_618_A b/bottleneck/tests/data/test_618_A new file mode 100644 index 0000000..a53c5f8 --- /dev/null +++ b/bottleneck/tests/data/test_618_A @@ -0,0 +1,100 @@ +28 78 +66 159 +45 123 +56 140 +67 109 +32 81 +23 101 +44 121 +82 99 +20 28 +59 137 +93 185 +51 103 +75 89 +47 69 +48 94 +23 52 +35 74 +67 161 +67 138 +12 25 +50 73 +90 158 +55 124 +95 120 +36 96 +91 126 +100 114 +15 66 +89 180 +19 54 +81 137 +65 114 +46 51 +42 141 +74 88 +46 76 +38 69 +21 92 +92 97 +16 29 +97 177 +22 75 +94 155 +10 47 +96 174 +98 155 +16 104 +49 88 +36 44 +1 9 +66 83 +71 117 +45 56 +49 146 +29 66 +31 35 +49 133 +43 123 +6 20 +24 103 +14 103 +13 30 +100 101 +8 68 +71 101 +18 52 +33 94 +82 113 +0 36 +1 79 +63 141 +29 113 +41 105 +5 105 +47 142 +98 159 +48 96 +31 43 +29 76 +63 159 +9 72 +39 62 +75 111 +27 37 +72 81 +39 112 +70 88 +78 149 +69 101 +68 136 +72 77 +18 40 +48 72 +53 115 +12 78 +40 63 +75 163 +57 141 +47 140 diff --git a/bottleneck/tests/data/test_618_B b/bottleneck/tests/data/test_618_B new file mode 100644 index 0000000..611fb6a --- /dev/null +++ b/bottleneck/tests/data/test_618_B @@ -0,0 +1,100 @@ +35 126 +40 82 +62 85 +64 72 +55 138 +43 97 +12 41 +75 142 +12 68 +26 114 +69 169 +65 101 +76 161 +20 63 +25 113 +70 153 +54 70 +41 79 +29 91 +85 100 +53 134 +12 13 +38 56 +28 112 +34 118 +56 111 +17 104 +66 108 +23 26 +47 96 +18 100 +18 100 +51 127 +40 87 +63 75 +40 101 +14 48 +72 90 +80 121 +28 56 +91 147 +25 92 +31 55 +25 106 +41 57 +42 52 +65 98 +14 110 +98 188 +39 75 +68 147 +62 148 +16 96 +91 103 +83 109 +55 91 +85 184 +62 73 +9 105 +70 74 +33 132 +6 82 +97 169 +11 90 +98 194 +91 160 +74 133 +25 69 +73 114 +1 27 +100 120 +77 159 +88 187 +31 42 +24 25 +93 140 +44 96 +0 86 +39 55 +52 96 +2 54 +33 97 +63 151 +7 95 +40 54 +89 127 +71 112 +74 162 +55 113 +20 60 +81 106 +36 111 +17 75 +48 69 +6 33 +11 94 +73 150 +5 28 +62 118 +38 78 diff --git a/bottleneck/tests/data/test_619_A b/bottleneck/tests/data/test_619_A new file mode 100644 index 0000000..4dd6557 --- /dev/null +++ b/bottleneck/tests/data/test_619_A @@ -0,0 +1,100 @@ +31 76 +34 130 +70 80 +52 82 +40 116 +77 109 +84 130 +53 111 +63 79 +7 12 +28 70 +35 78 +95 115 +78 123 +23 44 +96 162 +50 139 +58 155 +31 91 +91 129 +82 139 +21 111 +98 117 +75 137 +27 68 +51 125 +93 104 +71 161 +66 147 +97 132 +98 169 +93 186 +22 83 +73 136 +27 70 +100 194 +74 87 +21 31 +11 107 +59 70 +0 77 +99 126 +50 86 +31 123 +62 91 +25 119 +44 104 +68 156 +79 165 +58 89 +66 122 +20 42 +71 77 +97 177 +40 66 +78 122 +73 169 +84 89 +28 107 +58 94 +76 89 +68 103 +50 89 +90 97 +32 94 +30 96 +78 100 +97 186 +99 141 +61 116 +19 32 +19 101 +32 65 +15 67 +69 150 +55 64 +37 53 +76 130 +4 53 +27 79 +90 121 +8 53 +39 75 +90 102 +41 65 +34 124 +16 110 +52 61 +55 58 +23 62 +14 92 +39 88 +5 71 +59 110 +12 100 +14 90 +35 101 +23 105 +50 124 +58 148 diff --git a/bottleneck/tests/data/test_619_B b/bottleneck/tests/data/test_619_B new file mode 100644 index 0000000..711d7cb --- /dev/null +++ b/bottleneck/tests/data/test_619_B @@ -0,0 +1,100 @@ +75 136 +69 74 +21 44 +4 30 +6 70 +27 50 +57 72 +62 67 +50 127 +33 84 +10 71 +87 167 +12 58 +1 41 +86 164 +74 133 +64 132 +80 178 +72 124 +91 165 +4 96 +6 90 +49 97 +87 123 +34 101 +34 66 +94 108 +78 109 +34 87 +23 107 +7 70 +88 108 +100 157 +18 29 +15 38 +81 136 +39 103 +12 96 +56 136 +71 104 +90 137 +100 167 +39 125 +10 102 +8 49 +86 89 +76 153 +21 48 +52 129 +58 61 +41 136 +43 110 +37 39 +20 65 +99 161 +54 82 +17 64 +66 137 +32 44 +13 40 +43 127 +1 21 +41 63 +57 127 +29 126 +64 134 +24 122 +62 73 +20 120 +72 109 +100 156 +35 43 +4 19 +84 174 +64 101 +32 122 +14 43 +68 111 +84 132 +55 92 +21 84 +90 183 +62 63 +10 107 +40 46 +81 124 +62 120 +50 125 +38 112 +72 137 +93 190 +38 57 +27 42 +7 76 +84 169 +45 102 +51 78 +96 111 +84 153 +53 60 diff --git a/bottleneck/tests/data/test_620_A b/bottleneck/tests/data/test_620_A new file mode 100644 index 0000000..74e7856 --- /dev/null +++ b/bottleneck/tests/data/test_620_A @@ -0,0 +1,2 @@ +977 1670 +257 583 diff --git a/bottleneck/tests/data/test_620_B b/bottleneck/tests/data/test_620_B new file mode 100644 index 0000000..e7efa97 --- /dev/null +++ b/bottleneck/tests/data/test_620_B @@ -0,0 +1,2 @@ +519 914 +659 781 diff --git a/bottleneck/tests/data/test_621_A b/bottleneck/tests/data/test_621_A new file mode 100644 index 0000000..6a24523 --- /dev/null +++ b/bottleneck/tests/data/test_621_A @@ -0,0 +1,2 @@ +928 1424 +468 1402 diff --git a/bottleneck/tests/data/test_621_B b/bottleneck/tests/data/test_621_B new file mode 100644 index 0000000..7b49acb --- /dev/null +++ b/bottleneck/tests/data/test_621_B @@ -0,0 +1,2 @@ +946 1838 +602 1466 diff --git a/bottleneck/tests/data/test_622_A b/bottleneck/tests/data/test_622_A new file mode 100644 index 0000000..58d67ac --- /dev/null +++ b/bottleneck/tests/data/test_622_A @@ -0,0 +1,2 @@ +199 1177 +163 743 diff --git a/bottleneck/tests/data/test_622_B b/bottleneck/tests/data/test_622_B new file mode 100644 index 0000000..f9a4fdd --- /dev/null +++ b/bottleneck/tests/data/test_622_B @@ -0,0 +1,2 @@ +502 1478 +838 1480 diff --git a/bottleneck/tests/data/test_623_A b/bottleneck/tests/data/test_623_A new file mode 100644 index 0000000..8d99200 --- /dev/null +++ b/bottleneck/tests/data/test_623_A @@ -0,0 +1,2 @@ +156 443 +264 982 diff --git a/bottleneck/tests/data/test_623_B b/bottleneck/tests/data/test_623_B new file mode 100644 index 0000000..22ab9fd --- /dev/null +++ b/bottleneck/tests/data/test_623_B @@ -0,0 +1,2 @@ +995 1285 +571 1427 diff --git a/bottleneck/tests/data/test_624_A b/bottleneck/tests/data/test_624_A new file mode 100644 index 0000000..49891f6 --- /dev/null +++ b/bottleneck/tests/data/test_624_A @@ -0,0 +1,2 @@ +884 1159 +315 1125 diff --git a/bottleneck/tests/data/test_624_B b/bottleneck/tests/data/test_624_B new file mode 100644 index 0000000..fa3e1ea --- /dev/null +++ b/bottleneck/tests/data/test_624_B @@ -0,0 +1,2 @@ +236 1034 +474 567 diff --git a/bottleneck/tests/data/test_625_A b/bottleneck/tests/data/test_625_A new file mode 100644 index 0000000..4da6ce4 --- /dev/null +++ b/bottleneck/tests/data/test_625_A @@ -0,0 +1,2 @@ +8 375 +509 926 diff --git a/bottleneck/tests/data/test_625_B b/bottleneck/tests/data/test_625_B new file mode 100644 index 0000000..bf587fc --- /dev/null +++ b/bottleneck/tests/data/test_625_B @@ -0,0 +1,2 @@ +805 895 +735 1279 diff --git a/bottleneck/tests/data/test_626_A b/bottleneck/tests/data/test_626_A new file mode 100644 index 0000000..92036c8 --- /dev/null +++ b/bottleneck/tests/data/test_626_A @@ -0,0 +1,2 @@ +821 1025 +74 936 diff --git a/bottleneck/tests/data/test_626_B b/bottleneck/tests/data/test_626_B new file mode 100644 index 0000000..3052b59 --- /dev/null +++ b/bottleneck/tests/data/test_626_B @@ -0,0 +1,2 @@ +155 737 +564 1257 diff --git a/bottleneck/tests/data/test_627_A b/bottleneck/tests/data/test_627_A new file mode 100644 index 0000000..f682247 --- /dev/null +++ b/bottleneck/tests/data/test_627_A @@ -0,0 +1,2 @@ +680 1473 +354 876 diff --git a/bottleneck/tests/data/test_627_B b/bottleneck/tests/data/test_627_B new file mode 100644 index 0000000..7c61fad --- /dev/null +++ b/bottleneck/tests/data/test_627_B @@ -0,0 +1,2 @@ +767 1509 +998 1182 diff --git a/bottleneck/tests/data/test_628_A b/bottleneck/tests/data/test_628_A new file mode 100644 index 0000000..f499ec3 --- /dev/null +++ b/bottleneck/tests/data/test_628_A @@ -0,0 +1,2 @@ +481 1127 +66 1027 diff --git a/bottleneck/tests/data/test_628_B b/bottleneck/tests/data/test_628_B new file mode 100644 index 0000000..5eb5994 --- /dev/null +++ b/bottleneck/tests/data/test_628_B @@ -0,0 +1,2 @@ +961 1197 +123 388 diff --git a/bottleneck/tests/data/test_629_A b/bottleneck/tests/data/test_629_A new file mode 100644 index 0000000..ff42c12 --- /dev/null +++ b/bottleneck/tests/data/test_629_A @@ -0,0 +1,2 @@ +457 1026 +405 1343 diff --git a/bottleneck/tests/data/test_629_B b/bottleneck/tests/data/test_629_B new file mode 100644 index 0000000..b0b983a --- /dev/null +++ b/bottleneck/tests/data/test_629_B @@ -0,0 +1,2 @@ +575 706 +472 965 diff --git a/bottleneck/tests/data/test_630_A b/bottleneck/tests/data/test_630_A new file mode 100644 index 0000000..6ed10cf --- /dev/null +++ b/bottleneck/tests/data/test_630_A @@ -0,0 +1,2 @@ +480 650 +0 307 diff --git a/bottleneck/tests/data/test_630_B b/bottleneck/tests/data/test_630_B new file mode 100644 index 0000000..0583a0c --- /dev/null +++ b/bottleneck/tests/data/test_630_B @@ -0,0 +1,2 @@ +836 1099 +771 1050 diff --git a/bottleneck/tests/data/test_631_A b/bottleneck/tests/data/test_631_A new file mode 100644 index 0000000..d49637c --- /dev/null +++ b/bottleneck/tests/data/test_631_A @@ -0,0 +1,2 @@ +551 1534 +392 820 diff --git a/bottleneck/tests/data/test_631_B b/bottleneck/tests/data/test_631_B new file mode 100644 index 0000000..f522f48 --- /dev/null +++ b/bottleneck/tests/data/test_631_B @@ -0,0 +1,2 @@ +721 1465 +591 781 diff --git a/bottleneck/tests/data/test_632_A b/bottleneck/tests/data/test_632_A new file mode 100644 index 0000000..32c4757 --- /dev/null +++ b/bottleneck/tests/data/test_632_A @@ -0,0 +1,2 @@ +352 417 +814 986 diff --git a/bottleneck/tests/data/test_632_B b/bottleneck/tests/data/test_632_B new file mode 100644 index 0000000..f50a6bb --- /dev/null +++ b/bottleneck/tests/data/test_632_B @@ -0,0 +1,2 @@ +211 264 +517 1443 diff --git a/bottleneck/tests/data/test_633_A b/bottleneck/tests/data/test_633_A new file mode 100644 index 0000000..0199c88 --- /dev/null +++ b/bottleneck/tests/data/test_633_A @@ -0,0 +1,2 @@ +487 1216 +842 1559 diff --git a/bottleneck/tests/data/test_633_B b/bottleneck/tests/data/test_633_B new file mode 100644 index 0000000..d516834 --- /dev/null +++ b/bottleneck/tests/data/test_633_B @@ -0,0 +1,2 @@ +353 982 +437 1421 diff --git a/bottleneck/tests/data/test_634_A b/bottleneck/tests/data/test_634_A new file mode 100644 index 0000000..45493ad --- /dev/null +++ b/bottleneck/tests/data/test_634_A @@ -0,0 +1,2 @@ +367 742 +382 796 diff --git a/bottleneck/tests/data/test_634_B b/bottleneck/tests/data/test_634_B new file mode 100644 index 0000000..8840b3a --- /dev/null +++ b/bottleneck/tests/data/test_634_B @@ -0,0 +1,2 @@ +9 723 +351 901 diff --git a/bottleneck/tests/data/test_635_A b/bottleneck/tests/data/test_635_A new file mode 100644 index 0000000..d65240b --- /dev/null +++ b/bottleneck/tests/data/test_635_A @@ -0,0 +1,2 @@ +984 1272 +952 1384 diff --git a/bottleneck/tests/data/test_635_B b/bottleneck/tests/data/test_635_B new file mode 100644 index 0000000..8cc813d --- /dev/null +++ b/bottleneck/tests/data/test_635_B @@ -0,0 +1,2 @@ +528 622 +88 466 diff --git a/bottleneck/tests/data/test_636_A b/bottleneck/tests/data/test_636_A new file mode 100644 index 0000000..eee9635 --- /dev/null +++ b/bottleneck/tests/data/test_636_A @@ -0,0 +1,2 @@ +285 617 +809 1379 diff --git a/bottleneck/tests/data/test_636_B b/bottleneck/tests/data/test_636_B new file mode 100644 index 0000000..e565845 --- /dev/null +++ b/bottleneck/tests/data/test_636_B @@ -0,0 +1,2 @@ +162 1083 +842 1760 diff --git a/bottleneck/tests/data/test_637_A b/bottleneck/tests/data/test_637_A new file mode 100644 index 0000000..4ba4314 --- /dev/null +++ b/bottleneck/tests/data/test_637_A @@ -0,0 +1,2 @@ +624 1031 +118 423 diff --git a/bottleneck/tests/data/test_637_B b/bottleneck/tests/data/test_637_B new file mode 100644 index 0000000..58aba0f --- /dev/null +++ b/bottleneck/tests/data/test_637_B @@ -0,0 +1,2 @@ +453 958 +310 1149 diff --git a/bottleneck/tests/data/test_638_A b/bottleneck/tests/data/test_638_A new file mode 100644 index 0000000..4d993df --- /dev/null +++ b/bottleneck/tests/data/test_638_A @@ -0,0 +1,2 @@ +683 1251 +811 1566 diff --git a/bottleneck/tests/data/test_638_B b/bottleneck/tests/data/test_638_B new file mode 100644 index 0000000..5750b40 --- /dev/null +++ b/bottleneck/tests/data/test_638_B @@ -0,0 +1,2 @@ +489 1389 +408 858 diff --git a/bottleneck/tests/data/test_639_A b/bottleneck/tests/data/test_639_A new file mode 100644 index 0000000..1e86c9b --- /dev/null +++ b/bottleneck/tests/data/test_639_A @@ -0,0 +1,2 @@ +907 1067 +329 547 diff --git a/bottleneck/tests/data/test_639_B b/bottleneck/tests/data/test_639_B new file mode 100644 index 0000000..758fe2d --- /dev/null +++ b/bottleneck/tests/data/test_639_B @@ -0,0 +1,2 @@ +896 1777 +769 1237 diff --git a/bottleneck/tests/data/test_640_A b/bottleneck/tests/data/test_640_A new file mode 100644 index 0000000..981248a --- /dev/null +++ b/bottleneck/tests/data/test_640_A @@ -0,0 +1,3 @@ +609 1601 +450 549 +123 590 diff --git a/bottleneck/tests/data/test_640_B b/bottleneck/tests/data/test_640_B new file mode 100644 index 0000000..d4f75ec --- /dev/null +++ b/bottleneck/tests/data/test_640_B @@ -0,0 +1,3 @@ +392 752 +844 1720 +51 914 diff --git a/bottleneck/tests/data/test_641_A b/bottleneck/tests/data/test_641_A new file mode 100644 index 0000000..04100b0 --- /dev/null +++ b/bottleneck/tests/data/test_641_A @@ -0,0 +1,3 @@ +344 679 +413 673 +647 1475 diff --git a/bottleneck/tests/data/test_641_B b/bottleneck/tests/data/test_641_B new file mode 100644 index 0000000..840a640 --- /dev/null +++ b/bottleneck/tests/data/test_641_B @@ -0,0 +1,3 @@ +688 1185 +529 598 +382 1269 diff --git a/bottleneck/tests/data/test_642_A b/bottleneck/tests/data/test_642_A new file mode 100644 index 0000000..a7da9ec --- /dev/null +++ b/bottleneck/tests/data/test_642_A @@ -0,0 +1,3 @@ +886 1249 +24 684 +651 895 diff --git a/bottleneck/tests/data/test_642_B b/bottleneck/tests/data/test_642_B new file mode 100644 index 0000000..e25e427 --- /dev/null +++ b/bottleneck/tests/data/test_642_B @@ -0,0 +1,3 @@ +779 977 +2 736 +978 1769 diff --git a/bottleneck/tests/data/test_643_A b/bottleneck/tests/data/test_643_A new file mode 100644 index 0000000..e818bdc --- /dev/null +++ b/bottleneck/tests/data/test_643_A @@ -0,0 +1,3 @@ +891 1186 +391 1185 +921 1300 diff --git a/bottleneck/tests/data/test_643_B b/bottleneck/tests/data/test_643_B new file mode 100644 index 0000000..7a5f620 --- /dev/null +++ b/bottleneck/tests/data/test_643_B @@ -0,0 +1,3 @@ +21 783 +84 583 +133 483 diff --git a/bottleneck/tests/data/test_644_A b/bottleneck/tests/data/test_644_A new file mode 100644 index 0000000..f6bc335 --- /dev/null +++ b/bottleneck/tests/data/test_644_A @@ -0,0 +1,3 @@ +608 1036 +485 1247 +532 1302 diff --git a/bottleneck/tests/data/test_644_B b/bottleneck/tests/data/test_644_B new file mode 100644 index 0000000..109024d --- /dev/null +++ b/bottleneck/tests/data/test_644_B @@ -0,0 +1,3 @@ +639 1059 +177 1044 +680 901 diff --git a/bottleneck/tests/data/test_645_A b/bottleneck/tests/data/test_645_A new file mode 100644 index 0000000..3f62c52 --- /dev/null +++ b/bottleneck/tests/data/test_645_A @@ -0,0 +1,3 @@ +353 877 +730 1291 +610 992 diff --git a/bottleneck/tests/data/test_645_B b/bottleneck/tests/data/test_645_B new file mode 100644 index 0000000..f818161 --- /dev/null +++ b/bottleneck/tests/data/test_645_B @@ -0,0 +1,3 @@ +854 1092 +395 737 +966 1230 diff --git a/bottleneck/tests/data/test_646_A b/bottleneck/tests/data/test_646_A new file mode 100644 index 0000000..7582a95 --- /dev/null +++ b/bottleneck/tests/data/test_646_A @@ -0,0 +1,3 @@ +908 946 +490 875 +115 272 diff --git a/bottleneck/tests/data/test_646_B b/bottleneck/tests/data/test_646_B new file mode 100644 index 0000000..af402f8 --- /dev/null +++ b/bottleneck/tests/data/test_646_B @@ -0,0 +1,3 @@ +787 1300 +123 569 +222 235 diff --git a/bottleneck/tests/data/test_647_A b/bottleneck/tests/data/test_647_A new file mode 100644 index 0000000..caa678f --- /dev/null +++ b/bottleneck/tests/data/test_647_A @@ -0,0 +1,3 @@ +165 217 +390 1141 +18 238 diff --git a/bottleneck/tests/data/test_647_B b/bottleneck/tests/data/test_647_B new file mode 100644 index 0000000..a135f9e --- /dev/null +++ b/bottleneck/tests/data/test_647_B @@ -0,0 +1,3 @@ +244 641 +97 859 +575 1088 diff --git a/bottleneck/tests/data/test_648_A b/bottleneck/tests/data/test_648_A new file mode 100644 index 0000000..35e36b8 --- /dev/null +++ b/bottleneck/tests/data/test_648_A @@ -0,0 +1,3 @@ +461 1111 +285 713 +349 943 diff --git a/bottleneck/tests/data/test_648_B b/bottleneck/tests/data/test_648_B new file mode 100644 index 0000000..8a28c4a --- /dev/null +++ b/bottleneck/tests/data/test_648_B @@ -0,0 +1,3 @@ +808 938 +293 374 +580 976 diff --git a/bottleneck/tests/data/test_649_A b/bottleneck/tests/data/test_649_A new file mode 100644 index 0000000..065cc77 --- /dev/null +++ b/bottleneck/tests/data/test_649_A @@ -0,0 +1,3 @@ +57 802 +286 543 +403 1224 diff --git a/bottleneck/tests/data/test_649_B b/bottleneck/tests/data/test_649_B new file mode 100644 index 0000000..b23411e --- /dev/null +++ b/bottleneck/tests/data/test_649_B @@ -0,0 +1,3 @@ +548 551 +21 683 +6 490 diff --git a/bottleneck/tests/data/test_650_A b/bottleneck/tests/data/test_650_A new file mode 100644 index 0000000..d87b7b4 --- /dev/null +++ b/bottleneck/tests/data/test_650_A @@ -0,0 +1,3 @@ +36 367 +273 389 +981 1711 diff --git a/bottleneck/tests/data/test_650_B b/bottleneck/tests/data/test_650_B new file mode 100644 index 0000000..f379676 --- /dev/null +++ b/bottleneck/tests/data/test_650_B @@ -0,0 +1,3 @@ +659 1452 +551 1121 +551 949 diff --git a/bottleneck/tests/data/test_651_A b/bottleneck/tests/data/test_651_A new file mode 100644 index 0000000..ecf506a --- /dev/null +++ b/bottleneck/tests/data/test_651_A @@ -0,0 +1,3 @@ +929 1425 +793 1446 +949 1437 diff --git a/bottleneck/tests/data/test_651_B b/bottleneck/tests/data/test_651_B new file mode 100644 index 0000000..f05128d --- /dev/null +++ b/bottleneck/tests/data/test_651_B @@ -0,0 +1,3 @@ +860 1575 +476 1240 +126 1042 diff --git a/bottleneck/tests/data/test_652_A b/bottleneck/tests/data/test_652_A new file mode 100644 index 0000000..52d5bdf --- /dev/null +++ b/bottleneck/tests/data/test_652_A @@ -0,0 +1,3 @@ +842 1066 +564 764 +68 267 diff --git a/bottleneck/tests/data/test_652_B b/bottleneck/tests/data/test_652_B new file mode 100644 index 0000000..2b12de5 --- /dev/null +++ b/bottleneck/tests/data/test_652_B @@ -0,0 +1,3 @@ +427 528 +404 1245 +800 994 diff --git a/bottleneck/tests/data/test_653_A b/bottleneck/tests/data/test_653_A new file mode 100644 index 0000000..b4bbdd3 --- /dev/null +++ b/bottleneck/tests/data/test_653_A @@ -0,0 +1,3 @@ +792 967 +574 1406 +175 533 diff --git a/bottleneck/tests/data/test_653_B b/bottleneck/tests/data/test_653_B new file mode 100644 index 0000000..f349693 --- /dev/null +++ b/bottleneck/tests/data/test_653_B @@ -0,0 +1,3 @@ +421 822 +339 1231 +723 1052 diff --git a/bottleneck/tests/data/test_654_A b/bottleneck/tests/data/test_654_A new file mode 100644 index 0000000..d090ad8 --- /dev/null +++ b/bottleneck/tests/data/test_654_A @@ -0,0 +1,3 @@ +175 462 +829 1810 +494 1040 diff --git a/bottleneck/tests/data/test_654_B b/bottleneck/tests/data/test_654_B new file mode 100644 index 0000000..f9944d7 --- /dev/null +++ b/bottleneck/tests/data/test_654_B @@ -0,0 +1,3 @@ +656 658 +403 1260 +887 1883 diff --git a/bottleneck/tests/data/test_655_A b/bottleneck/tests/data/test_655_A new file mode 100644 index 0000000..9105397 --- /dev/null +++ b/bottleneck/tests/data/test_655_A @@ -0,0 +1,3 @@ +1 419 +674 970 +633 664 diff --git a/bottleneck/tests/data/test_655_B b/bottleneck/tests/data/test_655_B new file mode 100644 index 0000000..9aa2ab6 --- /dev/null +++ b/bottleneck/tests/data/test_655_B @@ -0,0 +1,3 @@ +194 461 +376 901 +417 723 diff --git a/bottleneck/tests/data/test_656_A b/bottleneck/tests/data/test_656_A new file mode 100644 index 0000000..bcdfd3c --- /dev/null +++ b/bottleneck/tests/data/test_656_A @@ -0,0 +1,3 @@ +707 825 +811 1475 +344 915 diff --git a/bottleneck/tests/data/test_656_B b/bottleneck/tests/data/test_656_B new file mode 100644 index 0000000..5ee0ab0 --- /dev/null +++ b/bottleneck/tests/data/test_656_B @@ -0,0 +1,3 @@ +928 1504 +366 991 +506 1194 diff --git a/bottleneck/tests/data/test_657_A b/bottleneck/tests/data/test_657_A new file mode 100644 index 0000000..7d39a99 --- /dev/null +++ b/bottleneck/tests/data/test_657_A @@ -0,0 +1,3 @@ +101 439 +539 1442 +955 1560 diff --git a/bottleneck/tests/data/test_657_B b/bottleneck/tests/data/test_657_B new file mode 100644 index 0000000..3b9d726 --- /dev/null +++ b/bottleneck/tests/data/test_657_B @@ -0,0 +1,3 @@ +505 966 +757 1602 +615 1309 diff --git a/bottleneck/tests/data/test_658_A b/bottleneck/tests/data/test_658_A new file mode 100644 index 0000000..33f8b08 --- /dev/null +++ b/bottleneck/tests/data/test_658_A @@ -0,0 +1,3 @@ +829 1642 +95 139 +435 558 diff --git a/bottleneck/tests/data/test_658_B b/bottleneck/tests/data/test_658_B new file mode 100644 index 0000000..b131e5d --- /dev/null +++ b/bottleneck/tests/data/test_658_B @@ -0,0 +1,3 @@ +171 1171 +240 780 +363 720 diff --git a/bottleneck/tests/data/test_659_A b/bottleneck/tests/data/test_659_A new file mode 100644 index 0000000..974d216 --- /dev/null +++ b/bottleneck/tests/data/test_659_A @@ -0,0 +1,3 @@ +409 1266 +680 909 +942 1270 diff --git a/bottleneck/tests/data/test_659_B b/bottleneck/tests/data/test_659_B new file mode 100644 index 0000000..c3cfbeb --- /dev/null +++ b/bottleneck/tests/data/test_659_B @@ -0,0 +1,3 @@ +318 1245 +561 1013 +787 1275 diff --git a/bottleneck/tests/data/test_660_A b/bottleneck/tests/data/test_660_A new file mode 100644 index 0000000..1c408f3 --- /dev/null +++ b/bottleneck/tests/data/test_660_A @@ -0,0 +1,4 @@ +526 757 +355 743 +250 1221 +35 439 diff --git a/bottleneck/tests/data/test_660_B b/bottleneck/tests/data/test_660_B new file mode 100644 index 0000000..5fffa69 --- /dev/null +++ b/bottleneck/tests/data/test_660_B @@ -0,0 +1,4 @@ +348 611 +127 398 +839 1650 +136 803 diff --git a/bottleneck/tests/data/test_661_A b/bottleneck/tests/data/test_661_A new file mode 100644 index 0000000..df0d8ad --- /dev/null +++ b/bottleneck/tests/data/test_661_A @@ -0,0 +1,4 @@ +769 905 +534 1227 +410 422 +937 1744 diff --git a/bottleneck/tests/data/test_661_B b/bottleneck/tests/data/test_661_B new file mode 100644 index 0000000..56cfa0c --- /dev/null +++ b/bottleneck/tests/data/test_661_B @@ -0,0 +1,4 @@ +19 350 +255 390 +910 1001 +853 1070 diff --git a/bottleneck/tests/data/test_662_A b/bottleneck/tests/data/test_662_A new file mode 100644 index 0000000..cb65a38 --- /dev/null +++ b/bottleneck/tests/data/test_662_A @@ -0,0 +1,4 @@ +394 674 +364 1209 +763 1333 +344 1294 diff --git a/bottleneck/tests/data/test_662_B b/bottleneck/tests/data/test_662_B new file mode 100644 index 0000000..92f0ee6 --- /dev/null +++ b/bottleneck/tests/data/test_662_B @@ -0,0 +1,4 @@ +324 939 +829 987 +210 998 +519 756 diff --git a/bottleneck/tests/data/test_663_A b/bottleneck/tests/data/test_663_A new file mode 100644 index 0000000..ed35031 --- /dev/null +++ b/bottleneck/tests/data/test_663_A @@ -0,0 +1,4 @@ +659 1254 +201 1188 +660 811 +630 1044 diff --git a/bottleneck/tests/data/test_663_B b/bottleneck/tests/data/test_663_B new file mode 100644 index 0000000..6a6126c --- /dev/null +++ b/bottleneck/tests/data/test_663_B @@ -0,0 +1,4 @@ +873 914 +441 1063 +135 468 +584 620 diff --git a/bottleneck/tests/data/test_664_A b/bottleneck/tests/data/test_664_A new file mode 100644 index 0000000..59f6bfa --- /dev/null +++ b/bottleneck/tests/data/test_664_A @@ -0,0 +1,4 @@ +753 1625 +353 1109 +565 650 +321 708 diff --git a/bottleneck/tests/data/test_664_B b/bottleneck/tests/data/test_664_B new file mode 100644 index 0000000..6b34a5f --- /dev/null +++ b/bottleneck/tests/data/test_664_B @@ -0,0 +1,4 @@ +664 794 +572 1058 +754 1119 +899 1445 diff --git a/bottleneck/tests/data/test_665_A b/bottleneck/tests/data/test_665_A new file mode 100644 index 0000000..ff6ce72 --- /dev/null +++ b/bottleneck/tests/data/test_665_A @@ -0,0 +1,4 @@ +661 1260 +232 833 +820 826 +32 139 diff --git a/bottleneck/tests/data/test_665_B b/bottleneck/tests/data/test_665_B new file mode 100644 index 0000000..9a5d4a9 --- /dev/null +++ b/bottleneck/tests/data/test_665_B @@ -0,0 +1,4 @@ +466 1319 +809 1762 +165 235 +636 1460 diff --git a/bottleneck/tests/data/test_666_A b/bottleneck/tests/data/test_666_A new file mode 100644 index 0000000..455e262 --- /dev/null +++ b/bottleneck/tests/data/test_666_A @@ -0,0 +1,4 @@ +496 1447 +606 1017 +578 767 +971 1768 diff --git a/bottleneck/tests/data/test_666_B b/bottleneck/tests/data/test_666_B new file mode 100644 index 0000000..0c9069e --- /dev/null +++ b/bottleneck/tests/data/test_666_B @@ -0,0 +1,4 @@ +578 896 +731 1115 +455 1129 +649 1421 diff --git a/bottleneck/tests/data/test_667_A b/bottleneck/tests/data/test_667_A new file mode 100644 index 0000000..054d14e --- /dev/null +++ b/bottleneck/tests/data/test_667_A @@ -0,0 +1,4 @@ +537 1030 +887 1179 +644 905 +403 1382 diff --git a/bottleneck/tests/data/test_667_B b/bottleneck/tests/data/test_667_B new file mode 100644 index 0000000..a4a432a --- /dev/null +++ b/bottleneck/tests/data/test_667_B @@ -0,0 +1,4 @@ +981 1100 +582 1487 +603 1448 +526 1059 diff --git a/bottleneck/tests/data/test_668_A b/bottleneck/tests/data/test_668_A new file mode 100644 index 0000000..00c5554 --- /dev/null +++ b/bottleneck/tests/data/test_668_A @@ -0,0 +1,4 @@ +376 564 +803 1414 +324 973 +901 1266 diff --git a/bottleneck/tests/data/test_668_B b/bottleneck/tests/data/test_668_B new file mode 100644 index 0000000..5b7e07c --- /dev/null +++ b/bottleneck/tests/data/test_668_B @@ -0,0 +1,4 @@ +901 1627 +805 1168 +867 1069 +156 291 diff --git a/bottleneck/tests/data/test_669_A b/bottleneck/tests/data/test_669_A new file mode 100644 index 0000000..2abb014 --- /dev/null +++ b/bottleneck/tests/data/test_669_A @@ -0,0 +1,4 @@ +282 848 +560 1190 +152 342 +998 1524 diff --git a/bottleneck/tests/data/test_669_B b/bottleneck/tests/data/test_669_B new file mode 100644 index 0000000..5694ce9 --- /dev/null +++ b/bottleneck/tests/data/test_669_B @@ -0,0 +1,4 @@ +398 731 +835 1681 +791 1026 +939 1024 diff --git a/bottleneck/tests/data/test_670_A b/bottleneck/tests/data/test_670_A new file mode 100644 index 0000000..e7ae4f1 --- /dev/null +++ b/bottleneck/tests/data/test_670_A @@ -0,0 +1,4 @@ +665 1146 +512 1332 +375 595 +566 1211 diff --git a/bottleneck/tests/data/test_670_B b/bottleneck/tests/data/test_670_B new file mode 100644 index 0000000..8f6b057 --- /dev/null +++ b/bottleneck/tests/data/test_670_B @@ -0,0 +1,4 @@ +203 469 +966 1146 +342 638 +290 498 diff --git a/bottleneck/tests/data/test_671_A b/bottleneck/tests/data/test_671_A new file mode 100644 index 0000000..8ac70f3 --- /dev/null +++ b/bottleneck/tests/data/test_671_A @@ -0,0 +1,4 @@ +533 1333 +682 1127 +928 1703 +487 781 diff --git a/bottleneck/tests/data/test_671_B b/bottleneck/tests/data/test_671_B new file mode 100644 index 0000000..bcb5f1b --- /dev/null +++ b/bottleneck/tests/data/test_671_B @@ -0,0 +1,4 @@ +336 1128 +992 1292 +931 1497 +622 1165 diff --git a/bottleneck/tests/data/test_672_A b/bottleneck/tests/data/test_672_A new file mode 100644 index 0000000..4ca2b19 --- /dev/null +++ b/bottleneck/tests/data/test_672_A @@ -0,0 +1,4 @@ +30 600 +893 1394 +112 776 +434 905 diff --git a/bottleneck/tests/data/test_672_B b/bottleneck/tests/data/test_672_B new file mode 100644 index 0000000..29b8d76 --- /dev/null +++ b/bottleneck/tests/data/test_672_B @@ -0,0 +1,4 @@ +684 1559 +372 1171 +113 700 +180 865 diff --git a/bottleneck/tests/data/test_673_A b/bottleneck/tests/data/test_673_A new file mode 100644 index 0000000..f6e6e4a --- /dev/null +++ b/bottleneck/tests/data/test_673_A @@ -0,0 +1,4 @@ +894 1455 +676 1502 +402 976 +863 1258 diff --git a/bottleneck/tests/data/test_673_B b/bottleneck/tests/data/test_673_B new file mode 100644 index 0000000..01ac9c7 --- /dev/null +++ b/bottleneck/tests/data/test_673_B @@ -0,0 +1,4 @@ +190 473 +420 1059 +187 827 +482 1365 diff --git a/bottleneck/tests/data/test_674_A b/bottleneck/tests/data/test_674_A new file mode 100644 index 0000000..8bbf6ad --- /dev/null +++ b/bottleneck/tests/data/test_674_A @@ -0,0 +1,4 @@ +89 681 +460 781 +500 679 +786 827 diff --git a/bottleneck/tests/data/test_674_B b/bottleneck/tests/data/test_674_B new file mode 100644 index 0000000..ddebd4c --- /dev/null +++ b/bottleneck/tests/data/test_674_B @@ -0,0 +1,4 @@ +445 1261 +769 1735 +5 81 +964 1477 diff --git a/bottleneck/tests/data/test_675_A b/bottleneck/tests/data/test_675_A new file mode 100644 index 0000000..30b36bb --- /dev/null +++ b/bottleneck/tests/data/test_675_A @@ -0,0 +1,4 @@ +507 965 +1000 1816 +946 1201 +926 1637 diff --git a/bottleneck/tests/data/test_675_B b/bottleneck/tests/data/test_675_B new file mode 100644 index 0000000..c0722ef --- /dev/null +++ b/bottleneck/tests/data/test_675_B @@ -0,0 +1,4 @@ +302 1162 +795 1527 +602 747 +646 683 diff --git a/bottleneck/tests/data/test_676_A b/bottleneck/tests/data/test_676_A new file mode 100644 index 0000000..b43ef5e --- /dev/null +++ b/bottleneck/tests/data/test_676_A @@ -0,0 +1,4 @@ +343 1040 +556 758 +286 983 +467 700 diff --git a/bottleneck/tests/data/test_676_B b/bottleneck/tests/data/test_676_B new file mode 100644 index 0000000..59b2fb6 --- /dev/null +++ b/bottleneck/tests/data/test_676_B @@ -0,0 +1,4 @@ +446 1062 +65 988 +159 1102 +920 1553 diff --git a/bottleneck/tests/data/test_677_A b/bottleneck/tests/data/test_677_A new file mode 100644 index 0000000..4d9d36e --- /dev/null +++ b/bottleneck/tests/data/test_677_A @@ -0,0 +1,4 @@ +355 949 +561 704 +153 945 +407 1134 diff --git a/bottleneck/tests/data/test_677_B b/bottleneck/tests/data/test_677_B new file mode 100644 index 0000000..4edf573 --- /dev/null +++ b/bottleneck/tests/data/test_677_B @@ -0,0 +1,4 @@ +758 962 +354 535 +115 782 +309 1207 diff --git a/bottleneck/tests/data/test_678_A b/bottleneck/tests/data/test_678_A new file mode 100644 index 0000000..54ab668 --- /dev/null +++ b/bottleneck/tests/data/test_678_A @@ -0,0 +1,4 @@ +946 1489 +594 1446 +686 986 +200 493 diff --git a/bottleneck/tests/data/test_678_B b/bottleneck/tests/data/test_678_B new file mode 100644 index 0000000..f695f5f --- /dev/null +++ b/bottleneck/tests/data/test_678_B @@ -0,0 +1,4 @@ +708 725 +761 1309 +47 963 +61 320 diff --git a/bottleneck/tests/data/test_679_A b/bottleneck/tests/data/test_679_A new file mode 100644 index 0000000..33e4ce8 --- /dev/null +++ b/bottleneck/tests/data/test_679_A @@ -0,0 +1,4 @@ +153 950 +179 1047 +736 845 +943 1760 diff --git a/bottleneck/tests/data/test_679_B b/bottleneck/tests/data/test_679_B new file mode 100644 index 0000000..a99ec77 --- /dev/null +++ b/bottleneck/tests/data/test_679_B @@ -0,0 +1,4 @@ +744 1423 +669 1350 +989 1062 +57 823 diff --git a/bottleneck/tests/data/test_680_A b/bottleneck/tests/data/test_680_A new file mode 100644 index 0000000..4bb43a8 --- /dev/null +++ b/bottleneck/tests/data/test_680_A @@ -0,0 +1,5 @@ +102 183 +847 1835 +300 1098 +953 1849 +327 1070 diff --git a/bottleneck/tests/data/test_680_B b/bottleneck/tests/data/test_680_B new file mode 100644 index 0000000..efb704f --- /dev/null +++ b/bottleneck/tests/data/test_680_B @@ -0,0 +1,5 @@ +917 1904 +340 1190 +128 516 +695 1474 +450 628 diff --git a/bottleneck/tests/data/test_681_A b/bottleneck/tests/data/test_681_A new file mode 100644 index 0000000..5eb7d6a --- /dev/null +++ b/bottleneck/tests/data/test_681_A @@ -0,0 +1,5 @@ +882 1558 +108 921 +479 653 +329 533 +643 952 diff --git a/bottleneck/tests/data/test_681_B b/bottleneck/tests/data/test_681_B new file mode 100644 index 0000000..092ddc5 --- /dev/null +++ b/bottleneck/tests/data/test_681_B @@ -0,0 +1,5 @@ +155 350 +686 1081 +791 900 +402 653 +364 610 diff --git a/bottleneck/tests/data/test_682_A b/bottleneck/tests/data/test_682_A new file mode 100644 index 0000000..7898cba --- /dev/null +++ b/bottleneck/tests/data/test_682_A @@ -0,0 +1,5 @@ +548 632 +839 990 +856 1008 +719 1091 +532 1445 diff --git a/bottleneck/tests/data/test_682_B b/bottleneck/tests/data/test_682_B new file mode 100644 index 0000000..f5b1d81 --- /dev/null +++ b/bottleneck/tests/data/test_682_B @@ -0,0 +1,5 @@ +341 429 +146 682 +40 962 +543 1339 +277 944 diff --git a/bottleneck/tests/data/test_683_A b/bottleneck/tests/data/test_683_A new file mode 100644 index 0000000..3661bfc --- /dev/null +++ b/bottleneck/tests/data/test_683_A @@ -0,0 +1,5 @@ +227 587 +365 708 +565 1465 +240 248 +610 1328 diff --git a/bottleneck/tests/data/test_683_B b/bottleneck/tests/data/test_683_B new file mode 100644 index 0000000..62c998b --- /dev/null +++ b/bottleneck/tests/data/test_683_B @@ -0,0 +1,5 @@ +741 1553 +314 914 +980 1322 +398 1163 +304 901 diff --git a/bottleneck/tests/data/test_684_A b/bottleneck/tests/data/test_684_A new file mode 100644 index 0000000..b22afe3 --- /dev/null +++ b/bottleneck/tests/data/test_684_A @@ -0,0 +1,5 @@ +196 1047 +489 739 +11 758 +204 1069 +959 976 diff --git a/bottleneck/tests/data/test_684_B b/bottleneck/tests/data/test_684_B new file mode 100644 index 0000000..cbede63 --- /dev/null +++ b/bottleneck/tests/data/test_684_B @@ -0,0 +1,5 @@ +391 1180 +229 906 +246 1219 +564 1171 +797 1273 diff --git a/bottleneck/tests/data/test_685_A b/bottleneck/tests/data/test_685_A new file mode 100644 index 0000000..c4bd0e9 --- /dev/null +++ b/bottleneck/tests/data/test_685_A @@ -0,0 +1,5 @@ +628 762 +148 921 +694 1155 +865 1298 +365 1337 diff --git a/bottleneck/tests/data/test_685_B b/bottleneck/tests/data/test_685_B new file mode 100644 index 0000000..984dd98 --- /dev/null +++ b/bottleneck/tests/data/test_685_B @@ -0,0 +1,5 @@ +504 1226 +608 1576 +256 475 +479 884 +384 656 diff --git a/bottleneck/tests/data/test_686_A b/bottleneck/tests/data/test_686_A new file mode 100644 index 0000000..e498d5c --- /dev/null +++ b/bottleneck/tests/data/test_686_A @@ -0,0 +1,5 @@ +839 1291 +140 808 +539 720 +928 1729 +881 1126 diff --git a/bottleneck/tests/data/test_686_B b/bottleneck/tests/data/test_686_B new file mode 100644 index 0000000..56ada59 --- /dev/null +++ b/bottleneck/tests/data/test_686_B @@ -0,0 +1,5 @@ +280 962 +935 1205 +328 1022 +27 247 +554 732 diff --git a/bottleneck/tests/data/test_687_A b/bottleneck/tests/data/test_687_A new file mode 100644 index 0000000..c31c2d2 --- /dev/null +++ b/bottleneck/tests/data/test_687_A @@ -0,0 +1,5 @@ +323 954 +507 885 +533 1044 +679 1402 +43 918 diff --git a/bottleneck/tests/data/test_687_B b/bottleneck/tests/data/test_687_B new file mode 100644 index 0000000..471eeed --- /dev/null +++ b/bottleneck/tests/data/test_687_B @@ -0,0 +1,5 @@ +243 823 +269 1215 +449 1214 +24 777 +705 1558 diff --git a/bottleneck/tests/data/test_688_A b/bottleneck/tests/data/test_688_A new file mode 100644 index 0000000..7396099 --- /dev/null +++ b/bottleneck/tests/data/test_688_A @@ -0,0 +1,5 @@ +471 989 +319 432 +130 900 +856 1389 +422 635 diff --git a/bottleneck/tests/data/test_688_B b/bottleneck/tests/data/test_688_B new file mode 100644 index 0000000..e133e74 --- /dev/null +++ b/bottleneck/tests/data/test_688_B @@ -0,0 +1,5 @@ +13 373 +575 1199 +553 1347 +158 1148 +111 393 diff --git a/bottleneck/tests/data/test_689_A b/bottleneck/tests/data/test_689_A new file mode 100644 index 0000000..72febe7 --- /dev/null +++ b/bottleneck/tests/data/test_689_A @@ -0,0 +1,5 @@ +451 1035 +293 380 +400 648 +9 681 +85 96 diff --git a/bottleneck/tests/data/test_689_B b/bottleneck/tests/data/test_689_B new file mode 100644 index 0000000..f684387 --- /dev/null +++ b/bottleneck/tests/data/test_689_B @@ -0,0 +1,5 @@ +431 1117 +40 969 +54 1026 +297 710 +722 1143 diff --git a/bottleneck/tests/data/test_690_A b/bottleneck/tests/data/test_690_A new file mode 100644 index 0000000..4106f49 --- /dev/null +++ b/bottleneck/tests/data/test_690_A @@ -0,0 +1,5 @@ +624 1464 +228 1205 +638 876 +896 1632 +564 1378 diff --git a/bottleneck/tests/data/test_690_B b/bottleneck/tests/data/test_690_B new file mode 100644 index 0000000..d452cff --- /dev/null +++ b/bottleneck/tests/data/test_690_B @@ -0,0 +1,5 @@ +745 1386 +574 898 +472 1427 +922 1325 +592 1053 diff --git a/bottleneck/tests/data/test_691_A b/bottleneck/tests/data/test_691_A new file mode 100644 index 0000000..b6c906e --- /dev/null +++ b/bottleneck/tests/data/test_691_A @@ -0,0 +1,5 @@ +291 1111 +75 251 +47 913 +753 1632 +582 739 diff --git a/bottleneck/tests/data/test_691_B b/bottleneck/tests/data/test_691_B new file mode 100644 index 0000000..57e58ff --- /dev/null +++ b/bottleneck/tests/data/test_691_B @@ -0,0 +1,5 @@ +264 911 +478 839 +182 258 +336 1121 +915 1764 diff --git a/bottleneck/tests/data/test_692_A b/bottleneck/tests/data/test_692_A new file mode 100644 index 0000000..1686c25 --- /dev/null +++ b/bottleneck/tests/data/test_692_A @@ -0,0 +1,5 @@ +856 1460 +852 1085 +246 328 +508 1202 +900 1487 diff --git a/bottleneck/tests/data/test_692_B b/bottleneck/tests/data/test_692_B new file mode 100644 index 0000000..bf6174a --- /dev/null +++ b/bottleneck/tests/data/test_692_B @@ -0,0 +1,5 @@ +624 1180 +247 889 +218 373 +823 1637 +439 597 diff --git a/bottleneck/tests/data/test_693_A b/bottleneck/tests/data/test_693_A new file mode 100644 index 0000000..ea16ba6 --- /dev/null +++ b/bottleneck/tests/data/test_693_A @@ -0,0 +1,5 @@ +37 175 +952 1934 +808 843 +742 822 +75 863 diff --git a/bottleneck/tests/data/test_693_B b/bottleneck/tests/data/test_693_B new file mode 100644 index 0000000..52c8f97 --- /dev/null +++ b/bottleneck/tests/data/test_693_B @@ -0,0 +1,5 @@ +431 1287 +490 765 +552 843 +179 1131 +334 732 diff --git a/bottleneck/tests/data/test_694_A b/bottleneck/tests/data/test_694_A new file mode 100644 index 0000000..e577a0f --- /dev/null +++ b/bottleneck/tests/data/test_694_A @@ -0,0 +1,5 @@ +917 1066 +928 1036 +611 1593 +682 1661 +561 810 diff --git a/bottleneck/tests/data/test_694_B b/bottleneck/tests/data/test_694_B new file mode 100644 index 0000000..e406840 --- /dev/null +++ b/bottleneck/tests/data/test_694_B @@ -0,0 +1,5 @@ +754 918 +735 1730 +430 1284 +588 986 +56 791 diff --git a/bottleneck/tests/data/test_695_A b/bottleneck/tests/data/test_695_A new file mode 100644 index 0000000..ef9cacb --- /dev/null +++ b/bottleneck/tests/data/test_695_A @@ -0,0 +1,5 @@ +219 629 +438 1008 +695 1385 +137 844 +394 1126 diff --git a/bottleneck/tests/data/test_695_B b/bottleneck/tests/data/test_695_B new file mode 100644 index 0000000..f2bb91b --- /dev/null +++ b/bottleneck/tests/data/test_695_B @@ -0,0 +1,5 @@ +556 1218 +942 975 +730 1199 +110 947 +867 1613 diff --git a/bottleneck/tests/data/test_696_A b/bottleneck/tests/data/test_696_A new file mode 100644 index 0000000..71fa19f --- /dev/null +++ b/bottleneck/tests/data/test_696_A @@ -0,0 +1,5 @@ +929 1104 +287 561 +801 1419 +549 1265 +758 795 diff --git a/bottleneck/tests/data/test_696_B b/bottleneck/tests/data/test_696_B new file mode 100644 index 0000000..a964c63 --- /dev/null +++ b/bottleneck/tests/data/test_696_B @@ -0,0 +1,5 @@ +446 641 +863 1426 +0 382 +659 945 +707 715 diff --git a/bottleneck/tests/data/test_697_A b/bottleneck/tests/data/test_697_A new file mode 100644 index 0000000..848e417 --- /dev/null +++ b/bottleneck/tests/data/test_697_A @@ -0,0 +1,5 @@ +876 1854 +147 864 +249 1095 +965 1723 +548 865 diff --git a/bottleneck/tests/data/test_697_B b/bottleneck/tests/data/test_697_B new file mode 100644 index 0000000..98a8d15 --- /dev/null +++ b/bottleneck/tests/data/test_697_B @@ -0,0 +1,5 @@ +478 1175 +40 533 +212 388 +865 1736 +697 1335 diff --git a/bottleneck/tests/data/test_698_A b/bottleneck/tests/data/test_698_A new file mode 100644 index 0000000..a90620d --- /dev/null +++ b/bottleneck/tests/data/test_698_A @@ -0,0 +1,5 @@ +714 1561 +967 1649 +57 65 +560 807 +451 1000 diff --git a/bottleneck/tests/data/test_698_B b/bottleneck/tests/data/test_698_B new file mode 100644 index 0000000..ef52ae0 --- /dev/null +++ b/bottleneck/tests/data/test_698_B @@ -0,0 +1,5 @@ +909 1809 +266 758 +894 1395 +495 1481 +91 646 diff --git a/bottleneck/tests/data/test_699_A b/bottleneck/tests/data/test_699_A new file mode 100644 index 0000000..e00215d --- /dev/null +++ b/bottleneck/tests/data/test_699_A @@ -0,0 +1,5 @@ +749 799 +150 307 +463 1009 +503 1047 +613 1549 diff --git a/bottleneck/tests/data/test_699_B b/bottleneck/tests/data/test_699_B new file mode 100644 index 0000000..0fff210 --- /dev/null +++ b/bottleneck/tests/data/test_699_B @@ -0,0 +1,5 @@ +915 1430 +582 685 +994 1491 +227 869 +251 1173 diff --git a/bottleneck/tests/data/test_700_A b/bottleneck/tests/data/test_700_A new file mode 100644 index 0000000..9425b73 --- /dev/null +++ b/bottleneck/tests/data/test_700_A @@ -0,0 +1,6 @@ +313 977 +396 888 +244 339 +474 1072 +191 1069 +519 940 diff --git a/bottleneck/tests/data/test_700_B b/bottleneck/tests/data/test_700_B new file mode 100644 index 0000000..19944b2 --- /dev/null +++ b/bottleneck/tests/data/test_700_B @@ -0,0 +1,6 @@ +547 588 +852 1072 +34 817 +54 441 +222 413 +184 888 diff --git a/bottleneck/tests/data/test_701_A b/bottleneck/tests/data/test_701_A new file mode 100644 index 0000000..062d6fb --- /dev/null +++ b/bottleneck/tests/data/test_701_A @@ -0,0 +1,6 @@ +582 910 +701 1226 +195 619 +541 668 +275 1161 +322 1041 diff --git a/bottleneck/tests/data/test_701_B b/bottleneck/tests/data/test_701_B new file mode 100644 index 0000000..3149c7c --- /dev/null +++ b/bottleneck/tests/data/test_701_B @@ -0,0 +1,6 @@ +868 1747 +559 1027 +635 1354 +337 541 +630 1220 +860 1681 diff --git a/bottleneck/tests/data/test_702_A b/bottleneck/tests/data/test_702_A new file mode 100644 index 0000000..2a82935 --- /dev/null +++ b/bottleneck/tests/data/test_702_A @@ -0,0 +1,6 @@ +378 869 +890 1016 +13 941 +706 1365 +879 1261 +334 864 diff --git a/bottleneck/tests/data/test_702_B b/bottleneck/tests/data/test_702_B new file mode 100644 index 0000000..c3854d5 --- /dev/null +++ b/bottleneck/tests/data/test_702_B @@ -0,0 +1,6 @@ +381 525 +852 1350 +825 884 +984 1542 +614 942 +74 652 diff --git a/bottleneck/tests/data/test_703_A b/bottleneck/tests/data/test_703_A new file mode 100644 index 0000000..fb434c0 --- /dev/null +++ b/bottleneck/tests/data/test_703_A @@ -0,0 +1,6 @@ +551 801 +116 205 +364 382 +883 1597 +834 1212 +737 988 diff --git a/bottleneck/tests/data/test_703_B b/bottleneck/tests/data/test_703_B new file mode 100644 index 0000000..f8af9dd --- /dev/null +++ b/bottleneck/tests/data/test_703_B @@ -0,0 +1,6 @@ +661 695 +904 1528 +65 986 +691 785 +98 1000 +102 592 diff --git a/bottleneck/tests/data/test_704_A b/bottleneck/tests/data/test_704_A new file mode 100644 index 0000000..a89a1aa --- /dev/null +++ b/bottleneck/tests/data/test_704_A @@ -0,0 +1,6 @@ +679 1424 +746 1074 +761 1546 +360 934 +139 855 +942 1002 diff --git a/bottleneck/tests/data/test_704_B b/bottleneck/tests/data/test_704_B new file mode 100644 index 0000000..5abc5fa --- /dev/null +++ b/bottleneck/tests/data/test_704_B @@ -0,0 +1,6 @@ +781 1388 +48 645 +242 294 +979 1071 +348 1065 +701 1351 diff --git a/bottleneck/tests/data/test_705_A b/bottleneck/tests/data/test_705_A new file mode 100644 index 0000000..924a661 --- /dev/null +++ b/bottleneck/tests/data/test_705_A @@ -0,0 +1,6 @@ +123 751 +405 935 +708 1217 +540 708 +810 1047 +346 1088 diff --git a/bottleneck/tests/data/test_705_B b/bottleneck/tests/data/test_705_B new file mode 100644 index 0000000..0681a80 --- /dev/null +++ b/bottleneck/tests/data/test_705_B @@ -0,0 +1,6 @@ +175 1150 +840 1056 +180 658 +805 1787 +123 467 +947 1539 diff --git a/bottleneck/tests/data/test_706_A b/bottleneck/tests/data/test_706_A new file mode 100644 index 0000000..0a249be --- /dev/null +++ b/bottleneck/tests/data/test_706_A @@ -0,0 +1,6 @@ +900 1181 +555 663 +1 750 +883 1197 +33 518 +450 808 diff --git a/bottleneck/tests/data/test_706_B b/bottleneck/tests/data/test_706_B new file mode 100644 index 0000000..624923c --- /dev/null +++ b/bottleneck/tests/data/test_706_B @@ -0,0 +1,6 @@ +682 818 +814 1240 +900 1777 +399 967 +420 921 +723 1022 diff --git a/bottleneck/tests/data/test_707_A b/bottleneck/tests/data/test_707_A new file mode 100644 index 0000000..a251b74 --- /dev/null +++ b/bottleneck/tests/data/test_707_A @@ -0,0 +1,6 @@ +991 1398 +632 1322 +635 1448 +97 955 +793 1016 +995 1832 diff --git a/bottleneck/tests/data/test_707_B b/bottleneck/tests/data/test_707_B new file mode 100644 index 0000000..2647b31 --- /dev/null +++ b/bottleneck/tests/data/test_707_B @@ -0,0 +1,6 @@ +320 551 +552 1125 +383 551 +891 1032 +272 1038 +925 1695 diff --git a/bottleneck/tests/data/test_708_A b/bottleneck/tests/data/test_708_A new file mode 100644 index 0000000..ddc601a --- /dev/null +++ b/bottleneck/tests/data/test_708_A @@ -0,0 +1,6 @@ +681 786 +125 980 +146 721 +769 1207 +504 1208 +724 985 diff --git a/bottleneck/tests/data/test_708_B b/bottleneck/tests/data/test_708_B new file mode 100644 index 0000000..0a64a4f --- /dev/null +++ b/bottleneck/tests/data/test_708_B @@ -0,0 +1,6 @@ +571 697 +763 1635 +573 623 +683 1438 +783 1580 +541 1374 diff --git a/bottleneck/tests/data/test_709_A b/bottleneck/tests/data/test_709_A new file mode 100644 index 0000000..2d3aa30 --- /dev/null +++ b/bottleneck/tests/data/test_709_A @@ -0,0 +1,6 @@ +704 1089 +764 1349 +322 1100 +731 1284 +42 525 +49 602 diff --git a/bottleneck/tests/data/test_709_B b/bottleneck/tests/data/test_709_B new file mode 100644 index 0000000..c5f7233 --- /dev/null +++ b/bottleneck/tests/data/test_709_B @@ -0,0 +1,6 @@ +435 502 +150 1140 +356 1273 +592 1292 +552 1331 +905 1713 diff --git a/bottleneck/tests/data/test_710_A b/bottleneck/tests/data/test_710_A new file mode 100644 index 0000000..e611f5a --- /dev/null +++ b/bottleneck/tests/data/test_710_A @@ -0,0 +1,6 @@ +257 589 +18 966 +482 1110 +588 763 +989 1857 +479 494 diff --git a/bottleneck/tests/data/test_710_B b/bottleneck/tests/data/test_710_B new file mode 100644 index 0000000..cd9cedb --- /dev/null +++ b/bottleneck/tests/data/test_710_B @@ -0,0 +1,6 @@ +2 263 +642 884 +72 321 +632 1186 +633 1310 +263 1219 diff --git a/bottleneck/tests/data/test_711_A b/bottleneck/tests/data/test_711_A new file mode 100644 index 0000000..900b87a --- /dev/null +++ b/bottleneck/tests/data/test_711_A @@ -0,0 +1,6 @@ +954 1912 +243 556 +758 967 +836 1102 +184 1134 +401 434 diff --git a/bottleneck/tests/data/test_711_B b/bottleneck/tests/data/test_711_B new file mode 100644 index 0000000..31dd505 --- /dev/null +++ b/bottleneck/tests/data/test_711_B @@ -0,0 +1,6 @@ +454 1045 +606 646 +999 1478 +398 845 +743 1192 +926 1080 diff --git a/bottleneck/tests/data/test_712_A b/bottleneck/tests/data/test_712_A new file mode 100644 index 0000000..15bc0a2 --- /dev/null +++ b/bottleneck/tests/data/test_712_A @@ -0,0 +1,6 @@ +395 1052 +984 1461 +792 801 +652 1183 +411 744 +830 876 diff --git a/bottleneck/tests/data/test_712_B b/bottleneck/tests/data/test_712_B new file mode 100644 index 0000000..3071ea5 --- /dev/null +++ b/bottleneck/tests/data/test_712_B @@ -0,0 +1,6 @@ +16 294 +910 1274 +495 1113 +4 944 +244 512 +164 1074 diff --git a/bottleneck/tests/data/test_713_A b/bottleneck/tests/data/test_713_A new file mode 100644 index 0000000..89ee240 --- /dev/null +++ b/bottleneck/tests/data/test_713_A @@ -0,0 +1,6 @@ +588 1259 +827 1531 +94 877 +171 1137 +482 729 +879 1065 diff --git a/bottleneck/tests/data/test_713_B b/bottleneck/tests/data/test_713_B new file mode 100644 index 0000000..f2b501c --- /dev/null +++ b/bottleneck/tests/data/test_713_B @@ -0,0 +1,6 @@ +222 623 +527 1158 +784 1040 +597 1063 +456 525 +713 1476 diff --git a/bottleneck/tests/data/test_714_A b/bottleneck/tests/data/test_714_A new file mode 100644 index 0000000..73ba892 --- /dev/null +++ b/bottleneck/tests/data/test_714_A @@ -0,0 +1,6 @@ +81 1045 +398 727 +668 1311 +788 1623 +363 1222 +630 757 diff --git a/bottleneck/tests/data/test_714_B b/bottleneck/tests/data/test_714_B new file mode 100644 index 0000000..c495e7a --- /dev/null +++ b/bottleneck/tests/data/test_714_B @@ -0,0 +1,6 @@ +840 1651 +664 995 +984 1812 +501 1183 +859 1373 +224 321 diff --git a/bottleneck/tests/data/test_715_A b/bottleneck/tests/data/test_715_A new file mode 100644 index 0000000..70b698d --- /dev/null +++ b/bottleneck/tests/data/test_715_A @@ -0,0 +1,6 @@ +390 400 +914 963 +118 182 +848 1799 +24 207 +310 917 diff --git a/bottleneck/tests/data/test_715_B b/bottleneck/tests/data/test_715_B new file mode 100644 index 0000000..3cdf2b3 --- /dev/null +++ b/bottleneck/tests/data/test_715_B @@ -0,0 +1,6 @@ +999 1621 +121 432 +878 1064 +454 925 +642 1350 +976 1667 diff --git a/bottleneck/tests/data/test_716_A b/bottleneck/tests/data/test_716_A new file mode 100644 index 0000000..ada9ac0 --- /dev/null +++ b/bottleneck/tests/data/test_716_A @@ -0,0 +1,6 @@ +838 1400 +274 999 +806 1428 +957 1203 +48 503 +600 754 diff --git a/bottleneck/tests/data/test_716_B b/bottleneck/tests/data/test_716_B new file mode 100644 index 0000000..b13c8a1 --- /dev/null +++ b/bottleneck/tests/data/test_716_B @@ -0,0 +1,6 @@ +64 560 +385 907 +324 1041 +611 868 +685 1605 +320 733 diff --git a/bottleneck/tests/data/test_717_A b/bottleneck/tests/data/test_717_A new file mode 100644 index 0000000..f23e351 --- /dev/null +++ b/bottleneck/tests/data/test_717_A @@ -0,0 +1,6 @@ +435 538 +281 369 +230 609 +932 1150 +629 1558 +397 511 diff --git a/bottleneck/tests/data/test_717_B b/bottleneck/tests/data/test_717_B new file mode 100644 index 0000000..150f7ff --- /dev/null +++ b/bottleneck/tests/data/test_717_B @@ -0,0 +1,6 @@ +293 1253 +356 1075 +559 754 +309 911 +726 1445 +539 1249 diff --git a/bottleneck/tests/data/test_718_A b/bottleneck/tests/data/test_718_A new file mode 100644 index 0000000..6efc756 --- /dev/null +++ b/bottleneck/tests/data/test_718_A @@ -0,0 +1,6 @@ +289 455 +404 1182 +924 1629 +961 1779 +392 1078 +881 1571 diff --git a/bottleneck/tests/data/test_718_B b/bottleneck/tests/data/test_718_B new file mode 100644 index 0000000..4e45db1 --- /dev/null +++ b/bottleneck/tests/data/test_718_B @@ -0,0 +1,6 @@ +666 983 +482 1016 +609 1498 +352 882 +92 384 +911 1898 diff --git a/bottleneck/tests/data/test_719_A b/bottleneck/tests/data/test_719_A new file mode 100644 index 0000000..3512e1f --- /dev/null +++ b/bottleneck/tests/data/test_719_A @@ -0,0 +1,6 @@ +589 1272 +999 1340 +628 1428 +112 311 +854 1288 +579 1034 diff --git a/bottleneck/tests/data/test_719_B b/bottleneck/tests/data/test_719_B new file mode 100644 index 0000000..028f44a --- /dev/null +++ b/bottleneck/tests/data/test_719_B @@ -0,0 +1,6 @@ +223 460 +798 1620 +582 901 +542 835 +309 851 +28 133 diff --git a/bottleneck/tests/data/test_720_A b/bottleneck/tests/data/test_720_A new file mode 100644 index 0000000..57e2829 --- /dev/null +++ b/bottleneck/tests/data/test_720_A @@ -0,0 +1,7 @@ +842 955 +876 1162 +447 481 +217 1212 +392 731 +112 940 +462 796 diff --git a/bottleneck/tests/data/test_720_B b/bottleneck/tests/data/test_720_B new file mode 100644 index 0000000..f3f2675 --- /dev/null +++ b/bottleneck/tests/data/test_720_B @@ -0,0 +1,7 @@ +768 1167 +970 1497 +720 809 +848 1278 +264 387 +443 673 +481 643 diff --git a/bottleneck/tests/data/test_721_A b/bottleneck/tests/data/test_721_A new file mode 100644 index 0000000..f8a7f29 --- /dev/null +++ b/bottleneck/tests/data/test_721_A @@ -0,0 +1,7 @@ +712 1082 +573 1189 +468 579 +431 1140 +543 758 +852 1545 +707 1585 diff --git a/bottleneck/tests/data/test_721_B b/bottleneck/tests/data/test_721_B new file mode 100644 index 0000000..35b828c --- /dev/null +++ b/bottleneck/tests/data/test_721_B @@ -0,0 +1,7 @@ +274 999 +671 1640 +687 969 +641 796 +566 1384 +558 1386 +611 1189 diff --git a/bottleneck/tests/data/test_722_A b/bottleneck/tests/data/test_722_A new file mode 100644 index 0000000..6e0719f --- /dev/null +++ b/bottleneck/tests/data/test_722_A @@ -0,0 +1,7 @@ +292 783 +995 1371 +60 662 +506 531 +294 1245 +966 1027 +750 1180 diff --git a/bottleneck/tests/data/test_722_B b/bottleneck/tests/data/test_722_B new file mode 100644 index 0000000..0fd37cc --- /dev/null +++ b/bottleneck/tests/data/test_722_B @@ -0,0 +1,7 @@ +194 750 +520 773 +206 498 +746 1278 +354 643 +812 1219 +547 707 diff --git a/bottleneck/tests/data/test_723_A b/bottleneck/tests/data/test_723_A new file mode 100644 index 0000000..ad94fdd --- /dev/null +++ b/bottleneck/tests/data/test_723_A @@ -0,0 +1,7 @@ +44 715 +470 1287 +692 1635 +849 1409 +636 724 +108 255 +377 1253 diff --git a/bottleneck/tests/data/test_723_B b/bottleneck/tests/data/test_723_B new file mode 100644 index 0000000..247a17e --- /dev/null +++ b/bottleneck/tests/data/test_723_B @@ -0,0 +1,7 @@ +565 1129 +574 725 +387 1204 +990 1093 +548 1447 +547 1294 +394 421 diff --git a/bottleneck/tests/data/test_724_A b/bottleneck/tests/data/test_724_A new file mode 100644 index 0000000..f9a6bcf --- /dev/null +++ b/bottleneck/tests/data/test_724_A @@ -0,0 +1,7 @@ +121 963 +4 934 +471 1403 +78 700 +500 749 +577 1241 +961 1123 diff --git a/bottleneck/tests/data/test_724_B b/bottleneck/tests/data/test_724_B new file mode 100644 index 0000000..71d03b3 --- /dev/null +++ b/bottleneck/tests/data/test_724_B @@ -0,0 +1,7 @@ +597 1424 +232 317 +618 1105 +593 1007 +410 1158 +534 965 +306 782 diff --git a/bottleneck/tests/data/test_725_A b/bottleneck/tests/data/test_725_A new file mode 100644 index 0000000..1e20d9e --- /dev/null +++ b/bottleneck/tests/data/test_725_A @@ -0,0 +1,7 @@ +365 431 +764 1023 +503 1251 +50 557 +899 930 +906 1266 +698 1582 diff --git a/bottleneck/tests/data/test_725_B b/bottleneck/tests/data/test_725_B new file mode 100644 index 0000000..a215c1e --- /dev/null +++ b/bottleneck/tests/data/test_725_B @@ -0,0 +1,7 @@ +591 1250 +643 1388 +429 1007 +953 1625 +604 1075 +486 1455 +999 1790 diff --git a/bottleneck/tests/data/test_726_A b/bottleneck/tests/data/test_726_A new file mode 100644 index 0000000..dd9500a --- /dev/null +++ b/bottleneck/tests/data/test_726_A @@ -0,0 +1,7 @@ +193 1032 +813 1060 +401 672 +819 1490 +913 993 +294 753 +107 807 diff --git a/bottleneck/tests/data/test_726_B b/bottleneck/tests/data/test_726_B new file mode 100644 index 0000000..b3d3e50 --- /dev/null +++ b/bottleneck/tests/data/test_726_B @@ -0,0 +1,7 @@ +57 1011 +861 1503 +669 1185 +630 1360 +636 952 +524 526 +264 1129 diff --git a/bottleneck/tests/data/test_727_A b/bottleneck/tests/data/test_727_A new file mode 100644 index 0000000..dae9ff3 --- /dev/null +++ b/bottleneck/tests/data/test_727_A @@ -0,0 +1,7 @@ +268 505 +525 1512 +131 265 +534 1402 +810 1044 +474 933 +752 1495 diff --git a/bottleneck/tests/data/test_727_B b/bottleneck/tests/data/test_727_B new file mode 100644 index 0000000..551d523 --- /dev/null +++ b/bottleneck/tests/data/test_727_B @@ -0,0 +1,7 @@ +366 1348 +38 470 +594 1547 +97 353 +417 626 +791 1472 +493 1262 diff --git a/bottleneck/tests/data/test_728_A b/bottleneck/tests/data/test_728_A new file mode 100644 index 0000000..8074ce8 --- /dev/null +++ b/bottleneck/tests/data/test_728_A @@ -0,0 +1,7 @@ +798 958 +59 406 +670 868 +533 789 +192 727 +52 109 +997 1981 diff --git a/bottleneck/tests/data/test_728_B b/bottleneck/tests/data/test_728_B new file mode 100644 index 0000000..6d1448a --- /dev/null +++ b/bottleneck/tests/data/test_728_B @@ -0,0 +1,7 @@ +211 624 +198 1095 +150 530 +757 1274 +672 1255 +847 1476 +879 1407 diff --git a/bottleneck/tests/data/test_729_A b/bottleneck/tests/data/test_729_A new file mode 100644 index 0000000..f9de136 --- /dev/null +++ b/bottleneck/tests/data/test_729_A @@ -0,0 +1,7 @@ +574 1387 +241 543 +338 345 +888 1183 +942 1193 +5 802 +357 510 diff --git a/bottleneck/tests/data/test_729_B b/bottleneck/tests/data/test_729_B new file mode 100644 index 0000000..d34621f --- /dev/null +++ b/bottleneck/tests/data/test_729_B @@ -0,0 +1,7 @@ +878 1129 +669 805 +56 973 +201 756 +911 1352 +494 887 +161 541 diff --git a/bottleneck/tests/data/test_730_A b/bottleneck/tests/data/test_730_A new file mode 100644 index 0000000..433cbd8 --- /dev/null +++ b/bottleneck/tests/data/test_730_A @@ -0,0 +1,7 @@ +135 1110 +126 417 +647 964 +895 1124 +213 1115 +340 755 +154 605 diff --git a/bottleneck/tests/data/test_730_B b/bottleneck/tests/data/test_730_B new file mode 100644 index 0000000..1b46964 --- /dev/null +++ b/bottleneck/tests/data/test_730_B @@ -0,0 +1,7 @@ +854 866 +212 1211 +180 272 +386 1292 +47 565 +916 1350 +906 912 diff --git a/bottleneck/tests/data/test_731_A b/bottleneck/tests/data/test_731_A new file mode 100644 index 0000000..38d42cd --- /dev/null +++ b/bottleneck/tests/data/test_731_A @@ -0,0 +1,7 @@ +1000 1606 +332 982 +581 1398 +403 1237 +954 1071 +560 890 +980 1624 diff --git a/bottleneck/tests/data/test_731_B b/bottleneck/tests/data/test_731_B new file mode 100644 index 0000000..3017d7a --- /dev/null +++ b/bottleneck/tests/data/test_731_B @@ -0,0 +1,7 @@ +171 558 +391 1367 +177 1159 +130 343 +914 1175 +774 835 +672 1301 diff --git a/bottleneck/tests/data/test_732_A b/bottleneck/tests/data/test_732_A new file mode 100644 index 0000000..75a48cf --- /dev/null +++ b/bottleneck/tests/data/test_732_A @@ -0,0 +1,7 @@ +330 1018 +692 1639 +213 1060 +138 458 +356 1233 +976 1361 +117 365 diff --git a/bottleneck/tests/data/test_732_B b/bottleneck/tests/data/test_732_B new file mode 100644 index 0000000..fada3b9 --- /dev/null +++ b/bottleneck/tests/data/test_732_B @@ -0,0 +1,7 @@ +530 729 +842 926 +375 633 +364 987 +507 1398 +303 1096 +137 344 diff --git a/bottleneck/tests/data/test_733_A b/bottleneck/tests/data/test_733_A new file mode 100644 index 0000000..d97ae0b --- /dev/null +++ b/bottleneck/tests/data/test_733_A @@ -0,0 +1,7 @@ +155 290 +712 904 +154 668 +518 1267 +224 1022 +997 1304 +551 1015 diff --git a/bottleneck/tests/data/test_733_B b/bottleneck/tests/data/test_733_B new file mode 100644 index 0000000..529c7de --- /dev/null +++ b/bottleneck/tests/data/test_733_B @@ -0,0 +1,7 @@ +930 1406 +626 980 +541 1340 +129 1023 +407 615 +105 850 +688 756 diff --git a/bottleneck/tests/data/test_734_A b/bottleneck/tests/data/test_734_A new file mode 100644 index 0000000..9aec4b4 --- /dev/null +++ b/bottleneck/tests/data/test_734_A @@ -0,0 +1,7 @@ +296 1160 +3 574 +642 808 +844 1148 +982 1081 +236 634 +151 904 diff --git a/bottleneck/tests/data/test_734_B b/bottleneck/tests/data/test_734_B new file mode 100644 index 0000000..4cb7206 --- /dev/null +++ b/bottleneck/tests/data/test_734_B @@ -0,0 +1,7 @@ +30 884 +13 769 +406 954 +794 1615 +976 1177 +631 816 +400 1099 diff --git a/bottleneck/tests/data/test_735_A b/bottleneck/tests/data/test_735_A new file mode 100644 index 0000000..f364a21 --- /dev/null +++ b/bottleneck/tests/data/test_735_A @@ -0,0 +1,7 @@ +259 941 +218 975 +286 718 +70 401 +496 830 +220 362 +511 1270 diff --git a/bottleneck/tests/data/test_735_B b/bottleneck/tests/data/test_735_B new file mode 100644 index 0000000..0f93850 --- /dev/null +++ b/bottleneck/tests/data/test_735_B @@ -0,0 +1,7 @@ +489 705 +467 962 +110 116 +817 1521 +571 1059 +426 584 +933 1307 diff --git a/bottleneck/tests/data/test_736_A b/bottleneck/tests/data/test_736_A new file mode 100644 index 0000000..d89c563 --- /dev/null +++ b/bottleneck/tests/data/test_736_A @@ -0,0 +1,7 @@ +624 1466 +288 1004 +552 978 +710 1190 +796 1634 +322 800 +171 197 diff --git a/bottleneck/tests/data/test_736_B b/bottleneck/tests/data/test_736_B new file mode 100644 index 0000000..25427f3 --- /dev/null +++ b/bottleneck/tests/data/test_736_B @@ -0,0 +1,7 @@ +385 852 +110 431 +284 646 +803 1541 +436 821 +262 951 +470 1172 diff --git a/bottleneck/tests/data/test_737_A b/bottleneck/tests/data/test_737_A new file mode 100644 index 0000000..2fbdf41 --- /dev/null +++ b/bottleneck/tests/data/test_737_A @@ -0,0 +1,7 @@ +340 942 +812 1103 +129 553 +729 781 +779 1100 +99 1059 +720 1532 diff --git a/bottleneck/tests/data/test_737_B b/bottleneck/tests/data/test_737_B new file mode 100644 index 0000000..42348d5 --- /dev/null +++ b/bottleneck/tests/data/test_737_B @@ -0,0 +1,7 @@ +677 1323 +268 916 +165 674 +594 689 +975 1246 +717 734 +877 1479 diff --git a/bottleneck/tests/data/test_738_A b/bottleneck/tests/data/test_738_A new file mode 100644 index 0000000..d56b09b --- /dev/null +++ b/bottleneck/tests/data/test_738_A @@ -0,0 +1,7 @@ +367 725 +277 1154 +267 994 +780 1005 +293 530 +964 1682 +421 734 diff --git a/bottleneck/tests/data/test_738_B b/bottleneck/tests/data/test_738_B new file mode 100644 index 0000000..834b2cf --- /dev/null +++ b/bottleneck/tests/data/test_738_B @@ -0,0 +1,7 @@ +661 1499 +920 1597 +528 958 +482 957 +143 757 +547 1079 +774 937 diff --git a/bottleneck/tests/data/test_739_A b/bottleneck/tests/data/test_739_A new file mode 100644 index 0000000..84cbd7c --- /dev/null +++ b/bottleneck/tests/data/test_739_A @@ -0,0 +1,7 @@ +414 1244 +395 937 +504 1155 +711 1389 +302 859 +220 731 +725 962 diff --git a/bottleneck/tests/data/test_739_B b/bottleneck/tests/data/test_739_B new file mode 100644 index 0000000..85afe3e --- /dev/null +++ b/bottleneck/tests/data/test_739_B @@ -0,0 +1,7 @@ +598 980 +50 441 +473 1160 +524 1273 +523 1060 +936 1295 +73 910 diff --git a/bottleneck/tests/data/test_740_A b/bottleneck/tests/data/test_740_A new file mode 100644 index 0000000..a99113a --- /dev/null +++ b/bottleneck/tests/data/test_740_A @@ -0,0 +1,8 @@ +569 1119 +905 1475 +608 1595 +469 1334 +501 1299 +306 797 +802 1036 +155 379 diff --git a/bottleneck/tests/data/test_740_B b/bottleneck/tests/data/test_740_B new file mode 100644 index 0000000..5aac504 --- /dev/null +++ b/bottleneck/tests/data/test_740_B @@ -0,0 +1,8 @@ +729 946 +190 1105 +541 1315 +719 1537 +319 1219 +269 468 +638 838 +51 440 diff --git a/bottleneck/tests/data/test_741_A b/bottleneck/tests/data/test_741_A new file mode 100644 index 0000000..7c3f3fc --- /dev/null +++ b/bottleneck/tests/data/test_741_A @@ -0,0 +1,8 @@ +897 1868 +872 1752 +739 1445 +156 178 +256 714 +198 528 +595 1485 +873 1452 diff --git a/bottleneck/tests/data/test_741_B b/bottleneck/tests/data/test_741_B new file mode 100644 index 0000000..9f8d386 --- /dev/null +++ b/bottleneck/tests/data/test_741_B @@ -0,0 +1,8 @@ +193 277 +309 1030 +263 1230 +824 1414 +191 1103 +42 165 +665 690 +414 742 diff --git a/bottleneck/tests/data/test_742_A b/bottleneck/tests/data/test_742_A new file mode 100644 index 0000000..9effd4c --- /dev/null +++ b/bottleneck/tests/data/test_742_A @@ -0,0 +1,8 @@ +268 974 +345 812 +75 359 +178 827 +647 1213 +667 677 +400 521 +703 1302 diff --git a/bottleneck/tests/data/test_742_B b/bottleneck/tests/data/test_742_B new file mode 100644 index 0000000..f17965b --- /dev/null +++ b/bottleneck/tests/data/test_742_B @@ -0,0 +1,8 @@ +577 1161 +635 1057 +395 684 +225 312 +194 475 +550 732 +892 1097 +494 987 diff --git a/bottleneck/tests/data/test_743_A b/bottleneck/tests/data/test_743_A new file mode 100644 index 0000000..3a40cfb --- /dev/null +++ b/bottleneck/tests/data/test_743_A @@ -0,0 +1,8 @@ +593 1306 +117 664 +701 1073 +918 1452 +125 1012 +80 106 +26 904 +525 1251 diff --git a/bottleneck/tests/data/test_743_B b/bottleneck/tests/data/test_743_B new file mode 100644 index 0000000..482d6dd --- /dev/null +++ b/bottleneck/tests/data/test_743_B @@ -0,0 +1,8 @@ +913 1090 +957 1355 +465 559 +490 1102 +957 1559 +535 805 +569 1211 +8 570 diff --git a/bottleneck/tests/data/test_744_A b/bottleneck/tests/data/test_744_A new file mode 100644 index 0000000..25c3e55 --- /dev/null +++ b/bottleneck/tests/data/test_744_A @@ -0,0 +1,8 @@ +648 773 +599 1278 +940 1503 +127 461 +923 1912 +724 939 +609 633 +720 936 diff --git a/bottleneck/tests/data/test_744_B b/bottleneck/tests/data/test_744_B new file mode 100644 index 0000000..da30f30 --- /dev/null +++ b/bottleneck/tests/data/test_744_B @@ -0,0 +1,8 @@ +102 119 +262 460 +568 825 +855 1517 +622 1062 +441 607 +183 1095 +446 1422 diff --git a/bottleneck/tests/data/test_745_A b/bottleneck/tests/data/test_745_A new file mode 100644 index 0000000..f8ef7e6 --- /dev/null +++ b/bottleneck/tests/data/test_745_A @@ -0,0 +1,8 @@ +34 614 +939 1749 +639 698 +16 851 +847 1299 +760 1345 +477 682 +931 1291 diff --git a/bottleneck/tests/data/test_745_B b/bottleneck/tests/data/test_745_B new file mode 100644 index 0000000..f6d32b5 --- /dev/null +++ b/bottleneck/tests/data/test_745_B @@ -0,0 +1,8 @@ +972 1016 +16 293 +116 641 +230 1015 +164 468 +557 700 +1 477 +437 739 diff --git a/bottleneck/tests/data/test_746_A b/bottleneck/tests/data/test_746_A new file mode 100644 index 0000000..dbd677e --- /dev/null +++ b/bottleneck/tests/data/test_746_A @@ -0,0 +1,8 @@ +651 1348 +225 349 +382 755 +986 1090 +601 856 +349 1261 +667 1644 +637 1197 diff --git a/bottleneck/tests/data/test_746_B b/bottleneck/tests/data/test_746_B new file mode 100644 index 0000000..9d02f4b --- /dev/null +++ b/bottleneck/tests/data/test_746_B @@ -0,0 +1,8 @@ +804 1762 +13 403 +615 1487 +810 899 +939 1026 +59 539 +258 803 +199 488 diff --git a/bottleneck/tests/data/test_747_A b/bottleneck/tests/data/test_747_A new file mode 100644 index 0000000..c7886f8 --- /dev/null +++ b/bottleneck/tests/data/test_747_A @@ -0,0 +1,8 @@ +810 1169 +599 1295 +34 243 +41 247 +828 1689 +884 1265 +57 122 +340 1041 diff --git a/bottleneck/tests/data/test_747_B b/bottleneck/tests/data/test_747_B new file mode 100644 index 0000000..1ca1b5e --- /dev/null +++ b/bottleneck/tests/data/test_747_B @@ -0,0 +1,8 @@ +282 836 +663 822 +874 1239 +911 1439 +704 1085 +593 787 +125 683 +790 1041 diff --git a/bottleneck/tests/data/test_748_A b/bottleneck/tests/data/test_748_A new file mode 100644 index 0000000..5fe22c2 --- /dev/null +++ b/bottleneck/tests/data/test_748_A @@ -0,0 +1,8 @@ +713 1382 +941 1859 +531 1460 +239 703 +4 712 +381 1018 +492 1298 +142 765 diff --git a/bottleneck/tests/data/test_748_B b/bottleneck/tests/data/test_748_B new file mode 100644 index 0000000..2e69002 --- /dev/null +++ b/bottleneck/tests/data/test_748_B @@ -0,0 +1,8 @@ +993 1036 +886 1574 +892 1880 +649 1474 +228 1041 +124 730 +197 360 +490 1447 diff --git a/bottleneck/tests/data/test_749_A b/bottleneck/tests/data/test_749_A new file mode 100644 index 0000000..b3bf068 --- /dev/null +++ b/bottleneck/tests/data/test_749_A @@ -0,0 +1,8 @@ +233 929 +150 391 +761 1353 +402 872 +890 1624 +103 482 +855 1150 +173 190 diff --git a/bottleneck/tests/data/test_749_B b/bottleneck/tests/data/test_749_B new file mode 100644 index 0000000..b181d57 --- /dev/null +++ b/bottleneck/tests/data/test_749_B @@ -0,0 +1,8 @@ +304 960 +633 956 +62 250 +678 1085 +582 1509 +267 1159 +555 872 +828 935 diff --git a/bottleneck/tests/data/test_750_A b/bottleneck/tests/data/test_750_A new file mode 100644 index 0000000..3bd3e77 --- /dev/null +++ b/bottleneck/tests/data/test_750_A @@ -0,0 +1,8 @@ +46 814 +299 740 +422 505 +597 674 +626 882 +550 1384 +257 522 +191 537 diff --git a/bottleneck/tests/data/test_750_B b/bottleneck/tests/data/test_750_B new file mode 100644 index 0000000..837ed3d --- /dev/null +++ b/bottleneck/tests/data/test_750_B @@ -0,0 +1,8 @@ +119 1069 +304 1151 +984 1304 +938 1017 +915 1414 +603 1419 +806 1391 +247 563 diff --git a/bottleneck/tests/data/test_751_A b/bottleneck/tests/data/test_751_A new file mode 100644 index 0000000..adb0fe7 --- /dev/null +++ b/bottleneck/tests/data/test_751_A @@ -0,0 +1,8 @@ +161 749 +884 1266 +52 256 +626 1062 +244 1161 +52 651 +429 513 +123 381 diff --git a/bottleneck/tests/data/test_751_B b/bottleneck/tests/data/test_751_B new file mode 100644 index 0000000..1ed1651 --- /dev/null +++ b/bottleneck/tests/data/test_751_B @@ -0,0 +1,8 @@ +646 1122 +980 1686 +3 270 +410 1255 +5 817 +9 390 +601 1013 +786 1675 diff --git a/bottleneck/tests/data/test_752_A b/bottleneck/tests/data/test_752_A new file mode 100644 index 0000000..4b54da2 --- /dev/null +++ b/bottleneck/tests/data/test_752_A @@ -0,0 +1,8 @@ +941 1425 +272 829 +904 1623 +562 1306 +223 245 +534 1385 +903 1274 +531 629 diff --git a/bottleneck/tests/data/test_752_B b/bottleneck/tests/data/test_752_B new file mode 100644 index 0000000..9c05ec9 --- /dev/null +++ b/bottleneck/tests/data/test_752_B @@ -0,0 +1,8 @@ +514 1333 +981 1676 +949 1493 +952 1015 +572 1224 +131 835 +93 335 +306 906 diff --git a/bottleneck/tests/data/test_753_A b/bottleneck/tests/data/test_753_A new file mode 100644 index 0000000..5704668 --- /dev/null +++ b/bottleneck/tests/data/test_753_A @@ -0,0 +1,8 @@ +405 996 +473 1330 +168 804 +516 578 +712 1449 +425 1336 +237 816 +625 1304 diff --git a/bottleneck/tests/data/test_753_B b/bottleneck/tests/data/test_753_B new file mode 100644 index 0000000..1e845f7 --- /dev/null +++ b/bottleneck/tests/data/test_753_B @@ -0,0 +1,8 @@ +291 1031 +70 332 +847 973 +311 398 +815 1512 +996 1375 +720 1388 +518 611 diff --git a/bottleneck/tests/data/test_754_A b/bottleneck/tests/data/test_754_A new file mode 100644 index 0000000..1957784 --- /dev/null +++ b/bottleneck/tests/data/test_754_A @@ -0,0 +1,8 @@ +138 781 +992 1803 +189 1157 +546 1145 +461 1153 +634 1004 +152 947 +706 713 diff --git a/bottleneck/tests/data/test_754_B b/bottleneck/tests/data/test_754_B new file mode 100644 index 0000000..4463862 --- /dev/null +++ b/bottleneck/tests/data/test_754_B @@ -0,0 +1,8 @@ +742 1152 +909 947 +350 1168 +240 769 +415 479 +752 1507 +356 902 +856 1356 diff --git a/bottleneck/tests/data/test_755_A b/bottleneck/tests/data/test_755_A new file mode 100644 index 0000000..d05546d --- /dev/null +++ b/bottleneck/tests/data/test_755_A @@ -0,0 +1,8 @@ +163 1000 +403 624 +628 829 +458 854 +319 778 +180 856 +822 1028 +806 923 diff --git a/bottleneck/tests/data/test_755_B b/bottleneck/tests/data/test_755_B new file mode 100644 index 0000000..47b372a --- /dev/null +++ b/bottleneck/tests/data/test_755_B @@ -0,0 +1,8 @@ +922 1134 +900 1378 +200 780 +184 815 +631 1014 +837 1762 +676 789 +298 486 diff --git a/bottleneck/tests/data/test_756_A b/bottleneck/tests/data/test_756_A new file mode 100644 index 0000000..bac3296 --- /dev/null +++ b/bottleneck/tests/data/test_756_A @@ -0,0 +1,8 @@ +467 1356 +84 188 +215 968 +702 1035 +305 745 +171 880 +724 1223 +916 1487 diff --git a/bottleneck/tests/data/test_756_B b/bottleneck/tests/data/test_756_B new file mode 100644 index 0000000..0579dd8 --- /dev/null +++ b/bottleneck/tests/data/test_756_B @@ -0,0 +1,8 @@ +62 816 +781 1333 +496 1018 +211 657 +968 1779 +684 828 +707 816 +133 710 diff --git a/bottleneck/tests/data/test_757_A b/bottleneck/tests/data/test_757_A new file mode 100644 index 0000000..3d0e16e --- /dev/null +++ b/bottleneck/tests/data/test_757_A @@ -0,0 +1,8 @@ +850 1310 +104 459 +439 1185 +320 454 +423 1247 +85 891 +899 1560 +114 246 diff --git a/bottleneck/tests/data/test_757_B b/bottleneck/tests/data/test_757_B new file mode 100644 index 0000000..7ccedc5 --- /dev/null +++ b/bottleneck/tests/data/test_757_B @@ -0,0 +1,8 @@ +797 1761 +642 812 +919 1333 +446 703 +330 1069 +575 668 +735 1258 +723 1330 diff --git a/bottleneck/tests/data/test_758_A b/bottleneck/tests/data/test_758_A new file mode 100644 index 0000000..fdabcdd --- /dev/null +++ b/bottleneck/tests/data/test_758_A @@ -0,0 +1,8 @@ +310 820 +65 766 +892 1802 +459 1216 +237 358 +371 419 +218 375 +27 127 diff --git a/bottleneck/tests/data/test_758_B b/bottleneck/tests/data/test_758_B new file mode 100644 index 0000000..4fb7f60 --- /dev/null +++ b/bottleneck/tests/data/test_758_B @@ -0,0 +1,8 @@ +261 318 +423 669 +485 1330 +814 942 +276 1013 +914 1010 +893 1161 +559 1118 diff --git a/bottleneck/tests/data/test_759_A b/bottleneck/tests/data/test_759_A new file mode 100644 index 0000000..dcf3a28 --- /dev/null +++ b/bottleneck/tests/data/test_759_A @@ -0,0 +1,8 @@ +235 1080 +801 1281 +406 1012 +157 1091 +394 1385 +217 791 +971 1930 +529 1401 diff --git a/bottleneck/tests/data/test_759_B b/bottleneck/tests/data/test_759_B new file mode 100644 index 0000000..e094e35 --- /dev/null +++ b/bottleneck/tests/data/test_759_B @@ -0,0 +1,8 @@ +957 1887 +857 1225 +366 386 +678 1429 +828 876 +250 466 +506 1127 +791 946 diff --git a/bottleneck/tests/data/test_760_A b/bottleneck/tests/data/test_760_A new file mode 100644 index 0000000..38e77f3 --- /dev/null +++ b/bottleneck/tests/data/test_760_A @@ -0,0 +1,9 @@ +754 1750 +559 782 +889 1821 +897 1093 +380 764 +367 932 +854 1721 +815 1633 +803 939 diff --git a/bottleneck/tests/data/test_760_B b/bottleneck/tests/data/test_760_B new file mode 100644 index 0000000..1bb3547 --- /dev/null +++ b/bottleneck/tests/data/test_760_B @@ -0,0 +1,9 @@ +895 1474 +904 1893 +474 832 +238 631 +82 583 +470 797 +461 903 +856 1006 +151 669 diff --git a/bottleneck/tests/data/test_761_A b/bottleneck/tests/data/test_761_A new file mode 100644 index 0000000..4690752 --- /dev/null +++ b/bottleneck/tests/data/test_761_A @@ -0,0 +1,9 @@ +377 1284 +139 699 +50 438 +687 919 +35 957 +652 713 +272 1264 +788 1721 +656 1330 diff --git a/bottleneck/tests/data/test_761_B b/bottleneck/tests/data/test_761_B new file mode 100644 index 0000000..9978d2c --- /dev/null +++ b/bottleneck/tests/data/test_761_B @@ -0,0 +1,9 @@ +670 860 +401 500 +127 995 +594 1023 +638 1052 +727 802 +766 1624 +261 880 +172 663 diff --git a/bottleneck/tests/data/test_762_A b/bottleneck/tests/data/test_762_A new file mode 100644 index 0000000..7918ab6 --- /dev/null +++ b/bottleneck/tests/data/test_762_A @@ -0,0 +1,9 @@ +457 1270 +23 803 +189 293 +113 500 +911 1041 +504 728 +105 492 +514 1222 +753 923 diff --git a/bottleneck/tests/data/test_762_B b/bottleneck/tests/data/test_762_B new file mode 100644 index 0000000..d36f033 --- /dev/null +++ b/bottleneck/tests/data/test_762_B @@ -0,0 +1,9 @@ +393 565 +182 184 +852 1821 +702 1558 +157 245 +456 924 +640 1103 +934 1125 +979 1099 diff --git a/bottleneck/tests/data/test_763_A b/bottleneck/tests/data/test_763_A new file mode 100644 index 0000000..73d90de --- /dev/null +++ b/bottleneck/tests/data/test_763_A @@ -0,0 +1,9 @@ +89 776 +785 1157 +846 1324 +854 1048 +968 1721 +653 1216 +707 718 +958 1397 +247 1245 diff --git a/bottleneck/tests/data/test_763_B b/bottleneck/tests/data/test_763_B new file mode 100644 index 0000000..09d159c --- /dev/null +++ b/bottleneck/tests/data/test_763_B @@ -0,0 +1,9 @@ +730 1315 +831 1373 +669 1287 +125 500 +676 1262 +272 524 +173 651 +38 624 +514 1175 diff --git a/bottleneck/tests/data/test_764_A b/bottleneck/tests/data/test_764_A new file mode 100644 index 0000000..8dead93 --- /dev/null +++ b/bottleneck/tests/data/test_764_A @@ -0,0 +1,9 @@ +104 150 +837 890 +975 1135 +650 697 +202 393 +972 1174 +619 969 +274 891 +16 366 diff --git a/bottleneck/tests/data/test_764_B b/bottleneck/tests/data/test_764_B new file mode 100644 index 0000000..014198d --- /dev/null +++ b/bottleneck/tests/data/test_764_B @@ -0,0 +1,9 @@ +150 432 +45 234 +8 95 +31 712 +331 1329 +184 531 +44 922 +764 1746 +838 919 diff --git a/bottleneck/tests/data/test_765_A b/bottleneck/tests/data/test_765_A new file mode 100644 index 0000000..666d2fe --- /dev/null +++ b/bottleneck/tests/data/test_765_A @@ -0,0 +1,9 @@ +105 587 +505 1209 +617 651 +120 670 +322 1268 +410 1307 +822 1420 +351 1226 +150 633 diff --git a/bottleneck/tests/data/test_765_B b/bottleneck/tests/data/test_765_B new file mode 100644 index 0000000..c0be6d4 --- /dev/null +++ b/bottleneck/tests/data/test_765_B @@ -0,0 +1,9 @@ +274 1006 +627 1237 +21 246 +785 1167 +929 1234 +462 904 +539 997 +453 592 +251 513 diff --git a/bottleneck/tests/data/test_766_A b/bottleneck/tests/data/test_766_A new file mode 100644 index 0000000..48d55d9 --- /dev/null +++ b/bottleneck/tests/data/test_766_A @@ -0,0 +1,9 @@ +49 532 +799 1331 +372 667 +852 1746 +400 834 +182 499 +889 1775 +831 867 +139 227 diff --git a/bottleneck/tests/data/test_766_B b/bottleneck/tests/data/test_766_B new file mode 100644 index 0000000..9943c61 --- /dev/null +++ b/bottleneck/tests/data/test_766_B @@ -0,0 +1,9 @@ +976 1516 +153 908 +103 143 +105 439 +469 744 +981 1387 +267 319 +960 1495 +734 1370 diff --git a/bottleneck/tests/data/test_767_A b/bottleneck/tests/data/test_767_A new file mode 100644 index 0000000..badb767 --- /dev/null +++ b/bottleneck/tests/data/test_767_A @@ -0,0 +1,9 @@ +244 622 +925 1530 +263 455 +189 991 +342 1273 +266 321 +544 962 +613 1019 +592 791 diff --git a/bottleneck/tests/data/test_767_B b/bottleneck/tests/data/test_767_B new file mode 100644 index 0000000..3eb4c39 --- /dev/null +++ b/bottleneck/tests/data/test_767_B @@ -0,0 +1,9 @@ +928 1479 +80 1065 +382 1056 +679 880 +307 891 +685 1466 +278 806 +501 1479 +126 271 diff --git a/bottleneck/tests/data/test_768_A b/bottleneck/tests/data/test_768_A new file mode 100644 index 0000000..69b6425 --- /dev/null +++ b/bottleneck/tests/data/test_768_A @@ -0,0 +1,9 @@ +674 1590 +745 1289 +854 1215 +412 627 +538 992 +135 1053 +385 594 +354 569 +702 1010 diff --git a/bottleneck/tests/data/test_768_B b/bottleneck/tests/data/test_768_B new file mode 100644 index 0000000..a0e8eb0 --- /dev/null +++ b/bottleneck/tests/data/test_768_B @@ -0,0 +1,9 @@ +735 1627 +423 514 +524 1236 +377 412 +372 415 +873 1835 +719 1488 +828 1361 +160 705 diff --git a/bottleneck/tests/data/test_769_A b/bottleneck/tests/data/test_769_A new file mode 100644 index 0000000..08a46bd --- /dev/null +++ b/bottleneck/tests/data/test_769_A @@ -0,0 +1,9 @@ +930 1077 +466 1159 +305 866 +672 1003 +970 1824 +774 1212 +454 611 +702 944 +979 1136 diff --git a/bottleneck/tests/data/test_769_B b/bottleneck/tests/data/test_769_B new file mode 100644 index 0000000..ce18190 --- /dev/null +++ b/bottleneck/tests/data/test_769_B @@ -0,0 +1,9 @@ +293 996 +973 1865 +346 753 +897 1337 +58 1055 +35 647 +892 1158 +59 174 +342 1131 diff --git a/bottleneck/tests/data/test_770_A b/bottleneck/tests/data/test_770_A new file mode 100644 index 0000000..edfdf26 --- /dev/null +++ b/bottleneck/tests/data/test_770_A @@ -0,0 +1,9 @@ +61 130 +770 1196 +740 778 +985 1720 +131 208 +740 1516 +798 1185 +609 1141 +159 389 diff --git a/bottleneck/tests/data/test_770_B b/bottleneck/tests/data/test_770_B new file mode 100644 index 0000000..cd59228 --- /dev/null +++ b/bottleneck/tests/data/test_770_B @@ -0,0 +1,9 @@ +815 1216 +229 652 +696 1309 +585 1011 +882 1621 +398 670 +931 1271 +988 1333 +197 1110 diff --git a/bottleneck/tests/data/test_771_A b/bottleneck/tests/data/test_771_A new file mode 100644 index 0000000..9c3f4ba --- /dev/null +++ b/bottleneck/tests/data/test_771_A @@ -0,0 +1,9 @@ +186 373 +378 642 +448 1022 +866 911 +706 1637 +528 950 +150 216 +327 506 +898 1366 diff --git a/bottleneck/tests/data/test_771_B b/bottleneck/tests/data/test_771_B new file mode 100644 index 0000000..8c07a06 --- /dev/null +++ b/bottleneck/tests/data/test_771_B @@ -0,0 +1,9 @@ +968 1807 +686 1584 +296 347 +695 1143 +614 1205 +310 502 +249 694 +420 457 +743 1113 diff --git a/bottleneck/tests/data/test_772_A b/bottleneck/tests/data/test_772_A new file mode 100644 index 0000000..034ed92 --- /dev/null +++ b/bottleneck/tests/data/test_772_A @@ -0,0 +1,9 @@ +286 399 +38 700 +884 1344 +201 1085 +285 1278 +661 901 +921 966 +3 728 +237 982 diff --git a/bottleneck/tests/data/test_772_B b/bottleneck/tests/data/test_772_B new file mode 100644 index 0000000..bc29bff --- /dev/null +++ b/bottleneck/tests/data/test_772_B @@ -0,0 +1,9 @@ +148 440 +806 1799 +886 1586 +363 1211 +316 683 +229 766 +839 1204 +245 685 +43 841 diff --git a/bottleneck/tests/data/test_773_A b/bottleneck/tests/data/test_773_A new file mode 100644 index 0000000..0601e04 --- /dev/null +++ b/bottleneck/tests/data/test_773_A @@ -0,0 +1,9 @@ +796 1034 +635 1409 +52 141 +974 1000 +341 800 +727 820 +343 1278 +138 153 +446 823 diff --git a/bottleneck/tests/data/test_773_B b/bottleneck/tests/data/test_773_B new file mode 100644 index 0000000..004d2d6 --- /dev/null +++ b/bottleneck/tests/data/test_773_B @@ -0,0 +1,9 @@ +327 384 +214 341 +815 1156 +868 1138 +369 392 +351 1162 +829 1594 +618 783 +47 656 diff --git a/bottleneck/tests/data/test_774_A b/bottleneck/tests/data/test_774_A new file mode 100644 index 0000000..3e211a0 --- /dev/null +++ b/bottleneck/tests/data/test_774_A @@ -0,0 +1,9 @@ +833 1408 +738 1321 +731 825 +670 795 +458 1062 +777 1262 +719 1131 +979 1366 +350 1290 diff --git a/bottleneck/tests/data/test_774_B b/bottleneck/tests/data/test_774_B new file mode 100644 index 0000000..3cf3985 --- /dev/null +++ b/bottleneck/tests/data/test_774_B @@ -0,0 +1,9 @@ +421 1393 +851 1666 +633 1458 +560 1168 +936 1833 +855 1548 +275 1067 +899 1767 +539 947 diff --git a/bottleneck/tests/data/test_775_A b/bottleneck/tests/data/test_775_A new file mode 100644 index 0000000..5676eb4 --- /dev/null +++ b/bottleneck/tests/data/test_775_A @@ -0,0 +1,9 @@ +210 651 +529 1257 +998 1304 +957 1816 +624 800 +200 460 +319 1051 +422 962 +642 1439 diff --git a/bottleneck/tests/data/test_775_B b/bottleneck/tests/data/test_775_B new file mode 100644 index 0000000..5c4e8bc --- /dev/null +++ b/bottleneck/tests/data/test_775_B @@ -0,0 +1,9 @@ +652 1315 +419 981 +912 1832 +578 1215 +317 992 +785 1422 +528 664 +968 1344 +847 993 diff --git a/bottleneck/tests/data/test_776_A b/bottleneck/tests/data/test_776_A new file mode 100644 index 0000000..49370ff --- /dev/null +++ b/bottleneck/tests/data/test_776_A @@ -0,0 +1,9 @@ +707 768 +983 1893 +386 786 +370 914 +45 501 +625 1184 +175 1073 +262 1227 +819 1257 diff --git a/bottleneck/tests/data/test_776_B b/bottleneck/tests/data/test_776_B new file mode 100644 index 0000000..575a2d9 --- /dev/null +++ b/bottleneck/tests/data/test_776_B @@ -0,0 +1,9 @@ +949 1560 +757 1176 +689 1184 +819 1333 +50 884 +872 1695 +992 1145 +909 1889 +516 1376 diff --git a/bottleneck/tests/data/test_777_A b/bottleneck/tests/data/test_777_A new file mode 100644 index 0000000..eb1c980 --- /dev/null +++ b/bottleneck/tests/data/test_777_A @@ -0,0 +1,9 @@ +958 1247 +143 570 +463 1343 +347 1346 +640 1203 +923 964 +489 701 +712 837 +616 978 diff --git a/bottleneck/tests/data/test_777_B b/bottleneck/tests/data/test_777_B new file mode 100644 index 0000000..eb9c8ee --- /dev/null +++ b/bottleneck/tests/data/test_777_B @@ -0,0 +1,9 @@ +781 1080 +494 1278 +123 159 +936 1305 +748 1302 +271 524 +37 953 +758 946 +182 670 diff --git a/bottleneck/tests/data/test_778_A b/bottleneck/tests/data/test_778_A new file mode 100644 index 0000000..8392b2a --- /dev/null +++ b/bottleneck/tests/data/test_778_A @@ -0,0 +1,9 @@ +544 1145 +371 1278 +417 814 +694 1566 +443 1104 +710 827 +617 714 +286 503 +191 568 diff --git a/bottleneck/tests/data/test_778_B b/bottleneck/tests/data/test_778_B new file mode 100644 index 0000000..017b08d --- /dev/null +++ b/bottleneck/tests/data/test_778_B @@ -0,0 +1,9 @@ +746 1177 +291 727 +956 1929 +255 294 +938 1415 +564 1206 +657 1586 +499 1013 +67 1035 diff --git a/bottleneck/tests/data/test_779_A b/bottleneck/tests/data/test_779_A new file mode 100644 index 0000000..221d574 --- /dev/null +++ b/bottleneck/tests/data/test_779_A @@ -0,0 +1,9 @@ +771 1728 +948 1405 +842 1792 +956 1247 +194 841 +152 1145 +683 1458 +854 1851 +817 864 diff --git a/bottleneck/tests/data/test_779_B b/bottleneck/tests/data/test_779_B new file mode 100644 index 0000000..113003e --- /dev/null +++ b/bottleneck/tests/data/test_779_B @@ -0,0 +1,9 @@ +911 955 +410 1292 +972 1259 +128 1011 +362 591 +827 834 +677 1611 +783 1570 +844 1426 diff --git a/bottleneck/tests/data/test_780_A b/bottleneck/tests/data/test_780_A new file mode 100644 index 0000000..3d9a22c --- /dev/null +++ b/bottleneck/tests/data/test_780_A @@ -0,0 +1,10 @@ +183 274 +354 862 +922 1354 +560 1351 +235 292 +695 1560 +29 997 +962 1865 +141 1080 +827 1101 diff --git a/bottleneck/tests/data/test_780_B b/bottleneck/tests/data/test_780_B new file mode 100644 index 0000000..defbae9 --- /dev/null +++ b/bottleneck/tests/data/test_780_B @@ -0,0 +1,10 @@ +42 318 +758 1669 +351 1022 +824 1415 +902 1400 +515 576 +260 586 +28 176 +469 1338 +909 1379 diff --git a/bottleneck/tests/data/test_781_A b/bottleneck/tests/data/test_781_A new file mode 100644 index 0000000..72201a7 --- /dev/null +++ b/bottleneck/tests/data/test_781_A @@ -0,0 +1,10 @@ +329 554 +888 1476 +129 806 +786 990 +328 727 +574 1226 +864 1378 +61 561 +154 823 +922 1810 diff --git a/bottleneck/tests/data/test_781_B b/bottleneck/tests/data/test_781_B new file mode 100644 index 0000000..85c8683 --- /dev/null +++ b/bottleneck/tests/data/test_781_B @@ -0,0 +1,10 @@ +193 306 +784 949 +446 467 +830 891 +36 174 +28 1028 +135 1113 +689 737 +598 669 +808 1618 diff --git a/bottleneck/tests/data/test_782_A b/bottleneck/tests/data/test_782_A new file mode 100644 index 0000000..b376509 --- /dev/null +++ b/bottleneck/tests/data/test_782_A @@ -0,0 +1,10 @@ +488 967 +298 299 +687 942 +225 1184 +375 467 +17 355 +165 658 +911 1012 +970 1538 +26 194 diff --git a/bottleneck/tests/data/test_782_B b/bottleneck/tests/data/test_782_B new file mode 100644 index 0000000..9fba291 --- /dev/null +++ b/bottleneck/tests/data/test_782_B @@ -0,0 +1,10 @@ +191 1062 +253 1153 +930 1745 +736 1486 +274 503 +830 1830 +769 865 +33 921 +160 304 +229 1012 diff --git a/bottleneck/tests/data/test_783_A b/bottleneck/tests/data/test_783_A new file mode 100644 index 0000000..83593db --- /dev/null +++ b/bottleneck/tests/data/test_783_A @@ -0,0 +1,10 @@ +575 1393 +206 817 +209 288 +181 466 +796 861 +885 1340 +110 346 +18 946 +769 1139 +422 1212 diff --git a/bottleneck/tests/data/test_783_B b/bottleneck/tests/data/test_783_B new file mode 100644 index 0000000..d169a48 --- /dev/null +++ b/bottleneck/tests/data/test_783_B @@ -0,0 +1,10 @@ +810 1113 +997 1451 +205 1095 +621 1281 +677 1326 +911 1262 +395 916 +224 882 +708 812 +82 824 diff --git a/bottleneck/tests/data/test_784_A b/bottleneck/tests/data/test_784_A new file mode 100644 index 0000000..b10df8b --- /dev/null +++ b/bottleneck/tests/data/test_784_A @@ -0,0 +1,10 @@ +963 1352 +692 1376 +910 967 +668 831 +840 962 +348 424 +729 1606 +417 514 +350 871 +289 298 diff --git a/bottleneck/tests/data/test_784_B b/bottleneck/tests/data/test_784_B new file mode 100644 index 0000000..ef2b466 --- /dev/null +++ b/bottleneck/tests/data/test_784_B @@ -0,0 +1,10 @@ +754 955 +100 1075 +199 738 +800 1132 +419 949 +729 969 +774 941 +559 1196 +692 1096 +741 1061 diff --git a/bottleneck/tests/data/test_785_A b/bottleneck/tests/data/test_785_A new file mode 100644 index 0000000..3cdfaba --- /dev/null +++ b/bottleneck/tests/data/test_785_A @@ -0,0 +1,10 @@ +797 970 +423 870 +289 692 +856 1132 +465 1409 +521 977 +322 545 +137 608 +934 1682 +77 959 diff --git a/bottleneck/tests/data/test_785_B b/bottleneck/tests/data/test_785_B new file mode 100644 index 0000000..32fe176 --- /dev/null +++ b/bottleneck/tests/data/test_785_B @@ -0,0 +1,10 @@ +554 985 +793 1614 +915 1231 +215 790 +410 1181 +290 830 +733 1352 +717 829 +37 152 +989 1971 diff --git a/bottleneck/tests/data/test_786_A b/bottleneck/tests/data/test_786_A new file mode 100644 index 0000000..2d9fcec --- /dev/null +++ b/bottleneck/tests/data/test_786_A @@ -0,0 +1,10 @@ +274 873 +62 804 +282 663 +517 1295 +906 921 +967 1806 +724 1674 +976 1641 +923 1492 +529 1316 diff --git a/bottleneck/tests/data/test_786_B b/bottleneck/tests/data/test_786_B new file mode 100644 index 0000000..417ee4b --- /dev/null +++ b/bottleneck/tests/data/test_786_B @@ -0,0 +1,10 @@ +185 563 +774 1322 +467 499 +627 1251 +193 228 +528 1146 +957 1286 +882 891 +271 1024 +43 489 diff --git a/bottleneck/tests/data/test_787_A b/bottleneck/tests/data/test_787_A new file mode 100644 index 0000000..7c056b6 --- /dev/null +++ b/bottleneck/tests/data/test_787_A @@ -0,0 +1,10 @@ +297 511 +275 457 +251 1094 +824 1027 +872 1563 +842 1711 +841 1094 +732 1633 +82 105 +397 900 diff --git a/bottleneck/tests/data/test_787_B b/bottleneck/tests/data/test_787_B new file mode 100644 index 0000000..ddc126a --- /dev/null +++ b/bottleneck/tests/data/test_787_B @@ -0,0 +1,10 @@ +152 438 +370 689 +859 1398 +697 1574 +294 635 +414 1138 +656 1516 +543 800 +260 902 +55 193 diff --git a/bottleneck/tests/data/test_788_A b/bottleneck/tests/data/test_788_A new file mode 100644 index 0000000..61a58b0 --- /dev/null +++ b/bottleneck/tests/data/test_788_A @@ -0,0 +1,10 @@ +820 1238 +143 789 +0 482 +20 414 +838 1690 +810 1160 +178 978 +963 1890 +852 1293 +399 609 diff --git a/bottleneck/tests/data/test_788_B b/bottleneck/tests/data/test_788_B new file mode 100644 index 0000000..d0782d9 --- /dev/null +++ b/bottleneck/tests/data/test_788_B @@ -0,0 +1,10 @@ +608 1470 +780 828 +436 513 +373 703 +950 1343 +608 949 +996 1248 +400 407 +911 1501 +660 1273 diff --git a/bottleneck/tests/data/test_789_A b/bottleneck/tests/data/test_789_A new file mode 100644 index 0000000..4805534 --- /dev/null +++ b/bottleneck/tests/data/test_789_A @@ -0,0 +1,10 @@ +354 1062 +357 491 +915 1394 +385 1352 +461 585 +612 1103 +229 327 +741 1148 +572 1245 +399 863 diff --git a/bottleneck/tests/data/test_789_B b/bottleneck/tests/data/test_789_B new file mode 100644 index 0000000..808dab9 --- /dev/null +++ b/bottleneck/tests/data/test_789_B @@ -0,0 +1,10 @@ +806 1352 +254 492 +202 1049 +571 1363 +359 1262 +828 1364 +123 603 +50 581 +502 1455 +218 1133 diff --git a/bottleneck/tests/data/test_790_A b/bottleneck/tests/data/test_790_A new file mode 100644 index 0000000..231f25c --- /dev/null +++ b/bottleneck/tests/data/test_790_A @@ -0,0 +1,10 @@ +411 1365 +920 965 +799 1463 +516 980 +775 1260 +48 353 +828 978 +166 1166 +391 992 +580 970 diff --git a/bottleneck/tests/data/test_790_B b/bottleneck/tests/data/test_790_B new file mode 100644 index 0000000..0892cfe --- /dev/null +++ b/bottleneck/tests/data/test_790_B @@ -0,0 +1,10 @@ +145 299 +605 1499 +534 1303 +440 1163 +628 1355 +2 71 +902 1181 +376 490 +696 1515 +24 40 diff --git a/bottleneck/tests/data/test_791_A b/bottleneck/tests/data/test_791_A new file mode 100644 index 0000000..e12631e --- /dev/null +++ b/bottleneck/tests/data/test_791_A @@ -0,0 +1,10 @@ +806 943 +568 1238 +44 633 +424 491 +361 1057 +583 1403 +754 1333 +843 1653 +512 1431 +768 1390 diff --git a/bottleneck/tests/data/test_791_B b/bottleneck/tests/data/test_791_B new file mode 100644 index 0000000..62aa958 --- /dev/null +++ b/bottleneck/tests/data/test_791_B @@ -0,0 +1,10 @@ +850 1256 +138 1008 +948 1188 +914 1911 +659 1270 +375 986 +994 1160 +835 863 +73 849 +756 1456 diff --git a/bottleneck/tests/data/test_792_A b/bottleneck/tests/data/test_792_A new file mode 100644 index 0000000..3b73b46 --- /dev/null +++ b/bottleneck/tests/data/test_792_A @@ -0,0 +1,10 @@ +610 1074 +927 1375 +497 992 +277 1026 +978 1640 +244 290 +299 814 +80 476 +599 1512 +793 824 diff --git a/bottleneck/tests/data/test_792_B b/bottleneck/tests/data/test_792_B new file mode 100644 index 0000000..517ff30 --- /dev/null +++ b/bottleneck/tests/data/test_792_B @@ -0,0 +1,10 @@ +531 1350 +371 1273 +498 546 +487 1299 +347 1067 +638 1257 +205 802 +240 658 +1 249 +147 878 diff --git a/bottleneck/tests/data/test_793_A b/bottleneck/tests/data/test_793_A new file mode 100644 index 0000000..d9b85ae --- /dev/null +++ b/bottleneck/tests/data/test_793_A @@ -0,0 +1,10 @@ +267 566 +193 1014 +348 534 +640 670 +795 1157 +752 1273 +439 1172 +254 687 +959 1954 +408 1084 diff --git a/bottleneck/tests/data/test_793_B b/bottleneck/tests/data/test_793_B new file mode 100644 index 0000000..66180dd --- /dev/null +++ b/bottleneck/tests/data/test_793_B @@ -0,0 +1,10 @@ +751 1576 +410 1090 +288 1200 +430 1222 +988 1576 +152 1095 +583 596 +799 1296 +828 1022 +217 956 diff --git a/bottleneck/tests/data/test_794_A b/bottleneck/tests/data/test_794_A new file mode 100644 index 0000000..3d5401c --- /dev/null +++ b/bottleneck/tests/data/test_794_A @@ -0,0 +1,10 @@ +1 160 +264 1182 +662 1435 +659 892 +47 845 +383 744 +773 1409 +895 906 +152 735 +344 870 diff --git a/bottleneck/tests/data/test_794_B b/bottleneck/tests/data/test_794_B new file mode 100644 index 0000000..26be9a3 --- /dev/null +++ b/bottleneck/tests/data/test_794_B @@ -0,0 +1,10 @@ +607 934 +865 900 +339 349 +888 1238 +981 1281 +1 554 +514 627 +77 1040 +911 1850 +276 1178 diff --git a/bottleneck/tests/data/test_795_A b/bottleneck/tests/data/test_795_A new file mode 100644 index 0000000..7c73f4d --- /dev/null +++ b/bottleneck/tests/data/test_795_A @@ -0,0 +1,10 @@ +494 905 +440 1385 +496 955 +162 1027 +237 421 +873 1102 +349 1346 +470 880 +364 822 +869 1335 diff --git a/bottleneck/tests/data/test_795_B b/bottleneck/tests/data/test_795_B new file mode 100644 index 0000000..afc371b --- /dev/null +++ b/bottleneck/tests/data/test_795_B @@ -0,0 +1,10 @@ +22 509 +741 1484 +558 982 +862 1077 +856 1695 +4 100 +995 1304 +103 990 +64 439 +883 1258 diff --git a/bottleneck/tests/data/test_796_A b/bottleneck/tests/data/test_796_A new file mode 100644 index 0000000..a326a52 --- /dev/null +++ b/bottleneck/tests/data/test_796_A @@ -0,0 +1,10 @@ +16 636 +823 1691 +880 1198 +967 1441 +501 745 +318 427 +177 192 +944 1596 +229 458 +570 1267 diff --git a/bottleneck/tests/data/test_796_B b/bottleneck/tests/data/test_796_B new file mode 100644 index 0000000..86d2cf9 --- /dev/null +++ b/bottleneck/tests/data/test_796_B @@ -0,0 +1,10 @@ +240 255 +28 64 +713 1016 +577 662 +838 1674 +41 365 +889 1477 +1000 1767 +58 393 +870 1574 diff --git a/bottleneck/tests/data/test_797_A b/bottleneck/tests/data/test_797_A new file mode 100644 index 0000000..b5149bf --- /dev/null +++ b/bottleneck/tests/data/test_797_A @@ -0,0 +1,10 @@ +258 711 +970 1782 +725 883 +626 1199 +785 1502 +713 820 +754 1570 +311 1068 +866 1364 +50 713 diff --git a/bottleneck/tests/data/test_797_B b/bottleneck/tests/data/test_797_B new file mode 100644 index 0000000..45ba81b --- /dev/null +++ b/bottleneck/tests/data/test_797_B @@ -0,0 +1,10 @@ +381 1350 +844 1724 +531 1460 +472 1208 +659 914 +745 757 +627 1608 +69 357 +298 621 +100 760 diff --git a/bottleneck/tests/data/test_798_A b/bottleneck/tests/data/test_798_A new file mode 100644 index 0000000..a053ddd --- /dev/null +++ b/bottleneck/tests/data/test_798_A @@ -0,0 +1,10 @@ +153 558 +364 847 +444 1083 +994 1375 +728 1585 +495 1005 +47 431 +361 1262 +645 646 +816 1742 diff --git a/bottleneck/tests/data/test_798_B b/bottleneck/tests/data/test_798_B new file mode 100644 index 0000000..69c921b --- /dev/null +++ b/bottleneck/tests/data/test_798_B @@ -0,0 +1,10 @@ +416 985 +449 995 +832 1102 +550 775 +367 614 +393 458 +340 890 +264 955 +10 50 +834 1137 diff --git a/bottleneck/tests/data/test_799_A b/bottleneck/tests/data/test_799_A new file mode 100644 index 0000000..374e56a --- /dev/null +++ b/bottleneck/tests/data/test_799_A @@ -0,0 +1,10 @@ +40 603 +309 973 +679 1580 +219 675 +92 934 +537 1366 +63 461 +408 807 +983 1016 +176 789 diff --git a/bottleneck/tests/data/test_799_B b/bottleneck/tests/data/test_799_B new file mode 100644 index 0000000..f92c370 --- /dev/null +++ b/bottleneck/tests/data/test_799_B @@ -0,0 +1,10 @@ +312 772 +963 1630 +613 920 +597 1153 +941 1187 +150 434 +269 804 +885 887 +649 881 +618 973 diff --git a/bottleneck/tests/data/test_800_A b/bottleneck/tests/data/test_800_A new file mode 100644 index 0000000..36aab61 --- /dev/null +++ b/bottleneck/tests/data/test_800_A @@ -0,0 +1,20 @@ +729 1257 +887 1370 +876 1762 +569 878 +13 393 +287 1169 +720 899 +338 892 +594 1438 +248 1204 +315 985 +796 1645 +730 1605 +323 490 +470 1454 +285 1067 +215 757 +92 325 +866 869 +899 1630 diff --git a/bottleneck/tests/data/test_800_B b/bottleneck/tests/data/test_800_B new file mode 100644 index 0000000..2496bcb --- /dev/null +++ b/bottleneck/tests/data/test_800_B @@ -0,0 +1,20 @@ +961 1808 +251 958 +152 851 +834 1250 +727 1719 +968 1220 +107 206 +564 1423 +475 1438 +884 1174 +928 1303 +39 708 +854 1539 +825 1094 +614 989 +281 856 +445 1141 +784 1664 +657 969 +154 1026 diff --git a/bottleneck/tests/data/test_801_A b/bottleneck/tests/data/test_801_A new file mode 100644 index 0000000..66ed176 --- /dev/null +++ b/bottleneck/tests/data/test_801_A @@ -0,0 +1,20 @@ +823 1484 +877 1798 +158 361 +59 670 +365 636 +536 831 +669 1574 +51 690 +243 1047 +579 1472 +450 618 +478 706 +850 1720 +10 822 +502 1081 +815 833 +192 629 +745 909 +936 1924 +619 1215 diff --git a/bottleneck/tests/data/test_801_B b/bottleneck/tests/data/test_801_B new file mode 100644 index 0000000..4376fcf --- /dev/null +++ b/bottleneck/tests/data/test_801_B @@ -0,0 +1,20 @@ +911 924 +564 1044 +939 1177 +226 536 +692 1241 +931 1421 +750 767 +427 630 +594 1388 +751 1751 +933 1190 +379 1220 +63 623 +79 190 +650 993 +508 1351 +961 1710 +619 863 +548 1358 +727 1515 diff --git a/bottleneck/tests/data/test_802_A b/bottleneck/tests/data/test_802_A new file mode 100644 index 0000000..6bfdeda --- /dev/null +++ b/bottleneck/tests/data/test_802_A @@ -0,0 +1,20 @@ +63 288 +994 1416 +92 461 +241 742 +325 877 +466 925 +923 1215 +941 1044 +618 1396 +248 1066 +383 442 +583 1016 +947 1095 +186 602 +291 448 +339 384 +467 1107 +771 942 +92 794 +2 533 diff --git a/bottleneck/tests/data/test_802_B b/bottleneck/tests/data/test_802_B new file mode 100644 index 0000000..eaec985 --- /dev/null +++ b/bottleneck/tests/data/test_802_B @@ -0,0 +1,20 @@ +350 416 +143 1004 +710 1425 +665 1101 +828 1491 +80 449 +977 1801 +497 509 +664 700 +405 670 +688 1502 +102 938 +893 1437 +245 728 +626 1333 +526 1473 +914 1253 +96 268 +693 1302 +982 1487 diff --git a/bottleneck/tests/data/test_803_A b/bottleneck/tests/data/test_803_A new file mode 100644 index 0000000..501248d --- /dev/null +++ b/bottleneck/tests/data/test_803_A @@ -0,0 +1,20 @@ +553 1373 +92 606 +892 1104 +804 1697 +653 953 +421 824 +670 1420 +621 1196 +912 1889 +482 1161 +381 691 +192 1146 +592 670 +920 1293 +754 1475 +217 379 +584 1551 +168 463 +212 251 +303 469 diff --git a/bottleneck/tests/data/test_803_B b/bottleneck/tests/data/test_803_B new file mode 100644 index 0000000..42dadd9 --- /dev/null +++ b/bottleneck/tests/data/test_803_B @@ -0,0 +1,20 @@ +252 701 +398 718 +663 871 +257 475 +998 1850 +292 587 +813 1363 +374 757 +295 749 +405 607 +21 374 +489 1313 +975 1840 +773 1423 +204 693 +149 532 +57 191 +307 618 +509 1109 +308 350 diff --git a/bottleneck/tests/data/test_804_A b/bottleneck/tests/data/test_804_A new file mode 100644 index 0000000..6af9294 --- /dev/null +++ b/bottleneck/tests/data/test_804_A @@ -0,0 +1,20 @@ +518 993 +44 915 +674 768 +122 870 +394 839 +631 1285 +805 1491 +521 802 +456 474 +450 1083 +555 1280 +858 1839 +131 144 +361 953 +600 985 +158 537 +771 1062 +286 1285 +168 397 +748 1722 diff --git a/bottleneck/tests/data/test_804_B b/bottleneck/tests/data/test_804_B new file mode 100644 index 0000000..8470b65 --- /dev/null +++ b/bottleneck/tests/data/test_804_B @@ -0,0 +1,20 @@ +132 843 +202 982 +374 1118 +9 980 +843 852 +537 761 +645 656 +882 1627 +51 619 +217 926 +870 1398 +87 1080 +223 1189 +160 379 +406 561 +536 1522 +353 487 +312 1180 +526 1492 +249 823 diff --git a/bottleneck/tests/data/test_805_A b/bottleneck/tests/data/test_805_A new file mode 100644 index 0000000..45a3198 --- /dev/null +++ b/bottleneck/tests/data/test_805_A @@ -0,0 +1,20 @@ +350 546 +268 1153 +401 757 +503 848 +981 1709 +161 948 +688 1661 +234 471 +397 801 +433 1024 +942 1394 +308 969 +32 690 +797 1248 +182 407 +714 1267 +577 1209 +775 919 +140 976 +366 1300 diff --git a/bottleneck/tests/data/test_805_B b/bottleneck/tests/data/test_805_B new file mode 100644 index 0000000..4967cfd --- /dev/null +++ b/bottleneck/tests/data/test_805_B @@ -0,0 +1,20 @@ +330 1222 +792 1359 +905 1402 +933 1482 +322 933 +440 887 +672 1438 +849 1650 +264 794 +21 219 +437 593 +159 598 +466 675 +712 1347 +566 1363 +244 382 +374 520 +729 1295 +998 1116 +954 1362 diff --git a/bottleneck/tests/data/test_806_A b/bottleneck/tests/data/test_806_A new file mode 100644 index 0000000..8eb1e33 --- /dev/null +++ b/bottleneck/tests/data/test_806_A @@ -0,0 +1,20 @@ +909 1049 +241 667 +928 1287 +838 1606 +159 1145 +395 714 +445 804 +897 1289 +770 1108 +649 714 +643 684 +436 561 +125 637 +704 856 +738 913 +478 1206 +396 1306 +106 213 +840 929 +320 1037 diff --git a/bottleneck/tests/data/test_806_B b/bottleneck/tests/data/test_806_B new file mode 100644 index 0000000..27727b2 --- /dev/null +++ b/bottleneck/tests/data/test_806_B @@ -0,0 +1,20 @@ +342 756 +736 1334 +769 1194 +352 967 +165 282 +209 306 +977 1040 +385 604 +141 566 +458 884 +186 477 +869 1651 +143 850 +742 1329 +212 872 +445 1214 +864 870 +836 1772 +534 1338 +338 1244 diff --git a/bottleneck/tests/data/test_807_A b/bottleneck/tests/data/test_807_A new file mode 100644 index 0000000..4979b7d --- /dev/null +++ b/bottleneck/tests/data/test_807_A @@ -0,0 +1,20 @@ +657 1104 +391 1193 +374 1227 +9 94 +458 555 +982 1529 +840 920 +831 1039 +468 1180 +912 1687 +988 1717 +33 324 +577 639 +426 1103 +733 1096 +41 421 +376 784 +823 1180 +389 1204 +788 1243 diff --git a/bottleneck/tests/data/test_807_B b/bottleneck/tests/data/test_807_B new file mode 100644 index 0000000..67610cb --- /dev/null +++ b/bottleneck/tests/data/test_807_B @@ -0,0 +1,20 @@ +295 1223 +755 1585 +860 1191 +281 873 +86 1000 +508 1264 +16 594 +616 747 +522 1196 +34 270 +422 1196 +22 801 +812 947 +91 517 +233 586 +167 475 +173 233 +130 807 +764 1691 +942 1622 diff --git a/bottleneck/tests/data/test_808_A b/bottleneck/tests/data/test_808_A new file mode 100644 index 0000000..b35d354 --- /dev/null +++ b/bottleneck/tests/data/test_808_A @@ -0,0 +1,20 @@ +395 768 +234 477 +627 1516 +353 1158 +108 195 +399 496 +787 1246 +330 553 +840 1835 +474 947 +736 1100 +248 381 +559 575 +716 1583 +873 1336 +927 1293 +857 1611 +691 1202 +293 770 +27 585 diff --git a/bottleneck/tests/data/test_808_B b/bottleneck/tests/data/test_808_B new file mode 100644 index 0000000..fb783cb --- /dev/null +++ b/bottleneck/tests/data/test_808_B @@ -0,0 +1,20 @@ +801 1397 +119 551 +305 964 +706 1119 +586 1050 +925 1532 +595 1000 +898 1753 +491 699 +450 802 +499 1011 +180 468 +616 768 +179 901 +89 144 +828 1466 +927 1852 +151 584 +213 997 +952 1055 diff --git a/bottleneck/tests/data/test_809_A b/bottleneck/tests/data/test_809_A new file mode 100644 index 0000000..e578429 --- /dev/null +++ b/bottleneck/tests/data/test_809_A @@ -0,0 +1,20 @@ +512 1083 +60 706 +61 93 +413 1076 +277 298 +766 1458 +984 1052 +762 1727 +356 422 +263 655 +605 968 +422 1373 +174 1033 +983 1676 +666 1005 +179 336 +553 1267 +987 1269 +756 1753 +842 1754 diff --git a/bottleneck/tests/data/test_809_B b/bottleneck/tests/data/test_809_B new file mode 100644 index 0000000..e4deda8 --- /dev/null +++ b/bottleneck/tests/data/test_809_B @@ -0,0 +1,20 @@ +178 1010 +727 738 +812 1638 +893 1821 +41 650 +797 1295 +174 473 +389 1244 +289 601 +626 1188 +890 1646 +296 318 +861 1582 +860 1410 +670 1574 +310 813 +186 263 +886 1796 +263 760 +396 1314 diff --git a/bottleneck/tests/data/test_810_A b/bottleneck/tests/data/test_810_A new file mode 100644 index 0000000..b7da658 --- /dev/null +++ b/bottleneck/tests/data/test_810_A @@ -0,0 +1,20 @@ +843 1230 +289 770 +614 776 +512 987 +326 1253 +651 932 +827 839 +945 1361 +492 706 +312 1139 +463 1394 +68 1045 +229 1200 +126 898 +494 1095 +893 1824 +548 889 +45 952 +136 725 +304 1154 diff --git a/bottleneck/tests/data/test_810_B b/bottleneck/tests/data/test_810_B new file mode 100644 index 0000000..06e2af4 --- /dev/null +++ b/bottleneck/tests/data/test_810_B @@ -0,0 +1,20 @@ +207 249 +374 690 +287 677 +566 817 +875 1590 +570 1096 +34 543 +344 801 +31 796 +681 1566 +402 835 +404 906 +754 1339 +96 514 +549 1065 +874 1762 +935 1530 +368 1331 +465 831 +890 1413 diff --git a/bottleneck/tests/data/test_811_A b/bottleneck/tests/data/test_811_A new file mode 100644 index 0000000..708fc33 --- /dev/null +++ b/bottleneck/tests/data/test_811_A @@ -0,0 +1,20 @@ +605 650 +57 484 +621 641 +794 1393 +951 1609 +132 656 +639 1132 +419 967 +741 1547 +105 466 +306 1270 +827 1475 +260 376 +418 1180 +458 1136 +957 1237 +363 749 +742 1038 +958 1157 +153 252 diff --git a/bottleneck/tests/data/test_811_B b/bottleneck/tests/data/test_811_B new file mode 100644 index 0000000..69bffab --- /dev/null +++ b/bottleneck/tests/data/test_811_B @@ -0,0 +1,20 @@ +687 1060 +622 650 +544 1212 +38 633 +280 956 +695 791 +120 956 +364 435 +825 1760 +137 303 +701 1432 +967 1395 +566 966 +695 951 +85 262 +82 595 +11 100 +312 1104 +669 1424 +157 285 diff --git a/bottleneck/tests/data/test_812_A b/bottleneck/tests/data/test_812_A new file mode 100644 index 0000000..f592f5f --- /dev/null +++ b/bottleneck/tests/data/test_812_A @@ -0,0 +1,20 @@ +333 661 +942 1519 +825 1088 +68 726 +443 1398 +918 1335 +853 1787 +163 269 +158 214 +444 1036 +163 670 +124 834 +745 890 +728 1254 +981 1370 +858 1117 +159 700 +978 1371 +554 1366 +112 689 diff --git a/bottleneck/tests/data/test_812_B b/bottleneck/tests/data/test_812_B new file mode 100644 index 0000000..7e37dec --- /dev/null +++ b/bottleneck/tests/data/test_812_B @@ -0,0 +1,20 @@ +228 896 +635 880 +250 930 +8 479 +168 214 +366 775 +41 981 +461 692 +337 839 +870 1634 +497 511 +253 389 +807 913 +487 1348 +245 1186 +222 1169 +254 810 +855 1471 +399 1155 +433 1194 diff --git a/bottleneck/tests/data/test_813_A b/bottleneck/tests/data/test_813_A new file mode 100644 index 0000000..94bbbc3 --- /dev/null +++ b/bottleneck/tests/data/test_813_A @@ -0,0 +1,20 @@ +45 843 +606 637 +981 1438 +769 1525 +694 1370 +596 1454 +365 813 +164 704 +198 347 +115 553 +767 1119 +663 1052 +379 697 +294 335 +457 1253 +320 1147 +508 830 +506 738 +381 1010 +896 1376 diff --git a/bottleneck/tests/data/test_813_B b/bottleneck/tests/data/test_813_B new file mode 100644 index 0000000..54ce63b --- /dev/null +++ b/bottleneck/tests/data/test_813_B @@ -0,0 +1,20 @@ +519 1068 +65 460 +199 429 +695 1050 +407 524 +24 581 +54 728 +843 1551 +773 829 +355 644 +145 962 +837 1238 +796 830 +383 791 +86 1028 +461 1145 +270 1231 +374 837 +730 875 +659 1188 diff --git a/bottleneck/tests/data/test_814_A b/bottleneck/tests/data/test_814_A new file mode 100644 index 0000000..3eb0a25 --- /dev/null +++ b/bottleneck/tests/data/test_814_A @@ -0,0 +1,20 @@ +571 1312 +384 842 +418 932 +388 1146 +857 1045 +952 1326 +551 631 +820 1105 +791 884 +50 788 +697 1165 +840 1425 +130 169 +106 615 +429 1085 +428 567 +138 762 +364 1304 +116 1013 +50 983 diff --git a/bottleneck/tests/data/test_814_B b/bottleneck/tests/data/test_814_B new file mode 100644 index 0000000..a65d82f --- /dev/null +++ b/bottleneck/tests/data/test_814_B @@ -0,0 +1,20 @@ +617 718 +320 697 +164 654 +423 821 +444 1368 +211 382 +184 857 +799 1071 +866 924 +48 829 +90 249 +378 1336 +817 832 +6 246 +115 280 +363 447 +422 964 +902 1809 +637 1073 +585 606 diff --git a/bottleneck/tests/data/test_815_A b/bottleneck/tests/data/test_815_A new file mode 100644 index 0000000..ae366c6 --- /dev/null +++ b/bottleneck/tests/data/test_815_A @@ -0,0 +1,20 @@ +911 1198 +516 1091 +421 1381 +257 824 +272 394 +75 841 +659 805 +980 1436 +237 431 +668 1221 +441 1057 +560 849 +305 1270 +572 929 +460 812 +471 640 +50 773 +1 446 +895 1610 +837 1400 diff --git a/bottleneck/tests/data/test_815_B b/bottleneck/tests/data/test_815_B new file mode 100644 index 0000000..6d11d46 --- /dev/null +++ b/bottleneck/tests/data/test_815_B @@ -0,0 +1,20 @@ +589 1196 +872 1375 +473 627 +522 671 +940 1274 +666 1453 +1 861 +656 1221 +669 866 +916 1378 +340 773 +454 1020 +190 561 +828 1606 +356 693 +876 1220 +644 763 +991 1241 +559 1095 +124 406 diff --git a/bottleneck/tests/data/test_816_A b/bottleneck/tests/data/test_816_A new file mode 100644 index 0000000..54dc128 --- /dev/null +++ b/bottleneck/tests/data/test_816_A @@ -0,0 +1,20 @@ +376 1109 +877 1496 +817 1426 +647 703 +92 672 +909 1671 +580 965 +626 1528 +347 1159 +551 1396 +432 941 +7 766 +1 370 +664 1384 +106 448 +763 1190 +768 892 +19 465 +220 1188 +96 554 diff --git a/bottleneck/tests/data/test_816_B b/bottleneck/tests/data/test_816_B new file mode 100644 index 0000000..56f00ce --- /dev/null +++ b/bottleneck/tests/data/test_816_B @@ -0,0 +1,20 @@ +930 1560 +702 1257 +174 988 +712 777 +150 355 +146 617 +265 954 +519 820 +575 1117 +603 1133 +910 1817 +363 415 +102 347 +925 1565 +621 1336 +203 752 +743 1550 +39 310 +904 1206 +696 1445 diff --git a/bottleneck/tests/data/test_817_A b/bottleneck/tests/data/test_817_A new file mode 100644 index 0000000..8c01be3 --- /dev/null +++ b/bottleneck/tests/data/test_817_A @@ -0,0 +1,20 @@ +14 829 +708 1194 +415 1028 +395 1236 +294 792 +319 730 +490 889 +424 1364 +512 864 +820 1563 +461 880 +345 686 +318 407 +993 1857 +833 882 +937 1452 +376 719 +171 852 +457 523 +156 784 diff --git a/bottleneck/tests/data/test_817_B b/bottleneck/tests/data/test_817_B new file mode 100644 index 0000000..1aa1eaa --- /dev/null +++ b/bottleneck/tests/data/test_817_B @@ -0,0 +1,20 @@ +544 1398 +776 1241 +56 1054 +942 1736 +752 1563 +475 1241 +423 923 +553 1023 +101 846 +841 1613 +895 1353 +832 1502 +300 915 +986 1488 +397 648 +823 1196 +457 1079 +371 471 +398 1114 +50 853 diff --git a/bottleneck/tests/data/test_818_A b/bottleneck/tests/data/test_818_A new file mode 100644 index 0000000..44ac7de --- /dev/null +++ b/bottleneck/tests/data/test_818_A @@ -0,0 +1,20 @@ +296 395 +102 172 +9 500 +426 574 +931 1885 +76 901 +202 1197 +462 1135 +87 907 +109 780 +186 238 +297 833 +142 360 +719 1106 +25 775 +626 1219 +911 1619 +9 322 +158 222 +843 1086 diff --git a/bottleneck/tests/data/test_818_B b/bottleneck/tests/data/test_818_B new file mode 100644 index 0000000..83c706c --- /dev/null +++ b/bottleneck/tests/data/test_818_B @@ -0,0 +1,20 @@ +989 1945 +718 1675 +126 965 +27 359 +756 962 +158 737 +149 473 +748 896 +779 1215 +685 933 +742 1449 +717 1575 +834 1467 +80 377 +634 1348 +419 766 +345 733 +111 753 +138 1014 +452 1429 diff --git a/bottleneck/tests/data/test_819_A b/bottleneck/tests/data/test_819_A new file mode 100644 index 0000000..1065f24 --- /dev/null +++ b/bottleneck/tests/data/test_819_A @@ -0,0 +1,20 @@ +119 806 +187 942 +454 844 +581 583 +753 1715 +199 380 +623 697 +63 469 +929 1518 +960 1306 +996 1011 +157 203 +666 1505 +14 693 +414 536 +461 1330 +975 1260 +375 1004 +375 1145 +453 723 diff --git a/bottleneck/tests/data/test_819_B b/bottleneck/tests/data/test_819_B new file mode 100644 index 0000000..f1c8ba3 --- /dev/null +++ b/bottleneck/tests/data/test_819_B @@ -0,0 +1,20 @@ +184 385 +214 473 +11 1007 +301 516 +689 820 +267 1052 +26 720 +414 726 +946 1295 +720 1275 +430 1272 +119 349 +850 1371 +738 1125 +450 1222 +728 1503 +951 1796 +843 947 +856 983 +705 996 diff --git a/bottleneck/tests/data/test_820_A b/bottleneck/tests/data/test_820_A new file mode 100644 index 0000000..1f23572 --- /dev/null +++ b/bottleneck/tests/data/test_820_A @@ -0,0 +1,30 @@ +232 279 +761 1519 +175 773 +522 1293 +336 381 +478 998 +61 328 +450 1350 +669 1085 +602 870 +286 987 +593 897 +358 742 +900 1878 +441 668 +109 977 +847 1651 +41 863 +94 851 +240 491 +335 1150 +135 748 +480 1052 +420 572 +837 1662 +629 1223 +895 1453 +304 1051 +424 553 +308 714 diff --git a/bottleneck/tests/data/test_820_B b/bottleneck/tests/data/test_820_B new file mode 100644 index 0000000..3465e1b --- /dev/null +++ b/bottleneck/tests/data/test_820_B @@ -0,0 +1,30 @@ +309 934 +8 585 +213 1043 +116 589 +436 679 +70 715 +604 1194 +562 1151 +727 1616 +404 632 +948 1712 +934 1186 +690 1385 +636 682 +140 888 +738 884 +704 1593 +868 979 +954 1310 +605 1513 +955 1763 +730 1719 +393 1159 +325 1279 +35 153 +436 838 +249 1157 +394 921 +634 1242 +914 1138 diff --git a/bottleneck/tests/data/test_821_A b/bottleneck/tests/data/test_821_A new file mode 100644 index 0000000..ab4fa20 --- /dev/null +++ b/bottleneck/tests/data/test_821_A @@ -0,0 +1,30 @@ +610 907 +704 897 +228 1047 +459 1435 +105 904 +492 1288 +557 863 +368 622 +715 1240 +627 1465 +823 1003 +823 891 +724 853 +227 933 +88 600 +735 1479 +591 757 +260 347 +314 1130 +342 985 +80 990 +93 137 +153 761 +91 408 +497 1011 +980 1277 +916 1437 +81 1038 +735 1143 +374 773 diff --git a/bottleneck/tests/data/test_821_B b/bottleneck/tests/data/test_821_B new file mode 100644 index 0000000..36073ce --- /dev/null +++ b/bottleneck/tests/data/test_821_B @@ -0,0 +1,30 @@ +575 1235 +999 1599 +78 560 +384 694 +217 646 +709 1344 +772 1755 +542 994 +376 1248 +924 1462 +675 892 +927 1354 +306 1292 +573 1316 +731 1424 +445 911 +145 588 +402 822 +584 920 +374 831 +636 1237 +580 614 +490 1107 +529 1074 +652 1460 +892 1245 +917 1530 +679 1511 +725 820 +620 1439 diff --git a/bottleneck/tests/data/test_822_A b/bottleneck/tests/data/test_822_A new file mode 100644 index 0000000..38b5219 --- /dev/null +++ b/bottleneck/tests/data/test_822_A @@ -0,0 +1,30 @@ +416 1100 +661 1339 +612 962 +593 1233 +642 1509 +574 969 +202 450 +370 787 +14 937 +974 1336 +420 775 +808 1662 +304 319 +492 555 +740 1524 +935 1749 +88 758 +995 1590 +40 963 +141 1031 +695 886 +504 1111 +684 1360 +861 1552 +482 746 +89 547 +493 598 +190 310 +806 1384 +472 1459 diff --git a/bottleneck/tests/data/test_822_B b/bottleneck/tests/data/test_822_B new file mode 100644 index 0000000..c61c33e --- /dev/null +++ b/bottleneck/tests/data/test_822_B @@ -0,0 +1,30 @@ +843 1057 +860 1286 +703 1268 +545 1381 +515 1186 +178 952 +456 907 +713 964 +555 981 +332 1263 +11 112 +291 347 +958 1460 +723 1182 +850 865 +631 677 +227 640 +676 1506 +256 610 +581 1468 +15 619 +233 1100 +35 957 +444 817 +517 1318 +129 318 +765 1584 +733 1001 +932 998 +693 1076 diff --git a/bottleneck/tests/data/test_823_A b/bottleneck/tests/data/test_823_A new file mode 100644 index 0000000..5d441a2 --- /dev/null +++ b/bottleneck/tests/data/test_823_A @@ -0,0 +1,30 @@ +817 1477 +662 1416 +722 1408 +43 588 +583 585 +159 836 +752 922 +529 727 +55 60 +447 1200 +248 735 +520 1121 +541 1379 +704 1640 +681 1454 +234 385 +884 1063 +884 1535 +612 704 +55 102 +214 913 +597 1576 +19 919 +907 951 +785 1577 +185 281 +567 680 +577 1162 +323 495 +321 920 diff --git a/bottleneck/tests/data/test_823_B b/bottleneck/tests/data/test_823_B new file mode 100644 index 0000000..e1ae113 --- /dev/null +++ b/bottleneck/tests/data/test_823_B @@ -0,0 +1,30 @@ +562 1532 +19 557 +758 1238 +732 1011 +116 761 +988 1621 +783 786 +128 964 +208 249 +111 948 +510 719 +711 1630 +99 769 +159 816 +295 807 +485 1332 +848 1845 +721 1534 +344 1341 +678 1465 +665 889 +734 1611 +246 783 +238 618 +401 809 +234 571 +527 1227 +690 1550 +278 729 +454 591 diff --git a/bottleneck/tests/data/test_824_A b/bottleneck/tests/data/test_824_A new file mode 100644 index 0000000..3bfc169 --- /dev/null +++ b/bottleneck/tests/data/test_824_A @@ -0,0 +1,30 @@ +333 858 +230 978 +281 1158 +880 1314 +816 1259 +840 1631 +385 979 +413 537 +378 697 +222 486 +213 285 +664 1109 +7 300 +482 903 +325 338 +616 875 +46 548 +145 965 +126 760 +873 1030 +533 1087 +417 487 +510 919 +760 1722 +144 897 +136 412 +88 137 +704 1084 +457 744 +424 1148 diff --git a/bottleneck/tests/data/test_824_B b/bottleneck/tests/data/test_824_B new file mode 100644 index 0000000..192df92 --- /dev/null +++ b/bottleneck/tests/data/test_824_B @@ -0,0 +1,30 @@ +285 785 +57 516 +410 1131 +794 1019 +732 1499 +391 1297 +104 689 +294 976 +748 1061 +806 1309 +118 995 +7 994 +952 1007 +994 1296 +340 1335 +387 762 +800 946 +757 1299 +167 976 +538 802 +147 808 +51 694 +20 353 +290 376 +575 1395 +294 1074 +754 1042 +461 474 +634 1525 +491 1208 diff --git a/bottleneck/tests/data/test_825_A b/bottleneck/tests/data/test_825_A new file mode 100644 index 0000000..5dc0d10 --- /dev/null +++ b/bottleneck/tests/data/test_825_A @@ -0,0 +1,30 @@ +727 1401 +217 1102 +836 1270 +380 446 +569 1295 +55 504 +239 312 +872 1710 +552 1075 +584 1470 +402 438 +441 1296 +194 1105 +643 1563 +933 1180 +448 735 +749 1583 +725 1624 +533 1043 +952 1467 +548 926 +839 926 +5 724 +768 1115 +557 578 +712 1472 +279 1121 +399 808 +601 951 +293 422 diff --git a/bottleneck/tests/data/test_825_B b/bottleneck/tests/data/test_825_B new file mode 100644 index 0000000..e440801 --- /dev/null +++ b/bottleneck/tests/data/test_825_B @@ -0,0 +1,30 @@ +466 883 +492 1180 +645 1446 +138 604 +469 1261 +110 409 +923 1649 +101 397 +410 440 +655 1223 +280 822 +564 701 +736 1735 +645 1272 +495 982 +339 389 +188 738 +669 1263 +106 658 +981 1256 +815 1378 +914 1482 +193 855 +361 1134 +885 1858 +98 576 +577 897 +528 549 +152 154 +363 886 diff --git a/bottleneck/tests/data/test_826_A b/bottleneck/tests/data/test_826_A new file mode 100644 index 0000000..8fbcf93 --- /dev/null +++ b/bottleneck/tests/data/test_826_A @@ -0,0 +1,30 @@ +669 1220 +577 787 +982 1553 +218 1116 +715 831 +383 780 +328 925 +216 612 +635 1185 +211 707 +915 1130 +223 693 +468 1277 +570 1219 +281 1037 +759 1522 +435 1201 +356 582 +996 1867 +369 833 +584 1415 +472 1174 +6 905 +329 358 +703 1331 +141 180 +136 204 +873 1858 +107 943 +158 1153 diff --git a/bottleneck/tests/data/test_826_B b/bottleneck/tests/data/test_826_B new file mode 100644 index 0000000..10fe424 --- /dev/null +++ b/bottleneck/tests/data/test_826_B @@ -0,0 +1,30 @@ +651 1534 +143 212 +685 962 +100 862 +34 102 +333 1131 +274 651 +142 1075 +312 751 +848 1583 +396 548 +377 1071 +824 1067 +932 1352 +510 1339 +435 561 +259 1223 +434 1080 +974 1509 +618 1604 +795 1363 +668 1299 +532 1157 +326 632 +182 768 +611 1431 +62 528 +832 1370 +413 1373 +153 813 diff --git a/bottleneck/tests/data/test_827_A b/bottleneck/tests/data/test_827_A new file mode 100644 index 0000000..c1c63c9 --- /dev/null +++ b/bottleneck/tests/data/test_827_A @@ -0,0 +1,30 @@ +211 875 +625 678 +698 1671 +942 1243 +129 250 +370 497 +725 1322 +195 1094 +382 1059 +973 1185 +877 1196 +863 1764 +645 1372 +4 484 +29 156 +802 1201 +195 1074 +261 1181 +139 1099 +768 1204 +882 1317 +107 693 +928 1275 +459 1071 +270 633 +384 906 +493 576 +909 1222 +212 437 +74 656 diff --git a/bottleneck/tests/data/test_827_B b/bottleneck/tests/data/test_827_B new file mode 100644 index 0000000..57ea673 --- /dev/null +++ b/bottleneck/tests/data/test_827_B @@ -0,0 +1,30 @@ +804 1730 +244 333 +131 547 +866 1012 +364 546 +530 950 +702 824 +290 418 +636 795 +202 618 +858 1059 +140 687 +76 447 +60 499 +502 1080 +858 1704 +555 585 +503 1152 +151 787 +565 1211 +172 556 +322 422 +176 952 +333 572 +40 982 +656 1365 +553 1493 +600 680 +72 555 +711 769 diff --git a/bottleneck/tests/data/test_828_A b/bottleneck/tests/data/test_828_A new file mode 100644 index 0000000..ee02128 --- /dev/null +++ b/bottleneck/tests/data/test_828_A @@ -0,0 +1,30 @@ +227 983 +778 1655 +311 1256 +462 911 +100 932 +411 895 +738 1086 +375 1308 +899 1896 +742 1425 +909 1290 +68 375 +148 195 +981 1120 +848 1463 +234 616 +45 314 +180 447 +368 1310 +443 734 +721 1345 +617 1376 +340 767 +420 1094 +848 979 +984 1866 +996 1169 +28 895 +203 1153 +535 1241 diff --git a/bottleneck/tests/data/test_828_B b/bottleneck/tests/data/test_828_B new file mode 100644 index 0000000..92fae09 --- /dev/null +++ b/bottleneck/tests/data/test_828_B @@ -0,0 +1,30 @@ +309 789 +405 1405 +610 1330 +213 683 +768 1598 +843 1024 +898 1445 +625 1363 +557 996 +455 1026 +146 1137 +411 617 +155 969 +93 444 +92 206 +470 927 +792 1691 +871 984 +551 1271 +801 1755 +134 505 +270 1081 +382 852 +549 686 +2 314 +146 428 +460 1373 +602 1492 +950 1060 +516 1438 diff --git a/bottleneck/tests/data/test_829_A b/bottleneck/tests/data/test_829_A new file mode 100644 index 0000000..fceb407 --- /dev/null +++ b/bottleneck/tests/data/test_829_A @@ -0,0 +1,30 @@ +222 1184 +346 478 +748 1587 +29 615 +190 1077 +889 1417 +381 1314 +388 448 +654 1525 +876 1242 +306 625 +289 660 +251 355 +4 963 +310 1154 +216 1065 +7 10 +75 525 +249 1084 +972 1796 +938 1780 +218 1156 +959 1810 +530 785 +562 1005 +483 751 +892 1440 +352 493 +676 1329 +718 1688 diff --git a/bottleneck/tests/data/test_829_B b/bottleneck/tests/data/test_829_B new file mode 100644 index 0000000..85f538c --- /dev/null +++ b/bottleneck/tests/data/test_829_B @@ -0,0 +1,30 @@ +910 1441 +681 1671 +845 1784 +354 1210 +4 180 +830 1486 +466 566 +808 1728 +1 589 +808 862 +404 543 +304 879 +618 1013 +905 1788 +912 1187 +228 604 +959 1487 +793 1275 +631 1205 +151 157 +984 1427 +244 578 +875 1741 +654 1288 +506 780 +827 1138 +213 928 +30 420 +670 1438 +448 737 diff --git a/bottleneck/tests/data/test_830_A b/bottleneck/tests/data/test_830_A new file mode 100644 index 0000000..fd54955 --- /dev/null +++ b/bottleneck/tests/data/test_830_A @@ -0,0 +1,30 @@ +35 644 +830 1511 +414 677 +768 1461 +467 1032 +152 1060 +960 1807 +566 831 +550 1210 +521 1018 +250 651 +698 699 +979 1102 +555 1516 +463 1057 +739 896 +330 549 +412 775 +775 1433 +733 1438 +430 1342 +7 751 +338 943 +923 1173 +734 1460 +880 1453 +225 1004 +571 1375 +739 1085 +288 1202 diff --git a/bottleneck/tests/data/test_830_B b/bottleneck/tests/data/test_830_B new file mode 100644 index 0000000..5b9d84b --- /dev/null +++ b/bottleneck/tests/data/test_830_B @@ -0,0 +1,30 @@ +814 1305 +205 1199 +972 1431 +37 488 +673 1079 +630 1288 +698 828 +970 1666 +516 625 +65 209 +752 1716 +12 992 +563 1552 +821 1168 +460 943 +616 682 +386 546 +249 638 +583 1024 +38 889 +491 1020 +179 964 +995 1256 +861 1632 +252 518 +255 344 +480 1200 +89 711 +598 1022 +632 677 diff --git a/bottleneck/tests/data/test_831_A b/bottleneck/tests/data/test_831_A new file mode 100644 index 0000000..fe09be1 --- /dev/null +++ b/bottleneck/tests/data/test_831_A @@ -0,0 +1,30 @@ +772 1298 +705 1567 +946 1693 +632 1045 +752 875 +919 1723 +657 884 +708 1156 +442 1086 +571 1454 +641 894 +371 1152 +762 952 +684 760 +275 369 +858 994 +485 730 +921 1267 +643 928 +353 1307 +384 406 +154 380 +299 998 +378 1208 +27 265 +948 1081 +551 1512 +50 308 +773 1297 +134 514 diff --git a/bottleneck/tests/data/test_831_B b/bottleneck/tests/data/test_831_B new file mode 100644 index 0000000..1f4d148 --- /dev/null +++ b/bottleneck/tests/data/test_831_B @@ -0,0 +1,30 @@ +757 1588 +145 1094 +523 1331 +687 1430 +877 1046 +573 696 +359 1012 +711 734 +368 552 +588 1267 +231 702 +64 429 +901 1202 +93 467 +647 1449 +747 994 +364 692 +384 833 +143 390 +445 1283 +248 696 +397 451 +695 1014 +852 1363 +512 1491 +983 1278 +506 841 +533 1031 +26 813 +850 1601 diff --git a/bottleneck/tests/data/test_832_A b/bottleneck/tests/data/test_832_A new file mode 100644 index 0000000..79d3383 --- /dev/null +++ b/bottleneck/tests/data/test_832_A @@ -0,0 +1,30 @@ +373 1269 +753 1101 +529 825 +462 539 +52 293 +878 1396 +67 683 +106 1096 +973 1589 +129 911 +556 1327 +743 1248 +687 1505 +804 1322 +338 703 +438 1149 +539 730 +802 1046 +462 803 +175 506 +382 796 +470 1219 +608 1146 +12 757 +713 1367 +719 1001 +451 585 +408 1308 +29 510 +67 866 diff --git a/bottleneck/tests/data/test_832_B b/bottleneck/tests/data/test_832_B new file mode 100644 index 0000000..9106904 --- /dev/null +++ b/bottleneck/tests/data/test_832_B @@ -0,0 +1,30 @@ +239 1006 +358 806 +53 229 +529 931 +923 1837 +644 1410 +761 1240 +511 966 +639 1127 +874 1114 +604 995 +916 1100 +634 1043 +317 607 +43 613 +9 216 +349 1035 +48 193 +396 986 +809 1193 +307 832 +86 786 +934 1164 +534 1434 +960 1092 +13 799 +658 1056 +411 1382 +378 568 +808 1400 diff --git a/bottleneck/tests/data/test_833_A b/bottleneck/tests/data/test_833_A new file mode 100644 index 0000000..1dbdd95 --- /dev/null +++ b/bottleneck/tests/data/test_833_A @@ -0,0 +1,30 @@ +505 885 +170 695 +258 297 +652 996 +987 1055 +937 1159 +846 1133 +984 1715 +243 1199 +596 827 +40 585 +589 1356 +305 943 +974 1253 +965 1615 +840 1238 +842 1407 +596 1296 +603 741 +839 966 +300 951 +852 1656 +783 1676 +45 631 +973 1199 +513 725 +133 391 +633 1132 +442 1271 +100 401 diff --git a/bottleneck/tests/data/test_833_B b/bottleneck/tests/data/test_833_B new file mode 100644 index 0000000..a325070 --- /dev/null +++ b/bottleneck/tests/data/test_833_B @@ -0,0 +1,30 @@ +152 524 +210 255 +714 1034 +808 1480 +594 1020 +33 742 +285 562 +437 1341 +716 903 +767 1201 +146 938 +608 1275 +54 601 +752 1037 +896 1514 +113 321 +986 1932 +453 1382 +93 547 +687 1677 +134 1122 +5 268 +31 66 +832 1755 +313 966 +602 834 +433 679 +548 789 +414 1414 +734 1061 diff --git a/bottleneck/tests/data/test_834_A b/bottleneck/tests/data/test_834_A new file mode 100644 index 0000000..7088d54 --- /dev/null +++ b/bottleneck/tests/data/test_834_A @@ -0,0 +1,30 @@ +709 1214 +541 1328 +291 925 +23 570 +334 447 +648 808 +532 1226 +315 509 +796 1147 +435 1417 +336 1183 +401 893 +184 721 +496 509 +274 841 +463 625 +906 1694 +512 1242 +617 1494 +874 1805 +162 621 +802 1074 +904 993 +124 653 +44 818 +577 1417 +520 1294 +574 709 +317 394 +643 1152 diff --git a/bottleneck/tests/data/test_834_B b/bottleneck/tests/data/test_834_B new file mode 100644 index 0000000..5dd4204 --- /dev/null +++ b/bottleneck/tests/data/test_834_B @@ -0,0 +1,30 @@ +176 662 +579 764 +544 706 +68 939 +230 345 +901 1737 +714 1299 +482 1000 +290 802 +760 1461 +647 1412 +781 1498 +354 780 +697 818 +375 709 +794 1664 +989 1869 +320 729 +688 1029 +853 1290 +679 1504 +918 1749 +767 1734 +300 996 +625 900 +123 496 +89 408 +255 679 +329 1248 +659 1003 diff --git a/bottleneck/tests/data/test_835_A b/bottleneck/tests/data/test_835_A new file mode 100644 index 0000000..47e934b --- /dev/null +++ b/bottleneck/tests/data/test_835_A @@ -0,0 +1,30 @@ +554 1108 +257 549 +102 222 +531 715 +977 1231 +292 534 +624 1603 +394 508 +936 1007 +139 427 +457 1069 +873 1535 +789 887 +912 1213 +503 1307 +734 889 +789 1372 +811 1701 +558 1477 +485 763 +711 876 +961 1691 +294 635 +963 1955 +737 1563 +15 980 +23 339 +770 1156 +399 1341 +886 1049 diff --git a/bottleneck/tests/data/test_835_B b/bottleneck/tests/data/test_835_B new file mode 100644 index 0000000..9a3edbe --- /dev/null +++ b/bottleneck/tests/data/test_835_B @@ -0,0 +1,30 @@ +38 645 +994 1933 +145 1066 +900 1210 +691 1208 +672 959 +349 445 +567 1137 +547 1325 +943 1437 +591 712 +526 750 +2 227 +108 667 +137 722 +327 1192 +396 1374 +390 1069 +396 783 +927 1242 +870 1797 +532 1049 +543 1081 +470 917 +738 1731 +814 1558 +794 1555 +439 499 +593 1490 +349 410 diff --git a/bottleneck/tests/data/test_836_A b/bottleneck/tests/data/test_836_A new file mode 100644 index 0000000..1a9885f --- /dev/null +++ b/bottleneck/tests/data/test_836_A @@ -0,0 +1,30 @@ +790 1396 +959 1240 +518 1462 +797 1737 +356 649 +304 716 +773 1583 +888 1299 +355 801 +318 1109 +271 1257 +645 820 +292 1221 +792 968 +879 1494 +253 642 +105 802 +917 1305 +648 1646 +724 1157 +566 1056 +868 1437 +398 1098 +601 917 +436 1368 +26 933 +670 1615 +189 367 +79 1050 +955 1528 diff --git a/bottleneck/tests/data/test_836_B b/bottleneck/tests/data/test_836_B new file mode 100644 index 0000000..8335ddf --- /dev/null +++ b/bottleneck/tests/data/test_836_B @@ -0,0 +1,30 @@ +135 337 +332 1300 +859 1117 +591 988 +441 1441 +174 635 +78 703 +10 648 +188 422 +292 830 +492 1179 +104 276 +263 640 +63 760 +993 1248 +107 644 +723 747 +85 698 +276 410 +407 735 +229 810 +512 561 +802 1555 +542 818 +666 1499 +383 754 +132 216 +581 723 +775 1446 +908 1029 diff --git a/bottleneck/tests/data/test_837_A b/bottleneck/tests/data/test_837_A new file mode 100644 index 0000000..8d3facc --- /dev/null +++ b/bottleneck/tests/data/test_837_A @@ -0,0 +1,30 @@ +456 998 +976 1929 +745 1606 +77 375 +149 692 +508 1466 +68 113 +493 1163 +185 1109 +761 1172 +313 1261 +508 1091 +122 834 +766 1333 +996 1208 +161 468 +688 903 +551 744 +745 1522 +579 1022 +149 722 +458 652 +8 758 +801 1344 +96 696 +589 1125 +589 989 +941 1492 +851 1168 +670 728 diff --git a/bottleneck/tests/data/test_837_B b/bottleneck/tests/data/test_837_B new file mode 100644 index 0000000..8439a1f --- /dev/null +++ b/bottleneck/tests/data/test_837_B @@ -0,0 +1,30 @@ +102 508 +437 603 +199 669 +853 1602 +106 722 +732 771 +301 538 +505 988 +731 1707 +276 1142 +923 1449 +366 1330 +221 833 +107 174 +914 1231 +651 1411 +137 666 +781 1074 +459 655 +509 1344 +74 234 +927 1739 +960 1461 +556 608 +644 805 +457 971 +992 1522 +798 887 +147 944 +96 111 diff --git a/bottleneck/tests/data/test_838_A b/bottleneck/tests/data/test_838_A new file mode 100644 index 0000000..9f6e83e --- /dev/null +++ b/bottleneck/tests/data/test_838_A @@ -0,0 +1,30 @@ +918 952 +225 1163 +801 1184 +786 1485 +512 747 +389 756 +966 1924 +542 720 +742 1207 +329 891 +273 1268 +701 1015 +29 682 +303 1139 +716 1617 +362 1135 +540 1071 +58 497 +725 1445 +46 688 +931 1327 +467 1229 +303 916 +702 1067 +862 1258 +535 1347 +640 1252 +619 1377 +702 1237 +971 1779 diff --git a/bottleneck/tests/data/test_838_B b/bottleneck/tests/data/test_838_B new file mode 100644 index 0000000..227776e --- /dev/null +++ b/bottleneck/tests/data/test_838_B @@ -0,0 +1,30 @@ +898 1448 +295 893 +829 1147 +149 339 +529 1046 +729 1258 +602 1296 +571 672 +953 1890 +26 777 +984 1487 +879 1533 +456 1103 +741 1227 +235 718 +65 102 +432 1037 +307 824 +977 1325 +275 582 +753 1683 +809 1622 +63 478 +648 1273 +945 1446 +234 843 +354 1134 +298 1160 +471 882 +911 1296 diff --git a/bottleneck/tests/data/test_839_A b/bottleneck/tests/data/test_839_A new file mode 100644 index 0000000..073be3c --- /dev/null +++ b/bottleneck/tests/data/test_839_A @@ -0,0 +1,30 @@ +488 765 +890 1359 +573 1009 +876 1603 +430 1408 +774 1380 +786 881 +392 1227 +506 755 +844 1516 +716 1555 +697 1415 +816 908 +981 1231 +775 1437 +224 582 +657 1045 +937 1441 +428 682 +865 1547 +802 1736 +700 1196 +881 1569 +507 875 +884 1852 +176 345 +278 338 +78 384 +562 781 +463 1403 diff --git a/bottleneck/tests/data/test_839_B b/bottleneck/tests/data/test_839_B new file mode 100644 index 0000000..ca5ee3e --- /dev/null +++ b/bottleneck/tests/data/test_839_B @@ -0,0 +1,30 @@ +768 1077 +971 1887 +547 1058 +468 905 +54 250 +727 782 +101 407 +111 1085 +637 826 +209 531 +690 1134 +989 1111 +817 848 +862 952 +530 679 +431 823 +958 1666 +973 1598 +423 766 +42 736 +833 1832 +206 848 +148 336 +804 1691 +186 361 +53 288 +449 1314 +618 904 +759 1339 +8 923 diff --git a/bottleneck/tests/data/test_840_A b/bottleneck/tests/data/test_840_A new file mode 100644 index 0000000..02ed823 --- /dev/null +++ b/bottleneck/tests/data/test_840_A @@ -0,0 +1,50 @@ +121 1010 +730 1566 +866 872 +984 1105 +12 455 +503 963 +956 1410 +986 1887 +929 1377 +809 823 +129 1090 +545 640 +641 921 +786 916 +222 474 +464 677 +357 1055 +199 1046 +327 892 +449 1272 +564 1505 +867 1494 +383 585 +617 1200 +254 997 +528 994 +458 507 +250 1217 +141 1104 +710 1191 +565 1355 +959 1876 +323 665 +290 1141 +749 1035 +641 817 +855 1596 +296 610 +144 215 +563 776 +77 599 +380 1160 +720 811 +55 905 +389 830 +268 1170 +579 1272 +240 811 +552 737 +498 844 diff --git a/bottleneck/tests/data/test_840_B b/bottleneck/tests/data/test_840_B new file mode 100644 index 0000000..4bd5737 --- /dev/null +++ b/bottleneck/tests/data/test_840_B @@ -0,0 +1,50 @@ +156 272 +847 1154 +32 482 +781 1129 +956 1017 +429 1305 +312 1054 +11 979 +495 1463 +645 1524 +521 901 +685 1414 +741 1123 +179 428 +475 1073 +360 1315 +435 524 +897 1422 +668 1253 +538 802 +79 329 +791 1484 +557 772 +831 950 +640 666 +196 358 +214 394 +738 1566 +788 1752 +932 1820 +853 1847 +561 1446 +671 1490 +792 1123 +892 1481 +9 650 +92 308 +760 1021 +807 1449 +721 1693 +932 1892 +674 734 +837 1338 +313 507 +300 686 +264 1045 +210 788 +426 1169 +354 1154 +711 1322 diff --git a/bottleneck/tests/data/test_841_A b/bottleneck/tests/data/test_841_A new file mode 100644 index 0000000..d6b2c08 --- /dev/null +++ b/bottleneck/tests/data/test_841_A @@ -0,0 +1,50 @@ +932 1449 +350 597 +425 503 +858 1265 +781 1372 +293 300 +593 806 +958 1619 +647 819 +598 1284 +160 571 +651 955 +521 1143 +906 1546 +848 1529 +729 1180 +990 1245 +54 398 +404 1096 +88 896 +679 1094 +737 1504 +609 1460 +32 747 +338 1060 +565 1216 +637 1537 +449 1042 +889 1510 +184 241 +103 584 +136 919 +503 659 +848 1333 +890 941 +360 836 +418 506 +750 994 +963 1068 +712 1501 +331 396 +515 617 +555 728 +81 401 +186 654 +934 1122 +649 843 +953 1342 +316 622 +866 1234 diff --git a/bottleneck/tests/data/test_841_B b/bottleneck/tests/data/test_841_B new file mode 100644 index 0000000..9775dd8 --- /dev/null +++ b/bottleneck/tests/data/test_841_B @@ -0,0 +1,50 @@ +381 908 +662 956 +316 894 +326 664 +655 1453 +261 430 +385 866 +630 1168 +117 237 +603 1595 +19 419 +375 1154 +982 1372 +897 1324 +347 687 +868 1049 +53 1031 +722 1078 +918 1107 +675 1326 +485 505 +777 1032 +76 273 +231 1113 +751 1180 +937 1635 +156 873 +641 1316 +632 1052 +54 1021 +993 1159 +905 1039 +606 1293 +235 364 +530 540 +326 843 +636 1442 +474 814 +176 942 +924 1685 +668 817 +560 1090 +805 1794 +679 1076 +409 1108 +582 1311 +21 449 +142 622 +614 1153 +570 908 diff --git a/bottleneck/tests/data/test_842_A b/bottleneck/tests/data/test_842_A new file mode 100644 index 0000000..49124dc --- /dev/null +++ b/bottleneck/tests/data/test_842_A @@ -0,0 +1,50 @@ +205 815 +309 971 +468 1170 +602 1127 +239 434 +403 631 +80 500 +14 864 +594 1199 +406 407 +30 360 +188 993 +381 1063 +175 1087 +357 1063 +153 1117 +600 1365 +662 1189 +513 744 +339 1332 +860 1720 +897 1406 +462 808 +191 234 +542 729 +425 738 +159 160 +821 1536 +327 355 +616 1302 +699 1148 +870 1512 +810 1146 +448 564 +881 1246 +364 833 +889 1160 +102 175 +385 731 +86 659 +14 321 +257 1193 +685 1606 +174 925 +165 1021 +116 419 +775 1510 +53 614 +18 39 +561 670 diff --git a/bottleneck/tests/data/test_842_B b/bottleneck/tests/data/test_842_B new file mode 100644 index 0000000..36715f2 --- /dev/null +++ b/bottleneck/tests/data/test_842_B @@ -0,0 +1,50 @@ +577 1182 +779 1169 +525 1384 +851 968 +906 1679 +221 445 +494 653 +813 1061 +478 1174 +37 224 +700 1239 +338 855 +82 670 +159 872 +932 1231 +89 411 +869 1484 +708 966 +814 1075 +108 203 +603 691 +797 1680 +869 1223 +162 165 +281 333 +650 721 +200 665 +692 1332 +497 1331 +948 1098 +351 1188 +844 1508 +319 762 +302 442 +320 617 +220 649 +498 882 +411 711 +833 1373 +943 1586 +310 544 +24 818 +485 903 +58 1028 +84 1023 +69 823 +399 634 +755 945 +460 764 +583 800 diff --git a/bottleneck/tests/data/test_843_A b/bottleneck/tests/data/test_843_A new file mode 100644 index 0000000..aa5cea9 --- /dev/null +++ b/bottleneck/tests/data/test_843_A @@ -0,0 +1,50 @@ +855 1686 +375 653 +487 968 +501 1179 +269 747 +102 128 +756 1241 +934 1507 +707 1166 +438 644 +215 482 +186 1134 +588 1179 +323 806 +260 948 +999 1181 +809 866 +383 618 +667 1211 +697 1543 +216 289 +618 1318 +230 633 +261 439 +36 430 +926 1424 +573 1382 +545 1489 +198 254 +997 1313 +625 1138 +71 216 +123 152 +966 1260 +583 1455 +685 1595 +319 803 +809 1754 +543 672 +973 1482 +282 1191 +94 413 +933 1847 +593 770 +384 463 +301 531 +306 832 +645 679 +863 1024 +257 716 diff --git a/bottleneck/tests/data/test_843_B b/bottleneck/tests/data/test_843_B new file mode 100644 index 0000000..b14eed6 --- /dev/null +++ b/bottleneck/tests/data/test_843_B @@ -0,0 +1,50 @@ +36 726 +683 1328 +991 1393 +822 1642 +499 1065 +41 726 +770 903 +83 190 +993 1392 +584 1281 +520 643 +878 1560 +461 694 +715 1155 +752 1593 +592 622 +8 746 +280 816 +571 797 +24 712 +799 1664 +988 1479 +397 1339 +827 1088 +466 1179 +701 1236 +841 1384 +360 1235 +425 739 +982 1503 +188 345 +161 405 +366 1067 +245 975 +834 1160 +19 508 +594 1292 +149 267 +201 891 +22 922 +984 1108 +731 1251 +871 1092 +946 1519 +772 1388 +738 1194 +924 1862 +35 765 +904 1276 +190 235 diff --git a/bottleneck/tests/data/test_844_A b/bottleneck/tests/data/test_844_A new file mode 100644 index 0000000..753b2fc --- /dev/null +++ b/bottleneck/tests/data/test_844_A @@ -0,0 +1,50 @@ +207 275 +665 774 +655 1360 +274 366 +83 646 +435 599 +479 793 +74 1043 +604 1048 +106 557 +885 1524 +694 1680 +770 833 +38 261 +6 547 +893 1287 +732 1589 +343 1201 +531 1088 +962 1666 +979 1708 +206 538 +73 114 +354 1140 +220 330 +299 833 +694 883 +651 701 +256 425 +551 612 +709 1304 +806 1613 +193 901 +29 916 +257 313 +806 1193 +205 530 +981 1851 +878 1208 +327 799 +958 1874 +783 1109 +466 537 +349 1191 +410 630 +513 837 +587 1033 +777 1202 +90 503 +893 1737 diff --git a/bottleneck/tests/data/test_844_B b/bottleneck/tests/data/test_844_B new file mode 100644 index 0000000..373d26c --- /dev/null +++ b/bottleneck/tests/data/test_844_B @@ -0,0 +1,50 @@ +67 793 +551 1443 +572 1395 +51 149 +805 920 +541 1479 +365 1244 +997 1447 +234 900 +144 1068 +418 929 +720 903 +155 219 +937 1905 +371 1112 +983 1372 +607 1244 +259 1217 +708 850 +992 1713 +398 968 +0 588 +167 742 +465 577 +188 892 +924 1045 +103 892 +489 1072 +170 195 +448 1141 +990 1075 +880 894 +703 1565 +318 785 +843 1614 +326 995 +104 185 +333 1186 +483 631 +246 797 +407 701 +333 545 +73 181 +591 1202 +851 1721 +615 1260 +504 1421 +472 486 +65 189 +986 1801 diff --git a/bottleneck/tests/data/test_845_A b/bottleneck/tests/data/test_845_A new file mode 100644 index 0000000..2015fbb --- /dev/null +++ b/bottleneck/tests/data/test_845_A @@ -0,0 +1,50 @@ +446 1114 +872 1568 +544 1415 +144 507 +256 602 +208 382 +899 1217 +756 1597 +428 574 +201 843 +609 770 +443 531 +479 955 +959 1238 +821 1798 +564 1526 +26 545 +264 633 +34 527 +153 213 +215 703 +925 964 +651 1041 +32 797 +234 1162 +166 544 +407 981 +817 1528 +883 1412 +867 1173 +327 358 +326 330 +540 1054 +632 1503 +632 1465 +240 799 +954 1859 +214 374 +546 1395 +914 1529 +680 1588 +367 377 +890 971 +289 1247 +31 846 +810 1172 +658 1366 +537 1089 +256 1134 +16 1008 diff --git a/bottleneck/tests/data/test_845_B b/bottleneck/tests/data/test_845_B new file mode 100644 index 0000000..b053f52 --- /dev/null +++ b/bottleneck/tests/data/test_845_B @@ -0,0 +1,50 @@ +537 582 +313 723 +386 619 +121 1100 +466 1044 +502 581 +16 838 +599 1395 +899 1523 +589 591 +36 928 +896 1718 +16 252 +99 722 +925 1343 +328 1244 +245 973 +596 1499 +122 763 +945 1563 +38 452 +680 890 +499 1247 +295 803 +385 1357 +885 1780 +597 637 +193 313 +951 1019 +679 1344 +991 1447 +697 1551 +834 1223 +57 795 +657 775 +374 1093 +187 398 +706 1353 +904 1801 +538 932 +843 1632 +370 1250 +590 957 +996 1385 +364 714 +307 689 +866 1687 +547 1072 +451 864 +746 900 diff --git a/bottleneck/tests/data/test_846_A b/bottleneck/tests/data/test_846_A new file mode 100644 index 0000000..520c6d4 --- /dev/null +++ b/bottleneck/tests/data/test_846_A @@ -0,0 +1,50 @@ +659 889 +754 1573 +955 1466 +177 454 +109 235 +107 1086 +741 949 +689 1029 +288 564 +987 1133 +235 240 +398 1178 +27 395 +483 863 +509 1192 +920 1870 +732 1501 +494 1321 +190 362 +278 778 +726 1309 +397 1117 +7 888 +514 1366 +598 902 +48 950 +103 506 +770 1359 +689 1403 +340 1072 +191 850 +512 742 +441 507 +67 201 +50 781 +649 1619 +457 843 +756 993 +343 361 +505 1029 +687 707 +496 1371 +854 990 +555 1488 +217 249 +477 837 +150 258 +514 1286 +170 982 +160 521 diff --git a/bottleneck/tests/data/test_846_B b/bottleneck/tests/data/test_846_B new file mode 100644 index 0000000..3046f20 --- /dev/null +++ b/bottleneck/tests/data/test_846_B @@ -0,0 +1,50 @@ +701 1467 +679 1557 +705 1082 +845 1787 +776 824 +890 1825 +867 1265 +105 710 +282 1235 +900 1455 +598 1253 +642 794 +304 961 +492 778 +16 233 +301 1249 +524 1358 +884 1577 +542 1423 +856 1110 +768 883 +226 755 +18 940 +846 916 +512 1411 +598 1196 +841 1345 +306 891 +571 981 +353 918 +840 1652 +886 1748 +269 1233 +940 1583 +364 1070 +187 683 +350 1141 +730 1223 +333 701 +284 449 +846 1539 +509 1400 +21 696 +543 778 +714 1428 +304 348 +475 1353 +594 1122 +426 946 +418 1312 diff --git a/bottleneck/tests/data/test_847_A b/bottleneck/tests/data/test_847_A new file mode 100644 index 0000000..ee5c8c1 --- /dev/null +++ b/bottleneck/tests/data/test_847_A @@ -0,0 +1,50 @@ +780 1633 +384 1190 +605 779 +787 1716 +504 698 +879 1796 +446 1258 +386 649 +830 1220 +576 717 +888 1126 +457 1259 +975 1588 +717 1266 +737 914 +103 695 +906 1516 +454 516 +696 899 +43 921 +613 781 +325 858 +655 1647 +72 601 +143 707 +293 1064 +13 310 +610 1021 +975 1576 +185 1017 +983 1261 +197 286 +68 472 +997 1630 +197 1191 +11 58 +804 1741 +364 519 +977 1124 +557 1184 +727 1681 +652 918 +928 1838 +675 1074 +551 976 +320 1244 +675 1477 +962 1898 +843 1490 +449 640 diff --git a/bottleneck/tests/data/test_847_B b/bottleneck/tests/data/test_847_B new file mode 100644 index 0000000..de6f45a --- /dev/null +++ b/bottleneck/tests/data/test_847_B @@ -0,0 +1,50 @@ +198 500 +390 1022 +911 1544 +842 1778 +213 793 +173 1093 +61 455 +340 1005 +905 1418 +814 1236 +476 518 +133 382 +291 1249 +350 359 +967 1585 +441 810 +324 836 +769 1325 +828 1770 +758 1471 +9 499 +649 882 +418 1135 +28 97 +703 1400 +316 535 +799 1286 +16 348 +323 536 +113 864 +248 745 +468 597 +689 1618 +278 1208 +978 1589 +339 402 +232 442 +236 928 +856 1570 +709 1560 +34 260 +810 1365 +787 1781 +675 1043 +800 1255 +479 1118 +363 592 +97 729 +929 1430 +860 1219 diff --git a/bottleneck/tests/data/test_848_A b/bottleneck/tests/data/test_848_A new file mode 100644 index 0000000..e9e603b --- /dev/null +++ b/bottleneck/tests/data/test_848_A @@ -0,0 +1,50 @@ +697 1454 +137 892 +466 950 +881 1230 +539 1162 +247 1065 +859 1032 +861 1215 +8 142 +772 1757 +458 1102 +382 730 +166 1086 +606 1008 +74 82 +967 1701 +562 1019 +648 764 +759 1745 +483 1208 +501 808 +942 1717 +569 888 +686 1292 +68 796 +504 1268 +655 1529 +335 451 +139 339 +709 1570 +238 542 +999 1912 +904 1545 +735 1386 +265 909 +935 1749 +745 787 +397 1083 +295 963 +12 523 +769 943 +998 1204 +531 1528 +596 1140 +173 1030 +810 1356 +728 750 +554 1185 +334 643 +879 1368 diff --git a/bottleneck/tests/data/test_848_B b/bottleneck/tests/data/test_848_B new file mode 100644 index 0000000..00005be --- /dev/null +++ b/bottleneck/tests/data/test_848_B @@ -0,0 +1,50 @@ +885 1435 +500 978 +291 765 +353 1157 +527 1446 +734 904 +302 393 +199 918 +561 744 +96 349 +338 631 +503 1162 +286 589 +492 544 +826 1742 +924 1340 +707 877 +691 1487 +883 1530 +233 810 +73 252 +192 595 +271 491 +915 1426 +128 781 +906 1244 +268 308 +979 1349 +823 1647 +993 1177 +318 961 +619 1143 +857 1682 +92 110 +676 1202 +485 1468 +968 1064 +565 634 +49 1043 +487 1316 +668 1425 +552 1443 +589 655 +515 850 +858 1826 +514 779 +322 506 +422 996 +213 1013 +897 1711 diff --git a/bottleneck/tests/data/test_849_A b/bottleneck/tests/data/test_849_A new file mode 100644 index 0000000..7938a96 --- /dev/null +++ b/bottleneck/tests/data/test_849_A @@ -0,0 +1,50 @@ +785 1228 +858 997 +734 1553 +888 1700 +553 1433 +352 385 +851 1468 +803 950 +358 715 +376 1290 +419 784 +38 689 +504 1285 +250 768 +344 1015 +295 1063 +501 1219 +995 1383 +781 1320 +260 1154 +290 942 +683 918 +623 1468 +74 654 +742 1201 +919 974 +718 1316 +591 821 +864 1035 +591 951 +922 1553 +751 1468 +57 832 +809 1103 +243 322 +605 919 +947 1101 +7 1003 +655 1586 +737 1610 +537 935 +185 455 +466 834 +160 599 +386 1035 +381 448 +841 1005 +898 1693 +493 729 +506 685 diff --git a/bottleneck/tests/data/test_849_B b/bottleneck/tests/data/test_849_B new file mode 100644 index 0000000..21da75d --- /dev/null +++ b/bottleneck/tests/data/test_849_B @@ -0,0 +1,50 @@ +87 1055 +578 1265 +657 1071 +939 1551 +679 1032 +768 1665 +668 1163 +689 1159 +229 1083 +358 1158 +515 595 +972 1301 +764 1428 +551 1533 +770 929 +104 172 +948 1359 +48 854 +510 995 +914 1735 +228 440 +854 1064 +351 908 +664 1290 +919 1050 +882 1794 +472 819 +826 1133 +279 944 +363 1081 +296 934 +227 749 +172 931 +583 1524 +409 848 +284 804 +436 1098 +96 768 +632 646 +832 1167 +862 1470 +544 1519 +889 1030 +422 1414 +948 1105 +967 1273 +552 589 +986 1793 +52 252 +430 864 diff --git a/bottleneck/tests/data/test_850_A b/bottleneck/tests/data/test_850_A new file mode 100644 index 0000000..dfb2165 --- /dev/null +++ b/bottleneck/tests/data/test_850_A @@ -0,0 +1,50 @@ +819 907 +322 836 +10 262 +950 1844 +280 419 +724 1489 +982 1737 +183 305 +393 1066 +958 1033 +328 554 +609 1374 +512 835 +563 1444 +671 972 +161 838 +631 851 +867 1362 +995 1134 +990 1841 +479 839 +439 502 +408 917 +879 1633 +725 863 +271 614 +757 1203 +70 980 +745 841 +739 1679 +269 934 +926 1412 +977 1200 +532 1251 +607 708 +524 726 +737 983 +700 1200 +715 1247 +301 596 +136 869 +290 397 +88 764 +250 945 +0 378 +595 1513 +612 874 +706 757 +353 712 +509 953 diff --git a/bottleneck/tests/data/test_850_B b/bottleneck/tests/data/test_850_B new file mode 100644 index 0000000..573788d --- /dev/null +++ b/bottleneck/tests/data/test_850_B @@ -0,0 +1,50 @@ +602 1008 +42 926 +253 1183 +404 631 +779 1700 +698 1638 +92 1004 +296 370 +204 378 +225 593 +685 1259 +982 1447 +544 951 +682 1653 +449 1092 +664 1035 +856 1428 +658 1320 +615 1113 +83 285 +276 745 +297 363 +590 732 +547 999 +440 901 +337 830 +492 595 +487 1018 +159 1115 +853 1350 +139 377 +9 573 +47 505 +187 480 +374 510 +831 1626 +948 1484 +450 1028 +840 1390 +132 288 +472 1025 +74 260 +281 518 +95 248 +699 735 +275 1183 +802 971 +119 1091 +709 1224 +397 855 diff --git a/bottleneck/tests/data/test_851_A b/bottleneck/tests/data/test_851_A new file mode 100644 index 0000000..0a2f88e --- /dev/null +++ b/bottleneck/tests/data/test_851_A @@ -0,0 +1,50 @@ +390 859 +367 1332 +230 1179 +734 1289 +67 554 +186 319 +787 841 +516 1218 +616 1597 +551 1223 +669 862 +265 888 +24 428 +841 1616 +816 1058 +922 1460 +749 1311 +734 1658 +581 973 +780 1708 +99 1091 +851 1503 +161 1118 +944 1804 +456 458 +395 1163 +880 1842 +850 1397 +359 461 +996 1098 +337 1164 +975 994 +512 816 +436 648 +42 59 +586 841 +48 65 +352 821 +58 171 +870 1085 +639 763 +415 1274 +549 913 +37 47 +820 1311 +120 854 +924 1272 +325 800 +483 888 +167 512 diff --git a/bottleneck/tests/data/test_851_B b/bottleneck/tests/data/test_851_B new file mode 100644 index 0000000..8e4b97e --- /dev/null +++ b/bottleneck/tests/data/test_851_B @@ -0,0 +1,50 @@ +173 900 +214 742 +715 941 +288 723 +561 1288 +482 789 +555 1396 +244 1162 +24 229 +897 1127 +809 1700 +785 1558 +76 361 +453 827 +61 728 +600 986 +237 887 +720 1191 +834 1643 +576 1344 +764 1307 +417 1377 +780 1174 +187 235 +776 1010 +952 970 +377 1184 +454 979 +758 970 +330 1179 +364 1105 +101 909 +481 692 +579 1234 +623 1088 +425 464 +360 503 +534 882 +363 1011 +973 1732 +413 504 +171 514 +89 282 +430 1044 +531 610 +713 873 +737 1131 +807 1603 +584 1034 +887 1189 diff --git a/bottleneck/tests/data/test_852_A b/bottleneck/tests/data/test_852_A new file mode 100644 index 0000000..3d8f706 --- /dev/null +++ b/bottleneck/tests/data/test_852_A @@ -0,0 +1,50 @@ +473 535 +32 734 +940 1633 +31 264 +217 284 +963 1618 +780 1453 +436 606 +958 1899 +509 1436 +1000 1824 +793 889 +667 1236 +647 1383 +588 1280 +682 1431 +617 765 +740 799 +640 1082 +724 1466 +540 1456 +772 1324 +551 1437 +270 1096 +709 1110 +317 876 +6 185 +612 686 +220 1032 +55 414 +272 669 +233 973 +264 825 +58 779 +92 330 +837 910 +106 237 +980 1316 +806 1161 +433 1270 +304 900 +569 882 +459 563 +991 1221 +33 686 +228 429 +527 542 +911 1456 +395 938 +825 1625 diff --git a/bottleneck/tests/data/test_852_B b/bottleneck/tests/data/test_852_B new file mode 100644 index 0000000..9de826f --- /dev/null +++ b/bottleneck/tests/data/test_852_B @@ -0,0 +1,50 @@ +380 777 +698 1291 +826 1366 +108 741 +88 586 +50 631 +333 860 +51 355 +746 1232 +864 1129 +312 868 +514 591 +818 940 +561 1106 +997 1618 +986 1648 +417 1273 +544 1325 +343 1332 +852 1788 +740 1072 +890 957 +880 1540 +110 1072 +969 1706 +964 1771 +366 1347 +542 631 +863 1294 +216 864 +766 1148 +436 1431 +227 989 +694 786 +216 801 +119 946 +607 1270 +300 1178 +338 572 +374 509 +233 934 +531 542 +174 504 +521 738 +837 1202 +231 528 +595 1041 +530 1474 +218 852 +874 1675 diff --git a/bottleneck/tests/data/test_853_A b/bottleneck/tests/data/test_853_A new file mode 100644 index 0000000..bcf5afe --- /dev/null +++ b/bottleneck/tests/data/test_853_A @@ -0,0 +1,50 @@ +200 886 +263 814 +456 853 +495 694 +864 1233 +80 743 +147 356 +164 450 +250 1230 +759 792 +417 1228 +572 1002 +854 1634 +806 1057 +522 1196 +684 1295 +999 1547 +301 1014 +772 1685 +816 923 +820 876 +118 348 +340 849 +686 824 +874 1610 +510 1503 +602 1309 +677 1497 +146 1008 +853 1484 +729 1333 +617 1097 +511 935 +143 938 +485 552 +433 980 +859 1077 +3 717 +176 1136 +436 1213 +163 418 +505 889 +303 689 +837 1225 +296 345 +814 1699 +603 1524 +679 1224 +729 1714 +760 953 diff --git a/bottleneck/tests/data/test_853_B b/bottleneck/tests/data/test_853_B new file mode 100644 index 0000000..d294f05 --- /dev/null +++ b/bottleneck/tests/data/test_853_B @@ -0,0 +1,50 @@ +223 899 +821 1752 +179 260 +757 1350 +661 1211 +397 1004 +114 557 +579 1379 +752 1531 +292 818 +459 580 +715 1007 +849 1067 +495 1197 +803 991 +588 1569 +362 1316 +38 961 +899 1762 +325 906 +411 1364 +320 1221 +301 674 +811 1126 +464 1441 +220 1130 +514 784 +196 240 +946 1543 +614 928 +610 626 +628 1059 +576 829 +363 1272 +338 888 +470 497 +767 824 +578 645 +136 573 +563 731 +794 1510 +466 1243 +341 1080 +34 787 +901 1260 +339 1068 +406 746 +135 590 +507 1272 +705 756 diff --git a/bottleneck/tests/data/test_854_A b/bottleneck/tests/data/test_854_A new file mode 100644 index 0000000..4765953 --- /dev/null +++ b/bottleneck/tests/data/test_854_A @@ -0,0 +1,50 @@ +670 1518 +858 1578 +59 559 +503 768 +14 876 +830 858 +978 1670 +648 1003 +620 1028 +522 809 +678 1574 +303 1157 +238 748 +886 987 +445 1100 +994 1772 +50 602 +134 315 +885 1274 +862 1737 +369 1231 +199 594 +611 1387 +517 1513 +731 865 +357 1222 +137 822 +894 1389 +839 1547 +962 1432 +170 512 +596 907 +480 545 +416 889 +311 1213 +897 1057 +394 1075 +943 1054 +342 1014 +137 742 +163 843 +655 763 +642 1182 +753 1458 +200 958 +289 311 +726 808 +614 1330 +796 1506 +292 555 diff --git a/bottleneck/tests/data/test_854_B b/bottleneck/tests/data/test_854_B new file mode 100644 index 0000000..aa949eb --- /dev/null +++ b/bottleneck/tests/data/test_854_B @@ -0,0 +1,50 @@ +232 702 +892 1789 +441 1152 +710 975 +908 1187 +315 530 +255 334 +502 1485 +820 1718 +531 1002 +694 1032 +183 594 +924 1037 +948 1015 +465 906 +854 1761 +257 924 +588 1298 +382 1070 +315 646 +68 997 +924 1788 +927 1813 +522 1496 +667 1585 +884 1720 +373 1104 +140 1087 +988 1426 +690 796 +538 1095 +458 489 +685 805 +554 1389 +708 1480 +155 566 +704 891 +194 356 +607 1330 +512 725 +343 985 +660 1310 +117 1001 +454 1189 +554 1122 +722 1493 +805 1093 +60 419 +403 1277 +847 1750 diff --git a/bottleneck/tests/data/test_855_A b/bottleneck/tests/data/test_855_A new file mode 100644 index 0000000..ab7ec0b --- /dev/null +++ b/bottleneck/tests/data/test_855_A @@ -0,0 +1,50 @@ +614 654 +663 1260 +449 1202 +762 985 +173 235 +219 556 +230 1224 +569 739 +65 145 +814 1671 +395 1280 +224 1211 +349 1209 +628 1611 +680 1532 +644 1398 +971 1611 +574 1353 +832 1740 +866 1082 +822 1654 +786 1770 +200 1071 +709 1343 +955 1924 +78 546 +168 872 +251 735 +505 1392 +719 799 +321 327 +823 1682 +327 788 +85 640 +423 1306 +581 665 +476 665 +257 926 +305 600 +828 1419 +957 1645 +22 783 +760 1281 +890 1141 +756 1272 +852 1339 +162 1155 +661 1360 +328 597 +81 549 diff --git a/bottleneck/tests/data/test_855_B b/bottleneck/tests/data/test_855_B new file mode 100644 index 0000000..be6ff94 --- /dev/null +++ b/bottleneck/tests/data/test_855_B @@ -0,0 +1,50 @@ +758 1131 +201 805 +622 704 +457 770 +211 1153 +604 1593 +658 1229 +845 1733 +3 55 +813 1682 +926 1122 +87 399 +415 1287 +943 1357 +538 884 +39 447 +678 1201 +469 977 +445 1406 +931 992 +137 843 +914 1789 +736 1382 +933 1376 +426 1190 +332 715 +385 1226 +727 1493 +972 1306 +674 1674 +801 1277 +542 1301 +591 1067 +318 1136 +90 552 +168 232 +814 1715 +860 1249 +104 353 +841 1674 +775 1615 +517 693 +103 261 +472 517 +56 570 +767 1433 +839 1303 +683 1605 +311 700 +89 256 diff --git a/bottleneck/tests/data/test_856_A b/bottleneck/tests/data/test_856_A new file mode 100644 index 0000000..3cbfae3 --- /dev/null +++ b/bottleneck/tests/data/test_856_A @@ -0,0 +1,50 @@ +719 1457 +209 663 +890 1735 +774 1570 +582 935 +231 1051 +723 1681 +341 1197 +4 150 +30 263 +38 984 +950 1487 +523 609 +453 854 +956 1422 +180 436 +690 966 +848 1237 +972 1095 +120 843 +523 1438 +49 182 +294 622 +586 1385 +750 786 +856 1407 +327 1270 +655 957 +373 1358 +372 785 +727 1497 +308 567 +784 1046 +315 913 +862 1742 +699 1337 +24 662 +407 455 +24 393 +913 1501 +13 1005 +709 1107 +264 1079 +107 781 +275 805 +164 179 +445 1355 +907 1785 +571 629 +953 1080 diff --git a/bottleneck/tests/data/test_856_B b/bottleneck/tests/data/test_856_B new file mode 100644 index 0000000..ec34ae9 --- /dev/null +++ b/bottleneck/tests/data/test_856_B @@ -0,0 +1,50 @@ +724 1643 +458 1388 +638 1303 +431 1405 +710 861 +659 723 +714 1351 +402 1186 +730 1584 +304 788 +845 850 +331 451 +421 1121 +821 1257 +2 923 +246 1167 +776 1109 +307 963 +553 1262 +841 1061 +27 290 +507 1297 +471 935 +583 1176 +781 955 +286 703 +178 303 +674 1372 +942 968 +521 1497 +6 593 +198 375 +263 1085 +486 1143 +807 1093 +17 795 +921 1559 +577 1316 +45 282 +670 1319 +228 400 +480 1047 +477 1308 +971 1055 +336 396 +731 941 +995 1354 +535 1309 +648 1642 +441 1432 diff --git a/bottleneck/tests/data/test_857_A b/bottleneck/tests/data/test_857_A new file mode 100644 index 0000000..6bbbf0b --- /dev/null +++ b/bottleneck/tests/data/test_857_A @@ -0,0 +1,50 @@ +155 1103 +527 601 +613 714 +27 82 +288 1267 +522 713 +839 925 +554 1132 +148 255 +692 1319 +216 257 +11 251 +199 862 +371 724 +728 1561 +314 918 +452 540 +30 958 +745 1698 +434 1341 +469 1469 +913 1715 +599 1267 +260 953 +182 511 +504 1442 +597 1080 +300 888 +459 1000 +563 1521 +563 1468 +760 1702 +8 519 +393 910 +108 255 +375 1168 +344 1257 +563 1052 +813 1139 +999 1599 +175 785 +847 882 +825 1567 +977 1567 +218 847 +921 1150 +888 1280 +395 761 +495 1444 +195 1091 diff --git a/bottleneck/tests/data/test_857_B b/bottleneck/tests/data/test_857_B new file mode 100644 index 0000000..2d0ac7d --- /dev/null +++ b/bottleneck/tests/data/test_857_B @@ -0,0 +1,50 @@ +781 853 +693 1641 +405 573 +301 1124 +303 1182 +839 1546 +597 1040 +56 318 +13 902 +667 878 +555 979 +486 1277 +647 782 +602 1195 +218 288 +59 487 +581 822 +703 842 +123 587 +173 609 +841 975 +554 641 +828 1660 +872 1486 +511 1069 +454 942 +933 1266 +416 643 +59 582 +278 354 +687 901 +1 930 +473 917 +604 950 +122 639 +126 987 +105 1046 +705 1298 +749 1143 +394 417 +15 16 +356 751 +955 1065 +599 813 +881 1008 +984 1857 +531 1371 +354 668 +747 1406 +738 1675 diff --git a/bottleneck/tests/data/test_858_A b/bottleneck/tests/data/test_858_A new file mode 100644 index 0000000..1d3b9ad --- /dev/null +++ b/bottleneck/tests/data/test_858_A @@ -0,0 +1,50 @@ +997 1050 +873 1795 +636 907 +851 1847 +38 669 +941 1873 +706 814 +776 882 +723 1329 +578 1461 +697 727 +369 1010 +426 1101 +552 720 +196 1177 +346 515 +701 1633 +399 514 +937 1425 +566 1446 +605 962 +260 696 +675 1180 +359 672 +192 355 +919 1323 +38 663 +688 1298 +239 504 +349 402 +842 1446 +831 1046 +442 770 +78 160 +351 1088 +577 1360 +29 290 +290 507 +467 1363 +1000 1796 +58 709 +428 615 +397 470 +628 1481 +874 1036 +32 84 +349 524 +244 821 +552 654 +762 1121 diff --git a/bottleneck/tests/data/test_858_B b/bottleneck/tests/data/test_858_B new file mode 100644 index 0000000..a982114 --- /dev/null +++ b/bottleneck/tests/data/test_858_B @@ -0,0 +1,50 @@ +788 1123 +394 925 +228 647 +718 993 +774 961 +984 1106 +712 1001 +607 1594 +627 967 +971 1710 +166 510 +25 544 +985 1358 +205 1127 +844 1792 +510 518 +479 517 +828 1454 +61 1061 +647 1410 +727 1585 +94 479 +768 922 +162 895 +735 754 +951 1358 +747 1267 +933 980 +319 1007 +183 1000 +521 778 +129 375 +235 1221 +392 808 +872 1465 +380 794 +915 1896 +242 621 +908 1118 +341 593 +393 1304 +469 1169 +733 1077 +979 1477 +786 1583 +923 1650 +867 896 +714 1479 +860 907 +310 461 diff --git a/bottleneck/tests/data/test_859_A b/bottleneck/tests/data/test_859_A new file mode 100644 index 0000000..24bd533 --- /dev/null +++ b/bottleneck/tests/data/test_859_A @@ -0,0 +1,50 @@ +305 883 +599 1497 +157 582 +832 1048 +62 403 +263 1151 +898 962 +258 428 +309 729 +626 1318 +279 415 +635 1029 +898 974 +733 1187 +661 1430 +243 1046 +498 865 +70 189 +834 1801 +820 1278 +972 1686 +255 826 +761 1694 +383 593 +326 491 +442 684 +523 1381 +229 1215 +402 551 +514 1133 +493 677 +415 996 +301 389 +586 1554 +21 956 +861 1058 +625 1082 +599 1208 +672 1147 +335 1229 +119 282 +114 772 +104 250 +236 977 +804 1446 +310 1229 +727 1176 +660 1484 +650 1188 +782 1781 diff --git a/bottleneck/tests/data/test_859_B b/bottleneck/tests/data/test_859_B new file mode 100644 index 0000000..ac8c3b7 --- /dev/null +++ b/bottleneck/tests/data/test_859_B @@ -0,0 +1,50 @@ +676 874 +562 574 +260 841 +590 1249 +517 1185 +85 807 +447 909 +50 185 +961 1522 +825 1594 +159 879 +105 1015 +767 1661 +828 1827 +341 355 +104 716 +1000 1615 +135 156 +580 1099 +898 1322 +797 1442 +145 272 +397 427 +289 717 +147 535 +543 1442 +491 761 +315 888 +943 1377 +941 1582 +703 1561 +873 1055 +981 1494 +933 989 +54 194 +842 1269 +901 1394 +346 1035 +858 1198 +864 1606 +122 873 +587 936 +705 1286 +176 754 +690 1066 +950 1037 +346 781 +474 1279 +180 1172 +957 1613 diff --git a/bottleneck/tests/data/test_860_A b/bottleneck/tests/data/test_860_A new file mode 100644 index 0000000..bef7e26 --- /dev/null +++ b/bottleneck/tests/data/test_860_A @@ -0,0 +1,100 @@ +286 883 +351 366 +209 489 +760 1212 +838 1652 +595 660 +603 1448 +39 243 +601 832 +245 589 +258 1170 +586 1359 +639 1499 +233 1078 +722 781 +998 1722 +867 952 +85 635 +625 1224 +545 1458 +103 885 +227 270 +397 911 +28 776 +893 1191 +600 929 +554 1437 +510 611 +768 769 +396 540 +753 1168 +508 915 +609 874 +804 1177 +777 1596 +547 844 +63 286 +979 1153 +672 1523 +620 1414 +189 629 +841 889 +329 1319 +234 432 +267 1009 +441 1379 +954 1894 +908 1341 +313 1305 +671 1250 +296 992 +518 1355 +596 905 +169 366 +333 524 +73 352 +670 1216 +459 560 +945 1546 +279 561 +27 773 +701 1354 +768 1673 +778 829 +698 1194 +680 1054 +138 954 +957 1332 +873 1110 +215 605 +997 1772 +785 935 +985 1406 +999 1441 +849 924 +547 721 +80 977 +181 321 +44 87 +561 763 +448 1065 +694 711 +539 904 +522 1201 +951 1434 +467 766 +261 1178 +900 1180 +440 1158 +134 1038 +375 383 +383 722 +974 1675 +105 380 +42 94 +855 877 +176 220 +379 952 +415 1095 +273 1064 diff --git a/bottleneck/tests/data/test_860_B b/bottleneck/tests/data/test_860_B new file mode 100644 index 0000000..36f7915 --- /dev/null +++ b/bottleneck/tests/data/test_860_B @@ -0,0 +1,100 @@ +54 531 +338 1142 +464 1266 +979 1648 +714 782 +478 592 +490 1025 +958 1817 +518 1232 +259 955 +628 1122 +47 423 +831 1649 +30 971 +833 1292 +304 784 +824 1612 +267 1156 +839 926 +190 200 +817 1817 +876 1083 +654 1410 +665 1309 +226 671 +584 640 +234 1111 +806 1282 +227 642 +80 717 +608 1151 +60 808 +216 928 +177 644 +218 1177 +690 1266 +450 1313 +309 861 +979 1696 +210 1066 +461 1403 +317 680 +313 722 +112 770 +166 746 +275 515 +566 1020 +575 931 +483 851 +807 1561 +137 467 +539 1148 +539 1511 +323 563 +633 1434 +287 1046 +260 320 +785 1657 +665 1299 +123 1038 +731 1330 +844 1161 +783 785 +212 619 +712 1288 +617 761 +367 381 +613 1128 +249 372 +977 1165 +202 504 +553 1006 +760 1241 +621 1168 +761 1372 +920 1579 +541 1430 +890 1618 +20 801 +495 809 +685 1544 +709 1130 +321 1130 +802 1219 +122 740 +660 1369 +283 810 +424 425 +475 580 +616 1579 +669 1244 +223 1000 +57 188 +365 1019 +775 1711 +451 512 +234 627 +741 1601 +526 1293 +911 1233 diff --git a/bottleneck/tests/data/test_861_A b/bottleneck/tests/data/test_861_A new file mode 100644 index 0000000..1058733 --- /dev/null +++ b/bottleneck/tests/data/test_861_A @@ -0,0 +1,100 @@ +127 281 +555 671 +852 1188 +977 1877 +824 1400 +698 772 +759 1378 +901 1755 +445 1382 +653 1090 +781 1672 +314 1003 +826 861 +86 713 +880 1567 +253 886 +285 1117 +742 1603 +867 1483 +14 632 +845 1280 +649 1074 +322 897 +68 387 +618 679 +918 935 +89 1077 +586 1247 +52 917 +550 1169 +426 952 +535 860 +485 1229 +152 400 +241 1071 +77 181 +795 948 +942 1437 +728 811 +119 577 +433 921 +492 1054 +582 881 +813 1720 +40 497 +389 500 +542 570 +570 580 +672 953 +754 1221 +362 468 +707 1394 +146 927 +142 1098 +820 1494 +539 1194 +422 1194 +277 1109 +975 1238 +718 1181 +1 133 +887 1015 +961 1428 +758 1212 +48 554 +945 1432 +302 1165 +742 1046 +941 1415 +468 634 +964 1097 +220 232 +970 1602 +876 1222 +712 737 +131 471 +939 1209 +579 1496 +953 1937 +295 1269 +757 1470 +141 236 +649 712 +895 1621 +806 1653 +61 736 +695 948 +986 1051 +630 1053 +637 643 +951 1857 +991 1205 +982 1752 +395 549 +216 323 +803 1202 +976 1731 +866 1223 +540 1029 +786 805 diff --git a/bottleneck/tests/data/test_861_B b/bottleneck/tests/data/test_861_B new file mode 100644 index 0000000..a6a11d7 --- /dev/null +++ b/bottleneck/tests/data/test_861_B @@ -0,0 +1,100 @@ +517 1489 +251 612 +436 1287 +158 969 +181 653 +176 187 +494 1323 +174 1154 +896 926 +101 733 +416 984 +583 763 +161 512 +111 495 +991 1712 +827 854 +342 877 +13 212 +808 1594 +423 1182 +219 666 +195 233 +347 708 +979 1787 +758 1254 +414 1279 +421 563 +340 722 +209 552 +258 704 +776 1610 +672 972 +412 1195 +48 846 +946 1569 +844 1094 +891 1866 +430 925 +661 1317 +819 1214 +837 1824 +731 982 +14 53 +333 1086 +512 868 +789 1264 +15 313 +256 973 +678 1052 +259 1229 +969 1150 +602 1255 +302 1291 +257 1082 +756 1579 +103 110 +125 960 +368 1258 +183 1001 +559 1106 +447 944 +784 1446 +947 1735 +982 1775 +586 1368 +239 1171 +210 856 +94 1017 +138 1075 +59 657 +440 1015 +978 1530 +785 1259 +381 963 +463 1115 +785 1398 +0 147 +952 1432 +573 1345 +592 1443 +829 1357 +250 966 +948 1110 +848 1569 +251 904 +945 1606 +99 1025 +799 863 +690 1141 +21 445 +860 1338 +43 130 +148 853 +261 979 +177 324 +400 1084 +277 1098 +888 1223 +948 1629 +573 1197 diff --git a/bottleneck/tests/data/test_862_A b/bottleneck/tests/data/test_862_A new file mode 100644 index 0000000..d37d3ef --- /dev/null +++ b/bottleneck/tests/data/test_862_A @@ -0,0 +1,100 @@ +102 300 +352 359 +521 683 +515 1057 +914 1269 +100 498 +589 1272 +77 129 +417 487 +579 1450 +101 780 +36 807 +588 1009 +556 1004 +875 1497 +488 1097 +842 1462 +221 1204 +328 518 +186 828 +870 992 +309 931 +56 558 +780 1456 +164 1070 +472 934 +412 1210 +842 872 +575 1445 +755 1457 +250 571 +426 1223 +367 1073 +648 749 +303 1009 +147 491 +118 1002 +320 398 +473 1445 +817 1679 +35 369 +170 947 +953 1168 +169 278 +307 547 +260 507 +901 1598 +116 381 +241 765 +98 970 +216 1171 +746 1175 +605 1578 +601 1019 +598 967 +316 723 +838 1609 +78 357 +563 893 +545 1089 +813 1743 +981 1110 +454 514 +613 799 +742 1712 +620 764 +464 702 +643 1186 +674 1638 +418 669 +310 1147 +325 1015 +983 1678 +625 951 +407 750 +973 1792 +552 1354 +391 1120 +463 829 +716 1387 +6 403 +177 756 +505 708 +219 471 +187 714 +852 1248 +913 1610 +971 1722 +943 1812 +452 726 +509 624 +178 767 +699 1085 +771 1634 +140 251 +646 822 +456 754 +263 1179 +430 540 +96 810 diff --git a/bottleneck/tests/data/test_862_B b/bottleneck/tests/data/test_862_B new file mode 100644 index 0000000..a18168e --- /dev/null +++ b/bottleneck/tests/data/test_862_B @@ -0,0 +1,100 @@ +123 340 +973 1465 +652 1288 +89 1046 +165 777 +390 986 +139 396 +378 927 +426 1167 +32 223 +259 1177 +771 1250 +494 1143 +528 759 +515 912 +319 992 +134 169 +851 1595 +676 816 +111 304 +35 872 +58 456 +522 1458 +392 1221 +112 1035 +471 1214 +495 580 +339 1276 +143 268 +12 788 +723 1470 +745 1088 +664 1449 +442 463 +268 1026 +289 910 +141 162 +411 1163 +626 1174 +743 1627 +261 1211 +950 1869 +214 1114 +995 1678 +586 960 +754 1098 +363 1013 +808 1761 +58 601 +267 1109 +571 1518 +639 1092 +565 785 +256 537 +490 509 +467 1036 +931 1450 +891 1584 +701 1280 +939 1642 +416 834 +72 964 +530 553 +224 331 +234 683 +722 1338 +190 496 +282 1201 +174 1133 +348 690 +799 1606 +891 1085 +408 1263 +204 522 +867 1729 +856 1102 +175 589 +827 1559 +880 1479 +558 720 +810 1534 +954 1315 +501 901 +675 1031 +721 1091 +265 1103 +670 1553 +587 614 +712 735 +713 1167 +565 714 +67 594 +928 1456 +375 449 +893 1022 +319 500 +101 783 +637 1572 +26 620 +107 845 diff --git a/bottleneck/tests/data/test_863_A b/bottleneck/tests/data/test_863_A new file mode 100644 index 0000000..011d452 --- /dev/null +++ b/bottleneck/tests/data/test_863_A @@ -0,0 +1,100 @@ +596 1590 +388 1099 +928 1387 +473 1128 +595 925 +188 767 +40 804 +542 1405 +661 1245 +579 666 +526 616 +235 378 +379 477 +257 781 +910 1279 +882 1387 +562 1374 +499 603 +342 1317 +184 581 +315 1198 +987 1072 +696 1049 +498 1250 +782 1609 +771 1330 +203 354 +227 1171 +506 939 +360 1303 +969 1942 +772 850 +615 1079 +542 1186 +644 1583 +676 1131 +496 1300 +825 1120 +492 1332 +408 1051 +768 1110 +466 1044 +795 1594 +56 577 +529 1378 +899 1752 +943 1916 +509 780 +609 1175 +999 1928 +360 1164 +901 1764 +558 592 +665 752 +7 82 +919 1683 +772 1057 +211 928 +494 1347 +568 1412 +661 1649 +466 551 +75 498 +329 577 +143 636 +112 144 +217 221 +340 1208 +259 1177 +36 364 +63 299 +74 513 +67 186 +201 672 +508 1253 +96 129 +301 991 +925 1873 +340 1050 +237 672 +445 816 +836 1594 +649 1458 +227 1152 +880 933 +209 939 +822 890 +760 1131 +274 1096 +706 1604 +33 589 +552 1228 +69 615 +794 914 +305 423 +956 1053 +914 1411 +421 1282 +261 1067 +967 1966 diff --git a/bottleneck/tests/data/test_863_B b/bottleneck/tests/data/test_863_B new file mode 100644 index 0000000..d9daaae --- /dev/null +++ b/bottleneck/tests/data/test_863_B @@ -0,0 +1,100 @@ +986 1775 +226 644 +68 818 +739 1449 +962 1111 +850 1460 +306 1206 +901 1742 +171 513 +83 396 +776 1243 +646 948 +693 1431 +219 627 +247 813 +243 1070 +452 1130 +315 1227 +16 808 +977 1035 +454 583 +566 1521 +437 507 +484 1294 +494 506 +752 1161 +152 1081 +566 1413 +141 331 +706 1243 +258 849 +729 1447 +988 1985 +774 1653 +972 1907 +510 589 +402 905 +981 1420 +688 1112 +291 1016 +975 1800 +240 879 +643 1264 +448 458 +707 1075 +157 654 +51 635 +639 677 +688 1518 +99 198 +914 1734 +445 1036 +897 941 +504 1318 +192 479 +287 1003 +624 1444 +815 961 +956 1436 +445 656 +52 574 +787 987 +994 1875 +354 1317 +189 1072 +264 418 +645 1086 +319 942 +202 676 +841 1204 +695 1354 +289 748 +631 649 +894 1632 +909 1782 +794 1065 +0 430 +4 209 +286 1174 +327 1132 +342 641 +455 1256 +295 819 +749 1381 +811 1469 +69 514 +54 1044 +262 1176 +418 854 +819 1524 +861 1796 +242 996 +990 1068 +19 519 +831 1475 +782 1334 +748 986 +869 1569 +556 1535 +685 1411 diff --git a/bottleneck/tests/data/test_864_A b/bottleneck/tests/data/test_864_A new file mode 100644 index 0000000..f82ed50 --- /dev/null +++ b/bottleneck/tests/data/test_864_A @@ -0,0 +1,100 @@ +698 789 +78 479 +383 639 +731 1686 +306 787 +614 696 +719 1184 +404 852 +317 776 +91 656 +126 806 +19 775 +976 1941 +876 1716 +501 1160 +851 1078 +547 641 +187 372 +654 1080 +745 1229 +151 577 +219 600 +318 1253 +317 362 +720 1487 +147 720 +900 1717 +402 1317 +187 1156 +573 1301 +173 479 +613 889 +956 1747 +583 1203 +478 1031 +498 1031 +394 1197 +118 842 +204 246 +562 1361 +340 835 +749 871 +847 1637 +776 1643 +731 1242 +302 741 +312 369 +903 1276 +814 1418 +205 336 +485 1196 +897 1667 +442 562 +319 1253 +56 469 +674 923 +51 642 +487 739 +32 759 +631 1091 +219 293 +381 419 +179 761 +935 1358 +408 636 +355 831 +677 1286 +98 306 +893 922 +275 1275 +350 923 +583 1490 +562 1545 +213 634 +538 870 +270 301 +536 1323 +663 1279 +286 325 +1 331 +927 1472 +998 1673 +404 484 +368 1234 +650 803 +238 845 +956 1851 +278 1002 +767 1110 +176 190 +808 841 +910 1693 +242 1010 +523 1133 +364 543 +915 1652 +401 1326 +787 1236 +250 985 +884 1153 diff --git a/bottleneck/tests/data/test_864_B b/bottleneck/tests/data/test_864_B new file mode 100644 index 0000000..0b56a95 --- /dev/null +++ b/bottleneck/tests/data/test_864_B @@ -0,0 +1,100 @@ +11 893 +131 282 +718 1633 +802 822 +342 857 +797 1757 +703 704 +296 1271 +439 868 +143 1065 +860 1380 +62 101 +536 1375 +526 533 +482 1222 +338 1199 +665 770 +85 713 +829 930 +366 710 +300 757 +561 1556 +904 905 +711 1575 +30 766 +710 898 +476 897 +592 1142 +731 1153 +799 1176 +31 769 +570 718 +620 1438 +718 1198 +938 1650 +31 296 +342 929 +953 1681 +650 896 +868 1404 +800 1680 +776 1229 +612 1330 +362 1338 +958 1066 +269 978 +981 1035 +160 322 +673 795 +150 1117 +564 1490 +737 1617 +492 1040 +599 954 +261 1094 +691 734 +318 1231 +157 546 +329 916 +982 1956 +211 719 +665 1381 +911 1689 +368 425 +459 749 +706 1410 +103 539 +134 476 +209 341 +469 589 +350 462 +789 1113 +945 1335 +936 1272 +886 1823 +958 1528 +96 492 +532 1243 +119 577 +322 367 +518 1434 +692 839 +509 1104 +668 1357 +139 1127 +258 300 +307 382 +156 403 +171 582 +411 701 +794 944 +937 1602 +6 60 +593 929 +977 1052 +221 1209 +603 832 +881 1176 +394 710 +660 1260 diff --git a/bottleneck/tests/data/test_865_A b/bottleneck/tests/data/test_865_A new file mode 100644 index 0000000..7453ead --- /dev/null +++ b/bottleneck/tests/data/test_865_A @@ -0,0 +1,100 @@ +680 1206 +916 1092 +447 722 +821 1233 +565 1508 +548 1163 +973 1156 +229 1196 +378 542 +334 619 +581 606 +171 644 +143 407 +857 1539 +129 337 +582 780 +378 441 +196 340 +619 746 +28 94 +294 590 +881 1520 +113 174 +1000 1989 +343 395 +633 1542 +348 988 +973 1914 +58 903 +510 767 +440 448 +876 1806 +932 1554 +367 917 +465 820 +359 1185 +793 820 +999 1064 +193 871 +409 1286 +224 631 +381 793 +650 1047 +493 524 +698 1162 +846 1083 +536 1456 +909 1650 +245 982 +714 1104 +867 1447 +709 1527 +831 859 +170 266 +31 541 +578 650 +960 1059 +147 741 +202 407 +110 136 +747 1087 +781 1489 +759 1738 +945 1542 +790 1588 +52 259 +290 1116 +561 1416 +200 740 +50 629 +907 1349 +312 708 +87 433 +33 920 +934 1278 +530 706 +760 879 +834 1301 +819 1372 +656 1622 +950 1152 +452 692 +426 798 +469 811 +158 554 +563 1532 +713 1332 +567 964 +111 921 +237 1102 +156 1100 +113 344 +553 1386 +880 982 +355 655 +81 959 +203 437 +848 1389 +7 377 +305 717 diff --git a/bottleneck/tests/data/test_865_B b/bottleneck/tests/data/test_865_B new file mode 100644 index 0000000..265e3bd --- /dev/null +++ b/bottleneck/tests/data/test_865_B @@ -0,0 +1,100 @@ +121 979 +358 852 +219 696 +216 239 +200 737 +859 1771 +323 826 +192 1007 +129 389 +489 1130 +227 568 +806 1657 +613 1508 +626 1325 +643 1425 +905 1619 +123 372 +26 371 +949 1838 +399 1361 +516 652 +273 485 +346 753 +975 1839 +276 789 +824 893 +937 1262 +34 37 +444 993 +133 860 +190 421 +978 1903 +56 733 +421 756 +583 590 +133 371 +881 1309 +897 1347 +442 979 +700 941 +871 1095 +34 182 +206 603 +858 1533 +284 821 +241 1167 +623 989 +715 1664 +187 822 +970 1681 +26 153 +533 648 +406 873 +791 862 +217 983 +211 930 +781 1001 +973 1393 +204 845 +23 894 +11 772 +863 1663 +126 233 +306 835 +85 370 +802 1738 +526 1171 +429 1118 +697 1462 +196 512 +887 902 +7 401 +881 1262 +743 1392 +676 733 +527 1394 +911 1179 +816 1280 +513 1072 +842 1750 +942 1260 +841 1438 +86 704 +308 639 +478 1085 +56 220 +411 1045 +185 1141 +941 1695 +465 1360 +157 665 +19 599 +540 891 +832 1200 +408 1232 +540 1207 +881 1721 +496 691 +623 1295 +811 873 diff --git a/bottleneck/tests/data/test_866_A b/bottleneck/tests/data/test_866_A new file mode 100644 index 0000000..a05ad71 --- /dev/null +++ b/bottleneck/tests/data/test_866_A @@ -0,0 +1,100 @@ +554 1091 +21 867 +633 899 +500 663 +971 975 +410 1235 +179 1036 +438 917 +434 678 +378 520 +747 1564 +39 131 +748 1408 +581 1266 +818 915 +527 1287 +452 998 +585 1061 +224 244 +554 1427 +859 1079 +613 1539 +522 738 +392 1170 +788 1437 +288 680 +370 1117 +476 1151 +826 1129 +41 551 +96 839 +480 1110 +909 1050 +59 1059 +549 801 +124 198 +991 1323 +122 1026 +573 1345 +701 1061 +40 265 +872 1116 +579 1464 +807 1198 +269 553 +376 786 +711 866 +864 1301 +716 1185 +366 775 +1000 1991 +970 1156 +921 1050 +599 1510 +49 593 +475 1394 +764 1704 +516 912 +721 805 +986 1006 +728 852 +789 1097 +459 597 +967 1276 +261 1126 +906 920 +466 1134 +419 467 +638 818 +243 738 +188 906 +434 1199 +821 892 +885 1241 +7 664 +963 1398 +576 1142 +84 385 +20 308 +845 1162 +79 730 +203 625 +412 1054 +553 898 +752 920 +640 1312 +169 706 +920 1586 +134 246 +352 619 +90 716 +197 616 +819 1101 +805 1686 +543 1178 +482 1411 +297 1259 +957 1763 +355 808 +591 1221 diff --git a/bottleneck/tests/data/test_866_B b/bottleneck/tests/data/test_866_B new file mode 100644 index 0000000..c3e0b3a --- /dev/null +++ b/bottleneck/tests/data/test_866_B @@ -0,0 +1,100 @@ +573 1390 +68 742 +178 1172 +592 975 +294 453 +280 552 +750 1332 +947 1248 +972 1885 +868 942 +269 719 +457 944 +863 1391 +802 1524 +64 235 +161 495 +439 1397 +143 354 +974 1778 +239 643 +831 1814 +216 969 +515 1065 +334 1263 +504 1264 +950 1570 +558 976 +84 242 +125 745 +382 448 +602 1380 +98 211 +994 1767 +140 712 +694 1187 +523 901 +906 970 +65 850 +188 858 +787 1715 +836 1543 +356 1082 +9 932 +945 1142 +653 756 +934 1085 +526 1465 +636 1544 +711 1660 +63 607 +279 482 +716 768 +380 543 +210 885 +597 1476 +172 837 +542 1257 +465 557 +983 1339 +647 1098 +643 1101 +239 688 +658 1241 +448 595 +320 641 +622 673 +788 824 +2 645 +456 1068 +707 984 +334 1093 +81 601 +413 813 +311 345 +129 827 +253 556 +971 1376 +291 534 +846 1646 +61 699 +552 1406 +583 866 +285 635 +772 1351 +937 1014 +688 709 +425 906 +750 1220 +395 685 +93 392 +596 1460 +749 1123 +631 843 +100 311 +774 991 +873 1870 +297 422 +856 1311 +983 1053 +746 1722 diff --git a/bottleneck/tests/data/test_867_A b/bottleneck/tests/data/test_867_A new file mode 100644 index 0000000..0e5ca13 --- /dev/null +++ b/bottleneck/tests/data/test_867_A @@ -0,0 +1,100 @@ +324 1024 +307 1299 +253 1161 +488 662 +711 1205 +481 510 +910 1280 +465 1426 +800 1294 +664 1348 +676 1342 +946 1581 +956 1482 +70 194 +312 636 +477 1373 +465 1242 +720 1446 +850 1798 +354 386 +657 998 +126 306 +800 1781 +695 1218 +69 522 +832 1255 +553 1007 +796 1602 +889 1204 +390 1048 +792 1754 +493 1394 +71 545 +200 996 +28 103 +705 1003 +315 489 +140 903 +161 296 +697 1682 +748 1663 +360 1052 +226 776 +18 564 +417 449 +234 350 +639 1585 +574 788 +862 1581 +950 1575 +268 532 +946 1194 +386 613 +782 1325 +494 1069 +792 846 +453 1409 +444 1022 +268 554 +319 792 +187 932 +491 1155 +93 253 +986 1147 +758 1167 +424 780 +194 891 +360 1218 +59 457 +625 1514 +618 919 +680 1182 +31 358 +544 744 +529 1135 +859 1346 +533 1132 +833 873 +583 733 +695 1156 +102 1023 +542 1132 +317 640 +883 1183 +696 1191 +603 1489 +492 1373 +935 1085 +235 620 +37 549 +802 1022 +211 508 +907 1146 +989 1239 +68 909 +367 919 +626 827 +770 1592 +413 414 +427 620 diff --git a/bottleneck/tests/data/test_867_B b/bottleneck/tests/data/test_867_B new file mode 100644 index 0000000..c8eb5e0 --- /dev/null +++ b/bottleneck/tests/data/test_867_B @@ -0,0 +1,100 @@ +780 1730 +13 771 +347 670 +699 1353 +924 1139 +806 1496 +537 561 +756 1433 +987 1945 +689 1191 +123 972 +46 99 +468 961 +722 997 +675 1491 +626 1171 +315 1095 +582 741 +445 1083 +974 1633 +543 1308 +829 1343 +414 1038 +817 1254 +596 619 +94 438 +545 955 +832 1672 +0 240 +110 729 +444 1151 +331 1174 +684 765 +612 1448 +369 1181 +675 1243 +758 1008 +716 858 +618 931 +642 1279 +219 593 +650 751 +228 998 +40 93 +181 758 +372 658 +87 607 +190 1136 +990 1325 +232 991 +205 1111 +497 965 +767 1480 +896 1862 +777 1234 +790 1452 +734 1521 +457 1207 +934 979 +617 948 +217 767 +654 1122 +902 1565 +951 984 +250 644 +63 299 +726 1472 +406 1249 +749 777 +140 250 +235 1047 +118 1003 +728 833 +158 1021 +243 801 +112 330 +10 912 +629 796 +954 1471 +764 1267 +598 1299 +131 899 +103 405 +187 456 +985 1359 +228 599 +440 1326 +776 852 +156 847 +295 558 +453 786 +236 560 +948 1458 +599 1174 +482 869 +857 1110 +978 1947 +424 446 +699 1688 +886 1793 diff --git a/bottleneck/tests/data/test_868_A b/bottleneck/tests/data/test_868_A new file mode 100644 index 0000000..0a0fad2 --- /dev/null +++ b/bottleneck/tests/data/test_868_A @@ -0,0 +1,100 @@ +430 1257 +813 1021 +677 1089 +222 1147 +837 1410 +931 1488 +664 1192 +946 1885 +492 1036 +808 1524 +389 1210 +953 1056 +96 797 +818 1592 +900 1074 +63 516 +46 961 +999 1353 +797 1101 +343 1142 +355 459 +384 1358 +401 800 +354 1100 +661 1246 +76 437 +19 581 +385 760 +704 1218 +25 332 +406 1275 +838 1648 +57 335 +501 638 +826 1431 +682 1568 +803 1533 +894 1845 +38 580 +54 835 +448 507 +132 538 +226 1080 +307 489 +339 596 +334 1283 +573 891 +844 1119 +674 949 +998 1669 +226 599 +487 527 +401 1224 +785 1065 +270 710 +410 545 +981 1732 +602 704 +38 838 +145 646 +671 1128 +621 787 +782 1217 +932 1014 +935 1117 +923 1561 +79 253 +170 548 +343 937 +966 1919 +847 1290 +41 234 +683 926 +279 457 +243 957 +316 1240 +630 1492 +901 1691 +919 1022 +385 574 +902 1474 +640 1197 +805 973 +943 1173 +24 846 +139 140 +48 425 +124 1016 +880 1326 +175 275 +835 1142 +244 331 +770 969 +386 950 +391 886 +334 1284 +754 1503 +179 842 +955 1780 +330 436 diff --git a/bottleneck/tests/data/test_868_B b/bottleneck/tests/data/test_868_B new file mode 100644 index 0000000..00c87b2 --- /dev/null +++ b/bottleneck/tests/data/test_868_B @@ -0,0 +1,100 @@ +166 1061 +527 1335 +325 949 +111 649 +488 697 +766 1222 +709 1440 +141 784 +700 939 +798 1136 +861 1837 +628 1376 +473 1366 +145 643 +194 363 +986 1365 +564 979 +870 1837 +451 928 +797 1196 +521 1453 +0 285 +191 1080 +846 1666 +337 494 +790 1644 +759 1570 +46 871 +886 966 +169 897 +55 627 +538 1463 +114 429 +787 827 +850 1806 +31 827 +482 1012 +120 693 +777 1353 +271 916 +15 717 +660 943 +265 446 +985 1045 +22 519 +715 1571 +604 1475 +141 983 +395 1392 +98 851 +179 766 +237 652 +794 1439 +275 451 +47 631 +183 1091 +500 989 +727 1263 +625 1578 +327 1057 +725 1166 +212 731 +699 1449 +471 472 +787 1014 +714 1402 +412 913 +326 1203 +239 592 +920 1395 +303 410 +197 853 +101 1007 +970 1893 +925 1655 +490 670 +158 428 +413 1207 +722 1712 +776 1727 +548 1012 +891 1253 +329 1285 +576 1098 +357 878 +713 1660 +165 726 +786 1231 +447 600 +103 478 +177 764 +386 1263 +307 327 +812 1500 +685 1462 +973 1935 +973 1024 +848 868 +897 1464 +696 1688 diff --git a/bottleneck/tests/data/test_869_A b/bottleneck/tests/data/test_869_A new file mode 100644 index 0000000..fa16527 --- /dev/null +++ b/bottleneck/tests/data/test_869_A @@ -0,0 +1,100 @@ +723 777 +589 1331 +521 602 +976 1210 +302 783 +550 1430 +254 453 +580 1493 +870 1136 +765 1589 +178 699 +654 1093 +505 739 +285 572 +694 975 +4 681 +733 1644 +258 639 +575 1027 +628 756 +887 1885 +430 1393 +194 371 +57 230 +275 489 +269 458 +254 354 +227 1077 +837 1711 +737 1290 +315 1159 +440 791 +922 1280 +175 615 +137 448 +712 1488 +96 617 +815 1776 +280 540 +595 1107 +545 987 +914 1273 +418 919 +135 1053 +612 653 +194 901 +99 866 +689 1038 +273 789 +350 1046 +433 828 +679 1512 +611 1131 +344 1098 +86 1055 +791 1490 +717 1192 +900 1504 +165 1119 +47 512 +452 858 +290 447 +610 774 +451 1149 +693 809 +513 889 +313 771 +290 604 +419 990 +554 728 +726 1563 +860 1471 +671 767 +735 763 +615 1318 +792 1245 +403 1356 +624 1031 +875 1372 +780 1429 +692 1291 +549 655 +412 1158 +727 982 +780 986 +899 1741 +896 1193 +958 1531 +580 698 +23 296 +735 1275 +400 495 +411 1166 +128 630 +498 1178 +195 459 +829 1674 +678 1531 +329 785 +625 1441 diff --git a/bottleneck/tests/data/test_869_B b/bottleneck/tests/data/test_869_B new file mode 100644 index 0000000..7ffd8c9 --- /dev/null +++ b/bottleneck/tests/data/test_869_B @@ -0,0 +1,100 @@ +979 1349 +400 1004 +925 1748 +266 1261 +562 1050 +591 592 +63 630 +404 603 +971 1511 +352 619 +907 1852 +388 830 +8 145 +14 369 +247 938 +648 1230 +625 1083 +231 1003 +926 1824 +143 879 +689 1615 +340 1273 +565 955 +419 443 +92 867 +554 697 +774 1475 +298 1142 +677 1036 +734 811 +831 1211 +585 757 +328 573 +117 789 +575 614 +191 1007 +457 829 +35 193 +518 1335 +5 799 +505 1285 +48 381 +684 990 +767 1230 +953 1161 +51 556 +391 522 +405 419 +217 877 +793 857 +360 455 +259 791 +507 553 +505 1256 +403 842 +981 1524 +223 246 +780 1102 +707 1010 +584 1474 +529 1074 +384 464 +452 668 +28 321 +181 496 +343 1061 +764 1720 +454 1394 +768 822 +217 741 +176 476 +263 306 +914 1258 +526 584 +823 1116 +82 697 +994 1908 +667 982 +231 463 +230 807 +843 1706 +50 369 +521 740 +599 1004 +72 775 +279 502 +833 1423 +880 1593 +371 1093 +703 1272 +815 1096 +125 1058 +497 899 +991 1183 +300 1016 +394 514 +962 1608 +797 1721 +994 1473 +108 421 diff --git a/bottleneck/tests/data/test_870_A b/bottleneck/tests/data/test_870_A new file mode 100644 index 0000000..72422f7 --- /dev/null +++ b/bottleneck/tests/data/test_870_A @@ -0,0 +1,100 @@ +60 817 +390 412 +83 364 +762 1271 +949 1643 +874 1468 +411 1354 +897 1800 +66 622 +763 1511 +51 1025 +882 1063 +91 96 +309 1302 +646 1599 +721 1157 +923 1112 +907 1582 +434 517 +854 1679 +719 1601 +38 615 +762 1454 +394 438 +2 40 +828 1110 +994 1556 +647 745 +610 1499 +9 27 +4 572 +829 1229 +44 319 +807 1726 +286 1104 +953 1884 +941 1314 +131 1041 +363 883 +825 1168 +975 1168 +561 1292 +151 204 +465 648 +346 459 +252 1179 +766 917 +583 1401 +353 666 +493 739 +809 1531 +391 964 +410 1172 +180 194 +865 1343 +849 1201 +839 1253 +5 590 +674 1029 +821 1333 +711 874 +557 1038 +101 163 +564 834 +696 707 +631 1249 +762 1107 +343 515 +987 1870 +525 1274 +402 1043 +164 220 +940 1422 +840 1281 +50 1012 +275 1062 +472 790 +61 306 +217 661 +283 1281 +436 972 +952 1838 +374 1049 +577 1482 +486 1288 +743 851 +469 1295 +553 1233 +11 774 +687 1381 +243 481 +399 873 +777 1539 +489 742 +293 513 +755 1047 +881 1154 +757 1457 +261 1097 +693 1283 diff --git a/bottleneck/tests/data/test_870_B b/bottleneck/tests/data/test_870_B new file mode 100644 index 0000000..db4847d --- /dev/null +++ b/bottleneck/tests/data/test_870_B @@ -0,0 +1,100 @@ +278 1098 +502 1411 +318 748 +154 189 +605 1475 +556 1482 +377 718 +168 338 +595 921 +962 1686 +301 409 +730 1138 +132 612 +988 1838 +759 1728 +170 465 +654 681 +43 199 +358 1076 +270 316 +602 1382 +657 1138 +211 448 +516 652 +781 1312 +937 1266 +30 227 +769 1102 +91 938 +737 1368 +733 1087 +511 721 +582 997 +261 635 +540 992 +503 590 +189 267 +614 824 +517 1181 +120 447 +545 650 +248 1122 +798 1437 +571 1265 +358 993 +618 1573 +406 861 +540 1382 +213 509 +964 1055 +481 858 +933 1275 +680 1433 +634 665 +963 1365 +612 1163 +895 1316 +95 814 +483 1416 +142 989 +37 588 +17 728 +137 492 +498 1010 +868 1023 +713 1344 +606 1243 +806 1540 +868 1118 +115 780 +329 690 +742 1226 +595 1135 +534 938 +53 175 +627 683 +277 1165 +323 329 +587 869 +308 1234 +266 338 +103 928 +385 863 +628 1620 +157 370 +258 731 +30 588 +202 920 +589 618 +5 221 +882 1659 +68 136 +918 1860 +466 801 +719 1236 +79 664 +562 1234 +258 784 +669 1010 +850 1761 diff --git a/bottleneck/tests/data/test_871_A b/bottleneck/tests/data/test_871_A new file mode 100644 index 0000000..08ce8b2 --- /dev/null +++ b/bottleneck/tests/data/test_871_A @@ -0,0 +1,100 @@ +42 835 +829 1708 +683 1618 +329 527 +127 163 +931 1127 +902 1289 +712 755 +344 415 +991 1939 +8 415 +225 1099 +685 1632 +996 1747 +751 1238 +569 1367 +256 401 +711 1157 +58 745 +112 1087 +226 902 +560 1414 +482 1323 +243 382 +672 1335 +202 962 +803 1090 +398 967 +790 1384 +901 1648 +280 296 +684 1484 +432 498 +599 972 +86 497 +703 1327 +730 1472 +889 946 +1000 1305 +735 1569 +606 1155 +916 1843 +246 286 +102 980 +854 1598 +518 944 +341 973 +426 489 +888 1375 +359 409 +49 660 +619 1187 +635 1439 +338 1297 +347 654 +847 989 +161 915 +846 1341 +196 418 +698 1689 +535 634 +407 419 +767 1110 +154 1127 +912 1214 +982 1797 +824 1331 +38 859 +753 867 +297 988 +784 1479 +407 1024 +884 1054 +894 1476 +674 837 +402 1183 +906 1306 +27 471 +672 1594 +480 830 +174 302 +133 928 +858 1186 +541 950 +395 397 +356 1259 +219 1028 +120 465 +703 1595 +9 234 +790 1682 +322 1197 +314 655 +770 1287 +95 775 +444 520 +118 800 +852 1564 +24 333 +906 1508 diff --git a/bottleneck/tests/data/test_871_B b/bottleneck/tests/data/test_871_B new file mode 100644 index 0000000..23c1dd8 --- /dev/null +++ b/bottleneck/tests/data/test_871_B @@ -0,0 +1,100 @@ +112 365 +974 1486 +76 198 +108 949 +30 308 +221 985 +687 1236 +255 744 +597 1580 +552 1173 +944 1327 +291 494 +867 1053 +73 595 +265 407 +827 1067 +990 1968 +663 948 +555 1506 +469 1046 +909 939 +59 858 +756 986 +101 335 +57 1047 +516 1348 +615 775 +578 1391 +756 1351 +341 1087 +147 471 +893 1879 +68 603 +433 867 +982 1332 +11 464 +710 1435 +337 967 +468 1092 +282 474 +712 1541 +779 1165 +255 872 +590 1550 +255 949 +316 494 +398 1017 +863 1551 +835 1072 +554 1129 +560 854 +862 1403 +97 304 +71 393 +351 1038 +624 1327 +185 1077 +311 601 +640 736 +542 980 +735 884 +78 879 +230 799 +462 1295 +249 678 +736 900 +867 984 +254 405 +408 543 +271 694 +371 1039 +38 598 +888 1058 +876 1612 +697 1333 +650 1183 +910 1895 +884 1723 +922 1772 +911 1770 +788 1139 +981 1024 +962 1552 +389 612 +661 1027 +583 1188 +649 1291 +793 1505 +442 1158 +356 832 +190 589 +643 713 +496 536 +530 1381 +153 641 +162 335 +629 1071 +110 395 +18 833 +8 423 diff --git a/bottleneck/tests/data/test_872_A b/bottleneck/tests/data/test_872_A new file mode 100644 index 0000000..9647bed --- /dev/null +++ b/bottleneck/tests/data/test_872_A @@ -0,0 +1,100 @@ +357 473 +781 1680 +963 1614 +418 582 +427 979 +738 924 +946 1432 +903 1821 +250 279 +570 1065 +305 1090 +750 756 +317 1028 +865 1402 +464 465 +316 1186 +856 1199 +763 1744 +46 424 +954 1654 +602 843 +232 426 +864 1001 +292 495 +72 455 +907 1762 +575 697 +886 1098 +954 1502 +980 1741 +317 527 +72 711 +614 695 +931 1149 +223 229 +684 1073 +221 897 +1000 1806 +165 358 +454 1067 +569 878 +162 950 +910 1768 +329 508 +247 1201 +469 849 +973 1153 +298 670 +682 1515 +230 777 +876 1085 +438 598 +72 775 +668 687 +254 502 +989 1165 +646 1375 +972 1552 +593 1408 +860 1844 +256 469 +982 1530 +834 1562 +195 280 +81 393 +470 802 +570 667 +95 558 +846 1778 +639 1120 +340 804 +527 530 +413 428 +797 1156 +610 780 +113 323 +287 441 +388 838 +418 743 +859 970 +96 898 +29 592 +396 1004 +463 1417 +641 1130 +880 1301 +176 1121 +286 325 +456 1093 +988 1077 +885 1278 +47 828 +617 1089 +595 1071 +870 895 +661 1423 +720 759 +379 924 +892 1184 +583 589 diff --git a/bottleneck/tests/data/test_872_B b/bottleneck/tests/data/test_872_B new file mode 100644 index 0000000..1c58840 --- /dev/null +++ b/bottleneck/tests/data/test_872_B @@ -0,0 +1,100 @@ +153 586 +46 542 +64 130 +498 815 +144 494 +300 1100 +146 383 +431 558 +710 839 +615 648 +680 970 +995 1797 +903 1605 +994 1759 +335 810 +93 670 +928 1252 +754 1015 +941 1668 +105 746 +448 924 +419 1140 +881 1239 +500 831 +794 1571 +780 1613 +892 1155 +133 279 +869 1603 +745 1402 +463 623 +501 686 +510 1155 +806 1373 +302 821 +710 1492 +508 879 +643 787 +494 1172 +427 1018 +37 813 +394 497 +498 1374 +565 1285 +216 453 +315 1039 +356 920 +968 1326 +400 460 +779 964 +179 560 +405 1249 +64 466 +128 978 +99 582 +424 885 +39 675 +912 1624 +531 652 +617 1391 +338 788 +993 1673 +229 301 +879 1305 +356 467 +950 1787 +471 1441 +692 1677 +84 383 +767 1029 +865 1658 +468 988 +854 1028 +483 1097 +898 1321 +605 723 +632 1154 +782 1260 +797 1207 +176 445 +126 827 +333 541 +722 1131 +188 642 +287 1194 +8 607 +955 1136 +44 1000 +515 858 +39 311 +436 1200 +344 1280 +856 1776 +603 1524 +230 617 +953 1413 +592 916 +393 1116 +498 529 +283 734 diff --git a/bottleneck/tests/data/test_873_A b/bottleneck/tests/data/test_873_A new file mode 100644 index 0000000..d9e1da9 --- /dev/null +++ b/bottleneck/tests/data/test_873_A @@ -0,0 +1,100 @@ +871 918 +442 1110 +786 797 +342 1125 +473 1471 +550 737 +956 1854 +259 420 +592 1059 +861 1049 +50 255 +11 163 +254 810 +649 659 +866 1083 +786 1466 +728 1162 +659 1272 +884 1597 +34 1016 +487 679 +765 1214 +145 505 +994 1925 +711 1474 +207 713 +143 567 +935 1009 +62 1036 +168 713 +7 478 +628 1423 +51 693 +391 575 +18 283 +45 308 +971 1067 +934 1548 +604 1154 +4 558 +425 998 +77 439 +513 1485 +354 1302 +317 816 +5 551 +346 804 +872 1197 +309 418 +691 886 +927 1242 +51 491 +88 645 +835 1584 +377 751 +668 684 +226 1026 +418 691 +335 939 +955 1872 +490 1173 +68 355 +689 740 +284 550 +531 1023 +312 390 +127 875 +3 408 +314 458 +907 932 +489 890 +451 1402 +52 849 +709 1325 +373 1367 +390 1030 +707 1272 +25 607 +742 996 +838 1569 +570 1522 +278 1034 +863 1805 +615 823 +865 1726 +902 1367 +81 1011 +619 1462 +18 422 +433 1195 +154 635 +27 975 +690 1465 +447 1308 +686 1058 +204 1164 +572 1531 +202 609 +772 777 +740 1633 diff --git a/bottleneck/tests/data/test_873_B b/bottleneck/tests/data/test_873_B new file mode 100644 index 0000000..a9f3ea1 --- /dev/null +++ b/bottleneck/tests/data/test_873_B @@ -0,0 +1,100 @@ +816 1608 +484 669 +486 883 +131 221 +617 1433 +421 578 +277 879 +587 979 +662 783 +275 1001 +538 1142 +135 857 +984 1296 +163 997 +818 1596 +591 1112 +29 465 +156 374 +805 1436 +709 977 +650 1507 +360 1041 +940 1108 +957 1483 +628 775 +109 461 +680 1562 +457 507 +68 693 +795 935 +505 564 +706 951 +60 977 +501 1258 +441 539 +280 658 +787 1427 +311 866 +722 808 +94 679 +979 1850 +408 1002 +246 1068 +125 815 +520 819 +557 1306 +369 1123 +14 940 +666 931 +589 1555 +430 871 +105 907 +294 469 +798 1528 +30 640 +566 1287 +930 1651 +599 691 +139 256 +938 1775 +173 682 +597 899 +430 924 +201 1194 +164 611 +996 1009 +482 807 +680 1375 +281 704 +422 457 +698 963 +742 876 +839 1814 +901 1360 +775 1461 +612 801 +498 1360 +176 707 +430 596 +134 578 +408 742 +867 1346 +66 912 +390 824 +823 1332 +787 1775 +924 1615 +619 1109 +892 1583 +583 904 +591 1270 +805 815 +913 1698 +557 623 +15 98 +28 862 +775 981 +627 1137 +836 1587 +556 988 diff --git a/bottleneck/tests/data/test_874_A b/bottleneck/tests/data/test_874_A new file mode 100644 index 0000000..4d66819 --- /dev/null +++ b/bottleneck/tests/data/test_874_A @@ -0,0 +1,100 @@ +401 767 +318 1182 +238 653 +420 702 +684 942 +381 618 +263 1108 +275 381 +659 1140 +301 646 +401 432 +68 350 +147 1106 +670 1593 +792 1332 +779 1462 +129 130 +604 665 +800 1027 +631 945 +961 1286 +767 1426 +123 653 +860 1160 +929 1528 +876 1665 +148 1072 +898 1869 +375 386 +135 943 +847 1128 +455 1273 +28 509 +202 1148 +241 462 +612 732 +655 667 +392 726 +525 655 +993 1778 +241 1229 +185 599 +321 836 +773 1506 +632 1023 +885 1663 +868 985 +84 664 +761 1738 +75 641 +988 1791 +178 992 +34 69 +990 1431 +460 957 +352 453 +102 946 +123 883 +535 1360 +961 1232 +825 885 +259 679 +139 620 +946 1073 +690 753 +39 1022 +741 1612 +662 1215 +156 703 +942 1906 +477 496 +499 737 +175 763 +304 563 +317 1266 +918 1673 +646 686 +941 1023 +502 1266 +811 822 +153 688 +892 1832 +737 1518 +53 475 +140 709 +379 871 +138 816 +228 1106 +272 774 +732 1715 +344 849 +580 971 +983 1855 +312 399 +561 1352 +335 1008 +268 1083 +488 921 +327 449 +177 198 diff --git a/bottleneck/tests/data/test_874_B b/bottleneck/tests/data/test_874_B new file mode 100644 index 0000000..2142cbc --- /dev/null +++ b/bottleneck/tests/data/test_874_B @@ -0,0 +1,100 @@ +682 1578 +580 1035 +713 1240 +664 1644 +492 852 +126 441 +113 329 +144 557 +829 1627 +857 1645 +332 1104 +531 773 +616 1523 +568 831 +251 340 +155 1058 +519 1241 +525 571 +182 334 +148 450 +974 1128 +508 1003 +188 738 +763 1502 +726 1288 +892 954 +418 1171 +414 927 +268 591 +529 1371 +10 396 +379 1371 +578 1428 +493 529 +79 364 +340 1082 +84 653 +847 1396 +905 1164 +526 690 +715 1436 +317 823 +161 223 +19 515 +520 1415 +871 1311 +601 1249 +533 1040 +454 1168 +35 919 +191 668 +102 424 +899 1107 +439 558 +145 1108 +138 1085 +633 756 +616 801 +795 1193 +428 892 +712 1066 +451 723 +294 640 +228 1009 +984 1910 +966 1472 +578 771 +403 896 +341 841 +441 671 +513 665 +137 386 +591 750 +881 1549 +753 1355 +66 695 +500 592 +364 715 +275 485 +841 1194 +204 386 +556 1196 +388 1345 +695 1051 +47 494 +505 1386 +427 933 +635 714 +998 1743 +637 822 +355 1048 +430 1086 +905 1747 +906 1612 +590 804 +709 1164 +852 1511 +205 626 +403 978 +706 1085 diff --git a/bottleneck/tests/data/test_875_A b/bottleneck/tests/data/test_875_A new file mode 100644 index 0000000..1748357 --- /dev/null +++ b/bottleneck/tests/data/test_875_A @@ -0,0 +1,100 @@ +501 816 +326 1114 +214 1139 +167 352 +465 1246 +268 284 +830 907 +240 975 +995 1655 +583 822 +320 963 +446 975 +525 1385 +280 1057 +788 978 +238 1027 +731 1643 +154 467 +988 1430 +468 594 +170 779 +931 1377 +332 888 +432 1036 +310 841 +960 1909 +554 1147 +999 1007 +213 626 +667 862 +200 773 +166 657 +830 1352 +698 816 +455 850 +435 1100 +300 584 +935 1403 +544 1425 +78 451 +543 955 +831 1610 +530 633 +443 1150 +16 712 +798 1758 +760 1226 +839 1249 +310 891 +343 553 +341 463 +925 948 +691 851 +899 1768 +486 530 +830 1370 +515 894 +782 1153 +539 1004 +907 1348 +28 395 +335 626 +599 946 +571 1494 +607 1477 +560 1176 +27 63 +190 453 +586 1257 +659 831 +991 1363 +95 851 +226 785 +263 836 +97 531 +768 905 +970 1051 +487 1361 +96 206 +374 979 +539 1321 +837 1108 +776 1081 +381 774 +420 754 +799 983 +636 1239 +863 1608 +531 563 +703 814 +229 958 +874 1208 +553 581 +589 1387 +607 920 +928 1917 +171 351 +571 1035 +528 1318 +168 442 diff --git a/bottleneck/tests/data/test_875_B b/bottleneck/tests/data/test_875_B new file mode 100644 index 0000000..3a5860e --- /dev/null +++ b/bottleneck/tests/data/test_875_B @@ -0,0 +1,100 @@ +380 1025 +918 1126 +119 483 +810 1668 +393 693 +545 1003 +682 862 +357 966 +429 955 +776 1227 +233 522 +559 599 +514 843 +682 906 +535 810 +924 1161 +222 371 +400 741 +561 943 +60 644 +810 1317 +470 1412 +756 1724 +235 1098 +995 1942 +244 776 +189 1011 +549 622 +193 816 +336 535 +232 1076 +614 1332 +38 1001 +764 1255 +337 763 +30 878 +949 1522 +719 741 +446 749 +400 1077 +309 310 +154 677 +458 1246 +476 541 +177 660 +676 1084 +426 968 +422 888 +243 255 +724 901 +994 1350 +623 1151 +387 452 +745 1263 +142 572 +198 388 +789 1416 +445 970 +245 494 +253 499 +401 582 +217 271 +528 1475 +170 850 +978 1681 +68 170 +381 1017 +39 298 +634 1443 +288 447 +867 1061 +24 477 +345 869 +674 1544 +645 1452 +698 723 +838 1195 +419 1214 +468 476 +620 1599 +898 1491 +416 1010 +431 921 +56 242 +867 1451 +759 1102 +396 1226 +559 1364 +212 743 +292 1289 +832 1536 +271 340 +990 1428 +287 1025 +364 839 +471 1138 +17 284 +953 1212 +421 841 +527 1382 diff --git a/bottleneck/tests/data/test_876_A b/bottleneck/tests/data/test_876_A new file mode 100644 index 0000000..1b65f8d --- /dev/null +++ b/bottleneck/tests/data/test_876_A @@ -0,0 +1,100 @@ +466 895 +77 814 +639 1357 +475 1032 +941 1560 +527 749 +839 845 +96 619 +328 455 +385 828 +954 1817 +476 847 +240 463 +477 849 +965 1359 +238 991 +746 1597 +109 529 +567 616 +525 1224 +80 990 +984 1314 +591 1398 +801 1039 +237 332 +529 1232 +8 763 +665 1615 +823 1790 +746 1594 +875 1682 +302 1001 +486 840 +586 1174 +376 903 +782 1083 +680 993 +811 1136 +576 687 +330 1057 +892 963 +547 763 +17 869 +207 455 +162 612 +414 776 +446 498 +455 1151 +292 355 +240 541 +89 545 +672 1017 +375 783 +152 348 +347 525 +678 682 +538 1301 +569 1458 +624 946 +188 283 +300 456 +225 423 +925 1867 +312 600 +849 984 +148 300 +236 862 +336 806 +566 1280 +793 1411 +789 1666 +134 714 +660 1259 +870 1344 +329 1320 +136 684 +743 1016 +904 1005 +271 1059 +28 566 +482 1474 +278 614 +776 1361 +372 1174 +118 589 +793 906 +346 539 +860 892 +588 1255 +590 1394 +258 935 +452 861 +785 1525 +789 1745 +150 622 +720 1458 +486 1477 +937 1381 +317 1224 +37 301 diff --git a/bottleneck/tests/data/test_876_B b/bottleneck/tests/data/test_876_B new file mode 100644 index 0000000..62102e9 --- /dev/null +++ b/bottleneck/tests/data/test_876_B @@ -0,0 +1,100 @@ +162 530 +694 1522 +850 1742 +293 471 +254 1094 +293 856 +392 411 +919 1673 +427 629 +116 390 +583 1089 +31 812 +270 769 +297 435 +933 1186 +625 741 +759 868 +632 749 +41 82 +138 528 +933 1746 +910 1135 +312 868 +955 1464 +208 1044 +84 368 +444 1114 +749 1643 +572 1339 +584 1330 +736 1483 +779 780 +459 473 +481 1392 +537 1402 +254 1114 +637 1366 +381 1339 +808 1517 +858 1513 +116 508 +102 675 +133 327 +283 1196 +126 910 +634 699 +253 1086 +75 1063 +93 247 +194 661 +848 1195 +690 1350 +816 1340 +821 1352 +387 569 +487 870 +160 1012 +483 1120 +916 1704 +519 975 +324 533 +791 1611 +128 1011 +477 741 +884 930 +773 1424 +904 1238 +252 1162 +730 750 +292 441 +747 1242 +525 1071 +373 1261 +706 1402 +877 1639 +848 1474 +652 884 +995 1061 +509 1496 +970 1168 +855 1167 +94 289 +759 1697 +153 239 +483 1315 +694 1110 +93 255 +564 1525 +632 1562 +218 1068 +548 1072 +167 906 +803 1710 +635 914 +923 1918 +99 633 +8 712 +138 565 +698 1179 +928 1611 diff --git a/bottleneck/tests/data/test_877_A b/bottleneck/tests/data/test_877_A new file mode 100644 index 0000000..c60479b --- /dev/null +++ b/bottleneck/tests/data/test_877_A @@ -0,0 +1,100 @@ +300 707 +123 319 +525 876 +685 1396 +289 961 +27 123 +884 1628 +982 1831 +634 1123 +383 831 +279 637 +349 474 +352 856 +253 1047 +431 679 +986 1871 +923 1654 +991 1073 +686 1337 +848 1810 +180 753 +423 529 +318 466 +356 742 +953 997 +861 865 +205 1200 +423 1141 +976 1485 +698 775 +445 1410 +83 322 +11 585 +384 468 +674 1121 +544 1216 +205 648 +474 745 +860 1595 +624 1216 +970 1721 +505 1397 +886 1137 +184 706 +817 1142 +781 1282 +299 965 +835 940 +954 1359 +304 502 +309 949 +347 441 +80 406 +804 910 +895 1394 +835 1328 +586 634 +790 1152 +884 1203 +252 899 +91 828 +501 968 +971 1076 +676 1214 +217 318 +932 1399 +404 451 +235 1091 +765 1022 +974 1189 +353 989 +828 1769 +948 1846 +914 1206 +589 1406 +551 1139 +317 367 +616 1284 +567 895 +229 528 +533 911 +514 1260 +905 1811 +421 863 +681 925 +252 1023 +365 573 +195 886 +169 710 +327 1311 +348 388 +26 56 +534 1014 +187 263 +927 1764 +3 29 +469 1008 +968 1729 +279 611 +944 1650 diff --git a/bottleneck/tests/data/test_877_B b/bottleneck/tests/data/test_877_B new file mode 100644 index 0000000..728311d --- /dev/null +++ b/bottleneck/tests/data/test_877_B @@ -0,0 +1,100 @@ +628 985 +787 1122 +361 604 +695 1462 +712 977 +294 738 +893 1223 +582 1579 +908 1112 +827 1451 +360 465 +273 375 +123 803 +853 1841 +381 948 +549 868 +34 995 +285 1076 +233 561 +232 1170 +663 1129 +17 34 +41 274 +881 1726 +551 1357 +193 916 +754 852 +384 1061 +745 1426 +954 1188 +950 1469 +493 565 +307 1174 +486 1222 +443 1433 +722 973 +912 1453 +973 1474 +398 1142 +85 779 +961 1952 +928 1842 +351 814 +147 519 +729 877 +26 60 +406 1082 +579 602 +893 1692 +837 1802 +306 457 +945 1792 +461 897 +794 894 +767 1178 +469 1423 +129 833 +251 563 +887 1856 +426 1380 +173 539 +398 1249 +890 1101 +40 864 +481 1123 +651 1126 +520 926 +885 1396 +791 896 +416 1283 +646 1571 +246 1002 +249 394 +650 1543 +378 1225 +918 1043 +58 188 +568 671 +256 796 +315 1143 +840 1449 +709 1260 +730 1655 +525 1409 +561 1149 +338 1162 +204 252 +935 1919 +438 1194 +727 1497 +876 1461 +920 1163 +19 767 +379 427 +953 1926 +912 1022 +423 584 +333 642 +726 1473 +421 1106 diff --git a/bottleneck/tests/data/test_878_A b/bottleneck/tests/data/test_878_A new file mode 100644 index 0000000..c8d0724 --- /dev/null +++ b/bottleneck/tests/data/test_878_A @@ -0,0 +1,100 @@ +279 1254 +922 1250 +849 997 +144 505 +218 1071 +540 1361 +681 773 +572 1345 +827 848 +105 244 +299 1253 +172 784 +730 1315 +488 1249 +803 1175 +139 611 +910 1599 +387 1304 +851 1418 +392 1256 +642 655 +323 338 +594 802 +761 1161 +980 1822 +272 811 +385 474 +70 568 +518 1331 +528 1188 +138 465 +71 1033 +258 968 +242 319 +644 1125 +988 1292 +828 1367 +726 1657 +61 520 +734 1189 +142 615 +794 1276 +267 575 +738 1043 +653 753 +484 1337 +680 761 +963 972 +415 1343 +167 685 +93 861 +263 506 +609 829 +145 436 +302 484 +10 881 +431 603 +638 764 +723 1348 +470 581 +418 1249 +61 814 +992 1096 +776 1386 +406 842 +204 1047 +450 710 +639 765 +272 807 +932 1571 +982 1321 +559 770 +255 363 +648 1136 +668 1322 +332 588 +387 390 +309 737 +561 1463 +958 981 +359 1053 +994 1768 +243 381 +971 1245 +96 704 +353 1090 +589 1261 +46 789 +459 519 +262 425 +154 710 +870 1103 +30 653 +672 1521 +824 1677 +763 835 +143 753 +658 1168 +8 563 +971 1095 diff --git a/bottleneck/tests/data/test_878_B b/bottleneck/tests/data/test_878_B new file mode 100644 index 0000000..32723ce --- /dev/null +++ b/bottleneck/tests/data/test_878_B @@ -0,0 +1,100 @@ +284 785 +695 1555 +939 1668 +395 439 +587 754 +586 996 +831 1534 +296 1185 +379 1162 +243 923 +818 1623 +410 644 +43 356 +929 1429 +83 937 +885 1611 +427 526 +225 804 +717 1460 +30 590 +125 1119 +600 1356 +803 1729 +462 542 +225 785 +26 79 +780 1711 +372 1148 +113 547 +589 1288 +673 1638 +56 555 +569 1078 +687 1547 +201 777 +860 1372 +317 1268 +481 1465 +577 1347 +355 639 +199 560 +669 911 +64 1003 +654 1047 +254 700 +126 542 +418 1041 +242 1075 +642 1349 +476 1047 +614 1041 +365 507 +117 842 +147 929 +369 835 +138 1031 +177 707 +857 968 +803 821 +562 1007 +231 1021 +872 1803 +84 613 +315 562 +962 965 +648 1619 +425 574 +303 654 +766 1676 +17 975 +127 960 +439 645 +646 1215 +448 1375 +697 1654 +294 314 +151 661 +800 1084 +760 1457 +944 1538 +224 895 +309 355 +688 1059 +509 1108 +770 793 +884 947 +147 963 +708 1229 +398 816 +8 872 +617 1057 +642 1609 +558 1128 +409 705 +777 1406 +454 640 +882 1002 +391 1241 +609 1380 +455 863 diff --git a/bottleneck/tests/data/test_879_A b/bottleneck/tests/data/test_879_A new file mode 100644 index 0000000..7a92be6 --- /dev/null +++ b/bottleneck/tests/data/test_879_A @@ -0,0 +1,100 @@ +939 1572 +712 1236 +114 128 +992 1777 +566 617 +460 1258 +681 1380 +716 832 +375 960 +912 1414 +63 1058 +943 1482 +278 690 +123 616 +31 641 +382 862 +962 1798 +709 1518 +190 487 +84 723 +419 515 +105 915 +184 641 +952 1441 +139 760 +462 879 +431 577 +502 1482 +252 1124 +166 413 +406 426 +40 921 +538 936 +850 1574 +64 139 +472 1374 +171 944 +81 128 +107 521 +426 855 +273 278 +139 208 +763 893 +623 973 +433 565 +353 915 +404 945 +981 1151 +200 894 +476 1268 +913 1287 +609 1592 +984 1462 +878 1037 +255 1113 +845 1766 +257 265 +550 1385 +753 1597 +412 1269 +251 1120 +167 851 +288 1117 +392 1279 +213 534 +623 987 +975 1806 +924 1066 +52 676 +822 974 +239 557 +679 1158 +268 524 +241 500 +281 401 +993 1711 +539 1414 +677 1108 +377 482 +315 845 +981 1605 +426 447 +479 1372 +820 1416 +916 1423 +677 1165 +388 1322 +990 1641 +909 914 +814 1225 +851 1151 +78 235 +635 1581 +229 431 +125 877 +708 1338 +763 1354 +877 1794 +225 1171 +232 435 diff --git a/bottleneck/tests/data/test_879_B b/bottleneck/tests/data/test_879_B new file mode 100644 index 0000000..f4c4a36 --- /dev/null +++ b/bottleneck/tests/data/test_879_B @@ -0,0 +1,100 @@ +826 1808 +951 1166 +931 1147 +239 288 +607 762 +103 692 +78 132 +14 502 +666 982 +207 961 +303 690 +492 1135 +528 1499 +979 1576 +584 704 +921 1134 +874 1791 +51 789 +824 1574 +534 1078 +304 1104 +288 828 +445 1433 +492 788 +158 159 +374 863 +313 766 +716 1156 +540 624 +963 1803 +144 341 +415 1223 +314 501 +203 739 +674 1323 +604 705 +958 1738 +33 994 +179 1002 +23 278 +387 460 +857 1659 +563 865 +248 1032 +612 1147 +809 1802 +488 1003 +572 1525 +197 664 +120 648 +290 793 +475 1101 +97 479 +517 703 +843 1555 +292 482 +293 846 +969 1431 +525 552 +299 795 +543 1520 +685 1208 +689 1139 +564 1021 +478 969 +219 646 +361 718 +390 1038 +167 677 +968 1814 +663 1192 +446 1405 +337 1080 +403 564 +167 1159 +717 1483 +707 1224 +923 1698 +564 833 +988 1819 +48 300 +5 540 +252 378 +385 1039 +65 366 +473 1119 +369 989 +804 1501 +333 580 +321 1033 +693 1147 +291 408 +498 1244 +923 1204 +758 1214 +85 561 +550 647 +589 1155 +512 687 +110 459 diff --git a/bottleneck/tests/data/test_list.txt b/bottleneck/tests/data/test_list.txt new file mode 100644 index 0000000..24b462a --- /dev/null +++ b/bottleneck/tests/data/test_list.txt @@ -0,0 +1,792 @@ +test_001_A test_001_B 0.01 1 -1 0 0 -1 +test_002_A test_002_B 0.01 0.2 0 0 +test_003_A test_003_B 0.01 2 1 1 +test_004_A test_004_B 0.01 inf -1 -1 +test_005_A test_005_B 0.01 4 5 5 +test_008_A test_008_B 0.01 0.55 0 -1 +test_009_A test_009_B 0.01 0.55 0 -1 +test_010_A test_010_B 0.01 1.32937 +test_011_A test_011_B 0.01 1.03125 +test_014_A test_014_B 0.01 0 +test_015_A test_015_B 0.01 0 +test_016_A test_016_B 0.01 0 +test_100_A test_100_B 0.01 1.5 +test_101_A test_101_B 0.01 1.5 +test_102_A test_102_B 0.01 4.5 +test_103_A test_103_B 0.01 3 +test_104_A test_104_B 0.01 3.5 +test_105_A test_105_B 0.01 3.5 +test_106_A test_106_B 0.01 3 +test_107_A test_107_B 0.01 5 +test_108_A test_108_B 0.01 5 +test_109_A test_109_B 0.01 3 +test_110_A test_110_B 0.01 4.5 +test_111_A test_111_B 0.01 4 +test_112_A test_112_B 0.01 4 +test_113_A test_113_B 0.01 2.5 +test_114_A test_114_B 0.01 4.5 +test_115_A test_115_B 0.01 4 +test_116_A test_116_B 0.01 4 +test_117_A test_117_B 0.01 2.5 +test_118_A test_118_B 0.01 3 +test_119_A test_119_B 0.01 5 +test_120_A test_120_B 0.01 2 +test_121_A test_121_B 0.01 3 +test_122_A test_122_B 0.01 1 +test_123_A test_123_B 0.01 4 +test_124_A test_124_B 0.01 4 +test_125_A test_125_B 0.01 4.5 +test_126_A test_126_B 0.01 3 +test_127_A test_127_B 0.01 2.5 +test_128_A test_128_B 0.01 2 +test_129_A test_129_B 0.01 3 +test_130_A test_130_B 0.01 5 +test_131_A test_131_B 0.01 5 +test_132_A test_132_B 0.01 2 +test_133_A test_133_B 0.01 3 +test_134_A test_134_B 0.01 3 +test_135_A test_135_B 0.01 4 +test_136_A test_136_B 0.01 2 +test_137_A test_137_B 0.01 3 +test_138_A test_138_B 0.01 2 +test_139_A test_139_B 0.01 2.5 +test_140_A test_140_B 0.01 2 +test_141_A test_141_B 0.01 4 +test_142_A test_142_B 0.01 3 +test_143_A test_143_B 0.01 4 +test_144_A test_144_B 0.01 3 +test_145_A test_145_B 0.01 4 +test_146_A test_146_B 0.01 3 +test_147_A test_147_B 0.01 4 +test_148_A test_148_B 0.01 3 +test_149_A test_149_B 0.01 4 +test_150_A test_150_B 0.01 3 +test_151_A test_151_B 0.01 4 +test_152_A test_152_B 0.01 3.5 +test_153_A test_153_B 0.01 4 +test_154_A test_154_B 0.01 3.5 +test_155_A test_155_B 0.01 3 +test_156_A test_156_B 0.01 3 +test_157_A test_157_B 0.01 4.5 +test_158_A test_158_B 0.01 3.5 +test_159_A test_159_B 0.01 1 +test_160_A test_160_B 0.01 4 +test_161_A test_161_B 0.01 4 +test_162_A test_162_B 0.01 3 +test_163_A test_163_B 0.01 5 +test_164_A test_164_B 0.01 4 +test_165_A test_165_B 0.01 4 +test_166_A test_166_B 0.01 4 +test_167_A test_167_B 0.01 4.5 +test_168_A test_168_B 0.01 4 +test_169_A test_169_B 0.01 3.5 +test_170_A test_170_B 0.01 4 +test_171_A test_171_B 0.01 2 +test_172_A test_172_B 0.01 3 +test_173_A test_173_B 0.01 4 +test_174_A test_174_B 0.01 3 +test_175_A test_175_B 0.01 5 +test_176_A test_176_B 0.01 4.5 +test_177_A test_177_B 0.01 4.5 +test_178_A test_178_B 0.01 4.5 +test_179_A test_179_B 0.01 4 +test_180_A test_180_B 0.01 5 +test_181_A test_181_B 0.01 4 +test_182_A test_182_B 0.01 4.5 +test_183_A test_183_B 0.01 5 +test_184_A test_184_B 0.01 4 +test_185_A test_185_B 0.01 4.5 +test_186_A test_186_B 0.01 3 +test_187_A test_187_B 0.01 4.5 +test_188_A test_188_B 0.01 3 +test_189_A test_189_B 0.01 2 +test_190_A test_190_B 0.01 3 +test_191_A test_191_B 0.01 3 +test_192_A test_192_B 0.01 3.5 +test_193_A test_193_B 0.01 4.5 +test_194_A test_194_B 0.01 3 +test_195_A test_195_B 0.01 3 +test_196_A test_196_B 0.01 3 +test_197_A test_197_B 0.01 3 +test_198_A test_198_B 0.01 5 +test_199_A test_199_B 0.01 3.5 +test_200_A test_200_B 0.01 3 +test_201_A test_201_B 0.01 5 +test_202_A test_202_B 0.01 3 +test_203_A test_203_B 0.01 4 +test_204_A test_204_B 0.01 2.5 +test_205_A test_205_B 0.01 4 +test_206_A test_206_B 0.01 3.5 +test_207_A test_207_B 0.01 3 +test_208_A test_208_B 0.01 4 +test_209_A test_209_B 0.01 3 +test_210_A test_210_B 0.01 5 +test_211_A test_211_B 0.01 3 +test_212_A test_212_B 0.01 3 +test_213_A test_213_B 0.01 3.5 +test_214_A test_214_B 0.01 4 +test_215_A test_215_B 0.01 3 +test_216_A test_216_B 0.01 3.5 +test_217_A test_217_B 0.01 4 +test_218_A test_218_B 0.01 4 +test_219_A test_219_B 0.01 4 +test_220_A test_220_B 0.01 3 +test_221_A test_221_B 0.01 4 +test_222_A test_222_B 0.01 4 +test_223_A test_223_B 0.01 4 +test_224_A test_224_B 0.01 3 +test_225_A test_225_B 0.01 3 +test_226_A test_226_B 0.01 4 +test_227_A test_227_B 0.01 4 +test_228_A test_228_B 0.01 4 +test_229_A test_229_B 0.01 3 +test_230_A test_230_B 0.01 3 +test_231_A test_231_B 0.01 4 +test_232_A test_232_B 0.01 4 +test_233_A test_233_B 0.01 2 +test_234_A test_234_B 0.01 3.5 +test_235_A test_235_B 0.01 4 +test_236_A test_236_B 0.01 3 +test_237_A test_237_B 0.01 3.5 +test_238_A test_238_B 0.01 4 +test_239_A test_239_B 0.01 3 +test_240_A test_240_B 0.01 3 +test_241_A test_241_B 0.01 5 +test_242_A test_242_B 0.01 4.5 +test_243_A test_243_B 0.01 4 +test_244_A test_244_B 0.01 3.5 +test_245_A test_245_B 0.01 5 +test_246_A test_246_B 0.01 2.5 +test_247_A test_247_B 0.01 3 +test_248_A test_248_B 0.01 4 +test_249_A test_249_B 0.01 2 +test_250_A test_250_B 0.01 5 +test_251_A test_251_B 0.01 4 +test_252_A test_252_B 0.01 4 +test_253_A test_253_B 0.01 4.5 +test_254_A test_254_B 0.01 4 +test_255_A test_255_B 0.01 3 +test_256_A test_256_B 0.01 4.5 +test_257_A test_257_B 0.01 4 +test_258_A test_258_B 0.01 5 +test_259_A test_259_B 0.01 4 +test_260_A test_260_B 0.01 4 +test_261_A test_261_B 0.01 2.5 +test_262_A test_262_B 0.01 2 +test_263_A test_263_B 0.01 4.5 +test_264_A test_264_B 0.01 3.5 +test_265_A test_265_B 0.01 4 +test_266_A test_266_B 0.01 3 +test_267_A test_267_B 0.01 5 +test_268_A test_268_B 0.01 4 +test_269_A test_269_B 0.01 4 +test_270_A test_270_B 0.01 3 +test_271_A test_271_B 0.01 4 +test_272_A test_272_B 0.01 4 +test_273_A test_273_B 0.01 2 +test_274_A test_274_B 0.01 3 +test_275_A test_275_B 0.01 3 +test_276_A test_276_B 0.01 4 +test_277_A test_277_B 0.01 5 +test_278_A test_278_B 0.01 4 +test_279_A test_279_B 0.01 4.5 +test_280_A test_280_B 0.01 3.5 +test_281_A test_281_B 0.01 2 +test_282_A test_282_B 0.01 3 +test_283_A test_283_B 0.01 3 +test_284_A test_284_B 0.01 3 +test_285_A test_285_B 0.01 3 +test_286_A test_286_B 0.01 3 +test_287_A test_287_B 0.01 3.5 +test_288_A test_288_B 0.01 3 +test_289_A test_289_B 0.01 2 +test_290_A test_290_B 0.01 4 +test_291_A test_291_B 0.01 3 +test_292_A test_292_B 0.01 4 +test_293_A test_293_B 0.01 2.5 +test_294_A test_294_B 0.01 4 +test_295_A test_295_B 0.01 3.5 +test_296_A test_296_B 0.01 3 +test_297_A test_297_B 0.01 3 +test_298_A test_298_B 0.01 4 +test_299_A test_299_B 0.01 4 +test_300_A test_300_B 0.01 3 +test_301_A test_301_B 0.01 2 +test_302_A test_302_B 0.01 2 +test_303_A test_303_B 0.01 3 +test_304_A test_304_B 0.01 3 +test_305_A test_305_B 0.01 3 +test_306_A test_306_B 0.01 3 +test_307_A test_307_B 0.01 2 +test_308_A test_308_B 0.01 3 +test_309_A test_309_B 0.01 2.5 +test_310_A test_310_B 0.01 4 +test_311_A test_311_B 0.01 3 +test_312_A test_312_B 0.01 3.5 +test_313_A test_313_B 0.01 3 +test_314_A test_314_B 0.01 2 +test_315_A test_315_B 0.01 3 +test_316_A test_316_B 0.01 4.5 +test_317_A test_317_B 0.01 3 +test_318_A test_318_B 0.01 3 +test_319_A test_319_B 0.01 3 +test_320_A test_320_B 0.01 4 +test_321_A test_321_B 0.01 2 +test_322_A test_322_B 0.01 3 +test_323_A test_323_B 0.01 3 +test_324_A test_324_B 0.01 2 +test_325_A test_325_B 0.01 3 +test_326_A test_326_B 0.01 2 +test_327_A test_327_B 0.01 3 +test_328_A test_328_B 0.01 3 +test_329_A test_329_B 0.01 4 +test_330_A test_330_B 0.01 3 +test_331_A test_331_B 0.01 3 +test_332_A test_332_B 0.01 2 +test_333_A test_333_B 0.01 2 +test_334_A test_334_B 0.01 3 +test_335_A test_335_B 0.01 2 +test_336_A test_336_B 0.01 3 +test_337_A test_337_B 0.01 2 +test_338_A test_338_B 0.01 2 +test_339_A test_339_B 0.01 2 +test_340_A test_340_B 0.01 1 +test_341_A test_341_B 0.01 2 +test_342_A test_342_B 0.01 2 +test_343_A test_343_B 0.01 2 +test_344_A test_344_B 0.01 2 +test_345_A test_345_B 0.01 2 +test_346_A test_346_B 0.01 2 +test_347_A test_347_B 0.01 2 +test_348_A test_348_B 0.01 2 +test_349_A test_349_B 0.01 2 +test_350_A test_350_B 0.01 2 +test_351_A test_351_B 0.01 2 +test_352_A test_352_B 0.01 2 +test_353_A test_353_B 0.01 2.5 +test_354_A test_354_B 0.01 2 +test_355_A test_355_B 0.01 2 +test_356_A test_356_B 0.01 2 +test_357_A test_357_B 0.01 2 +test_358_A test_358_B 0.01 2 +test_359_A test_359_B 0.01 2 +test_360_A test_360_B 0.01 32 +test_361_A test_361_B 0.01 8 +test_362_A test_362_B 0.01 29.5 +test_363_A test_363_B 0.01 41 +test_364_A test_364_B 0.01 41.5 +test_365_A test_365_B 0.01 27.5 +test_366_A test_366_B 0.01 46 +test_367_A test_367_B 0.01 37.5 +test_368_A test_368_B 0.01 27 +test_369_A test_369_B 0.01 42 +test_370_A test_370_B 0.01 45.5 +test_371_A test_371_B 0.01 34 +test_372_A test_372_B 0.01 19.5 +test_373_A test_373_B 0.01 24 +test_374_A test_374_B 0.01 10 +test_375_A test_375_B 0.01 17.5 +test_376_A test_376_B 0.01 28.5 +test_377_A test_377_B 0.01 40 +test_378_A test_378_B 0.01 40 +test_379_A test_379_B 0.01 24.5 +test_380_A test_380_B 0.01 36 +test_381_A test_381_B 0.01 38 +test_382_A test_382_B 0.01 48 +test_383_A test_383_B 0.01 32.5 +test_384_A test_384_B 0.01 44 +test_385_A test_385_B 0.01 44.5 +test_386_A test_386_B 0.01 11 +test_387_A test_387_B 0.01 47.5 +test_388_A test_388_B 0.01 28 +test_389_A test_389_B 0.01 32 +test_390_A test_390_B 0.01 24.5 +test_391_A test_391_B 0.01 47 +test_392_A test_392_B 0.01 28 +test_393_A test_393_B 0.01 16 +test_394_A test_394_B 0.01 44 +test_395_A test_395_B 0.01 38 +test_396_A test_396_B 0.01 47.5 +test_397_A test_397_B 0.01 35 +test_398_A test_398_B 0.01 33 +test_399_A test_399_B 0.01 33 +test_400_A test_400_B 0.01 31 +test_401_A test_401_B 0.01 48 +test_402_A test_402_B 0.01 37.5 +test_403_A test_403_B 0.01 40 +test_404_A test_404_B 0.01 47 +test_405_A test_405_B 0.01 23 +test_406_A test_406_B 0.01 40 +test_407_A test_407_B 0.01 46 +test_408_A test_408_B 0.01 39 +test_409_A test_409_B 0.01 26 +test_410_A test_410_B 0.01 28 +test_411_A test_411_B 0.01 27 +test_412_A test_412_B 0.01 33 +test_413_A test_413_B 0.01 36 +test_414_A test_414_B 0.01 42.5 +test_415_A test_415_B 0.01 40 +test_416_A test_416_B 0.01 37 +test_417_A test_417_B 0.01 43 +test_418_A test_418_B 0.01 16 +test_419_A test_419_B 0.01 34 +test_420_A test_420_B 0.01 42.5 +test_421_A test_421_B 0.01 38 +test_422_A test_422_B 0.01 30 +test_423_A test_423_B 0.01 44 +test_424_A test_424_B 0.01 46 +test_425_A test_425_B 0.01 38 +test_426_A test_426_B 0.01 35.5 +test_427_A test_427_B 0.01 29 +test_428_A test_428_B 0.01 43.5 +test_429_A test_429_B 0.01 34 +test_430_A test_430_B 0.01 48 +test_431_A test_431_B 0.01 41 +test_432_A test_432_B 0.01 35 +test_433_A test_433_B 0.01 32 +test_434_A test_434_B 0.01 36 +test_435_A test_435_B 0.01 43.5 +test_436_A test_436_B 0.01 32.5 +test_437_A test_437_B 0.01 40 +test_438_A test_438_B 0.01 34 +test_439_A test_439_B 0.01 31.5 +test_440_A test_440_B 0.01 26.5 +test_441_A test_441_B 0.01 49.5 +test_442_A test_442_B 0.01 30 +test_443_A test_443_B 0.01 29 +test_444_A test_444_B 0.01 29 +test_445_A test_445_B 0.01 48 +test_446_A test_446_B 0.01 35 +test_447_A test_447_B 0.01 43 +test_448_A test_448_B 0.01 19 +test_449_A test_449_B 0.01 34 +test_450_A test_450_B 0.01 44 +test_451_A test_451_B 0.01 36 +test_452_A test_452_B 0.01 32 +test_453_A test_453_B 0.01 49 +test_454_A test_454_B 0.01 48.5 +test_455_A test_455_B 0.01 46 +test_456_A test_456_B 0.01 33.5 +test_457_A test_457_B 0.01 49.5 +test_458_A test_458_B 0.01 38 +test_459_A test_459_B 0.01 21 +test_460_A test_460_B 0.01 40 +test_461_A test_461_B 0.01 32 +test_462_A test_462_B 0.01 37 +test_463_A test_463_B 0.01 23 +test_464_A test_464_B 0.01 19 +test_465_A test_465_B 0.01 29 +test_466_A test_466_B 0.01 38 +test_467_A test_467_B 0.01 29 +test_468_A test_468_B 0.01 45 +test_469_A test_469_B 0.01 27.5 +test_470_A test_470_B 0.01 43 +test_471_A test_471_B 0.01 24.5 +test_472_A test_472_B 0.01 42 +test_473_A test_473_B 0.01 36.5 +test_474_A test_474_B 0.01 46.5 +test_475_A test_475_B 0.01 18 +test_476_A test_476_B 0.01 29 +test_477_A test_477_B 0.01 44 +test_478_A test_478_B 0.01 49 +test_479_A test_479_B 0.01 33 +test_480_A test_480_B 0.01 43 +test_481_A test_481_B 0.01 42 +test_482_A test_482_B 0.01 31 +test_483_A test_483_B 0.01 37 +test_484_A test_484_B 0.01 25 +test_485_A test_485_B 0.01 33 +test_486_A test_486_B 0.01 35 +test_487_A test_487_B 0.01 39 +test_488_A test_488_B 0.01 26.5 +test_489_A test_489_B 0.01 39.5 +test_490_A test_490_B 0.01 26 +test_491_A test_491_B 0.01 45 +test_492_A test_492_B 0.01 21 +test_493_A test_493_B 0.01 37 +test_494_A test_494_B 0.01 50 +test_495_A test_495_B 0.01 41 +test_496_A test_496_B 0.01 34 +test_497_A test_497_B 0.01 35 +test_498_A test_498_B 0.01 34 +test_499_A test_499_B 0.01 30 +test_500_A test_500_B 0.01 39 +test_501_A test_501_B 0.01 36 +test_502_A test_502_B 0.01 36 +test_503_A test_503_B 0.01 49.5 +test_504_A test_504_B 0.01 40.5 +test_505_A test_505_B 0.01 29 +test_506_A test_506_B 0.01 33 +test_507_A test_507_B 0.01 38 +test_508_A test_508_B 0.01 21.5 +test_509_A test_509_B 0.01 27 +test_510_A test_510_B 0.01 43 +test_511_A test_511_B 0.01 34 +test_512_A test_512_B 0.01 25.5 +test_513_A test_513_B 0.01 19 +test_514_A test_514_B 0.01 28 +test_515_A test_515_B 0.01 41.5 +test_516_A test_516_B 0.01 46 +test_517_A test_517_B 0.01 34 +test_518_A test_518_B 0.01 33 +test_519_A test_519_B 0.01 37.5 +test_520_A test_520_B 0.01 37 +test_521_A test_521_B 0.01 42.5 +test_522_A test_522_B 0.01 44 +test_523_A test_523_B 0.01 36.5 +test_524_A test_524_B 0.01 40 +test_525_A test_525_B 0.01 36.5 +test_526_A test_526_B 0.01 24 +test_527_A test_527_B 0.01 34 +test_528_A test_528_B 0.01 23.5 +test_529_A test_529_B 0.01 30 +test_530_A test_530_B 0.01 50 +test_531_A test_531_B 0.01 33 +test_532_A test_532_B 0.01 36 +test_533_A test_533_B 0.01 24 +test_534_A test_534_B 0.01 46.5 +test_535_A test_535_B 0.01 39 +test_536_A test_536_B 0.01 26 +test_537_A test_537_B 0.01 30 +test_538_A test_538_B 0.01 27.5 +test_539_A test_539_B 0.01 26 +test_540_A test_540_B 0.01 23 +test_541_A test_541_B 0.01 26.5 +test_542_A test_542_B 0.01 40.5 +test_543_A test_543_B 0.01 41 +test_544_A test_544_B 0.01 46 +test_545_A test_545_B 0.01 33 +test_546_A test_546_B 0.01 38 +test_547_A test_547_B 0.01 33 +test_548_A test_548_B 0.01 28 +test_549_A test_549_B 0.01 29 +test_550_A test_550_B 0.01 33 +test_551_A test_551_B 0.01 20 +test_552_A test_552_B 0.01 27 +test_553_A test_553_B 0.01 21.5 +test_554_A test_554_B 0.01 28 +test_555_A test_555_B 0.01 31 +test_556_A test_556_B 0.01 31 +test_557_A test_557_B 0.01 30 +test_558_A test_558_B 0.01 29 +test_559_A test_559_B 0.01 30 +test_560_A test_560_B 0.01 21 +test_561_A test_561_B 0.01 37.5 +test_562_A test_562_B 0.01 40 +test_563_A test_563_B 0.01 25 +test_564_A test_564_B 0.01 22 +test_565_A test_565_B 0.01 24 +test_566_A test_566_B 0.01 39 +test_567_A test_567_B 0.01 27 +test_568_A test_568_B 0.01 30 +test_569_A test_569_B 0.01 35 +test_570_A test_570_B 0.01 29 +test_571_A test_571_B 0.01 27 +test_572_A test_572_B 0.01 23 +test_573_A test_573_B 0.01 34 +test_574_A test_574_B 0.01 26 +test_575_A test_575_B 0.01 28 +test_576_A test_576_B 0.01 22 +test_577_A test_577_B 0.01 29 +test_578_A test_578_B 0.01 24 +test_579_A test_579_B 0.01 22 +test_580_A test_580_B 0.01 31 +test_581_A test_581_B 0.01 39 +test_582_A test_582_B 0.01 21 +test_583_A test_583_B 0.01 32 +test_584_A test_584_B 0.01 22 +test_585_A test_585_B 0.01 26 +test_586_A test_586_B 0.01 20 +test_587_A test_587_B 0.01 28 +test_588_A test_588_B 0.01 22 +test_589_A test_589_B 0.01 20 +test_590_A test_590_B 0.01 17 +test_591_A test_591_B 0.01 24 +test_592_A test_592_B 0.01 27.5 +test_593_A test_593_B 0.01 31 +test_594_A test_594_B 0.01 18 +test_595_A test_595_B 0.01 18 +test_596_A test_596_B 0.01 32 +test_597_A test_597_B 0.01 17 +test_598_A test_598_B 0.01 19 +test_599_A test_599_B 0.01 23 +test_600_A test_600_B 0.01 16 +test_601_A test_601_B 0.01 13 +test_602_A test_602_B 0.01 25 +test_603_A test_603_B 0.01 17 +test_604_A test_604_B 0.01 18 +test_605_A test_605_B 0.01 20 +test_606_A test_606_B 0.01 16 +test_607_A test_607_B 0.01 19 +test_608_A test_608_B 0.01 22 +test_609_A test_609_B 0.01 18 +test_610_A test_610_B 0.01 22 +test_611_A test_611_B 0.01 18 +test_612_A test_612_B 0.01 21 +test_613_A test_613_B 0.01 23 +test_614_A test_614_B 0.01 14 +test_615_A test_615_B 0.01 21 +test_616_A test_616_B 0.01 20 +test_617_A test_617_B 0.01 17 +test_618_A test_618_B 0.01 15 +test_619_A test_619_B 0.01 18 +test_620_A test_620_B 0.01 346.5 +test_621_A test_621_B 0.01 414 +test_622_A test_622_B 0.01 321 +test_623_A test_623_B 0.01 428 +test_624_A test_624_B 0.01 137.5 +test_625_A test_625_B 0.01 272 +test_626_A test_626_B 0.01 257 +test_627_A test_627_B 0.01 261 +test_628_A test_628_B 0.01 480.5 +test_629_A test_629_B 0.01 378 +test_630_A test_630_B 0.01 153.5 +test_631_A test_631_B 0.01 199 +test_632_A test_632_B 0.01 457 +test_633_A test_633_B 0.01 358.5 +test_634_A test_634_B 0.01 357 +test_635_A test_635_B 0.01 216 +test_636_A test_636_B 0.01 460.5 +test_637_A test_637_B 0.01 314 +test_638_A test_638_B 0.01 322 +test_639_A test_639_B 0.01 440.5 +test_640_A test_640_B 0.01 324 +test_641_A test_641_B 0.01 265 +test_642_A test_642_B 0.01 395.5 +test_643_A test_643_B 0.01 397 +test_644_A test_644_B 0.01 308 +test_645_A test_645_B 0.01 199 +test_646_A test_646_B 0.01 256.5 +test_647_A test_647_B 0.01 293 +test_648_A test_648_B 0.01 297 +test_649_A test_649_B 0.01 410.5 +test_650_A test_650_B 0.01 322 +test_651_A test_651_B 0.01 458 +test_652_A test_652_B 0.01 420.5 +test_653_A test_653_B 0.01 235 +test_654_A test_654_B 0.01 220 +test_655_A test_655_B 0.01 257 +test_656_A test_656_B 0.01 305 +test_657_A test_657_B 0.01 230.5 +test_658_A test_658_B 0.01 500 +test_659_A test_659_B 0.01 155 +test_660_A test_660_B 0.01 418 +test_661_A test_661_B 0.01 403.5 +test_662_A test_662_B 0.01 296 +test_663_A test_663_B 0.01 297.5 +test_664_A test_664_B 0.01 219 +test_665_A test_665_B 0.01 476.5 +test_666_A test_666_B 0.01 347 +test_667_A test_667_B 0.01 284 +test_668_A test_668_B 0.01 324.5 +test_669_A test_669_B 0.01 231 +test_670_A test_670_B 0.01 410 +test_671_A test_671_B 0.01 206 +test_672_A test_672_B 0.01 266 +test_673_A test_673_B 0.01 319.5 +test_674_A test_674_B 0.01 483 +test_675_A test_675_B 0.01 355.5 +test_676_A test_676_B 0.01 316.5 +test_677_A test_677_B 0.01 297 +test_678_A test_678_B 0.01 458 +test_679_A test_679_B 0.01 398.5 +test_680_A test_680_B 0.01 371.5 +test_681_A test_681_B 0.01 338 +test_682_A test_682_B 0.01 461 +test_683_A test_683_B 0.01 298.5 +test_684_A test_684_B 0.01 303.5 +test_685_A test_685_B 0.01 265 +test_686_A test_686_B 0.01 400.5 +test_687_A test_687_B 0.01 264 +test_688_A test_688_B 0.01 303 +test_689_A test_689_B 0.01 360 +test_690_A test_690_B 0.01 325 +test_691_A test_691_B 0.01 217 +test_692_A test_692_B 0.01 313 +test_693_A test_693_B 0.01 491 +test_694_A test_694_B 0.01 367.5 +test_695_A test_695_B 0.01 285 +test_696_A test_696_B 0.01 314 +test_697_A test_697_B 0.01 379 +test_698_A test_698_B 0.01 277.5 +test_699_A test_699_B 0.01 302 +test_700_A test_700_B 0.01 299 +test_701_A test_701_B 0.01 439.5 +test_702_A test_702_B 0.01 289 +test_703_A test_703_B 0.01 460.5 +test_704_A test_704_B 0.01 210 +test_705_A test_705_B 0.01 491 +test_706_A test_706_B 0.01 438.5 +test_707_A test_707_B 0.01 323 +test_708_A test_708_B 0.01 427 +test_709_A test_709_B 0.01 364 +test_710_A test_710_B 0.01 434 +test_711_A test_711_B 0.01 434 +test_712_A test_712_B 0.01 391 +test_713_A test_713_B 0.01 356 +test_714_A test_714_B 0.01 420 +test_715_A test_715_B 0.01 354 +test_716_A test_716_B 0.01 281 +test_717_A test_717_B 0.01 359.5 +test_718_A test_718_B 0.01 345 +test_719_A test_719_B 0.01 341.5 +test_720_A test_720_B 0.01 497.5 +test_721_A test_721_B 0.01 199 +test_722_A test_722_B 0.01 452 +test_723_A test_723_B 0.01 335.5 +test_724_A test_724_B 0.01 311 +test_725_A test_725_B 0.01 336 +test_726_A test_726_B 0.01 300 +test_727_A test_727_B 0.01 317 +test_728_A test_728_B 0.01 492 +test_729_A test_729_B 0.01 304 +test_730_A test_730_B 0.01 217 +test_731_A test_731_B 0.01 322 +test_732_A test_732_B 0.01 289 +test_733_A test_733_B 0.01 182 +test_734_A test_734_B 0.01 410.5 +test_735_A test_735_B 0.01 306 +test_736_A test_736_B 0.01 294 +test_737_A test_737_B 0.01 254 +test_738_A test_738_B 0.01 338.5 +test_739_A test_739_B 0.01 225 +test_740_A test_740_B 0.01 280 +test_741_A test_741_B 0.01 454 +test_742_A test_742_B 0.01 226 +test_743_A test_743_B 0.01 365 +test_744_A test_744_B 0.01 456 +test_745_A test_745_B 0.01 405 +test_746_A test_746_B 0.01 322 +test_747_A test_747_B 0.01 279 +test_748_A test_748_B 0.01 311.5 +test_749_A test_749_B 0.01 308 +test_750_A test_750_B 0.01 322 +test_751_A test_751_B 0.01 409 +test_752_A test_752_B 0.01 277 +test_753_A test_753_B 0.01 318 +test_754_A test_754_B 0.01 299.5 +test_755_A test_755_B 0.01 462.5 +test_756_A test_756_B 0.01 314 +test_757_A test_757_B 0.01 300 +test_758_A test_758_B 0.01 455 +test_759_A test_759_B 0.01 422.5 +test_760_A test_760_B 0.01 433.5 +test_761_A test_761_B 0.01 278 +test_762_A test_762_B 0.01 484.5 +test_763_A test_763_B 0.01 348 +test_764_A test_764_B 0.01 491 +test_765_A test_765_B 0.01 280 +test_766_A test_766_B 0.01 259 +test_767_A test_767_B 0.01 275.5 +test_768_A test_768_B 0.01 348 +test_769_A test_769_B 0.01 330 +test_770_A test_770_B 0.01 412 +test_771_A test_771_B 0.01 262 +test_772_A test_772_B 0.01 455 +test_773_A test_773_B 0.01 294 +test_774_A test_774_B 0.01 425 +test_775_A test_775_B 0.01 220.5 +test_776_A test_776_B 0.01 411.5 +test_777_A test_777_B 0.01 383 +test_778_A test_778_B 0.01 363 +test_779_A test_779_B 0.01 302 +test_780_A test_780_B 0.01 328 +test_781_A test_781_B 0.01 294 +test_782_A test_782_B 0.01 407.5 +test_783_A test_783_B 0.01 260.5 +test_784_A test_784_B 0.01 410 +test_785_A test_785_B 0.01 328 +test_786_A test_786_B 0.01 419.5 +test_787_A test_787_B 0.01 165 +test_788_A test_788_B 0.01 389 +test_789_A test_789_B 0.01 254 +test_790_A test_790_B 0.01 311 +test_791_A test_791_B 0.01 258 +test_792_A test_792_B 0.01 331 +test_793_A test_793_B 0.01 378 +test_794_A test_794_B 0.01 415 +test_795_A test_795_B 0.01 364 +test_796_A test_796_B 0.01 279 +test_797_A test_797_B 0.01 249 +test_798_A test_798_B 0.01 463 +test_799_A test_799_B 0.01 304 +test_800_A test_800_B 0.01 187 +test_801_A test_801_B 0.01 305.5 +test_802_A test_802_B 0.01 385 +test_803_A test_803_B 0.01 360.5 +test_804_A test_804_B 0.01 269 +test_805_A test_805_B 0.01 294 +test_806_A test_806_B 0.01 362 +test_807_A test_807_B 0.01 354 +test_808_A test_808_B 0.01 196 +test_809_A test_809_B 0.01 248 +test_810_A test_810_B 0.01 297.5 +test_811_A test_811_B 0.01 243 +test_812_A test_812_B 0.01 312 +test_813_A test_813_B 0.01 241 +test_814_A test_814_B 0.01 384 +test_815_A test_815_B 0.01 250 +test_816_A test_816_B 0.01 205 +test_817_A test_817_B 0.01 308 +test_818_A test_818_B 0.01 356 +test_819_A test_819_B 0.01 230 +test_820_A test_820_B 0.01 178 +test_821_A test_821_B 0.01 294 +test_822_A test_822_B 0.01 227 +test_823_A test_823_B 0.01 234 +test_824_A test_824_B 0.01 241 +test_825_A test_825_B 0.01 233 +test_826_A test_826_B 0.01 284 +test_827_A test_827_B 0.01 287 +test_828_A test_828_B 0.01 192 +test_829_A test_829_B 0.01 359 +test_830_A test_830_B 0.01 225 +test_831_A test_831_B 0.01 273 +test_832_A test_832_B 0.01 248 +test_833_A test_833_B 0.01 217 +test_834_A test_834_B 0.01 332 +test_835_A test_835_B 0.01 218 +test_836_A test_836_B 0.01 335 +test_837_A test_837_B 0.01 192 +test_838_A test_838_B 0.01 188 +test_839_A test_839_B 0.01 347 +test_840_A test_840_B 0.01 273 +test_841_A test_841_B 0.01 187 +test_842_A test_842_B 0.01 170 +test_843_A test_843_B 0.01 230 +test_844_A test_844_B 0.01 206.5 +test_845_A test_845_B 0.01 177 +test_846_A test_846_B 0.01 251 +test_847_A test_847_B 0.01 163 +test_848_A test_848_B 0.01 174 +test_849_A test_849_B 0.01 177 +test_850_A test_850_B 0.01 252 +test_851_A test_851_B 0.01 262 +test_852_A test_852_B 0.01 174 +test_853_A test_853_B 0.01 169 +test_854_A test_854_B 0.01 200 +test_855_A test_855_B 0.01 189 +test_856_A test_856_B 0.01 206.5 +test_857_A test_857_B 0.01 260 +test_858_A test_858_B 0.01 191 +test_859_A test_859_B 0.01 216 +test_860_A test_860_B 0.01 181.5 +test_861_A test_861_B 0.01 219 +test_862_A test_862_B 0.01 143 +test_863_A test_863_B 0.01 173 +test_864_A test_864_B 0.01 134 +test_865_A test_865_B 0.01 159 +test_866_A test_866_B 0.01 205 +test_867_A test_867_B 0.01 178 +test_868_A test_868_B 0.01 189.5 +test_869_A test_869_B 0.01 145 +test_870_A test_870_B 0.01 179 +test_871_A test_871_B 0.01 167 +test_872_A test_872_B 0.01 149 +test_873_A test_873_B 0.01 149 +test_874_A test_874_B 0.01 187 +test_875_A test_875_B 0.01 193 +test_876_A test_876_B 0.01 165 +test_877_A test_877_B 0.01 190 +test_878_A test_878_B 0.01 242 +test_879_A test_879_B 0.01 187 diff --git a/bottleneck/tests/data/test_list.txt.bak b/bottleneck/tests/data/test_list.txt.bak new file mode 100644 index 0000000..71b89ed --- /dev/null +++ b/bottleneck/tests/data/test_list.txt.bak @@ -0,0 +1,792 @@ +test_001_A test_001_B 0.01 1 -1 0 0 -1 +test_002_A test_002_B 0.01 0.2 0 0 +test_003_A test_003_B 0.01 2 1 1 +test_004_A test_004_B 0.01 inf -1 -1 +test_005_A test_005_B 0.01 4 5 5 +test_010_A test_010_B 0.01 1.32937 +test_011_A test_011_B 0.01 1.03125 +test_012_A test_012_B 0.01 0.56679 +test_013_A test_013_B 0.01 1.26332 +test_014_A test_014_B 0.01 0 +test_015_A test_015_B 0.01 0 +test_016_A test_016_B 0.01 0 +test_100_A test_100_B 0.01 1.5 +test_101_A test_101_B 0.01 1.5 +test_102_A test_102_B 0.01 4.5 +test_103_A test_103_B 0.01 3 +test_104_A test_104_B 0.01 3.5 +test_105_A test_105_B 0.01 3.5 +test_106_A test_106_B 0.01 3 +test_107_A test_107_B 0.01 5 +test_108_A test_108_B 0.01 5 +test_109_A test_109_B 0.01 3 +test_110_A test_110_B 0.01 4.5 +test_111_A test_111_B 0.01 4 +test_112_A test_112_B 0.01 4 +test_113_A test_113_B 0.01 2.5 +test_114_A test_114_B 0.01 4.5 +test_115_A test_115_B 0.01 4 +test_116_A test_116_B 0.01 4 +test_117_A test_117_B 0.01 2.5 +test_118_A test_118_B 0.01 3 +test_119_A test_119_B 0.01 5 +test_120_A test_120_B 0.01 2 +test_121_A test_121_B 0.01 3 +test_122_A test_122_B 0.01 1 +test_123_A test_123_B 0.01 4 +test_124_A test_124_B 0.01 4 +test_125_A test_125_B 0.01 4.5 +test_126_A test_126_B 0.01 3 +test_127_A test_127_B 0.01 2.5 +test_128_A test_128_B 0.01 2 +test_129_A test_129_B 0.01 3 +test_130_A test_130_B 0.01 5 +test_131_A test_131_B 0.01 5 +test_132_A test_132_B 0.01 2 +test_133_A test_133_B 0.01 3 +test_134_A test_134_B 0.01 3 +test_135_A test_135_B 0.01 4 +test_136_A test_136_B 0.01 2 +test_137_A test_137_B 0.01 3 +test_138_A test_138_B 0.01 2 +test_139_A test_139_B 0.01 2.5 +test_140_A test_140_B 0.01 2 +test_141_A test_141_B 0.01 4 +test_142_A test_142_B 0.01 3 +test_143_A test_143_B 0.01 4 +test_144_A test_144_B 0.01 3 +test_145_A test_145_B 0.01 4 +test_146_A test_146_B 0.01 3 +test_147_A test_147_B 0.01 4 +test_148_A test_148_B 0.01 3 +test_149_A test_149_B 0.01 4 +test_150_A test_150_B 0.01 3 +test_151_A test_151_B 0.01 4 +test_152_A test_152_B 0.01 3.5 +test_153_A test_153_B 0.01 4 +test_154_A test_154_B 0.01 3.5 +test_155_A test_155_B 0.01 3 +test_156_A test_156_B 0.01 3 +test_157_A test_157_B 0.01 4.5 +test_158_A test_158_B 0.01 3.5 +test_159_A test_159_B 0.01 1 +test_160_A test_160_B 0.01 4 +test_161_A test_161_B 0.01 4 +test_162_A test_162_B 0.01 3 +test_163_A test_163_B 0.01 5 +test_164_A test_164_B 0.01 4 +test_165_A test_165_B 0.01 4 +test_166_A test_166_B 0.01 4 +test_167_A test_167_B 0.01 4.5 +test_168_A test_168_B 0.01 4 +test_169_A test_169_B 0.01 3.5 +test_170_A test_170_B 0.01 4 +test_171_A test_171_B 0.01 2 +test_172_A test_172_B 0.01 3 +test_173_A test_173_B 0.01 4 +test_174_A test_174_B 0.01 3 +test_175_A test_175_B 0.01 5 +test_176_A test_176_B 0.01 4.5 +test_177_A test_177_B 0.01 4.5 +test_178_A test_178_B 0.01 4.5 +test_179_A test_179_B 0.01 4 +test_180_A test_180_B 0.01 5 +test_181_A test_181_B 0.01 4 +test_182_A test_182_B 0.01 4.5 +test_183_A test_183_B 0.01 5 +test_184_A test_184_B 0.01 4 +test_185_A test_185_B 0.01 4.5 +test_186_A test_186_B 0.01 3 +test_187_A test_187_B 0.01 4.5 +test_188_A test_188_B 0.01 3 +test_189_A test_189_B 0.01 2 +test_190_A test_190_B 0.01 3 +test_191_A test_191_B 0.01 3 +test_192_A test_192_B 0.01 3.5 +test_193_A test_193_B 0.01 4.5 +test_194_A test_194_B 0.01 3 +test_195_A test_195_B 0.01 3 +test_196_A test_196_B 0.01 3 +test_197_A test_197_B 0.01 3 +test_198_A test_198_B 0.01 5 +test_199_A test_199_B 0.01 3.5 +test_200_A test_200_B 0.01 3 +test_201_A test_201_B 0.01 5 +test_202_A test_202_B 0.01 3 +test_203_A test_203_B 0.01 4 +test_204_A test_204_B 0.01 2.5 +test_205_A test_205_B 0.01 4 +test_206_A test_206_B 0.01 3.5 +test_207_A test_207_B 0.01 3 +test_208_A test_208_B 0.01 4 +test_209_A test_209_B 0.01 3 +test_210_A test_210_B 0.01 5 +test_211_A test_211_B 0.01 3 +test_212_A test_212_B 0.01 3 +test_213_A test_213_B 0.01 3.5 +test_214_A test_214_B 0.01 4 +test_215_A test_215_B 0.01 3 +test_216_A test_216_B 0.01 3.5 +test_217_A test_217_B 0.01 4 +test_218_A test_218_B 0.01 4 +test_219_A test_219_B 0.01 4 +test_220_A test_220_B 0.01 3 +test_221_A test_221_B 0.01 4 +test_222_A test_222_B 0.01 4 +test_223_A test_223_B 0.01 4 +test_224_A test_224_B 0.01 3 +test_225_A test_225_B 0.01 3 +test_226_A test_226_B 0.01 4 +test_227_A test_227_B 0.01 4 +test_228_A test_228_B 0.01 4 +test_229_A test_229_B 0.01 3 +test_230_A test_230_B 0.01 3 +test_231_A test_231_B 0.01 4 +test_232_A test_232_B 0.01 4 +test_233_A test_233_B 0.01 2 +test_234_A test_234_B 0.01 3.5 +test_235_A test_235_B 0.01 4 +test_236_A test_236_B 0.01 3 +test_237_A test_237_B 0.01 3.5 +test_238_A test_238_B 0.01 4 +test_239_A test_239_B 0.01 3 +test_240_A test_240_B 0.01 3 +test_241_A test_241_B 0.01 5 +test_242_A test_242_B 0.01 4.5 +test_243_A test_243_B 0.01 4 +test_244_A test_244_B 0.01 3.5 +test_245_A test_245_B 0.01 5 +test_246_A test_246_B 0.01 2.5 +test_247_A test_247_B 0.01 3 +test_248_A test_248_B 0.01 4 +test_249_A test_249_B 0.01 2 +test_250_A test_250_B 0.01 5 +test_251_A test_251_B 0.01 4 +test_252_A test_252_B 0.01 4 +test_253_A test_253_B 0.01 4.5 +test_254_A test_254_B 0.01 4 +test_255_A test_255_B 0.01 3 +test_256_A test_256_B 0.01 4.5 +test_257_A test_257_B 0.01 4 +test_258_A test_258_B 0.01 5 +test_259_A test_259_B 0.01 4 +test_260_A test_260_B 0.01 4 +test_261_A test_261_B 0.01 2.5 +test_262_A test_262_B 0.01 2 +test_263_A test_263_B 0.01 4.5 +test_264_A test_264_B 0.01 3.5 +test_265_A test_265_B 0.01 4 +test_266_A test_266_B 0.01 3 +test_267_A test_267_B 0.01 5 +test_268_A test_268_B 0.01 4 +test_269_A test_269_B 0.01 4 +test_270_A test_270_B 0.01 3 +test_271_A test_271_B 0.01 4 +test_272_A test_272_B 0.01 4 +test_273_A test_273_B 0.01 2 +test_274_A test_274_B 0.01 3 +test_275_A test_275_B 0.01 3 +test_276_A test_276_B 0.01 4 +test_277_A test_277_B 0.01 5 +test_278_A test_278_B 0.01 4 +test_279_A test_279_B 0.01 4.5 +test_280_A test_280_B 0.01 3.5 +test_281_A test_281_B 0.01 2 +test_282_A test_282_B 0.01 3 +test_283_A test_283_B 0.01 3 +test_284_A test_284_B 0.01 3 +test_285_A test_285_B 0.01 3 +test_286_A test_286_B 0.01 3 +test_287_A test_287_B 0.01 3.5 +test_288_A test_288_B 0.01 3 +test_289_A test_289_B 0.01 2 +test_290_A test_290_B 0.01 4 +test_291_A test_291_B 0.01 3 +test_292_A test_292_B 0.01 4 +test_293_A test_293_B 0.01 2.5 +test_294_A test_294_B 0.01 4 +test_295_A test_295_B 0.01 3.5 +test_296_A test_296_B 0.01 3 +test_297_A test_297_B 0.01 3 +test_298_A test_298_B 0.01 4 +test_299_A test_299_B 0.01 4 +test_300_A test_300_B 0.01 3 +test_301_A test_301_B 0.01 2 +test_302_A test_302_B 0.01 2 +test_303_A test_303_B 0.01 3 +test_304_A test_304_B 0.01 3 +test_305_A test_305_B 0.01 3 +test_306_A test_306_B 0.01 3 +test_307_A test_307_B 0.01 2 +test_308_A test_308_B 0.01 3 +test_309_A test_309_B 0.01 2.5 +test_310_A test_310_B 0.01 4 +test_311_A test_311_B 0.01 3 +test_312_A test_312_B 0.01 3.5 +test_313_A test_313_B 0.01 3 +test_314_A test_314_B 0.01 2 +test_315_A test_315_B 0.01 3 +test_316_A test_316_B 0.01 4.5 +test_317_A test_317_B 0.01 3 +test_318_A test_318_B 0.01 3 +test_319_A test_319_B 0.01 3 +test_320_A test_320_B 0.01 4 +test_321_A test_321_B 0.01 2 +test_322_A test_322_B 0.01 3 +test_323_A test_323_B 0.01 3 +test_324_A test_324_B 0.01 2 +test_325_A test_325_B 0.01 3 +test_326_A test_326_B 0.01 2 +test_327_A test_327_B 0.01 3 +test_328_A test_328_B 0.01 3 +test_329_A test_329_B 0.01 4 +test_330_A test_330_B 0.01 3 +test_331_A test_331_B 0.01 3 +test_332_A test_332_B 0.01 2 +test_333_A test_333_B 0.01 2 +test_334_A test_334_B 0.01 3 +test_335_A test_335_B 0.01 2 +test_336_A test_336_B 0.01 3 +test_337_A test_337_B 0.01 2 +test_338_A test_338_B 0.01 2 +test_339_A test_339_B 0.01 2 +test_340_A test_340_B 0.01 1 +test_341_A test_341_B 0.01 2 +test_342_A test_342_B 0.01 2 +test_343_A test_343_B 0.01 2 +test_344_A test_344_B 0.01 2 +test_345_A test_345_B 0.01 2 +test_346_A test_346_B 0.01 2 +test_347_A test_347_B 0.01 2 +test_348_A test_348_B 0.01 2 +test_349_A test_349_B 0.01 2 +test_350_A test_350_B 0.01 2 +test_351_A test_351_B 0.01 2 +test_352_A test_352_B 0.01 2 +test_353_A test_353_B 0.01 2.5 +test_354_A test_354_B 0.01 2 +test_355_A test_355_B 0.01 2 +test_356_A test_356_B 0.01 2 +test_357_A test_357_B 0.01 2 +test_358_A test_358_B 0.01 2 +test_359_A test_359_B 0.01 2 +test_360_A test_360_B 0.01 32 +test_361_A test_361_B 0.01 8 +test_362_A test_362_B 0.01 29.5 +test_363_A test_363_B 0.01 41 +test_364_A test_364_B 0.01 41.5 +test_365_A test_365_B 0.01 27.5 +test_366_A test_366_B 0.01 46 +test_367_A test_367_B 0.01 37.5 +test_368_A test_368_B 0.01 27 +test_369_A test_369_B 0.01 42 +test_370_A test_370_B 0.01 45.5 +test_371_A test_371_B 0.01 34 +test_372_A test_372_B 0.01 19.5 +test_373_A test_373_B 0.01 24 +test_374_A test_374_B 0.01 10 +test_375_A test_375_B 0.01 17.5 +test_376_A test_376_B 0.01 28.5 +test_377_A test_377_B 0.01 40 +test_378_A test_378_B 0.01 40 +test_379_A test_379_B 0.01 24.5 +test_380_A test_380_B 0.01 36 +test_381_A test_381_B 0.01 38 +test_382_A test_382_B 0.01 48 +test_383_A test_383_B 0.01 32.5 +test_384_A test_384_B 0.01 44 +test_385_A test_385_B 0.01 44.5 +test_386_A test_386_B 0.01 11 +test_387_A test_387_B 0.01 47.5 +test_388_A test_388_B 0.01 28 +test_389_A test_389_B 0.01 32 +test_390_A test_390_B 0.01 24.5 +test_391_A test_391_B 0.01 47 +test_392_A test_392_B 0.01 28 +test_393_A test_393_B 0.01 16 +test_394_A test_394_B 0.01 44 +test_395_A test_395_B 0.01 38 +test_396_A test_396_B 0.01 47.5 +test_397_A test_397_B 0.01 35 +test_398_A test_398_B 0.01 33 +test_399_A test_399_B 0.01 33 +test_400_A test_400_B 0.01 31 +test_401_A test_401_B 0.01 48 +test_402_A test_402_B 0.01 37.5 +test_403_A test_403_B 0.01 40 +test_404_A test_404_B 0.01 47 +test_405_A test_405_B 0.01 23 +test_406_A test_406_B 0.01 40 +test_407_A test_407_B 0.01 46 +test_408_A test_408_B 0.01 39 +test_409_A test_409_B 0.01 26 +test_410_A test_410_B 0.01 28 +test_411_A test_411_B 0.01 27 +test_412_A test_412_B 0.01 33 +test_413_A test_413_B 0.01 36 +test_414_A test_414_B 0.01 42.5 +test_415_A test_415_B 0.01 40 +test_416_A test_416_B 0.01 37 +test_417_A test_417_B 0.01 43 +test_418_A test_418_B 0.01 16 +test_419_A test_419_B 0.01 34 +test_420_A test_420_B 0.01 42.5 +test_421_A test_421_B 0.01 38 +test_422_A test_422_B 0.01 30 +test_423_A test_423_B 0.01 44 +test_424_A test_424_B 0.01 46 +test_425_A test_425_B 0.01 38 +test_426_A test_426_B 0.01 35.5 +test_427_A test_427_B 0.01 29 +test_428_A test_428_B 0.01 43.5 +test_429_A test_429_B 0.01 34 +test_430_A test_430_B 0.01 48 +test_431_A test_431_B 0.01 41 +test_432_A test_432_B 0.01 35 +test_433_A test_433_B 0.01 32 +test_434_A test_434_B 0.01 36 +test_435_A test_435_B 0.01 43.5 +test_436_A test_436_B 0.01 32.5 +test_437_A test_437_B 0.01 40 +test_438_A test_438_B 0.01 34 +test_439_A test_439_B 0.01 31.5 +test_440_A test_440_B 0.01 26.5 +test_441_A test_441_B 0.01 49.5 +test_442_A test_442_B 0.01 30 +test_443_A test_443_B 0.01 29 +test_444_A test_444_B 0.01 29 +test_445_A test_445_B 0.01 48 +test_446_A test_446_B 0.01 35 +test_447_A test_447_B 0.01 43 +test_448_A test_448_B 0.01 19 +test_449_A test_449_B 0.01 34 +test_450_A test_450_B 0.01 44 +test_451_A test_451_B 0.01 36 +test_452_A test_452_B 0.01 32 +test_453_A test_453_B 0.01 49 +test_454_A test_454_B 0.01 48.5 +test_455_A test_455_B 0.01 46 +test_456_A test_456_B 0.01 33.5 +test_457_A test_457_B 0.01 49.5 +test_458_A test_458_B 0.01 38 +test_459_A test_459_B 0.01 21 +test_460_A test_460_B 0.01 40 +test_461_A test_461_B 0.01 32 +test_462_A test_462_B 0.01 37 +test_463_A test_463_B 0.01 23 +test_464_A test_464_B 0.01 19 +test_465_A test_465_B 0.01 29 +test_466_A test_466_B 0.01 38 +test_467_A test_467_B 0.01 29 +test_468_A test_468_B 0.01 45 +test_469_A test_469_B 0.01 27.5 +test_470_A test_470_B 0.01 43 +test_471_A test_471_B 0.01 24.5 +test_472_A test_472_B 0.01 42 +test_473_A test_473_B 0.01 36.5 +test_474_A test_474_B 0.01 46.5 +test_475_A test_475_B 0.01 18 +test_476_A test_476_B 0.01 29 +test_477_A test_477_B 0.01 44 +test_478_A test_478_B 0.01 49 +test_479_A test_479_B 0.01 33 +test_480_A test_480_B 0.01 43 +test_481_A test_481_B 0.01 42 +test_482_A test_482_B 0.01 31 +test_483_A test_483_B 0.01 37 +test_484_A test_484_B 0.01 25 +test_485_A test_485_B 0.01 33 +test_486_A test_486_B 0.01 35 +test_487_A test_487_B 0.01 39 +test_488_A test_488_B 0.01 26.5 +test_489_A test_489_B 0.01 39.5 +test_490_A test_490_B 0.01 26 +test_491_A test_491_B 0.01 45 +test_492_A test_492_B 0.01 21 +test_493_A test_493_B 0.01 37 +test_494_A test_494_B 0.01 50 +test_495_A test_495_B 0.01 41 +test_496_A test_496_B 0.01 34 +test_497_A test_497_B 0.01 35 +test_498_A test_498_B 0.01 34 +test_499_A test_499_B 0.01 30 +test_500_A test_500_B 0.01 39 +test_501_A test_501_B 0.01 36 +test_502_A test_502_B 0.01 36 +test_503_A test_503_B 0.01 49.5 +test_504_A test_504_B 0.01 40.5 +test_505_A test_505_B 0.01 29 +test_506_A test_506_B 0.01 33 +test_507_A test_507_B 0.01 38 +test_508_A test_508_B 0.01 21.5 +test_509_A test_509_B 0.01 27 +test_510_A test_510_B 0.01 43 +test_511_A test_511_B 0.01 34 +test_512_A test_512_B 0.01 25.5 +test_513_A test_513_B 0.01 19 +test_514_A test_514_B 0.01 28 +test_515_A test_515_B 0.01 41.5 +test_516_A test_516_B 0.01 46 +test_517_A test_517_B 0.01 34 +test_518_A test_518_B 0.01 33 +test_519_A test_519_B 0.01 37.5 +test_520_A test_520_B 0.01 37 +test_521_A test_521_B 0.01 42.5 +test_522_A test_522_B 0.01 44 +test_523_A test_523_B 0.01 36.5 +test_524_A test_524_B 0.01 40 +test_525_A test_525_B 0.01 36.5 +test_526_A test_526_B 0.01 24 +test_527_A test_527_B 0.01 34 +test_528_A test_528_B 0.01 23.5 +test_529_A test_529_B 0.01 30 +test_530_A test_530_B 0.01 50 +test_531_A test_531_B 0.01 33 +test_532_A test_532_B 0.01 36 +test_533_A test_533_B 0.01 24 +test_534_A test_534_B 0.01 46.5 +test_535_A test_535_B 0.01 39 +test_536_A test_536_B 0.01 26 +test_537_A test_537_B 0.01 30 +test_538_A test_538_B 0.01 27.5 +test_539_A test_539_B 0.01 26 +test_540_A test_540_B 0.01 23 +test_541_A test_541_B 0.01 26.5 +test_542_A test_542_B 0.01 40.5 +test_543_A test_543_B 0.01 41 +test_544_A test_544_B 0.01 46 +test_545_A test_545_B 0.01 33 +test_546_A test_546_B 0.01 38 +test_547_A test_547_B 0.01 33 +test_548_A test_548_B 0.01 28 +test_549_A test_549_B 0.01 29 +test_550_A test_550_B 0.01 33 +test_551_A test_551_B 0.01 20 +test_552_A test_552_B 0.01 27 +test_553_A test_553_B 0.01 21.5 +test_554_A test_554_B 0.01 28 +test_555_A test_555_B 0.01 31 +test_556_A test_556_B 0.01 31 +test_557_A test_557_B 0.01 30 +test_558_A test_558_B 0.01 29 +test_559_A test_559_B 0.01 30 +test_560_A test_560_B 0.01 21 +test_561_A test_561_B 0.01 37.5 +test_562_A test_562_B 0.01 40 +test_563_A test_563_B 0.01 25 +test_564_A test_564_B 0.01 22 +test_565_A test_565_B 0.01 24 +test_566_A test_566_B 0.01 39 +test_567_A test_567_B 0.01 27 +test_568_A test_568_B 0.01 30 +test_569_A test_569_B 0.01 35 +test_570_A test_570_B 0.01 29 +test_571_A test_571_B 0.01 27 +test_572_A test_572_B 0.01 23 +test_573_A test_573_B 0.01 34 +test_574_A test_574_B 0.01 26 +test_575_A test_575_B 0.01 28 +test_576_A test_576_B 0.01 22 +test_577_A test_577_B 0.01 29 +test_578_A test_578_B 0.01 24 +test_579_A test_579_B 0.01 22 +test_580_A test_580_B 0.01 31 +test_581_A test_581_B 0.01 39 +test_582_A test_582_B 0.01 21 +test_583_A test_583_B 0.01 32 +test_584_A test_584_B 0.01 22 +test_585_A test_585_B 0.01 26 +test_586_A test_586_B 0.01 20 +test_587_A test_587_B 0.01 28 +test_588_A test_588_B 0.01 22 +test_589_A test_589_B 0.01 20 +test_590_A test_590_B 0.01 17 +test_591_A test_591_B 0.01 24 +test_592_A test_592_B 0.01 27.5 +test_593_A test_593_B 0.01 31 +test_594_A test_594_B 0.01 18 +test_595_A test_595_B 0.01 18 +test_596_A test_596_B 0.01 32 +test_597_A test_597_B 0.01 17 +test_598_A test_598_B 0.01 19 +test_599_A test_599_B 0.01 23 +test_600_A test_600_B 0.01 16 +test_601_A test_601_B 0.01 13 +test_602_A test_602_B 0.01 25 +test_603_A test_603_B 0.01 17 +test_604_A test_604_B 0.01 18 +test_605_A test_605_B 0.01 20 +test_606_A test_606_B 0.01 16 +test_607_A test_607_B 0.01 19 +test_608_A test_608_B 0.01 22 +test_609_A test_609_B 0.01 18 +test_610_A test_610_B 0.01 22 +test_611_A test_611_B 0.01 18 +test_612_A test_612_B 0.01 21 +test_613_A test_613_B 0.01 23 +test_614_A test_614_B 0.01 14 +test_615_A test_615_B 0.01 21 +test_616_A test_616_B 0.01 20 +test_617_A test_617_B 0.01 17 +test_618_A test_618_B 0.01 15 +test_619_A test_619_B 0.01 18 +test_620_A test_620_B 0.01 346.5 +test_621_A test_621_B 0.01 414 +test_622_A test_622_B 0.01 321 +test_623_A test_623_B 0.01 428 +test_624_A test_624_B 0.01 137.5 +test_625_A test_625_B 0.01 272 +test_626_A test_626_B 0.01 257 +test_627_A test_627_B 0.01 261 +test_628_A test_628_B 0.01 480.5 +test_629_A test_629_B 0.01 378 +test_630_A test_630_B 0.01 153.5 +test_631_A test_631_B 0.01 199 +test_632_A test_632_B 0.01 457 +test_633_A test_633_B 0.01 358.5 +test_634_A test_634_B 0.01 357 +test_635_A test_635_B 0.01 216 +test_636_A test_636_B 0.01 460.5 +test_637_A test_637_B 0.01 314 +test_638_A test_638_B 0.01 322 +test_639_A test_639_B 0.01 440.5 +test_640_A test_640_B 0.01 324 +test_641_A test_641_B 0.01 265 +test_642_A test_642_B 0.01 395.5 +test_643_A test_643_B 0.01 397 +test_644_A test_644_B 0.01 308 +test_645_A test_645_B 0.01 199 +test_646_A test_646_B 0.01 256.5 +test_647_A test_647_B 0.01 293 +test_648_A test_648_B 0.01 297 +test_649_A test_649_B 0.01 410.5 +test_650_A test_650_B 0.01 322 +test_651_A test_651_B 0.01 458 +test_652_A test_652_B 0.01 420.5 +test_653_A test_653_B 0.01 235 +test_654_A test_654_B 0.01 220 +test_655_A test_655_B 0.01 257 +test_656_A test_656_B 0.01 305 +test_657_A test_657_B 0.01 230.5 +test_658_A test_658_B 0.01 500 +test_659_A test_659_B 0.01 155 +test_660_A test_660_B 0.01 418 +test_661_A test_661_B 0.01 403.5 +test_662_A test_662_B 0.01 296 +test_663_A test_663_B 0.01 297.5 +test_664_A test_664_B 0.01 219 +test_665_A test_665_B 0.01 476.5 +test_666_A test_666_B 0.01 347 +test_667_A test_667_B 0.01 284 +test_668_A test_668_B 0.01 324.5 +test_669_A test_669_B 0.01 231 +test_670_A test_670_B 0.01 410 +test_671_A test_671_B 0.01 206 +test_672_A test_672_B 0.01 266 +test_673_A test_673_B 0.01 319.5 +test_674_A test_674_B 0.01 483 +test_675_A test_675_B 0.01 355.5 +test_676_A test_676_B 0.01 316.5 +test_677_A test_677_B 0.01 297 +test_678_A test_678_B 0.01 458 +test_679_A test_679_B 0.01 398.5 +test_680_A test_680_B 0.01 371.5 +test_681_A test_681_B 0.01 338 +test_682_A test_682_B 0.01 461 +test_683_A test_683_B 0.01 298.5 +test_684_A test_684_B 0.01 303.5 +test_685_A test_685_B 0.01 265 +test_686_A test_686_B 0.01 400.5 +test_687_A test_687_B 0.01 264 +test_688_A test_688_B 0.01 303 +test_689_A test_689_B 0.01 360 +test_690_A test_690_B 0.01 325 +test_691_A test_691_B 0.01 217 +test_692_A test_692_B 0.01 313 +test_693_A test_693_B 0.01 491 +test_694_A test_694_B 0.01 367.5 +test_695_A test_695_B 0.01 285 +test_696_A test_696_B 0.01 314 +test_697_A test_697_B 0.01 379 +test_698_A test_698_B 0.01 277.5 +test_699_A test_699_B 0.01 302 +test_700_A test_700_B 0.01 299 +test_701_A test_701_B 0.01 439.5 +test_702_A test_702_B 0.01 289 +test_703_A test_703_B 0.01 460.5 +test_704_A test_704_B 0.01 210 +test_705_A test_705_B 0.01 491 +test_706_A test_706_B 0.01 438.5 +test_707_A test_707_B 0.01 323 +test_708_A test_708_B 0.01 427 +test_709_A test_709_B 0.01 364 +test_710_A test_710_B 0.01 434 +test_711_A test_711_B 0.01 434 +test_712_A test_712_B 0.01 391 +test_713_A test_713_B 0.01 356 +test_714_A test_714_B 0.01 420 +test_715_A test_715_B 0.01 354 +test_716_A test_716_B 0.01 281 +test_717_A test_717_B 0.01 359.5 +test_718_A test_718_B 0.01 345 +test_719_A test_719_B 0.01 341.5 +test_720_A test_720_B 0.01 497.5 +test_721_A test_721_B 0.01 199 +test_722_A test_722_B 0.01 452 +test_723_A test_723_B 0.01 335.5 +test_724_A test_724_B 0.01 311 +test_725_A test_725_B 0.01 336 +test_726_A test_726_B 0.01 300 +test_727_A test_727_B 0.01 317 +test_728_A test_728_B 0.01 492 +test_729_A test_729_B 0.01 304 +test_730_A test_730_B 0.01 217 +test_731_A test_731_B 0.01 322 +test_732_A test_732_B 0.01 289 +test_733_A test_733_B 0.01 182 +test_734_A test_734_B 0.01 410.5 +test_735_A test_735_B 0.01 306 +test_736_A test_736_B 0.01 294 +test_737_A test_737_B 0.01 254 +test_738_A test_738_B 0.01 338.5 +test_739_A test_739_B 0.01 225 +test_740_A test_740_B 0.01 280 +test_741_A test_741_B 0.01 454 +test_742_A test_742_B 0.01 226 +test_743_A test_743_B 0.01 365 +test_744_A test_744_B 0.01 456 +test_745_A test_745_B 0.01 405 +test_746_A test_746_B 0.01 322 +test_747_A test_747_B 0.01 279 +test_748_A test_748_B 0.01 311.5 +test_749_A test_749_B 0.01 308 +test_750_A test_750_B 0.01 322 +test_751_A test_751_B 0.01 409 +test_752_A test_752_B 0.01 277 +test_753_A test_753_B 0.01 318 +test_754_A test_754_B 0.01 299.5 +test_755_A test_755_B 0.01 462.5 +test_756_A test_756_B 0.01 314 +test_757_A test_757_B 0.01 300 +test_758_A test_758_B 0.01 455 +test_759_A test_759_B 0.01 422.5 +test_760_A test_760_B 0.01 433.5 +test_761_A test_761_B 0.01 278 +test_762_A test_762_B 0.01 484.5 +test_763_A test_763_B 0.01 348 +test_764_A test_764_B 0.01 491 +test_765_A test_765_B 0.01 280 +test_766_A test_766_B 0.01 259 +test_767_A test_767_B 0.01 275.5 +test_768_A test_768_B 0.01 348 +test_769_A test_769_B 0.01 330 +test_770_A test_770_B 0.01 412 +test_771_A test_771_B 0.01 262 +test_772_A test_772_B 0.01 455 +test_773_A test_773_B 0.01 294 +test_774_A test_774_B 0.01 425 +test_775_A test_775_B 0.01 220.5 +test_776_A test_776_B 0.01 411.5 +test_777_A test_777_B 0.01 383 +test_778_A test_778_B 0.01 363 +test_779_A test_779_B 0.01 302 +test_780_A test_780_B 0.01 328 +test_781_A test_781_B 0.01 294 +test_782_A test_782_B 0.01 407.5 +test_783_A test_783_B 0.01 260.5 +test_784_A test_784_B 0.01 410 +test_785_A test_785_B 0.01 328 +test_786_A test_786_B 0.01 419.5 +test_787_A test_787_B 0.01 165 +test_788_A test_788_B 0.01 389 +test_789_A test_789_B 0.01 254 +test_790_A test_790_B 0.01 311 +test_791_A test_791_B 0.01 258 +test_792_A test_792_B 0.01 331 +test_793_A test_793_B 0.01 378 +test_794_A test_794_B 0.01 415 +test_795_A test_795_B 0.01 364 +test_796_A test_796_B 0.01 279 +test_797_A test_797_B 0.01 249 +test_798_A test_798_B 0.01 463 +test_799_A test_799_B 0.01 304 +test_800_A test_800_B 0.01 187 +test_801_A test_801_B 0.01 305.5 +test_802_A test_802_B 0.01 385 +test_803_A test_803_B 0.01 360.5 +test_804_A test_804_B 0.01 269 +test_805_A test_805_B 0.01 294 +test_806_A test_806_B 0.01 362 +test_807_A test_807_B 0.01 354 +test_808_A test_808_B 0.01 196 +test_809_A test_809_B 0.01 248 +test_810_A test_810_B 0.01 297.5 +test_811_A test_811_B 0.01 243 +test_812_A test_812_B 0.01 312 +test_813_A test_813_B 0.01 241 +test_814_A test_814_B 0.01 384 +test_815_A test_815_B 0.01 250 +test_816_A test_816_B 0.01 205 +test_817_A test_817_B 0.01 308 +test_818_A test_818_B 0.01 356 +test_819_A test_819_B 0.01 230 +test_820_A test_820_B 0.01 178 +test_821_A test_821_B 0.01 294 +test_822_A test_822_B 0.01 227 +test_823_A test_823_B 0.01 234 +test_824_A test_824_B 0.01 241 +test_825_A test_825_B 0.01 233 +test_826_A test_826_B 0.01 284 +test_827_A test_827_B 0.01 287 +test_828_A test_828_B 0.01 192 +test_829_A test_829_B 0.01 359 +test_830_A test_830_B 0.01 225 +test_831_A test_831_B 0.01 273 +test_832_A test_832_B 0.01 248 +test_833_A test_833_B 0.01 217 +test_834_A test_834_B 0.01 332 +test_835_A test_835_B 0.01 218 +test_836_A test_836_B 0.01 335 +test_837_A test_837_B 0.01 192 +test_838_A test_838_B 0.01 188 +test_839_A test_839_B 0.01 347 +test_840_A test_840_B 0.01 273 +test_841_A test_841_B 0.01 187 +test_842_A test_842_B 0.01 170 +test_843_A test_843_B 0.01 230 +test_844_A test_844_B 0.01 206.5 +test_845_A test_845_B 0.01 177 +test_846_A test_846_B 0.01 251 +test_847_A test_847_B 0.01 163 +test_848_A test_848_B 0.01 174 +test_849_A test_849_B 0.01 177 +test_850_A test_850_B 0.01 252 +test_851_A test_851_B 0.01 262 +test_852_A test_852_B 0.01 174 +test_853_A test_853_B 0.01 169 +test_854_A test_854_B 0.01 200 +test_855_A test_855_B 0.01 189 +test_856_A test_856_B 0.01 206.5 +test_857_A test_857_B 0.01 260 +test_858_A test_858_B 0.01 191 +test_859_A test_859_B 0.01 216 +test_860_A test_860_B 0.01 181.5 +test_861_A test_861_B 0.01 219 +test_862_A test_862_B 0.01 143 +test_863_A test_863_B 0.01 173 +test_864_A test_864_B 0.01 134 +test_865_A test_865_B 0.01 159 +test_866_A test_866_B 0.01 205 +test_867_A test_867_B 0.01 178 +test_868_A test_868_B 0.01 189.5 +test_869_A test_869_B 0.01 145 +test_870_A test_870_B 0.01 179 +test_871_A test_871_B 0.01 167 +test_872_A test_872_B 0.01 149 +test_873_A test_873_B 0.01 149 +test_874_A test_874_B 0.01 187 +test_875_A test_875_B 0.01 193 +test_876_A test_876_B 0.01 165 +test_877_A test_877_B 0.01 190 +test_878_A test_878_B 0.01 242 +test_879_A test_879_B 0.01 187 diff --git a/bottleneck/tests/data/ws_tests/test_100_A b/bottleneck/tests/data/ws_tests/test_100_A new file mode 100644 index 0000000..8d126f0 --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_100_A @@ -0,0 +1,100 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 +3.79915 4.51283 +3.17645 3.75321 +0.61305 0.998622 +0.445643 1.13781 +6.38205 6.53669 +5.96392 6.44093 +7.21047 7.26005 +0.6703 1.26593 +0.529933 1.7027 +7.92495 8.83023 +2.1382 2.71695 +3.79209 4.5197 +5.23354 5.82214 +-0.395097 2.18831 +3.22028 3.88648 +5.56262 5.79949 +8.39623 9.37185 +2.7452 3.84539 +9.5022 10.2414 +1.01374 1.40504 +3.2029 3.89559 +7.61236 8.28485 +6.4371 6.909 +4.45616 5.35067 +1.57802 1.77895 +6.5991 7.76339 +6.66729 6.71714 +6.11898 6.57121 +2.60663 4.36396 +-0.259613 1.17683 +7.72857 9.48862 +4.68398 5.51521 +4.87447 5.4233 +6.86301 6.88244 +4.17814 4.25886 +8.70558 9.72902 +4.40873 4.57389 +6.1824 7.05049 +7.97557 8.79739 +8.52591 8.6985 +5.15336 5.27796 +9.70144 9.77031 +0.561778 1.39045 +9.32553 10.2456 +7.01495 7.74521 +6.83355 7.28255 +1.96721 3.01504 +5.78411 7.59464 +5.64012 6.10721 +3.7249 5.17086 +4.33297 5.91657 +7.11793 7.2545 +5.109 6.76878 +3.02787 3.04077 +0.999365 2.05566 +8.81392 8.9086 +6.20106 6.78943 +6.7987 7.05794 +0.438805 0.449602 +8.71793 9.79853 +-0.150282 0.51997 +5.72257 5.93156 +5.71098 6.09535 +9.0378 9.45942 +0.534987 0.872885 +7.72276 8.57754 +9.26069 9.40289 +4.148 4.80519 +1.04579 3.18109 +0.259767 0.93215 +0.250608 0.511569 +4.88108 5.62239 +4.6731 5.3348 +7.84979 7.93545 +0.912521 1.48142 +4.82553 5.38108 +6.02179 7.61665 +3.85848 6.39418 +5.10754 6.02118 +1.71956 1.86238 +6.47336 6.74034 +-0.0371018 0.212738 +3.97259 4.15465 +2.17413 3.20188 +4.49098 6.09812 +6.62445 7.84196 +6.57541 7.432 +6.81052 9.6653 +3.67502 4.69734 +3.92378 4.14743 +5.93127 6.46154 +0.63424 0.705454 +7.60129 9.23263 +4.23064 4.74575 +0.397705 1.24458 diff --git a/bottleneck/tests/data/ws_tests/test_100_A.pd.dipha b/bottleneck/tests/data/ws_tests/test_100_A.pd.dipha new file mode 100644 index 0000000..e94f5fe Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_100_A.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_100_B b/bottleneck/tests/data/ws_tests/test_100_B new file mode 100644 index 0000000..852799d --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_100_B @@ -0,0 +1,100 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 +3.77337 5.2686 +8.31344 9.05384 +0.734064 1.14844 +7.57606 7.8521 +3.16719 3.86953 +2.55072 2.64932 +9.51707 9.6071 +0.304643 2.41784 +2.79925 3.28234 +5.32901 7.7576 +5.19903 6.30449 +1.87819 2.99454 +8.92272 9.67105 +4.62414 5.05592 +4.0079 4.64148 +2.26369 3.44573 +2.69335 3.13426 +1.90706 2.42652 +2.68113 2.79133 +1.41065 1.56018 +6.55282 7.18725 +5.72986 6.37151 +7.26968 8.22623 +3.32643 3.73606 +3.77325 4.63115 +1.05457 1.83651 +8.6815 8.85251 +3.91285 4.17139 +0.380936 0.842109 +7.33227 7.69334 +8.45635 8.923 +4.1769 5.08373 +0.501374 2.23328 +-0.161782 1.28908 +3.44716 3.4662 +3.15394 4.30243 +8.71416 9.3781 +6.3034 8.62893 +6.53824 7.04611 +0.6386 1.35269 +0.862088 0.960371 +5.12963 5.20203 +1.58695 2.0452 +6.57698 6.63228 +3.87747 4.45669 +1.51273 3.25669 +-0.0992804 0.667302 +4.7489 4.80059 +0.0280559 1.90471 +6.7462 8.27612 +0.915652 1.30007 +2.79556 3.77404 +9.87989 10.0722 +9.39105 9.84229 +7.57235 9.37122 +5.09426 6.44266 +6.3994 6.72037 +5.73441 6.99341 +6.9079 7.88049 +4.2003 4.41933 +-1.72447 2.25877 +9.04907 9.64323 +4.40473 5.3593 +9.31201 9.96079 +7.28343 8.74163 +3.0172 6.23779 +8.08422 8.56069 +6.83038 6.99863 +2.32038 3.1289 +7.42302 8.26286 +6.66905 7.18496 +0.730748 1.61335 +4.00564 5.73993 +2.81231 3.67489 +2.33178 2.37845 +9.03302 9.68681 +0.567816 0.755485 +7.89783 8.7621 +0.177662 0.332833 +-0.181569 1.36821 +6.22158 6.55787 +4.67115 5.16995 +0.806432 0.820738 +7.69636 7.87402 +4.40933 4.54995 +9.1329 9.15037 +8.87416 9.04329 +1.14349 1.8993 +3.29756 4.7172 +6.67873 8.31364 +6.91238 7.1654 +0.483084 1.55006 +2.66058 3.86294 +5.93347 6.06085 +7.40514 9.05071 diff --git a/bottleneck/tests/data/ws_tests/test_100_B.pd.dipha b/bottleneck/tests/data/ws_tests/test_100_B.pd.dipha new file mode 100644 index 0000000..25d6734 Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_100_B.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_200_A b/bottleneck/tests/data/ws_tests/test_200_A new file mode 100644 index 0000000..164b71d --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_200_A @@ -0,0 +1,200 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 diff --git a/bottleneck/tests/data/ws_tests/test_200_B b/bottleneck/tests/data/ws_tests/test_200_B new file mode 100644 index 0000000..761943d --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_200_B @@ -0,0 +1,200 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 diff --git a/bottleneck/tests/data/ws_tests/test_5000_A b/bottleneck/tests/data/ws_tests/test_5000_A new file mode 100644 index 0000000..094c6e0 --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_5000_A @@ -0,0 +1,5000 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 +0.903753 1.57921 +0.380744 1.88053 +1.3164 1.79885 +0.199366 0.576639 +5.53683 6.49433 +8.8705 9.14396 +3.1401 3.98761 +4.82675 6.69396 +7.28593 8.08916 +8.11312 9.92914 +3.25737 3.42109 +2.58413 4.57223 +2.65202 2.77196 +-0.31616 1.51568 +4.1621 5.29563 +4.49155 5.21037 +7.28481 7.31722 +9.70568 10.0406 +2.39057 2.85874 +2.30626 3.16244 +1.15896 2.09616 +5.91343 7.33024 +-0.172181 0.177363 +5.08934 6.10928 +7.15508 7.55315 +4.43036 4.68093 +6.00772 6.49566 +7.9247 8.43809 +1.57028 2.52328 +3.45458 4.43692 +3.18257 4.83824 +1.48243 1.91225 +2.59025 2.99596 +6.93059 8.34359 +4.53752 7.51216 +6.42857 6.51513 +5.5663 6.13877 +7.54367 7.56485 +9.01229 9.19913 +2.84158 3.23347 +0.42959 0.620618 +8.77033 9.33787 +8.06103 8.30989 +6.48425 7.83668 +4.66949 6.00205 +4.46683 4.66247 +8.96738 9.07714 +0.463093 0.514808 +7.72986 9.44537 +6.31391 6.8289 +0.883295 1.70946 +3.73278 3.98015 +6.73453 6.92514 +3.58434 4.43262 +0.236286 1.4601 +2.00505 2.38684 +3.845 4.20708 +1.18852 3.04911 +0.766784 1.00641 +7.38781 8.11216 +8.9396 9.27589 +0.369822 1.53322 +8.76527 9.23987 +0.663408 0.803445 +9.69209 10.1455 +9.73379 10.234 +3.47602 4.89968 +4.12754 5.45249 +7.31984 8.57369 +0.989101 1.47678 +5.57662 5.83292 +4.99092 6.85044 +4.35272 4.3683 +0.0517815 1.92227 +7.2694 7.80634 +1.35565 1.42783 +8.5638 8.91707 +1.74557 2.74123 +2.18226 2.19664 +-0.901334 1.32691 +0.866613 1.03788 +5.30895 6.31774 +7.70178 8.5675 +4.06894 4.16071 +2.59697 3.53162 +4.30201 5.34212 +4.08762 4.19091 +-0.516192 0.848397 +9.85911 10.1066 +0.472991 1.40069 +6.26012 7.0054 +0.707801 2.15445 +1.73825 1.87193 +0.206301 0.831746 +7.77872 7.92715 +4.94477 5.60361 +3.86216 5.16839 +1.35166 1.54482 +2.91721 3.56193 +4.57242 4.75913 +7.09303 8.29678 +8.18431 8.92151 +6.80303 10.87 +1.29208 1.72027 +1.22224 1.31693 +5.26756 6.26459 +2.55221 3.94397 +6.58902 6.78354 +7.85917 8.89791 +6.59279 7.63115 +4.45787 7.26828 +3.48759 5.33991 +2.13838 3.86589 +1.53368 3.57313 +1.41722 3.19336 +3.48388 4.11958 +1.53756 2.98451 +7.29083 8.22109 +1.2713 2.16915 +6.94685 7.31029 +6.2494 7.04676 +3.00376 3.02028 +1.25232 1.43301 +1.50413 2.25 +2.89098 4.77198 +4.50766 5.89294 +5.5403 6.07893 +-0.101858 0.409209 +3.87963 6.1053 +-0.19564 1.46589 +-0.342077 0.694623 +6.63875 7.42223 +7.89982 9.05857 +4.91121 5.48031 +5.90743 8.35815 +7.13881 8.21597 +4.11493 5.08147 +3.59673 3.77176 +8.08236 8.3237 +1.35842 1.48934 +5.42963 5.85906 +4.60778 4.9734 +-0.607198 0.91225 +5.40263 5.7017 +5.08624 5.63236 +7.34529 9.02233 +7.30013 8.12907 +6.56106 6.75585 +6.82576 7.25434 +2.96037 3.56454 +3.60283 4.09137 +6.35408 6.71888 +-0.688103 0.84579 +8.45128 8.69771 +6.31749 7.3294 +5.82223 6.04761 +1.72983 2.38205 +6.94974 7.76985 +9.681 10.0141 +8.65394 9.2456 +2.52904 3.39548 +6.66609 7.35785 +4.18963 4.5473 +3.58643 3.80513 +2.88796 3.82413 +0.992066 1.1477 +4.57942 5.15419 +3.02826 4.32268 +5.91565 6.82087 +4.13694 5.13393 +6.28717 6.53257 +1.3149 2.36944 +0.488974 0.981461 +4.32763 4.98272 +-0.420836 0.63619 +7.13406 7.31362 +0.367782 1.91138 +6.14763 6.16713 +0.837933 1.92794 +9.3781 10.0609 +3.22887 5.44584 +5.91554 6.65974 +5.68608 6.02435 +7.99715 8.55953 +5.37106 5.38574 +0.254544 0.374268 +0.184701 0.917061 +9.38005 9.54042 +6.86741 7.35628 +0.87398 1.69093 +7.75845 8.53773 +0.370425 1.35335 +0.699837 0.810893 +3.73223 4.32089 +3.81804 3.85752 +4.85936 5.10097 +2.70381 3.10519 +3.82523 5.27699 +9.13422 10.3317 +4.62775 4.77988 +7.91139 7.95504 +2.72614 4.79958 +0.863357 1.88643 +4.14155 5.02327 +2.49683 4.11585 +1.06741 1.11516 +6.20979 8.38443 +0.936362 2.46703 +6.58231 7.85063 +1.89469 2.31422 +8.70668 9.14006 +5.76486 6.1122 +3.15778 3.76679 +0.248282 2.19881 +1.25317 1.92694 +7.81837 9.53067 +-0.582906 0.818904 +8.34194 8.37845 +4.4913 5.10164 +3.86376 5.5453 +6.94054 7.68699 +2.07462 2.5811 +0.518698 2.1529 +3.51773 4.60946 +8.39915 8.98446 +1.63685 2.19755 +6.60737 9.05917 +2.06667 3.23994 +3.18822 3.31219 +2.44332 3.22088 +4.755 4.87118 +4.34245 4.91565 +4.64562 4.8104 +2.73282 3.35646 +9.48057 9.86441 +0.640899 1.03356 +0.789475 0.925731 +1.4247 1.58347 +1.47747 2.25408 +8.8612 9.81597 +8.44147 10.6885 +9.07046 10.0877 +0.350125 1.15765 +4.45375 5.73964 +4.06526 4.26457 +7.50776 8.23491 +1.55452 1.63786 +2.8399 4.52559 +1.34319 1.47951 +5.21572 5.65702 +5.85695 6.75574 +8.21826 10.657 +-0.0479956 1.79162 +1.72905 1.78113 +3.35685 4.03797 +3.7123 5.82296 +8.56751 10.2992 +4.07987 4.25273 +5.8347 6.07253 +3.25283 3.99065 +9.31995 10.3647 +0.649025 1.14496 +1.06966 2.04182 +7.59831 7.85826 +3.35263 3.84374 +4.91371 5.10148 +8.0875 9.23421 +3.00484 5.14282 +8.60448 9.09442 +5.61429 6.24037 +3.4729 4.17907 +7.18702 7.26274 +0.729966 0.928899 +2.27264 2.81241 +2.67248 3.91661 +3.98443 4.64406 +5.50463 6.92435 +-0.257961 0.905736 +5.71363 6.67387 +4.12643 4.66467 +3.97623 4.64917 +9.71227 9.8243 +8.66674 8.97634 +7.94673 8.73904 +7.45228 8.14466 +3.78405 4.81189 +4.05505 5.00011 +2.84957 3.15451 +6.93785 7.58172 +1.85006 1.96814 +6.82256 7.00166 +2.42727 2.68161 +8.06129 8.76308 +1.53758 3.67482 +2.5057 4.18495 +7.09618 7.79664 +1.12843 1.46228 +1.61447 2.2668 +5.58639 5.70776 +8.15398 8.34959 +2.49733 2.57643 +5.18817 5.32462 +5.62963 5.86377 +1.95215 2.26641 +7.22129 7.23255 +5.99833 6.18639 +6.20875 7.13868 +6.814 7.6597 +7.41314 9.49798 +5.48819 6.31634 +4.81318 5.08156 +9.15434 9.42787 +4.83201 5.43295 +1.44477 2.6455 +8.8907 10.4727 +3.19487 3.21255 +1.47291 3.13113 +4.14796 5.10058 +5.85016 8.41212 +7.58183 8.53659 +9.5978 10.2877 +1.5954 2.58394 +2.65561 4.0975 +-0.157024 0.16627 +7.04379 7.75368 +2.39896 2.7728 +2.42376 3.58085 +0.158653 0.857045 +7.82101 9.01833 +6.80499 7.35261 +6.62833 6.66255 +4.90229 5.45681 +8.50205 8.69236 +2.01845 2.06924 +8.2503 9.04222 +4.58265 5.52758 +8.6176 9.74887 +1.28468 1.77019 +5.40424 6.20705 +0.943905 1.98023 +4.2702 4.41287 +3.89454 4.4814 +0.585132 1.56351 +9.45354 10.5374 +3.7501 5.07553 +7.53248 8.14004 +4.60026 4.78921 +1.61073 4.22368 +6.22591 7.40966 +0.57866 1.0522 +5.877 6.55882 +3.54573 3.7731 +7.64294 7.66103 +8.2399 9.14032 +0.307808 0.571367 +7.89791 9.25734 +5.2852 5.84332 +0.45713 2.42223 +7.73426 8.48158 +8.0058 9.46405 +8.03189 8.41868 +1.54624 1.98914 +7.24167 7.27699 +8.61226 8.83199 +5.38365 6.52599 +0.827018 1.51428 +7.19285 7.48372 +-0.0969552 2.16007 +4.08084 6.32563 +9.16026 10.2604 +0.206147 0.717435 +4.00643 4.8093 +2.16139 3.14759 +1.73359 3.13485 +9.1103 9.36052 +7.05621 7.43901 +4.83509 6.07581 +5.67164 7.89488 +7.93353 8.18454 +2.59566 3.1842 +3.62521 4.95121 +3.0297 3.18649 +1.08515 2.69289 +3.77063 5.7789 +0.106035 1.27409 +0.601099 2.13481 +6.98837 7.58833 +9.22955 9.79149 +1.6398 1.78726 +2.30423 3.34814 +2.3912 2.81842 +4.71724 6.16966 +5.13553 5.5016 +5.34117 5.45075 +9.32776 10.0676 +4.54244 5.29058 +4.01337 5.73188 +8.17427 8.39652 +1.96122 2.6921 +0.594267 1.00176 +-0.136973 0.977133 +6.41362 6.78056 +1.68388 2.39891 +9.50795 10.2315 +-0.262703 1.15557 +8.72229 9.683 +5.41821 5.67519 +4.93514 7.15867 +4.07046 4.26702 +-0.00866106 0.252353 +8.65877 10.1527 +2.10958 3.40353 +2.94947 3.43201 +6.32014 7.06279 +2.55034 2.89646 +3.87777 5.68044 +2.05325 3.00968 +5.11855 6.55784 +8.99618 9.22608 +3.36303 3.84902 +2.6234 3.70832 +7.35189 8.30856 +6.43777 7.28495 +5.33954 5.48055 +0.15999 0.391114 +3.4492 5.07088 +2.38503 2.42742 +3.88912 4.93246 +2.76303 4.54991 +6.56261 7.60381 +3.64198 3.72471 +1.70542 1.78806 +9.71115 9.88315 +0.471586 1.82377 +9.27611 10.5725 +0.486889 0.851587 +4.39234 5.10637 +9.54209 9.8955 +6.99602 7.42461 +2.98797 3.74623 +5.89424 6.4498 +9.63845 9.86333 +4.39828 5.18646 +2.30118 3.5758 +8.68128 9.56011 +9.00505 10.4304 +-0.22184 0.233296 +6.48492 7.60283 +1.54156 2.60693 +4.06808 6.39369 +5.52361 6.26241 +-0.698727 0.745524 +2.30742 2.41924 +0.655833 1.65752 +6.94733 7.81866 +7.83136 9.10651 +6.45284 7.1931 +6.09683 6.66159 +9.03299 9.4163 +1.86392 3.26189 +0.54863 2.07194 +0.364026 1.38376 +0.706954 1.0736 +-0.111015 0.584367 +1.54265 2.1413 +0.501172 0.57928 +2.09411 2.28902 +1.89894 4.09104 +8.72895 8.87045 +5.27709 5.72545 +0.164581 1.64188 +8.39203 8.73608 +8.21523 8.45002 +9.62006 10.1665 +4.79076 6.26442 +3.44189 3.68669 +8.93789 9.38343 +7.07036 7.64194 +8.34396 9.56445 +8.29992 8.64954 +5.82566 7.83287 +2.43008 3.4476 +1.81121 2.12203 +4.36108 4.3842 +6.28756 6.95939 +3.8698 5.79519 +0.644581 0.699162 +9.71982 10.2422 +4.86545 5.00544 +8.3808 9.29356 +1.34495 1.40972 +1.03641 2.01838 +8.55609 9.99958 +1.40813 3.46097 +3.20928 4.08838 +8.24345 9.11587 +1.27604 2.03462 +8.28298 8.46252 +2.20644 3.19585 +1.91396 2.30108 +4.2553 5.66006 +7.34925 8.38275 +6.28319 7.22199 +8.42171 9.62596 +1.12059 1.18262 +1.37555 1.84196 +4.39663 4.93639 +9.28044 9.58437 +5.47407 6.88593 +8.36529 8.49813 +9.40208 10.5922 +-0.451389 1.92404 +2.89431 3.19453 +6.51433 8.02158 +5.52163 6.06786 +7.63525 9.86457 +4.13898 5.05845 +0.136662 0.503748 +6.13492 6.74997 +8.37416 9.18971 +8.64164 8.82663 +0.941173 1.16158 +6.9073 8.26916 +8.37278 8.44326 +8.8951 9.20427 +8.40149 9.17577 +3.60361 4.57183 +8.67263 10.1127 +5.89716 6.45412 +1.97285 2.35593 +7.22973 8.13467 +9.55645 9.92529 +0.261578 0.836274 +9.04414 9.45485 +6.18043 6.54229 +8.88579 9.54087 +1.82613 2.93849 +5.7599 5.96366 +5.23105 5.5541 +0.425229 1.44436 +0.32065 2.60892 +7.83655 9.48786 +2.3168 3.45972 +2.35466 3.23342 +8.24494 8.27258 +7.32678 7.74264 +8.37275 10.0741 +4.17337 4.98348 +-0.162009 0.724431 +9.49757 9.76377 +8.69435 9.08089 +4.13841 4.7514 +7.26358 7.55514 +6.91912 6.93 +6.7883 7.18296 +-0.614315 1.1857 +6.05907 7.33557 +4.86704 4.87705 +8.50012 9.14836 +1.83683 3.09895 +6.16389 8.39248 +3.03556 4.41004 +4.72416 5.05782 +1.98183 3.19183 +2.77103 5.71501 +4.90002 4.9817 +0.269258 0.725628 +5.59551 7.05038 +2.95416 3.09633 +2.17662 3.18385 +6.67536 7.56762 +7.31678 7.39321 +3.84158 3.85359 +4.38203 5.10149 +0.816784 1.09918 +0.70131 0.739502 +0.276631 2.32633 +9.15839 9.49433 +0.721295 1.97673 +2.63875 2.75437 +5.00344 5.5645 +2.24555 2.81234 +7.74465 9.07646 +2.35244 4.90632 +0.812093 0.954419 +3.97904 5.2071 +4.19177 4.83646 +0.853012 1.331 +2.64112 3.25613 +0.0894716 1.61954 +3.39617 3.40859 +1.56906 2.28518 +2.37258 4.36515 +1.60997 1.7561 +5.15275 5.33281 +6.47824 7.47529 +2.51145 3.29949 +2.71094 2.77785 +8.84653 9.48398 +1.3246 1.66664 +7.43718 7.5546 +3.68985 4.24649 +4.50553 4.51669 +4.15617 4.54887 +8.55319 10.2136 +2.1448 3.55805 +4.64594 4.71505 +1.71763 1.99977 +4.98066 5.46709 +7.7779 8.36497 +-0.0604997 0.301294 +5.11873 7.32867 +4.94567 5.5986 +5.32645 6.26835 +2.5768 3.13511 +3.31604 3.87555 +1.60834 2.68762 +3.30552 3.85211 +4.26741 4.98636 +0.820475 1.18854 +7.91501 10.7203 +5.17391 5.30351 +4.00452 5.75141 +2.37722 3.4602 +2.2373 2.94837 +1.62462 3.48264 +7.98507 9.2566 +5.32504 5.56388 +0.760614 0.7802 +0.855659 1.01522 +3.11231 4.43223 +5.62821 6.21564 +4.96845 5.35921 +8.10559 9.11106 +1.02533 1.13103 +6.99976 7.0788 +1.87628 2.58801 +1.11023 2.24655 +5.23343 5.45086 +0.95875 2.25343 +7.45917 8.23614 +2.72245 3.04663 +8.66816 8.70698 +5.55734 7.12262 +1.01935 1.88271 +0.804417 1.76187 +7.82703 8.78426 +4.77321 6.15199 +2.91503 3.69352 +0.776735 1.08883 +5.19981 5.46442 +9.06483 10.4008 +7.72082 8.26398 +2.9854 3.26573 +0.584028 2.60443 +0.700994 1.10379 +5.47612 5.94502 +-0.318442 0.986786 +5.0704 5.08055 +3.83732 4.4826 +5.60843 6.59005 +8.81432 9.7851 +6.28792 6.65284 +1.16812 2.27701 +7.15234 9.66795 +9.02188 9.15339 +1.76112 2.04839 +7.49419 7.6204 +5.1765 5.497 +1.45855 1.94969 +1.35003 1.55822 +2.50453 2.86815 +7.10451 8.51352 +3.87727 4.1124 +1.84876 2.79351 +3.01661 4.05396 +-0.16814 0.366484 +-0.538895 0.608786 +7.59933 9.00744 +0.938648 2.38471 +5.76934 6.16572 +8.20416 8.62505 +8.64542 8.7264 +2.75784 2.7828 +0.794451 1.97817 +9.21331 10.5156 +8.46671 8.80572 +3.94814 5.16845 +6.73654 6.97397 +4.05301 4.93008 +6.37833 6.77985 +7.21161 8.15994 +3.74993 4.61029 +-0.127938 1.09853 +2.82957 4.28816 +6.50564 6.59445 +8.37926 8.48332 +0.757443 1.74585 +0.232438 0.972293 +6.99187 8.7098 +7.20368 8.44301 +4.4801 6.07501 +4.34015 6.1495 +2.19394 3.22334 +7.29817 8.41021 +1.16627 2.68901 +4.62423 5.08039 +0.955655 2.22882 +1.45862 3.07065 +1.69815 2.56291 +4.01179 4.36587 +7.135 7.75829 +6.6823 7.27765 +5.44745 5.67195 +4.94594 5.42067 +0.267772 0.301939 +0.676432 1.6296 +1.37335 1.91645 +1.89051 2.38631 +4.84386 6.30539 +8.95613 10.944 +2.18119 2.41821 +5.74901 6.16952 +7.5431 7.88071 +9.05278 9.8128 +0.201334 1.65323 +2.82787 3.82083 +3.07073 3.08475 +8.99671 10.1766 +5.43261 6.12137 +4.83693 4.86848 +6.31804 7.21544 +2.34491 3.2562 +6.05941 6.53725 +-0.483381 1.17347 +5.53777 5.72651 +3.28875 3.47472 +3.94609 4.9418 +7.45585 8.6871 +1.50066 2.57215 +8.10112 8.67954 +6.24737 6.42635 +0.64413 1.05759 +7.1741 8.21476 +0.502722 1.77462 +0.783663 1.74174 +9.52704 9.9109 +-0.473873 2.01013 +7.07946 7.11474 +0.857335 1.6501 +4.00225 4.84453 +5.40598 6.30573 +8.18802 8.30067 +9.00412 10.9588 +9.8362 10.1517 +7.62735 8.37572 +3.41477 4.63099 +2.51254 2.81559 +6.36702 6.56061 +5.11842 5.35515 +5.21873 5.73296 +5.73528 7.77276 +3.64993 4.66826 +7.12664 8.46553 +8.7257 9.16851 +1.27615 2.20376 +7.46188 8.20752 +2.64939 2.66373 +4.94147 6.0509 +6.3805 7.48841 +6.25197 7.12327 +0.0885331 1.2682 +4.97356 6.58488 +4.11917 4.27267 +9.08793 9.70385 +0.897277 1.31702 +6.87538 8.25544 +1.55565 1.59492 +2.62483 3.54274 +1.49631 2.92263 +9.45305 9.97728 +6.24087 6.4577 +3.94636 5.13669 +-0.000956745 1.08235 +1.46134 1.83767 +9.18517 10.6601 +-0.740186 1.81269 +5.81977 6.15818 +7.0529 7.99421 +6.17753 7.49749 +8.63091 9.04205 +9.65219 10.1558 +3.12839 4.99211 +2.97262 4.07384 +4.28605 4.33171 +4.15906 5.6805 +1.35165 1.50732 +0.524207 2.12307 +5.32468 7.01472 +3.16982 4.87893 +6.88786 8.34191 +3.81703 5.22335 +3.86772 4.37359 +8.19386 10.0705 +1.73155 3.16695 +4.31685 4.62261 +9.40618 9.89612 +4.41215 5.19659 +2.35595 2.63543 +7.88481 8.14203 +7.17062 10.3534 +9.41379 10.389 +7.99867 9.01239 +3.31382 4.04915 +5.39222 6.07657 +8.5187 8.65976 +9.30132 10.6131 +7.17351 7.93596 +4.80134 6.72724 +3.59756 4.65182 +1.08248 1.17479 +1.03124 1.06871 +6.43154 6.95098 +-0.102199 0.59801 +4.94795 5.18081 +6.39126 7.30258 +1.52738 2.04271 +1.80373 2.33093 +2.72251 3.01677 +0.296722 1.10844 +6.39104 6.51567 +8.70965 8.78714 +2.07858 4.41695 +1.91027 2.9718 +1.42944 2.01864 +1.96347 2.73397 +4.0701 4.22456 +4.02859 4.05107 +7.10977 7.98092 +8.21148 9.54287 +6.59231 7.65109 +0.144191 0.830665 +2.0192 2.23704 +8.03482 8.39591 +8.90473 9.98543 +2.18284 2.70166 +3.05569 3.54238 +8.35319 9.39539 +2.00803 2.42866 +2.35282 3.13763 +2.20155 2.79377 +1.76531 2.94892 +7.52749 7.72567 +3.02266 3.24778 +4.01741 4.22521 +9.75263 9.91571 +6.45502 6.67838 +2.24912 3.47262 +1.84372 2.26517 +4.09559 5.71188 +1.43811 2.33732 +3.89171 4.16905 +3.01506 3.9725 +0.0273168 1.51766 +5.04118 5.80507 +3.08517 4.17316 +8.81637 8.8332 +8.74055 9.50143 +2.36904 2.69008 +6.39733 6.44221 +8.53272 9.51114 +9.48423 9.55002 +8.65645 9.04872 +6.66352 7.48009 +5.64389 7.88656 +5.75301 6.6759 +3.28645 4.22757 +4.99482 5.82988 +3.00004 4.0273 +1.45249 1.56662 +4.96263 5.32195 +7.91351 8.1437 +1.02034 1.56249 +0.71376 1.73319 +0.709968 1.44651 +9.01414 9.54799 +4.02116 4.68005 +7.10903 7.27075 +7.21322 8.71031 +1.6644 2.27186 +3.71304 4.68764 +9.66257 10.1452 +5.34477 5.46136 +9.27722 10.583 +3.82328 4.83316 +4.77019 5.07928 +9.07112 9.23836 +6.99091 7.25634 +2.11871 2.3054 +7.88242 7.98572 +0.570809 0.714073 +8.51532 9.49151 +0.329247 2.48897 +4.78202 5.36476 +1.47969 2.78867 +6.75011 7.36769 +2.31162 2.39533 +3.50434 4.48026 +5.84603 6.28861 +7.5337 7.62538 +1.09955 2.85741 +6.09915 7.20381 +0.933825 2.37925 +0.576363 2.0182 +3.12126 3.22507 +2.85313 3.02656 +3.25724 3.92077 +5.48575 6.58011 +1.02824 1.65415 +8.68703 9.06219 +3.28389 3.86349 +5.80264 6.12775 +7.11846 7.47444 +1.29638 3.38601 +6.37908 7.05986 +-0.592438 0.854361 +0.39233 1.17768 +2.1497 3.94423 +2.42336 2.43441 +6.94806 8.30626 +0.79865 1.4173 +1.41455 1.43684 +0.240074 1.16712 +4.18593 5.9929 +6.161 6.564 +0.726091 1.90706 +0.375606 0.694866 +4.09349 4.26452 +2.01652 2.68038 +8.99301 9.90549 +8.93909 9.17673 +1.10427 2.01247 +9.12668 9.15282 +1.08098 1.55374 +0.377836 0.414809 +7.28611 8.86318 +8.3542 8.53251 +3.86353 4.12875 +6.7631 7.40068 +4.61679 4.78182 +2.12935 3.45492 +3.68233 4.0457 +6.68131 8.22111 +8.79197 8.80474 +1.8915 2.26287 +0.387586 3.073 +6.46798 7.57381 +7.79742 9.34526 +-1.21538 1.67303 +2.07845 2.66028 +3.14148 4.46647 +1.66789 2.73375 +8.49821 10.0574 +8.42537 8.89906 +0.618349 2.72887 +6.8229 7.54501 +6.99343 7.35322 +7.34223 8.68781 +3.18834 3.98274 +8.86908 10.2535 +3.39839 3.76171 +0.188168 0.392276 +1.68187 3.53401 +6.50423 6.71714 +7.61191 8.89715 +1.68463 2.09275 +5.94627 7.6003 +2.15865 3.24126 +7.93639 8.53826 +2.99626 3.43273 +7.71028 8.41172 +3.19472 4.60878 +8.36123 8.92549 +8.92975 9.02783 +2.87187 3.49672 +6.76949 7.71139 +8.09121 9.31151 +6.84199 7.44009 +0.730655 0.800873 +7.5208 7.54109 +6.75992 7.55017 +6.09818 6.17399 +0.639209 1.27283 +3.01917 3.22327 +1.69181 2.60614 +9.49245 9.5842 +-0.418034 1.08035 +5.77705 6.4705 +6.79362 8.51993 +9.73155 9.81609 +3.71503 3.92022 +6.18589 6.77634 +3.94124 4.23942 +7.59911 8.05275 +3.68865 5.10948 +7.63926 8.63019 +-0.049855 0.0844425 +-0.41188 0.807786 +1.35962 1.81039 +5.40579 6.15098 +1.38594 2.0059 +6.93444 8.71958 +7.01229 9.38008 +-0.0974976 0.962679 +4.74131 6.59152 +1.02343 1.59245 +1.55629 1.9128 +6.28353 8.38021 +5.66349 5.79644 +1.72629 2.28563 +1.64539 2.82654 +0.359466 1.05106 +4.37569 4.82703 +5.87657 6.37853 +1.46316 1.65333 +7.44494 7.5985 +1.16846 1.98579 +4.43371 4.93234 +2.31838 2.47777 +7.52687 8.44423 +6.08056 7.42253 +9.16144 9.94783 +4.74382 4.95616 +0.248344 1.05335 +6.12345 7.43941 +9.45647 9.99799 +3.77124 4.75199 +3.31315 3.44873 +-0.0909828 1.51271 +7.03234 8.02546 +8.11403 9.11461 +6.734 7.34799 +1.08903 1.18319 +2.72871 4.31607 +6.53688 7.52754 +1.07868 1.27792 +6.28409 6.56795 +4.89866 5.79458 +9.06994 9.1221 +2.54989 3.14338 +3.69971 5.71717 +3.7113 4.55076 +8.91864 9.64522 +8.75634 8.82359 +9.02242 9.03869 +3.59945 4.20169 +4.98557 5.07401 +4.81526 5.74009 +7.264 8.63749 +2.79579 4.43389 +2.87204 4.66432 +2.32487 3.72127 +3.99704 4.72567 +8.17229 9.0158 +-0.72926 0.823658 +2.52355 3.32725 +5.3446 6.63868 +4.48935 7.37833 +3.08173 3.0968 +2.41585 3.23026 +9.23187 10.5413 +5.50099 5.51888 +1.29634 1.88846 +-0.0113225 1.41526 +6.34508 7.53417 +0.383019 2.25144 +5.0649 5.40222 +3.08221 3.76296 +9.29111 10.6833 +2.19714 2.94735 +8.75711 9.48583 +8.61564 8.69349 +1.9362 3.96191 +3.7962 4.44382 +7.78501 9.03843 +5.79649 7.29675 +6.03048 7.4316 +1.31105 4.36446 +6.5882 7.03622 +4.88148 7.12474 +6.62305 6.90973 +2.27488 2.73731 +8.42703 9.28888 +7.72928 8.53989 +7.27021 8.63879 +0.992908 1.92001 +-0.282737 0.511292 +7.88963 8.03117 +6.93371 8.26148 +-0.0346633 0.403617 +8.7827 8.82558 +5.16876 5.59742 +8.61275 8.73843 +5.70578 6.02783 +9.08706 9.35903 +9.32728 9.83021 +9.20058 10.2497 +6.79824 7.3024 +7.17979 7.51783 +0.918555 2.67878 +7.9662 8.63241 +8.85903 10.3145 +9.34614 10.1964 +9.05027 9.79872 +8.28959 8.45837 +1.32518 2.04557 +8.72848 9.16742 +5.92126 6.77277 +8.31504 8.78631 +1.02487 1.70172 +4.45204 4.72842 +8.20636 10.4724 +5.86211 6.25457 +6.15754 7.71303 +8.37832 8.82577 +4.25233 4.59417 +9.41451 9.95324 +9.372 10.4461 +1.8346 2.7144 +8.00681 8.14717 +7.03997 7.06753 +7.16892 7.70102 +7.01781 7.46799 +1.78526 1.7969 +1.63304 2.2011 +8.59718 8.61083 +9.43498 10.3636 +4.98718 5.32487 +3.65451 4.89601 +8.82368 9.11333 +-0.104862 0.598773 +4.97756 5.62342 +1.99876 3.24686 +2.32242 4.01096 +4.04914 4.77892 +3.81545 4.32583 +3.30153 3.46783 +3.14287 4.04718 +8.65711 8.76768 +9.09385 10.6898 +4.82771 5.64405 +5.98783 6.36785 +7.93397 9.6543 +4.89726 5.65486 +5.08717 5.22314 +6.59377 7.23748 +3.58289 3.98597 +0.177884 0.397629 +5.30856 5.79257 +2.53943 3.98007 +6.51217 6.59644 +0.196888 1.99904 +3.8709 4.1901 +2.37646 2.50997 +7.03837 8.13287 +6.8674 6.89535 +0.576964 2.08851 +0.902928 2.86981 +8.59261 9.20279 +5.96621 7.49899 +0.617602 1.83267 +2.29189 2.6361 +4.34207 4.61026 +6.19963 6.76443 +1.15955 1.44068 +5.25852 6.33905 +6.37306 7.53103 +9.13334 10.039 +8.67743 9.93959 +5.62973 6.04375 +8.32286 8.77042 +3.28772 6.1722 +4.97902 5.47249 +3.37765 5.07238 +4.58025 4.84341 +2.76807 3.18817 +4.27581 4.43023 +6.92572 7.68461 +0.279247 1.0561 +1.10903 2.61106 +6.71708 6.73132 +2.66415 3.75702 +8.0513 9.80334 +4.82466 6.04232 +2.59971 2.85768 +9.04689 9.73945 +3.48338 5.16622 +7.90925 8.92774 +7.30264 8.06247 +7.59087 8.26476 +0.150315 0.423068 +8.62726 9.74636 +9.01983 9.71707 +6.84007 7.40541 +8.87829 9.48342 +2.69214 3.71481 +0.580036 0.77289 +9.474 9.83397 +5.80151 6.08527 +3.63837 5.27137 +8.5848 8.65779 +7.88338 8.13276 +3.27992 4.20963 +6.21244 7.28079 +-0.348924 1.38478 +5.26688 5.93787 +3.78941 5.01009 +6.41929 8.38529 +1.41724 1.67733 +0.212821 1.58246 +0.0697189 0.160497 +9.57839 10.2377 +9.03332 9.70645 +4.94572 5.15163 +3.16999 4.536 +5.77494 6.68359 +5.89258 6.11852 +7.72257 8.21668 +8.42501 8.44905 +8.7196 8.86465 +4.392 5.1076 +1.88249 2.54422 +1.38092 1.60326 +5.04142 6.37374 +4.31795 5.91152 +1.79399 2.09314 +6.65405 8.32262 +1.36356 1.58538 +5.45456 6.55824 +4.95807 6.22848 +8.72077 10.2825 +0.745968 2.01546 +6.85041 7.11076 +4.82028 5.34442 +5.77673 8.01294 +8.58582 9.33714 +8.49884 9.21533 +9.05574 9.4096 +3.19932 3.27024 +9.50227 9.96685 +0.771636 1.0617 +9.00621 9.36397 +-0.097167 1.39463 +7.79622 8.43537 +8.05228 10.1504 +2.21685 4.17072 +1.82476 2.45381 +4.34408 4.56578 +9.27538 9.54701 +6.80153 7.44115 +7.38884 7.84448 +7.17526 8.00165 +5.85812 7.67326 +5.25545 6.30791 +5.68518 5.94055 +3.77685 4.1545 +0.530928 0.737248 +3.9772 4.59563 +8.96322 9.45618 +7.98322 8.44165 +3.42929 4.22329 +3.66445 4.7583 +-0.183652 0.434842 +3.16492 3.95726 +6.87407 7.89944 +5.08921 5.7745 +2.85466 3.04505 +7.12685 7.41248 +0.715419 0.876676 +3.47441 5.21753 +9.13594 9.87799 +5.52459 6.35691 +5.12544 6.12935 +2.44296 2.91543 +2.75148 4.19886 +1.43478 4.3919 +6.6352 7.07768 +4.72283 5.11506 +6.36434 7.69268 +2.32643 2.75289 +5.46566 6.22854 +6.37995 6.76989 +1.52564 3.55871 +1.05807 2.19393 +1.95374 4.08727 +8.11273 8.12767 +2.85955 4.71355 +4.89009 6.88516 +2.06859 2.25512 +7.50556 8.77923 +4.43353 5.11915 +5.16308 5.9695 +1.12072 1.69277 +3.96494 4.38143 +7.06931 7.89524 +0.514522 1.51265 +6.56389 7.01146 +1.51362 1.8541 +4.90339 5.51209 +2.11422 3.15457 +2.50094 3.92557 +8.24319 8.62826 +-0.0843505 0.710377 +6.35956 7.89457 +-0.790954 1.2964 +4.02253 5.19193 +2.7425 3.46763 +9.41469 10.1367 +1.57636 2.25105 +3.18647 3.38738 +8.36644 9.66791 +0.180846 0.461221 +7.07675 7.71881 +0.265366 1.19275 +5.43007 6.4854 +9.13912 9.23294 +9.52905 10.4029 +1.18712 2.66227 +5.22714 5.62601 +1.87413 2.8716 +5.71882 6.16374 +5.38169 6.13948 +-0.196005 0.236738 +5.36803 6.4395 +8.27713 8.71262 +8.82031 8.8598 +-0.53845 0.564783 +1.80716 1.94173 +5.67905 7.47291 +2.37779 3.64893 +0.574727 0.766424 +4.60701 4.86591 +3.17989 4.37738 +1.36777 3.15112 +1.48092 3.06573 +3.37009 4.06028 +4.17179 6.2073 +6.47953 6.88994 +5.74431 6.5253 +4.88827 5.49049 +5.44148 5.59239 +1.66153 2.63132 +7.69387 7.82267 +5.20911 5.48488 +-0.103218 0.497402 +7.18003 7.33324 +6.54305 8.81732 +0.278108 1.27452 +2.38323 2.94772 +1.2461 2.03246 +5.47052 5.75781 +7.31505 7.35895 +2.22248 4.23589 +0.0305319 0.430773 +8.32043 10.1222 +6.11732 7.09764 +5.08797 5.74991 +6.62491 7.34164 +5.55795 5.66083 +3.27549 4.13145 +1.0113 3.24631 +0.0717186 0.519738 +7.82905 9.30839 +9.90251 9.98691 +0.841457 0.952276 +-0.133927 0.510174 +1.14614 2.82218 +2.59767 4.19742 +3.41095 3.95265 +3.38951 3.75838 +8.86766 9.19437 +9.27927 10.261 +2.33249 2.79402 +5.69681 5.93469 +4.02502 5.38732 +0.797157 1.22845 +7.23558 7.8651 +1.1253 1.99184 +8.58296 8.64267 +-0.400141 0.74698 +3.46677 3.50526 +6.03252 6.64842 +5.8493 6.68938 +3.53209 3.84014 +7.22078 8.98106 +6.21943 7.69944 +0.887198 2.07323 +3.36591 4.57442 +4.30143 6.41179 +4.07556 4.54276 +8.77552 10.0615 +6.7247 7.04044 +9.05494 10.1126 +7.46604 7.80632 +3.38601 3.8043 +5.60475 7.02788 +9.09811 9.4654 +9.33447 9.80012 +8.66499 10.1002 +3.87007 3.88281 +2.87624 3.11359 +5.92385 6.80801 +4.49711 5.01863 +8.84524 9.36225 +6.40944 6.82093 +2.90915 3.68288 +3.96801 4.82534 +5.51744 5.84233 +3.2959 3.44409 +0.18526 0.207322 +5.49717 5.72648 +6.9522 7.1952 +0.769572 1.79343 +5.95522 6.03918 +6.54327 7.7475 +2.13516 3.83957 +-0.388892 0.775076 +1.30128 2.29414 +9.76761 10.1604 +7.38731 8.66002 +7.09229 7.43495 +9.1379 9.52432 +6.75942 7.88717 +7.42824 8.82063 +6.93078 8.19884 +2.307 2.93836 +8.38254 8.84691 +3.90159 5.37938 +0.0413204 0.112203 +0.638217 1.53943 +0.88678 2.49435 +1.99104 2.60847 +6.61595 7.65064 +2.37641 4.71719 +7.94945 9.21404 +5.44594 7.13646 +5.45737 6.12335 +7.39207 8.02885 +5.51588 7.39341 +8.1581 10.0632 +0.197869 1.44516 +-0.0161139 0.73487 +4.24155 4.7304 +0.00374564 1.26481 +8.1878 8.20011 +-0.115544 1.74771 +0.912347 2.52922 +2.72234 4.83268 +6.45577 7.07776 +9.74201 10.1772 +7.11008 8.72914 +4.41921 4.8673 +7.97673 8.36658 +0.438659 0.647061 +4.35086 5.44482 +8.22919 9.34379 +3.53242 5.65576 +1.126 2.32177 +5.95118 6.51364 +3.10519 3.9447 +1.28889 2.26267 +7.04255 7.67791 +3.12614 3.17626 +8.09968 8.49162 +6.07924 7.219 +5.99554 6.52549 +9.14378 9.5773 +5.82872 6.53112 +9.3361 10.1704 +4.3751 6.51675 +3.288 3.98328 +4.56342 4.80185 +7.16574 7.43901 +7.7638 8.47758 +7.31514 7.78499 +7.98942 9.50252 +4.31211 4.70724 +2.9094 3.33304 +0.108736 0.668815 +8.08409 9.11098 +-0.0053985 0.589992 +1.31926 2.72153 +2.28664 2.38813 +7.95237 8.26388 +-0.0283047 0.452099 +7.50295 8.71708 +7.72356 8.63468 +3.48953 3.89579 +7.73814 8.73456 +4.54487 5.45817 +6.45109 7.00312 +3.99915 5.41716 +6.81436 8.5682 +6.86726 7.55999 +2.67863 3.7053 +2.6837 3.39567 +2.84347 2.91724 +5.79383 5.80493 +2.41217 3.0619 +8.78163 9.0998 +1.43456 2.50854 +6.73393 8.53005 +3.02563 3.56456 +3.34628 4.2934 +2.44985 2.92819 +1.38262 2.89341 +4.56337 5.75702 +0.275735 1.16604 +1.39763 2.8108 +9.69128 9.90361 +8.54868 9.66756 +3.01838 3.72831 +8.34017 10.5262 +1.82721 3.0476 +5.9732 6.83307 +2.77874 4.25603 +1.71987 3.1227 +6.33773 7.89103 +1.31982 2.82992 +4.21601 4.9627 +6.68166 6.72653 +0.87708 1.06828 +1.03483 1.26625 +2.996 4.03087 +1.54718 1.57452 +2.33087 2.38226 +2.29464 3.36496 +2.03064 3.41867 +5.8456 6.10406 +7.54614 8.2874 +1.42938 2.89154 +2.65935 3.53883 +3.98845 4.42049 +6.85632 7.15487 +8.12038 9.34993 +0.873558 1.32129 +6.61595 8.00766 +9.49147 9.81947 +-0.0225601 0.328769 +-0.481519 1.37204 +6.31457 7.45251 +4.59738 5.81395 +4.83304 5.63008 +1.95746 2.78657 +2.97889 3.74408 +9.08327 10.702 +3.58219 4.93634 +7.87068 9.77851 +0.330978 1.36031 +4.78145 5.36918 +4.94672 5.56644 +7.66806 8.08613 +4.78512 6.35461 +5.17367 5.74386 +8.65884 9.97088 +9.22053 9.60447 +6.15061 6.58817 +0.0875971 0.541643 +6.45597 7.92002 +0.636824 1.05267 +5.31677 6.12838 +6.51127 6.6731 +0.459551 1.69382 +5.75106 6.41377 +3.68438 4.67415 +9.36302 9.78281 +5.46195 7.99215 +2.55471 2.59231 +-0.0640245 1.33755 +9.36027 10.6198 +2.67955 2.77882 +3.51443 4.10619 +6.83904 7.23692 +2.59553 2.81418 +7.74628 8.95169 +3.86464 3.90067 +3.32377 3.992 +1.43737 2.52191 +3.83927 3.99402 +5.24426 5.35179 +0.833857 1.05277 +8.4062 8.51964 +9.62299 9.66254 +3.55427 5.19048 +1.7003 2.62107 +6.8059 7.49246 +-0.761104 0.773528 +1.37137 1.95048 +2.1222 2.59387 +0.633505 2.04796 +0.605156 1.04336 +7.22842 8.3365 +4.28716 5.28921 +8.14286 9.52015 +7.62467 9.18603 +1.11029 1.81278 +5.05654 5.13597 +0.862653 0.97827 +7.24766 7.92167 +8.80103 8.91467 +3.05841 4.82292 +1.28204 1.55969 +1.58886 2.57874 +0.0537678 1.28837 +8.09303 9.71678 +8.37599 8.85705 +3.18107 4.01971 +6.67019 7.75848 +6.29836 8.21603 +0.86271 1.30358 +3.86126 6.49694 +5.84446 6.24913 +0.475025 0.598151 +6.3477 7.08327 +3.60161 4.51824 +7.13317 8.13858 +4.89052 6.23701 +5.69441 5.99027 +7.18735 8.34853 +9.30182 9.34894 +6.06589 6.15141 +8.05917 8.89642 +5.6136 7.14058 +0.838337 0.959487 +0.56421 2.00841 +6.46876 6.63629 +2.4434 3.92184 +7.97216 9.45372 +8.17926 8.66756 +1.86522 2.01888 +0.983342 1.89079 +2.07322 2.09765 +3.52974 4.73717 +3.24973 4.88691 +5.47789 5.95384 +4.11218 4.57076 +6.61174 7.47165 +8.09302 8.36193 +1.67911 1.69022 +4.436 6.17515 +5.6544 5.74951 +1.50354 1.76043 +4.41433 4.83589 +1.82528 3.53979 +3.98749 4.65527 +6.42503 7.5787 +8.69554 10.1767 +8.39215 8.56999 +8.71646 9.66209 +1.59091 3.39622 +6.12574 6.94955 +7.92527 8.25049 +9.19858 9.49137 +2.73382 2.97747 +4.56558 5.94738 +8.33983 8.58548 +9.00798 9.01838 +4.93268 5.28383 +3.15356 3.58606 +8.28171 8.79351 +1.47358 1.9581 +0.891797 2.05345 +1.56032 2.38159 +2.5152 3.80485 +8.0963 9.88138 +1.1262 1.89279 +7.99336 8.2352 +5.25067 5.41251 +4.57532 5.20101 +1.87911 4.59415 +4.25142 4.70467 +8.18782 8.76989 +9.20478 9.3612 +7.70898 9.7752 +0.655865 0.958924 +4.8883 5.77477 +3.03279 3.47456 +1.01979 1.41661 +8.94219 10.6987 +2.49348 4.58195 +2.44003 3.29005 +3.4725 3.55572 +9.3917 9.95851 +7.08658 7.47686 +3.56413 4.44089 +-0.47868 1.11453 +6.82615 8.00596 +3.49451 3.74705 +8.13286 8.47976 +7.01732 8.82556 +1.19064 1.48887 +5.28851 6.88637 +8.83175 9.49879 +0.939903 1.17024 +7.49124 9.01906 +2.9285 4.23224 +5.68296 6.86273 +8.53897 8.77886 +2.9107 5.01232 +0.748655 1.10265 +4.77258 5.12626 +3.995 4.75289 +2.71467 4.26926 +6.21665 7.16233 +4.53883 5.75731 +4.37153 4.76125 +7.47635 8.75777 +4.82013 6.4699 +9.36015 9.58451 +4.43054 5.86752 +2.10934 2.34705 +3.00306 3.06539 +7.81957 8.44081 +1.97221 3.06916 +0.153393 0.503956 +5.05611 5.27536 +5.73277 5.89001 +3.64807 4.85582 +6.13416 6.1528 +3.85511 4.14045 +0.411725 1.36529 +2.26932 2.5447 +3.51164 4.93266 +2.50955 4.34201 +8.74663 9.39268 +6.2229 6.39303 +4.38059 4.91592 +7.29109 8.62318 +6.31801 6.99532 +9.75036 10.0514 +1.69019 2.41527 +4.20462 5.27729 +6.32944 6.94729 +3.5736 5.21496 +4.48316 4.61828 +1.76915 2.43263 +2.42026 4.09159 +2.08762 2.43074 +5.48161 6.02473 +5.51826 7.47042 +2.78026 3.1552 +7.89469 9.49867 +3.09084 4.54697 +7.20417 7.42408 +5.36528 5.74851 +1.86239 2.41988 +1.55994 2.85743 +4.40182 4.6638 +7.91619 9.01242 +3.08119 3.74714 +1.54108 2.08538 +3.61461 3.64631 +8.76851 9.66257 +-0.645571 1.3366 +-0.707083 1.21005 +7.19571 8.23405 +5.42865 5.89329 +2.12897 2.59222 +0.603102 0.930391 +3.75025 4.63181 +6.14867 6.4526 +7.30947 7.51461 +7.83183 8.79802 +6.06658 8.53246 +1.67895 2.50063 +1.14179 2.04478 +8.59583 8.90112 +-0.918885 1.30717 +0.182607 0.613593 +3.3335 3.77196 +0.783053 2.4368 +6.49331 7.60104 +2.85101 3.28637 +7.42273 7.66905 +3.96433 5.02573 +8.26262 8.40749 +9.24451 9.32783 +4.89036 7.07214 +6.45431 6.96815 +5.20701 6.58747 +7.40142 7.98615 +4.19768 4.9831 +3.32546 3.88811 +-0.471996 0.967855 +9.36172 9.63532 +1.96831 3.00632 +7.537 9.72671 +4.67746 4.81135 +3.10782 4.93642 +4.94809 6.54855 +4.16763 5.25628 +9.04992 10.316 +0.668935 0.680886 +4.02935 4.84503 +5.32499 5.76636 +5.32267 7.15457 +5.18886 5.23491 +4.37053 5.36801 +2.39955 2.74657 +8.19764 8.86645 +4.24706 5.69703 +1.87851 2.36988 +0.886553 1.05064 +7.27428 7.90224 +9.08417 9.44879 +3.11534 4.02019 +6.3284 7.39925 +4.96029 5.59076 +2.58248 3.11741 +7.76513 8.13505 +4.93613 6.51523 +0.565355 1.70512 +2.12366 3.0319 +5.32422 6.84146 +-0.135396 1.08591 +3.7901 4.86303 +4.49677 5.41847 +0.615748 0.834712 +0.64784 1.81859 +6.65505 7.13894 +-1.12744 1.61017 +0.550814 1.24316 +6.66639 6.89866 +6.19271 8.17468 +3.09382 3.78684 +4.41221 4.95889 +7.96091 8.48824 +8.32129 10.2917 +2.13168 2.19835 +1.4635 2.38989 +5.78102 6.42215 +1.70153 3.20616 +5.35068 5.71016 +4.27702 4.37203 +5.13888 6.04764 +4.79644 5.37927 +6.75314 7.66368 +6.04484 6.84064 +4.34947 4.45643 +9.08755 10.396 +0.88804 2.17441 +6.86788 7.88301 +7.94296 8.61664 +8.02387 8.79591 +1.79024 2.40559 +5.50404 6.01044 +7.76772 8.1932 +1.174 1.23693 +6.20571 6.9224 +4.20863 4.48702 +4.16743 4.39075 +-0.11965 0.120778 +7.01234 7.52619 +5.91415 6.46151 +5.28713 5.72354 +6.26981 6.31237 +0.643056 1.43864 +1.62562 1.99875 +0.544992 0.721386 +6.92522 7.09165 +-0.107048 1.12273 +0.644674 0.91244 +8.56904 9.01883 +2.23079 2.56598 +9.79034 10.1123 +8.13788 8.4131 +1.86753 1.95236 +2.97577 3.33272 +8.57454 10.0193 +1.20043 1.53408 +3.43515 3.86571 +5.79075 6.41293 +1.71558 2.52845 +2.39907 3.46652 +9.08289 9.91182 +0.859644 1.07475 +5.30144 5.42157 +-0.441497 0.890794 +3.55044 4.14918 +-0.340115 1.19239 +6.5534 6.76908 +0.836514 2.09196 +8.15747 8.96484 +4.80087 5.14227 +7.72071 8.88223 +5.11901 5.65559 +4.44996 4.63562 +-0.328404 1.3002 +0.90759 1.34556 +5.94839 6.35058 +1.76504 1.78344 +1.32585 2.08994 +7.18641 8.20945 +0.62657 1.06025 +6.28086 6.40975 +5.05525 5.16143 +5.82694 8.07685 +6.23677 7.55394 +-0.226265 0.661443 +1.42599 2.36325 +9.04445 9.92971 +-0.169286 0.185741 +8.34636 10.9042 +9.52494 10.0475 +8.39989 10.1377 +3.89956 4.70428 +3.98673 4.97185 +5.43008 5.67936 +7.76475 7.98591 +4.46895 4.73188 +0.584662 1.54474 +2.12622 2.79994 +1.40578 2.2461 +1.45171 2.02105 +2.05665 3.04611 +2.29818 2.68118 +1.77344 2.98698 +4.92092 5.55302 +7.18758 8.37525 +8.83407 10.0565 +2.91182 4.71932 +6.47293 6.74664 +2.49238 3.69749 +0.487234 0.541003 +4.703 4.92744 +9.8867 9.94918 +1.7713 1.9792 +5.68316 6.90242 +5.62485 6.70656 +7.24837 9.60197 +7.71147 7.76519 +5.22324 5.30661 +9.11258 9.28071 +8.2827 8.90115 +8.90865 9.42138 +7.47233 8.72308 +4.89712 5.65153 +4.12392 4.20239 +5.65325 6.55887 +8.65945 9.05845 +7.9165 8.36489 +1.4952 2.43991 +5.49665 5.80793 +1.67206 2.55302 +0.943544 1.58521 +0.47 0.860959 +6.47638 7.43101 +4.38434 5.97278 +8.12782 9.10574 +5.78143 6.6539 +9.23616 9.40513 +1.6845 2.00736 +6.56955 7.37847 +7.42993 9.04718 +-0.179632 0.450904 +8.65819 9.07724 +7.86567 8.80824 +1.85428 2.7755 +2.29222 2.65374 +4.03614 4.51729 +6.9326 7.07635 +5.50807 6.498 +6.17637 7.26432 +8.7688 9.16308 +7.65 8.88604 +3.74495 4.29991 +8.5671 10.5661 +7.41964 8.21083 +8.04302 9.78783 +0.269663 0.317601 +8.29804 9.40991 +3.90673 4.22298 +8.82384 10.9441 +7.27081 8.19548 +1.30184 1.98993 +8.13028 8.92385 +7.21224 7.35137 +5.02122 5.69666 +0.817219 0.974073 +-0.128067 0.589359 +2.12137 2.74019 +5.24657 5.44714 +1.55805 3.10332 +9.91031 10.0748 +7.13941 7.9143 +-0.183908 0.934079 +3.987 4.11053 +3.26678 3.67608 +9.75921 10.1121 +0.755391 1.06346 +7.28479 7.49982 +1.37522 3.80623 +0.944351 1.46531 +9.49278 10.2372 +8.28946 8.67597 +9.43537 9.58003 +7.73357 8.756 +2.64043 2.8687 +4.70448 6.99929 +3.82199 3.89343 +3.43825 4.10908 +4.42362 5.69086 +8.08536 8.60142 +8.43208 9.31272 +7.5889 8.39208 +7.90112 7.9734 +6.10381 6.80568 +8.76283 8.80151 +1.46728 2.53288 +1.68884 2.47102 +7.63343 8.29838 +9.18852 9.5558 +0.977174 1.4792 +4.7577 5.74873 +4.66433 6.37375 +-0.0952277 0.378184 +5.30929 6.07469 +4.98811 5.16146 +3.0744 5.59799 +0.944909 1.25222 +1.38561 2.51277 +3.77811 4.23459 +2.11604 3.32458 +0.920929 1.17187 +5.23496 6.34905 +6.9953 7.65745 +4.81803 4.89553 +4.69301 5.36777 +-0.208926 2.6111 +7.97334 9.83269 +-0.396673 0.779988 +5.91367 6.47682 +6.27249 6.83533 +5.58931 6.89679 +2.03394 2.67025 +-0.197752 0.383167 +4.69751 7.695 +4.5989 6.07875 +3.7285 4.27396 +7.9807 8.27693 +-0.00248985 1.30934 +2.68016 3.916 +0.881558 1.14567 +4.77066 5.05302 +0.552268 0.919467 +2.46862 2.65199 +1.4009 2.51701 +-0.171185 1.28252 +9.27842 9.90243 +3.51778 3.57728 +6.10071 6.92163 +9.05387 10.0894 +5.52995 5.89082 +8.40216 9.0272 +9.02911 10.1602 +4.85818 7.38829 +1.6762 2.32334 +6.45416 8.62337 +5.44592 6.0245 +3.45876 3.94274 +9.07144 9.16725 +6.51885 7.6363 +7.92593 9.01986 +0.270702 1.57395 +6.11245 6.70173 +1.37658 2.19068 +2.42668 3.43827 +7.98226 8.43306 +3.72269 4.74654 +8.16252 8.58873 +8.81456 9.5363 +-0.338386 0.864811 +1.90693 2.25796 +3.5305 4.17475 +6.07997 7.67393 +0.53347 1.68815 +7.31182 8.44458 +7.77462 8.33613 +3.79975 4.15552 +9.08822 9.9771 +-0.101698 1.05442 +8.44869 9.95724 +-0.0318759 0.532673 +8.09238 9.51356 +5.51514 6.60799 +8.66528 10.3297 +8.25556 9.97893 +-0.220428 0.247563 +0.00453913 0.540444 +1.53599 1.61735 +3.77213 5.06896 +2.65332 2.75864 +6.05811 6.43112 +0.302534 0.803651 +0.393766 1.11611 +9.31035 9.62387 +0.568281 1.7765 +-0.721118 1.27387 +1.83573 2.62578 +1.39953 1.91158 +6.51883 8.52813 +2.60154 2.95054 +6.58322 9.37818 +5.61178 5.67661 +9.56511 10.2767 +9.09174 10.0697 +2.55846 3.39943 +8.38146 9.06138 +7.97019 8.18074 +6.1426 6.42787 +1.15876 1.55463 +2.93483 2.96376 +7.23883 7.29158 +9.64606 10.0674 +4.89825 6.70366 +7.35635 7.96328 +2.2702 2.36797 +-0.0464389 0.395244 +1.14883 2.10411 +4.7309 5.10593 +6.07946 7.37741 +5.50202 6.28822 +3.66574 3.96271 +1.9944 2.3862 +7.58159 7.59275 +1.98712 3.30587 +2.10317 2.89161 +9.66889 9.97287 +1.57327 2.15421 +8.14125 8.30983 +3.77185 4.12658 +8.51624 9.51485 +9.25211 9.722 +2.06312 3.0453 +9.34954 9.91254 +7.31475 8.89322 +7.85044 9.20242 +0.226243 1.28465 +0.0260868 0.575177 +9.40743 10.1655 +4.04324 5.05341 +1.02626 1.48332 +3.33074 3.72025 +9.2005 9.61387 +6.68317 7.14109 +6.82083 8.6312 +4.34816 4.50329 +-0.48874 0.975608 +4.26651 5.68526 +4.89731 5.57569 +2.68984 3.5661 +0.499714 1.01055 +9.01902 9.36142 +3.22067 4.59054 +0.65132 0.860512 +1.6791 2.36642 +8.28222 8.7579 +2.84349 3.24134 +5.64949 6.09512 +3.44026 4.43245 +2.60889 2.6248 +-0.00849234 0.984046 +7.5745 8.65675 +2.07464 2.6488 +2.59747 2.65772 +6.36828 7.42208 +3.83342 4.50127 +5.41167 5.7011 +6.53606 7.53796 +8.21975 9.56176 +1.90113 3.08684 +7.74402 7.82057 +4.26515 5.11327 +5.42743 5.59215 +8.69709 10.0912 +2.87019 3.94798 +9.27013 9.54627 +9.30568 10.2136 +9.02985 9.62917 +3.7589 4.59642 +6.59359 6.86939 +3.26574 4.83488 +5.14545 7.70086 +7.43163 8.05103 +5.72972 5.74457 +0.490113 1.31151 +7.018 7.42627 +6.22976 6.27589 +9.07732 9.30419 +4.3917 4.42663 +8.50298 10.3728 +6.18671 7.53619 +3.51053 4.097 +2.17172 3.56595 +6.08046 6.23691 +9.07361 10.9129 +3.95757 4.11333 +-0.136516 0.78995 +1.34923 3.47002 +0.0562579 0.686502 +9.10943 10.2731 +5.80174 6.16971 +7.86011 7.87649 +5.34384 5.51645 +6.32167 6.76387 +7.70566 8.28038 +-0.319903 0.867682 +-0.372564 0.570014 +8.83696 10.8439 +7.78947 9.38211 +9.25815 10.1092 +5.59721 5.67148 +0.234719 2.42489 +1.06314 2.87416 +1.75391 2.69799 +5.4536 6.66068 +1.35696 1.87102 +2.17418 3.1459 +7.61817 7.98287 +2.92194 3.18393 +7.68243 7.83261 +9.33163 10.5531 +1.14227 2.50228 +5.47911 5.70857 +9.88123 10.0758 +8.81249 8.83145 +6.02747 6.43183 +4.81158 5.79178 +6.65666 7.5047 +4.89085 5.56569 +0.935564 1.71547 +-0.0452879 1.16222 +4.03524 4.6206 +5.88518 6.02658 +2.06227 2.9581 +0.207246 2.2404 +2.81757 3.70318 +0.704257 1.98403 +2.38486 3.30039 +3.57073 4.78358 +1.53721 3.00546 +8.37852 8.39527 +1.54619 1.59789 +1.00447 1.40778 +5.31977 6.43861 +3.82175 3.83209 +3.37738 4.44002 +5.46644 5.97254 +3.88191 5.00688 +4.88046 5.39031 +4.15092 4.93679 +1.75182 2.07399 +1.16434 1.76541 +3.37032 4.29676 +3.1685 3.98533 +1.28787 1.59775 +5.86338 6.17993 +3.8645 4.25757 +1.83947 2.48092 +0.184795 0.586724 +3.13752 3.76447 +2.14264 3.03248 +5.78182 5.9029 +2.47969 3.8088 +2.59206 3.08362 +-0.354871 1.03627 +7.94041 8.05947 +9.48014 9.93817 +0.992727 1.48877 +6.1525 7.51387 +5.00071 6.15665 +7.42074 8.27606 +9.6539 9.83042 +1.08984 1.46387 +5.46282 6.95907 +4.74506 5.13968 +0.357565 1.91464 +9.07652 9.65474 +0.201095 0.646211 +7.04306 7.69131 +1.17728 1.2237 +5.92183 6.29165 +-0.41356 0.491524 +8.38339 10.4509 +8.08648 8.11344 +3.32474 3.39522 +5.762 5.83732 +2.26778 2.55548 +4.86127 5.92868 +3.75949 5.16608 +4.83431 5.88632 +2.65122 3.31344 +9.30295 9.38948 +6.03391 6.32749 +5.12035 5.59414 +5.68785 5.979 +7.89553 9.15202 +2.54445 2.74715 +2.36337 2.49709 +4.71661 6.12198 +3.72447 4.68735 +1.0541 1.53187 +3.45178 4.80929 +7.90773 8.26212 +8.1816 9.18627 +0.322569 0.871041 +7.24823 7.32699 +1.7003 2.78087 +9.70927 10.2515 +3.75922 4.01081 +1.06949 1.40253 +1.21774 1.4734 +6.02123 6.32973 +2.76396 3.09484 +2.80358 3.00026 +5.25666 6.31369 +4.71714 5.30669 +4.37906 4.50557 +7.40824 7.44969 +7.89081 9.18263 +8.8136 10.3074 +9.1757 9.37261 +7.1938 8.51137 +0.580081 2.32678 +2.02497 2.95434 +6.01446 6.78851 +8.54365 9.21454 +3.03567 3.27089 +0.650657 1.5716 +5.05518 6.36521 +1.64301 2.76399 +4.15989 4.34183 +3.72791 3.98156 +3.91372 4.06182 +3.04507 3.88871 +3.82596 4.25694 +3.36492 5.00402 +6.50019 8.17974 +3.54621 3.81009 +0.546921 2.09811 +5.1789 5.9826 +4.98983 6.31221 +2.47557 2.63878 +4.64568 4.81101 +9.1462 9.21888 +7.37417 7.5276 +2.21604 2.50113 +8.29804 10.2722 +5.1282 6.06353 +8.58281 10.1589 +6.47084 7.04085 +6.27806 6.72674 +7.11554 7.85687 +6.01085 6.02773 +5.46694 7.52872 +9.51078 9.85387 +3.36627 4.06552 +2.96126 5.12635 +3.09314 3.40691 +5.05456 6.62548 +7.56469 8.97053 +1.33727 2.87482 +5.6572 6.28169 +0.120924 0.296475 +7.09139 7.41322 +2.10076 3.28507 +8.74998 10.1094 +7.45072 9.50796 +7.75294 8.59218 +0.740374 2.44897 +7.63001 8.91562 +4.30743 4.81716 +6.40813 7.29159 +6.30213 7.35987 +6.44392 7.32584 +8.41155 9.4466 +-0.377892 0.689618 +5.88857 6.70983 +6.67779 7.70668 +4.831 5.17464 +2.62342 3.82764 +8.57453 9.29283 +7.32648 7.96725 +9.32937 9.9726 +7.30774 7.65754 +3.97456 4.59876 +5.73092 7.20962 +1.958 2.10551 +3.2115 3.81482 +5.76497 7.42425 +2.77219 3.29692 +4.95297 5.14843 +5.96367 6.3619 +2.49872 4.61736 +8.21817 8.23425 +2.13615 2.61877 +7.84121 9.55011 +8.63416 10.2773 +5.61084 6.32053 +4.86002 5.79944 +9.07858 10.688 +5.95829 6.42504 +3.3289 4.17849 +3.27989 4.91625 +8.28046 9.23021 +2.18691 2.6072 +1.3962 1.75013 +2.13627 3.73117 +2.11128 2.57303 +7.22357 7.50136 +7.43862 8.03136 +2.80578 3.02886 +0.176906 0.761142 +5.99314 6.6075 +1.90398 3.3925 +5.48264 6.73579 +7.18447 7.49811 +3.24434 5.05219 +5.53263 6.04178 +1.71172 2.45682 +0.297266 0.481632 +2.62582 3.36142 +0.243865 1.49321 +8.86142 10.169 +3.93193 4.39404 +4.98182 5.15675 +7.99209 9.73159 +8.18033 9.45596 +4.25235 4.41546 +1.59603 2.15581 +6.47724 8.69649 +5.24138 7.93131 +3.4267 3.49003 +0.0439912 0.316407 +1.99983 3.87206 +-0.103124 0.568771 +4.62451 4.80117 +2.89065 4.16315 +5.82817 7.43232 +6.89255 7.82189 +5.71037 6.81241 +4.34551 5.24905 +7.33931 7.3741 +-0.855192 1.27129 +8.94842 9.10813 +9.19877 9.68412 +6.42658 7.77968 +-0.0669636 0.430107 +6.40366 7.40701 +8.91175 9.24059 +3.21388 4.21676 +3.38557 3.79509 +4.24411 4.97032 +7.259 7.34896 +2.55995 3.18361 +8.77438 10.5503 +8.18685 9.79378 +2.78397 4.4563 +8.6891 9.38337 +6.51749 7.59374 +2.52346 3.46101 +8.40526 9.35647 +5.26942 6.33572 +4.15094 5.00668 +0.471666 1.53842 +7.63441 7.96745 +2.39974 3.7814 +2.71989 3.02994 +8.12085 8.33493 +6.19474 6.84381 +6.6133 8.31417 +5.1758 6.94983 +8.66241 8.79095 +6.10878 8.22083 +8.81883 9.08031 +8.28969 8.45176 +7.19851 8.37836 +1.5722 1.6836 +4.57814 6.95063 +7.66128 8.10631 +0.742483 3.08515 +1.15026 1.98074 +3.90133 4.12003 +7.61145 7.73433 +8.32187 10.2933 +0.407205 1.08089 +1.26545 2.60796 +2.70646 3.92753 +-0.196551 1.83536 +-0.413063 1.23838 +0.264484 0.556192 +6.30158 6.96097 +-0.66246 0.809062 +9.34243 10.3521 +8.70093 8.79679 +0.745195 1.92911 +9.12892 9.68193 +7.98533 8.30538 +6.23671 7.04296 +6.5603 6.95483 +7.08133 7.10563 +2.15769 2.41541 +8.24752 8.73978 +5.27693 5.61904 +0.317419 1.48404 +3.48029 5.46979 +7.38901 8.56554 +1.06587 1.62384 +5.54926 6.04924 +4.46577 6.48749 +5.349 6.15584 +8.04249 8.17359 +3.37651 3.56179 +3.64706 5.57403 +4.49844 5.26404 +3.93361 4.92128 +5.82184 6.29881 +0.984273 1.70318 +1.12773 1.80726 +3.11675 3.17451 +5.07913 5.46291 +0.615591 1.81465 +1.08948 2.77847 +7.97412 8.07365 +5.05207 5.82497 +0.0407709 0.558817 +6.11142 6.48205 +3.4461 3.57315 +8.6547 8.80553 +8.18965 9.64194 +5.55564 7.9703 +4.01776 4.16989 +2.4668 2.82018 +0.911925 2.56662 +4.68814 5.03614 +7.4899 8.49036 +8.40912 9.14001 +2.32725 3.16377 +0.0723972 1.42049 +6.6441 6.6953 +3.65586 4.38222 +6.35844 6.57833 +4.44435 5.73077 +1.81779 2.57257 +4.17692 4.59722 +8.54682 9.38058 +1.61135 1.81629 +3.91926 5.00536 +9.78302 9.85143 +1.25632 3.10345 +5.53191 6.08174 +-0.231868 0.676811 +1.03054 2.58105 +0.0402172 0.690608 +0.974571 1.25234 +5.22227 5.92302 +8.05843 10.1439 +8.48938 8.50755 +0.0965782 1.24008 +6.53821 7.47765 +0.189991 0.475204 +8.48963 8.54995 +9.68363 10.0534 +1.49381 2.71302 +6.75552 7.41283 +7.91075 9.15302 +0.520922 1.40928 +1.17957 2.11221 +4.00122 4.40686 +7.32467 7.9273 +6.39126 7.90248 +6.50534 8.19308 +7.19888 7.22234 +-0.136797 0.731889 +0.870318 1.25614 +2.07126 2.28297 +6.10995 7.60408 +3.02174 3.90102 +-0.657541 1.57517 +0.993121 2.66255 +7.27232 7.50832 +2.16079 3.75428 +9.27397 9.75098 +8.36865 8.5545 +4.56641 4.97607 +3.60746 4.34616 +6.31304 7.70611 +2.91442 3.7602 +4.85814 6.70407 +4.45876 5.67661 +8.06749 8.82229 +2.02826 3.59873 +1.92922 2.50088 +2.63867 3.48117 +2.17665 2.54826 +8.62674 9.10675 +0.96648 1.47671 +8.86336 9.53978 +5.52747 5.80829 +0.77099 3.06106 +2.2307 2.53877 +6.29165 6.63018 +4.44717 5.04651 +3.80894 4.63054 +7.47519 7.87072 +0.933668 1.9949 +-0.712945 1.21558 +7.30206 8.38376 +5.80281 7.00022 +7.96578 8.6558 +0.24063 0.706466 +4.41893 4.58472 +4.0132 4.92768 +5.29626 6.09397 +3.43602 4.00728 +0.780945 1.66499 +8.83861 9.15168 +9.06411 9.75544 +3.45618 3.62529 +9.51413 10.0148 +0.842106 1.75695 +1.06485 1.44192 +6.89987 8.05314 +7.89154 8.73313 +8.71675 9.79526 +2.40574 2.58062 +8.55952 8.78132 +5.61716 6.06282 +3.71059 3.77929 +2.50187 2.99137 +6.92852 7.23184 +7.00442 7.93869 +8.82232 8.8756 +4.10389 4.53702 +7.6907 7.77577 +9.31554 10.2674 +8.51082 8.70339 +4.83332 6.70311 +4.6904 5.42892 +4.71407 5.67695 +4.12047 4.44089 +7.51845 8.26858 +1.31781 1.9397 +6.26854 8.02093 +6.92072 7.77774 +0.438156 2.18909 +0.898035 1.72074 +3.81121 3.8643 +1.01676 1.34308 +9.28445 9.42801 +2.43133 4.43516 +4.33664 5.9904 +2.19178 2.37244 +1.5457 1.79785 +2.23781 2.6481 +6.8365 6.87073 +0.82568 2.74775 +9.59404 9.89262 +8.48394 9.15107 +6.16085 6.42224 +3.5667 5.97689 +4.16931 7.41638 +6.95636 7.0982 +6.87987 7.09233 +3.12619 3.14821 +7.76636 7.98459 +4.60371 5.59136 +3.92189 4.88302 +6.90694 8.19858 +3.85132 5.19015 +8.05045 8.32483 +4.8338 6.05032 +1.93576 3.18873 +2.4182 3.55039 +5.56905 5.8172 +4.18436 6.01283 +3.04944 3.85936 +7.83585 8.95233 +1.76281 3.0558 +3.44143 3.6317 +8.69887 9.40371 +5.67867 5.73236 +0.859809 1.76578 +6.92284 7.13601 +8.27495 9.13414 +5.44385 6.42599 +-0.941603 1.8215 +7.88161 8.79447 +0.965018 1.17732 +5.56442 5.79546 +8.79032 10.9909 +5.28632 5.79175 +4.80998 6.07002 +8.4021 9.81107 +3.16415 5.08682 +-0.212163 1.2052 +5.683 5.83625 +0.738527 1.31842 +2.03835 2.52756 +7.4543 8.91243 +-0.568869 1.44659 +3.58855 4.42371 +6.33058 7.18779 +-0.645579 1.94313 +2.18149 2.24157 +3.80281 4.67323 +5.14628 5.97452 +2.55239 3.45685 +3.56586 6.23355 +6.74752 7.19693 +8.99006 10.5533 +0.259833 0.99882 +8.9005 9.75401 +7.28058 8.41075 +4.57803 5.70104 +9.82823 9.90251 +6.94375 7.42033 +7.8878 8.81951 +5.01137 5.52693 +2.25503 2.28817 +6.65772 7.11107 +0.647512 2.04416 +4.34796 4.5706 +4.5395 4.91529 +2.65423 3.49531 +7.97384 8.78377 +5.53873 5.76806 +9.78641 10.1351 +6.01664 6.44407 +3.47406 3.75187 +4.59421 4.81804 +1.20641 2.00488 +2.48904 2.80768 +5.77372 6.10692 +2.49363 3.24499 +1.8483 2.62965 +2.28556 3.22209 +3.17819 4.51426 +3.5548 4.23276 +3.25239 3.57895 +0.613317 2.44862 +3.82234 4.78976 +4.72809 6.46528 +9.54107 10.4426 +9.20052 10.1921 +8.24152 9.89817 +5.17594 6.19462 +7.83364 8.17082 +5.67992 6.36464 +8.9943 10.1426 +2.20598 3.0081 +3.38199 5.16464 +0.599928 1.35804 +0.841211 1.60761 +5.29338 5.89919 +1.11061 2.29219 +3.41512 3.95907 +7.9375 10.0203 +8.73852 9.66917 +9.95092 10.0162 +4.02544 4.30219 +4.1461 5.37827 +1.08089 1.59196 +7.87513 8.21121 +7.85673 8.0973 +0.96237 1.56519 +2.45532 2.61678 +6.1829 6.23637 +0.135135 0.613518 +3.18324 3.78587 +5.64796 7.20194 +0.861169 1.71661 +9.66005 10.1169 +0.880774 1.12452 +1.29389 1.57658 +5.60299 5.89759 +5.53642 7.07306 +0.540268 1.31836 +6.60244 7.98105 +4.21877 4.57159 +3.15367 4.75356 +7.81055 8.40378 +8.00942 8.10861 +5.78071 6.35646 +3.15993 4.99293 +2.36526 2.78444 +8.1361 8.76071 +1.40066 2.96474 +-0.17906 1.05877 +5.94933 6.6808 +3.43187 4.05553 +3.02912 4.68942 +2.1506 2.29413 +2.3516 2.38305 +2.87496 3.0851 +6.71294 8.99858 +3.76177 5.52545 +1.58417 2.57063 +2.74646 4.27445 +5.48407 6.60696 +-0.133321 0.716559 +3.53886 3.58196 +2.28729 2.40198 +-0.209646 1.21263 +6.62795 7.32318 +0.714781 0.880466 +2.96831 4.05932 +6.00935 6.38896 +5.39798 6.11983 +8.47679 9.70468 +1.4339 1.74845 +2.35223 4.75732 +4.31357 4.9642 +5.26493 7.70538 +7.91888 8.94851 +6.51439 7.69469 +7.69015 7.85411 +3.94274 5.15373 +6.25852 7.32402 +2.73567 3.43236 +7.09564 8.42242 +2.55932 4.29066 +1.79489 1.84559 +8.86427 9.35669 +7.23854 8.27062 +7.8488 7.98307 +0.710888 2.22424 +0.0413624 1.10578 +1.54302 1.97696 +1.64924 3.01081 +8.15535 10.2397 +0.305662 1.63835 +8.20375 9.03123 +1.66617 2.08748 +4.01691 4.88505 +3.32856 4.10709 +5.15342 5.44616 +5.80751 7.38872 +0.485341 1.07648 +3.98267 4.20211 +6.96867 9.37655 +9.48055 9.85181 +8.39277 9.50424 +2.47589 2.79873 +3.48046 5.37417 +4.98279 6.01686 +1.29845 2.31199 +-0.204348 2.50289 +0.23488 1.00378 +6.26899 7.14823 +4.62903 5.49672 +0.199052 0.822066 +6.97297 7.69083 +4.23783 4.65198 +0.530497 0.839143 +6.61355 8.22831 +-0.0103941 2.16307 +0.148601 1.20044 +0.314438 0.67632 +3.43415 4.06208 +1.95498 3.25728 +4.23094 4.84942 +9.5493 10.0057 +2.64964 3.52073 +8.21388 9.1622 +-0.112496 0.47622 +7.97551 8.19546 +2.16155 2.6289 +0.38442 1.46032 +3.85675 3.91557 +1.00605 1.42016 +2.4853 3.53086 +-0.0765625 0.504366 +8.11302 8.46334 +7.18135 7.80218 +6.46466 8.12336 +3.75968 5.33954 +9.08789 9.73677 +6.47459 7.49454 +0.90148 1.47681 +3.44733 3.54163 +7.32968 7.909 +1.30055 2.75407 +8.78735 8.92461 +8.21764 8.59414 +0.888162 1.08404 +5.65195 6.26421 +6.23881 7.33284 +8.69731 9.88088 +3.55695 5.36909 +6.49248 7.02755 +2.31407 3.01952 +5.7803 6.1286 +6.30415 8.01577 +7.73864 8.27496 +0.741078 1.69184 +4.94671 5.68254 +3.28226 5.02894 +1.97446 2.60413 +3.26555 5.54754 +2.56179 3.41897 +3.20058 3.32486 +6.96915 7.69055 +6.89302 7.39856 +1.9659 2.61404 +1.31107 1.36867 +6.23573 6.33677 +0.17616 0.517772 +8.55548 8.79155 +9.61632 10.2651 +2.20331 2.34017 +6.93195 7.42939 +1.25398 2.23119 +1.06577 1.41048 +5.99156 7.09818 +3.34821 4.1271 +4.61618 6.90956 +2.30853 3.52875 +0.0518063 0.113732 +5.38513 6.09734 +1.73468 2.64838 +7.24679 7.63999 +4.18175 5.06728 +7.09602 7.13414 +9.06191 9.11605 +6.2309 7.67675 +3.96576 4.63237 +-0.552645 1.37948 +5.76964 6.89903 +4.9272 7.5832 +4.59003 6.49719 +4.12281 6.9664 +5.12256 5.58387 +1.78859 2.76954 +4.36808 5.05712 +8.41165 9.54483 +8.11513 8.43405 +8.42016 9.52715 +8.50598 9.34564 +1.80028 1.83558 +8.08502 8.43726 +6.96667 8.12021 +5.4726 6.26772 +7.1141 9.29989 +7.83324 8.1744 +8.74368 9.16491 +2.5515 3.01706 +5.92375 6.44495 +7.45628 8.41582 +9.04829 9.71503 +4.58856 4.75356 +7.26064 7.32462 +1.81695 2.40529 +6.88067 7.95052 +1.91408 2.02663 +1.32005 1.45025 +7.47733 8.42004 +4.99403 5.85297 +0.95744 2.28875 +-0.089503 0.536888 +1.09978 2.48865 +1.9959 3.098 +0.376116 0.448329 +3.98908 6.49684 +9.10178 9.51012 +5.41394 7.31529 +6.60708 7.59071 +4.38466 5.76203 +1.84355 2.60304 +0.658705 0.933522 +6.98725 7.05509 +5.60064 6.98804 +1.0603 1.1521 +4.06192 4.46156 +0.351018 1.00807 +9.17113 10.2192 +6.71641 6.74659 +8.85392 10.5272 +4.50816 5.22908 +1.13934 2.43196 +3.3746 3.57576 +7.62137 9.3234 +6.93482 7.16058 +5.66506 6.44324 +5.13364 5.86068 +1.97257 2.03803 +2.69746 2.73067 +0.989591 1.38342 +4.18819 4.69676 +4.31608 5.12265 +2.79556 4.87763 +3.55387 5.34421 +-0.112466 0.585639 +2.43156 2.70221 +5.88314 7.08322 +-0.450332 1.29858 +1.22202 2.46588 +6.74433 7.32925 +5.14596 5.37435 +6.76754 7.41799 +1.48762 2.45958 +4.57241 5.3382 +4.17465 5.02296 +6.48856 7.5576 +0.383566 0.823394 +8.50875 9.08734 +1.79393 2.24548 +5.06812 6.49508 +3.55364 3.61502 +5.58973 6.58885 +0.631097 2.10041 +0.323995 0.941782 +8.8798 10.1036 +6.37114 6.88202 +6.9393 7.83288 +3.09503 3.41759 +3.65269 3.70305 +5.61676 5.8924 +1.90199 2.38446 +4.23683 5.35609 +9.18649 9.88878 +8.28736 8.37734 +3.04805 5.03593 +8.02926 8.38975 +3.58161 4.01331 +3.20923 3.48207 +6.85118 8.78281 +5.06518 7.49843 +1.57456 3.05552 +3.0154 4.23782 +2.83557 3.24854 +1.29358 1.89328 +1.42911 2.72661 +3.17067 3.96651 +0.353554 1.48472 +3.46227 4.25611 +6.17639 7.24657 +5.60878 7.13562 +4.11129 5.52476 +9.17596 9.4123 +3.08339 3.65766 +4.083 4.63013 +0.628465 1.92141 +7.81989 8.39386 +3.35589 3.87531 +5.35974 5.41743 +4.48321 4.64376 +0.888177 1.37343 +8.49061 8.50063 +5.09078 6.01801 +9.65314 9.99342 +1.60502 3.0115 +1.37928 2.77642 +6.60322 8.94046 +6.74573 7.45157 +-0.291156 0.325249 +6.1518 6.66827 +5.38199 6.46959 +3.50128 5.22692 +1.31774 1.70159 +0.550546 1.48845 +7.51187 7.85496 +4.2014 5.23193 +3.88255 3.97209 +2.60555 2.84958 +5.15706 6.00036 +2.99284 3.27867 +0.395077 0.768383 +3.30863 3.60594 +0.0325231 0.379208 +6.55183 7.33346 +1.44554 2.95846 +0.245421 1.29751 +3.98808 5.41226 +5.90242 6.266 +4.11097 5.02597 +0.134753 0.929866 +0.609287 1.16311 +0.231832 1.06825 +6.22093 7.05584 +9.18429 9.80637 +0.544139 1.30185 +1.69143 2.90306 +6.75109 8.67893 +5.49641 6.76104 +8.91712 10.0271 +7.09126 8.12404 +8.82958 10.2847 +0.569249 0.69421 +3.59288 5.8053 +9.25068 9.4226 +8.51607 9.26259 +5.00906 5.17068 +1.83467 2.99102 +7.32006 7.64842 +0.405532 0.603773 +6.41882 6.60495 +0.721592 1.44375 +2.78393 4.46732 +7.14806 7.16117 +5.12868 5.27918 +2.74138 3.1737 +2.95394 4.26547 +7.82827 8.21028 +9.06982 10.7279 +0.108376 0.290131 +6.34574 6.97141 +4.39022 5.50801 +7.98339 8.79674 +3.80026 4.71831 +5.43594 5.66916 +1.6743 2.61476 +4.29763 5.47402 +7.95714 8.69311 +3.4152 3.7387 +8.01715 8.8941 +6.53723 7.44437 +-0.0222108 1.04503 +4.96242 6.01648 +1.70885 1.75511 +7.62434 8.53526 +6.82863 7.39782 +8.19967 9.22283 +1.99719 2.11323 +-0.0124079 0.240201 +4.48577 4.87935 +2.586 4.41666 +6.37848 6.67092 +4.39606 5.67983 +9.39761 10.1095 +7.10866 7.15796 +3.91993 4.52129 +5.10552 5.36997 +7.08963 8.32694 +9.12669 9.58509 +9.26894 10.1974 +0.737413 1.26523 +2.77833 5.28516 +3.19039 4.36857 +4.32954 5.45614 +4.98069 5.49295 +7.54745 8.76142 +5.70425 7.05749 +-0.250513 0.36578 +4.76997 5.89607 +2.03075 2.32111 +6.54141 6.55896 +4.19799 4.45091 +8.7796 9.11915 +5.75014 6.05646 +5.36885 5.42775 +-0.00433056 0.865304 +3.65169 5.4751 +0.23625 0.872926 +0.0386337 0.792214 +4.40245 4.56789 +6.44567 7.42162 +5.51394 5.98005 +3.50146 3.83147 +8.47573 9.85647 +7.91378 8.47044 +9.44297 9.90241 +5.962 6.68782 +4.49034 4.86927 +2.17774 3.47061 +8.80614 9.26595 +7.92096 8.13838 +7.80209 7.93317 +7.78915 8.29735 +6.98111 7.162 +0.491059 1.14901 +8.97965 9.38792 +3.30207 3.53207 +3.17127 4.43581 +3.97564 4.43746 +6.79008 7.17877 +5.61669 7.51263 +4.0853 5.38748 +4.42181 6.32041 +8.08599 8.9095 +2.46938 2.55499 +1.20692 2.06351 +1.98995 2.35216 +8.17116 9.17158 +7.53414 8.37086 +3.7744 4.46197 +3.29464 4.38 +7.33246 7.81959 +4.89572 6.2831 +-0.152496 1.56427 +0.636242 0.938556 +5.62066 6.06096 +9.42994 10.473 +8.95446 9.46311 +0.277891 2.80311 +6.92968 7.29845 +2.75677 3.02975 +2.2859 2.51308 +2.96683 3.03857 +6.44584 6.49518 +8.33607 8.60407 +7.20303 7.7616 +7.07205 7.46849 +2.35677 2.7904 +5.86404 6.12906 +2.42371 4.62735 +3.27237 4.11016 +0.0668578 0.644021 +6.77371 7.45187 +3.66596 5.21874 +0.718034 0.755944 +6.06162 7.05 +6.91473 7.09753 +5.0749 6.08914 +0.759874 1.11978 +8.54591 9.64997 +3.97266 4.70679 +1.51133 3.17164 +7.21772 7.69877 +8.00719 8.37052 +0.284003 0.38001 +4.08842 4.16227 +5.04461 5.79973 +4.60604 5.31979 +2.2461 2.28157 +6.25631 7.69766 +9.12404 9.67586 +7.73134 8.98923 +1.0513 1.46408 +9.17225 9.42567 +3.66795 4.29168 +8.84403 9.28497 +9.93613 9.94729 +3.16615 5.09374 +-0.149675 1.43397 +2.30855 2.48392 +0.843172 0.951801 +8.32945 8.8506 +8.97012 9.94697 +2.8559 2.92359 +-0.321715 0.89173 +7.48565 7.71775 +1.44301 1.47795 +6.6649 6.76187 +9.10721 9.93599 +1.82207 3.03935 +3.61893 4.5306 +2.53746 3.81243 +0.424528 1.29026 +9.51874 9.68841 +7.94954 8.14396 +7.49282 7.52655 +3.04604 3.69656 +9.45461 9.47212 +7.69209 8.16412 +0.607135 1.16564 +0.150291 0.450632 +3.28914 4.01085 +5.45597 6.02921 +8.16157 8.36605 +9.76573 10.2325 +0.151994 1.07074 +1.3748 1.68548 +2.29854 2.63593 +7.92162 8.68895 +1.28795 1.61949 +7.85469 8.26683 +4.32268 6.33174 +6.13964 6.3596 +1.25714 1.88002 +2.05006 2.28294 +8.31864 8.34151 +9.0613 10.0715 +-0.041568 0.25139 +6.79984 6.81686 +5.10674 5.70583 +5.92937 7.01652 +7.57649 8.05834 +0.937157 2.25362 +7.48567 7.59746 +2.33403 2.88942 +7.3805 7.73421 +5.586 5.75327 +0.828854 2.12988 +8.22741 8.59954 +9.69214 10.1207 +6.55359 7.08114 +1.85342 2.634 +6.08756 7.28893 +6.34993 6.93474 +8.93548 10.1463 +5.49445 5.8338 +1.47951 2.14646 +2.62089 2.75888 +2.35352 3.10539 +4.98774 5.28931 +4.92239 5.40697 +7.52674 8.78948 +4.52451 4.83819 +5.45854 5.75838 +5.51553 6.3901 +4.82905 6.44407 +6.20655 6.4483 +5.68116 7.06109 +7.97301 9.15827 +8.8854 9.91623 +9.60198 10.2449 +1.93322 2.67684 +0.441852 1.87646 +5.19981 5.71385 +2.54799 2.5809 +4.34591 5.02655 +7.54678 8.75202 +6.1496 7.19033 +1.13658 1.30756 +1.38724 2.08252 +2.13624 2.30419 +8.49196 9.41369 +-0.21387 0.685093 +2.47875 4.19982 +3.69093 4.00543 +5.70643 6.50331 +7.07443 8.83588 +6.85756 7.68937 +1.69241 1.83242 +0.140565 0.502156 +2.15007 3.23784 +4.97403 5.69757 +5.08315 6.25554 +3.45026 4.01942 +3.37482 4.73009 +7.4154 8.34013 +6.95399 7.59768 +8.07995 9.86199 +8.43993 8.88645 +7.66844 8.12742 +-0.0200687 0.435846 +4.47984 5.9416 +7.66804 10.0801 +4.14578 5.98717 +0.256533 0.89254 +6.43216 7.4474 +3.60295 4.79419 +3.90129 4.29812 +5.30606 5.58674 +9.11552 9.79229 +5.60702 5.85299 +2.39514 2.64865 +4.51164 4.60227 +6.31154 6.77441 +3.12239 3.13505 +7.50962 7.89478 +3.90928 4.88831 +9.64625 10.0629 +5.9465 6.02877 +2.08554 2.10477 +0.087547 0.34748 +2.34295 2.53703 +6.846 7.3043 +1.37869 2.11446 +4.03371 4.26278 +5.38623 6.40917 +4.75848 6.25417 +6.03478 6.15991 +-0.585543 1.2091 +2.52824 3.57712 +3.95687 5.40914 +4.42955 4.71909 +2.9328 3.98848 +5.40471 6.97056 +7.64789 9.30279 +6.19595 7.07492 +8.27328 9.41596 +8.29855 9.13665 +2.54035 3.10488 +8.25038 8.87903 +5.66599 5.88701 +7.40067 8.71195 +6.63762 6.67694 +-0.0163105 1.72666 +4.77743 6.60356 +0.567991 1.14977 +5.96841 6.42987 +3.02266 4.58424 +6.72121 7.35492 +7.51477 8.65223 +8.55055 8.81014 +5.59759 5.82816 +0.218944 1.82542 +1.03197 2.36652 +7.84302 9.1594 +2.11542 4.7332 +6.37618 6.92981 +1.34963 1.59353 +0.516281 1.08859 +-0.0151152 0.0624718 +6.45603 7.23063 +4.76865 5.46588 +7.5893 8.42021 +1.04534 1.99034 +2.62638 3.04997 +5.00254 5.98512 +7.7588 9.44547 +6.82186 7.34321 +8.7629 9.82272 +-0.309554 0.54858 +4.19843 4.92981 +5.62327 6.80846 +6.40599 7.6073 +6.1547 6.53898 +3.93941 4.44985 +3.28342 3.72778 +7.17256 7.23035 +2.31269 3.05437 +7.99132 8.20926 +7.19338 8.08381 +7.29139 7.96441 +4.25818 4.4208 +0.802894 0.81938 +0.990115 1.04066 +0.443898 0.490936 +3.44459 3.95977 +9.07812 10.3145 +7.86709 8.26338 +-0.230114 0.390748 +7.50905 8.49199 +-0.715424 1.97535 +2.92248 3.12903 +5.44209 6.62431 +0.991914 1.99037 +5.92275 6.7724 +9.10818 9.2797 +4.46434 4.83462 +4.21122 5.48353 +1.8721 3.40764 +7.04713 7.60526 +3.76581 4.76317 +7.00667 7.36475 +6.87244 7.39431 +7.6349 8.46695 +-0.0728922 0.351194 +5.02925 5.6834 +1.45779 2.83702 +0.339175 1.46574 +6.40414 6.9165 +6.30401 6.91007 +5.6392 5.78172 +5.63288 6.44639 +7.45285 8.89031 +4.09741 4.57929 +8.76728 9.06448 +1.62324 1.84552 +5.72509 6.54553 +8.65273 10.3652 +7.3362 7.8953 +8.96224 10.3113 +0.217316 1.7827 +1.28523 2.90127 +8.78746 9.11602 +8.6075 9.9606 +-0.647788 0.779976 +4.9702 5.47602 +4.15553 4.57497 +1.08174 2.80993 +4.01011 4.8145 +6.79603 7.2317 +4.3711 4.43566 +9.65087 9.79922 +8.19407 9.21784 +3.04008 4.94094 +6.0883 7.23919 +6.88708 6.97172 +0.438073 2.00665 +8.53083 8.83004 +4.22258 4.65233 +6.72856 7.61085 +3.17591 3.18978 +5.07955 5.6938 +2.09043 2.55351 +3.28085 4.43556 +7.29225 8.03925 +7.78034 7.82608 +6.59677 7.67719 +5.56032 6.38139 +8.72663 8.82535 +2.96505 3.11983 +1.67192 2.11727 +7.85386 8.49025 +6.30965 6.72799 +8.53082 9.3801 +2.8976 3.39972 +8.90427 9.44661 +-0.0665785 0.410254 +4.58099 5.81135 +1.88015 2.21838 +3.38693 4.10149 +7.46378 7.68246 +8.80985 9.72212 +6.54877 7.25642 +7.18249 7.71509 +7.41978 8.64805 +1.00839 1.78626 +0.39421 0.526751 +7.13516 7.28317 +7.28011 7.80573 +1.90158 2.49032 +1.66181 4.17994 +8.81106 9.21133 +9.46151 10.5007 +0.52585 0.575082 +7.66495 8.64072 +7.72794 8.50991 +4.92409 6.23879 +2.28769 3.21774 +3.62671 4.40932 +5.77688 7.31314 +8.94253 10.0664 +0.416618 0.635111 +1.81377 2.41356 +7.91755 8.83363 +1.62715 1.82626 +8.22065 9.51656 +0.020228 0.724724 +8.81119 9.95764 +8.66509 9.61079 +5.28201 5.32152 +3.95724 4.22138 +7.09339 7.77685 +9.63428 10.1514 +3.69117 3.779 +3.82195 4.76757 +5.75824 6.62265 +3.69984 4.75163 +3.58259 4.8788 +8.32635 8.85873 +5.81959 7.32506 +8.11265 9.14304 +2.20118 3.32511 +7.79582 8.52691 +6.5891 7.13584 +0.385393 0.440656 +1.13414 1.9951 +1.76482 2.69977 +4.76194 5.82757 +6.33633 7.5348 +4.7663 5.65083 +1.98298 3.01285 +0.956973 2.38629 +5.60955 7.65827 +9.11064 9.14351 +2.99933 3.37975 +3.36304 4.57437 +3.89886 4.50733 +8.73838 9.3514 +9.11824 9.66042 +1.47961 2.93909 +0.615297 1.13217 +1.70646 2.32478 +4.35168 4.99362 +0.986601 1.18332 +4.01551 4.92342 +7.68944 9.86838 +4.47611 4.85316 +0.051839 0.86288 +3.59624 5.5628 +7.08729 8.90374 +9.53464 9.9196 +4.69871 5.74189 +8.43146 10.6889 +3.23774 3.77777 +9.35399 9.62741 +1.15259 2.69451 +6.6368 7.33773 +5.26395 6.09857 +6.87415 7.21717 +-0.925645 1.06118 +8.49641 8.67659 +2.31486 3.25354 +2.51057 2.58303 +0.921997 1.48762 +6.29777 6.74738 +4.03945 4.27305 +7.1668 7.3471 +8.44572 8.80343 +7.16937 7.84526 +8.89008 9.4332 +7.01815 7.66319 +-0.420804 0.982878 +1.59755 1.64672 +0.700814 0.72579 +6.3138 7.37379 +8.49276 9.93522 +-0.795656 0.819657 +0.772253 1.05926 +0.917593 1.3917 +3.30076 4.12274 +-0.0237176 0.260552 +6.82385 7.49119 +6.98638 7.52012 +8.24915 9.08397 +4.17486 4.25908 +3.08435 4.64404 +8.17114 9.91412 +8.95923 9.3751 +0.596707 1.89462 +0.982917 1.40236 +6.79552 7.36657 +8.2599 9.69551 +8.85126 10.4342 +7.98967 9.14514 +0.766355 1.63286 +7.76211 7.99247 +5.23163 5.89338 +4.4707 5.50457 +9.257 9.27862 +2.11049 2.59654 +1.65501 2.06238 +0.551768 2.10873 +0.0285582 0.194421 +3.66153 3.85615 +5.07097 5.55806 +5.29145 5.80735 +2.03499 3.0863 +0.73171 2.29494 +2.63023 3.6417 +6.17478 6.25997 +5.79646 6.46363 +9.10633 10.5516 +7.23415 7.84823 +6.49951 7.1506 +9.94647 10.0242 +7.91236 8.09097 +7.8127 7.97662 +3.34238 3.42907 +8.50796 9.8311 +8.75792 8.98028 +9.34125 10.4441 +2.84413 3.71602 +1.49884 2.35652 +7.52317 9.18955 +9.5587 10.3525 +4.85436 6.1181 +5.91369 6.12194 +6.88463 8.34471 +1.51952 2.99156 +4.29022 5.12674 +8.0229 8.41246 +2.44841 3.04779 +7.59975 7.91485 +2.74491 3.62575 +0.0169968 0.240919 +5.85351 6.29039 +4.99825 5.93439 +2.153 3.35304 +1.19032 1.41763 +6.13337 7.80615 +7.05013 7.89364 +8.38056 9.92 +6.35525 6.64521 +3.93342 5.15885 +2.87656 3.47116 +3.56176 4.41159 +6.72084 7.9171 +8.03801 9.12442 +1.03329 2.56255 +7.64542 8.61709 +2.85627 2.89437 +8.8303 9.79838 +1.08032 2.34573 +7.51366 8.39169 +9.09685 10.3677 +6.753 7.41904 +-0.217662 1.42059 +6.72492 7.97553 +7.99325 8.8976 +0.765372 1.10894 +4.37958 6.04671 +8.72027 9.58928 +6.00234 7.29277 +8.43912 9.25356 +2.98816 3.17389 +0.4292 0.552167 +1.69827 2.80318 +5.99904 7.09981 +4.68367 5.87791 +-0.203208 1.09587 +2.65367 3.28472 +3.87051 3.88111 +6.36178 7.18853 +-0.0815935 0.200848 +6.82255 7.18488 +4.99295 5.08405 +2.67155 3.08447 +5.82099 6.77145 +8.76434 9.01086 +5.94982 6.18665 +3.23369 3.71743 +0.934129 2.73456 +1.13233 1.24208 +8.21931 9.03906 +6.25425 6.69972 +0.971299 4.21205 +5.68426 6.45281 +2.85786 3.3955 +8.17715 8.88439 +2.72802 5.01235 +6.12811 6.53711 +5.22878 6.45864 +0.453655 0.922032 +0.466162 0.85262 +2.40916 2.64759 +5.63583 6.37476 +2.18434 3.14105 +0.912811 2.08432 +8.9464 10.1515 +6.77323 7.27133 +0.7167 1.60579 +5.89813 6.32997 +7.66593 8.4611 +6.54145 6.88337 +5.95421 6.21188 +1.10383 1.92226 +5.37168 5.65707 +1.51874 1.66339 +4.60748 5.00384 +8.97354 10.5394 +2.05022 3.20373 +8.17316 8.19283 +2.33792 2.72643 +8.81577 9.3704 +5.95738 6.59855 +5.69025 6.17335 +6.91889 7.88142 +2.17529 2.81528 +6.65046 7.19698 +7.10694 8.78046 +2.09613 2.47484 +1.92423 2.25333 +-0.0906039 0.861376 +6.61481 7.70609 +6.7448 6.84276 +3.43655 5.28405 +6.05404 6.48902 +3.24637 3.36149 +5.69528 5.77157 +5.12352 5.31024 +7.65858 8.80828 +3.69209 4.4851 +0.25765 1.29637 +3.1537 4.13191 +3.12328 3.83765 +2.99798 4.8748 +4.49566 4.67827 +3.50822 4.03987 +8.00334 8.34084 +8.61039 9.00704 +0.0332147 0.166124 +4.55193 5.36546 +4.20308 4.31589 +0.955466 1.20095 +-0.382972 1.47625 +0.803913 1.01916 +3.78333 4.0707 +6.58604 6.70173 +3.02066 3.82562 +1.16515 2.2816 +7.87242 8.24214 +4.057 4.60368 +2.84714 3.59726 +2.77804 3.69136 +-0.139996 1.36416 +4.50647 6.37579 +8.86647 10.1549 +9.24372 10.1442 +0.743107 1.84722 +6.18761 7.65841 +0.214887 0.443938 +8.8513 9.55063 +4.04856 5.79916 +6.69671 7.10025 +6.97477 7.79702 +4.82551 5.10538 +0.821772 2.85828 +9.3086 9.74805 +5.45623 6.66668 +7.64296 8.67451 +7.53052 8.31024 +7.45352 7.5063 +1.31412 1.4979 +7.81176 8.48083 +0.228964 1.73207 +5.52579 5.93103 +6.58544 8.48938 +2.75407 4.18746 +3.21396 3.96298 +1.13806 2.34106 +0.899331 2.87945 +5.69016 6.61624 +2.48172 2.58082 +0.676004 1.43405 +3.41766 3.9503 +0.104554 0.298373 +6.50673 8.21831 +6.00349 6.69385 +9.62453 10.3147 +4.09379 6.02911 +-1.12803 1.68823 +1.83324 3.43133 +8.30576 9.09288 +-0.363911 0.405218 +1.91686 3.34928 +6.98331 7.15885 +-0.31591 0.996789 +0.145813 0.35408 +5.32016 6.13679 +6.99664 7.48644 +-0.140875 0.821045 +9.0119 9.19742 +1.69616 1.72453 +4.38064 5.07542 +6.85898 7.55478 +3.9145 4.27935 +5.77592 6.16806 +1.45345 3.01301 +4.13024 5.59662 +8.14557 8.41669 +4.00075 4.829 +-0.283024 1.59436 +5.92468 7.17507 +6.84458 7.18356 +1.06987 1.42839 +8.618 8.66235 +0.432802 1.59512 +3.78058 4.36051 +1.6113 4.21135 +6.73475 7.01057 +6.74819 6.90498 +6.93146 8.54681 +9.02605 9.91613 +3.888 4.00526 +1.07958 2.27915 +4.78456 5.10764 +3.92952 4.89555 +9.09348 9.30304 +6.73107 7.21036 +7.42366 7.73225 +4.04079 4.72919 +1.21726 1.34683 +8.82903 9.73504 +0.577663 1.00786 +1.56822 2.08675 +4.84315 5.44994 +1.01008 1.16524 +5.99782 6.01535 +0.996739 1.75305 +4.76128 6.39012 +8.93563 9.51972 +-0.0698166 0.453543 +5.9084 6.95139 +0.535401 0.692258 +4.80729 5.48335 +3.42581 4.76147 +3.58715 4.43541 +7.50236 7.71227 +5.19742 5.87901 +1.79752 2.43097 +7.29762 7.57608 +5.65169 6.47762 +6.02249 7.93642 +0.840131 2.81176 +6.2646 6.96911 +7.46014 8.17136 +9.79049 9.94054 +4.61094 5.35819 +7.30902 7.41873 +1.21883 1.84621 +6.41743 6.57736 +1.53114 1.62859 +6.73237 7.47083 +6.05618 7.56831 +7.63374 8.16821 +5.20839 6.05382 +0.619043 1.44065 +2.38657 4.88786 +3.88289 5.18788 +4.42283 4.51106 +9.15575 9.22388 +3.18678 3.72243 +3.20638 3.65935 +4.2219 4.97961 +4.63725 6.90959 +2.57123 2.59101 +4.08581 4.37325 +6.53926 6.80412 +1.77475 3.89149 +9.22854 10.426 +2.67375 4.36551 +3.17194 4.0433 +1.10304 2.0348 +3.67233 4.04957 +3.23526 3.5012 +5.17684 6.47301 +4.4 4.67662 +4.15842 5.85903 +5.88496 6.61616 +7.26489 7.51279 +4.17402 6.6997 +-0.540216 0.54573 +4.36063 4.60442 +9.18146 9.96239 +0.977216 2.42032 +9.09143 9.61178 +5.06686 6.23076 +2.04772 2.92048 +1.4154 2.00707 +7.80442 9.54824 +4.55549 4.7148 +7.56964 8.80172 +1.35347 3.21648 +9.12751 10.0605 +1.81735 2.06061 +5.63798 8.0918 +6.79492 7.98002 +9.23053 10.1299 +1.74639 2.02724 +3.71825 4.09879 +2.4995 3.42493 +4.1255 5.66758 +4.75493 6.99687 +8.22481 8.72036 +6.13689 7.53026 +5.41315 5.66358 +4.21425 5.62743 +6.22936 6.44392 +2.02303 2.96414 +-0.0655462 0.130508 +6.1487 6.70994 +4.36674 6.24985 +7.51129 7.63176 +7.9729 8.98613 +3.92117 4.15596 +4.54398 5.43399 +6.34248 6.92305 +-0.550253 1.16167 +9.15142 9.53717 +8.99354 9.65952 +6.28988 7.90053 +3.36505 3.782 +8.80005 9.70553 +1.99947 2.18573 +1.15023 2.07069 +0.253723 1.32958 +2.0392 2.93977 +2.89024 3.00836 +8.16735 8.2049 +1.49508 2.95258 +6.19092 7.44552 +2.33328 3.06758 +6.44166 7.4649 +7.34749 7.79488 +7.5557 8.04141 +2.76812 5.13617 +7.97308 9.25668 +4.73539 5.22234 +7.53377 8.41651 +-0.355405 1.36499 +4.72111 4.73744 +-1.22753 1.84842 +5.5033 5.63808 +3.95421 4.19313 +6.24752 6.98229 +4.49694 5.07277 +3.70871 4.30093 +1.31984 1.50116 +7.16044 8.70868 +2.44587 3.34659 +6.08322 7.20376 +2.75012 2.82555 +0.0394442 0.863634 +3.90896 4.73696 +4.77494 5.04158 +8.41473 8.82932 +1.7049 2.71024 +9.01684 10.1044 +4.57959 5.01066 +3.2484 4.21875 +1.11596 2.88792 +3.53616 4.14001 +5.80672 5.82478 +5.85844 7.70293 +6.18239 6.30124 +2.22913 3.23412 +2.97521 3.08481 +2.2749 3.70611 +2.3457 3.86609 +2.71695 4.04473 +7.22863 7.40115 +1.80428 2.39815 +1.80781 2.33028 +2.78662 3.14936 +9.40717 9.94906 +6.54968 6.80773 +2.76862 3.24492 +1.96034 2.87404 +3.53295 3.54927 +5.36042 5.67073 +8.63339 8.93752 +0.932415 1.70402 +4.32923 4.55594 +9.3491 10.4969 +0.121416 1.15499 +-0.172998 1.36319 +2.02349 2.29887 +1.75352 2.35329 +0.502555 2.01665 +6.71754 6.80014 +3.35175 3.93337 +7.17133 7.9851 +8.51299 9.95771 +5.86103 6.36734 +1.44593 3.46008 +4.49699 4.60855 +2.29261 3.10053 +6.68713 8.19499 +5.43776 6.84387 +8.58591 9.02134 +5.24746 6.15595 +1.3847 2.5074 +6.62143 7.07775 +1.7101 2.077 +9.70898 10.2789 +6.67451 7.92058 +2.56858 3.60374 +1.61917 2.60482 +1.77902 2.16908 +4.76209 6.00461 +3.8894 3.98269 +7.0278 7.276 +5.4866 5.59417 +1.69306 2.92506 +2.45744 3.76592 +2.5689 2.80611 +5.98283 6.06154 +9.5267 9.9626 +9.55652 10.4128 +6.6111 6.64606 +3.38826 4.26111 +3.61887 3.73455 +4.14924 6.13796 +7.15863 7.28212 +5.78984 6.56662 +2.09304 2.2681 +4.39867 4.88557 +6.20907 6.81034 +4.63336 4.91476 +0.939805 2.43621 +1.56774 5.13599 +8.40908 9.82058 +2.06273 2.20306 +2.53524 5.01482 +2.9314 3.23661 +2.48535 3.47368 +0.366389 1.4699 +8.81131 9.01654 +2.05102 2.87972 +1.9699 2.22723 +6.18333 6.98224 +1.3425 2.4443 +0.767883 1.77423 +3.1538 3.43248 +0.891006 0.903458 +5.7136 5.8713 +0.437569 1.37539 +3.98533 5.01646 +8.65764 9.89518 +3.74889 3.98561 +7.74507 8.30657 +8.24671 8.43006 +6.88467 7.42036 +1.99426 2.03522 +1.90486 2.04181 +1.12911 1.71807 +9.25253 10.105 +1.92989 2.0346 +5.60044 6.25585 +9.16848 10.087 +6.67824 6.72257 +1.88522 2.80222 +0.242758 0.852689 +5.09249 7.71484 +5.54974 6.44414 +7.66767 8.72936 +3.48884 3.83156 +3.4697 5.14646 +8.48582 8.7692 +6.76259 7.06897 +7.83856 8.62005 +5.81853 6.76571 +2.04803 2.94439 +6.85396 7.22985 +6.52449 7.39764 +9.26838 9.34809 +4.64449 5.64975 +7.51845 7.80279 +-1.27268 1.65344 +0.686101 4.20373 +7.80552 8.37119 +7.20419 8.35284 +9.33962 9.87975 +4.31238 5.58683 +2.39198 3.84398 +1.29248 2.59269 +4.71612 6.195 +5.27332 6.52174 +7.71492 7.84702 +8.18064 8.72233 +1.55223 2.31294 +6.34374 7.31758 +6.48966 6.92611 +2.62268 3.09895 +4.09064 5.06197 +2.66367 4.12126 +1.53391 2.93092 +8.64516 8.70655 +9.20047 9.28957 +4.00474 4.11716 +8.5418 9.45901 +8.73386 9.73253 +9.22596 9.63179 +1.34204 2.7834 +8.4489 9.21027 +7.75158 8.51085 +5.98856 6.11212 +1.29906 2.08111 +9.24315 9.76291 +6.84345 6.91607 +5.88294 5.90545 +3.03022 3.39941 +3.22222 3.4089 +1.12791 1.65898 +6.70232 7.36336 +8.60042 8.82377 +1.26451 1.30362 +2.76682 2.92693 +1.54763 2.19582 +6.5865 7.24173 +4.15242 4.21742 +8.39615 8.78524 +1.67017 2.08717 +9.03012 9.97041 +2.31463 2.45877 +8.29872 8.51813 +1.66689 2.51919 +-0.807606 1.47794 +1.31452 1.94418 +0.0739222 0.512106 +4.23577 4.25889 +7.45273 7.97505 +3.34234 3.46608 +7.97304 9.14131 +1.9029 2.99946 +8.84087 9.79689 +4.92769 5.68685 +2.74004 3.04513 +0.889257 2.20448 +3.10574 3.9758 +3.91547 4.32303 +7.17475 8.07377 +5.92903 8.03738 +1.57974 1.65527 +3.76339 4.2285 +2.28263 2.7559 +9.53105 9.87477 +2.10154 3.2222 +4.23683 5.34347 +1.38769 2.48482 +5.39838 5.51872 +8.50975 10.1382 +8.04108 9.21474 +8.5252 9.67823 +8.893 10.7726 +7.1294 8.18211 +1.15642 1.73882 +0.436911 0.756698 +3.66142 3.71659 +6.37686 6.7 +8.88506 8.99896 +2.31891 3.79061 +2.61615 2.81909 +1.35216 1.39571 +3.04217 3.52564 +7.8409 9.34099 +0.470596 1.49157 +6.94014 7.18365 +8.05483 8.49979 +8.18511 8.25608 +7.03597 8.45251 +2.47411 2.65172 +0.112716 0.193057 +4.45039 5.10584 +4.53906 5.80013 +5.11702 5.27151 +1.24211 1.90757 +4.64114 4.72912 +1.77254 3.45037 +-0.1275 0.99675 +5.69637 7.67722 +2.21252 2.44032 +3.89623 4.40192 +2.79904 3.15569 +8.37911 9.42424 +5.27199 6.2026 +1.84791 3.75411 +0.522801 0.54806 +3.83644 4.64785 +6.65497 7.55638 +6.75104 6.98564 +2.34979 2.98049 +8.27176 8.60459 +5.07773 5.44064 +1.16934 1.98872 +4.2914 5.37557 +6.83462 7.95408 +3.91405 5.73229 +7.77473 8.53538 +9.23441 9.90185 +4.03659 5.2473 +5.99336 7.8004 +4.2432 5.89276 +6.39847 7.81276 +9.13909 10.4164 +1.12009 2.5649 +2.35157 3.18468 +4.46918 5.55572 +3.82512 5.53666 +7.18238 8.10193 +8.40911 9.23639 +8.99555 10.4192 +6.69547 8.87825 +4.79012 5.34858 +9.23615 10.0986 +-0.590587 1.14603 +2.74289 3.48244 +-0.248403 1.1591 +3.35663 3.7229 +7.37504 7.6481 +6.64796 7.64695 +0.778081 2.41212 +4.49242 4.7772 +8.01419 8.109 +6.6494 7.76619 +8.86331 10.1205 +0.817273 0.937855 +8.00019 8.21556 +6.19405 6.54794 +6.11798 7.30421 +3.40164 4.28921 +5.31927 6.21584 +2.79377 3.40938 +3.59494 3.90321 +7.79218 10.3132 +2.99546 3.86111 +1.71916 3.40283 +6.1768 6.81915 +7.59629 8.68568 +1.59724 2.348 +6.20151 6.5391 +6.30798 6.70478 +0.489786 1.51322 +1.28396 1.86775 +5.18031 5.43007 +6.61276 7.70565 +1.4909 2.11165 +4.56163 5.49277 +1.93598 4.35147 +3.65568 5.00224 +1.68028 2.00363 +7.82874 8.67399 +1.23053 2.87598 +-0.164275 0.194491 +2.58349 4.01302 +1.23279 2.02984 +0.599702 1.09257 +9.50965 9.80164 +2.33108 3.58037 +4.38659 4.62378 +2.65097 2.87349 +0.0537058 0.576502 +4.20415 5.15693 +5.41458 5.98382 +4.37747 5.10347 +2.62536 2.70073 +6.96845 8.15356 +6.91533 8.41638 +9.36431 9.58863 +6.13019 7.25915 +2.7818 3.4951 +9.44641 10.1301 +2.68817 4.19772 +5.65664 5.6814 +8.25308 10.498 +3.50374 3.64458 +1.47063 1.78567 +8.21901 8.98152 +3.99261 4.47339 +2.51395 3.38788 +4.66178 5.24959 +9.08415 10.3467 +5.92351 7.20447 +1.74145 2.35957 +7.62653 8.96797 +6.43542 7.68775 +5.49047 6.56355 +4.9225 6.22555 +0.257967 0.704837 +3.42488 3.52873 +8.67606 9.77824 +5.12981 6.37856 +5.97359 6.32151 +1.58517 2.28129 +0.530687 1.54545 +7.04056 8.15296 +1.8541 3.1902 +9.46286 10.0098 +3.17967 4.02237 +3.49966 3.80271 +6.24894 6.49618 +1.19944 1.59215 +5.30422 6.94823 +7.49137 7.78584 +7.02669 8.16282 +2.21673 3.36471 +7.66183 8.34763 +4.13876 4.87421 +3.0199 4.07124 +8.40439 8.82943 +-0.274649 0.429602 +6.11215 7.65609 +3.34781 5.03006 +1.28231 1.77258 +7.57256 8.59456 +5.36208 5.81735 +7.18511 8.96618 +8.86053 9.49567 +5.39097 5.93211 +6.59094 7.26553 +3.69159 4.01914 +8.73797 8.81611 +1.41144 1.82827 +7.83555 8.07567 +6.13821 8.44907 +5.83432 6.48744 +2.93596 4.66271 +7.03215 7.59658 +1.65252 2.45337 +2.91358 4.90129 +8.94415 9.14642 +5.21005 6.1166 +0.33225 1.17039 +7.40089 8.07586 +9.30427 9.40776 +2.34188 2.81124 +1.02811 3.3344 +6.28117 7.62089 +4.80105 7.10049 +8.90252 10.0057 +2.20932 2.33093 +8.20746 10.6268 +4.31887 5.23945 +9.258 9.8985 +3.80742 4.15057 +1.11313 1.23711 +9.53067 9.70165 +7.95467 8.67187 +9.66031 9.83223 +3.61385 4.09571 +0.623148 0.652817 +7.77809 8.62118 +0.86157 1.98606 +3.12528 3.75815 +1.9363 3.22621 +8.23521 8.99175 +8.95406 10.4487 +3.38526 3.90652 +0.34281 2.0226 +0.739384 0.793829 +3.55637 3.96384 +6.1562 7.28647 +5.30211 7.51385 +1.46275 1.78688 +-0.0144662 0.868488 +0.0740443 0.119828 +9.26206 9.83923 +0.743397 1.40754 +4.68823 6.62985 +8.8291 9.17373 +4.66711 5.09313 +4.023 4.44994 +5.68937 5.79194 +8.04835 8.06763 +6.94662 8.00075 +0.774686 1.13428 +0.381819 2.34757 +2.1235 2.63524 +5.42795 6.89998 +6.07662 6.29083 +6.47821 6.7872 +2.58305 2.6192 +-0.598336 1.23458 +4.29089 5.43332 +8.09914 8.28229 +5.05925 5.35258 +0.181705 0.444466 +3.27849 4.79932 +0.310314 1.43125 +1.13836 2.76825 +1.2529 4.09336 +0.198106 0.608625 +1.77442 2.23777 +6.29823 6.64574 +1.22125 1.37929 +1.77592 3.04011 +1.43999 2.90926 +4.20495 5.32396 +4.98874 5.33211 +8.36483 8.67875 +5.65373 7.14132 +2.8303 3.05037 +3.41509 3.54032 +7.21702 7.85857 +5.79848 5.8913 +4.52711 5.65511 +2.04663 2.66919 +5.76363 6.77903 +-0.153046 0.77878 +4.37474 4.49936 +6.86786 7.81999 +8.92084 9.16368 +7.5975 8.56954 +0.197493 1.07503 +3.99803 4.67019 +9.35123 9.60094 +1.46442 2.4256 +5.21501 5.79612 +8.80879 8.99085 +-0.109252 1.30631 +7.34965 7.87947 +7.08703 8.12723 +0.985946 2.14663 +0.48521 0.856118 +6.57719 6.70623 +8.71165 8.72286 +3.16883 4.8714 +-0.21189 0.412944 +3.6526 4.37121 +0.364649 1.3363 +9.27722 9.35135 +3.47517 3.8793 +5.67149 6.28631 +6.52789 6.61039 +9.36323 10.4189 +4.30743 6.18638 +7.93653 9.4877 +8.24024 8.41475 +2.75692 3.13935 +8.80223 9.1489 +3.42656 3.90557 +8.96598 9.3217 +1.99582 4.84803 +5.1178 5.8688 +4.47901 5.73433 +7.30397 7.85527 +0.18463 0.656832 +7.80806 8.41666 +8.50023 9.42628 +7.67563 8.64756 +9.46783 9.52169 +2.06797 3.3107 +5.08863 5.10167 +0.82146 1.39055 +7.5428 8.04736 +9.09407 10.8208 +9.15219 9.99706 +1.61637 3.46354 +5.3812 5.96247 +9.34115 9.73575 +6.49221 7.30031 +1.56337 3.39704 +8.463 8.60841 +-0.322779 0.658242 +8.50173 8.72125 +0.854851 1.83405 +7.81945 8.12841 +2.60724 3.19985 +5.03714 5.55331 +1.85041 3.36816 +7.26119 7.64364 +5.75223 5.99653 +4.00026 4.43863 +5.00939 6.03009 +6.22879 6.6638 +6.44231 7.18622 +1.66002 1.88587 +2.59781 2.84919 +4.96399 5.40545 +5.70327 6.95018 +6.97141 7.08346 +3.98535 4.6179 +5.96795 7.14997 +5.07581 5.8262 +4.65665 4.98851 +8.65646 8.70986 +3.04175 3.19155 +0.796073 1.0952 +8.24859 8.57828 +5.26952 6.34245 +7.94685 8.78542 +0.193963 0.968524 +6.61159 6.80186 +9.37533 9.79195 +8.94048 9.74959 +5.77272 6.48616 +6.0092 7.86718 +2.52621 2.58938 +8.91347 9.22421 +4.20466 5.45909 +4.82157 5.09167 +7.35464 7.36611 +5.12413 6.45063 +2.12404 2.81187 +8.88875 9.20752 +2.59731 3.20587 +1.54772 2.08968 +6.70449 7.08952 +-0.0967146 0.888521 +3.10207 4.34815 +1.20807 2.35497 +6.00753 6.08492 +3.21837 4.00446 +4.34095 6.0963 +4.24821 4.79576 +4.49523 6.6669 +1.49483 2.52552 +0.0411497 0.641526 +8.3854 9.20954 +8.12419 8.93702 +0.0201515 1.06914 +1.57617 3.44176 +1.4173 1.76847 +5.42261 6.51539 +6.6744 8.46109 +3.05234 3.59179 +6.49059 7.24618 +7.01989 7.69901 +2.34664 2.90601 +9.17324 9.86754 +5.50919 5.70258 +2.40486 4.6009 +3.74368 4.00093 +6.9211 7.33554 +7.41358 8.7413 +8.78284 9.62033 +2.96753 3.01602 +-0.200693 0.535532 +6.4383 6.45049 +8.28835 9.42148 +4.2379 5.35128 +4.68397 5.04593 +5.7185 7.03177 +5.37494 6.43977 +2.99518 4.08138 +7.28064 7.54638 +9.10622 10.4907 +1.23839 1.50915 +6.7823 9.24533 +8.45679 8.62427 +0.106718 0.69304 +2.84119 3.50375 +3.60466 4.51338 +8.04709 8.19023 +3.31632 3.48054 +5.9027 7.46331 +-0.621072 1.13003 +8.57167 8.69262 +0.301047 1.42246 +1.24229 2.44616 +0.962706 1.55754 +8.77327 9.55275 +1.77899 2.44335 +0.368575 1.84726 +9.05918 9.07832 +6.61723 7.68015 +8.59899 8.80383 +-0.133927 0.20271 +5.69266 5.74809 +0.68202 1.52342 +7.17359 7.91482 +5.74049 7.34297 +7.88371 7.9683 +1.58749 2.26543 +3.96728 4.45988 +5.4354 6.88336 +1.68706 1.6976 +6.56907 7.40696 +0.518151 0.724124 +8.99155 9.36995 +6.00506 7.91529 +5.26967 6.11536 +2.37416 2.50887 +8.47983 9.31509 +2.38155 2.54346 +8.08415 9.65214 +1.00693 3.19203 +1.6523 1.73553 +6.85283 6.9958 +4.11425 4.90193 +1.39597 1.58725 +5.05551 5.19458 +5.89969 6.11394 +5.9148 7.26824 +9.32271 9.93989 +1.62911 2.58215 +5.43399 6.14203 +3.11393 3.58792 +8.57619 9.3788 +2.23349 2.7884 +8.09022 8.54326 +9.7114 9.87076 +5.91086 6.10885 +7.35805 7.57276 +0.650002 0.879866 +3.24977 3.75531 +2.73948 3.41051 +3.08006 4.62772 +3.71868 4.31519 +4.13905 5.78577 +1.77297 3.02983 +5.85931 5.89333 +3.68972 3.93193 +1.43922 2.98425 +6.51534 8.33386 +6.6821 7.50874 +1.2541 2.11722 +5.40634 5.54411 +4.55502 4.60346 +4.32484 4.68497 +3.40711 4.31975 +9.20893 10.0853 +6.12594 6.9009 +0.12664 0.347193 +7.53378 8.82258 +7.79572 8.91645 +2.50098 3.39701 +4.17873 4.97732 +1.05822 2.47032 +3.1012 4.97736 +8.42126 8.74568 +7.83301 8.17843 +9.26618 10.584 +3.02667 3.7128 +8.30654 8.69242 +2.87173 3.43275 +6.59917 7.54843 +7.03447 8.20283 +5.75718 6.40637 +2.62899 4.1855 +-0.520148 0.902194 +5.1538 5.61763 +1.25625 2.33142 +4.16336 4.3384 +3.01296 3.41026 +3.16515 3.26305 +2.40944 3.21897 +6.80742 8.57141 +1.15125 1.54824 +8.72251 9.50878 +3.15703 4.04482 +0.470308 0.726093 +0.199979 0.878243 +7.8908 9.17915 +6.91793 7.16038 +4.64783 5.00217 +2.21237 3.03073 +1.5825 1.63362 +3.18806 5.20795 +5.92725 5.95595 +4.65027 5.09868 +6.42204 6.87201 +8.08637 9.40221 +4.95542 6.16185 +7.45987 7.57979 +8.826 9.13961 +4.42078 5.27977 +7.26216 8.97585 +2.26919 3.33512 +9.4077 9.81908 +0.722223 1.03378 +-0.0497795 1.19355 +8.22686 9.31082 +0.0733766 0.93037 +7.47883 7.9062 +5.28731 5.74181 +1.78496 3.61348 +0.690987 0.764344 +2.56442 3.54999 +4.27944 5.43124 +4.04412 5.35376 +0.663756 1.88268 +1.73567 1.78553 +8.07666 9.41842 +7.70138 8.42873 +9.27113 9.55873 +0.982413 2.5565 +0.994807 1.02007 +5.01226 5.31923 +8.87435 10.0597 +1.74836 3.22578 +0.151528 0.191719 +5.82608 6.06438 +1.17239 1.59955 +3.18515 4.11049 +1.92258 3.70604 +1.63692 1.8266 +1.83542 2.66228 +2.21954 3.11425 +3.97546 4.3928 +0.731374 2.05705 +5.44809 5.96359 +9.85934 10.0553 +8.42169 9.63654 +6.68148 8.43446 +2.00014 3.3485 +0.735924 1.73 +1.61833 3.05643 +7.87934 8.67316 +8.67441 10.0032 +0.794573 1.2493 +6.11926 6.41441 +5.2715 5.82597 +9.41854 9.46625 +3.46299 4.06742 +5.6487 5.79053 +1.46503 3.43496 +0.9957 1.53939 +2.4714 3.1301 +0.887049 1.6196 +3.04884 3.19662 +1.24337 2.05758 +7.61142 8.55766 +0.998279 1.64425 +4.74917 5.85236 +2.97632 3.94611 +4.11786 5.62709 +7.40498 7.62083 +1.47854 3.64736 +2.1176 2.64511 +4.55533 5.89436 +7.44618 9.79926 +-0.410242 0.737348 +5.719 6.30861 +8.33692 8.38222 +8.78122 9.98195 +3.75452 4.26866 +2.23771 2.44985 +6.72455 7.61362 +5.9797 6.58846 +6.72885 7.60315 +-0.710302 1.18332 +7.73287 9.383 +6.61213 7.67394 +4.12945 5.68527 +-0.300887 0.341615 +5.77978 6.41534 +8.34001 9.96874 +1.62323 1.8283 +1.71788 2.23905 +7.43484 8.0418 +3.47322 3.8047 +3.47311 3.51261 +7.82093 8.86377 +2.46973 2.99125 +7.91166 8.55065 +3.39807 3.43599 +8.94792 10.0437 +7.70859 8.32487 +5.86852 7.13103 +7.64996 9.19033 +6.66742 7.8092 +7.88241 8.58675 +9.42939 10.3479 diff --git a/bottleneck/tests/data/ws_tests/test_5000_B b/bottleneck/tests/data/ws_tests/test_5000_B new file mode 100644 index 0000000..5f6e43c --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_5000_B @@ -0,0 +1,5000 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 +2.04751 3.00998 +3.19365 3.9383 +8.09529 9.45596 +8.88173 9.5618 +0.609816 2.67806 +1.57288 2.60884 +1.68354 1.80124 +4.92058 5.9959 +1.48728 1.84885 +0.299669 0.413905 +9.02156 9.56731 +7.50854 8.49023 +0.667131 1.89987 +2.22472 2.58793 +5.84395 8.79426 +2.35839 2.66935 +3.43111 3.69982 +6.71023 7.36801 +6.75697 9.0991 +2.35352 2.85316 +6.73054 7.39006 +9.48673 10.1493 +6.71226 6.72805 +9.22083 9.71889 +8.36513 9.33921 +0.0652672 0.319993 +3.26467 4.60881 +7.62269 7.79878 +6.48608 6.69515 +6.21737 6.88645 +6.56094 6.9699 +1.61317 2.7167 +5.08621 6.29754 +2.24676 2.8076 +3.09943 3.93921 +9.74093 10.0968 +0.417699 1.6381 +9.2958 10.2973 +3.6663 4.1369 +0.0229943 0.448065 +9.2928 10.1833 +3.66334 4.22032 +0.812172 2.19952 +7.88025 8.71192 +8.69379 9.34922 +1.70691 2.95352 +8.28737 8.29985 +5.22491 5.354 +4.03526 4.14084 +6.49359 7.05924 +0.24853 1.44718 +7.86936 8.75135 +5.76 6.68919 +5.85437 6.14314 +5.86292 6.0516 +2.35692 2.91295 +0.0990674 1.29386 +2.9911 3.56188 +0.552671 0.638929 +5.80756 6.22761 +1.21067 1.77175 +4.51882 4.72936 +1.99969 2.89732 +3.65968 6.61987 +0.478582 1.33355 +0.259061 0.289813 +3.89264 5.02474 +0.349236 0.438003 +7.70442 8.1729 +7.90389 10.1876 +3.06898 3.15219 +4.77811 5.29095 +9.76561 9.89451 +4.14295 4.2489 +0.540224 2.28623 +9.60749 10.2284 +8.49555 9.00307 +7.89668 9.76886 +4.12631 4.70897 +7.87898 7.91814 +9.29858 9.52908 +9.24009 9.91544 +3.73498 4.70275 +5.44467 5.9274 +2.13453 4.85697 +2.29607 2.88771 +0.807842 1.82319 +0.319005 2.08473 +1.62 1.63649 +2.20431 3.23869 +2.00132 2.77136 +6.64752 6.71706 +8.12249 8.28379 +7.55541 7.7813 +3.51763 3.64484 +9.21075 10.2811 +2.24501 2.54426 +5.64566 6.46452 +6.72307 8.56698 +3.91728 4.60262 +4.02535 4.29548 +3.0499 3.53135 +1.30677 2.32194 +9.36908 9.90669 +3.92387 4.33848 +2.87312 3.08243 +4.49167 5.2749 +5.43143 6.74905 +6.94595 9.16539 +1.9784 2.00429 +9.42478 10.2226 +3.7185 3.96576 +9.37729 9.50574 +5.34283 6.89736 +4.95341 5.84626 +2.91654 4.28413 +8.26544 9.3076 +6.23114 7.20273 +1.02585 2.21446 +1.6718 2.29591 +2.28926 2.73452 +-0.648145 1.105 +1.44194 2.18562 +6.78584 8.37985 +2.00402 2.08248 +1.64076 2.04067 +0.0419044 0.455962 +5.51723 5.72098 +5.42117 6.81165 +5.70331 5.81707 +4.97889 5.60741 +3.38797 4.46846 +7.20995 7.66784 +3.45388 4.23386 +3.11057 4.35995 +3.29476 4.04676 +2.0519 2.94719 +5.37101 5.38271 +5.99383 6.64188 +7.48444 7.6377 +2.15043 3.05399 +1.54093 1.83799 +5.59223 5.87222 +5.8005 6.08042 +6.1208 7.22563 +1.2938 2.17454 +4.92405 5.0402 +6.91336 7.79688 +1.47978 1.99762 +9.00494 10.8315 +5.84805 6.15303 +4.95368 5.49096 +8.21704 8.31192 +0.715222 2.33517 +0.904183 2.54741 +3.42349 3.74906 +0.627978 2.37092 +8.41477 8.72651 +3.55373 5.58652 +4.12685 4.61533 +0.775274 1.41263 +4.78915 5.08639 +6.35791 8.15015 +2.88242 3.63509 +2.78526 3.07834 +0.39129 1.15933 +3.26615 4.74531 +8.78873 9.8888 +7.25612 7.45972 +4.97452 5.30012 +0.757255 1.35518 +1.29516 2.52446 +4.66838 4.96648 +-0.0720209 0.832726 +2.68276 3.21123 +8.44253 10.0311 +3.40809 4.70506 +1.09617 2.35452 +5.19302 6.73599 +1.25316 1.58101 +6.2056 7.10099 +7.7666 8.52777 +0.301239 1.37275 +0.522829 0.731575 +6.73869 6.96826 +2.41703 3.20567 +4.94617 6.22052 +5.41524 7.68272 +6.0408 6.29938 +0.0642067 0.600878 +6.32122 6.63505 +3.25427 4.70611 +5.88704 6.1678 +8.71533 9.08476 +6.25575 6.88392 +1.54462 1.56366 +3.95938 4.03326 +2.54671 3.66798 +8.48603 9.10156 +3.37369 4.65454 +5.25469 5.64636 +7.02624 7.36449 +8.17061 8.44321 +9.23147 10.1149 +1.45589 2.25886 +6.47702 8.25307 +7.69088 7.91753 +0.442832 0.616926 +8.35355 8.83222 +7.65142 9.58906 +4.04877 5.17345 +0.76012 1.8686 +6.54877 7.40058 +7.41774 7.65429 +8.69655 9.3325 +4.8302 6.25306 +1.77203 1.90284 +3.67485 4.94569 +6.60162 6.72031 +3.05924 3.35235 +0.0823162 1.3486 +8.42991 8.86331 +6.81596 6.83527 +-0.0174808 1.6745 +-0.758131 1.08928 +4.14423 5.46342 +9.26253 9.85714 +7.42749 8.58214 +4.88849 5.86936 +8.99339 9.38141 +8.85301 9.18285 +2.64303 3.45658 +7.1133 8.66473 +3.50745 3.8629 +7.81615 7.83244 +2.94991 3.8741 +7.91822 8.8362 +-0.0553088 1.19059 +7.35558 7.77948 +2.11257 2.20563 +8.57533 9.16338 +2.3515 3.13009 +4.13239 5.38696 +2.20763 2.93941 +7.2451 7.3211 +0.834388 1.57413 +4.47024 6.17855 +4.75947 6.80913 +2.99607 3.54732 +8.15998 8.80718 +8.94688 9.27971 +4.46335 4.9522 +5.30725 5.69786 +7.63989 7.86974 +6.69589 7.69565 +5.34018 6.08115 +8.59515 9.62264 +1.80557 3.22507 +8.62429 8.94242 +1.34532 1.95042 +8.60707 8.80741 +8.03275 9.40327 +4.30357 4.39095 +8.97954 10.7076 +2.18143 3.51825 +3.98695 5.62062 +2.48813 2.60622 +5.56957 6.43776 +5.18249 5.55459 +3.45373 3.64101 +-0.00345662 0.570597 +3.61127 4.69761 +9.37858 10.6205 +7.24635 8.19639 +4.70142 4.80735 +3.30055 5.14257 +0.860415 1.31635 +4.72924 5.46893 +7.47391 7.72644 +6.22287 6.57754 +0.181652 1.01366 +2.14494 2.80736 +2.16406 3.19383 +8.52991 9.22722 +8.74411 9.06935 +0.575831 1.02699 +2.47315 3.0331 +4.2872 4.59813 +5.82293 7.03604 +2.08982 2.25319 +7.3626 8.41994 +1.23867 3.10885 +7.397 7.78026 +6.78837 7.32977 +0.829368 1.56617 +9.23075 9.35172 +6.76562 7.23578 +0.42851 0.839401 +4.83626 5.5852 +0.150032 2.45322 +2.16811 2.47439 +5.60245 5.81188 +7.43707 7.46519 +0.167317 1.44642 +4.9732 7.58343 +8.67391 10.2957 +0.318592 0.639284 +3.365 4.25929 +7.83683 8.88895 +5.20557 5.30114 +0.940347 1.74022 +5.39149 7.13464 +1.10826 1.27913 +1.9147 2.31276 +0.935283 2.49181 +3.67898 4.33336 +5.10125 6.07734 +0.348807 0.839242 +0.310986 0.58381 +2.03594 2.43119 +5.49755 5.94215 +1.94885 3.34409 +9.66806 9.97883 +4.79099 5.45155 +4.81158 5.30001 +5.17667 5.90019 +9.64168 9.99177 +1.14899 1.22792 +0.466236 0.952985 +6.93679 7.72282 +2.97285 3.23931 +9.22517 9.24315 +7.25783 7.46414 +4.37304 4.51815 +4.01069 4.02979 +0.843132 1.80443 +4.78572 6.04237 +6.02471 6.38074 +4.99536 7.76852 +4.97442 5.17384 +0.731231 1.49497 +2.2797 2.90845 +9.13211 10.341 +4.19545 5.08597 +6.13127 7.09817 +2.65124 5.02208 +5.40235 7.12912 +6.86258 6.91991 +8.24317 8.55273 +7.6877 7.69875 +3.33922 3.53776 +0.089484 0.40755 +1.34909 1.68726 +8.43113 8.72899 +4.90038 5.55994 +0.308089 0.490555 +5.42628 7.1433 +2.11647 2.56987 +3.56934 4.1619 +8.35794 9.24416 +8.8645 9.69151 +5.10701 6.0036 +7.66385 7.8412 +2.89952 4.55221 +6.01533 6.38269 +-0.945182 1.07304 +1.79537 1.85576 +-0.0313338 0.501067 +8.85689 8.87522 +1.61143 1.7773 +9.53229 9.84943 +3.51669 3.81091 +-0.448016 1.10903 +3.16889 3.439 +4.30534 4.36372 +6.20158 8.09618 +2.20949 5.23616 +3.29459 4.17079 +3.90101 4.05611 +5.89688 6.85702 +0.734474 1.04471 +7.84341 8.02702 +8.69431 10.1086 +9.73194 9.92195 +7.63516 7.70631 +8.51416 9.33072 +-0.0712911 0.361001 +2.76979 3.22708 +5.34404 7.5165 +5.64429 5.79865 +0.0755012 0.363483 +5.05631 7.27153 +-0.60164 1.09659 +0.457228 0.876186 +4.27092 5.38033 +8.63891 9.04134 +6.29608 7.04242 +8.97795 9.93013 +5.00385 5.57737 +8.48068 9.44885 +7.35543 7.78492 +3.55698 4.01035 +-0.268117 0.649128 +0.633184 0.66254 +4.54216 4.81132 +6.15574 6.35276 +4.3663 6.36286 +1.45231 2.07039 +7.37031 7.9157 +5.30961 6.3506 +5.80757 5.81762 +4.91767 4.97519 +3.45667 3.60965 +1.7934 2.3807 +4.33289 5.41047 +1.16021 1.29979 +3.75172 4.53521 +3.10835 3.1275 +2.68167 3.00314 +4.10639 4.24094 +4.90776 5.74069 +7.30861 7.86666 +3.52822 3.70998 +5.22222 5.28033 +0.00866476 0.326377 +7.73247 8.61481 +4.25231 4.77499 +8.41148 8.54604 +2.95389 3.63497 +7.76126 9.69124 +6.41218 6.69682 +4.86285 6.44503 +1.84783 1.9065 +4.08788 4.11706 +9.17473 9.50133 +5.15091 5.78649 +1.27694 3.33579 +2.92648 3.37855 +9.37392 10.5123 +4.81878 6.34991 +8.38702 8.83716 +5.07771 6.33618 +1.47438 1.75588 +6.20935 7.11166 +1.08286 1.38 +1.40048 2.0157 +6.60355 7.26234 +5.28396 5.90003 +8.9525 9.59216 +-0.0305792 0.544664 +-0.571491 0.735471 +6.287 7.03679 +5.35225 5.4104 +0.095812 0.605976 +4.33523 4.4048 +6.13288 6.80949 +4.14654 5.5505 +-0.213214 0.260592 +7.56188 7.83088 +7.8132 8.65963 +8.02469 9.3254 +0.00641711 0.420562 +7.49269 8.15849 +9.26359 9.4366 +5.74008 7.86317 +8.62729 9.78825 +4.28946 6.20553 +3.19174 4.54991 +4.16992 4.25203 +2.46138 4.11583 +1.92971 2.16701 +3.43028 3.80842 +6.98297 7.28388 +7.51884 7.55947 +7.79102 9.44326 +0.416342 1.32311 +9.35398 9.85201 +8.72997 9.10384 +6.23398 6.88888 +7.46984 7.4875 +5.92603 6.66938 +1.77761 2.58697 +0.835966 2.06139 +9.63284 10.3565 +6.13677 6.42768 +0.151375 0.382404 +8.10315 8.13441 +5.52283 6.28113 +1.00873 2.44226 +2.5239 3.89871 +5.40599 6.72653 +3.43407 4.0068 +1.22444 1.26601 +7.04395 7.80599 +3.75987 3.77123 +6.43597 7.06249 +8.34435 8.87418 +8.25853 9.04009 +0.415321 2.32725 +0.639046 1.75525 +7.83226 8.12538 +9.55429 10.2734 +3.658 4.35867 +1.8588 3.93292 +7.38922 8.16823 +8.53626 9.23024 +0.848152 1.13412 +6.31667 7.2348 +3.81584 4.62621 +9.24748 10.7408 +2.75953 2.95288 +5.70188 6.62278 +4.22202 4.45368 +3.24616 3.88779 +1.05053 2.09846 +8.67718 9.52693 +2.14107 2.71959 +1.10518 2.69689 +5.01476 5.54139 +4.69244 5.20358 +8.88285 9.93012 +2.55228 2.77382 +6.72118 7.50057 +7.58999 8.71573 +1.83763 2.13481 +4.86135 5.27995 +4.39794 5.42117 +1.42512 2.98262 +4.80489 5.34701 +2.7993 5.13702 +7.52122 8.41729 +9.08613 9.37543 +1.1555 1.3935 +7.34071 8.0428 +8.33361 8.40349 +2.514 2.54741 +8.25732 8.41758 +1.65337 2.57964 +4.20527 5.06565 +0.723443 1.06987 +5.85836 6.64701 +7.908 8.07591 +5.01839 7.0105 +3.15908 5.10364 +4.3574 6.67192 +2.06662 2.46437 +7.5595 8.9108 +7.94919 9.20231 +4.11889 5.49714 +7.28151 7.51881 +1.30685 2.09479 +3.08479 4.47364 +4.50916 5.91511 +7.31605 7.63868 +3.14469 4.07035 +8.38431 8.87993 +7.42277 7.64967 +4.22472 4.26323 +8.49871 8.90746 +7.44431 8.09014 +8.35213 8.7504 +3.85634 4.37584 +9.12975 9.77042 +-0.326056 1.17374 +3.53802 4.06211 +6.81775 6.8467 +8.19106 8.64489 +4.20526 5.37727 +2.74081 3.72143 +0.49642 1.10775 +7.76606 8.00524 +4.79825 6.38926 +1.99478 3.20484 +4.69853 6.29508 +5.73058 7.18643 +8.11708 8.64257 +9.62375 9.84838 +5.95271 6.38989 +9.0193 9.93848 +3.91188 4.10834 +6.065 6.60546 +2.62354 3.60072 +8.53665 9.06824 +6.40691 7.44693 +1.62959 2.5825 +9.4128 9.87031 +6.24697 6.62684 +3.31136 3.45626 +4.80347 4.9935 +9.21711 9.53416 +-0.491547 1.72886 +4.75174 4.87217 +0.86329 1.53331 +2.4586 4.2578 +5.10301 6.2815 +5.08302 5.86788 +6.12434 6.78948 +9.68323 10.0973 +3.52576 4.40424 +4.9925 6.89084 +0.846638 1.80782 +1.09709 1.7685 +8.38592 9.03312 +9.56243 10.2682 +5.03592 6.6429 +7.8609 8.04599 +1.21404 1.31975 +7.47824 9.2063 +1.47849 2.68795 +1.2909 2.06381 +5.21288 5.54616 +6.27218 6.99345 +4.77622 5.08494 +3.30665 4.14735 +3.38947 3.55545 +7.71197 8.53162 +1.10565 1.50806 +0.7889 0.984689 +2.88598 3.33244 +5.70958 5.81232 +5.16567 6.24511 +6.91255 7.25784 +-0.401084 0.753156 +4.81138 6.20671 +1.67301 3.58501 +7.19478 8.25624 +1.24428 2.2523 +4.31631 5.33357 +0.589196 1.02017 +5.69207 6.97803 +2.3854 3.25501 +4.1362 4.91135 +8.9932 10.3184 +7.95871 8.45158 +4.03213 5.26347 +3.09506 4.06425 +-0.0310321 0.738171 +7.35733 7.61512 +2.48488 2.96253 +4.72098 5.69867 +5.5395 5.96914 +3.17854 4.283 +6.50012 7.33744 +1.93266 3.00941 +1.49319 2.71826 +9.0187 9.13099 +7.15259 7.40691 +8.71939 8.93257 +1.57203 3.11249 +0.933429 2.16903 +2.99663 3.71667 +2.06144 2.81311 +7.9072 8.2103 +0.490069 0.614737 +7.84111 9.70812 +1.15363 1.6421 +1.15475 1.43307 +8.2228 9.92116 +7.76825 8.40724 +6.15122 7.31322 +7.1427 7.49294 +2.30516 2.7019 +2.03336 4.03387 +8.3918 9.85707 +8.57214 9.59345 +3.8057 4.1119 +8.9223 9.38556 +9.32051 9.60504 +7.13349 7.69154 +1.71855 2.00425 +5.10333 6.0605 +-0.149137 0.80973 +0.466224 3.1698 +4.19165 4.29604 +1.64018 2.3161 +9.40397 9.89211 +5.21738 7.06323 +0.525526 1.0331 +8.06992 8.08704 +9.81539 10.0915 +9.33514 9.50521 +5.95494 6.54519 +9.21466 9.35909 +4.96603 5.18164 +3.89238 5.53056 +5.04546 6.32916 +8.63758 8.65805 +7.03226 7.57074 +0.32029 1.10893 +0.194176 0.992252 +8.79061 9.50848 +0.239137 0.300717 +7.7234 8.43747 +3.43679 4.28954 +8.31382 9.18928 +1.39612 1.67253 +6.95733 7.39846 +1.29129 2.12185 +7.93611 10.2305 +3.67764 4.17562 +1.38149 2.42407 +2.2847 2.48412 +9.28655 10.0661 +2.94115 3.21326 +7.04238 7.91536 +5.06012 5.61526 +8.95611 9.91736 +2.18524 3.44007 +1.0692 1.10987 +4.37019 5.18443 +5.82014 6.441 +1.68642 1.70458 +4.93783 4.9535 +9.42003 10.1196 +-0.356795 1.30987 +1.37778 2.80527 +9.54126 10.1758 +8.67413 10.5984 +0.914291 2.0697 +6.08696 7.09832 +2.82202 3.31103 +4.07818 5.50195 +2.85223 3.67449 +6.03006 7.10863 +8.84655 10.528 +5.08031 6.2001 +1.00272 2.74191 +0.169102 0.223253 +0.025089 1.26534 +-0.203339 0.64667 +0.899666 1.48885 +0.74235 1.49976 +6.28212 6.80412 +5.65159 5.93106 +2.1686 2.7445 +5.02936 5.43091 +8.07124 8.80499 +8.65696 8.95802 +7.68394 8.365 +8.65062 8.69146 +0.058248 1.19535 +5.74545 5.84057 +6.05244 6.52152 +9.3878 10.3328 +7.71379 8.88044 +3.32961 4.54105 +8.51987 8.62854 +4.10821 4.16902 +9.47639 9.78723 +4.72417 4.84793 +2.32867 2.94068 +9.52275 9.57815 +5.32867 6.96127 +4.32462 5.1508 +4.46919 6.45961 +8.62661 10.9533 +0.0244049 0.56156 +1.49207 1.73164 +7.03156 7.81168 +5.88587 5.89732 +8.43632 9.65085 +7.52612 8.06726 +4.82464 5.6193 +3.8062 3.90356 +2.42708 2.51646 +2.06458 2.45877 +0.427218 2.24283 +7.42616 8.11513 +0.617708 1.01833 +8.74218 9.03592 +-0.213346 0.599112 +9.05291 9.59124 +5.20365 5.54277 +2.85289 3.99509 +3.08468 4.58456 +0.136826 0.685254 +3.87191 3.99021 +0.970836 1.49673 +2.44355 2.53584 +8.88615 9.94545 +3.90591 4.52798 +1.52518 2.50658 +7.21268 9.07745 +0.767314 1.23833 +8.62975 9.42367 +6.71524 7.67686 +7.61205 8.48292 +5.312 5.65087 +4.75627 5.96261 +7.90674 8.0753 +7.37887 7.71478 +3.74483 5.52984 +2.7187 2.85544 +4.7902 5.62159 +2.89671 5.19815 +7.37268 8.72506 +7.11916 8.28301 +9.19814 9.75279 +1.2085 2.60113 +-0.632009 0.889734 +7.99858 8.39743 +6.48346 7.10822 +6.30616 7.06648 +5.56514 6.51183 +2.41505 3.56224 +6.83749 8.84447 +9.05111 9.46906 +7.77476 8.4091 +6.11378 6.31232 +4.42882 5.69917 +5.88107 8.052 +3.75437 4.08893 +2.70487 2.77664 +7.26028 9.77257 +1.44621 2.73267 +2.0384 2.60397 +2.95402 3.68949 +6.04766 6.4054 +0.716046 1.77698 +1.5084 1.72988 +2.58426 2.80376 +8.05255 8.59793 +6.06336 6.20709 +3.29813 4.31473 +2.53477 4.92554 +8.78711 9.88634 +9.26627 9.82082 +6.70683 6.81257 +8.25978 8.99788 +7.28054 7.64237 +5.14556 5.20711 +4.20431 5.87866 +8.96592 9.97597 +4.06216 4.41519 +8.49174 11.0491 +5.24547 6.03094 +4.65885 5.95835 +5.09606 6.34846 +6.30463 6.65933 +6.48022 9.56168 +1.38088 2.98143 +0.486911 1.16767 +8.16327 9.34821 +0.768885 0.782616 +4.51699 6.08086 +9.55086 9.70242 +2.86802 3.72489 +1.88496 2.18749 +4.31876 4.33726 +8.38871 9.45631 +8.80634 9.36198 +5.232 6.42399 +9.86919 10.0492 +3.61902 4.53086 +3.13118 4.42364 +2.69395 3.1816 +-0.303144 1.32309 +4.28871 4.36739 +3.8631 4.08745 +4.9291 4.98968 +7.14273 7.25505 +2.56623 2.59122 +6.01753 7.72265 +6.76051 7.53954 +6.76933 8.14741 +0.933137 1.83537 +7.9357 8.57904 +5.55847 5.59984 +4.25563 4.3345 +4.28087 5.21348 +8.88534 9.06554 +1.88575 2.94002 +5.26613 6.04562 +0.514249 1.45538 +0.130644 0.501645 +4.30564 4.86337 +1.57246 2.38451 +0.303814 1.77474 +4.22675 5.02783 +6.75381 6.78634 +5.64096 5.9725 +6.76159 6.98142 +2.35569 2.39119 +3.29794 4.95962 +6.55055 7.03366 +5.31474 5.69404 +9.01335 9.16988 +8.58306 9.37831 +7.06522 7.07778 +1.14695 1.74744 +3.15507 3.22865 +5.5925 7.14168 +2.14679 3.68767 +7.54789 9.71878 +1.5667 2.08742 +-0.604726 1.66718 +0.306012 0.54799 +2.61731 5.08257 +0.80957 1.74655 +8.22035 8.81637 +4.401 5.449 +8.89389 9.01988 +4.80574 4.9322 +2.19895 2.88565 +9.06688 10.8095 +1.23727 1.58699 +7.14836 7.92057 +4.65155 6.15149 +0.563061 2.16535 +7.66764 8.0341 +8.32324 8.42774 +4.54541 5.11069 +8.0237 8.09992 +7.26113 8.09404 +2.55196 3.20317 +8.1236 8.60951 +1.90437 3.23006 +0.888133 2.50365 +1.13618 1.69444 +2.60463 3.01696 +7.2311 7.73229 +5.06501 6.01487 +3.9893 4.10116 +1.45278 1.56937 +2.74601 3.80778 +9.40705 10.3843 +3.02533 3.52213 +8.7097 9.2268 +8.73145 10.5552 +2.56059 3.5742 +6.27328 7.57089 +3.23291 3.30811 +6.33804 7.20304 +7.63648 8.34564 +9.82053 9.93597 +3.14924 4.58629 +5.28253 6.33733 +1.99411 2.04104 +0.305593 0.420302 +5.39668 6.64188 +7.99992 9.37823 +5.25169 5.65987 +0.109291 0.875734 +3.08589 5.50296 +6.51358 6.62588 +5.34687 5.58204 +0.043587 0.932787 +-0.0264143 0.28677 +8.09722 8.37087 +5.46612 6.30285 +2.89146 3.49892 +6.73278 7.11762 +5.03068 5.90176 +1.7459 2.87727 +0.207707 0.448933 +7.00453 7.63105 +6.02789 7.87991 +8.1917 8.95854 +7.49014 8.73215 +8.48402 9.22063 +1.0467 2.4687 +0.241901 1.38802 +2.65867 2.81258 +5.46725 6.59448 +3.40578 3.75607 +4.2495 4.26392 +5.6608 6.213 +2.99705 3.88852 +6.17231 6.72018 +-0.17415 0.492739 +4.89596 6.49895 +4.68876 6.60218 +-0.0510568 1.46013 +8.87099 9.28179 +3.98894 4.5838 +-0.20015 1.59214 +8.80756 9.51828 +7.74921 8.53538 +-0.380041 0.440574 +2.69409 3.91466 +2.42747 4.56745 +6.25881 7.75647 +7.2941 7.77193 +2.60806 2.90251 +0.325028 1.22219 +8.29921 9.01416 +3.85524 5.45451 +5.2612 5.71877 +2.92849 3.73937 +8.6242 8.70808 +7.28153 7.35797 +1.65378 2.87917 +3.46034 4.24143 +3.99989 4.3199 +1.15266 3.60328 +4.8464 6.4887 +4.67021 4.68421 +6.96861 7.31554 +0.00723008 0.817047 +7.59589 8.88352 +5.56725 6.08465 +9.02409 9.19527 +5.81681 6.74193 +1.98221 2.98678 +8.76392 10.7646 +4.3903 4.50531 +1.0186 2.01838 +2.66674 2.74505 +2.41105 3.44579 +8.98295 9.18995 +8.14385 8.98779 +2.69613 3.60144 +0.445704 1.51319 +-0.634889 0.860409 +6.32737 7.10112 +7.88824 8.06838 +3.76271 4.43529 +7.66487 9.30221 +8.73974 9.59191 +3.08965 3.43006 +8.9518 9.96154 +0.727194 1.55228 +6.35214 7.12234 +2.71987 3.22996 +7.12786 7.4379 +-0.346107 0.837469 +8.47103 9.05987 +9.15744 10.628 +8.3237 10.093 +1.15052 1.16223 +6.95959 7.35423 +7.69488 8.44145 +4.21694 5.65913 +3.10562 3.37534 +9.73437 9.78252 +5.0458 5.53479 +7.80485 8.5163 +2.0442 3.75748 +-0.459177 0.498702 +7.38032 8.32195 +0.909659 2.11175 +7.08657 7.56877 +1.84997 3.10206 +4.2517 4.53819 +6.71655 7.04117 +1.06604 1.29153 +2.69273 3.31633 +2.19732 2.84826 +-0.723032 0.774865 +-0.289734 1.44645 +5.87194 7.71917 +1.01576 2.83685 +0.981927 0.998558 +3.07172 3.73201 +-0.112577 1.12642 +3.54063 3.67007 +7.21571 8.53815 +0.109957 0.839052 +6.86046 7.17211 +9.40878 9.69478 +0.989391 1.69046 +8.22287 8.8147 +1.48203 2.83308 +5.86418 8.0993 +0.749797 1.09852 +1.82996 2.50847 +0.28178 0.496017 +2.60694 3.00872 +8.6254 10.1698 +6.11641 6.41537 +7.19529 7.21342 +1.8214 2.17517 +0.991201 1.3788 +2.84924 3.12362 +5.75821 7.13843 +6.7106 7.35932 +6.6055 6.6829 +7.97105 8.58613 +1.56087 1.95845 +6.36782 7.10926 +2.43382 2.74699 +7.40509 8.8029 +8.42459 8.63142 +6.26128 7.55043 +4.6465 5.4431 +2.93214 3.29517 +0.157602 0.545214 +6.05931 6.72188 +1.7908 3.11731 +2.39217 3.58736 +7.07421 7.43852 +8.13419 9.74991 +9.53094 9.65319 +2.35726 3.68679 +-0.108561 0.874853 +6.87136 8.84157 +3.40803 4.58835 +7.50448 7.89932 +4.29762 5.53867 +0.863755 2.30032 +7.24847 7.95342 +2.89618 2.98849 +-0.928261 1.61922 +0.974105 2.91262 +6.99271 7.25856 +3.60995 5.01832 +1.26865 1.79704 +9.62217 9.80719 +1.02656 1.35514 +7.16502 7.32934 +3.12092 3.28857 +2.81374 3.84317 +8.73626 10.7585 +3.36982 3.61446 +5.08437 5.78949 +2.90218 3.0862 +9.2309 10.2523 +5.0967 5.48926 +9.73088 9.92708 +1.54013 2.78301 +6.73707 10.0789 +6.41735 6.838 +2.57935 3.04287 +5.719 6.70352 +5.42474 5.62732 +4.23904 4.69787 +4.16528 4.28736 +7.73477 8.84143 +4.90346 5.87324 +5.1969 6.14087 +3.48793 4.14182 +0.648493 1.07987 +6.88101 6.97932 +7.67342 8.74418 +5.16759 6.3871 +9.16292 9.49569 +8.77422 10.4817 +-0.358149 1.04178 +9.54616 10.3424 +3.12027 4.26504 +3.81223 4.73004 +1.2386 3.32247 +8.21963 8.42629 +9.10312 9.51016 +6.96107 7.43045 +2.98587 3.12365 +0.198165 0.211424 +5.19716 6.10856 +6.10553 6.3327 +3.98176 5.11099 +1.02512 1.04242 +4.27949 5.71947 +-0.457956 0.538807 +7.99877 9.48581 +5.88782 7.73303 +1.21496 2.85825 +8.46962 8.7862 +9.50182 10.1527 +5.85223 7.76234 +2.48368 2.52439 +2.35426 2.77405 +0.397056 0.482679 +0.160423 1.15786 +4.47109 4.8633 +4.74523 5.84196 +5.39177 5.75218 +9.00754 10.3249 +3.74813 4.03273 +3.08633 4.08426 +4.62672 5.29012 +1.92055 3.01442 +3.79279 4.5603 +9.52431 9.68334 +2.8126 3.32592 +-0.313688 0.490785 +9.06695 9.36835 +2.60321 4.14185 +4.40231 4.99535 +9.32205 10.1041 +5.3879 5.44349 +0.308728 1.0956 +9.05758 9.08283 +1.90313 2.50914 +7.1391 7.59459 +7.47357 7.95993 +1.25267 2.34827 +3.33222 4.36522 +8.78126 9.38611 +0.635979 1.62283 +8.3492 8.57545 +-0.572557 1.60517 +8.28855 9.03937 +3.47934 3.90271 +4.64498 5.43501 +0.872177 2.62011 +7.3893 7.58876 +2.14063 2.88063 +1.69361 1.75261 +4.19727 4.86483 +0.814676 1.27639 +8.19899 8.58203 +8.3394 8.99896 +9.31768 10.1694 +4.99218 5.19949 +4.2459 4.75266 +9.6314 9.64249 +4.038 4.75708 +7.92398 8.8579 +4.30747 4.54161 +7.51776 7.78258 +3.77611 5.1385 +3.53275 3.90278 +1.78619 2.12474 +3.18736 3.55159 +8.36759 8.52587 +5.52526 5.7843 +7.64174 8.09773 +4.37925 5.85699 +3.94295 5.31298 +-0.464623 0.795523 +7.02408 7.7048 +0.0690458 1.0008 +1.05445 1.32797 +0.126093 0.712612 +-0.809973 1.33869 +3.45568 3.96532 +0.433875 1.78679 +8.94667 9.65034 +1.98575 2.76936 +6.47974 7.67912 +2.74186 3.34153 +7.82655 9.32112 +4.71441 6.14932 +0.741177 1.76987 +8.05021 8.23239 +0.818503 0.882959 +7.13341 7.43399 +8.45939 8.93395 +4.44558 5.70161 +3.05657 3.86962 +8.75469 8.85537 +1.0922 2.23475 +6.00278 7.51598 +0.0530968 0.582206 +4.01788 5.48223 +1.30808 2.81869 +8.18848 8.59771 +2.43691 2.80685 +8.54045 10.6178 +7.58523 7.91634 +6.70183 7.49962 +5.81501 7.29783 +0.661853 1.58021 +6.50997 7.20411 +0.334292 1.40252 +-0.329585 0.742961 +2.38756 2.48935 +2.78114 3.58788 +7.97227 8.55379 +3.36753 4.57472 +5.14486 5.31457 +3.99691 5.47708 +6.36404 6.8741 +3.22519 4.63321 +1.80583 2.21824 +8.20747 9.42947 +5.90819 6.94368 +6.58559 6.85933 +2.99108 4.03832 +7.20963 9.6252 +3.10244 3.87265 +7.23018 7.91389 +7.18084 9.61063 +6.74145 6.86507 +8.40721 9.5751 +7.12352 9.45614 +2.06653 2.51786 +4.9155 5.04183 +1.34304 2.92777 +0.571315 1.17285 +8.05396 8.28214 +5.29142 6.24974 +8.93797 9.23051 +4.6108 5.45568 +6.46124 7.53124 +3.16695 4.37505 +2.76803 2.82764 +4.1531 4.84927 +8.19433 9.00383 +5.12114 6.22952 +2.2542 4.74849 +0.621192 0.871537 +1.37403 2.28895 +0.305704 1.3287 +8.70471 9.53085 +2.29164 3.56607 +2.42106 3.37382 +1.14309 2.03085 +9.17624 10.3281 +1.88864 2.70161 +0.932647 1.2473 +5.72385 6.55694 +5.25496 5.38675 +5.85771 6.69626 +7.37247 7.93094 +7.73499 7.98782 +4.91417 5.27506 +3.51127 3.84403 +6.96198 7.27686 +6.51176 7.74735 +4.19954 5.08222 +1.58115 1.83842 +2.11889 2.3408 +1.94427 2.00422 +5.59977 6.86555 +9.46942 10.3491 +9.18904 10.1988 +1.71938 3.01547 +4.3515 5.4951 +2.53792 5.85188 +0.3884 1.36228 +5.02469 5.62368 +6.82402 7.72203 +-0.320478 0.821539 +0.0885656 0.248783 +3.01725 3.44385 +6.63776 7.74386 +6.57899 7.9332 +4.82656 5.18327 +3.91909 4.43955 +0.0708319 0.101395 +2.59796 4.22775 +-0.433109 1.26978 +-0.434274 0.624336 +3.22018 4.25282 +4.63351 4.776 +8.889 9.56332 +5.35952 5.46531 +8.73832 9.22756 +2.03432 2.34194 +0.477994 1.43353 +1.2029 2.86844 +5.09945 5.76855 +8.89076 9.01771 +5.30284 6.31732 +1.56375 3.17543 +5.4773 6.36897 +5.30934 5.35073 +7.20096 7.7075 +6.51046 7.12888 +9.37127 10.0531 +-0.0484323 0.348687 +1.83241 2.2143 +8.28633 8.60462 +2.51014 3.65817 +3.27798 3.58685 +1.41567 2.23302 +7.50794 8.10378 +-0.0579575 2.10373 +-0.856005 0.96621 +2.96238 3.48434 +1.36304 1.90594 +2.9997 3.41214 +7.2763 8.087 +1.69207 2.74419 +5.41625 5.83917 +9.22139 9.53794 +1.17477 1.51576 +6.74597 7.90871 +0.678913 1.73759 +5.70863 5.7214 +8.88411 8.93377 +3.44409 4.54586 +0.958963 1.53878 +8.29904 9.3867 +2.52433 3.60238 +8.16257 8.21986 +2.11395 4.23455 +6.85451 7.40364 +0.20286 0.639736 +2.05848 2.49034 +0.547013 0.77336 +7.83609 8.11903 +2.16539 2.29286 +3.94232 4.31368 +8.53475 8.54519 +4.77462 6.4158 +4.08395 4.68214 +1.56902 2.23811 +1.61337 3.11768 +1.51181 1.65521 +0.0821202 2.09269 +4.77622 5.16243 +4.62148 5.75837 +0.613158 0.952696 +1.89128 3.04792 +7.57509 8.92834 +2.70465 4.2941 +4.95906 5.12442 +8.0927 8.17277 +0.796512 1.3215 +5.74134 6.45291 +9.68479 9.78978 +5.89261 6.2292 +6.11377 7.9339 +2.20571 2.67129 +3.46228 4.27058 +5.26723 6.2653 +4.04391 4.26562 +0.380382 0.818995 +7.58108 7.7618 +5.02375 6.13042 +4.20178 4.66297 +2.83039 3.0221 +2.36072 2.45545 +6.68854 9.20726 +2.91388 3.42464 +9.33373 9.73449 +7.75844 7.94625 +2.72414 2.89669 +6.65438 7.96623 +1.00647 1.05385 +2.63018 4.9432 +0.152187 1.60259 +8.86332 10.3631 +2.31523 2.6815 +8.00509 8.61794 +1.69711 1.75938 +8.65442 8.73697 +4.23917 4.32001 +9.66851 10.1925 +6.93943 7.49814 +8.51986 9.03561 +2.10317 2.5175 +0.539549 1.75683 +6.29423 7.93236 +8.64345 9.54556 +1.44069 1.6814 +9.10017 9.77088 +6.16731 7.40496 +0.570043 1.93192 +2.65761 3.88544 +1.46895 1.52688 +-0.369067 0.540647 +2.04868 2.72065 +2.1286 2.27858 +5.90157 6.16431 +1.55581 2.51851 +3.29705 3.81635 +3.4137 4.10991 +8.48699 10.1364 +8.43437 9.4642 +-0.037842 1.47589 +0.541735 1.7805 +0.499576 2.36065 +4.1415 4.72435 +4.77598 6.16872 +3.30388 3.61854 +6.43796 7.85966 +5.27157 5.70871 +0.919258 2.18653 +4.00961 4.07902 +3.78201 4.23596 +4.50464 4.791 +3.70253 5.30916 +8.59228 8.70036 +4.31103 5.69049 +5.31775 5.34378 +2.24198 2.64194 +6.66937 7.41675 +7.21753 8.42057 +4.35399 4.52398 +6.90698 7.30084 +3.44296 5.44378 +3.36719 4.89951 +3.38624 5.33856 +3.44877 3.53693 +5.81398 6.3016 +7.24655 7.33127 +3.86142 4.53134 +3.85894 6.88112 +6.45704 6.95699 +6.90997 8.24088 +5.68813 5.7611 +0.699911 0.824323 +6.73758 8.42517 +9.34644 10.07 +0.289929 1.30554 +8.30644 8.49113 +6.47667 7.16073 +4.28093 4.90236 +8.32678 8.57064 +7.09205 7.92316 +5.55599 5.63919 +1.0104 2.22875 +1.72237 3.53668 +2.54699 3.14823 +-0.668582 1.25485 +1.25582 1.37003 +1.35044 1.57807 +6.17083 6.30811 +0.618816 1.20065 +-0.540992 1.21634 +2.06673 4.28857 +9.03398 10.8112 +8.73735 9.22814 +1.30178 2.7599 +6.0221 7.34889 +8.30124 8.52159 +1.92023 3.34545 +2.99331 4.93358 +3.8412 3.93379 +1.455 2.77005 +0.538664 2.1118 +4.16926 4.26053 +0.699746 0.937609 +6.36024 6.6511 +2.34698 4.84463 +8.11109 8.76496 +4.05425 4.67773 +8.2284 9.78568 +1.64423 1.80353 +5.70109 6.93764 +7.2091 9.67224 +4.47015 5.23311 +4.29326 5.36144 +7.93151 8.96494 +4.61889 4.96487 +5.38473 5.43594 +9.35456 9.66489 +1.23737 3.04121 +1.16077 1.19519 +5.91037 7.55679 +6.88344 7.60181 +6.39705 8.65039 +1.61791 2.93041 +9.68285 10.1396 +9.03129 9.05839 +7.0683 8.29875 +7.19624 7.41696 +7.5266 8.38738 +-0.254571 1.01098 +1.30218 2.03222 +7.6432 7.73031 +4.99495 6.04757 +2.79394 3.29394 +0.31505 3.55963 +7.55382 8.18787 +6.00032 6.27664 +1.49355 1.79767 +5.21191 7.19537 +3.47816 3.75801 +2.10272 2.39494 +1.31887 1.93829 +7.14313 7.63055 +7.3141 7.77239 +6.03409 6.17265 +4.24946 4.53165 +0.0569272 2.56109 +8.44766 11.4872 +4.22879 4.28007 +6.92817 6.98775 +8.08859 9.0206 +-0.0748418 1.48605 +6.56698 7.0488 +4.46624 5.4952 +3.66085 4.05778 +6.44711 8.93943 +2.45735 2.49339 +0.0606673 0.416191 +-0.183838 0.750464 +7.08561 7.67275 +6.65423 6.90808 +0.0598735 0.364072 +5.2228 5.41543 +3.14042 3.19043 +2.40069 3.02829 +1.80441 2.1849 +3.47491 3.95775 +5.49162 6.63934 +2.03332 2.32288 +3.17234 5.25109 +2.58274 2.59951 +9.37994 9.97097 +4.71509 6.77966 +5.18915 6.84982 +6.12508 7.04354 +0.811202 1.98808 +1.46825 3.66984 +2.44386 4.15623 +7.60169 7.68242 +-0.43208 1.22222 +5.40569 5.66153 +0.391742 1.79408 +6.77742 8.43115 +9.12828 9.3851 +6.39541 6.80626 +5.17919 6.29326 +6.57263 8.12999 +3.439 4.62236 +8.40525 9.80086 +7.60986 7.70099 +1.32123 1.44213 +0.526574 1.92338 +9.57195 9.79591 +9.52103 9.63159 +3.79775 4.20608 +4.74446 4.89606 +9.00085 9.60025 +1.26279 2.08363 +4.13639 4.49232 +6.59409 7.18315 +1.0637 1.78425 +5.4213 6.87661 +4.24407 4.30987 +9.79732 10.1204 +4.24597 4.83541 +8.47705 8.5145 +4.34095 4.93842 +5.68168 6.96086 +7.48654 7.91072 +8.32005 8.45111 +5.24065 5.3032 +3.25982 3.94442 +5.58106 6.18764 +4.4243 5.58619 +6.36467 7.07082 +2.70051 3.56014 +5.94534 6.87688 +7.33638 7.7645 +4.57067 5.86652 +7.83993 8.36854 +9.03617 9.11629 +7.44672 7.95614 +6.05876 6.3594 +4.02496 4.97119 +3.01438 4.36109 +7.4932 7.92357 +7.51661 7.53354 +7.60692 8.49678 +1.76088 2.59103 +7.08578 7.39566 +4.83605 5.42933 +-0.186592 0.847663 +1.15879 2.33996 +8.11815 9.35472 +6.02584 7.62549 +0.881084 1.00015 +5.39067 6.27026 +0.910755 0.97444 +5.32174 5.65652 +7.69388 8.24928 +3.40521 3.7615 +5.60321 6.92388 +8.25096 8.34324 +0.00108913 2.16897 +0.508035 0.66573 +-0.0517816 0.0876197 +3.26472 4.30955 +1.99494 2.14903 +2.089 4.32368 +5.17378 5.75964 +2.8779 3.54361 +6.56459 6.90645 +1.43196 2.88337 +1.48917 1.94009 +3.40807 4.25784 +8.0334 8.13458 +8.22254 9.6175 +2.96308 3.14349 +5.04768 5.71252 +3.9977 4.72614 +1.44384 1.60782 +7.78147 8.19817 +7.03854 7.50085 +5.90747 7.06091 +2.89169 4.31831 +2.46167 3.16529 +9.13228 9.1504 +2.57975 3.05313 +5.75976 6.52958 +8.10499 8.98982 +8.43162 8.76377 +0.422917 0.668254 +1.69046 2.09962 +5.50386 6.66954 +0.0897183 0.564514 +3.50103 4.1041 +3.91918 4.52559 +4.39297 6.18876 +3.90396 4.90868 +9.69362 9.85528 +6.27994 6.95062 +8.01563 9.09433 +8.25641 9.72944 +8.22072 8.35423 +1.27059 1.61352 +8.53312 8.96235 +3.49185 3.9042 +5.79579 6.046 +0.489013 1.2147 +4.00074 4.177 +2.66625 2.93036 +7.20267 9.34958 +7.44659 8.54707 +8.99915 10.1143 +7.59922 7.82031 +8.38502 9.03222 +0.160075 0.294398 +4.14549 4.3927 +9.35554 10.248 +-0.159435 0.467922 +2.17272 3.72336 +8.63811 8.79976 +4.23215 4.66461 +6.99516 8.2035 +6.45212 7.88791 +6.20141 6.28633 +7.69396 8.82204 +4.50807 5.96315 +8.51725 8.89286 +0.939492 2.12064 +7.4615 7.62666 +8.46681 9.11769 +3.92828 5.40884 +9.05622 9.40015 +0.229625 0.860838 +2.05694 2.52113 +-0.217927 0.574255 +9.55146 10.3256 +8.31497 8.3417 +3.52833 4.47013 +7.7131 8.52058 +2.15462 2.66777 +5.7674 6.17553 +3.3358 4.10589 +2.06642 3.00412 +2.43387 2.85242 +5.09473 5.84276 +7.3287 7.54846 +4.64254 5.11465 +4.05785 4.93614 +4.25413 5.43513 +2.96476 3.15378 +3.53732 4.48239 +2.34137 4.01272 +2.24879 3.40626 +3.43323 4.49055 +0.871415 1.33068 +0.508929 1.65611 +4.92057 4.94743 +7.03376 7.35193 +5.73043 6.47264 +7.82417 9.93642 +5.24102 5.9178 +2.38528 4.1676 +6.27437 7.19631 +9.29267 9.53262 +4.10098 5.24964 +0.383714 0.833317 +5.97628 7.92987 +8.15799 8.96819 +8.1687 8.29862 +8.16289 10.5149 +7.38205 7.89765 +3.81883 4.15607 +9.46915 9.61755 +1.50756 1.51863 +2.34236 2.84689 +0.398473 1.15027 +1.05302 1.49155 +8.71687 9.35232 +1.0502 1.40395 +7.83685 8.76302 +7.7731 8.46899 +5.56618 5.97458 +2.90035 4.12043 +6.40644 6.68706 +3.95201 4.37075 +7.1831 7.67748 +9.42789 10.0914 +5.45198 7.01256 +8.64609 9.45756 +6.01864 6.31515 +7.64621 8.65533 +5.45654 5.76553 +2.04332 2.75476 +5.49454 5.85693 +6.13688 6.21927 +2.66255 2.7385 +4.8326 6.43772 +9.12704 9.45287 +-0.294488 0.318697 +2.26979 2.35516 +4.12949 5.58506 +3.01416 3.62246 +6.64697 7.10221 +6.44307 6.82985 +4.10484 4.73148 +7.42589 7.6029 +5.33055 5.50395 +2.46474 3.05847 +5.43677 5.59206 +2.13807 2.3988 +-0.38424 1.8121 +0.00916704 0.219304 +8.62621 10.2262 +3.33927 4.51169 +5.45656 7.13165 +5.29253 6.57917 +3.51704 3.9421 +8.63729 9.13361 +3.92626 4.3469 +6.83104 7.52695 +1.22258 2.28191 +0.447646 0.789809 +7.96543 8.54328 +2.24269 2.42571 +4.4161 5.40481 +0.813992 2.21792 +0.694664 0.974182 +6.50017 6.88902 +4.00723 4.65882 +9.05784 9.85062 +6.80276 6.98196 +0.105446 0.379881 +0.416982 0.53336 +9.01269 9.55204 +3.27197 4.23315 +6.7017 6.89704 +4.21512 4.42378 +4.86735 6.90949 +4.52235 5.36878 +2.62205 3.55746 +-0.551048 0.555476 +1.63274 2.71251 +4.26739 4.88085 +8.23129 9.77405 +2.49409 3.96851 +6.66387 6.88886 +7.72383 8.90611 +3.18511 3.27281 +0.73722 1.64435 +7.90329 9.02868 +6.94845 7.06773 +0.509461 1.54928 +4.63885 5.51652 +9.24395 9.5121 +1.00007 1.57161 +5.31349 5.45437 +0.929284 1.71034 +7.05985 7.63288 +7.38418 7.45373 +4.14937 6.5167 +7.49989 8.6081 +9.28313 9.57721 +4.41285 5.1497 +2.96148 3.09221 +1.58256 1.66419 +4.45116 5.43488 +5.70927 7.11699 +3.61105 3.93153 +5.92285 6.63773 +3.50065 4.48453 +7.97338 8.96464 +0.541394 0.965435 +4.46469 5.03925 +7.33695 7.6484 +9.64234 9.6938 +4.16378 4.17886 +7.10741 7.31549 +1.51829 2.62477 +2.1892 2.9684 +9.23767 10.0462 +7.87649 7.97087 +7.05385 7.85952 +6.91232 7.50277 +6.60185 7.81572 +2.27112 3.90211 +5.74452 8.2018 +6.25117 6.26911 +0.525893 1.53447 +0.392956 0.959233 +3.51591 4.71055 +3.10449 5.41156 +7.35964 7.65642 +2.89831 3.54334 +3.42338 3.68259 +4.75496 5.51419 +3.8792 4.48395 +2.18007 4.13236 +3.15798 3.16864 +8.91248 9.21598 +8.54636 9.34037 +7.93697 9.79709 +6.40205 8.9653 +9.67332 10.2252 +4.31771 5.25423 +7.27485 7.3725 +6.22971 7.11411 +1.16538 2.16762 +1.40443 1.6876 +3.14915 4.58847 +7.13761 8.72165 +4.38448 5.88699 +7.98309 9.19449 +8.491 9.05597 +5.55043 6.19359 +2.44006 3.36071 +9.56522 9.79903 +1.86129 2.00225 +1.65239 2.11478 +7.59392 8.4655 +2.44709 2.68538 +6.80932 7.04694 +8.8212 9.4182 +0.276845 0.956468 +8.17008 8.5538 +0.77864 2.06897 +6.78458 7.68692 +0.504907 2.67518 +5.56963 6.9058 +3.42691 3.5414 +2.52065 2.71583 +5.09924 6.26696 +0.223724 0.610039 +3.61258 5.29324 +0.388393 3.11131 +2.87763 4.45415 +8.26438 10.1169 +5.89742 8.17506 +1.89686 2.66651 +5.33662 5.68228 +3.37496 5.67291 +2.25713 2.36127 +0.402185 0.716342 +6.4231 6.79227 +3.22707 4.69314 +7.85092 8.77413 +3.31322 3.72455 +5.43021 7.7167 +8.5883 9.00864 +1.21371 1.71836 +6.35584 7.9706 +5.44438 5.50414 +5.31325 6.11217 +6.08888 6.78794 +7.70604 8.13257 +1.29858 2.48753 +5.54083 6.38817 +8.23948 9.82646 +7.5575 9.0224 +8.00415 9.39763 +0.488455 1.55358 +4.48727 5.20741 +6.46648 7.02349 +0.355939 0.611119 +9.4892 10.2189 +2.61893 2.82832 +0.268193 1.24687 +3.01964 5.19554 +6.29954 7.42795 +8.70796 9.48366 +5.39307 6.64597 +2.47001 2.60746 +5.30949 7.46529 +6.07973 6.16835 +0.764507 1.6144 +7.94123 8.52143 +1.88244 1.96592 +6.42103 7.02205 +7.673 7.73208 +6.66891 7.80675 +6.9305 7.5431 +6.62335 6.93873 +4.34846 5.77621 +0.49878 2.82928 +2.65221 2.80109 +7.45348 7.74372 +4.10129 5.26894 +3.87782 4.19855 +4.62113 5.22658 +2.84558 2.88185 +2.53209 2.86065 +8.94932 9.21967 +6.48046 6.89614 +5.81885 6.66829 +6.49129 6.62015 +8.5663 9.58685 +2.43346 3.89849 +9.36561 9.45886 +1.40232 2.65 +6.66 6.74041 +2.87007 3.49668 +4.71138 6.0184 +5.03638 6.08494 +7.77735 8.14253 +1.0301 1.27179 +2.58337 4.04699 +6.95419 7.89775 +7.81164 8.62551 +3.37669 3.96217 +4.68541 5.58692 +4.79697 6.34841 +3.95334 4.81962 +9.44006 10.0941 +4.91098 5.12386 +8.44273 10.1565 +3.6685 3.73156 +5.07599 5.33357 +-0.138235 0.260923 +2.71154 3.45603 +5.75096 6.16127 +4.4775 4.64308 +6.80557 8.97442 +5.49408 5.76652 +8.31937 9.12886 +3.26479 5.51673 +2.57425 3.03145 +2.42465 3.92714 +7.86505 8.50835 +3.29229 3.43549 +4.08537 4.69709 +7.83885 8.60616 +1.61622 2.72716 +9.10228 9.41907 +8.49325 9.46612 +-0.174644 0.351716 +1.95648 2.14825 +8.28844 8.4428 +4.35888 5.59521 +5.1396 5.22537 +0.330835 0.879566 +6.14972 6.82967 +3.14811 4.89049 +-0.231668 1.08277 +3.13526 4.94545 +8.32674 8.91046 +5.22364 5.48006 +9.84318 9.88416 +-1.07813 1.6965 +1.5095 2.0328 +8.03716 8.2792 +-1.01307 1.46703 +8.22096 9.0055 +8.9917 9.0415 +5.60623 6.74537 +3.15991 3.19314 +3.13863 3.26451 +0.739618 0.896958 +0.67599 1.18486 +3.37355 4.06303 +0.38605 0.410067 +3.03297 3.46387 +3.45867 3.79806 +8.67249 9.53278 +-0.213855 0.787363 +1.52316 2.61117 +8.31846 8.59736 +4.84685 4.94042 +7.41901 7.82623 +4.99029 5.09747 +5.3637 5.37612 +3.22123 4.77749 +3.21668 5.74743 +3.48748 4.59962 +8.00016 8.56269 +1.63631 2.42239 +1.05159 3.72319 +7.22643 7.95706 +5.65694 5.99195 +9.4469 9.66915 +0.857984 1.59867 +4.05869 5.69955 +2.65788 3.07259 +1.8038 3.38748 +3.91934 4.89922 +6.18534 6.70342 +2.85076 3.20176 +8.1897 9.9614 +0.685531 2.05322 +3.31097 4.00809 +8.26537 8.63475 +2.90508 4.07797 +1.25213 2.31285 +3.05752 4.03741 +-0.481913 0.605629 +1.87958 2.19386 +7.28689 7.76316 +4.82075 5.20688 +-0.08115 0.31839 +3.50085 5.89363 +1.31184 3.30269 +4.03137 4.81493 +6.11688 6.13923 +7.93584 8.43321 +4.9838 5.3733 +3.8174 4.11979 +8.56196 9.02824 +2.87809 3.89589 +7.95309 8.05432 +3.47469 3.63716 +6.61009 7.12576 +8.87374 9.79588 +7.31513 7.99089 +5.78084 6.68535 +4.96985 5.59877 +2.20236 2.52473 +0.661014 1.11035 +6.36183 6.58403 +6.67947 6.85093 +-0.242005 0.513902 +0.442966 1.72024 +6.4587 6.74016 +6.67958 8.0837 +8.98524 9.56405 +6.91409 7.59877 +3.73596 3.97705 +5.51193 5.96437 +3.72029 4.50126 +3.09896 3.23616 +8.83312 8.91774 +0.32173 0.486199 +4.21092 4.59955 +2.61616 4.07081 +1.89049 2.65559 +4.96401 5.00629 +9.33156 9.70914 +3.72455 4.61054 +8.91265 9.6563 +7.12401 8.04324 +6.65393 7.25572 +1.04032 1.24927 +3.0174 5.56006 +1.47645 2.26867 +3.49833 4.37416 +6.16877 6.34452 +6.47417 6.90595 +4.27056 4.92535 +7.60439 9.35352 +0.426219 0.754405 +8.5291 8.68579 +5.84717 6.64632 +1.99513 2.5284 +5.10669 7.83064 +6.99006 7.37272 +0.871836 1.5934 +3.6572 4.38875 +0.154617 0.290737 +5.91634 6.50415 +5.33982 5.45293 +6.92602 6.94691 +0.349512 1.61427 +8.02048 8.99943 +5.75598 7.34946 +5.86948 6.51327 +5.11707 5.6181 +6.27656 7.10043 +8.48922 9.73833 +8.35863 8.69746 +6.67829 7.07852 +8.51257 9.50383 +3.76636 4.33757 +4.82804 5.57166 +5.17892 5.61254 +1.35188 1.94069 +6.04969 6.06833 +5.34181 5.82455 +5.71714 6.71234 +0.966462 2.56278 +7.95169 8.15951 +6.53583 6.89673 +6.73246 8.34493 +8.71111 9.76467 +7.53215 9.56537 +0.619041 0.736713 +9.24399 9.50151 +8.57184 9.88538 +2.82682 3.77294 +4.2649 4.84602 +8.6621 8.96426 +8.04469 8.3189 +7.81877 8.42944 +2.78031 5.16589 +1.23076 1.43577 +8.35385 8.49632 +3.27901 3.66774 +0.595941 1.41354 +3.37123 5.16685 +9.11003 9.95515 +-0.25959 0.32069 +1.44153 1.70148 +1.61595 1.70799 +7.8201 8.53423 +8.5402 9.36947 +8.39125 9.8221 +6.2909 6.35773 +0.000933745 0.920054 +-0.21358 0.491025 +4.00874 4.03866 +3.43552 3.55874 +7.85942 7.98987 +7.6681 8.06748 +6.19541 7.14765 +8.53891 8.96393 +2.38789 3.26866 +-0.0162847 1.18379 +1.04764 1.52755 +0.400798 0.55475 +6.32001 6.94897 +5.9692 6.2012 +1.20784 2.67873 +3.58247 4.46372 +-0.229647 0.559407 +5.65979 5.73489 +2.32795 2.78462 +0.706144 1.55147 +4.56527 4.6636 +5.98901 7.20908 +9.27329 9.95152 +1.31296 1.70529 +5.82933 6.41329 +4.17452 5.29881 +4.15885 5.25117 +0.35549 1.3511 +1.0591 2.4463 +8.87597 9.55625 +6.66826 8.57255 +0.355945 1.40613 +5.39729 6.10218 +3.78791 4.37501 +9.53885 9.87184 +2.67568 2.82552 +4.44836 4.52939 +5.96764 7.40168 +6.35578 6.98546 +0.636857 1.19517 +3.3986 5.55448 +1.46493 2.66884 +-0.0676901 1.80921 +7.83396 8.53452 +8.3508 9.04561 +4.03407 6.0066 +0.997538 3.30635 +7.83064 8.03466 +4.57652 4.97461 +3.85952 4.15471 +0.960261 2.1069 +0.522458 1.52989 +8.81627 9.00768 +0.172256 1.29455 +5.69294 6.15752 +6.86391 7.75307 +2.32429 2.95415 +1.83191 1.90364 +0.400855 0.705649 +5.23264 5.39972 +5.19047 5.79842 +2.40804 2.89401 +0.462887 1.43874 +6.70213 7.90229 +4.37985 4.95797 +3.73768 4.30645 +0.756797 2.11146 +0.458724 0.472099 +3.93098 6.47147 +5.5294 6.00365 +2.97106 3.42174 +5.75875 5.80235 +7.96799 9.02105 +5.36254 7.22823 +6.56124 7.39973 +9.49234 9.57879 +2.87576 3.59509 +3.49182 4.28124 +8.68021 9.94486 +9.60199 10.1276 +9.70115 9.81776 +3.09609 3.98732 +5.00113 8.15031 +5.21248 5.74835 +9.23337 9.5696 +2.92777 3.56297 +2.52044 3.04905 +4.79908 5.05762 +1.98626 3.69659 +4.78726 6.20637 +7.39711 7.42831 +4.44319 4.78716 +9.28452 10.0832 +8.00774 8.85707 +9.22947 10.0523 +4.38653 4.86012 +5.15285 5.23106 +8.95413 9.75947 +2.90286 3.32407 +0.348694 1.39738 +-0.0660432 0.293424 +4.09079 4.2922 +6.0407 7.23031 +2.83771 3.72237 +8.54697 9.38898 +2.16742 3.45018 +8.83255 9.30343 +3.59112 3.6531 +7.53452 7.81898 +7.11781 7.19773 +8.2892 10.0259 +4.91072 5.06031 +5.8232 7.25924 +7.0641 8.31604 +9.477 9.63892 +5.8003 6.58306 +9.63988 10.2754 +0.654364 1.02398 +5.9488 6.85043 +7.86867 8.99891 +9.202 9.46902 +4.17932 4.20271 +6.50328 6.71085 +7.19848 8.15579 +5.62459 5.75449 +-0.159668 0.791409 +7.55683 8.7315 +1.03278 1.423 +0.751457 0.808785 +6.2203 6.50634 +1.64418 2.98238 +6.87468 7.00652 +6.36966 6.7117 +7.69893 8.89535 +0.419794 1.05032 +2.73928 4.31548 +0.409245 1.55228 +6.03905 6.39323 +0.409695 0.789834 +4.39148 4.40935 +1.14673 3.23607 +5.85562 6.44503 +6.87394 6.88742 +3.761 4.35136 +7.2208 8.01436 +6.49839 6.54002 +4.70791 5.91886 +4.24906 5.96619 +2.53482 3.91496 +-0.369254 0.69193 +4.81351 6.31088 +9.76066 10.0736 +1.4413 1.55942 +7.21917 8.88908 +6.03521 7.56826 +1.25568 1.42024 +5.47575 6.04431 +1.43099 1.99979 +5.1004 6.04088 +6.54798 6.56118 +1.0142 3.1564 +1.75267 2.1453 +1.28133 1.36044 +9.60996 10.0563 +1.14397 1.50247 +6.86688 7.08724 +8.38287 9.18041 +0.132076 1.27657 +6.52553 6.9301 +0.223917 1.41325 +1.18902 1.79753 +1.40084 1.75678 +1.94524 2.51929 +1.98276 2.62875 +0.763281 1.05483 +7.97952 8.51249 +1.059 3.05463 +5.33401 5.85094 +8.37442 8.64374 +6.62865 6.67315 +1.01707 1.64386 +0.113335 2.23523 +6.71906 8.00216 +-0.886574 1.29366 +4.20078 4.85294 +8.43336 9.06988 +3.55413 4.40768 +6.69076 9.01132 +6.18982 7.14109 +7.14381 7.7046 +8.63195 9.47031 +8.88052 9.84886 +3.34443 3.62637 +4.5862 4.72832 +4.95757 5.23571 +2.85993 4.04966 +1.43846 2.27425 +5.43112 6.30496 +-0.452609 1.55525 +7.17706 7.71287 +5.78537 5.79579 +8.51102 8.9466 +-0.472904 0.810489 +3.83688 4.24045 +8.04432 9.04582 +1.57259 3.37136 +1.22231 1.33582 +5.73006 6.26477 +2.90855 4.22125 +9.39717 9.4287 +3.63873 4.16094 +0.442035 2.08889 +0.294491 1.31124 +3.14755 3.86305 +6.57634 9.44898 +2.19051 2.41878 +4.99277 5.12569 +4.10425 4.9423 +4.83547 5.62769 +5.73879 5.78179 +8.90329 9.81905 +5.60168 6.17538 +5.83843 6.66128 +1.84271 2.57406 +3.01047 3.33662 +2.85037 3.79158 +3.49007 4.46877 +8.58942 9.51529 +0.613753 1.12824 +8.23757 9.54707 +9.27134 9.4196 +6.27126 6.56417 +2.17206 2.33018 +3.53588 5.17162 +8.6312 10.0868 +5.76342 6.66164 +9.01501 9.90984 +3.22004 4.18954 +4.37918 4.68595 +2.00928 3.49815 +6.64229 7.06693 +2.85962 4.58794 +8.45587 9.8897 +2.8481 3.65956 +8.65849 8.67336 +6.48486 6.58637 +5.82336 7.45254 +4.02267 4.59696 +2.24997 2.83815 +8.16201 8.55518 +7.40645 9.07085 +1.43137 1.50333 +8.7212 10.9419 +1.50523 2.44124 +1.92455 2.85819 +4.50866 4.53052 +5.75781 5.81275 +1.71013 2.0282 +9.31592 9.9015 +6.14972 8.18798 +1.85705 2.20068 +4.80971 5.10509 +3.31201 3.58168 +8.61824 9.31861 +7.19497 7.86933 +3.25381 4.53472 +5.62799 6.29537 +9.00659 10.021 +9.15156 9.74827 +2.0324 2.80741 +0.714403 1.00476 +1.26522 1.80417 +-0.362995 0.41758 +7.08785 7.71544 +5.55685 5.74045 +0.428866 3.03773 +7.61574 8.94894 +9.07256 9.69772 +4.49537 5.06822 +5.66388 6.48899 +1.69126 2.69607 +9.90539 10.0783 +6.56455 8.27128 +6.61988 7.86616 +7.42012 7.64493 +2.99922 3.35282 +4.69379 5.18947 +0.87894 1.30518 +9.47632 9.61234 +0.665754 0.855958 +-0.422778 2.11197 +3.38786 4.15441 +7.57236 8.75855 +1.89832 3.50224 +-0.185929 1.0777 +3.32911 5.53465 +6.91111 8.69247 +6.97456 7.86905 +4.75518 5.0948 +4.23733 5.83368 +8.52456 8.56086 +0.0978267 0.136564 +7.4668 7.99757 +5.52851 5.80858 +8.5833 8.88589 +5.10603 6.41348 +4.70682 6.59981 +8.60265 9.19477 +5.04514 6.24014 +4.49041 4.88669 +7.40925 9.15624 +0.80364 1.35315 +7.11604 8.01153 +0.267749 0.714089 +0.121521 0.822226 +9.30556 9.81307 +2.11398 2.92567 +5.97722 6.08022 +7.13483 7.22211 +8.00161 9.27274 +4.87681 5.51654 +3.11843 3.84311 +5.17747 5.98482 +3.6077 4.46306 +1.37454 2.2443 +4.93385 5.96357 +2.92184 4.0964 +4.88767 5.56353 +2.87394 3.76336 +0.326521 0.622872 +2.42056 2.45007 +-0.527891 0.827211 +6.73151 7.20155 +1.82048 2.54905 +1.35563 1.88701 +3.64202 4.10669 +5.22846 5.23953 +6.06271 6.46993 +2.71418 3.2081 +6.41179 7.57176 +7.45823 7.79609 +1.01227 1.39137 +9.0872 9.20132 +5.083 5.64038 +5.63236 5.97945 +-0.317645 0.822313 +0.865396 2.65587 +5.71839 5.98983 +1.50978 2.08611 +2.95824 3.70996 +0.264301 1.02233 +8.22351 8.98589 +4.87805 5.24127 +2.31329 3.46752 +6.19539 6.69676 +5.18643 5.40947 +7.15453 7.66643 +1.20694 2.25111 +7.87378 7.89093 +5.16514 5.604 +8.68354 9.01395 +7.33753 9.37499 +2.94627 4.06036 +8.64337 8.85727 +0.0353092 1.0128 +6.98437 7.35718 +6.77073 6.79959 +3.13559 3.70735 +7.40139 8.27017 +4.01174 4.39788 +3.22281 5.11647 +7.79256 8.58737 +0.642233 1.39694 +7.18603 8.69453 +3.37803 3.59355 +0.762287 0.84262 +4.21823 4.52565 +0.894924 1.35434 +0.844327 1.19938 +5.57958 7.05431 +-0.631066 1.55134 +3.78962 4.17935 +9.15329 10.4824 +5.47536 5.52975 +8.81243 9.16088 +4.45989 4.94123 +8.68235 9.45112 +8.04719 10.3938 +8.87349 9.40483 +0.502543 0.570283 +2.08512 2.47652 +-0.654512 0.804355 +3.68569 5.21711 +5.33017 5.80226 +3.44991 5.31415 +-0.00417763 2.95077 +7.17784 7.9318 +1.2721 1.31642 +5.24415 5.64173 +2.79434 3.28746 +4.54991 6.49276 +4.74707 5.12555 +7.36365 8.15777 +0.913049 1.79828 +1.47498 1.83425 +2.64271 3.38567 +4.78159 5.44718 +7.6087 7.66442 +-0.484393 0.909893 +3.16824 3.23757 +4.43021 5.90284 +4.25954 4.74995 +6.58742 7.24125 +1.86151 2.27069 +3.16459 4.5945 +1.06471 2.08965 +3.31028 3.83029 +1.52593 2.47521 +0.703789 1.42451 +1.47969 1.68923 +2.92352 4.24089 +9.84088 9.93485 +3.18205 4.27817 +7.39345 7.78945 +3.78808 5.41572 +4.38624 6.75693 +6.93065 7.16977 +1.01289 2.19807 +3.37006 3.54196 +5.50238 5.58285 +-0.225113 1.99347 +1.67796 1.86943 +6.1999 6.35102 +3.80494 4.74814 +1.13294 2.02639 +1.1965 2.6548 +-0.284453 0.856092 +4.26565 5.02196 +9.66948 9.88874 +6.20287 6.25528 +4.38154 6.65806 +3.77411 4.3075 +5.77177 6.78486 +9.16311 9.816 +3.22861 3.42009 +3.36573 4.34724 +6.76951 7.58025 +4.83813 5.23042 +3.87192 4.37372 +5.56859 5.90066 +-0.368163 1.4593 +5.44031 7.81671 +2.66342 2.99253 +6.11846 7.69499 +4.98811 5.17531 +4.45078 4.67513 +4.88206 4.94128 +2.51813 3.0268 +0.461292 1.15264 +2.34766 4.48652 +0.198819 2.23425 +6.85634 6.98248 +0.912438 1.81872 +4.84933 6.34912 +5.15613 5.82891 +0.172772 0.994083 +3.37381 3.64549 +1.98836 3.2697 +1.64344 2.06049 +0.766585 3.09305 +7.8979 8.28046 +4.34856 5.01341 +6.69809 7.24239 +5.19034 7.04959 +5.3747 6.92123 +7.8893 10.1251 +6.11207 6.99125 +5.37115 6.84111 +9.04786 9.11002 +6.45326 6.64415 +-0.76294 0.92832 +0.980411 1.8166 +3.05536 3.50031 +6.10827 7.55786 +6.57848 9.06264 +7.66855 8.861 +4.80276 4.82283 +1.99932 3.2877 +9.45229 9.80653 +0.457474 0.778684 +5.44444 5.95239 +5.60974 8.05169 +7.64656 7.79632 +6.78372 7.65134 +6.93878 7.82023 +9.08292 9.55308 +9.16329 9.25802 +1.4909 2.38688 +4.31881 5.3564 +5.12535 5.60119 +2.44591 2.54637 +7.36929 7.80452 +2.13707 2.97655 +9.73557 9.94588 +1.96637 3.36097 +0.857068 2.29643 +5.58224 5.91142 +8.90714 9.0255 +9.77988 10.0711 +0.41121 0.970955 +-0.518356 0.91447 +7.58725 7.71255 +8.1435 8.78712 +6.5487 7.17991 +4.94961 5.50283 +8.14086 9.03281 +3.51281 5.24806 +3.5786 3.84066 +6.27435 8.37735 +8.65263 9.5555 +2.87484 3.56117 +5.57707 6.55879 +-0.111276 0.264178 +3.60894 4.15477 +2.82322 3.64397 +8.40669 9.1127 +8.43089 10.5298 +1.38472 2.2453 +1.74464 2.00472 +4.01588 4.67572 +0.408869 0.938602 +2.06155 3.46067 +4.4871 5.08963 +2.4435 3.87355 +1.32864 2.55801 +4.78579 5.26122 +7.43027 7.57749 +6.90971 7.32716 +8.01095 9.46872 +9.41627 10.524 +8.83143 10.4474 +0.631816 1.75513 +1.72965 2.17123 +-0.513239 1.1886 +6.75616 6.7984 +2.49278 4.26493 +0.230011 0.966298 +3.78506 4.95013 +2.03886 3.14808 +7.87309 10.5637 +3.54564 3.58055 +1.91974 2.9194 +4.8503 4.98668 +4.66494 4.83558 +7.57916 8.24358 +4.78743 5.38547 +2.81034 3.34534 +1.00297 2.0138 +6.87593 7.17736 +3.93157 5.0655 +3.10361 4.05519 +8.22876 8.38326 +7.48377 8.31026 +2.23106 3.4905 +0.130934 0.606709 +1.22344 2.55898 +7.55829 7.92597 +4.10977 4.86263 +0.122756 0.264176 +3.8357 4.15854 +1.28414 2.13031 +0.280029 0.805504 +2.88245 4.1704 +5.57936 6.94781 +6.22719 6.33201 +-0.761013 1.16475 +6.16636 7.12566 +2.98935 3.192 +2.23263 2.34362 +3.9082 4.11692 +2.66865 3.5275 +1.87676 2.43966 +4.60035 5.39332 +2.74287 3.73097 +2.81953 3.96666 +5.73644 6.04042 +4.02179 4.52419 +3.26438 4.07346 +1.22509 2.13719 +7.91885 9.71846 +1.28152 1.48079 +7.97918 9.26344 +8.75682 9.8677 +7.25678 7.45362 +8.16161 8.87066 +1.21873 2.37224 +7.76739 9.06346 +3.89932 5.03406 +3.53901 4.37006 +2.93795 4.04333 +6.36543 6.72985 +4.72622 4.98804 +1.86205 1.99008 +0.784581 2.05264 +0.978519 2.91723 +3.9067 6.47195 +0.735425 2.38151 +8.37394 8.41609 +6.91804 7.23374 +9.39259 10.1026 +7.28732 7.43466 +4.75982 5.44264 +6.71504 7.53933 +2.17125 2.54358 +0.703562 1.39087 +-0.221711 0.541965 +9.22839 9.39159 +9.53465 9.97585 +1.44304 2.53666 +7.886 8.85051 +9.33174 10.1632 +2.60898 3.42889 +1.73658 2.02589 +6.31651 6.77762 +7.26755 8.34499 +9.01312 10.9837 +7.47361 8.96251 +7.98365 8.02586 +1.40065 3.44891 +9.44617 9.55391 +8.24265 9.34849 +9.366 10.4216 +0.375354 1.17522 +3.37114 3.38278 +-0.742469 1.07634 +4.29988 4.81879 +4.18605 7.21928 +7.41047 8.29198 +6.68173 7.60225 +3.24292 3.30695 +1.8951 3.42167 +3.97359 4.2857 +4.72621 5.80575 +4.75014 5.02239 +6.43454 6.94568 +7.16601 8.10355 +2.16685 2.23666 +6.70852 8.63284 +8.16988 8.95848 +0.277002 1.30648 +1.5803 2.28632 +2.22634 2.34679 +0.200623 0.814959 +5.27457 6.51651 +2.49533 2.90705 +6.48922 6.69528 +8.18879 8.63551 +2.75159 3.633 +0.884853 1.56434 +1.87488 3.98951 +4.24783 5.17713 +6.22499 6.56095 +5.68238 5.99272 +3.75553 3.85012 +4.87543 5.39966 +6.62671 8.72493 +3.50262 4.05131 +5.38952 5.4974 +7.84971 7.94051 +5.39123 6.66564 +5.43986 6.17256 +7.48968 7.7677 +4.2685 4.57296 +1.75169 4.11058 +5.03634 5.16102 +4.68003 4.84715 +8.36249 9.98761 +8.94297 10.6969 +6.21572 6.24305 +7.90303 8.0672 +7.90426 8.41244 +5.98512 7.93187 +5.13297 5.27136 +6.58367 7.4971 +4.72663 5.22956 +7.99667 8.59246 +4.3303 5.92188 +1.3132 1.80875 +7.70104 9.20947 +1.78862 2.00473 +9.63678 9.65571 +-0.264416 0.318054 +2.70004 3.40777 +2.74642 3.73608 +3.6494 3.6743 +8.03113 9.22851 +1.07526 1.3116 +4.05436 5.33291 +4.60907 6.03605 +7.83426 9.10358 +2.27997 2.77309 +5.63139 6.92616 +4.40717 5.25214 +1.98986 3.5062 +2.42393 2.9584 +1.94336 3.08456 +1.20185 3.01827 +0.641733 2.10095 +7.25046 8.29391 +0.640392 1.26451 +3.9588 4.85492 +6.83036 7.41101 +6.48581 7.08757 +6.48734 8.47856 +9.55084 10.3774 +-0.173137 1.26574 +2.32702 2.58775 +2.7463 3.13914 +7.86951 8.62807 +5.96916 7.92759 +0.217046 1.70373 +1.04207 1.05755 +4.79058 5.07902 +4.19024 5.35395 +9.00175 9.83715 +8.37554 9.275 +4.5204 4.82999 +3.49936 4.75519 +7.07916 7.74619 +6.66726 7.35282 +7.39513 8.55523 +7.50381 9.60708 +1.39304 2.26927 +2.84101 4.76376 +1.21779 1.59353 +4.7893 5.70143 +9.12195 9.57131 +5.40461 6.15443 +2.86445 4.26837 +8.01324 10.9082 +2.96659 3.8042 +2.4897 4.59323 +6.37887 7.15878 +7.00143 7.6419 +3.22491 3.41843 +1.22852 3.31783 +2.09881 2.56121 +4.43205 4.67051 +4.39328 4.66715 +2.38355 3.39058 +0.638802 1.59399 +5.32717 5.81376 +8.00353 9.72007 +8.77281 9.81649 +8.95552 9.86609 +2.90915 3.96556 +3.88176 4.93124 +6.45945 7.69942 +-0.108577 1.57424 +0.304992 0.320561 +6.47789 6.5515 +1.98211 2.05312 +6.2741 7.35626 +9.45057 9.67918 +5.2916 5.48037 +0.158802 0.712187 +6.42002 6.84323 +9.11085 9.13063 +9.42446 9.95882 +6.03624 6.96469 +9.2473 9.6286 +7.10342 8.71163 +3.34072 3.35187 +7.4602 8.58506 +8.7963 8.81873 +0.323615 2.22687 +0.326746 1.76681 +2.20062 2.76862 +7.55181 7.85006 +0.941035 1.28117 +8.76643 9.60019 +9.19731 9.33092 +6.0479 6.57293 +6.12725 6.24356 +7.53078 8.92488 +3.1841 3.48283 +1.85544 2.01888 +7.3849 9.29183 +5.03915 5.27721 +4.77142 5.46282 +-0.291696 1.14641 +1.61367 2.20867 +5.31853 6.69431 +2.52731 3.13139 +4.86677 5.18106 +4.50183 4.60969 +5.95881 6.09964 +2.41939 4.42026 +6.92003 7.17891 +4.29584 5.48557 +8.02803 9.06315 +2.82326 3.49599 +5.8647 5.87561 +2.38814 3.62688 +6.32418 7.17662 +5.99907 6.5059 +3.84698 4.14446 +9.80728 9.82132 +5.2366 6.30871 +9.81878 9.91004 +1.53024 1.83525 +2.98035 3.68531 +4.5418 6.98786 +5.19561 5.9846 +0.946068 1.46672 +3.26948 4.71928 +6.13476 7.68682 +8.36934 9.65072 +6.40074 7.14762 +1.01349 1.80493 +8.4514 10.25 +-0.180382 0.682704 +1.03041 1.63565 +5.64642 6.96069 +2.73598 3.67485 +5.8705 6.66157 +4.68343 4.7176 +5.83787 7.6818 +1.42529 2.234 +3.73726 4.19241 +5.38341 5.81884 +1.13088 1.69073 +0.968034 1.98828 +1.06007 1.11039 +3.50129 4.51807 +5.83133 6.77904 +-0.334945 1.29129 +0.326706 1.16015 +9.15028 10.4391 +5.13047 6.79712 +1.06952 1.38997 +5.79345 6.49898 +7.88149 8.5143 +8.00404 8.09794 +8.22725 8.28904 +6.38406 6.61356 +6.32166 6.73458 +7.17066 7.32049 +1.64338 3.79327 +7.92135 8.55568 +7.15578 7.42231 +6.70701 7.65427 +5.76608 7.63064 +3.54163 4.08662 +3.81402 6.76906 +4.5998 4.61865 +9.01471 9.18718 +5.21234 5.73335 +0.946018 1.39917 +6.99714 8.29739 +5.64458 6.93965 +3.39809 5.70907 +6.32284 6.83604 +8.50347 8.53097 +3.90118 4.85721 +9.41198 9.62076 +4.41514 5.55152 +7.69979 7.81249 +5.34434 5.37105 +7.25274 7.76114 +7.67383 7.92718 +5.82851 6.29417 +0.935651 1.2842 +0.639586 0.786771 +6.39823 8.31226 +3.67546 4.89035 +9.20323 9.57287 +2.33896 2.99576 +8.51933 8.80243 +0.983098 1.11084 +8.48215 9.42998 +7.29586 7.3914 +2.00695 2.89046 +2.60909 2.62433 +2.04118 2.92033 +7.60386 9.01419 +7.32896 7.73342 +9.51693 9.54891 +5.1323 5.24962 +6.35326 7.18302 +2.50952 3.51872 +3.4149 3.57431 +9.18412 10.4976 +5.68123 6.42697 +5.87758 6.0124 +6.3202 6.64588 +8.2547 9.98176 +5.50949 5.7854 +0.0824268 0.128178 +2.17292 3.76233 +7.22786 7.68214 +5.09326 6.4151 +4.30171 4.86688 +2.39206 3.47399 +7.95152 8.35556 +2.40133 2.936 +2.77819 3.87516 +3.252 4.33376 +9.54269 9.7513 +6.6747 6.73043 +0.611474 1.97158 +7.65864 8.53689 +1.58345 1.8017 +2.56917 2.8152 +8.5424 8.8301 +4.98159 5.44499 +5.82482 6.03578 +3.55509 4.90785 +5.77028 5.94747 +0.163965 1.1379 +2.85039 2.94261 +4.24343 4.67273 +3.22636 4.06084 +6.03662 6.21018 +4.55495 5.07697 +1.91173 2.51739 +6.54894 7.24036 +5.55502 6.92676 +0.245707 0.586188 +2.28044 3.29563 +4.71378 5.25198 +8.28953 8.44891 +9.42282 10.179 +5.0548 5.73614 +6.3203 6.43659 +6.54178 8.82077 +3.67181 4.17365 +8.51445 8.96445 +1.69648 2.84524 +0.194222 0.920147 +2.48533 2.59803 +1.66002 1.6739 +4.79833 4.95404 +1.09801 1.11009 +6.62529 7.4066 +8.0099 8.37262 +3.55429 4.11824 +6.2666 7.12137 +7.83222 8.01342 +9.37156 9.72961 +1.1647 4.04434 +4.50719 5.09068 +3.25175 3.75482 +8.28659 9.30848 +7.30009 8.60755 +-1.12073 1.21016 +0.310087 0.725712 +8.3746 9.13511 +9.11925 10.2234 +9.68703 9.7137 +0.603098 0.844291 +5.88373 6.99327 +0.852802 1.43297 +3.7463 5.82283 +7.69639 8.25446 +-0.337322 0.977113 +8.76606 9.16618 +3.43527 3.6616 +3.93587 5.39471 +5.66569 7.20462 +5.34999 5.7193 +3.25589 3.706 +1.52012 2.55985 +4.74228 5.43725 +5.15323 5.51652 +7.77237 8.33717 +-0.0514419 0.914127 +9.27182 9.59476 +8.14192 9.74859 +6.42702 7.20331 +7.51351 7.68358 +7.0947 7.46059 +7.97635 8.59449 +2.39931 2.66008 +5.79481 5.94673 +4.41054 4.81613 +2.72202 3.61239 +2.86039 3.44719 +1.81115 3.28151 +-0.566995 0.734214 +9.61998 9.72024 +7.4163 7.61821 +0.42522 0.552659 +3.17617 4.36942 +0.740294 1.36953 +7.13755 8.39966 +0.219186 0.892588 +3.78307 5.2905 +0.783026 1.76155 +3.01893 3.33055 +3.12143 3.5713 +-0.792679 0.92539 +0.668572 1.12961 +3.88619 4.30545 +7.59276 8.1776 +4.71509 5.05622 +6.53406 7.04242 +1.581 2.21984 +4.7144 5.51372 +2.76338 3.50211 +0.16364 0.293599 +5.92365 6.10636 +3.11174 4.29165 +5.49295 6.48717 +-0.503239 0.795707 +7.30558 8.12408 +2.10674 4.13456 +7.11985 8.01932 +1.34672 1.48739 +4.05778 5.69084 +2.83686 2.9115 +6.4471 6.53909 +0.467374 1.84371 +2.76467 2.94177 +4.87867 5.33932 +0.892878 1.96273 +1.13934 2.27205 +7.76918 8.39409 +6.72181 7.43901 +7.0836 8.68472 +7.12924 7.56332 +0.689172 1.62922 +9.41146 9.91043 +0.398265 1.27579 +6.29966 7.4874 +5.09438 5.65334 +6.04623 6.4687 +5.75305 6.89731 +0.308118 0.459501 +3.63692 4.30501 +3.1755 3.71009 +7.32787 7.52785 +2.23235 4.09978 +2.71191 2.91513 +0.209457 0.840713 +7.31489 7.38296 +6.21245 6.91111 +5.75983 5.96049 +5.92056 8.24518 +-0.354452 0.489638 +4.05894 5.34828 +1.56299 1.57414 +2.85083 3.27455 +8.78323 10.0012 +0.208502 1.26471 +6.10824 6.79285 +5.55114 8.03968 +6.13077 6.32342 +7.34865 7.82592 +3.94835 4.75016 +7.8268 8.72249 +4.85131 5.07903 +5.40398 6.0134 +2.85971 3.85293 +0.126379 1.45545 +3.15768 4.28388 +9.64566 9.70016 +4.47514 6.31064 +6.44995 7.2894 +4.70992 6.13777 +3.91128 4.22263 +7.35627 8.07739 +2.49215 2.68749 +8.09946 9.16929 +0.925679 1.92784 +8.48437 8.63892 +7.2255 9.18109 +-0.00840282 0.0168954 +5.91933 6.6274 +4.16086 4.64302 +8.27009 8.47868 +1.73372 2.93094 +8.17421 9.17705 +9.19136 9.43222 +0.0653594 0.648416 +8.69 8.96184 +8.99355 9.40832 +6.25088 6.26945 +6.72391 7.38424 +9.59708 10.3496 +6.00971 6.18818 +4.64468 5.75797 +3.64832 5.30079 +5.99378 7.8792 +6.5388 6.99379 +7.31694 8.43802 +3.66227 4.92638 +9.55964 10.3796 +-0.14433 0.29095 +3.56716 3.71252 +3.82062 4.27788 +8.10405 9.35275 +7.17891 7.46539 +1.17698 1.29602 +4.48829 5.03134 +7.18025 8.13852 +9.42388 10.3634 +5.2158 6.17469 +5.22926 6.52397 +5.16731 6.40625 +6.53348 7.269 +2.07834 2.39172 +9.65044 10.1519 +8.64551 10.1294 +9.29006 10.5993 +1.50639 2.83173 +5.71675 5.99216 +3.0783 3.35571 +0.115401 1.31431 +8.03988 8.11942 +3.11917 4.53956 +1.14552 1.1646 +5.34782 6.43017 +0.0701702 1.0368 +0.183335 0.440704 +6.33438 7.71607 +2.11533 2.64323 +7.12104 7.13366 +7.21548 8.26968 +3.13445 4.13568 +4.57452 4.74602 +2.60889 3.69846 +7.21184 7.47573 +6.87651 7.03405 +2.65431 3.94352 +1.50006 1.70087 +6.16344 7.54429 +7.02057 7.73067 +8.27833 9.01489 +0.500833 0.597845 +8.34751 9.88925 +2.80242 2.91837 +5.29424 6.079 +8.36276 9.10074 +0.216887 0.268335 +1.30798 3.16393 +3.93851 4.22658 +2.58028 3.14744 +9.31131 10.3451 +7.37262 8.84852 +4.45306 5.6723 +3.74535 4.0721 +4.90174 5.63875 +3.41847 4.65199 +3.10265 3.82548 +6.56126 6.97557 +2.57449 2.95098 +7.97418 9.06301 +9.2203 9.66829 +4.64922 4.96305 +8.83034 10.115 +6.6685 6.89847 +7.36585 7.48669 +8.66761 9.39287 +0.562216 0.961875 +7.56292 7.81006 +8.50715 8.95572 +0.572825 2.24755 +5.9367 6.06766 +-0.769578 0.776163 +4.48224 4.9553 +8.21069 9.29643 +8.57206 9.47175 +1.10032 1.21371 +3.76306 3.87152 +6.46197 8.18457 +6.96501 9.70727 +3.42357 3.93484 +0.818601 2.42743 +-0.119739 0.397938 +-0.378761 0.523892 +8.03394 9.35409 +3.60283 3.98864 +2.21789 2.70607 +-0.255329 0.319063 +6.20806 6.22609 +7.1283 8.04391 +3.73565 4.03638 +8.5374 9.10987 +5.22675 5.35072 +7.51777 7.58439 +9.12636 10.4159 +9.15003 9.40672 +0.217863 1.19883 +9.42416 9.9178 +2.55337 3.8088 +7.03655 7.98242 +9.17171 9.8047 +0.110162 0.722738 +3.16467 3.58897 +6.47244 7.12961 +1.0456 1.65614 +1.58456 1.62844 +1.79039 1.84035 +6.24286 7.07838 +9.08631 9.11684 +3.05068 3.40838 +2.81212 4.03665 +2.52011 3.09841 +8.06001 8.16356 +7.07649 7.52685 +2.47666 2.86548 +8.66241 8.95103 +-0.298116 0.662697 +0.822443 2.46125 +2.07619 2.33674 +4.84135 6.21034 +7.49625 8.13026 +7.85854 8.29618 +3.01722 3.37062 +6.54393 7.30306 +2.21113 2.30166 +8.32138 8.57349 +6.2995 6.33514 +3.0018 3.56886 +4.63378 5.52214 +6.71908 8.96715 +2.29809 2.95581 +8.34947 8.71096 +4.96902 5.32075 +9.51051 9.72733 +3.311 4.77789 +3.50233 3.66309 +4.95177 5.76002 +6.12876 7.22391 +6.27743 6.79393 +3.60638 3.6833 +5.20305 5.50848 +7.16065 8.88358 +9.45049 10.2539 +6.16892 7.0314 +8.08479 9.74516 +0.0717867 0.669987 +2.17569 3.34098 +4.81716 5.7509 +7.63999 8.01157 +5.87228 6.60363 +3.39621 4.35575 +4.96079 5.07901 +7.57639 8.82003 +8.27285 8.52609 +0.665858 1.64782 +1.74256 2.07126 +6.19512 6.4258 +0.664592 1.30896 +0.180682 1.43746 +6.46752 6.81303 +2.55562 3.08708 +9.33695 9.63312 +6.33821 6.77092 +7.88252 8.55026 +8.17937 8.45385 +-0.415294 0.793096 +5.22077 5.54553 +8.67808 9.10041 +1.72096 1.92024 +0.492778 1.48076 +2.29514 2.88531 +0.0934389 1.37614 +8.40297 9.11121 +3.66605 3.91717 +-0.274468 0.867811 +9.41428 9.56659 +1.22657 2.12792 +8.71336 9.85384 +5.09347 5.42905 +2.02877 2.36652 +5.99112 7.40703 +0.911618 3.48138 +4.84352 5.11131 +1.16309 2.08613 +5.58561 5.84805 +0.663543 1.08921 +1.83189 3.93269 +4.07731 4.38879 +4.04789 4.9989 +2.09457 3.61279 +2.00982 2.94396 +7.37537 7.66574 +5.08648 5.80122 +9.19959 10.2263 +4.26136 4.86194 +6.67875 7.61134 +1.27462 2.48399 +7.2237 7.82324 +-0.0141009 0.0441377 +8.32069 8.36192 +2.82562 3.0717 +-0.528918 1.25301 +1.90486 3.04714 +1.34489 1.75301 +3.14332 4.03322 +8.55351 10.8681 +9.09824 10.3828 +0.496868 0.622499 +7.11112 7.62765 +0.335233 0.528962 +6.71335 7.13937 +6.78574 7.71172 +9.13568 9.22251 +7.10299 7.64765 +3.64747 4.06685 +8.64041 9.40111 +2.43515 2.93081 +2.95476 3.68588 +0.0863751 0.777976 +6.5891 8.18165 +8.80986 10.0735 +0.568868 1.63785 +4.41677 5.42049 +8.72857 9.88426 +3.67467 4.25442 +8.98168 10.1087 +5.08611 5.50098 +1.28982 2.34422 +-0.914176 0.969847 +4.35042 4.42735 +4.02282 5.08164 +9.00566 9.4791 +2.71821 3.24065 +3.20252 3.24988 +8.61559 9.6733 +3.15157 4.7685 +3.59348 4.67872 +0.286864 0.36279 +8.40374 10.528 +7.53647 8.13523 +6.81591 6.90226 +7.68111 9.10704 +8.37958 8.73818 +3.25808 4.40893 +1.50348 3.00641 +0.20803 1.40949 +3.93771 4.84177 +2.79232 3.35329 +4.2666 4.63588 +0.341784 1.46241 +1.53063 2.06724 +8.58212 8.86194 +8.95411 9.70651 +8.71591 9.26292 +6.66088 6.7009 +3.95881 5.93917 +8.5823 8.76007 +-0.308958 0.34174 +1.03188 1.37677 +7.52675 9.84031 +4.27952 4.32984 +1.83465 2.27607 +8.12096 8.64922 +2.22605 4.40067 +0.00929139 0.871342 +0.376531 1.29354 +3.5257 4.30165 +1.95846 4.09589 +-0.200922 0.799272 +0.24432 1.76673 +4.73477 5.06514 +8.97059 9.2276 +2.89618 2.93969 +0.168256 1.03325 +3.44522 3.83622 +2.74889 2.76042 +6.07155 6.7979 +9.06484 9.09804 +7.56658 9.29215 +4.3084 5.45621 +-0.0786996 1.12809 +8.48249 9.74107 +6.4196 6.61469 +1.57119 1.87612 +3.15463 3.86251 +2.0089 2.57741 +6.53618 7.12035 +7.07901 7.29396 +0.114756 0.887413 +8.90806 9.65731 +4.0921 5.23407 +2.63441 2.92344 +4.31769 4.98832 +8.90336 9.26837 +8.25313 8.91204 +2.87758 4.00212 +-0.708243 0.789072 +3.28656 4.55872 +5.73177 5.80293 +5.40596 5.5844 +4.09318 4.57774 +6.16178 7.00613 +8.5514 10.5495 +6.83987 7.3056 +1.06341 1.97923 +7.82153 9.00722 +0.923069 1.42337 +1.83408 2.82331 +5.75305 7.23576 +0.241909 0.96721 +1.16645 2.10491 +5.41819 6.09839 +7.49242 7.69495 +0.347233 0.383681 +2.33245 2.53467 +4.91249 5.27759 +8.11182 9.2758 +0.0955456 0.548659 +-0.359909 0.48055 +1.64759 3.47097 +6.37855 7.40015 +0.423283 2.08857 +4.10068 4.46856 +2.58389 2.69626 +0.848483 2.72258 +8.67321 8.88903 +2.07607 3.42398 +3.11033 3.80741 +2.24735 3.48626 +8.11883 8.7687 +0.29959 1.41603 +4.84924 5.13641 +1.44102 1.74592 +1.13437 2.50296 +1.75876 3.09859 +4.75363 5.90838 +7.36423 8.20074 +5.51578 6.42652 +0.915633 1.86015 +9.44679 10.3479 +2.61691 3.60215 +6.26524 7.2538 +2.74326 3.12649 +5.83934 6.98592 +9.1111 10.4891 +2.27066 2.82709 +8.19359 8.67233 +0.834236 1.7066 +6.19288 7.21392 +-0.249843 0.891821 +2.5652 3.25132 +5.25356 5.88905 +3.99545 4.18918 +1.93186 2.51527 +4.44621 4.82421 +5.89181 7.36963 +2.77321 3.60627 +2.76444 3.88016 +2.50062 2.66105 +1.14846 1.66146 +2.951 4.81656 +3.81976 4.01061 +4.75674 5.59916 +6.74092 7.08289 +2.09989 2.32514 +0.220723 0.865303 +5.48107 5.71875 +1.48372 2.88941 +0.484577 1.12051 +8.93618 9.7185 +1.89769 3.65655 +2.0129 3.55214 +9.23173 10.3694 +0.286189 1.22753 +0.453785 1.55541 +2.24068 2.6541 +8.80917 10.4969 +7.12801 7.15222 +9.25745 9.9103 +5.73429 6.76901 +7.54454 8.47157 +1.96008 3.74997 +8.00837 9.25665 +1.66384 2.07613 +5.53014 5.97461 +-1.32495 1.33319 +4.58479 5.2263 +7.92048 8.75668 +6.87595 7.02522 +0.157713 0.389585 +7.48277 7.51261 +8.10714 8.38399 +0.0802723 0.587088 +1.13024 1.71135 +5.71769 6.84757 +3.08261 4.31054 +2.95952 5.09762 +6.62815 7.44256 +5.0805 5.8499 +3.38489 3.73265 +1.10644 2.18331 +4.70493 7.31686 +2.2253 2.6338 +0.778359 1.6265 +6.94211 7.2149 +4.20976 4.99342 +7.47792 7.67881 +7.06219 8.76137 +4.97677 6.12206 +6.30829 6.69361 +6.19977 6.76781 +9.67636 10.2172 +3.41958 3.69137 +0.374486 0.943711 +4.00837 4.80107 +8.85401 10.1325 +6.0938 7.8919 +1.51055 3.08998 +8.94594 10.3139 +1.06714 2.65511 +0.703202 0.850595 +4.87735 6.00659 +8.3067 8.39924 +7.78071 8.3155 +1.98737 2.81116 +6.86323 8.07974 +1.03479 1.34584 +0.490512 0.670211 +5.82122 6.1901 +5.50836 6.63385 +7.9192 8.9606 +0.913719 2.18983 +4.97151 5.70909 +4.19907 4.37712 +2.01188 2.63318 +7.84813 9.3771 +5.32667 7.48502 +8.50951 10.1006 +-0.551637 0.930509 +1.06511 2.23353 +1.91111 3.42663 +9.37528 9.55327 +7.27975 7.38741 +3.46676 4.83165 +7.36137 8.70333 +-0.295762 0.623228 +8.48558 8.81076 +2.71689 3.41873 +6.49265 8.11042 +5.25516 5.57336 +6.10462 7.05991 +8.76997 9.15164 +7.86196 8.30651 +7.82765 9.24604 +5.98573 6.34182 +6.45367 7.47857 +3.27018 5.10835 +1.3079 2.37423 +-0.261387 0.338113 +7.60683 8.81791 +4.7346 7.41988 +5.25597 5.28517 +3.76704 4.52226 +3.91774 6.66976 +5.69618 8.92667 +1.86148 3.07531 +5.57404 6.51438 +9.39049 9.77921 +2.38692 4.21416 +6.84909 7.23633 +7.2379 7.58761 +4.73485 6.11606 +7.80013 8.08105 +1.72701 3.40244 +2.44475 4.4072 +9.72565 9.77726 +3.35288 4.06493 +8.91215 9.92325 +8.67991 9.65865 +0.253195 0.764339 +4.23564 5.59497 +1.84752 2.14986 +-0.502957 0.528737 +1.32656 2.11347 +9.81563 10.0213 +7.60114 8.05035 +8.51797 8.83342 +-0.394604 1.41267 +7.71614 8.63514 +0.530249 0.968898 +2.90463 3.01675 +7.58098 8.71658 +-0.253747 1.28827 +1.832 2.39006 +7.2268 7.27225 +3.84076 4.66703 +2.2564 2.73185 +7.31508 8.46008 +4.99387 5.64948 +7.21239 7.79983 +7.60231 7.8473 +0.555482 1.41892 +1.25539 1.73665 +8.41561 8.96404 +5.06771 5.17664 +0.0655744 2.10718 +8.00222 8.65909 +7.48841 7.83609 +6.30909 6.89448 +9.1697 9.55942 +1.36259 2.22582 +-0.923854 0.994771 +3.43724 4.64053 +8.09411 8.19574 +4.84869 5.52805 +2.69802 3.4119 +9.0613 9.29405 +0.565216 0.687165 +5.93495 6.57426 +1.86925 2.75493 +1.41068 2.00824 +1.60612 1.62471 +3.11499 5.89909 +2.69806 3.90538 +3.76301 4.22135 +3.30065 4.70725 +5.56461 7.02137 +8.35335 8.99287 +4.79259 4.88508 +6.7911 7.52912 +8.14843 8.28583 +3.67629 5.06406 +5.71462 7.04747 +9.06721 9.99733 +4.87932 6.8586 +8.00814 9.57664 +7.03069 7.51623 +9.0989 9.57644 +2.70873 3.91296 +1.64425 1.7007 +6.53716 6.99033 +8.29874 8.74509 +1.88941 2.57626 +4.65337 5.23247 +9.04723 9.06665 +3.52258 3.61496 +1.1207 1.80143 +0.680601 1.98384 +2.94593 5.38692 +2.65685 2.67932 +9.00469 10.2054 +6.44318 7.2657 +4.66656 5.33893 +3.41719 4.72453 +3.12403 4.21748 +6.67973 6.81775 +3.54347 4.14978 +3.02554 3.50812 +3.91883 3.93657 +7.31721 7.89895 +1.86275 2.85473 +6.23266 6.4449 +7.59855 9.38013 +9.07084 9.49309 +0.557656 2.6851 +6.899 7.37693 +4.23162 5.84314 +8.54108 9.37672 +3.9513 4.79746 +7.299 8.29678 +5.58879 5.88551 +9.14992 9.22385 +9.1914 9.31788 +4.95663 5.56316 +2.16516 2.39538 +0.722262 1.89664 +7.76447 7.80026 +2.77772 3.39136 +9.59513 9.78635 +1.02728 1.2181 +7.32631 7.56611 +7.37389 7.46163 +6.87949 8.18689 +8.95602 9.81169 +5.85364 6.63434 +0.129136 2.13484 +7.09608 7.71167 +7.1487 8.34258 +7.48738 8.3172 +8.77247 9.95985 +7.6706 9.56828 +8.14268 8.61726 +6.5455 7.90871 +4.57866 4.78453 +3.63937 4.42349 +5.18905 5.36516 +4.68884 5.62995 +5.88338 7.83824 +-0.002979 0.145818 +4.42981 4.77141 +0.558593 1.07999 +6.91713 7.36159 +5.13948 6.20805 +3.34368 4.07112 +7.27365 7.8383 +9.6898 9.9514 +6.14332 6.75102 +2.16534 2.78843 +2.8007 4.37952 +7.67047 7.72955 +8.77377 9.85092 +1.26087 1.55193 +6.29788 6.58511 +7.68178 9.05777 +0.383336 1.21247 +2.55185 4.30874 +8.91971 9.21836 +3.67638 4.68596 +8.13843 9.13684 +-0.424353 1.97502 +2.71499 2.93977 +0.104447 0.387901 +4.09592 4.67009 +0.808593 0.920798 +5.01258 6.30662 +4.97668 6.57412 +8.44135 9.03816 +2.78932 3.72809 +6.71337 7.15128 +4.27234 4.50127 +6.78266 9.70351 +6.48026 7.51491 +7.36296 8.42283 +4.80339 7.3704 +6.24735 7.3132 +0.134626 0.364187 +2.73854 4.09422 +0.809997 1.19657 +6.41154 6.50244 +7.16847 8.56485 +1.53582 3.33985 +1.92874 2.86427 +6.95941 7.01378 +5.8592 6.54917 +2.51802 2.75622 +3.3894 3.6957 +2.2547 2.64693 +8.62054 9.1951 +8.86378 10.0003 +1.87892 2.28732 +3.83146 4.21484 +1.53262 1.99692 +7.86048 7.93125 +1.79437 2.68269 +3.92781 4.24119 +5.43044 5.47935 +0.322904 0.618854 +3.42383 5.18531 +4.00989 5.83612 +7.06304 8.76582 +5.88039 6.77654 +8.638 8.9479 +1.73391 2.09002 +1.04861 2.84779 +-0.313019 0.557659 +3.35245 4.1308 +9.05373 9.57205 +5.85684 6.49193 +6.00719 6.86421 +4.25244 4.65772 +5.15865 5.61529 +8.78498 9.77544 +8.33803 9.26452 +3.42915 4.92279 +8.29884 8.94035 +5.10232 5.35924 +4.33571 4.86695 +7.86184 7.90029 +7.34345 7.36214 +0.201624 0.800371 +9.05882 10.5503 +4.32188 5.03154 +-0.0456982 1.22298 +2.90921 3.60013 +1.69306 2.36564 +7.79029 9.15059 +4.65205 5.06538 +6.34552 8.32176 +7.92695 9.32585 +7.17903 8.09903 +9.53561 9.60287 +0.365723 1.23929 +0.542889 0.849053 +8.15061 8.93512 +6.40042 6.41053 +5.82666 6.5488 +1.00893 1.83717 +1.76021 2.11893 +7.61076 8.6242 +2.32513 3.4856 +4.39023 6.01094 +-0.11754 0.421848 +6.76371 6.94513 +4.67607 5.58732 +-0.201992 0.765553 +7.42926 7.44429 +2.57485 2.85339 +2.74138 4.13421 +8.21645 9.18107 +6.28184 6.4996 +7.129 7.74678 +7.76842 8.74924 +3.5359 4.35892 +3.04103 3.24376 +2.29389 2.92164 +6.96306 7.64415 +8.82053 9.04584 +1.19911 2.06167 +5.91357 7.6773 +0.150241 1.23291 +4.48681 5.41762 +6.89156 8.13443 +5.37828 5.79944 +2.13694 2.91102 +1.35932 2.08272 +6.14309 6.23278 +4.03202 5.88521 +7.23417 7.43704 +1.2501 2.60793 +2.12334 3.65727 +7.05722 8.77078 +0.437873 0.585933 +6.33338 9.16643 +2.44724 4.40234 +2.92012 3.64047 +1.2039 3.25195 +8.6611 10.0398 +8.0088 9.13622 +5.96562 7.08515 +5.45181 6.65246 +0.742546 2.38958 +4.12919 4.93571 +0.428823 0.84483 +1.45226 2.5869 +9.50727 10.0211 +7.69194 8.66273 +1.25706 2.44554 +5.23247 5.47762 +0.499178 1.70722 +7.26569 8.72467 +3.59815 5.50022 +1.03601 2.43445 +0.092414 0.927635 +3.7917 3.995 +6.21977 8.40398 +3.1513 3.81188 +9.80482 10.0951 +8.65564 9.33687 +2.06164 3.49152 +2.09754 2.34929 +0.66126 2.31888 +5.34832 6.82603 +7.91038 8.59105 +0.695523 0.800961 +2.33406 2.71629 +8.37774 10.9253 +9.7682 10.106 +9.44382 9.5743 +8.78009 9.47645 +1.87309 3.04127 +1.86724 2.13913 +3.30049 3.52416 +7.18508 7.6648 +1.3736 2.12153 +2.41879 5.06716 +1.87815 2.29743 +1.76646 2.06335 +9.73034 9.95475 +0.497489 0.686102 +6.96908 7.17338 +9.23111 10.0148 +3.30981 4.21787 +9.53311 10.3734 +-0.067709 0.147251 +8.44557 8.82047 +7.10407 7.47639 +0.834352 1.36908 +9.1598 10.6508 +4.22018 4.38279 +3.8295 3.95462 +3.97302 4.97247 +1.55856 2.31013 +0.0217962 0.486978 +1.69845 2.65786 +-0.489562 0.582187 +5.10621 5.6055 +9.8478 9.85919 +6.15389 6.92324 +7.11469 8.0418 +3.20625 3.78209 +5.93389 7.66892 +1.15134 1.18023 +6.84797 7.4239 +2.9483 3.22279 +-0.43205 0.764755 +7.17846 7.33313 +5.4729 8.26894 +6.19512 7.32132 +0.591934 0.767568 +0.49266 1.80691 +9.08272 9.72242 +5.85683 6.36905 +5.27625 7.13913 +3.60853 3.98155 +0.642811 1.10253 +1.27117 1.5329 +8.76096 9.61776 +4.9498 5.12847 +7.53282 7.80438 +1.40487 1.65657 +3.45329 3.84307 +3.25698 3.49614 +2.38651 2.89802 +8.23114 8.99016 +9.58516 10.4145 +5.5185 6.27733 +0.583068 0.892249 +1.93142 2.35084 +7.94845 9.22667 +2.47963 3.9005 +3.46106 3.86301 +7.77744 8.43735 +1.41072 1.73969 +9.12904 10.4307 +3.52227 3.66861 +5.4743 5.86487 +-0.51727 1.63657 +5.09861 7.03162 +5.14763 5.93411 +3.23526 3.47376 +0.9702 1.74063 +9.28366 10.3322 +1.80257 1.92265 +8.63597 9.08467 +4.16006 4.97753 +6.37418 6.39374 +5.82376 6.62429 +7.74751 8.68962 +1.63821 2.53399 +4.9864 6.40969 +0.680772 0.995608 +3.74344 3.83319 +0.898055 1.8593 +2.36839 2.39307 +7.21046 7.51006 +0.60893 2.91523 +3.15017 4.30412 +5.02219 6.28886 +4.60541 4.73379 +8.41196 8.58978 +8.84706 10.8198 +6.95807 7.54952 +5.54729 6.9315 +4.62574 4.73423 +3.35252 3.59865 +1.02207 1.71791 +3.16408 3.73993 +0.639222 1.69519 +7.57978 8.05813 +2.41371 2.77174 +8.65544 10.093 +6.31988 6.70758 +6.5301 8.39328 +0.578825 1.20331 +1.1243 2.07824 +5.86555 6.72397 +6.37103 6.81736 +1.12086 3.46541 +2.59503 3.44073 +5.27128 5.3616 +2.87331 3.4352 +5.48408 6.67916 +3.36016 4.09125 +0.813671 0.9811 +0.812162 3.22209 +6.85104 6.86306 +0.671311 0.979685 +2.75962 2.82659 +2.42186 2.49827 +7.82974 9.59669 +3.48851 3.60085 +8.47775 10.9574 +8.6863 10.6155 +0.196484 1.07469 +1.19293 1.45012 +5.79166 6.18466 +6.51597 6.6793 +9.78341 10.1992 +8.17879 9.59257 +6.96178 8.73165 +4.09161 4.31908 +3.19514 3.4072 +5.5101 6.32978 +0.188435 1.84481 +9.41738 10.0379 +1.46994 1.6294 +4.21915 5.39529 +5.46567 5.86638 +8.19414 9.201 +4.38616 4.55193 +2.31105 2.73345 +6.05897 6.12297 +8.84135 9.74232 +9.44943 10.2225 +3.27501 3.66059 +0.524904 1.74374 +7.7228 8.43799 +5.13274 5.82863 +8.2787 8.94491 +1.61463 2.03499 +7.04346 8.69977 +0.938308 2.38676 +0.00208037 0.0186158 +1.98744 2.05864 +7.05787 8.16211 +1.68383 2.04684 +2.24812 2.28257 +0.685061 1.2947 +2.25379 2.92827 +6.0052 6.24797 +7.06213 7.86344 +0.751849 2.96376 +0.0977921 0.513746 +8.43792 9.10545 +2.80769 3.09276 +9.19308 9.59741 +4.74365 4.99708 +8.41385 8.58422 +4.28093 5.9281 +4.26205 4.75417 +1.48035 1.61363 +1.4264 1.80922 +3.48365 4.52935 +1.78396 2.96351 +8.4134 8.96536 +8.65646 9.34781 +1.88027 2.97804 +8.92531 9.02743 +6.91815 7.88895 +5.68023 7.37521 +3.93105 4.6123 +0.385874 1.30785 +1.80151 2.24385 +8.43781 9.33927 +6.69643 8.001 +6.12062 6.673 +4.8316 6.63067 +9.00443 9.08204 +1.5651 2.65023 +3.57517 4.40231 +5.85127 8.02219 +8.02586 10.018 +2.00514 2.75138 +6.32104 7.84285 +8.90914 9.78319 +4.91325 6.27817 +3.87406 4.80327 +8.57887 9.30685 +1.40351 1.71079 +-0.217977 0.224497 +8.37711 9.56393 +5.54644 5.77714 +8.18206 8.36015 +0.774967 1.97899 +9.10434 10.1721 +9.39621 10.1135 +4.80108 4.90605 +9.45978 9.96227 +2.85412 4.05215 +5.71985 7.16735 +2.35081 2.82214 +9.34881 10.5899 +7.13014 7.82872 +4.54931 4.89725 +9.41397 9.9131 +8.90226 9.55276 +8.27995 9.83651 +9.2767 9.6053 +0.388751 1.40317 +5.01478 5.88869 +6.41521 7.21754 +1.22552 1.39067 +3.75771 3.81571 +4.39362 6.04592 +8.82639 8.84544 +4.59289 4.89208 +1.52235 1.64285 +1.85893 4.52056 +1.91781 2.78253 +3.34677 4.54987 +9.26905 10.6019 +7.10958 8.02083 +0.765257 1.66957 +2.17169 2.70214 +4.2293 6.38089 +1.41111 2.45992 +5.76864 6.85715 +2.19944 2.93182 +9.03727 9.6454 +3.82652 4.35225 +2.52642 3.09725 +7.77868 9.35844 +0.337665 1.00787 +1.92021 2.04418 +4.41862 5.95486 +9.47606 9.62386 +1.12113 1.55658 +5.26701 7.09712 +8.81478 9.34863 +6.29447 7.43847 +2.82379 3.57268 +7.9735 8.79936 +3.30176 5.50666 +6.36009 6.8864 +4.13583 5.00627 +0.510514 0.882245 +6.93864 7.78543 +2.04039 2.4298 +3.18337 3.19424 +4.20059 4.67088 +0.316687 0.707377 +0.169106 1.68194 +8.26665 10.2362 +1.1124 1.78306 +2.84603 3.33142 +9.48756 9.96651 +9.4301 9.7316 +0.234674 1.23981 +0.493232 0.522565 +1.342 1.41739 +2.57196 4.08221 +1.54201 2.52284 +5.32049 6.00052 +8.54218 8.59452 +-0.030524 1.64476 +2.31645 2.72528 +4.71898 4.92827 +0.0872997 1.74969 +0.994278 1.76964 +1.34411 2.77952 +0.156817 2.10245 +5.78094 6.34389 +3.09336 3.10563 +8.14245 9.0928 +9.34202 9.75484 +9.78415 10.0211 +4.68383 5.19384 +6.09441 7.90512 +6.74941 6.76118 +1.78693 1.91697 +2.34369 2.62141 +-0.20756 0.829082 +3.57681 5.11448 +2.44234 4.45153 +4.84521 5.31902 +1.80487 3.64498 +2.46125 3.02549 +-0.334514 0.64288 +8.06406 8.49886 +1.74559 2.54474 +6.05883 6.46529 +9.00014 10.2271 +8.00064 8.5061 +0.909467 0.980765 +8.65862 8.69736 +8.11457 8.77049 +3.93237 5.02485 +4.64507 5.34852 +3.92405 4.19449 +5.02381 5.21722 +3.76203 3.78396 +6.74925 7.34781 +8.2556 8.63585 +3.92521 3.99739 +1.44641 2.31509 +0.23516 0.917239 +4.4614 6.35489 +3.33221 3.95247 +1.73289 2.07919 +6.92385 7.55052 +8.74351 9.41125 +9.41451 10.1785 +7.4001 8.81081 +2.97038 3.12524 +7.26043 7.77569 +5.56625 5.59344 +5.70977 6.33362 +7.61443 8.43218 +1.05308 1.82947 +0.377602 1.57633 +6.42483 7.51505 +4.73011 5.43693 +7.72 8.09098 +9.20063 9.82287 +6.88273 7.35327 +6.88423 7.68356 +3.55293 3.6227 +0.947096 1.76021 +3.66411 5.67117 +9.31422 10.1035 +6.84847 6.98956 +2.16221 4.45806 +0.853284 3.15932 +2.48673 2.89793 +3.37633 3.90938 +1.6141 1.66363 +1.6658 3.01723 +0.419408 1.01736 +0.712239 0.791538 +2.25249 3.62425 +8.09772 10.2367 +1.46651 1.48148 +1.73233 2.0489 +7.42679 9.23232 +7.97446 9.53281 +2.74677 4.03955 +-0.169412 0.872795 +4.90663 5.40277 +7.62122 9.49334 +6.55971 7.34259 +3.71957 5.03775 +3.33226 4.06459 +0.634912 1.52603 +3.65506 4.09318 +4.31463 4.60534 +8.58287 9.85385 +0.334759 0.7232 +2.14027 2.866 +6.06611 6.3625 +2.53013 3.18764 +4.30913 4.89247 +6.53234 6.92328 +7.66419 8.61762 +1.37598 2.26754 +8.06279 8.80692 +5.28688 5.70608 +0.509396 1.34606 +8.80589 9.29765 +9.3801 10.3988 +0.402662 0.597735 +5.87213 6.63371 +2.79136 3.763 +6.20615 7.25189 +7.54065 9.62156 +4.12107 5.04454 +5.60294 6.69246 +1.20845 1.49272 +1.75679 2.56397 +2.83939 3.85147 +6.21362 6.71341 +9.01824 9.2388 +4.66617 5.04944 +1.48766 2.55674 +8.89442 9.42175 +5.29411 5.39531 +6.66271 8.68733 +0.730461 1.42466 +6.22927 6.55086 +0.566776 1.17299 +3.06104 4.17775 +5.28026 5.73966 +5.76071 7.61585 +7.83786 9.58106 +6.32199 6.46961 +8.89555 9.17429 +3.85772 4.97805 +6.63352 8.79211 +7.87234 7.94131 +6.53479 7.87979 +3.90293 4.50376 +6.21371 7.31788 +1.00497 1.75003 +6.90351 8.02435 +2.29142 3.9809 +6.26632 6.45283 +-0.0354471 1.31727 +8.80046 9.20169 +7.86905 8.36819 +0.848737 1.82393 +7.98136 9.40712 +3.97765 4.95399 +8.70252 9.26275 +3.13412 4.29389 +2.06446 3.55839 +7.67918 8.44509 +5.96082 6.40336 +1.20461 2.36924 +4.76741 5.74978 +9.41217 9.94305 +7.36736 8.07119 +3.44102 3.56957 +3.59893 4.52751 +4.2613 6.41628 +1.65321 3.02235 +3.70067 3.86657 +0.0176327 1.1215 +4.13592 4.88595 +8.73668 9.0834 +1.80944 2.95584 +6.05721 6.93009 +5.08206 5.38626 +1.86749 1.89392 +3.58284 4.10506 +0.0885586 1.47709 +5.46502 5.93066 +8.45338 8.47878 +3.46789 4.02317 +0.975506 1.15814 +7.12758 7.60073 +7.99582 8.56746 +3.11435 3.83805 +4.51166 4.52472 +8.39096 8.75934 +8.42208 9.66019 +2.48498 4.73703 +3.50301 4.81264 +6.40196 7.0733 +8.52138 8.82265 +1.49822 1.74634 +7.08547 7.93508 +3.47832 4.42948 +6.08646 6.20865 +4.46334 4.65278 +3.80008 4.08214 +3.4853 5.44308 +5.48109 6.18681 +6.59161 8.04307 +7.36554 7.38201 +5.2144 5.31725 +4.62607 7.25804 +1.24345 1.81263 +5.49248 8.16867 +6.4056 8.26316 +7.67828 8.56923 +2.46187 2.56974 +2.22942 3.27248 +7.14933 8.06682 +2.3236 2.95462 +4.18028 4.80535 +4.981 5.54215 +7.23261 7.34863 +4.96309 6.06396 +4.24402 4.44364 +0.917707 1.32687 +1.19806 1.65106 +3.7725 5.31412 +9.70021 9.84203 +5.99824 7.77474 +3.32636 3.84266 +8.59841 9.07653 +7.9916 9.14415 +0.786519 1.84655 +0.166394 1.47834 +2.87633 3.52808 +7.53804 9.56807 +6.14406 6.16189 +1.63428 3.96845 +1.10307 1.58897 +1.30032 2.85313 +7.89803 8.32723 +8.77593 8.90136 +1.68804 2.69447 +4.5956 4.6743 +7.39643 8.29839 +6.93629 7.82243 +6.10289 7.677 +1.83835 2.34295 +1.04506 1.91684 +8.95277 9.43817 +0.36153 0.643665 +1.02408 3.18963 +4.02972 4.40301 +2.80428 2.82552 +6.51718 6.64956 +0.185341 1.56607 +6.1658 7.59364 +4.09288 4.11687 +6.90205 7.16338 +5.0755 5.39478 +4.5614 4.83286 +5.8489 8.76295 +9.70079 10.0431 +8.44334 8.54714 +3.00139 3.66327 +5.34458 6.38895 +7.11481 7.96865 +4.66776 5.15678 +0.390138 0.53352 +2.01116 3.32839 +6.78761 6.97068 +4.57477 5.0724 +1.14098 1.36134 +7.4559 8.30327 +0.700932 2.40437 +1.90469 1.99046 +4.30064 5.11485 +7.84433 8.48543 +5.96212 7.49882 +3.93055 3.96317 +0.546327 1.04814 +8.96011 9.0404 +7.89255 8.06149 +0.669924 2.6944 +-0.00972314 0.837474 +6.07199 6.37467 +2.73659 3.19833 +5.9576 7.10966 +9.1316 9.14737 +5.26101 6.59184 +5.77697 8.08876 +0.68623 0.782805 +0.842619 1.39893 +5.82075 6.15957 +4.36394 4.88479 +7.1828 7.90107 +3.3331 4.39923 +6.54243 7.24966 +2.809 2.96491 +4.18514 4.61948 +4.95453 5.33929 +8.33288 9.52867 +9.05785 10.4276 +2.58917 4.74403 +1.34279 1.89014 +4.93626 5.75424 +7.75031 7.92788 +9.00904 9.02402 +3.91286 5.15124 +6.98486 7.34688 +-0.173169 0.415019 +0.652242 1.51556 +3.50184 5.30486 +3.72563 4.09022 +4.60463 6.58985 +3.34219 4.31833 +2.55445 2.58651 +6.14573 6.3669 +4.52336 6.37342 +9.37606 9.76836 +2.4198 3.36929 +2.89109 3.66974 +5.62463 6.05989 +0.674219 1.84165 +0.590017 1.71153 +1.54622 2.10277 +6.48003 6.55663 +3.56355 3.98573 +0.743671 1.87049 +3.27833 6.0722 +4.76267 6.9967 +2.80188 4.03037 +0.372694 0.482111 +5.73987 5.9529 +8.84732 9.49033 +0.833944 1.8157 +4.06126 4.36615 +0.884619 2.34622 +6.86723 6.99141 +8.07737 9.05193 +8.35903 9.00761 +8.84777 9.74001 +8.58058 9.05479 +8.28076 8.44566 +4.55155 5.65475 +2.44314 3.38966 +3.22172 4.50395 +7.1808 7.90376 +0.639636 1.72606 +5.46807 5.94322 +9.02146 9.87864 +-0.628472 0.655557 +4.29775 5.9553 +6.77525 7.38152 +6.51827 6.93542 +8.95252 9.52939 +0.755406 1.19973 +7.69455 7.86912 +0.170143 1.12949 +7.69254 8.08221 +2.08238 3.27051 +1.28662 1.78628 +1.21208 2.79391 +-0.155739 1.7071 +8.28833 9.10011 +5.77789 6.6954 +1.98395 2.35216 +5.77469 6.05177 +2.77565 5.81092 +-1.53416 2.30576 +6.93529 8.04506 +3.91553 4.55593 +5.57201 6.29071 +1.54149 1.86613 +4.09163 4.31234 +8.47834 11.1229 +5.70376 7.02981 +2.24683 3.79925 +5.4793 6.41036 +5.27644 6.81729 +0.13273 0.371437 +1.22959 1.41618 +0.551957 1.03276 +2.01269 2.4018 +8.77113 9.09395 +8.11753 8.46262 +0.39406 0.783705 +5.35964 5.48227 +7.24727 8.23233 +7.74525 8.85748 +0.0115736 0.882607 +1.78575 2.19684 +8.32514 9.0503 +3.11074 3.34975 +0.847464 2.13237 +0.310898 0.393528 +8.68841 10.518 +1.10032 1.83755 +2.42286 3.02554 +1.16364 2.80986 +1.46419 2.11421 +7.46021 7.90273 +6.86556 7.62542 +1.91466 3.79843 +3.1056 3.83969 +3.41591 4.26565 +0.285122 1.21372 +3.75441 5.52385 +1.07643 2.63403 +6.17341 7.67244 +9.13122 9.5132 +4.39696 6.15885 +3.7207 4.07729 +6.80782 7.1958 +6.65933 6.67105 +8.51535 8.7263 +5.98305 7.17759 +2.19609 2.46108 +8.21186 8.96908 +2.94729 3.60562 +3.31907 3.9297 +0.463492 0.626603 +2.62143 3.55089 +5.76898 6.79002 +1.45502 1.56525 +4.80797 5.62389 +5.87337 6.70588 +2.92765 3.50929 +0.412987 0.951057 +3.64594 4.40269 +-0.043401 0.502176 +4.54802 5.44613 +1.20218 1.8732 +2.75547 2.96745 +7.10348 7.7945 +9.74845 9.98835 +4.83718 6.4836 +2.30563 2.5903 +4.74016 6.30789 +6.42192 6.93329 +5.37294 6.73938 +2.4365 3.05787 +1.08283 3.79193 +4.90426 5.93563 +3.8874 4.83301 +0.13909 0.983027 +4.07407 5.61421 +8.62875 10.6851 +8.10233 8.29952 +2.23047 2.4691 +7.34617 7.39475 +1.66309 2.3032 +7.11207 10.0686 +4.52412 6.38666 +2.48323 2.96878 +7.47877 8.86547 +2.67607 4.33436 +6.83659 8.21075 +2.87313 3.39011 +2.81911 4.07729 +0.227877 0.657898 +6.57843 7.14311 +-0.591405 1.56925 +7.08018 7.59 +9.09558 9.3923 +9.48544 9.79474 +0.740233 2.33129 +8.51111 11.134 +7.79219 8.0281 +1.73821 1.89316 +9.21077 9.29488 +5.38354 6.46025 +4.30403 4.5472 +0.0893758 0.919238 +7.94464 8.51053 +5.27119 6.3741 +5.22476 6.00588 diff --git a/bottleneck/tests/data/ws_tests/test_5_A b/bottleneck/tests/data/ws_tests/test_5_A new file mode 100644 index 0000000..51cff1c --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_5_A @@ -0,0 +1,5 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 diff --git a/bottleneck/tests/data/ws_tests/test_5_A.pd.dipha b/bottleneck/tests/data/ws_tests/test_5_A.pd.dipha new file mode 100644 index 0000000..be84441 Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_5_A.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_5_B b/bottleneck/tests/data/ws_tests/test_5_B new file mode 100644 index 0000000..be62ed3 --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_5_B @@ -0,0 +1,5 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 diff --git a/bottleneck/tests/data/ws_tests/test_5_B.pd.dipha b/bottleneck/tests/data/ws_tests/test_5_B.pd.dipha new file mode 100644 index 0000000..14ca67c Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_5_B.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag1_A b/bottleneck/tests/data/ws_tests/test_diag1_A new file mode 100644 index 0000000..f7f90ff --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag1_A @@ -0,0 +1 @@ +1.0 1.0 diff --git a/bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha new file mode 100644 index 0000000..fa4a4d9 Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag1_B b/bottleneck/tests/data/ws_tests/test_diag1_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag1_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag2_A b/bottleneck/tests/data/ws_tests/test_diag2_A new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag2_A @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag2_B b/bottleneck/tests/data/ws_tests/test_diag2_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag2_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag3_A b/bottleneck/tests/data/ws_tests/test_diag3_A new file mode 100644 index 0000000..151d4b1 --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag3_A @@ -0,0 +1,220 @@ +1.391781911475341 1.391781911475341 +1.395142124726278 1.395142124726278 +1.514181227875788 1.514181227875788 +1.528291566797427 1.528291566797427 +1.585389310674157 1.585389310674157 +1.629232116709072 1.629232116709072 +1.641428662445941 1.641428662445941 +1.646998748860116 1.646998748860116 +1.652915988616469 1.652915988616469 +1.69199679556404 1.69199679556404 +1.705727462482595 1.705727462482595 +1.706819293048617 1.706819293048617 +1.720175733750729 1.720175733750729 +1.728031840308488 1.728031840308488 +1.73797421040929 1.73797421040929 +1.739519744204842 1.739519744204842 +1.76132425248022 1.76132425248022 +1.767766952966369 1.767766952966369 +1.792444271021371 1.792444271021371 +1.831487552809192 1.831487552809192 +1.837086616049901 1.837086616049901 +1.851186504948943 1.851186504948943 +1.860502132730509 1.860502132730509 +1.8619433117852 1.8619433117852 +1.878229072834972 1.878229072834972 +1.880655074837347 1.880655074837347 +1.883647832802556 1.883647832802556 +1.884127769927503 1.884127769927503 +1.892969784466709 1.892969784466709 +1.916936460787894 1.916936460787894 +1.931545068229315 1.931545068229315 +1.937626522143119 1.937626522143119 +1.942267721488891 1.942267721488891 +1.963295334827521 1.963295334827521 +1.975655395743736 1.975655395743736 +1.981448090925679 1.981448090925679 +1.986220565173897 1.986220565173897 +1.98709020812351 1.98709020812351 +1.989420269013254 1.989420269013254 +2.007874648480185 2.007874648480185 +2.012179388983059 2.012179388983059 +2.019051972834053 2.019051972834053 +2.023278848058142 2.023278848058142 +2.026190677562545 2.026190677562545 +2.041594763633561 2.041594763633561 +2.042508934597344 2.042508934597344 +2.04305394648524 2.04305394648524 +2.052514683218775 2.052514683218775 +2.059038785694094 2.059038785694094 +2.062577320792516 2.062577320792516 +2.063488177732052 2.063488177732052 +2.067806664626417 2.067806664626417 +2.073013782498534 2.073013782498534 +2.08646120854976 2.08646120854976 +2.098476357223667 2.098476357223667 +2.101378199886176 2.101378199886176 +2.101927506425904 2.101927506425904 +2.12671744783454 2.12671744783454 +2.143966150630584 2.143966150630584 +2.145312642688415 2.145312642688415 +2.148704396208969 2.148704396208969 +2.153092682531471 2.153092682531471 +2.157553654759374 2.157553654759374 +2.176659075756566 2.176659075756566 +2.177260578806816 2.177260578806816 +2.179141269427014 2.179141269427014 +2.201895416482074 2.201895416482074 +2.202563945779844 2.202563945779844 +2.205113735193028 2.205113735193028 +2.207345865351049 2.207345865351049 +2.208922099676958 2.208922099676958 +2.218057898922937 2.218057898922937 +2.228610453267036 2.228610453267036 +2.241314066596301 2.241314066596301 +2.242145210071643 2.242145210071643 +2.253976266568437 2.253976266568437 +2.255324860119305 2.255324860119305 +2.271300972641221 2.271300972641221 +2.279438361991067 2.279438361991067 +2.286592331830957 2.286592331830957 +2.287159411646074 2.287159411646074 +2.296653147995115 2.296653147995115 +2.301754785182811 2.301754785182811 +2.30409930499031 2.30409930499031 +2.32141477565108 2.32141477565108 +2.347789281926012 2.347789281926012 +2.347827987256373 2.347827987256373 +2.349391321950732 2.349391321950732 +2.350129292983257 2.350129292983257 +2.358679083392328 2.358679083392328 +2.372845273125388 2.372845273125388 +2.385040766846267 2.385040766846267 +2.42114588843816 2.42114588843816 +2.425116524931602 2.425116524931602 +2.426518521893022 2.426518521893022 +2.43211651886311 2.43211651886311 +2.441302771998711 2.441302771998711 +2.446429340510857 2.446429340510857 +2.446547553904861 2.446547553904861 +2.45764765793376 2.45764765793376 +2.461222149682938 2.461222149682938 +2.467900747394114 2.467900747394114 +2.473214152160872 2.473214152160872 +2.5 2.5 +2.503557913626332 2.503557913626332 +2.504315621146863 2.504315621146863 +2.515634290122204 2.515634290122204 +2.516231935083851 2.516231935083851 +2.517558892374071 2.517558892374071 +2.526325773757754 2.526325773757754 +2.531164001388939 2.531164001388939 +2.53128061055404 2.53128061055404 +2.539387277827314 2.539387277827314 +2.540864599180268 2.540864599180268 +2.548084457784768 2.548084457784768 +2.548923292215475 2.548923292215475 +2.551730202825644 2.551730202825644 +2.553178578801818 2.553178578801818 +2.560295747947446 2.560295747947446 +2.566321603108612 2.566321603108612 +2.568932286976676 2.568932286976676 +2.574887688783916 2.574887688783916 +2.581809142325336 2.581809142325336 +2.584541960262555 2.584541960262555 +2.585511915815223 2.585511915815223 +2.592970592044868 2.592970592044868 +2.596055336381078 2.596055336381078 +2.598560573626668 2.598560573626668 +2.614019084614256 2.614019084614256 +2.618463725327216 2.618463725327216 +2.622883674481145 2.622883674481145 +2.627791161528314 2.627791161528314 +2.63535653879261 2.63535653879261 +2.654825898255443 2.654825898255443 +2.660423271276714 2.660423271276714 +2.667148030102869 2.667148030102869 +2.67012591760915 2.67012591760915 +2.698712599567882 2.698712599567882 +2.72180967799905 2.72180967799905 +2.732466204434637 2.732466204434637 +2.734187392905275 2.734187392905275 +2.737296308103857 2.737296308103857 +2.745724923243991 2.745724923243991 +2.749541709159369 2.749541709159369 +2.752925621447035 2.752925621447035 +2.754183973113479 2.754183973113479 +2.763972022430258 2.763972022430258 +2.766941997926879 2.766941997926879 +2.773850925522978 2.773850925522978 +2.777506755238121 2.777506755238121 +2.780333194223143 2.780333194223143 +2.783060349483276 2.783060349483276 +2.78679029681548 2.78679029681548 +2.786792895521339 2.786792895521339 +2.795170825459034 2.795170825459034 +2.801104989227437 2.801104989227437 +2.80525433080833 2.80525433080833 +2.805376738133109 2.805376738133109 +2.806844454092663 2.806844454092663 +2.811611818684648 2.811611818684648 +2.811994908451803 2.811994908451803 +2.816002798930236 2.816002798930236 +2.816814002472584 2.816814002472584 +2.818569391261086 2.818569391261086 +2.821660827076439 2.821660827076439 +2.822317588351085 2.822317588351085 +2.824910409962511 2.824910409962511 +2.829322097471409 2.829322097471409 +2.833852169620359 2.833852169620359 +2.839287537694811 2.839287537694811 +2.841714730677953 2.841714730677953 +2.841715058318205 2.841715058318205 +2.851653306950001 2.851653306950001 +2.853639002902003 2.853639002902003 +2.85515962291442 2.85515962291442 +2.855333736885793 2.855333736885793 +2.872540314564304 2.872540314564304 +2.879449214478037 2.879449214478037 +2.881003856158217 2.881003856158217 +2.881074731438092 2.881074731438092 +2.893589165559115 2.893589165559115 +2.898664743213686 2.898664743213686 +2.90387832180792 2.90387832180792 +2.919095859678745 2.919095859678745 +2.924945175440496 2.924945175440496 +2.931795145696962 2.931795145696962 +2.932285006979528 2.932285006979528 +2.934606807227626 2.934606807227626 +2.936392671567475 2.936392671567475 +2.953794710898493 2.953794710898493 +2.958055395706548 2.958055395706548 +2.960407744013656 2.960407744013656 +2.960759715914242 2.960759715914242 +2.969702548922556 2.969702548922556 +2.970149844982665 2.970149844982665 +2.978953970679893 2.978953970679893 +2.979075864664287 2.979075864664287 +2.984665519558418 2.984665519558418 +3.04548240149063 3.04548240149063 +3.050688336416719 3.050688336416719 +3.05773927378742 3.05773927378742 +3.059596740753369 3.059596740753369 +3.059762479996741 3.059762479996741 +3.088543279751235 3.088543279751235 +3.093580813520995 3.093580813520995 +3.104787362108069 3.104787362108069 +3.173380191779681 3.173380191779681 +3.583124637167399 3.583124637167399 +3.630658112409034 3.630658112409034 +3.631421639368965 3.631421639368965 +3.751087101339956 3.751087101339956 +3.800845709568037 3.800845709568037 +3.846558940956666 3.846558940956666 +4 4 +4 4 +4.076238038291317 4.076238038291317 +4.455547086147983 4.455547086147983 +5.356087357608394 5.356087357608394 +5.54364842773721 5.54364842773721 +7.587654388717225 7.587654388717225 diff --git a/bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha new file mode 100644 index 0000000..0dbfb89 Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_diag3_B b/bottleneck/tests/data/ws_tests/test_diag3_B new file mode 100644 index 0000000..bb8655a --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_diag3_B @@ -0,0 +1,193 @@ +1.167089173446239 1.167089173446239 +1.256234452640111 1.256234452640111 +1.303693422257498 1.303693422257498 +1.413255970488646 1.413255970488646 +1.697910382446573 1.697910382446573 +1.718844728805093 1.718844728805093 +1.734124820632724 1.734124820632724 +1.749572938304276 1.749572938304276 +1.770320424526358 1.770320424526358 +1.786344763036807 1.786344763036807 +1.810054737907635 1.810054737907635 +1.815127306170105 1.815127306170105 +1.837806648681218 1.837806648681218 +1.870552189043019 1.870552189043019 +1.897240351979503 1.897240351979503 +1.935562152643027 1.935562152643027 +1.952562418976663 1.952562418976663 +1.959552126104175 1.959552126104175 +1.979899732318601 1.979899732318601 +2.00044500769347 2.00044500769347 +2.028951227523087 2.028951227523087 +2.037678749316724 2.037678749316724 +2.047911420446857 2.047911420446857 +2.075181804515723 2.075181804515723 +2.077245386452578 2.077245386452578 +2.084751316684838 2.084751316684838 +2.084860886126203 2.084860886126203 +2.103286477421968 2.103286477421968 +2.106856827309345 2.106856827309345 +2.113139266068691 2.113139266068691 +2.114594962503455 2.114594962503455 +2.115917727493158 2.115917727493158 +2.122335878797089 2.122335878797089 +2.127359082726206 2.127359082726206 +2.131673381033273 2.131673381033273 +2.155015793320908 2.155015793320908 +2.162480684365264 2.162480684365264 +2.195207236194009 2.195207236194009 +2.203279931784429 2.203279931784429 +2.205567995563669 2.205567995563669 +2.212933962936773 2.212933962936773 +2.215081271089993 2.215081271089993 +2.225989037578865 2.225989037578865 +2.24218929203347 2.24218929203347 +2.246321319993257 2.246321319993257 +2.280059407166517 2.280059407166517 +2.284117669032543 2.284117669032543 +2.293233992770926 2.293233992770926 +2.298815356955373 2.298815356955373 +2.300542634724628 2.300542634724628 +2.326408290042679 2.326408290042679 +2.328797162040625 2.328797162040625 +2.36025798094028 2.36025798094028 +2.365031313604634 2.365031313604634 +2.372266311053883 2.372266311053883 +2.400053902049271 2.400053902049271 +2.409134054334209 2.409134054334209 +2.411368235895246 2.411368235895246 +2.415934766378347 2.415934766378347 +2.420989857074179 2.420989857074179 +2.422520269961376 2.422520269961376 +2.43377629944218 2.43377629944218 +2.449308615746858 2.449308615746858 +2.452936540056068 2.452936540056068 +2.453698388060092 2.453698388060092 +2.454711357943602 2.454711357943602 +2.459202673400056 2.459202673400056 +2.493778305287384 2.493778305287384 +2.537394117473177 2.537394117473177 +2.544674753106669 2.544674753106669 +2.558904304820755 2.558904304820755 +2.563089994365716 2.563089994365716 +2.565476194422898 2.565476194422898 +2.599756049189921 2.599756049189921 +2.603619661709009 2.603619661709009 +2.609775379385211 2.609775379385211 +2.622552038976658 2.622552038976658 +2.623798471910885 2.623798471910885 +2.635711198661633 2.635711198661633 +2.644229304223612 2.644229304223612 +2.661919064427223 2.661919064427223 +2.666783921498494 2.666783921498494 +2.675503310152301 2.675503310152301 +2.684228699964661 2.684228699964661 +2.696854617267681 2.696854617267681 +2.700538654666735 2.700538654666735 +2.744886611436907 2.744886611436907 +2.748618547996708 2.748618547996708 +2.757981496641135 2.757981496641135 +2.774766825791652 2.774766825791652 +2.784491736143893 2.784491736143893 +2.796482184304273 2.796482184304273 +2.800849254751463 2.800849254751463 +2.816963410000067 2.816963410000067 +2.825207379914743 2.825207379914743 +2.831286409028398 2.831286409028398 +2.844827082550712 2.844827082550712 +2.853558438121966 2.853558438121966 +2.859806035663089 2.859806035663089 +2.878956033959891 2.878956033959891 +2.886422825109222 2.886422825109222 +2.891566924618832 2.891566924618832 +2.892028419188578 2.892028419188578 +2.893138900330932 2.893138900330932 +2.894250936382814 2.894250936382814 +2.90112201577666 2.90112201577666 +2.902172795370005 2.902172795370005 +2.90967533504119 2.90967533504119 +2.919687125962211 2.919687125962211 +2.923711238894001 2.923711238894001 +2.929041907338841 2.929041907338841 +2.938734873084349 2.938734873084349 +2.939642428979572 2.939642428979572 +2.943010909640486 2.943010909640486 +2.944210926048103 2.944210926048103 +2.951091358234723 2.951091358234723 +2.953950275008233 2.953950275008233 +2.966943157369611 2.966943157369611 +2.982522008227535 2.982522008227535 +2.992174049247434 2.992174049247434 +2.993098995839607 2.993098995839607 +2.995311055519335 2.995311055519335 +2.996708164866609 2.996708164866609 +2.999922110096644 2.999922110096644 +3 3 +3.000364533251431 3.000364533251431 +3.003840990677832 3.003840990677832 +3.006672301312824 3.006672301312824 +3.016489409140306 3.016489409140306 +3.021123787004333 3.021123787004333 +3.039117818612596 3.039117818612596 +3.039555193616473 3.039555193616473 +3.049952247267922 3.049952247267922 +3.057673482371216 3.057673482371216 +3.06920083507411 3.06920083507411 +3.075505231082782 3.075505231082782 +3.079038628197304 3.079038628197304 +3.084265889701239 3.084265889701239 +3.086837468106297 3.086837468106297 +3.103873984398081 3.103873984398081 +3.11528125482979 3.11528125482979 +3.119720021802376 3.119720021802376 +3.132543753577128 3.132543753577128 +3.141822873359038 3.141822873359038 +3.143502053175705 3.143502053175705 +3.153232877003746 3.153232877003746 +3.157586960809866 3.157586960809866 +3.157966892275408 3.157966892275408 +3.163583225161638 3.163583225161638 +3.178188125342772 3.178188125342772 +3.178475867931057 3.178475867931057 +3.179372297765929 3.179372297765929 +3.186437137237586 3.186437137237586 +3.188053957464282 3.188053957464282 +3.199351610026191 3.199351610026191 +3.204566427513051 3.204566427513051 +3.22885278850648 3.22885278850648 +3.229088648916556 3.229088648916556 +3.236685523936269 3.236685523936269 +3.239854786600373 3.239854786600373 +3.255809161351669 3.255809161351669 +3.287718056143732 3.287718056143732 +3.294038308299402 3.294038308299402 +3.313688277153076 3.313688277153076 +3.325783245946608 3.325783245946608 +3.331072954808429 3.331072954808429 +3.354962852285211 3.354962852285211 +3.357502741262644 3.357502741262644 +3.373668509804576 3.373668509804576 +3.408653045775418 3.408653045775418 +3.416281541503763 3.416281541503763 +3.443144279972986 3.443144279972986 +3.492970564191033 3.492970564191033 +3.493767805580122 3.493767805580122 +3.559084134799019 3.559084134799019 +3.559898699300211 3.559898699300211 +3.833585501974904 3.833585501974904 +4.099502076836052 4.099502076836052 +4.484082147277348 4.484082147277348 +4.505718324707756 4.505718324707756 +4.891723119528026 4.891723119528026 +5.065300494905414 5.065300494905414 +5.188599238535201 5.188599238535201 +5.36134479630535 5.36134479630535 +5.609786508140671 5.609786508140671 +7.08640314680382 7.08640314680382 +7.113765883549079 7.113765883549079 +7.328944131981744 7.328944131981744 +7.63625182217108 7.63625182217108 +7.716743341311718 7.716743341311718 +7.938093404092351 7.938093404092351 +8.112783377863046 8.112783377863046 +8.131485096731454 8.131485096731454 diff --git a/bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha b/bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha new file mode 100644 index 0000000..3fbfd90 Binary files /dev/null and b/bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha differ diff --git a/bottleneck/tests/data/ws_tests/test_list.txt b/bottleneck/tests/data/ws_tests/test_list.txt new file mode 100644 index 0000000..27340d8 --- /dev/null +++ b/bottleneck/tests/data/ws_tests/test_list.txt @@ -0,0 +1,21 @@ +test_5_A test_5_B 1.0 -1.0 4.320655 +test_5_A test_5_B 2.0 -1.0 1.7323016335246 +test_5_A test_5_B 3.0 -1.0 1.396199948 +test_5_A test_5_B 1.0 1.0 6.603006 +test_5_A test_5_B 2.0 1.0 2.73426775794691 +test_5_A test_5_B 3.0 1.0 2.13072755216204 +test_5_A test_5_B 1.0 2.0 5.1888795679967 +test_5_A test_5_B 2.0 2.0 2.26649677575857 +test_5_A test_5_B 3.0 2.0 1.86434961396614 +test_100_A test_100_B 1.0 -1.0 27.5573259 +test_100_A test_100_B 2.0 -1.0 3.38004972483238 +test_100_A test_100_B 3.0 -1.0 1.9045814702967 +test_100_A test_100_B 1.0 1.0 40.4375855 +test_100_A test_100_B 2.0 1.0 4.75252460986668 +test_100_A test_100_B 3.0 1.0 2.556594741819 +test_100_A test_100_B 1.0 2.0 31.7187555735287 +test_100_A test_100_B 2.0 2.0 3.81132239777023 +test_100_A test_100_B 3.0 2.0 2.09695346034248 +test_diag1_A test_diag1_B 1.0 -1.0 0.0 +test_diag2_A test_diag2_B 1.0 -1.0 0.0 +test_diag3_A test_diag3_B 1.0 -1.0 0.0 diff --git a/bottleneck/tests/test_hera_bottleneck.cpp b/bottleneck/tests/test_hera_bottleneck.cpp new file mode 100644 index 0000000..f22e415 --- /dev/null +++ b/bottleneck/tests/test_hera_bottleneck.cpp @@ -0,0 +1,611 @@ +#include "catch/catch.hpp" + +#include +#include + +#include "bottleneck.h" + +using PairVector = std::vector>; +using PairVectorF = std::vector>; + +std::vector split_on_delim(const std::string& s, char delim) +{ + std::stringstream ss(s); + std::string token; + std::vector tokens; + while(std::getline(ss, token, delim)) { + tokens.push_back(token); + } + return tokens; +} + + +// single row in a file with test cases +struct TestFromFileCase { + + std::string file_1; + std::string file_2; + double delta; + double answer; + std::vector> longest_edges; + double internal_p { hera::get_infinity() }; + + TestFromFileCase(const std::string& s) + { + auto tokens = split_on_delim(s, ' '); +// assert(tokens.size() > 5); + assert(tokens.size() % 2 == 0); + + size_t token_idx = 0; + file_1 = tokens.at(token_idx++); + file_2 = tokens.at(token_idx++); + delta = std::stod(tokens.at(token_idx++)); + answer = std::stod(tokens.at(token_idx++)); + while(token_idx < tokens.size() - 1) { + int v1 = std::stoi(tokens[token_idx++]); + int v2 = std::stoi(tokens[token_idx++]); + longest_edges.emplace_back(v1, v2); + } + } +}; + +std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s) +{ + out << "[" << s.file_1 << ", " << s.file_2 << ", norm = "; + if (s.internal_p != hera::get_infinity()) { + out << s.internal_p; + } else { + out << "infinity"; + } + out << ", answer = " << s.answer << ", edges { "; + for(auto e : s.longest_edges) { + out << e.first << " <-> " << e.second << ", "; + } + out << "} ]"; + return out; +} + + +TEST_CASE("simple cases", "bottleneckDistApprox") +{ + PairVector diagram_A, diagram_B; + double delta = 0.01; + //double internal_p = hera::get_infinity(); + + SECTION("trivial: two empty diagrams") { + REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta)); + } + + SECTION("trivial: one empty diagram, one single-point diagram") { + + diagram_A.emplace_back(1.0, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + REQUIRE( fabs(d1 - 0.5) <= 0.00000000001 ); + + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + REQUIRE( fabs(d2 - 0.5) <= 0.00000000001 ); + } + + SECTION("trivial: two single-point diagrams-1") { + + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double correct_answer = 3.0; + REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer); + REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer); + } + + SECTION("trivial: two single-point diagrams-2") { + + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(130.0, 138.0); // (4, 4) + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double correct_answer = 5.0; + REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); + REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); + + } + +} + +TEST_CASE("float version", "check_template") +{ + PairVectorF diagram_A, diagram_B; + float delta = 0.01; + //float internal_p = hera::get_infinity(); + + SECTION("trivial: two empty diagrams") { + REQUIRE( 0.0 == hera::bottleneckDistApprox(diagram_A, diagram_B, delta)); + REQUIRE( 0.0 == hera::bottleneckDistExact(diagram_A, diagram_B)); + } + + SECTION("trivial: two single-point diagrams-2") { + + diagram_A.emplace_back(10, 20); // (5, 5) + diagram_B.emplace_back(130, 138); // (4, 4) + + float d1 = hera::bottleneckDistApprox(diagram_A, diagram_B, delta); + float d2 = hera::bottleneckDistApprox(diagram_B, diagram_A, delta); + float d3 = hera::bottleneckDistExact(diagram_B, diagram_A); + float correct_answer = 5; + REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); + REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); + + } + +} + + +TEST_CASE("infinity points", "bottleneckDistApprox") +{ + PairVector diagram_A, diagram_B; + double delta = 0.01; + + // do not use Hera's infinity! it is -1 + double inf = std::numeric_limits::infinity(); + + SECTION("two points at infinity, no finite points") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double corr_answer = 1.0; + REQUIRE( fabs(d - corr_answer) <= delta * corr_answer); + } + + SECTION("two points at infinity") { + + // edge cost 3.0 + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double corr_answer = 3.0; + REQUIRE( fabs(d - corr_answer) <= delta * corr_answer); + } + + SECTION("three points at infinity, no finite points") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double corr_answer = inf; + REQUIRE( d == corr_answer ); + } + + SECTION("three points at infinity") { + + // edge cost 3.0 + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double corr_answer = inf; + REQUIRE( d == corr_answer ); + } + + + SECTION("all four corners at infinity, no finite points, finite answer") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double corr_answer = 1.0; + + REQUIRE( d == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-1") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-2") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-3") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-4") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-1") { + + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-2") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-3") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-4") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + + SECTION("simple small example with finite answer") { + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.9, inf); + diagram_B.emplace_back(1.1, inf); + + // 1.1 - 1.0 + 2.0 - 1.9 = 0.2 + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(inf, 1.9); + diagram_B.emplace_back(inf, 1.1); + + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::bottleneckDistExact<>(diagram_A, diagram_B); + double d2 = hera::bottleneckDistExact<>(diagram_B, diagram_A); + double corr_answer = 3.0; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + + + } + +} + +TEST_CASE("longest edge", "bottleneckDistApprox") +{ + PairVector diagram_A, diagram_B; + hera::bt::MatchingEdge longest_edge_1; + hera::bt::MatchingEdge longest_edge_2; + double delta = 0.01; + + SECTION("trivial: two empty diagrams") { + // should not fail + REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true)); + } + + SECTION("trivial: one empty diagram, one single-point diagram") { + + diagram_A.emplace_back(1.0, 2.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true); + REQUIRE(longest_edge_1.first.getRealX() == 1.0); + REQUIRE(longest_edge_1.first.getRealY() == 2.0); + + double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true); + REQUIRE(longest_edge_2.second.getRealX() == 1.0); + REQUIRE(longest_edge_2.second.getRealY() == 2.0); + } + + SECTION("trivial: two single-point diagrams-1") { + + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(11.0, 19.0); + + double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true); + + REQUIRE(longest_edge_1.first.getRealX() == 10.0); + REQUIRE(longest_edge_1.first.getRealY() == 20.0); + + REQUIRE(longest_edge_1.second.getRealX() == 11.0); + REQUIRE(longest_edge_1.second.getRealY() == 19.0); + +// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true); +// REQUIRE(longest_edge_2.second.getRealX() == 1.0); +// REQUIRE(longest_edge_2.second.getRealY() == 2.0); +// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); +// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); +// double correct_answer = 3.0; +// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer); +// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer); + } +// +// SECTION("trivial: two single-point diagrams-2") { +// +// diagram_A.emplace_back(10.0, 20.0); // (5, 5) +// diagram_B.emplace_back(130.0, 138.0); // (4, 4) +// +// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); +// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); +// double correct_answer = 5.0; +// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); +// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); +// +// } + +} + +TEST_CASE("file cases", "bottleneck_dist") +{ + PairVector diagram_A, diagram_B; + hera::bt::MatchingEdge longest_edge; + + const char* file_name = "../tests/data/test_list.txt"; + std::string dir_prefix = "../tests/data/"; + std::ifstream f; + f.open(file_name); + std::vector test_params; + std::string s; + while (std::getline(f, s)) { + test_params.emplace_back(s); + //std::cout << "read test params " << test_params.back() << std::endl; + } + + SECTION("from file:") { + + for (const auto& ts : test_params) { + bool read_file_A = hera::readDiagramPointSet(dir_prefix + ts.file_1, diagram_A); + bool read_file_B = hera::readDiagramPointSet(dir_prefix + ts.file_2, diagram_B); + REQUIRE(read_file_A); + REQUIRE(read_file_B); + + double hera_answer = hera::bottleneckDistApprox(diagram_A, diagram_B, ts.delta, longest_edge, true); + std::pair hera_le { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() }; + + REQUIRE((hera_answer == ts.answer or fabs(hera_answer - ts.answer) <= ts.delta * hera_answer)); + REQUIRE((ts.longest_edges.empty() or + std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le) != ts.longest_edges.end())); + + double hera_answer_exact = hera::bottleneckDistExact(diagram_A, diagram_B, 14, longest_edge, true); + std::pair hera_le_exact { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() }; + + REQUIRE((hera_answer_exact == ts.answer or + fabs(hera_answer_exact - ts.answer) <= 0.0001 * ts.answer)); + + REQUIRE((ts.longest_edges.empty() or + std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le_exact) != + ts.longest_edges.end())); + + // check that longest_edge length matches the bottleneck distance + + double hera_le_cost; + bool check_longest_edge_cost = true; + if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() < 0) { + // longest edge: off-diagonal point of A connected to its diagonal projection + hera_le_cost = longest_edge.first.get_persistence(ts.internal_p); + } else if (longest_edge.first.get_user_id() < 0 and longest_edge.second.get_user_id() >= 0) { + // longest edge: off-diagonal point of B connected to its diagonal projection + hera_le_cost = longest_edge.second.get_persistence(ts.internal_p); + } else if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() >= 0) { + // longest edge connects two off-diagonal points of A and B + hera_le_cost = hera::bt::dist_l_inf_slow(longest_edge.first, longest_edge.second); + } else { + check_longest_edge_cost = false; + } +// if (check_longest_edge_cost and hera_le_cost != hera_answer_exact) { +// std::cout << "PROBLEM HERE: " << ts << ", longest edge " << longest_edge.first << " - " +// << longest_edge.second << ", hera_le_cost " << hera_le_cost << ", answwer " +// << hera_answer_exact << std::endl; +// } + REQUIRE( (not check_longest_edge_cost or fabs(hera_le_cost - hera_answer_exact) < 0.0001 * hera_answer_exact) ); + std::cout << ts << " PASSED " << std::endl; + } + } + +} diff --git a/bottleneck/tests/tests_main.cpp b/bottleneck/tests/tests_main.cpp new file mode 100644 index 0000000..d24407e --- /dev/null +++ b/bottleneck/tests/tests_main.cpp @@ -0,0 +1,3 @@ +#define LOG_AUCTION +#define CATCH_CONFIG_MAIN +#include "catch/catch.hpp" diff --git a/geom_bottleneck/.gitignore b/geom_bottleneck/.gitignore deleted file mode 100644 index 3d0a40b..0000000 --- a/geom_bottleneck/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -/*.cfg -/build -*.gitattributes -*.opensdf -*.sdf -*.suo -*.vcxproj -*.filters -*.log -*.tlog -*.lastbuildstate -*.obj -*.idb -*.pdb -*.exe -*.ilk -*.user -*.out -*.output -*.pyc -*.*~* -*.swp -*.nfs* -*.pdf -*.o -*.d -*.dll -*.lib -*.exe -makeout -/MS_Win32 -/bin -bottleneck/build/ -ann/lib -ann/bin -ann/lib/dummy diff --git a/geom_bottleneck/CMakeLists.txt b/geom_bottleneck/CMakeLists.txt deleted file mode 100644 index 7a820ac..0000000 --- a/geom_bottleneck/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -project (geom_bottleneck) -cmake_minimum_required (VERSION 3.5.1) - -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# C++ 11 required -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -# Default to Release - -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") -endif (NOT CMAKE_BUILD_TYPE) - -if(NOT WIN32) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -D_GLIBCXX_DEBUG") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 -g -ggdb") -endif(NOT WIN32) - -include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) - -file(GLOB WS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) - - - -find_package (Threads) -set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT}) - -add_executable(bottleneck_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/bottleneck_dist.cpp ${WS_HEADERS}) -target_link_libraries(bottleneck_dist PUBLIC ${libraries}) - -add_executable(bottleneck_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_bottleneck.cpp) -target_link_libraries(bottleneck_test PUBLIC ${libraries}) diff --git a/geom_bottleneck/README b/geom_bottleneck/README deleted file mode 100644 index 8b368af..0000000 --- a/geom_bottleneck/README +++ /dev/null @@ -1,98 +0,0 @@ -Accompanying paper: M. Kerber, D. Morozov, A. Nigmetov. Geometry Helps To Compare Persistence Diagrams (ALENEX 2016, http://www.geometrie.tugraz.at/nigmetov/geom_dist.pdf) - -Bug reports can be sent to "nigmetov EMAIL SIGN tugraz DOT at". - -# Dependencies - -Your compiler must support C++11. - -# Usage: - -1. To use a standalone command-line utility bottleneck_dist: - -bottleneck_dist file1 file2 [relative_error]. - -If relative error is not supplied, the exact distance is computed and printed. -If two diagrams are equal, then the exact distance 0.0 is printed (the order -of points in file1 and file2 need not be the same). -Otherwise the output is an approximation of the exact distance. Precisely: -if d_exact is the true distance and d_approx is the output, then - - | d_exact - d_approx | / d_exact < relative_error. - -file1 and file2 must contain persistence diagrams in plain text format -(one point per line, empty lines are ignored, comments can be made with #): - -# this is how your input can look like -x_1 y_1 # two real numbers per line -... -# empty lines or comments are ignored -x_n y_n - -2. To use from your code: - -#include "bottleneck.h" - -// the functions hera::bottleneckDistExact, hera::bottleneckDistApprox -// return the exact and approximate bottleneck distance. - -// function hera::readDiagramPointSet reads diagram from a plain-text file. - -std::vector> diagram1, diagram2; -// any container class that supports range-for loops will do. -// A pair represents a single point, -// first component = x-coordinate, -// second component = y-coordinate. -// ... -// load your diagrams into diagram1, diagram2 (off-diagonal points). -// If you data is in plain text format, you can use readDiagramPointSet function: - -if (!hera::readDiagramPointSet("diagram1.txt", diagram1)) { - // something went wrong: function returns true if it successfully read the file - } - -// OK: diagram1.txt was read. -// ... -// to get exact distance: -double btDist = hera::bottleneckDistExact(diagram1, diagram2); -// to get 1% approximation -double btDistApprox = hera::bottleneckDistApprox(diagram1, diagram2, 0.01); -// .............................................................................. -// if diagrams will be used many times, you may want to avoid copying them -// to hera::bt::DiagramPointSet (which is done internally in each call to -bottleneckDistExact/bottleneckDistApprox) and do it yourself once. -// Constructor takes two iterators: -hera::bt::DiagramPointSet ds1(diagram1.begin(), diagram1.end()); -hera::bt::DiagramPointSet ds2(diagram2.begin(), diagram2.end()); -btDist = hera::bt::bottleneckDistExact(ds1, ds2); -btDistApprox = hera::bt::bottleneckDistApprox(ds1, ds2, 0.01); - -Necessary projections (diagonal points) will be added in the bottleneckDistApprox -function. - -See also code in example/bottleneck_dist.cpp. - -# Remarks: - -1) If bottleneckDistApprox is called with epsilon = 0.0, it will never return. -2) Empty diagrams are not considered as error. - -# License - -See licence.txt - -# Building - -CMakeLists.txt in the root directory can be used to build -the command-line utility (in example/ directory). -The library itself is header-only and does not require separate compilation. - -On Linux/Mac: - -mkdir build -cd build -cmake .. -make - -On Windows: -use cmake-gui to create the solution in build directory and build it with VS. diff --git a/geom_bottleneck/example/CMakeLists.txt b/geom_bottleneck/example/CMakeLists.txt deleted file mode 100644 index 3ae8536..0000000 --- a/geom_bottleneck/example/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -cmake_minimum_required(VERSION 2.8.9) - -# Default to Release -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) -endif(NOT CMAKE_BUILD_TYPE) - -# Add path to ANN header files -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../bottleneck/include") - -set(CXX_FLAGS ${CMAKE_CXX_FLAGS_RELEASE}) - -if(NOT WIN32) - set(CMAKE_CXX_FLAGS "-O3 -DNDEBUG -DBOOST_DISABLE_ASSERTS") - add_definitions(-std=c++11) -endif(NOT WIN32) - - -if(UNIX) - # specify full path to ANN - set_property(TARGET bottleneck PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../bottleneck/build/libbottleneck.a") -endif(UNIX) - -add_executable (bottleneck_dist bottleneck_dist.cpp) - -target_link_libraries(bottleneck_dist PUBLIC bottleneck) - diff --git a/geom_bottleneck/example/bottleneck_dist.cpp b/geom_bottleneck/example/bottleneck_dist.cpp deleted file mode 100644 index 8966789..0000000 --- a/geom_bottleneck/example/bottleneck_dist.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#include -#include "bottleneck.h" - -// any container of pairs of doubles can be used, -// we use vector in this example. - -typedef std::vector> PairVector; - -// estimate initial guess on sampled diagram? -constexpr bool useSamplingHeur = false; -// if diagrams contain fewer points, don't use heuristic -constexpr int heurThreshold = 30000; - -int main(int argc, char* argv[]) -{ - if (argc < 3 ) { - std::cerr << "Usage: " << argv[0] << " file1 file2 [relative_error]. Without relative_error calculate the exact distance." << std::endl; - return 1; - } - - PairVector diagramA, diagramB; - int decPrecision { 0 }; - if (!hera::readDiagramPointSet(argv[1], diagramA, decPrecision)) { - std::exit(1); - } - - if (!hera::readDiagramPointSet(argv[2], diagramB, decPrecision)) { - std::exit(1); - } - - double res; - hera::bt::MatchingEdge e; - if (argc >= 4) { - // the third parameter is epsilon, - // return approximate distance (faster) - double delta = atof(argv[3]); - if (delta > 0.0) { - if (useSamplingHeur && diagramA.size() > heurThreshold && diagramB.size() > heurThreshold) { - res = hera::bottleneckDistApproxHeur(diagramA, diagramB, delta); - } else { - res = hera::bottleneckDistApprox(diagramA, diagramB, delta, e, true); - } - } else if (delta == 0.0) { - res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision); - } else { - std::cerr << "The third parameter (relative error) must be positive!" << std::endl; - std::exit(1); - } - } else { - // only filenames have been supplied, return exact distance - res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision, e, true); - - } - std::cout << std::setprecision(15) << res << std::endl; - //std::cout << "Longest edge " << e.first.get_user_id() << " <-> " << e.second.get_user_id() << std::endl; - //std::cout << "Longest edge " << e.first << " <-> " << e.second << std::endl; - // Alternative could be to construct DiagramPointSet - // using the constructor with iterators. - // May be useful if the same diagram is used multiple times - // to avoid copying data from user's container each time. - - //hera::bt::DiagramPointSet dA(diagramA); - //hera::bt::DiagramPointSet dB(diagramB); - //double result1 = hera::bt::bottleneckDistExact(dA, dB); - //std::cout << std::setprecision(15) << result1 << std::endl; - - return 0; -} diff --git a/geom_bottleneck/include/basic_defs_bt.h b/geom_bottleneck/include/basic_defs_bt.h deleted file mode 100644 index 172e0f7..0000000 --- a/geom_bottleneck/include/basic_defs_bt.h +++ /dev/null @@ -1,569 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BASIC_DEFS_BT_H -#define HERA_BASIC_DEFS_BT_H - -#ifdef _WIN32 -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "def_debug_bt.h" - -#ifndef FOR_R_TDA - -#include - -#endif - -namespace hera { - - template - Real get_infinity() - { - return Real(-1.0); - } - - namespace bt { - - - typedef int IdType; - constexpr IdType MinValidId = 10; - - template - struct Point - { - Real x, y; - - bool operator==(const Point& other) const - { - return ((this->x == other.x) and (this->y == other.y)); - } - - bool operator!=(const Point& other) const - { - return !(*this == other); - } - - Point(Real ax, Real ay) : - x(ax), y(ay) - {} - - Point() : - x(0.0), y(0.0) - {} - -#ifndef FOR_R_TDA - - template - friend std::ostream& operator<<(std::ostream& output, const Point& p) - { - output << "(" << p.x << ", " << p.y << ")"; - return output; - } - -#endif - }; - - template - struct DiagramPoint - { - // Points above the diagonal have type NORMAL - // Projections onto the diagonal have type DIAG - // for DIAG points only x-coordinate is relevant - // to-do: add getters/setters, checks in constructors, etc - enum Type - { - NORMAL, DIAG - }; - // data members - private: - Real x, y; - public: - Type type; - IdType id; - IdType user_id; - - // operators, constructors - bool operator==(const DiagramPoint& other) const - { - // compare by id only - assert(this->id >= MinValidId); - assert(other.id >= MinValidId); - bool areEqual { this->id == other.id }; - assert(!areEqual or ((this->x == other.x) and (this->y == other.y) and (this->type == other.type))); - return areEqual; - } - - bool operator!=(const DiagramPoint& other) const - { - return !(*this == other); - } - - DiagramPoint() : - x(0.0), - y(0.0), - type(DiagramPoint::DIAG), - id(MinValidId - 1), - user_id(-1) - { - } - - DiagramPoint(Real _x, Real _y, Type _type, IdType _id, IdType _user_id) : - x(_x), - y(_y), - type(_type), - id(_id), - user_id(_user_id) - { - if (_y == _x and _type != DIAG) { - throw std::runtime_error("Point on the main diagonal must have DIAG type"); - } - - } - - - bool isDiagonal() const - { return type == DIAG; } - - bool isNormal() const - { return type == NORMAL; } - - bool isInfinity() const - { - return x == std::numeric_limits::infinity() or - x == -std::numeric_limits::infinity() or - y == std::numeric_limits::infinity() or - y == -std::numeric_limits::infinity(); - } - - Real inline getRealX() const // return the x-coord - { - return x; - } - - Real inline getRealY() const // return the y-coord - { - return y; - } - - IdType inline get_user_id() const - { - if (isNormal()) - return user_id; - else - return -1; - } - - Real inline get_persistence(const Real internal_p = get_infinity()) const - { - if (isDiagonal()) - return 0.0; - Real pers = fabs(y - x) / 2; - if (internal_p == get_infinity()) { - return pers; - } else if (internal_p == 1.0) { - return 2 * pers; - } else { - return std::pow(static_cast(2), static_cast(1) / internal_p); - } - } - -#ifndef FOR_R_TDA - - friend std::ostream& operator<<(std::ostream& output, const DiagramPoint& p) - { - if (p.isDiagonal()) { - output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )"; - } else { - output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)"; - } - return output; - } -#endif - }; - - template - using MatchingEdge = std::pair, DiagramPoint>; - - // compute l-inf distance between two diagram points - template - inline Real distLInf(const DiagramPoint& a, const DiagramPoint& b) - { - if (a.isDiagonal() and b.isDiagonal()) { - // distance between points on the diagonal is 0 - return 0.0; - } - // otherwise distance is a usual l-inf distance - return std::max(fabs(a.getRealX() - b.getRealX()), fabs(a.getRealY() - b.getRealY())); - } - - // this function works with points at infinity as well - // not needed in actual computation, since these points are processed - // separately, but is useful in tests - template - inline Real dist_l_inf_slow(const DiagramPoint& a, const DiagramPoint& b) - { - if (a.isDiagonal() and b.isDiagonal()) { - // distance between points on the diagonal is 0 - return 0.0; - } - // otherwise distance is a usual l-inf distance - // - Real dx = (a.getRealX() == b.getRealX()) ? 0.0 : fabs(a.getRealX() - b.getRealX()); - Real dy = (a.getRealY() == b.getRealY()) ? 0.0 : fabs(a.getRealY() - b.getRealY()); - Real result = std::max(dx, dy); - if (std::isnan(result)) - result = std::numeric_limits::infinity(); - return result; - } - - - - template - inline Real get_infinity() - { - return Real(-1.0); - } - - template - inline void hash_combine(std::size_t& seed, const T& v) - { - std::hash hasher; - seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); - } - - template - struct DiagramPointHash - { - size_t operator()(const DiagramPoint& p) const - { - assert(p.id >= MinValidId); - return std::hash()(p.id); - } - }; - - template - Real distLInf(const DiagramPoint& a, const DiagramPoint& b); - - //template - //typedef std::unordered_set PointSet; - template - class DiagramPointSet; - - template - void addProjections(DiagramPointSet& A, DiagramPointSet& B); - - template - class DiagramPointSet - { - public: - - using Real = Real_; - using DgmPoint = DiagramPoint; - using DgmPointHash = DiagramPointHash; - using const_iterator = typename std::unordered_set::const_iterator; - using iterator = typename std::unordered_set::iterator; - - private: - - bool isLinked { false }; - IdType maxId { MinValidId + 1 }; - std::unordered_set points; - - public: - - void insert(const DgmPoint& p) - { - points.insert(p); - if (p.id > maxId) { - maxId = p.id + 1; - } - } - - void erase(const DgmPoint& p, bool doCheck = true) - { - // if doCheck, erasing non-existing elements causes assert - auto it = points.find(p); - if (it != points.end()) { - points.erase(it); - } else { - assert(!doCheck); - } - } - - - void erase(const const_iterator it) - { - points.erase(it); - } - - void removeDiagonalPoints() - { - if (isLinked) { - auto ptIter = points.begin(); - while (ptIter != points.end()) { - if (ptIter->isDiagonal()) { - ptIter = points.erase(ptIter); - } else { - ptIter++; - } - } - isLinked = false; - } - } - - size_t size() const - { - return points.size(); - } - - void reserve(const size_t newSize) - { - points.reserve(newSize); - } - - void clear() - { - points.clear(); - } - - bool empty() const - { - return points.empty(); - } - - bool hasElement(const DgmPoint& p) const - { - return points.find(p) != points.end(); - } - - iterator find(const DgmPoint& p) - { - return points.find(p); - } - - iterator begin() - { - return points.begin(); - } - - iterator end() - { - return points.end(); - } - - const_iterator cbegin() const - { - return points.cbegin(); - } - - const_iterator cend() const - { - return points.cend(); - } - - - const_iterator find(const DgmPoint& p) const - { - return points.find(p); - } - -#ifndef FOR_R_TDA - - friend std::ostream& operator<<(std::ostream& output, const DiagramPointSet& ps) - { - output << "{ "; - for (auto pit = ps.cbegin(); pit != ps.cend(); ++pit) { - output << *pit << ", "; - } - output << "\b\b }"; - return output; - } - -#endif - - friend void addProjections(DiagramPointSet& A, DiagramPointSet& B); - - template - void fillIn(PairIterator begin_iter, PairIterator end_iter) - { - isLinked = false; - clear(); - IdType uniqueId = MinValidId + 1; - IdType user_id = 0; - for (auto iter = begin_iter; iter != end_iter; ++iter) { - insert(DgmPoint(iter->first, iter->second, DgmPoint::NORMAL, uniqueId++, user_id++)); - } - } - - template - void fillIn(const PointContainer& dgm_cont) - { - using Traits = DiagramTraits; - isLinked = false; - clear(); - IdType uniqueId = MinValidId + 1; - IdType user_id = 0; - for (const auto& pt : dgm_cont) { - Real x = Traits::get_x(pt); - Real y = Traits::get_y(pt); - insert(DgmPoint(x, y, DgmPoint::NORMAL, uniqueId++, user_id++)); - } - } - - - // ctor from range - template - DiagramPointSet(PairIterator begin_iter, PairIterator end_iter) - { - fillIn(begin_iter, end_iter); - } - - // ctor from container, uses DiagramTraits - template - DiagramPointSet(const PointContainer& dgm) - { - fillIn(dgm); - } - - - // default ctor, empty diagram - DiagramPointSet(IdType minId = MinValidId + 1) : - maxId(minId + 1) - {}; - - IdType nextId() - { return maxId + 1; } - - }; // DiagramPointSet - - - template - Real getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B) - { - Real result { 0.0 }; - DiagramPoint begA = *(A.begin()); - DiagramPoint optB = *(B.begin()); - for (const auto& pointB : B) { - if (distLInf(begA, pointB) > result) { - result = distLInf(begA, pointB); - optB = pointB; - } - } - for (const auto& pointA : A) { - if (distLInf(pointA, optB) > result) { - result = distLInf(pointA, optB); - } - } - return result; - } - - // preprocess diagrams A and B by adding projections onto diagonal of points of - // A to B and vice versa. Also removes points at infinity! - // NB: ids of points will be changed! - template - void addProjections(DiagramPointSet& A, DiagramPointSet& B) - { - - using Real = Real_; - using DgmPoint = DiagramPoint; - using DgmPointSet = DiagramPointSet; - - IdType uniqueId { MinValidId + 1 }; - DgmPointSet newA, newB; - - // copy normal points from A to newA - // add projections to newB - for (auto& pA : A) { - if (pA.isNormal() and not pA.isInfinity()) { - // add pA's projection to B - DgmPoint dpA { pA.getRealX(), pA.getRealY(), DgmPoint::NORMAL, uniqueId++, pA.get_user_id() }; - DgmPoint dpB { (pA.getRealX() + pA.getRealY()) / 2, (pA.getRealX() + pA.getRealY()) / 2, - DgmPoint::DIAG, uniqueId++, -1 }; - newA.insert(dpA); - newB.insert(dpB); - } - } - - for (auto& pB : B) { - if (pB.isNormal() and not pB.isInfinity()) { - // add pB's projection to A - DgmPoint dpB { pB.getRealX(), pB.getRealY(), DgmPoint::NORMAL, uniqueId++, pB.get_user_id() }; - DgmPoint dpA { (pB.getRealX() + pB.getRealY()) / 2, (pB.getRealX() + pB.getRealY()) / 2, - DgmPoint::DIAG, uniqueId++, -1 }; - newB.insert(dpB); - newA.insert(dpA); - } - } - - A = newA; - B = newB; - A.isLinked = true; - B.isLinked = true; - } - - //#ifndef FOR_R_TDA - - //template - //std::ostream& operator<<(std::ostream& output, const DiagramPoint& p) - //{ - // if ( p.isDiagonal() ) { - // output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )"; - // } else { - // output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)"; - // } - // return output; - //} - - //template - //std::ostream& operator<<(std::ostream& output, const DiagramPointSet& ps) - //{ - // output << "{ "; - // for(auto pit = ps.cbegin(); pit != ps.cend(); ++pit) { - // output << *pit << ", "; - // } - // output << "\b\b }"; - // return output; - //} - //#endif // FOR_R_TDA - - - } // end namespace bt -} // end namespace hera -#endif // HERA_BASIC_DEFS_BT_H diff --git a/geom_bottleneck/include/bottleneck.h b/geom_bottleneck/include/bottleneck.h deleted file mode 100644 index 64da2c8..0000000 --- a/geom_bottleneck/include/bottleneck.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BOTTLENECK_H -#define HERA_BOTTLENECK_H - - -#include -#include -#include -#include -#include - -#include "diagram_traits.h" -#include "diagram_reader.h" -#include "bottleneck_detail.h" -#include "basic_defs_bt.h" -#include "bound_match.h" - -namespace hera { - // internal_p defines cost function on edges (use hera::get_infinity(), - // if you want to explicitly refer to l_inf, but that's default value - // delta is relative error, default is 1 percent - template - struct BottleneckParams - { - Real internal_p { hera::get_infinity() }; - Real delta { 0.01 }; - }; - - // functions taking containers as input - // template parameter PairContainer must be a container of pairs of real - // numbers (pair.first = x-coordinate, pair.second = y-coordinate) - // PairContainer class must support iteration of the form - // for(it = pairContainer.begin(); it != pairContainer.end(); ++it) - - // all functions in this header are wrappers around - // functions from hera::bt namespace - - // get exact bottleneck distance, - template - typename DiagramTraits::RealType - bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision, - hera::bt::MatchingEdge::RealType>& longest_edge, - bool compute_longest_edge = true) - { - using Real = typename DiagramTraits::RealType; - hera::bt::DiagramPointSet a(dgm_A); - hera::bt::DiagramPointSet b(dgm_B); - return hera::bt::bottleneckDistExact(a, b, decPrecision, longest_edge, compute_longest_edge); - } - - template - typename DiagramTraits::RealType - bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision) - { - using Real = typename DiagramTraits::RealType; - hera::bt::MatchingEdge longest_edge; - return bottleneckDistExact(dgm_A, dgm_B, decPrecision, longest_edge, false); - } - - - template - typename DiagramTraits::RealType - bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B) - { - int dec_precision = 14; - return bottleneckDistExact(dgm_A, dgm_B, dec_precision); - } - - -// return the interval (distMin, distMax) such that: -// a) actual bottleneck distance between A and B is contained in the interval -// b) if the interval is not (0,0), then (distMax - distMin) / distMin < delta - template - std::pair::RealType, typename DiagramTraits::RealType> - bottleneckDistApproxInterval(PairContainer& dgm_A, PairContainer& dgm_B, - const typename DiagramTraits::RealType delta) - { - using Real = typename DiagramTraits::RealType; - hera::bt::DiagramPointSet a(dgm_A); - hera::bt::DiagramPointSet b(dgm_B); - return hera::bt::bottleneckDistApproxInterval(a, b, delta); - } - -// use sampling heuristic: discard most of the points with small persistency -// to get a good initial approximation of the bottleneck distance - template - typename DiagramTraits::RealType - bottleneckDistApproxHeur(PairContainer& dgm_A, PairContainer& dgm_B, - const typename DiagramTraits::RealType delta) - { - using Real = typename DiagramTraits::RealType; - hera::bt::DiagramPointSet a(dgm_A); - hera::bt::DiagramPointSet b(dgm_B); - std::pair resPair = hera::bt::bottleneckDistApproxIntervalHeur(a, b, delta); - return resPair.second; - } - -// get approximate distance, -// see bottleneckDistApproxInterval - template - typename DiagramTraits::RealType - bottleneckDistApprox(PairContainer& A, PairContainer& B, - const typename DiagramTraits::RealType delta, - hera::bt::MatchingEdge::RealType>& longest_edge, - bool compute_longest_edge = true) - { - using Real = typename DiagramTraits::RealType; - hera::bt::DiagramPointSet a(A.begin(), A.end()); - hera::bt::DiagramPointSet b(B.begin(), B.end()); - return hera::bt::bottleneckDistApprox(a, b, delta, longest_edge, compute_longest_edge); - } - - template - typename DiagramTraits::RealType - bottleneckDistApprox(PairContainer& A, PairContainer& B, - const typename DiagramTraits::RealType delta) - { - using Real = typename DiagramTraits::RealType; - hera::bt::MatchingEdge longest_edge; - return hera::bottleneckDistApprox(A, B, delta, longest_edge, false); - } - - -} // end namespace hera - -#endif diff --git a/geom_bottleneck/include/bottleneck_detail.h b/geom_bottleneck/include/bottleneck_detail.h deleted file mode 100644 index 7241c9a..0000000 --- a/geom_bottleneck/include/bottleneck_detail.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BOTTLENECK_DETAIL_H -#define HERA_BOTTLENECK_DETAIL_H - - -#include -#include -#include -#include -#include - -#include "diagram_traits.h" -#include "basic_defs_bt.h" -#include "bound_match.h" - -namespace hera { - - - namespace bt { - - // functions taking DiagramPointSet as input. - // ATTENTION: parameters A and B (diagrams) will be changed after the call - // (projections added). - - // return the interval (distMin, distMax) such that: - // a) actual bottleneck distance between A and B is contained in the interval - // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon - template - std::pair bottleneckDistApproxInterval(DiagramPointSet& A, DiagramPointSet& B, - const Real epsilon, MatchingEdge& longest_edge, - bool compute_longest_edge = false); - - - // heuristic (sample diagram to estimate the distance) - template - std::pair - bottleneckDistApproxIntervalHeur(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, - bool compute_longest_edge = false); - - // get approximate distance, - // see bottleneckDistApproxInterval - template - Real bottleneckDistApprox(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, - MatchingEdge& longest_edge, bool compute_longest_edge = false); - - // get exact bottleneck distance, - template - Real bottleneckDistExact(DiagramPointSet& A, DiagramPointSet& B, const int decPrecision, - MatchingEdge& longest_edge, bool compute_longest_edge = false); - - // get exact bottleneck distance, - template - Real bottleneckDistExact(DiagramPointSet& A, DiagramPointSet& B, MatchingEdge& longest_edge, - bool compute_longest_edge = false); - - } // end namespace bt - - -} // end namespace hera - -#include "bottleneck_detail.hpp" - -#endif // HERA_BOTTLENECK_DETAIL_H diff --git a/geom_bottleneck/include/bottleneck_detail.hpp b/geom_bottleneck/include/bottleneck_detail.hpp deleted file mode 100644 index 8f51d07..0000000 --- a/geom_bottleneck/include/bottleneck_detail.hpp +++ /dev/null @@ -1,636 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BOTTLENECK_HPP -#define HERA_BOTTLENECK_HPP - -#ifdef FOR_R_TDA -#undef DEBUG_BOUND_MATCH -#undef DEBUG_MATCHING -#undef VERBOSE_BOTTLENECK -#endif - - -#include -#include -#include -#include -#include - -#include "bottleneck_detail.h" - -namespace hera { - namespace bt { - - template - void binarySearch(const Real epsilon, - std::pair& result, - BoundMatchOracle & oracle, - const Real infinityCost, - bool isResultInitializedCorrectly, - const Real distProbeInit) - { - // aliases for result components - Real& distMin = result.first; - Real& distMax = result.second; - - distMin = std::max(distMin, infinityCost); - distMax = std::max(distMax, infinityCost); - - Real distProbe; - - if (not isResultInitializedCorrectly) { - distProbe = distProbeInit; - if (oracle.isMatchLess(distProbe)) { - // distProbe is an upper bound, - // find lower bound with binary search - do { - distMax = distProbe; - distProbe /= 2.0; - } while (oracle.isMatchLess(distProbe)); - distMin = distProbe; - } else { - // distProbe is a lower bound, - // find upper bound with exponential search - do { - distMin = distProbe; - distProbe *= 2.0; - } while (!oracle.isMatchLess(distProbe)); - distMax = distProbe; - } - } - // bounds are correct , perform binary search - distProbe = (distMin + distMax) / 2.0; - while ((distMax - distMin) / distMin >= epsilon) { - - if (distMax < infinityCost) { - distMin = infinityCost; - distMax = infinityCost; - break; - } - - if (oracle.isMatchLess(distProbe)) { - distMax = distProbe; - } else { - distMin = distProbe; - } - - distProbe = (distMin + distMax) / 2.0; - } - - distMin = std::max(distMin, infinityCost); - distMax = std::max(distMax, infinityCost); - } - - // template - // inline Real getOneDimensionalCost(std::vector& set_A, std::vector& set_B) - // { - // if (set_A.size() != set_B.size()) { - // return std::numeric_limits::infinity(); - // } - // - // if (set_A.empty()) { - // return Real(0.0); - // } - // - // std::sort(set_A.begin(), set_A.end()); - // std::sort(set_B.begin(), set_B.end()); - // - // Real result = 0.0; - // for (size_t i = 0; i < set_A.size(); ++i) { - // result = std::max(result, (std::fabs(set_A[i] - set_B[i]))); - // } - // - // return result; - // } - - - template - struct CostEdgePair - { - Real cost; - typename hera::bt::MatchingEdge edge; - }; - - template - using CoordPointPair = std::pair>; - - template - using CoordPointVector = std::vector>; - - template - struct CoordPointPairComparator - { - bool operator()(const CoordPointPair& a, const CoordPointPair& b) const - { - return a.first < b.first or (a.first == b.first and a.second.id < b.second.id); - }; - }; - - template - inline typename hera::bt::CostEdgePair - getOneDimensionalCost(typename hera::bt::CoordPointVector& set_A, - typename hera::bt::CoordPointVector& set_B) - { - using MatchingEdgeR = hera::bt::MatchingEdge; - using CostEdgePairR = CostEdgePair; - - if (set_A.size() != set_B.size()) { - return CostEdgePairR { std::numeric_limits::infinity(), MatchingEdgeR() }; - } - - if (set_A.empty()) { - return CostEdgePairR { Real(0.0), MatchingEdgeR() }; - } - - std::sort(set_A.begin(), set_A.end(), CoordPointPairComparator()); - std::sort(set_B.begin(), set_B.end(), CoordPointPairComparator()); - - CostEdgePairR result { -1.0, MatchingEdgeR() }; - - for (size_t i = 0; i < set_A.size(); ++i) { - Real curr_cost = std::fabs(set_A[i].first - set_B[i].first); - if (curr_cost > result.cost) { - result.cost = curr_cost; - result.edge = MatchingEdgeR(set_A[i].second, set_B[i].second); - } - } - return result; - } - - - template - inline CostEdgePair getInfinityCost(const DiagramPointSet & A, const DiagramPointSet & B, - bool compute_longest_edge = false) - { - using CostEdgePairR = CostEdgePair; - using CoordPointVectorR = CoordPointVector; - - CoordPointVectorR x_plus_A, x_minus_A, y_plus_A, y_minus_A; - CoordPointVectorR x_plus_B, x_minus_B, y_plus_B, y_minus_B; - - for (auto iter_A = A.cbegin(); iter_A != A.cend(); ++iter_A) { - Real x = iter_A->getRealX(); - Real y = iter_A->getRealY(); - if (x == std::numeric_limits::infinity()) { - y_plus_A.emplace_back(y, *iter_A); - } else if (x == -std::numeric_limits::infinity()) { - y_minus_A.emplace_back(y, *iter_A); - } else if (y == std::numeric_limits::infinity()) { - x_plus_A.emplace_back(x, *iter_A); - } else if (y == -std::numeric_limits::infinity()) { - x_minus_A.emplace_back(x, *iter_A); - } - } - - for (auto iter_B = B.cbegin(); iter_B != B.cend(); ++iter_B) { - Real x = iter_B->getRealX(); - Real y = iter_B->getRealY(); - if (x == std::numeric_limits::infinity()) { - y_plus_B.emplace_back(y, *iter_B); - } else if (x == -std::numeric_limits::infinity()) { - y_minus_B.emplace_back(y, *iter_B); - } else if (y == std::numeric_limits::infinity()) { - x_plus_B.emplace_back(x, *iter_B); - } else if (y == -std::numeric_limits::infinity()) { - x_minus_B.emplace_back(x, *iter_B); - } - } - - CostEdgePairR result = getOneDimensionalCost(x_plus_A, x_plus_B); - - CostEdgePairR next_cost_edge = getOneDimensionalCost(x_minus_A, x_minus_B); - if (next_cost_edge.cost > result.cost) { - result = next_cost_edge; - } - - next_cost_edge = getOneDimensionalCost(y_plus_A, y_plus_B); - if (next_cost_edge.cost > result.cost) { - result = next_cost_edge; - } - - next_cost_edge = getOneDimensionalCost(y_minus_A, y_minus_B); - if (next_cost_edge.cost > result.cost) { - result = next_cost_edge; - } - - return result; - } - - // return the interval (distMin, distMax) such that: - // a) actual bottleneck distance between A and B is contained in the interval - // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon - template - inline std::pair - bottleneckDistApproxInterval(DiagramPointSet& A, DiagramPointSet& B, const Real epsilon, - MatchingEdge& edge, bool compute_longest_edge) - { - using MatchingEdgeR = MatchingEdge; - using CostEdgePairR = CostEdgePair; - - edge = MatchingEdgeR(); - // empty diagrams are not considered as error - if (A.empty() and B.empty()) { - return std::make_pair(0.0, 0.0); - } - - CostEdgePairR inf_cost_edge = getInfinityCost(A, B, true); - - Real infinity_cost = inf_cost_edge.cost; - if (infinity_cost == std::numeric_limits::infinity()) { - return std::make_pair(infinity_cost, infinity_cost); - } else { - edge = inf_cost_edge.edge; - } - - // link diagrams A and B by adding projections - addProjections(A, B); - - // TODO: think about that! - // we need one threshold for checking if the distance is 0, - // another one for the oracle! - constexpr Real epsThreshold { 1.0e-10 }; - std::pair result { 0.0, 0.0 }; - bool useRangeSearch { true }; - // construct an oracle - BoundMatchOracle oracle(A, B, epsThreshold, useRangeSearch); - // check for distance = 0 - if (oracle.isMatchLess(2 * epsThreshold)) { - if (infinity_cost > epsThreshold) { - result.first = infinity_cost; - result.second = infinity_cost; - edge = inf_cost_edge.edge; - } - return result; - } - // get a 3-approximation of maximal distance between A and B - // as a starting value for probe distance - Real distProbe { getFurthestDistance3Approx>(A, B) }; - binarySearch(epsilon, result, oracle, infinity_cost, false, distProbe); - // to compute longest edge a perfect matching is needed - if (compute_longest_edge and result.first > infinity_cost) { - oracle.isMatchLess(result.second); - edge = oracle.get_longest_edge(); - } - return result; - } - - template - void sampleDiagramForHeur(const DiagramPointSet & dgmIn, DiagramPointSet & dgmOut) - { - struct pair_hash - { - std::size_t operator()(const std::pair p) const - { - return std::hash()(p.first) ^ std::hash()(p.second); - } - }; - std::unordered_map, int, pair_hash> m; - for (auto ptIter = dgmIn.cbegin(); ptIter != dgmIn.cend(); ++ptIter) { - if (ptIter->isNormal() and not ptIter->isInfinity()) { - m[std::make_pair(ptIter->getRealX(), ptIter->getRealY())]++; - } - } - if (m.size() < 2) { - dgmOut = dgmIn; - return; - } - std::vector v; - for (const auto& ptQtyPair : m) { - v.push_back(ptQtyPair.second); - } - std::sort(v.begin(), v.end()); - int maxLeap = v[1] - v[0]; - int cutVal = v[0]; - for (int i = 1; i < static_cast(v.size()) - 1; ++i) { - int currLeap = v[i + 1] - v[i]; - if (currLeap > maxLeap) { - maxLeap = currLeap; - cutVal = v[i]; - } - } - std::vector> vv; - // keep points whose multiplicites are at most cutVal - // quick-and-dirty: fill in vv with copies of each point - // to construct DiagramPointSet from it later - for (const auto& ptQty : m) { - if (ptQty.second < cutVal) { - for (int i = 0; i < ptQty.second; ++i) { - vv.push_back(std::make_pair(ptQty.first.first, ptQty.first.second)); - } - } - } - dgmOut.clear(); - dgmOut = DiagramPointSet(vv.begin(), vv.end()); - } - - - // return the interval (distMin, distMax) such that: - // a) actual bottleneck distance between A and B is contained in the interval - // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon - template - std::pair - bottleneckDistApproxIntervalWithInitial(DiagramPointSet & A, DiagramPointSet & B, - const Real epsilon, - const std::pair initialGuess, - const Real infinity_cost, - MatchingEdge & longest_edge, - bool compute_longest_edge = false) - { - // empty diagrams are not considered as error - if (A.empty() and B.empty()) { - return std::make_pair(0.0, 0.0); - } - - // link diagrams A and B by adding projections - addProjections(A, B); - - constexpr Real epsThreshold { 1.0e-10 }; - std::pair result { 0.0, 0.0 }; - bool useRangeSearch { true }; - // construct an oracle - BoundMatchOracle oracle(A, B, epsThreshold, useRangeSearch); - - Real& distMin { result.first }; - Real& distMax { result.second }; - - // initialize search interval from initialGuess - distMin = initialGuess.first; - distMax = initialGuess.second; - - assert(distMin <= distMax); - - // make sure that distMin is a lower bound - while (oracle.isMatchLess(distMin)) { - // distMin is in fact an upper bound, so assign it to distMax - distMax = distMin; - // and decrease distMin by 5 % - distMin = 0.95 * distMin; - } - - // make sure that distMax is an upper bound - while (not oracle.isMatchLess(distMax)) { - // distMax is in fact a lower bound, so assign it to distMin - distMin = distMax; - // and increase distMax by 5 % - distMax = 1.05 * distMax; - } - - // bounds are found, perform binary search - Real distProbe = (distMin + distMax) / 2.0; - binarySearch(epsilon, result, oracle, infinity_cost, true, distProbe); - if (compute_longest_edge) { - longest_edge = oracle.get_longest_edge(); - } - return result; - } - - // return the interval (distMin, distMax) such that: - // a) actual bottleneck distance between A and B is contained in the interval - // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon - // use heuristic: initial estimate on sampled diagrams - template - std::pair - bottleneckDistApproxIntervalHeur(DiagramPointSet & A, DiagramPointSet & B, const Real epsilon, - MatchingEdge & longest_edge) - { - // empty diagrams are not considered as error - if (A.empty() and B.empty()) { - return std::make_pair(0.0, 0.0); - } - - Real infinity_cost = getInfinityCost(A, B); - if (infinity_cost == std::numeric_limits::infinity()) { - return std::make_pair(infinity_cost, infinity_cost); - } - - DiagramPointSet sampledA, sampledB; - sampleDiagramForHeur(A, sampledA); - sampleDiagramForHeur(B, sampledB); - - std::pair initGuess = bottleneckDistApproxInterval(sampledA, sampledB, epsilon); - - initGuess.first = std::max(initGuess.first, infinity_cost); - initGuess.second = std::max(initGuess.second, infinity_cost); - - return bottleneckDistApproxIntervalWithInitial(A, B, epsilon, initGuess, infinity_cost, longest_edge); - } - - - // get approximate distance, - // see bottleneckDistApproxInterval - template - Real bottleneckDistApprox(DiagramPointSet & A, DiagramPointSet & B, const Real epsilon, - MatchingEdge & longest_edge, bool compute_longest_edge) - { - auto interval = bottleneckDistApproxInterval(A, B, epsilon, longest_edge, compute_longest_edge); - return interval.second; - } - - - template - Real bottleneckDistExactFromSortedPwDist(DiagramPointSet & A, DiagramPointSet & B, - const std::vector& pairwiseDist, - const int decPrecision, MatchingEdge & longest_edge, - bool compute_longest_edge = false) - { - // trivial case: we have only one candidate - if (pairwiseDist.size() == 1) { - return pairwiseDist[0]; - } - - bool useRangeSearch = true; - Real distEpsilon = std::numeric_limits::max(); - Real diffThreshold = 0.1; - for (int k = 0; k < decPrecision; ++k) { - diffThreshold /= 10; - } - for (size_t k = 0; k < pairwiseDist.size() - 2; ++k) { - auto diff = pairwiseDist[k + 1] - pairwiseDist[k]; - if (diff > diffThreshold and diff < distEpsilon) { - distEpsilon = diff; - } - } - distEpsilon = std::min(diffThreshold, distEpsilon / 3); - - BoundMatchOracle oracle(A, B, distEpsilon, useRangeSearch); - // binary search - size_t iterNum { 0 }; - size_t idxMin { 0 }, idxMax { pairwiseDist.size() - 1 }; - size_t idxMid; - while (idxMax > idxMin) { - idxMid = static_cast(floor(idxMin + idxMax) / 2); - iterNum++; - // not A[imid] < dist <=> A[imid] >= dist <=> A[imid[ >= dist + eps - if (oracle.isMatchLess(pairwiseDist[idxMid] + distEpsilon / 2)) { - idxMax = idxMid; - } else { - idxMin = idxMid + 1; - } - } - idxMid = static_cast(floor(idxMin + idxMax) / 2); - Real result = pairwiseDist[idxMid]; - if (compute_longest_edge) { - oracle.isMatchLess(result + distEpsilon / 2); - longest_edge = oracle.get_longest_edge(); - } - return result; - } - - - template - Real - bottleneckDistExact(DiagramPointSet & A, DiagramPointSet & B, MatchingEdge & longest_edge, - bool compute_longest_edge) - { - return bottleneckDistExact(A, B, 14, longest_edge, compute_longest_edge); - } - - template - Real bottleneckDistExact(DiagramPointSet & A, DiagramPointSet & B, const int decPrecision, - MatchingEdge & longest_edge, bool compute_longest_edge) - { - using DgmPoint = DiagramPoint; - - constexpr Real epsilon = 0.001; - auto interval = bottleneckDistApproxInterval(A, B, epsilon, longest_edge, true); - // if the longest edge is on infinity, the answer is already exact - // this will be detected here and all the code after if - // may assume that the longest edge is on finite points - if (interval.first == interval.second) { - return interval.first; - } - const Real delta = 0.50001 * (interval.second - interval.first); - const Real approxDist = 0.5 * (interval.first + interval.second); - const Real minDist = interval.first; - const Real maxDist = interval.second; - if (delta == 0) { - return interval.first; - } - // copy points from A to a vector - // todo: get rid of this? - std::vector pointsA; - pointsA.reserve(A.size()); - for (const auto& ptA : A) { - pointsA.push_back(ptA); - } - - // in this vector we store the distances between the points - // that are candidates to realize - std::set pairwiseDist; - { - // vector to store centers of vertical stripes - // two for each point in A and the id of the corresponding point - std::vector> xCentersVec; - xCentersVec.reserve(2 * pointsA.size()); - for (auto ptA : pointsA) { - xCentersVec.push_back(std::make_pair(ptA.getRealX() - approxDist, ptA)); - xCentersVec.push_back(std::make_pair(ptA.getRealX() + approxDist, ptA)); - } - // lambda to compare pairs w.r.t coordinate - auto compLambda = [](std::pair a, std::pair b) { - return a.first < b.first; - }; - - std::sort(xCentersVec.begin(), xCentersVec.end(), compLambda); - // todo: sort points in B, reduce search range in lower and upper bounds - for (auto ptB : B) { - // iterator to the first stripe such that ptB lies to the left - // from its right boundary (x_B <= x_j + \delta iff x_j >= x_B - \delta - auto itStart = std::lower_bound(xCentersVec.begin(), - xCentersVec.end(), - std::make_pair(ptB.getRealX() - delta, ptB), - compLambda); - - for (auto iterA = itStart; iterA < xCentersVec.end(); ++iterA) { - if (ptB.getRealX() < iterA->first - delta) { - // from that moment x_B >= x_j - delta - // is violated: x_B no longer lies to right from the left - // boundary of current stripe - break; - } - // we're here => ptB lies in vertical stripe, - // check if distance fits into the interval we've found - Real pwDist = distLInf(iterA->second, ptB); - if (pwDist >= minDist and pwDist <= maxDist) { - pairwiseDist.insert(pwDist); - } - } - } - } - - { - // for y - // vector to store centers of vertical stripes - // two for each point in A and the id of the corresponding point - std::vector> yCentersVec; - yCentersVec.reserve(2 * pointsA.size()); - for (auto ptA : pointsA) { - yCentersVec.push_back(std::make_pair(ptA.getRealY() - approxDist, ptA)); - yCentersVec.push_back(std::make_pair(ptA.getRealY() + approxDist, ptA)); - } - // lambda to compare pairs w.r.t coordinate - auto compLambda = [](std::pair a, std::pair b) { - return a.first < b.first; - }; - - std::sort(yCentersVec.begin(), yCentersVec.end(), compLambda); - - // todo: sort points in B, reduce search range in lower and upper bounds - for (auto ptB : B) { - auto itStart = std::lower_bound(yCentersVec.begin(), - yCentersVec.end(), - std::make_pair(ptB.getRealY() - delta, ptB), - compLambda); - - - for (auto iterA = itStart; iterA < yCentersVec.end(); ++iterA) { - if (ptB.getRealY() < iterA->first - delta) { - break; - } - Real pwDist = distLInf(iterA->second, ptB); - if (pwDist >= minDist and pwDist <= maxDist) { - pairwiseDist.insert(pwDist); - } - } - } - } - - std::vector pw_dists; - pw_dists.reserve(pairwiseDist.size()); - for(Real d : pairwiseDist) { - pw_dists.push_back(d); - } - - return bottleneckDistExactFromSortedPwDist(A, B, pw_dists, decPrecision, longest_edge, - compute_longest_edge); - } - - } // end namespace bt -} // end namespace hera -#endif // HERA_BOTTLENECK_HPP diff --git a/geom_bottleneck/include/bound_match.h b/geom_bottleneck/include/bound_match.h deleted file mode 100644 index 99543f9..0000000 --- a/geom_bottleneck/include/bound_match.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BOUND_MATCH_H -#define HERA_BOUND_MATCH_H - -#include -#include - -#include "basic_defs_bt.h" -#include "neighb_oracle.h" - - -namespace hera { -namespace bt { - -template -class Matching { -public: - using DgmPoint = DiagramPoint; - using DgmPointSet = DiagramPointSet; - using DgmPointHash = DiagramPointHash; - using Path = std::vector; - - Matching(const DgmPointSet& AA, const DgmPointSet& BB) : A(AA), B(BB) {}; - DgmPointSet getExposedVertices(bool forA = true) const ; - bool isExposed(const DgmPoint& p) const; - void getAllAdjacentVertices(const DgmPointSet& setIn, DgmPointSet& setOut, bool forA = true) const; - void increase(const Path& augmentingPath); - void checkAugPath(const Path& augPath) const; - bool getMatchedVertex(const DgmPoint& p, DgmPoint& result) const; - bool isPerfect() const; - void trimMatching(const Real newThreshold); - MatchingEdge get_longest_edge() const; -#ifndef FOR_R_TDA - template - friend std::ostream& operator<<(std::ostream& output, const Matching& m); -#endif -private: - DgmPointSet A; - DgmPointSet B; - std::unordered_map AToB, BToA; - void matchVertices(const DgmPoint& pA, const DgmPoint& pB); - void sanityCheck() const; -}; - - - -template> -class BoundMatchOracle { -public: - using Real = Real_; - using NeighbOracle = NeighbOracle_; - using DgmPoint = DiagramPoint; - using DgmPointSet = DiagramPointSet; - using Path = std::vector; - - BoundMatchOracle(DgmPointSet psA, DgmPointSet psB, Real dEps, bool useRS = true); - bool isMatchLess(Real r); - bool buildMatchingForThreshold(const Real r); - MatchingEdge get_longest_edge() const { return M.get_longest_edge(); } -private: - DgmPointSet A, B; - Matching M; - void printLayerGraph(); - void buildLayerGraph(Real r); - void buildLayerOracles(Real r); - bool buildAugmentingPath(const DgmPoint startVertex, Path& result); - void removeFromLayer(const DgmPoint& p, const int layerIdx); - std::unique_ptr neighbOracle; - bool augPathExist; - std::vector layerGraph; - std::vector> layerOracles; - Real distEpsilon; - bool useRangeSearch; - Real prevQueryValue; -}; - -} // end namespace bt -} // end namespace hera - -#include "bound_match.hpp" - -#endif // HERA_BOUND_MATCH_H diff --git a/geom_bottleneck/include/bound_match.hpp b/geom_bottleneck/include/bound_match.hpp deleted file mode 100644 index b95628f..0000000 --- a/geom_bottleneck/include/bound_match.hpp +++ /dev/null @@ -1,511 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_BOUND_MATCH_HPP -#define HERA_BOUND_MATCH_HPP - - -#ifdef FOR_R_TDA -#undef DEBUG_BOUND_MATCH -#undef DEBUG_MATCHING -#undef VERBOSE_BOTTLENECK -#endif - -#include -#include "def_debug_bt.h" -#include "bound_match.h" - -#ifdef VERBOSE_BOTTLENECK -#include -#endif - -#ifndef FOR_R_TDA - -#include - -#endif - -namespace hera { - namespace bt { - -#ifndef FOR_R_TDA - - template - std::ostream& operator<<(std::ostream& output, const Matching & m) - { - output << "Matching: " << m.AToB.size() << " pairs ("; - if (!m.isPerfect()) { - output << "not"; - } - output << " perfect)" << std::endl; - for (auto atob : m.AToB) { - output << atob.first << " <-> " << atob.second << " distance: " << distLInf(atob.first, atob.second) - << std::endl; - } - return output; - } - -#endif - - template - void Matching::sanityCheck() const - { -#ifdef DEBUG_MATCHING - assert( AToB.size() == BToA.size() ); - for(auto aToBPair : AToB) { - auto bToAPair = BToA.find(aToBPair.second); - assert(bToAPair != BToA.end()); - assert( aToBPair.first == bToAPair->second); - } -#endif - } - - template - bool Matching::isPerfect() const - { - return AToB.size() == A.size(); - } - - template - void Matching::matchVertices(const DgmPoint& pA, const DgmPoint& pB) - { - assert(A.hasElement(pA)); - assert(B.hasElement(pB)); - AToB.erase(pA); - AToB.insert({{ pA, pB }}); - BToA.erase(pB); - BToA.insert({{ pB, pA }}); - } - - template - bool Matching::getMatchedVertex(const DgmPoint& p, DgmPoint& result) const - { - sanityCheck(); - auto inA = AToB.find(p); - if (inA != AToB.end()) { - result = inA->second; - return true; - } else { - auto inB = BToA.find(p); - if (inB != BToA.end()) { - result = inB->second; - return true; - } - } - return false; - } - - - template - void Matching::checkAugPath(const Path& augPath) const - { - assert(augPath.size() % 2 == 0); - for (size_t idx = 0; idx < augPath.size(); ++idx) { - bool mustBeExposed { idx == 0 or idx == augPath.size() - 1 }; - if (isExposed(augPath[idx]) != mustBeExposed) { -#ifndef FOR_R_TDA - std::cerr << "mustBeExposed = " << mustBeExposed << ", idx = " << idx << ", point " << augPath[idx] - << std::endl; -#endif - } - assert(isExposed(augPath[idx]) == mustBeExposed); - DgmPoint matchedVertex; - if (idx % 2 == 0) { - assert(A.hasElement(augPath[idx])); - if (not mustBeExposed) { - getMatchedVertex(augPath[idx], matchedVertex); - assert(matchedVertex == augPath[idx - 1]); - } - } else { - assert(B.hasElement(augPath[idx])); - if (not mustBeExposed) { - getMatchedVertex(augPath[idx], matchedVertex); - assert(matchedVertex == augPath[idx + 1]); - } - } - } - } - - // use augmenting path to increase - // the size of the matching - template - void Matching::increase(const Path& augPath) - { - sanityCheck(); - // check that augPath is an augmenting path - checkAugPath(augPath); - for (size_t idx = 0; idx < augPath.size() - 1; idx += 2) { - matchVertices(augPath[idx], augPath[idx + 1]); - } - sanityCheck(); - } - - template - DiagramPointSet Matching::getExposedVertices(bool forA) const - { - sanityCheck(); - DgmPointSet result; - const DgmPointSet* setToSearch { forA ? &A : &B }; - const std::unordered_map* mapToSearch { forA ? &AToB : &BToA }; - for (auto it = setToSearch->cbegin(); it != setToSearch->cend(); ++it) { - if (mapToSearch->find((*it)) == mapToSearch->cend()) { - result.insert((*it)); - } - } - return result; - } - - template - void Matching::getAllAdjacentVertices(const DgmPointSet& setIn, - DgmPointSet& setOut, - bool forA) const - { - sanityCheck(); - //bool isDebug {false}; - setOut.clear(); - const std::unordered_map* m; - m = (forA) ? &BToA : &AToB; - for (auto pit = setIn.cbegin(); pit != setIn.cend(); ++pit) { - auto findRes = m->find(*pit); - if (findRes != m->cend()) { - setOut.insert((*findRes).second); - } - } - sanityCheck(); - } - - template - bool Matching::isExposed(const DgmPoint& p) const - { - return (AToB.find(p) == AToB.end()) && (BToA.find(p) == BToA.end()); - } - - // remove all edges whose length is > newThreshold - template - void Matching::trimMatching(const R newThreshold) - { - //bool isDebug { false }; - sanityCheck(); - for (auto aToBIter = AToB.begin(); aToBIter != AToB.end();) { - if (distLInf(aToBIter->first, aToBIter->second) > newThreshold) { - // remove edge from AToB and BToA - BToA.erase(aToBIter->second); - aToBIter = AToB.erase(aToBIter); - } else { - aToBIter++; - } - } - sanityCheck(); - } - - template - MatchingEdge Matching::get_longest_edge() const - { - R max_dist = -1.0; - MatchingEdge edge; - for (const auto& x : AToB) { - //std::cout << "max_dist = " << max_dist << std::endl; - //std::cout << "distance = " << distLInf(x.first, x.second) << std::endl; - - // for now skew edges may appear in the matching - // but they should not be returned to user - // if currrent edge is a skew edge, there must another edge - // with the same cost - R curr_dist; - if (x.first.isDiagonal() and x.second.isNormal()) { - curr_dist = x.second.get_persistence(hera::get_infinity()); - } else if (x.first.isNormal() and x.second.isDiagonal()) { - curr_dist = x.first.get_persistence(hera::get_infinity()); - } else { - curr_dist = distLInf(x.first, x.second); - } - if (max_dist < curr_dist) { - max_dist = curr_dist; - edge = x; - //std::cout << "updated max_dist = " << max_dist << std::endl; - //std::cout << "updated edge = " << x.first << " <-> " << x.second << std::endl; - } - } - return edge; - } - - // ------- BoundMatchOracle -------------- - - template - BoundMatchOracle::BoundMatchOracle(DgmPointSet psA, DgmPointSet psB, - Real dEps, bool useRS) : - A(psA), B(psB), M(A, B), distEpsilon(dEps), useRangeSearch(useRS), prevQueryValue(0.0) - { - neighbOracle = std::unique_ptr(new NeighbOracle(psB, 0, distEpsilon)); - } - - template - bool BoundMatchOracle::isMatchLess(Real r) - { -#ifdef VERBOSE_BOTTLENECK - std::chrono::high_resolution_clock hrClock; - std::chrono::time_point startMoment; - startMoment = hrClock.now(); -#endif - bool result = buildMatchingForThreshold(r); -#ifdef VERBOSE_BOTTLENECK - auto endMoment = hrClock.now(); - std::chrono::duration iterTime = endMoment - startMoment; - std::cout << "isMatchLess for r = " << r << " finished in " << std::chrono::duration(iterTime).count() << " ms." << std::endl; -#endif - return result; - - } - - - template - void BoundMatchOracle::removeFromLayer(const DgmPoint& p, const int layerIdx) - { - //bool isDebug {false}; - layerGraph[layerIdx].erase(p); - if (layerOracles[layerIdx]) { - layerOracles[layerIdx]->deletePoint(p); - } - } - - // return true, if there exists an augmenting path from startVertex - // in this case the path is returned in result. - // startVertex must be an exposed vertex from L_1 (layer[0]) - template - bool BoundMatchOracle::buildAugmentingPath(const DgmPoint startVertex, Path& result) - { - //bool isDebug {false}; - DgmPoint prevVertexA = startVertex; - result.clear(); - result.push_back(startVertex); - size_t evenLayerIdx { 1 }; - while (evenLayerIdx < layerGraph.size()) { - //for(size_t evenLayerIdx = 1; evenLayerIdx < layerGraph.size(); evenLayerIdx += 2) { - DgmPoint nextVertexB; // next vertex from even layer - bool neighbFound = layerOracles[evenLayerIdx]->getNeighbour(prevVertexA, nextVertexB); - if (neighbFound) { - result.push_back(nextVertexB); - if (layerGraph.size() == evenLayerIdx + 1) { - break; - } else { - // nextVertexB must be matched with some vertex from the next odd - // layer - DgmPoint nextVertexA; - if (!M.getMatchedVertex(nextVertexB, nextVertexA)) { -#ifndef FOR_R_TDA - std::cerr << "Vertices in even layers must be matched! Unmatched: "; - std::cerr << nextVertexB << std::endl; - std::cerr << evenLayerIdx << "; " << layerGraph.size() << std::endl; -#endif - throw std::runtime_error("Unmatched vertex in even layer"); - } else { - assert(!(nextVertexA.getRealX() == 0 and nextVertexA.getRealY() == 0)); - result.push_back(nextVertexA); - prevVertexA = nextVertexA; - evenLayerIdx += 2; - continue; - } - } - } else { - // prevVertexA has no neighbours in the next layer, - // backtrack - if (evenLayerIdx == 1) { - // startVertex is not connected to any vertices - // in the next layer, augm. path doesn't exist - removeFromLayer(startVertex, 0); - return false; - } else { - assert(evenLayerIdx >= 3); - assert(result.size() % 2 == 1); - result.pop_back(); - DgmPoint prevVertexB = result.back(); - result.pop_back(); - removeFromLayer(prevVertexA, evenLayerIdx - 1); - removeFromLayer(prevVertexB, evenLayerIdx - 2); - // we should proceed from the previous odd layer - assert(result.size() >= 1); - prevVertexA = result.back(); - evenLayerIdx -= 2; - continue; - } - } - } // finished iterating over all layers - // remove all vertices in the augmenting paths - // the corresponding layers - for (size_t layerIdx = 0; layerIdx < result.size(); ++layerIdx) { - removeFromLayer(result[layerIdx], layerIdx); - } - return true; - } - - - template - bool BoundMatchOracle::buildMatchingForThreshold(const Real r) - { - //bool isDebug {false}; - if (prevQueryValue > r) { - M.trimMatching(r); - } - prevQueryValue = r; - while (true) { - buildLayerGraph(r); - if (augPathExist) { - std::vector augmentingPaths; - DgmPointSet copyLG0; - for (DgmPoint p : layerGraph[0]) { - copyLG0.insert(p); - } - for (DgmPoint exposedVertex : copyLG0) { - Path augPath; - if (buildAugmentingPath(exposedVertex, augPath)) { - augmentingPaths.push_back(augPath); - } - } - if (augmentingPaths.empty()) { -#ifndef FOR_R_TDA - std::cerr << "augmenting paths must exist, but were not found!" << std::endl; -#endif - throw std::runtime_error("bad epsilon?"); - } - // swap all augmenting paths with matching to increase it - for (auto& augPath : augmentingPaths) { - M.increase(augPath); - } - } else { - return M.isPerfect(); - } - } - } - - template - void BoundMatchOracle::printLayerGraph(void) - { -#ifdef DEBUG_BOUND_MATCH - for(auto& layer : layerGraph) { - std::cout << "{ "; - for(auto& p : layer) { - std::cout << p << "; "; - } - std::cout << "\b\b }" << std::endl; - } -#endif - } - - template - void BoundMatchOracle::buildLayerGraph(Real r) - { -#ifdef VERBOSE_BOTTLENECK - std::cout << "Entered buildLayerGraph, r = " << r << std::endl; -#endif - layerGraph.clear(); - DgmPointSet L1 = M.getExposedVertices(); - layerGraph.push_back(L1); - neighbOracle->rebuild(B, r); - size_t k = 0; - DgmPointSet layerNextEven; - DgmPointSet layerNextOdd; - bool exposedVerticesFound { false }; - while (true) { - layerNextEven.clear(); - for (auto p : layerGraph[k]) { - bool neighbFound; - //DgmPoint neighbour {0.0, 0.0, DgmPoint::DIAG, 1}; - DgmPoint neighbour; - if (useRangeSearch) { - std::vector neighbVec; - neighbOracle->getAllNeighbours(p, neighbVec); - neighbFound = !neighbVec.empty(); - for (auto& neighbPt : neighbVec) { - layerNextEven.insert(neighbPt); - if (!exposedVerticesFound and M.isExposed(neighbPt)) { - exposedVerticesFound = true; - } - } - } else { - while (true) { - neighbFound = neighbOracle->getNeighbour(p, neighbour); - if (neighbFound) { - layerNextEven.insert(neighbour); - neighbOracle->deletePoint(neighbour); - if ((!exposedVerticesFound) && M.isExposed(neighbour)) { - exposedVerticesFound = true; - } - } else { - break; - } - } - } // without range search - } // all vertices from previous odd layer processed - if (layerNextEven.empty()) { - augPathExist = false; - break; - } - if (exposedVerticesFound) { - for (auto it = layerNextEven.cbegin(); it != layerNextEven.cend();) { - if (!M.isExposed(*it)) { - layerNextEven.erase(it++); - } else { - ++it; - } - - } - layerGraph.push_back(layerNextEven); - augPathExist = true; - break; - } - layerGraph.push_back(layerNextEven); - M.getAllAdjacentVertices(layerNextEven, layerNextOdd); - layerGraph.push_back(layerNextOdd); - k += 2; - } - buildLayerOracles(r); - printLayerGraph(); - } - - // create geometric oracles for each even layer - // odd layers have NULL in layerOracles - template - void BoundMatchOracle::buildLayerOracles(Real r) - { - //bool isDebug {false}; - // free previously constructed oracles - layerOracles.clear(); - for (size_t layerIdx = 0; layerIdx < layerGraph.size(); ++layerIdx) { - if (layerIdx % 2 == 1) { - // even layer, build actual oracle - layerOracles.emplace_back(new NeighbOracle(layerGraph[layerIdx], r, distEpsilon)); - } else { - // odd layer - layerOracles.emplace_back(nullptr); - } - } - } - - } // end namespace bt -} // end namespace hera -#endif // HERA_BOUND_MATCH_HPP diff --git a/geom_bottleneck/include/catch/catch.hpp b/geom_bottleneck/include/catch/catch.hpp deleted file mode 100644 index f7681f4..0000000 --- a/geom_bottleneck/include/catch/catch.hpp +++ /dev/null @@ -1,11545 +0,0 @@ -/* - * Catch v1.9.6 - * Generated: 2017-06-27 12:19:54.557875 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// #included from: internal/catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic ignored "-Wglobal-constructors" -# pragma clang diagnostic ignored "-Wvariadic-macros" -# pragma clang diagnostic ignored "-Wc99-extensions" -# pragma clang diagnostic ignored "-Wunused-variable" -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wc++98-compat" -# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic ignored "-Wvariadic-macros" -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic ignored "-Wparentheses" - -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wpadded" -#endif -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -#endif - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? -// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported -// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? -// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? -// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) -// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? -// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? - -// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? -// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? -// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? -// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 - -#ifdef __cplusplus - -# if __cplusplus >= 201103L -# define CATCH_CPP11_OR_GREATER -# endif - -# if __cplusplus >= 201402L -# define CATCH_CPP14_OR_GREATER -# endif - -#endif - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# if defined(CATCH_CPP11_OR_GREATER) -# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic pop" ) -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// We know some environments not to support full POSIX signals -#if defined(__CYGWIN__) || defined(__QNX__) - -# if !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -# endif - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Cygwin -#ifdef __CYGWIN__ - -// Required for some versions of Cygwin to declare gettimeofday -// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin -# define _BSD_SOURCE - -#endif // __CYGWIN__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH - -#if (_MSC_VER >= 1600) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE -#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS - -#endif - -// Use __COUNTER__ if the compiler supports it -#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ - ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \ - ( defined __clang__ && __clang_major__ >= 3 ) - -#define CATCH_INTERNAL_CONFIG_COUNTER - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(CATCH_CPP11_OR_GREATER) - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# endif - -# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) -# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) -# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) -# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) -# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS -# endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NULLPTR -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_IS_ENUM -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TUPLE -#endif -#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) -# define CATCH_CONFIG_VARIADIC_MACROS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_LONG_LONG -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_UNIQUE_PTR -#endif -// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for -// analytics) because, at time of writing, __COUNTER__ is not properly handled by it. -// This does not affect compilation -#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) -# define CATCH_CONFIG_COUNTER -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_SHUFFLE -#endif -# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TYPE_TRAITS -# endif -#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) -# define CATCH_CONFIG_WINDOWS_SEH -#endif -// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. -#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_CONFIG_POSIX_SIGNALS -#endif - -#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CATCH_CONFIG_CPP11_NULLPTR -# define CATCH_NULL nullptr -#else -# define CATCH_NULL NULL -#endif - -// override support -#ifdef CATCH_CONFIG_CPP11_OVERRIDE -# define CATCH_OVERRIDE override -#else -# define CATCH_OVERRIDE -#endif - -// unique_ptr support -#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR -# define CATCH_AUTO_PTR( T ) std::unique_ptr -#else -# define CATCH_AUTO_PTR( T ) std::auto_ptr -#endif - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#ifdef CATCH_CONFIG_COUNTER -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) -#else -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) -#endif - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include - -namespace Catch { - - struct IConfig; - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { -#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; -#else - NonCopyable( NonCopyable const& info ); - NonCopyable& operator = ( NonCopyable const& ); -#endif - - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool startsWith( std::string const& s, char prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool endsWith( std::string const& s, char suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SourceLineInfo(SourceLineInfo const& other) = default; - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - bool operator < ( SourceLineInfo const& other ) const; - - char const* file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - void seedRng( IConfig const& config ); - unsigned int rngSeed(); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( CATCH_NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = CATCH_NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == CATCH_NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -void registerTestCase - ( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - -struct AutoReg { - - AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg - ( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - registerTestCase - ( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ - static void TestName(); \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( ... ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ \ - struct TestName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - void TestName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ - static void TestName(); \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ \ - struct TestCaseName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - void TestCaseName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2, - - FatalErrorCondition = 0x200 | FailureBit - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x01, - - ContinueOnFailure = 0x02, // Failures fail test, but execution continues - FalseTest = 0x04, // Prefix expression with ! - SuppressFail = 0x08 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct DecomposedExpression - { - virtual ~DecomposedExpression() {} - virtual bool isBinaryExpression() const { - return false; - } - virtual void reconstructExpression( std::string& dest ) const = 0; - - // Only simple binary comparisons can be decomposed. - // If more complex check is required then wrap sub-expressions in parentheses. - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); - - private: - DecomposedExpression& operator = (DecomposedExpression const&); - }; - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( char const * _macroName, - SourceLineInfo const& _lineInfo, - char const * _capturedExpression, - ResultDisposition::Flags _resultDisposition, - char const * _secondArg = ""); - - char const * macroName; - SourceLineInfo lineInfo; - char const * capturedExpression; - ResultDisposition::Flags resultDisposition; - char const * secondArg; - }; - - struct AssertionResultData - { - AssertionResultData() : decomposedExpression( CATCH_NULL ) - , resultType( ResultWas::Unknown ) - , negated( false ) - , parenthesized( false ) {} - - void negate( bool parenthesize ) { - negated = !negated; - parenthesized = parenthesize; - if( resultType == ResultWas::Ok ) - resultType = ResultWas::ExpressionFailed; - else if( resultType == ResultWas::ExpressionFailed ) - resultType = ResultWas::Ok; - } - - std::string const& reconstructExpression() const { - if( decomposedExpression != CATCH_NULL ) { - decomposedExpression->reconstructExpression( reconstructedExpression ); - if( parenthesized ) { - reconstructedExpression.insert( 0, 1, '(' ); - reconstructedExpression.append( 1, ')' ); - } - if( negated ) { - reconstructedExpression.insert( 0, 1, '!' ); - } - decomposedExpression = CATCH_NULL; - } - return reconstructedExpression; - } - - mutable DecomposedExpression const* decomposedExpression; - mutable std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - bool negated; - bool parenthesized; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - void discardDecomposedExpression() const; - void expandDecomposedExpression() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -// #included from: catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - template struct MatchAllOf; - template struct MatchAnyOf; - template struct MatchNotOf; - - class MatcherUntypedBase { - public: - std::string toString() const { - if( m_cachedToString.empty() ) - m_cachedToString = describe(); - return m_cachedToString; - } - - protected: - virtual ~MatcherUntypedBase(); - virtual std::string describe() const = 0; - mutable std::string m_cachedToString; - private: - MatcherUntypedBase& operator = ( MatcherUntypedBase const& ); - }; - - template - struct MatcherMethod { - virtual bool match( ObjectT const& arg ) const = 0; - }; - template - struct MatcherMethod { - virtual bool match( PtrT* arg ) const = 0; - }; - - template - struct MatcherBase : MatcherUntypedBase, MatcherMethod { - - MatchAllOf operator && ( MatcherBase const& other ) const; - MatchAnyOf operator || ( MatcherBase const& other ) const; - MatchNotOf operator ! () const; - }; - - template - struct MatchAllOf : MatcherBase { - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if (!m_matchers[i]->match(arg)) - return false; - } - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - description += " and "; - description += m_matchers[i]->toString(); - } - description += " )"; - return description; - } - - MatchAllOf& operator && ( MatcherBase const& other ) { - m_matchers.push_back( &other ); - return *this; - } - - std::vector const*> m_matchers; - }; - template - struct MatchAnyOf : MatcherBase { - - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if (m_matchers[i]->match(arg)) - return true; - } - return false; - } - virtual std::string describe() const CATCH_OVERRIDE { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - description += " or "; - description += m_matchers[i]->toString(); - } - description += " )"; - return description; - } - - MatchAnyOf& operator || ( MatcherBase const& other ) { - m_matchers.push_back( &other ); - return *this; - } - - std::vector const*> m_matchers; - }; - - template - struct MatchNotOf : MatcherBase { - - MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} - - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - return !m_underlyingMatcher.match( arg ); - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "not " + m_underlyingMatcher.toString(); - } - MatcherBase const& m_underlyingMatcher; - }; - - template - MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { - return MatchAllOf() && *this && other; - } - template - MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { - return MatchAnyOf() || *this || other; - } - template - MatchNotOf MatcherBase::operator ! () const { - return MatchNotOf( *this ); - } - - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - // - deprecated: prefer ||, && and ! - template - inline Impl::MatchNotOf Not( Impl::MatcherBase const& underlyingMatcher ) { - return Impl::MatchNotOf( underlyingMatcher ); - } - template - inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { - return Impl::MatchAllOf() && m1 && m2; - } - template - inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { - return Impl::MatchAllOf() && m1 && m2 && m3; - } - template - inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { - return Impl::MatchAnyOf() || m1 || m2; - } - template - inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { - return Impl::MatchAnyOf() || m1 || m2 || m3; - } - -} // namespace Matchers - -using namespace Matchers; -using Matchers::Impl::MatcherBase; - -} // namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(std::string()); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder : public DecomposedExpression { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg = "" ); - ~ResultBuilder(); - - template - ExpressionLhs operator <= ( T const& operand ); - ExpressionLhs operator <= ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream().oss << value; - return *this; - } - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - - void endExpression( DecomposedExpression const& expr ); - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; - - AssertionResult build() const; - AssertionResult build( DecomposedExpression const& expr ) const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void captureExpectedException( std::string const& expectedMessage ); - void captureExpectedException( Matchers::Impl::MatcherBase const& matcher ); - void handleResult( AssertionResult const& result ); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - template - void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); - - void setExceptionGuard(); - void unsetExceptionGuard(); - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - - static CopyableStream &m_stream() - { - static CopyableStream s; - return s; - } - - bool m_shouldDebugBreak; - bool m_shouldThrow; - bool m_guardException; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return bool( opCast( lhs ) == opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) != opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) < opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) > opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) >= opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) <= opCast( rhs ) ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - // long long to unsigned X - template bool compare( long long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // unsigned long long to X - template bool compare( unsigned long long lhs, int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long long (when comparing against NULL) - template bool compare( long long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } -#endif // CATCH_CONFIG_CPP11_LONG_LONG - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( nullptr, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, nullptr ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -#ifdef CATCH_CONFIG_CPP11_TUPLE -#include -#endif - -#ifdef CATCH_CONFIG_CPP11_IS_ENUM -#include -#endif - -namespace Catch { - -// Why we're here. -template -std::string toString( T const& value ); - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( const wchar_t* const value ); -std::string toString( wchar_t* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ); -std::string toString( unsigned long long value ); -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG & nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - -namespace Detail { - - extern const std::string unprintableString; - - #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK) - struct BorgType { - template BorgType( T const& ); - }; - - struct TrueType { char sizer[1]; }; - struct FalseType { char sizer[2]; }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; -#else - template - class IsStreamInsertable { - template - static auto test(int) - -> decltype( std::declval() << std::declval(), std::true_type() ); - - template - static auto test(...) -> std::false_type; - - public: - static const bool value = decltype(test(0))::value; - }; -#endif - -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template::value - > - struct EnumStringMaker - { - static std::string convert( T const& ) { return unprintableString; } - }; - - template - struct EnumStringMaker - { - static std::string convert( T const& v ) - { - return ::Catch::toString( - static_cast::type>(v) - ); - } - }; -#endif - template - struct StringMakerBase { -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template - static std::string convert( T const& v ) - { - return EnumStringMaker::convert( v ); - } -#else - template - static std::string convert( T const& ) { return unprintableString; } -#endif - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -//template -//struct StringMaker > { -// static std::string convert( std::vector const& v ) { -// return Detail::rangeToString( v.begin(), v.end() ); -// } -//}; - -template -std::string toString( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); -} - -#ifdef CATCH_CONFIG_CPP11_TUPLE - -// toString for tuples -namespace TupleDetail { - template< - typename Tuple, - std::size_t N = 0, - bool = (N < std::tuple_size::value) - > - struct ElementPrinter { - static void print( const Tuple& tuple, std::ostream& os ) - { - os << ( N ? ", " : " " ) - << Catch::toString(std::get(tuple)); - ElementPrinter::print(tuple,os); - } - }; - - template< - typename Tuple, - std::size_t N - > - struct ElementPrinter { - static void print( const Tuple&, std::ostream& ) {} - }; - -} - -template -struct StringMaker> { - - static std::string convert( const std::tuple& tuple ) - { - std::ostringstream os; - os << '{'; - TupleDetail::ElementPrinter>::print( tuple, os ); - os << " }"; - return os.str(); - } -}; -#endif // CATCH_CONFIG_CPP11_TUPLE - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << Catch::toString( *first ); - for( ++first ; first != last ; ++first ) - oss << ", " << Catch::toString( *first ); - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -template -class BinaryExpression; - -template -class MatchExpression; - -// Wraps the LHS of an expression and overloads comparison operators -// for also capturing those and RHS (if any) -template -class ExpressionLhs : public DecomposedExpression { -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} - - ExpressionLhs& operator = ( const ExpressionLhs& ); - - template - BinaryExpression - operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - BinaryExpression operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - BinaryExpression operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - m_truthy = m_lhs ? true : false; - m_rb - .setResultType( m_truthy ) - .endExpression( *this ); - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - dest = Catch::toString( m_lhs ); - } - -private: - template - BinaryExpression captureExpression( RhsT& rhs ) const { - return BinaryExpression( m_rb, m_lhs, rhs ); - } - - template - BinaryExpression captureExpression( bool rhs ) const { - return BinaryExpression( m_rb, m_lhs, rhs ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; - bool m_truthy; -}; - -template -class BinaryExpression : public DecomposedExpression { -public: - BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) - : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} - - BinaryExpression& operator = ( BinaryExpression& ); - - void endExpression() const { - m_rb - .setResultType( Internal::compare( m_lhs, m_rhs ) ) - .endExpression( *this ); - } - - virtual bool isBinaryExpression() const CATCH_OVERRIDE { - return true; - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - std::string lhs = Catch::toString( m_lhs ); - std::string rhs = Catch::toString( m_rhs ); - char delim = lhs.size() + rhs.size() < 40 && - lhs.find('\n') == std::string::npos && - rhs.find('\n') == std::string::npos ? ' ' : '\n'; - dest.reserve( 7 + lhs.size() + rhs.size() ); - // 2 for spaces around operator - // 2 for operator - // 2 for parentheses (conditionally added later) - // 1 for negation (conditionally added later) - dest = lhs; - dest += delim; - dest += Internal::OperatorTraits::getName(); - dest += delim; - dest += rhs; - } - -private: - ResultBuilder& m_rb; - LhsT m_lhs; - RhsT m_rhs; -}; - -template -class MatchExpression : public DecomposedExpression { -public: - MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) - : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} - - virtual bool isBinaryExpression() const CATCH_OVERRIDE { - return true; - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - std::string matcherAsString = m_matcher.toString(); - dest = Catch::toString( m_arg ); - dest += ' '; - if( matcherAsString == Detail::unprintableString ) - dest += m_matcherString; - else - dest += matcherAsString; - } - -private: - ArgT m_arg; - MatcherT m_matcher; - char const* m_matcherString; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { - return ExpressionLhs( *this, value ); - } - - template - inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, - char const* matcherString ) { - MatchExpression expr( arg, matcher, matcherString ); - setResultType( matcher.match( arg ) ); - endExpression( expr ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct SectionEndInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - - virtual void exceptionEarlyReported() = 0; - - virtual void handleFatalErrorCondition( std::string const& message ) = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -# define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -# define CATCH_PLATFORM_IPHONE -#elif defined(linux) || defined(__linux) || defined(__linux__) -# define CATCH_PLATFORM_LINUX -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -# define CATCH_PLATFORM_WINDOWS -# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) -# define CATCH_DEFINES_NOMINMAX -# endif -# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) -# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# endif -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_TRAP() \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ) - #else - #define CATCH_TRAP() __asm__("int $3\n" : : ) - #endif - -#elif defined(CATCH_PLATFORM_LINUX) - // If we can use inline assembler, do it because this allows us to break - // directly at the location of the failing check instead of breaking inside - // raise() called from it, i.e. one stack frame below. - #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) - #define CATCH_TRAP() asm volatile ("int $3") - #else // Fall back to the generic way. - #include - - #define CATCH_TRAP() raise(SIGTRAP) - #endif -#elif defined(_MSC_VER) - #define CATCH_TRAP() __debugbreak() -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_TRAP() DebugBreak() -#endif - -#ifdef CATCH_TRAP - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } -#else - #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -#if defined(CATCH_CONFIG_FAST_COMPILE) -/////////////////////////////////////////////////////////////////////////////// -// We can speedup compilation significantly by breaking into debugger lower in -// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER -// macro in each assertion -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -// Another way to speed-up compilation is to omit local try-catch for REQUIRE* -// macros. -// This can potentially cause false negative, if the test code catches -// the exception before it propagates back up to the runner. -#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - __catchResult.setExceptionGuard(); \ - CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - ( __catchResult <= expr ).endExpression(); \ - CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - __catchResult.unsetExceptionGuard(); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look -// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. - -#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - __catchResult.setExceptionGuard(); \ - __catchResult.captureMatch( arg, matcher, #matcher ); \ - __catchResult.unsetExceptionGuard(); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -#else -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - ( __catchResult <= expr ).endExpression(); \ - CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \ - INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \ - INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ - if( __catchResult.allowThrows() ) \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureExpectedException( matcher ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr ", " #exceptionType, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( macroName, log ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - try { \ - __catchResult.captureMatch( arg, matcher, #matcher ); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - bool allOk() const { - return failed == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -#include - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - - struct SectionEndInfo { - SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) - : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo sectionInfo; - Counts prevAssertions; - double durationInSeconds; - }; - -} // end namespace Catch - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef _MSC_VER - -namespace Catch { - typedef unsigned long long UInt64; -} -#else -#include -namespace Catch { - typedef uint64_t UInt64; -} -#endif - -namespace Catch { - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedMicroseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - UInt64 m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section : NonCopyable { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -#include - -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - struct ITagAliasRegistry; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; - - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; - virtual void registerListener( Ptr const& factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator; - typedef std::vector ExceptionTranslators; - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { - try { - if( it == itEnd ) - throw; - else - return (*it)->translate( it+1, itEnd ); - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ - static std::string translatorName( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ - static std::string translatorName( signature ) - -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) -#include -#endif - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_margin( 0.0 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_margin( other.m_margin ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - -#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) - - template ::value>::type> - Approx operator()( T value ) { - Approx approx( static_cast(value) ); - approx.epsilon( m_epsilon ); - approx.margin( m_margin ); - approx.scale( m_scale ); - return approx; - } - - template ::value>::type> - explicit Approx( T value ): Approx(static_cast(value)) - {} - - template ::value>::type> - friend bool operator == ( const T& lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - auto lhs_v = double(lhs); - bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); - if (relativeOK) { - return true; - } - return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin; - } - - template ::value>::type> - friend bool operator == ( Approx const& lhs, const T& rhs ) { - return operator==( rhs, lhs ); - } - - template ::value>::type> - friend bool operator != ( T lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - template ::value>::type> - friend bool operator != ( Approx const& lhs, T rhs ) { - return !operator==( rhs, lhs ); - } - - template ::value>::type> - friend bool operator <= ( T lhs, Approx const& rhs ) { - return double(lhs) < rhs.m_value || lhs == rhs; - } - - template ::value>::type> - friend bool operator <= ( Approx const& lhs, T rhs ) { - return lhs.m_value < double(rhs) || lhs == rhs; - } - - template ::value>::type> - friend bool operator >= ( T lhs, Approx const& rhs ) { - return double(lhs) > rhs.m_value || lhs == rhs; - } - - template ::value>::type> - friend bool operator >= ( Approx const& lhs, T rhs ) { - return lhs.m_value > double(rhs) || lhs == rhs; - } - - template ::value>::type> - Approx& epsilon( T newEpsilon ) { - m_epsilon = double(newEpsilon); - return *this; - } - - template ::value>::type> - Approx& margin( T newMargin ) { - m_margin = double(newMargin); - return *this; - } - - template ::value>::type> - Approx& scale( T newScale ) { - m_scale = double(newScale); - return *this; - } - -#else - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.margin( m_margin ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) ); - if (relativeOK) { - return true; - } - return std::fabs(lhs - rhs.m_value) < rhs.m_margin; - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - friend bool operator <= ( double lhs, Approx const& rhs ) { - return lhs < rhs.m_value || lhs == rhs; - } - - friend bool operator <= ( Approx const& lhs, double rhs ) { - return lhs.m_value < rhs || lhs == rhs; - } - - friend bool operator >= ( double lhs, Approx const& rhs ) { - return lhs > rhs.m_value || lhs == rhs; - } - - friend bool operator >= ( Approx const& lhs, double rhs ) { - return lhs.m_value > rhs || lhs == rhs; - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& margin( double newMargin ) { - m_margin = newMargin; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } -#endif - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_margin; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_matchers_string.h -#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED - -namespace Catch { -namespace Matchers { - - namespace StdString { - - struct CasedString - { - CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); - std::string adjustString( std::string const& str ) const; - std::string caseSensitivitySuffix() const; - - CaseSensitive::Choice m_caseSensitivity; - std::string m_str; - }; - - struct StringMatcherBase : MatcherBase { - StringMatcherBase( std::string const& operation, CasedString const& comparator ); - virtual std::string describe() const CATCH_OVERRIDE; - - CasedString m_comparator; - std::string m_operation; - }; - - struct EqualsMatcher : StringMatcherBase { - EqualsMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct ContainsMatcher : StringMatcherBase { - ContainsMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct StartsWithMatcher : StringMatcherBase { - StartsWithMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct EndsWithMatcher : StringMatcherBase { - EndsWithMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - - } // namespace StdString - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - -} // namespace Matchers -} // namespace Catch - -// #included from: internal/catch_matchers_vector.h -#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED - -namespace Catch { -namespace Matchers { - - namespace Vector { - - template - struct ContainsElementMatcher : MatcherBase, T> { - - ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - return std::find(v.begin(), v.end(), m_comparator) != v.end(); - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "Contains: " + Catch::toString( m_comparator ); - } - - T const& m_comparator; - }; - - template - struct ContainsMatcher : MatcherBase, std::vector > { - - ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - // !TBD: see note in EqualsMatcher - if (m_comparator.size() > v.size()) - return false; - for (size_t i = 0; i < m_comparator.size(); ++i) - if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end()) - return false; - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - return "Contains: " + Catch::toString( m_comparator ); - } - - std::vector const& m_comparator; - }; - - template - struct EqualsMatcher : MatcherBase, std::vector > { - - EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - // !TBD: This currently works if all elements can be compared using != - // - a more general approach would be via a compare template that defaults - // to using !=. but could be specialised for, e.g. std::vector etc - // - then just call that directly - if (m_comparator.size() != v.size()) - return false; - for (size_t i = 0; i < v.size(); ++i) - if (m_comparator[i] != v[i]) - return false; - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - return "Equals: " + Catch::toString( m_comparator ); - } - std::vector const& m_comparator; - }; - - } // namespace Vector - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - - template - Vector::ContainsMatcher Contains( std::vector const& comparator ) { - return Vector::ContainsMatcher( comparator ); - } - - template - Vector::ContainsElementMatcher VectorContains( T const& comparator ) { - return Vector::ContainsElementMatcher( comparator ); - } - - template - Vector::EqualsMatcher Equals( std::vector const& comparator ) { - return Vector::EqualsMatcher( comparator ); - } - -} // namespace Matchers -} // namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( CATCH_NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = CATCH_NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != CATCH_NULL; } - bool none() const { return nullableValue == CATCH_NULL; } - - bool operator !() const { return nullableValue == CATCH_NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T *nullableValue; - union { - char storage[sizeof(T)]; - - // These are here to force alignment for the storage - long double dummy1; - void (*dummy2)(); - long double dummy3; -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - long long dummy4; -#endif - }; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4, - NonPortable = 1 << 5 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( CATCH_NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - struct StringHolder : MatcherBase{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - virtual bool match( NSString* arg ) const CATCH_OVERRIDE { - return false; - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const CATCH_OVERRIDE { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_IMPL - -// !TBD: Move the leak detector code into a separate header -#ifdef CATCH_CONFIG_WINDOWS_CRTDBG -#include -class LeakDetector { -public: - LeakDetector() { - int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - flag |= _CRTDBG_LEAK_CHECK_DF; - flag |= _CRTDBG_ALLOC_MEM_DF; - _CrtSetDbgFlag(flag); - _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); - // Change this to leaking allocation's number to break there - _CrtSetBreakAlloc(-1); - } -}; -#else -class LeakDetector {}; -#endif - -LeakDetector leakDetector; - -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: ../catch_session.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_wildcard_pattern.hpp -#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED - -#include - -namespace Catch -{ - class WildcardPattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - - WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_wildcard( NoWildcard ), - m_pattern( adjustCase( pattern ) ) - { - if( startsWith( m_pattern, '*' ) ) { - m_pattern = m_pattern.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_pattern, '*' ) ) { - m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~WildcardPattern(); - virtual bool matches( std::string const& str ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_pattern == adjustCase( str ); - case WildcardAtStart: - return endsWith( adjustCase( str ), m_pattern ); - case WildcardAtEnd: - return startsWith( adjustCase( str ), m_pattern ); - case WildcardAtBothEnds: - return contains( adjustCase( str ), m_pattern ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string adjustCase( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; - } - CaseSensitive::Choice m_caseSensitivity; - WildcardPosition m_wildcard; - std::string m_pattern; - }; -} - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - public: - NamePattern( std::string const& name ) - : m_wildcardPattern( toLower( name ), CaseSensitive::No ) - {} - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return m_wildcardPattern.matches( toLower( testCase.name ) ); - } - private: - WildcardPattern m_wildcardPattern; - }; - - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { - if( !(*it)->matches( testCase ) ) - return false; - } - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag, EscapedName }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - std::vector m_escapeChars; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - m_escapeChars.clear(); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - case '\\': return escape(); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - else if( c == '\\' ) - escape(); - } - else if( m_mode == EscapedName ) - m_mode = Name; - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - void escape() { - if( m_mode == None ) - m_start = m_pos; - m_mode = EscapedName; - m_escapeChars.push_back( m_pos ); - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - for( size_t i = 0; i < m_escapeChars.size(); ++i ) - token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); - m_escapeChars.clear(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - struct RunTests { enum InWhatOrder { - InDeclarationOrder, - InLexicographicalOrder, - InRandomOrder - }; }; - struct UseColour { enum YesOrNo { - Auto, - Yes, - No - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - virtual RunTests::InWhatOrder runOrder() const = 0; - virtual unsigned int rngSeed() const = 0; - virtual UseColour::YesOrNo useColour() const = 0; - virtual std::vector const& getSectionsToRun() const = 0; - - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include -#include -#include - -namespace Catch { - - std::ostream& cout(); - std::ostream& cerr(); - - struct IStream { - virtual ~IStream() CATCH_NOEXCEPT; - virtual std::ostream& stream() const = 0; - }; - - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( std::string const& filename ); - virtual ~FileStream() CATCH_NOEXCEPT; - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - CoutStream(); - virtual ~CoutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class DebugOutStream : public IStream { - CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream(); - virtual ~DebugOutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; -} - -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - listExtraInfo( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - filenamesAsTags( false ), - abortAfter( -1 ), - rngSeed( 0 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ), - useColour( UseColour::Auto ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - bool listExtraInfo; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - bool filenamesAsTags; - - int abortAfter; - unsigned int rngSeed; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - RunTests::InWhatOrder runOrder; - UseColour::YesOrNo useColour; - - std::string outputFilename; - std::string name; - std::string processName; - - std::vector reporterNames; - std::vector testsOrTags; - std::vector sectionsToRun; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_stream( openStream() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() {} - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - bool listExtraInfo() const { return m_data.listExtraInfo; } - - std::string getProcessName() const { return m_data.processName; } - - std::vector const& getReporterNames() const { return m_data.reporterNames; } - std::vector const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } - - virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - - // IConfig interface - virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; } - virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); } - virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; } - virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; } - virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; } - virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; } - virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; } - virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; } - virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; } - - private: - - IStream const* openStream() { - if( m_data.outputFilename.empty() ) - return new CoutStream(); - else if( m_data.outputFilename[0] == '%' ) { - if( m_data.outputFilename == "%debug" ) - return new DebugOutStream(); - else - throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); - } - else - return new FileStream( m_data.outputFilename ); - } - ConfigData m_data; - - CATCH_AUTO_PTR( IStream const ) m_stream; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Version 0.0.2.4 - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -// ----------- #included from clara_compilers.h ----------- - -#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED -#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? -// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? - -// In general each macro has a _NO_ form -// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 - -#ifdef __clang__ - -#if __has_feature(cxx_nullptr) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#if __has_feature(cxx_noexcept) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -#define CLARA_CPP11_OR_GREATER - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) -#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE -#endif -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NULLPTR -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_UNIQUE_PTR -#endif - -// noexcept support: -#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) -#define CLARA_NOEXCEPT noexcept -# define CLARA_NOEXCEPT_IS(x) noexcept(x) -#else -#define CLARA_NOEXCEPT throw() -# define CLARA_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CLARA_CONFIG_CPP11_NULLPTR -#define CLARA_NULL nullptr -#else -#define CLARA_NULL NULL -#endif - -// override support -#ifdef CLARA_CONFIG_CPP11_OVERRIDE -#define CLARA_OVERRIDE override -#else -#define CLARA_OVERRIDE -#endif - -// unique_ptr support -#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR -# define CLARA_AUTO_PTR( T ) std::unique_ptr -#else -# define CLARA_AUTO_PTR( T ) std::auto_ptr -#endif - -#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// ----------- end of #include from clara_compilers.h ----------- -// ........... back in clara.h - -#include -#include -#include - -#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CLARA_PLATFORM_WINDOWS -#endif - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - char toLowerCh(char c) { - return static_cast( std::tolower( c ) ); - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -#endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( CLARA_NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != CLARA_NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - inline std::vector argsToVector( int argc, char const* const* const argv ) { - std::vector args( static_cast( argc ) ); - for( std::size_t i = 0; i < static_cast( argc ); ++i ) - args[i] = argv[i]; - - return args; - } - - class Parser { - enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; - Mode mode; - std::size_t from; - bool inQuotes; - public: - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - Parser() : mode( None ), from( 0 ), inQuotes( false ){} - - void parseIntoTokens( std::vector const& args, std::vector& tokens ) { - const std::string doubleDash = "--"; - for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) - parseIntoTokens( args[i], tokens); - } - - void parseIntoTokens( std::string const& arg, std::vector& tokens ) { - for( std::size_t i = 0; i < arg.size(); ++i ) { - char c = arg[i]; - if( c == '"' ) - inQuotes = !inQuotes; - mode = handleMode( i, c, arg, tokens ); - } - mode = handleMode( arg.size(), '\0', arg, tokens ); - } - Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - switch( mode ) { - case None: return handleNone( i, c ); - case MaybeShortOpt: return handleMaybeShortOpt( i, c ); - case ShortOpt: - case LongOpt: - case SlashOpt: return handleOpt( i, c, arg, tokens ); - case Positional: return handlePositional( i, c, arg, tokens ); - default: throw std::logic_error( "Unknown mode" ); - } - } - - Mode handleNone( std::size_t i, char c ) { - if( inQuotes ) { - from = i; - return Positional; - } - switch( c ) { - case '-': return MaybeShortOpt; -#ifdef CLARA_PLATFORM_WINDOWS - case '/': from = i+1; return SlashOpt; -#endif - default: from = i; return Positional; - } - } - Mode handleMaybeShortOpt( std::size_t i, char c ) { - switch( c ) { - case '-': from = i+1; return LongOpt; - default: from = i; return ShortOpt; - } - } - - Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) - return mode; - - std::string optName = arg.substr( from, i-from ); - if( mode == ShortOpt ) - for( std::size_t j = 0; j < optName.size(); ++j ) - tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); - else if( mode == SlashOpt && optName.size() == 1 ) - tokens.push_back( Token( Token::ShortOpt, optName ) ); - else - tokens.push_back( Token( Token::LongOpt, optName ) ); - return None; - } - Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) - return mode; - - std::string data = arg.substr( from, i-from ); - tokens.push_back( Token( Token::Positional, data ) ); - return None; - } - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg.reset( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( std::vector const& args ) const { - ConfigT config; - parseInto( args, config ); - return config; - } - - std::vector parseInto( std::vector const& args, ConfigT& config ) const { - std::string processName = args.empty() ? std::string() : args[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( args, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.set( config, "true" ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( errors.empty() && m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } - inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); - } - inline void setOrder( ConfigData& config, std::string const& order ) { - if( startsWith( "declared", order ) ) - config.runOrder = RunTests::InDeclarationOrder; - else if( startsWith( "lexical", order ) ) - config.runOrder = RunTests::InLexicographicalOrder; - else if( startsWith( "random", order ) ) - config.runOrder = RunTests::InRandomOrder; - else - throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); - } - inline void setRngSeed( ConfigData& config, std::string const& seed ) { - if( seed == "time" ) { - config.rngSeed = static_cast( std::time(0) ); - } - else { - std::stringstream ss; - ss << seed; - ss >> config.rngSeed; - if( ss.fail() ) - throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" ); - } - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void setUseColour( ConfigData& config, std::string const& value ) { - std::string mode = toLower( value ); - - if( mode == "yes" ) - config.useColour = UseColour::Yes; - else if( mode == "no" ) - config.useColour = UseColour::No; - else if( mode == "auto" ) - config.useColour = UseColour::Auto; - else - throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); - } - inline void forceColour( ConfigData& config ) { - config.useColour = UseColour::Yes; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, '#' ) ) { - if( !startsWith( line, '"' ) ) - line = '"' + line + '"'; - addTestOrTags( config, line + ',' ); - } - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &addReporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes|no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - cli["-#"]["--filenames-as-tags"] - .describe( "adds a tag for the filename" ) - .bind( &ConfigData::filenamesAsTags ); - - cli["-c"]["--section"] - .describe( "specify section to run" ) - .bind( &addSectionToRun, "section name" ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-extra-info"] - .describe( "list all/matching test cases with more info" ) - .bind( &ConfigData::listExtraInfo ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - cli["--order"] - .describe( "test case order (defaults to decl)" ) - .bind( &setOrder, "decl|lex|rand" ); - - cli["--rng-seed"] - .describe( "set a specific seed for random numbers" ) - .bind( &setRngSeed, "'time'|number" ); - - cli["--force-colour"] - .describe( "force colourised output (deprecated)" ) - .bind( &forceColour ); - - cli["--use-colour"] - .describe( "should output be colourised" ) - .bind( &setUseColour, "yes|no" ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - const std::string wrappableBeforeChars = "[({<\t"; - const std::string wrappableAfterChars = "])}>-,./|\\"; - const std::string wrappableInsteadOfChars = " \n\r"; - std::string indent = _attr.initialIndent != std::string::npos - ? std::string( _attr.initialIndent, ' ' ) - : std::string( _attr.indent, ' ' ); - - typedef std::string::const_iterator iterator; - iterator it = _str.begin(); - const iterator strEnd = _str.end(); - - while( it != strEnd ) { - - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - - std::string suffix; - std::size_t width = (std::min)( static_cast( strEnd-it ), _attr.width-static_cast( indent.size() ) ); - iterator itEnd = it+width; - iterator itNext = _str.end(); - - iterator itNewLine = std::find( it, itEnd, '\n' ); - if( itNewLine != itEnd ) - itEnd = itNewLine; - - if( itEnd != strEnd ) { - bool foundWrapPoint = false; - iterator findIt = itEnd; - do { - if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { - itEnd = findIt+1; - itNext = findIt+1; - foundWrapPoint = true; - } - else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { - itEnd = findIt; - itNext = findIt; - foundWrapPoint = true; - } - else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { - itNext = findIt+1; - itEnd = findIt; - foundWrapPoint = true; - } - if( findIt == it ) - break; - else - --findIt; - } - while( !foundWrapPoint ); - - if( !foundWrapPoint ) { - // No good wrap char, so we'll break mid word and add a hyphen - --itEnd; - itNext = itEnd; - suffix = "-"; - } - else { - while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) - --itEnd; - } - } - lines.push_back( indent + std::string( it, itEnd ) + suffix ); - - if( indent.size() != _attr.indent ) - indent = std::string( _attr.indent, ' ' ); - it = itNext; - } - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - class MultipleReporters; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - - virtual void skipTest( TestCaseInfo const& testInfo ) = 0; - - virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } - }; - - struct IReporterFactory : IShared { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map > FactoryMap; - typedef std::vector > Listeners; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - virtual Listeners const& getListeners() const = 0; - }; - - Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Matching test cases:\n"; - else { - Catch::cout() << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, descAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - descAttr.setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( config.listExtraInfo() ) { - Catch::cout() << " " << testCaseInfo.lineInfo << std::endl; - std::string description = testCaseInfo.description; - if( description.empty() ) - description = "(NO DESCRIPTION)"; - Catch::cout() << Text( description, descAttr ) << std::endl; - } - if( !testCaseInfo.tags.empty() ) - Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; - else - Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - if( startsWith( testCaseInfo.name, '#' ) ) - Catch::cout() << '"' << testCaseInfo.name << '"'; - else - Catch::cout() << testCaseInfo.name; - if ( config.listExtraInfo() ) - Catch::cout() << "\t@" << testCaseInfo.lineInfo; - Catch::cout() << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Tags for matching test cases:\n"; - else { - Catch::cout() << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - Catch::cout() << oss.str() << wrapper << '\n'; - } - Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - Catch::cout() << "Available reporters:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - Catch::cout() << " " - << it->first - << ':' - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << '\n'; - } - Catch::cout() << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_run_context.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include -#include -#include - -CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS - -namespace Catch { -namespace TestCaseTracking { - - struct NameAndLocation { - std::string name; - SourceLineInfo location; - - NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) - : name( _name ), - location( _location ) - {} - }; - - struct ITracker : SharedImpl<> { - virtual ~ITracker(); - - // static queries - virtual NameAndLocation const& nameAndLocation() const = 0; - - // dynamic queries - virtual bool isComplete() const = 0; // Successfully completed or failed - virtual bool isSuccessfullyCompleted() const = 0; - virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; - - virtual ITracker& parent() = 0; - - // actions - virtual void close() = 0; // Successfully complete - virtual void fail() = 0; - virtual void markAsNeedingAnotherRun() = 0; - - virtual void addChild( Ptr const& child ) = 0; - virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; - virtual void openChild() = 0; - - // Debug/ checking - virtual bool isSectionTracker() const = 0; - virtual bool isIndexTracker() const = 0; - }; - - class TrackerContext { - - enum RunState { - NotStarted, - Executing, - CompletedCycle - }; - - Ptr m_rootTracker; - ITracker* m_currentTracker; - RunState m_runState; - - public: - - static TrackerContext& instance() { - static TrackerContext s_instance; - return s_instance; - } - - TrackerContext() - : m_currentTracker( CATCH_NULL ), - m_runState( NotStarted ) - {} - - ITracker& startRun(); - - void endRun() { - m_rootTracker.reset(); - m_currentTracker = CATCH_NULL; - m_runState = NotStarted; - } - - void startCycle() { - m_currentTracker = m_rootTracker.get(); - m_runState = Executing; - } - void completeCycle() { - m_runState = CompletedCycle; - } - - bool completedCycle() const { - return m_runState == CompletedCycle; - } - ITracker& currentTracker() { - return *m_currentTracker; - } - void setCurrentTracker( ITracker* tracker ) { - m_currentTracker = tracker; - } - }; - - class TrackerBase : public ITracker { - protected: - enum CycleState { - NotStarted, - Executing, - ExecutingChildren, - NeedsAnotherRun, - CompletedSuccessfully, - Failed - }; - class TrackerHasName { - NameAndLocation m_nameAndLocation; - public: - TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} - bool operator ()( Ptr const& tracker ) { - return - tracker->nameAndLocation().name == m_nameAndLocation.name && - tracker->nameAndLocation().location == m_nameAndLocation.location; - } - }; - typedef std::vector > Children; - NameAndLocation m_nameAndLocation; - TrackerContext& m_ctx; - ITracker* m_parent; - Children m_children; - CycleState m_runState; - public: - TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : m_nameAndLocation( nameAndLocation ), - m_ctx( ctx ), - m_parent( parent ), - m_runState( NotStarted ) - {} - virtual ~TrackerBase(); - - virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { - return m_nameAndLocation; - } - virtual bool isComplete() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully || m_runState == Failed; - } - virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully; - } - virtual bool isOpen() const CATCH_OVERRIDE { - return m_runState != NotStarted && !isComplete(); - } - virtual bool hasChildren() const CATCH_OVERRIDE { - return !m_children.empty(); - } - - virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { - m_children.push_back( child ); - } - - virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { - Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); - return( it != m_children.end() ) - ? it->get() - : CATCH_NULL; - } - virtual ITracker& parent() CATCH_OVERRIDE { - assert( m_parent ); // Should always be non-null except for root - return *m_parent; - } - - virtual void openChild() CATCH_OVERRIDE { - if( m_runState != ExecutingChildren ) { - m_runState = ExecutingChildren; - if( m_parent ) - m_parent->openChild(); - } - } - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } - virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } - - void open() { - m_runState = Executing; - moveToThis(); - if( m_parent ) - m_parent->openChild(); - } - - virtual void close() CATCH_OVERRIDE { - - // Close any still open children (e.g. generators) - while( &m_ctx.currentTracker() != this ) - m_ctx.currentTracker().close(); - - switch( m_runState ) { - case NotStarted: - case CompletedSuccessfully: - case Failed: - throw std::logic_error( "Illogical state" ); - - case NeedsAnotherRun: - break;; - - case Executing: - m_runState = CompletedSuccessfully; - break; - case ExecutingChildren: - if( m_children.empty() || m_children.back()->isComplete() ) - m_runState = CompletedSuccessfully; - break; - - default: - throw std::logic_error( "Unexpected state" ); - } - moveToParent(); - m_ctx.completeCycle(); - } - virtual void fail() CATCH_OVERRIDE { - m_runState = Failed; - if( m_parent ) - m_parent->markAsNeedingAnotherRun(); - moveToParent(); - m_ctx.completeCycle(); - } - virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { - m_runState = NeedsAnotherRun; - } - private: - void moveToParent() { - assert( m_parent ); - m_ctx.setCurrentTracker( m_parent ); - } - void moveToThis() { - m_ctx.setCurrentTracker( this ); - } - }; - - class SectionTracker : public TrackerBase { - std::vector m_filters; - public: - SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ) - { - if( parent ) { - while( !parent->isSectionTracker() ) - parent = &parent->parent(); - - SectionTracker& parentSection = static_cast( *parent ); - addNextFilters( parentSection.m_filters ); - } - } - virtual ~SectionTracker(); - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } - - static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { - SectionTracker* section = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { - assert( childTracker ); - assert( childTracker->isSectionTracker() ); - section = static_cast( childTracker ); - } - else { - section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); - currentTracker.addChild( section ); - } - if( !ctx.completedCycle() ) - section->tryOpen(); - return *section; - } - - void tryOpen() { - if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) - open(); - } - - void addInitialFilters( std::vector const& filters ) { - if( !filters.empty() ) { - m_filters.push_back(""); // Root - should never be consulted - m_filters.push_back(""); // Test Case - not a section filter - m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); - } - } - void addNextFilters( std::vector const& filters ) { - if( filters.size() > 1 ) - m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); - } - }; - - class IndexTracker : public TrackerBase { - int m_size; - int m_index; - public: - IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) - : TrackerBase( nameAndLocation, ctx, parent ), - m_size( size ), - m_index( -1 ) - {} - virtual ~IndexTracker(); - - virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } - - static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { - IndexTracker* tracker = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { - assert( childTracker ); - assert( childTracker->isIndexTracker() ); - tracker = static_cast( childTracker ); - } - else { - tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); - currentTracker.addChild( tracker ); - } - - if( !ctx.completedCycle() && !tracker->isComplete() ) { - if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) - tracker->moveNext(); - tracker->open(); - } - - return *tracker; - } - - int index() const { return m_index; } - - void moveNext() { - m_index++; - m_children.clear(); - } - - virtual void close() CATCH_OVERRIDE { - TrackerBase::close(); - if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) - m_runState = Executing; - } - }; - - inline ITracker& TrackerContext::startRun() { - m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); - m_currentTracker = CATCH_NULL; - m_runState = Executing; - return *m_rootTracker; - } - -} // namespace TestCaseTracking - -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; -using TestCaseTracking::IndexTracker; - -} // namespace Catch - -CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -// #included from: catch_fatal_condition.hpp -#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED - -namespace Catch { - - // Report the error condition - inline void reportFatal( std::string const& message ) { - IContext& context = Catch::getCurrentContext(); - IResultCapture* resultCapture = context.getResultCapture(); - resultCapture->handleFatalErrorCondition( message ); - } - -} // namespace Catch - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// -// #included from: catch_windows_h_proxy.h - -#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED - -#ifdef CATCH_DEFINES_NOMINMAX -# define NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -#ifdef CATCH_DEFINES_NOMINMAX -# undef NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# undef WIN32_LEAN_AND_MEAN -#endif - - -# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) - -namespace Catch { - struct FatalConditionHandler { - void reset() {} - }; -} - -# else // CATCH_CONFIG_WINDOWS_SEH is defined - -namespace Catch { - - struct SignalDefs { DWORD id; const char* name; }; - extern SignalDefs signalDefs[]; - // There is no 1-1 mapping between signals and windows exceptions. - // Windows can easily distinguish between SO and SigSegV, - // but SigInt, SigTerm, etc are handled differently. - SignalDefs signalDefs[] = { - { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, - { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, - { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, - { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, - }; - - struct FatalConditionHandler { - - static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { - for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { - if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { - reportFatal(signalDefs[i].name); - } - } - // If its not an exception we care about, pass it along. - // This stops us from eating debugger breaks etc. - return EXCEPTION_CONTINUE_SEARCH; - } - - FatalConditionHandler() { - isSet = true; - // 32k seems enough for Catch to handle stack overflow, - // but the value was found experimentally, so there is no strong guarantee - guaranteeSize = 32 * 1024; - exceptionHandlerHandle = CATCH_NULL; - // Register as first handler in current chain - exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); - // Pass in guarantee size to be filled - SetThreadStackGuarantee(&guaranteeSize); - } - - static void reset() { - if (isSet) { - // Unregister handler and restore the old guarantee - RemoveVectoredExceptionHandler(exceptionHandlerHandle); - SetThreadStackGuarantee(&guaranteeSize); - exceptionHandlerHandle = CATCH_NULL; - isSet = false; - } - } - - ~FatalConditionHandler() { - reset(); - } - private: - static bool isSet; - static ULONG guaranteeSize; - static PVOID exceptionHandlerHandle; - }; - - bool FatalConditionHandler::isSet = false; - ULONG FatalConditionHandler::guaranteeSize = 0; - PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; - -} // namespace Catch - -# endif // CATCH_CONFIG_WINDOWS_SEH - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -# if !defined(CATCH_CONFIG_POSIX_SIGNALS) - -namespace Catch { - struct FatalConditionHandler { - void reset() {} - }; -} - -# else // CATCH_CONFIG_POSIX_SIGNALS is defined - -#include - -namespace Catch { - - struct SignalDefs { - int id; - const char* name; - }; - extern SignalDefs signalDefs[]; - SignalDefs signalDefs[] = { - { SIGINT, "SIGINT - Terminal interrupt signal" }, - { SIGILL, "SIGILL - Illegal instruction signal" }, - { SIGFPE, "SIGFPE - Floating point error signal" }, - { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, - { SIGTERM, "SIGTERM - Termination request signal" }, - { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } - }; - - struct FatalConditionHandler { - - static bool isSet; - static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; - static stack_t oldSigStack; - static char altStackMem[SIGSTKSZ]; - - static void handleSignal( int sig ) { - std::string name = ""; - for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { - SignalDefs &def = signalDefs[i]; - if (sig == def.id) { - name = def.name; - break; - } - } - reset(); - reportFatal(name); - raise( sig ); - } - - FatalConditionHandler() { - isSet = true; - stack_t sigStack; - sigStack.ss_sp = altStackMem; - sigStack.ss_size = SIGSTKSZ; - sigStack.ss_flags = 0; - sigaltstack(&sigStack, &oldSigStack); - struct sigaction sa = { 0 }; - - sa.sa_handler = handleSignal; - sa.sa_flags = SA_ONSTACK; - for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { - sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); - } - } - - ~FatalConditionHandler() { - reset(); - } - static void reset() { - if( isSet ) { - // Set signals back to previous values -- hopefully nobody overwrote them in the meantime - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { - sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); - } - // Return the old stack - sigaltstack(&oldSigStack, CATCH_NULL); - isSet = false; - } - } - }; - - bool FatalConditionHandler::isSet = false; - struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; - stack_t FatalConditionHandler::oldSigStack = {}; - char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; - -} // namespace Catch - -# endif // CATCH_CONFIG_POSIX_SIGNALS - -#endif // not Windows - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& _config, Ptr const& reporter ) - : m_runInfo( _config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( CATCH_NULL ), - m_config( _config ), - m_reporter( reporter ), - m_shouldReportUnexpected ( true ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - - do { - ITracker& rootTracker = m_trackerContext.startRun(); - assert( rootTracker.isSectionTracker() ); - static_cast( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); - do { - m_trackerContext.startCycle(); - m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); - } - // !TBD: deprecated - this will be replaced by indexed trackers - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { - deltaTotals.assertions.failed++; - deltaTotals.testCases.passed--; - deltaTotals.testCases.failed++; - } - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = CATCH_NULL; - m_testCaseTracker = CATCH_NULL; - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - // We have no use for the return value (whether messages should be cleared), because messages were made scoped - // and should be let to clear themselves out. - static_cast(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); - if( !sectionTracker.isOpen() ) - return false; - m_activeSections.push_back( §ionTracker ); - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 ) - return false; - if( !m_config->warnAboutMissingAssertions() ) - return false; - if( m_trackerContext.currentTracker().hasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionEndInfo const& endInfo ) { - Counts assertions = m_totals.assertions - endInfo.prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( !m_activeSections.empty() ) { - m_activeSections.back()->close(); - m_activeSections.pop_back(); - } - - m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { - if( m_unfinishedSections.empty() ) - m_activeSections.back()->fail(); - else - m_activeSections.back()->close(); - m_activeSections.pop_back(); - - m_unfinishedSections.push_back( endInfo ); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : std::string(); - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - virtual void exceptionEarlyReported() { - m_shouldReportUnexpected = false; - } - - virtual void handleFatalErrorCondition( std::string const& message ) { - // Don't rebuild the result -- the stringification itself can cause more fatal errors - // Instead, fake a result data. - AssertionResultData tempResult; - tempResult.resultType = ResultWas::FatalErrorCondition; - tempResult.message = message; - AssertionResult result(m_lastAssertionInfo, tempResult); - - getResultCapture().assertionEnded(result); - - handleUnfinishedSections(); - - // Recreate section for test case (as we will lose the one that was in scope) - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - - Counts assertions; - assertions.failed = 1; - SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); - m_reporter->sectionEnded( testCaseSectionStats ); - - TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); - - Totals deltaTotals; - deltaTotals.testCases.failed = 1; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - std::string(), - std::string(), - false ) ); - m_totals.testCases.failed++; - testGroupEnded( std::string(), m_totals, 1, 1 ); - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - m_shouldReportUnexpected = true; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - - seedRng( *m_config ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( Catch::cout(), redirectedCout ); - StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); - invokeActiveTestCase(); - } - else { - invokeActiveTestCase(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions - // are reported without translation at the point of origin. - if (m_shouldReportUnexpected) { - makeUnexpectedResultBuilder().useActiveException(); - } - } - m_testCaseTracker->close(); - handleUnfinishedSections(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - void invokeActiveTestCase() { - FatalConditionHandler fatalConditionHandler; // Handle signals - m_activeTestCase->invoke(); - fatalConditionHandler.reset(); - } - - private: - - ResultBuilder makeUnexpectedResultBuilder() const { - return ResultBuilder( m_lastAssertionInfo.macroName, - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression, - m_lastAssertionInfo.resultDisposition ); - } - - void handleUnfinishedSections() { - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( *it ); - m_unfinishedSections.clear(); - } - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - ITracker* m_testCaseTracker; - ITracker* m_currentSectionTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - std::vector m_activeSections; - TrackerContext m_trackerContext; - bool m_shouldReportUnexpected; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - char const * const _branchName, - unsigned int _buildNumber ); - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const patchNumber; - - // buildNumber is only used if branchName is not null - char const * const branchName; - unsigned int const buildNumber; - - friend std::ostream& operator << ( std::ostream& os, Version const& version ); - - private: - void operator=( Version const& ); - }; - - inline Version libraryVersion(); -} - -#include -#include -#include - -namespace Catch { - - Ptr createReporter( std::string const& reporterName, Ptr const& config ) { - Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); - if( !reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - return reporter; - } - - Ptr makeReporter( Ptr const& config ) { - std::vector reporters = config->getReporterNames(); - if( reporters.empty() ) - reporters.push_back( "console" ); - - Ptr reporter; - for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); - it != itEnd; - ++it ) - reporter = addReporter( reporter, createReporter( *it, config ) ); - return reporter; - } - Ptr addListeners( Ptr const& config, Ptr reporters ) { - IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); - for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); - it != itEnd; - ++it ) - reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); - return reporters; - } - - Totals runTests( Ptr const& config ) { - - Ptr iconfig = config.get(); - - Ptr reporter = makeReporter( config ); - reporter = addListeners( iconfig, reporter ); - - RunContext context( iconfig, reporter ); - - Totals totals; - - context.testGroupStarting( config->name(), 1, 1 ); - - TestSpec testSpec = config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); - for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); - it != itEnd; - ++it ) { - if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) - totals += context.runTest( *it ); - else - reporter->skipTest( *it ); - } - - context.testGroupEnded( iconfig->name(), totals, 1, 1 ); - return totals; - } - - void applyFilenamesAsTags( IConfig const& config ) { - std::vector const& tests = getAllTestCasesSorted( config ); - for(std::size_t i = 0; i < tests.size(); ++i ) { - TestCase& test = const_cast( tests[i] ); - std::set tags = test.tags; - - std::string filename = test.lineInfo.file; - std::string::size_type lastSlash = filename.find_last_of( "\\/" ); - if( lastSlash != std::string::npos ) - filename = filename.substr( lastSlash+1 ); - - std::string::size_type lastDot = filename.find_last_of( "." ); - if( lastDot != std::string::npos ) - filename = filename.substr( 0, lastDot ); - - tags.insert( "#" + filename ); - setTags( test, tags ); - } - } - - class Session : NonCopyable { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - Catch::cerr() << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - Catch::cout() << "\nCatch v" << libraryVersion() << "\n"; - - m_cli.usage( Catch::cout(), processName ); - Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( Catch::cout(), m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char const* const* const argv ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - #if defined(WIN32) && defined(UNICODE) - int run( int argc, wchar_t const* const* const argv ) { - - char **utf8Argv = new char *[ argc ]; - - for ( int i = 0; i < argc; ++i ) { - int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); - - utf8Argv[ i ] = new char[ bufSize ]; - - WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); - } - - int returnCode = applyCommandLine( argc, utf8Argv ); - if( returnCode == 0 ) - returnCode = run(); - - for ( int i = 0; i < argc; ++i ) - delete [] utf8Argv[ i ]; - - delete [] utf8Argv; - - return returnCode; - } - #endif - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - - seedRng( *m_config ); - - if( m_configData.filenamesAsTags ) - applyFilenamesAsTags( *m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runTests( m_config ).assertions.failed ); - } - catch( std::exception& ex ) { - Catch::cerr() << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - struct RandomNumberGenerator { - typedef std::ptrdiff_t result_type; - - result_type operator()( result_type n ) const { return std::rand() % n; } - -#ifdef CATCH_CONFIG_CPP11_SHUFFLE - static constexpr result_type min() { return 0; } - static constexpr result_type max() { return 1000000; } - result_type operator()() const { return std::rand() % max(); } -#endif - template - static void shuffle( V& vector ) { - RandomNumberGenerator rng; -#ifdef CATCH_CONFIG_CPP11_SHUFFLE - std::shuffle( vector.begin(), vector.end(), rng ); -#else - std::random_shuffle( vector.begin(), vector.end(), rng ); -#endif - } - }; - - inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { - - std::vector sorted = unsortedTestCases; - - switch( config.runOrder() ) { - case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end() ); - break; - case RunTests::InRandomOrder: - { - seedRng( config ); - RandomNumberGenerator::shuffle( sorted ); - } - break; - case RunTests::InDeclarationOrder: - // already in declaration order - break; - } - return sorted; - } - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { - return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); - } - - void enforceNoDuplicateTestCases( std::vector const& functions ) { - std::set seenFunctions; - for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); - it != itEnd; - ++it ) { - std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ) { - std::ostringstream ss; - - ss << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - - throw std::runtime_error(ss.str()); - } - } - } - - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { - std::vector filtered; - filtered.reserve( testCases.size() ); - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) - if( matchTest( *it, testSpec, config ) ) - filtered.push_back( *it ); - return filtered; - } - std::vector const& getAllTestCasesSorted( IConfig const& config ) { - return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); - } - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() - : m_currentSortOrder( RunTests::InDeclarationOrder ), - m_unnamedCount( 0 ) - {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name.empty() ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - m_functions.push_back( testCase ); - } - - virtual std::vector const& getAllTests() const { - return m_functions; - } - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { - if( m_sortedFunctions.empty() ) - enforceNoDuplicateTestCases( m_functions ); - - if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { - m_sortedFunctions = sortTests( config, m_functions ); - m_currentSortOrder = config.runOrder(); - } - return m_sortedFunctions; - } - - private: - std::vector m_functions; - mutable RunTests::InWhatOrder m_currentSortOrder; - mutable std::vector m_sortedFunctions; - size_t m_unnamedCount; - std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, '&' ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - void registerTestCase - ( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase - ( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCaseFunction( function, lineInfo, nameAndDesc ); - } - - AutoReg::~AutoReg() {} - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() CATCH_OVERRIDE {} - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return CATCH_NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, Ptr const& factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - void registerListener( Ptr const& factory ) { - m_listeners.push_back( factory ); - } - - virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { - return m_factories; - } - virtual Listeners const& getListeners() const CATCH_OVERRIDE { - return m_listeners; - } - - private: - FactoryMap m_factories; - Listeners m_listeners; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - return tryTranslators(); - } - @catch (NSException *exception) { - return Catch::toString( [exception description] ); - } -#else - return tryTranslators(); -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return "Unknown exception"; - } - } - - std::string tryTranslators() const { - if( m_translators.empty() ) - throw; - else - return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); - } - - private: - std::vector m_translators; - }; -} - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { - return m_exceptionTranslatorRegistry; - } - virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE { - return m_tagAliasRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerListener( factory ); - } - virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE { - m_tagAliasRegistry.add( alias, tag, lineInfo ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - TagAliasRegistry m_tagAliasRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = CATCH_NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = CATCH_NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - FileStream::FileStream( std::string const& filename ) { - m_ofs.open( filename.c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << filename << '\''; - throw std::domain_error( oss.str() ); - } - } - - std::ostream& FileStream::stream() const { - return m_ofs; - } - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - DebugOutStream::DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} - - std::ostream& DebugOutStream::stream() const { - return m_os; - } - - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream::CoutStream() - : m_os( Catch::cout().rdbuf() ) - {} - - std::ostream& CoutStream::stream() const { - return m_os; - } - -#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions - std::ostream& cout() { - return std::cout; - } - std::ostream& cerr() { - return std::cerr; - } -#endif -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: - virtual ~Context() { - deleteAllValues( m_generatorsByTestName ); - } - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : CATCH_NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = CATCH_NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - void cleanUpContext() { - delete currentContext; - currentContext = CATCH_NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -// #included from: catch_errno_guard.hpp -#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED - -#include - -namespace Catch { - - class ErrnoGuard { - public: - ErrnoGuard():m_oldErrno(errno){} - ~ErrnoGuard() { errno = m_oldErrno; } - private: - int m_oldErrno; - }; - -} - -namespace Catch { - namespace { - - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; - - struct NoColourImpl : IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - - } // anon namespace -} // namespace Catch - -#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) -# ifdef CATCH_PLATFORM_WINDOWS -# define CATCH_CONFIG_COLOUR_WINDOWS -# else -# define CATCH_CONFIG_COLOUR_ANSI -# endif -#endif - -#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// - -namespace Catch { -namespace { - - class Win32ColourImpl : public IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); - originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalForegroundAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); - } - HANDLE stdoutHandle; - WORD originalForegroundAttributes; - WORD originalBackgroundAttributes; - }; - - IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = !isDebuggerActive() - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? &s_instance - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0;34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - static IColourImpl* instance() { - static PosixColourImpl s_instance; - return &s_instance; - } - - private: - void setColour( const char* _escapeCode ) { - Catch::cout() << '\033' << _escapeCode; - } - }; - - IColourImpl* platformColourInstance() { - ErrnoGuard guard; - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? PosixColourImpl::instance() - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#else // not Windows or ANSI /////////////////////////////////////////////// - -namespace Catch { - - static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } - -} // end namespace Catch - -#endif // Windows/ ANSI/ None - -namespace Catch { - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - - void Colour::use( Code _colourCode ) { - static IColourImpl* impl = platformColourInstance(); - impl->use( _colourCode ); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( char const * _macroName, - SourceLineInfo const& _lineInfo, - char const * _capturedExpression, - ResultDisposition::Flags _resultDisposition, - char const * _secondArg) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ), - secondArg( _secondArg ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return m_info.capturedExpression[0] != 0; - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) { - return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"') - ? capturedExpression - : std::string(capturedExpression) + ", " + secondArg; - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - else - return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName[0] == 0 ) - return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - else - return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructExpression(); - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - - void AssertionResult::discardDecomposedExpression() const { - m_resultData.decomposedExpression = CATCH_NULL; - } - - void AssertionResult::expandDecomposedExpression() const { - m_resultData.reconstructExpression(); - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -#include - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( startsWith( tag, '.' ) || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else if( tag == "!nonportable" ) - return TestCaseInfo::NonPortable; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - std::ostringstream ss; - ss << Colour(Colour::Red) - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n" - << Colour(Colour::FileName) - << _lineInfo << '\n'; - throw std::runtime_error(ss.str()); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); - if( prop == TestCaseInfo::IsHidden ) - isHidden = true; - else if( prop == TestCaseInfo::None ) - enforceNotReservedTag( tag, _lineInfo ); - - tags.insert( tag ); - tag.clear(); - inTag = false; - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) - { - testCaseInfo.tags = tags; - testCaseInfo.lcaseTags.clear(); - - std::ostringstream oss; - for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { - oss << '[' << *it << ']'; - std::string lcaseTag = toLower( *it ); - testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); - testCaseInfo.lcaseTags.insert( lcaseTag ); - } - testCaseInfo.tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - lineInfo( _lineInfo ), - properties( None ) - { - setTags( *this, _tags ); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - Version::Version - ( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - char const * const _branchName, - unsigned int _buildNumber ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - patchNumber( _patchNumber ), - branchName( _branchName ), - buildNumber( _buildNumber ) - {} - - std::ostream& operator << ( std::ostream& os, Version const& version ) { - os << version.majorVersion << '.' - << version.minorVersion << '.' - << version.patchNumber; - // branchName is never null -> 0th char is \0 if it is empty - if (version.branchName[0]) { - os << '-' << version.branchName - << '.' << version.buildNumber; - } - return os; - } - - inline Version libraryVersion() { - static Version version( 1, 9, 6, "", 0 ); - return version; - } - -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - if ( !std::uncaught_exception() ){ - getResultCapture().popScopedMessage(m_info); - } - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - virtual void skipTest( TestCaseInfo const& ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } - void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS - -#else - -#include - -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - UInt64 getCurrentTicks() { - static UInt64 hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency( reinterpret_cast( &hz ) ); - QueryPerformanceCounter( reinterpret_cast( &hzo ) ); - } - UInt64 t; - QueryPerformanceCounter( reinterpret_cast( &t ) ); - return ((t-hzo)*1000000)/hz; - } -#else - UInt64 getCurrentTicks() { - timeval t; - gettimeofday(&t,CATCH_NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedMicroseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast(getElapsedMicroseconds()/1000); - } - double Timer::getElapsedSeconds() const { - return getElapsedMicroseconds()/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -#include -#include - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); - } - bool startsWith( std::string const& s, char prefix ) { - return !s.empty() && s[0] == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); - } - bool endsWith( std::string const& s, char suffix ) { - return !s.empty() && s[s.size()-1] == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - char toLowerCh(char c) { - return static_cast( std::tolower( c ) ); - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); - } - - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { - bool replaced = false; - std::size_t i = str.find( replaceThis ); - while( i != std::string::npos ) { - replaced = true; - str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); - if( i < str.size()-withThis.size() ) - i = str.find( replaceThis, i+withThis.size() ); - else - i = std::string::npos; - } - return replaced; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << ' ' << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << 's'; - return os; - } - - SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - bool SourceLineInfo::empty() const { - return file[0] == '\0'; - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); - } - bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { - return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); - } - - void seedRng( IConfig const& config ) { - if( config.rngSeed() != 0 ) - std::srand( config.rngSeed() ); - } - unsigned int rngSeed() { - return getCurrentContext().getConfig()->rngSeed(); - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << '(' << info.line << ')'; -#else - os << info.file << ':' << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << '\''; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 -#endif - Section::~Section() { - if( m_sectionIncluded ) { - SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); - if( std::uncaught_exception() ) - getResultCapture().sectionEndedEarly( endInfo ); - else - getResultCapture().sectionEnded( endInfo ); - } - } -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { - Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(CATCH_PLATFORM_LINUX) - #include - #include - - namespace Catch{ - // The standard POSIX way of detecting a debugger is to attempt to - // ptrace() the process, but this needs to be done from a child and not - // this process itself to still allow attaching to this process later - // if wanted, so is rather heavy. Under Linux we have the PID of the - // "debugger" (which doesn't need to be gdb, of course, it could also - // be strace, for example) in /proc/$PID/status, so just get it from - // there instead. - bool isDebuggerActive(){ - // Libstdc++ has a bug, where std::ifstream sets errno to 0 - // This way our users can properly assert over errno values - ErrnoGuard guard; - std::ifstream in("/proc/self/status"); - for( std::string line; std::getline(in, line); ) { - static const int PREFIX_LEN = 11; - if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { - // We're traced if the PID is not 0 and no other PID starts - // with 0 digit, so it's enough to check for just a single - // character. - return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; - } - } - - return false; - } - } // namespace Catch -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - Catch::cout() << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - const std::string unprintableString = "{?}"; - - namespace { - const int hexThreshold = 255; - - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return '"' + s + '"'; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return Catch::toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( const wchar_t* const value ) -{ - return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); -} - -std::string toString( wchar_t* const value ) -{ - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return Catch::toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + 'f'; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - if ( value == '\r' ) - return "'\\r'"; - if ( value == '\f' ) - return "'\\f'"; - if ( value == '\n' ) - return "'\\n'"; - if ( value == '\t' ) - return "'\\t'"; - if ( '\0' <= value && value < ' ' ) - return toString( static_cast( value ) ); - char chstr[] = "' '"; - chstr[1] = value; - return chstr; -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} -std::string toString( unsigned long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ), - m_guardException( false ) - { - m_stream().oss.str(""); - } - - ResultBuilder::~ResultBuilder() { -#if defined(CATCH_CONFIG_FAST_COMPILE) - if ( m_guardException ) { - m_stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; - captureResult( ResultWas::ThrewException ); - getCurrentContext().getResultCapture()->exceptionEarlyReported(); - } -#endif - } - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - - void ResultBuilder::endExpression( DecomposedExpression const& expr ) { - AssertionResult result = build( expr ); - handleResult( result ); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream().oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - - void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { - if( expectedMessage.empty() ) - captureExpectedException( Matchers::Impl::MatchAllOf() ); - else - captureExpectedException( Matchers::Equals( expectedMessage ) ); - } - - void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase const& matcher ) { - - assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); - AssertionResultData data = m_data; - data.resultType = ResultWas::Ok; - data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); - - std::string actualMessage = Catch::translateActiveException(); - if( !matcher.match( actualMessage ) ) { - data.resultType = ResultWas::ExpressionFailed; - data.reconstructedExpression = actualMessage; - } - AssertionResult result( m_assertionInfo, data ); - handleResult( result ); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - handleResult( result ); - } - - void ResultBuilder::handleResult( AssertionResult const& result ) - { - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) - m_shouldThrow = true; - } - } - - void ResultBuilder::react() { -#if defined(CATCH_CONFIG_FAST_COMPILE) - if (m_shouldDebugBreak) { - /////////////////////////////////////////////////////////////////// - // To inspect the state during test, you need to go one level up the callstack - // To go back to the test and change execution, jump over the throw statement - /////////////////////////////////////////////////////////////////// - CATCH_BREAK_INTO_DEBUGGER(); - } -#endif - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - return build( *this ); - } - - // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, - // a temporary DecomposedExpression, which in turn holds references to - // operands, possibly temporary as well. - // It should immediately be passed to handleResult; if the expression - // needs to be reported, its string expansion must be composed before - // the temporaries are destroyed. - AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const - { - assert( m_data.resultType != ResultWas::Unknown ); - AssertionResultData data = m_data; - - // Flip bool results if FalseTest flag is set - if( isFalseTest( m_assertionInfo.resultDisposition ) ) { - data.negate( expr.isBinaryExpression() ); - } - - data.message = m_stream().oss.str(); - data.decomposedExpression = &expr; // for lazy reconstruction - return AssertionResult( m_assertionInfo, data ); - } - - void ResultBuilder::reconstructExpression( std::string& dest ) const { - dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); - } - - void ResultBuilder::setExceptionGuard() { - m_guardException = true; - } - void ResultBuilder::unsetExceptionGuard() { - m_guardException = false; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { - std::ostringstream oss; - oss << Colour( Colour::Red ) - << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" - << Colour( Colour::FileName ) - << lineInfo << '\n'; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << Colour( Colour::Red ) - << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " - << Colour( Colour::Red ) << find(alias)->lineInfo << '\n' - << Colour( Colour::Red ) << "\tRedefined at " - << Colour( Colour::FileName) << lineInfo << '\n'; - throw std::domain_error( oss.str().c_str() ); - } - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - - ITagAliasRegistry const& ITagAliasRegistry::get() { - return getRegistryHub().getTagAliasRegistry(); - } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo ); - } - -} // end namespace Catch - -// #included from: catch_matchers_string.hpp - -namespace Catch { -namespace Matchers { - - namespace StdString { - - CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_str( adjustString( str ) ) - {} - std::string CasedString::adjustString( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No - ? toLower( str ) - : str; - } - std::string CasedString::caseSensitivitySuffix() const { - return m_caseSensitivity == CaseSensitive::No - ? " (case insensitive)" - : std::string(); - } - - StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) - : m_comparator( comparator ), - m_operation( operation ) { - } - - std::string StringMatcherBase::describe() const { - std::string description; - description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + - m_comparator.caseSensitivitySuffix().size()); - description += m_operation; - description += ": \""; - description += m_comparator.m_str; - description += "\""; - description += m_comparator.caseSensitivitySuffix(); - return description; - } - - EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} - - bool EqualsMatcher::match( std::string const& source ) const { - return m_comparator.adjustString( source ) == m_comparator.m_str; - } - - ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} - - bool ContainsMatcher::match( std::string const& source ) const { - return contains( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} - - bool StartsWithMatcher::match( std::string const& source ) const { - return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} - - bool EndsWithMatcher::match( std::string const& source ) const { - return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - } // namespace StdString - - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } - -} // namespace Matchers -} // namespace Catch -// #included from: ../reporters/catch_reporter_multi.hpp -#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED - -namespace Catch { - -class MultipleReporters : public SharedImpl { - typedef std::vector > Reporters; - Reporters m_reporters; - -public: - void add( Ptr const& reporter ) { - m_reporters.push_back( reporter ); - } - -public: // IStreamingReporter - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporters[0]->getPreferences(); - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->noMatchingTestCases( spec ); - } - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunStarting( testRunInfo ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseStarting( testInfo ); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionStarting( sectionInfo ); - } - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->assertionStarting( assertionInfo ); - } - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - bool clearBuffer = false; - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - clearBuffer |= (*it)->assertionEnded( assertionStats ); - return clearBuffer; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionEnded( sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupEnded( testGroupStats ); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunEnded( testRunStats ); - } - - virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->skipTest( testInfo ); - } - - virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { - return this; - } - -}; - -Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { - Ptr resultingReporter; - - if( existingReporter ) { - MultipleReporters* multi = existingReporter->tryAsMulti(); - if( !multi ) { - multi = new MultipleReporters; - resultingReporter = Ptr( multi ); - if( existingReporter ) - multi->add( existingReporter ); - } - else - resultingReporter = existingReporter; - multi->add( additionalReporter ); - } - else - resultingReporter = additionalReporter; - - return resultingReporter; -} - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - namespace { - // Because formatting using c++ streams is stateful, drop down to C is required - // Alternatively we could use stringstream, but its performance is... not good. - std::string getFormattedDuration( double duration ) { - // Max exponent + 1 is required to represent the whole part - // + 1 for decimal point - // + 3 for the 3 decimal places - // + 1 for null terminator - const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; - char buffer[maxDoubleSize]; - - // Save previous errno, to prevent sprintf from overwriting it - ErrnoGuard guard; -#ifdef _MSC_VER - sprintf_s(buffer, "%.3f", duration); -#else - sprintf(buffer, "%.3f", duration); -#endif - return std::string(buffer); - } - } - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual ~StreamingReporterBase() CATCH_OVERRIDE; - - virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { - // Don't do anything with this by default. - // It can optionally be overridden in the derived class. - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - ReporterPreferences m_reporterPrefs; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - ~CumulativeReporterBase(); - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} - virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} - - virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - // AssertionResult holds a pointer to a temporary DecomposedExpression, - // which getExpandedExpression() calls to build the expression string. - // Our section stack copy of the assertionResult will likely outlive the - // temporary, so it must be expanded or discarded now to avoid calling - // a destroyed object later. - prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void prepareExpandedExpression( AssertionResult& result ) const { - if( result.isOk() ) - result.discardDecomposedExpression(); - else - result.expandDecomposedExpression(); - } - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - ReporterPreferences m_reporterPrefs; - - }; - - template - char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - struct TestEventListenerBase : StreamingReporterBase { - TestEventListenerBase( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { - return false; - } - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public SharedImpl { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ListenerRegistrar { - - class ListenerFactory : public SharedImpl { - - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - virtual std::string getDescription() const { - return std::string(); - } - }; - - public: - - ListenerRegistrar() { - getMutableRegistryHub().registerListener( new ListenerFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -// Deprecated - use the form without INTERNAL_ -#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -#define CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlEncode { - public: - enum ForWhat { ForTextNodes, ForAttributes }; - - XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) - : m_str( str ), - m_forWhat( forWhat ) - {} - - void encodeTo( std::ostream& os ) const { - - // Apostrophe escaping not necessary if we always use " to write attributes - // (see: http://www.w3.org/TR/xml/#syntax) - - for( std::size_t i = 0; i < m_str.size(); ++ i ) { - char c = m_str[i]; - switch( c ) { - case '<': os << "<"; break; - case '&': os << "&"; break; - - case '>': - // See: http://www.w3.org/TR/xml/#syntax - if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) - os << ">"; - else - os << c; - break; - - case '\"': - if( m_forWhat == ForAttributes ) - os << """; - else - os << c; - break; - - default: - // Escape control chars - based on contribution by @espenalb in PR #465 and - // by @mrpi PR #588 - if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) { - // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 - os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) - << static_cast( c ); - } - else - os << c; - } - } - } - - friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { - xmlEncode.encodeTo( os ); - return os; - } - - private: - std::string m_str; - ForWhat m_forWhat; - }; - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = CATCH_NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( Catch::cout() ) - { - writeDeclaration(); - } - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( os ) - { - writeDeclaration(); - } - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - m_os << m_indent << '<' << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - m_os << "/>"; - m_tagIsOpen = false; - } - else { - m_os << m_indent << ""; - } - m_os << std::endl; - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) - m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - std::ostringstream oss; - oss << attribute; - return writeAttribute( name, oss.str() ); - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - m_os << m_indent; - m_os << XmlEncode( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - m_os << m_indent << ""; - m_needsNewline = true; - return *this; - } - - void writeStylesheetRef( std::string const& url ) { - m_os << "\n"; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - m_os << '\n'; - return *this; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - m_os << ">" << std::endl; - m_tagIsOpen = false; - } - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - void writeDeclaration() { - m_os << "\n"; - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - m_os << std::endl; - m_needsNewline = false; - } - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream& m_os; - }; - -} - -namespace Catch { - class XmlReporter : public StreamingReporterBase { - public: - XmlReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_xml(_config.stream()), - m_sectionDepth( 0 ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~XmlReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - - virtual std::string getStylesheetRef() const { - return std::string(); - } - - void writeSourceInfo( SourceLineInfo const& sourceInfo ) { - m_xml - .writeAttribute( "filename", sourceInfo.file ) - .writeAttribute( "line", sourceInfo.line ); - } - - public: // StreamingReporterBase - - virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { - StreamingReporterBase::noMatchingTestCases( s ); - } - - virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testRunStarting( testInfo ); - std::string stylesheetRef = getStylesheetRef(); - if( !stylesheetRef.empty() ) - m_xml.writeStylesheetRef( stylesheetRef ); - m_xml.startElement( "Catch" ); - if( !m_config->name().empty() ) - m_xml.writeAttribute( "name", m_config->name() ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupStarting( groupInfo ); - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupInfo.name ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseStarting(testInfo); - m_xml.startElement( "TestCase" ) - .writeAttribute( "name", trim( testInfo.name ) ) - .writeAttribute( "description", testInfo.description ) - .writeAttribute( "tags", testInfo.tagsAsString ); - - writeSourceInfo( testInfo.lineInfo ); - - if ( m_config->showDurations() == ShowDurations::Always ) - m_testCaseTimer.start(); - m_xml.ensureTagClosed(); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - StreamingReporterBase::sectionStarting( sectionInfo ); - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionInfo.name ) ) - .writeAttribute( "description", sectionInfo.description ); - writeSourceInfo( sectionInfo.lineInfo ); - m_xml.ensureTagClosed(); - } - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - - AssertionResult const& result = assertionStats.assertionResult; - - bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); - - if( includeResults ) { - // Print any info messages in tags. - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - m_xml.scopedElement( "Info" ) - .writeText( it->message ); - } else if ( it->type == ResultWas::Warning ) { - m_xml.scopedElement( "Warning" ) - .writeText( it->message ); - } - } - } - - // Drop out if result was successful but we're not printing them. - if( !includeResults && result.getResultType() != ResultWas::Warning ) - return true; - - // Print the expression if there is one. - if( result.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", result.succeeded() ) - .writeAttribute( "type", result.getTestMacroName() ); - - writeSourceInfo( result.getSourceInfo() ); - - m_xml.scopedElement( "Original" ) - .writeText( result.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( result.getExpandedExpression() ); - } - - // And... Print a result applicable to each result type. - switch( result.getResultType() ) { - case ResultWas::ThrewException: - m_xml.startElement( "Exception" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - case ResultWas::FatalErrorCondition: - m_xml.startElement( "FatalErrorCondition" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( result.getMessage() ); - break; - case ResultWas::Warning: - // Warning will already have been written - break; - case ResultWas::ExplicitFailure: - m_xml.startElement( "Failure" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - default: - break; - } - - if( result.hasExpression() ) - m_xml.endElement(); - - return true; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - StreamingReporterBase::sectionEnded( sectionStats ); - if( --m_sectionDepth > 0 ) { - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); - e.writeAttribute( "successes", sectionStats.assertions.passed ); - e.writeAttribute( "failures", sectionStats.assertions.failed ); - e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); - - m_xml.endElement(); - } - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( testCaseStats ); - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); - e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); - - if( !testCaseStats.stdOut.empty() ) - m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); - if( !testCaseStats.stdErr.empty() ) - m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); - - m_xml.endElement(); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupEnded( testGroupStats ); - // TODO: Check testGroupStats.aborting and act accordingly. - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) - .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - StreamingReporterBase::testRunEnded( testRunStats ); - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testRunStats.totals.assertions.passed ) - .writeAttribute( "failures", testRunStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - private: - Timer m_testCaseTimer; - XmlWriter m_xml; - int m_sectionDepth; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - namespace { - std::string getCurrentTimestamp() { - // Beware, this is not reentrant because of backward compatibility issues - // Also, UTC only, again because of backward compatibility (%z is C++11) - time_t rawtime; - std::time(&rawtime); - const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); - -#ifdef _MSC_VER - std::tm timeInfo = {}; - gmtime_s(&timeInfo, &rawtime); -#else - std::tm* timeInfo; - timeInfo = std::gmtime(&rawtime); -#endif - - char timeStamp[timeStampSize]; - const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; - -#ifdef _MSC_VER - std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); -#else - std::strftime(timeStamp, timeStampSize, fmt, timeInfo); -#endif - return std::string(timeStamp); - } - - } - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ), - m_okToFail( false ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~JunitReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE { - m_okToFail = testCaseInfo.okToFail(); - } - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() CATCH_OVERRIDE { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", getCurrentTimestamp() ); - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + '/' + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - case ResultWas::FatalErrorCondition: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << '\n'; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << '\n'; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - bool m_okToFail; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -#include -#include - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter() CATCH_OVERRIDE; - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - stream << "No test cases matched '" << spec << '\'' << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { - AssertionResult const& result = _assertionStats.assertionResult; - - bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); - - // Drop out if result was successful but we're not printing them. - if( !includeResults && result.getResultType() != ResultWas::Warning ) - return false; - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, includeResults ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_config->showDurations() == ShowDurations::Always ) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; - } - if( m_headerPrinted ) { - m_headerPrinted = false; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << '\n' << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with "; - if (_stats.infoMessages.size() == 1) - messageLabel += "message"; - if (_stats.infoMessages.size() > 1) - messageLabel += "messages"; - break; - case ResultWas::FatalErrorCondition: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to a fatal error condition"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << '\n'; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << '\n'; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << '\n'; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ':' << '\n'; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << '\n' << getLineOfChars<'~'>() << '\n'; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion() << " host application.\n" - << "Run with -? for options\n\n"; - - if( m_config->rngSeed() != 0 ) - stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << '\n'; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << '\n'; - } - stream << getLineOfChars<'.'>() << '\n' << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << '\n'; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << '\n'; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << '\n'; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = ' ' + *it; - while( it->size() > row.size() ) - row = ' ' + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ')' - << '\n'; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << ' ' << it->label; - } - } - stream << '\n'; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << '\n'; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << '\n'; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << '\'' << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) {} - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE { - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; - } - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << '\n' << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::FatalErrorCondition: - printResultType( Colour::Error, failedString() ); - printIssue( "fatal error condition with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ':'; - } - - void printResultType( Colour::Code colour, std::string const& passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << ' ' << passOrFail; - } - stream << ':'; - } - } - - void printIssue( std::string const& issue ) const { - stream << ' ' << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ';'; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << ' ' << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << '\''; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ':'; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << '\''; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? std::string() : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : std::string(); - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << '.'; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - // These are all here to avoid warnings about not having any out of line - // virtual methods - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - IStream::~IStream() CATCH_NOEXCEPT {} - FileStream::~FileStream() CATCH_NOEXCEPT {} - CoutStream::~CoutStream() CATCH_NOEXCEPT {} - DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - WildcardPattern::~WildcardPattern() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {} - - void Config::dummy() {} - - namespace TestCaseTracking { - ITracker::~ITracker() {} - TrackerBase::~TrackerBase() {} - SectionTracker::~SectionTracker() {} - IndexTracker::~IndexTracker() {} - } -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) -// Standard C/C++ Win32 Unicode wmain entry point -extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { -#else -// Standard C/C++ main entry point -int main (int argc, char * argv[]) { -#endif - - int result = Catch::Session().run( argc, argv ); - return ( result < 0xff ? result : 0xff ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return ( result < 0xff ? result : 0xff ); -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#else -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#endif - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) - -#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#else -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#endif - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) - #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) - #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) - -#else -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#endif - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#else -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#endif - -#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) -#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) -#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) -#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) -#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) -#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) -#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) -#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#else -#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) - #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) -#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) -#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) -#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) -#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) - -using Catch::Detail::Approx; - -// #included from: internal/catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(pop) -# else -# pragma clang diagnostic pop -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic pop -#endif - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/geom_bottleneck/include/def_debug_bt.h b/geom_bottleneck/include/def_debug_bt.h deleted file mode 100644 index 21557e7..0000000 --- a/geom_bottleneck/include/def_debug_bt.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef DEF_DEBUG_BT_H -#define DEF_DEBUG_BT_H - -//#define DEBUG_BOUND_MATCH -//#define DEBUG_NEIGHBOUR_ORACLE -//#define DEBUG_MATCHING -//#define DEBUG_AUCTION -// This symbol should be defined only in the version -// for R package TDA, to comply with some CRAN rules -// like no usage of cout, cerr, cin, exit, etc. -//#define FOR_R_TDA -//#define VERBOSE_BOTTLENECK - -#endif diff --git a/geom_bottleneck/include/diagram_reader.h b/geom_bottleneck/include/diagram_reader.h deleted file mode 100644 index 08d9e2b..0000000 --- a/geom_bottleneck/include/diagram_reader.h +++ /dev/null @@ -1,196 +0,0 @@ -/* -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_DIAGRAM_READER_H -#define HERA_DIAGRAM_READER_H - -#ifndef FOR_R_TDA -#include -#endif - -#include -#include -#include -#include - -namespace hera { - -// cannot choose stod, stof or stold based on RealType, -// lazy solution: partial specialization - template - inline RealType parse_real_from_str(const std::string& s); - - template <> - inline double parse_real_from_str(const std::string& s) - { - return std::stod(s); - } - - - template <> - inline long double parse_real_from_str(const std::string& s) - { - return std::stold(s); - } - - - template <> - inline float parse_real_from_str(const std::string& s) - { - return std::stof(s); - } - - - template - inline RealType parse_real_from_str(const std::string& s) - { - static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above"); - } - -// fill in result with points from file fname -// return false if file can't be opened -// or error occurred while reading -// decPrecision is the maximal decimal precision in the input, -// it is zero if all coordinates in the input are integers - - template>> - inline bool readDiagramPointSet(const char* fname, ContType_& result, int& decPrecision) - { - using RealType = RealType_; - - size_t lineNumber { 0 }; - result.clear(); - std::ifstream f(fname); - if (!f.good()) { -#ifndef FOR_R_TDA - std::cerr << "Cannot open file " << fname << std::endl; -#endif - return false; - } - std::locale loc; - std::string line; - while(std::getline(f, line)) { - lineNumber++; - // process comments: remove everything after hash - auto hashPos = line.find_first_of("#", 0); - if( std::string::npos != hashPos) { - line = std::string(line.begin(), line.begin() + hashPos); - } - if (line.empty()) { - continue; - } - // trim whitespaces - auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); - auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); - if (whiteSpaceBack <= whiteSpaceFront) { - // line consists of spaces only - move to the next line - continue; - } - line = std::string(whiteSpaceFront,whiteSpaceBack); - - // transform line to lower case - // to parse Infinity - for(auto& c : line) { - c = std::tolower(c, loc); - } - - bool fracPart = false; - int currDecPrecision = 0; - for(auto c : line) { - if (c == '.') { - fracPart = true; - } else if (fracPart) { - if (isdigit(c)) { - currDecPrecision++; - } else { - fracPart = false; - if (currDecPrecision > decPrecision) - decPrecision = currDecPrecision; - currDecPrecision = 0; - } - } - } - - RealType x, y; - std::string str_x, str_y; - std::istringstream iss(line); - try { - iss >> str_x >> str_y; - - x = parse_real_from_str(str_x); - y = parse_real_from_str(str_y); - - if (x != y) { - result.push_back(std::make_pair(x, y)); - } else { -#ifndef FOR_R_TDA - std::cerr << "Warning: point with 0 persistence ignored in " << fname << ":" << lineNumber << "\n"; -#endif - } - } - catch (const std::invalid_argument& e) { -#ifndef FOR_R_TDA - std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; -#endif - return false; - } - catch (const std::out_of_range&) { -#ifndef FOR_R_TDA - std::cerr << "Error while reading file " << fname << ", line number " << lineNumber << ": value too large in \"" << line << "\"" << std::endl; -#endif - return false; - } - } - f.close(); - return true; - } - - // wrappers - template>> - inline bool readDiagramPointSet(const std::string& fname, ContType_& result, int& decPrecision) - { - return readDiagramPointSet(fname.c_str(), result, decPrecision); - } - - // these two functions are now just wrappers for the previous ones, - // in case someone needs them; decPrecision is ignored - template>> - inline bool readDiagramPointSet(const char* fname, ContType_& result) - { - int decPrecision; - return readDiagramPointSet(fname, result, decPrecision); - } - - template>> - inline bool readDiagramPointSet(const std::string& fname, ContType_& result) - { - int decPrecision; - return readDiagramPointSet(fname.c_str(), result, decPrecision); - } - -} // end namespace hera -#endif // HERA_DIAGRAM_READER_H diff --git a/geom_bottleneck/include/diagram_traits.h b/geom_bottleneck/include/diagram_traits.h deleted file mode 100644 index c8d4862..0000000 --- a/geom_bottleneck/include/diagram_traits.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef HERA_DIAGRAM_TRAITS_H -#define HERA_DIAGRAM_TRAITS_H - -namespace hera { - -template().begin())>::type > -struct DiagramTraits -{ - using Container = PairContainer_; - using PointType = PointType_; - using RealType = typename std::remove_reference< decltype(std::declval()[0]) >::type; - - static RealType get_x(const PointType& p) { return p[0]; } - static RealType get_y(const PointType& p) { return p[1]; } -}; - - -template -struct DiagramTraits> -{ - using PointType = std::pair; - using RealType = double; - using Container = std::vector; - - static RealType get_x(const PointType& p) { return p.first; } - static RealType get_y(const PointType& p) { return p.second; } -}; - - -template -struct DiagramTraits> -{ - using PointType = std::pair; - using RealType = float; - using Container = std::vector; - - static RealType get_x(const PointType& p) { return p.first; } - static RealType get_y(const PointType& p) { return p.second; } -}; - - -} // end namespace hera - - -#endif // HERA_DIAGRAM_TRAITS_H diff --git a/geom_bottleneck/include/dnn/geometry/euclidean-fixed.h b/geom_bottleneck/include/dnn/geometry/euclidean-fixed.h deleted file mode 100644 index f45b980..0000000 --- a/geom_bottleneck/include/dnn/geometry/euclidean-fixed.h +++ /dev/null @@ -1,162 +0,0 @@ -#ifndef HERA_BT_DNN_GEOMETRY_EUCLIDEAN_FIXED_H -#define HERA_BT_DNN_GEOMETRY_EUCLIDEAN_FIXED_H - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "../parallel/tbb.h" // for dnn::vector<...> - -namespace hera { -namespace bt { -namespace dnn -{ - // TODO: wrap in another namespace (e.g., euclidean) - - template - struct Point: - boost::addable< Point, - boost::subtractable< Point, - boost::dividable2< Point, Real, - boost::multipliable2< Point, Real > > > >, - public boost::array - { - public: - typedef Real Coordinate; - typedef Real DistanceType; - - - public: - Point(size_t id = 0): id_(id) {} - template - Point(const Point& p, size_t id = 0): - id_(id) { *this = p; } - - static size_t dimension() { return D; } - - // Assign a point of different dimension - template - Point& operator=(const Point& p) { for (size_t i = 0; i < (D < DD ? D : DD); ++i) (*this)[i] = p[i]; if (DD < D) for (size_t i = DD; i < D; ++i) (*this)[i] = 0; return *this; } - - Point& operator+=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] += p[i]; return *this; } - Point& operator-=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] -= p[i]; return *this; } - Point& operator/=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] /= r; return *this; } - Point& operator*=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] *= r; return *this; } - - Real norm2() const { Real n = 0; for (size_t i = 0; i < D; ++i) n += (*this)[i] * (*this)[i]; return n; } - Real max_norm() const - { - Real m = std::fabs((*this)[0]); - for (size_t i = 1; i < D; ++i) - if (std::fabs((*this)[i]) > m) - m = std::fabs((*this)[i]); - return m; } - - // quick and dirty for now; make generic later - //DistanceType distance(const Point& other) const { return sqrt(sq_distance(other)); } - //DistanceType sq_distance(const Point& other) const { return (other - *this).norm2(); } - - DistanceType distance(const Point& other) const { return (other - *this).max_norm(); } - DistanceType sq_distance(const Point& other) const { DistanceType d = distance(other); return d*d; } - - size_t id() const { return id_; } - size_t& id() { return id_; } - - private: - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::base_object< boost::array >(*this) & id_; } - - private: - size_t id_; - }; - - template - std::ostream& - operator<<(std::ostream& out, const Point& p) - { out << p[0]; for (size_t i = 1; i < D; ++i) out << " " << p[i]; return out; } - - - template - struct PointTraits; // intentionally undefined; should be specialized for each type - - template - struct PointTraits< Point > // specialization for dnn::Point - { - typedef Point PointType; - typedef const PointType* PointHandle; - typedef std::vector PointContainer; - - typedef typename PointType::Coordinate Coordinate; - typedef typename PointType::DistanceType DistanceType; - - static DistanceType - distance(const PointType& p1, const PointType& p2) { return p1.distance(p2); } - static DistanceType - distance(PointHandle p1, PointHandle p2) { return distance(*p1,*p2); } - static DistanceType - sq_distance(const PointType& p1, - const PointType& p2) { return p1.sq_distance(p2); } - static DistanceType - sq_distance(PointHandle p1, PointHandle p2) { return sq_distance(*p1,*p2); } - static size_t dimension() { return D; } - static Real coordinate(const PointType& p, size_t i) { return p[i]; } - static Real& coordinate(PointType& p, size_t i) { return p[i]; } - static Real coordinate(PointHandle p, size_t i) { return coordinate(*p,i); } - - static size_t id(const PointType& p) { return p.id(); } - static size_t& id(PointType& p) { return p.id(); } - static size_t id(PointHandle p) { return id(*p); } - - static PointHandle - handle(const PointType& p) { return &p; } - static const PointType& - point(PointHandle ph) { return *ph; } - - void swap(PointType& p1, PointType& p2) const { return std::swap(p1, p2); } - - static PointContainer - container(size_t n = 0, const PointType& p = PointType()) { return PointContainer(n, p); } - static typename PointContainer::iterator - iterator(PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } - static typename PointContainer::const_iterator - iterator(const PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } - - private: - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) {} - }; - - template - void read_points(const std::string& filename, PointContainer& points) - { - typedef typename boost::range_value::type Point; - typedef typename PointTraits::Coordinate Coordinate; - - std::ifstream in(filename.c_str()); - std::string line; - while(std::getline(in, line)) - { - if (line[0] == '#') continue; // comment line in the file - std::stringstream linestream(line); - Coordinate x; - points.push_back(Point()); - size_t i = 0; - while (linestream >> x) - points.back()[i++] = x; - } - } -} // dnn -} // bt -} // hera -#endif diff --git a/geom_bottleneck/include/dnn/local/kd-tree.h b/geom_bottleneck/include/dnn/local/kd-tree.h deleted file mode 100644 index c1aed2b..0000000 --- a/geom_bottleneck/include/dnn/local/kd-tree.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef HERA_BT_DNN_LOCAL_KD_TREE_H -#define HERA_BT_DNN_LOCAL_KD_TREE_H - -#include "../utils.h" -#include "search-functors.h" - -#include -#include - -#include -#include -#include - -#include -#include - -namespace hera { -namespace bt { -namespace dnn -{ - // Weighted KDTree - // Traits_ provides Coordinate, DistanceType, PointType, dimension(), distance(p1,p2), coordinate(p,i) - template< class Traits_ > - class KDTree - { - public: - typedef Traits_ Traits; - typedef hera::bt::dnn::HandleDistance HandleDistance; - - typedef typename Traits::PointType Point; - typedef typename Traits::PointHandle PointHandle; - typedef typename Traits::Coordinate Coordinate; - typedef typename Traits::DistanceType DistanceType; - typedef std::vector HandleContainer; - typedef std::vector HDContainer; // TODO: use tbb::scalable_allocator - typedef HDContainer Result; - typedef std::vector DistanceContainer; - typedef std::unordered_map HandleMap; - //private: - typedef typename HandleContainer::iterator HCIterator; - typedef std::tuple KDTreeNode; - typedef std::tuple KDTreeNodeNoCut; - - //BOOST_STATIC_ASSERT_MSG(has_coordinates::value, "KDTree requires coordinates"); - - public: - KDTree(const Traits& traits): - traits_(traits) {} - - KDTree(const Traits& traits, HandleContainer&& handles); - - template - KDTree(const Traits& traits, const Range& range); - - template - void init(const Range& range); - - HandleDistance find(PointHandle q) const; - Result findR(PointHandle q, DistanceType r) const; // all neighbors within r - Result findFirstR(PointHandle q, DistanceType r) const; // first neighbor within r - Result findK(PointHandle q, size_t k) const; // k nearest neighbors - - HandleDistance find(const Point& q) const { return find(traits().handle(q)); } - Result findR(const Point& q, DistanceType r) const { return findR(traits().handle(q), r); } - Result findFirstR(const Point& q, DistanceType r) const { return findFirstR(traits().handle(q), r); } - Result findK(const Point& q, size_t k) const { return findK(traits().handle(q), k); } - - - - template - void search(PointHandle q, ResultsFunctor& rf) const; - - const Traits& traits() const { return traits_; } - - void get_path_to_root(const size_t idx, std::stack& s); - // to support deletion - void init_n_elems(); - void delete_point(const size_t idx); - void delete_point(PointHandle p); - void update_n_elems(const ssize_t idx, const int delta); - void increase_n_elems(const ssize_t idx); - void decrease_n_elems(const ssize_t idx); - size_t get_num_points() const { return num_points_; } - //private: - void init(); - - - struct CoordinateComparison; - struct OrderTree; - - //private: - Traits traits_; - HandleContainer tree_; - std::vector delete_flags_; - std::vector subtree_n_elems; - HandleMap indices_; - std::vector parents_; - - size_t num_points_; - }; -} // dnn -} // bt -} // hera -#include "kd-tree.hpp" - -#endif diff --git a/geom_bottleneck/include/dnn/local/kd-tree.hpp b/geom_bottleneck/include/dnn/local/kd-tree.hpp deleted file mode 100644 index 5b84eb0..0000000 --- a/geom_bottleneck/include/dnn/local/kd-tree.hpp +++ /dev/null @@ -1,296 +0,0 @@ -#include -#include -#include - -#include - -#include "../parallel/tbb.h" - -template -hera::bt::dnn::KDTree::KDTree(const Traits& traits, HandleContainer&& handles): - traits_(traits), - tree_(std::move(handles)), - delete_flags_(handles.size(), static_cast(0) ), - subtree_n_elems(handles.size(), static_cast(0)), - num_points_(handles.size()) -{ - init(); -} - -template -template -hera::bt::dnn::KDTree::KDTree(const Traits& traits, const Range& range): - traits_(traits) -{ - init(range); -} - -template -template -void hera::bt::dnn::KDTree::init(const Range& range) -{ - size_t sz = std::distance(std::begin(range), std::end(range)); - subtree_n_elems = std::vector(sz, 0); - delete_flags_ = std::vector(sz, 0); - num_points_ = sz; - tree_.reserve(sz); - for (PointHandle h : range) - tree_.push_back(h); - parents_.resize(sz, -1); - init(); -} - -template -void hera::bt::dnn::KDTree::init() -{ - if (tree_.empty()) - return; - -#if defined(TBB) - task_group g; - g.run(OrderTree(this, tree_.begin(), tree_.end(), -1, 0, traits())); - g.wait(); -#else - OrderTree(this, tree_.begin(), tree_.end(), -1, 0, traits()).serial(); -#endif - - for (size_t i = 0; i < tree_.size(); ++i) - indices_[tree_[i]] = i; - init_n_elems(); -} - -template -struct -hera::bt::dnn::KDTree::OrderTree -{ - OrderTree(KDTree* tree_, HCIterator b_, HCIterator e_, ssize_t p_, size_t i_, const Traits& traits_): - tree(tree_), b(b_), e(e_), p(p_), i(i_), traits(traits_) {} - - void operator()() const - { - if (e - b < 1000) - { - serial(); - return; - } - - HCIterator m = b + (e - b)/2; - ssize_t im = m - tree->tree_.begin(); - tree->parents_[im] = p; - - CoordinateComparison cmp(i, traits); - std::nth_element(b,m,e, cmp); - size_t next_i = (i + 1) % traits.dimension(); - - task_group g; - if (b < m - 1) g.run(OrderTree(tree, b, m, im, next_i, traits)); - if (e > m + 2) g.run(OrderTree(tree, m+1, e, im, next_i, traits)); - g.wait(); - } - - void serial() const - { - std::queue q; - q.push(KDTreeNode(b,e,p,i)); - while (!q.empty()) - { - HCIterator b, e; ssize_t p; size_t i; - std::tie(b,e,p,i) = q.front(); - q.pop(); - HCIterator m = b + (e - b)/2; - ssize_t im = m - tree->tree_.begin(); - tree->parents_[im] = p; - - CoordinateComparison cmp(i, traits); - std::nth_element(b,m,e, cmp); - size_t next_i = (i + 1) % traits.dimension(); - - // Replace with a size condition instead? - if (m - b > 1) - q.push(KDTreeNode(b, m, im, next_i)); - else if (b < m) - tree->parents_[im - 1] = im; - if (e - m > 2) - q.push(KDTreeNode(m+1, e, im, next_i)); - else if (e > m + 1) - tree->parents_[im + 1] = im; - } - } - - KDTree* tree; - HCIterator b, e; - ssize_t p; - size_t i; - const Traits& traits; -}; - -template -void hera::bt::dnn::KDTree::update_n_elems(ssize_t idx, const int delta) -// add delta to the number of points in node idx and update subtree_n_elems -// for all parents of the node idx -{ - //std::cout << "subtree_n_elems.size = " << subtree_n_elems.size() << std::endl; - // update the node itself - while (idx != -1) - { - //std::cout << idx << std::endl; - subtree_n_elems[idx] += delta; - idx = parents_[idx]; - } -} - -template -void hera::bt::dnn::KDTree::increase_n_elems(const ssize_t idx) -{ - update_n_elems(idx, static_cast(1)); -} - -template -void hera::bt::dnn::KDTree::decrease_n_elems(const ssize_t idx) -{ - update_n_elems(idx, static_cast(-1)); -} - -template -void hera::bt::dnn::KDTree::init_n_elems() -{ - for(size_t idx = 0; idx < tree_.size(); ++idx) { - increase_n_elems(idx); - } -} - - -template -template -void hera::bt::dnn::KDTree::search(PointHandle q, ResultsFunctor& rf) const -{ - typedef typename HandleContainer::const_iterator HCIterator; - typedef std::tuple KDTreeNode; - - if (tree_.empty()) - return; - - DistanceType D = std::numeric_limits::infinity(); - - // TODO: use tbb::scalable_allocator for the queue - std::queue nodes; - - nodes.push(KDTreeNode(tree_.begin(), tree_.end(), 0)); - - //std::cout << "started kdtree::search" << std::endl; - - while (!nodes.empty()) - { - HCIterator b, e; size_t i; - std::tie(b,e,i) = nodes.front(); - nodes.pop(); - - CoordinateComparison cmp(i, traits()); - i = (i + 1) % traits().dimension(); - - HCIterator m = b + (e - b)/2; - size_t m_idx = m - tree_.begin(); - // ignore deleted points - if ( delete_flags_[m_idx] == 0 ) { - DistanceType dist = traits().distance(q, *m); - // + weights_[m - tree_.begin()]; - //std::cout << "Supplied to functor: m : "; - //std::cout << "(" << (*(*m))[0] << ", " << (*(*m))[1] << ")"; - //std::cout << " and q : "; - //std::cout << "(" << (*q)[0] << ", " << (*q)[1] << ")" << std::endl; - //std::cout << "dist^q + weight = " << dist << std::endl; - //std::cout << "weight = " << weights_[m - tree_.begin()] << std::endl; - //std::cout << "dist = " << traits().distance(q, *m) << std::endl; - //std::cout << "dist^q = " << pow(traits().distance(q, *m), wassersteinPower) << std::endl; - - D = rf(*m, dist); - } - // we are really searching w.r.t L_\infty ball; could prune better with an L_2 ball - Coordinate diff = cmp.diff(q, *m); // diff returns signed distance - DistanceType diffToWasserPower = (diff > 0 ? 1.0 : -1.0) * fabs(diff); - - size_t lm = m + 1 + (e - (m+1))/2 - tree_.begin(); - if ( e > m + 1 and subtree_n_elems[lm] > 0 ) { - if (e > m + 1 && diffToWasserPower >= -D) { - nodes.push(KDTreeNode(m+1, e, i)); - } - } - - size_t rm = b + (m - b) / 2 - tree_.begin(); - if ( subtree_n_elems[rm] > 0 ) { - if (b < m && diffToWasserPower <= D) { - nodes.push(KDTreeNode(b, m, i)); - } - } - } - //std::cout << "exited kdtree::search" << std::endl; -} - -template -typename hera::bt::dnn::KDTree::HandleDistance hera::bt::dnn::KDTree::find(PointHandle q) const -{ - hera::bt::dnn::NNRecord nn; - search(q, nn); - return nn.result; -} - -template -typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findR(PointHandle q, DistanceType r) const -{ - hera::bt::dnn::rNNRecord rnn(r); - search(q, rnn); - //std::sort(rnn.result.begin(), rnn.result.end()); - return rnn.result; -} - -template -typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findFirstR(PointHandle q, DistanceType r) const -{ - hera::bt::dnn::firstrNNRecord rnn(r); - search(q, rnn); - return rnn.result; -} - -template -typename hera::bt::dnn::KDTree::Result hera::bt::dnn::KDTree::findK(PointHandle q, size_t k) const -{ - hera::bt::dnn::kNNRecord knn(k); - search(q, knn); - // do we need this??? - std::sort(knn.result.begin(), knn.result.end()); - return knn.result; -} - -template -struct hera::bt::dnn::KDTree::CoordinateComparison -{ - CoordinateComparison(size_t i, const Traits& traits): - i_(i), traits_(traits) {} - - bool operator()(PointHandle p1, PointHandle p2) const { return coordinate(p1) < coordinate(p2); } - Coordinate diff(PointHandle p1, PointHandle p2) const { return coordinate(p1) - coordinate(p2); } - - Coordinate coordinate(PointHandle p) const { return traits_.coordinate(p, i_); } - size_t axis() const { return i_; } - - private: - size_t i_; - const Traits& traits_; -}; - -template -void hera::bt::dnn::KDTree::delete_point(const size_t idx) -{ - // prevent double deletion - assert(delete_flags_[idx] == 0); - delete_flags_[idx] = 1; - decrease_n_elems(idx); - --num_points_; -} - -template -void hera::bt::dnn::KDTree::delete_point(PointHandle p) -{ - delete_point(indices_[p]); -} - diff --git a/geom_bottleneck/include/dnn/local/search-functors.h b/geom_bottleneck/include/dnn/local/search-functors.h deleted file mode 100644 index 63ad11d..0000000 --- a/geom_bottleneck/include/dnn/local/search-functors.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H -#define HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H - -#include - -namespace hera -{ -namespace bt -{ -namespace dnn -{ - -template -struct HandleDistance -{ - typedef typename NN::PointHandle PointHandle; - typedef typename NN::DistanceType DistanceType; - typedef typename NN::HDContainer HDContainer; - - HandleDistance() {} - HandleDistance(PointHandle pp, DistanceType dd): - p(pp), d(dd) {} - bool operator<(const HandleDistance& other) const { return d < other.d; } - - PointHandle p; - DistanceType d; -}; - -template -struct NNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - - NNRecord() { result.d = std::numeric_limits::infinity(); } - DistanceType operator()(PointHandle p, DistanceType d) { if (d < result.d) { result.p = p; result.d = d; } return result.d; } - HandleDistance result; -}; - -template -struct rNNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - typedef typename HandleDistance::HDContainer HDContainer; - - rNNRecord(DistanceType r_): r(r_) {} - DistanceType operator()(PointHandle p, DistanceType d) - { - if (d <= r) - result.push_back(HandleDistance(p,d)); - return r; - } - - DistanceType r; - HDContainer result; -}; - -template -struct firstrNNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - typedef typename HandleDistance::HDContainer HDContainer; - - firstrNNRecord(DistanceType r_): r(r_) {} - - DistanceType operator()(PointHandle p, DistanceType d) - { - if (d <= r) { - result.push_back(HandleDistance(p,d)); - return -100000000.0; - } else { - return r; - } - } - - DistanceType r; - HDContainer result; -}; - - -template -struct kNNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - typedef typename HandleDistance::HDContainer HDContainer; - - kNNRecord(unsigned k_): k(k_) {} - DistanceType operator()(PointHandle p, DistanceType d) - { - if (result.size() < k) - { - result.push_back(HandleDistance(p,d)); - boost::push_heap(result); - if (result.size() < k) - return std::numeric_limits::infinity(); - } else if (d < result[0].d) - { - boost::pop_heap(result); - result.back() = HandleDistance(p,d); - boost::push_heap(result); - } - if ( result.size() > 1 ) { - assert( result[0].d >= result[1].d ); - } - return result[0].d; - } - - unsigned k; - HDContainer result; -}; - -} // dnn -} // bt -} // hera - -#endif // HERA_BT_DNN_LOCAL_SEARCH_FUNCTORS_H diff --git a/geom_bottleneck/include/dnn/parallel/tbb.h b/geom_bottleneck/include/dnn/parallel/tbb.h deleted file mode 100644 index 14f0093..0000000 --- a/geom_bottleneck/include/dnn/parallel/tbb.h +++ /dev/null @@ -1,235 +0,0 @@ -#ifndef HERA_BT_PARALLEL_H -#define HERA_BT_PARALLEL_H - -#ifndef FOR_R_TDA -#include -#endif - -#include - -#include -#include -#include - -#ifdef TBB - -#include -#include -#include - -#include -#include -#include - -namespace hera { -namespace bt { -namespace dnn -{ - using tbb::mutex; - using tbb::task_scheduler_init; - using tbb::task_group; - using tbb::task; - - template - struct vector - { - typedef tbb::concurrent_vector type; - }; - - template - struct atomic - { - typedef tbb::atomic type; - static T compare_and_swap(type& v, T n, T o) { return v.compare_and_swap(n,o); } - }; - - template - void do_foreach(Iterator begin, Iterator end, const F& f) { tbb::parallel_do(begin, end, f); } - - template - void for_each_range_(const Range& r, const F& f) - { - for (typename Range::iterator cur = r.begin(); cur != r.end(); ++cur) - f(*cur); - } - - template - void for_each_range(size_t from, size_t to, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(from, to, f); - } - - template - void for_each_range(const Container& c, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); - } - - template - void for_each_range(Container& c, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); - } - - template - struct map_traits - { - typedef tbb::concurrent_hash_map type; - typedef typename type::range_type range; - }; - - struct progress_timer - { - progress_timer(): start(tbb::tick_count::now()) {} - ~progress_timer() - { -#ifndef FOR_R_TDA - std::cout << (tbb::tick_count::now() - start).seconds() << " s" << std::endl; -#endif - } - - tbb::tick_count start; - }; -} -} -} - -// Serialization for tbb::concurrent_vector<...> -namespace boost -{ - namespace serialization - { - template - void save(Archive& ar, const tbb::concurrent_vector& v, const unsigned int file_version) - { stl::save_collection(ar, v); } - - template - void load(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) - { - stl::load_collection, - stl::archive_input_seq< Archive, tbb::concurrent_vector >, - stl::reserve_imp< tbb::concurrent_vector > - >(ar, v); - } - - template - void serialize(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) - { split_free(ar, v, file_version); } - - template - void save(Archive& ar, const tbb::atomic& v, const unsigned int file_version) - { T v_ = v; ar << v_; } - - template - void load(Archive& ar, tbb::atomic& v, const unsigned int file_version) - { T v_; ar >> v_; v = v_; } - - template - void serialize(Archive& ar, tbb::atomic& v, const unsigned int file_version) - { split_free(ar, v, file_version); } - } -} - -#else - -#include -#include -#include - -namespace hera { -namespace bt { -namespace dnn -{ - template - struct vector - { - typedef ::std::vector type; - }; - - template - struct atomic - { - typedef T type; - static T compare_and_swap(type& v, T n, T o) { if (v != o) return v; v = n; return o; } - }; - - template - void do_foreach(Iterator begin, Iterator end, const F& f) { std::for_each(begin, end, f); } - - template - void for_each_range(size_t from, size_t to, const F& f) - { - for (size_t i = from; i < to; ++i) - f(i); - } - - template - void for_each_range(Container& c, const F& f) - { - BOOST_FOREACH(const typename Container::value_type& i, c) - f(i); - } - - template - void for_each_range(const Container& c, const F& f) - { - BOOST_FOREACH(const typename Container::value_type& i, c) - f(i); - } - - struct mutex - { - struct scoped_lock - { - scoped_lock() {} - scoped_lock(mutex& ) {} - void acquire(mutex& ) const {} - void release() const {} - }; - }; - - struct task_scheduler_init - { - task_scheduler_init(unsigned) {} - void initialize(unsigned) {} - static const unsigned automatic = 0; - static const unsigned deferred = 0; - }; - - struct task_group - { - template - void run(const Functor& f) const { f(); } - void wait() const {} - }; - - template - struct map_traits - { - typedef std::map type; - typedef type range; - }; - - using boost::progress_timer; -} -} -} - -#endif // TBB - -namespace dnn -{ - template - void do_foreach(const Range& range, const F& f) { do_foreach(boost::begin(range), boost::end(range), f); } -} - -#endif diff --git a/geom_bottleneck/include/dnn/parallel/utils.h b/geom_bottleneck/include/dnn/parallel/utils.h deleted file mode 100644 index 9809e77..0000000 --- a/geom_bottleneck/include/dnn/parallel/utils.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef HERA_BT_PARALLEL_UTILS_H -#define HERA_BT_PARALLEL_UTILS_H - -#include "../utils.h" - -namespace hera -{ -namespace bt -{ -namespace dnn -{ - // Assumes rng is synchronized across ranks - template - void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty = DataVector()); - - template - void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng) - { - typedef decltype(data[0]) T; - shuffle(world, data, rng, [](T& x, T& y) { std::swap(x,y); }); - } -} -} -} - -template -void -hera::bt::dnn::shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty) -{ - // This is not a perfect shuffle: it dishes out data in chunks of 1/size. - // (It can be interpreted as generating a bistochastic matrix by taking the - // sum of size random permutation matrices.) Hopefully, it works for our purposes. - - typedef typename RNGType::result_type RNGResult; - - int size = world.size(); - int rank = world.rank(); - - // Generate local seeds - boost::uniform_int uniform; - RNGResult seed; - for (size_t i = 0; i < size; ++i) - { - RNGResult v = uniform(rng); - if (i == rank) - seed = v; - } - RNGType local_rng(seed); - - // Shuffle local data - hera::bt::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); - - // Decide how much of our data goes to i-th processor - std::vector out_counts(size); - std::vector ranks(boost::counting_iterator(0), - boost::counting_iterator(size)); - for (size_t i = 0; i < size; ++i) - { - hera::bt::dnn::random_shuffle(ranks.begin(), ranks.end(), rng); - ++out_counts[ranks[rank]]; - } - - // Fill the outgoing array - size_t total = 0; - std::vector< DataVector > outgoing(size, empty); - for (size_t i = 0; i < size; ++i) - { - size_t count = data.size()*out_counts[i]/size; - if (total + count > data.size()) - count = data.size() - total; - - outgoing[i].reserve(count); - for (size_t j = total; j < total + count; ++j) - outgoing[i].push_back(data[j]); - - total += count; - } - - boost::uniform_int uniform_outgoing(0,size-1); // in range [0,size-1] - while(total < data.size()) // send leftover to random processes - { - outgoing[uniform_outgoing(local_rng)].push_back(data[total]); - ++total; - } - data.clear(); - - // Exchange the data - std::vector< DataVector > incoming(size, empty); - mpi::all_to_all(world, outgoing, incoming); - outgoing.clear(); - - // Assemble our data - for(const DataVector& vec : incoming) - for (size_t i = 0; i < vec.size(); ++i) - data.push_back(vec[i]); - hera::bt::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); - // XXX: the final shuffle is irrelevant for our purposes. But it's also cheap. -} - -#endif diff --git a/geom_bottleneck/include/dnn/utils.h b/geom_bottleneck/include/dnn/utils.h deleted file mode 100644 index f4ce632..0000000 --- a/geom_bottleneck/include/dnn/utils.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef HERA_BT_DNN_UTILS_H -#define HERA_BT_DNN_UTILS_H - -#include -#include -#include - -namespace hera -{ -namespace bt -{ -namespace dnn -{ - -template -struct has_coordinates -{ - template ().coordinate(std::declval()...) )> - static std::true_type test(int); - - template - static std::false_type test(...); - - static constexpr bool value = decltype(test(0))::value; -}; - -template -void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g, const SwapFunctor& swap) -{ - size_t n = last - first; - boost::uniform_int uniform(0,n); - for (size_t i = n-1; i > 0; --i) - swap(first[i], first[uniform(g,i+1)]); // picks a random number in [0,i] range -} - -template -void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g) -{ - typedef decltype(*first) T; - random_shuffle(first, last, g, [](T& x, T& y) { std::swap(x,y); }); -} - -} // dnn -} // bt -} // hera - -#endif diff --git a/geom_bottleneck/include/neighb_oracle.h b/geom_bottleneck/include/neighb_oracle.h deleted file mode 100644 index 91ebc0e..0000000 --- a/geom_bottleneck/include/neighb_oracle.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_NEIGHB_ORACLE_H -#define HERA_NEIGHB_ORACLE_H - -#include -#include -#include - -#include "basic_defs_bt.h" -#include "dnn/geometry/euclidean-fixed.h" -#include "dnn/local/kd-tree.h" - - - -namespace hera { -namespace bt { - -template -class NeighbOracleSimple -{ -public: - using DgmPoint = DiagramPoint; - using DgmPointSet = DiagramPointSet; - -private: - Real r; - Real distEpsilon; - DgmPointSet pointSet; - -public: - - NeighbOracleSimple() : r(0.0) {} - - NeighbOracleSimple(const DgmPointSet& _pointSet, const Real _r, const Real _distEpsilon) : - r(_r), - distEpsilon(_distEpsilon), - pointSet(_pointSet) - {} - - void deletePoint(const DgmPoint& p) - { - pointSet.erase(p); - } - - void rebuild(const DgmPointSet& S, const double rr) - { - pointSet = S; - r = rr; - } - - bool getNeighbour(const DgmPoint& q, DgmPoint& result) const - { - for(auto pit = pointSet.cbegin(); pit != pointSet.cend(); ++pit) { - if ( distLInf(*pit, q) <= r) { - result = *pit; - return true; - } - } - return false; - } - - void getAllNeighbours(const DgmPoint& q, std::vector& result) - { - result.clear(); - for(const auto& point : pointSet) { - if ( distLInf(point, q) <= r) { - result.push_back(point); - } - } - for(auto& pt : result) { - deletePoint(pt); - } - } - -}; - -template -class NeighbOracleDnn -{ -public: - - using Real = Real_; - using DnnPoint = dnn::Point<2, double>; - using DnnTraits = dnn::PointTraits; - using DgmPoint = DiagramPoint; - using DgmPointSet = DiagramPointSet; - using DgmPointHash = DiagramPointHash; - - Real r; - Real distEpsilon; - std::vector allPoints; - DgmPointSet diagonalPoints; - std::unordered_map pointIdxLookup; - // dnn-stuff - std::unique_ptr> kdtree; - std::vector dnnPoints; - std::vector dnnPointHandles; - std::vector kdtreeItems; - - NeighbOracleDnn(const DgmPointSet& S, const Real rr, const Real dEps) : - kdtree(nullptr) - { - assert(dEps >= 0); - distEpsilon = dEps; - rebuild(S, rr); - } - - - void deletePoint(const DgmPoint& p) - { - auto findRes = pointIdxLookup.find(p); - assert(findRes != pointIdxLookup.end()); - //std::cout << "Deleting point " << p << std::endl; - size_t pointIdx { (*findRes).second }; - //std::cout << "pointIdx = " << pointIdx << std::endl; - diagonalPoints.erase(p, false); - kdtree->delete_point(dnnPointHandles[kdtreeItems[pointIdx]]); - } - - void rebuild(const DgmPointSet& S, const Real rr) - { - //std::cout << "Entered rebuild, r = " << rr << std::endl; - r = rr; - size_t dnnNumPoints = S.size(); - //printDebug(isDebug, "S = ", S); - if (dnnNumPoints > 0) { - pointIdxLookup.clear(); - pointIdxLookup.reserve(S.size()); - allPoints.clear(); - allPoints.reserve(S.size()); - diagonalPoints.clear(); - diagonalPoints.reserve(S.size() / 2); - for(auto pit = S.cbegin(); pit != S.cend(); ++pit) { - allPoints.push_back(*pit); - if (pit->isDiagonal()) { - diagonalPoints.insert(*pit); - } - } - - size_t pointIdx = 0; - for(auto& dataPoint : allPoints) { - pointIdxLookup.insert( { dataPoint, pointIdx++ } ); - } - - size_t dnnItemIdx { 0 }; - size_t trueIdx { 0 }; - dnnPoints.clear(); - kdtreeItems.clear(); - dnnPointHandles.clear(); - dnnPoints.clear(); - kdtreeItems.reserve(S.size() ); - // store normal items in kd-tree - for(const auto& g : allPoints) { - if (true) { - kdtreeItems.push_back(dnnItemIdx); - // index of items is id of dnn-point - DnnPoint p(trueIdx); - p[0] = g.getRealX(); - p[1] = g.getRealY(); - dnnPoints.push_back(p); - assert(dnnItemIdx == dnnPoints.size() - 1); - dnnItemIdx++; - } - trueIdx++; - } - assert(dnnPoints.size() == allPoints.size() ); - for(size_t i = 0; i < dnnPoints.size(); ++i) { - dnnPointHandles.push_back(&dnnPoints[i]); - } - DnnTraits traits; - //std::cout << "kdtree: " << dnnPointHandles.size() << " points" << std::endl; - kdtree.reset(new dnn::KDTree(traits, dnnPointHandles)); - } - } - - - bool getNeighbour(const DgmPoint& q, DgmPoint& result) const - { - //std::cout << "getNeighbour for q = " << q << ", r = " << r << std::endl; - //std::cout << *this << std::endl; - // distance between two diagonal points - // is 0 - if (q.isDiagonal()) { - if (!diagonalPoints.empty()) { - result = *diagonalPoints.cbegin(); - //std::cout << "Neighbour found in diagonal points, res = " << result; - return true; - } - } - // check if kdtree is not empty - if (0 == kdtree->get_num_points() ) { - //std::cout << "empty tree, no neighb." << std::endl; - return false; - } - // if no neighbour found among diagonal points, - // search in kd_tree - DnnPoint queryPoint; - queryPoint[0] = q.getRealX(); - queryPoint[1] = q.getRealY(); - auto kdtreeResult = kdtree->findFirstR(queryPoint, r); - if (kdtreeResult.empty()) { - //std::cout << "no neighbour within " << r << "found." << std::endl; - return false; - } - if (kdtreeResult[0].d <= r + distEpsilon) { - result = allPoints[kdtreeResult[0].p->id()]; - //std::cout << "Neighbour found with kd-tree, index = " << kdtreeResult[0].p->id() << std::endl; - //std::cout << "result = " << result << std::endl; - return true; - } - //std::cout << "No neighbour found for r = " << r << std::endl; - return false; - } - - - - void getAllNeighbours(const DgmPoint& q, std::vector& result) - { - //std::cout << "Entered getAllNeighbours for q = " << q << std::endl; - result.clear(); - // add diagonal points, if necessary - if ( q.isDiagonal() ) { - for( auto& diagPt : diagonalPoints ) { - result.push_back(diagPt); - } - } - // delete diagonal points we found - // to prevent finding them again - for(auto& pt : result) { - //std::cout << "deleting DIAG point pt = " << pt << std::endl; - deletePoint(pt); - } - size_t diagOffset = result.size(); - std::vector pointIndicesOut; - // perorm range search on kd-tree - DnnPoint queryPoint; - queryPoint[0] = q.getRealX(); - queryPoint[1] = q.getRealY(); - auto kdtreeResult = kdtree->findR(queryPoint, r); - pointIndicesOut.reserve(kdtreeResult.size()); - for(auto& handleDist : kdtreeResult) { - if (handleDist.d <= r + distEpsilon) { - pointIndicesOut.push_back(handleDist.p->id()); - } else { - break; - } - } - // get actual points in result - for(auto& ptIdx : pointIndicesOut) { - result.push_back(allPoints[ptIdx]); - } - // delete all points we found - for(auto ptIt = result.begin() + diagOffset; ptIt != result.end(); ++ptIt) { - //printDebug(isDebug, "deleting point pt = ", *ptIt); - deletePoint(*ptIt); - } - } - - //DgmPointSet originalPointSet; - template - friend std::ostream& operator<<(std::ostream& out, const NeighbOracleDnn& oracle); - -}; - -} // end namespace bt -} // end namespace hera - -#endif // HERA_NEIGHB_ORACLE_H diff --git a/geom_bottleneck/tests/data/test_001_A b/geom_bottleneck/tests/data/test_001_A deleted file mode 100644 index 8d04f96..0000000 --- a/geom_bottleneck/tests/data/test_001_A +++ /dev/null @@ -1 +0,0 @@ -1 2 diff --git a/geom_bottleneck/tests/data/test_001_B b/geom_bottleneck/tests/data/test_001_B deleted file mode 100644 index 9290688..0000000 --- a/geom_bottleneck/tests/data/test_001_B +++ /dev/null @@ -1 +0,0 @@ -4 6 diff --git a/geom_bottleneck/tests/data/test_002_A b/geom_bottleneck/tests/data/test_002_A deleted file mode 100644 index 8d04f96..0000000 --- a/geom_bottleneck/tests/data/test_002_A +++ /dev/null @@ -1 +0,0 @@ -1 2 diff --git a/geom_bottleneck/tests/data/test_002_B b/geom_bottleneck/tests/data/test_002_B deleted file mode 100644 index a4cec9b..0000000 --- a/geom_bottleneck/tests/data/test_002_B +++ /dev/null @@ -1 +0,0 @@ -1.1 2.2 diff --git a/geom_bottleneck/tests/data/test_003_A b/geom_bottleneck/tests/data/test_003_A deleted file mode 100644 index fdf0acd..0000000 --- a/geom_bottleneck/tests/data/test_003_A +++ /dev/null @@ -1,2 +0,0 @@ -1 2 -2 inf diff --git a/geom_bottleneck/tests/data/test_003_B b/geom_bottleneck/tests/data/test_003_B deleted file mode 100644 index ac429f9..0000000 --- a/geom_bottleneck/tests/data/test_003_B +++ /dev/null @@ -1,2 +0,0 @@ -1.1 2.2 -4 inf diff --git a/geom_bottleneck/tests/data/test_004_A b/geom_bottleneck/tests/data/test_004_A deleted file mode 100644 index fdf0acd..0000000 --- a/geom_bottleneck/tests/data/test_004_A +++ /dev/null @@ -1,2 +0,0 @@ -1 2 -2 inf diff --git a/geom_bottleneck/tests/data/test_004_B b/geom_bottleneck/tests/data/test_004_B deleted file mode 100644 index 5769823..0000000 --- a/geom_bottleneck/tests/data/test_004_B +++ /dev/null @@ -1,3 +0,0 @@ -1.1 2.2 -4 inf -4 inf diff --git a/geom_bottleneck/tests/data/test_005_A b/geom_bottleneck/tests/data/test_005_A deleted file mode 100644 index e28367d..0000000 --- a/geom_bottleneck/tests/data/test_005_A +++ /dev/null @@ -1,6 +0,0 @@ -1 2 -2 inf -3 inf -10 inf -inf 21 -inf 44 diff --git a/geom_bottleneck/tests/data/test_005_B b/geom_bottleneck/tests/data/test_005_B deleted file mode 100644 index 7f6032b..0000000 --- a/geom_bottleneck/tests/data/test_005_B +++ /dev/null @@ -1,6 +0,0 @@ -1.1 2.2 -4 inf -4 inf -12 inf -inf 20 -inf 40 diff --git a/geom_bottleneck/tests/data/test_006_A b/geom_bottleneck/tests/data/test_006_A deleted file mode 100644 index b5184a5..0000000 --- a/geom_bottleneck/tests/data/test_006_A +++ /dev/null @@ -1,7 +0,0 @@ -1 2 -2 inf -3 inf -10 inf -inf 21 -inf 44 -1 34 diff --git a/geom_bottleneck/tests/data/test_006_B b/geom_bottleneck/tests/data/test_006_B deleted file mode 100644 index 0d07369..0000000 --- a/geom_bottleneck/tests/data/test_006_B +++ /dev/null @@ -1,7 +0,0 @@ -2 40 -1.1 2.2 -4 inf -4 inf -12 inf -inf 20 -inf 40 diff --git a/geom_bottleneck/tests/data/test_007_A b/geom_bottleneck/tests/data/test_007_A deleted file mode 100644 index e69de29..0000000 diff --git a/geom_bottleneck/tests/data/test_007_B b/geom_bottleneck/tests/data/test_007_B deleted file mode 100644 index e69de29..0000000 diff --git a/geom_bottleneck/tests/data/test_008_A b/geom_bottleneck/tests/data/test_008_A deleted file mode 100644 index 50b3df6..0000000 --- a/geom_bottleneck/tests/data/test_008_A +++ /dev/null @@ -1 +0,0 @@ -0 1.1 diff --git a/geom_bottleneck/tests/data/test_008_B b/geom_bottleneck/tests/data/test_008_B deleted file mode 100644 index 1935b11..0000000 --- a/geom_bottleneck/tests/data/test_008_B +++ /dev/null @@ -1 +0,0 @@ -0 0.1 diff --git a/geom_bottleneck/tests/data/test_009_A b/geom_bottleneck/tests/data/test_009_A deleted file mode 100644 index a1b859e..0000000 --- a/geom_bottleneck/tests/data/test_009_A +++ /dev/null @@ -1 +0,0 @@ -1.1 0 diff --git a/geom_bottleneck/tests/data/test_009_B b/geom_bottleneck/tests/data/test_009_B deleted file mode 100644 index b5befbc..0000000 --- a/geom_bottleneck/tests/data/test_009_B +++ /dev/null @@ -1 +0,0 @@ -0.1 0 diff --git a/geom_bottleneck/tests/data/test_010_A b/geom_bottleneck/tests/data/test_010_A deleted file mode 100644 index 8d126f0..0000000 --- a/geom_bottleneck/tests/data/test_010_A +++ /dev/null @@ -1,100 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 -3.79915 4.51283 -3.17645 3.75321 -0.61305 0.998622 -0.445643 1.13781 -6.38205 6.53669 -5.96392 6.44093 -7.21047 7.26005 -0.6703 1.26593 -0.529933 1.7027 -7.92495 8.83023 -2.1382 2.71695 -3.79209 4.5197 -5.23354 5.82214 --0.395097 2.18831 -3.22028 3.88648 -5.56262 5.79949 -8.39623 9.37185 -2.7452 3.84539 -9.5022 10.2414 -1.01374 1.40504 -3.2029 3.89559 -7.61236 8.28485 -6.4371 6.909 -4.45616 5.35067 -1.57802 1.77895 -6.5991 7.76339 -6.66729 6.71714 -6.11898 6.57121 -2.60663 4.36396 --0.259613 1.17683 -7.72857 9.48862 -4.68398 5.51521 -4.87447 5.4233 -6.86301 6.88244 -4.17814 4.25886 -8.70558 9.72902 -4.40873 4.57389 -6.1824 7.05049 -7.97557 8.79739 -8.52591 8.6985 -5.15336 5.27796 -9.70144 9.77031 -0.561778 1.39045 -9.32553 10.2456 -7.01495 7.74521 -6.83355 7.28255 -1.96721 3.01504 -5.78411 7.59464 -5.64012 6.10721 -3.7249 5.17086 -4.33297 5.91657 -7.11793 7.2545 -5.109 6.76878 -3.02787 3.04077 -0.999365 2.05566 -8.81392 8.9086 -6.20106 6.78943 -6.7987 7.05794 -0.438805 0.449602 -8.71793 9.79853 --0.150282 0.51997 -5.72257 5.93156 -5.71098 6.09535 -9.0378 9.45942 -0.534987 0.872885 -7.72276 8.57754 -9.26069 9.40289 -4.148 4.80519 -1.04579 3.18109 -0.259767 0.93215 -0.250608 0.511569 -4.88108 5.62239 -4.6731 5.3348 -7.84979 7.93545 -0.912521 1.48142 -4.82553 5.38108 -6.02179 7.61665 -3.85848 6.39418 -5.10754 6.02118 -1.71956 1.86238 -6.47336 6.74034 --0.0371018 0.212738 -3.97259 4.15465 -2.17413 3.20188 -4.49098 6.09812 -6.62445 7.84196 -6.57541 7.432 -6.81052 9.6653 -3.67502 4.69734 -3.92378 4.14743 -5.93127 6.46154 -0.63424 0.705454 -7.60129 9.23263 -4.23064 4.74575 -0.397705 1.24458 diff --git a/geom_bottleneck/tests/data/test_010_B b/geom_bottleneck/tests/data/test_010_B deleted file mode 100644 index 852799d..0000000 --- a/geom_bottleneck/tests/data/test_010_B +++ /dev/null @@ -1,100 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 -3.77337 5.2686 -8.31344 9.05384 -0.734064 1.14844 -7.57606 7.8521 -3.16719 3.86953 -2.55072 2.64932 -9.51707 9.6071 -0.304643 2.41784 -2.79925 3.28234 -5.32901 7.7576 -5.19903 6.30449 -1.87819 2.99454 -8.92272 9.67105 -4.62414 5.05592 -4.0079 4.64148 -2.26369 3.44573 -2.69335 3.13426 -1.90706 2.42652 -2.68113 2.79133 -1.41065 1.56018 -6.55282 7.18725 -5.72986 6.37151 -7.26968 8.22623 -3.32643 3.73606 -3.77325 4.63115 -1.05457 1.83651 -8.6815 8.85251 -3.91285 4.17139 -0.380936 0.842109 -7.33227 7.69334 -8.45635 8.923 -4.1769 5.08373 -0.501374 2.23328 --0.161782 1.28908 -3.44716 3.4662 -3.15394 4.30243 -8.71416 9.3781 -6.3034 8.62893 -6.53824 7.04611 -0.6386 1.35269 -0.862088 0.960371 -5.12963 5.20203 -1.58695 2.0452 -6.57698 6.63228 -3.87747 4.45669 -1.51273 3.25669 --0.0992804 0.667302 -4.7489 4.80059 -0.0280559 1.90471 -6.7462 8.27612 -0.915652 1.30007 -2.79556 3.77404 -9.87989 10.0722 -9.39105 9.84229 -7.57235 9.37122 -5.09426 6.44266 -6.3994 6.72037 -5.73441 6.99341 -6.9079 7.88049 -4.2003 4.41933 --1.72447 2.25877 -9.04907 9.64323 -4.40473 5.3593 -9.31201 9.96079 -7.28343 8.74163 -3.0172 6.23779 -8.08422 8.56069 -6.83038 6.99863 -2.32038 3.1289 -7.42302 8.26286 -6.66905 7.18496 -0.730748 1.61335 -4.00564 5.73993 -2.81231 3.67489 -2.33178 2.37845 -9.03302 9.68681 -0.567816 0.755485 -7.89783 8.7621 -0.177662 0.332833 --0.181569 1.36821 -6.22158 6.55787 -4.67115 5.16995 -0.806432 0.820738 -7.69636 7.87402 -4.40933 4.54995 -9.1329 9.15037 -8.87416 9.04329 -1.14349 1.8993 -3.29756 4.7172 -6.67873 8.31364 -6.91238 7.1654 -0.483084 1.55006 -2.66058 3.86294 -5.93347 6.06085 -7.40514 9.05071 diff --git a/geom_bottleneck/tests/data/test_011_A b/geom_bottleneck/tests/data/test_011_A deleted file mode 100644 index 164b71d..0000000 --- a/geom_bottleneck/tests/data/test_011_A +++ /dev/null @@ -1,200 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 diff --git a/geom_bottleneck/tests/data/test_011_B b/geom_bottleneck/tests/data/test_011_B deleted file mode 100644 index 761943d..0000000 --- a/geom_bottleneck/tests/data/test_011_B +++ /dev/null @@ -1,200 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 diff --git a/geom_bottleneck/tests/data/test_012_A b/geom_bottleneck/tests/data/test_012_A deleted file mode 100644 index 094c6e0..0000000 --- a/geom_bottleneck/tests/data/test_012_A +++ /dev/null @@ -1,5000 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 -0.903753 1.57921 -0.380744 1.88053 -1.3164 1.79885 -0.199366 0.576639 -5.53683 6.49433 -8.8705 9.14396 -3.1401 3.98761 -4.82675 6.69396 -7.28593 8.08916 -8.11312 9.92914 -3.25737 3.42109 -2.58413 4.57223 -2.65202 2.77196 --0.31616 1.51568 -4.1621 5.29563 -4.49155 5.21037 -7.28481 7.31722 -9.70568 10.0406 -2.39057 2.85874 -2.30626 3.16244 -1.15896 2.09616 -5.91343 7.33024 --0.172181 0.177363 -5.08934 6.10928 -7.15508 7.55315 -4.43036 4.68093 -6.00772 6.49566 -7.9247 8.43809 -1.57028 2.52328 -3.45458 4.43692 -3.18257 4.83824 -1.48243 1.91225 -2.59025 2.99596 -6.93059 8.34359 -4.53752 7.51216 -6.42857 6.51513 -5.5663 6.13877 -7.54367 7.56485 -9.01229 9.19913 -2.84158 3.23347 -0.42959 0.620618 -8.77033 9.33787 -8.06103 8.30989 -6.48425 7.83668 -4.66949 6.00205 -4.46683 4.66247 -8.96738 9.07714 -0.463093 0.514808 -7.72986 9.44537 -6.31391 6.8289 -0.883295 1.70946 -3.73278 3.98015 -6.73453 6.92514 -3.58434 4.43262 -0.236286 1.4601 -2.00505 2.38684 -3.845 4.20708 -1.18852 3.04911 -0.766784 1.00641 -7.38781 8.11216 -8.9396 9.27589 -0.369822 1.53322 -8.76527 9.23987 -0.663408 0.803445 -9.69209 10.1455 -9.73379 10.234 -3.47602 4.89968 -4.12754 5.45249 -7.31984 8.57369 -0.989101 1.47678 -5.57662 5.83292 -4.99092 6.85044 -4.35272 4.3683 -0.0517815 1.92227 -7.2694 7.80634 -1.35565 1.42783 -8.5638 8.91707 -1.74557 2.74123 -2.18226 2.19664 --0.901334 1.32691 -0.866613 1.03788 -5.30895 6.31774 -7.70178 8.5675 -4.06894 4.16071 -2.59697 3.53162 -4.30201 5.34212 -4.08762 4.19091 --0.516192 0.848397 -9.85911 10.1066 -0.472991 1.40069 -6.26012 7.0054 -0.707801 2.15445 -1.73825 1.87193 -0.206301 0.831746 -7.77872 7.92715 -4.94477 5.60361 -3.86216 5.16839 -1.35166 1.54482 -2.91721 3.56193 -4.57242 4.75913 -7.09303 8.29678 -8.18431 8.92151 -6.80303 10.87 -1.29208 1.72027 -1.22224 1.31693 -5.26756 6.26459 -2.55221 3.94397 -6.58902 6.78354 -7.85917 8.89791 -6.59279 7.63115 -4.45787 7.26828 -3.48759 5.33991 -2.13838 3.86589 -1.53368 3.57313 -1.41722 3.19336 -3.48388 4.11958 -1.53756 2.98451 -7.29083 8.22109 -1.2713 2.16915 -6.94685 7.31029 -6.2494 7.04676 -3.00376 3.02028 -1.25232 1.43301 -1.50413 2.25 -2.89098 4.77198 -4.50766 5.89294 -5.5403 6.07893 --0.101858 0.409209 -3.87963 6.1053 --0.19564 1.46589 --0.342077 0.694623 -6.63875 7.42223 -7.89982 9.05857 -4.91121 5.48031 -5.90743 8.35815 -7.13881 8.21597 -4.11493 5.08147 -3.59673 3.77176 -8.08236 8.3237 -1.35842 1.48934 -5.42963 5.85906 -4.60778 4.9734 --0.607198 0.91225 -5.40263 5.7017 -5.08624 5.63236 -7.34529 9.02233 -7.30013 8.12907 -6.56106 6.75585 -6.82576 7.25434 -2.96037 3.56454 -3.60283 4.09137 -6.35408 6.71888 --0.688103 0.84579 -8.45128 8.69771 -6.31749 7.3294 -5.82223 6.04761 -1.72983 2.38205 -6.94974 7.76985 -9.681 10.0141 -8.65394 9.2456 -2.52904 3.39548 -6.66609 7.35785 -4.18963 4.5473 -3.58643 3.80513 -2.88796 3.82413 -0.992066 1.1477 -4.57942 5.15419 -3.02826 4.32268 -5.91565 6.82087 -4.13694 5.13393 -6.28717 6.53257 -1.3149 2.36944 -0.488974 0.981461 -4.32763 4.98272 --0.420836 0.63619 -7.13406 7.31362 -0.367782 1.91138 -6.14763 6.16713 -0.837933 1.92794 -9.3781 10.0609 -3.22887 5.44584 -5.91554 6.65974 -5.68608 6.02435 -7.99715 8.55953 -5.37106 5.38574 -0.254544 0.374268 -0.184701 0.917061 -9.38005 9.54042 -6.86741 7.35628 -0.87398 1.69093 -7.75845 8.53773 -0.370425 1.35335 -0.699837 0.810893 -3.73223 4.32089 -3.81804 3.85752 -4.85936 5.10097 -2.70381 3.10519 -3.82523 5.27699 -9.13422 10.3317 -4.62775 4.77988 -7.91139 7.95504 -2.72614 4.79958 -0.863357 1.88643 -4.14155 5.02327 -2.49683 4.11585 -1.06741 1.11516 -6.20979 8.38443 -0.936362 2.46703 -6.58231 7.85063 -1.89469 2.31422 -8.70668 9.14006 -5.76486 6.1122 -3.15778 3.76679 -0.248282 2.19881 -1.25317 1.92694 -7.81837 9.53067 --0.582906 0.818904 -8.34194 8.37845 -4.4913 5.10164 -3.86376 5.5453 -6.94054 7.68699 -2.07462 2.5811 -0.518698 2.1529 -3.51773 4.60946 -8.39915 8.98446 -1.63685 2.19755 -6.60737 9.05917 -2.06667 3.23994 -3.18822 3.31219 -2.44332 3.22088 -4.755 4.87118 -4.34245 4.91565 -4.64562 4.8104 -2.73282 3.35646 -9.48057 9.86441 -0.640899 1.03356 -0.789475 0.925731 -1.4247 1.58347 -1.47747 2.25408 -8.8612 9.81597 -8.44147 10.6885 -9.07046 10.0877 -0.350125 1.15765 -4.45375 5.73964 -4.06526 4.26457 -7.50776 8.23491 -1.55452 1.63786 -2.8399 4.52559 -1.34319 1.47951 -5.21572 5.65702 -5.85695 6.75574 -8.21826 10.657 --0.0479956 1.79162 -1.72905 1.78113 -3.35685 4.03797 -3.7123 5.82296 -8.56751 10.2992 -4.07987 4.25273 -5.8347 6.07253 -3.25283 3.99065 -9.31995 10.3647 -0.649025 1.14496 -1.06966 2.04182 -7.59831 7.85826 -3.35263 3.84374 -4.91371 5.10148 -8.0875 9.23421 -3.00484 5.14282 -8.60448 9.09442 -5.61429 6.24037 -3.4729 4.17907 -7.18702 7.26274 -0.729966 0.928899 -2.27264 2.81241 -2.67248 3.91661 -3.98443 4.64406 -5.50463 6.92435 --0.257961 0.905736 -5.71363 6.67387 -4.12643 4.66467 -3.97623 4.64917 -9.71227 9.8243 -8.66674 8.97634 -7.94673 8.73904 -7.45228 8.14466 -3.78405 4.81189 -4.05505 5.00011 -2.84957 3.15451 -6.93785 7.58172 -1.85006 1.96814 -6.82256 7.00166 -2.42727 2.68161 -8.06129 8.76308 -1.53758 3.67482 -2.5057 4.18495 -7.09618 7.79664 -1.12843 1.46228 -1.61447 2.2668 -5.58639 5.70776 -8.15398 8.34959 -2.49733 2.57643 -5.18817 5.32462 -5.62963 5.86377 -1.95215 2.26641 -7.22129 7.23255 -5.99833 6.18639 -6.20875 7.13868 -6.814 7.6597 -7.41314 9.49798 -5.48819 6.31634 -4.81318 5.08156 -9.15434 9.42787 -4.83201 5.43295 -1.44477 2.6455 -8.8907 10.4727 -3.19487 3.21255 -1.47291 3.13113 -4.14796 5.10058 -5.85016 8.41212 -7.58183 8.53659 -9.5978 10.2877 -1.5954 2.58394 -2.65561 4.0975 --0.157024 0.16627 -7.04379 7.75368 -2.39896 2.7728 -2.42376 3.58085 -0.158653 0.857045 -7.82101 9.01833 -6.80499 7.35261 -6.62833 6.66255 -4.90229 5.45681 -8.50205 8.69236 -2.01845 2.06924 -8.2503 9.04222 -4.58265 5.52758 -8.6176 9.74887 -1.28468 1.77019 -5.40424 6.20705 -0.943905 1.98023 -4.2702 4.41287 -3.89454 4.4814 -0.585132 1.56351 -9.45354 10.5374 -3.7501 5.07553 -7.53248 8.14004 -4.60026 4.78921 -1.61073 4.22368 -6.22591 7.40966 -0.57866 1.0522 -5.877 6.55882 -3.54573 3.7731 -7.64294 7.66103 -8.2399 9.14032 -0.307808 0.571367 -7.89791 9.25734 -5.2852 5.84332 -0.45713 2.42223 -7.73426 8.48158 -8.0058 9.46405 -8.03189 8.41868 -1.54624 1.98914 -7.24167 7.27699 -8.61226 8.83199 -5.38365 6.52599 -0.827018 1.51428 -7.19285 7.48372 --0.0969552 2.16007 -4.08084 6.32563 -9.16026 10.2604 -0.206147 0.717435 -4.00643 4.8093 -2.16139 3.14759 -1.73359 3.13485 -9.1103 9.36052 -7.05621 7.43901 -4.83509 6.07581 -5.67164 7.89488 -7.93353 8.18454 -2.59566 3.1842 -3.62521 4.95121 -3.0297 3.18649 -1.08515 2.69289 -3.77063 5.7789 -0.106035 1.27409 -0.601099 2.13481 -6.98837 7.58833 -9.22955 9.79149 -1.6398 1.78726 -2.30423 3.34814 -2.3912 2.81842 -4.71724 6.16966 -5.13553 5.5016 -5.34117 5.45075 -9.32776 10.0676 -4.54244 5.29058 -4.01337 5.73188 -8.17427 8.39652 -1.96122 2.6921 -0.594267 1.00176 --0.136973 0.977133 -6.41362 6.78056 -1.68388 2.39891 -9.50795 10.2315 --0.262703 1.15557 -8.72229 9.683 -5.41821 5.67519 -4.93514 7.15867 -4.07046 4.26702 --0.00866106 0.252353 -8.65877 10.1527 -2.10958 3.40353 -2.94947 3.43201 -6.32014 7.06279 -2.55034 2.89646 -3.87777 5.68044 -2.05325 3.00968 -5.11855 6.55784 -8.99618 9.22608 -3.36303 3.84902 -2.6234 3.70832 -7.35189 8.30856 -6.43777 7.28495 -5.33954 5.48055 -0.15999 0.391114 -3.4492 5.07088 -2.38503 2.42742 -3.88912 4.93246 -2.76303 4.54991 -6.56261 7.60381 -3.64198 3.72471 -1.70542 1.78806 -9.71115 9.88315 -0.471586 1.82377 -9.27611 10.5725 -0.486889 0.851587 -4.39234 5.10637 -9.54209 9.8955 -6.99602 7.42461 -2.98797 3.74623 -5.89424 6.4498 -9.63845 9.86333 -4.39828 5.18646 -2.30118 3.5758 -8.68128 9.56011 -9.00505 10.4304 --0.22184 0.233296 -6.48492 7.60283 -1.54156 2.60693 -4.06808 6.39369 -5.52361 6.26241 --0.698727 0.745524 -2.30742 2.41924 -0.655833 1.65752 -6.94733 7.81866 -7.83136 9.10651 -6.45284 7.1931 -6.09683 6.66159 -9.03299 9.4163 -1.86392 3.26189 -0.54863 2.07194 -0.364026 1.38376 -0.706954 1.0736 --0.111015 0.584367 -1.54265 2.1413 -0.501172 0.57928 -2.09411 2.28902 -1.89894 4.09104 -8.72895 8.87045 -5.27709 5.72545 -0.164581 1.64188 -8.39203 8.73608 -8.21523 8.45002 -9.62006 10.1665 -4.79076 6.26442 -3.44189 3.68669 -8.93789 9.38343 -7.07036 7.64194 -8.34396 9.56445 -8.29992 8.64954 -5.82566 7.83287 -2.43008 3.4476 -1.81121 2.12203 -4.36108 4.3842 -6.28756 6.95939 -3.8698 5.79519 -0.644581 0.699162 -9.71982 10.2422 -4.86545 5.00544 -8.3808 9.29356 -1.34495 1.40972 -1.03641 2.01838 -8.55609 9.99958 -1.40813 3.46097 -3.20928 4.08838 -8.24345 9.11587 -1.27604 2.03462 -8.28298 8.46252 -2.20644 3.19585 -1.91396 2.30108 -4.2553 5.66006 -7.34925 8.38275 -6.28319 7.22199 -8.42171 9.62596 -1.12059 1.18262 -1.37555 1.84196 -4.39663 4.93639 -9.28044 9.58437 -5.47407 6.88593 -8.36529 8.49813 -9.40208 10.5922 --0.451389 1.92404 -2.89431 3.19453 -6.51433 8.02158 -5.52163 6.06786 -7.63525 9.86457 -4.13898 5.05845 -0.136662 0.503748 -6.13492 6.74997 -8.37416 9.18971 -8.64164 8.82663 -0.941173 1.16158 -6.9073 8.26916 -8.37278 8.44326 -8.8951 9.20427 -8.40149 9.17577 -3.60361 4.57183 -8.67263 10.1127 -5.89716 6.45412 -1.97285 2.35593 -7.22973 8.13467 -9.55645 9.92529 -0.261578 0.836274 -9.04414 9.45485 -6.18043 6.54229 -8.88579 9.54087 -1.82613 2.93849 -5.7599 5.96366 -5.23105 5.5541 -0.425229 1.44436 -0.32065 2.60892 -7.83655 9.48786 -2.3168 3.45972 -2.35466 3.23342 -8.24494 8.27258 -7.32678 7.74264 -8.37275 10.0741 -4.17337 4.98348 --0.162009 0.724431 -9.49757 9.76377 -8.69435 9.08089 -4.13841 4.7514 -7.26358 7.55514 -6.91912 6.93 -6.7883 7.18296 --0.614315 1.1857 -6.05907 7.33557 -4.86704 4.87705 -8.50012 9.14836 -1.83683 3.09895 -6.16389 8.39248 -3.03556 4.41004 -4.72416 5.05782 -1.98183 3.19183 -2.77103 5.71501 -4.90002 4.9817 -0.269258 0.725628 -5.59551 7.05038 -2.95416 3.09633 -2.17662 3.18385 -6.67536 7.56762 -7.31678 7.39321 -3.84158 3.85359 -4.38203 5.10149 -0.816784 1.09918 -0.70131 0.739502 -0.276631 2.32633 -9.15839 9.49433 -0.721295 1.97673 -2.63875 2.75437 -5.00344 5.5645 -2.24555 2.81234 -7.74465 9.07646 -2.35244 4.90632 -0.812093 0.954419 -3.97904 5.2071 -4.19177 4.83646 -0.853012 1.331 -2.64112 3.25613 -0.0894716 1.61954 -3.39617 3.40859 -1.56906 2.28518 -2.37258 4.36515 -1.60997 1.7561 -5.15275 5.33281 -6.47824 7.47529 -2.51145 3.29949 -2.71094 2.77785 -8.84653 9.48398 -1.3246 1.66664 -7.43718 7.5546 -3.68985 4.24649 -4.50553 4.51669 -4.15617 4.54887 -8.55319 10.2136 -2.1448 3.55805 -4.64594 4.71505 -1.71763 1.99977 -4.98066 5.46709 -7.7779 8.36497 --0.0604997 0.301294 -5.11873 7.32867 -4.94567 5.5986 -5.32645 6.26835 -2.5768 3.13511 -3.31604 3.87555 -1.60834 2.68762 -3.30552 3.85211 -4.26741 4.98636 -0.820475 1.18854 -7.91501 10.7203 -5.17391 5.30351 -4.00452 5.75141 -2.37722 3.4602 -2.2373 2.94837 -1.62462 3.48264 -7.98507 9.2566 -5.32504 5.56388 -0.760614 0.7802 -0.855659 1.01522 -3.11231 4.43223 -5.62821 6.21564 -4.96845 5.35921 -8.10559 9.11106 -1.02533 1.13103 -6.99976 7.0788 -1.87628 2.58801 -1.11023 2.24655 -5.23343 5.45086 -0.95875 2.25343 -7.45917 8.23614 -2.72245 3.04663 -8.66816 8.70698 -5.55734 7.12262 -1.01935 1.88271 -0.804417 1.76187 -7.82703 8.78426 -4.77321 6.15199 -2.91503 3.69352 -0.776735 1.08883 -5.19981 5.46442 -9.06483 10.4008 -7.72082 8.26398 -2.9854 3.26573 -0.584028 2.60443 -0.700994 1.10379 -5.47612 5.94502 --0.318442 0.986786 -5.0704 5.08055 -3.83732 4.4826 -5.60843 6.59005 -8.81432 9.7851 -6.28792 6.65284 -1.16812 2.27701 -7.15234 9.66795 -9.02188 9.15339 -1.76112 2.04839 -7.49419 7.6204 -5.1765 5.497 -1.45855 1.94969 -1.35003 1.55822 -2.50453 2.86815 -7.10451 8.51352 -3.87727 4.1124 -1.84876 2.79351 -3.01661 4.05396 --0.16814 0.366484 --0.538895 0.608786 -7.59933 9.00744 -0.938648 2.38471 -5.76934 6.16572 -8.20416 8.62505 -8.64542 8.7264 -2.75784 2.7828 -0.794451 1.97817 -9.21331 10.5156 -8.46671 8.80572 -3.94814 5.16845 -6.73654 6.97397 -4.05301 4.93008 -6.37833 6.77985 -7.21161 8.15994 -3.74993 4.61029 --0.127938 1.09853 -2.82957 4.28816 -6.50564 6.59445 -8.37926 8.48332 -0.757443 1.74585 -0.232438 0.972293 -6.99187 8.7098 -7.20368 8.44301 -4.4801 6.07501 -4.34015 6.1495 -2.19394 3.22334 -7.29817 8.41021 -1.16627 2.68901 -4.62423 5.08039 -0.955655 2.22882 -1.45862 3.07065 -1.69815 2.56291 -4.01179 4.36587 -7.135 7.75829 -6.6823 7.27765 -5.44745 5.67195 -4.94594 5.42067 -0.267772 0.301939 -0.676432 1.6296 -1.37335 1.91645 -1.89051 2.38631 -4.84386 6.30539 -8.95613 10.944 -2.18119 2.41821 -5.74901 6.16952 -7.5431 7.88071 -9.05278 9.8128 -0.201334 1.65323 -2.82787 3.82083 -3.07073 3.08475 -8.99671 10.1766 -5.43261 6.12137 -4.83693 4.86848 -6.31804 7.21544 -2.34491 3.2562 -6.05941 6.53725 --0.483381 1.17347 -5.53777 5.72651 -3.28875 3.47472 -3.94609 4.9418 -7.45585 8.6871 -1.50066 2.57215 -8.10112 8.67954 -6.24737 6.42635 -0.64413 1.05759 -7.1741 8.21476 -0.502722 1.77462 -0.783663 1.74174 -9.52704 9.9109 --0.473873 2.01013 -7.07946 7.11474 -0.857335 1.6501 -4.00225 4.84453 -5.40598 6.30573 -8.18802 8.30067 -9.00412 10.9588 -9.8362 10.1517 -7.62735 8.37572 -3.41477 4.63099 -2.51254 2.81559 -6.36702 6.56061 -5.11842 5.35515 -5.21873 5.73296 -5.73528 7.77276 -3.64993 4.66826 -7.12664 8.46553 -8.7257 9.16851 -1.27615 2.20376 -7.46188 8.20752 -2.64939 2.66373 -4.94147 6.0509 -6.3805 7.48841 -6.25197 7.12327 -0.0885331 1.2682 -4.97356 6.58488 -4.11917 4.27267 -9.08793 9.70385 -0.897277 1.31702 -6.87538 8.25544 -1.55565 1.59492 -2.62483 3.54274 -1.49631 2.92263 -9.45305 9.97728 -6.24087 6.4577 -3.94636 5.13669 --0.000956745 1.08235 -1.46134 1.83767 -9.18517 10.6601 --0.740186 1.81269 -5.81977 6.15818 -7.0529 7.99421 -6.17753 7.49749 -8.63091 9.04205 -9.65219 10.1558 -3.12839 4.99211 -2.97262 4.07384 -4.28605 4.33171 -4.15906 5.6805 -1.35165 1.50732 -0.524207 2.12307 -5.32468 7.01472 -3.16982 4.87893 -6.88786 8.34191 -3.81703 5.22335 -3.86772 4.37359 -8.19386 10.0705 -1.73155 3.16695 -4.31685 4.62261 -9.40618 9.89612 -4.41215 5.19659 -2.35595 2.63543 -7.88481 8.14203 -7.17062 10.3534 -9.41379 10.389 -7.99867 9.01239 -3.31382 4.04915 -5.39222 6.07657 -8.5187 8.65976 -9.30132 10.6131 -7.17351 7.93596 -4.80134 6.72724 -3.59756 4.65182 -1.08248 1.17479 -1.03124 1.06871 -6.43154 6.95098 --0.102199 0.59801 -4.94795 5.18081 -6.39126 7.30258 -1.52738 2.04271 -1.80373 2.33093 -2.72251 3.01677 -0.296722 1.10844 -6.39104 6.51567 -8.70965 8.78714 -2.07858 4.41695 -1.91027 2.9718 -1.42944 2.01864 -1.96347 2.73397 -4.0701 4.22456 -4.02859 4.05107 -7.10977 7.98092 -8.21148 9.54287 -6.59231 7.65109 -0.144191 0.830665 -2.0192 2.23704 -8.03482 8.39591 -8.90473 9.98543 -2.18284 2.70166 -3.05569 3.54238 -8.35319 9.39539 -2.00803 2.42866 -2.35282 3.13763 -2.20155 2.79377 -1.76531 2.94892 -7.52749 7.72567 -3.02266 3.24778 -4.01741 4.22521 -9.75263 9.91571 -6.45502 6.67838 -2.24912 3.47262 -1.84372 2.26517 -4.09559 5.71188 -1.43811 2.33732 -3.89171 4.16905 -3.01506 3.9725 -0.0273168 1.51766 -5.04118 5.80507 -3.08517 4.17316 -8.81637 8.8332 -8.74055 9.50143 -2.36904 2.69008 -6.39733 6.44221 -8.53272 9.51114 -9.48423 9.55002 -8.65645 9.04872 -6.66352 7.48009 -5.64389 7.88656 -5.75301 6.6759 -3.28645 4.22757 -4.99482 5.82988 -3.00004 4.0273 -1.45249 1.56662 -4.96263 5.32195 -7.91351 8.1437 -1.02034 1.56249 -0.71376 1.73319 -0.709968 1.44651 -9.01414 9.54799 -4.02116 4.68005 -7.10903 7.27075 -7.21322 8.71031 -1.6644 2.27186 -3.71304 4.68764 -9.66257 10.1452 -5.34477 5.46136 -9.27722 10.583 -3.82328 4.83316 -4.77019 5.07928 -9.07112 9.23836 -6.99091 7.25634 -2.11871 2.3054 -7.88242 7.98572 -0.570809 0.714073 -8.51532 9.49151 -0.329247 2.48897 -4.78202 5.36476 -1.47969 2.78867 -6.75011 7.36769 -2.31162 2.39533 -3.50434 4.48026 -5.84603 6.28861 -7.5337 7.62538 -1.09955 2.85741 -6.09915 7.20381 -0.933825 2.37925 -0.576363 2.0182 -3.12126 3.22507 -2.85313 3.02656 -3.25724 3.92077 -5.48575 6.58011 -1.02824 1.65415 -8.68703 9.06219 -3.28389 3.86349 -5.80264 6.12775 -7.11846 7.47444 -1.29638 3.38601 -6.37908 7.05986 --0.592438 0.854361 -0.39233 1.17768 -2.1497 3.94423 -2.42336 2.43441 -6.94806 8.30626 -0.79865 1.4173 -1.41455 1.43684 -0.240074 1.16712 -4.18593 5.9929 -6.161 6.564 -0.726091 1.90706 -0.375606 0.694866 -4.09349 4.26452 -2.01652 2.68038 -8.99301 9.90549 -8.93909 9.17673 -1.10427 2.01247 -9.12668 9.15282 -1.08098 1.55374 -0.377836 0.414809 -7.28611 8.86318 -8.3542 8.53251 -3.86353 4.12875 -6.7631 7.40068 -4.61679 4.78182 -2.12935 3.45492 -3.68233 4.0457 -6.68131 8.22111 -8.79197 8.80474 -1.8915 2.26287 -0.387586 3.073 -6.46798 7.57381 -7.79742 9.34526 --1.21538 1.67303 -2.07845 2.66028 -3.14148 4.46647 -1.66789 2.73375 -8.49821 10.0574 -8.42537 8.89906 -0.618349 2.72887 -6.8229 7.54501 -6.99343 7.35322 -7.34223 8.68781 -3.18834 3.98274 -8.86908 10.2535 -3.39839 3.76171 -0.188168 0.392276 -1.68187 3.53401 -6.50423 6.71714 -7.61191 8.89715 -1.68463 2.09275 -5.94627 7.6003 -2.15865 3.24126 -7.93639 8.53826 -2.99626 3.43273 -7.71028 8.41172 -3.19472 4.60878 -8.36123 8.92549 -8.92975 9.02783 -2.87187 3.49672 -6.76949 7.71139 -8.09121 9.31151 -6.84199 7.44009 -0.730655 0.800873 -7.5208 7.54109 -6.75992 7.55017 -6.09818 6.17399 -0.639209 1.27283 -3.01917 3.22327 -1.69181 2.60614 -9.49245 9.5842 --0.418034 1.08035 -5.77705 6.4705 -6.79362 8.51993 -9.73155 9.81609 -3.71503 3.92022 -6.18589 6.77634 -3.94124 4.23942 -7.59911 8.05275 -3.68865 5.10948 -7.63926 8.63019 --0.049855 0.0844425 --0.41188 0.807786 -1.35962 1.81039 -5.40579 6.15098 -1.38594 2.0059 -6.93444 8.71958 -7.01229 9.38008 --0.0974976 0.962679 -4.74131 6.59152 -1.02343 1.59245 -1.55629 1.9128 -6.28353 8.38021 -5.66349 5.79644 -1.72629 2.28563 -1.64539 2.82654 -0.359466 1.05106 -4.37569 4.82703 -5.87657 6.37853 -1.46316 1.65333 -7.44494 7.5985 -1.16846 1.98579 -4.43371 4.93234 -2.31838 2.47777 -7.52687 8.44423 -6.08056 7.42253 -9.16144 9.94783 -4.74382 4.95616 -0.248344 1.05335 -6.12345 7.43941 -9.45647 9.99799 -3.77124 4.75199 -3.31315 3.44873 --0.0909828 1.51271 -7.03234 8.02546 -8.11403 9.11461 -6.734 7.34799 -1.08903 1.18319 -2.72871 4.31607 -6.53688 7.52754 -1.07868 1.27792 -6.28409 6.56795 -4.89866 5.79458 -9.06994 9.1221 -2.54989 3.14338 -3.69971 5.71717 -3.7113 4.55076 -8.91864 9.64522 -8.75634 8.82359 -9.02242 9.03869 -3.59945 4.20169 -4.98557 5.07401 -4.81526 5.74009 -7.264 8.63749 -2.79579 4.43389 -2.87204 4.66432 -2.32487 3.72127 -3.99704 4.72567 -8.17229 9.0158 --0.72926 0.823658 -2.52355 3.32725 -5.3446 6.63868 -4.48935 7.37833 -3.08173 3.0968 -2.41585 3.23026 -9.23187 10.5413 -5.50099 5.51888 -1.29634 1.88846 --0.0113225 1.41526 -6.34508 7.53417 -0.383019 2.25144 -5.0649 5.40222 -3.08221 3.76296 -9.29111 10.6833 -2.19714 2.94735 -8.75711 9.48583 -8.61564 8.69349 -1.9362 3.96191 -3.7962 4.44382 -7.78501 9.03843 -5.79649 7.29675 -6.03048 7.4316 -1.31105 4.36446 -6.5882 7.03622 -4.88148 7.12474 -6.62305 6.90973 -2.27488 2.73731 -8.42703 9.28888 -7.72928 8.53989 -7.27021 8.63879 -0.992908 1.92001 --0.282737 0.511292 -7.88963 8.03117 -6.93371 8.26148 --0.0346633 0.403617 -8.7827 8.82558 -5.16876 5.59742 -8.61275 8.73843 -5.70578 6.02783 -9.08706 9.35903 -9.32728 9.83021 -9.20058 10.2497 -6.79824 7.3024 -7.17979 7.51783 -0.918555 2.67878 -7.9662 8.63241 -8.85903 10.3145 -9.34614 10.1964 -9.05027 9.79872 -8.28959 8.45837 -1.32518 2.04557 -8.72848 9.16742 -5.92126 6.77277 -8.31504 8.78631 -1.02487 1.70172 -4.45204 4.72842 -8.20636 10.4724 -5.86211 6.25457 -6.15754 7.71303 -8.37832 8.82577 -4.25233 4.59417 -9.41451 9.95324 -9.372 10.4461 -1.8346 2.7144 -8.00681 8.14717 -7.03997 7.06753 -7.16892 7.70102 -7.01781 7.46799 -1.78526 1.7969 -1.63304 2.2011 -8.59718 8.61083 -9.43498 10.3636 -4.98718 5.32487 -3.65451 4.89601 -8.82368 9.11333 --0.104862 0.598773 -4.97756 5.62342 -1.99876 3.24686 -2.32242 4.01096 -4.04914 4.77892 -3.81545 4.32583 -3.30153 3.46783 -3.14287 4.04718 -8.65711 8.76768 -9.09385 10.6898 -4.82771 5.64405 -5.98783 6.36785 -7.93397 9.6543 -4.89726 5.65486 -5.08717 5.22314 -6.59377 7.23748 -3.58289 3.98597 -0.177884 0.397629 -5.30856 5.79257 -2.53943 3.98007 -6.51217 6.59644 -0.196888 1.99904 -3.8709 4.1901 -2.37646 2.50997 -7.03837 8.13287 -6.8674 6.89535 -0.576964 2.08851 -0.902928 2.86981 -8.59261 9.20279 -5.96621 7.49899 -0.617602 1.83267 -2.29189 2.6361 -4.34207 4.61026 -6.19963 6.76443 -1.15955 1.44068 -5.25852 6.33905 -6.37306 7.53103 -9.13334 10.039 -8.67743 9.93959 -5.62973 6.04375 -8.32286 8.77042 -3.28772 6.1722 -4.97902 5.47249 -3.37765 5.07238 -4.58025 4.84341 -2.76807 3.18817 -4.27581 4.43023 -6.92572 7.68461 -0.279247 1.0561 -1.10903 2.61106 -6.71708 6.73132 -2.66415 3.75702 -8.0513 9.80334 -4.82466 6.04232 -2.59971 2.85768 -9.04689 9.73945 -3.48338 5.16622 -7.90925 8.92774 -7.30264 8.06247 -7.59087 8.26476 -0.150315 0.423068 -8.62726 9.74636 -9.01983 9.71707 -6.84007 7.40541 -8.87829 9.48342 -2.69214 3.71481 -0.580036 0.77289 -9.474 9.83397 -5.80151 6.08527 -3.63837 5.27137 -8.5848 8.65779 -7.88338 8.13276 -3.27992 4.20963 -6.21244 7.28079 --0.348924 1.38478 -5.26688 5.93787 -3.78941 5.01009 -6.41929 8.38529 -1.41724 1.67733 -0.212821 1.58246 -0.0697189 0.160497 -9.57839 10.2377 -9.03332 9.70645 -4.94572 5.15163 -3.16999 4.536 -5.77494 6.68359 -5.89258 6.11852 -7.72257 8.21668 -8.42501 8.44905 -8.7196 8.86465 -4.392 5.1076 -1.88249 2.54422 -1.38092 1.60326 -5.04142 6.37374 -4.31795 5.91152 -1.79399 2.09314 -6.65405 8.32262 -1.36356 1.58538 -5.45456 6.55824 -4.95807 6.22848 -8.72077 10.2825 -0.745968 2.01546 -6.85041 7.11076 -4.82028 5.34442 -5.77673 8.01294 -8.58582 9.33714 -8.49884 9.21533 -9.05574 9.4096 -3.19932 3.27024 -9.50227 9.96685 -0.771636 1.0617 -9.00621 9.36397 --0.097167 1.39463 -7.79622 8.43537 -8.05228 10.1504 -2.21685 4.17072 -1.82476 2.45381 -4.34408 4.56578 -9.27538 9.54701 -6.80153 7.44115 -7.38884 7.84448 -7.17526 8.00165 -5.85812 7.67326 -5.25545 6.30791 -5.68518 5.94055 -3.77685 4.1545 -0.530928 0.737248 -3.9772 4.59563 -8.96322 9.45618 -7.98322 8.44165 -3.42929 4.22329 -3.66445 4.7583 --0.183652 0.434842 -3.16492 3.95726 -6.87407 7.89944 -5.08921 5.7745 -2.85466 3.04505 -7.12685 7.41248 -0.715419 0.876676 -3.47441 5.21753 -9.13594 9.87799 -5.52459 6.35691 -5.12544 6.12935 -2.44296 2.91543 -2.75148 4.19886 -1.43478 4.3919 -6.6352 7.07768 -4.72283 5.11506 -6.36434 7.69268 -2.32643 2.75289 -5.46566 6.22854 -6.37995 6.76989 -1.52564 3.55871 -1.05807 2.19393 -1.95374 4.08727 -8.11273 8.12767 -2.85955 4.71355 -4.89009 6.88516 -2.06859 2.25512 -7.50556 8.77923 -4.43353 5.11915 -5.16308 5.9695 -1.12072 1.69277 -3.96494 4.38143 -7.06931 7.89524 -0.514522 1.51265 -6.56389 7.01146 -1.51362 1.8541 -4.90339 5.51209 -2.11422 3.15457 -2.50094 3.92557 -8.24319 8.62826 --0.0843505 0.710377 -6.35956 7.89457 --0.790954 1.2964 -4.02253 5.19193 -2.7425 3.46763 -9.41469 10.1367 -1.57636 2.25105 -3.18647 3.38738 -8.36644 9.66791 -0.180846 0.461221 -7.07675 7.71881 -0.265366 1.19275 -5.43007 6.4854 -9.13912 9.23294 -9.52905 10.4029 -1.18712 2.66227 -5.22714 5.62601 -1.87413 2.8716 -5.71882 6.16374 -5.38169 6.13948 --0.196005 0.236738 -5.36803 6.4395 -8.27713 8.71262 -8.82031 8.8598 --0.53845 0.564783 -1.80716 1.94173 -5.67905 7.47291 -2.37779 3.64893 -0.574727 0.766424 -4.60701 4.86591 -3.17989 4.37738 -1.36777 3.15112 -1.48092 3.06573 -3.37009 4.06028 -4.17179 6.2073 -6.47953 6.88994 -5.74431 6.5253 -4.88827 5.49049 -5.44148 5.59239 -1.66153 2.63132 -7.69387 7.82267 -5.20911 5.48488 --0.103218 0.497402 -7.18003 7.33324 -6.54305 8.81732 -0.278108 1.27452 -2.38323 2.94772 -1.2461 2.03246 -5.47052 5.75781 -7.31505 7.35895 -2.22248 4.23589 -0.0305319 0.430773 -8.32043 10.1222 -6.11732 7.09764 -5.08797 5.74991 -6.62491 7.34164 -5.55795 5.66083 -3.27549 4.13145 -1.0113 3.24631 -0.0717186 0.519738 -7.82905 9.30839 -9.90251 9.98691 -0.841457 0.952276 --0.133927 0.510174 -1.14614 2.82218 -2.59767 4.19742 -3.41095 3.95265 -3.38951 3.75838 -8.86766 9.19437 -9.27927 10.261 -2.33249 2.79402 -5.69681 5.93469 -4.02502 5.38732 -0.797157 1.22845 -7.23558 7.8651 -1.1253 1.99184 -8.58296 8.64267 --0.400141 0.74698 -3.46677 3.50526 -6.03252 6.64842 -5.8493 6.68938 -3.53209 3.84014 -7.22078 8.98106 -6.21943 7.69944 -0.887198 2.07323 -3.36591 4.57442 -4.30143 6.41179 -4.07556 4.54276 -8.77552 10.0615 -6.7247 7.04044 -9.05494 10.1126 -7.46604 7.80632 -3.38601 3.8043 -5.60475 7.02788 -9.09811 9.4654 -9.33447 9.80012 -8.66499 10.1002 -3.87007 3.88281 -2.87624 3.11359 -5.92385 6.80801 -4.49711 5.01863 -8.84524 9.36225 -6.40944 6.82093 -2.90915 3.68288 -3.96801 4.82534 -5.51744 5.84233 -3.2959 3.44409 -0.18526 0.207322 -5.49717 5.72648 -6.9522 7.1952 -0.769572 1.79343 -5.95522 6.03918 -6.54327 7.7475 -2.13516 3.83957 --0.388892 0.775076 -1.30128 2.29414 -9.76761 10.1604 -7.38731 8.66002 -7.09229 7.43495 -9.1379 9.52432 -6.75942 7.88717 -7.42824 8.82063 -6.93078 8.19884 -2.307 2.93836 -8.38254 8.84691 -3.90159 5.37938 -0.0413204 0.112203 -0.638217 1.53943 -0.88678 2.49435 -1.99104 2.60847 -6.61595 7.65064 -2.37641 4.71719 -7.94945 9.21404 -5.44594 7.13646 -5.45737 6.12335 -7.39207 8.02885 -5.51588 7.39341 -8.1581 10.0632 -0.197869 1.44516 --0.0161139 0.73487 -4.24155 4.7304 -0.00374564 1.26481 -8.1878 8.20011 --0.115544 1.74771 -0.912347 2.52922 -2.72234 4.83268 -6.45577 7.07776 -9.74201 10.1772 -7.11008 8.72914 -4.41921 4.8673 -7.97673 8.36658 -0.438659 0.647061 -4.35086 5.44482 -8.22919 9.34379 -3.53242 5.65576 -1.126 2.32177 -5.95118 6.51364 -3.10519 3.9447 -1.28889 2.26267 -7.04255 7.67791 -3.12614 3.17626 -8.09968 8.49162 -6.07924 7.219 -5.99554 6.52549 -9.14378 9.5773 -5.82872 6.53112 -9.3361 10.1704 -4.3751 6.51675 -3.288 3.98328 -4.56342 4.80185 -7.16574 7.43901 -7.7638 8.47758 -7.31514 7.78499 -7.98942 9.50252 -4.31211 4.70724 -2.9094 3.33304 -0.108736 0.668815 -8.08409 9.11098 --0.0053985 0.589992 -1.31926 2.72153 -2.28664 2.38813 -7.95237 8.26388 --0.0283047 0.452099 -7.50295 8.71708 -7.72356 8.63468 -3.48953 3.89579 -7.73814 8.73456 -4.54487 5.45817 -6.45109 7.00312 -3.99915 5.41716 -6.81436 8.5682 -6.86726 7.55999 -2.67863 3.7053 -2.6837 3.39567 -2.84347 2.91724 -5.79383 5.80493 -2.41217 3.0619 -8.78163 9.0998 -1.43456 2.50854 -6.73393 8.53005 -3.02563 3.56456 -3.34628 4.2934 -2.44985 2.92819 -1.38262 2.89341 -4.56337 5.75702 -0.275735 1.16604 -1.39763 2.8108 -9.69128 9.90361 -8.54868 9.66756 -3.01838 3.72831 -8.34017 10.5262 -1.82721 3.0476 -5.9732 6.83307 -2.77874 4.25603 -1.71987 3.1227 -6.33773 7.89103 -1.31982 2.82992 -4.21601 4.9627 -6.68166 6.72653 -0.87708 1.06828 -1.03483 1.26625 -2.996 4.03087 -1.54718 1.57452 -2.33087 2.38226 -2.29464 3.36496 -2.03064 3.41867 -5.8456 6.10406 -7.54614 8.2874 -1.42938 2.89154 -2.65935 3.53883 -3.98845 4.42049 -6.85632 7.15487 -8.12038 9.34993 -0.873558 1.32129 -6.61595 8.00766 -9.49147 9.81947 --0.0225601 0.328769 --0.481519 1.37204 -6.31457 7.45251 -4.59738 5.81395 -4.83304 5.63008 -1.95746 2.78657 -2.97889 3.74408 -9.08327 10.702 -3.58219 4.93634 -7.87068 9.77851 -0.330978 1.36031 -4.78145 5.36918 -4.94672 5.56644 -7.66806 8.08613 -4.78512 6.35461 -5.17367 5.74386 -8.65884 9.97088 -9.22053 9.60447 -6.15061 6.58817 -0.0875971 0.541643 -6.45597 7.92002 -0.636824 1.05267 -5.31677 6.12838 -6.51127 6.6731 -0.459551 1.69382 -5.75106 6.41377 -3.68438 4.67415 -9.36302 9.78281 -5.46195 7.99215 -2.55471 2.59231 --0.0640245 1.33755 -9.36027 10.6198 -2.67955 2.77882 -3.51443 4.10619 -6.83904 7.23692 -2.59553 2.81418 -7.74628 8.95169 -3.86464 3.90067 -3.32377 3.992 -1.43737 2.52191 -3.83927 3.99402 -5.24426 5.35179 -0.833857 1.05277 -8.4062 8.51964 -9.62299 9.66254 -3.55427 5.19048 -1.7003 2.62107 -6.8059 7.49246 --0.761104 0.773528 -1.37137 1.95048 -2.1222 2.59387 -0.633505 2.04796 -0.605156 1.04336 -7.22842 8.3365 -4.28716 5.28921 -8.14286 9.52015 -7.62467 9.18603 -1.11029 1.81278 -5.05654 5.13597 -0.862653 0.97827 -7.24766 7.92167 -8.80103 8.91467 -3.05841 4.82292 -1.28204 1.55969 -1.58886 2.57874 -0.0537678 1.28837 -8.09303 9.71678 -8.37599 8.85705 -3.18107 4.01971 -6.67019 7.75848 -6.29836 8.21603 -0.86271 1.30358 -3.86126 6.49694 -5.84446 6.24913 -0.475025 0.598151 -6.3477 7.08327 -3.60161 4.51824 -7.13317 8.13858 -4.89052 6.23701 -5.69441 5.99027 -7.18735 8.34853 -9.30182 9.34894 -6.06589 6.15141 -8.05917 8.89642 -5.6136 7.14058 -0.838337 0.959487 -0.56421 2.00841 -6.46876 6.63629 -2.4434 3.92184 -7.97216 9.45372 -8.17926 8.66756 -1.86522 2.01888 -0.983342 1.89079 -2.07322 2.09765 -3.52974 4.73717 -3.24973 4.88691 -5.47789 5.95384 -4.11218 4.57076 -6.61174 7.47165 -8.09302 8.36193 -1.67911 1.69022 -4.436 6.17515 -5.6544 5.74951 -1.50354 1.76043 -4.41433 4.83589 -1.82528 3.53979 -3.98749 4.65527 -6.42503 7.5787 -8.69554 10.1767 -8.39215 8.56999 -8.71646 9.66209 -1.59091 3.39622 -6.12574 6.94955 -7.92527 8.25049 -9.19858 9.49137 -2.73382 2.97747 -4.56558 5.94738 -8.33983 8.58548 -9.00798 9.01838 -4.93268 5.28383 -3.15356 3.58606 -8.28171 8.79351 -1.47358 1.9581 -0.891797 2.05345 -1.56032 2.38159 -2.5152 3.80485 -8.0963 9.88138 -1.1262 1.89279 -7.99336 8.2352 -5.25067 5.41251 -4.57532 5.20101 -1.87911 4.59415 -4.25142 4.70467 -8.18782 8.76989 -9.20478 9.3612 -7.70898 9.7752 -0.655865 0.958924 -4.8883 5.77477 -3.03279 3.47456 -1.01979 1.41661 -8.94219 10.6987 -2.49348 4.58195 -2.44003 3.29005 -3.4725 3.55572 -9.3917 9.95851 -7.08658 7.47686 -3.56413 4.44089 --0.47868 1.11453 -6.82615 8.00596 -3.49451 3.74705 -8.13286 8.47976 -7.01732 8.82556 -1.19064 1.48887 -5.28851 6.88637 -8.83175 9.49879 -0.939903 1.17024 -7.49124 9.01906 -2.9285 4.23224 -5.68296 6.86273 -8.53897 8.77886 -2.9107 5.01232 -0.748655 1.10265 -4.77258 5.12626 -3.995 4.75289 -2.71467 4.26926 -6.21665 7.16233 -4.53883 5.75731 -4.37153 4.76125 -7.47635 8.75777 -4.82013 6.4699 -9.36015 9.58451 -4.43054 5.86752 -2.10934 2.34705 -3.00306 3.06539 -7.81957 8.44081 -1.97221 3.06916 -0.153393 0.503956 -5.05611 5.27536 -5.73277 5.89001 -3.64807 4.85582 -6.13416 6.1528 -3.85511 4.14045 -0.411725 1.36529 -2.26932 2.5447 -3.51164 4.93266 -2.50955 4.34201 -8.74663 9.39268 -6.2229 6.39303 -4.38059 4.91592 -7.29109 8.62318 -6.31801 6.99532 -9.75036 10.0514 -1.69019 2.41527 -4.20462 5.27729 -6.32944 6.94729 -3.5736 5.21496 -4.48316 4.61828 -1.76915 2.43263 -2.42026 4.09159 -2.08762 2.43074 -5.48161 6.02473 -5.51826 7.47042 -2.78026 3.1552 -7.89469 9.49867 -3.09084 4.54697 -7.20417 7.42408 -5.36528 5.74851 -1.86239 2.41988 -1.55994 2.85743 -4.40182 4.6638 -7.91619 9.01242 -3.08119 3.74714 -1.54108 2.08538 -3.61461 3.64631 -8.76851 9.66257 --0.645571 1.3366 --0.707083 1.21005 -7.19571 8.23405 -5.42865 5.89329 -2.12897 2.59222 -0.603102 0.930391 -3.75025 4.63181 -6.14867 6.4526 -7.30947 7.51461 -7.83183 8.79802 -6.06658 8.53246 -1.67895 2.50063 -1.14179 2.04478 -8.59583 8.90112 --0.918885 1.30717 -0.182607 0.613593 -3.3335 3.77196 -0.783053 2.4368 -6.49331 7.60104 -2.85101 3.28637 -7.42273 7.66905 -3.96433 5.02573 -8.26262 8.40749 -9.24451 9.32783 -4.89036 7.07214 -6.45431 6.96815 -5.20701 6.58747 -7.40142 7.98615 -4.19768 4.9831 -3.32546 3.88811 --0.471996 0.967855 -9.36172 9.63532 -1.96831 3.00632 -7.537 9.72671 -4.67746 4.81135 -3.10782 4.93642 -4.94809 6.54855 -4.16763 5.25628 -9.04992 10.316 -0.668935 0.680886 -4.02935 4.84503 -5.32499 5.76636 -5.32267 7.15457 -5.18886 5.23491 -4.37053 5.36801 -2.39955 2.74657 -8.19764 8.86645 -4.24706 5.69703 -1.87851 2.36988 -0.886553 1.05064 -7.27428 7.90224 -9.08417 9.44879 -3.11534 4.02019 -6.3284 7.39925 -4.96029 5.59076 -2.58248 3.11741 -7.76513 8.13505 -4.93613 6.51523 -0.565355 1.70512 -2.12366 3.0319 -5.32422 6.84146 --0.135396 1.08591 -3.7901 4.86303 -4.49677 5.41847 -0.615748 0.834712 -0.64784 1.81859 -6.65505 7.13894 --1.12744 1.61017 -0.550814 1.24316 -6.66639 6.89866 -6.19271 8.17468 -3.09382 3.78684 -4.41221 4.95889 -7.96091 8.48824 -8.32129 10.2917 -2.13168 2.19835 -1.4635 2.38989 -5.78102 6.42215 -1.70153 3.20616 -5.35068 5.71016 -4.27702 4.37203 -5.13888 6.04764 -4.79644 5.37927 -6.75314 7.66368 -6.04484 6.84064 -4.34947 4.45643 -9.08755 10.396 -0.88804 2.17441 -6.86788 7.88301 -7.94296 8.61664 -8.02387 8.79591 -1.79024 2.40559 -5.50404 6.01044 -7.76772 8.1932 -1.174 1.23693 -6.20571 6.9224 -4.20863 4.48702 -4.16743 4.39075 --0.11965 0.120778 -7.01234 7.52619 -5.91415 6.46151 -5.28713 5.72354 -6.26981 6.31237 -0.643056 1.43864 -1.62562 1.99875 -0.544992 0.721386 -6.92522 7.09165 --0.107048 1.12273 -0.644674 0.91244 -8.56904 9.01883 -2.23079 2.56598 -9.79034 10.1123 -8.13788 8.4131 -1.86753 1.95236 -2.97577 3.33272 -8.57454 10.0193 -1.20043 1.53408 -3.43515 3.86571 -5.79075 6.41293 -1.71558 2.52845 -2.39907 3.46652 -9.08289 9.91182 -0.859644 1.07475 -5.30144 5.42157 --0.441497 0.890794 -3.55044 4.14918 --0.340115 1.19239 -6.5534 6.76908 -0.836514 2.09196 -8.15747 8.96484 -4.80087 5.14227 -7.72071 8.88223 -5.11901 5.65559 -4.44996 4.63562 --0.328404 1.3002 -0.90759 1.34556 -5.94839 6.35058 -1.76504 1.78344 -1.32585 2.08994 -7.18641 8.20945 -0.62657 1.06025 -6.28086 6.40975 -5.05525 5.16143 -5.82694 8.07685 -6.23677 7.55394 --0.226265 0.661443 -1.42599 2.36325 -9.04445 9.92971 --0.169286 0.185741 -8.34636 10.9042 -9.52494 10.0475 -8.39989 10.1377 -3.89956 4.70428 -3.98673 4.97185 -5.43008 5.67936 -7.76475 7.98591 -4.46895 4.73188 -0.584662 1.54474 -2.12622 2.79994 -1.40578 2.2461 -1.45171 2.02105 -2.05665 3.04611 -2.29818 2.68118 -1.77344 2.98698 -4.92092 5.55302 -7.18758 8.37525 -8.83407 10.0565 -2.91182 4.71932 -6.47293 6.74664 -2.49238 3.69749 -0.487234 0.541003 -4.703 4.92744 -9.8867 9.94918 -1.7713 1.9792 -5.68316 6.90242 -5.62485 6.70656 -7.24837 9.60197 -7.71147 7.76519 -5.22324 5.30661 -9.11258 9.28071 -8.2827 8.90115 -8.90865 9.42138 -7.47233 8.72308 -4.89712 5.65153 -4.12392 4.20239 -5.65325 6.55887 -8.65945 9.05845 -7.9165 8.36489 -1.4952 2.43991 -5.49665 5.80793 -1.67206 2.55302 -0.943544 1.58521 -0.47 0.860959 -6.47638 7.43101 -4.38434 5.97278 -8.12782 9.10574 -5.78143 6.6539 -9.23616 9.40513 -1.6845 2.00736 -6.56955 7.37847 -7.42993 9.04718 --0.179632 0.450904 -8.65819 9.07724 -7.86567 8.80824 -1.85428 2.7755 -2.29222 2.65374 -4.03614 4.51729 -6.9326 7.07635 -5.50807 6.498 -6.17637 7.26432 -8.7688 9.16308 -7.65 8.88604 -3.74495 4.29991 -8.5671 10.5661 -7.41964 8.21083 -8.04302 9.78783 -0.269663 0.317601 -8.29804 9.40991 -3.90673 4.22298 -8.82384 10.9441 -7.27081 8.19548 -1.30184 1.98993 -8.13028 8.92385 -7.21224 7.35137 -5.02122 5.69666 -0.817219 0.974073 --0.128067 0.589359 -2.12137 2.74019 -5.24657 5.44714 -1.55805 3.10332 -9.91031 10.0748 -7.13941 7.9143 --0.183908 0.934079 -3.987 4.11053 -3.26678 3.67608 -9.75921 10.1121 -0.755391 1.06346 -7.28479 7.49982 -1.37522 3.80623 -0.944351 1.46531 -9.49278 10.2372 -8.28946 8.67597 -9.43537 9.58003 -7.73357 8.756 -2.64043 2.8687 -4.70448 6.99929 -3.82199 3.89343 -3.43825 4.10908 -4.42362 5.69086 -8.08536 8.60142 -8.43208 9.31272 -7.5889 8.39208 -7.90112 7.9734 -6.10381 6.80568 -8.76283 8.80151 -1.46728 2.53288 -1.68884 2.47102 -7.63343 8.29838 -9.18852 9.5558 -0.977174 1.4792 -4.7577 5.74873 -4.66433 6.37375 --0.0952277 0.378184 -5.30929 6.07469 -4.98811 5.16146 -3.0744 5.59799 -0.944909 1.25222 -1.38561 2.51277 -3.77811 4.23459 -2.11604 3.32458 -0.920929 1.17187 -5.23496 6.34905 -6.9953 7.65745 -4.81803 4.89553 -4.69301 5.36777 --0.208926 2.6111 -7.97334 9.83269 --0.396673 0.779988 -5.91367 6.47682 -6.27249 6.83533 -5.58931 6.89679 -2.03394 2.67025 --0.197752 0.383167 -4.69751 7.695 -4.5989 6.07875 -3.7285 4.27396 -7.9807 8.27693 --0.00248985 1.30934 -2.68016 3.916 -0.881558 1.14567 -4.77066 5.05302 -0.552268 0.919467 -2.46862 2.65199 -1.4009 2.51701 --0.171185 1.28252 -9.27842 9.90243 -3.51778 3.57728 -6.10071 6.92163 -9.05387 10.0894 -5.52995 5.89082 -8.40216 9.0272 -9.02911 10.1602 -4.85818 7.38829 -1.6762 2.32334 -6.45416 8.62337 -5.44592 6.0245 -3.45876 3.94274 -9.07144 9.16725 -6.51885 7.6363 -7.92593 9.01986 -0.270702 1.57395 -6.11245 6.70173 -1.37658 2.19068 -2.42668 3.43827 -7.98226 8.43306 -3.72269 4.74654 -8.16252 8.58873 -8.81456 9.5363 --0.338386 0.864811 -1.90693 2.25796 -3.5305 4.17475 -6.07997 7.67393 -0.53347 1.68815 -7.31182 8.44458 -7.77462 8.33613 -3.79975 4.15552 -9.08822 9.9771 --0.101698 1.05442 -8.44869 9.95724 --0.0318759 0.532673 -8.09238 9.51356 -5.51514 6.60799 -8.66528 10.3297 -8.25556 9.97893 --0.220428 0.247563 -0.00453913 0.540444 -1.53599 1.61735 -3.77213 5.06896 -2.65332 2.75864 -6.05811 6.43112 -0.302534 0.803651 -0.393766 1.11611 -9.31035 9.62387 -0.568281 1.7765 --0.721118 1.27387 -1.83573 2.62578 -1.39953 1.91158 -6.51883 8.52813 -2.60154 2.95054 -6.58322 9.37818 -5.61178 5.67661 -9.56511 10.2767 -9.09174 10.0697 -2.55846 3.39943 -8.38146 9.06138 -7.97019 8.18074 -6.1426 6.42787 -1.15876 1.55463 -2.93483 2.96376 -7.23883 7.29158 -9.64606 10.0674 -4.89825 6.70366 -7.35635 7.96328 -2.2702 2.36797 --0.0464389 0.395244 -1.14883 2.10411 -4.7309 5.10593 -6.07946 7.37741 -5.50202 6.28822 -3.66574 3.96271 -1.9944 2.3862 -7.58159 7.59275 -1.98712 3.30587 -2.10317 2.89161 -9.66889 9.97287 -1.57327 2.15421 -8.14125 8.30983 -3.77185 4.12658 -8.51624 9.51485 -9.25211 9.722 -2.06312 3.0453 -9.34954 9.91254 -7.31475 8.89322 -7.85044 9.20242 -0.226243 1.28465 -0.0260868 0.575177 -9.40743 10.1655 -4.04324 5.05341 -1.02626 1.48332 -3.33074 3.72025 -9.2005 9.61387 -6.68317 7.14109 -6.82083 8.6312 -4.34816 4.50329 --0.48874 0.975608 -4.26651 5.68526 -4.89731 5.57569 -2.68984 3.5661 -0.499714 1.01055 -9.01902 9.36142 -3.22067 4.59054 -0.65132 0.860512 -1.6791 2.36642 -8.28222 8.7579 -2.84349 3.24134 -5.64949 6.09512 -3.44026 4.43245 -2.60889 2.6248 --0.00849234 0.984046 -7.5745 8.65675 -2.07464 2.6488 -2.59747 2.65772 -6.36828 7.42208 -3.83342 4.50127 -5.41167 5.7011 -6.53606 7.53796 -8.21975 9.56176 -1.90113 3.08684 -7.74402 7.82057 -4.26515 5.11327 -5.42743 5.59215 -8.69709 10.0912 -2.87019 3.94798 -9.27013 9.54627 -9.30568 10.2136 -9.02985 9.62917 -3.7589 4.59642 -6.59359 6.86939 -3.26574 4.83488 -5.14545 7.70086 -7.43163 8.05103 -5.72972 5.74457 -0.490113 1.31151 -7.018 7.42627 -6.22976 6.27589 -9.07732 9.30419 -4.3917 4.42663 -8.50298 10.3728 -6.18671 7.53619 -3.51053 4.097 -2.17172 3.56595 -6.08046 6.23691 -9.07361 10.9129 -3.95757 4.11333 --0.136516 0.78995 -1.34923 3.47002 -0.0562579 0.686502 -9.10943 10.2731 -5.80174 6.16971 -7.86011 7.87649 -5.34384 5.51645 -6.32167 6.76387 -7.70566 8.28038 --0.319903 0.867682 --0.372564 0.570014 -8.83696 10.8439 -7.78947 9.38211 -9.25815 10.1092 -5.59721 5.67148 -0.234719 2.42489 -1.06314 2.87416 -1.75391 2.69799 -5.4536 6.66068 -1.35696 1.87102 -2.17418 3.1459 -7.61817 7.98287 -2.92194 3.18393 -7.68243 7.83261 -9.33163 10.5531 -1.14227 2.50228 -5.47911 5.70857 -9.88123 10.0758 -8.81249 8.83145 -6.02747 6.43183 -4.81158 5.79178 -6.65666 7.5047 -4.89085 5.56569 -0.935564 1.71547 --0.0452879 1.16222 -4.03524 4.6206 -5.88518 6.02658 -2.06227 2.9581 -0.207246 2.2404 -2.81757 3.70318 -0.704257 1.98403 -2.38486 3.30039 -3.57073 4.78358 -1.53721 3.00546 -8.37852 8.39527 -1.54619 1.59789 -1.00447 1.40778 -5.31977 6.43861 -3.82175 3.83209 -3.37738 4.44002 -5.46644 5.97254 -3.88191 5.00688 -4.88046 5.39031 -4.15092 4.93679 -1.75182 2.07399 -1.16434 1.76541 -3.37032 4.29676 -3.1685 3.98533 -1.28787 1.59775 -5.86338 6.17993 -3.8645 4.25757 -1.83947 2.48092 -0.184795 0.586724 -3.13752 3.76447 -2.14264 3.03248 -5.78182 5.9029 -2.47969 3.8088 -2.59206 3.08362 --0.354871 1.03627 -7.94041 8.05947 -9.48014 9.93817 -0.992727 1.48877 -6.1525 7.51387 -5.00071 6.15665 -7.42074 8.27606 -9.6539 9.83042 -1.08984 1.46387 -5.46282 6.95907 -4.74506 5.13968 -0.357565 1.91464 -9.07652 9.65474 -0.201095 0.646211 -7.04306 7.69131 -1.17728 1.2237 -5.92183 6.29165 --0.41356 0.491524 -8.38339 10.4509 -8.08648 8.11344 -3.32474 3.39522 -5.762 5.83732 -2.26778 2.55548 -4.86127 5.92868 -3.75949 5.16608 -4.83431 5.88632 -2.65122 3.31344 -9.30295 9.38948 -6.03391 6.32749 -5.12035 5.59414 -5.68785 5.979 -7.89553 9.15202 -2.54445 2.74715 -2.36337 2.49709 -4.71661 6.12198 -3.72447 4.68735 -1.0541 1.53187 -3.45178 4.80929 -7.90773 8.26212 -8.1816 9.18627 -0.322569 0.871041 -7.24823 7.32699 -1.7003 2.78087 -9.70927 10.2515 -3.75922 4.01081 -1.06949 1.40253 -1.21774 1.4734 -6.02123 6.32973 -2.76396 3.09484 -2.80358 3.00026 -5.25666 6.31369 -4.71714 5.30669 -4.37906 4.50557 -7.40824 7.44969 -7.89081 9.18263 -8.8136 10.3074 -9.1757 9.37261 -7.1938 8.51137 -0.580081 2.32678 -2.02497 2.95434 -6.01446 6.78851 -8.54365 9.21454 -3.03567 3.27089 -0.650657 1.5716 -5.05518 6.36521 -1.64301 2.76399 -4.15989 4.34183 -3.72791 3.98156 -3.91372 4.06182 -3.04507 3.88871 -3.82596 4.25694 -3.36492 5.00402 -6.50019 8.17974 -3.54621 3.81009 -0.546921 2.09811 -5.1789 5.9826 -4.98983 6.31221 -2.47557 2.63878 -4.64568 4.81101 -9.1462 9.21888 -7.37417 7.5276 -2.21604 2.50113 -8.29804 10.2722 -5.1282 6.06353 -8.58281 10.1589 -6.47084 7.04085 -6.27806 6.72674 -7.11554 7.85687 -6.01085 6.02773 -5.46694 7.52872 -9.51078 9.85387 -3.36627 4.06552 -2.96126 5.12635 -3.09314 3.40691 -5.05456 6.62548 -7.56469 8.97053 -1.33727 2.87482 -5.6572 6.28169 -0.120924 0.296475 -7.09139 7.41322 -2.10076 3.28507 -8.74998 10.1094 -7.45072 9.50796 -7.75294 8.59218 -0.740374 2.44897 -7.63001 8.91562 -4.30743 4.81716 -6.40813 7.29159 -6.30213 7.35987 -6.44392 7.32584 -8.41155 9.4466 --0.377892 0.689618 -5.88857 6.70983 -6.67779 7.70668 -4.831 5.17464 -2.62342 3.82764 -8.57453 9.29283 -7.32648 7.96725 -9.32937 9.9726 -7.30774 7.65754 -3.97456 4.59876 -5.73092 7.20962 -1.958 2.10551 -3.2115 3.81482 -5.76497 7.42425 -2.77219 3.29692 -4.95297 5.14843 -5.96367 6.3619 -2.49872 4.61736 -8.21817 8.23425 -2.13615 2.61877 -7.84121 9.55011 -8.63416 10.2773 -5.61084 6.32053 -4.86002 5.79944 -9.07858 10.688 -5.95829 6.42504 -3.3289 4.17849 -3.27989 4.91625 -8.28046 9.23021 -2.18691 2.6072 -1.3962 1.75013 -2.13627 3.73117 -2.11128 2.57303 -7.22357 7.50136 -7.43862 8.03136 -2.80578 3.02886 -0.176906 0.761142 -5.99314 6.6075 -1.90398 3.3925 -5.48264 6.73579 -7.18447 7.49811 -3.24434 5.05219 -5.53263 6.04178 -1.71172 2.45682 -0.297266 0.481632 -2.62582 3.36142 -0.243865 1.49321 -8.86142 10.169 -3.93193 4.39404 -4.98182 5.15675 -7.99209 9.73159 -8.18033 9.45596 -4.25235 4.41546 -1.59603 2.15581 -6.47724 8.69649 -5.24138 7.93131 -3.4267 3.49003 -0.0439912 0.316407 -1.99983 3.87206 --0.103124 0.568771 -4.62451 4.80117 -2.89065 4.16315 -5.82817 7.43232 -6.89255 7.82189 -5.71037 6.81241 -4.34551 5.24905 -7.33931 7.3741 --0.855192 1.27129 -8.94842 9.10813 -9.19877 9.68412 -6.42658 7.77968 --0.0669636 0.430107 -6.40366 7.40701 -8.91175 9.24059 -3.21388 4.21676 -3.38557 3.79509 -4.24411 4.97032 -7.259 7.34896 -2.55995 3.18361 -8.77438 10.5503 -8.18685 9.79378 -2.78397 4.4563 -8.6891 9.38337 -6.51749 7.59374 -2.52346 3.46101 -8.40526 9.35647 -5.26942 6.33572 -4.15094 5.00668 -0.471666 1.53842 -7.63441 7.96745 -2.39974 3.7814 -2.71989 3.02994 -8.12085 8.33493 -6.19474 6.84381 -6.6133 8.31417 -5.1758 6.94983 -8.66241 8.79095 -6.10878 8.22083 -8.81883 9.08031 -8.28969 8.45176 -7.19851 8.37836 -1.5722 1.6836 -4.57814 6.95063 -7.66128 8.10631 -0.742483 3.08515 -1.15026 1.98074 -3.90133 4.12003 -7.61145 7.73433 -8.32187 10.2933 -0.407205 1.08089 -1.26545 2.60796 -2.70646 3.92753 --0.196551 1.83536 --0.413063 1.23838 -0.264484 0.556192 -6.30158 6.96097 --0.66246 0.809062 -9.34243 10.3521 -8.70093 8.79679 -0.745195 1.92911 -9.12892 9.68193 -7.98533 8.30538 -6.23671 7.04296 -6.5603 6.95483 -7.08133 7.10563 -2.15769 2.41541 -8.24752 8.73978 -5.27693 5.61904 -0.317419 1.48404 -3.48029 5.46979 -7.38901 8.56554 -1.06587 1.62384 -5.54926 6.04924 -4.46577 6.48749 -5.349 6.15584 -8.04249 8.17359 -3.37651 3.56179 -3.64706 5.57403 -4.49844 5.26404 -3.93361 4.92128 -5.82184 6.29881 -0.984273 1.70318 -1.12773 1.80726 -3.11675 3.17451 -5.07913 5.46291 -0.615591 1.81465 -1.08948 2.77847 -7.97412 8.07365 -5.05207 5.82497 -0.0407709 0.558817 -6.11142 6.48205 -3.4461 3.57315 -8.6547 8.80553 -8.18965 9.64194 -5.55564 7.9703 -4.01776 4.16989 -2.4668 2.82018 -0.911925 2.56662 -4.68814 5.03614 -7.4899 8.49036 -8.40912 9.14001 -2.32725 3.16377 -0.0723972 1.42049 -6.6441 6.6953 -3.65586 4.38222 -6.35844 6.57833 -4.44435 5.73077 -1.81779 2.57257 -4.17692 4.59722 -8.54682 9.38058 -1.61135 1.81629 -3.91926 5.00536 -9.78302 9.85143 -1.25632 3.10345 -5.53191 6.08174 --0.231868 0.676811 -1.03054 2.58105 -0.0402172 0.690608 -0.974571 1.25234 -5.22227 5.92302 -8.05843 10.1439 -8.48938 8.50755 -0.0965782 1.24008 -6.53821 7.47765 -0.189991 0.475204 -8.48963 8.54995 -9.68363 10.0534 -1.49381 2.71302 -6.75552 7.41283 -7.91075 9.15302 -0.520922 1.40928 -1.17957 2.11221 -4.00122 4.40686 -7.32467 7.9273 -6.39126 7.90248 -6.50534 8.19308 -7.19888 7.22234 --0.136797 0.731889 -0.870318 1.25614 -2.07126 2.28297 -6.10995 7.60408 -3.02174 3.90102 --0.657541 1.57517 -0.993121 2.66255 -7.27232 7.50832 -2.16079 3.75428 -9.27397 9.75098 -8.36865 8.5545 -4.56641 4.97607 -3.60746 4.34616 -6.31304 7.70611 -2.91442 3.7602 -4.85814 6.70407 -4.45876 5.67661 -8.06749 8.82229 -2.02826 3.59873 -1.92922 2.50088 -2.63867 3.48117 -2.17665 2.54826 -8.62674 9.10675 -0.96648 1.47671 -8.86336 9.53978 -5.52747 5.80829 -0.77099 3.06106 -2.2307 2.53877 -6.29165 6.63018 -4.44717 5.04651 -3.80894 4.63054 -7.47519 7.87072 -0.933668 1.9949 --0.712945 1.21558 -7.30206 8.38376 -5.80281 7.00022 -7.96578 8.6558 -0.24063 0.706466 -4.41893 4.58472 -4.0132 4.92768 -5.29626 6.09397 -3.43602 4.00728 -0.780945 1.66499 -8.83861 9.15168 -9.06411 9.75544 -3.45618 3.62529 -9.51413 10.0148 -0.842106 1.75695 -1.06485 1.44192 -6.89987 8.05314 -7.89154 8.73313 -8.71675 9.79526 -2.40574 2.58062 -8.55952 8.78132 -5.61716 6.06282 -3.71059 3.77929 -2.50187 2.99137 -6.92852 7.23184 -7.00442 7.93869 -8.82232 8.8756 -4.10389 4.53702 -7.6907 7.77577 -9.31554 10.2674 -8.51082 8.70339 -4.83332 6.70311 -4.6904 5.42892 -4.71407 5.67695 -4.12047 4.44089 -7.51845 8.26858 -1.31781 1.9397 -6.26854 8.02093 -6.92072 7.77774 -0.438156 2.18909 -0.898035 1.72074 -3.81121 3.8643 -1.01676 1.34308 -9.28445 9.42801 -2.43133 4.43516 -4.33664 5.9904 -2.19178 2.37244 -1.5457 1.79785 -2.23781 2.6481 -6.8365 6.87073 -0.82568 2.74775 -9.59404 9.89262 -8.48394 9.15107 -6.16085 6.42224 -3.5667 5.97689 -4.16931 7.41638 -6.95636 7.0982 -6.87987 7.09233 -3.12619 3.14821 -7.76636 7.98459 -4.60371 5.59136 -3.92189 4.88302 -6.90694 8.19858 -3.85132 5.19015 -8.05045 8.32483 -4.8338 6.05032 -1.93576 3.18873 -2.4182 3.55039 -5.56905 5.8172 -4.18436 6.01283 -3.04944 3.85936 -7.83585 8.95233 -1.76281 3.0558 -3.44143 3.6317 -8.69887 9.40371 -5.67867 5.73236 -0.859809 1.76578 -6.92284 7.13601 -8.27495 9.13414 -5.44385 6.42599 --0.941603 1.8215 -7.88161 8.79447 -0.965018 1.17732 -5.56442 5.79546 -8.79032 10.9909 -5.28632 5.79175 -4.80998 6.07002 -8.4021 9.81107 -3.16415 5.08682 --0.212163 1.2052 -5.683 5.83625 -0.738527 1.31842 -2.03835 2.52756 -7.4543 8.91243 --0.568869 1.44659 -3.58855 4.42371 -6.33058 7.18779 --0.645579 1.94313 -2.18149 2.24157 -3.80281 4.67323 -5.14628 5.97452 -2.55239 3.45685 -3.56586 6.23355 -6.74752 7.19693 -8.99006 10.5533 -0.259833 0.99882 -8.9005 9.75401 -7.28058 8.41075 -4.57803 5.70104 -9.82823 9.90251 -6.94375 7.42033 -7.8878 8.81951 -5.01137 5.52693 -2.25503 2.28817 -6.65772 7.11107 -0.647512 2.04416 -4.34796 4.5706 -4.5395 4.91529 -2.65423 3.49531 -7.97384 8.78377 -5.53873 5.76806 -9.78641 10.1351 -6.01664 6.44407 -3.47406 3.75187 -4.59421 4.81804 -1.20641 2.00488 -2.48904 2.80768 -5.77372 6.10692 -2.49363 3.24499 -1.8483 2.62965 -2.28556 3.22209 -3.17819 4.51426 -3.5548 4.23276 -3.25239 3.57895 -0.613317 2.44862 -3.82234 4.78976 -4.72809 6.46528 -9.54107 10.4426 -9.20052 10.1921 -8.24152 9.89817 -5.17594 6.19462 -7.83364 8.17082 -5.67992 6.36464 -8.9943 10.1426 -2.20598 3.0081 -3.38199 5.16464 -0.599928 1.35804 -0.841211 1.60761 -5.29338 5.89919 -1.11061 2.29219 -3.41512 3.95907 -7.9375 10.0203 -8.73852 9.66917 -9.95092 10.0162 -4.02544 4.30219 -4.1461 5.37827 -1.08089 1.59196 -7.87513 8.21121 -7.85673 8.0973 -0.96237 1.56519 -2.45532 2.61678 -6.1829 6.23637 -0.135135 0.613518 -3.18324 3.78587 -5.64796 7.20194 -0.861169 1.71661 -9.66005 10.1169 -0.880774 1.12452 -1.29389 1.57658 -5.60299 5.89759 -5.53642 7.07306 -0.540268 1.31836 -6.60244 7.98105 -4.21877 4.57159 -3.15367 4.75356 -7.81055 8.40378 -8.00942 8.10861 -5.78071 6.35646 -3.15993 4.99293 -2.36526 2.78444 -8.1361 8.76071 -1.40066 2.96474 --0.17906 1.05877 -5.94933 6.6808 -3.43187 4.05553 -3.02912 4.68942 -2.1506 2.29413 -2.3516 2.38305 -2.87496 3.0851 -6.71294 8.99858 -3.76177 5.52545 -1.58417 2.57063 -2.74646 4.27445 -5.48407 6.60696 --0.133321 0.716559 -3.53886 3.58196 -2.28729 2.40198 --0.209646 1.21263 -6.62795 7.32318 -0.714781 0.880466 -2.96831 4.05932 -6.00935 6.38896 -5.39798 6.11983 -8.47679 9.70468 -1.4339 1.74845 -2.35223 4.75732 -4.31357 4.9642 -5.26493 7.70538 -7.91888 8.94851 -6.51439 7.69469 -7.69015 7.85411 -3.94274 5.15373 -6.25852 7.32402 -2.73567 3.43236 -7.09564 8.42242 -2.55932 4.29066 -1.79489 1.84559 -8.86427 9.35669 -7.23854 8.27062 -7.8488 7.98307 -0.710888 2.22424 -0.0413624 1.10578 -1.54302 1.97696 -1.64924 3.01081 -8.15535 10.2397 -0.305662 1.63835 -8.20375 9.03123 -1.66617 2.08748 -4.01691 4.88505 -3.32856 4.10709 -5.15342 5.44616 -5.80751 7.38872 -0.485341 1.07648 -3.98267 4.20211 -6.96867 9.37655 -9.48055 9.85181 -8.39277 9.50424 -2.47589 2.79873 -3.48046 5.37417 -4.98279 6.01686 -1.29845 2.31199 --0.204348 2.50289 -0.23488 1.00378 -6.26899 7.14823 -4.62903 5.49672 -0.199052 0.822066 -6.97297 7.69083 -4.23783 4.65198 -0.530497 0.839143 -6.61355 8.22831 --0.0103941 2.16307 -0.148601 1.20044 -0.314438 0.67632 -3.43415 4.06208 -1.95498 3.25728 -4.23094 4.84942 -9.5493 10.0057 -2.64964 3.52073 -8.21388 9.1622 --0.112496 0.47622 -7.97551 8.19546 -2.16155 2.6289 -0.38442 1.46032 -3.85675 3.91557 -1.00605 1.42016 -2.4853 3.53086 --0.0765625 0.504366 -8.11302 8.46334 -7.18135 7.80218 -6.46466 8.12336 -3.75968 5.33954 -9.08789 9.73677 -6.47459 7.49454 -0.90148 1.47681 -3.44733 3.54163 -7.32968 7.909 -1.30055 2.75407 -8.78735 8.92461 -8.21764 8.59414 -0.888162 1.08404 -5.65195 6.26421 -6.23881 7.33284 -8.69731 9.88088 -3.55695 5.36909 -6.49248 7.02755 -2.31407 3.01952 -5.7803 6.1286 -6.30415 8.01577 -7.73864 8.27496 -0.741078 1.69184 -4.94671 5.68254 -3.28226 5.02894 -1.97446 2.60413 -3.26555 5.54754 -2.56179 3.41897 -3.20058 3.32486 -6.96915 7.69055 -6.89302 7.39856 -1.9659 2.61404 -1.31107 1.36867 -6.23573 6.33677 -0.17616 0.517772 -8.55548 8.79155 -9.61632 10.2651 -2.20331 2.34017 -6.93195 7.42939 -1.25398 2.23119 -1.06577 1.41048 -5.99156 7.09818 -3.34821 4.1271 -4.61618 6.90956 -2.30853 3.52875 -0.0518063 0.113732 -5.38513 6.09734 -1.73468 2.64838 -7.24679 7.63999 -4.18175 5.06728 -7.09602 7.13414 -9.06191 9.11605 -6.2309 7.67675 -3.96576 4.63237 --0.552645 1.37948 -5.76964 6.89903 -4.9272 7.5832 -4.59003 6.49719 -4.12281 6.9664 -5.12256 5.58387 -1.78859 2.76954 -4.36808 5.05712 -8.41165 9.54483 -8.11513 8.43405 -8.42016 9.52715 -8.50598 9.34564 -1.80028 1.83558 -8.08502 8.43726 -6.96667 8.12021 -5.4726 6.26772 -7.1141 9.29989 -7.83324 8.1744 -8.74368 9.16491 -2.5515 3.01706 -5.92375 6.44495 -7.45628 8.41582 -9.04829 9.71503 -4.58856 4.75356 -7.26064 7.32462 -1.81695 2.40529 -6.88067 7.95052 -1.91408 2.02663 -1.32005 1.45025 -7.47733 8.42004 -4.99403 5.85297 -0.95744 2.28875 --0.089503 0.536888 -1.09978 2.48865 -1.9959 3.098 -0.376116 0.448329 -3.98908 6.49684 -9.10178 9.51012 -5.41394 7.31529 -6.60708 7.59071 -4.38466 5.76203 -1.84355 2.60304 -0.658705 0.933522 -6.98725 7.05509 -5.60064 6.98804 -1.0603 1.1521 -4.06192 4.46156 -0.351018 1.00807 -9.17113 10.2192 -6.71641 6.74659 -8.85392 10.5272 -4.50816 5.22908 -1.13934 2.43196 -3.3746 3.57576 -7.62137 9.3234 -6.93482 7.16058 -5.66506 6.44324 -5.13364 5.86068 -1.97257 2.03803 -2.69746 2.73067 -0.989591 1.38342 -4.18819 4.69676 -4.31608 5.12265 -2.79556 4.87763 -3.55387 5.34421 --0.112466 0.585639 -2.43156 2.70221 -5.88314 7.08322 --0.450332 1.29858 -1.22202 2.46588 -6.74433 7.32925 -5.14596 5.37435 -6.76754 7.41799 -1.48762 2.45958 -4.57241 5.3382 -4.17465 5.02296 -6.48856 7.5576 -0.383566 0.823394 -8.50875 9.08734 -1.79393 2.24548 -5.06812 6.49508 -3.55364 3.61502 -5.58973 6.58885 -0.631097 2.10041 -0.323995 0.941782 -8.8798 10.1036 -6.37114 6.88202 -6.9393 7.83288 -3.09503 3.41759 -3.65269 3.70305 -5.61676 5.8924 -1.90199 2.38446 -4.23683 5.35609 -9.18649 9.88878 -8.28736 8.37734 -3.04805 5.03593 -8.02926 8.38975 -3.58161 4.01331 -3.20923 3.48207 -6.85118 8.78281 -5.06518 7.49843 -1.57456 3.05552 -3.0154 4.23782 -2.83557 3.24854 -1.29358 1.89328 -1.42911 2.72661 -3.17067 3.96651 -0.353554 1.48472 -3.46227 4.25611 -6.17639 7.24657 -5.60878 7.13562 -4.11129 5.52476 -9.17596 9.4123 -3.08339 3.65766 -4.083 4.63013 -0.628465 1.92141 -7.81989 8.39386 -3.35589 3.87531 -5.35974 5.41743 -4.48321 4.64376 -0.888177 1.37343 -8.49061 8.50063 -5.09078 6.01801 -9.65314 9.99342 -1.60502 3.0115 -1.37928 2.77642 -6.60322 8.94046 -6.74573 7.45157 --0.291156 0.325249 -6.1518 6.66827 -5.38199 6.46959 -3.50128 5.22692 -1.31774 1.70159 -0.550546 1.48845 -7.51187 7.85496 -4.2014 5.23193 -3.88255 3.97209 -2.60555 2.84958 -5.15706 6.00036 -2.99284 3.27867 -0.395077 0.768383 -3.30863 3.60594 -0.0325231 0.379208 -6.55183 7.33346 -1.44554 2.95846 -0.245421 1.29751 -3.98808 5.41226 -5.90242 6.266 -4.11097 5.02597 -0.134753 0.929866 -0.609287 1.16311 -0.231832 1.06825 -6.22093 7.05584 -9.18429 9.80637 -0.544139 1.30185 -1.69143 2.90306 -6.75109 8.67893 -5.49641 6.76104 -8.91712 10.0271 -7.09126 8.12404 -8.82958 10.2847 -0.569249 0.69421 -3.59288 5.8053 -9.25068 9.4226 -8.51607 9.26259 -5.00906 5.17068 -1.83467 2.99102 -7.32006 7.64842 -0.405532 0.603773 -6.41882 6.60495 -0.721592 1.44375 -2.78393 4.46732 -7.14806 7.16117 -5.12868 5.27918 -2.74138 3.1737 -2.95394 4.26547 -7.82827 8.21028 -9.06982 10.7279 -0.108376 0.290131 -6.34574 6.97141 -4.39022 5.50801 -7.98339 8.79674 -3.80026 4.71831 -5.43594 5.66916 -1.6743 2.61476 -4.29763 5.47402 -7.95714 8.69311 -3.4152 3.7387 -8.01715 8.8941 -6.53723 7.44437 --0.0222108 1.04503 -4.96242 6.01648 -1.70885 1.75511 -7.62434 8.53526 -6.82863 7.39782 -8.19967 9.22283 -1.99719 2.11323 --0.0124079 0.240201 -4.48577 4.87935 -2.586 4.41666 -6.37848 6.67092 -4.39606 5.67983 -9.39761 10.1095 -7.10866 7.15796 -3.91993 4.52129 -5.10552 5.36997 -7.08963 8.32694 -9.12669 9.58509 -9.26894 10.1974 -0.737413 1.26523 -2.77833 5.28516 -3.19039 4.36857 -4.32954 5.45614 -4.98069 5.49295 -7.54745 8.76142 -5.70425 7.05749 --0.250513 0.36578 -4.76997 5.89607 -2.03075 2.32111 -6.54141 6.55896 -4.19799 4.45091 -8.7796 9.11915 -5.75014 6.05646 -5.36885 5.42775 --0.00433056 0.865304 -3.65169 5.4751 -0.23625 0.872926 -0.0386337 0.792214 -4.40245 4.56789 -6.44567 7.42162 -5.51394 5.98005 -3.50146 3.83147 -8.47573 9.85647 -7.91378 8.47044 -9.44297 9.90241 -5.962 6.68782 -4.49034 4.86927 -2.17774 3.47061 -8.80614 9.26595 -7.92096 8.13838 -7.80209 7.93317 -7.78915 8.29735 -6.98111 7.162 -0.491059 1.14901 -8.97965 9.38792 -3.30207 3.53207 -3.17127 4.43581 -3.97564 4.43746 -6.79008 7.17877 -5.61669 7.51263 -4.0853 5.38748 -4.42181 6.32041 -8.08599 8.9095 -2.46938 2.55499 -1.20692 2.06351 -1.98995 2.35216 -8.17116 9.17158 -7.53414 8.37086 -3.7744 4.46197 -3.29464 4.38 -7.33246 7.81959 -4.89572 6.2831 --0.152496 1.56427 -0.636242 0.938556 -5.62066 6.06096 -9.42994 10.473 -8.95446 9.46311 -0.277891 2.80311 -6.92968 7.29845 -2.75677 3.02975 -2.2859 2.51308 -2.96683 3.03857 -6.44584 6.49518 -8.33607 8.60407 -7.20303 7.7616 -7.07205 7.46849 -2.35677 2.7904 -5.86404 6.12906 -2.42371 4.62735 -3.27237 4.11016 -0.0668578 0.644021 -6.77371 7.45187 -3.66596 5.21874 -0.718034 0.755944 -6.06162 7.05 -6.91473 7.09753 -5.0749 6.08914 -0.759874 1.11978 -8.54591 9.64997 -3.97266 4.70679 -1.51133 3.17164 -7.21772 7.69877 -8.00719 8.37052 -0.284003 0.38001 -4.08842 4.16227 -5.04461 5.79973 -4.60604 5.31979 -2.2461 2.28157 -6.25631 7.69766 -9.12404 9.67586 -7.73134 8.98923 -1.0513 1.46408 -9.17225 9.42567 -3.66795 4.29168 -8.84403 9.28497 -9.93613 9.94729 -3.16615 5.09374 --0.149675 1.43397 -2.30855 2.48392 -0.843172 0.951801 -8.32945 8.8506 -8.97012 9.94697 -2.8559 2.92359 --0.321715 0.89173 -7.48565 7.71775 -1.44301 1.47795 -6.6649 6.76187 -9.10721 9.93599 -1.82207 3.03935 -3.61893 4.5306 -2.53746 3.81243 -0.424528 1.29026 -9.51874 9.68841 -7.94954 8.14396 -7.49282 7.52655 -3.04604 3.69656 -9.45461 9.47212 -7.69209 8.16412 -0.607135 1.16564 -0.150291 0.450632 -3.28914 4.01085 -5.45597 6.02921 -8.16157 8.36605 -9.76573 10.2325 -0.151994 1.07074 -1.3748 1.68548 -2.29854 2.63593 -7.92162 8.68895 -1.28795 1.61949 -7.85469 8.26683 -4.32268 6.33174 -6.13964 6.3596 -1.25714 1.88002 -2.05006 2.28294 -8.31864 8.34151 -9.0613 10.0715 --0.041568 0.25139 -6.79984 6.81686 -5.10674 5.70583 -5.92937 7.01652 -7.57649 8.05834 -0.937157 2.25362 -7.48567 7.59746 -2.33403 2.88942 -7.3805 7.73421 -5.586 5.75327 -0.828854 2.12988 -8.22741 8.59954 -9.69214 10.1207 -6.55359 7.08114 -1.85342 2.634 -6.08756 7.28893 -6.34993 6.93474 -8.93548 10.1463 -5.49445 5.8338 -1.47951 2.14646 -2.62089 2.75888 -2.35352 3.10539 -4.98774 5.28931 -4.92239 5.40697 -7.52674 8.78948 -4.52451 4.83819 -5.45854 5.75838 -5.51553 6.3901 -4.82905 6.44407 -6.20655 6.4483 -5.68116 7.06109 -7.97301 9.15827 -8.8854 9.91623 -9.60198 10.2449 -1.93322 2.67684 -0.441852 1.87646 -5.19981 5.71385 -2.54799 2.5809 -4.34591 5.02655 -7.54678 8.75202 -6.1496 7.19033 -1.13658 1.30756 -1.38724 2.08252 -2.13624 2.30419 -8.49196 9.41369 --0.21387 0.685093 -2.47875 4.19982 -3.69093 4.00543 -5.70643 6.50331 -7.07443 8.83588 -6.85756 7.68937 -1.69241 1.83242 -0.140565 0.502156 -2.15007 3.23784 -4.97403 5.69757 -5.08315 6.25554 -3.45026 4.01942 -3.37482 4.73009 -7.4154 8.34013 -6.95399 7.59768 -8.07995 9.86199 -8.43993 8.88645 -7.66844 8.12742 --0.0200687 0.435846 -4.47984 5.9416 -7.66804 10.0801 -4.14578 5.98717 -0.256533 0.89254 -6.43216 7.4474 -3.60295 4.79419 -3.90129 4.29812 -5.30606 5.58674 -9.11552 9.79229 -5.60702 5.85299 -2.39514 2.64865 -4.51164 4.60227 -6.31154 6.77441 -3.12239 3.13505 -7.50962 7.89478 -3.90928 4.88831 -9.64625 10.0629 -5.9465 6.02877 -2.08554 2.10477 -0.087547 0.34748 -2.34295 2.53703 -6.846 7.3043 -1.37869 2.11446 -4.03371 4.26278 -5.38623 6.40917 -4.75848 6.25417 -6.03478 6.15991 --0.585543 1.2091 -2.52824 3.57712 -3.95687 5.40914 -4.42955 4.71909 -2.9328 3.98848 -5.40471 6.97056 -7.64789 9.30279 -6.19595 7.07492 -8.27328 9.41596 -8.29855 9.13665 -2.54035 3.10488 -8.25038 8.87903 -5.66599 5.88701 -7.40067 8.71195 -6.63762 6.67694 --0.0163105 1.72666 -4.77743 6.60356 -0.567991 1.14977 -5.96841 6.42987 -3.02266 4.58424 -6.72121 7.35492 -7.51477 8.65223 -8.55055 8.81014 -5.59759 5.82816 -0.218944 1.82542 -1.03197 2.36652 -7.84302 9.1594 -2.11542 4.7332 -6.37618 6.92981 -1.34963 1.59353 -0.516281 1.08859 --0.0151152 0.0624718 -6.45603 7.23063 -4.76865 5.46588 -7.5893 8.42021 -1.04534 1.99034 -2.62638 3.04997 -5.00254 5.98512 -7.7588 9.44547 -6.82186 7.34321 -8.7629 9.82272 --0.309554 0.54858 -4.19843 4.92981 -5.62327 6.80846 -6.40599 7.6073 -6.1547 6.53898 -3.93941 4.44985 -3.28342 3.72778 -7.17256 7.23035 -2.31269 3.05437 -7.99132 8.20926 -7.19338 8.08381 -7.29139 7.96441 -4.25818 4.4208 -0.802894 0.81938 -0.990115 1.04066 -0.443898 0.490936 -3.44459 3.95977 -9.07812 10.3145 -7.86709 8.26338 --0.230114 0.390748 -7.50905 8.49199 --0.715424 1.97535 -2.92248 3.12903 -5.44209 6.62431 -0.991914 1.99037 -5.92275 6.7724 -9.10818 9.2797 -4.46434 4.83462 -4.21122 5.48353 -1.8721 3.40764 -7.04713 7.60526 -3.76581 4.76317 -7.00667 7.36475 -6.87244 7.39431 -7.6349 8.46695 --0.0728922 0.351194 -5.02925 5.6834 -1.45779 2.83702 -0.339175 1.46574 -6.40414 6.9165 -6.30401 6.91007 -5.6392 5.78172 -5.63288 6.44639 -7.45285 8.89031 -4.09741 4.57929 -8.76728 9.06448 -1.62324 1.84552 -5.72509 6.54553 -8.65273 10.3652 -7.3362 7.8953 -8.96224 10.3113 -0.217316 1.7827 -1.28523 2.90127 -8.78746 9.11602 -8.6075 9.9606 --0.647788 0.779976 -4.9702 5.47602 -4.15553 4.57497 -1.08174 2.80993 -4.01011 4.8145 -6.79603 7.2317 -4.3711 4.43566 -9.65087 9.79922 -8.19407 9.21784 -3.04008 4.94094 -6.0883 7.23919 -6.88708 6.97172 -0.438073 2.00665 -8.53083 8.83004 -4.22258 4.65233 -6.72856 7.61085 -3.17591 3.18978 -5.07955 5.6938 -2.09043 2.55351 -3.28085 4.43556 -7.29225 8.03925 -7.78034 7.82608 -6.59677 7.67719 -5.56032 6.38139 -8.72663 8.82535 -2.96505 3.11983 -1.67192 2.11727 -7.85386 8.49025 -6.30965 6.72799 -8.53082 9.3801 -2.8976 3.39972 -8.90427 9.44661 --0.0665785 0.410254 -4.58099 5.81135 -1.88015 2.21838 -3.38693 4.10149 -7.46378 7.68246 -8.80985 9.72212 -6.54877 7.25642 -7.18249 7.71509 -7.41978 8.64805 -1.00839 1.78626 -0.39421 0.526751 -7.13516 7.28317 -7.28011 7.80573 -1.90158 2.49032 -1.66181 4.17994 -8.81106 9.21133 -9.46151 10.5007 -0.52585 0.575082 -7.66495 8.64072 -7.72794 8.50991 -4.92409 6.23879 -2.28769 3.21774 -3.62671 4.40932 -5.77688 7.31314 -8.94253 10.0664 -0.416618 0.635111 -1.81377 2.41356 -7.91755 8.83363 -1.62715 1.82626 -8.22065 9.51656 -0.020228 0.724724 -8.81119 9.95764 -8.66509 9.61079 -5.28201 5.32152 -3.95724 4.22138 -7.09339 7.77685 -9.63428 10.1514 -3.69117 3.779 -3.82195 4.76757 -5.75824 6.62265 -3.69984 4.75163 -3.58259 4.8788 -8.32635 8.85873 -5.81959 7.32506 -8.11265 9.14304 -2.20118 3.32511 -7.79582 8.52691 -6.5891 7.13584 -0.385393 0.440656 -1.13414 1.9951 -1.76482 2.69977 -4.76194 5.82757 -6.33633 7.5348 -4.7663 5.65083 -1.98298 3.01285 -0.956973 2.38629 -5.60955 7.65827 -9.11064 9.14351 -2.99933 3.37975 -3.36304 4.57437 -3.89886 4.50733 -8.73838 9.3514 -9.11824 9.66042 -1.47961 2.93909 -0.615297 1.13217 -1.70646 2.32478 -4.35168 4.99362 -0.986601 1.18332 -4.01551 4.92342 -7.68944 9.86838 -4.47611 4.85316 -0.051839 0.86288 -3.59624 5.5628 -7.08729 8.90374 -9.53464 9.9196 -4.69871 5.74189 -8.43146 10.6889 -3.23774 3.77777 -9.35399 9.62741 -1.15259 2.69451 -6.6368 7.33773 -5.26395 6.09857 -6.87415 7.21717 --0.925645 1.06118 -8.49641 8.67659 -2.31486 3.25354 -2.51057 2.58303 -0.921997 1.48762 -6.29777 6.74738 -4.03945 4.27305 -7.1668 7.3471 -8.44572 8.80343 -7.16937 7.84526 -8.89008 9.4332 -7.01815 7.66319 --0.420804 0.982878 -1.59755 1.64672 -0.700814 0.72579 -6.3138 7.37379 -8.49276 9.93522 --0.795656 0.819657 -0.772253 1.05926 -0.917593 1.3917 -3.30076 4.12274 --0.0237176 0.260552 -6.82385 7.49119 -6.98638 7.52012 -8.24915 9.08397 -4.17486 4.25908 -3.08435 4.64404 -8.17114 9.91412 -8.95923 9.3751 -0.596707 1.89462 -0.982917 1.40236 -6.79552 7.36657 -8.2599 9.69551 -8.85126 10.4342 -7.98967 9.14514 -0.766355 1.63286 -7.76211 7.99247 -5.23163 5.89338 -4.4707 5.50457 -9.257 9.27862 -2.11049 2.59654 -1.65501 2.06238 -0.551768 2.10873 -0.0285582 0.194421 -3.66153 3.85615 -5.07097 5.55806 -5.29145 5.80735 -2.03499 3.0863 -0.73171 2.29494 -2.63023 3.6417 -6.17478 6.25997 -5.79646 6.46363 -9.10633 10.5516 -7.23415 7.84823 -6.49951 7.1506 -9.94647 10.0242 -7.91236 8.09097 -7.8127 7.97662 -3.34238 3.42907 -8.50796 9.8311 -8.75792 8.98028 -9.34125 10.4441 -2.84413 3.71602 -1.49884 2.35652 -7.52317 9.18955 -9.5587 10.3525 -4.85436 6.1181 -5.91369 6.12194 -6.88463 8.34471 -1.51952 2.99156 -4.29022 5.12674 -8.0229 8.41246 -2.44841 3.04779 -7.59975 7.91485 -2.74491 3.62575 -0.0169968 0.240919 -5.85351 6.29039 -4.99825 5.93439 -2.153 3.35304 -1.19032 1.41763 -6.13337 7.80615 -7.05013 7.89364 -8.38056 9.92 -6.35525 6.64521 -3.93342 5.15885 -2.87656 3.47116 -3.56176 4.41159 -6.72084 7.9171 -8.03801 9.12442 -1.03329 2.56255 -7.64542 8.61709 -2.85627 2.89437 -8.8303 9.79838 -1.08032 2.34573 -7.51366 8.39169 -9.09685 10.3677 -6.753 7.41904 --0.217662 1.42059 -6.72492 7.97553 -7.99325 8.8976 -0.765372 1.10894 -4.37958 6.04671 -8.72027 9.58928 -6.00234 7.29277 -8.43912 9.25356 -2.98816 3.17389 -0.4292 0.552167 -1.69827 2.80318 -5.99904 7.09981 -4.68367 5.87791 --0.203208 1.09587 -2.65367 3.28472 -3.87051 3.88111 -6.36178 7.18853 --0.0815935 0.200848 -6.82255 7.18488 -4.99295 5.08405 -2.67155 3.08447 -5.82099 6.77145 -8.76434 9.01086 -5.94982 6.18665 -3.23369 3.71743 -0.934129 2.73456 -1.13233 1.24208 -8.21931 9.03906 -6.25425 6.69972 -0.971299 4.21205 -5.68426 6.45281 -2.85786 3.3955 -8.17715 8.88439 -2.72802 5.01235 -6.12811 6.53711 -5.22878 6.45864 -0.453655 0.922032 -0.466162 0.85262 -2.40916 2.64759 -5.63583 6.37476 -2.18434 3.14105 -0.912811 2.08432 -8.9464 10.1515 -6.77323 7.27133 -0.7167 1.60579 -5.89813 6.32997 -7.66593 8.4611 -6.54145 6.88337 -5.95421 6.21188 -1.10383 1.92226 -5.37168 5.65707 -1.51874 1.66339 -4.60748 5.00384 -8.97354 10.5394 -2.05022 3.20373 -8.17316 8.19283 -2.33792 2.72643 -8.81577 9.3704 -5.95738 6.59855 -5.69025 6.17335 -6.91889 7.88142 -2.17529 2.81528 -6.65046 7.19698 -7.10694 8.78046 -2.09613 2.47484 -1.92423 2.25333 --0.0906039 0.861376 -6.61481 7.70609 -6.7448 6.84276 -3.43655 5.28405 -6.05404 6.48902 -3.24637 3.36149 -5.69528 5.77157 -5.12352 5.31024 -7.65858 8.80828 -3.69209 4.4851 -0.25765 1.29637 -3.1537 4.13191 -3.12328 3.83765 -2.99798 4.8748 -4.49566 4.67827 -3.50822 4.03987 -8.00334 8.34084 -8.61039 9.00704 -0.0332147 0.166124 -4.55193 5.36546 -4.20308 4.31589 -0.955466 1.20095 --0.382972 1.47625 -0.803913 1.01916 -3.78333 4.0707 -6.58604 6.70173 -3.02066 3.82562 -1.16515 2.2816 -7.87242 8.24214 -4.057 4.60368 -2.84714 3.59726 -2.77804 3.69136 --0.139996 1.36416 -4.50647 6.37579 -8.86647 10.1549 -9.24372 10.1442 -0.743107 1.84722 -6.18761 7.65841 -0.214887 0.443938 -8.8513 9.55063 -4.04856 5.79916 -6.69671 7.10025 -6.97477 7.79702 -4.82551 5.10538 -0.821772 2.85828 -9.3086 9.74805 -5.45623 6.66668 -7.64296 8.67451 -7.53052 8.31024 -7.45352 7.5063 -1.31412 1.4979 -7.81176 8.48083 -0.228964 1.73207 -5.52579 5.93103 -6.58544 8.48938 -2.75407 4.18746 -3.21396 3.96298 -1.13806 2.34106 -0.899331 2.87945 -5.69016 6.61624 -2.48172 2.58082 -0.676004 1.43405 -3.41766 3.9503 -0.104554 0.298373 -6.50673 8.21831 -6.00349 6.69385 -9.62453 10.3147 -4.09379 6.02911 --1.12803 1.68823 -1.83324 3.43133 -8.30576 9.09288 --0.363911 0.405218 -1.91686 3.34928 -6.98331 7.15885 --0.31591 0.996789 -0.145813 0.35408 -5.32016 6.13679 -6.99664 7.48644 --0.140875 0.821045 -9.0119 9.19742 -1.69616 1.72453 -4.38064 5.07542 -6.85898 7.55478 -3.9145 4.27935 -5.77592 6.16806 -1.45345 3.01301 -4.13024 5.59662 -8.14557 8.41669 -4.00075 4.829 --0.283024 1.59436 -5.92468 7.17507 -6.84458 7.18356 -1.06987 1.42839 -8.618 8.66235 -0.432802 1.59512 -3.78058 4.36051 -1.6113 4.21135 -6.73475 7.01057 -6.74819 6.90498 -6.93146 8.54681 -9.02605 9.91613 -3.888 4.00526 -1.07958 2.27915 -4.78456 5.10764 -3.92952 4.89555 -9.09348 9.30304 -6.73107 7.21036 -7.42366 7.73225 -4.04079 4.72919 -1.21726 1.34683 -8.82903 9.73504 -0.577663 1.00786 -1.56822 2.08675 -4.84315 5.44994 -1.01008 1.16524 -5.99782 6.01535 -0.996739 1.75305 -4.76128 6.39012 -8.93563 9.51972 --0.0698166 0.453543 -5.9084 6.95139 -0.535401 0.692258 -4.80729 5.48335 -3.42581 4.76147 -3.58715 4.43541 -7.50236 7.71227 -5.19742 5.87901 -1.79752 2.43097 -7.29762 7.57608 -5.65169 6.47762 -6.02249 7.93642 -0.840131 2.81176 -6.2646 6.96911 -7.46014 8.17136 -9.79049 9.94054 -4.61094 5.35819 -7.30902 7.41873 -1.21883 1.84621 -6.41743 6.57736 -1.53114 1.62859 -6.73237 7.47083 -6.05618 7.56831 -7.63374 8.16821 -5.20839 6.05382 -0.619043 1.44065 -2.38657 4.88786 -3.88289 5.18788 -4.42283 4.51106 -9.15575 9.22388 -3.18678 3.72243 -3.20638 3.65935 -4.2219 4.97961 -4.63725 6.90959 -2.57123 2.59101 -4.08581 4.37325 -6.53926 6.80412 -1.77475 3.89149 -9.22854 10.426 -2.67375 4.36551 -3.17194 4.0433 -1.10304 2.0348 -3.67233 4.04957 -3.23526 3.5012 -5.17684 6.47301 -4.4 4.67662 -4.15842 5.85903 -5.88496 6.61616 -7.26489 7.51279 -4.17402 6.6997 --0.540216 0.54573 -4.36063 4.60442 -9.18146 9.96239 -0.977216 2.42032 -9.09143 9.61178 -5.06686 6.23076 -2.04772 2.92048 -1.4154 2.00707 -7.80442 9.54824 -4.55549 4.7148 -7.56964 8.80172 -1.35347 3.21648 -9.12751 10.0605 -1.81735 2.06061 -5.63798 8.0918 -6.79492 7.98002 -9.23053 10.1299 -1.74639 2.02724 -3.71825 4.09879 -2.4995 3.42493 -4.1255 5.66758 -4.75493 6.99687 -8.22481 8.72036 -6.13689 7.53026 -5.41315 5.66358 -4.21425 5.62743 -6.22936 6.44392 -2.02303 2.96414 --0.0655462 0.130508 -6.1487 6.70994 -4.36674 6.24985 -7.51129 7.63176 -7.9729 8.98613 -3.92117 4.15596 -4.54398 5.43399 -6.34248 6.92305 --0.550253 1.16167 -9.15142 9.53717 -8.99354 9.65952 -6.28988 7.90053 -3.36505 3.782 -8.80005 9.70553 -1.99947 2.18573 -1.15023 2.07069 -0.253723 1.32958 -2.0392 2.93977 -2.89024 3.00836 -8.16735 8.2049 -1.49508 2.95258 -6.19092 7.44552 -2.33328 3.06758 -6.44166 7.4649 -7.34749 7.79488 -7.5557 8.04141 -2.76812 5.13617 -7.97308 9.25668 -4.73539 5.22234 -7.53377 8.41651 --0.355405 1.36499 -4.72111 4.73744 --1.22753 1.84842 -5.5033 5.63808 -3.95421 4.19313 -6.24752 6.98229 -4.49694 5.07277 -3.70871 4.30093 -1.31984 1.50116 -7.16044 8.70868 -2.44587 3.34659 -6.08322 7.20376 -2.75012 2.82555 -0.0394442 0.863634 -3.90896 4.73696 -4.77494 5.04158 -8.41473 8.82932 -1.7049 2.71024 -9.01684 10.1044 -4.57959 5.01066 -3.2484 4.21875 -1.11596 2.88792 -3.53616 4.14001 -5.80672 5.82478 -5.85844 7.70293 -6.18239 6.30124 -2.22913 3.23412 -2.97521 3.08481 -2.2749 3.70611 -2.3457 3.86609 -2.71695 4.04473 -7.22863 7.40115 -1.80428 2.39815 -1.80781 2.33028 -2.78662 3.14936 -9.40717 9.94906 -6.54968 6.80773 -2.76862 3.24492 -1.96034 2.87404 -3.53295 3.54927 -5.36042 5.67073 -8.63339 8.93752 -0.932415 1.70402 -4.32923 4.55594 -9.3491 10.4969 -0.121416 1.15499 --0.172998 1.36319 -2.02349 2.29887 -1.75352 2.35329 -0.502555 2.01665 -6.71754 6.80014 -3.35175 3.93337 -7.17133 7.9851 -8.51299 9.95771 -5.86103 6.36734 -1.44593 3.46008 -4.49699 4.60855 -2.29261 3.10053 -6.68713 8.19499 -5.43776 6.84387 -8.58591 9.02134 -5.24746 6.15595 -1.3847 2.5074 -6.62143 7.07775 -1.7101 2.077 -9.70898 10.2789 -6.67451 7.92058 -2.56858 3.60374 -1.61917 2.60482 -1.77902 2.16908 -4.76209 6.00461 -3.8894 3.98269 -7.0278 7.276 -5.4866 5.59417 -1.69306 2.92506 -2.45744 3.76592 -2.5689 2.80611 -5.98283 6.06154 -9.5267 9.9626 -9.55652 10.4128 -6.6111 6.64606 -3.38826 4.26111 -3.61887 3.73455 -4.14924 6.13796 -7.15863 7.28212 -5.78984 6.56662 -2.09304 2.2681 -4.39867 4.88557 -6.20907 6.81034 -4.63336 4.91476 -0.939805 2.43621 -1.56774 5.13599 -8.40908 9.82058 -2.06273 2.20306 -2.53524 5.01482 -2.9314 3.23661 -2.48535 3.47368 -0.366389 1.4699 -8.81131 9.01654 -2.05102 2.87972 -1.9699 2.22723 -6.18333 6.98224 -1.3425 2.4443 -0.767883 1.77423 -3.1538 3.43248 -0.891006 0.903458 -5.7136 5.8713 -0.437569 1.37539 -3.98533 5.01646 -8.65764 9.89518 -3.74889 3.98561 -7.74507 8.30657 -8.24671 8.43006 -6.88467 7.42036 -1.99426 2.03522 -1.90486 2.04181 -1.12911 1.71807 -9.25253 10.105 -1.92989 2.0346 -5.60044 6.25585 -9.16848 10.087 -6.67824 6.72257 -1.88522 2.80222 -0.242758 0.852689 -5.09249 7.71484 -5.54974 6.44414 -7.66767 8.72936 -3.48884 3.83156 -3.4697 5.14646 -8.48582 8.7692 -6.76259 7.06897 -7.83856 8.62005 -5.81853 6.76571 -2.04803 2.94439 -6.85396 7.22985 -6.52449 7.39764 -9.26838 9.34809 -4.64449 5.64975 -7.51845 7.80279 --1.27268 1.65344 -0.686101 4.20373 -7.80552 8.37119 -7.20419 8.35284 -9.33962 9.87975 -4.31238 5.58683 -2.39198 3.84398 -1.29248 2.59269 -4.71612 6.195 -5.27332 6.52174 -7.71492 7.84702 -8.18064 8.72233 -1.55223 2.31294 -6.34374 7.31758 -6.48966 6.92611 -2.62268 3.09895 -4.09064 5.06197 -2.66367 4.12126 -1.53391 2.93092 -8.64516 8.70655 -9.20047 9.28957 -4.00474 4.11716 -8.5418 9.45901 -8.73386 9.73253 -9.22596 9.63179 -1.34204 2.7834 -8.4489 9.21027 -7.75158 8.51085 -5.98856 6.11212 -1.29906 2.08111 -9.24315 9.76291 -6.84345 6.91607 -5.88294 5.90545 -3.03022 3.39941 -3.22222 3.4089 -1.12791 1.65898 -6.70232 7.36336 -8.60042 8.82377 -1.26451 1.30362 -2.76682 2.92693 -1.54763 2.19582 -6.5865 7.24173 -4.15242 4.21742 -8.39615 8.78524 -1.67017 2.08717 -9.03012 9.97041 -2.31463 2.45877 -8.29872 8.51813 -1.66689 2.51919 --0.807606 1.47794 -1.31452 1.94418 -0.0739222 0.512106 -4.23577 4.25889 -7.45273 7.97505 -3.34234 3.46608 -7.97304 9.14131 -1.9029 2.99946 -8.84087 9.79689 -4.92769 5.68685 -2.74004 3.04513 -0.889257 2.20448 -3.10574 3.9758 -3.91547 4.32303 -7.17475 8.07377 -5.92903 8.03738 -1.57974 1.65527 -3.76339 4.2285 -2.28263 2.7559 -9.53105 9.87477 -2.10154 3.2222 -4.23683 5.34347 -1.38769 2.48482 -5.39838 5.51872 -8.50975 10.1382 -8.04108 9.21474 -8.5252 9.67823 -8.893 10.7726 -7.1294 8.18211 -1.15642 1.73882 -0.436911 0.756698 -3.66142 3.71659 -6.37686 6.7 -8.88506 8.99896 -2.31891 3.79061 -2.61615 2.81909 -1.35216 1.39571 -3.04217 3.52564 -7.8409 9.34099 -0.470596 1.49157 -6.94014 7.18365 -8.05483 8.49979 -8.18511 8.25608 -7.03597 8.45251 -2.47411 2.65172 -0.112716 0.193057 -4.45039 5.10584 -4.53906 5.80013 -5.11702 5.27151 -1.24211 1.90757 -4.64114 4.72912 -1.77254 3.45037 --0.1275 0.99675 -5.69637 7.67722 -2.21252 2.44032 -3.89623 4.40192 -2.79904 3.15569 -8.37911 9.42424 -5.27199 6.2026 -1.84791 3.75411 -0.522801 0.54806 -3.83644 4.64785 -6.65497 7.55638 -6.75104 6.98564 -2.34979 2.98049 -8.27176 8.60459 -5.07773 5.44064 -1.16934 1.98872 -4.2914 5.37557 -6.83462 7.95408 -3.91405 5.73229 -7.77473 8.53538 -9.23441 9.90185 -4.03659 5.2473 -5.99336 7.8004 -4.2432 5.89276 -6.39847 7.81276 -9.13909 10.4164 -1.12009 2.5649 -2.35157 3.18468 -4.46918 5.55572 -3.82512 5.53666 -7.18238 8.10193 -8.40911 9.23639 -8.99555 10.4192 -6.69547 8.87825 -4.79012 5.34858 -9.23615 10.0986 --0.590587 1.14603 -2.74289 3.48244 --0.248403 1.1591 -3.35663 3.7229 -7.37504 7.6481 -6.64796 7.64695 -0.778081 2.41212 -4.49242 4.7772 -8.01419 8.109 -6.6494 7.76619 -8.86331 10.1205 -0.817273 0.937855 -8.00019 8.21556 -6.19405 6.54794 -6.11798 7.30421 -3.40164 4.28921 -5.31927 6.21584 -2.79377 3.40938 -3.59494 3.90321 -7.79218 10.3132 -2.99546 3.86111 -1.71916 3.40283 -6.1768 6.81915 -7.59629 8.68568 -1.59724 2.348 -6.20151 6.5391 -6.30798 6.70478 -0.489786 1.51322 -1.28396 1.86775 -5.18031 5.43007 -6.61276 7.70565 -1.4909 2.11165 -4.56163 5.49277 -1.93598 4.35147 -3.65568 5.00224 -1.68028 2.00363 -7.82874 8.67399 -1.23053 2.87598 --0.164275 0.194491 -2.58349 4.01302 -1.23279 2.02984 -0.599702 1.09257 -9.50965 9.80164 -2.33108 3.58037 -4.38659 4.62378 -2.65097 2.87349 -0.0537058 0.576502 -4.20415 5.15693 -5.41458 5.98382 -4.37747 5.10347 -2.62536 2.70073 -6.96845 8.15356 -6.91533 8.41638 -9.36431 9.58863 -6.13019 7.25915 -2.7818 3.4951 -9.44641 10.1301 -2.68817 4.19772 -5.65664 5.6814 -8.25308 10.498 -3.50374 3.64458 -1.47063 1.78567 -8.21901 8.98152 -3.99261 4.47339 -2.51395 3.38788 -4.66178 5.24959 -9.08415 10.3467 -5.92351 7.20447 -1.74145 2.35957 -7.62653 8.96797 -6.43542 7.68775 -5.49047 6.56355 -4.9225 6.22555 -0.257967 0.704837 -3.42488 3.52873 -8.67606 9.77824 -5.12981 6.37856 -5.97359 6.32151 -1.58517 2.28129 -0.530687 1.54545 -7.04056 8.15296 -1.8541 3.1902 -9.46286 10.0098 -3.17967 4.02237 -3.49966 3.80271 -6.24894 6.49618 -1.19944 1.59215 -5.30422 6.94823 -7.49137 7.78584 -7.02669 8.16282 -2.21673 3.36471 -7.66183 8.34763 -4.13876 4.87421 -3.0199 4.07124 -8.40439 8.82943 --0.274649 0.429602 -6.11215 7.65609 -3.34781 5.03006 -1.28231 1.77258 -7.57256 8.59456 -5.36208 5.81735 -7.18511 8.96618 -8.86053 9.49567 -5.39097 5.93211 -6.59094 7.26553 -3.69159 4.01914 -8.73797 8.81611 -1.41144 1.82827 -7.83555 8.07567 -6.13821 8.44907 -5.83432 6.48744 -2.93596 4.66271 -7.03215 7.59658 -1.65252 2.45337 -2.91358 4.90129 -8.94415 9.14642 -5.21005 6.1166 -0.33225 1.17039 -7.40089 8.07586 -9.30427 9.40776 -2.34188 2.81124 -1.02811 3.3344 -6.28117 7.62089 -4.80105 7.10049 -8.90252 10.0057 -2.20932 2.33093 -8.20746 10.6268 -4.31887 5.23945 -9.258 9.8985 -3.80742 4.15057 -1.11313 1.23711 -9.53067 9.70165 -7.95467 8.67187 -9.66031 9.83223 -3.61385 4.09571 -0.623148 0.652817 -7.77809 8.62118 -0.86157 1.98606 -3.12528 3.75815 -1.9363 3.22621 -8.23521 8.99175 -8.95406 10.4487 -3.38526 3.90652 -0.34281 2.0226 -0.739384 0.793829 -3.55637 3.96384 -6.1562 7.28647 -5.30211 7.51385 -1.46275 1.78688 --0.0144662 0.868488 -0.0740443 0.119828 -9.26206 9.83923 -0.743397 1.40754 -4.68823 6.62985 -8.8291 9.17373 -4.66711 5.09313 -4.023 4.44994 -5.68937 5.79194 -8.04835 8.06763 -6.94662 8.00075 -0.774686 1.13428 -0.381819 2.34757 -2.1235 2.63524 -5.42795 6.89998 -6.07662 6.29083 -6.47821 6.7872 -2.58305 2.6192 --0.598336 1.23458 -4.29089 5.43332 -8.09914 8.28229 -5.05925 5.35258 -0.181705 0.444466 -3.27849 4.79932 -0.310314 1.43125 -1.13836 2.76825 -1.2529 4.09336 -0.198106 0.608625 -1.77442 2.23777 -6.29823 6.64574 -1.22125 1.37929 -1.77592 3.04011 -1.43999 2.90926 -4.20495 5.32396 -4.98874 5.33211 -8.36483 8.67875 -5.65373 7.14132 -2.8303 3.05037 -3.41509 3.54032 -7.21702 7.85857 -5.79848 5.8913 -4.52711 5.65511 -2.04663 2.66919 -5.76363 6.77903 --0.153046 0.77878 -4.37474 4.49936 -6.86786 7.81999 -8.92084 9.16368 -7.5975 8.56954 -0.197493 1.07503 -3.99803 4.67019 -9.35123 9.60094 -1.46442 2.4256 -5.21501 5.79612 -8.80879 8.99085 --0.109252 1.30631 -7.34965 7.87947 -7.08703 8.12723 -0.985946 2.14663 -0.48521 0.856118 -6.57719 6.70623 -8.71165 8.72286 -3.16883 4.8714 --0.21189 0.412944 -3.6526 4.37121 -0.364649 1.3363 -9.27722 9.35135 -3.47517 3.8793 -5.67149 6.28631 -6.52789 6.61039 -9.36323 10.4189 -4.30743 6.18638 -7.93653 9.4877 -8.24024 8.41475 -2.75692 3.13935 -8.80223 9.1489 -3.42656 3.90557 -8.96598 9.3217 -1.99582 4.84803 -5.1178 5.8688 -4.47901 5.73433 -7.30397 7.85527 -0.18463 0.656832 -7.80806 8.41666 -8.50023 9.42628 -7.67563 8.64756 -9.46783 9.52169 -2.06797 3.3107 -5.08863 5.10167 -0.82146 1.39055 -7.5428 8.04736 -9.09407 10.8208 -9.15219 9.99706 -1.61637 3.46354 -5.3812 5.96247 -9.34115 9.73575 -6.49221 7.30031 -1.56337 3.39704 -8.463 8.60841 --0.322779 0.658242 -8.50173 8.72125 -0.854851 1.83405 -7.81945 8.12841 -2.60724 3.19985 -5.03714 5.55331 -1.85041 3.36816 -7.26119 7.64364 -5.75223 5.99653 -4.00026 4.43863 -5.00939 6.03009 -6.22879 6.6638 -6.44231 7.18622 -1.66002 1.88587 -2.59781 2.84919 -4.96399 5.40545 -5.70327 6.95018 -6.97141 7.08346 -3.98535 4.6179 -5.96795 7.14997 -5.07581 5.8262 -4.65665 4.98851 -8.65646 8.70986 -3.04175 3.19155 -0.796073 1.0952 -8.24859 8.57828 -5.26952 6.34245 -7.94685 8.78542 -0.193963 0.968524 -6.61159 6.80186 -9.37533 9.79195 -8.94048 9.74959 -5.77272 6.48616 -6.0092 7.86718 -2.52621 2.58938 -8.91347 9.22421 -4.20466 5.45909 -4.82157 5.09167 -7.35464 7.36611 -5.12413 6.45063 -2.12404 2.81187 -8.88875 9.20752 -2.59731 3.20587 -1.54772 2.08968 -6.70449 7.08952 --0.0967146 0.888521 -3.10207 4.34815 -1.20807 2.35497 -6.00753 6.08492 -3.21837 4.00446 -4.34095 6.0963 -4.24821 4.79576 -4.49523 6.6669 -1.49483 2.52552 -0.0411497 0.641526 -8.3854 9.20954 -8.12419 8.93702 -0.0201515 1.06914 -1.57617 3.44176 -1.4173 1.76847 -5.42261 6.51539 -6.6744 8.46109 -3.05234 3.59179 -6.49059 7.24618 -7.01989 7.69901 -2.34664 2.90601 -9.17324 9.86754 -5.50919 5.70258 -2.40486 4.6009 -3.74368 4.00093 -6.9211 7.33554 -7.41358 8.7413 -8.78284 9.62033 -2.96753 3.01602 --0.200693 0.535532 -6.4383 6.45049 -8.28835 9.42148 -4.2379 5.35128 -4.68397 5.04593 -5.7185 7.03177 -5.37494 6.43977 -2.99518 4.08138 -7.28064 7.54638 -9.10622 10.4907 -1.23839 1.50915 -6.7823 9.24533 -8.45679 8.62427 -0.106718 0.69304 -2.84119 3.50375 -3.60466 4.51338 -8.04709 8.19023 -3.31632 3.48054 -5.9027 7.46331 --0.621072 1.13003 -8.57167 8.69262 -0.301047 1.42246 -1.24229 2.44616 -0.962706 1.55754 -8.77327 9.55275 -1.77899 2.44335 -0.368575 1.84726 -9.05918 9.07832 -6.61723 7.68015 -8.59899 8.80383 --0.133927 0.20271 -5.69266 5.74809 -0.68202 1.52342 -7.17359 7.91482 -5.74049 7.34297 -7.88371 7.9683 -1.58749 2.26543 -3.96728 4.45988 -5.4354 6.88336 -1.68706 1.6976 -6.56907 7.40696 -0.518151 0.724124 -8.99155 9.36995 -6.00506 7.91529 -5.26967 6.11536 -2.37416 2.50887 -8.47983 9.31509 -2.38155 2.54346 -8.08415 9.65214 -1.00693 3.19203 -1.6523 1.73553 -6.85283 6.9958 -4.11425 4.90193 -1.39597 1.58725 -5.05551 5.19458 -5.89969 6.11394 -5.9148 7.26824 -9.32271 9.93989 -1.62911 2.58215 -5.43399 6.14203 -3.11393 3.58792 -8.57619 9.3788 -2.23349 2.7884 -8.09022 8.54326 -9.7114 9.87076 -5.91086 6.10885 -7.35805 7.57276 -0.650002 0.879866 -3.24977 3.75531 -2.73948 3.41051 -3.08006 4.62772 -3.71868 4.31519 -4.13905 5.78577 -1.77297 3.02983 -5.85931 5.89333 -3.68972 3.93193 -1.43922 2.98425 -6.51534 8.33386 -6.6821 7.50874 -1.2541 2.11722 -5.40634 5.54411 -4.55502 4.60346 -4.32484 4.68497 -3.40711 4.31975 -9.20893 10.0853 -6.12594 6.9009 -0.12664 0.347193 -7.53378 8.82258 -7.79572 8.91645 -2.50098 3.39701 -4.17873 4.97732 -1.05822 2.47032 -3.1012 4.97736 -8.42126 8.74568 -7.83301 8.17843 -9.26618 10.584 -3.02667 3.7128 -8.30654 8.69242 -2.87173 3.43275 -6.59917 7.54843 -7.03447 8.20283 -5.75718 6.40637 -2.62899 4.1855 --0.520148 0.902194 -5.1538 5.61763 -1.25625 2.33142 -4.16336 4.3384 -3.01296 3.41026 -3.16515 3.26305 -2.40944 3.21897 -6.80742 8.57141 -1.15125 1.54824 -8.72251 9.50878 -3.15703 4.04482 -0.470308 0.726093 -0.199979 0.878243 -7.8908 9.17915 -6.91793 7.16038 -4.64783 5.00217 -2.21237 3.03073 -1.5825 1.63362 -3.18806 5.20795 -5.92725 5.95595 -4.65027 5.09868 -6.42204 6.87201 -8.08637 9.40221 -4.95542 6.16185 -7.45987 7.57979 -8.826 9.13961 -4.42078 5.27977 -7.26216 8.97585 -2.26919 3.33512 -9.4077 9.81908 -0.722223 1.03378 --0.0497795 1.19355 -8.22686 9.31082 -0.0733766 0.93037 -7.47883 7.9062 -5.28731 5.74181 -1.78496 3.61348 -0.690987 0.764344 -2.56442 3.54999 -4.27944 5.43124 -4.04412 5.35376 -0.663756 1.88268 -1.73567 1.78553 -8.07666 9.41842 -7.70138 8.42873 -9.27113 9.55873 -0.982413 2.5565 -0.994807 1.02007 -5.01226 5.31923 -8.87435 10.0597 -1.74836 3.22578 -0.151528 0.191719 -5.82608 6.06438 -1.17239 1.59955 -3.18515 4.11049 -1.92258 3.70604 -1.63692 1.8266 -1.83542 2.66228 -2.21954 3.11425 -3.97546 4.3928 -0.731374 2.05705 -5.44809 5.96359 -9.85934 10.0553 -8.42169 9.63654 -6.68148 8.43446 -2.00014 3.3485 -0.735924 1.73 -1.61833 3.05643 -7.87934 8.67316 -8.67441 10.0032 -0.794573 1.2493 -6.11926 6.41441 -5.2715 5.82597 -9.41854 9.46625 -3.46299 4.06742 -5.6487 5.79053 -1.46503 3.43496 -0.9957 1.53939 -2.4714 3.1301 -0.887049 1.6196 -3.04884 3.19662 -1.24337 2.05758 -7.61142 8.55766 -0.998279 1.64425 -4.74917 5.85236 -2.97632 3.94611 -4.11786 5.62709 -7.40498 7.62083 -1.47854 3.64736 -2.1176 2.64511 -4.55533 5.89436 -7.44618 9.79926 --0.410242 0.737348 -5.719 6.30861 -8.33692 8.38222 -8.78122 9.98195 -3.75452 4.26866 -2.23771 2.44985 -6.72455 7.61362 -5.9797 6.58846 -6.72885 7.60315 --0.710302 1.18332 -7.73287 9.383 -6.61213 7.67394 -4.12945 5.68527 --0.300887 0.341615 -5.77978 6.41534 -8.34001 9.96874 -1.62323 1.8283 -1.71788 2.23905 -7.43484 8.0418 -3.47322 3.8047 -3.47311 3.51261 -7.82093 8.86377 -2.46973 2.99125 -7.91166 8.55065 -3.39807 3.43599 -8.94792 10.0437 -7.70859 8.32487 -5.86852 7.13103 -7.64996 9.19033 -6.66742 7.8092 -7.88241 8.58675 -9.42939 10.3479 diff --git a/geom_bottleneck/tests/data/test_012_B b/geom_bottleneck/tests/data/test_012_B deleted file mode 100644 index 5f6e43c..0000000 --- a/geom_bottleneck/tests/data/test_012_B +++ /dev/null @@ -1,5000 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 -2.04751 3.00998 -3.19365 3.9383 -8.09529 9.45596 -8.88173 9.5618 -0.609816 2.67806 -1.57288 2.60884 -1.68354 1.80124 -4.92058 5.9959 -1.48728 1.84885 -0.299669 0.413905 -9.02156 9.56731 -7.50854 8.49023 -0.667131 1.89987 -2.22472 2.58793 -5.84395 8.79426 -2.35839 2.66935 -3.43111 3.69982 -6.71023 7.36801 -6.75697 9.0991 -2.35352 2.85316 -6.73054 7.39006 -9.48673 10.1493 -6.71226 6.72805 -9.22083 9.71889 -8.36513 9.33921 -0.0652672 0.319993 -3.26467 4.60881 -7.62269 7.79878 -6.48608 6.69515 -6.21737 6.88645 -6.56094 6.9699 -1.61317 2.7167 -5.08621 6.29754 -2.24676 2.8076 -3.09943 3.93921 -9.74093 10.0968 -0.417699 1.6381 -9.2958 10.2973 -3.6663 4.1369 -0.0229943 0.448065 -9.2928 10.1833 -3.66334 4.22032 -0.812172 2.19952 -7.88025 8.71192 -8.69379 9.34922 -1.70691 2.95352 -8.28737 8.29985 -5.22491 5.354 -4.03526 4.14084 -6.49359 7.05924 -0.24853 1.44718 -7.86936 8.75135 -5.76 6.68919 -5.85437 6.14314 -5.86292 6.0516 -2.35692 2.91295 -0.0990674 1.29386 -2.9911 3.56188 -0.552671 0.638929 -5.80756 6.22761 -1.21067 1.77175 -4.51882 4.72936 -1.99969 2.89732 -3.65968 6.61987 -0.478582 1.33355 -0.259061 0.289813 -3.89264 5.02474 -0.349236 0.438003 -7.70442 8.1729 -7.90389 10.1876 -3.06898 3.15219 -4.77811 5.29095 -9.76561 9.89451 -4.14295 4.2489 -0.540224 2.28623 -9.60749 10.2284 -8.49555 9.00307 -7.89668 9.76886 -4.12631 4.70897 -7.87898 7.91814 -9.29858 9.52908 -9.24009 9.91544 -3.73498 4.70275 -5.44467 5.9274 -2.13453 4.85697 -2.29607 2.88771 -0.807842 1.82319 -0.319005 2.08473 -1.62 1.63649 -2.20431 3.23869 -2.00132 2.77136 -6.64752 6.71706 -8.12249 8.28379 -7.55541 7.7813 -3.51763 3.64484 -9.21075 10.2811 -2.24501 2.54426 -5.64566 6.46452 -6.72307 8.56698 -3.91728 4.60262 -4.02535 4.29548 -3.0499 3.53135 -1.30677 2.32194 -9.36908 9.90669 -3.92387 4.33848 -2.87312 3.08243 -4.49167 5.2749 -5.43143 6.74905 -6.94595 9.16539 -1.9784 2.00429 -9.42478 10.2226 -3.7185 3.96576 -9.37729 9.50574 -5.34283 6.89736 -4.95341 5.84626 -2.91654 4.28413 -8.26544 9.3076 -6.23114 7.20273 -1.02585 2.21446 -1.6718 2.29591 -2.28926 2.73452 --0.648145 1.105 -1.44194 2.18562 -6.78584 8.37985 -2.00402 2.08248 -1.64076 2.04067 -0.0419044 0.455962 -5.51723 5.72098 -5.42117 6.81165 -5.70331 5.81707 -4.97889 5.60741 -3.38797 4.46846 -7.20995 7.66784 -3.45388 4.23386 -3.11057 4.35995 -3.29476 4.04676 -2.0519 2.94719 -5.37101 5.38271 -5.99383 6.64188 -7.48444 7.6377 -2.15043 3.05399 -1.54093 1.83799 -5.59223 5.87222 -5.8005 6.08042 -6.1208 7.22563 -1.2938 2.17454 -4.92405 5.0402 -6.91336 7.79688 -1.47978 1.99762 -9.00494 10.8315 -5.84805 6.15303 -4.95368 5.49096 -8.21704 8.31192 -0.715222 2.33517 -0.904183 2.54741 -3.42349 3.74906 -0.627978 2.37092 -8.41477 8.72651 -3.55373 5.58652 -4.12685 4.61533 -0.775274 1.41263 -4.78915 5.08639 -6.35791 8.15015 -2.88242 3.63509 -2.78526 3.07834 -0.39129 1.15933 -3.26615 4.74531 -8.78873 9.8888 -7.25612 7.45972 -4.97452 5.30012 -0.757255 1.35518 -1.29516 2.52446 -4.66838 4.96648 --0.0720209 0.832726 -2.68276 3.21123 -8.44253 10.0311 -3.40809 4.70506 -1.09617 2.35452 -5.19302 6.73599 -1.25316 1.58101 -6.2056 7.10099 -7.7666 8.52777 -0.301239 1.37275 -0.522829 0.731575 -6.73869 6.96826 -2.41703 3.20567 -4.94617 6.22052 -5.41524 7.68272 -6.0408 6.29938 -0.0642067 0.600878 -6.32122 6.63505 -3.25427 4.70611 -5.88704 6.1678 -8.71533 9.08476 -6.25575 6.88392 -1.54462 1.56366 -3.95938 4.03326 -2.54671 3.66798 -8.48603 9.10156 -3.37369 4.65454 -5.25469 5.64636 -7.02624 7.36449 -8.17061 8.44321 -9.23147 10.1149 -1.45589 2.25886 -6.47702 8.25307 -7.69088 7.91753 -0.442832 0.616926 -8.35355 8.83222 -7.65142 9.58906 -4.04877 5.17345 -0.76012 1.8686 -6.54877 7.40058 -7.41774 7.65429 -8.69655 9.3325 -4.8302 6.25306 -1.77203 1.90284 -3.67485 4.94569 -6.60162 6.72031 -3.05924 3.35235 -0.0823162 1.3486 -8.42991 8.86331 -6.81596 6.83527 --0.0174808 1.6745 --0.758131 1.08928 -4.14423 5.46342 -9.26253 9.85714 -7.42749 8.58214 -4.88849 5.86936 -8.99339 9.38141 -8.85301 9.18285 -2.64303 3.45658 -7.1133 8.66473 -3.50745 3.8629 -7.81615 7.83244 -2.94991 3.8741 -7.91822 8.8362 --0.0553088 1.19059 -7.35558 7.77948 -2.11257 2.20563 -8.57533 9.16338 -2.3515 3.13009 -4.13239 5.38696 -2.20763 2.93941 -7.2451 7.3211 -0.834388 1.57413 -4.47024 6.17855 -4.75947 6.80913 -2.99607 3.54732 -8.15998 8.80718 -8.94688 9.27971 -4.46335 4.9522 -5.30725 5.69786 -7.63989 7.86974 -6.69589 7.69565 -5.34018 6.08115 -8.59515 9.62264 -1.80557 3.22507 -8.62429 8.94242 -1.34532 1.95042 -8.60707 8.80741 -8.03275 9.40327 -4.30357 4.39095 -8.97954 10.7076 -2.18143 3.51825 -3.98695 5.62062 -2.48813 2.60622 -5.56957 6.43776 -5.18249 5.55459 -3.45373 3.64101 --0.00345662 0.570597 -3.61127 4.69761 -9.37858 10.6205 -7.24635 8.19639 -4.70142 4.80735 -3.30055 5.14257 -0.860415 1.31635 -4.72924 5.46893 -7.47391 7.72644 -6.22287 6.57754 -0.181652 1.01366 -2.14494 2.80736 -2.16406 3.19383 -8.52991 9.22722 -8.74411 9.06935 -0.575831 1.02699 -2.47315 3.0331 -4.2872 4.59813 -5.82293 7.03604 -2.08982 2.25319 -7.3626 8.41994 -1.23867 3.10885 -7.397 7.78026 -6.78837 7.32977 -0.829368 1.56617 -9.23075 9.35172 -6.76562 7.23578 -0.42851 0.839401 -4.83626 5.5852 -0.150032 2.45322 -2.16811 2.47439 -5.60245 5.81188 -7.43707 7.46519 -0.167317 1.44642 -4.9732 7.58343 -8.67391 10.2957 -0.318592 0.639284 -3.365 4.25929 -7.83683 8.88895 -5.20557 5.30114 -0.940347 1.74022 -5.39149 7.13464 -1.10826 1.27913 -1.9147 2.31276 -0.935283 2.49181 -3.67898 4.33336 -5.10125 6.07734 -0.348807 0.839242 -0.310986 0.58381 -2.03594 2.43119 -5.49755 5.94215 -1.94885 3.34409 -9.66806 9.97883 -4.79099 5.45155 -4.81158 5.30001 -5.17667 5.90019 -9.64168 9.99177 -1.14899 1.22792 -0.466236 0.952985 -6.93679 7.72282 -2.97285 3.23931 -9.22517 9.24315 -7.25783 7.46414 -4.37304 4.51815 -4.01069 4.02979 -0.843132 1.80443 -4.78572 6.04237 -6.02471 6.38074 -4.99536 7.76852 -4.97442 5.17384 -0.731231 1.49497 -2.2797 2.90845 -9.13211 10.341 -4.19545 5.08597 -6.13127 7.09817 -2.65124 5.02208 -5.40235 7.12912 -6.86258 6.91991 -8.24317 8.55273 -7.6877 7.69875 -3.33922 3.53776 -0.089484 0.40755 -1.34909 1.68726 -8.43113 8.72899 -4.90038 5.55994 -0.308089 0.490555 -5.42628 7.1433 -2.11647 2.56987 -3.56934 4.1619 -8.35794 9.24416 -8.8645 9.69151 -5.10701 6.0036 -7.66385 7.8412 -2.89952 4.55221 -6.01533 6.38269 --0.945182 1.07304 -1.79537 1.85576 --0.0313338 0.501067 -8.85689 8.87522 -1.61143 1.7773 -9.53229 9.84943 -3.51669 3.81091 --0.448016 1.10903 -3.16889 3.439 -4.30534 4.36372 -6.20158 8.09618 -2.20949 5.23616 -3.29459 4.17079 -3.90101 4.05611 -5.89688 6.85702 -0.734474 1.04471 -7.84341 8.02702 -8.69431 10.1086 -9.73194 9.92195 -7.63516 7.70631 -8.51416 9.33072 --0.0712911 0.361001 -2.76979 3.22708 -5.34404 7.5165 -5.64429 5.79865 -0.0755012 0.363483 -5.05631 7.27153 --0.60164 1.09659 -0.457228 0.876186 -4.27092 5.38033 -8.63891 9.04134 -6.29608 7.04242 -8.97795 9.93013 -5.00385 5.57737 -8.48068 9.44885 -7.35543 7.78492 -3.55698 4.01035 --0.268117 0.649128 -0.633184 0.66254 -4.54216 4.81132 -6.15574 6.35276 -4.3663 6.36286 -1.45231 2.07039 -7.37031 7.9157 -5.30961 6.3506 -5.80757 5.81762 -4.91767 4.97519 -3.45667 3.60965 -1.7934 2.3807 -4.33289 5.41047 -1.16021 1.29979 -3.75172 4.53521 -3.10835 3.1275 -2.68167 3.00314 -4.10639 4.24094 -4.90776 5.74069 -7.30861 7.86666 -3.52822 3.70998 -5.22222 5.28033 -0.00866476 0.326377 -7.73247 8.61481 -4.25231 4.77499 -8.41148 8.54604 -2.95389 3.63497 -7.76126 9.69124 -6.41218 6.69682 -4.86285 6.44503 -1.84783 1.9065 -4.08788 4.11706 -9.17473 9.50133 -5.15091 5.78649 -1.27694 3.33579 -2.92648 3.37855 -9.37392 10.5123 -4.81878 6.34991 -8.38702 8.83716 -5.07771 6.33618 -1.47438 1.75588 -6.20935 7.11166 -1.08286 1.38 -1.40048 2.0157 -6.60355 7.26234 -5.28396 5.90003 -8.9525 9.59216 --0.0305792 0.544664 --0.571491 0.735471 -6.287 7.03679 -5.35225 5.4104 -0.095812 0.605976 -4.33523 4.4048 -6.13288 6.80949 -4.14654 5.5505 --0.213214 0.260592 -7.56188 7.83088 -7.8132 8.65963 -8.02469 9.3254 -0.00641711 0.420562 -7.49269 8.15849 -9.26359 9.4366 -5.74008 7.86317 -8.62729 9.78825 -4.28946 6.20553 -3.19174 4.54991 -4.16992 4.25203 -2.46138 4.11583 -1.92971 2.16701 -3.43028 3.80842 -6.98297 7.28388 -7.51884 7.55947 -7.79102 9.44326 -0.416342 1.32311 -9.35398 9.85201 -8.72997 9.10384 -6.23398 6.88888 -7.46984 7.4875 -5.92603 6.66938 -1.77761 2.58697 -0.835966 2.06139 -9.63284 10.3565 -6.13677 6.42768 -0.151375 0.382404 -8.10315 8.13441 -5.52283 6.28113 -1.00873 2.44226 -2.5239 3.89871 -5.40599 6.72653 -3.43407 4.0068 -1.22444 1.26601 -7.04395 7.80599 -3.75987 3.77123 -6.43597 7.06249 -8.34435 8.87418 -8.25853 9.04009 -0.415321 2.32725 -0.639046 1.75525 -7.83226 8.12538 -9.55429 10.2734 -3.658 4.35867 -1.8588 3.93292 -7.38922 8.16823 -8.53626 9.23024 -0.848152 1.13412 -6.31667 7.2348 -3.81584 4.62621 -9.24748 10.7408 -2.75953 2.95288 -5.70188 6.62278 -4.22202 4.45368 -3.24616 3.88779 -1.05053 2.09846 -8.67718 9.52693 -2.14107 2.71959 -1.10518 2.69689 -5.01476 5.54139 -4.69244 5.20358 -8.88285 9.93012 -2.55228 2.77382 -6.72118 7.50057 -7.58999 8.71573 -1.83763 2.13481 -4.86135 5.27995 -4.39794 5.42117 -1.42512 2.98262 -4.80489 5.34701 -2.7993 5.13702 -7.52122 8.41729 -9.08613 9.37543 -1.1555 1.3935 -7.34071 8.0428 -8.33361 8.40349 -2.514 2.54741 -8.25732 8.41758 -1.65337 2.57964 -4.20527 5.06565 -0.723443 1.06987 -5.85836 6.64701 -7.908 8.07591 -5.01839 7.0105 -3.15908 5.10364 -4.3574 6.67192 -2.06662 2.46437 -7.5595 8.9108 -7.94919 9.20231 -4.11889 5.49714 -7.28151 7.51881 -1.30685 2.09479 -3.08479 4.47364 -4.50916 5.91511 -7.31605 7.63868 -3.14469 4.07035 -8.38431 8.87993 -7.42277 7.64967 -4.22472 4.26323 -8.49871 8.90746 -7.44431 8.09014 -8.35213 8.7504 -3.85634 4.37584 -9.12975 9.77042 --0.326056 1.17374 -3.53802 4.06211 -6.81775 6.8467 -8.19106 8.64489 -4.20526 5.37727 -2.74081 3.72143 -0.49642 1.10775 -7.76606 8.00524 -4.79825 6.38926 -1.99478 3.20484 -4.69853 6.29508 -5.73058 7.18643 -8.11708 8.64257 -9.62375 9.84838 -5.95271 6.38989 -9.0193 9.93848 -3.91188 4.10834 -6.065 6.60546 -2.62354 3.60072 -8.53665 9.06824 -6.40691 7.44693 -1.62959 2.5825 -9.4128 9.87031 -6.24697 6.62684 -3.31136 3.45626 -4.80347 4.9935 -9.21711 9.53416 --0.491547 1.72886 -4.75174 4.87217 -0.86329 1.53331 -2.4586 4.2578 -5.10301 6.2815 -5.08302 5.86788 -6.12434 6.78948 -9.68323 10.0973 -3.52576 4.40424 -4.9925 6.89084 -0.846638 1.80782 -1.09709 1.7685 -8.38592 9.03312 -9.56243 10.2682 -5.03592 6.6429 -7.8609 8.04599 -1.21404 1.31975 -7.47824 9.2063 -1.47849 2.68795 -1.2909 2.06381 -5.21288 5.54616 -6.27218 6.99345 -4.77622 5.08494 -3.30665 4.14735 -3.38947 3.55545 -7.71197 8.53162 -1.10565 1.50806 -0.7889 0.984689 -2.88598 3.33244 -5.70958 5.81232 -5.16567 6.24511 -6.91255 7.25784 --0.401084 0.753156 -4.81138 6.20671 -1.67301 3.58501 -7.19478 8.25624 -1.24428 2.2523 -4.31631 5.33357 -0.589196 1.02017 -5.69207 6.97803 -2.3854 3.25501 -4.1362 4.91135 -8.9932 10.3184 -7.95871 8.45158 -4.03213 5.26347 -3.09506 4.06425 --0.0310321 0.738171 -7.35733 7.61512 -2.48488 2.96253 -4.72098 5.69867 -5.5395 5.96914 -3.17854 4.283 -6.50012 7.33744 -1.93266 3.00941 -1.49319 2.71826 -9.0187 9.13099 -7.15259 7.40691 -8.71939 8.93257 -1.57203 3.11249 -0.933429 2.16903 -2.99663 3.71667 -2.06144 2.81311 -7.9072 8.2103 -0.490069 0.614737 -7.84111 9.70812 -1.15363 1.6421 -1.15475 1.43307 -8.2228 9.92116 -7.76825 8.40724 -6.15122 7.31322 -7.1427 7.49294 -2.30516 2.7019 -2.03336 4.03387 -8.3918 9.85707 -8.57214 9.59345 -3.8057 4.1119 -8.9223 9.38556 -9.32051 9.60504 -7.13349 7.69154 -1.71855 2.00425 -5.10333 6.0605 --0.149137 0.80973 -0.466224 3.1698 -4.19165 4.29604 -1.64018 2.3161 -9.40397 9.89211 -5.21738 7.06323 -0.525526 1.0331 -8.06992 8.08704 -9.81539 10.0915 -9.33514 9.50521 -5.95494 6.54519 -9.21466 9.35909 -4.96603 5.18164 -3.89238 5.53056 -5.04546 6.32916 -8.63758 8.65805 -7.03226 7.57074 -0.32029 1.10893 -0.194176 0.992252 -8.79061 9.50848 -0.239137 0.300717 -7.7234 8.43747 -3.43679 4.28954 -8.31382 9.18928 -1.39612 1.67253 -6.95733 7.39846 -1.29129 2.12185 -7.93611 10.2305 -3.67764 4.17562 -1.38149 2.42407 -2.2847 2.48412 -9.28655 10.0661 -2.94115 3.21326 -7.04238 7.91536 -5.06012 5.61526 -8.95611 9.91736 -2.18524 3.44007 -1.0692 1.10987 -4.37019 5.18443 -5.82014 6.441 -1.68642 1.70458 -4.93783 4.9535 -9.42003 10.1196 --0.356795 1.30987 -1.37778 2.80527 -9.54126 10.1758 -8.67413 10.5984 -0.914291 2.0697 -6.08696 7.09832 -2.82202 3.31103 -4.07818 5.50195 -2.85223 3.67449 -6.03006 7.10863 -8.84655 10.528 -5.08031 6.2001 -1.00272 2.74191 -0.169102 0.223253 -0.025089 1.26534 --0.203339 0.64667 -0.899666 1.48885 -0.74235 1.49976 -6.28212 6.80412 -5.65159 5.93106 -2.1686 2.7445 -5.02936 5.43091 -8.07124 8.80499 -8.65696 8.95802 -7.68394 8.365 -8.65062 8.69146 -0.058248 1.19535 -5.74545 5.84057 -6.05244 6.52152 -9.3878 10.3328 -7.71379 8.88044 -3.32961 4.54105 -8.51987 8.62854 -4.10821 4.16902 -9.47639 9.78723 -4.72417 4.84793 -2.32867 2.94068 -9.52275 9.57815 -5.32867 6.96127 -4.32462 5.1508 -4.46919 6.45961 -8.62661 10.9533 -0.0244049 0.56156 -1.49207 1.73164 -7.03156 7.81168 -5.88587 5.89732 -8.43632 9.65085 -7.52612 8.06726 -4.82464 5.6193 -3.8062 3.90356 -2.42708 2.51646 -2.06458 2.45877 -0.427218 2.24283 -7.42616 8.11513 -0.617708 1.01833 -8.74218 9.03592 --0.213346 0.599112 -9.05291 9.59124 -5.20365 5.54277 -2.85289 3.99509 -3.08468 4.58456 -0.136826 0.685254 -3.87191 3.99021 -0.970836 1.49673 -2.44355 2.53584 -8.88615 9.94545 -3.90591 4.52798 -1.52518 2.50658 -7.21268 9.07745 -0.767314 1.23833 -8.62975 9.42367 -6.71524 7.67686 -7.61205 8.48292 -5.312 5.65087 -4.75627 5.96261 -7.90674 8.0753 -7.37887 7.71478 -3.74483 5.52984 -2.7187 2.85544 -4.7902 5.62159 -2.89671 5.19815 -7.37268 8.72506 -7.11916 8.28301 -9.19814 9.75279 -1.2085 2.60113 --0.632009 0.889734 -7.99858 8.39743 -6.48346 7.10822 -6.30616 7.06648 -5.56514 6.51183 -2.41505 3.56224 -6.83749 8.84447 -9.05111 9.46906 -7.77476 8.4091 -6.11378 6.31232 -4.42882 5.69917 -5.88107 8.052 -3.75437 4.08893 -2.70487 2.77664 -7.26028 9.77257 -1.44621 2.73267 -2.0384 2.60397 -2.95402 3.68949 -6.04766 6.4054 -0.716046 1.77698 -1.5084 1.72988 -2.58426 2.80376 -8.05255 8.59793 -6.06336 6.20709 -3.29813 4.31473 -2.53477 4.92554 -8.78711 9.88634 -9.26627 9.82082 -6.70683 6.81257 -8.25978 8.99788 -7.28054 7.64237 -5.14556 5.20711 -4.20431 5.87866 -8.96592 9.97597 -4.06216 4.41519 -8.49174 11.0491 -5.24547 6.03094 -4.65885 5.95835 -5.09606 6.34846 -6.30463 6.65933 -6.48022 9.56168 -1.38088 2.98143 -0.486911 1.16767 -8.16327 9.34821 -0.768885 0.782616 -4.51699 6.08086 -9.55086 9.70242 -2.86802 3.72489 -1.88496 2.18749 -4.31876 4.33726 -8.38871 9.45631 -8.80634 9.36198 -5.232 6.42399 -9.86919 10.0492 -3.61902 4.53086 -3.13118 4.42364 -2.69395 3.1816 --0.303144 1.32309 -4.28871 4.36739 -3.8631 4.08745 -4.9291 4.98968 -7.14273 7.25505 -2.56623 2.59122 -6.01753 7.72265 -6.76051 7.53954 -6.76933 8.14741 -0.933137 1.83537 -7.9357 8.57904 -5.55847 5.59984 -4.25563 4.3345 -4.28087 5.21348 -8.88534 9.06554 -1.88575 2.94002 -5.26613 6.04562 -0.514249 1.45538 -0.130644 0.501645 -4.30564 4.86337 -1.57246 2.38451 -0.303814 1.77474 -4.22675 5.02783 -6.75381 6.78634 -5.64096 5.9725 -6.76159 6.98142 -2.35569 2.39119 -3.29794 4.95962 -6.55055 7.03366 -5.31474 5.69404 -9.01335 9.16988 -8.58306 9.37831 -7.06522 7.07778 -1.14695 1.74744 -3.15507 3.22865 -5.5925 7.14168 -2.14679 3.68767 -7.54789 9.71878 -1.5667 2.08742 --0.604726 1.66718 -0.306012 0.54799 -2.61731 5.08257 -0.80957 1.74655 -8.22035 8.81637 -4.401 5.449 -8.89389 9.01988 -4.80574 4.9322 -2.19895 2.88565 -9.06688 10.8095 -1.23727 1.58699 -7.14836 7.92057 -4.65155 6.15149 -0.563061 2.16535 -7.66764 8.0341 -8.32324 8.42774 -4.54541 5.11069 -8.0237 8.09992 -7.26113 8.09404 -2.55196 3.20317 -8.1236 8.60951 -1.90437 3.23006 -0.888133 2.50365 -1.13618 1.69444 -2.60463 3.01696 -7.2311 7.73229 -5.06501 6.01487 -3.9893 4.10116 -1.45278 1.56937 -2.74601 3.80778 -9.40705 10.3843 -3.02533 3.52213 -8.7097 9.2268 -8.73145 10.5552 -2.56059 3.5742 -6.27328 7.57089 -3.23291 3.30811 -6.33804 7.20304 -7.63648 8.34564 -9.82053 9.93597 -3.14924 4.58629 -5.28253 6.33733 -1.99411 2.04104 -0.305593 0.420302 -5.39668 6.64188 -7.99992 9.37823 -5.25169 5.65987 -0.109291 0.875734 -3.08589 5.50296 -6.51358 6.62588 -5.34687 5.58204 -0.043587 0.932787 --0.0264143 0.28677 -8.09722 8.37087 -5.46612 6.30285 -2.89146 3.49892 -6.73278 7.11762 -5.03068 5.90176 -1.7459 2.87727 -0.207707 0.448933 -7.00453 7.63105 -6.02789 7.87991 -8.1917 8.95854 -7.49014 8.73215 -8.48402 9.22063 -1.0467 2.4687 -0.241901 1.38802 -2.65867 2.81258 -5.46725 6.59448 -3.40578 3.75607 -4.2495 4.26392 -5.6608 6.213 -2.99705 3.88852 -6.17231 6.72018 --0.17415 0.492739 -4.89596 6.49895 -4.68876 6.60218 --0.0510568 1.46013 -8.87099 9.28179 -3.98894 4.5838 --0.20015 1.59214 -8.80756 9.51828 -7.74921 8.53538 --0.380041 0.440574 -2.69409 3.91466 -2.42747 4.56745 -6.25881 7.75647 -7.2941 7.77193 -2.60806 2.90251 -0.325028 1.22219 -8.29921 9.01416 -3.85524 5.45451 -5.2612 5.71877 -2.92849 3.73937 -8.6242 8.70808 -7.28153 7.35797 -1.65378 2.87917 -3.46034 4.24143 -3.99989 4.3199 -1.15266 3.60328 -4.8464 6.4887 -4.67021 4.68421 -6.96861 7.31554 -0.00723008 0.817047 -7.59589 8.88352 -5.56725 6.08465 -9.02409 9.19527 -5.81681 6.74193 -1.98221 2.98678 -8.76392 10.7646 -4.3903 4.50531 -1.0186 2.01838 -2.66674 2.74505 -2.41105 3.44579 -8.98295 9.18995 -8.14385 8.98779 -2.69613 3.60144 -0.445704 1.51319 --0.634889 0.860409 -6.32737 7.10112 -7.88824 8.06838 -3.76271 4.43529 -7.66487 9.30221 -8.73974 9.59191 -3.08965 3.43006 -8.9518 9.96154 -0.727194 1.55228 -6.35214 7.12234 -2.71987 3.22996 -7.12786 7.4379 --0.346107 0.837469 -8.47103 9.05987 -9.15744 10.628 -8.3237 10.093 -1.15052 1.16223 -6.95959 7.35423 -7.69488 8.44145 -4.21694 5.65913 -3.10562 3.37534 -9.73437 9.78252 -5.0458 5.53479 -7.80485 8.5163 -2.0442 3.75748 --0.459177 0.498702 -7.38032 8.32195 -0.909659 2.11175 -7.08657 7.56877 -1.84997 3.10206 -4.2517 4.53819 -6.71655 7.04117 -1.06604 1.29153 -2.69273 3.31633 -2.19732 2.84826 --0.723032 0.774865 --0.289734 1.44645 -5.87194 7.71917 -1.01576 2.83685 -0.981927 0.998558 -3.07172 3.73201 --0.112577 1.12642 -3.54063 3.67007 -7.21571 8.53815 -0.109957 0.839052 -6.86046 7.17211 -9.40878 9.69478 -0.989391 1.69046 -8.22287 8.8147 -1.48203 2.83308 -5.86418 8.0993 -0.749797 1.09852 -1.82996 2.50847 -0.28178 0.496017 -2.60694 3.00872 -8.6254 10.1698 -6.11641 6.41537 -7.19529 7.21342 -1.8214 2.17517 -0.991201 1.3788 -2.84924 3.12362 -5.75821 7.13843 -6.7106 7.35932 -6.6055 6.6829 -7.97105 8.58613 -1.56087 1.95845 -6.36782 7.10926 -2.43382 2.74699 -7.40509 8.8029 -8.42459 8.63142 -6.26128 7.55043 -4.6465 5.4431 -2.93214 3.29517 -0.157602 0.545214 -6.05931 6.72188 -1.7908 3.11731 -2.39217 3.58736 -7.07421 7.43852 -8.13419 9.74991 -9.53094 9.65319 -2.35726 3.68679 --0.108561 0.874853 -6.87136 8.84157 -3.40803 4.58835 -7.50448 7.89932 -4.29762 5.53867 -0.863755 2.30032 -7.24847 7.95342 -2.89618 2.98849 --0.928261 1.61922 -0.974105 2.91262 -6.99271 7.25856 -3.60995 5.01832 -1.26865 1.79704 -9.62217 9.80719 -1.02656 1.35514 -7.16502 7.32934 -3.12092 3.28857 -2.81374 3.84317 -8.73626 10.7585 -3.36982 3.61446 -5.08437 5.78949 -2.90218 3.0862 -9.2309 10.2523 -5.0967 5.48926 -9.73088 9.92708 -1.54013 2.78301 -6.73707 10.0789 -6.41735 6.838 -2.57935 3.04287 -5.719 6.70352 -5.42474 5.62732 -4.23904 4.69787 -4.16528 4.28736 -7.73477 8.84143 -4.90346 5.87324 -5.1969 6.14087 -3.48793 4.14182 -0.648493 1.07987 -6.88101 6.97932 -7.67342 8.74418 -5.16759 6.3871 -9.16292 9.49569 -8.77422 10.4817 --0.358149 1.04178 -9.54616 10.3424 -3.12027 4.26504 -3.81223 4.73004 -1.2386 3.32247 -8.21963 8.42629 -9.10312 9.51016 -6.96107 7.43045 -2.98587 3.12365 -0.198165 0.211424 -5.19716 6.10856 -6.10553 6.3327 -3.98176 5.11099 -1.02512 1.04242 -4.27949 5.71947 --0.457956 0.538807 -7.99877 9.48581 -5.88782 7.73303 -1.21496 2.85825 -8.46962 8.7862 -9.50182 10.1527 -5.85223 7.76234 -2.48368 2.52439 -2.35426 2.77405 -0.397056 0.482679 -0.160423 1.15786 -4.47109 4.8633 -4.74523 5.84196 -5.39177 5.75218 -9.00754 10.3249 -3.74813 4.03273 -3.08633 4.08426 -4.62672 5.29012 -1.92055 3.01442 -3.79279 4.5603 -9.52431 9.68334 -2.8126 3.32592 --0.313688 0.490785 -9.06695 9.36835 -2.60321 4.14185 -4.40231 4.99535 -9.32205 10.1041 -5.3879 5.44349 -0.308728 1.0956 -9.05758 9.08283 -1.90313 2.50914 -7.1391 7.59459 -7.47357 7.95993 -1.25267 2.34827 -3.33222 4.36522 -8.78126 9.38611 -0.635979 1.62283 -8.3492 8.57545 --0.572557 1.60517 -8.28855 9.03937 -3.47934 3.90271 -4.64498 5.43501 -0.872177 2.62011 -7.3893 7.58876 -2.14063 2.88063 -1.69361 1.75261 -4.19727 4.86483 -0.814676 1.27639 -8.19899 8.58203 -8.3394 8.99896 -9.31768 10.1694 -4.99218 5.19949 -4.2459 4.75266 -9.6314 9.64249 -4.038 4.75708 -7.92398 8.8579 -4.30747 4.54161 -7.51776 7.78258 -3.77611 5.1385 -3.53275 3.90278 -1.78619 2.12474 -3.18736 3.55159 -8.36759 8.52587 -5.52526 5.7843 -7.64174 8.09773 -4.37925 5.85699 -3.94295 5.31298 --0.464623 0.795523 -7.02408 7.7048 -0.0690458 1.0008 -1.05445 1.32797 -0.126093 0.712612 --0.809973 1.33869 -3.45568 3.96532 -0.433875 1.78679 -8.94667 9.65034 -1.98575 2.76936 -6.47974 7.67912 -2.74186 3.34153 -7.82655 9.32112 -4.71441 6.14932 -0.741177 1.76987 -8.05021 8.23239 -0.818503 0.882959 -7.13341 7.43399 -8.45939 8.93395 -4.44558 5.70161 -3.05657 3.86962 -8.75469 8.85537 -1.0922 2.23475 -6.00278 7.51598 -0.0530968 0.582206 -4.01788 5.48223 -1.30808 2.81869 -8.18848 8.59771 -2.43691 2.80685 -8.54045 10.6178 -7.58523 7.91634 -6.70183 7.49962 -5.81501 7.29783 -0.661853 1.58021 -6.50997 7.20411 -0.334292 1.40252 --0.329585 0.742961 -2.38756 2.48935 -2.78114 3.58788 -7.97227 8.55379 -3.36753 4.57472 -5.14486 5.31457 -3.99691 5.47708 -6.36404 6.8741 -3.22519 4.63321 -1.80583 2.21824 -8.20747 9.42947 -5.90819 6.94368 -6.58559 6.85933 -2.99108 4.03832 -7.20963 9.6252 -3.10244 3.87265 -7.23018 7.91389 -7.18084 9.61063 -6.74145 6.86507 -8.40721 9.5751 -7.12352 9.45614 -2.06653 2.51786 -4.9155 5.04183 -1.34304 2.92777 -0.571315 1.17285 -8.05396 8.28214 -5.29142 6.24974 -8.93797 9.23051 -4.6108 5.45568 -6.46124 7.53124 -3.16695 4.37505 -2.76803 2.82764 -4.1531 4.84927 -8.19433 9.00383 -5.12114 6.22952 -2.2542 4.74849 -0.621192 0.871537 -1.37403 2.28895 -0.305704 1.3287 -8.70471 9.53085 -2.29164 3.56607 -2.42106 3.37382 -1.14309 2.03085 -9.17624 10.3281 -1.88864 2.70161 -0.932647 1.2473 -5.72385 6.55694 -5.25496 5.38675 -5.85771 6.69626 -7.37247 7.93094 -7.73499 7.98782 -4.91417 5.27506 -3.51127 3.84403 -6.96198 7.27686 -6.51176 7.74735 -4.19954 5.08222 -1.58115 1.83842 -2.11889 2.3408 -1.94427 2.00422 -5.59977 6.86555 -9.46942 10.3491 -9.18904 10.1988 -1.71938 3.01547 -4.3515 5.4951 -2.53792 5.85188 -0.3884 1.36228 -5.02469 5.62368 -6.82402 7.72203 --0.320478 0.821539 -0.0885656 0.248783 -3.01725 3.44385 -6.63776 7.74386 -6.57899 7.9332 -4.82656 5.18327 -3.91909 4.43955 -0.0708319 0.101395 -2.59796 4.22775 --0.433109 1.26978 --0.434274 0.624336 -3.22018 4.25282 -4.63351 4.776 -8.889 9.56332 -5.35952 5.46531 -8.73832 9.22756 -2.03432 2.34194 -0.477994 1.43353 -1.2029 2.86844 -5.09945 5.76855 -8.89076 9.01771 -5.30284 6.31732 -1.56375 3.17543 -5.4773 6.36897 -5.30934 5.35073 -7.20096 7.7075 -6.51046 7.12888 -9.37127 10.0531 --0.0484323 0.348687 -1.83241 2.2143 -8.28633 8.60462 -2.51014 3.65817 -3.27798 3.58685 -1.41567 2.23302 -7.50794 8.10378 --0.0579575 2.10373 --0.856005 0.96621 -2.96238 3.48434 -1.36304 1.90594 -2.9997 3.41214 -7.2763 8.087 -1.69207 2.74419 -5.41625 5.83917 -9.22139 9.53794 -1.17477 1.51576 -6.74597 7.90871 -0.678913 1.73759 -5.70863 5.7214 -8.88411 8.93377 -3.44409 4.54586 -0.958963 1.53878 -8.29904 9.3867 -2.52433 3.60238 -8.16257 8.21986 -2.11395 4.23455 -6.85451 7.40364 -0.20286 0.639736 -2.05848 2.49034 -0.547013 0.77336 -7.83609 8.11903 -2.16539 2.29286 -3.94232 4.31368 -8.53475 8.54519 -4.77462 6.4158 -4.08395 4.68214 -1.56902 2.23811 -1.61337 3.11768 -1.51181 1.65521 -0.0821202 2.09269 -4.77622 5.16243 -4.62148 5.75837 -0.613158 0.952696 -1.89128 3.04792 -7.57509 8.92834 -2.70465 4.2941 -4.95906 5.12442 -8.0927 8.17277 -0.796512 1.3215 -5.74134 6.45291 -9.68479 9.78978 -5.89261 6.2292 -6.11377 7.9339 -2.20571 2.67129 -3.46228 4.27058 -5.26723 6.2653 -4.04391 4.26562 -0.380382 0.818995 -7.58108 7.7618 -5.02375 6.13042 -4.20178 4.66297 -2.83039 3.0221 -2.36072 2.45545 -6.68854 9.20726 -2.91388 3.42464 -9.33373 9.73449 -7.75844 7.94625 -2.72414 2.89669 -6.65438 7.96623 -1.00647 1.05385 -2.63018 4.9432 -0.152187 1.60259 -8.86332 10.3631 -2.31523 2.6815 -8.00509 8.61794 -1.69711 1.75938 -8.65442 8.73697 -4.23917 4.32001 -9.66851 10.1925 -6.93943 7.49814 -8.51986 9.03561 -2.10317 2.5175 -0.539549 1.75683 -6.29423 7.93236 -8.64345 9.54556 -1.44069 1.6814 -9.10017 9.77088 -6.16731 7.40496 -0.570043 1.93192 -2.65761 3.88544 -1.46895 1.52688 --0.369067 0.540647 -2.04868 2.72065 -2.1286 2.27858 -5.90157 6.16431 -1.55581 2.51851 -3.29705 3.81635 -3.4137 4.10991 -8.48699 10.1364 -8.43437 9.4642 --0.037842 1.47589 -0.541735 1.7805 -0.499576 2.36065 -4.1415 4.72435 -4.77598 6.16872 -3.30388 3.61854 -6.43796 7.85966 -5.27157 5.70871 -0.919258 2.18653 -4.00961 4.07902 -3.78201 4.23596 -4.50464 4.791 -3.70253 5.30916 -8.59228 8.70036 -4.31103 5.69049 -5.31775 5.34378 -2.24198 2.64194 -6.66937 7.41675 -7.21753 8.42057 -4.35399 4.52398 -6.90698 7.30084 -3.44296 5.44378 -3.36719 4.89951 -3.38624 5.33856 -3.44877 3.53693 -5.81398 6.3016 -7.24655 7.33127 -3.86142 4.53134 -3.85894 6.88112 -6.45704 6.95699 -6.90997 8.24088 -5.68813 5.7611 -0.699911 0.824323 -6.73758 8.42517 -9.34644 10.07 -0.289929 1.30554 -8.30644 8.49113 -6.47667 7.16073 -4.28093 4.90236 -8.32678 8.57064 -7.09205 7.92316 -5.55599 5.63919 -1.0104 2.22875 -1.72237 3.53668 -2.54699 3.14823 --0.668582 1.25485 -1.25582 1.37003 -1.35044 1.57807 -6.17083 6.30811 -0.618816 1.20065 --0.540992 1.21634 -2.06673 4.28857 -9.03398 10.8112 -8.73735 9.22814 -1.30178 2.7599 -6.0221 7.34889 -8.30124 8.52159 -1.92023 3.34545 -2.99331 4.93358 -3.8412 3.93379 -1.455 2.77005 -0.538664 2.1118 -4.16926 4.26053 -0.699746 0.937609 -6.36024 6.6511 -2.34698 4.84463 -8.11109 8.76496 -4.05425 4.67773 -8.2284 9.78568 -1.64423 1.80353 -5.70109 6.93764 -7.2091 9.67224 -4.47015 5.23311 -4.29326 5.36144 -7.93151 8.96494 -4.61889 4.96487 -5.38473 5.43594 -9.35456 9.66489 -1.23737 3.04121 -1.16077 1.19519 -5.91037 7.55679 -6.88344 7.60181 -6.39705 8.65039 -1.61791 2.93041 -9.68285 10.1396 -9.03129 9.05839 -7.0683 8.29875 -7.19624 7.41696 -7.5266 8.38738 --0.254571 1.01098 -1.30218 2.03222 -7.6432 7.73031 -4.99495 6.04757 -2.79394 3.29394 -0.31505 3.55963 -7.55382 8.18787 -6.00032 6.27664 -1.49355 1.79767 -5.21191 7.19537 -3.47816 3.75801 -2.10272 2.39494 -1.31887 1.93829 -7.14313 7.63055 -7.3141 7.77239 -6.03409 6.17265 -4.24946 4.53165 -0.0569272 2.56109 -8.44766 11.4872 -4.22879 4.28007 -6.92817 6.98775 -8.08859 9.0206 --0.0748418 1.48605 -6.56698 7.0488 -4.46624 5.4952 -3.66085 4.05778 -6.44711 8.93943 -2.45735 2.49339 -0.0606673 0.416191 --0.183838 0.750464 -7.08561 7.67275 -6.65423 6.90808 -0.0598735 0.364072 -5.2228 5.41543 -3.14042 3.19043 -2.40069 3.02829 -1.80441 2.1849 -3.47491 3.95775 -5.49162 6.63934 -2.03332 2.32288 -3.17234 5.25109 -2.58274 2.59951 -9.37994 9.97097 -4.71509 6.77966 -5.18915 6.84982 -6.12508 7.04354 -0.811202 1.98808 -1.46825 3.66984 -2.44386 4.15623 -7.60169 7.68242 --0.43208 1.22222 -5.40569 5.66153 -0.391742 1.79408 -6.77742 8.43115 -9.12828 9.3851 -6.39541 6.80626 -5.17919 6.29326 -6.57263 8.12999 -3.439 4.62236 -8.40525 9.80086 -7.60986 7.70099 -1.32123 1.44213 -0.526574 1.92338 -9.57195 9.79591 -9.52103 9.63159 -3.79775 4.20608 -4.74446 4.89606 -9.00085 9.60025 -1.26279 2.08363 -4.13639 4.49232 -6.59409 7.18315 -1.0637 1.78425 -5.4213 6.87661 -4.24407 4.30987 -9.79732 10.1204 -4.24597 4.83541 -8.47705 8.5145 -4.34095 4.93842 -5.68168 6.96086 -7.48654 7.91072 -8.32005 8.45111 -5.24065 5.3032 -3.25982 3.94442 -5.58106 6.18764 -4.4243 5.58619 -6.36467 7.07082 -2.70051 3.56014 -5.94534 6.87688 -7.33638 7.7645 -4.57067 5.86652 -7.83993 8.36854 -9.03617 9.11629 -7.44672 7.95614 -6.05876 6.3594 -4.02496 4.97119 -3.01438 4.36109 -7.4932 7.92357 -7.51661 7.53354 -7.60692 8.49678 -1.76088 2.59103 -7.08578 7.39566 -4.83605 5.42933 --0.186592 0.847663 -1.15879 2.33996 -8.11815 9.35472 -6.02584 7.62549 -0.881084 1.00015 -5.39067 6.27026 -0.910755 0.97444 -5.32174 5.65652 -7.69388 8.24928 -3.40521 3.7615 -5.60321 6.92388 -8.25096 8.34324 -0.00108913 2.16897 -0.508035 0.66573 --0.0517816 0.0876197 -3.26472 4.30955 -1.99494 2.14903 -2.089 4.32368 -5.17378 5.75964 -2.8779 3.54361 -6.56459 6.90645 -1.43196 2.88337 -1.48917 1.94009 -3.40807 4.25784 -8.0334 8.13458 -8.22254 9.6175 -2.96308 3.14349 -5.04768 5.71252 -3.9977 4.72614 -1.44384 1.60782 -7.78147 8.19817 -7.03854 7.50085 -5.90747 7.06091 -2.89169 4.31831 -2.46167 3.16529 -9.13228 9.1504 -2.57975 3.05313 -5.75976 6.52958 -8.10499 8.98982 -8.43162 8.76377 -0.422917 0.668254 -1.69046 2.09962 -5.50386 6.66954 -0.0897183 0.564514 -3.50103 4.1041 -3.91918 4.52559 -4.39297 6.18876 -3.90396 4.90868 -9.69362 9.85528 -6.27994 6.95062 -8.01563 9.09433 -8.25641 9.72944 -8.22072 8.35423 -1.27059 1.61352 -8.53312 8.96235 -3.49185 3.9042 -5.79579 6.046 -0.489013 1.2147 -4.00074 4.177 -2.66625 2.93036 -7.20267 9.34958 -7.44659 8.54707 -8.99915 10.1143 -7.59922 7.82031 -8.38502 9.03222 -0.160075 0.294398 -4.14549 4.3927 -9.35554 10.248 --0.159435 0.467922 -2.17272 3.72336 -8.63811 8.79976 -4.23215 4.66461 -6.99516 8.2035 -6.45212 7.88791 -6.20141 6.28633 -7.69396 8.82204 -4.50807 5.96315 -8.51725 8.89286 -0.939492 2.12064 -7.4615 7.62666 -8.46681 9.11769 -3.92828 5.40884 -9.05622 9.40015 -0.229625 0.860838 -2.05694 2.52113 --0.217927 0.574255 -9.55146 10.3256 -8.31497 8.3417 -3.52833 4.47013 -7.7131 8.52058 -2.15462 2.66777 -5.7674 6.17553 -3.3358 4.10589 -2.06642 3.00412 -2.43387 2.85242 -5.09473 5.84276 -7.3287 7.54846 -4.64254 5.11465 -4.05785 4.93614 -4.25413 5.43513 -2.96476 3.15378 -3.53732 4.48239 -2.34137 4.01272 -2.24879 3.40626 -3.43323 4.49055 -0.871415 1.33068 -0.508929 1.65611 -4.92057 4.94743 -7.03376 7.35193 -5.73043 6.47264 -7.82417 9.93642 -5.24102 5.9178 -2.38528 4.1676 -6.27437 7.19631 -9.29267 9.53262 -4.10098 5.24964 -0.383714 0.833317 -5.97628 7.92987 -8.15799 8.96819 -8.1687 8.29862 -8.16289 10.5149 -7.38205 7.89765 -3.81883 4.15607 -9.46915 9.61755 -1.50756 1.51863 -2.34236 2.84689 -0.398473 1.15027 -1.05302 1.49155 -8.71687 9.35232 -1.0502 1.40395 -7.83685 8.76302 -7.7731 8.46899 -5.56618 5.97458 -2.90035 4.12043 -6.40644 6.68706 -3.95201 4.37075 -7.1831 7.67748 -9.42789 10.0914 -5.45198 7.01256 -8.64609 9.45756 -6.01864 6.31515 -7.64621 8.65533 -5.45654 5.76553 -2.04332 2.75476 -5.49454 5.85693 -6.13688 6.21927 -2.66255 2.7385 -4.8326 6.43772 -9.12704 9.45287 --0.294488 0.318697 -2.26979 2.35516 -4.12949 5.58506 -3.01416 3.62246 -6.64697 7.10221 -6.44307 6.82985 -4.10484 4.73148 -7.42589 7.6029 -5.33055 5.50395 -2.46474 3.05847 -5.43677 5.59206 -2.13807 2.3988 --0.38424 1.8121 -0.00916704 0.219304 -8.62621 10.2262 -3.33927 4.51169 -5.45656 7.13165 -5.29253 6.57917 -3.51704 3.9421 -8.63729 9.13361 -3.92626 4.3469 -6.83104 7.52695 -1.22258 2.28191 -0.447646 0.789809 -7.96543 8.54328 -2.24269 2.42571 -4.4161 5.40481 -0.813992 2.21792 -0.694664 0.974182 -6.50017 6.88902 -4.00723 4.65882 -9.05784 9.85062 -6.80276 6.98196 -0.105446 0.379881 -0.416982 0.53336 -9.01269 9.55204 -3.27197 4.23315 -6.7017 6.89704 -4.21512 4.42378 -4.86735 6.90949 -4.52235 5.36878 -2.62205 3.55746 --0.551048 0.555476 -1.63274 2.71251 -4.26739 4.88085 -8.23129 9.77405 -2.49409 3.96851 -6.66387 6.88886 -7.72383 8.90611 -3.18511 3.27281 -0.73722 1.64435 -7.90329 9.02868 -6.94845 7.06773 -0.509461 1.54928 -4.63885 5.51652 -9.24395 9.5121 -1.00007 1.57161 -5.31349 5.45437 -0.929284 1.71034 -7.05985 7.63288 -7.38418 7.45373 -4.14937 6.5167 -7.49989 8.6081 -9.28313 9.57721 -4.41285 5.1497 -2.96148 3.09221 -1.58256 1.66419 -4.45116 5.43488 -5.70927 7.11699 -3.61105 3.93153 -5.92285 6.63773 -3.50065 4.48453 -7.97338 8.96464 -0.541394 0.965435 -4.46469 5.03925 -7.33695 7.6484 -9.64234 9.6938 -4.16378 4.17886 -7.10741 7.31549 -1.51829 2.62477 -2.1892 2.9684 -9.23767 10.0462 -7.87649 7.97087 -7.05385 7.85952 -6.91232 7.50277 -6.60185 7.81572 -2.27112 3.90211 -5.74452 8.2018 -6.25117 6.26911 -0.525893 1.53447 -0.392956 0.959233 -3.51591 4.71055 -3.10449 5.41156 -7.35964 7.65642 -2.89831 3.54334 -3.42338 3.68259 -4.75496 5.51419 -3.8792 4.48395 -2.18007 4.13236 -3.15798 3.16864 -8.91248 9.21598 -8.54636 9.34037 -7.93697 9.79709 -6.40205 8.9653 -9.67332 10.2252 -4.31771 5.25423 -7.27485 7.3725 -6.22971 7.11411 -1.16538 2.16762 -1.40443 1.6876 -3.14915 4.58847 -7.13761 8.72165 -4.38448 5.88699 -7.98309 9.19449 -8.491 9.05597 -5.55043 6.19359 -2.44006 3.36071 -9.56522 9.79903 -1.86129 2.00225 -1.65239 2.11478 -7.59392 8.4655 -2.44709 2.68538 -6.80932 7.04694 -8.8212 9.4182 -0.276845 0.956468 -8.17008 8.5538 -0.77864 2.06897 -6.78458 7.68692 -0.504907 2.67518 -5.56963 6.9058 -3.42691 3.5414 -2.52065 2.71583 -5.09924 6.26696 -0.223724 0.610039 -3.61258 5.29324 -0.388393 3.11131 -2.87763 4.45415 -8.26438 10.1169 -5.89742 8.17506 -1.89686 2.66651 -5.33662 5.68228 -3.37496 5.67291 -2.25713 2.36127 -0.402185 0.716342 -6.4231 6.79227 -3.22707 4.69314 -7.85092 8.77413 -3.31322 3.72455 -5.43021 7.7167 -8.5883 9.00864 -1.21371 1.71836 -6.35584 7.9706 -5.44438 5.50414 -5.31325 6.11217 -6.08888 6.78794 -7.70604 8.13257 -1.29858 2.48753 -5.54083 6.38817 -8.23948 9.82646 -7.5575 9.0224 -8.00415 9.39763 -0.488455 1.55358 -4.48727 5.20741 -6.46648 7.02349 -0.355939 0.611119 -9.4892 10.2189 -2.61893 2.82832 -0.268193 1.24687 -3.01964 5.19554 -6.29954 7.42795 -8.70796 9.48366 -5.39307 6.64597 -2.47001 2.60746 -5.30949 7.46529 -6.07973 6.16835 -0.764507 1.6144 -7.94123 8.52143 -1.88244 1.96592 -6.42103 7.02205 -7.673 7.73208 -6.66891 7.80675 -6.9305 7.5431 -6.62335 6.93873 -4.34846 5.77621 -0.49878 2.82928 -2.65221 2.80109 -7.45348 7.74372 -4.10129 5.26894 -3.87782 4.19855 -4.62113 5.22658 -2.84558 2.88185 -2.53209 2.86065 -8.94932 9.21967 -6.48046 6.89614 -5.81885 6.66829 -6.49129 6.62015 -8.5663 9.58685 -2.43346 3.89849 -9.36561 9.45886 -1.40232 2.65 -6.66 6.74041 -2.87007 3.49668 -4.71138 6.0184 -5.03638 6.08494 -7.77735 8.14253 -1.0301 1.27179 -2.58337 4.04699 -6.95419 7.89775 -7.81164 8.62551 -3.37669 3.96217 -4.68541 5.58692 -4.79697 6.34841 -3.95334 4.81962 -9.44006 10.0941 -4.91098 5.12386 -8.44273 10.1565 -3.6685 3.73156 -5.07599 5.33357 --0.138235 0.260923 -2.71154 3.45603 -5.75096 6.16127 -4.4775 4.64308 -6.80557 8.97442 -5.49408 5.76652 -8.31937 9.12886 -3.26479 5.51673 -2.57425 3.03145 -2.42465 3.92714 -7.86505 8.50835 -3.29229 3.43549 -4.08537 4.69709 -7.83885 8.60616 -1.61622 2.72716 -9.10228 9.41907 -8.49325 9.46612 --0.174644 0.351716 -1.95648 2.14825 -8.28844 8.4428 -4.35888 5.59521 -5.1396 5.22537 -0.330835 0.879566 -6.14972 6.82967 -3.14811 4.89049 --0.231668 1.08277 -3.13526 4.94545 -8.32674 8.91046 -5.22364 5.48006 -9.84318 9.88416 --1.07813 1.6965 -1.5095 2.0328 -8.03716 8.2792 --1.01307 1.46703 -8.22096 9.0055 -8.9917 9.0415 -5.60623 6.74537 -3.15991 3.19314 -3.13863 3.26451 -0.739618 0.896958 -0.67599 1.18486 -3.37355 4.06303 -0.38605 0.410067 -3.03297 3.46387 -3.45867 3.79806 -8.67249 9.53278 --0.213855 0.787363 -1.52316 2.61117 -8.31846 8.59736 -4.84685 4.94042 -7.41901 7.82623 -4.99029 5.09747 -5.3637 5.37612 -3.22123 4.77749 -3.21668 5.74743 -3.48748 4.59962 -8.00016 8.56269 -1.63631 2.42239 -1.05159 3.72319 -7.22643 7.95706 -5.65694 5.99195 -9.4469 9.66915 -0.857984 1.59867 -4.05869 5.69955 -2.65788 3.07259 -1.8038 3.38748 -3.91934 4.89922 -6.18534 6.70342 -2.85076 3.20176 -8.1897 9.9614 -0.685531 2.05322 -3.31097 4.00809 -8.26537 8.63475 -2.90508 4.07797 -1.25213 2.31285 -3.05752 4.03741 --0.481913 0.605629 -1.87958 2.19386 -7.28689 7.76316 -4.82075 5.20688 --0.08115 0.31839 -3.50085 5.89363 -1.31184 3.30269 -4.03137 4.81493 -6.11688 6.13923 -7.93584 8.43321 -4.9838 5.3733 -3.8174 4.11979 -8.56196 9.02824 -2.87809 3.89589 -7.95309 8.05432 -3.47469 3.63716 -6.61009 7.12576 -8.87374 9.79588 -7.31513 7.99089 -5.78084 6.68535 -4.96985 5.59877 -2.20236 2.52473 -0.661014 1.11035 -6.36183 6.58403 -6.67947 6.85093 --0.242005 0.513902 -0.442966 1.72024 -6.4587 6.74016 -6.67958 8.0837 -8.98524 9.56405 -6.91409 7.59877 -3.73596 3.97705 -5.51193 5.96437 -3.72029 4.50126 -3.09896 3.23616 -8.83312 8.91774 -0.32173 0.486199 -4.21092 4.59955 -2.61616 4.07081 -1.89049 2.65559 -4.96401 5.00629 -9.33156 9.70914 -3.72455 4.61054 -8.91265 9.6563 -7.12401 8.04324 -6.65393 7.25572 -1.04032 1.24927 -3.0174 5.56006 -1.47645 2.26867 -3.49833 4.37416 -6.16877 6.34452 -6.47417 6.90595 -4.27056 4.92535 -7.60439 9.35352 -0.426219 0.754405 -8.5291 8.68579 -5.84717 6.64632 -1.99513 2.5284 -5.10669 7.83064 -6.99006 7.37272 -0.871836 1.5934 -3.6572 4.38875 -0.154617 0.290737 -5.91634 6.50415 -5.33982 5.45293 -6.92602 6.94691 -0.349512 1.61427 -8.02048 8.99943 -5.75598 7.34946 -5.86948 6.51327 -5.11707 5.6181 -6.27656 7.10043 -8.48922 9.73833 -8.35863 8.69746 -6.67829 7.07852 -8.51257 9.50383 -3.76636 4.33757 -4.82804 5.57166 -5.17892 5.61254 -1.35188 1.94069 -6.04969 6.06833 -5.34181 5.82455 -5.71714 6.71234 -0.966462 2.56278 -7.95169 8.15951 -6.53583 6.89673 -6.73246 8.34493 -8.71111 9.76467 -7.53215 9.56537 -0.619041 0.736713 -9.24399 9.50151 -8.57184 9.88538 -2.82682 3.77294 -4.2649 4.84602 -8.6621 8.96426 -8.04469 8.3189 -7.81877 8.42944 -2.78031 5.16589 -1.23076 1.43577 -8.35385 8.49632 -3.27901 3.66774 -0.595941 1.41354 -3.37123 5.16685 -9.11003 9.95515 --0.25959 0.32069 -1.44153 1.70148 -1.61595 1.70799 -7.8201 8.53423 -8.5402 9.36947 -8.39125 9.8221 -6.2909 6.35773 -0.000933745 0.920054 --0.21358 0.491025 -4.00874 4.03866 -3.43552 3.55874 -7.85942 7.98987 -7.6681 8.06748 -6.19541 7.14765 -8.53891 8.96393 -2.38789 3.26866 --0.0162847 1.18379 -1.04764 1.52755 -0.400798 0.55475 -6.32001 6.94897 -5.9692 6.2012 -1.20784 2.67873 -3.58247 4.46372 --0.229647 0.559407 -5.65979 5.73489 -2.32795 2.78462 -0.706144 1.55147 -4.56527 4.6636 -5.98901 7.20908 -9.27329 9.95152 -1.31296 1.70529 -5.82933 6.41329 -4.17452 5.29881 -4.15885 5.25117 -0.35549 1.3511 -1.0591 2.4463 -8.87597 9.55625 -6.66826 8.57255 -0.355945 1.40613 -5.39729 6.10218 -3.78791 4.37501 -9.53885 9.87184 -2.67568 2.82552 -4.44836 4.52939 -5.96764 7.40168 -6.35578 6.98546 -0.636857 1.19517 -3.3986 5.55448 -1.46493 2.66884 --0.0676901 1.80921 -7.83396 8.53452 -8.3508 9.04561 -4.03407 6.0066 -0.997538 3.30635 -7.83064 8.03466 -4.57652 4.97461 -3.85952 4.15471 -0.960261 2.1069 -0.522458 1.52989 -8.81627 9.00768 -0.172256 1.29455 -5.69294 6.15752 -6.86391 7.75307 -2.32429 2.95415 -1.83191 1.90364 -0.400855 0.705649 -5.23264 5.39972 -5.19047 5.79842 -2.40804 2.89401 -0.462887 1.43874 -6.70213 7.90229 -4.37985 4.95797 -3.73768 4.30645 -0.756797 2.11146 -0.458724 0.472099 -3.93098 6.47147 -5.5294 6.00365 -2.97106 3.42174 -5.75875 5.80235 -7.96799 9.02105 -5.36254 7.22823 -6.56124 7.39973 -9.49234 9.57879 -2.87576 3.59509 -3.49182 4.28124 -8.68021 9.94486 -9.60199 10.1276 -9.70115 9.81776 -3.09609 3.98732 -5.00113 8.15031 -5.21248 5.74835 -9.23337 9.5696 -2.92777 3.56297 -2.52044 3.04905 -4.79908 5.05762 -1.98626 3.69659 -4.78726 6.20637 -7.39711 7.42831 -4.44319 4.78716 -9.28452 10.0832 -8.00774 8.85707 -9.22947 10.0523 -4.38653 4.86012 -5.15285 5.23106 -8.95413 9.75947 -2.90286 3.32407 -0.348694 1.39738 --0.0660432 0.293424 -4.09079 4.2922 -6.0407 7.23031 -2.83771 3.72237 -8.54697 9.38898 -2.16742 3.45018 -8.83255 9.30343 -3.59112 3.6531 -7.53452 7.81898 -7.11781 7.19773 -8.2892 10.0259 -4.91072 5.06031 -5.8232 7.25924 -7.0641 8.31604 -9.477 9.63892 -5.8003 6.58306 -9.63988 10.2754 -0.654364 1.02398 -5.9488 6.85043 -7.86867 8.99891 -9.202 9.46902 -4.17932 4.20271 -6.50328 6.71085 -7.19848 8.15579 -5.62459 5.75449 --0.159668 0.791409 -7.55683 8.7315 -1.03278 1.423 -0.751457 0.808785 -6.2203 6.50634 -1.64418 2.98238 -6.87468 7.00652 -6.36966 6.7117 -7.69893 8.89535 -0.419794 1.05032 -2.73928 4.31548 -0.409245 1.55228 -6.03905 6.39323 -0.409695 0.789834 -4.39148 4.40935 -1.14673 3.23607 -5.85562 6.44503 -6.87394 6.88742 -3.761 4.35136 -7.2208 8.01436 -6.49839 6.54002 -4.70791 5.91886 -4.24906 5.96619 -2.53482 3.91496 --0.369254 0.69193 -4.81351 6.31088 -9.76066 10.0736 -1.4413 1.55942 -7.21917 8.88908 -6.03521 7.56826 -1.25568 1.42024 -5.47575 6.04431 -1.43099 1.99979 -5.1004 6.04088 -6.54798 6.56118 -1.0142 3.1564 -1.75267 2.1453 -1.28133 1.36044 -9.60996 10.0563 -1.14397 1.50247 -6.86688 7.08724 -8.38287 9.18041 -0.132076 1.27657 -6.52553 6.9301 -0.223917 1.41325 -1.18902 1.79753 -1.40084 1.75678 -1.94524 2.51929 -1.98276 2.62875 -0.763281 1.05483 -7.97952 8.51249 -1.059 3.05463 -5.33401 5.85094 -8.37442 8.64374 -6.62865 6.67315 -1.01707 1.64386 -0.113335 2.23523 -6.71906 8.00216 --0.886574 1.29366 -4.20078 4.85294 -8.43336 9.06988 -3.55413 4.40768 -6.69076 9.01132 -6.18982 7.14109 -7.14381 7.7046 -8.63195 9.47031 -8.88052 9.84886 -3.34443 3.62637 -4.5862 4.72832 -4.95757 5.23571 -2.85993 4.04966 -1.43846 2.27425 -5.43112 6.30496 --0.452609 1.55525 -7.17706 7.71287 -5.78537 5.79579 -8.51102 8.9466 --0.472904 0.810489 -3.83688 4.24045 -8.04432 9.04582 -1.57259 3.37136 -1.22231 1.33582 -5.73006 6.26477 -2.90855 4.22125 -9.39717 9.4287 -3.63873 4.16094 -0.442035 2.08889 -0.294491 1.31124 -3.14755 3.86305 -6.57634 9.44898 -2.19051 2.41878 -4.99277 5.12569 -4.10425 4.9423 -4.83547 5.62769 -5.73879 5.78179 -8.90329 9.81905 -5.60168 6.17538 -5.83843 6.66128 -1.84271 2.57406 -3.01047 3.33662 -2.85037 3.79158 -3.49007 4.46877 -8.58942 9.51529 -0.613753 1.12824 -8.23757 9.54707 -9.27134 9.4196 -6.27126 6.56417 -2.17206 2.33018 -3.53588 5.17162 -8.6312 10.0868 -5.76342 6.66164 -9.01501 9.90984 -3.22004 4.18954 -4.37918 4.68595 -2.00928 3.49815 -6.64229 7.06693 -2.85962 4.58794 -8.45587 9.8897 -2.8481 3.65956 -8.65849 8.67336 -6.48486 6.58637 -5.82336 7.45254 -4.02267 4.59696 -2.24997 2.83815 -8.16201 8.55518 -7.40645 9.07085 -1.43137 1.50333 -8.7212 10.9419 -1.50523 2.44124 -1.92455 2.85819 -4.50866 4.53052 -5.75781 5.81275 -1.71013 2.0282 -9.31592 9.9015 -6.14972 8.18798 -1.85705 2.20068 -4.80971 5.10509 -3.31201 3.58168 -8.61824 9.31861 -7.19497 7.86933 -3.25381 4.53472 -5.62799 6.29537 -9.00659 10.021 -9.15156 9.74827 -2.0324 2.80741 -0.714403 1.00476 -1.26522 1.80417 --0.362995 0.41758 -7.08785 7.71544 -5.55685 5.74045 -0.428866 3.03773 -7.61574 8.94894 -9.07256 9.69772 -4.49537 5.06822 -5.66388 6.48899 -1.69126 2.69607 -9.90539 10.0783 -6.56455 8.27128 -6.61988 7.86616 -7.42012 7.64493 -2.99922 3.35282 -4.69379 5.18947 -0.87894 1.30518 -9.47632 9.61234 -0.665754 0.855958 --0.422778 2.11197 -3.38786 4.15441 -7.57236 8.75855 -1.89832 3.50224 --0.185929 1.0777 -3.32911 5.53465 -6.91111 8.69247 -6.97456 7.86905 -4.75518 5.0948 -4.23733 5.83368 -8.52456 8.56086 -0.0978267 0.136564 -7.4668 7.99757 -5.52851 5.80858 -8.5833 8.88589 -5.10603 6.41348 -4.70682 6.59981 -8.60265 9.19477 -5.04514 6.24014 -4.49041 4.88669 -7.40925 9.15624 -0.80364 1.35315 -7.11604 8.01153 -0.267749 0.714089 -0.121521 0.822226 -9.30556 9.81307 -2.11398 2.92567 -5.97722 6.08022 -7.13483 7.22211 -8.00161 9.27274 -4.87681 5.51654 -3.11843 3.84311 -5.17747 5.98482 -3.6077 4.46306 -1.37454 2.2443 -4.93385 5.96357 -2.92184 4.0964 -4.88767 5.56353 -2.87394 3.76336 -0.326521 0.622872 -2.42056 2.45007 --0.527891 0.827211 -6.73151 7.20155 -1.82048 2.54905 -1.35563 1.88701 -3.64202 4.10669 -5.22846 5.23953 -6.06271 6.46993 -2.71418 3.2081 -6.41179 7.57176 -7.45823 7.79609 -1.01227 1.39137 -9.0872 9.20132 -5.083 5.64038 -5.63236 5.97945 --0.317645 0.822313 -0.865396 2.65587 -5.71839 5.98983 -1.50978 2.08611 -2.95824 3.70996 -0.264301 1.02233 -8.22351 8.98589 -4.87805 5.24127 -2.31329 3.46752 -6.19539 6.69676 -5.18643 5.40947 -7.15453 7.66643 -1.20694 2.25111 -7.87378 7.89093 -5.16514 5.604 -8.68354 9.01395 -7.33753 9.37499 -2.94627 4.06036 -8.64337 8.85727 -0.0353092 1.0128 -6.98437 7.35718 -6.77073 6.79959 -3.13559 3.70735 -7.40139 8.27017 -4.01174 4.39788 -3.22281 5.11647 -7.79256 8.58737 -0.642233 1.39694 -7.18603 8.69453 -3.37803 3.59355 -0.762287 0.84262 -4.21823 4.52565 -0.894924 1.35434 -0.844327 1.19938 -5.57958 7.05431 --0.631066 1.55134 -3.78962 4.17935 -9.15329 10.4824 -5.47536 5.52975 -8.81243 9.16088 -4.45989 4.94123 -8.68235 9.45112 -8.04719 10.3938 -8.87349 9.40483 -0.502543 0.570283 -2.08512 2.47652 --0.654512 0.804355 -3.68569 5.21711 -5.33017 5.80226 -3.44991 5.31415 --0.00417763 2.95077 -7.17784 7.9318 -1.2721 1.31642 -5.24415 5.64173 -2.79434 3.28746 -4.54991 6.49276 -4.74707 5.12555 -7.36365 8.15777 -0.913049 1.79828 -1.47498 1.83425 -2.64271 3.38567 -4.78159 5.44718 -7.6087 7.66442 --0.484393 0.909893 -3.16824 3.23757 -4.43021 5.90284 -4.25954 4.74995 -6.58742 7.24125 -1.86151 2.27069 -3.16459 4.5945 -1.06471 2.08965 -3.31028 3.83029 -1.52593 2.47521 -0.703789 1.42451 -1.47969 1.68923 -2.92352 4.24089 -9.84088 9.93485 -3.18205 4.27817 -7.39345 7.78945 -3.78808 5.41572 -4.38624 6.75693 -6.93065 7.16977 -1.01289 2.19807 -3.37006 3.54196 -5.50238 5.58285 --0.225113 1.99347 -1.67796 1.86943 -6.1999 6.35102 -3.80494 4.74814 -1.13294 2.02639 -1.1965 2.6548 --0.284453 0.856092 -4.26565 5.02196 -9.66948 9.88874 -6.20287 6.25528 -4.38154 6.65806 -3.77411 4.3075 -5.77177 6.78486 -9.16311 9.816 -3.22861 3.42009 -3.36573 4.34724 -6.76951 7.58025 -4.83813 5.23042 -3.87192 4.37372 -5.56859 5.90066 --0.368163 1.4593 -5.44031 7.81671 -2.66342 2.99253 -6.11846 7.69499 -4.98811 5.17531 -4.45078 4.67513 -4.88206 4.94128 -2.51813 3.0268 -0.461292 1.15264 -2.34766 4.48652 -0.198819 2.23425 -6.85634 6.98248 -0.912438 1.81872 -4.84933 6.34912 -5.15613 5.82891 -0.172772 0.994083 -3.37381 3.64549 -1.98836 3.2697 -1.64344 2.06049 -0.766585 3.09305 -7.8979 8.28046 -4.34856 5.01341 -6.69809 7.24239 -5.19034 7.04959 -5.3747 6.92123 -7.8893 10.1251 -6.11207 6.99125 -5.37115 6.84111 -9.04786 9.11002 -6.45326 6.64415 --0.76294 0.92832 -0.980411 1.8166 -3.05536 3.50031 -6.10827 7.55786 -6.57848 9.06264 -7.66855 8.861 -4.80276 4.82283 -1.99932 3.2877 -9.45229 9.80653 -0.457474 0.778684 -5.44444 5.95239 -5.60974 8.05169 -7.64656 7.79632 -6.78372 7.65134 -6.93878 7.82023 -9.08292 9.55308 -9.16329 9.25802 -1.4909 2.38688 -4.31881 5.3564 -5.12535 5.60119 -2.44591 2.54637 -7.36929 7.80452 -2.13707 2.97655 -9.73557 9.94588 -1.96637 3.36097 -0.857068 2.29643 -5.58224 5.91142 -8.90714 9.0255 -9.77988 10.0711 -0.41121 0.970955 --0.518356 0.91447 -7.58725 7.71255 -8.1435 8.78712 -6.5487 7.17991 -4.94961 5.50283 -8.14086 9.03281 -3.51281 5.24806 -3.5786 3.84066 -6.27435 8.37735 -8.65263 9.5555 -2.87484 3.56117 -5.57707 6.55879 --0.111276 0.264178 -3.60894 4.15477 -2.82322 3.64397 -8.40669 9.1127 -8.43089 10.5298 -1.38472 2.2453 -1.74464 2.00472 -4.01588 4.67572 -0.408869 0.938602 -2.06155 3.46067 -4.4871 5.08963 -2.4435 3.87355 -1.32864 2.55801 -4.78579 5.26122 -7.43027 7.57749 -6.90971 7.32716 -8.01095 9.46872 -9.41627 10.524 -8.83143 10.4474 -0.631816 1.75513 -1.72965 2.17123 --0.513239 1.1886 -6.75616 6.7984 -2.49278 4.26493 -0.230011 0.966298 -3.78506 4.95013 -2.03886 3.14808 -7.87309 10.5637 -3.54564 3.58055 -1.91974 2.9194 -4.8503 4.98668 -4.66494 4.83558 -7.57916 8.24358 -4.78743 5.38547 -2.81034 3.34534 -1.00297 2.0138 -6.87593 7.17736 -3.93157 5.0655 -3.10361 4.05519 -8.22876 8.38326 -7.48377 8.31026 -2.23106 3.4905 -0.130934 0.606709 -1.22344 2.55898 -7.55829 7.92597 -4.10977 4.86263 -0.122756 0.264176 -3.8357 4.15854 -1.28414 2.13031 -0.280029 0.805504 -2.88245 4.1704 -5.57936 6.94781 -6.22719 6.33201 --0.761013 1.16475 -6.16636 7.12566 -2.98935 3.192 -2.23263 2.34362 -3.9082 4.11692 -2.66865 3.5275 -1.87676 2.43966 -4.60035 5.39332 -2.74287 3.73097 -2.81953 3.96666 -5.73644 6.04042 -4.02179 4.52419 -3.26438 4.07346 -1.22509 2.13719 -7.91885 9.71846 -1.28152 1.48079 -7.97918 9.26344 -8.75682 9.8677 -7.25678 7.45362 -8.16161 8.87066 -1.21873 2.37224 -7.76739 9.06346 -3.89932 5.03406 -3.53901 4.37006 -2.93795 4.04333 -6.36543 6.72985 -4.72622 4.98804 -1.86205 1.99008 -0.784581 2.05264 -0.978519 2.91723 -3.9067 6.47195 -0.735425 2.38151 -8.37394 8.41609 -6.91804 7.23374 -9.39259 10.1026 -7.28732 7.43466 -4.75982 5.44264 -6.71504 7.53933 -2.17125 2.54358 -0.703562 1.39087 --0.221711 0.541965 -9.22839 9.39159 -9.53465 9.97585 -1.44304 2.53666 -7.886 8.85051 -9.33174 10.1632 -2.60898 3.42889 -1.73658 2.02589 -6.31651 6.77762 -7.26755 8.34499 -9.01312 10.9837 -7.47361 8.96251 -7.98365 8.02586 -1.40065 3.44891 -9.44617 9.55391 -8.24265 9.34849 -9.366 10.4216 -0.375354 1.17522 -3.37114 3.38278 --0.742469 1.07634 -4.29988 4.81879 -4.18605 7.21928 -7.41047 8.29198 -6.68173 7.60225 -3.24292 3.30695 -1.8951 3.42167 -3.97359 4.2857 -4.72621 5.80575 -4.75014 5.02239 -6.43454 6.94568 -7.16601 8.10355 -2.16685 2.23666 -6.70852 8.63284 -8.16988 8.95848 -0.277002 1.30648 -1.5803 2.28632 -2.22634 2.34679 -0.200623 0.814959 -5.27457 6.51651 -2.49533 2.90705 -6.48922 6.69528 -8.18879 8.63551 -2.75159 3.633 -0.884853 1.56434 -1.87488 3.98951 -4.24783 5.17713 -6.22499 6.56095 -5.68238 5.99272 -3.75553 3.85012 -4.87543 5.39966 -6.62671 8.72493 -3.50262 4.05131 -5.38952 5.4974 -7.84971 7.94051 -5.39123 6.66564 -5.43986 6.17256 -7.48968 7.7677 -4.2685 4.57296 -1.75169 4.11058 -5.03634 5.16102 -4.68003 4.84715 -8.36249 9.98761 -8.94297 10.6969 -6.21572 6.24305 -7.90303 8.0672 -7.90426 8.41244 -5.98512 7.93187 -5.13297 5.27136 -6.58367 7.4971 -4.72663 5.22956 -7.99667 8.59246 -4.3303 5.92188 -1.3132 1.80875 -7.70104 9.20947 -1.78862 2.00473 -9.63678 9.65571 --0.264416 0.318054 -2.70004 3.40777 -2.74642 3.73608 -3.6494 3.6743 -8.03113 9.22851 -1.07526 1.3116 -4.05436 5.33291 -4.60907 6.03605 -7.83426 9.10358 -2.27997 2.77309 -5.63139 6.92616 -4.40717 5.25214 -1.98986 3.5062 -2.42393 2.9584 -1.94336 3.08456 -1.20185 3.01827 -0.641733 2.10095 -7.25046 8.29391 -0.640392 1.26451 -3.9588 4.85492 -6.83036 7.41101 -6.48581 7.08757 -6.48734 8.47856 -9.55084 10.3774 --0.173137 1.26574 -2.32702 2.58775 -2.7463 3.13914 -7.86951 8.62807 -5.96916 7.92759 -0.217046 1.70373 -1.04207 1.05755 -4.79058 5.07902 -4.19024 5.35395 -9.00175 9.83715 -8.37554 9.275 -4.5204 4.82999 -3.49936 4.75519 -7.07916 7.74619 -6.66726 7.35282 -7.39513 8.55523 -7.50381 9.60708 -1.39304 2.26927 -2.84101 4.76376 -1.21779 1.59353 -4.7893 5.70143 -9.12195 9.57131 -5.40461 6.15443 -2.86445 4.26837 -8.01324 10.9082 -2.96659 3.8042 -2.4897 4.59323 -6.37887 7.15878 -7.00143 7.6419 -3.22491 3.41843 -1.22852 3.31783 -2.09881 2.56121 -4.43205 4.67051 -4.39328 4.66715 -2.38355 3.39058 -0.638802 1.59399 -5.32717 5.81376 -8.00353 9.72007 -8.77281 9.81649 -8.95552 9.86609 -2.90915 3.96556 -3.88176 4.93124 -6.45945 7.69942 --0.108577 1.57424 -0.304992 0.320561 -6.47789 6.5515 -1.98211 2.05312 -6.2741 7.35626 -9.45057 9.67918 -5.2916 5.48037 -0.158802 0.712187 -6.42002 6.84323 -9.11085 9.13063 -9.42446 9.95882 -6.03624 6.96469 -9.2473 9.6286 -7.10342 8.71163 -3.34072 3.35187 -7.4602 8.58506 -8.7963 8.81873 -0.323615 2.22687 -0.326746 1.76681 -2.20062 2.76862 -7.55181 7.85006 -0.941035 1.28117 -8.76643 9.60019 -9.19731 9.33092 -6.0479 6.57293 -6.12725 6.24356 -7.53078 8.92488 -3.1841 3.48283 -1.85544 2.01888 -7.3849 9.29183 -5.03915 5.27721 -4.77142 5.46282 --0.291696 1.14641 -1.61367 2.20867 -5.31853 6.69431 -2.52731 3.13139 -4.86677 5.18106 -4.50183 4.60969 -5.95881 6.09964 -2.41939 4.42026 -6.92003 7.17891 -4.29584 5.48557 -8.02803 9.06315 -2.82326 3.49599 -5.8647 5.87561 -2.38814 3.62688 -6.32418 7.17662 -5.99907 6.5059 -3.84698 4.14446 -9.80728 9.82132 -5.2366 6.30871 -9.81878 9.91004 -1.53024 1.83525 -2.98035 3.68531 -4.5418 6.98786 -5.19561 5.9846 -0.946068 1.46672 -3.26948 4.71928 -6.13476 7.68682 -8.36934 9.65072 -6.40074 7.14762 -1.01349 1.80493 -8.4514 10.25 --0.180382 0.682704 -1.03041 1.63565 -5.64642 6.96069 -2.73598 3.67485 -5.8705 6.66157 -4.68343 4.7176 -5.83787 7.6818 -1.42529 2.234 -3.73726 4.19241 -5.38341 5.81884 -1.13088 1.69073 -0.968034 1.98828 -1.06007 1.11039 -3.50129 4.51807 -5.83133 6.77904 --0.334945 1.29129 -0.326706 1.16015 -9.15028 10.4391 -5.13047 6.79712 -1.06952 1.38997 -5.79345 6.49898 -7.88149 8.5143 -8.00404 8.09794 -8.22725 8.28904 -6.38406 6.61356 -6.32166 6.73458 -7.17066 7.32049 -1.64338 3.79327 -7.92135 8.55568 -7.15578 7.42231 -6.70701 7.65427 -5.76608 7.63064 -3.54163 4.08662 -3.81402 6.76906 -4.5998 4.61865 -9.01471 9.18718 -5.21234 5.73335 -0.946018 1.39917 -6.99714 8.29739 -5.64458 6.93965 -3.39809 5.70907 -6.32284 6.83604 -8.50347 8.53097 -3.90118 4.85721 -9.41198 9.62076 -4.41514 5.55152 -7.69979 7.81249 -5.34434 5.37105 -7.25274 7.76114 -7.67383 7.92718 -5.82851 6.29417 -0.935651 1.2842 -0.639586 0.786771 -6.39823 8.31226 -3.67546 4.89035 -9.20323 9.57287 -2.33896 2.99576 -8.51933 8.80243 -0.983098 1.11084 -8.48215 9.42998 -7.29586 7.3914 -2.00695 2.89046 -2.60909 2.62433 -2.04118 2.92033 -7.60386 9.01419 -7.32896 7.73342 -9.51693 9.54891 -5.1323 5.24962 -6.35326 7.18302 -2.50952 3.51872 -3.4149 3.57431 -9.18412 10.4976 -5.68123 6.42697 -5.87758 6.0124 -6.3202 6.64588 -8.2547 9.98176 -5.50949 5.7854 -0.0824268 0.128178 -2.17292 3.76233 -7.22786 7.68214 -5.09326 6.4151 -4.30171 4.86688 -2.39206 3.47399 -7.95152 8.35556 -2.40133 2.936 -2.77819 3.87516 -3.252 4.33376 -9.54269 9.7513 -6.6747 6.73043 -0.611474 1.97158 -7.65864 8.53689 -1.58345 1.8017 -2.56917 2.8152 -8.5424 8.8301 -4.98159 5.44499 -5.82482 6.03578 -3.55509 4.90785 -5.77028 5.94747 -0.163965 1.1379 -2.85039 2.94261 -4.24343 4.67273 -3.22636 4.06084 -6.03662 6.21018 -4.55495 5.07697 -1.91173 2.51739 -6.54894 7.24036 -5.55502 6.92676 -0.245707 0.586188 -2.28044 3.29563 -4.71378 5.25198 -8.28953 8.44891 -9.42282 10.179 -5.0548 5.73614 -6.3203 6.43659 -6.54178 8.82077 -3.67181 4.17365 -8.51445 8.96445 -1.69648 2.84524 -0.194222 0.920147 -2.48533 2.59803 -1.66002 1.6739 -4.79833 4.95404 -1.09801 1.11009 -6.62529 7.4066 -8.0099 8.37262 -3.55429 4.11824 -6.2666 7.12137 -7.83222 8.01342 -9.37156 9.72961 -1.1647 4.04434 -4.50719 5.09068 -3.25175 3.75482 -8.28659 9.30848 -7.30009 8.60755 --1.12073 1.21016 -0.310087 0.725712 -8.3746 9.13511 -9.11925 10.2234 -9.68703 9.7137 -0.603098 0.844291 -5.88373 6.99327 -0.852802 1.43297 -3.7463 5.82283 -7.69639 8.25446 --0.337322 0.977113 -8.76606 9.16618 -3.43527 3.6616 -3.93587 5.39471 -5.66569 7.20462 -5.34999 5.7193 -3.25589 3.706 -1.52012 2.55985 -4.74228 5.43725 -5.15323 5.51652 -7.77237 8.33717 --0.0514419 0.914127 -9.27182 9.59476 -8.14192 9.74859 -6.42702 7.20331 -7.51351 7.68358 -7.0947 7.46059 -7.97635 8.59449 -2.39931 2.66008 -5.79481 5.94673 -4.41054 4.81613 -2.72202 3.61239 -2.86039 3.44719 -1.81115 3.28151 --0.566995 0.734214 -9.61998 9.72024 -7.4163 7.61821 -0.42522 0.552659 -3.17617 4.36942 -0.740294 1.36953 -7.13755 8.39966 -0.219186 0.892588 -3.78307 5.2905 -0.783026 1.76155 -3.01893 3.33055 -3.12143 3.5713 --0.792679 0.92539 -0.668572 1.12961 -3.88619 4.30545 -7.59276 8.1776 -4.71509 5.05622 -6.53406 7.04242 -1.581 2.21984 -4.7144 5.51372 -2.76338 3.50211 -0.16364 0.293599 -5.92365 6.10636 -3.11174 4.29165 -5.49295 6.48717 --0.503239 0.795707 -7.30558 8.12408 -2.10674 4.13456 -7.11985 8.01932 -1.34672 1.48739 -4.05778 5.69084 -2.83686 2.9115 -6.4471 6.53909 -0.467374 1.84371 -2.76467 2.94177 -4.87867 5.33932 -0.892878 1.96273 -1.13934 2.27205 -7.76918 8.39409 -6.72181 7.43901 -7.0836 8.68472 -7.12924 7.56332 -0.689172 1.62922 -9.41146 9.91043 -0.398265 1.27579 -6.29966 7.4874 -5.09438 5.65334 -6.04623 6.4687 -5.75305 6.89731 -0.308118 0.459501 -3.63692 4.30501 -3.1755 3.71009 -7.32787 7.52785 -2.23235 4.09978 -2.71191 2.91513 -0.209457 0.840713 -7.31489 7.38296 -6.21245 6.91111 -5.75983 5.96049 -5.92056 8.24518 --0.354452 0.489638 -4.05894 5.34828 -1.56299 1.57414 -2.85083 3.27455 -8.78323 10.0012 -0.208502 1.26471 -6.10824 6.79285 -5.55114 8.03968 -6.13077 6.32342 -7.34865 7.82592 -3.94835 4.75016 -7.8268 8.72249 -4.85131 5.07903 -5.40398 6.0134 -2.85971 3.85293 -0.126379 1.45545 -3.15768 4.28388 -9.64566 9.70016 -4.47514 6.31064 -6.44995 7.2894 -4.70992 6.13777 -3.91128 4.22263 -7.35627 8.07739 -2.49215 2.68749 -8.09946 9.16929 -0.925679 1.92784 -8.48437 8.63892 -7.2255 9.18109 --0.00840282 0.0168954 -5.91933 6.6274 -4.16086 4.64302 -8.27009 8.47868 -1.73372 2.93094 -8.17421 9.17705 -9.19136 9.43222 -0.0653594 0.648416 -8.69 8.96184 -8.99355 9.40832 -6.25088 6.26945 -6.72391 7.38424 -9.59708 10.3496 -6.00971 6.18818 -4.64468 5.75797 -3.64832 5.30079 -5.99378 7.8792 -6.5388 6.99379 -7.31694 8.43802 -3.66227 4.92638 -9.55964 10.3796 --0.14433 0.29095 -3.56716 3.71252 -3.82062 4.27788 -8.10405 9.35275 -7.17891 7.46539 -1.17698 1.29602 -4.48829 5.03134 -7.18025 8.13852 -9.42388 10.3634 -5.2158 6.17469 -5.22926 6.52397 -5.16731 6.40625 -6.53348 7.269 -2.07834 2.39172 -9.65044 10.1519 -8.64551 10.1294 -9.29006 10.5993 -1.50639 2.83173 -5.71675 5.99216 -3.0783 3.35571 -0.115401 1.31431 -8.03988 8.11942 -3.11917 4.53956 -1.14552 1.1646 -5.34782 6.43017 -0.0701702 1.0368 -0.183335 0.440704 -6.33438 7.71607 -2.11533 2.64323 -7.12104 7.13366 -7.21548 8.26968 -3.13445 4.13568 -4.57452 4.74602 -2.60889 3.69846 -7.21184 7.47573 -6.87651 7.03405 -2.65431 3.94352 -1.50006 1.70087 -6.16344 7.54429 -7.02057 7.73067 -8.27833 9.01489 -0.500833 0.597845 -8.34751 9.88925 -2.80242 2.91837 -5.29424 6.079 -8.36276 9.10074 -0.216887 0.268335 -1.30798 3.16393 -3.93851 4.22658 -2.58028 3.14744 -9.31131 10.3451 -7.37262 8.84852 -4.45306 5.6723 -3.74535 4.0721 -4.90174 5.63875 -3.41847 4.65199 -3.10265 3.82548 -6.56126 6.97557 -2.57449 2.95098 -7.97418 9.06301 -9.2203 9.66829 -4.64922 4.96305 -8.83034 10.115 -6.6685 6.89847 -7.36585 7.48669 -8.66761 9.39287 -0.562216 0.961875 -7.56292 7.81006 -8.50715 8.95572 -0.572825 2.24755 -5.9367 6.06766 --0.769578 0.776163 -4.48224 4.9553 -8.21069 9.29643 -8.57206 9.47175 -1.10032 1.21371 -3.76306 3.87152 -6.46197 8.18457 -6.96501 9.70727 -3.42357 3.93484 -0.818601 2.42743 --0.119739 0.397938 --0.378761 0.523892 -8.03394 9.35409 -3.60283 3.98864 -2.21789 2.70607 --0.255329 0.319063 -6.20806 6.22609 -7.1283 8.04391 -3.73565 4.03638 -8.5374 9.10987 -5.22675 5.35072 -7.51777 7.58439 -9.12636 10.4159 -9.15003 9.40672 -0.217863 1.19883 -9.42416 9.9178 -2.55337 3.8088 -7.03655 7.98242 -9.17171 9.8047 -0.110162 0.722738 -3.16467 3.58897 -6.47244 7.12961 -1.0456 1.65614 -1.58456 1.62844 -1.79039 1.84035 -6.24286 7.07838 -9.08631 9.11684 -3.05068 3.40838 -2.81212 4.03665 -2.52011 3.09841 -8.06001 8.16356 -7.07649 7.52685 -2.47666 2.86548 -8.66241 8.95103 --0.298116 0.662697 -0.822443 2.46125 -2.07619 2.33674 -4.84135 6.21034 -7.49625 8.13026 -7.85854 8.29618 -3.01722 3.37062 -6.54393 7.30306 -2.21113 2.30166 -8.32138 8.57349 -6.2995 6.33514 -3.0018 3.56886 -4.63378 5.52214 -6.71908 8.96715 -2.29809 2.95581 -8.34947 8.71096 -4.96902 5.32075 -9.51051 9.72733 -3.311 4.77789 -3.50233 3.66309 -4.95177 5.76002 -6.12876 7.22391 -6.27743 6.79393 -3.60638 3.6833 -5.20305 5.50848 -7.16065 8.88358 -9.45049 10.2539 -6.16892 7.0314 -8.08479 9.74516 -0.0717867 0.669987 -2.17569 3.34098 -4.81716 5.7509 -7.63999 8.01157 -5.87228 6.60363 -3.39621 4.35575 -4.96079 5.07901 -7.57639 8.82003 -8.27285 8.52609 -0.665858 1.64782 -1.74256 2.07126 -6.19512 6.4258 -0.664592 1.30896 -0.180682 1.43746 -6.46752 6.81303 -2.55562 3.08708 -9.33695 9.63312 -6.33821 6.77092 -7.88252 8.55026 -8.17937 8.45385 --0.415294 0.793096 -5.22077 5.54553 -8.67808 9.10041 -1.72096 1.92024 -0.492778 1.48076 -2.29514 2.88531 -0.0934389 1.37614 -8.40297 9.11121 -3.66605 3.91717 --0.274468 0.867811 -9.41428 9.56659 -1.22657 2.12792 -8.71336 9.85384 -5.09347 5.42905 -2.02877 2.36652 -5.99112 7.40703 -0.911618 3.48138 -4.84352 5.11131 -1.16309 2.08613 -5.58561 5.84805 -0.663543 1.08921 -1.83189 3.93269 -4.07731 4.38879 -4.04789 4.9989 -2.09457 3.61279 -2.00982 2.94396 -7.37537 7.66574 -5.08648 5.80122 -9.19959 10.2263 -4.26136 4.86194 -6.67875 7.61134 -1.27462 2.48399 -7.2237 7.82324 --0.0141009 0.0441377 -8.32069 8.36192 -2.82562 3.0717 --0.528918 1.25301 -1.90486 3.04714 -1.34489 1.75301 -3.14332 4.03322 -8.55351 10.8681 -9.09824 10.3828 -0.496868 0.622499 -7.11112 7.62765 -0.335233 0.528962 -6.71335 7.13937 -6.78574 7.71172 -9.13568 9.22251 -7.10299 7.64765 -3.64747 4.06685 -8.64041 9.40111 -2.43515 2.93081 -2.95476 3.68588 -0.0863751 0.777976 -6.5891 8.18165 -8.80986 10.0735 -0.568868 1.63785 -4.41677 5.42049 -8.72857 9.88426 -3.67467 4.25442 -8.98168 10.1087 -5.08611 5.50098 -1.28982 2.34422 --0.914176 0.969847 -4.35042 4.42735 -4.02282 5.08164 -9.00566 9.4791 -2.71821 3.24065 -3.20252 3.24988 -8.61559 9.6733 -3.15157 4.7685 -3.59348 4.67872 -0.286864 0.36279 -8.40374 10.528 -7.53647 8.13523 -6.81591 6.90226 -7.68111 9.10704 -8.37958 8.73818 -3.25808 4.40893 -1.50348 3.00641 -0.20803 1.40949 -3.93771 4.84177 -2.79232 3.35329 -4.2666 4.63588 -0.341784 1.46241 -1.53063 2.06724 -8.58212 8.86194 -8.95411 9.70651 -8.71591 9.26292 -6.66088 6.7009 -3.95881 5.93917 -8.5823 8.76007 --0.308958 0.34174 -1.03188 1.37677 -7.52675 9.84031 -4.27952 4.32984 -1.83465 2.27607 -8.12096 8.64922 -2.22605 4.40067 -0.00929139 0.871342 -0.376531 1.29354 -3.5257 4.30165 -1.95846 4.09589 --0.200922 0.799272 -0.24432 1.76673 -4.73477 5.06514 -8.97059 9.2276 -2.89618 2.93969 -0.168256 1.03325 -3.44522 3.83622 -2.74889 2.76042 -6.07155 6.7979 -9.06484 9.09804 -7.56658 9.29215 -4.3084 5.45621 --0.0786996 1.12809 -8.48249 9.74107 -6.4196 6.61469 -1.57119 1.87612 -3.15463 3.86251 -2.0089 2.57741 -6.53618 7.12035 -7.07901 7.29396 -0.114756 0.887413 -8.90806 9.65731 -4.0921 5.23407 -2.63441 2.92344 -4.31769 4.98832 -8.90336 9.26837 -8.25313 8.91204 -2.87758 4.00212 --0.708243 0.789072 -3.28656 4.55872 -5.73177 5.80293 -5.40596 5.5844 -4.09318 4.57774 -6.16178 7.00613 -8.5514 10.5495 -6.83987 7.3056 -1.06341 1.97923 -7.82153 9.00722 -0.923069 1.42337 -1.83408 2.82331 -5.75305 7.23576 -0.241909 0.96721 -1.16645 2.10491 -5.41819 6.09839 -7.49242 7.69495 -0.347233 0.383681 -2.33245 2.53467 -4.91249 5.27759 -8.11182 9.2758 -0.0955456 0.548659 --0.359909 0.48055 -1.64759 3.47097 -6.37855 7.40015 -0.423283 2.08857 -4.10068 4.46856 -2.58389 2.69626 -0.848483 2.72258 -8.67321 8.88903 -2.07607 3.42398 -3.11033 3.80741 -2.24735 3.48626 -8.11883 8.7687 -0.29959 1.41603 -4.84924 5.13641 -1.44102 1.74592 -1.13437 2.50296 -1.75876 3.09859 -4.75363 5.90838 -7.36423 8.20074 -5.51578 6.42652 -0.915633 1.86015 -9.44679 10.3479 -2.61691 3.60215 -6.26524 7.2538 -2.74326 3.12649 -5.83934 6.98592 -9.1111 10.4891 -2.27066 2.82709 -8.19359 8.67233 -0.834236 1.7066 -6.19288 7.21392 --0.249843 0.891821 -2.5652 3.25132 -5.25356 5.88905 -3.99545 4.18918 -1.93186 2.51527 -4.44621 4.82421 -5.89181 7.36963 -2.77321 3.60627 -2.76444 3.88016 -2.50062 2.66105 -1.14846 1.66146 -2.951 4.81656 -3.81976 4.01061 -4.75674 5.59916 -6.74092 7.08289 -2.09989 2.32514 -0.220723 0.865303 -5.48107 5.71875 -1.48372 2.88941 -0.484577 1.12051 -8.93618 9.7185 -1.89769 3.65655 -2.0129 3.55214 -9.23173 10.3694 -0.286189 1.22753 -0.453785 1.55541 -2.24068 2.6541 -8.80917 10.4969 -7.12801 7.15222 -9.25745 9.9103 -5.73429 6.76901 -7.54454 8.47157 -1.96008 3.74997 -8.00837 9.25665 -1.66384 2.07613 -5.53014 5.97461 --1.32495 1.33319 -4.58479 5.2263 -7.92048 8.75668 -6.87595 7.02522 -0.157713 0.389585 -7.48277 7.51261 -8.10714 8.38399 -0.0802723 0.587088 -1.13024 1.71135 -5.71769 6.84757 -3.08261 4.31054 -2.95952 5.09762 -6.62815 7.44256 -5.0805 5.8499 -3.38489 3.73265 -1.10644 2.18331 -4.70493 7.31686 -2.2253 2.6338 -0.778359 1.6265 -6.94211 7.2149 -4.20976 4.99342 -7.47792 7.67881 -7.06219 8.76137 -4.97677 6.12206 -6.30829 6.69361 -6.19977 6.76781 -9.67636 10.2172 -3.41958 3.69137 -0.374486 0.943711 -4.00837 4.80107 -8.85401 10.1325 -6.0938 7.8919 -1.51055 3.08998 -8.94594 10.3139 -1.06714 2.65511 -0.703202 0.850595 -4.87735 6.00659 -8.3067 8.39924 -7.78071 8.3155 -1.98737 2.81116 -6.86323 8.07974 -1.03479 1.34584 -0.490512 0.670211 -5.82122 6.1901 -5.50836 6.63385 -7.9192 8.9606 -0.913719 2.18983 -4.97151 5.70909 -4.19907 4.37712 -2.01188 2.63318 -7.84813 9.3771 -5.32667 7.48502 -8.50951 10.1006 --0.551637 0.930509 -1.06511 2.23353 -1.91111 3.42663 -9.37528 9.55327 -7.27975 7.38741 -3.46676 4.83165 -7.36137 8.70333 --0.295762 0.623228 -8.48558 8.81076 -2.71689 3.41873 -6.49265 8.11042 -5.25516 5.57336 -6.10462 7.05991 -8.76997 9.15164 -7.86196 8.30651 -7.82765 9.24604 -5.98573 6.34182 -6.45367 7.47857 -3.27018 5.10835 -1.3079 2.37423 --0.261387 0.338113 -7.60683 8.81791 -4.7346 7.41988 -5.25597 5.28517 -3.76704 4.52226 -3.91774 6.66976 -5.69618 8.92667 -1.86148 3.07531 -5.57404 6.51438 -9.39049 9.77921 -2.38692 4.21416 -6.84909 7.23633 -7.2379 7.58761 -4.73485 6.11606 -7.80013 8.08105 -1.72701 3.40244 -2.44475 4.4072 -9.72565 9.77726 -3.35288 4.06493 -8.91215 9.92325 -8.67991 9.65865 -0.253195 0.764339 -4.23564 5.59497 -1.84752 2.14986 --0.502957 0.528737 -1.32656 2.11347 -9.81563 10.0213 -7.60114 8.05035 -8.51797 8.83342 --0.394604 1.41267 -7.71614 8.63514 -0.530249 0.968898 -2.90463 3.01675 -7.58098 8.71658 --0.253747 1.28827 -1.832 2.39006 -7.2268 7.27225 -3.84076 4.66703 -2.2564 2.73185 -7.31508 8.46008 -4.99387 5.64948 -7.21239 7.79983 -7.60231 7.8473 -0.555482 1.41892 -1.25539 1.73665 -8.41561 8.96404 -5.06771 5.17664 -0.0655744 2.10718 -8.00222 8.65909 -7.48841 7.83609 -6.30909 6.89448 -9.1697 9.55942 -1.36259 2.22582 --0.923854 0.994771 -3.43724 4.64053 -8.09411 8.19574 -4.84869 5.52805 -2.69802 3.4119 -9.0613 9.29405 -0.565216 0.687165 -5.93495 6.57426 -1.86925 2.75493 -1.41068 2.00824 -1.60612 1.62471 -3.11499 5.89909 -2.69806 3.90538 -3.76301 4.22135 -3.30065 4.70725 -5.56461 7.02137 -8.35335 8.99287 -4.79259 4.88508 -6.7911 7.52912 -8.14843 8.28583 -3.67629 5.06406 -5.71462 7.04747 -9.06721 9.99733 -4.87932 6.8586 -8.00814 9.57664 -7.03069 7.51623 -9.0989 9.57644 -2.70873 3.91296 -1.64425 1.7007 -6.53716 6.99033 -8.29874 8.74509 -1.88941 2.57626 -4.65337 5.23247 -9.04723 9.06665 -3.52258 3.61496 -1.1207 1.80143 -0.680601 1.98384 -2.94593 5.38692 -2.65685 2.67932 -9.00469 10.2054 -6.44318 7.2657 -4.66656 5.33893 -3.41719 4.72453 -3.12403 4.21748 -6.67973 6.81775 -3.54347 4.14978 -3.02554 3.50812 -3.91883 3.93657 -7.31721 7.89895 -1.86275 2.85473 -6.23266 6.4449 -7.59855 9.38013 -9.07084 9.49309 -0.557656 2.6851 -6.899 7.37693 -4.23162 5.84314 -8.54108 9.37672 -3.9513 4.79746 -7.299 8.29678 -5.58879 5.88551 -9.14992 9.22385 -9.1914 9.31788 -4.95663 5.56316 -2.16516 2.39538 -0.722262 1.89664 -7.76447 7.80026 -2.77772 3.39136 -9.59513 9.78635 -1.02728 1.2181 -7.32631 7.56611 -7.37389 7.46163 -6.87949 8.18689 -8.95602 9.81169 -5.85364 6.63434 -0.129136 2.13484 -7.09608 7.71167 -7.1487 8.34258 -7.48738 8.3172 -8.77247 9.95985 -7.6706 9.56828 -8.14268 8.61726 -6.5455 7.90871 -4.57866 4.78453 -3.63937 4.42349 -5.18905 5.36516 -4.68884 5.62995 -5.88338 7.83824 --0.002979 0.145818 -4.42981 4.77141 -0.558593 1.07999 -6.91713 7.36159 -5.13948 6.20805 -3.34368 4.07112 -7.27365 7.8383 -9.6898 9.9514 -6.14332 6.75102 -2.16534 2.78843 -2.8007 4.37952 -7.67047 7.72955 -8.77377 9.85092 -1.26087 1.55193 -6.29788 6.58511 -7.68178 9.05777 -0.383336 1.21247 -2.55185 4.30874 -8.91971 9.21836 -3.67638 4.68596 -8.13843 9.13684 --0.424353 1.97502 -2.71499 2.93977 -0.104447 0.387901 -4.09592 4.67009 -0.808593 0.920798 -5.01258 6.30662 -4.97668 6.57412 -8.44135 9.03816 -2.78932 3.72809 -6.71337 7.15128 -4.27234 4.50127 -6.78266 9.70351 -6.48026 7.51491 -7.36296 8.42283 -4.80339 7.3704 -6.24735 7.3132 -0.134626 0.364187 -2.73854 4.09422 -0.809997 1.19657 -6.41154 6.50244 -7.16847 8.56485 -1.53582 3.33985 -1.92874 2.86427 -6.95941 7.01378 -5.8592 6.54917 -2.51802 2.75622 -3.3894 3.6957 -2.2547 2.64693 -8.62054 9.1951 -8.86378 10.0003 -1.87892 2.28732 -3.83146 4.21484 -1.53262 1.99692 -7.86048 7.93125 -1.79437 2.68269 -3.92781 4.24119 -5.43044 5.47935 -0.322904 0.618854 -3.42383 5.18531 -4.00989 5.83612 -7.06304 8.76582 -5.88039 6.77654 -8.638 8.9479 -1.73391 2.09002 -1.04861 2.84779 --0.313019 0.557659 -3.35245 4.1308 -9.05373 9.57205 -5.85684 6.49193 -6.00719 6.86421 -4.25244 4.65772 -5.15865 5.61529 -8.78498 9.77544 -8.33803 9.26452 -3.42915 4.92279 -8.29884 8.94035 -5.10232 5.35924 -4.33571 4.86695 -7.86184 7.90029 -7.34345 7.36214 -0.201624 0.800371 -9.05882 10.5503 -4.32188 5.03154 --0.0456982 1.22298 -2.90921 3.60013 -1.69306 2.36564 -7.79029 9.15059 -4.65205 5.06538 -6.34552 8.32176 -7.92695 9.32585 -7.17903 8.09903 -9.53561 9.60287 -0.365723 1.23929 -0.542889 0.849053 -8.15061 8.93512 -6.40042 6.41053 -5.82666 6.5488 -1.00893 1.83717 -1.76021 2.11893 -7.61076 8.6242 -2.32513 3.4856 -4.39023 6.01094 --0.11754 0.421848 -6.76371 6.94513 -4.67607 5.58732 --0.201992 0.765553 -7.42926 7.44429 -2.57485 2.85339 -2.74138 4.13421 -8.21645 9.18107 -6.28184 6.4996 -7.129 7.74678 -7.76842 8.74924 -3.5359 4.35892 -3.04103 3.24376 -2.29389 2.92164 -6.96306 7.64415 -8.82053 9.04584 -1.19911 2.06167 -5.91357 7.6773 -0.150241 1.23291 -4.48681 5.41762 -6.89156 8.13443 -5.37828 5.79944 -2.13694 2.91102 -1.35932 2.08272 -6.14309 6.23278 -4.03202 5.88521 -7.23417 7.43704 -1.2501 2.60793 -2.12334 3.65727 -7.05722 8.77078 -0.437873 0.585933 -6.33338 9.16643 -2.44724 4.40234 -2.92012 3.64047 -1.2039 3.25195 -8.6611 10.0398 -8.0088 9.13622 -5.96562 7.08515 -5.45181 6.65246 -0.742546 2.38958 -4.12919 4.93571 -0.428823 0.84483 -1.45226 2.5869 -9.50727 10.0211 -7.69194 8.66273 -1.25706 2.44554 -5.23247 5.47762 -0.499178 1.70722 -7.26569 8.72467 -3.59815 5.50022 -1.03601 2.43445 -0.092414 0.927635 -3.7917 3.995 -6.21977 8.40398 -3.1513 3.81188 -9.80482 10.0951 -8.65564 9.33687 -2.06164 3.49152 -2.09754 2.34929 -0.66126 2.31888 -5.34832 6.82603 -7.91038 8.59105 -0.695523 0.800961 -2.33406 2.71629 -8.37774 10.9253 -9.7682 10.106 -9.44382 9.5743 -8.78009 9.47645 -1.87309 3.04127 -1.86724 2.13913 -3.30049 3.52416 -7.18508 7.6648 -1.3736 2.12153 -2.41879 5.06716 -1.87815 2.29743 -1.76646 2.06335 -9.73034 9.95475 -0.497489 0.686102 -6.96908 7.17338 -9.23111 10.0148 -3.30981 4.21787 -9.53311 10.3734 --0.067709 0.147251 -8.44557 8.82047 -7.10407 7.47639 -0.834352 1.36908 -9.1598 10.6508 -4.22018 4.38279 -3.8295 3.95462 -3.97302 4.97247 -1.55856 2.31013 -0.0217962 0.486978 -1.69845 2.65786 --0.489562 0.582187 -5.10621 5.6055 -9.8478 9.85919 -6.15389 6.92324 -7.11469 8.0418 -3.20625 3.78209 -5.93389 7.66892 -1.15134 1.18023 -6.84797 7.4239 -2.9483 3.22279 --0.43205 0.764755 -7.17846 7.33313 -5.4729 8.26894 -6.19512 7.32132 -0.591934 0.767568 -0.49266 1.80691 -9.08272 9.72242 -5.85683 6.36905 -5.27625 7.13913 -3.60853 3.98155 -0.642811 1.10253 -1.27117 1.5329 -8.76096 9.61776 -4.9498 5.12847 -7.53282 7.80438 -1.40487 1.65657 -3.45329 3.84307 -3.25698 3.49614 -2.38651 2.89802 -8.23114 8.99016 -9.58516 10.4145 -5.5185 6.27733 -0.583068 0.892249 -1.93142 2.35084 -7.94845 9.22667 -2.47963 3.9005 -3.46106 3.86301 -7.77744 8.43735 -1.41072 1.73969 -9.12904 10.4307 -3.52227 3.66861 -5.4743 5.86487 --0.51727 1.63657 -5.09861 7.03162 -5.14763 5.93411 -3.23526 3.47376 -0.9702 1.74063 -9.28366 10.3322 -1.80257 1.92265 -8.63597 9.08467 -4.16006 4.97753 -6.37418 6.39374 -5.82376 6.62429 -7.74751 8.68962 -1.63821 2.53399 -4.9864 6.40969 -0.680772 0.995608 -3.74344 3.83319 -0.898055 1.8593 -2.36839 2.39307 -7.21046 7.51006 -0.60893 2.91523 -3.15017 4.30412 -5.02219 6.28886 -4.60541 4.73379 -8.41196 8.58978 -8.84706 10.8198 -6.95807 7.54952 -5.54729 6.9315 -4.62574 4.73423 -3.35252 3.59865 -1.02207 1.71791 -3.16408 3.73993 -0.639222 1.69519 -7.57978 8.05813 -2.41371 2.77174 -8.65544 10.093 -6.31988 6.70758 -6.5301 8.39328 -0.578825 1.20331 -1.1243 2.07824 -5.86555 6.72397 -6.37103 6.81736 -1.12086 3.46541 -2.59503 3.44073 -5.27128 5.3616 -2.87331 3.4352 -5.48408 6.67916 -3.36016 4.09125 -0.813671 0.9811 -0.812162 3.22209 -6.85104 6.86306 -0.671311 0.979685 -2.75962 2.82659 -2.42186 2.49827 -7.82974 9.59669 -3.48851 3.60085 -8.47775 10.9574 -8.6863 10.6155 -0.196484 1.07469 -1.19293 1.45012 -5.79166 6.18466 -6.51597 6.6793 -9.78341 10.1992 -8.17879 9.59257 -6.96178 8.73165 -4.09161 4.31908 -3.19514 3.4072 -5.5101 6.32978 -0.188435 1.84481 -9.41738 10.0379 -1.46994 1.6294 -4.21915 5.39529 -5.46567 5.86638 -8.19414 9.201 -4.38616 4.55193 -2.31105 2.73345 -6.05897 6.12297 -8.84135 9.74232 -9.44943 10.2225 -3.27501 3.66059 -0.524904 1.74374 -7.7228 8.43799 -5.13274 5.82863 -8.2787 8.94491 -1.61463 2.03499 -7.04346 8.69977 -0.938308 2.38676 -0.00208037 0.0186158 -1.98744 2.05864 -7.05787 8.16211 -1.68383 2.04684 -2.24812 2.28257 -0.685061 1.2947 -2.25379 2.92827 -6.0052 6.24797 -7.06213 7.86344 -0.751849 2.96376 -0.0977921 0.513746 -8.43792 9.10545 -2.80769 3.09276 -9.19308 9.59741 -4.74365 4.99708 -8.41385 8.58422 -4.28093 5.9281 -4.26205 4.75417 -1.48035 1.61363 -1.4264 1.80922 -3.48365 4.52935 -1.78396 2.96351 -8.4134 8.96536 -8.65646 9.34781 -1.88027 2.97804 -8.92531 9.02743 -6.91815 7.88895 -5.68023 7.37521 -3.93105 4.6123 -0.385874 1.30785 -1.80151 2.24385 -8.43781 9.33927 -6.69643 8.001 -6.12062 6.673 -4.8316 6.63067 -9.00443 9.08204 -1.5651 2.65023 -3.57517 4.40231 -5.85127 8.02219 -8.02586 10.018 -2.00514 2.75138 -6.32104 7.84285 -8.90914 9.78319 -4.91325 6.27817 -3.87406 4.80327 -8.57887 9.30685 -1.40351 1.71079 --0.217977 0.224497 -8.37711 9.56393 -5.54644 5.77714 -8.18206 8.36015 -0.774967 1.97899 -9.10434 10.1721 -9.39621 10.1135 -4.80108 4.90605 -9.45978 9.96227 -2.85412 4.05215 -5.71985 7.16735 -2.35081 2.82214 -9.34881 10.5899 -7.13014 7.82872 -4.54931 4.89725 -9.41397 9.9131 -8.90226 9.55276 -8.27995 9.83651 -9.2767 9.6053 -0.388751 1.40317 -5.01478 5.88869 -6.41521 7.21754 -1.22552 1.39067 -3.75771 3.81571 -4.39362 6.04592 -8.82639 8.84544 -4.59289 4.89208 -1.52235 1.64285 -1.85893 4.52056 -1.91781 2.78253 -3.34677 4.54987 -9.26905 10.6019 -7.10958 8.02083 -0.765257 1.66957 -2.17169 2.70214 -4.2293 6.38089 -1.41111 2.45992 -5.76864 6.85715 -2.19944 2.93182 -9.03727 9.6454 -3.82652 4.35225 -2.52642 3.09725 -7.77868 9.35844 -0.337665 1.00787 -1.92021 2.04418 -4.41862 5.95486 -9.47606 9.62386 -1.12113 1.55658 -5.26701 7.09712 -8.81478 9.34863 -6.29447 7.43847 -2.82379 3.57268 -7.9735 8.79936 -3.30176 5.50666 -6.36009 6.8864 -4.13583 5.00627 -0.510514 0.882245 -6.93864 7.78543 -2.04039 2.4298 -3.18337 3.19424 -4.20059 4.67088 -0.316687 0.707377 -0.169106 1.68194 -8.26665 10.2362 -1.1124 1.78306 -2.84603 3.33142 -9.48756 9.96651 -9.4301 9.7316 -0.234674 1.23981 -0.493232 0.522565 -1.342 1.41739 -2.57196 4.08221 -1.54201 2.52284 -5.32049 6.00052 -8.54218 8.59452 --0.030524 1.64476 -2.31645 2.72528 -4.71898 4.92827 -0.0872997 1.74969 -0.994278 1.76964 -1.34411 2.77952 -0.156817 2.10245 -5.78094 6.34389 -3.09336 3.10563 -8.14245 9.0928 -9.34202 9.75484 -9.78415 10.0211 -4.68383 5.19384 -6.09441 7.90512 -6.74941 6.76118 -1.78693 1.91697 -2.34369 2.62141 --0.20756 0.829082 -3.57681 5.11448 -2.44234 4.45153 -4.84521 5.31902 -1.80487 3.64498 -2.46125 3.02549 --0.334514 0.64288 -8.06406 8.49886 -1.74559 2.54474 -6.05883 6.46529 -9.00014 10.2271 -8.00064 8.5061 -0.909467 0.980765 -8.65862 8.69736 -8.11457 8.77049 -3.93237 5.02485 -4.64507 5.34852 -3.92405 4.19449 -5.02381 5.21722 -3.76203 3.78396 -6.74925 7.34781 -8.2556 8.63585 -3.92521 3.99739 -1.44641 2.31509 -0.23516 0.917239 -4.4614 6.35489 -3.33221 3.95247 -1.73289 2.07919 -6.92385 7.55052 -8.74351 9.41125 -9.41451 10.1785 -7.4001 8.81081 -2.97038 3.12524 -7.26043 7.77569 -5.56625 5.59344 -5.70977 6.33362 -7.61443 8.43218 -1.05308 1.82947 -0.377602 1.57633 -6.42483 7.51505 -4.73011 5.43693 -7.72 8.09098 -9.20063 9.82287 -6.88273 7.35327 -6.88423 7.68356 -3.55293 3.6227 -0.947096 1.76021 -3.66411 5.67117 -9.31422 10.1035 -6.84847 6.98956 -2.16221 4.45806 -0.853284 3.15932 -2.48673 2.89793 -3.37633 3.90938 -1.6141 1.66363 -1.6658 3.01723 -0.419408 1.01736 -0.712239 0.791538 -2.25249 3.62425 -8.09772 10.2367 -1.46651 1.48148 -1.73233 2.0489 -7.42679 9.23232 -7.97446 9.53281 -2.74677 4.03955 --0.169412 0.872795 -4.90663 5.40277 -7.62122 9.49334 -6.55971 7.34259 -3.71957 5.03775 -3.33226 4.06459 -0.634912 1.52603 -3.65506 4.09318 -4.31463 4.60534 -8.58287 9.85385 -0.334759 0.7232 -2.14027 2.866 -6.06611 6.3625 -2.53013 3.18764 -4.30913 4.89247 -6.53234 6.92328 -7.66419 8.61762 -1.37598 2.26754 -8.06279 8.80692 -5.28688 5.70608 -0.509396 1.34606 -8.80589 9.29765 -9.3801 10.3988 -0.402662 0.597735 -5.87213 6.63371 -2.79136 3.763 -6.20615 7.25189 -7.54065 9.62156 -4.12107 5.04454 -5.60294 6.69246 -1.20845 1.49272 -1.75679 2.56397 -2.83939 3.85147 -6.21362 6.71341 -9.01824 9.2388 -4.66617 5.04944 -1.48766 2.55674 -8.89442 9.42175 -5.29411 5.39531 -6.66271 8.68733 -0.730461 1.42466 -6.22927 6.55086 -0.566776 1.17299 -3.06104 4.17775 -5.28026 5.73966 -5.76071 7.61585 -7.83786 9.58106 -6.32199 6.46961 -8.89555 9.17429 -3.85772 4.97805 -6.63352 8.79211 -7.87234 7.94131 -6.53479 7.87979 -3.90293 4.50376 -6.21371 7.31788 -1.00497 1.75003 -6.90351 8.02435 -2.29142 3.9809 -6.26632 6.45283 --0.0354471 1.31727 -8.80046 9.20169 -7.86905 8.36819 -0.848737 1.82393 -7.98136 9.40712 -3.97765 4.95399 -8.70252 9.26275 -3.13412 4.29389 -2.06446 3.55839 -7.67918 8.44509 -5.96082 6.40336 -1.20461 2.36924 -4.76741 5.74978 -9.41217 9.94305 -7.36736 8.07119 -3.44102 3.56957 -3.59893 4.52751 -4.2613 6.41628 -1.65321 3.02235 -3.70067 3.86657 -0.0176327 1.1215 -4.13592 4.88595 -8.73668 9.0834 -1.80944 2.95584 -6.05721 6.93009 -5.08206 5.38626 -1.86749 1.89392 -3.58284 4.10506 -0.0885586 1.47709 -5.46502 5.93066 -8.45338 8.47878 -3.46789 4.02317 -0.975506 1.15814 -7.12758 7.60073 -7.99582 8.56746 -3.11435 3.83805 -4.51166 4.52472 -8.39096 8.75934 -8.42208 9.66019 -2.48498 4.73703 -3.50301 4.81264 -6.40196 7.0733 -8.52138 8.82265 -1.49822 1.74634 -7.08547 7.93508 -3.47832 4.42948 -6.08646 6.20865 -4.46334 4.65278 -3.80008 4.08214 -3.4853 5.44308 -5.48109 6.18681 -6.59161 8.04307 -7.36554 7.38201 -5.2144 5.31725 -4.62607 7.25804 -1.24345 1.81263 -5.49248 8.16867 -6.4056 8.26316 -7.67828 8.56923 -2.46187 2.56974 -2.22942 3.27248 -7.14933 8.06682 -2.3236 2.95462 -4.18028 4.80535 -4.981 5.54215 -7.23261 7.34863 -4.96309 6.06396 -4.24402 4.44364 -0.917707 1.32687 -1.19806 1.65106 -3.7725 5.31412 -9.70021 9.84203 -5.99824 7.77474 -3.32636 3.84266 -8.59841 9.07653 -7.9916 9.14415 -0.786519 1.84655 -0.166394 1.47834 -2.87633 3.52808 -7.53804 9.56807 -6.14406 6.16189 -1.63428 3.96845 -1.10307 1.58897 -1.30032 2.85313 -7.89803 8.32723 -8.77593 8.90136 -1.68804 2.69447 -4.5956 4.6743 -7.39643 8.29839 -6.93629 7.82243 -6.10289 7.677 -1.83835 2.34295 -1.04506 1.91684 -8.95277 9.43817 -0.36153 0.643665 -1.02408 3.18963 -4.02972 4.40301 -2.80428 2.82552 -6.51718 6.64956 -0.185341 1.56607 -6.1658 7.59364 -4.09288 4.11687 -6.90205 7.16338 -5.0755 5.39478 -4.5614 4.83286 -5.8489 8.76295 -9.70079 10.0431 -8.44334 8.54714 -3.00139 3.66327 -5.34458 6.38895 -7.11481 7.96865 -4.66776 5.15678 -0.390138 0.53352 -2.01116 3.32839 -6.78761 6.97068 -4.57477 5.0724 -1.14098 1.36134 -7.4559 8.30327 -0.700932 2.40437 -1.90469 1.99046 -4.30064 5.11485 -7.84433 8.48543 -5.96212 7.49882 -3.93055 3.96317 -0.546327 1.04814 -8.96011 9.0404 -7.89255 8.06149 -0.669924 2.6944 --0.00972314 0.837474 -6.07199 6.37467 -2.73659 3.19833 -5.9576 7.10966 -9.1316 9.14737 -5.26101 6.59184 -5.77697 8.08876 -0.68623 0.782805 -0.842619 1.39893 -5.82075 6.15957 -4.36394 4.88479 -7.1828 7.90107 -3.3331 4.39923 -6.54243 7.24966 -2.809 2.96491 -4.18514 4.61948 -4.95453 5.33929 -8.33288 9.52867 -9.05785 10.4276 -2.58917 4.74403 -1.34279 1.89014 -4.93626 5.75424 -7.75031 7.92788 -9.00904 9.02402 -3.91286 5.15124 -6.98486 7.34688 --0.173169 0.415019 -0.652242 1.51556 -3.50184 5.30486 -3.72563 4.09022 -4.60463 6.58985 -3.34219 4.31833 -2.55445 2.58651 -6.14573 6.3669 -4.52336 6.37342 -9.37606 9.76836 -2.4198 3.36929 -2.89109 3.66974 -5.62463 6.05989 -0.674219 1.84165 -0.590017 1.71153 -1.54622 2.10277 -6.48003 6.55663 -3.56355 3.98573 -0.743671 1.87049 -3.27833 6.0722 -4.76267 6.9967 -2.80188 4.03037 -0.372694 0.482111 -5.73987 5.9529 -8.84732 9.49033 -0.833944 1.8157 -4.06126 4.36615 -0.884619 2.34622 -6.86723 6.99141 -8.07737 9.05193 -8.35903 9.00761 -8.84777 9.74001 -8.58058 9.05479 -8.28076 8.44566 -4.55155 5.65475 -2.44314 3.38966 -3.22172 4.50395 -7.1808 7.90376 -0.639636 1.72606 -5.46807 5.94322 -9.02146 9.87864 --0.628472 0.655557 -4.29775 5.9553 -6.77525 7.38152 -6.51827 6.93542 -8.95252 9.52939 -0.755406 1.19973 -7.69455 7.86912 -0.170143 1.12949 -7.69254 8.08221 -2.08238 3.27051 -1.28662 1.78628 -1.21208 2.79391 --0.155739 1.7071 -8.28833 9.10011 -5.77789 6.6954 -1.98395 2.35216 -5.77469 6.05177 -2.77565 5.81092 --1.53416 2.30576 -6.93529 8.04506 -3.91553 4.55593 -5.57201 6.29071 -1.54149 1.86613 -4.09163 4.31234 -8.47834 11.1229 -5.70376 7.02981 -2.24683 3.79925 -5.4793 6.41036 -5.27644 6.81729 -0.13273 0.371437 -1.22959 1.41618 -0.551957 1.03276 -2.01269 2.4018 -8.77113 9.09395 -8.11753 8.46262 -0.39406 0.783705 -5.35964 5.48227 -7.24727 8.23233 -7.74525 8.85748 -0.0115736 0.882607 -1.78575 2.19684 -8.32514 9.0503 -3.11074 3.34975 -0.847464 2.13237 -0.310898 0.393528 -8.68841 10.518 -1.10032 1.83755 -2.42286 3.02554 -1.16364 2.80986 -1.46419 2.11421 -7.46021 7.90273 -6.86556 7.62542 -1.91466 3.79843 -3.1056 3.83969 -3.41591 4.26565 -0.285122 1.21372 -3.75441 5.52385 -1.07643 2.63403 -6.17341 7.67244 -9.13122 9.5132 -4.39696 6.15885 -3.7207 4.07729 -6.80782 7.1958 -6.65933 6.67105 -8.51535 8.7263 -5.98305 7.17759 -2.19609 2.46108 -8.21186 8.96908 -2.94729 3.60562 -3.31907 3.9297 -0.463492 0.626603 -2.62143 3.55089 -5.76898 6.79002 -1.45502 1.56525 -4.80797 5.62389 -5.87337 6.70588 -2.92765 3.50929 -0.412987 0.951057 -3.64594 4.40269 --0.043401 0.502176 -4.54802 5.44613 -1.20218 1.8732 -2.75547 2.96745 -7.10348 7.7945 -9.74845 9.98835 -4.83718 6.4836 -2.30563 2.5903 -4.74016 6.30789 -6.42192 6.93329 -5.37294 6.73938 -2.4365 3.05787 -1.08283 3.79193 -4.90426 5.93563 -3.8874 4.83301 -0.13909 0.983027 -4.07407 5.61421 -8.62875 10.6851 -8.10233 8.29952 -2.23047 2.4691 -7.34617 7.39475 -1.66309 2.3032 -7.11207 10.0686 -4.52412 6.38666 -2.48323 2.96878 -7.47877 8.86547 -2.67607 4.33436 -6.83659 8.21075 -2.87313 3.39011 -2.81911 4.07729 -0.227877 0.657898 -6.57843 7.14311 --0.591405 1.56925 -7.08018 7.59 -9.09558 9.3923 -9.48544 9.79474 -0.740233 2.33129 -8.51111 11.134 -7.79219 8.0281 -1.73821 1.89316 -9.21077 9.29488 -5.38354 6.46025 -4.30403 4.5472 -0.0893758 0.919238 -7.94464 8.51053 -5.27119 6.3741 -5.22476 6.00588 diff --git a/geom_bottleneck/tests/data/test_013_A b/geom_bottleneck/tests/data/test_013_A deleted file mode 100644 index 51cff1c..0000000 --- a/geom_bottleneck/tests/data/test_013_A +++ /dev/null @@ -1,5 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 diff --git a/geom_bottleneck/tests/data/test_013_B b/geom_bottleneck/tests/data/test_013_B deleted file mode 100644 index be62ed3..0000000 --- a/geom_bottleneck/tests/data/test_013_B +++ /dev/null @@ -1,5 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 diff --git a/geom_bottleneck/tests/data/test_014_A b/geom_bottleneck/tests/data/test_014_A deleted file mode 100644 index f7f90ff..0000000 --- a/geom_bottleneck/tests/data/test_014_A +++ /dev/null @@ -1 +0,0 @@ -1.0 1.0 diff --git a/geom_bottleneck/tests/data/test_014_B b/geom_bottleneck/tests/data/test_014_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/test_014_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/test_015_A b/geom_bottleneck/tests/data/test_015_A deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/test_015_A +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/test_015_B b/geom_bottleneck/tests/data/test_015_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/test_015_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/test_016_A b/geom_bottleneck/tests/data/test_016_A deleted file mode 100644 index 151d4b1..0000000 --- a/geom_bottleneck/tests/data/test_016_A +++ /dev/null @@ -1,220 +0,0 @@ -1.391781911475341 1.391781911475341 -1.395142124726278 1.395142124726278 -1.514181227875788 1.514181227875788 -1.528291566797427 1.528291566797427 -1.585389310674157 1.585389310674157 -1.629232116709072 1.629232116709072 -1.641428662445941 1.641428662445941 -1.646998748860116 1.646998748860116 -1.652915988616469 1.652915988616469 -1.69199679556404 1.69199679556404 -1.705727462482595 1.705727462482595 -1.706819293048617 1.706819293048617 -1.720175733750729 1.720175733750729 -1.728031840308488 1.728031840308488 -1.73797421040929 1.73797421040929 -1.739519744204842 1.739519744204842 -1.76132425248022 1.76132425248022 -1.767766952966369 1.767766952966369 -1.792444271021371 1.792444271021371 -1.831487552809192 1.831487552809192 -1.837086616049901 1.837086616049901 -1.851186504948943 1.851186504948943 -1.860502132730509 1.860502132730509 -1.8619433117852 1.8619433117852 -1.878229072834972 1.878229072834972 -1.880655074837347 1.880655074837347 -1.883647832802556 1.883647832802556 -1.884127769927503 1.884127769927503 -1.892969784466709 1.892969784466709 -1.916936460787894 1.916936460787894 -1.931545068229315 1.931545068229315 -1.937626522143119 1.937626522143119 -1.942267721488891 1.942267721488891 -1.963295334827521 1.963295334827521 -1.975655395743736 1.975655395743736 -1.981448090925679 1.981448090925679 -1.986220565173897 1.986220565173897 -1.98709020812351 1.98709020812351 -1.989420269013254 1.989420269013254 -2.007874648480185 2.007874648480185 -2.012179388983059 2.012179388983059 -2.019051972834053 2.019051972834053 -2.023278848058142 2.023278848058142 -2.026190677562545 2.026190677562545 -2.041594763633561 2.041594763633561 -2.042508934597344 2.042508934597344 -2.04305394648524 2.04305394648524 -2.052514683218775 2.052514683218775 -2.059038785694094 2.059038785694094 -2.062577320792516 2.062577320792516 -2.063488177732052 2.063488177732052 -2.067806664626417 2.067806664626417 -2.073013782498534 2.073013782498534 -2.08646120854976 2.08646120854976 -2.098476357223667 2.098476357223667 -2.101378199886176 2.101378199886176 -2.101927506425904 2.101927506425904 -2.12671744783454 2.12671744783454 -2.143966150630584 2.143966150630584 -2.145312642688415 2.145312642688415 -2.148704396208969 2.148704396208969 -2.153092682531471 2.153092682531471 -2.157553654759374 2.157553654759374 -2.176659075756566 2.176659075756566 -2.177260578806816 2.177260578806816 -2.179141269427014 2.179141269427014 -2.201895416482074 2.201895416482074 -2.202563945779844 2.202563945779844 -2.205113735193028 2.205113735193028 -2.207345865351049 2.207345865351049 -2.208922099676958 2.208922099676958 -2.218057898922937 2.218057898922937 -2.228610453267036 2.228610453267036 -2.241314066596301 2.241314066596301 -2.242145210071643 2.242145210071643 -2.253976266568437 2.253976266568437 -2.255324860119305 2.255324860119305 -2.271300972641221 2.271300972641221 -2.279438361991067 2.279438361991067 -2.286592331830957 2.286592331830957 -2.287159411646074 2.287159411646074 -2.296653147995115 2.296653147995115 -2.301754785182811 2.301754785182811 -2.30409930499031 2.30409930499031 -2.32141477565108 2.32141477565108 -2.347789281926012 2.347789281926012 -2.347827987256373 2.347827987256373 -2.349391321950732 2.349391321950732 -2.350129292983257 2.350129292983257 -2.358679083392328 2.358679083392328 -2.372845273125388 2.372845273125388 -2.385040766846267 2.385040766846267 -2.42114588843816 2.42114588843816 -2.425116524931602 2.425116524931602 -2.426518521893022 2.426518521893022 -2.43211651886311 2.43211651886311 -2.441302771998711 2.441302771998711 -2.446429340510857 2.446429340510857 -2.446547553904861 2.446547553904861 -2.45764765793376 2.45764765793376 -2.461222149682938 2.461222149682938 -2.467900747394114 2.467900747394114 -2.473214152160872 2.473214152160872 -2.5 2.5 -2.503557913626332 2.503557913626332 -2.504315621146863 2.504315621146863 -2.515634290122204 2.515634290122204 -2.516231935083851 2.516231935083851 -2.517558892374071 2.517558892374071 -2.526325773757754 2.526325773757754 -2.531164001388939 2.531164001388939 -2.53128061055404 2.53128061055404 -2.539387277827314 2.539387277827314 -2.540864599180268 2.540864599180268 -2.548084457784768 2.548084457784768 -2.548923292215475 2.548923292215475 -2.551730202825644 2.551730202825644 -2.553178578801818 2.553178578801818 -2.560295747947446 2.560295747947446 -2.566321603108612 2.566321603108612 -2.568932286976676 2.568932286976676 -2.574887688783916 2.574887688783916 -2.581809142325336 2.581809142325336 -2.584541960262555 2.584541960262555 -2.585511915815223 2.585511915815223 -2.592970592044868 2.592970592044868 -2.596055336381078 2.596055336381078 -2.598560573626668 2.598560573626668 -2.614019084614256 2.614019084614256 -2.618463725327216 2.618463725327216 -2.622883674481145 2.622883674481145 -2.627791161528314 2.627791161528314 -2.63535653879261 2.63535653879261 -2.654825898255443 2.654825898255443 -2.660423271276714 2.660423271276714 -2.667148030102869 2.667148030102869 -2.67012591760915 2.67012591760915 -2.698712599567882 2.698712599567882 -2.72180967799905 2.72180967799905 -2.732466204434637 2.732466204434637 -2.734187392905275 2.734187392905275 -2.737296308103857 2.737296308103857 -2.745724923243991 2.745724923243991 -2.749541709159369 2.749541709159369 -2.752925621447035 2.752925621447035 -2.754183973113479 2.754183973113479 -2.763972022430258 2.763972022430258 -2.766941997926879 2.766941997926879 -2.773850925522978 2.773850925522978 -2.777506755238121 2.777506755238121 -2.780333194223143 2.780333194223143 -2.783060349483276 2.783060349483276 -2.78679029681548 2.78679029681548 -2.786792895521339 2.786792895521339 -2.795170825459034 2.795170825459034 -2.801104989227437 2.801104989227437 -2.80525433080833 2.80525433080833 -2.805376738133109 2.805376738133109 -2.806844454092663 2.806844454092663 -2.811611818684648 2.811611818684648 -2.811994908451803 2.811994908451803 -2.816002798930236 2.816002798930236 -2.816814002472584 2.816814002472584 -2.818569391261086 2.818569391261086 -2.821660827076439 2.821660827076439 -2.822317588351085 2.822317588351085 -2.824910409962511 2.824910409962511 -2.829322097471409 2.829322097471409 -2.833852169620359 2.833852169620359 -2.839287537694811 2.839287537694811 -2.841714730677953 2.841714730677953 -2.841715058318205 2.841715058318205 -2.851653306950001 2.851653306950001 -2.853639002902003 2.853639002902003 -2.85515962291442 2.85515962291442 -2.855333736885793 2.855333736885793 -2.872540314564304 2.872540314564304 -2.879449214478037 2.879449214478037 -2.881003856158217 2.881003856158217 -2.881074731438092 2.881074731438092 -2.893589165559115 2.893589165559115 -2.898664743213686 2.898664743213686 -2.90387832180792 2.90387832180792 -2.919095859678745 2.919095859678745 -2.924945175440496 2.924945175440496 -2.931795145696962 2.931795145696962 -2.932285006979528 2.932285006979528 -2.934606807227626 2.934606807227626 -2.936392671567475 2.936392671567475 -2.953794710898493 2.953794710898493 -2.958055395706548 2.958055395706548 -2.960407744013656 2.960407744013656 -2.960759715914242 2.960759715914242 -2.969702548922556 2.969702548922556 -2.970149844982665 2.970149844982665 -2.978953970679893 2.978953970679893 -2.979075864664287 2.979075864664287 -2.984665519558418 2.984665519558418 -3.04548240149063 3.04548240149063 -3.050688336416719 3.050688336416719 -3.05773927378742 3.05773927378742 -3.059596740753369 3.059596740753369 -3.059762479996741 3.059762479996741 -3.088543279751235 3.088543279751235 -3.093580813520995 3.093580813520995 -3.104787362108069 3.104787362108069 -3.173380191779681 3.173380191779681 -3.583124637167399 3.583124637167399 -3.630658112409034 3.630658112409034 -3.631421639368965 3.631421639368965 -3.751087101339956 3.751087101339956 -3.800845709568037 3.800845709568037 -3.846558940956666 3.846558940956666 -4 4 -4 4 -4.076238038291317 4.076238038291317 -4.455547086147983 4.455547086147983 -5.356087357608394 5.356087357608394 -5.54364842773721 5.54364842773721 -7.587654388717225 7.587654388717225 diff --git a/geom_bottleneck/tests/data/test_016_B b/geom_bottleneck/tests/data/test_016_B deleted file mode 100644 index bb8655a..0000000 --- a/geom_bottleneck/tests/data/test_016_B +++ /dev/null @@ -1,193 +0,0 @@ -1.167089173446239 1.167089173446239 -1.256234452640111 1.256234452640111 -1.303693422257498 1.303693422257498 -1.413255970488646 1.413255970488646 -1.697910382446573 1.697910382446573 -1.718844728805093 1.718844728805093 -1.734124820632724 1.734124820632724 -1.749572938304276 1.749572938304276 -1.770320424526358 1.770320424526358 -1.786344763036807 1.786344763036807 -1.810054737907635 1.810054737907635 -1.815127306170105 1.815127306170105 -1.837806648681218 1.837806648681218 -1.870552189043019 1.870552189043019 -1.897240351979503 1.897240351979503 -1.935562152643027 1.935562152643027 -1.952562418976663 1.952562418976663 -1.959552126104175 1.959552126104175 -1.979899732318601 1.979899732318601 -2.00044500769347 2.00044500769347 -2.028951227523087 2.028951227523087 -2.037678749316724 2.037678749316724 -2.047911420446857 2.047911420446857 -2.075181804515723 2.075181804515723 -2.077245386452578 2.077245386452578 -2.084751316684838 2.084751316684838 -2.084860886126203 2.084860886126203 -2.103286477421968 2.103286477421968 -2.106856827309345 2.106856827309345 -2.113139266068691 2.113139266068691 -2.114594962503455 2.114594962503455 -2.115917727493158 2.115917727493158 -2.122335878797089 2.122335878797089 -2.127359082726206 2.127359082726206 -2.131673381033273 2.131673381033273 -2.155015793320908 2.155015793320908 -2.162480684365264 2.162480684365264 -2.195207236194009 2.195207236194009 -2.203279931784429 2.203279931784429 -2.205567995563669 2.205567995563669 -2.212933962936773 2.212933962936773 -2.215081271089993 2.215081271089993 -2.225989037578865 2.225989037578865 -2.24218929203347 2.24218929203347 -2.246321319993257 2.246321319993257 -2.280059407166517 2.280059407166517 -2.284117669032543 2.284117669032543 -2.293233992770926 2.293233992770926 -2.298815356955373 2.298815356955373 -2.300542634724628 2.300542634724628 -2.326408290042679 2.326408290042679 -2.328797162040625 2.328797162040625 -2.36025798094028 2.36025798094028 -2.365031313604634 2.365031313604634 -2.372266311053883 2.372266311053883 -2.400053902049271 2.400053902049271 -2.409134054334209 2.409134054334209 -2.411368235895246 2.411368235895246 -2.415934766378347 2.415934766378347 -2.420989857074179 2.420989857074179 -2.422520269961376 2.422520269961376 -2.43377629944218 2.43377629944218 -2.449308615746858 2.449308615746858 -2.452936540056068 2.452936540056068 -2.453698388060092 2.453698388060092 -2.454711357943602 2.454711357943602 -2.459202673400056 2.459202673400056 -2.493778305287384 2.493778305287384 -2.537394117473177 2.537394117473177 -2.544674753106669 2.544674753106669 -2.558904304820755 2.558904304820755 -2.563089994365716 2.563089994365716 -2.565476194422898 2.565476194422898 -2.599756049189921 2.599756049189921 -2.603619661709009 2.603619661709009 -2.609775379385211 2.609775379385211 -2.622552038976658 2.622552038976658 -2.623798471910885 2.623798471910885 -2.635711198661633 2.635711198661633 -2.644229304223612 2.644229304223612 -2.661919064427223 2.661919064427223 -2.666783921498494 2.666783921498494 -2.675503310152301 2.675503310152301 -2.684228699964661 2.684228699964661 -2.696854617267681 2.696854617267681 -2.700538654666735 2.700538654666735 -2.744886611436907 2.744886611436907 -2.748618547996708 2.748618547996708 -2.757981496641135 2.757981496641135 -2.774766825791652 2.774766825791652 -2.784491736143893 2.784491736143893 -2.796482184304273 2.796482184304273 -2.800849254751463 2.800849254751463 -2.816963410000067 2.816963410000067 -2.825207379914743 2.825207379914743 -2.831286409028398 2.831286409028398 -2.844827082550712 2.844827082550712 -2.853558438121966 2.853558438121966 -2.859806035663089 2.859806035663089 -2.878956033959891 2.878956033959891 -2.886422825109222 2.886422825109222 -2.891566924618832 2.891566924618832 -2.892028419188578 2.892028419188578 -2.893138900330932 2.893138900330932 -2.894250936382814 2.894250936382814 -2.90112201577666 2.90112201577666 -2.902172795370005 2.902172795370005 -2.90967533504119 2.90967533504119 -2.919687125962211 2.919687125962211 -2.923711238894001 2.923711238894001 -2.929041907338841 2.929041907338841 -2.938734873084349 2.938734873084349 -2.939642428979572 2.939642428979572 -2.943010909640486 2.943010909640486 -2.944210926048103 2.944210926048103 -2.951091358234723 2.951091358234723 -2.953950275008233 2.953950275008233 -2.966943157369611 2.966943157369611 -2.982522008227535 2.982522008227535 -2.992174049247434 2.992174049247434 -2.993098995839607 2.993098995839607 -2.995311055519335 2.995311055519335 -2.996708164866609 2.996708164866609 -2.999922110096644 2.999922110096644 -3 3 -3.000364533251431 3.000364533251431 -3.003840990677832 3.003840990677832 -3.006672301312824 3.006672301312824 -3.016489409140306 3.016489409140306 -3.021123787004333 3.021123787004333 -3.039117818612596 3.039117818612596 -3.039555193616473 3.039555193616473 -3.049952247267922 3.049952247267922 -3.057673482371216 3.057673482371216 -3.06920083507411 3.06920083507411 -3.075505231082782 3.075505231082782 -3.079038628197304 3.079038628197304 -3.084265889701239 3.084265889701239 -3.086837468106297 3.086837468106297 -3.103873984398081 3.103873984398081 -3.11528125482979 3.11528125482979 -3.119720021802376 3.119720021802376 -3.132543753577128 3.132543753577128 -3.141822873359038 3.141822873359038 -3.143502053175705 3.143502053175705 -3.153232877003746 3.153232877003746 -3.157586960809866 3.157586960809866 -3.157966892275408 3.157966892275408 -3.163583225161638 3.163583225161638 -3.178188125342772 3.178188125342772 -3.178475867931057 3.178475867931057 -3.179372297765929 3.179372297765929 -3.186437137237586 3.186437137237586 -3.188053957464282 3.188053957464282 -3.199351610026191 3.199351610026191 -3.204566427513051 3.204566427513051 -3.22885278850648 3.22885278850648 -3.229088648916556 3.229088648916556 -3.236685523936269 3.236685523936269 -3.239854786600373 3.239854786600373 -3.255809161351669 3.255809161351669 -3.287718056143732 3.287718056143732 -3.294038308299402 3.294038308299402 -3.313688277153076 3.313688277153076 -3.325783245946608 3.325783245946608 -3.331072954808429 3.331072954808429 -3.354962852285211 3.354962852285211 -3.357502741262644 3.357502741262644 -3.373668509804576 3.373668509804576 -3.408653045775418 3.408653045775418 -3.416281541503763 3.416281541503763 -3.443144279972986 3.443144279972986 -3.492970564191033 3.492970564191033 -3.493767805580122 3.493767805580122 -3.559084134799019 3.559084134799019 -3.559898699300211 3.559898699300211 -3.833585501974904 3.833585501974904 -4.099502076836052 4.099502076836052 -4.484082147277348 4.484082147277348 -4.505718324707756 4.505718324707756 -4.891723119528026 4.891723119528026 -5.065300494905414 5.065300494905414 -5.188599238535201 5.188599238535201 -5.36134479630535 5.36134479630535 -5.609786508140671 5.609786508140671 -7.08640314680382 7.08640314680382 -7.113765883549079 7.113765883549079 -7.328944131981744 7.328944131981744 -7.63625182217108 7.63625182217108 -7.716743341311718 7.716743341311718 -7.938093404092351 7.938093404092351 -8.112783377863046 8.112783377863046 -8.131485096731454 8.131485096731454 diff --git a/geom_bottleneck/tests/data/test_100_A b/geom_bottleneck/tests/data/test_100_A deleted file mode 100644 index e02a950..0000000 --- a/geom_bottleneck/tests/data/test_100_A +++ /dev/null @@ -1,2 +0,0 @@ -0 3 -6 12 diff --git a/geom_bottleneck/tests/data/test_100_B b/geom_bottleneck/tests/data/test_100_B deleted file mode 100644 index f757173..0000000 --- a/geom_bottleneck/tests/data/test_100_B +++ /dev/null @@ -1,2 +0,0 @@ -3 5 -5 13 diff --git a/geom_bottleneck/tests/data/test_101_A b/geom_bottleneck/tests/data/test_101_A deleted file mode 100644 index 5fe22b1..0000000 --- a/geom_bottleneck/tests/data/test_101_A +++ /dev/null @@ -1,2 +0,0 @@ -8 11 -9 11 diff --git a/geom_bottleneck/tests/data/test_101_B b/geom_bottleneck/tests/data/test_101_B deleted file mode 100644 index ea19ef6..0000000 --- a/geom_bottleneck/tests/data/test_101_B +++ /dev/null @@ -1,2 +0,0 @@ -3 6 -5 8 diff --git a/geom_bottleneck/tests/data/test_102_A b/geom_bottleneck/tests/data/test_102_A deleted file mode 100644 index 1cd65e9..0000000 --- a/geom_bottleneck/tests/data/test_102_A +++ /dev/null @@ -1,2 +0,0 @@ -7 8 -9 16 diff --git a/geom_bottleneck/tests/data/test_102_B b/geom_bottleneck/tests/data/test_102_B deleted file mode 100644 index 3ffa9cb..0000000 --- a/geom_bottleneck/tests/data/test_102_B +++ /dev/null @@ -1,2 +0,0 @@ -1 10 -9 12 diff --git a/geom_bottleneck/tests/data/test_103_A b/geom_bottleneck/tests/data/test_103_A deleted file mode 100644 index d4c86c9..0000000 --- a/geom_bottleneck/tests/data/test_103_A +++ /dev/null @@ -1,2 +0,0 @@ -5 7 -10 15 diff --git a/geom_bottleneck/tests/data/test_103_B b/geom_bottleneck/tests/data/test_103_B deleted file mode 100644 index c9a898a..0000000 --- a/geom_bottleneck/tests/data/test_103_B +++ /dev/null @@ -1,2 +0,0 @@ -1 2 -1 7 diff --git a/geom_bottleneck/tests/data/test_104_A b/geom_bottleneck/tests/data/test_104_A deleted file mode 100644 index 373ae44..0000000 --- a/geom_bottleneck/tests/data/test_104_A +++ /dev/null @@ -1,2 +0,0 @@ -6 11 -3 6 diff --git a/geom_bottleneck/tests/data/test_104_B b/geom_bottleneck/tests/data/test_104_B deleted file mode 100644 index e382a3b..0000000 --- a/geom_bottleneck/tests/data/test_104_B +++ /dev/null @@ -1,2 +0,0 @@ -3 9 -10 17 diff --git a/geom_bottleneck/tests/data/test_105_A b/geom_bottleneck/tests/data/test_105_A deleted file mode 100644 index 21b1cc4..0000000 --- a/geom_bottleneck/tests/data/test_105_A +++ /dev/null @@ -1,2 +0,0 @@ -5 14 -2 7 diff --git a/geom_bottleneck/tests/data/test_105_B b/geom_bottleneck/tests/data/test_105_B deleted file mode 100644 index 3ab6543..0000000 --- a/geom_bottleneck/tests/data/test_105_B +++ /dev/null @@ -1,2 +0,0 @@ -5 12 -3 12 diff --git a/geom_bottleneck/tests/data/test_106_A b/geom_bottleneck/tests/data/test_106_A deleted file mode 100644 index 8d3ffb8..0000000 --- a/geom_bottleneck/tests/data/test_106_A +++ /dev/null @@ -1,2 +0,0 @@ -7 11 -7 15 diff --git a/geom_bottleneck/tests/data/test_106_B b/geom_bottleneck/tests/data/test_106_B deleted file mode 100644 index 760ada5..0000000 --- a/geom_bottleneck/tests/data/test_106_B +++ /dev/null @@ -1,2 +0,0 @@ -4 12 -6 13 diff --git a/geom_bottleneck/tests/data/test_107_A b/geom_bottleneck/tests/data/test_107_A deleted file mode 100644 index 79a621d..0000000 --- a/geom_bottleneck/tests/data/test_107_A +++ /dev/null @@ -1,2 +0,0 @@ -9 19 -1 7 diff --git a/geom_bottleneck/tests/data/test_107_B b/geom_bottleneck/tests/data/test_107_B deleted file mode 100644 index 43e4294..0000000 --- a/geom_bottleneck/tests/data/test_107_B +++ /dev/null @@ -1,2 +0,0 @@ -0 1 -1 3 diff --git a/geom_bottleneck/tests/data/test_108_A b/geom_bottleneck/tests/data/test_108_A deleted file mode 100644 index c2035e5..0000000 --- a/geom_bottleneck/tests/data/test_108_A +++ /dev/null @@ -1,2 +0,0 @@ -9 19 -7 16 diff --git a/geom_bottleneck/tests/data/test_108_B b/geom_bottleneck/tests/data/test_108_B deleted file mode 100644 index 618c2c8..0000000 --- a/geom_bottleneck/tests/data/test_108_B +++ /dev/null @@ -1,2 +0,0 @@ -5 13 -0 9 diff --git a/geom_bottleneck/tests/data/test_109_A b/geom_bottleneck/tests/data/test_109_A deleted file mode 100644 index d16f551..0000000 --- a/geom_bottleneck/tests/data/test_109_A +++ /dev/null @@ -1,2 +0,0 @@ -8 9 -3 10 diff --git a/geom_bottleneck/tests/data/test_109_B b/geom_bottleneck/tests/data/test_109_B deleted file mode 100644 index 02f9518..0000000 --- a/geom_bottleneck/tests/data/test_109_B +++ /dev/null @@ -1,2 +0,0 @@ -4 9 -6 13 diff --git a/geom_bottleneck/tests/data/test_110_A b/geom_bottleneck/tests/data/test_110_A deleted file mode 100644 index f013fd8..0000000 --- a/geom_bottleneck/tests/data/test_110_A +++ /dev/null @@ -1,2 +0,0 @@ -3 5 -1 10 diff --git a/geom_bottleneck/tests/data/test_110_B b/geom_bottleneck/tests/data/test_110_B deleted file mode 100644 index f443b07..0000000 --- a/geom_bottleneck/tests/data/test_110_B +++ /dev/null @@ -1,2 +0,0 @@ -7 10 -3 5 diff --git a/geom_bottleneck/tests/data/test_111_A b/geom_bottleneck/tests/data/test_111_A deleted file mode 100644 index fcadd44..0000000 --- a/geom_bottleneck/tests/data/test_111_A +++ /dev/null @@ -1,2 +0,0 @@ -10 19 -3 4 diff --git a/geom_bottleneck/tests/data/test_111_B b/geom_bottleneck/tests/data/test_111_B deleted file mode 100644 index 569a5d5..0000000 --- a/geom_bottleneck/tests/data/test_111_B +++ /dev/null @@ -1,2 +0,0 @@ -5 6 -10 15 diff --git a/geom_bottleneck/tests/data/test_112_A b/geom_bottleneck/tests/data/test_112_A deleted file mode 100644 index 7d421ec..0000000 --- a/geom_bottleneck/tests/data/test_112_A +++ /dev/null @@ -1,2 +0,0 @@ -1 5 -7 8 diff --git a/geom_bottleneck/tests/data/test_112_B b/geom_bottleneck/tests/data/test_112_B deleted file mode 100644 index ec7a9a1..0000000 --- a/geom_bottleneck/tests/data/test_112_B +++ /dev/null @@ -1,2 +0,0 @@ -4 11 -9 17 diff --git a/geom_bottleneck/tests/data/test_113_A b/geom_bottleneck/tests/data/test_113_A deleted file mode 100644 index c3b3312..0000000 --- a/geom_bottleneck/tests/data/test_113_A +++ /dev/null @@ -1,2 +0,0 @@ -5 12 -0 3 diff --git a/geom_bottleneck/tests/data/test_113_B b/geom_bottleneck/tests/data/test_113_B deleted file mode 100644 index ca287ff..0000000 --- a/geom_bottleneck/tests/data/test_113_B +++ /dev/null @@ -1,2 +0,0 @@ -3 13 -6 11 diff --git a/geom_bottleneck/tests/data/test_114_A b/geom_bottleneck/tests/data/test_114_A deleted file mode 100644 index 112e9d3..0000000 --- a/geom_bottleneck/tests/data/test_114_A +++ /dev/null @@ -1,2 +0,0 @@ -6 15 -2 6 diff --git a/geom_bottleneck/tests/data/test_114_B b/geom_bottleneck/tests/data/test_114_B deleted file mode 100644 index dabf69d..0000000 --- a/geom_bottleneck/tests/data/test_114_B +++ /dev/null @@ -1,2 +0,0 @@ -6 7 -1 4 diff --git a/geom_bottleneck/tests/data/test_115_A b/geom_bottleneck/tests/data/test_115_A deleted file mode 100644 index c467eae..0000000 --- a/geom_bottleneck/tests/data/test_115_A +++ /dev/null @@ -1,2 +0,0 @@ -10 18 -0 1 diff --git a/geom_bottleneck/tests/data/test_115_B b/geom_bottleneck/tests/data/test_115_B deleted file mode 100644 index e14dd59..0000000 --- a/geom_bottleneck/tests/data/test_115_B +++ /dev/null @@ -1,2 +0,0 @@ -2 3 -4 8 diff --git a/geom_bottleneck/tests/data/test_116_A b/geom_bottleneck/tests/data/test_116_A deleted file mode 100644 index 1828c98..0000000 --- a/geom_bottleneck/tests/data/test_116_A +++ /dev/null @@ -1,2 +0,0 @@ -8 9 -9 14 diff --git a/geom_bottleneck/tests/data/test_116_B b/geom_bottleneck/tests/data/test_116_B deleted file mode 100644 index f63039f..0000000 --- a/geom_bottleneck/tests/data/test_116_B +++ /dev/null @@ -1,2 +0,0 @@ -5 13 -9 18 diff --git a/geom_bottleneck/tests/data/test_117_A b/geom_bottleneck/tests/data/test_117_A deleted file mode 100644 index 280d9bc..0000000 --- a/geom_bottleneck/tests/data/test_117_A +++ /dev/null @@ -1,2 +0,0 @@ -10 15 -9 14 diff --git a/geom_bottleneck/tests/data/test_117_B b/geom_bottleneck/tests/data/test_117_B deleted file mode 100644 index 595260c..0000000 --- a/geom_bottleneck/tests/data/test_117_B +++ /dev/null @@ -1,2 +0,0 @@ -9 15 -6 11 diff --git a/geom_bottleneck/tests/data/test_118_A b/geom_bottleneck/tests/data/test_118_A deleted file mode 100644 index 2ecae80..0000000 --- a/geom_bottleneck/tests/data/test_118_A +++ /dev/null @@ -1,2 +0,0 @@ -9 10 -4 11 diff --git a/geom_bottleneck/tests/data/test_118_B b/geom_bottleneck/tests/data/test_118_B deleted file mode 100644 index 13fc15b..0000000 --- a/geom_bottleneck/tests/data/test_118_B +++ /dev/null @@ -1,2 +0,0 @@ -5 14 -7 13 diff --git a/geom_bottleneck/tests/data/test_119_A b/geom_bottleneck/tests/data/test_119_A deleted file mode 100644 index db12f3c..0000000 --- a/geom_bottleneck/tests/data/test_119_A +++ /dev/null @@ -1,2 +0,0 @@ -2 12 -2 5 diff --git a/geom_bottleneck/tests/data/test_119_B b/geom_bottleneck/tests/data/test_119_B deleted file mode 100644 index 79ccbdd..0000000 --- a/geom_bottleneck/tests/data/test_119_B +++ /dev/null @@ -1,2 +0,0 @@ -2 7 -2 3 diff --git a/geom_bottleneck/tests/data/test_120_A b/geom_bottleneck/tests/data/test_120_A deleted file mode 100644 index cd31ead..0000000 --- a/geom_bottleneck/tests/data/test_120_A +++ /dev/null @@ -1,3 +0,0 @@ -5 13 -9 10 -3 4 diff --git a/geom_bottleneck/tests/data/test_120_B b/geom_bottleneck/tests/data/test_120_B deleted file mode 100644 index 148cbca..0000000 --- a/geom_bottleneck/tests/data/test_120_B +++ /dev/null @@ -1,3 +0,0 @@ -2 6 -5 6 -3 12 diff --git a/geom_bottleneck/tests/data/test_121_A b/geom_bottleneck/tests/data/test_121_A deleted file mode 100644 index 864cde5..0000000 --- a/geom_bottleneck/tests/data/test_121_A +++ /dev/null @@ -1,3 +0,0 @@ -10 16 -7 14 -5 8 diff --git a/geom_bottleneck/tests/data/test_121_B b/geom_bottleneck/tests/data/test_121_B deleted file mode 100644 index cc2c1dc..0000000 --- a/geom_bottleneck/tests/data/test_121_B +++ /dev/null @@ -1,3 +0,0 @@ -9 15 -5 10 -0 3 diff --git a/geom_bottleneck/tests/data/test_122_A b/geom_bottleneck/tests/data/test_122_A deleted file mode 100644 index 681d074..0000000 --- a/geom_bottleneck/tests/data/test_122_A +++ /dev/null @@ -1,3 +0,0 @@ -5 6 -8 9 -5 11 diff --git a/geom_bottleneck/tests/data/test_122_B b/geom_bottleneck/tests/data/test_122_B deleted file mode 100644 index e8681e6..0000000 --- a/geom_bottleneck/tests/data/test_122_B +++ /dev/null @@ -1,3 +0,0 @@ -7 8 -0 1 -6 12 diff --git a/geom_bottleneck/tests/data/test_123_A b/geom_bottleneck/tests/data/test_123_A deleted file mode 100644 index 2c53b51..0000000 --- a/geom_bottleneck/tests/data/test_123_A +++ /dev/null @@ -1,3 +0,0 @@ -5 8 -4 6 -9 10 diff --git a/geom_bottleneck/tests/data/test_123_B b/geom_bottleneck/tests/data/test_123_B deleted file mode 100644 index 0acdfb7..0000000 --- a/geom_bottleneck/tests/data/test_123_B +++ /dev/null @@ -1,3 +0,0 @@ -9 14 -5 14 -4 5 diff --git a/geom_bottleneck/tests/data/test_124_A b/geom_bottleneck/tests/data/test_124_A deleted file mode 100644 index f43cb9a..0000000 --- a/geom_bottleneck/tests/data/test_124_A +++ /dev/null @@ -1,3 +0,0 @@ -0 1 -8 16 -4 7 diff --git a/geom_bottleneck/tests/data/test_124_B b/geom_bottleneck/tests/data/test_124_B deleted file mode 100644 index 51dd494..0000000 --- a/geom_bottleneck/tests/data/test_124_B +++ /dev/null @@ -1,3 +0,0 @@ -7 8 -0 1 -4 6 diff --git a/geom_bottleneck/tests/data/test_125_A b/geom_bottleneck/tests/data/test_125_A deleted file mode 100644 index e0b6720..0000000 --- a/geom_bottleneck/tests/data/test_125_A +++ /dev/null @@ -1,3 +0,0 @@ -9 11 -6 13 -1 10 diff --git a/geom_bottleneck/tests/data/test_125_B b/geom_bottleneck/tests/data/test_125_B deleted file mode 100644 index cf4f98c..0000000 --- a/geom_bottleneck/tests/data/test_125_B +++ /dev/null @@ -1,3 +0,0 @@ -7 16 -10 11 -7 16 diff --git a/geom_bottleneck/tests/data/test_126_A b/geom_bottleneck/tests/data/test_126_A deleted file mode 100644 index f504606..0000000 --- a/geom_bottleneck/tests/data/test_126_A +++ /dev/null @@ -1,3 +0,0 @@ -4 8 -5 14 -1 6 diff --git a/geom_bottleneck/tests/data/test_126_B b/geom_bottleneck/tests/data/test_126_B deleted file mode 100644 index f5b5fda..0000000 --- a/geom_bottleneck/tests/data/test_126_B +++ /dev/null @@ -1,3 +0,0 @@ -1 2 -8 12 -7 8 diff --git a/geom_bottleneck/tests/data/test_127_A b/geom_bottleneck/tests/data/test_127_A deleted file mode 100644 index 20f8541..0000000 --- a/geom_bottleneck/tests/data/test_127_A +++ /dev/null @@ -1,3 +0,0 @@ -7 8 -10 15 -3 4 diff --git a/geom_bottleneck/tests/data/test_127_B b/geom_bottleneck/tests/data/test_127_B deleted file mode 100644 index 36f6cf3..0000000 --- a/geom_bottleneck/tests/data/test_127_B +++ /dev/null @@ -1,3 +0,0 @@ -0 1 -8 11 -2 3 diff --git a/geom_bottleneck/tests/data/test_128_A b/geom_bottleneck/tests/data/test_128_A deleted file mode 100644 index 9e2c50e..0000000 --- a/geom_bottleneck/tests/data/test_128_A +++ /dev/null @@ -1,3 +0,0 @@ -9 17 -0 4 -0 3 diff --git a/geom_bottleneck/tests/data/test_128_B b/geom_bottleneck/tests/data/test_128_B deleted file mode 100644 index 0fdae08..0000000 --- a/geom_bottleneck/tests/data/test_128_B +++ /dev/null @@ -1,3 +0,0 @@ -10 18 -7 10 -1 2 diff --git a/geom_bottleneck/tests/data/test_129_A b/geom_bottleneck/tests/data/test_129_A deleted file mode 100644 index dc289de..0000000 --- a/geom_bottleneck/tests/data/test_129_A +++ /dev/null @@ -1,3 +0,0 @@ -8 17 -5 10 -9 16 diff --git a/geom_bottleneck/tests/data/test_129_B b/geom_bottleneck/tests/data/test_129_B deleted file mode 100644 index 3216111..0000000 --- a/geom_bottleneck/tests/data/test_129_B +++ /dev/null @@ -1,3 +0,0 @@ -10 19 -8 17 -2 11 diff --git a/geom_bottleneck/tests/data/test_130_A b/geom_bottleneck/tests/data/test_130_A deleted file mode 100644 index db70054..0000000 --- a/geom_bottleneck/tests/data/test_130_A +++ /dev/null @@ -1,3 +0,0 @@ -10 11 -10 19 -4 6 diff --git a/geom_bottleneck/tests/data/test_130_B b/geom_bottleneck/tests/data/test_130_B deleted file mode 100644 index 80c5a30..0000000 --- a/geom_bottleneck/tests/data/test_130_B +++ /dev/null @@ -1,3 +0,0 @@ -4 14 -0 8 -3 9 diff --git a/geom_bottleneck/tests/data/test_131_A b/geom_bottleneck/tests/data/test_131_A deleted file mode 100644 index 720cdb3..0000000 --- a/geom_bottleneck/tests/data/test_131_A +++ /dev/null @@ -1,3 +0,0 @@ -9 15 -3 4 -2 5 diff --git a/geom_bottleneck/tests/data/test_131_B b/geom_bottleneck/tests/data/test_131_B deleted file mode 100644 index 55bb437..0000000 --- a/geom_bottleneck/tests/data/test_131_B +++ /dev/null @@ -1,3 +0,0 @@ -10 20 -10 15 -7 10 diff --git a/geom_bottleneck/tests/data/test_132_A b/geom_bottleneck/tests/data/test_132_A deleted file mode 100644 index dec8f13..0000000 --- a/geom_bottleneck/tests/data/test_132_A +++ /dev/null @@ -1,3 +0,0 @@ -6 16 -2 4 -10 11 diff --git a/geom_bottleneck/tests/data/test_132_B b/geom_bottleneck/tests/data/test_132_B deleted file mode 100644 index 8844484..0000000 --- a/geom_bottleneck/tests/data/test_132_B +++ /dev/null @@ -1,3 +0,0 @@ -6 8 -5 14 -3 4 diff --git a/geom_bottleneck/tests/data/test_133_A b/geom_bottleneck/tests/data/test_133_A deleted file mode 100644 index b46cb4f..0000000 --- a/geom_bottleneck/tests/data/test_133_A +++ /dev/null @@ -1,3 +0,0 @@ -4 10 -9 15 -1 7 diff --git a/geom_bottleneck/tests/data/test_133_B b/geom_bottleneck/tests/data/test_133_B deleted file mode 100644 index 7a5d26a..0000000 --- a/geom_bottleneck/tests/data/test_133_B +++ /dev/null @@ -1,3 +0,0 @@ -4 5 -3 6 -1 10 diff --git a/geom_bottleneck/tests/data/test_134_A b/geom_bottleneck/tests/data/test_134_A deleted file mode 100644 index 4abd1e5..0000000 --- a/geom_bottleneck/tests/data/test_134_A +++ /dev/null @@ -1,3 +0,0 @@ -1 4 -6 13 -10 15 diff --git a/geom_bottleneck/tests/data/test_134_B b/geom_bottleneck/tests/data/test_134_B deleted file mode 100644 index aed169c..0000000 --- a/geom_bottleneck/tests/data/test_134_B +++ /dev/null @@ -1,3 +0,0 @@ -8 17 -8 16 -7 12 diff --git a/geom_bottleneck/tests/data/test_135_A b/geom_bottleneck/tests/data/test_135_A deleted file mode 100644 index bbe9e95..0000000 --- a/geom_bottleneck/tests/data/test_135_A +++ /dev/null @@ -1,3 +0,0 @@ -7 15 -1 4 -2 6 diff --git a/geom_bottleneck/tests/data/test_135_B b/geom_bottleneck/tests/data/test_135_B deleted file mode 100644 index 3c84c03..0000000 --- a/geom_bottleneck/tests/data/test_135_B +++ /dev/null @@ -1,3 +0,0 @@ -6 10 -2 8 -1 7 diff --git a/geom_bottleneck/tests/data/test_136_A b/geom_bottleneck/tests/data/test_136_A deleted file mode 100644 index a68856e..0000000 --- a/geom_bottleneck/tests/data/test_136_A +++ /dev/null @@ -1,3 +0,0 @@ -0 1 -9 14 -7 11 diff --git a/geom_bottleneck/tests/data/test_136_B b/geom_bottleneck/tests/data/test_136_B deleted file mode 100644 index c03df54..0000000 --- a/geom_bottleneck/tests/data/test_136_B +++ /dev/null @@ -1,3 +0,0 @@ -4 6 -3 4 -8 12 diff --git a/geom_bottleneck/tests/data/test_137_A b/geom_bottleneck/tests/data/test_137_A deleted file mode 100644 index 179d357..0000000 --- a/geom_bottleneck/tests/data/test_137_A +++ /dev/null @@ -1,3 +0,0 @@ -5 6 -7 14 -5 9 diff --git a/geom_bottleneck/tests/data/test_137_B b/geom_bottleneck/tests/data/test_137_B deleted file mode 100644 index 42541ae..0000000 --- a/geom_bottleneck/tests/data/test_137_B +++ /dev/null @@ -1,3 +0,0 @@ -10 16 -1 3 -6 7 diff --git a/geom_bottleneck/tests/data/test_138_A b/geom_bottleneck/tests/data/test_138_A deleted file mode 100644 index 9c39dfb..0000000 --- a/geom_bottleneck/tests/data/test_138_A +++ /dev/null @@ -1,3 +0,0 @@ -0 4 -9 14 -10 20 diff --git a/geom_bottleneck/tests/data/test_138_B b/geom_bottleneck/tests/data/test_138_B deleted file mode 100644 index 826d759..0000000 --- a/geom_bottleneck/tests/data/test_138_B +++ /dev/null @@ -1,3 +0,0 @@ -8 13 -7 8 -10 18 diff --git a/geom_bottleneck/tests/data/test_139_A b/geom_bottleneck/tests/data/test_139_A deleted file mode 100644 index 7f74c9f..0000000 --- a/geom_bottleneck/tests/data/test_139_A +++ /dev/null @@ -1,3 +0,0 @@ -6 7 -9 14 -4 5 diff --git a/geom_bottleneck/tests/data/test_139_B b/geom_bottleneck/tests/data/test_139_B deleted file mode 100644 index ba4ab64..0000000 --- a/geom_bottleneck/tests/data/test_139_B +++ /dev/null @@ -1,3 +0,0 @@ -9 11 -7 11 -9 10 diff --git a/geom_bottleneck/tests/data/test_140_A b/geom_bottleneck/tests/data/test_140_A deleted file mode 100644 index fec44cc..0000000 --- a/geom_bottleneck/tests/data/test_140_A +++ /dev/null @@ -1,4 +0,0 @@ -9 11 -6 7 -4 12 -1 8 diff --git a/geom_bottleneck/tests/data/test_140_B b/geom_bottleneck/tests/data/test_140_B deleted file mode 100644 index af8aa1c..0000000 --- a/geom_bottleneck/tests/data/test_140_B +++ /dev/null @@ -1,4 +0,0 @@ -9 10 -1 2 -2 10 -2 8 diff --git a/geom_bottleneck/tests/data/test_141_A b/geom_bottleneck/tests/data/test_141_A deleted file mode 100644 index db65086..0000000 --- a/geom_bottleneck/tests/data/test_141_A +++ /dev/null @@ -1,4 +0,0 @@ -7 13 -2 12 -5 13 -6 8 diff --git a/geom_bottleneck/tests/data/test_141_B b/geom_bottleneck/tests/data/test_141_B deleted file mode 100644 index 022c192..0000000 --- a/geom_bottleneck/tests/data/test_141_B +++ /dev/null @@ -1,4 +0,0 @@ -5 10 -9 12 -10 18 -8 11 diff --git a/geom_bottleneck/tests/data/test_142_A b/geom_bottleneck/tests/data/test_142_A deleted file mode 100644 index 10bbe2d..0000000 --- a/geom_bottleneck/tests/data/test_142_A +++ /dev/null @@ -1,4 +0,0 @@ -6 15 -4 5 -6 9 -8 17 diff --git a/geom_bottleneck/tests/data/test_142_B b/geom_bottleneck/tests/data/test_142_B deleted file mode 100644 index 82b6b28..0000000 --- a/geom_bottleneck/tests/data/test_142_B +++ /dev/null @@ -1,4 +0,0 @@ -8 12 -8 11 -3 5 -8 17 diff --git a/geom_bottleneck/tests/data/test_143_A b/geom_bottleneck/tests/data/test_143_A deleted file mode 100644 index 1db8047..0000000 --- a/geom_bottleneck/tests/data/test_143_A +++ /dev/null @@ -1,4 +0,0 @@ -5 6 -0 2 -5 10 -6 10 diff --git a/geom_bottleneck/tests/data/test_143_B b/geom_bottleneck/tests/data/test_143_B deleted file mode 100644 index 5c5a6a7..0000000 --- a/geom_bottleneck/tests/data/test_143_B +++ /dev/null @@ -1,4 +0,0 @@ -8 14 -5 7 -1 11 -4 10 diff --git a/geom_bottleneck/tests/data/test_144_A b/geom_bottleneck/tests/data/test_144_A deleted file mode 100644 index 594f4c4..0000000 --- a/geom_bottleneck/tests/data/test_144_A +++ /dev/null @@ -1,4 +0,0 @@ -10 15 -6 13 -1 2 -1 6 diff --git a/geom_bottleneck/tests/data/test_144_B b/geom_bottleneck/tests/data/test_144_B deleted file mode 100644 index aa3cd6d..0000000 --- a/geom_bottleneck/tests/data/test_144_B +++ /dev/null @@ -1,4 +0,0 @@ -0 8 -10 13 -9 18 -8 11 diff --git a/geom_bottleneck/tests/data/test_145_A b/geom_bottleneck/tests/data/test_145_A deleted file mode 100644 index 41ea529..0000000 --- a/geom_bottleneck/tests/data/test_145_A +++ /dev/null @@ -1,4 +0,0 @@ -2 10 -3 11 -10 17 -3 8 diff --git a/geom_bottleneck/tests/data/test_145_B b/geom_bottleneck/tests/data/test_145_B deleted file mode 100644 index 5bcbaf0..0000000 --- a/geom_bottleneck/tests/data/test_145_B +++ /dev/null @@ -1,4 +0,0 @@ -6 13 -10 15 -7 15 -6 10 diff --git a/geom_bottleneck/tests/data/test_146_A b/geom_bottleneck/tests/data/test_146_A deleted file mode 100644 index 18c1b4a..0000000 --- a/geom_bottleneck/tests/data/test_146_A +++ /dev/null @@ -1,4 +0,0 @@ -3 5 -6 11 -1 8 -2 5 diff --git a/geom_bottleneck/tests/data/test_146_B b/geom_bottleneck/tests/data/test_146_B deleted file mode 100644 index 24e5821..0000000 --- a/geom_bottleneck/tests/data/test_146_B +++ /dev/null @@ -1,4 +0,0 @@ -5 12 -4 10 -5 11 -2 7 diff --git a/geom_bottleneck/tests/data/test_147_A b/geom_bottleneck/tests/data/test_147_A deleted file mode 100644 index bce747d..0000000 --- a/geom_bottleneck/tests/data/test_147_A +++ /dev/null @@ -1,4 +0,0 @@ -9 11 -1 2 -10 12 -10 15 diff --git a/geom_bottleneck/tests/data/test_147_B b/geom_bottleneck/tests/data/test_147_B deleted file mode 100644 index c545851..0000000 --- a/geom_bottleneck/tests/data/test_147_B +++ /dev/null @@ -1,4 +0,0 @@ -4 6 -7 14 -4 12 -7 10 diff --git a/geom_bottleneck/tests/data/test_148_A b/geom_bottleneck/tests/data/test_148_A deleted file mode 100644 index cd7482f..0000000 --- a/geom_bottleneck/tests/data/test_148_A +++ /dev/null @@ -1,4 +0,0 @@ -5 9 -0 7 -7 11 -7 13 diff --git a/geom_bottleneck/tests/data/test_148_B b/geom_bottleneck/tests/data/test_148_B deleted file mode 100644 index a761bd3..0000000 --- a/geom_bottleneck/tests/data/test_148_B +++ /dev/null @@ -1,4 +0,0 @@ -7 9 -2 8 -1 2 -4 11 diff --git a/geom_bottleneck/tests/data/test_149_A b/geom_bottleneck/tests/data/test_149_A deleted file mode 100644 index 81fff07..0000000 --- a/geom_bottleneck/tests/data/test_149_A +++ /dev/null @@ -1,4 +0,0 @@ -2 4 -1 9 -7 13 -4 14 diff --git a/geom_bottleneck/tests/data/test_149_B b/geom_bottleneck/tests/data/test_149_B deleted file mode 100644 index 1acd048..0000000 --- a/geom_bottleneck/tests/data/test_149_B +++ /dev/null @@ -1,4 +0,0 @@ -9 12 -0 6 -4 10 -0 4 diff --git a/geom_bottleneck/tests/data/test_150_A b/geom_bottleneck/tests/data/test_150_A deleted file mode 100644 index 8f4862d..0000000 --- a/geom_bottleneck/tests/data/test_150_A +++ /dev/null @@ -1,4 +0,0 @@ -9 11 -7 16 -0 1 -0 3 diff --git a/geom_bottleneck/tests/data/test_150_B b/geom_bottleneck/tests/data/test_150_B deleted file mode 100644 index d55101f..0000000 --- a/geom_bottleneck/tests/data/test_150_B +++ /dev/null @@ -1,4 +0,0 @@ -7 14 -4 5 -7 16 -8 14 diff --git a/geom_bottleneck/tests/data/test_151_A b/geom_bottleneck/tests/data/test_151_A deleted file mode 100644 index 1915b6a..0000000 --- a/geom_bottleneck/tests/data/test_151_A +++ /dev/null @@ -1,4 +0,0 @@ -3 13 -10 11 -7 14 -2 11 diff --git a/geom_bottleneck/tests/data/test_151_B b/geom_bottleneck/tests/data/test_151_B deleted file mode 100644 index 065a2c7..0000000 --- a/geom_bottleneck/tests/data/test_151_B +++ /dev/null @@ -1,4 +0,0 @@ -6 9 -10 15 -7 8 -7 12 diff --git a/geom_bottleneck/tests/data/test_152_A b/geom_bottleneck/tests/data/test_152_A deleted file mode 100644 index 43ed98e..0000000 --- a/geom_bottleneck/tests/data/test_152_A +++ /dev/null @@ -1,4 +0,0 @@ -10 11 -2 5 -2 5 -0 3 diff --git a/geom_bottleneck/tests/data/test_152_B b/geom_bottleneck/tests/data/test_152_B deleted file mode 100644 index 5e179b7..0000000 --- a/geom_bottleneck/tests/data/test_152_B +++ /dev/null @@ -1,4 +0,0 @@ -4 8 -5 12 -6 8 -3 5 diff --git a/geom_bottleneck/tests/data/test_153_A b/geom_bottleneck/tests/data/test_153_A deleted file mode 100644 index 16f5a34..0000000 --- a/geom_bottleneck/tests/data/test_153_A +++ /dev/null @@ -1,4 +0,0 @@ -0 9 -10 11 -10 16 -1 9 diff --git a/geom_bottleneck/tests/data/test_153_B b/geom_bottleneck/tests/data/test_153_B deleted file mode 100644 index a82ae69..0000000 --- a/geom_bottleneck/tests/data/test_153_B +++ /dev/null @@ -1,4 +0,0 @@ -0 3 -3 10 -6 14 -4 7 diff --git a/geom_bottleneck/tests/data/test_154_A b/geom_bottleneck/tests/data/test_154_A deleted file mode 100644 index 73246c1..0000000 --- a/geom_bottleneck/tests/data/test_154_A +++ /dev/null @@ -1,4 +0,0 @@ -2 5 -5 15 -2 5 -3 7 diff --git a/geom_bottleneck/tests/data/test_154_B b/geom_bottleneck/tests/data/test_154_B deleted file mode 100644 index 6650b45..0000000 --- a/geom_bottleneck/tests/data/test_154_B +++ /dev/null @@ -1,4 +0,0 @@ -3 4 -9 16 -5 12 -1 6 diff --git a/geom_bottleneck/tests/data/test_155_A b/geom_bottleneck/tests/data/test_155_A deleted file mode 100644 index 9ce2859..0000000 --- a/geom_bottleneck/tests/data/test_155_A +++ /dev/null @@ -1,4 +0,0 @@ -10 14 -7 10 -9 10 -4 12 diff --git a/geom_bottleneck/tests/data/test_155_B b/geom_bottleneck/tests/data/test_155_B deleted file mode 100644 index c852368..0000000 --- a/geom_bottleneck/tests/data/test_155_B +++ /dev/null @@ -1,4 +0,0 @@ -6 10 -2 8 -4 8 -1 11 diff --git a/geom_bottleneck/tests/data/test_156_A b/geom_bottleneck/tests/data/test_156_A deleted file mode 100644 index e79fcd1..0000000 --- a/geom_bottleneck/tests/data/test_156_A +++ /dev/null @@ -1,4 +0,0 @@ -2 4 -6 12 -1 9 -4 14 diff --git a/geom_bottleneck/tests/data/test_156_B b/geom_bottleneck/tests/data/test_156_B deleted file mode 100644 index 05cd916..0000000 --- a/geom_bottleneck/tests/data/test_156_B +++ /dev/null @@ -1,4 +0,0 @@ -2 12 -7 12 -7 11 -2 4 diff --git a/geom_bottleneck/tests/data/test_157_A b/geom_bottleneck/tests/data/test_157_A deleted file mode 100644 index 257f007..0000000 --- a/geom_bottleneck/tests/data/test_157_A +++ /dev/null @@ -1,4 +0,0 @@ -8 17 -7 9 -10 16 -1 9 diff --git a/geom_bottleneck/tests/data/test_157_B b/geom_bottleneck/tests/data/test_157_B deleted file mode 100644 index da76a0c..0000000 --- a/geom_bottleneck/tests/data/test_157_B +++ /dev/null @@ -1,4 +0,0 @@ -9 11 -3 6 -0 3 -2 3 diff --git a/geom_bottleneck/tests/data/test_158_A b/geom_bottleneck/tests/data/test_158_A deleted file mode 100644 index ec64dab..0000000 --- a/geom_bottleneck/tests/data/test_158_A +++ /dev/null @@ -1,4 +0,0 @@ -2 4 -9 15 -8 16 -8 11 diff --git a/geom_bottleneck/tests/data/test_158_B b/geom_bottleneck/tests/data/test_158_B deleted file mode 100644 index 407c843..0000000 --- a/geom_bottleneck/tests/data/test_158_B +++ /dev/null @@ -1,4 +0,0 @@ -10 17 -10 15 -1 8 -10 17 diff --git a/geom_bottleneck/tests/data/test_159_A b/geom_bottleneck/tests/data/test_159_A deleted file mode 100644 index bbf8d13..0000000 --- a/geom_bottleneck/tests/data/test_159_A +++ /dev/null @@ -1,4 +0,0 @@ -9 13 -5 6 -3 6 -5 7 diff --git a/geom_bottleneck/tests/data/test_159_B b/geom_bottleneck/tests/data/test_159_B deleted file mode 100644 index fbe6d45..0000000 --- a/geom_bottleneck/tests/data/test_159_B +++ /dev/null @@ -1,4 +0,0 @@ -2 5 -4 5 -9 14 -10 11 diff --git a/geom_bottleneck/tests/data/test_160_A b/geom_bottleneck/tests/data/test_160_A deleted file mode 100644 index c712c5a..0000000 --- a/geom_bottleneck/tests/data/test_160_A +++ /dev/null @@ -1,5 +0,0 @@ -3 10 -1 10 -5 15 -0 9 -8 9 diff --git a/geom_bottleneck/tests/data/test_160_B b/geom_bottleneck/tests/data/test_160_B deleted file mode 100644 index 90edf6f..0000000 --- a/geom_bottleneck/tests/data/test_160_B +++ /dev/null @@ -1,5 +0,0 @@ -3 11 -0 8 -0 3 -4 7 -1 11 diff --git a/geom_bottleneck/tests/data/test_161_A b/geom_bottleneck/tests/data/test_161_A deleted file mode 100644 index 4cbae18..0000000 --- a/geom_bottleneck/tests/data/test_161_A +++ /dev/null @@ -1,5 +0,0 @@ -9 11 -8 10 -3 6 -4 14 -5 10 diff --git a/geom_bottleneck/tests/data/test_161_B b/geom_bottleneck/tests/data/test_161_B deleted file mode 100644 index e166afb..0000000 --- a/geom_bottleneck/tests/data/test_161_B +++ /dev/null @@ -1,5 +0,0 @@ -0 3 -8 14 -8 13 -0 2 -1 2 diff --git a/geom_bottleneck/tests/data/test_162_A b/geom_bottleneck/tests/data/test_162_A deleted file mode 100644 index e16e9a3..0000000 --- a/geom_bottleneck/tests/data/test_162_A +++ /dev/null @@ -1,5 +0,0 @@ -4 5 -7 17 -4 8 -10 16 -4 7 diff --git a/geom_bottleneck/tests/data/test_162_B b/geom_bottleneck/tests/data/test_162_B deleted file mode 100644 index 78ab6a3..0000000 --- a/geom_bottleneck/tests/data/test_162_B +++ /dev/null @@ -1,5 +0,0 @@ -6 14 -9 10 -1 9 -7 17 -7 8 diff --git a/geom_bottleneck/tests/data/test_163_A b/geom_bottleneck/tests/data/test_163_A deleted file mode 100644 index 6836e59..0000000 --- a/geom_bottleneck/tests/data/test_163_A +++ /dev/null @@ -1,5 +0,0 @@ -6 12 -6 11 -7 15 -9 11 -1 6 diff --git a/geom_bottleneck/tests/data/test_163_B b/geom_bottleneck/tests/data/test_163_B deleted file mode 100644 index 9d9e6e2..0000000 --- a/geom_bottleneck/tests/data/test_163_B +++ /dev/null @@ -1,5 +0,0 @@ -0 6 -1 11 -2 3 -7 14 -7 10 diff --git a/geom_bottleneck/tests/data/test_164_A b/geom_bottleneck/tests/data/test_164_A deleted file mode 100644 index a4187bd..0000000 --- a/geom_bottleneck/tests/data/test_164_A +++ /dev/null @@ -1,5 +0,0 @@ -0 2 -6 14 -7 16 -9 10 -2 6 diff --git a/geom_bottleneck/tests/data/test_164_B b/geom_bottleneck/tests/data/test_164_B deleted file mode 100644 index 8597409..0000000 --- a/geom_bottleneck/tests/data/test_164_B +++ /dev/null @@ -1,5 +0,0 @@ -2 10 -5 13 -4 13 -4 6 -8 16 diff --git a/geom_bottleneck/tests/data/test_165_A b/geom_bottleneck/tests/data/test_165_A deleted file mode 100644 index 15b9f15..0000000 --- a/geom_bottleneck/tests/data/test_165_A +++ /dev/null @@ -1,5 +0,0 @@ -1 9 -6 15 -6 7 -10 18 -6 7 diff --git a/geom_bottleneck/tests/data/test_165_B b/geom_bottleneck/tests/data/test_165_B deleted file mode 100644 index 8056eab..0000000 --- a/geom_bottleneck/tests/data/test_165_B +++ /dev/null @@ -1,5 +0,0 @@ -8 15 -3 13 -8 17 -1 9 -9 18 diff --git a/geom_bottleneck/tests/data/test_166_A b/geom_bottleneck/tests/data/test_166_A deleted file mode 100644 index 8257649..0000000 --- a/geom_bottleneck/tests/data/test_166_A +++ /dev/null @@ -1,5 +0,0 @@ -2 10 -4 12 -0 4 -10 18 -3 11 diff --git a/geom_bottleneck/tests/data/test_166_B b/geom_bottleneck/tests/data/test_166_B deleted file mode 100644 index 02499eb..0000000 --- a/geom_bottleneck/tests/data/test_166_B +++ /dev/null @@ -1,5 +0,0 @@ -0 6 -6 16 -3 11 -10 19 -5 15 diff --git a/geom_bottleneck/tests/data/test_167_A b/geom_bottleneck/tests/data/test_167_A deleted file mode 100644 index 416f645..0000000 --- a/geom_bottleneck/tests/data/test_167_A +++ /dev/null @@ -1,5 +0,0 @@ -4 7 -0 5 -1 9 -7 8 -4 10 diff --git a/geom_bottleneck/tests/data/test_167_B b/geom_bottleneck/tests/data/test_167_B deleted file mode 100644 index 2ab78e5..0000000 --- a/geom_bottleneck/tests/data/test_167_B +++ /dev/null @@ -1,5 +0,0 @@ -3 13 -3 13 -4 12 -4 13 -3 10 diff --git a/geom_bottleneck/tests/data/test_168_A b/geom_bottleneck/tests/data/test_168_A deleted file mode 100644 index 57f9e66..0000000 --- a/geom_bottleneck/tests/data/test_168_A +++ /dev/null @@ -1,5 +0,0 @@ -9 10 -3 8 -7 17 -10 11 -5 7 diff --git a/geom_bottleneck/tests/data/test_168_B b/geom_bottleneck/tests/data/test_168_B deleted file mode 100644 index 6d5d9c5..0000000 --- a/geom_bottleneck/tests/data/test_168_B +++ /dev/null @@ -1,5 +0,0 @@ -10 18 -1 9 -4 9 -4 14 -8 14 diff --git a/geom_bottleneck/tests/data/test_169_A b/geom_bottleneck/tests/data/test_169_A deleted file mode 100644 index 7db2396..0000000 --- a/geom_bottleneck/tests/data/test_169_A +++ /dev/null @@ -1,5 +0,0 @@ -9 12 -10 14 -10 17 -5 6 -4 5 diff --git a/geom_bottleneck/tests/data/test_169_B b/geom_bottleneck/tests/data/test_169_B deleted file mode 100644 index 58d7cec..0000000 --- a/geom_bottleneck/tests/data/test_169_B +++ /dev/null @@ -1,5 +0,0 @@ -0 2 -9 10 -4 11 -10 13 -2 5 diff --git a/geom_bottleneck/tests/data/test_170_A b/geom_bottleneck/tests/data/test_170_A deleted file mode 100644 index 7d30592..0000000 --- a/geom_bottleneck/tests/data/test_170_A +++ /dev/null @@ -1,5 +0,0 @@ -5 11 -8 14 -6 13 -1 11 -6 15 diff --git a/geom_bottleneck/tests/data/test_170_B b/geom_bottleneck/tests/data/test_170_B deleted file mode 100644 index 86d8ccc..0000000 --- a/geom_bottleneck/tests/data/test_170_B +++ /dev/null @@ -1,5 +0,0 @@ -1 3 -1 3 -4 7 -7 15 -5 13 diff --git a/geom_bottleneck/tests/data/test_171_A b/geom_bottleneck/tests/data/test_171_A deleted file mode 100644 index 30ce17c..0000000 --- a/geom_bottleneck/tests/data/test_171_A +++ /dev/null @@ -1,5 +0,0 @@ -0 7 -3 5 -4 14 -8 14 -3 12 diff --git a/geom_bottleneck/tests/data/test_171_B b/geom_bottleneck/tests/data/test_171_B deleted file mode 100644 index 487dcb5..0000000 --- a/geom_bottleneck/tests/data/test_171_B +++ /dev/null @@ -1,5 +0,0 @@ -7 13 -3 7 -0 5 -4 14 -5 12 diff --git a/geom_bottleneck/tests/data/test_172_A b/geom_bottleneck/tests/data/test_172_A deleted file mode 100644 index 69232cf..0000000 --- a/geom_bottleneck/tests/data/test_172_A +++ /dev/null @@ -1,5 +0,0 @@ -3 4 -7 10 -8 14 -9 11 -2 12 diff --git a/geom_bottleneck/tests/data/test_172_B b/geom_bottleneck/tests/data/test_172_B deleted file mode 100644 index 1ab31ab..0000000 --- a/geom_bottleneck/tests/data/test_172_B +++ /dev/null @@ -1,5 +0,0 @@ -7 9 -8 10 -9 13 -3 9 -3 7 diff --git a/geom_bottleneck/tests/data/test_173_A b/geom_bottleneck/tests/data/test_173_A deleted file mode 100644 index d88d368..0000000 --- a/geom_bottleneck/tests/data/test_173_A +++ /dev/null @@ -1,5 +0,0 @@ -5 8 -7 9 -7 11 -1 9 -5 6 diff --git a/geom_bottleneck/tests/data/test_173_B b/geom_bottleneck/tests/data/test_173_B deleted file mode 100644 index a331c9c..0000000 --- a/geom_bottleneck/tests/data/test_173_B +++ /dev/null @@ -1,5 +0,0 @@ -1 5 -6 9 -2 5 -1 4 -6 10 diff --git a/geom_bottleneck/tests/data/test_174_A b/geom_bottleneck/tests/data/test_174_A deleted file mode 100644 index a97b65b..0000000 --- a/geom_bottleneck/tests/data/test_174_A +++ /dev/null @@ -1,5 +0,0 @@ -4 14 -2 7 -9 19 -6 9 -0 2 diff --git a/geom_bottleneck/tests/data/test_174_B b/geom_bottleneck/tests/data/test_174_B deleted file mode 100644 index 98da402..0000000 --- a/geom_bottleneck/tests/data/test_174_B +++ /dev/null @@ -1,5 +0,0 @@ -4 11 -10 17 -7 8 -0 8 -3 9 diff --git a/geom_bottleneck/tests/data/test_175_A b/geom_bottleneck/tests/data/test_175_A deleted file mode 100644 index dc8bedd..0000000 --- a/geom_bottleneck/tests/data/test_175_A +++ /dev/null @@ -1,5 +0,0 @@ -8 11 -5 11 -7 13 -8 14 -4 12 diff --git a/geom_bottleneck/tests/data/test_175_B b/geom_bottleneck/tests/data/test_175_B deleted file mode 100644 index b5bd41f..0000000 --- a/geom_bottleneck/tests/data/test_175_B +++ /dev/null @@ -1,5 +0,0 @@ -4 12 -10 20 -10 20 -3 13 -9 16 diff --git a/geom_bottleneck/tests/data/test_176_A b/geom_bottleneck/tests/data/test_176_A deleted file mode 100644 index dff782a..0000000 --- a/geom_bottleneck/tests/data/test_176_A +++ /dev/null @@ -1,5 +0,0 @@ -10 13 -9 10 -8 15 -5 9 -5 13 diff --git a/geom_bottleneck/tests/data/test_176_B b/geom_bottleneck/tests/data/test_176_B deleted file mode 100644 index 8724366..0000000 --- a/geom_bottleneck/tests/data/test_176_B +++ /dev/null @@ -1,5 +0,0 @@ -2 8 -6 7 -0 9 -5 11 -4 12 diff --git a/geom_bottleneck/tests/data/test_177_A b/geom_bottleneck/tests/data/test_177_A deleted file mode 100644 index 556caf8..0000000 --- a/geom_bottleneck/tests/data/test_177_A +++ /dev/null @@ -1,5 +0,0 @@ -4 7 -2 3 -6 7 -2 4 -0 7 diff --git a/geom_bottleneck/tests/data/test_177_B b/geom_bottleneck/tests/data/test_177_B deleted file mode 100644 index 91583a5..0000000 --- a/geom_bottleneck/tests/data/test_177_B +++ /dev/null @@ -1,5 +0,0 @@ -8 17 -10 13 -4 6 -3 8 -0 5 diff --git a/geom_bottleneck/tests/data/test_178_A b/geom_bottleneck/tests/data/test_178_A deleted file mode 100644 index e223edb..0000000 --- a/geom_bottleneck/tests/data/test_178_A +++ /dev/null @@ -1,5 +0,0 @@ -2 3 -9 15 -8 10 -7 15 -5 11 diff --git a/geom_bottleneck/tests/data/test_178_B b/geom_bottleneck/tests/data/test_178_B deleted file mode 100644 index 2ab0b73..0000000 --- a/geom_bottleneck/tests/data/test_178_B +++ /dev/null @@ -1,5 +0,0 @@ -10 17 -2 9 -0 9 -8 12 -4 14 diff --git a/geom_bottleneck/tests/data/test_179_A b/geom_bottleneck/tests/data/test_179_A deleted file mode 100644 index 7b11730..0000000 --- a/geom_bottleneck/tests/data/test_179_A +++ /dev/null @@ -1,5 +0,0 @@ -3 13 -5 14 -7 14 -3 11 -10 15 diff --git a/geom_bottleneck/tests/data/test_179_B b/geom_bottleneck/tests/data/test_179_B deleted file mode 100644 index e160b9f..0000000 --- a/geom_bottleneck/tests/data/test_179_B +++ /dev/null @@ -1,5 +0,0 @@ -2 9 -2 10 -1 4 -3 6 -0 7 diff --git a/geom_bottleneck/tests/data/test_180_A b/geom_bottleneck/tests/data/test_180_A deleted file mode 100644 index a830fb1..0000000 --- a/geom_bottleneck/tests/data/test_180_A +++ /dev/null @@ -1,6 +0,0 @@ -9 19 -6 7 -9 17 -0 3 -7 8 -8 14 diff --git a/geom_bottleneck/tests/data/test_180_B b/geom_bottleneck/tests/data/test_180_B deleted file mode 100644 index 0ed2108..0000000 --- a/geom_bottleneck/tests/data/test_180_B +++ /dev/null @@ -1,6 +0,0 @@ -0 10 -1 11 -10 12 -5 6 -10 16 -5 14 diff --git a/geom_bottleneck/tests/data/test_181_A b/geom_bottleneck/tests/data/test_181_A deleted file mode 100644 index e29de9c..0000000 --- a/geom_bottleneck/tests/data/test_181_A +++ /dev/null @@ -1,6 +0,0 @@ -1 4 -1 2 -9 19 -3 6 -8 11 -4 8 diff --git a/geom_bottleneck/tests/data/test_181_B b/geom_bottleneck/tests/data/test_181_B deleted file mode 100644 index dacaa51..0000000 --- a/geom_bottleneck/tests/data/test_181_B +++ /dev/null @@ -1,6 +0,0 @@ -6 11 -8 15 -8 12 -10 11 -4 7 -5 10 diff --git a/geom_bottleneck/tests/data/test_182_A b/geom_bottleneck/tests/data/test_182_A deleted file mode 100644 index e545af0..0000000 --- a/geom_bottleneck/tests/data/test_182_A +++ /dev/null @@ -1,6 +0,0 @@ -8 10 -2 6 -6 14 -5 6 -6 7 -0 2 diff --git a/geom_bottleneck/tests/data/test_182_B b/geom_bottleneck/tests/data/test_182_B deleted file mode 100644 index ffee041..0000000 --- a/geom_bottleneck/tests/data/test_182_B +++ /dev/null @@ -1,6 +0,0 @@ -8 11 -6 8 -0 5 -7 13 -6 9 -10 19 diff --git a/geom_bottleneck/tests/data/test_183_A b/geom_bottleneck/tests/data/test_183_A deleted file mode 100644 index 0681b8d..0000000 --- a/geom_bottleneck/tests/data/test_183_A +++ /dev/null @@ -1,6 +0,0 @@ -8 13 -5 7 -1 5 -5 11 -3 7 -0 3 diff --git a/geom_bottleneck/tests/data/test_183_B b/geom_bottleneck/tests/data/test_183_B deleted file mode 100644 index da3af74..0000000 --- a/geom_bottleneck/tests/data/test_183_B +++ /dev/null @@ -1,6 +0,0 @@ -10 20 -6 11 -9 10 -1 4 -0 8 -7 14 diff --git a/geom_bottleneck/tests/data/test_184_A b/geom_bottleneck/tests/data/test_184_A deleted file mode 100644 index a252760..0000000 --- a/geom_bottleneck/tests/data/test_184_A +++ /dev/null @@ -1,6 +0,0 @@ -3 7 -1 10 -2 5 -0 5 -1 4 -2 3 diff --git a/geom_bottleneck/tests/data/test_184_B b/geom_bottleneck/tests/data/test_184_B deleted file mode 100644 index 788be62..0000000 --- a/geom_bottleneck/tests/data/test_184_B +++ /dev/null @@ -1,6 +0,0 @@ -8 14 -10 11 -3 5 -5 9 -6 8 -9 10 diff --git a/geom_bottleneck/tests/data/test_185_A b/geom_bottleneck/tests/data/test_185_A deleted file mode 100644 index 8922d7a..0000000 --- a/geom_bottleneck/tests/data/test_185_A +++ /dev/null @@ -1,6 +0,0 @@ -4 10 -8 10 -5 9 -9 13 -9 18 -8 14 diff --git a/geom_bottleneck/tests/data/test_185_B b/geom_bottleneck/tests/data/test_185_B deleted file mode 100644 index fc90091..0000000 --- a/geom_bottleneck/tests/data/test_185_B +++ /dev/null @@ -1,6 +0,0 @@ -0 10 -4 5 -3 10 -1 11 -4 9 -4 14 diff --git a/geom_bottleneck/tests/data/test_186_A b/geom_bottleneck/tests/data/test_186_A deleted file mode 100644 index 894dc49..0000000 --- a/geom_bottleneck/tests/data/test_186_A +++ /dev/null @@ -1,6 +0,0 @@ -1 8 -10 11 -3 10 -8 9 -3 13 -9 13 diff --git a/geom_bottleneck/tests/data/test_186_B b/geom_bottleneck/tests/data/test_186_B deleted file mode 100644 index c0b49c0..0000000 --- a/geom_bottleneck/tests/data/test_186_B +++ /dev/null @@ -1,6 +0,0 @@ -6 15 -8 9 -4 7 -0 10 -1 9 -1 2 diff --git a/geom_bottleneck/tests/data/test_187_A b/geom_bottleneck/tests/data/test_187_A deleted file mode 100644 index f2181af..0000000 --- a/geom_bottleneck/tests/data/test_187_A +++ /dev/null @@ -1,6 +0,0 @@ -9 11 -8 11 -10 11 -3 8 -7 17 -3 5 diff --git a/geom_bottleneck/tests/data/test_187_B b/geom_bottleneck/tests/data/test_187_B deleted file mode 100644 index ab13d0f..0000000 --- a/geom_bottleneck/tests/data/test_187_B +++ /dev/null @@ -1,6 +0,0 @@ -6 10 -10 19 -5 11 -6 13 -10 16 -10 20 diff --git a/geom_bottleneck/tests/data/test_188_A b/geom_bottleneck/tests/data/test_188_A deleted file mode 100644 index 8290582..0000000 --- a/geom_bottleneck/tests/data/test_188_A +++ /dev/null @@ -1,6 +0,0 @@ -4 9 -10 20 -0 4 -5 6 -8 9 -5 6 diff --git a/geom_bottleneck/tests/data/test_188_B b/geom_bottleneck/tests/data/test_188_B deleted file mode 100644 index 6acfc2e..0000000 --- a/geom_bottleneck/tests/data/test_188_B +++ /dev/null @@ -1,6 +0,0 @@ -9 19 -6 11 -0 2 -5 12 -3 11 -7 11 diff --git a/geom_bottleneck/tests/data/test_189_A b/geom_bottleneck/tests/data/test_189_A deleted file mode 100644 index 468967c..0000000 --- a/geom_bottleneck/tests/data/test_189_A +++ /dev/null @@ -1,6 +0,0 @@ -8 11 -4 8 -6 7 -9 15 -10 11 -2 3 diff --git a/geom_bottleneck/tests/data/test_189_B b/geom_bottleneck/tests/data/test_189_B deleted file mode 100644 index 299edf6..0000000 --- a/geom_bottleneck/tests/data/test_189_B +++ /dev/null @@ -1,6 +0,0 @@ -6 10 -2 6 -2 9 -1 3 -7 10 -8 15 diff --git a/geom_bottleneck/tests/data/test_190_A b/geom_bottleneck/tests/data/test_190_A deleted file mode 100644 index 01b3e3c..0000000 --- a/geom_bottleneck/tests/data/test_190_A +++ /dev/null @@ -1,6 +0,0 @@ -8 17 -9 10 -1 3 -9 16 -7 10 -8 14 diff --git a/geom_bottleneck/tests/data/test_190_B b/geom_bottleneck/tests/data/test_190_B deleted file mode 100644 index 26d2d2a..0000000 --- a/geom_bottleneck/tests/data/test_190_B +++ /dev/null @@ -1,6 +0,0 @@ -8 9 -10 15 -10 12 -8 14 -4 5 -4 10 diff --git a/geom_bottleneck/tests/data/test_191_A b/geom_bottleneck/tests/data/test_191_A deleted file mode 100644 index e89e4b8..0000000 --- a/geom_bottleneck/tests/data/test_191_A +++ /dev/null @@ -1,6 +0,0 @@ -10 15 -2 7 -9 16 -6 14 -6 12 -4 13 diff --git a/geom_bottleneck/tests/data/test_191_B b/geom_bottleneck/tests/data/test_191_B deleted file mode 100644 index 80022bc..0000000 --- a/geom_bottleneck/tests/data/test_191_B +++ /dev/null @@ -1,6 +0,0 @@ -8 18 -5 11 -2 7 -7 16 -6 9 -7 17 diff --git a/geom_bottleneck/tests/data/test_192_A b/geom_bottleneck/tests/data/test_192_A deleted file mode 100644 index 8e0e64f..0000000 --- a/geom_bottleneck/tests/data/test_192_A +++ /dev/null @@ -1,6 +0,0 @@ -9 15 -1 9 -2 11 -1 8 -9 11 -7 8 diff --git a/geom_bottleneck/tests/data/test_192_B b/geom_bottleneck/tests/data/test_192_B deleted file mode 100644 index dcfe162..0000000 --- a/geom_bottleneck/tests/data/test_192_B +++ /dev/null @@ -1,6 +0,0 @@ -8 16 -10 17 -8 9 -2 9 -2 12 -7 11 diff --git a/geom_bottleneck/tests/data/test_193_A b/geom_bottleneck/tests/data/test_193_A deleted file mode 100644 index 6c2bcc8..0000000 --- a/geom_bottleneck/tests/data/test_193_A +++ /dev/null @@ -1,6 +0,0 @@ -5 10 -4 13 -6 7 -7 8 -7 8 -6 12 diff --git a/geom_bottleneck/tests/data/test_193_B b/geom_bottleneck/tests/data/test_193_B deleted file mode 100644 index fb271c9..0000000 --- a/geom_bottleneck/tests/data/test_193_B +++ /dev/null @@ -1,6 +0,0 @@ -7 12 -2 5 -9 18 -1 6 -7 16 -1 5 diff --git a/geom_bottleneck/tests/data/test_194_A b/geom_bottleneck/tests/data/test_194_A deleted file mode 100644 index 2de1094..0000000 --- a/geom_bottleneck/tests/data/test_194_A +++ /dev/null @@ -1,6 +0,0 @@ -9 14 -7 12 -3 10 -1 9 -3 10 -0 1 diff --git a/geom_bottleneck/tests/data/test_194_B b/geom_bottleneck/tests/data/test_194_B deleted file mode 100644 index 5879993..0000000 --- a/geom_bottleneck/tests/data/test_194_B +++ /dev/null @@ -1,6 +0,0 @@ -6 15 -4 9 -3 7 -2 3 -0 2 -2 12 diff --git a/geom_bottleneck/tests/data/test_195_A b/geom_bottleneck/tests/data/test_195_A deleted file mode 100644 index d109838..0000000 --- a/geom_bottleneck/tests/data/test_195_A +++ /dev/null @@ -1,6 +0,0 @@ -0 9 -7 8 -9 15 -2 6 -3 8 -9 15 diff --git a/geom_bottleneck/tests/data/test_195_B b/geom_bottleneck/tests/data/test_195_B deleted file mode 100644 index 6c66513..0000000 --- a/geom_bottleneck/tests/data/test_195_B +++ /dev/null @@ -1,6 +0,0 @@ -3 9 -2 3 -3 10 -7 16 -4 7 -1 6 diff --git a/geom_bottleneck/tests/data/test_196_A b/geom_bottleneck/tests/data/test_196_A deleted file mode 100644 index 4094acd..0000000 --- a/geom_bottleneck/tests/data/test_196_A +++ /dev/null @@ -1,6 +0,0 @@ -6 8 -8 12 -0 4 -3 11 -4 14 -9 14 diff --git a/geom_bottleneck/tests/data/test_196_B b/geom_bottleneck/tests/data/test_196_B deleted file mode 100644 index e5ed3ad..0000000 --- a/geom_bottleneck/tests/data/test_196_B +++ /dev/null @@ -1,6 +0,0 @@ -4 10 -2 3 -7 8 -2 8 -5 12 -9 10 diff --git a/geom_bottleneck/tests/data/test_197_A b/geom_bottleneck/tests/data/test_197_A deleted file mode 100644 index 771897b..0000000 --- a/geom_bottleneck/tests/data/test_197_A +++ /dev/null @@ -1,6 +0,0 @@ -4 10 -9 11 -0 6 -4 8 -9 14 -9 14 diff --git a/geom_bottleneck/tests/data/test_197_B b/geom_bottleneck/tests/data/test_197_B deleted file mode 100644 index 1cfe6aa..0000000 --- a/geom_bottleneck/tests/data/test_197_B +++ /dev/null @@ -1,6 +0,0 @@ -7 13 -6 7 -5 11 -3 13 -6 14 -10 15 diff --git a/geom_bottleneck/tests/data/test_198_A b/geom_bottleneck/tests/data/test_198_A deleted file mode 100644 index 6966ac4..0000000 --- a/geom_bottleneck/tests/data/test_198_A +++ /dev/null @@ -1,6 +0,0 @@ -10 17 -3 7 -7 8 -9 15 -0 3 -10 20 diff --git a/geom_bottleneck/tests/data/test_198_B b/geom_bottleneck/tests/data/test_198_B deleted file mode 100644 index 6e9d9d4..0000000 --- a/geom_bottleneck/tests/data/test_198_B +++ /dev/null @@ -1,6 +0,0 @@ -3 11 -4 7 -6 15 -8 15 -7 10 -2 10 diff --git a/geom_bottleneck/tests/data/test_199_A b/geom_bottleneck/tests/data/test_199_A deleted file mode 100644 index 8556563..0000000 --- a/geom_bottleneck/tests/data/test_199_A +++ /dev/null @@ -1,6 +0,0 @@ -7 17 -3 13 -10 15 -9 17 -7 8 -5 14 diff --git a/geom_bottleneck/tests/data/test_199_B b/geom_bottleneck/tests/data/test_199_B deleted file mode 100644 index a43e0df..0000000 --- a/geom_bottleneck/tests/data/test_199_B +++ /dev/null @@ -1,6 +0,0 @@ -7 17 -7 17 -9 14 -4 13 -1 8 -1 10 diff --git a/geom_bottleneck/tests/data/test_200_A b/geom_bottleneck/tests/data/test_200_A deleted file mode 100644 index b0a7fbd..0000000 --- a/geom_bottleneck/tests/data/test_200_A +++ /dev/null @@ -1,7 +0,0 @@ -9 10 -0 10 -7 8 -1 6 -8 14 -0 3 -6 9 diff --git a/geom_bottleneck/tests/data/test_200_B b/geom_bottleneck/tests/data/test_200_B deleted file mode 100644 index fcbab9a..0000000 --- a/geom_bottleneck/tests/data/test_200_B +++ /dev/null @@ -1,7 +0,0 @@ -2 7 -0 7 -2 4 -8 12 -7 12 -10 16 -5 6 diff --git a/geom_bottleneck/tests/data/test_201_A b/geom_bottleneck/tests/data/test_201_A deleted file mode 100644 index 07d880d..0000000 --- a/geom_bottleneck/tests/data/test_201_A +++ /dev/null @@ -1,7 +0,0 @@ -4 5 -1 7 -0 8 -4 5 -9 14 -8 9 -2 10 diff --git a/geom_bottleneck/tests/data/test_201_B b/geom_bottleneck/tests/data/test_201_B deleted file mode 100644 index 70b22f4..0000000 --- a/geom_bottleneck/tests/data/test_201_B +++ /dev/null @@ -1,7 +0,0 @@ -5 6 -6 16 -1 2 -2 3 -4 12 -6 15 -8 18 diff --git a/geom_bottleneck/tests/data/test_202_A b/geom_bottleneck/tests/data/test_202_A deleted file mode 100644 index b8fe1b9..0000000 --- a/geom_bottleneck/tests/data/test_202_A +++ /dev/null @@ -1,7 +0,0 @@ -0 6 -4 14 -9 10 -9 18 -5 12 -5 12 -1 7 diff --git a/geom_bottleneck/tests/data/test_202_B b/geom_bottleneck/tests/data/test_202_B deleted file mode 100644 index ee6e2e0..0000000 --- a/geom_bottleneck/tests/data/test_202_B +++ /dev/null @@ -1,7 +0,0 @@ -5 6 -7 17 -1 6 -3 11 -7 15 -10 20 -3 4 diff --git a/geom_bottleneck/tests/data/test_203_A b/geom_bottleneck/tests/data/test_203_A deleted file mode 100644 index 71a1737..0000000 --- a/geom_bottleneck/tests/data/test_203_A +++ /dev/null @@ -1,7 +0,0 @@ -4 9 -10 20 -5 9 -0 9 -0 8 -5 9 -0 10 diff --git a/geom_bottleneck/tests/data/test_203_B b/geom_bottleneck/tests/data/test_203_B deleted file mode 100644 index d217cda..0000000 --- a/geom_bottleneck/tests/data/test_203_B +++ /dev/null @@ -1,7 +0,0 @@ -3 12 -1 9 -9 17 -7 14 -6 10 -10 20 -7 12 diff --git a/geom_bottleneck/tests/data/test_204_A b/geom_bottleneck/tests/data/test_204_A deleted file mode 100644 index 011da68..0000000 --- a/geom_bottleneck/tests/data/test_204_A +++ /dev/null @@ -1,7 +0,0 @@ -9 14 -2 3 -9 14 -6 7 -2 3 -6 13 -10 11 diff --git a/geom_bottleneck/tests/data/test_204_B b/geom_bottleneck/tests/data/test_204_B deleted file mode 100644 index c5d6236..0000000 --- a/geom_bottleneck/tests/data/test_204_B +++ /dev/null @@ -1,7 +0,0 @@ -9 10 -0 4 -4 7 -8 15 -8 9 -7 10 -10 11 diff --git a/geom_bottleneck/tests/data/test_205_A b/geom_bottleneck/tests/data/test_205_A deleted file mode 100644 index d082be1..0000000 --- a/geom_bottleneck/tests/data/test_205_A +++ /dev/null @@ -1,7 +0,0 @@ -8 17 -9 12 -2 11 -0 8 -10 11 -0 7 -8 18 diff --git a/geom_bottleneck/tests/data/test_205_B b/geom_bottleneck/tests/data/test_205_B deleted file mode 100644 index 30a242c..0000000 --- a/geom_bottleneck/tests/data/test_205_B +++ /dev/null @@ -1,7 +0,0 @@ -10 17 -9 18 -6 11 -6 7 -10 17 -3 13 -8 17 diff --git a/geom_bottleneck/tests/data/test_206_A b/geom_bottleneck/tests/data/test_206_A deleted file mode 100644 index 15ee45b..0000000 --- a/geom_bottleneck/tests/data/test_206_A +++ /dev/null @@ -1,7 +0,0 @@ -5 7 -8 17 -4 7 -7 17 -9 11 -0 8 -9 10 diff --git a/geom_bottleneck/tests/data/test_206_B b/geom_bottleneck/tests/data/test_206_B deleted file mode 100644 index f8c89ef..0000000 --- a/geom_bottleneck/tests/data/test_206_B +++ /dev/null @@ -1,7 +0,0 @@ -5 15 -9 17 -10 13 -6 13 -0 6 -10 16 -8 15 diff --git a/geom_bottleneck/tests/data/test_207_A b/geom_bottleneck/tests/data/test_207_A deleted file mode 100644 index 2015b9e..0000000 --- a/geom_bottleneck/tests/data/test_207_A +++ /dev/null @@ -1,7 +0,0 @@ -4 9 -9 17 -9 10 -9 15 -2 3 -8 13 -9 13 diff --git a/geom_bottleneck/tests/data/test_207_B b/geom_bottleneck/tests/data/test_207_B deleted file mode 100644 index 036a8ca..0000000 --- a/geom_bottleneck/tests/data/test_207_B +++ /dev/null @@ -1,7 +0,0 @@ -10 18 -1 3 -10 15 -5 14 -7 15 -0 1 -10 13 diff --git a/geom_bottleneck/tests/data/test_208_A b/geom_bottleneck/tests/data/test_208_A deleted file mode 100644 index a1e6af4..0000000 --- a/geom_bottleneck/tests/data/test_208_A +++ /dev/null @@ -1,7 +0,0 @@ -6 14 -2 7 -6 16 -7 14 -8 13 -2 5 -5 9 diff --git a/geom_bottleneck/tests/data/test_208_B b/geom_bottleneck/tests/data/test_208_B deleted file mode 100644 index f21e91b..0000000 --- a/geom_bottleneck/tests/data/test_208_B +++ /dev/null @@ -1,7 +0,0 @@ -3 10 -8 16 -2 11 -10 18 -2 6 -3 7 -3 8 diff --git a/geom_bottleneck/tests/data/test_209_A b/geom_bottleneck/tests/data/test_209_A deleted file mode 100644 index 545aae9..0000000 --- a/geom_bottleneck/tests/data/test_209_A +++ /dev/null @@ -1,7 +0,0 @@ -10 18 -5 8 -4 7 -10 16 -4 10 -2 9 -1 6 diff --git a/geom_bottleneck/tests/data/test_209_B b/geom_bottleneck/tests/data/test_209_B deleted file mode 100644 index 2cf3171..0000000 --- a/geom_bottleneck/tests/data/test_209_B +++ /dev/null @@ -1,7 +0,0 @@ -10 11 -1 2 -0 6 -10 11 -9 11 -10 17 -1 2 diff --git a/geom_bottleneck/tests/data/test_210_A b/geom_bottleneck/tests/data/test_210_A deleted file mode 100644 index 799debc..0000000 --- a/geom_bottleneck/tests/data/test_210_A +++ /dev/null @@ -1,7 +0,0 @@ -1 3 -6 7 -10 11 -7 16 -4 5 -2 5 -10 18 diff --git a/geom_bottleneck/tests/data/test_210_B b/geom_bottleneck/tests/data/test_210_B deleted file mode 100644 index 7cb0519..0000000 --- a/geom_bottleneck/tests/data/test_210_B +++ /dev/null @@ -1,7 +0,0 @@ -3 7 -5 13 -6 11 -0 10 -10 18 -8 9 -1 4 diff --git a/geom_bottleneck/tests/data/test_211_A b/geom_bottleneck/tests/data/test_211_A deleted file mode 100644 index 6715acb..0000000 --- a/geom_bottleneck/tests/data/test_211_A +++ /dev/null @@ -1,7 +0,0 @@ -9 15 -1 5 -10 11 -2 6 -6 8 -2 9 -8 11 diff --git a/geom_bottleneck/tests/data/test_211_B b/geom_bottleneck/tests/data/test_211_B deleted file mode 100644 index 9c7890f..0000000 --- a/geom_bottleneck/tests/data/test_211_B +++ /dev/null @@ -1,7 +0,0 @@ -5 7 -3 9 -1 3 -1 2 -4 5 -4 7 -3 7 diff --git a/geom_bottleneck/tests/data/test_212_A b/geom_bottleneck/tests/data/test_212_A deleted file mode 100644 index e3d327a..0000000 --- a/geom_bottleneck/tests/data/test_212_A +++ /dev/null @@ -1,7 +0,0 @@ -3 6 -8 12 -7 15 -6 11 -9 16 -4 8 -7 12 diff --git a/geom_bottleneck/tests/data/test_212_B b/geom_bottleneck/tests/data/test_212_B deleted file mode 100644 index ee57410..0000000 --- a/geom_bottleneck/tests/data/test_212_B +++ /dev/null @@ -1,7 +0,0 @@ -9 17 -1 2 -10 17 -1 10 -5 8 -5 7 -7 10 diff --git a/geom_bottleneck/tests/data/test_213_A b/geom_bottleneck/tests/data/test_213_A deleted file mode 100644 index 4b904df..0000000 --- a/geom_bottleneck/tests/data/test_213_A +++ /dev/null @@ -1,7 +0,0 @@ -4 8 -0 2 -0 7 -0 4 -6 15 -8 14 -3 10 diff --git a/geom_bottleneck/tests/data/test_213_B b/geom_bottleneck/tests/data/test_213_B deleted file mode 100644 index f5188b4..0000000 --- a/geom_bottleneck/tests/data/test_213_B +++ /dev/null @@ -1,7 +0,0 @@ -8 9 -8 13 -9 10 -2 12 -4 7 -7 8 -3 12 diff --git a/geom_bottleneck/tests/data/test_214_A b/geom_bottleneck/tests/data/test_214_A deleted file mode 100644 index 3914579..0000000 --- a/geom_bottleneck/tests/data/test_214_A +++ /dev/null @@ -1,7 +0,0 @@ -4 10 -7 8 -8 15 -1 4 -6 13 -8 15 -8 9 diff --git a/geom_bottleneck/tests/data/test_214_B b/geom_bottleneck/tests/data/test_214_B deleted file mode 100644 index f75c54f..0000000 --- a/geom_bottleneck/tests/data/test_214_B +++ /dev/null @@ -1,7 +0,0 @@ -5 12 -2 12 -5 10 -1 8 -10 19 -0 6 -3 9 diff --git a/geom_bottleneck/tests/data/test_215_A b/geom_bottleneck/tests/data/test_215_A deleted file mode 100644 index a8d6070..0000000 --- a/geom_bottleneck/tests/data/test_215_A +++ /dev/null @@ -1,7 +0,0 @@ -3 4 -4 5 -3 9 -7 15 -9 12 -1 2 -4 12 diff --git a/geom_bottleneck/tests/data/test_215_B b/geom_bottleneck/tests/data/test_215_B deleted file mode 100644 index d956b59..0000000 --- a/geom_bottleneck/tests/data/test_215_B +++ /dev/null @@ -1,7 +0,0 @@ -4 13 -5 7 -2 6 -9 12 -0 6 -0 1 -6 12 diff --git a/geom_bottleneck/tests/data/test_216_A b/geom_bottleneck/tests/data/test_216_A deleted file mode 100644 index 67c5e86..0000000 --- a/geom_bottleneck/tests/data/test_216_A +++ /dev/null @@ -1,7 +0,0 @@ -10 13 -10 17 -5 10 -4 6 -9 12 -6 9 -2 6 diff --git a/geom_bottleneck/tests/data/test_216_B b/geom_bottleneck/tests/data/test_216_B deleted file mode 100644 index 802850d..0000000 --- a/geom_bottleneck/tests/data/test_216_B +++ /dev/null @@ -1,7 +0,0 @@ -3 9 -9 13 -1 2 -4 13 -1 8 -0 2 -1 2 diff --git a/geom_bottleneck/tests/data/test_217_A b/geom_bottleneck/tests/data/test_217_A deleted file mode 100644 index a37f46d..0000000 --- a/geom_bottleneck/tests/data/test_217_A +++ /dev/null @@ -1,7 +0,0 @@ -3 7 -1 4 -3 8 -1 2 -1 3 -8 9 -5 14 diff --git a/geom_bottleneck/tests/data/test_217_B b/geom_bottleneck/tests/data/test_217_B deleted file mode 100644 index 4cac64e..0000000 --- a/geom_bottleneck/tests/data/test_217_B +++ /dev/null @@ -1,7 +0,0 @@ -3 12 -9 10 -9 10 -5 14 -0 8 -5 8 -2 5 diff --git a/geom_bottleneck/tests/data/test_218_A b/geom_bottleneck/tests/data/test_218_A deleted file mode 100644 index 7ca83bc..0000000 --- a/geom_bottleneck/tests/data/test_218_A +++ /dev/null @@ -1,7 +0,0 @@ -7 11 -6 14 -9 19 -6 8 -2 7 -4 8 -2 8 diff --git a/geom_bottleneck/tests/data/test_218_B b/geom_bottleneck/tests/data/test_218_B deleted file mode 100644 index 7c188f2..0000000 --- a/geom_bottleneck/tests/data/test_218_B +++ /dev/null @@ -1,7 +0,0 @@ -2 4 -8 16 -3 13 -3 12 -1 11 -0 1 -5 7 diff --git a/geom_bottleneck/tests/data/test_219_A b/geom_bottleneck/tests/data/test_219_A deleted file mode 100644 index 275bc18..0000000 --- a/geom_bottleneck/tests/data/test_219_A +++ /dev/null @@ -1,7 +0,0 @@ -3 4 -8 10 -5 6 -3 7 -9 12 -5 6 -0 1 diff --git a/geom_bottleneck/tests/data/test_219_B b/geom_bottleneck/tests/data/test_219_B deleted file mode 100644 index be6ab2a..0000000 --- a/geom_bottleneck/tests/data/test_219_B +++ /dev/null @@ -1,7 +0,0 @@ -7 16 -1 2 -4 12 -9 17 -10 11 -9 14 -10 16 diff --git a/geom_bottleneck/tests/data/test_220_A b/geom_bottleneck/tests/data/test_220_A deleted file mode 100644 index 3b9ea09..0000000 --- a/geom_bottleneck/tests/data/test_220_A +++ /dev/null @@ -1,8 +0,0 @@ -8 18 -6 9 -7 12 -8 14 -7 8 -4 11 -9 18 -4 8 diff --git a/geom_bottleneck/tests/data/test_220_B b/geom_bottleneck/tests/data/test_220_B deleted file mode 100644 index 8e97d15..0000000 --- a/geom_bottleneck/tests/data/test_220_B +++ /dev/null @@ -1,8 +0,0 @@ -9 19 -5 9 -8 9 -2 10 -3 9 -2 5 -6 15 -9 14 diff --git a/geom_bottleneck/tests/data/test_221_A b/geom_bottleneck/tests/data/test_221_A deleted file mode 100644 index 2e229a8..0000000 --- a/geom_bottleneck/tests/data/test_221_A +++ /dev/null @@ -1,8 +0,0 @@ -9 17 -4 10 -3 5 -9 18 -3 10 -9 18 -5 12 -0 10 diff --git a/geom_bottleneck/tests/data/test_221_B b/geom_bottleneck/tests/data/test_221_B deleted file mode 100644 index e3c3c1b..0000000 --- a/geom_bottleneck/tests/data/test_221_B +++ /dev/null @@ -1,8 +0,0 @@ -1 3 -1 2 -2 6 -10 19 -4 14 -10 18 -4 9 -9 19 diff --git a/geom_bottleneck/tests/data/test_222_A b/geom_bottleneck/tests/data/test_222_A deleted file mode 100644 index fcb6c7f..0000000 --- a/geom_bottleneck/tests/data/test_222_A +++ /dev/null @@ -1,8 +0,0 @@ -9 13 -6 10 -10 17 -9 14 -7 16 -2 4 -5 11 -10 13 diff --git a/geom_bottleneck/tests/data/test_222_B b/geom_bottleneck/tests/data/test_222_B deleted file mode 100644 index 512f188..0000000 --- a/geom_bottleneck/tests/data/test_222_B +++ /dev/null @@ -1,8 +0,0 @@ -1 11 -0 1 -8 10 -0 6 -9 19 -3 4 -2 6 -9 10 diff --git a/geom_bottleneck/tests/data/test_223_A b/geom_bottleneck/tests/data/test_223_A deleted file mode 100644 index 6f6cef5..0000000 --- a/geom_bottleneck/tests/data/test_223_A +++ /dev/null @@ -1,8 +0,0 @@ -0 8 -2 6 -3 13 -9 16 -4 7 -4 14 -7 17 -6 7 diff --git a/geom_bottleneck/tests/data/test_223_B b/geom_bottleneck/tests/data/test_223_B deleted file mode 100644 index 07803f6..0000000 --- a/geom_bottleneck/tests/data/test_223_B +++ /dev/null @@ -1,8 +0,0 @@ -7 9 -3 10 -0 9 -0 1 -1 5 -2 8 -0 1 -10 18 diff --git a/geom_bottleneck/tests/data/test_224_A b/geom_bottleneck/tests/data/test_224_A deleted file mode 100644 index f33d061..0000000 --- a/geom_bottleneck/tests/data/test_224_A +++ /dev/null @@ -1,8 +0,0 @@ -5 12 -0 6 -5 11 -9 17 -9 10 -0 10 -0 4 -8 13 diff --git a/geom_bottleneck/tests/data/test_224_B b/geom_bottleneck/tests/data/test_224_B deleted file mode 100644 index 1b9ef36..0000000 --- a/geom_bottleneck/tests/data/test_224_B +++ /dev/null @@ -1,8 +0,0 @@ -8 14 -3 13 -3 4 -9 19 -8 16 -5 9 -4 14 -2 4 diff --git a/geom_bottleneck/tests/data/test_225_A b/geom_bottleneck/tests/data/test_225_A deleted file mode 100644 index cc0d576..0000000 --- a/geom_bottleneck/tests/data/test_225_A +++ /dev/null @@ -1,8 +0,0 @@ -0 1 -9 17 -3 12 -9 19 -8 15 -7 15 -6 10 -1 10 diff --git a/geom_bottleneck/tests/data/test_225_B b/geom_bottleneck/tests/data/test_225_B deleted file mode 100644 index b810b48..0000000 --- a/geom_bottleneck/tests/data/test_225_B +++ /dev/null @@ -1,8 +0,0 @@ -8 11 -4 8 -8 14 -3 8 -2 10 -8 15 -5 14 -6 16 diff --git a/geom_bottleneck/tests/data/test_226_A b/geom_bottleneck/tests/data/test_226_A deleted file mode 100644 index e39728a..0000000 --- a/geom_bottleneck/tests/data/test_226_A +++ /dev/null @@ -1,8 +0,0 @@ -10 12 -3 5 -10 13 -6 8 -8 14 -8 15 -8 17 -3 8 diff --git a/geom_bottleneck/tests/data/test_226_B b/geom_bottleneck/tests/data/test_226_B deleted file mode 100644 index 601abce..0000000 --- a/geom_bottleneck/tests/data/test_226_B +++ /dev/null @@ -1,8 +0,0 @@ -3 4 -9 19 -3 7 -9 10 -1 4 -7 12 -0 1 -4 13 diff --git a/geom_bottleneck/tests/data/test_227_A b/geom_bottleneck/tests/data/test_227_A deleted file mode 100644 index e98b204..0000000 --- a/geom_bottleneck/tests/data/test_227_A +++ /dev/null @@ -1,8 +0,0 @@ -10 11 -8 9 -2 8 -5 14 -6 16 -3 9 -7 8 -0 7 diff --git a/geom_bottleneck/tests/data/test_227_B b/geom_bottleneck/tests/data/test_227_B deleted file mode 100644 index 3d5a25e..0000000 --- a/geom_bottleneck/tests/data/test_227_B +++ /dev/null @@ -1,8 +0,0 @@ -7 8 -9 14 -2 7 -7 17 -5 13 -4 6 -3 4 -6 16 diff --git a/geom_bottleneck/tests/data/test_228_A b/geom_bottleneck/tests/data/test_228_A deleted file mode 100644 index a3edeae..0000000 --- a/geom_bottleneck/tests/data/test_228_A +++ /dev/null @@ -1,8 +0,0 @@ -9 10 -1 6 -8 10 -0 9 -0 2 -7 13 -10 20 -1 10 diff --git a/geom_bottleneck/tests/data/test_228_B b/geom_bottleneck/tests/data/test_228_B deleted file mode 100644 index 64f78ac..0000000 --- a/geom_bottleneck/tests/data/test_228_B +++ /dev/null @@ -1,8 +0,0 @@ -4 6 -9 12 -5 11 -9 16 -8 9 -7 16 -4 10 -3 4 diff --git a/geom_bottleneck/tests/data/test_229_A b/geom_bottleneck/tests/data/test_229_A deleted file mode 100644 index c832a04..0000000 --- a/geom_bottleneck/tests/data/test_229_A +++ /dev/null @@ -1,8 +0,0 @@ -9 12 -1 10 -6 14 -4 9 -7 11 -3 12 -6 8 -4 12 diff --git a/geom_bottleneck/tests/data/test_229_B b/geom_bottleneck/tests/data/test_229_B deleted file mode 100644 index 0f232d0..0000000 --- a/geom_bottleneck/tests/data/test_229_B +++ /dev/null @@ -1,8 +0,0 @@ -7 13 -2 11 -6 10 -6 10 -7 15 -10 14 -10 13 -10 14 diff --git a/geom_bottleneck/tests/data/test_230_A b/geom_bottleneck/tests/data/test_230_A deleted file mode 100644 index 11d75a8..0000000 --- a/geom_bottleneck/tests/data/test_230_A +++ /dev/null @@ -1,8 +0,0 @@ -9 16 -3 5 -3 11 -0 7 -0 2 -10 16 -4 6 -8 16 diff --git a/geom_bottleneck/tests/data/test_230_B b/geom_bottleneck/tests/data/test_230_B deleted file mode 100644 index f30b9d0..0000000 --- a/geom_bottleneck/tests/data/test_230_B +++ /dev/null @@ -1,8 +0,0 @@ -4 11 -7 14 -8 17 -6 13 -0 1 -6 10 -8 10 -1 6 diff --git a/geom_bottleneck/tests/data/test_231_A b/geom_bottleneck/tests/data/test_231_A deleted file mode 100644 index 8d21ce3..0000000 --- a/geom_bottleneck/tests/data/test_231_A +++ /dev/null @@ -1,8 +0,0 @@ -2 9 -1 11 -10 20 -7 16 -7 9 -0 7 -6 7 -6 7 diff --git a/geom_bottleneck/tests/data/test_231_B b/geom_bottleneck/tests/data/test_231_B deleted file mode 100644 index f5d94fe..0000000 --- a/geom_bottleneck/tests/data/test_231_B +++ /dev/null @@ -1,8 +0,0 @@ -7 10 -10 19 -8 9 -5 12 -7 17 -3 5 -10 11 -0 1 diff --git a/geom_bottleneck/tests/data/test_232_A b/geom_bottleneck/tests/data/test_232_A deleted file mode 100644 index ccad736..0000000 --- a/geom_bottleneck/tests/data/test_232_A +++ /dev/null @@ -1,8 +0,0 @@ -1 6 -5 9 -9 10 -0 9 -0 8 -10 11 -2 7 -6 7 diff --git a/geom_bottleneck/tests/data/test_232_B b/geom_bottleneck/tests/data/test_232_B deleted file mode 100644 index f132580..0000000 --- a/geom_bottleneck/tests/data/test_232_B +++ /dev/null @@ -1,8 +0,0 @@ -5 8 -4 5 -10 17 -10 16 -4 10 -5 14 -5 6 -0 7 diff --git a/geom_bottleneck/tests/data/test_233_A b/geom_bottleneck/tests/data/test_233_A deleted file mode 100644 index fd2fa4e..0000000 --- a/geom_bottleneck/tests/data/test_233_A +++ /dev/null @@ -1,8 +0,0 @@ -9 13 -2 6 -0 1 -6 14 -9 13 -0 1 -6 9 -2 9 diff --git a/geom_bottleneck/tests/data/test_233_B b/geom_bottleneck/tests/data/test_233_B deleted file mode 100644 index 3dc34c6..0000000 --- a/geom_bottleneck/tests/data/test_233_B +++ /dev/null @@ -1,8 +0,0 @@ -8 12 -5 12 -1 5 -10 13 -1 7 -8 14 -7 15 -1 8 diff --git a/geom_bottleneck/tests/data/test_234_A b/geom_bottleneck/tests/data/test_234_A deleted file mode 100644 index 6ff3442..0000000 --- a/geom_bottleneck/tests/data/test_234_A +++ /dev/null @@ -1,8 +0,0 @@ -0 7 -5 13 -10 20 -1 2 -9 10 -10 17 -1 2 -0 7 diff --git a/geom_bottleneck/tests/data/test_234_B b/geom_bottleneck/tests/data/test_234_B deleted file mode 100644 index 36a2966..0000000 --- a/geom_bottleneck/tests/data/test_234_B +++ /dev/null @@ -1,8 +0,0 @@ -2 12 -1 2 -3 4 -1 4 -0 7 -7 8 -8 13 -9 18 diff --git a/geom_bottleneck/tests/data/test_235_A b/geom_bottleneck/tests/data/test_235_A deleted file mode 100644 index 40aec79..0000000 --- a/geom_bottleneck/tests/data/test_235_A +++ /dev/null @@ -1,8 +0,0 @@ -4 7 -10 11 -7 12 -2 7 -8 11 -9 11 -8 12 -7 16 diff --git a/geom_bottleneck/tests/data/test_235_B b/geom_bottleneck/tests/data/test_235_B deleted file mode 100644 index 910422b..0000000 --- a/geom_bottleneck/tests/data/test_235_B +++ /dev/null @@ -1,8 +0,0 @@ -1 3 -9 15 -10 20 -6 16 -2 8 -3 9 -8 10 -9 14 diff --git a/geom_bottleneck/tests/data/test_236_A b/geom_bottleneck/tests/data/test_236_A deleted file mode 100644 index 8ca54db..0000000 --- a/geom_bottleneck/tests/data/test_236_A +++ /dev/null @@ -1,8 +0,0 @@ -5 11 -10 15 -7 9 -8 14 -0 5 -1 7 -2 3 -6 11 diff --git a/geom_bottleneck/tests/data/test_236_B b/geom_bottleneck/tests/data/test_236_B deleted file mode 100644 index 0855757..0000000 --- a/geom_bottleneck/tests/data/test_236_B +++ /dev/null @@ -1,8 +0,0 @@ -4 5 -1 8 -1 2 -1 4 -8 17 -2 5 -3 10 -1 2 diff --git a/geom_bottleneck/tests/data/test_237_A b/geom_bottleneck/tests/data/test_237_A deleted file mode 100644 index 18a69fa..0000000 --- a/geom_bottleneck/tests/data/test_237_A +++ /dev/null @@ -1,8 +0,0 @@ -1 6 -3 6 -4 8 -0 3 -7 14 -6 7 -2 5 -6 13 diff --git a/geom_bottleneck/tests/data/test_237_B b/geom_bottleneck/tests/data/test_237_B deleted file mode 100644 index b2ad13f..0000000 --- a/geom_bottleneck/tests/data/test_237_B +++ /dev/null @@ -1,8 +0,0 @@ -3 8 -6 16 -3 11 -6 15 -7 14 -6 11 -3 5 -8 14 diff --git a/geom_bottleneck/tests/data/test_238_A b/geom_bottleneck/tests/data/test_238_A deleted file mode 100644 index d9011b0..0000000 --- a/geom_bottleneck/tests/data/test_238_A +++ /dev/null @@ -1,8 +0,0 @@ -7 16 -3 12 -4 7 -7 13 -6 9 -5 8 -5 9 -3 4 diff --git a/geom_bottleneck/tests/data/test_238_B b/geom_bottleneck/tests/data/test_238_B deleted file mode 100644 index 788cf40..0000000 --- a/geom_bottleneck/tests/data/test_238_B +++ /dev/null @@ -1,8 +0,0 @@ -5 6 -0 10 -2 5 -1 2 -9 16 -0 8 -0 3 -5 12 diff --git a/geom_bottleneck/tests/data/test_239_A b/geom_bottleneck/tests/data/test_239_A deleted file mode 100644 index dbb3bec..0000000 --- a/geom_bottleneck/tests/data/test_239_A +++ /dev/null @@ -1,8 +0,0 @@ -2 10 -1 6 -10 20 -7 10 -2 7 -4 11 -0 5 -6 13 diff --git a/geom_bottleneck/tests/data/test_239_B b/geom_bottleneck/tests/data/test_239_B deleted file mode 100644 index a0c12ac..0000000 --- a/geom_bottleneck/tests/data/test_239_B +++ /dev/null @@ -1,8 +0,0 @@ -1 5 -1 3 -5 8 -9 16 -8 17 -9 13 -3 4 -4 7 diff --git a/geom_bottleneck/tests/data/test_240_A b/geom_bottleneck/tests/data/test_240_A deleted file mode 100644 index 2386a27..0000000 --- a/geom_bottleneck/tests/data/test_240_A +++ /dev/null @@ -1,9 +0,0 @@ -0 1 -10 15 -6 7 -5 14 -10 15 -9 12 -0 4 -10 11 -3 10 diff --git a/geom_bottleneck/tests/data/test_240_B b/geom_bottleneck/tests/data/test_240_B deleted file mode 100644 index 15439fb..0000000 --- a/geom_bottleneck/tests/data/test_240_B +++ /dev/null @@ -1,9 +0,0 @@ -0 3 -3 6 -2 12 -3 4 -9 13 -0 3 -0 7 -10 17 -6 15 diff --git a/geom_bottleneck/tests/data/test_241_A b/geom_bottleneck/tests/data/test_241_A deleted file mode 100644 index 8ed0c54..0000000 --- a/geom_bottleneck/tests/data/test_241_A +++ /dev/null @@ -1,9 +0,0 @@ -1 10 -10 14 -3 4 -3 6 -7 12 -1 3 -9 14 -0 2 -1 11 diff --git a/geom_bottleneck/tests/data/test_241_B b/geom_bottleneck/tests/data/test_241_B deleted file mode 100644 index fdac53a..0000000 --- a/geom_bottleneck/tests/data/test_241_B +++ /dev/null @@ -1,9 +0,0 @@ -7 8 -8 14 -10 20 -10 16 -2 7 -0 8 -7 17 -1 2 -5 6 diff --git a/geom_bottleneck/tests/data/test_242_A b/geom_bottleneck/tests/data/test_242_A deleted file mode 100644 index e1af329..0000000 --- a/geom_bottleneck/tests/data/test_242_A +++ /dev/null @@ -1,9 +0,0 @@ -0 3 -2 4 -5 14 -4 8 -0 7 -3 13 -5 11 -5 7 -10 19 diff --git a/geom_bottleneck/tests/data/test_242_B b/geom_bottleneck/tests/data/test_242_B deleted file mode 100644 index b45d054..0000000 --- a/geom_bottleneck/tests/data/test_242_B +++ /dev/null @@ -1,9 +0,0 @@ -5 6 -6 13 -7 12 -2 10 -0 9 -2 11 -2 9 -8 10 -10 13 diff --git a/geom_bottleneck/tests/data/test_243_A b/geom_bottleneck/tests/data/test_243_A deleted file mode 100644 index ed2d61b..0000000 --- a/geom_bottleneck/tests/data/test_243_A +++ /dev/null @@ -1,9 +0,0 @@ -4 6 -10 11 -4 7 -8 14 -1 4 -9 15 -8 10 -4 11 -7 10 diff --git a/geom_bottleneck/tests/data/test_243_B b/geom_bottleneck/tests/data/test_243_B deleted file mode 100644 index f0b5359..0000000 --- a/geom_bottleneck/tests/data/test_243_B +++ /dev/null @@ -1,9 +0,0 @@ -7 8 -1 9 -7 10 -5 6 -3 11 -10 12 -1 8 -3 13 -0 9 diff --git a/geom_bottleneck/tests/data/test_244_A b/geom_bottleneck/tests/data/test_244_A deleted file mode 100644 index 1d1e4a7..0000000 --- a/geom_bottleneck/tests/data/test_244_A +++ /dev/null @@ -1,9 +0,0 @@ -4 14 -3 8 -0 3 -3 12 -9 16 -4 7 -6 12 -7 8 -5 13 diff --git a/geom_bottleneck/tests/data/test_244_B b/geom_bottleneck/tests/data/test_244_B deleted file mode 100644 index 5d9748f..0000000 --- a/geom_bottleneck/tests/data/test_244_B +++ /dev/null @@ -1,9 +0,0 @@ -3 7 -3 8 -5 15 -4 7 -1 2 -0 10 -6 15 -8 9 -4 5 diff --git a/geom_bottleneck/tests/data/test_245_A b/geom_bottleneck/tests/data/test_245_A deleted file mode 100644 index f17d580..0000000 --- a/geom_bottleneck/tests/data/test_245_A +++ /dev/null @@ -1,9 +0,0 @@ -5 6 -3 11 -7 9 -1 7 -5 14 -4 7 -9 19 -1 7 -4 6 diff --git a/geom_bottleneck/tests/data/test_245_B b/geom_bottleneck/tests/data/test_245_B deleted file mode 100644 index 4b67caa..0000000 --- a/geom_bottleneck/tests/data/test_245_B +++ /dev/null @@ -1,9 +0,0 @@ -1 2 -6 7 -7 13 -1 9 -9 13 -2 8 -2 4 -4 5 -4 7 diff --git a/geom_bottleneck/tests/data/test_246_A b/geom_bottleneck/tests/data/test_246_A deleted file mode 100644 index b4ddade..0000000 --- a/geom_bottleneck/tests/data/test_246_A +++ /dev/null @@ -1,9 +0,0 @@ -10 15 -3 10 -2 7 -1 6 -2 3 -2 9 -9 10 -9 12 -8 18 diff --git a/geom_bottleneck/tests/data/test_246_B b/geom_bottleneck/tests/data/test_246_B deleted file mode 100644 index 6e0c12d..0000000 --- a/geom_bottleneck/tests/data/test_246_B +++ /dev/null @@ -1,9 +0,0 @@ -4 9 -4 7 -6 11 -7 10 -0 3 -7 14 -7 17 -4 6 -10 15 diff --git a/geom_bottleneck/tests/data/test_247_A b/geom_bottleneck/tests/data/test_247_A deleted file mode 100644 index 4832963..0000000 --- a/geom_bottleneck/tests/data/test_247_A +++ /dev/null @@ -1,9 +0,0 @@ -5 14 -9 19 -4 5 -3 4 -2 7 -9 12 -10 11 -7 12 -8 12 diff --git a/geom_bottleneck/tests/data/test_247_B b/geom_bottleneck/tests/data/test_247_B deleted file mode 100644 index 17cc1f0..0000000 --- a/geom_bottleneck/tests/data/test_247_B +++ /dev/null @@ -1,9 +0,0 @@ -4 12 -2 7 -1 2 -9 19 -4 14 -6 12 -8 11 -5 12 -9 10 diff --git a/geom_bottleneck/tests/data/test_248_A b/geom_bottleneck/tests/data/test_248_A deleted file mode 100644 index adbf3d6..0000000 --- a/geom_bottleneck/tests/data/test_248_A +++ /dev/null @@ -1,9 +0,0 @@ -8 9 -8 15 -2 12 -0 1 -8 14 -0 5 -7 17 -7 12 -7 10 diff --git a/geom_bottleneck/tests/data/test_248_B b/geom_bottleneck/tests/data/test_248_B deleted file mode 100644 index 39ee264..0000000 --- a/geom_bottleneck/tests/data/test_248_B +++ /dev/null @@ -1,9 +0,0 @@ -6 11 -1 10 -6 16 -10 13 -3 13 -10 16 -8 14 -8 16 -1 5 diff --git a/geom_bottleneck/tests/data/test_249_A b/geom_bottleneck/tests/data/test_249_A deleted file mode 100644 index 2b8a639..0000000 --- a/geom_bottleneck/tests/data/test_249_A +++ /dev/null @@ -1,9 +0,0 @@ -2 7 -2 4 -7 17 -2 11 -6 12 -3 12 -2 8 -5 6 -0 1 diff --git a/geom_bottleneck/tests/data/test_249_B b/geom_bottleneck/tests/data/test_249_B deleted file mode 100644 index 06b036c..0000000 --- a/geom_bottleneck/tests/data/test_249_B +++ /dev/null @@ -1,9 +0,0 @@ -0 1 -8 11 -9 13 -3 11 -3 13 -7 15 -2 6 -4 5 -3 4 diff --git a/geom_bottleneck/tests/data/test_250_A b/geom_bottleneck/tests/data/test_250_A deleted file mode 100644 index 6934dd8..0000000 --- a/geom_bottleneck/tests/data/test_250_A +++ /dev/null @@ -1,9 +0,0 @@ -0 8 -7 14 -5 12 -7 15 -9 19 -8 14 -6 15 -10 11 -9 19 diff --git a/geom_bottleneck/tests/data/test_250_B b/geom_bottleneck/tests/data/test_250_B deleted file mode 100644 index 0d387ac..0000000 --- a/geom_bottleneck/tests/data/test_250_B +++ /dev/null @@ -1,9 +0,0 @@ -8 13 -7 14 -0 6 -4 14 -7 17 -6 8 -5 13 -0 1 -5 10 diff --git a/geom_bottleneck/tests/data/test_251_A b/geom_bottleneck/tests/data/test_251_A deleted file mode 100644 index 6fb7509..0000000 --- a/geom_bottleneck/tests/data/test_251_A +++ /dev/null @@ -1,9 +0,0 @@ -1 8 -6 13 -1 6 -10 15 -7 8 -3 6 -3 11 -7 12 -4 9 diff --git a/geom_bottleneck/tests/data/test_251_B b/geom_bottleneck/tests/data/test_251_B deleted file mode 100644 index 4ea7b4a..0000000 --- a/geom_bottleneck/tests/data/test_251_B +++ /dev/null @@ -1,9 +0,0 @@ -5 11 -6 12 -2 9 -5 6 -0 5 -0 2 -6 10 -4 10 -10 19 diff --git a/geom_bottleneck/tests/data/test_252_A b/geom_bottleneck/tests/data/test_252_A deleted file mode 100644 index 0076fb9..0000000 --- a/geom_bottleneck/tests/data/test_252_A +++ /dev/null @@ -1,9 +0,0 @@ -4 8 -5 15 -0 10 -8 15 -1 8 -4 6 -5 13 -7 10 -0 1 diff --git a/geom_bottleneck/tests/data/test_252_B b/geom_bottleneck/tests/data/test_252_B deleted file mode 100644 index cf7fab7..0000000 --- a/geom_bottleneck/tests/data/test_252_B +++ /dev/null @@ -1,9 +0,0 @@ -2 3 -4 6 -0 9 -4 7 -4 11 -6 10 -9 11 -1 5 -3 4 diff --git a/geom_bottleneck/tests/data/test_253_A b/geom_bottleneck/tests/data/test_253_A deleted file mode 100644 index 0916538..0000000 --- a/geom_bottleneck/tests/data/test_253_A +++ /dev/null @@ -1,9 +0,0 @@ -9 18 -1 10 -7 12 -0 6 -2 4 -1 10 -2 4 -1 2 -2 11 diff --git a/geom_bottleneck/tests/data/test_253_B b/geom_bottleneck/tests/data/test_253_B deleted file mode 100644 index 3ee1874..0000000 --- a/geom_bottleneck/tests/data/test_253_B +++ /dev/null @@ -1,9 +0,0 @@ -9 12 -6 11 -0 1 -6 7 -2 5 -6 8 -10 20 -9 17 -8 15 diff --git a/geom_bottleneck/tests/data/test_254_A b/geom_bottleneck/tests/data/test_254_A deleted file mode 100644 index 85af9cb..0000000 --- a/geom_bottleneck/tests/data/test_254_A +++ /dev/null @@ -1,9 +0,0 @@ -1 9 -2 10 -4 7 -4 14 -3 9 -1 11 -7 16 -10 11 -5 15 diff --git a/geom_bottleneck/tests/data/test_254_B b/geom_bottleneck/tests/data/test_254_B deleted file mode 100644 index 573f5c5..0000000 --- a/geom_bottleneck/tests/data/test_254_B +++ /dev/null @@ -1,9 +0,0 @@ -9 13 -0 1 -8 9 -8 9 -3 10 -5 14 -6 12 -3 5 -2 3 diff --git a/geom_bottleneck/tests/data/test_255_A b/geom_bottleneck/tests/data/test_255_A deleted file mode 100644 index 2fc0a84..0000000 --- a/geom_bottleneck/tests/data/test_255_A +++ /dev/null @@ -1,9 +0,0 @@ -10 11 -4 8 -2 10 -2 10 -3 8 -6 7 -8 14 -2 10 -4 11 diff --git a/geom_bottleneck/tests/data/test_255_B b/geom_bottleneck/tests/data/test_255_B deleted file mode 100644 index 04e0521..0000000 --- a/geom_bottleneck/tests/data/test_255_B +++ /dev/null @@ -1,9 +0,0 @@ -5 13 -8 12 -8 9 -4 10 -7 8 -1 7 -3 11 -10 15 -5 10 diff --git a/geom_bottleneck/tests/data/test_256_A b/geom_bottleneck/tests/data/test_256_A deleted file mode 100644 index bb1df33..0000000 --- a/geom_bottleneck/tests/data/test_256_A +++ /dev/null @@ -1,9 +0,0 @@ -6 7 -7 8 -10 16 -2 5 -5 15 -7 9 -10 15 -9 18 -4 9 diff --git a/geom_bottleneck/tests/data/test_256_B b/geom_bottleneck/tests/data/test_256_B deleted file mode 100644 index a9bb2f8..0000000 --- a/geom_bottleneck/tests/data/test_256_B +++ /dev/null @@ -1,9 +0,0 @@ -0 10 -7 9 -9 10 -7 8 -1 2 -2 4 -8 15 -3 7 -0 2 diff --git a/geom_bottleneck/tests/data/test_257_A b/geom_bottleneck/tests/data/test_257_A deleted file mode 100644 index ac06787..0000000 --- a/geom_bottleneck/tests/data/test_257_A +++ /dev/null @@ -1,9 +0,0 @@ -6 14 -9 16 -9 18 -4 7 -8 15 -7 9 -9 17 -1 2 -10 17 diff --git a/geom_bottleneck/tests/data/test_257_B b/geom_bottleneck/tests/data/test_257_B deleted file mode 100644 index 93ab86c..0000000 --- a/geom_bottleneck/tests/data/test_257_B +++ /dev/null @@ -1,9 +0,0 @@ -2 3 -3 6 -10 13 -7 14 -0 8 -0 2 -9 12 -1 7 -0 1 diff --git a/geom_bottleneck/tests/data/test_258_A b/geom_bottleneck/tests/data/test_258_A deleted file mode 100644 index b00d4c3..0000000 --- a/geom_bottleneck/tests/data/test_258_A +++ /dev/null @@ -1,9 +0,0 @@ -4 11 -0 6 -5 6 -2 4 -2 7 -8 11 -3 8 -3 4 -7 10 diff --git a/geom_bottleneck/tests/data/test_258_B b/geom_bottleneck/tests/data/test_258_B deleted file mode 100644 index f3ab79e..0000000 --- a/geom_bottleneck/tests/data/test_258_B +++ /dev/null @@ -1,9 +0,0 @@ -6 15 -5 10 -9 10 -4 10 -7 8 -2 8 -8 18 -9 18 -5 9 diff --git a/geom_bottleneck/tests/data/test_259_A b/geom_bottleneck/tests/data/test_259_A deleted file mode 100644 index 30c4a56..0000000 --- a/geom_bottleneck/tests/data/test_259_A +++ /dev/null @@ -1,9 +0,0 @@ -4 5 -0 1 -4 7 -5 14 -2 8 -0 1 -9 13 -5 9 -10 13 diff --git a/geom_bottleneck/tests/data/test_259_B b/geom_bottleneck/tests/data/test_259_B deleted file mode 100644 index 8cb51f7..0000000 --- a/geom_bottleneck/tests/data/test_259_B +++ /dev/null @@ -1,9 +0,0 @@ -6 15 -9 18 -7 8 -9 16 -9 15 -5 15 -9 10 -6 10 -5 6 diff --git a/geom_bottleneck/tests/data/test_260_A b/geom_bottleneck/tests/data/test_260_A deleted file mode 100644 index 83740c1..0000000 --- a/geom_bottleneck/tests/data/test_260_A +++ /dev/null @@ -1,10 +0,0 @@ -1 4 -2 5 -3 7 -7 9 -4 13 -8 15 -10 19 -9 14 -10 18 -10 17 diff --git a/geom_bottleneck/tests/data/test_260_B b/geom_bottleneck/tests/data/test_260_B deleted file mode 100644 index 18e1128..0000000 --- a/geom_bottleneck/tests/data/test_260_B +++ /dev/null @@ -1,10 +0,0 @@ -0 4 -8 15 -4 6 -10 13 -6 7 -7 10 -8 13 -2 7 -4 13 -3 5 diff --git a/geom_bottleneck/tests/data/test_261_A b/geom_bottleneck/tests/data/test_261_A deleted file mode 100644 index 259e18a..0000000 --- a/geom_bottleneck/tests/data/test_261_A +++ /dev/null @@ -1,10 +0,0 @@ -8 11 -6 11 -9 16 -7 17 -7 14 -9 11 -0 1 -9 14 -6 14 -0 10 diff --git a/geom_bottleneck/tests/data/test_261_B b/geom_bottleneck/tests/data/test_261_B deleted file mode 100644 index 2be943f..0000000 --- a/geom_bottleneck/tests/data/test_261_B +++ /dev/null @@ -1,10 +0,0 @@ -8 18 -5 7 -9 12 -7 10 -3 6 -4 14 -9 15 -8 14 -1 9 -0 5 diff --git a/geom_bottleneck/tests/data/test_262_A b/geom_bottleneck/tests/data/test_262_A deleted file mode 100644 index ccb706b..0000000 --- a/geom_bottleneck/tests/data/test_262_A +++ /dev/null @@ -1,10 +0,0 @@ -1 8 -6 16 -7 13 -10 13 -7 11 -10 15 -10 17 -8 17 -0 3 -5 6 diff --git a/geom_bottleneck/tests/data/test_262_B b/geom_bottleneck/tests/data/test_262_B deleted file mode 100644 index 944d288..0000000 --- a/geom_bottleneck/tests/data/test_262_B +++ /dev/null @@ -1,10 +0,0 @@ -9 18 -7 8 -0 8 -8 15 -6 14 -6 11 -6 16 -7 17 -3 4 -4 7 diff --git a/geom_bottleneck/tests/data/test_263_A b/geom_bottleneck/tests/data/test_263_A deleted file mode 100644 index 6262062..0000000 --- a/geom_bottleneck/tests/data/test_263_A +++ /dev/null @@ -1,10 +0,0 @@ -0 9 -10 11 -4 13 -9 13 -4 6 -7 13 -4 5 -7 9 -10 11 -10 18 diff --git a/geom_bottleneck/tests/data/test_263_B b/geom_bottleneck/tests/data/test_263_B deleted file mode 100644 index c9f8716..0000000 --- a/geom_bottleneck/tests/data/test_263_B +++ /dev/null @@ -1,10 +0,0 @@ -2 6 -6 13 -2 12 -3 13 -5 6 -10 16 -9 18 -9 16 -10 18 -10 20 diff --git a/geom_bottleneck/tests/data/test_264_A b/geom_bottleneck/tests/data/test_264_A deleted file mode 100644 index 8c79b6d..0000000 --- a/geom_bottleneck/tests/data/test_264_A +++ /dev/null @@ -1,10 +0,0 @@ -3 11 -3 4 -8 12 -2 10 -7 12 -2 10 -10 13 -4 8 -2 9 -10 11 diff --git a/geom_bottleneck/tests/data/test_264_B b/geom_bottleneck/tests/data/test_264_B deleted file mode 100644 index 9b92607..0000000 --- a/geom_bottleneck/tests/data/test_264_B +++ /dev/null @@ -1,10 +0,0 @@ -7 11 -2 7 -4 12 -9 10 -10 12 -8 15 -8 12 -6 7 -2 11 -10 11 diff --git a/geom_bottleneck/tests/data/test_265_A b/geom_bottleneck/tests/data/test_265_A deleted file mode 100644 index 4de3ff9..0000000 --- a/geom_bottleneck/tests/data/test_265_A +++ /dev/null @@ -1,10 +0,0 @@ -0 4 -1 2 -6 11 -9 19 -0 6 -9 19 -0 5 -4 5 -7 11 -9 14 diff --git a/geom_bottleneck/tests/data/test_265_B b/geom_bottleneck/tests/data/test_265_B deleted file mode 100644 index f03f49f..0000000 --- a/geom_bottleneck/tests/data/test_265_B +++ /dev/null @@ -1,10 +0,0 @@ -1 7 -5 10 -5 10 -4 6 -0 7 -4 12 -8 11 -10 15 -2 11 -8 17 diff --git a/geom_bottleneck/tests/data/test_266_A b/geom_bottleneck/tests/data/test_266_A deleted file mode 100644 index 95754d3..0000000 --- a/geom_bottleneck/tests/data/test_266_A +++ /dev/null @@ -1,10 +0,0 @@ -7 8 -3 12 -0 5 -0 6 -1 5 -9 17 -6 11 -3 5 -2 11 -5 7 diff --git a/geom_bottleneck/tests/data/test_266_B b/geom_bottleneck/tests/data/test_266_B deleted file mode 100644 index 5a2d560..0000000 --- a/geom_bottleneck/tests/data/test_266_B +++ /dev/null @@ -1,10 +0,0 @@ -10 17 -5 13 -9 10 -3 4 -4 10 -6 12 -0 7 -6 14 -1 6 -4 10 diff --git a/geom_bottleneck/tests/data/test_267_A b/geom_bottleneck/tests/data/test_267_A deleted file mode 100644 index d2c663e..0000000 --- a/geom_bottleneck/tests/data/test_267_A +++ /dev/null @@ -1,10 +0,0 @@ -3 4 -10 20 -2 10 -1 7 -0 4 -0 10 -0 8 -3 4 -9 19 -7 13 diff --git a/geom_bottleneck/tests/data/test_267_B b/geom_bottleneck/tests/data/test_267_B deleted file mode 100644 index aebae2b..0000000 --- a/geom_bottleneck/tests/data/test_267_B +++ /dev/null @@ -1,10 +0,0 @@ -2 11 -4 5 -1 10 -3 9 -6 11 -0 8 -2 3 -0 3 -6 11 -7 12 diff --git a/geom_bottleneck/tests/data/test_268_A b/geom_bottleneck/tests/data/test_268_A deleted file mode 100644 index d0e9835..0000000 --- a/geom_bottleneck/tests/data/test_268_A +++ /dev/null @@ -1,10 +0,0 @@ -3 4 -10 17 -8 17 -0 2 -4 8 -0 8 -4 5 -5 6 -1 2 -1 7 diff --git a/geom_bottleneck/tests/data/test_268_B b/geom_bottleneck/tests/data/test_268_B deleted file mode 100644 index ac0c242..0000000 --- a/geom_bottleneck/tests/data/test_268_B +++ /dev/null @@ -1,10 +0,0 @@ -3 11 -3 6 -1 2 -8 9 -2 5 -4 13 -4 9 -9 18 -9 15 -9 13 diff --git a/geom_bottleneck/tests/data/test_269_A b/geom_bottleneck/tests/data/test_269_A deleted file mode 100644 index 62a1a47..0000000 --- a/geom_bottleneck/tests/data/test_269_A +++ /dev/null @@ -1,10 +0,0 @@ -10 17 -10 18 -3 10 -6 8 -3 5 -5 11 -5 12 -9 13 -6 16 -2 11 diff --git a/geom_bottleneck/tests/data/test_269_B b/geom_bottleneck/tests/data/test_269_B deleted file mode 100644 index ecf44f6..0000000 --- a/geom_bottleneck/tests/data/test_269_B +++ /dev/null @@ -1,10 +0,0 @@ -3 8 -2 9 -1 6 -8 11 -10 18 -4 12 -0 2 -0 1 -0 8 -0 4 diff --git a/geom_bottleneck/tests/data/test_270_A b/geom_bottleneck/tests/data/test_270_A deleted file mode 100644 index 6bd9f37..0000000 --- a/geom_bottleneck/tests/data/test_270_A +++ /dev/null @@ -1,10 +0,0 @@ -6 16 -3 8 -6 7 -5 10 -7 17 -1 2 -10 19 -10 18 -4 9 -9 14 diff --git a/geom_bottleneck/tests/data/test_270_B b/geom_bottleneck/tests/data/test_270_B deleted file mode 100644 index 5e177c7..0000000 --- a/geom_bottleneck/tests/data/test_270_B +++ /dev/null @@ -1,10 +0,0 @@ -8 14 -10 14 -6 7 -3 8 -9 10 -3 7 -2 3 -2 3 -10 19 -8 15 diff --git a/geom_bottleneck/tests/data/test_271_A b/geom_bottleneck/tests/data/test_271_A deleted file mode 100644 index 12f7492..0000000 --- a/geom_bottleneck/tests/data/test_271_A +++ /dev/null @@ -1,10 +0,0 @@ -0 7 -0 6 -3 10 -3 6 -1 10 -10 11 -3 13 -9 16 -9 15 -10 20 diff --git a/geom_bottleneck/tests/data/test_271_B b/geom_bottleneck/tests/data/test_271_B deleted file mode 100644 index 1af6dd6..0000000 --- a/geom_bottleneck/tests/data/test_271_B +++ /dev/null @@ -1,10 +0,0 @@ -9 10 -9 16 -10 14 -1 4 -8 14 -10 11 -9 10 -3 7 -6 14 -7 8 diff --git a/geom_bottleneck/tests/data/test_272_A b/geom_bottleneck/tests/data/test_272_A deleted file mode 100644 index b6b67f0..0000000 --- a/geom_bottleneck/tests/data/test_272_A +++ /dev/null @@ -1,10 +0,0 @@ -9 17 -6 16 -6 8 -1 2 -7 12 -1 4 -0 9 -9 16 -8 10 -10 11 diff --git a/geom_bottleneck/tests/data/test_272_B b/geom_bottleneck/tests/data/test_272_B deleted file mode 100644 index 9b12c0e..0000000 --- a/geom_bottleneck/tests/data/test_272_B +++ /dev/null @@ -1,10 +0,0 @@ -1 11 -9 14 -8 9 -3 11 -7 15 -0 5 -0 8 -5 11 -0 1 -10 11 diff --git a/geom_bottleneck/tests/data/test_273_A b/geom_bottleneck/tests/data/test_273_A deleted file mode 100644 index 6ae8fde..0000000 --- a/geom_bottleneck/tests/data/test_273_A +++ /dev/null @@ -1,10 +0,0 @@ -2 10 -8 9 -10 19 -3 7 -4 5 -1 8 -0 5 -6 9 -0 1 -4 10 diff --git a/geom_bottleneck/tests/data/test_273_B b/geom_bottleneck/tests/data/test_273_B deleted file mode 100644 index 42955e8..0000000 --- a/geom_bottleneck/tests/data/test_273_B +++ /dev/null @@ -1,10 +0,0 @@ -9 19 -0 2 -0 1 -2 9 -7 9 -2 7 -3 6 -9 10 -2 3 -0 9 diff --git a/geom_bottleneck/tests/data/test_274_A b/geom_bottleneck/tests/data/test_274_A deleted file mode 100644 index 78e099d..0000000 --- a/geom_bottleneck/tests/data/test_274_A +++ /dev/null @@ -1,10 +0,0 @@ -0 1 -10 11 -4 6 -9 15 -9 19 -4 7 -8 17 -0 7 -7 17 -4 14 diff --git a/geom_bottleneck/tests/data/test_274_B b/geom_bottleneck/tests/data/test_274_B deleted file mode 100644 index 59cac0c..0000000 --- a/geom_bottleneck/tests/data/test_274_B +++ /dev/null @@ -1,10 +0,0 @@ -4 12 -2 7 -0 5 -3 10 -7 15 -3 8 -8 14 -8 11 -6 14 -6 16 diff --git a/geom_bottleneck/tests/data/test_275_A b/geom_bottleneck/tests/data/test_275_A deleted file mode 100644 index 9593ad1..0000000 --- a/geom_bottleneck/tests/data/test_275_A +++ /dev/null @@ -1,10 +0,0 @@ -7 13 -2 3 -10 11 -5 10 -6 11 -10 16 -5 10 -5 9 -10 18 -10 11 diff --git a/geom_bottleneck/tests/data/test_275_B b/geom_bottleneck/tests/data/test_275_B deleted file mode 100644 index 46d793b..0000000 --- a/geom_bottleneck/tests/data/test_275_B +++ /dev/null @@ -1,10 +0,0 @@ -9 19 -10 11 -8 9 -7 8 -4 8 -0 2 -4 12 -6 16 -4 9 -8 9 diff --git a/geom_bottleneck/tests/data/test_276_A b/geom_bottleneck/tests/data/test_276_A deleted file mode 100644 index 546a9ad..0000000 --- a/geom_bottleneck/tests/data/test_276_A +++ /dev/null @@ -1,10 +0,0 @@ -6 16 -2 3 -0 6 -9 18 -3 13 -1 5 -1 6 -3 4 -7 11 -0 1 diff --git a/geom_bottleneck/tests/data/test_276_B b/geom_bottleneck/tests/data/test_276_B deleted file mode 100644 index 3b63537..0000000 --- a/geom_bottleneck/tests/data/test_276_B +++ /dev/null @@ -1,10 +0,0 @@ -9 17 -8 9 -7 10 -2 10 -2 11 -2 7 -6 11 -7 12 -10 18 -4 14 diff --git a/geom_bottleneck/tests/data/test_277_A b/geom_bottleneck/tests/data/test_277_A deleted file mode 100644 index 41ee575..0000000 --- a/geom_bottleneck/tests/data/test_277_A +++ /dev/null @@ -1,10 +0,0 @@ -6 8 -6 15 -0 10 -9 10 -5 10 -4 10 -0 5 -5 9 -8 9 -2 5 diff --git a/geom_bottleneck/tests/data/test_277_B b/geom_bottleneck/tests/data/test_277_B deleted file mode 100644 index 84ade69..0000000 --- a/geom_bottleneck/tests/data/test_277_B +++ /dev/null @@ -1,10 +0,0 @@ -0 2 -4 7 -3 12 -8 13 -2 3 -9 18 -8 16 -2 3 -10 20 -4 10 diff --git a/geom_bottleneck/tests/data/test_278_A b/geom_bottleneck/tests/data/test_278_A deleted file mode 100644 index d2e3a7a..0000000 --- a/geom_bottleneck/tests/data/test_278_A +++ /dev/null @@ -1,10 +0,0 @@ -8 10 -6 7 -9 19 -6 11 -4 6 -0 8 -5 6 -5 10 -1 10 -2 7 diff --git a/geom_bottleneck/tests/data/test_278_B b/geom_bottleneck/tests/data/test_278_B deleted file mode 100644 index 0046a8a..0000000 --- a/geom_bottleneck/tests/data/test_278_B +++ /dev/null @@ -1,10 +0,0 @@ -1 2 -0 8 -9 19 -4 13 -0 10 -7 15 -2 3 -10 17 -2 12 -10 17 diff --git a/geom_bottleneck/tests/data/test_279_A b/geom_bottleneck/tests/data/test_279_A deleted file mode 100644 index 4e5619f..0000000 --- a/geom_bottleneck/tests/data/test_279_A +++ /dev/null @@ -1,10 +0,0 @@ -5 9 -4 8 -5 7 -0 2 -8 17 -5 12 -3 5 -1 3 -3 10 -7 10 diff --git a/geom_bottleneck/tests/data/test_279_B b/geom_bottleneck/tests/data/test_279_B deleted file mode 100644 index 7ae40fa..0000000 --- a/geom_bottleneck/tests/data/test_279_B +++ /dev/null @@ -1,10 +0,0 @@ -9 11 -2 5 -5 15 -4 11 -5 11 -9 10 -2 8 -10 14 -6 16 -7 16 diff --git a/geom_bottleneck/tests/data/test_280_A b/geom_bottleneck/tests/data/test_280_A deleted file mode 100644 index 3ac2922..0000000 --- a/geom_bottleneck/tests/data/test_280_A +++ /dev/null @@ -1,20 +0,0 @@ -5 8 -10 11 -0 1 -8 18 -0 7 -2 12 -3 6 -10 20 -9 14 -4 9 -6 7 -4 13 -3 4 -10 13 -6 7 -8 17 -8 9 -5 7 -5 6 -3 11 diff --git a/geom_bottleneck/tests/data/test_280_B b/geom_bottleneck/tests/data/test_280_B deleted file mode 100644 index c5485cf..0000000 --- a/geom_bottleneck/tests/data/test_280_B +++ /dev/null @@ -1,20 +0,0 @@ -9 16 -6 7 -4 12 -9 10 -5 12 -5 14 -1 4 -8 17 -4 14 -8 15 -6 14 -3 13 -7 17 -4 7 -0 2 -9 17 -3 4 -6 11 -0 10 -2 3 diff --git a/geom_bottleneck/tests/data/test_281_A b/geom_bottleneck/tests/data/test_281_A deleted file mode 100644 index e9a4644..0000000 --- a/geom_bottleneck/tests/data/test_281_A +++ /dev/null @@ -1,20 +0,0 @@ -2 4 -3 4 -7 10 -9 14 -9 16 -8 10 -2 3 -0 10 -10 14 -7 14 -4 7 -4 6 -5 11 -1 7 -3 10 -7 8 -6 11 -0 1 -8 9 -7 16 diff --git a/geom_bottleneck/tests/data/test_281_B b/geom_bottleneck/tests/data/test_281_B deleted file mode 100644 index f219b2a..0000000 --- a/geom_bottleneck/tests/data/test_281_B +++ /dev/null @@ -1,20 +0,0 @@ -5 15 -8 17 -0 5 -5 11 -7 13 -5 9 -4 7 -3 9 -6 9 -2 10 -4 9 -6 13 -8 17 -8 12 -10 15 -4 11 -3 11 -0 2 -3 8 -1 6 diff --git a/geom_bottleneck/tests/data/test_282_A b/geom_bottleneck/tests/data/test_282_A deleted file mode 100644 index 946f3f2..0000000 --- a/geom_bottleneck/tests/data/test_282_A +++ /dev/null @@ -1,20 +0,0 @@ -7 17 -1 10 -7 12 -2 12 -1 2 -2 11 -2 6 -7 10 -9 18 -2 12 -3 12 -8 9 -0 10 -5 6 -3 9 -9 13 -0 7 -6 7 -0 2 -4 13 diff --git a/geom_bottleneck/tests/data/test_282_B b/geom_bottleneck/tests/data/test_282_B deleted file mode 100644 index ac3c7c8..0000000 --- a/geom_bottleneck/tests/data/test_282_B +++ /dev/null @@ -1,20 +0,0 @@ -0 8 -10 18 -4 11 -1 10 -4 9 -4 8 -3 9 -0 6 -9 12 -9 10 -9 15 -0 3 -2 11 -6 11 -2 8 -1 3 -8 16 -0 5 -9 18 -4 11 diff --git a/geom_bottleneck/tests/data/test_283_A b/geom_bottleneck/tests/data/test_283_A deleted file mode 100644 index 0c4676e..0000000 --- a/geom_bottleneck/tests/data/test_283_A +++ /dev/null @@ -1,20 +0,0 @@ -4 12 -6 9 -7 12 -10 16 -10 11 -1 2 -0 5 -4 7 -3 12 -4 7 -10 11 -3 5 -10 16 -6 7 -10 18 -7 8 -10 11 -4 10 -6 14 -2 4 diff --git a/geom_bottleneck/tests/data/test_283_B b/geom_bottleneck/tests/data/test_283_B deleted file mode 100644 index 23a83e7..0000000 --- a/geom_bottleneck/tests/data/test_283_B +++ /dev/null @@ -1,20 +0,0 @@ -9 16 -7 17 -2 7 -0 1 -9 17 -8 10 -8 15 -10 17 -6 12 -7 8 -1 8 -2 12 -8 9 -3 6 -6 12 -3 6 -3 5 -2 6 -10 11 -7 13 diff --git a/geom_bottleneck/tests/data/test_284_A b/geom_bottleneck/tests/data/test_284_A deleted file mode 100644 index 4cec19a..0000000 --- a/geom_bottleneck/tests/data/test_284_A +++ /dev/null @@ -1,20 +0,0 @@ -9 13 -2 11 -2 4 -6 7 -6 14 -6 13 -7 14 -0 8 -3 4 -2 9 -4 10 -4 11 -6 15 -1 3 -5 9 -4 5 -4 13 -7 11 -9 15 -7 16 diff --git a/geom_bottleneck/tests/data/test_284_B b/geom_bottleneck/tests/data/test_284_B deleted file mode 100644 index f09aa28..0000000 --- a/geom_bottleneck/tests/data/test_284_B +++ /dev/null @@ -1,20 +0,0 @@ -9 11 -7 10 -3 5 -0 1 -5 11 -2 10 -3 5 -2 4 -7 15 -3 4 -10 13 -1 3 -8 14 -0 8 -1 11 -5 13 -0 1 -2 3 -0 6 -2 6 diff --git a/geom_bottleneck/tests/data/test_285_A b/geom_bottleneck/tests/data/test_285_A deleted file mode 100644 index 8e27a5a..0000000 --- a/geom_bottleneck/tests/data/test_285_A +++ /dev/null @@ -1,20 +0,0 @@ -7 9 -7 12 -7 16 -4 14 -1 8 -3 13 -7 15 -4 5 -10 18 -10 16 -5 6 -6 12 -3 13 -5 9 -7 15 -1 2 -10 14 -5 6 -6 12 -3 9 diff --git a/geom_bottleneck/tests/data/test_285_B b/geom_bottleneck/tests/data/test_285_B deleted file mode 100644 index 16a8754..0000000 --- a/geom_bottleneck/tests/data/test_285_B +++ /dev/null @@ -1,20 +0,0 @@ -4 5 -4 9 -10 19 -1 5 -3 9 -10 11 -0 1 -2 12 -1 8 -7 15 -5 9 -8 10 -7 10 -9 18 -4 9 -3 10 -7 15 -7 14 -2 4 -5 7 diff --git a/geom_bottleneck/tests/data/test_286_A b/geom_bottleneck/tests/data/test_286_A deleted file mode 100644 index f8083ac..0000000 --- a/geom_bottleneck/tests/data/test_286_A +++ /dev/null @@ -1,20 +0,0 @@ -5 6 -10 11 -2 10 -0 6 -4 5 -7 8 -2 10 -4 12 -0 1 -7 15 -2 10 -10 13 -1 10 -9 14 -2 6 -2 8 -6 15 -3 4 -4 6 -2 11 diff --git a/geom_bottleneck/tests/data/test_286_B b/geom_bottleneck/tests/data/test_286_B deleted file mode 100644 index 6ba8e74..0000000 --- a/geom_bottleneck/tests/data/test_286_B +++ /dev/null @@ -1,20 +0,0 @@ -7 8 -3 4 -7 15 -10 14 -4 12 -4 8 -8 12 -4 8 -1 4 -10 12 -0 2 -0 1 -6 12 -7 11 -9 16 -3 11 -2 4 -10 14 -2 10 -6 8 diff --git a/geom_bottleneck/tests/data/test_287_A b/geom_bottleneck/tests/data/test_287_A deleted file mode 100644 index 5dd8f38..0000000 --- a/geom_bottleneck/tests/data/test_287_A +++ /dev/null @@ -1,20 +0,0 @@ -10 20 -8 9 -0 4 -6 14 -1 4 -3 7 -0 3 -10 13 -7 9 -4 6 -7 14 -3 13 -10 17 -4 13 -9 18 -2 3 -1 11 -10 16 -6 12 -4 13 diff --git a/geom_bottleneck/tests/data/test_287_B b/geom_bottleneck/tests/data/test_287_B deleted file mode 100644 index 6fff124..0000000 --- a/geom_bottleneck/tests/data/test_287_B +++ /dev/null @@ -1,20 +0,0 @@ -0 2 -6 7 -8 9 -2 10 -0 4 -7 8 -0 9 -1 4 -6 11 -0 2 -5 7 -9 18 -9 16 -5 14 -3 4 -5 14 -3 4 -6 9 -1 5 -7 10 diff --git a/geom_bottleneck/tests/data/test_288_A b/geom_bottleneck/tests/data/test_288_A deleted file mode 100644 index 567d877..0000000 --- a/geom_bottleneck/tests/data/test_288_A +++ /dev/null @@ -1,20 +0,0 @@ -8 12 -4 9 -5 14 -7 8 -4 11 -5 15 -2 10 -1 3 -0 7 -3 5 -1 3 -1 7 -8 13 -7 10 -5 6 -7 10 -3 6 -10 20 -10 17 -4 14 diff --git a/geom_bottleneck/tests/data/test_288_B b/geom_bottleneck/tests/data/test_288_B deleted file mode 100644 index 1d50cf6..0000000 --- a/geom_bottleneck/tests/data/test_288_B +++ /dev/null @@ -1,20 +0,0 @@ -6 14 -8 11 -5 13 -1 10 -9 12 -9 19 -4 14 -0 2 -8 16 -1 10 -3 9 -0 3 -2 5 -2 4 -5 8 -2 11 -3 5 -6 16 -7 11 -5 11 diff --git a/geom_bottleneck/tests/data/test_289_A b/geom_bottleneck/tests/data/test_289_A deleted file mode 100644 index 39c74ff..0000000 --- a/geom_bottleneck/tests/data/test_289_A +++ /dev/null @@ -1,20 +0,0 @@ -3 4 -5 13 -8 18 -9 18 -4 10 -2 8 -1 10 -10 17 -2 3 -10 15 -2 3 -4 6 -7 8 -7 9 -8 12 -7 9 -8 15 -6 9 -0 2 -8 17 diff --git a/geom_bottleneck/tests/data/test_289_B b/geom_bottleneck/tests/data/test_289_B deleted file mode 100644 index cb24888..0000000 --- a/geom_bottleneck/tests/data/test_289_B +++ /dev/null @@ -1,20 +0,0 @@ -1 11 -10 18 -6 16 -7 14 -8 16 -9 11 -2 3 -8 12 -4 5 -7 14 -5 10 -7 8 -2 12 -5 9 -0 1 -10 19 -1 5 -10 20 -3 10 -9 11 diff --git a/geom_bottleneck/tests/data/test_290_A b/geom_bottleneck/tests/data/test_290_A deleted file mode 100644 index 21e124b..0000000 --- a/geom_bottleneck/tests/data/test_290_A +++ /dev/null @@ -1,20 +0,0 @@ -8 15 -6 10 -4 5 -10 20 -3 8 -0 10 -0 2 -3 9 -1 10 -3 11 -5 12 -6 7 -6 8 -3 6 -8 9 -9 15 -2 12 -8 12 -3 11 -4 9 diff --git a/geom_bottleneck/tests/data/test_290_B b/geom_bottleneck/tests/data/test_290_B deleted file mode 100644 index d705f0e..0000000 --- a/geom_bottleneck/tests/data/test_290_B +++ /dev/null @@ -1,20 +0,0 @@ -8 10 -1 2 -5 6 -2 9 -6 15 -3 8 -6 7 -4 11 -2 3 -10 14 -3 4 -3 4 -1 2 -2 11 -2 6 -6 7 -1 4 -8 16 -4 5 -9 12 diff --git a/geom_bottleneck/tests/data/test_291_A b/geom_bottleneck/tests/data/test_291_A deleted file mode 100644 index 0ba0226..0000000 --- a/geom_bottleneck/tests/data/test_291_A +++ /dev/null @@ -1,20 +0,0 @@ -10 11 -4 5 -4 13 -4 10 -9 13 -3 4 -8 13 -9 15 -2 8 -9 16 -8 14 -8 18 -1 6 -0 8 -8 16 -5 6 -9 19 -8 15 -8 13 -8 16 diff --git a/geom_bottleneck/tests/data/test_291_B b/geom_bottleneck/tests/data/test_291_B deleted file mode 100644 index 1c933ef..0000000 --- a/geom_bottleneck/tests/data/test_291_B +++ /dev/null @@ -1,20 +0,0 @@ -2 9 -4 13 -8 13 -10 13 -8 18 -8 13 -5 14 -1 6 -5 6 -7 8 -2 12 -5 6 -6 10 -7 10 -0 6 -10 14 -2 3 -10 18 -5 12 -4 5 diff --git a/geom_bottleneck/tests/data/test_292_A b/geom_bottleneck/tests/data/test_292_A deleted file mode 100644 index 1929d2e..0000000 --- a/geom_bottleneck/tests/data/test_292_A +++ /dev/null @@ -1,20 +0,0 @@ -7 8 -5 15 -7 11 -6 15 -2 8 -8 9 -7 9 -0 2 -4 8 -2 10 -0 2 -2 4 -1 3 -6 10 -2 10 -2 9 -10 13 -7 8 -5 8 -9 11 diff --git a/geom_bottleneck/tests/data/test_292_B b/geom_bottleneck/tests/data/test_292_B deleted file mode 100644 index 305f8b8..0000000 --- a/geom_bottleneck/tests/data/test_292_B +++ /dev/null @@ -1,20 +0,0 @@ -4 6 -3 9 -8 12 -5 15 -10 12 -4 10 -4 6 -4 6 -0 8 -8 14 -7 14 -4 13 -4 10 -5 12 -10 19 -0 7 -3 10 -10 15 -0 2 -10 11 diff --git a/geom_bottleneck/tests/data/test_293_A b/geom_bottleneck/tests/data/test_293_A deleted file mode 100644 index 752bd33..0000000 --- a/geom_bottleneck/tests/data/test_293_A +++ /dev/null @@ -1,20 +0,0 @@ -8 15 -5 15 -10 11 -6 7 -10 13 -9 10 -6 8 -9 18 -0 4 -2 4 -2 9 -6 15 -0 1 -5 12 -7 12 -2 9 -3 13 -4 10 -10 16 -2 9 diff --git a/geom_bottleneck/tests/data/test_293_B b/geom_bottleneck/tests/data/test_293_B deleted file mode 100644 index 6ce5afb..0000000 --- a/geom_bottleneck/tests/data/test_293_B +++ /dev/null @@ -1,20 +0,0 @@ -2 10 -8 11 -6 16 -0 10 -2 3 -10 17 -1 2 -7 16 -3 7 -0 3 -8 9 -2 7 -7 17 -3 13 -2 7 -5 11 -6 9 -10 20 -2 4 -3 8 diff --git a/geom_bottleneck/tests/data/test_294_A b/geom_bottleneck/tests/data/test_294_A deleted file mode 100644 index 556a43e..0000000 --- a/geom_bottleneck/tests/data/test_294_A +++ /dev/null @@ -1,20 +0,0 @@ -5 13 -4 12 -6 7 -10 16 -5 14 -3 10 -2 10 -7 11 -5 15 -0 1 -4 14 -3 12 -0 8 -10 13 -0 1 -3 9 -5 6 -7 11 -4 13 -9 11 diff --git a/geom_bottleneck/tests/data/test_294_B b/geom_bottleneck/tests/data/test_294_B deleted file mode 100644 index 5a0896c..0000000 --- a/geom_bottleneck/tests/data/test_294_B +++ /dev/null @@ -1,20 +0,0 @@ -1 10 -6 16 -6 10 -4 12 -6 12 -0 6 -3 9 -3 12 -5 14 -9 17 -10 18 -3 13 -2 10 -8 9 -9 16 -8 14 -5 12 -4 6 -9 10 -7 12 diff --git a/geom_bottleneck/tests/data/test_295_A b/geom_bottleneck/tests/data/test_295_A deleted file mode 100644 index 53b904f..0000000 --- a/geom_bottleneck/tests/data/test_295_A +++ /dev/null @@ -1,20 +0,0 @@ -2 10 -10 20 -9 16 -2 9 -2 7 -7 11 -8 11 -10 12 -4 9 -4 13 -6 12 -7 8 -4 8 -7 15 -2 9 -9 11 -10 13 -9 19 -7 14 -5 13 diff --git a/geom_bottleneck/tests/data/test_295_B b/geom_bottleneck/tests/data/test_295_B deleted file mode 100644 index 61d13ff..0000000 --- a/geom_bottleneck/tests/data/test_295_B +++ /dev/null @@ -1,20 +0,0 @@ -3 13 -3 13 -8 17 -1 6 -3 9 -3 10 -5 12 -9 10 -5 7 -9 16 -2 6 -0 1 -4 8 -1 3 -5 15 -6 7 -7 10 -1 3 -5 13 -1 7 diff --git a/geom_bottleneck/tests/data/test_296_A b/geom_bottleneck/tests/data/test_296_A deleted file mode 100644 index 444d20f..0000000 --- a/geom_bottleneck/tests/data/test_296_A +++ /dev/null @@ -1,20 +0,0 @@ -0 6 -4 10 -10 13 -0 6 -1 6 -10 19 -6 13 -1 2 -5 13 -6 14 -4 12 -1 8 -6 16 -2 9 -9 11 -9 19 -1 10 -3 4 -2 11 -4 8 diff --git a/geom_bottleneck/tests/data/test_296_B b/geom_bottleneck/tests/data/test_296_B deleted file mode 100644 index 476d729..0000000 --- a/geom_bottleneck/tests/data/test_296_B +++ /dev/null @@ -1,20 +0,0 @@ -1 3 -7 9 -4 10 -10 11 -0 5 -4 12 -1 2 -7 14 -10 19 -8 9 -3 12 -1 2 -1 5 -0 1 -10 17 -9 17 -1 7 -2 5 -2 5 -4 13 diff --git a/geom_bottleneck/tests/data/test_297_A b/geom_bottleneck/tests/data/test_297_A deleted file mode 100644 index 745d7f6..0000000 --- a/geom_bottleneck/tests/data/test_297_A +++ /dev/null @@ -1,20 +0,0 @@ -6 9 -1 3 -7 10 -9 14 -9 18 -8 12 -2 3 -5 15 -8 14 -3 12 -5 6 -7 15 -6 16 -8 18 -6 13 -6 7 -3 8 -2 3 -9 13 -9 14 diff --git a/geom_bottleneck/tests/data/test_297_B b/geom_bottleneck/tests/data/test_297_B deleted file mode 100644 index 99b1ccc..0000000 --- a/geom_bottleneck/tests/data/test_297_B +++ /dev/null @@ -1,20 +0,0 @@ -4 11 -9 18 -9 11 -2 7 -2 9 -4 12 -4 13 -10 18 -8 10 -2 5 -9 15 -2 9 -10 15 -6 15 -9 12 -10 20 -9 16 -8 11 -0 1 -2 12 diff --git a/geom_bottleneck/tests/data/test_298_A b/geom_bottleneck/tests/data/test_298_A deleted file mode 100644 index d35fccc..0000000 --- a/geom_bottleneck/tests/data/test_298_A +++ /dev/null @@ -1,20 +0,0 @@ -0 6 -9 10 -4 5 -7 13 -10 19 -7 12 -10 20 -2 6 -7 13 -7 8 -9 10 -4 8 -9 10 -7 14 -9 19 -10 16 -3 7 -2 3 -1 5 -3 4 diff --git a/geom_bottleneck/tests/data/test_298_B b/geom_bottleneck/tests/data/test_298_B deleted file mode 100644 index 5cf0d1c..0000000 --- a/geom_bottleneck/tests/data/test_298_B +++ /dev/null @@ -1,20 +0,0 @@ -4 10 -6 8 -2 3 -6 15 -9 16 -10 11 -7 13 -5 6 -2 9 -6 13 -8 14 -9 15 -10 15 -10 12 -9 18 -3 4 -6 7 -1 9 -4 10 -3 7 diff --git a/geom_bottleneck/tests/data/test_299_A b/geom_bottleneck/tests/data/test_299_A deleted file mode 100644 index 3506828..0000000 --- a/geom_bottleneck/tests/data/test_299_A +++ /dev/null @@ -1,20 +0,0 @@ -9 10 -1 6 -7 16 -9 13 -3 8 -6 11 -1 9 -5 14 -3 7 -3 10 -5 11 -1 7 -1 5 -0 6 -6 14 -8 11 -10 13 -9 17 -4 10 -9 14 diff --git a/geom_bottleneck/tests/data/test_299_B b/geom_bottleneck/tests/data/test_299_B deleted file mode 100644 index 3600634..0000000 --- a/geom_bottleneck/tests/data/test_299_B +++ /dev/null @@ -1,20 +0,0 @@ -0 9 -7 13 -8 14 -8 9 -7 17 -0 5 -1 10 -0 5 -3 4 -10 19 -6 14 -8 9 -9 14 -1 6 -9 14 -3 5 -4 5 -8 18 -10 14 -10 18 diff --git a/geom_bottleneck/tests/data/test_300_A b/geom_bottleneck/tests/data/test_300_A deleted file mode 100644 index 2ab4a1e..0000000 --- a/geom_bottleneck/tests/data/test_300_A +++ /dev/null @@ -1,30 +0,0 @@ -8 10 -1 4 -9 12 -0 1 -0 5 -2 9 -7 13 -6 7 -3 8 -2 7 -6 8 -8 12 -1 2 -0 1 -5 10 -4 5 -9 13 -8 15 -6 8 -9 17 -7 10 -8 16 -10 11 -6 8 -6 8 -5 11 -1 4 -9 13 -2 4 -2 3 diff --git a/geom_bottleneck/tests/data/test_300_B b/geom_bottleneck/tests/data/test_300_B deleted file mode 100644 index a54300d..0000000 --- a/geom_bottleneck/tests/data/test_300_B +++ /dev/null @@ -1,30 +0,0 @@ -9 10 -9 11 -6 10 -1 3 -5 8 -7 12 -4 9 -7 11 -1 9 -6 15 -3 9 -3 10 -1 6 -8 15 -1 11 -1 2 -10 11 -6 7 -7 8 -0 3 -10 11 -3 9 -3 9 -5 6 -0 4 -6 9 -2 3 -1 2 -10 11 -4 14 diff --git a/geom_bottleneck/tests/data/test_301_A b/geom_bottleneck/tests/data/test_301_A deleted file mode 100644 index 85f8ae5..0000000 --- a/geom_bottleneck/tests/data/test_301_A +++ /dev/null @@ -1,30 +0,0 @@ -4 10 -5 9 -6 12 -0 1 -4 7 -4 6 -9 19 -4 9 -2 7 -4 13 -6 7 -4 5 -0 10 -7 8 -3 4 -8 12 -0 9 -8 14 -7 13 -8 14 -1 2 -4 5 -10 14 -4 5 -3 11 -7 12 -9 16 -0 1 -9 19 -9 15 diff --git a/geom_bottleneck/tests/data/test_301_B b/geom_bottleneck/tests/data/test_301_B deleted file mode 100644 index 4d9ef19..0000000 --- a/geom_bottleneck/tests/data/test_301_B +++ /dev/null @@ -1,30 +0,0 @@ -5 15 -2 9 -3 4 -2 12 -10 17 -0 7 -5 8 -5 7 -7 16 -2 4 -4 8 -1 4 -5 15 -1 2 -2 12 -0 10 -9 10 -2 11 -7 8 -10 19 -1 11 -10 14 -8 11 -6 7 -3 7 -8 16 -3 11 -7 13 -5 10 -8 10 diff --git a/geom_bottleneck/tests/data/test_302_A b/geom_bottleneck/tests/data/test_302_A deleted file mode 100644 index be0e810..0000000 --- a/geom_bottleneck/tests/data/test_302_A +++ /dev/null @@ -1,30 +0,0 @@ -7 13 -9 18 -1 11 -5 11 -2 3 -5 10 -1 3 -1 9 -7 11 -5 15 -4 5 -3 5 -9 13 -5 13 -10 14 -7 8 -10 19 -4 5 -2 12 -3 7 -3 4 -8 16 -6 16 -6 7 -6 11 -0 2 -0 8 -7 17 -9 17 -0 3 diff --git a/geom_bottleneck/tests/data/test_302_B b/geom_bottleneck/tests/data/test_302_B deleted file mode 100644 index 38806fc..0000000 --- a/geom_bottleneck/tests/data/test_302_B +++ /dev/null @@ -1,30 +0,0 @@ -9 17 -3 4 -7 14 -1 6 -8 18 -2 8 -8 16 -9 19 -2 5 -10 18 -9 15 -5 13 -3 13 -7 8 -1 3 -9 10 -0 8 -6 14 -10 11 -4 14 -4 14 -4 8 -2 4 -1 9 -7 8 -6 13 -8 9 -5 11 -10 18 -7 10 diff --git a/geom_bottleneck/tests/data/test_303_A b/geom_bottleneck/tests/data/test_303_A deleted file mode 100644 index b277929..0000000 --- a/geom_bottleneck/tests/data/test_303_A +++ /dev/null @@ -1,30 +0,0 @@ -4 10 -2 11 -1 5 -9 18 -9 16 -8 11 -9 13 -1 11 -1 11 -9 13 -6 10 -6 15 -0 2 -0 1 -6 10 -1 3 -0 6 -7 8 -3 6 -4 11 -7 14 -8 16 -6 7 -6 7 -6 11 -0 4 -7 12 -1 5 -2 8 -0 1 diff --git a/geom_bottleneck/tests/data/test_303_B b/geom_bottleneck/tests/data/test_303_B deleted file mode 100644 index 2cff171..0000000 --- a/geom_bottleneck/tests/data/test_303_B +++ /dev/null @@ -1,30 +0,0 @@ -7 8 -5 11 -8 15 -2 3 -10 11 -7 17 -0 10 -5 10 -6 8 -4 8 -7 8 -5 12 -8 15 -5 11 -4 9 -9 17 -7 13 -8 13 -6 7 -3 11 -1 6 -6 8 -1 8 -5 10 -9 19 -8 9 -7 17 -1 6 -10 13 -10 19 diff --git a/geom_bottleneck/tests/data/test_304_A b/geom_bottleneck/tests/data/test_304_A deleted file mode 100644 index 2c3de43..0000000 --- a/geom_bottleneck/tests/data/test_304_A +++ /dev/null @@ -1,30 +0,0 @@ -0 2 -8 14 -1 2 -0 8 -0 6 -4 8 -5 12 -3 4 -2 3 -0 6 -10 11 -0 4 -0 10 -9 16 -9 10 -5 6 -6 11 -8 9 -0 1 -6 13 -8 18 -4 10 -9 18 -1 6 -5 7 -1 8 -9 13 -5 12 -4 5 -7 8 diff --git a/geom_bottleneck/tests/data/test_304_B b/geom_bottleneck/tests/data/test_304_B deleted file mode 100644 index 24402f6..0000000 --- a/geom_bottleneck/tests/data/test_304_B +++ /dev/null @@ -1,30 +0,0 @@ -5 15 -2 7 -8 13 -4 5 -2 3 -6 9 -8 12 -8 12 -9 18 -10 12 -3 8 -5 9 -2 12 -9 19 -6 13 -6 12 -10 14 -0 2 -2 3 -1 10 -8 13 -10 20 -3 5 -1 8 -0 6 -2 3 -8 9 -5 6 -9 17 -6 9 diff --git a/geom_bottleneck/tests/data/test_305_A b/geom_bottleneck/tests/data/test_305_A deleted file mode 100644 index aa88ed8..0000000 --- a/geom_bottleneck/tests/data/test_305_A +++ /dev/null @@ -1,30 +0,0 @@ -1 5 -6 7 -7 15 -4 11 -9 12 -8 10 -4 7 -10 17 -9 10 -7 15 -4 7 -8 12 -9 10 -10 15 -1 5 -4 5 -2 10 -2 3 -4 14 -8 17 -1 10 -7 10 -2 4 -6 15 -8 10 -10 20 -3 7 -2 4 -6 10 -2 5 diff --git a/geom_bottleneck/tests/data/test_305_B b/geom_bottleneck/tests/data/test_305_B deleted file mode 100644 index 8edd827..0000000 --- a/geom_bottleneck/tests/data/test_305_B +++ /dev/null @@ -1,30 +0,0 @@ -8 13 -10 11 -0 1 -8 13 -2 3 -9 10 -0 4 -3 9 -8 11 -7 12 -3 8 -8 10 -10 14 -2 4 -1 7 -7 10 -6 7 -7 17 -6 14 -0 6 -8 17 -9 14 -2 7 -0 2 -3 12 -7 16 -10 16 -9 13 -8 13 -1 2 diff --git a/geom_bottleneck/tests/data/test_306_A b/geom_bottleneck/tests/data/test_306_A deleted file mode 100644 index 8baa725..0000000 --- a/geom_bottleneck/tests/data/test_306_A +++ /dev/null @@ -1,30 +0,0 @@ -3 13 -1 8 -7 14 -5 7 -0 1 -10 17 -5 8 -4 5 -6 8 -9 10 -3 10 -9 15 -8 18 -8 14 -5 15 -8 13 -8 9 -7 13 -1 8 -7 13 -3 9 -6 12 -6 9 -2 7 -7 10 -3 9 -8 13 -5 14 -10 11 -2 6 diff --git a/geom_bottleneck/tests/data/test_306_B b/geom_bottleneck/tests/data/test_306_B deleted file mode 100644 index b33f874..0000000 --- a/geom_bottleneck/tests/data/test_306_B +++ /dev/null @@ -1,30 +0,0 @@ -8 10 -8 12 -6 9 -9 11 -5 7 -2 12 -0 9 -10 13 -0 1 -3 13 -1 6 -0 4 -2 12 -4 10 -10 14 -4 5 -9 10 -1 6 -4 12 -4 7 -4 13 -0 5 -10 17 -3 5 -2 3 -5 6 -7 11 -10 12 -2 9 -6 8 diff --git a/geom_bottleneck/tests/data/test_307_A b/geom_bottleneck/tests/data/test_307_A deleted file mode 100644 index bce4bc1..0000000 --- a/geom_bottleneck/tests/data/test_307_A +++ /dev/null @@ -1,30 +0,0 @@ -0 1 -9 18 -5 7 -2 7 -2 8 -10 17 -9 16 -9 16 -1 6 -7 15 -5 10 -1 2 -8 14 -0 1 -5 6 -2 8 -3 4 -5 12 -4 6 -5 12 -7 11 -8 9 -3 10 -6 13 -0 7 -0 4 -7 16 -10 16 -8 12 -6 8 diff --git a/geom_bottleneck/tests/data/test_307_B b/geom_bottleneck/tests/data/test_307_B deleted file mode 100644 index fd4fcb5..0000000 --- a/geom_bottleneck/tests/data/test_307_B +++ /dev/null @@ -1,30 +0,0 @@ -2 5 -3 9 -0 10 -10 14 -4 9 -0 1 -1 9 -3 13 -4 5 -10 16 -5 8 -8 15 -0 5 -0 9 -9 11 -2 3 -10 20 -8 9 -7 15 -4 13 -1 9 -5 8 -7 17 -3 5 -10 16 -2 11 -4 6 -3 7 -7 15 -5 10 diff --git a/geom_bottleneck/tests/data/test_308_A b/geom_bottleneck/tests/data/test_308_A deleted file mode 100644 index 55ab2aa..0000000 --- a/geom_bottleneck/tests/data/test_308_A +++ /dev/null @@ -1,30 +0,0 @@ -3 5 -6 16 -0 3 -0 10 -6 7 -2 6 -7 12 -0 7 -6 9 -6 12 -0 4 -3 12 -2 10 -5 8 -10 16 -8 12 -0 8 -2 3 -6 12 -7 8 -0 4 -2 9 -0 8 -4 7 -10 16 -6 8 -9 14 -6 9 -0 1 -0 1 diff --git a/geom_bottleneck/tests/data/test_308_B b/geom_bottleneck/tests/data/test_308_B deleted file mode 100644 index cdf0c84..0000000 --- a/geom_bottleneck/tests/data/test_308_B +++ /dev/null @@ -1,30 +0,0 @@ -3 11 -1 4 -0 3 -9 15 -2 8 -6 12 -3 13 -0 4 -1 5 -8 18 -6 15 -0 5 -6 16 -4 6 -3 11 -4 5 -0 1 -0 10 -4 6 -0 1 -6 7 -6 7 -8 9 -7 13 -8 15 -3 4 -1 7 -4 13 -6 16 -3 12 diff --git a/geom_bottleneck/tests/data/test_309_A b/geom_bottleneck/tests/data/test_309_A deleted file mode 100644 index 20cee09..0000000 --- a/geom_bottleneck/tests/data/test_309_A +++ /dev/null @@ -1,30 +0,0 @@ -5 15 -2 4 -5 11 -3 13 -5 15 -8 13 -1 10 -2 10 -7 8 -0 7 -9 13 -10 13 -4 14 -0 3 -10 17 -2 7 -5 15 -1 10 -9 11 -7 10 -10 15 -5 7 -0 4 -0 8 -1 2 -8 16 -3 10 -8 16 -3 4 -5 6 diff --git a/geom_bottleneck/tests/data/test_309_B b/geom_bottleneck/tests/data/test_309_B deleted file mode 100644 index 86fe46e..0000000 --- a/geom_bottleneck/tests/data/test_309_B +++ /dev/null @@ -1,30 +0,0 @@ -2 4 -9 17 -4 11 -3 9 -8 13 -6 7 -0 8 -10 15 -10 13 -7 12 -7 14 -9 10 -0 10 -6 7 -6 13 -2 4 -2 3 -6 10 -9 19 -7 17 -2 6 -3 10 -8 17 -8 13 -1 6 -6 16 -10 11 -7 9 -6 13 -9 15 diff --git a/geom_bottleneck/tests/data/test_310_A b/geom_bottleneck/tests/data/test_310_A deleted file mode 100644 index 320f176..0000000 --- a/geom_bottleneck/tests/data/test_310_A +++ /dev/null @@ -1,30 +0,0 @@ -7 12 -8 15 -10 13 -4 5 -10 12 -6 14 -5 7 -1 8 -10 19 -0 4 -0 5 -10 11 -3 12 -0 6 -8 11 -6 15 -10 16 -1 2 -8 10 -4 5 -10 17 -9 15 -7 9 -7 11 -5 11 -9 13 -0 3 -4 7 -3 4 -10 18 diff --git a/geom_bottleneck/tests/data/test_310_B b/geom_bottleneck/tests/data/test_310_B deleted file mode 100644 index 3bcf21c..0000000 --- a/geom_bottleneck/tests/data/test_310_B +++ /dev/null @@ -1,30 +0,0 @@ -8 10 -1 11 -4 8 -4 14 -3 13 -1 5 -1 9 -3 8 -0 7 -9 10 -1 4 -0 1 -7 17 -6 9 -4 6 -6 9 -2 12 -2 10 -8 14 -7 13 -1 9 -8 14 -1 6 -3 11 -5 8 -5 12 -2 10 -0 6 -4 5 -3 13 diff --git a/geom_bottleneck/tests/data/test_311_A b/geom_bottleneck/tests/data/test_311_A deleted file mode 100644 index d98eb28..0000000 --- a/geom_bottleneck/tests/data/test_311_A +++ /dev/null @@ -1,30 +0,0 @@ -2 11 -6 10 -1 4 -2 7 -2 3 -9 15 -2 3 -9 12 -2 3 -5 15 -9 17 -2 6 -0 8 -4 7 -0 5 -0 9 -7 12 -7 12 -9 12 -6 9 -7 16 -1 2 -0 8 -4 12 -2 11 -9 13 -2 7 -5 15 -5 6 -4 10 diff --git a/geom_bottleneck/tests/data/test_311_B b/geom_bottleneck/tests/data/test_311_B deleted file mode 100644 index 311ede4..0000000 --- a/geom_bottleneck/tests/data/test_311_B +++ /dev/null @@ -1,30 +0,0 @@ -2 3 -7 15 -6 12 -10 18 -10 14 -10 11 -8 9 -1 9 -5 11 -0 1 -10 19 -8 14 -10 12 -8 13 -7 14 -3 5 -10 14 -8 17 -9 10 -7 16 -2 3 -1 7 -9 15 -8 12 -0 1 -6 11 -8 15 -8 13 -2 8 -3 12 diff --git a/geom_bottleneck/tests/data/test_312_A b/geom_bottleneck/tests/data/test_312_A deleted file mode 100644 index 2745003..0000000 --- a/geom_bottleneck/tests/data/test_312_A +++ /dev/null @@ -1,30 +0,0 @@ -7 12 -0 7 -4 14 -0 6 -10 11 -8 9 -5 14 -5 6 -9 12 -4 8 -2 3 -1 4 -8 10 -2 8 -9 13 -7 12 -10 17 -1 2 -4 8 -3 5 -7 8 -1 5 -6 7 -7 16 -6 10 -10 17 -10 20 -2 5 -4 13 -2 9 diff --git a/geom_bottleneck/tests/data/test_312_B b/geom_bottleneck/tests/data/test_312_B deleted file mode 100644 index 4a7645b..0000000 --- a/geom_bottleneck/tests/data/test_312_B +++ /dev/null @@ -1,30 +0,0 @@ -8 9 -4 10 -9 19 -5 13 -6 12 -4 6 -5 11 -5 6 -3 12 -7 10 -5 12 -7 8 -3 13 -5 14 -4 9 -6 15 -5 14 -4 13 -1 9 -5 13 -5 12 -1 10 -3 4 -7 13 -3 12 -7 11 -4 5 -7 9 -0 4 -0 9 diff --git a/geom_bottleneck/tests/data/test_313_A b/geom_bottleneck/tests/data/test_313_A deleted file mode 100644 index db46821..0000000 --- a/geom_bottleneck/tests/data/test_313_A +++ /dev/null @@ -1,30 +0,0 @@ -8 14 -10 15 -7 16 -8 9 -1 10 -8 16 -0 10 -2 3 -4 8 -1 7 -2 6 -5 15 -0 7 -5 6 -0 9 -2 3 -5 6 -9 12 -3 7 -8 10 -10 17 -3 12 -10 13 -4 12 -2 8 -8 14 -6 10 -4 6 -0 7 -8 11 diff --git a/geom_bottleneck/tests/data/test_313_B b/geom_bottleneck/tests/data/test_313_B deleted file mode 100644 index d387050..0000000 --- a/geom_bottleneck/tests/data/test_313_B +++ /dev/null @@ -1,30 +0,0 @@ -4 10 -4 11 -4 5 -2 8 -3 6 -1 5 -8 18 -1 4 -7 8 -5 8 -7 15 -10 18 -6 10 -9 17 -6 15 -0 7 -10 19 -8 10 -4 9 -5 14 -5 9 -4 5 -5 12 -5 9 -0 1 -7 9 -2 4 -0 7 -9 18 -8 11 diff --git a/geom_bottleneck/tests/data/test_314_A b/geom_bottleneck/tests/data/test_314_A deleted file mode 100644 index 03ad5db..0000000 --- a/geom_bottleneck/tests/data/test_314_A +++ /dev/null @@ -1,30 +0,0 @@ -10 11 -10 11 -9 12 -2 11 -8 17 -3 10 -8 10 -10 14 -5 9 -5 6 -10 11 -9 17 -10 19 -3 8 -6 15 -10 20 -0 9 -8 12 -7 13 -4 6 -9 10 -6 15 -1 9 -3 9 -10 11 -10 15 -4 9 -8 13 -9 10 -6 9 diff --git a/geom_bottleneck/tests/data/test_314_B b/geom_bottleneck/tests/data/test_314_B deleted file mode 100644 index eaa46d9..0000000 --- a/geom_bottleneck/tests/data/test_314_B +++ /dev/null @@ -1,30 +0,0 @@ -10 20 -2 12 -8 13 -0 7 -6 7 -10 15 -10 20 -5 15 -7 8 -3 10 -5 7 -3 10 -0 4 -10 17 -4 9 -5 14 -9 16 -3 4 -6 7 -4 12 -4 10 -9 10 -0 10 -10 11 -1 6 -8 16 -7 16 -10 12 -6 13 -3 7 diff --git a/geom_bottleneck/tests/data/test_315_A b/geom_bottleneck/tests/data/test_315_A deleted file mode 100644 index fa49507..0000000 --- a/geom_bottleneck/tests/data/test_315_A +++ /dev/null @@ -1,30 +0,0 @@ -9 16 -10 18 -6 7 -9 12 -1 5 -10 20 -9 14 -4 5 -7 13 -6 12 -1 9 -10 12 -5 8 -10 12 -7 16 -10 16 -1 9 -3 10 -1 4 -1 3 -0 6 -7 13 -1 2 -3 8 -6 13 -6 8 -3 10 -0 1 -9 18 -0 10 diff --git a/geom_bottleneck/tests/data/test_315_B b/geom_bottleneck/tests/data/test_315_B deleted file mode 100644 index d5390e2..0000000 --- a/geom_bottleneck/tests/data/test_315_B +++ /dev/null @@ -1,30 +0,0 @@ -1 2 -2 8 -0 2 -9 18 -1 11 -3 6 -6 7 -0 1 -8 14 -6 8 -5 6 -9 17 -5 6 -7 13 -7 9 -9 10 -7 15 -9 11 -3 4 -0 3 -8 16 -0 10 -8 15 -1 11 -8 16 -1 6 -9 17 -10 19 -7 10 -7 9 diff --git a/geom_bottleneck/tests/data/test_316_A b/geom_bottleneck/tests/data/test_316_A deleted file mode 100644 index 57ff91f..0000000 --- a/geom_bottleneck/tests/data/test_316_A +++ /dev/null @@ -1,30 +0,0 @@ -6 16 -4 10 -6 10 -8 11 -1 2 -0 5 -7 16 -4 9 -9 11 -0 2 -0 7 -10 18 -3 6 -9 15 -8 15 -5 9 -7 17 -5 12 -9 19 -10 20 -1 2 -1 11 -3 4 -6 15 -10 18 -3 11 -10 19 -5 6 -1 5 -3 12 diff --git a/geom_bottleneck/tests/data/test_316_B b/geom_bottleneck/tests/data/test_316_B deleted file mode 100644 index 407332e..0000000 --- a/geom_bottleneck/tests/data/test_316_B +++ /dev/null @@ -1,30 +0,0 @@ -4 7 -10 11 -3 4 -2 12 -3 4 -8 13 -3 4 -3 11 -10 11 -9 17 -5 12 -6 14 -10 17 -8 12 -8 9 -4 6 -10 14 -4 11 -5 10 -5 14 -6 7 -0 1 -8 13 -8 12 -3 8 -0 9 -7 8 -8 13 -10 11 -3 7 diff --git a/geom_bottleneck/tests/data/test_317_A b/geom_bottleneck/tests/data/test_317_A deleted file mode 100644 index 4b6204e..0000000 --- a/geom_bottleneck/tests/data/test_317_A +++ /dev/null @@ -1,30 +0,0 @@ -5 6 -1 6 -6 10 -8 16 -7 15 -2 4 -8 17 -5 12 -0 2 -7 17 -2 11 -0 2 -8 10 -8 9 -0 8 -5 10 -2 9 -3 6 -8 9 -9 17 -4 12 -7 9 -1 11 -2 10 -9 19 -10 13 -7 10 -5 8 -5 8 -2 5 diff --git a/geom_bottleneck/tests/data/test_317_B b/geom_bottleneck/tests/data/test_317_B deleted file mode 100644 index b30729a..0000000 --- a/geom_bottleneck/tests/data/test_317_B +++ /dev/null @@ -1,30 +0,0 @@ -4 9 -0 7 -10 11 -4 5 -2 11 -4 9 -7 17 -7 14 -10 18 -2 6 -2 8 -2 7 -1 11 -5 14 -2 3 -6 9 -2 12 -1 4 -5 6 -5 11 -8 17 -4 12 -3 8 -1 4 -9 13 -0 7 -3 9 -3 4 -5 6 -3 11 diff --git a/geom_bottleneck/tests/data/test_318_A b/geom_bottleneck/tests/data/test_318_A deleted file mode 100644 index 2ea4ad5..0000000 --- a/geom_bottleneck/tests/data/test_318_A +++ /dev/null @@ -1,30 +0,0 @@ -4 13 -0 5 -5 12 -3 8 -9 17 -6 16 -7 8 -9 14 -9 19 -6 15 -2 8 -1 2 -10 18 -5 11 -5 6 -8 10 -3 7 -1 11 -9 12 -8 9 -10 20 -2 6 -8 16 -9 19 -10 11 -7 11 -9 10 -8 18 -6 14 -2 4 diff --git a/geom_bottleneck/tests/data/test_318_B b/geom_bottleneck/tests/data/test_318_B deleted file mode 100644 index 64fd49d..0000000 --- a/geom_bottleneck/tests/data/test_318_B +++ /dev/null @@ -1,30 +0,0 @@ -10 13 -6 16 -3 11 -10 20 -1 9 -1 10 -4 5 -5 10 -10 11 -1 8 -7 9 -10 11 -4 10 -0 8 -4 13 -7 9 -7 9 -7 15 -9 17 -2 11 -0 1 -6 13 -1 2 -10 13 -10 18 -7 12 -8 15 -4 10 -5 13 -3 11 diff --git a/geom_bottleneck/tests/data/test_319_A b/geom_bottleneck/tests/data/test_319_A deleted file mode 100644 index f7ffeda..0000000 --- a/geom_bottleneck/tests/data/test_319_A +++ /dev/null @@ -1,30 +0,0 @@ -8 12 -6 14 -2 8 -9 18 -10 16 -8 17 -5 15 -6 7 -1 7 -6 7 -7 9 -9 10 -4 9 -9 14 -6 11 -7 8 -8 14 -6 7 -5 14 -2 10 -0 1 -0 6 -4 5 -1 5 -4 13 -6 14 -5 14 -9 11 -0 7 -3 6 diff --git a/geom_bottleneck/tests/data/test_319_B b/geom_bottleneck/tests/data/test_319_B deleted file mode 100644 index 5529fa0..0000000 --- a/geom_bottleneck/tests/data/test_319_B +++ /dev/null @@ -1,30 +0,0 @@ -6 7 -5 6 -4 5 -0 4 -5 6 -9 11 -1 2 -8 16 -4 9 -8 10 -7 9 -4 5 -5 15 -0 7 -8 14 -10 15 -5 7 -1 6 -5 6 -5 11 -1 10 -0 5 -5 15 -5 10 -0 2 -10 13 -0 9 -3 9 -10 11 -1 10 diff --git a/geom_bottleneck/tests/data/test_320_A b/geom_bottleneck/tests/data/test_320_A deleted file mode 100644 index c7c7380..0000000 --- a/geom_bottleneck/tests/data/test_320_A +++ /dev/null @@ -1,50 +0,0 @@ -5 6 -0 6 -6 10 -5 10 -0 9 -0 4 -10 11 -7 13 -0 2 -4 8 -1 2 -4 13 -8 15 -1 7 -3 4 -5 14 -0 6 -7 16 -2 12 -3 11 -0 1 -3 4 -10 16 -3 8 -0 3 -1 9 -9 14 -5 6 -1 11 -6 9 -6 12 -0 6 -9 13 -4 8 -8 10 -4 9 -7 15 -5 7 -1 2 -8 15 -5 6 -6 12 -0 7 -0 9 -5 12 -1 3 -5 7 -4 12 -7 14 -9 16 diff --git a/geom_bottleneck/tests/data/test_320_B b/geom_bottleneck/tests/data/test_320_B deleted file mode 100644 index 2807b27..0000000 --- a/geom_bottleneck/tests/data/test_320_B +++ /dev/null @@ -1,50 +0,0 @@ -9 17 -7 13 -7 14 -7 10 -7 12 -2 10 -8 9 -0 1 -0 10 -0 8 -1 4 -2 11 -4 13 -8 13 -4 11 -1 5 -5 6 -2 4 -9 17 -5 15 -5 8 -7 9 -8 14 -9 10 -5 13 -8 13 -8 17 -1 11 -4 7 -3 10 -3 8 -10 20 -7 8 -10 15 -3 5 -8 12 -1 2 -7 16 -7 17 -1 10 -2 8 -4 12 -9 15 -5 7 -4 8 -5 14 -6 15 -7 16 -2 8 -5 14 diff --git a/geom_bottleneck/tests/data/test_321_A b/geom_bottleneck/tests/data/test_321_A deleted file mode 100644 index b24cee9..0000000 --- a/geom_bottleneck/tests/data/test_321_A +++ /dev/null @@ -1,50 +0,0 @@ -1 6 -1 7 -1 2 -4 13 -8 15 -1 10 -10 17 -7 17 -0 6 -7 15 -7 13 -9 14 -9 16 -7 12 -5 8 -6 16 -1 3 -8 13 -2 6 -2 10 -2 11 -0 1 -7 15 -4 6 -10 14 -9 10 -0 3 -9 10 -3 9 -7 10 -5 6 -8 18 -2 9 -9 17 -7 12 -9 18 -2 5 -6 8 -7 14 -9 13 -8 16 -9 19 -2 11 -9 16 -6 7 -5 6 -9 17 -8 15 -3 4 -7 14 diff --git a/geom_bottleneck/tests/data/test_321_B b/geom_bottleneck/tests/data/test_321_B deleted file mode 100644 index be6f00b..0000000 --- a/geom_bottleneck/tests/data/test_321_B +++ /dev/null @@ -1,50 +0,0 @@ -3 8 -8 13 -10 11 -9 11 -10 18 -3 10 -5 10 -9 18 -5 11 -5 7 -9 15 -10 13 -5 7 -6 14 -10 17 -4 10 -10 12 -10 17 -6 16 -3 8 -5 13 -9 12 -9 10 -10 12 -9 14 -7 16 -7 16 -10 14 -7 14 -3 4 -3 4 -8 18 -9 14 -5 9 -2 12 -9 17 -0 7 -2 4 -10 11 -7 14 -0 8 -1 9 -5 6 -2 4 -5 8 -3 12 -3 5 -1 5 -0 6 -4 14 diff --git a/geom_bottleneck/tests/data/test_322_A b/geom_bottleneck/tests/data/test_322_A deleted file mode 100644 index 18eed8e..0000000 --- a/geom_bottleneck/tests/data/test_322_A +++ /dev/null @@ -1,50 +0,0 @@ -8 12 -6 11 -2 8 -0 2 -5 14 -6 8 -1 3 -5 9 -5 10 -6 13 -3 6 -10 14 -2 10 -8 11 -3 13 -3 8 -0 10 -0 3 -8 11 -2 12 -1 2 -10 11 -1 2 -7 16 -1 4 -8 11 -5 7 -8 17 -5 11 -3 8 -5 10 -1 4 -3 5 -4 5 -7 10 -4 13 -1 7 -0 1 -0 7 -6 16 -8 16 -4 11 -2 3 -10 13 -2 8 -7 9 -5 6 -4 10 -1 10 -0 7 diff --git a/geom_bottleneck/tests/data/test_322_B b/geom_bottleneck/tests/data/test_322_B deleted file mode 100644 index f829c84..0000000 --- a/geom_bottleneck/tests/data/test_322_B +++ /dev/null @@ -1,50 +0,0 @@ -1 9 -1 8 -6 12 -8 18 -9 17 -5 7 -3 8 -10 11 -10 19 -8 14 -6 8 -6 13 -3 5 -7 16 -0 5 -1 10 -1 2 -0 2 -6 7 -8 17 -4 12 -0 3 -6 8 -0 6 -9 10 -10 11 -8 15 -4 7 -1 11 -7 10 -3 11 -6 16 -2 7 -8 9 -10 18 -0 5 -1 4 -10 12 -3 9 -7 8 -10 14 -7 14 -6 13 -9 16 -5 15 -0 2 -5 12 -9 10 -2 10 -6 7 diff --git a/geom_bottleneck/tests/data/test_323_A b/geom_bottleneck/tests/data/test_323_A deleted file mode 100644 index c452dff..0000000 --- a/geom_bottleneck/tests/data/test_323_A +++ /dev/null @@ -1,50 +0,0 @@ -2 3 -8 16 -7 16 -7 8 -10 11 -2 12 -5 13 -5 14 -9 10 -7 8 -2 12 -0 9 -1 11 -6 12 -9 19 -6 12 -8 10 -7 10 -10 19 -0 2 -6 12 -2 11 -9 10 -0 9 -9 15 -4 11 -2 5 -4 10 -5 10 -0 7 -8 14 -1 4 -9 16 -1 10 -10 12 -3 10 -2 5 -2 12 -10 15 -0 7 -9 14 -7 8 -5 6 -8 18 -0 5 -0 10 -5 13 -7 11 -9 19 -4 11 diff --git a/geom_bottleneck/tests/data/test_323_B b/geom_bottleneck/tests/data/test_323_B deleted file mode 100644 index 4a7c144..0000000 --- a/geom_bottleneck/tests/data/test_323_B +++ /dev/null @@ -1,50 +0,0 @@ -3 4 -3 12 -0 3 -0 5 -2 4 -5 8 -5 10 -8 18 -6 15 -1 9 -8 15 -5 11 -8 13 -4 6 -9 18 -3 4 -10 18 -2 11 -3 10 -3 4 -9 12 -6 13 -7 15 -7 11 -6 9 -3 11 -8 11 -8 13 -9 14 -5 14 -1 7 -6 14 -0 1 -10 17 -0 3 -10 13 -0 1 -3 4 -1 7 -4 6 -7 14 -2 12 -8 10 -3 8 -8 18 -8 18 -8 14 -5 9 -10 18 -5 7 diff --git a/geom_bottleneck/tests/data/test_324_A b/geom_bottleneck/tests/data/test_324_A deleted file mode 100644 index 330da65..0000000 --- a/geom_bottleneck/tests/data/test_324_A +++ /dev/null @@ -1,50 +0,0 @@ -0 3 -8 9 -4 7 -1 5 -4 5 -5 7 -5 11 -5 9 -2 4 -9 16 -9 15 -7 13 -5 10 -3 11 -8 12 -8 14 -4 7 -6 9 -5 12 -7 11 -4 9 -8 18 -8 13 -3 9 -5 12 -3 12 -3 4 -2 3 -9 17 -0 7 -4 8 -5 13 -1 4 -1 4 -5 6 -3 12 -3 4 -8 14 -3 13 -7 10 -3 4 -9 15 -4 10 -9 17 -5 8 -2 6 -2 9 -1 3 -6 12 -0 2 diff --git a/geom_bottleneck/tests/data/test_324_B b/geom_bottleneck/tests/data/test_324_B deleted file mode 100644 index 4fb3fef..0000000 --- a/geom_bottleneck/tests/data/test_324_B +++ /dev/null @@ -1,50 +0,0 @@ -3 9 -2 3 -5 12 -1 8 -5 10 -3 5 -1 2 -6 13 -10 17 -5 14 -7 13 -2 6 -4 5 -2 12 -3 12 -4 9 -7 14 -5 7 -6 7 -4 7 -1 9 -4 13 -10 19 -2 11 -3 9 -10 16 -2 7 -3 5 -5 12 -7 14 -0 10 -4 5 -8 18 -1 5 -7 14 -4 13 -4 7 -6 9 -6 12 -2 11 -4 12 -4 5 -7 17 -8 13 -3 4 -2 6 -6 14 -5 6 -5 6 -6 13 diff --git a/geom_bottleneck/tests/data/test_325_A b/geom_bottleneck/tests/data/test_325_A deleted file mode 100644 index 0e38bad..0000000 --- a/geom_bottleneck/tests/data/test_325_A +++ /dev/null @@ -1,50 +0,0 @@ -6 9 -5 6 -7 17 -4 13 -6 12 -3 9 -3 9 -2 11 -0 3 -4 5 -6 11 -6 7 -8 12 -4 5 -10 11 -9 10 -0 3 -4 6 -0 8 -6 13 -8 12 -7 14 -0 1 -0 1 -8 9 -9 14 -10 12 -3 6 -4 5 -5 13 -10 13 -8 16 -8 16 -2 6 -3 4 -8 16 -2 6 -8 17 -7 11 -0 2 -5 12 -5 9 -5 12 -1 11 -3 10 -5 12 -5 7 -4 5 -4 6 -4 11 diff --git a/geom_bottleneck/tests/data/test_325_B b/geom_bottleneck/tests/data/test_325_B deleted file mode 100644 index 807bb12..0000000 --- a/geom_bottleneck/tests/data/test_325_B +++ /dev/null @@ -1,50 +0,0 @@ -6 12 -6 12 -5 13 -10 13 -9 16 -4 11 -9 15 -1 9 -2 3 -9 19 -5 8 -10 11 -9 15 -10 13 -9 15 -6 10 -1 5 -9 12 -5 11 -5 8 -10 19 -9 13 -2 3 -7 10 -6 8 -5 12 -7 16 -2 12 -2 6 -10 15 -0 1 -2 10 -10 11 -0 6 -6 13 -3 13 -8 12 -10 11 -10 14 -4 13 -6 13 -0 4 -9 15 -5 15 -6 13 -9 10 -10 15 -2 10 -6 16 -1 9 diff --git a/geom_bottleneck/tests/data/test_326_A b/geom_bottleneck/tests/data/test_326_A deleted file mode 100644 index 2cb897b..0000000 --- a/geom_bottleneck/tests/data/test_326_A +++ /dev/null @@ -1,50 +0,0 @@ -10 12 -3 12 -0 1 -2 7 -3 9 -6 14 -9 19 -3 7 -8 10 -1 2 -4 7 -1 4 -5 6 -10 16 -6 11 -4 9 -5 10 -5 6 -5 10 -3 6 -6 15 -3 7 -9 19 -4 6 -9 19 -4 13 -8 18 -10 12 -9 13 -1 3 -9 16 -9 10 -5 10 -6 12 -8 10 -3 9 -1 8 -7 8 -7 11 -9 13 -0 1 -9 12 -5 14 -10 13 -1 4 -0 8 -9 19 -4 11 -4 13 -7 11 diff --git a/geom_bottleneck/tests/data/test_326_B b/geom_bottleneck/tests/data/test_326_B deleted file mode 100644 index 6b37e39..0000000 --- a/geom_bottleneck/tests/data/test_326_B +++ /dev/null @@ -1,50 +0,0 @@ -1 8 -6 14 -7 9 -5 14 -8 12 -9 19 -0 5 -0 2 -9 10 -2 3 -4 9 -9 10 -9 10 -7 15 -1 4 -1 6 -9 16 -8 12 -2 9 -9 15 -7 8 -7 13 -0 1 -4 14 -7 17 -4 10 -7 12 -9 10 -5 12 -4 9 -7 8 -3 10 -10 11 -9 19 -1 2 -5 13 -6 13 -6 11 -6 8 -2 9 -5 9 -4 12 -10 18 -5 9 -9 12 -1 11 -7 8 -3 5 -7 17 -3 9 diff --git a/geom_bottleneck/tests/data/test_327_A b/geom_bottleneck/tests/data/test_327_A deleted file mode 100644 index 0d54292..0000000 --- a/geom_bottleneck/tests/data/test_327_A +++ /dev/null @@ -1,50 +0,0 @@ -8 17 -4 7 -1 11 -9 10 -4 7 -0 9 -10 13 -5 7 -2 6 -7 9 -8 9 -5 8 -4 5 -3 9 -5 13 -10 17 -1 4 -7 15 -1 6 -10 17 -3 11 -10 11 -1 6 -3 12 -5 10 -8 14 -2 11 -6 11 -9 14 -7 16 -1 9 -8 9 -0 5 -4 13 -4 5 -1 3 -10 17 -10 13 -7 11 -4 9 -7 8 -7 15 -0 10 -3 4 -2 3 -6 16 -10 18 -6 13 -9 11 -6 16 diff --git a/geom_bottleneck/tests/data/test_327_B b/geom_bottleneck/tests/data/test_327_B deleted file mode 100644 index 548eb3f..0000000 --- a/geom_bottleneck/tests/data/test_327_B +++ /dev/null @@ -1,50 +0,0 @@ -1 6 -10 11 -1 9 -6 10 -7 17 -9 11 -7 10 -6 10 -4 13 -7 17 -7 11 -3 4 -2 5 -0 8 -8 10 -7 9 -3 7 -4 12 -8 10 -4 6 -9 17 -1 2 -1 5 -6 11 -0 4 -5 8 -5 6 -7 13 -5 10 -4 5 -8 17 -10 12 -7 8 -3 13 -2 3 -3 9 -10 17 -0 1 -0 1 -9 16 -7 8 -3 4 -1 10 -4 13 -1 2 -9 10 -1 2 -5 14 -2 6 -1 5 diff --git a/geom_bottleneck/tests/data/test_328_A b/geom_bottleneck/tests/data/test_328_A deleted file mode 100644 index 810b747..0000000 --- a/geom_bottleneck/tests/data/test_328_A +++ /dev/null @@ -1,50 +0,0 @@ -2 11 -0 5 -2 6 -5 14 -1 10 -10 12 -0 1 -4 5 -1 2 -8 16 -8 9 -4 13 -2 3 -4 6 -4 14 -0 5 -5 15 -7 12 -5 8 -5 6 -10 15 -7 8 -3 9 -0 10 -4 5 -4 7 -1 9 -10 13 -0 1 -9 10 -2 9 -2 3 -8 16 -4 5 -9 11 -2 9 -7 14 -8 11 -5 8 -10 19 -4 7 -5 14 -0 5 -4 5 -2 5 -3 8 -10 20 -1 11 -4 14 -3 11 diff --git a/geom_bottleneck/tests/data/test_328_B b/geom_bottleneck/tests/data/test_328_B deleted file mode 100644 index e781d51..0000000 --- a/geom_bottleneck/tests/data/test_328_B +++ /dev/null @@ -1,50 +0,0 @@ -3 10 -5 8 -4 10 -4 5 -4 11 -4 6 -0 5 -7 11 -6 16 -3 4 -7 14 -1 7 -10 11 -10 11 -2 3 -2 11 -9 12 -2 3 -5 6 -2 4 -2 8 -7 9 -10 14 -4 13 -2 9 -10 11 -6 13 -5 8 -1 8 -7 11 -7 8 -10 17 -9 10 -3 8 -2 4 -10 14 -4 9 -10 19 -9 11 -3 5 -10 20 -9 10 -3 6 -6 15 -6 14 -9 19 -9 11 -5 12 -3 8 -3 9 diff --git a/geom_bottleneck/tests/data/test_329_A b/geom_bottleneck/tests/data/test_329_A deleted file mode 100644 index b02fd14..0000000 --- a/geom_bottleneck/tests/data/test_329_A +++ /dev/null @@ -1,50 +0,0 @@ -8 13 -4 13 -0 1 -6 12 -3 12 -0 1 -7 8 -4 12 -2 6 -7 11 -4 8 -3 5 -2 6 -5 12 -2 12 -1 10 -3 10 -2 3 -3 10 -3 4 -2 4 -7 8 -9 16 -3 5 -5 6 -6 11 -3 12 -2 4 -10 11 -8 11 -8 11 -2 9 -0 6 -4 7 -0 1 -2 3 -2 5 -8 16 -8 9 -2 11 -6 16 -6 12 -10 17 -6 11 -3 9 -2 9 -10 11 -9 12 -4 5 -2 6 diff --git a/geom_bottleneck/tests/data/test_329_B b/geom_bottleneck/tests/data/test_329_B deleted file mode 100644 index 0ca3fcd..0000000 --- a/geom_bottleneck/tests/data/test_329_B +++ /dev/null @@ -1,50 +0,0 @@ -0 9 -5 6 -0 5 -9 12 -10 20 -9 12 -7 14 -9 19 -2 3 -5 14 -0 4 -2 3 -8 9 -0 5 -2 5 -9 10 -3 4 -1 7 -7 13 -10 13 -2 11 -9 18 -0 5 -5 13 -1 9 -10 19 -3 5 -2 6 -0 4 -8 13 -10 11 -5 13 -0 2 -0 1 -6 16 -5 8 -8 9 -2 10 -0 3 -4 14 -8 11 -7 14 -1 2 -1 3 -3 5 -3 10 -9 17 -3 6 -3 4 -1 10 diff --git a/geom_bottleneck/tests/data/test_330_A b/geom_bottleneck/tests/data/test_330_A deleted file mode 100644 index 4cdb2c9..0000000 --- a/geom_bottleneck/tests/data/test_330_A +++ /dev/null @@ -1,50 +0,0 @@ -7 13 -2 8 -2 4 -5 15 -4 10 -9 17 -2 9 -9 12 -6 7 -6 7 -5 15 -4 5 -5 6 -4 6 -0 7 -4 7 -0 2 -8 18 -1 11 -10 11 -5 13 -3 5 -3 11 -0 1 -1 2 -10 14 -1 6 -2 3 -5 15 -3 13 -8 10 -6 15 -10 14 -3 10 -7 17 -4 14 -2 8 -10 11 -9 18 -10 15 -6 12 -4 8 -0 7 -9 11 -6 7 -1 8 -10 15 -0 6 -1 7 -7 16 diff --git a/geom_bottleneck/tests/data/test_330_B b/geom_bottleneck/tests/data/test_330_B deleted file mode 100644 index 01f1570..0000000 --- a/geom_bottleneck/tests/data/test_330_B +++ /dev/null @@ -1,50 +0,0 @@ -7 10 -4 5 -2 9 -1 2 -7 10 -4 6 -1 9 -6 16 -0 1 -9 14 -6 11 -10 16 -6 9 -0 6 -0 5 -10 12 -4 14 -7 8 -0 3 -9 18 -8 14 -4 7 -1 9 -2 5 -8 9 -9 10 -2 6 -1 11 -2 8 -4 10 -0 4 -2 9 -3 4 -0 10 -5 14 -4 12 -5 11 -4 7 -2 9 -7 16 -8 14 -8 12 -2 9 -4 11 -4 7 -0 1 -6 7 -5 6 -4 12 -2 4 diff --git a/geom_bottleneck/tests/data/test_331_A b/geom_bottleneck/tests/data/test_331_A deleted file mode 100644 index a271a66..0000000 --- a/geom_bottleneck/tests/data/test_331_A +++ /dev/null @@ -1,50 +0,0 @@ -10 17 -0 8 -5 8 -10 11 -8 9 -10 13 -10 20 -6 7 -7 12 -0 8 -4 7 -0 10 -8 9 -1 9 -3 8 -10 12 -7 12 -9 18 -6 13 -3 9 -5 9 -6 7 -9 18 -10 17 -6 14 -4 8 -5 14 -10 17 -10 11 -7 16 -5 11 -8 10 -7 14 -6 8 -10 17 -7 8 -3 5 -0 2 -4 10 -8 9 -1 2 -3 12 -1 4 -2 6 -0 1 -0 10 -9 10 -5 6 -5 9 -10 15 diff --git a/geom_bottleneck/tests/data/test_331_B b/geom_bottleneck/tests/data/test_331_B deleted file mode 100644 index 72a1a7b..0000000 --- a/geom_bottleneck/tests/data/test_331_B +++ /dev/null @@ -1,50 +0,0 @@ -5 6 -9 13 -9 17 -8 9 -8 18 -4 14 -8 9 -6 9 -1 5 -8 15 -6 7 -0 1 -5 12 -9 15 -10 16 -2 4 -3 6 -10 14 -10 13 -3 10 -7 13 -9 13 -6 16 -2 3 -6 10 -8 12 -0 9 -2 3 -5 13 -10 12 -1 5 -5 11 -2 6 -1 10 -7 11 -4 5 -5 14 -1 10 -10 15 -3 11 -2 6 -4 10 -6 13 -1 9 -3 10 -6 15 -2 8 -8 14 -4 7 -9 14 diff --git a/geom_bottleneck/tests/data/test_332_A b/geom_bottleneck/tests/data/test_332_A deleted file mode 100644 index c1e999a..0000000 --- a/geom_bottleneck/tests/data/test_332_A +++ /dev/null @@ -1,50 +0,0 @@ -5 13 -10 20 -4 5 -4 5 -3 13 -9 13 -6 8 -10 11 -3 8 -6 9 -4 5 -2 10 -10 17 -4 13 -8 12 -7 13 -2 4 -10 16 -3 11 -7 16 -5 6 -5 11 -3 6 -8 10 -2 3 -6 9 -1 3 -5 9 -7 16 -6 11 -4 14 -6 15 -10 18 -10 15 -1 10 -2 12 -6 14 -3 12 -0 5 -5 8 -4 14 -9 13 -7 14 -8 9 -8 17 -9 19 -6 15 -5 15 -1 8 -7 12 diff --git a/geom_bottleneck/tests/data/test_332_B b/geom_bottleneck/tests/data/test_332_B deleted file mode 100644 index 1f4686e..0000000 --- a/geom_bottleneck/tests/data/test_332_B +++ /dev/null @@ -1,50 +0,0 @@ -10 11 -5 11 -0 10 -5 9 -4 7 -10 14 -7 12 -10 19 -1 7 -4 8 -3 12 -10 20 -0 3 -4 11 -8 11 -3 13 -0 9 -6 8 -4 12 -6 9 -5 8 -9 12 -7 12 -8 14 -6 11 -0 5 -4 7 -10 19 -9 10 -10 11 -4 8 -10 14 -2 11 -10 11 -3 5 -0 6 -10 20 -9 19 -5 14 -4 11 -7 9 -9 15 -2 3 -2 4 -8 14 -10 14 -9 16 -2 7 -9 17 -7 13 diff --git a/geom_bottleneck/tests/data/test_333_A b/geom_bottleneck/tests/data/test_333_A deleted file mode 100644 index c1cc126..0000000 --- a/geom_bottleneck/tests/data/test_333_A +++ /dev/null @@ -1,50 +0,0 @@ -7 12 -4 10 -2 5 -3 12 -8 15 -0 9 -0 6 -9 12 -6 16 -10 18 -5 13 -10 11 -2 3 -9 14 -10 19 -2 11 -9 10 -5 15 -9 19 -1 2 -7 8 -1 5 -8 10 -8 9 -2 3 -7 8 -3 4 -2 6 -0 10 -10 17 -7 16 -6 8 -1 2 -9 10 -10 19 -4 5 -4 10 -2 4 -8 11 -2 7 -2 7 -0 5 -3 7 -7 16 -5 15 -4 11 -7 16 -0 6 -7 8 -1 2 diff --git a/geom_bottleneck/tests/data/test_333_B b/geom_bottleneck/tests/data/test_333_B deleted file mode 100644 index fd22364..0000000 --- a/geom_bottleneck/tests/data/test_333_B +++ /dev/null @@ -1,50 +0,0 @@ -0 3 -10 20 -6 13 -9 16 -3 4 -4 13 -2 3 -3 8 -5 13 -10 11 -3 5 -3 5 -7 10 -1 4 -1 2 -8 18 -0 10 -6 16 -5 8 -7 15 -4 10 -1 11 -5 9 -5 13 -1 2 -1 9 -3 8 -6 16 -7 8 -0 8 -9 15 -4 5 -10 11 -0 5 -2 5 -1 8 -10 16 -2 9 -8 14 -6 10 -9 18 -7 8 -9 16 -4 12 -10 15 -3 10 -6 10 -2 5 -4 14 -3 4 diff --git a/geom_bottleneck/tests/data/test_334_A b/geom_bottleneck/tests/data/test_334_A deleted file mode 100644 index 914d6c3..0000000 --- a/geom_bottleneck/tests/data/test_334_A +++ /dev/null @@ -1,50 +0,0 @@ -8 13 -10 20 -2 3 -7 15 -9 17 -2 12 -5 6 -2 5 -6 13 -10 20 -3 8 -1 9 -3 13 -10 11 -1 5 -7 11 -5 15 -5 6 -9 11 -3 5 -3 8 -6 16 -8 12 -4 7 -0 4 -8 12 -5 15 -9 14 -5 6 -3 4 -1 8 -2 7 -4 7 -8 18 -3 9 -0 5 -0 10 -8 10 -8 14 -3 13 -3 9 -9 17 -5 15 -7 16 -1 9 -0 2 -1 9 -9 12 -5 13 -9 19 diff --git a/geom_bottleneck/tests/data/test_334_B b/geom_bottleneck/tests/data/test_334_B deleted file mode 100644 index 27524b9..0000000 --- a/geom_bottleneck/tests/data/test_334_B +++ /dev/null @@ -1,50 +0,0 @@ -10 11 -9 14 -2 11 -10 17 -9 15 -4 9 -7 16 -9 12 -8 12 -7 11 -6 16 -3 12 -0 4 -9 15 -3 10 -2 9 -2 3 -6 7 -3 9 -5 8 -6 8 -4 5 -9 14 -6 10 -1 10 -10 12 -8 10 -7 12 -3 9 -4 9 -4 11 -5 10 -9 11 -7 8 -6 16 -8 17 -9 14 -4 14 -2 4 -1 2 -9 11 -7 13 -9 10 -2 9 -2 12 -2 4 -9 16 -7 17 -3 11 -8 9 diff --git a/geom_bottleneck/tests/data/test_335_A b/geom_bottleneck/tests/data/test_335_A deleted file mode 100644 index 1a400bc..0000000 --- a/geom_bottleneck/tests/data/test_335_A +++ /dev/null @@ -1,50 +0,0 @@ -0 2 -6 11 -7 11 -7 12 -7 11 -9 10 -6 14 -4 5 -5 7 -7 16 -2 3 -10 15 -10 19 -9 16 -6 15 -7 14 -8 18 -7 15 -8 14 -10 11 -10 11 -5 9 -0 10 -9 11 -9 19 -0 6 -2 10 -8 15 -1 7 -5 12 -3 4 -1 6 -0 2 -9 16 -9 19 -10 16 -6 9 -1 9 -6 7 -9 10 -8 14 -4 8 -9 10 -1 10 -5 6 -9 11 -7 16 -0 9 -7 13 -7 9 diff --git a/geom_bottleneck/tests/data/test_335_B b/geom_bottleneck/tests/data/test_335_B deleted file mode 100644 index 93c3211..0000000 --- a/geom_bottleneck/tests/data/test_335_B +++ /dev/null @@ -1,50 +0,0 @@ -8 14 -9 15 -6 11 -4 14 -2 3 -7 13 -5 11 -8 14 -1 8 -9 12 -0 10 -3 5 -10 11 -0 2 -5 13 -6 12 -8 11 -4 10 -5 14 -6 15 -9 19 -4 6 -4 5 -9 16 -5 9 -5 6 -7 14 -9 11 -9 18 -1 9 -1 4 -6 12 -2 10 -8 14 -1 11 -2 4 -9 16 -3 9 -2 11 -7 12 -6 9 -0 8 -9 17 -9 15 -10 12 -0 7 -6 9 -8 13 -10 18 -6 15 diff --git a/geom_bottleneck/tests/data/test_336_A b/geom_bottleneck/tests/data/test_336_A deleted file mode 100644 index 5410dc3..0000000 --- a/geom_bottleneck/tests/data/test_336_A +++ /dev/null @@ -1,50 +0,0 @@ -4 7 -9 16 -2 5 -0 8 -0 9 -10 11 -7 11 -2 3 -6 13 -6 9 -2 8 -7 16 -2 6 -5 14 -6 9 -7 17 -1 8 -0 4 -7 13 -9 13 -10 16 -0 2 -7 16 -8 17 -7 11 -6 7 -2 12 -5 12 -9 17 -6 7 -1 5 -9 12 -7 10 -6 11 -7 16 -6 11 -6 7 -2 6 -1 8 -10 14 -5 6 -2 7 -5 6 -2 11 -8 10 -6 10 -3 12 -3 11 -8 12 -8 10 diff --git a/geom_bottleneck/tests/data/test_336_B b/geom_bottleneck/tests/data/test_336_B deleted file mode 100644 index 8b60a46..0000000 --- a/geom_bottleneck/tests/data/test_336_B +++ /dev/null @@ -1,50 +0,0 @@ -6 15 -8 10 -0 10 -5 10 -1 10 -8 17 -2 9 -7 9 -9 12 -7 8 -8 9 -7 8 -4 14 -10 17 -3 8 -2 7 -1 10 -6 13 -9 16 -6 13 -2 4 -4 12 -2 3 -3 10 -6 13 -6 11 -6 13 -9 17 -4 5 -0 1 -5 6 -0 7 -1 8 -5 9 -0 7 -0 3 -8 10 -4 6 -10 16 -1 9 -1 10 -7 12 -1 3 -6 10 -5 6 -9 10 -6 7 -5 7 -8 12 -0 9 diff --git a/geom_bottleneck/tests/data/test_337_A b/geom_bottleneck/tests/data/test_337_A deleted file mode 100644 index 652b5f1..0000000 --- a/geom_bottleneck/tests/data/test_337_A +++ /dev/null @@ -1,50 +0,0 @@ -3 5 -1 2 -6 14 -10 18 -3 10 -1 11 -1 7 -2 11 -1 2 -0 7 -2 8 -9 14 -8 10 -1 3 -5 11 -7 8 -6 14 -8 17 -2 10 -7 15 -0 2 -4 12 -10 18 -10 11 -2 6 -3 9 -0 4 -5 15 -4 10 -8 14 -5 12 -10 11 -9 16 -9 14 -3 4 -3 5 -1 10 -3 4 -10 11 -1 6 -6 10 -1 8 -9 10 -1 6 -5 6 -5 6 -3 13 -10 19 -5 9 -4 12 diff --git a/geom_bottleneck/tests/data/test_337_B b/geom_bottleneck/tests/data/test_337_B deleted file mode 100644 index eba21bc..0000000 --- a/geom_bottleneck/tests/data/test_337_B +++ /dev/null @@ -1,50 +0,0 @@ -0 7 -2 4 -5 14 -7 8 -10 18 -4 13 -2 9 -8 16 -1 9 -5 9 -6 13 -0 1 -10 17 -4 9 -8 15 -1 9 -9 17 -5 14 -7 14 -5 12 -9 18 -8 15 -3 12 -7 17 -1 4 -5 7 -5 15 -3 6 -2 5 -1 2 -4 6 -6 15 -3 7 -4 5 -1 9 -7 8 -10 14 -9 18 -9 13 -9 11 -2 6 -8 10 -2 8 -0 9 -0 10 -1 5 -0 1 -6 9 -6 10 -0 3 diff --git a/geom_bottleneck/tests/data/test_338_A b/geom_bottleneck/tests/data/test_338_A deleted file mode 100644 index 567256f..0000000 --- a/geom_bottleneck/tests/data/test_338_A +++ /dev/null @@ -1,50 +0,0 @@ -9 16 -3 6 -8 18 -7 15 -5 7 -8 14 -2 6 -10 12 -1 5 -5 8 -2 11 -1 3 -7 15 -5 13 -10 16 -1 11 -4 6 -7 8 -4 5 -5 11 -7 12 -6 12 -7 15 -8 16 -4 14 -1 6 -4 13 -3 12 -0 1 -3 6 -4 5 -4 11 -8 9 -0 7 -2 10 -9 17 -1 11 -5 9 -1 8 -10 11 -1 7 -6 8 -7 16 -1 4 -10 17 -2 8 -6 10 -10 14 -1 11 -5 15 diff --git a/geom_bottleneck/tests/data/test_338_B b/geom_bottleneck/tests/data/test_338_B deleted file mode 100644 index 82c3d80..0000000 --- a/geom_bottleneck/tests/data/test_338_B +++ /dev/null @@ -1,50 +0,0 @@ -1 2 -10 14 -5 6 -8 17 -9 17 -1 6 -4 10 -3 13 -7 15 -5 6 -8 10 -2 5 -3 13 -5 15 -2 4 -8 10 -2 9 -1 3 -6 12 -3 6 -2 12 -2 10 -3 11 -0 2 -4 12 -7 12 -3 5 -6 7 -9 17 -8 9 -3 12 -10 20 -2 10 -3 5 -2 11 -7 17 -3 12 -2 6 -9 11 -4 12 -0 8 -9 11 -1 4 -2 7 -7 16 -0 8 -4 13 -4 5 -8 14 -8 11 diff --git a/geom_bottleneck/tests/data/test_339_A b/geom_bottleneck/tests/data/test_339_A deleted file mode 100644 index 9148a9c..0000000 --- a/geom_bottleneck/tests/data/test_339_A +++ /dev/null @@ -1,50 +0,0 @@ -3 4 -10 13 -6 8 -8 10 -2 3 -3 6 -10 19 -6 14 -6 9 -0 8 -5 7 -10 15 -9 17 -2 3 -9 14 -6 14 -1 11 -4 9 -2 3 -9 16 -6 11 -3 8 -6 9 -10 12 -1 3 -3 13 -7 14 -4 9 -8 11 -7 9 -1 2 -9 11 -8 17 -0 2 -9 19 -5 14 -6 8 -10 14 -7 13 -0 10 -4 5 -0 9 -2 9 -0 5 -9 15 -3 9 -3 7 -7 16 -1 2 -10 18 diff --git a/geom_bottleneck/tests/data/test_339_B b/geom_bottleneck/tests/data/test_339_B deleted file mode 100644 index 385967f..0000000 --- a/geom_bottleneck/tests/data/test_339_B +++ /dev/null @@ -1,50 +0,0 @@ -2 9 -3 4 -1 5 -8 12 -8 12 -5 14 -4 9 -4 10 -5 8 -3 8 -9 10 -0 3 -1 10 -0 7 -6 13 -4 7 -10 20 -7 8 -5 8 -9 18 -1 6 -5 8 -4 8 -7 12 -7 17 -10 18 -9 10 -8 16 -8 13 -7 16 -9 18 -0 1 -7 8 -3 13 -3 4 -1 8 -6 14 -5 14 -3 6 -6 9 -7 15 -5 13 -6 15 -2 12 -9 19 -7 15 -0 4 -3 12 -9 11 -10 11 diff --git a/geom_bottleneck/tests/data/test_340_A b/geom_bottleneck/tests/data/test_340_A deleted file mode 100644 index 4af25b1..0000000 --- a/geom_bottleneck/tests/data/test_340_A +++ /dev/null @@ -1,100 +0,0 @@ -0 5 -10 19 -1 4 -6 9 -1 6 -3 11 -4 10 -9 12 -1 10 -7 12 -8 11 -3 4 -8 18 -9 15 -0 2 -9 12 -1 6 -0 8 -4 5 -2 10 -0 2 -4 10 -6 7 -7 13 -2 3 -0 9 -5 6 -0 10 -5 7 -6 15 -9 15 -1 2 -2 3 -9 14 -8 18 -4 10 -7 15 -5 8 -3 11 -10 14 -4 12 -8 13 -8 17 -2 4 -0 9 -10 19 -3 4 -0 5 -8 15 -1 9 -8 11 -9 16 -0 1 -3 6 -4 6 -2 9 -3 9 -5 11 -1 8 -6 12 -10 19 -5 6 -3 12 -0 2 -9 17 -0 3 -0 4 -10 20 -8 14 -2 10 -3 7 -7 12 -2 4 -8 9 -1 7 -3 13 -1 5 -6 7 -10 13 -9 10 -6 15 -9 11 -0 10 -6 8 -8 9 -5 9 -10 16 -5 11 -7 13 -2 6 -2 3 -5 7 -4 10 -9 19 -7 10 -1 8 -2 9 -10 13 -10 12 -7 11 diff --git a/geom_bottleneck/tests/data/test_340_B b/geom_bottleneck/tests/data/test_340_B deleted file mode 100644 index 0e3fa2a..0000000 --- a/geom_bottleneck/tests/data/test_340_B +++ /dev/null @@ -1,100 +0,0 @@ -7 11 -8 16 -1 4 -8 12 -9 19 -2 5 -2 8 -2 9 -0 4 -1 9 -5 7 -5 9 -10 14 -1 9 -3 10 -0 8 -10 11 -2 10 -2 11 -9 15 -0 1 -0 10 -3 10 -5 12 -5 12 -1 2 -7 12 -0 1 -1 4 -6 15 -1 5 -9 13 -9 17 -9 19 -8 9 -4 6 -1 10 -5 9 -2 3 -7 8 -1 5 -1 4 -8 9 -6 14 -2 9 -1 8 -4 10 -8 10 -1 11 -7 10 -8 13 -5 9 -9 19 -8 9 -3 6 -10 11 -7 8 -3 8 -6 9 -4 12 -10 19 -5 8 -1 9 -8 13 -2 4 -1 8 -7 16 -3 9 -0 3 -1 4 -8 17 -8 9 -5 12 -9 19 -2 8 -0 1 -1 2 -6 10 -1 7 -7 15 -4 8 -2 5 -3 13 -4 7 -9 12 -8 15 -10 12 -9 12 -5 13 -6 15 -1 3 -4 9 -9 16 -7 8 -2 12 -10 19 -1 9 -2 5 -5 6 -9 12 diff --git a/geom_bottleneck/tests/data/test_341_A b/geom_bottleneck/tests/data/test_341_A deleted file mode 100644 index 932688b..0000000 --- a/geom_bottleneck/tests/data/test_341_A +++ /dev/null @@ -1,100 +0,0 @@ -6 15 -6 7 -3 11 -8 15 -2 10 -10 13 -6 16 -9 10 -8 15 -3 12 -10 14 -1 8 -8 17 -1 8 -4 10 -7 12 -1 10 -7 10 -8 18 -3 5 -1 3 -1 6 -0 3 -10 19 -8 18 -4 7 -1 3 -2 8 -1 10 -4 13 -10 13 -10 17 -0 4 -6 12 -4 5 -3 8 -2 4 -4 10 -5 11 -9 14 -5 15 -2 11 -4 12 -5 11 -7 16 -5 7 -4 7 -6 7 -2 6 -3 12 -10 15 -7 12 -1 9 -0 1 -5 8 -1 8 -5 12 -1 3 -2 3 -4 10 -2 10 -10 19 -2 3 -4 13 -10 14 -3 4 -0 10 -5 7 -10 11 -8 11 -6 11 -7 17 -3 4 -0 6 -9 11 -3 12 -5 12 -9 10 -6 8 -4 11 -3 7 -2 6 -9 10 -8 18 -10 11 -2 9 -4 9 -4 13 -0 5 -10 17 -5 6 -6 16 -0 3 -0 8 -5 15 -5 12 -3 10 -8 11 -10 17 -4 6 diff --git a/geom_bottleneck/tests/data/test_341_B b/geom_bottleneck/tests/data/test_341_B deleted file mode 100644 index 68cc4b9..0000000 --- a/geom_bottleneck/tests/data/test_341_B +++ /dev/null @@ -1,100 +0,0 @@ -9 15 -10 18 -2 5 -5 7 -3 13 -6 13 -0 1 -2 12 -2 11 -3 4 -3 5 -1 9 -4 7 -10 12 -3 8 -9 17 -10 20 -5 7 -3 5 -9 18 -9 12 -3 5 -0 7 -1 2 -6 14 -7 8 -0 2 -3 11 -10 18 -7 10 -0 4 -10 11 -6 12 -8 16 -7 17 -0 8 -0 10 -9 16 -8 15 -5 6 -5 10 -4 8 -4 10 -1 11 -6 7 -6 9 -1 10 -3 5 -10 20 -10 11 -2 8 -10 13 -9 14 -8 11 -10 11 -7 16 -8 10 -8 17 -5 14 -0 7 -7 8 -4 8 -6 14 -2 5 -10 15 -2 10 -2 4 -8 13 -6 14 -2 3 -7 8 -8 13 -4 8 -1 6 -1 9 -0 1 -7 14 -10 11 -2 7 -5 15 -0 4 -1 7 -0 6 -6 13 -6 15 -1 2 -2 4 -8 9 -0 1 -3 4 -8 9 -9 11 -9 16 -8 17 -1 3 -8 10 -8 9 -8 15 -1 3 -7 16 diff --git a/geom_bottleneck/tests/data/test_342_A b/geom_bottleneck/tests/data/test_342_A deleted file mode 100644 index 04cdc19..0000000 --- a/geom_bottleneck/tests/data/test_342_A +++ /dev/null @@ -1,100 +0,0 @@ -4 8 -4 5 -1 9 -4 13 -2 10 -7 15 -6 7 -8 17 -1 8 -6 7 -9 19 -8 12 -10 18 -5 7 -8 13 -9 12 -9 14 -1 2 -7 11 -9 11 -6 15 -2 12 -6 10 -0 7 -1 10 -2 5 -8 11 -3 13 -3 11 -3 10 -6 14 -1 10 -4 6 -3 13 -5 10 -3 9 -9 16 -3 4 -0 2 -9 10 -10 16 -5 12 -6 11 -4 7 -9 18 -10 16 -5 7 -6 12 -0 7 -5 9 -8 18 -4 7 -2 6 -8 17 -7 10 -7 10 -6 11 -8 9 -3 7 -8 16 -4 9 -6 12 -0 6 -4 12 -10 15 -10 17 -10 20 -3 11 -2 12 -0 9 -3 12 -4 5 -5 7 -3 7 -0 4 -5 9 -1 7 -6 13 -9 13 -8 9 -0 6 -3 10 -1 11 -0 2 -0 6 -3 9 -2 7 -4 7 -8 14 -2 7 -2 4 -4 7 -1 7 -10 13 -6 16 -5 15 -7 17 -7 10 -3 5 -7 10 diff --git a/geom_bottleneck/tests/data/test_342_B b/geom_bottleneck/tests/data/test_342_B deleted file mode 100644 index e6aae99..0000000 --- a/geom_bottleneck/tests/data/test_342_B +++ /dev/null @@ -1,100 +0,0 @@ -9 16 -6 15 -1 4 -0 1 -3 5 -2 3 -10 20 -3 7 -0 10 -3 13 -7 8 -4 6 -7 14 -8 9 -8 14 -10 20 -1 9 -4 14 -4 5 -2 6 -6 8 -1 10 -7 14 -8 10 -4 8 -7 8 -7 12 -6 16 -6 7 -9 19 -8 12 -1 9 -1 3 -10 16 -3 6 -2 8 -0 2 -7 15 -2 3 -8 13 -5 8 -1 2 -10 11 -4 11 -5 12 -10 15 -7 8 -2 5 -6 13 -8 17 -8 14 -4 8 -6 11 -5 6 -0 7 -0 5 -8 13 -1 2 -6 11 -6 11 -8 9 -4 5 -4 8 -0 5 -3 9 -1 3 -8 9 -10 16 -8 17 -8 17 -3 4 -3 5 -8 12 -9 10 -9 10 -8 14 -3 10 -5 9 -1 4 -9 19 -0 2 -7 8 -6 8 -7 12 -6 12 -0 1 -9 11 -3 11 -5 6 -0 8 -2 4 -1 7 -3 4 -0 3 -9 17 -2 9 -1 6 -2 6 -7 15 -1 4 diff --git a/geom_bottleneck/tests/data/test_343_A b/geom_bottleneck/tests/data/test_343_A deleted file mode 100644 index 9759369..0000000 --- a/geom_bottleneck/tests/data/test_343_A +++ /dev/null @@ -1,100 +0,0 @@ -5 13 -5 9 -2 3 -6 14 -1 2 -3 6 -1 3 -9 14 -0 6 -1 8 -9 10 -4 5 -10 19 -6 13 -7 8 -10 16 -6 7 -10 18 -8 11 -2 8 -8 9 -5 10 -1 2 -10 14 -10 12 -8 17 -7 12 -9 12 -1 5 -2 4 -8 13 -2 11 -0 5 -4 8 -2 12 -2 10 -6 15 -1 2 -8 11 -8 18 -8 9 -7 9 -5 7 -0 10 -4 10 -5 13 -8 16 -5 11 -8 16 -7 9 -2 11 -8 12 -8 10 -9 16 -7 8 -5 15 -0 1 -6 7 -7 8 -6 7 -7 13 -9 16 -9 15 -3 11 -4 10 -2 10 -3 13 -0 1 -7 10 -9 10 -8 10 -3 4 -1 4 -1 6 -4 7 -4 10 -6 11 -10 13 -7 10 -9 14 -9 15 -7 9 -3 10 -6 8 -5 15 -8 11 -7 14 -8 18 -9 13 -9 15 -10 17 -3 13 -5 7 -8 16 -4 12 -9 10 -6 12 -1 9 -0 6 -5 11 diff --git a/geom_bottleneck/tests/data/test_343_B b/geom_bottleneck/tests/data/test_343_B deleted file mode 100644 index e338ab2..0000000 --- a/geom_bottleneck/tests/data/test_343_B +++ /dev/null @@ -1,100 +0,0 @@ -2 12 -5 9 -5 6 -10 19 -2 6 -6 14 -8 18 -6 9 -2 10 -5 7 -0 6 -7 10 -7 14 -10 15 -10 16 -6 16 -7 16 -3 8 -2 4 -2 11 -10 19 -7 15 -8 9 -7 11 -10 20 -9 11 -3 6 -6 15 -5 14 -2 3 -1 3 -5 11 -3 8 -2 9 -1 3 -10 20 -6 11 -0 9 -6 9 -0 5 -9 10 -2 7 -8 14 -9 19 -2 7 -10 11 -0 6 -4 7 -10 16 -9 12 -7 16 -5 12 -1 8 -4 12 -1 2 -1 8 -9 13 -9 14 -8 9 -4 9 -4 11 -9 19 -5 15 -2 3 -9 10 -8 15 -7 8 -9 10 -5 12 -2 12 -0 1 -3 4 -3 5 -5 14 -10 18 -3 10 -0 1 -9 10 -4 6 -10 18 -9 17 -6 7 -8 15 -3 11 -7 8 -6 12 -5 11 -0 10 -5 8 -6 15 -6 13 -0 4 -4 13 -6 9 -0 1 -0 1 -3 10 -8 17 -0 8 -9 18 diff --git a/geom_bottleneck/tests/data/test_344_A b/geom_bottleneck/tests/data/test_344_A deleted file mode 100644 index e8e81ab..0000000 --- a/geom_bottleneck/tests/data/test_344_A +++ /dev/null @@ -1,100 +0,0 @@ -2 11 -2 7 -2 7 -1 11 -2 6 -0 9 -2 8 -2 12 -0 9 -5 10 -6 10 -2 4 -9 19 -0 6 -0 6 -9 18 -6 7 -3 13 -3 9 -1 4 -1 9 -1 11 -9 19 -8 9 -7 13 -5 13 -10 14 -10 12 -1 3 -10 17 -2 4 -8 9 -8 18 -7 15 -3 13 -10 19 -0 2 -0 10 -2 7 -5 6 -9 14 -0 4 -7 14 -10 11 -3 5 -0 2 -8 18 -4 5 -10 16 -9 18 -6 16 -4 8 -3 4 -2 7 -4 14 -4 10 -4 10 -10 14 -8 9 -7 16 -1 7 -4 14 -6 7 -3 4 -9 10 -2 3 -7 13 -10 13 -10 14 -3 8 -0 6 -3 4 -1 10 -6 12 -4 6 -3 9 -3 9 -5 11 -10 13 -2 5 -9 16 -4 14 -3 5 -0 1 -10 19 -9 16 -10 14 -0 4 -1 3 -6 8 -7 14 -1 11 -0 6 -1 5 -8 9 -8 11 -7 16 -10 11 -1 7 -2 12 diff --git a/geom_bottleneck/tests/data/test_344_B b/geom_bottleneck/tests/data/test_344_B deleted file mode 100644 index af72be5..0000000 --- a/geom_bottleneck/tests/data/test_344_B +++ /dev/null @@ -1,100 +0,0 @@ -10 11 -8 9 -3 12 -2 10 -1 6 -4 8 -8 11 -7 17 -8 18 -9 10 -5 6 -2 9 -8 10 -1 8 -3 13 -5 12 -8 14 -7 14 -2 12 -10 15 -0 7 -7 8 -8 17 -8 10 -4 8 -6 7 -6 8 -2 3 -5 15 -2 11 -10 18 -6 13 -1 2 -6 16 -2 8 -8 11 -9 18 -8 14 -6 16 -10 20 -8 9 -0 7 -1 5 -7 16 -10 17 -1 2 -2 5 -2 6 -3 4 -7 9 -5 8 -5 7 -5 7 -1 11 -7 10 -7 17 -7 14 -5 7 -10 20 -0 2 -5 9 -0 1 -4 12 -5 6 -5 6 -2 9 -0 10 -10 11 -2 7 -8 9 -5 6 -0 2 -4 10 -6 13 -5 15 -9 11 -3 9 -6 10 -0 4 -6 9 -6 16 -10 15 -6 16 -0 8 -4 12 -10 15 -6 11 -8 11 -8 9 -3 12 -4 11 -5 11 -10 14 -9 14 -3 12 -7 8 -2 7 -8 12 -8 9 -4 12 diff --git a/geom_bottleneck/tests/data/test_345_A b/geom_bottleneck/tests/data/test_345_A deleted file mode 100644 index 584e4ed..0000000 --- a/geom_bottleneck/tests/data/test_345_A +++ /dev/null @@ -1,100 +0,0 @@ -2 6 -6 16 -7 11 -0 4 -4 5 -3 9 -9 10 -6 12 -1 3 -9 16 -6 15 -10 14 -4 6 -6 7 -1 7 -2 8 -3 10 -9 10 -0 10 -0 1 -10 11 -3 8 -4 10 -9 15 -6 9 -0 3 -1 7 -1 3 -4 5 -8 12 -2 3 -6 14 -8 14 -1 9 -10 17 -4 5 -3 7 -9 10 -4 7 -7 12 -10 11 -6 11 -0 7 -6 8 -5 15 -1 5 -7 11 -5 7 -10 11 -9 14 -0 3 -8 12 -10 20 -0 10 -5 14 -5 8 -9 10 -3 12 -0 8 -1 11 -3 6 -3 5 -10 14 -3 12 -5 9 -5 13 -6 16 -7 15 -9 17 -7 12 -1 10 -7 10 -6 8 -3 12 -4 12 -5 9 -1 7 -7 16 -8 10 -1 11 -2 11 -4 10 -7 8 -5 15 -2 5 -3 10 -8 12 -9 12 -2 3 -0 3 -10 12 -0 10 -10 14 -4 6 -10 11 -8 17 -6 8 -10 16 -9 18 -5 7 diff --git a/geom_bottleneck/tests/data/test_345_B b/geom_bottleneck/tests/data/test_345_B deleted file mode 100644 index 8c3e758..0000000 --- a/geom_bottleneck/tests/data/test_345_B +++ /dev/null @@ -1,100 +0,0 @@ -2 5 -8 13 -1 3 -4 13 -3 12 -1 9 -8 14 -4 13 -9 14 -8 14 -7 16 -8 14 -7 8 -0 9 -3 12 -9 14 -9 10 -2 3 -3 6 -6 15 -9 15 -6 12 -0 6 -9 12 -4 9 -5 14 -9 13 -8 9 -5 15 -2 7 -8 10 -0 2 -7 11 -5 10 -7 15 -5 6 -1 8 -7 9 -9 15 -3 10 -1 2 -3 6 -0 5 -6 16 -2 8 -9 10 -4 11 -2 3 -4 8 -5 11 -9 15 -2 7 -5 14 -10 18 -1 3 -9 14 -10 16 -3 8 -9 14 -1 3 -9 13 -2 7 -1 2 -7 13 -1 8 -2 5 -4 5 -3 5 -1 2 -10 13 -6 16 -10 15 -1 7 -10 12 -0 10 -7 12 -9 14 -4 5 -4 5 -6 9 -9 19 -5 12 -9 10 -9 19 -10 18 -8 11 -7 17 -0 3 -3 13 -3 11 -4 8 -6 11 -1 6 -0 9 -9 12 -8 13 -1 10 -7 13 -6 12 -4 8 diff --git a/geom_bottleneck/tests/data/test_346_A b/geom_bottleneck/tests/data/test_346_A deleted file mode 100644 index ab26e2f..0000000 --- a/geom_bottleneck/tests/data/test_346_A +++ /dev/null @@ -1,100 +0,0 @@ -10 11 -1 11 -1 9 -0 5 -1 3 -10 18 -0 5 -4 5 -1 8 -8 16 -5 6 -9 13 -6 13 -4 5 -7 14 -8 9 -4 5 -9 11 -6 9 -9 18 -10 15 -8 15 -10 12 -3 7 -10 14 -3 9 -10 12 -3 9 -0 10 -5 8 -7 17 -8 11 -6 7 -10 17 -0 8 -0 1 -0 9 -8 10 -7 15 -8 17 -0 4 -0 3 -10 11 -7 10 -4 13 -4 9 -3 4 -4 5 -4 12 -4 11 -5 11 -3 4 -10 16 -0 2 -0 6 -8 10 -9 11 -7 15 -7 9 -5 11 -9 15 -7 8 -7 16 -4 14 -2 3 -5 8 -2 3 -9 15 -8 15 -6 15 -1 6 -2 5 -4 13 -6 12 -7 8 -0 2 -8 14 -4 9 -10 11 -10 16 -3 10 -7 16 -9 13 -1 2 -7 12 -3 5 -5 6 -4 12 -9 11 -6 7 -2 8 -9 10 -7 8 -0 6 -1 2 -5 9 -3 10 -3 13 -2 9 -2 9 diff --git a/geom_bottleneck/tests/data/test_346_B b/geom_bottleneck/tests/data/test_346_B deleted file mode 100644 index 5e30972..0000000 --- a/geom_bottleneck/tests/data/test_346_B +++ /dev/null @@ -1,100 +0,0 @@ -8 15 -1 8 -10 15 -8 13 -9 16 -3 13 -3 5 -1 8 -8 16 -6 12 -7 16 -4 14 -3 9 -0 8 -9 18 -4 14 -1 10 -6 12 -4 5 -10 14 -3 6 -9 10 -1 4 -6 16 -8 17 -6 7 -0 5 -1 9 -3 7 -8 14 -9 17 -10 15 -3 10 -4 14 -9 10 -9 16 -4 9 -2 12 -4 5 -6 14 -3 12 -10 16 -10 14 -6 12 -2 11 -4 11 -1 10 -5 6 -3 13 -10 19 -4 8 -0 2 -7 9 -6 7 -10 12 -9 18 -2 8 -6 9 -2 6 -4 11 -9 18 -8 14 -10 16 -9 13 -4 5 -1 6 -9 15 -8 9 -10 14 -1 2 -9 17 -10 15 -5 8 -8 11 -8 9 -10 17 -2 4 -5 6 -1 4 -1 4 -5 15 -7 13 -6 12 -10 12 -7 13 -9 10 -5 9 -0 5 -1 7 -2 3 -9 14 -4 10 -8 9 -3 12 -2 3 -4 11 -10 20 -10 13 -3 9 -8 16 diff --git a/geom_bottleneck/tests/data/test_347_A b/geom_bottleneck/tests/data/test_347_A deleted file mode 100644 index 0cfd08b..0000000 --- a/geom_bottleneck/tests/data/test_347_A +++ /dev/null @@ -1,100 +0,0 @@ -0 3 -9 14 -9 11 -1 3 -7 8 -4 12 -7 8 -10 20 -8 13 -2 5 -8 9 -5 14 -8 9 -5 11 -10 14 -7 15 -4 9 -4 10 -1 2 -2 6 -6 12 -0 1 -7 8 -10 13 -4 9 -0 3 -2 3 -0 4 -3 6 -7 13 -0 1 -10 13 -3 4 -1 2 -0 5 -9 12 -1 11 -8 17 -3 4 -3 7 -4 9 -1 2 -1 9 -4 14 -10 11 -3 11 -8 9 -2 6 -4 7 -8 13 -7 10 -0 1 -10 19 -7 13 -6 11 -1 10 -4 12 -9 14 -5 12 -3 13 -0 1 -2 3 -4 8 -5 11 -8 18 -5 6 -0 3 -0 3 -5 8 -10 11 -3 9 -0 4 -8 11 -5 14 -3 7 -9 10 -6 7 -8 14 -9 18 -6 11 -7 8 -6 10 -4 9 -4 9 -9 14 -6 13 -6 13 -10 17 -7 17 -8 15 -7 9 -4 9 -4 14 -0 1 -5 15 -4 8 -0 7 -4 5 -7 16 -4 9 diff --git a/geom_bottleneck/tests/data/test_347_B b/geom_bottleneck/tests/data/test_347_B deleted file mode 100644 index 66d57ea..0000000 --- a/geom_bottleneck/tests/data/test_347_B +++ /dev/null @@ -1,100 +0,0 @@ -10 11 -6 15 -5 11 -8 9 -8 12 -4 7 -6 7 -6 11 -10 16 -6 15 -9 19 -7 16 -10 12 -0 1 -9 13 -9 10 -10 15 -6 10 -10 12 -7 10 -9 17 -2 3 -10 19 -2 3 -5 13 -7 9 -9 16 -9 18 -9 16 -4 10 -1 11 -6 7 -9 10 -6 7 -3 4 -8 15 -6 16 -8 9 -6 8 -8 10 -0 6 -7 9 -5 10 -3 6 -1 5 -6 7 -6 9 -4 13 -5 7 -8 17 -10 16 -9 19 -5 9 -2 3 -6 7 -7 16 -4 10 -3 10 -6 9 -3 11 -9 18 -7 15 -8 16 -6 9 -8 10 -6 10 -0 3 -1 2 -2 3 -5 11 -5 9 -1 11 -10 11 -0 10 -9 14 -1 5 -3 4 -3 10 -6 12 -0 7 -5 9 -9 12 -8 16 -7 12 -1 11 -9 11 -5 15 -10 19 -2 8 -5 15 -4 6 -3 10 -4 13 -0 9 -5 6 -6 10 -2 3 -3 12 -1 10 -6 7 diff --git a/geom_bottleneck/tests/data/test_348_A b/geom_bottleneck/tests/data/test_348_A deleted file mode 100644 index 8cef3ff..0000000 --- a/geom_bottleneck/tests/data/test_348_A +++ /dev/null @@ -1,100 +0,0 @@ -8 16 -2 7 -7 12 -0 9 -9 12 -8 18 -1 3 -2 6 -3 8 -2 6 -3 11 -5 10 -8 9 -0 7 -5 11 -3 10 -3 7 -2 12 -5 12 -6 12 -3 9 -2 9 -1 2 -9 12 -0 9 -9 16 -6 10 -6 10 -2 4 -2 10 -7 8 -8 15 -4 14 -3 5 -8 10 -7 9 -10 19 -8 16 -7 8 -3 4 -8 13 -3 13 -0 1 -7 16 -7 13 -0 7 -7 11 -3 10 -4 14 -4 7 -1 2 -10 13 -8 14 -5 15 -7 11 -6 14 -9 10 -6 15 -2 12 -4 13 -1 4 -6 11 -1 2 -2 7 -3 4 -3 4 -2 8 -2 10 -8 18 -9 12 -9 13 -8 9 -4 10 -5 6 -6 10 -8 9 -5 15 -3 7 -2 10 -1 5 -6 7 -4 5 -5 8 -10 17 -5 8 -10 19 -5 15 -3 10 -8 18 -0 2 -9 13 -2 11 -1 7 -4 12 -5 7 -4 10 -5 13 -3 4 -7 15 -0 1 diff --git a/geom_bottleneck/tests/data/test_348_B b/geom_bottleneck/tests/data/test_348_B deleted file mode 100644 index 5db1829..0000000 --- a/geom_bottleneck/tests/data/test_348_B +++ /dev/null @@ -1,100 +0,0 @@ -8 18 -0 10 -5 12 -5 13 -5 6 -7 14 -3 9 -2 7 -0 1 -4 11 -10 11 -10 17 -7 8 -5 6 -1 6 -10 15 -8 9 -8 11 -5 6 -7 9 -4 6 -10 13 -6 14 -1 2 -5 6 -7 15 -1 9 -10 12 -9 10 -4 9 -7 10 -7 9 -8 16 -1 9 -5 10 -10 17 -4 5 -8 10 -5 15 -7 14 -5 10 -1 11 -7 11 -8 16 -1 10 -10 17 -2 6 -7 12 -4 5 -2 6 -0 7 -2 9 -10 11 -10 20 -7 17 -9 17 -2 8 -7 11 -2 4 -2 7 -7 10 -10 16 -6 13 -1 3 -2 10 -9 19 -2 12 -6 12 -4 5 -9 17 -1 6 -0 1 -4 10 -8 12 -0 8 -10 19 -2 11 -3 4 -0 1 -1 9 -9 14 -4 8 -2 10 -0 3 -7 15 -8 12 -7 15 -5 7 -8 11 -5 12 -2 11 -9 14 -10 12 -1 11 -7 9 -10 11 -1 5 -2 8 -6 15 -1 5 diff --git a/geom_bottleneck/tests/data/test_349_A b/geom_bottleneck/tests/data/test_349_A deleted file mode 100644 index a3d008e..0000000 --- a/geom_bottleneck/tests/data/test_349_A +++ /dev/null @@ -1,100 +0,0 @@ -9 18 -5 7 -10 20 -5 6 -8 12 -5 6 -7 14 -9 17 -9 11 -6 7 -3 4 -1 2 -7 9 -1 8 -3 6 -10 13 -2 9 -9 10 -0 8 -3 12 -2 12 -0 6 -7 16 -8 16 -7 8 -10 12 -6 7 -10 13 -3 9 -2 3 -8 14 -4 8 -7 12 -6 12 -6 16 -1 8 -7 13 -2 10 -9 16 -3 10 -0 8 -10 11 -1 2 -5 12 -10 20 -3 10 -7 14 -2 12 -2 10 -4 7 -6 15 -6 7 -3 13 -5 12 -6 9 -5 6 -10 17 -6 7 -4 5 -10 11 -9 13 -6 14 -4 9 -4 7 -5 9 -6 11 -10 13 -5 15 -3 6 -1 7 -7 12 -6 7 -3 9 -5 9 -0 2 -10 14 -3 4 -6 16 -5 13 -2 7 -9 16 -0 6 -9 11 -0 3 -1 10 -3 6 -10 16 -4 10 -10 11 -9 14 -3 13 -0 3 -8 10 -8 18 -5 13 -5 11 -9 18 -1 3 -8 12 -5 6 diff --git a/geom_bottleneck/tests/data/test_349_B b/geom_bottleneck/tests/data/test_349_B deleted file mode 100644 index d66b5eb..0000000 --- a/geom_bottleneck/tests/data/test_349_B +++ /dev/null @@ -1,100 +0,0 @@ -8 9 -2 3 -7 8 -4 14 -8 15 -3 8 -5 9 -1 3 -7 9 -0 5 -6 11 -3 12 -9 12 -4 10 -7 8 -10 14 -4 9 -5 6 -3 8 -7 15 -2 9 -3 4 -8 14 -7 11 -5 6 -10 19 -8 13 -2 5 -0 9 -0 8 -8 13 -4 8 -10 17 -10 14 -8 17 -2 6 -9 10 -6 10 -8 9 -0 2 -10 18 -6 9 -10 17 -0 3 -8 13 -9 12 -4 5 -8 14 -9 10 -1 2 -2 10 -8 15 -3 12 -4 9 -5 12 -3 11 -2 6 -3 7 -2 4 -5 10 -10 13 -2 4 -4 5 -1 2 -2 8 -2 3 -5 10 -6 7 -9 18 -8 9 -7 12 -2 4 -7 9 -7 14 -8 10 -10 11 -8 13 -10 15 -6 12 -10 16 -9 12 -9 16 -1 5 -2 9 -6 8 -8 10 -0 1 -1 3 -10 11 -7 16 -5 9 -7 13 -7 15 -6 10 -1 4 -10 15 -2 7 -2 7 -8 9 -3 13 diff --git a/geom_bottleneck/tests/data/test_350_A b/geom_bottleneck/tests/data/test_350_A deleted file mode 100644 index 734d037..0000000 --- a/geom_bottleneck/tests/data/test_350_A +++ /dev/null @@ -1,100 +0,0 @@ -4 13 -9 10 -7 11 -3 10 -1 9 -3 4 -3 11 -7 13 -9 15 -7 8 -7 14 -0 10 -1 6 -7 10 -3 4 -1 2 -7 12 -7 17 -3 11 -4 9 -7 16 -10 11 -3 13 -3 7 -4 5 -3 7 -6 9 -9 10 -0 8 -9 16 -10 13 -5 13 -3 8 -6 9 -10 11 -9 16 -10 11 -5 15 -9 13 -0 1 -10 17 -1 2 -10 20 -0 2 -9 17 -4 9 -10 16 -3 5 -9 18 -2 6 -4 12 -3 12 -7 9 -2 11 -5 13 -2 5 -0 5 -3 9 -3 7 -2 6 -8 15 -1 9 -3 4 -5 10 -3 4 -9 19 -6 8 -9 10 -3 13 -4 5 -1 4 -10 11 -9 13 -8 10 -10 12 -6 8 -1 6 -9 10 -1 5 -1 2 -8 9 -2 9 -3 4 -1 10 -0 7 -0 1 -1 10 -7 8 -4 11 -9 12 -7 17 -8 9 -4 8 -8 11 -9 16 -4 7 -3 5 -3 6 -5 6 -0 9 diff --git a/geom_bottleneck/tests/data/test_350_B b/geom_bottleneck/tests/data/test_350_B deleted file mode 100644 index 3cf03c4..0000000 --- a/geom_bottleneck/tests/data/test_350_B +++ /dev/null @@ -1,100 +0,0 @@ -10 11 -7 8 -10 13 -1 2 -0 1 -9 10 -10 18 -9 18 -1 9 -0 10 -10 11 -10 14 -0 2 -8 17 -7 17 -8 13 -0 3 -4 11 -5 7 -9 14 -5 14 -1 4 -5 9 -3 5 -10 18 -3 13 -3 4 -4 7 -3 7 -8 13 -1 11 -0 3 -1 4 -10 20 -4 5 -0 9 -9 13 -6 12 -9 19 -7 16 -2 3 -5 6 -1 9 -0 8 -2 4 -8 15 -0 7 -5 6 -4 8 -2 6 -1 2 -8 10 -2 10 -0 1 -8 13 -10 12 -1 8 -2 8 -2 4 -9 12 -7 8 -6 14 -3 9 -1 6 -7 13 -4 7 -10 17 -7 8 -9 12 -8 10 -6 13 -5 14 -5 13 -10 14 -9 13 -1 2 -2 3 -7 11 -6 13 -10 11 -1 9 -1 3 -7 14 -5 14 -2 3 -3 6 -9 11 -10 15 -0 6 -8 16 -4 11 -1 8 -3 8 -2 5 -6 13 -3 6 -7 8 -10 15 -7 10 -3 4 diff --git a/geom_bottleneck/tests/data/test_351_A b/geom_bottleneck/tests/data/test_351_A deleted file mode 100644 index 3989d6c..0000000 --- a/geom_bottleneck/tests/data/test_351_A +++ /dev/null @@ -1,100 +0,0 @@ -2 11 -9 18 -7 13 -10 12 -5 10 -8 11 -10 11 -0 1 -6 13 -2 12 -5 13 -6 8 -2 3 -4 6 -4 10 -5 12 -7 12 -6 13 -6 13 -7 17 -6 10 -6 14 -8 9 -1 9 -0 10 -7 10 -3 12 -9 14 -2 10 -10 14 -1 7 -1 6 -2 12 -7 13 -3 6 -4 5 -2 9 -7 8 -1 2 -8 12 -6 11 -7 8 -10 13 -3 10 -4 12 -5 8 -9 15 -8 15 -4 11 -6 7 -6 8 -9 18 -2 3 -10 20 -0 5 -10 20 -4 13 -10 12 -7 17 -8 16 -2 10 -9 11 -5 11 -5 15 -2 5 -3 12 -5 8 -6 9 -10 11 -3 8 -5 15 -3 13 -10 15 -8 10 -4 9 -4 6 -8 10 -8 17 -0 1 -1 2 -1 8 -7 14 -0 1 -1 5 -6 7 -1 6 -9 14 -8 12 -0 1 -2 10 -0 8 -4 10 -0 8 -3 4 -7 11 -9 13 -0 5 -3 9 -4 9 -2 4 diff --git a/geom_bottleneck/tests/data/test_351_B b/geom_bottleneck/tests/data/test_351_B deleted file mode 100644 index b1c32d7..0000000 --- a/geom_bottleneck/tests/data/test_351_B +++ /dev/null @@ -1,100 +0,0 @@ -9 18 -7 9 -6 14 -2 10 -6 7 -9 13 -3 12 -6 7 -4 7 -6 9 -3 4 -7 17 -0 9 -3 8 -0 3 -3 13 -10 15 -1 5 -1 7 -4 10 -2 9 -9 12 -4 11 -10 16 -2 7 -9 17 -1 8 -9 12 -5 8 -10 13 -2 11 -8 9 -5 6 -0 6 -0 5 -2 3 -9 12 -9 13 -8 10 -4 6 -1 4 -7 9 -4 5 -8 9 -5 7 -4 14 -5 9 -3 11 -4 8 -3 10 -4 13 -6 14 -6 13 -6 16 -9 18 -4 14 -3 4 -6 12 -2 6 -8 16 -9 13 -0 4 -9 18 -7 17 -0 5 -0 2 -7 8 -8 10 -0 1 -10 17 -2 7 -10 14 -7 9 -3 10 -1 11 -2 4 -7 13 -5 8 -2 7 -4 9 -8 14 -1 6 -2 4 -4 5 -6 12 -8 9 -0 4 -4 5 -0 7 -9 12 -8 9 -4 9 -8 9 -9 18 -3 10 -0 3 -10 16 -3 9 -3 7 -3 13 diff --git a/geom_bottleneck/tests/data/test_352_A b/geom_bottleneck/tests/data/test_352_A deleted file mode 100644 index df81454..0000000 --- a/geom_bottleneck/tests/data/test_352_A +++ /dev/null @@ -1,100 +0,0 @@ -8 12 -1 7 -7 15 -10 15 -5 8 -1 7 -1 2 -1 7 -6 10 -6 12 -8 16 -0 10 -4 8 -1 2 -6 13 -7 11 -5 11 -5 6 -0 1 -8 17 -0 2 -0 4 -9 16 -9 16 -10 13 -5 12 -3 11 -4 9 -9 12 -9 13 -1 5 -1 2 -2 6 -1 7 -8 17 -7 8 -4 9 -9 13 -1 8 -7 9 -0 10 -7 8 -9 15 -5 11 -0 4 -6 9 -0 10 -10 19 -6 11 -0 10 -7 16 -9 10 -2 5 -6 7 -6 11 -5 14 -9 10 -6 11 -8 12 -7 11 -4 12 -9 11 -1 4 -5 7 -6 8 -3 4 -8 15 -2 5 -8 13 -1 2 -4 5 -5 12 -6 15 -6 10 -1 8 -0 9 -0 2 -9 18 -7 14 -4 8 -5 10 -0 10 -9 10 -0 10 -10 14 -0 1 -7 8 -9 14 -8 11 -8 12 -8 14 -7 16 -4 7 -4 14 -0 4 -2 3 -6 16 -9 16 -6 12 -8 17 diff --git a/geom_bottleneck/tests/data/test_352_B b/geom_bottleneck/tests/data/test_352_B deleted file mode 100644 index 9b30bae..0000000 --- a/geom_bottleneck/tests/data/test_352_B +++ /dev/null @@ -1,100 +0,0 @@ -2 10 -0 1 -10 15 -7 14 -2 3 -0 9 -1 4 -5 6 -1 4 -2 8 -2 4 -0 6 -2 8 -0 1 -10 14 -5 11 -0 6 -10 17 -2 9 -10 16 -7 14 -4 11 -6 7 -3 6 -7 16 -2 8 -0 3 -1 2 -5 7 -10 12 -5 6 -1 3 -5 14 -5 14 -6 13 -8 16 -0 10 -6 12 -9 17 -3 5 -4 10 -3 6 -1 9 -1 9 -8 17 -3 4 -0 1 -1 9 -9 11 -6 7 -0 7 -3 4 -9 15 -9 13 -0 5 -1 10 -6 15 -10 19 -5 14 -1 11 -6 12 -4 13 -4 11 -2 3 -7 11 -2 5 -0 6 -0 2 -10 11 -1 5 -6 7 -2 10 -9 17 -0 5 -8 13 -2 12 -6 7 -1 6 -9 17 -8 14 -0 10 -1 2 -2 3 -2 10 -2 12 -4 6 -8 9 -7 8 -6 10 -7 17 -8 17 -10 19 -4 6 -7 9 -2 12 -2 10 -8 15 -0 4 -1 6 -2 5 diff --git a/geom_bottleneck/tests/data/test_353_A b/geom_bottleneck/tests/data/test_353_A deleted file mode 100644 index 3dda9d1..0000000 --- a/geom_bottleneck/tests/data/test_353_A +++ /dev/null @@ -1,100 +0,0 @@ -1 11 -3 5 -3 5 -2 3 -9 10 -0 9 -6 9 -0 8 -8 10 -6 12 -1 10 -1 2 -0 8 -8 18 -0 7 -3 4 -2 7 -8 15 -1 5 -1 9 -2 11 -7 11 -3 12 -4 6 -0 2 -8 16 -0 1 -10 18 -4 9 -8 18 -1 8 -5 7 -8 16 -1 2 -4 10 -9 18 -3 5 -5 8 -2 10 -3 8 -8 16 -10 12 -0 1 -0 9 -3 7 -3 4 -3 6 -3 9 -8 10 -2 12 -6 10 -3 13 -2 6 -9 10 -6 10 -9 19 -3 5 -4 6 -8 9 -2 3 -5 6 -3 4 -3 7 -7 17 -8 12 -5 6 -1 2 -0 1 -6 10 -7 9 -5 15 -7 14 -2 9 -1 5 -4 5 -0 9 -1 9 -7 8 -1 7 -2 3 -10 16 -5 6 -5 10 -0 9 -1 11 -7 10 -7 17 -10 19 -1 2 -9 19 -10 14 -7 11 -9 14 -8 17 -1 2 -7 16 -2 9 -9 16 -3 4 -0 1 diff --git a/geom_bottleneck/tests/data/test_353_B b/geom_bottleneck/tests/data/test_353_B deleted file mode 100644 index 16ed654..0000000 --- a/geom_bottleneck/tests/data/test_353_B +++ /dev/null @@ -1,100 +0,0 @@ -1 9 -1 9 -9 14 -7 9 -9 18 -6 13 -1 2 -5 15 -7 8 -8 15 -5 11 -9 13 -1 8 -4 6 -10 11 -6 7 -4 10 -0 4 -3 7 -0 1 -10 11 -7 13 -0 2 -4 5 -10 18 -8 13 -4 11 -8 18 -8 15 -1 10 -6 13 -5 8 -10 15 -7 14 -2 3 -10 19 -5 8 -2 3 -7 14 -1 7 -1 9 -6 12 -2 8 -3 11 -5 13 -2 3 -10 16 -10 15 -2 10 -10 18 -3 6 -0 6 -1 4 -6 11 -1 3 -8 9 -8 16 -0 2 -8 12 -9 10 -1 4 -0 3 -0 2 -5 14 -3 11 -7 12 -7 17 -5 6 -10 16 -3 4 -0 6 -0 3 -0 1 -3 13 -6 7 -4 9 -7 9 -0 1 -10 13 -8 12 -0 6 -2 8 -10 13 -2 3 -7 13 -9 19 -4 7 -10 16 -1 5 -2 11 -3 13 -8 13 -3 9 -3 9 -3 13 -7 15 -0 2 -2 6 -7 14 -1 4 diff --git a/geom_bottleneck/tests/data/test_354_A b/geom_bottleneck/tests/data/test_354_A deleted file mode 100644 index c701ef2..0000000 --- a/geom_bottleneck/tests/data/test_354_A +++ /dev/null @@ -1,100 +0,0 @@ -6 16 -5 15 -0 2 -8 18 -10 15 -0 2 -3 5 -6 14 -1 9 -3 12 -6 8 -2 3 -2 11 -8 14 -10 15 -3 5 -10 12 -1 4 -3 4 -8 15 -10 15 -6 15 -10 16 -10 17 -3 11 -10 17 -2 3 -2 10 -5 9 -5 9 -8 16 -0 7 -7 15 -1 3 -0 1 -10 17 -10 12 -0 8 -4 11 -1 8 -5 8 -0 10 -2 4 -1 2 -7 11 -7 14 -4 5 -7 16 -3 7 -5 7 -8 9 -8 12 -2 3 -6 16 -6 16 -5 7 -5 14 -0 10 -9 16 -9 11 -6 16 -5 14 -5 11 -8 9 -4 10 -5 6 -1 2 -6 15 -1 5 -9 10 -8 9 -0 8 -4 5 -10 19 -7 11 -8 18 -3 4 -7 8 -2 9 -6 11 -1 2 -7 16 -0 2 -1 10 -10 11 -4 5 -9 12 -8 13 -1 11 -4 8 -0 1 -9 15 -0 7 -2 4 -1 6 -1 10 -8 15 -8 18 -8 10 -9 17 diff --git a/geom_bottleneck/tests/data/test_354_B b/geom_bottleneck/tests/data/test_354_B deleted file mode 100644 index 0a21b24..0000000 --- a/geom_bottleneck/tests/data/test_354_B +++ /dev/null @@ -1,100 +0,0 @@ -7 8 -3 12 -9 19 -5 13 -8 9 -4 14 -10 12 -1 4 -1 5 -8 16 -5 10 -7 10 -5 9 -4 7 -6 9 -6 7 -0 1 -7 8 -1 7 -9 19 -7 8 -3 13 -10 18 -8 13 -3 13 -6 15 -2 3 -3 13 -1 8 -9 18 -4 9 -9 10 -10 18 -6 9 -8 17 -1 5 -3 8 -1 11 -7 12 -0 1 -4 5 -7 16 -6 11 -3 5 -5 14 -6 11 -3 10 -7 8 -8 11 -7 13 -10 17 -1 9 -7 14 -1 10 -3 12 -7 15 -1 4 -7 10 -0 5 -3 9 -5 12 -7 16 -5 6 -0 10 -0 1 -3 5 -0 7 -1 6 -4 5 -3 8 -1 8 -2 3 -10 20 -4 10 -7 11 -0 4 -4 6 -5 8 -10 17 -9 10 -0 3 -0 3 -5 9 -9 19 -8 14 -9 14 -4 11 -10 17 -7 9 -6 7 -10 19 -9 10 -3 8 -2 11 -4 14 -9 16 -2 8 -2 5 -5 11 -10 18 diff --git a/geom_bottleneck/tests/data/test_355_A b/geom_bottleneck/tests/data/test_355_A deleted file mode 100644 index 48d49bd..0000000 --- a/geom_bottleneck/tests/data/test_355_A +++ /dev/null @@ -1,100 +0,0 @@ -6 9 -0 2 -2 6 -4 6 -5 7 -8 14 -10 15 -8 9 -6 14 -9 15 -6 12 -1 9 -4 7 -1 4 -3 8 -0 2 -6 16 -6 7 -5 7 -9 11 -10 20 -3 11 -9 13 -2 5 -0 3 -7 14 -7 8 -10 18 -5 7 -4 11 -0 10 -7 16 -1 8 -7 15 -3 4 -3 5 -8 13 -9 12 -5 10 -9 13 -5 11 -8 16 -3 4 -4 11 -9 18 -1 3 -10 14 -5 6 -5 10 -8 11 -8 10 -7 14 -3 6 -9 17 -0 3 -0 2 -2 11 -4 8 -0 6 -7 14 -10 11 -5 7 -9 18 -2 8 -4 5 -1 11 -0 9 -9 10 -3 12 -10 19 -3 7 -7 14 -1 3 -8 9 -9 13 -0 8 -5 11 -6 13 -5 10 -10 15 -8 15 -6 12 -2 6 -2 4 -4 9 -3 6 -9 10 -5 10 -10 15 -9 17 -5 10 -6 11 -2 8 -4 5 -5 15 -2 3 -7 14 -4 10 -4 11 -8 10 diff --git a/geom_bottleneck/tests/data/test_355_B b/geom_bottleneck/tests/data/test_355_B deleted file mode 100644 index cd9cec5..0000000 --- a/geom_bottleneck/tests/data/test_355_B +++ /dev/null @@ -1,100 +0,0 @@ -4 11 -9 14 -8 12 -3 5 -5 11 -7 15 -7 15 -1 10 -1 6 -4 13 -7 8 -5 7 -1 2 -3 13 -2 5 -4 10 -6 7 -10 11 -2 6 -1 10 -4 5 -10 18 -5 9 -0 3 -8 9 -5 13 -4 5 -1 2 -4 9 -1 11 -5 15 -9 11 -2 3 -0 1 -4 11 -6 10 -8 10 -2 8 -3 5 -4 8 -10 20 -0 5 -3 13 -2 8 -0 10 -2 7 -10 11 -0 2 -8 12 -1 10 -3 9 -2 8 -6 7 -10 17 -4 5 -2 7 -5 8 -10 20 -5 13 -10 19 -4 13 -1 9 -6 12 -3 4 -4 5 -8 18 -7 14 -1 10 -7 14 -5 9 -1 6 -6 14 -7 8 -5 12 -4 14 -1 7 -2 8 -6 11 -7 13 -3 10 -3 4 -3 11 -9 10 -1 11 -9 10 -2 8 -10 19 -3 6 -10 13 -4 5 -7 16 -2 7 -4 7 -9 15 -9 17 -4 8 -5 8 -4 8 -0 1 -10 17 diff --git a/geom_bottleneck/tests/data/test_356_A b/geom_bottleneck/tests/data/test_356_A deleted file mode 100644 index cb92f38..0000000 --- a/geom_bottleneck/tests/data/test_356_A +++ /dev/null @@ -1,100 +0,0 @@ -7 12 -5 6 -6 13 -1 6 -9 10 -10 11 -2 9 -4 14 -4 11 -5 14 -4 13 -6 12 -7 13 -8 9 -5 11 -6 14 -9 13 -0 3 -7 11 -3 13 -2 5 -0 6 -1 8 -3 9 -8 17 -1 7 -10 19 -0 4 -8 18 -0 7 -1 3 -1 10 -0 6 -1 5 -3 11 -0 3 -7 13 -10 11 -2 4 -2 5 -4 11 -4 14 -0 6 -2 11 -6 11 -3 4 -2 6 -6 16 -6 8 -9 13 -8 12 -7 16 -9 16 -4 8 -1 8 -9 19 -7 13 -9 19 -5 6 -3 10 -2 10 -2 10 -9 11 -9 18 -7 13 -7 11 -5 8 -8 13 -8 10 -7 13 -7 17 -6 15 -5 8 -5 9 -5 9 -7 10 -4 10 -9 13 -6 16 -4 12 -5 6 -9 17 -1 2 -2 7 -5 11 -2 12 -10 16 -1 10 -10 19 -5 9 -10 19 -5 10 -10 13 -10 13 -6 7 -10 19 -2 10 -4 6 -3 5 -1 11 diff --git a/geom_bottleneck/tests/data/test_356_B b/geom_bottleneck/tests/data/test_356_B deleted file mode 100644 index 365ed3f..0000000 --- a/geom_bottleneck/tests/data/test_356_B +++ /dev/null @@ -1,100 +0,0 @@ -6 11 -8 12 -7 8 -3 4 -9 12 -8 15 -4 5 -8 18 -2 3 -0 2 -8 11 -1 2 -2 8 -9 13 -6 10 -10 20 -0 3 -7 12 -7 11 -10 20 -6 10 -8 14 -5 6 -5 10 -8 12 -6 16 -1 11 -3 9 -7 17 -8 17 -5 11 -6 16 -5 9 -9 19 -7 11 -0 8 -8 17 -6 13 -0 5 -10 19 -3 8 -0 8 -0 9 -9 16 -8 12 -3 4 -2 3 -1 2 -6 11 -3 4 -2 4 -3 11 -4 11 -8 15 -7 9 -8 10 -4 14 -9 12 -9 16 -1 2 -7 13 -5 11 -1 8 -9 12 -0 5 -10 13 -9 11 -5 14 -0 9 -10 20 -7 8 -4 10 -0 3 -3 12 -8 17 -1 9 -5 9 -2 3 -1 8 -6 7 -3 4 -1 8 -7 10 -1 10 -0 1 -4 6 -8 11 -9 13 -5 6 -10 14 -10 16 -1 6 -5 9 -10 20 -7 13 -3 11 -0 3 -0 7 -6 12 -1 9 diff --git a/geom_bottleneck/tests/data/test_357_A b/geom_bottleneck/tests/data/test_357_A deleted file mode 100644 index de1e8eb..0000000 --- a/geom_bottleneck/tests/data/test_357_A +++ /dev/null @@ -1,100 +0,0 @@ -6 11 -4 11 -5 10 -8 9 -4 12 -10 17 -0 1 -9 15 -3 7 -6 13 -7 8 -3 4 -4 12 -8 9 -2 4 -10 20 -3 4 -6 16 -6 16 -4 12 -5 6 -9 12 -1 8 -6 14 -8 13 -2 10 -4 14 -3 5 -7 12 -2 7 -3 6 -1 2 -4 5 -7 13 -3 8 -6 9 -4 9 -6 7 -1 6 -8 10 -10 15 -3 6 -10 19 -8 14 -8 9 -4 7 -7 11 -4 11 -2 5 -0 7 -10 13 -4 6 -5 6 -7 16 -2 10 -8 18 -4 5 -9 10 -8 9 -8 14 -0 1 -5 15 -2 9 -6 7 -8 10 -10 14 -8 11 -5 8 -1 5 -9 15 -3 10 -5 10 -1 5 -4 6 -3 11 -6 7 -9 12 -5 11 -1 6 -6 14 -0 5 -3 12 -2 10 -7 12 -7 15 -1 11 -8 12 -3 7 -10 14 -8 9 -8 9 -9 10 -2 12 -3 4 -1 10 -9 15 -1 7 -10 14 -1 3 -10 14 diff --git a/geom_bottleneck/tests/data/test_357_B b/geom_bottleneck/tests/data/test_357_B deleted file mode 100644 index 1c68b90..0000000 --- a/geom_bottleneck/tests/data/test_357_B +++ /dev/null @@ -1,100 +0,0 @@ -8 10 -0 5 -6 15 -7 17 -6 14 -3 4 -3 5 -0 9 -1 5 -1 2 -2 3 -6 7 -9 10 -3 13 -9 13 -8 11 -5 7 -2 11 -7 9 -10 11 -9 11 -10 12 -4 10 -8 9 -4 12 -8 11 -5 14 -0 1 -8 9 -9 13 -6 14 -7 10 -10 17 -2 10 -9 17 -8 16 -1 3 -9 19 -0 1 -7 15 -2 8 -1 2 -0 1 -2 3 -7 8 -6 11 -10 20 -3 12 -6 11 -7 9 -5 8 -5 14 -3 12 -8 17 -10 15 -9 14 -8 9 -7 13 -9 12 -1 7 -5 11 -5 11 -6 8 -8 9 -5 6 -3 10 -3 4 -1 3 -3 10 -7 8 -1 9 -3 13 -3 10 -7 14 -4 14 -1 10 -0 10 -9 10 -10 15 -1 2 -8 10 -3 4 -2 4 -2 3 -7 13 -3 6 -8 14 -5 6 -3 11 -8 14 -0 5 -3 10 -7 11 -3 11 -10 19 -8 9 -0 1 -10 20 -7 8 -0 8 diff --git a/geom_bottleneck/tests/data/test_358_A b/geom_bottleneck/tests/data/test_358_A deleted file mode 100644 index 2297dae..0000000 --- a/geom_bottleneck/tests/data/test_358_A +++ /dev/null @@ -1,100 +0,0 @@ -7 12 -6 15 -1 4 -1 5 -7 9 -7 16 -0 2 -2 3 -6 12 -1 9 -9 12 -6 8 -8 9 -2 3 -6 11 -4 6 -7 11 -7 10 -8 9 -5 8 -6 8 -0 6 -9 18 -0 1 -7 14 -7 9 -7 14 -10 15 -3 10 -7 16 -8 15 -6 12 -7 9 -6 11 -3 8 -3 4 -4 6 -5 11 -10 16 -7 9 -2 8 -1 6 -8 9 -7 8 -7 14 -9 19 -4 9 -0 1 -3 4 -5 11 -2 12 -3 9 -9 16 -3 5 -0 8 -7 13 -7 17 -0 1 -4 12 -7 15 -8 11 -8 18 -4 8 -8 12 -8 18 -4 12 -4 10 -6 12 -9 14 -6 12 -9 11 -6 7 -0 5 -1 6 -8 17 -5 9 -5 14 -5 10 -9 19 -6 11 -3 4 -4 14 -1 11 -1 4 -10 19 -6 13 -3 4 -2 3 -2 7 -1 11 -5 11 -6 14 -1 6 -8 9 -7 8 -1 9 -2 8 -3 10 -10 17 -4 5 diff --git a/geom_bottleneck/tests/data/test_358_B b/geom_bottleneck/tests/data/test_358_B deleted file mode 100644 index e2d7d03..0000000 --- a/geom_bottleneck/tests/data/test_358_B +++ /dev/null @@ -1,100 +0,0 @@ -6 7 -6 12 -10 13 -3 6 -9 10 -8 11 -3 13 -3 4 -10 16 -8 9 -3 5 -1 8 -4 5 -8 13 -9 18 -3 11 -3 13 -8 12 -7 11 -0 2 -4 7 -8 13 -7 16 -0 10 -1 9 -8 18 -1 9 -3 12 -1 10 -0 9 -9 16 -8 14 -0 7 -9 10 -0 3 -3 4 -6 8 -8 17 -9 16 -5 7 -0 2 -6 7 -1 6 -6 13 -4 5 -8 12 -9 14 -6 16 -9 14 -10 20 -4 14 -0 3 -9 18 -1 11 -6 13 -3 10 -9 13 -9 17 -6 16 -5 8 -3 4 -2 8 -9 15 -6 10 -8 18 -4 5 -3 5 -2 8 -3 11 -9 10 -3 11 -4 11 -9 12 -1 11 -0 10 -0 9 -8 12 -0 3 -9 14 -8 12 -6 14 -10 16 -3 8 -5 11 -1 6 -10 17 -0 2 -9 17 -8 10 -10 11 -9 13 -0 10 -5 11 -9 10 -4 5 -5 7 -4 14 -0 6 -0 1 -5 15 diff --git a/geom_bottleneck/tests/data/test_359_A b/geom_bottleneck/tests/data/test_359_A deleted file mode 100644 index 6e990e4..0000000 --- a/geom_bottleneck/tests/data/test_359_A +++ /dev/null @@ -1,100 +0,0 @@ -7 8 -8 11 -7 8 -5 6 -4 5 -4 5 -7 8 -3 8 -2 8 -8 10 -2 3 -6 7 -0 5 -2 4 -8 17 -7 15 -8 9 -6 7 -10 11 -7 14 -9 10 -0 8 -3 7 -3 13 -3 12 -4 10 -9 17 -9 19 -5 14 -2 8 -9 19 -4 11 -2 12 -0 2 -4 12 -5 13 -1 3 -6 15 -2 12 -3 4 -0 10 -1 2 -9 19 -5 14 -3 7 -0 7 -10 12 -1 11 -1 8 -0 1 -5 11 -3 4 -1 4 -2 6 -8 12 -9 13 -10 13 -0 7 -9 18 -5 6 -2 4 -10 14 -7 8 -5 15 -9 10 -5 13 -0 9 -4 6 -2 3 -2 11 -9 15 -4 11 -1 7 -4 9 -6 14 -8 15 -3 11 -3 6 -8 13 -6 12 -7 9 -10 20 -9 19 -6 7 -2 12 -0 10 -10 13 -10 13 -5 15 -4 14 -9 15 -0 7 -7 13 -9 10 -5 10 -8 10 -8 17 -8 17 -0 9 -0 1 diff --git a/geom_bottleneck/tests/data/test_359_B b/geom_bottleneck/tests/data/test_359_B deleted file mode 100644 index 97c1bfe..0000000 --- a/geom_bottleneck/tests/data/test_359_B +++ /dev/null @@ -1,100 +0,0 @@ -9 12 -2 11 -9 10 -10 12 -2 7 -4 7 -0 1 -9 11 -10 15 -4 12 -9 15 -9 18 -10 20 -7 8 -6 8 -10 20 -9 10 -8 18 -7 17 -3 4 -5 6 -1 8 -3 4 -9 18 -9 13 -5 15 -9 10 -5 11 -5 11 -9 11 -2 5 -9 16 -7 8 -0 4 -3 11 -1 7 -0 10 -5 12 -5 15 -2 3 -10 19 -9 12 -1 3 -5 11 -3 8 -9 15 -2 12 -9 16 -7 9 -1 2 -1 8 -4 13 -4 8 -0 1 -2 6 -1 6 -8 10 -6 12 -8 16 -8 17 -4 12 -9 12 -0 8 -3 10 -6 13 -4 5 -1 9 -5 9 -0 6 -6 7 -1 10 -7 17 -4 7 -5 15 -2 4 -9 14 -7 17 -5 13 -9 11 -0 7 -1 9 -3 8 -5 14 -1 7 -3 11 -1 10 -8 12 -10 11 -0 7 -7 14 -6 14 -0 10 -3 5 -10 18 -3 10 -6 7 -1 3 -1 3 -8 16 -7 16 diff --git a/geom_bottleneck/tests/data/test_360_A b/geom_bottleneck/tests/data/test_360_A deleted file mode 100644 index d271aaa..0000000 --- a/geom_bottleneck/tests/data/test_360_A +++ /dev/null @@ -1,2 +0,0 @@ -84 85 -52 129 diff --git a/geom_bottleneck/tests/data/test_360_B b/geom_bottleneck/tests/data/test_360_B deleted file mode 100644 index 2408922..0000000 --- a/geom_bottleneck/tests/data/test_360_B +++ /dev/null @@ -1,2 +0,0 @@ -74 97 -83 94 diff --git a/geom_bottleneck/tests/data/test_361_A b/geom_bottleneck/tests/data/test_361_A deleted file mode 100644 index b4eea74..0000000 --- a/geom_bottleneck/tests/data/test_361_A +++ /dev/null @@ -1,2 +0,0 @@ -97 159 -60 73 diff --git a/geom_bottleneck/tests/data/test_361_B b/geom_bottleneck/tests/data/test_361_B deleted file mode 100644 index 3680b00..0000000 --- a/geom_bottleneck/tests/data/test_361_B +++ /dev/null @@ -1,2 +0,0 @@ -47 60 -95 167 diff --git a/geom_bottleneck/tests/data/test_362_A b/geom_bottleneck/tests/data/test_362_A deleted file mode 100644 index 1c4803d..0000000 --- a/geom_bottleneck/tests/data/test_362_A +++ /dev/null @@ -1,2 +0,0 @@ -85 121 -2 61 diff --git a/geom_bottleneck/tests/data/test_362_B b/geom_bottleneck/tests/data/test_362_B deleted file mode 100644 index 37fc7aa..0000000 --- a/geom_bottleneck/tests/data/test_362_B +++ /dev/null @@ -1,2 +0,0 @@ -41 67 -80 101 diff --git a/geom_bottleneck/tests/data/test_363_A b/geom_bottleneck/tests/data/test_363_A deleted file mode 100644 index 909ac51..0000000 --- a/geom_bottleneck/tests/data/test_363_A +++ /dev/null @@ -1,2 +0,0 @@ -77 159 -60 118 diff --git a/geom_bottleneck/tests/data/test_363_B b/geom_bottleneck/tests/data/test_363_B deleted file mode 100644 index 4c76429..0000000 --- a/geom_bottleneck/tests/data/test_363_B +++ /dev/null @@ -1,2 +0,0 @@ -52 73 -71 103 diff --git a/geom_bottleneck/tests/data/test_364_A b/geom_bottleneck/tests/data/test_364_A deleted file mode 100644 index a6e34b7..0000000 --- a/geom_bottleneck/tests/data/test_364_A +++ /dev/null @@ -1,2 +0,0 @@ -20 21 -70 88 diff --git a/geom_bottleneck/tests/data/test_364_B b/geom_bottleneck/tests/data/test_364_B deleted file mode 100644 index ba5c4bf..0000000 --- a/geom_bottleneck/tests/data/test_364_B +++ /dev/null @@ -1,2 +0,0 @@ -65 72 -81 164 diff --git a/geom_bottleneck/tests/data/test_365_A b/geom_bottleneck/tests/data/test_365_A deleted file mode 100644 index 6c9d44c..0000000 --- a/geom_bottleneck/tests/data/test_365_A +++ /dev/null @@ -1,2 +0,0 @@ -9 64 -48 115 diff --git a/geom_bottleneck/tests/data/test_365_B b/geom_bottleneck/tests/data/test_365_B deleted file mode 100644 index f9e51a7..0000000 --- a/geom_bottleneck/tests/data/test_365_B +++ /dev/null @@ -1,2 +0,0 @@ -87 125 -74 132 diff --git a/geom_bottleneck/tests/data/test_366_A b/geom_bottleneck/tests/data/test_366_A deleted file mode 100644 index fbf146c..0000000 --- a/geom_bottleneck/tests/data/test_366_A +++ /dev/null @@ -1,2 +0,0 @@ -97 162 -27 43 diff --git a/geom_bottleneck/tests/data/test_366_B b/geom_bottleneck/tests/data/test_366_B deleted file mode 100644 index 7385b5f..0000000 --- a/geom_bottleneck/tests/data/test_366_B +++ /dev/null @@ -1,2 +0,0 @@ -51 149 -65 126 diff --git a/geom_bottleneck/tests/data/test_367_A b/geom_bottleneck/tests/data/test_367_A deleted file mode 100644 index 48190bb..0000000 --- a/geom_bottleneck/tests/data/test_367_A +++ /dev/null @@ -1,2 +0,0 @@ -36 104 -19 85 diff --git a/geom_bottleneck/tests/data/test_367_B b/geom_bottleneck/tests/data/test_367_B deleted file mode 100644 index 7e26c08..0000000 --- a/geom_bottleneck/tests/data/test_367_B +++ /dev/null @@ -1,2 +0,0 @@ -96 171 -17 21 diff --git a/geom_bottleneck/tests/data/test_368_A b/geom_bottleneck/tests/data/test_368_A deleted file mode 100644 index 4b4767d..0000000 --- a/geom_bottleneck/tests/data/test_368_A +++ /dev/null @@ -1,2 +0,0 @@ -72 156 -84 129 diff --git a/geom_bottleneck/tests/data/test_368_B b/geom_bottleneck/tests/data/test_368_B deleted file mode 100644 index 3c72417..0000000 --- a/geom_bottleneck/tests/data/test_368_B +++ /dev/null @@ -1,2 +0,0 @@ -32 71 -88 129 diff --git a/geom_bottleneck/tests/data/test_369_A b/geom_bottleneck/tests/data/test_369_A deleted file mode 100644 index d8a01b6..0000000 --- a/geom_bottleneck/tests/data/test_369_A +++ /dev/null @@ -1,2 +0,0 @@ -56 128 -69 161 diff --git a/geom_bottleneck/tests/data/test_369_B b/geom_bottleneck/tests/data/test_369_B deleted file mode 100644 index 9f7da60..0000000 --- a/geom_bottleneck/tests/data/test_369_B +++ /dev/null @@ -1,2 +0,0 @@ -3 84 -92 119 diff --git a/geom_bottleneck/tests/data/test_370_A b/geom_bottleneck/tests/data/test_370_A deleted file mode 100644 index bdc8979..0000000 --- a/geom_bottleneck/tests/data/test_370_A +++ /dev/null @@ -1,2 +0,0 @@ -49 140 -100 135 diff --git a/geom_bottleneck/tests/data/test_370_B b/geom_bottleneck/tests/data/test_370_B deleted file mode 100644 index e145eb4..0000000 --- a/geom_bottleneck/tests/data/test_370_B +++ /dev/null @@ -1,2 +0,0 @@ -28 51 -55 70 diff --git a/geom_bottleneck/tests/data/test_371_A b/geom_bottleneck/tests/data/test_371_A deleted file mode 100644 index 208a164..0000000 --- a/geom_bottleneck/tests/data/test_371_A +++ /dev/null @@ -1,2 +0,0 @@ -93 154 -54 138 diff --git a/geom_bottleneck/tests/data/test_371_B b/geom_bottleneck/tests/data/test_371_B deleted file mode 100644 index 7a2fc8a..0000000 --- a/geom_bottleneck/tests/data/test_371_B +++ /dev/null @@ -1,2 +0,0 @@ -31 81 -88 143 diff --git a/geom_bottleneck/tests/data/test_372_A b/geom_bottleneck/tests/data/test_372_A deleted file mode 100644 index dd3597a..0000000 --- a/geom_bottleneck/tests/data/test_372_A +++ /dev/null @@ -1,2 +0,0 @@ -3 92 -88 127 diff --git a/geom_bottleneck/tests/data/test_372_B b/geom_bottleneck/tests/data/test_372_B deleted file mode 100644 index 225c36e..0000000 --- a/geom_bottleneck/tests/data/test_372_B +++ /dev/null @@ -1,2 +0,0 @@ -6 95 -54 74 diff --git a/geom_bottleneck/tests/data/test_373_A b/geom_bottleneck/tests/data/test_373_A deleted file mode 100644 index 0a84fd2..0000000 --- a/geom_bottleneck/tests/data/test_373_A +++ /dev/null @@ -1,2 +0,0 @@ -80 109 -36 96 diff --git a/geom_bottleneck/tests/data/test_373_B b/geom_bottleneck/tests/data/test_373_B deleted file mode 100644 index b790337..0000000 --- a/geom_bottleneck/tests/data/test_373_B +++ /dev/null @@ -1,2 +0,0 @@ -64 106 -12 78 diff --git a/geom_bottleneck/tests/data/test_374_A b/geom_bottleneck/tests/data/test_374_A deleted file mode 100644 index 0df06a4..0000000 --- a/geom_bottleneck/tests/data/test_374_A +++ /dev/null @@ -1,2 +0,0 @@ -91 158 -15 61 diff --git a/geom_bottleneck/tests/data/test_374_B b/geom_bottleneck/tests/data/test_374_B deleted file mode 100644 index 7bd1bdd..0000000 --- a/geom_bottleneck/tests/data/test_374_B +++ /dev/null @@ -1,2 +0,0 @@ -85 155 -5 64 diff --git a/geom_bottleneck/tests/data/test_375_A b/geom_bottleneck/tests/data/test_375_A deleted file mode 100644 index 77cd274..0000000 --- a/geom_bottleneck/tests/data/test_375_A +++ /dev/null @@ -1,2 +0,0 @@ -77 154 -15 27 diff --git a/geom_bottleneck/tests/data/test_375_B b/geom_bottleneck/tests/data/test_375_B deleted file mode 100644 index db3c6ee..0000000 --- a/geom_bottleneck/tests/data/test_375_B +++ /dev/null @@ -1,2 +0,0 @@ -81 144 -44 79 diff --git a/geom_bottleneck/tests/data/test_376_A b/geom_bottleneck/tests/data/test_376_A deleted file mode 100644 index aca7402..0000000 --- a/geom_bottleneck/tests/data/test_376_A +++ /dev/null @@ -1,2 +0,0 @@ -20 47 -61 129 diff --git a/geom_bottleneck/tests/data/test_376_B b/geom_bottleneck/tests/data/test_376_B deleted file mode 100644 index 5bbae78..0000000 --- a/geom_bottleneck/tests/data/test_376_B +++ /dev/null @@ -1,2 +0,0 @@ -41 98 -76 137 diff --git a/geom_bottleneck/tests/data/test_377_A b/geom_bottleneck/tests/data/test_377_A deleted file mode 100644 index 707adfd..0000000 --- a/geom_bottleneck/tests/data/test_377_A +++ /dev/null @@ -1,2 +0,0 @@ -91 123 -17 50 diff --git a/geom_bottleneck/tests/data/test_377_B b/geom_bottleneck/tests/data/test_377_B deleted file mode 100644 index afbe113..0000000 --- a/geom_bottleneck/tests/data/test_377_B +++ /dev/null @@ -1,2 +0,0 @@ -45 116 -18 98 diff --git a/geom_bottleneck/tests/data/test_378_A b/geom_bottleneck/tests/data/test_378_A deleted file mode 100644 index 7ac23e9..0000000 --- a/geom_bottleneck/tests/data/test_378_A +++ /dev/null @@ -1,2 +0,0 @@ -98 183 -5 58 diff --git a/geom_bottleneck/tests/data/test_378_B b/geom_bottleneck/tests/data/test_378_B deleted file mode 100644 index 328b726..0000000 --- a/geom_bottleneck/tests/data/test_378_B +++ /dev/null @@ -1,2 +0,0 @@ -58 154 -82 148 diff --git a/geom_bottleneck/tests/data/test_379_A b/geom_bottleneck/tests/data/test_379_A deleted file mode 100644 index 0f57258..0000000 --- a/geom_bottleneck/tests/data/test_379_A +++ /dev/null @@ -1,2 +0,0 @@ -73 133 -38 52 diff --git a/geom_bottleneck/tests/data/test_379_B b/geom_bottleneck/tests/data/test_379_B deleted file mode 100644 index 45e35ba..0000000 --- a/geom_bottleneck/tests/data/test_379_B +++ /dev/null @@ -1,2 +0,0 @@ -46 95 -50 110 diff --git a/geom_bottleneck/tests/data/test_380_A b/geom_bottleneck/tests/data/test_380_A deleted file mode 100644 index a6d1d31..0000000 --- a/geom_bottleneck/tests/data/test_380_A +++ /dev/null @@ -1,3 +0,0 @@ -42 50 -67 107 -6 85 diff --git a/geom_bottleneck/tests/data/test_380_B b/geom_bottleneck/tests/data/test_380_B deleted file mode 100644 index 023f533..0000000 --- a/geom_bottleneck/tests/data/test_380_B +++ /dev/null @@ -1,3 +0,0 @@ -31 126 -78 132 -15 92 diff --git a/geom_bottleneck/tests/data/test_381_A b/geom_bottleneck/tests/data/test_381_A deleted file mode 100644 index 0b5985d..0000000 --- a/geom_bottleneck/tests/data/test_381_A +++ /dev/null @@ -1,3 +0,0 @@ -7 43 -49 69 -94 119 diff --git a/geom_bottleneck/tests/data/test_381_B b/geom_bottleneck/tests/data/test_381_B deleted file mode 100644 index 1f5ffef..0000000 --- a/geom_bottleneck/tests/data/test_381_B +++ /dev/null @@ -1,3 +0,0 @@ -98 101 -89 113 -80 157 diff --git a/geom_bottleneck/tests/data/test_382_A b/geom_bottleneck/tests/data/test_382_A deleted file mode 100644 index e155629..0000000 --- a/geom_bottleneck/tests/data/test_382_A +++ /dev/null @@ -1,3 +0,0 @@ -60 119 -40 77 -52 101 diff --git a/geom_bottleneck/tests/data/test_382_B b/geom_bottleneck/tests/data/test_382_B deleted file mode 100644 index 5273c5f..0000000 --- a/geom_bottleneck/tests/data/test_382_B +++ /dev/null @@ -1,3 +0,0 @@ -9 47 -74 170 -88 93 diff --git a/geom_bottleneck/tests/data/test_383_A b/geom_bottleneck/tests/data/test_383_A deleted file mode 100644 index 7579cf6..0000000 --- a/geom_bottleneck/tests/data/test_383_A +++ /dev/null @@ -1,3 +0,0 @@ -45 55 -12 57 -38 111 diff --git a/geom_bottleneck/tests/data/test_383_B b/geom_bottleneck/tests/data/test_383_B deleted file mode 100644 index 050e76d..0000000 --- a/geom_bottleneck/tests/data/test_383_B +++ /dev/null @@ -1,3 +0,0 @@ -61 126 -14 94 -58 81 diff --git a/geom_bottleneck/tests/data/test_384_A b/geom_bottleneck/tests/data/test_384_A deleted file mode 100644 index 5ba83b2..0000000 --- a/geom_bottleneck/tests/data/test_384_A +++ /dev/null @@ -1,3 +0,0 @@ -21 105 -7 55 -95 108 diff --git a/geom_bottleneck/tests/data/test_384_B b/geom_bottleneck/tests/data/test_384_B deleted file mode 100644 index f1a0074..0000000 --- a/geom_bottleneck/tests/data/test_384_B +++ /dev/null @@ -1,3 +0,0 @@ -73 93 -20 52 -99 187 diff --git a/geom_bottleneck/tests/data/test_385_A b/geom_bottleneck/tests/data/test_385_A deleted file mode 100644 index 195db5d..0000000 --- a/geom_bottleneck/tests/data/test_385_A +++ /dev/null @@ -1,3 +0,0 @@ -28 66 -4 72 -57 155 diff --git a/geom_bottleneck/tests/data/test_385_B b/geom_bottleneck/tests/data/test_385_B deleted file mode 100644 index 9234688..0000000 --- a/geom_bottleneck/tests/data/test_385_B +++ /dev/null @@ -1,3 +0,0 @@ -75 175 -55 79 -89 178 diff --git a/geom_bottleneck/tests/data/test_386_A b/geom_bottleneck/tests/data/test_386_A deleted file mode 100644 index 7a9281c..0000000 --- a/geom_bottleneck/tests/data/test_386_A +++ /dev/null @@ -1,3 +0,0 @@ -65 87 -11 33 -17 45 diff --git a/geom_bottleneck/tests/data/test_386_B b/geom_bottleneck/tests/data/test_386_B deleted file mode 100644 index 86a3caf..0000000 --- a/geom_bottleneck/tests/data/test_386_B +++ /dev/null @@ -1,3 +0,0 @@ -83 93 -13 46 -67 68 diff --git a/geom_bottleneck/tests/data/test_387_A b/geom_bottleneck/tests/data/test_387_A deleted file mode 100644 index ff92400..0000000 --- a/geom_bottleneck/tests/data/test_387_A +++ /dev/null @@ -1,3 +0,0 @@ -33 68 -20 115 -21 25 diff --git a/geom_bottleneck/tests/data/test_387_B b/geom_bottleneck/tests/data/test_387_B deleted file mode 100644 index c2e44a4..0000000 --- a/geom_bottleneck/tests/data/test_387_B +++ /dev/null @@ -1,3 +0,0 @@ -44 45 -24 66 -6 45 diff --git a/geom_bottleneck/tests/data/test_388_A b/geom_bottleneck/tests/data/test_388_A deleted file mode 100644 index 62b75be..0000000 --- a/geom_bottleneck/tests/data/test_388_A +++ /dev/null @@ -1,3 +0,0 @@ -89 163 -54 98 -45 86 diff --git a/geom_bottleneck/tests/data/test_388_B b/geom_bottleneck/tests/data/test_388_B deleted file mode 100644 index 025fdc6..0000000 --- a/geom_bottleneck/tests/data/test_388_B +++ /dev/null @@ -1,3 +0,0 @@ -83 139 -91 174 -74 93 diff --git a/geom_bottleneck/tests/data/test_389_A b/geom_bottleneck/tests/data/test_389_A deleted file mode 100644 index 5fa0b26..0000000 --- a/geom_bottleneck/tests/data/test_389_A +++ /dev/null @@ -1,3 +0,0 @@ -93 165 -72 168 -84 113 diff --git a/geom_bottleneck/tests/data/test_389_B b/geom_bottleneck/tests/data/test_389_B deleted file mode 100644 index 7ebd7f3..0000000 --- a/geom_bottleneck/tests/data/test_389_B +++ /dev/null @@ -1,3 +0,0 @@ -88 140 -82 133 -69 110 diff --git a/geom_bottleneck/tests/data/test_390_A b/geom_bottleneck/tests/data/test_390_A deleted file mode 100644 index 9f2c33d..0000000 --- a/geom_bottleneck/tests/data/test_390_A +++ /dev/null @@ -1,3 +0,0 @@ -90 139 -28 95 -66 131 diff --git a/geom_bottleneck/tests/data/test_390_B b/geom_bottleneck/tests/data/test_390_B deleted file mode 100644 index 833af00..0000000 --- a/geom_bottleneck/tests/data/test_390_B +++ /dev/null @@ -1,3 +0,0 @@ -79 116 -46 68 -39 102 diff --git a/geom_bottleneck/tests/data/test_391_A b/geom_bottleneck/tests/data/test_391_A deleted file mode 100644 index f353fda..0000000 --- a/geom_bottleneck/tests/data/test_391_A +++ /dev/null @@ -1,3 +0,0 @@ -38 51 -43 103 -80 129 diff --git a/geom_bottleneck/tests/data/test_391_B b/geom_bottleneck/tests/data/test_391_B deleted file mode 100644 index edff01f..0000000 --- a/geom_bottleneck/tests/data/test_391_B +++ /dev/null @@ -1,3 +0,0 @@ -22 116 -2 92 -13 109 diff --git a/geom_bottleneck/tests/data/test_392_A b/geom_bottleneck/tests/data/test_392_A deleted file mode 100644 index 317da32..0000000 --- a/geom_bottleneck/tests/data/test_392_A +++ /dev/null @@ -1,3 +0,0 @@ -10 15 -48 118 -86 151 diff --git a/geom_bottleneck/tests/data/test_392_B b/geom_bottleneck/tests/data/test_392_B deleted file mode 100644 index c8cb61c..0000000 --- a/geom_bottleneck/tests/data/test_392_B +++ /dev/null @@ -1,3 +0,0 @@ -73 173 -27 46 -73 146 diff --git a/geom_bottleneck/tests/data/test_393_A b/geom_bottleneck/tests/data/test_393_A deleted file mode 100644 index 10b537c..0000000 --- a/geom_bottleneck/tests/data/test_393_A +++ /dev/null @@ -1,3 +0,0 @@ -68 103 -89 121 -98 113 diff --git a/geom_bottleneck/tests/data/test_393_B b/geom_bottleneck/tests/data/test_393_B deleted file mode 100644 index 24bc23a..0000000 --- a/geom_bottleneck/tests/data/test_393_B +++ /dev/null @@ -1,3 +0,0 @@ -68 100 -41 63 -12 41 diff --git a/geom_bottleneck/tests/data/test_394_A b/geom_bottleneck/tests/data/test_394_A deleted file mode 100644 index e626e4a..0000000 --- a/geom_bottleneck/tests/data/test_394_A +++ /dev/null @@ -1,3 +0,0 @@ -16 63 -5 58 -73 84 diff --git a/geom_bottleneck/tests/data/test_394_B b/geom_bottleneck/tests/data/test_394_B deleted file mode 100644 index 24e086f..0000000 --- a/geom_bottleneck/tests/data/test_394_B +++ /dev/null @@ -1,3 +0,0 @@ -86 134 -41 102 -14 107 diff --git a/geom_bottleneck/tests/data/test_395_A b/geom_bottleneck/tests/data/test_395_A deleted file mode 100644 index fa5d9e1..0000000 --- a/geom_bottleneck/tests/data/test_395_A +++ /dev/null @@ -1,3 +0,0 @@ -76 152 -99 166 -91 110 diff --git a/geom_bottleneck/tests/data/test_395_B b/geom_bottleneck/tests/data/test_395_B deleted file mode 100644 index 8cc1049..0000000 --- a/geom_bottleneck/tests/data/test_395_B +++ /dev/null @@ -1,3 +0,0 @@ -42 109 -54 89 -51 113 diff --git a/geom_bottleneck/tests/data/test_396_A b/geom_bottleneck/tests/data/test_396_A deleted file mode 100644 index ab2ac42..0000000 --- a/geom_bottleneck/tests/data/test_396_A +++ /dev/null @@ -1,3 +0,0 @@ -0 22 -81 139 -26 41 diff --git a/geom_bottleneck/tests/data/test_396_B b/geom_bottleneck/tests/data/test_396_B deleted file mode 100644 index dd8a3d4..0000000 --- a/geom_bottleneck/tests/data/test_396_B +++ /dev/null @@ -1,3 +0,0 @@ -76 123 -23 24 -23 118 diff --git a/geom_bottleneck/tests/data/test_397_A b/geom_bottleneck/tests/data/test_397_A deleted file mode 100644 index 683bdca..0000000 --- a/geom_bottleneck/tests/data/test_397_A +++ /dev/null @@ -1,3 +0,0 @@ -53 128 -82 162 -34 127 diff --git a/geom_bottleneck/tests/data/test_397_B b/geom_bottleneck/tests/data/test_397_B deleted file mode 100644 index a7b2d72..0000000 --- a/geom_bottleneck/tests/data/test_397_B +++ /dev/null @@ -1,3 +0,0 @@ -49 95 -82 140 -21 92 diff --git a/geom_bottleneck/tests/data/test_398_A b/geom_bottleneck/tests/data/test_398_A deleted file mode 100644 index d802d50..0000000 --- a/geom_bottleneck/tests/data/test_398_A +++ /dev/null @@ -1,3 +0,0 @@ -37 98 -42 125 -79 99 diff --git a/geom_bottleneck/tests/data/test_398_B b/geom_bottleneck/tests/data/test_398_B deleted file mode 100644 index 9e5b5e1..0000000 --- a/geom_bottleneck/tests/data/test_398_B +++ /dev/null @@ -1,3 +0,0 @@ -48 91 -49 115 -65 158 diff --git a/geom_bottleneck/tests/data/test_399_A b/geom_bottleneck/tests/data/test_399_A deleted file mode 100644 index 204dfdf..0000000 --- a/geom_bottleneck/tests/data/test_399_A +++ /dev/null @@ -1,3 +0,0 @@ -87 153 -22 28 -68 72 diff --git a/geom_bottleneck/tests/data/test_399_B b/geom_bottleneck/tests/data/test_399_B deleted file mode 100644 index 58cb084..0000000 --- a/geom_bottleneck/tests/data/test_399_B +++ /dev/null @@ -1,3 +0,0 @@ -33 93 -3 10 -21 32 diff --git a/geom_bottleneck/tests/data/test_400_A b/geom_bottleneck/tests/data/test_400_A deleted file mode 100644 index b867cf5..0000000 --- a/geom_bottleneck/tests/data/test_400_A +++ /dev/null @@ -1,4 +0,0 @@ -55 89 -35 85 -62 84 -84 151 diff --git a/geom_bottleneck/tests/data/test_400_B b/geom_bottleneck/tests/data/test_400_B deleted file mode 100644 index 18df91d..0000000 --- a/geom_bottleneck/tests/data/test_400_B +++ /dev/null @@ -1,4 +0,0 @@ -37 89 -45 56 -4 79 -86 139 diff --git a/geom_bottleneck/tests/data/test_401_A b/geom_bottleneck/tests/data/test_401_A deleted file mode 100644 index 0f03308..0000000 --- a/geom_bottleneck/tests/data/test_401_A +++ /dev/null @@ -1,4 +0,0 @@ -15 34 -2 72 -14 50 -58 86 diff --git a/geom_bottleneck/tests/data/test_401_B b/geom_bottleneck/tests/data/test_401_B deleted file mode 100644 index b517be8..0000000 --- a/geom_bottleneck/tests/data/test_401_B +++ /dev/null @@ -1,4 +0,0 @@ -85 97 -24 54 -44 45 -75 171 diff --git a/geom_bottleneck/tests/data/test_402_A b/geom_bottleneck/tests/data/test_402_A deleted file mode 100644 index 6a6f79f..0000000 --- a/geom_bottleneck/tests/data/test_402_A +++ /dev/null @@ -1,4 +0,0 @@ -97 167 -17 65 -82 157 -88 110 diff --git a/geom_bottleneck/tests/data/test_402_B b/geom_bottleneck/tests/data/test_402_B deleted file mode 100644 index 6585f2b..0000000 --- a/geom_bottleneck/tests/data/test_402_B +++ /dev/null @@ -1,4 +0,0 @@ -69 87 -32 52 -71 92 -38 91 diff --git a/geom_bottleneck/tests/data/test_403_A b/geom_bottleneck/tests/data/test_403_A deleted file mode 100644 index 8b5929a..0000000 --- a/geom_bottleneck/tests/data/test_403_A +++ /dev/null @@ -1,4 +0,0 @@ -75 84 -86 184 -46 132 -79 136 diff --git a/geom_bottleneck/tests/data/test_403_B b/geom_bottleneck/tests/data/test_403_B deleted file mode 100644 index 71f089f..0000000 --- a/geom_bottleneck/tests/data/test_403_B +++ /dev/null @@ -1,4 +0,0 @@ -41 132 -44 72 -6 105 -91 187 diff --git a/geom_bottleneck/tests/data/test_404_A b/geom_bottleneck/tests/data/test_404_A deleted file mode 100644 index 10add8e..0000000 --- a/geom_bottleneck/tests/data/test_404_A +++ /dev/null @@ -1,4 +0,0 @@ -28 95 -43 126 -75 105 -2 101 diff --git a/geom_bottleneck/tests/data/test_404_B b/geom_bottleneck/tests/data/test_404_B deleted file mode 100644 index b38a7a7..0000000 --- a/geom_bottleneck/tests/data/test_404_B +++ /dev/null @@ -1,4 +0,0 @@ -49 56 -50 116 -54 132 -55 94 diff --git a/geom_bottleneck/tests/data/test_405_A b/geom_bottleneck/tests/data/test_405_A deleted file mode 100644 index 6cab1bd..0000000 --- a/geom_bottleneck/tests/data/test_405_A +++ /dev/null @@ -1,4 +0,0 @@ -53 120 -12 15 -80 83 -79 96 diff --git a/geom_bottleneck/tests/data/test_405_B b/geom_bottleneck/tests/data/test_405_B deleted file mode 100644 index 96645aa..0000000 --- a/geom_bottleneck/tests/data/test_405_B +++ /dev/null @@ -1,4 +0,0 @@ -41 113 -17 18 -22 39 -89 135 diff --git a/geom_bottleneck/tests/data/test_406_A b/geom_bottleneck/tests/data/test_406_A deleted file mode 100644 index cf08c48..0000000 --- a/geom_bottleneck/tests/data/test_406_A +++ /dev/null @@ -1,4 +0,0 @@ -88 168 -26 35 -96 126 -84 102 diff --git a/geom_bottleneck/tests/data/test_406_B b/geom_bottleneck/tests/data/test_406_B deleted file mode 100644 index b4ca0a0..0000000 --- a/geom_bottleneck/tests/data/test_406_B +++ /dev/null @@ -1,4 +0,0 @@ -81 173 -76 111 -2 15 -44 142 diff --git a/geom_bottleneck/tests/data/test_407_A b/geom_bottleneck/tests/data/test_407_A deleted file mode 100644 index 2372aba..0000000 --- a/geom_bottleneck/tests/data/test_407_A +++ /dev/null @@ -1,4 +0,0 @@ -55 92 -95 170 -51 149 -76 156 diff --git a/geom_bottleneck/tests/data/test_407_B b/geom_bottleneck/tests/data/test_407_B deleted file mode 100644 index bd43334..0000000 --- a/geom_bottleneck/tests/data/test_407_B +++ /dev/null @@ -1,4 +0,0 @@ -55 100 -17 86 -37 66 -97 131 diff --git a/geom_bottleneck/tests/data/test_408_A b/geom_bottleneck/tests/data/test_408_A deleted file mode 100644 index 91652d4..0000000 --- a/geom_bottleneck/tests/data/test_408_A +++ /dev/null @@ -1,4 +0,0 @@ -3 9 -50 134 -50 115 -30 82 diff --git a/geom_bottleneck/tests/data/test_408_B b/geom_bottleneck/tests/data/test_408_B deleted file mode 100644 index 5f936a7..0000000 --- a/geom_bottleneck/tests/data/test_408_B +++ /dev/null @@ -1,4 +0,0 @@ -57 103 -83 173 -20 58 -74 93 diff --git a/geom_bottleneck/tests/data/test_409_A b/geom_bottleneck/tests/data/test_409_A deleted file mode 100644 index b4d01d2..0000000 --- a/geom_bottleneck/tests/data/test_409_A +++ /dev/null @@ -1,4 +0,0 @@ -87 144 -33 79 -44 110 -42 92 diff --git a/geom_bottleneck/tests/data/test_409_B b/geom_bottleneck/tests/data/test_409_B deleted file mode 100644 index 4e15e41..0000000 --- a/geom_bottleneck/tests/data/test_409_B +++ /dev/null @@ -1,4 +0,0 @@ -2 39 -82 170 -1 40 -50 115 diff --git a/geom_bottleneck/tests/data/test_410_A b/geom_bottleneck/tests/data/test_410_A deleted file mode 100644 index c02ab24..0000000 --- a/geom_bottleneck/tests/data/test_410_A +++ /dev/null @@ -1,4 +0,0 @@ -15 80 -70 160 -52 144 -100 134 diff --git a/geom_bottleneck/tests/data/test_410_B b/geom_bottleneck/tests/data/test_410_B deleted file mode 100644 index d000095..0000000 --- a/geom_bottleneck/tests/data/test_410_B +++ /dev/null @@ -1,4 +0,0 @@ -87 144 -43 91 -68 77 -79 172 diff --git a/geom_bottleneck/tests/data/test_411_A b/geom_bottleneck/tests/data/test_411_A deleted file mode 100644 index 8130c4a..0000000 --- a/geom_bottleneck/tests/data/test_411_A +++ /dev/null @@ -1,4 +0,0 @@ -81 158 -50 142 -83 129 -74 85 diff --git a/geom_bottleneck/tests/data/test_411_B b/geom_bottleneck/tests/data/test_411_B deleted file mode 100644 index e53f61f..0000000 --- a/geom_bottleneck/tests/data/test_411_B +++ /dev/null @@ -1,4 +0,0 @@ -31 115 -57 108 -83 135 -2 26 diff --git a/geom_bottleneck/tests/data/test_412_A b/geom_bottleneck/tests/data/test_412_A deleted file mode 100644 index 34a88b0..0000000 --- a/geom_bottleneck/tests/data/test_412_A +++ /dev/null @@ -1,4 +0,0 @@ -5 31 -39 91 -24 75 -93 128 diff --git a/geom_bottleneck/tests/data/test_412_B b/geom_bottleneck/tests/data/test_412_B deleted file mode 100644 index a163ece..0000000 --- a/geom_bottleneck/tests/data/test_412_B +++ /dev/null @@ -1,4 +0,0 @@ -0 76 -97 144 -55 92 -1 67 diff --git a/geom_bottleneck/tests/data/test_413_A b/geom_bottleneck/tests/data/test_413_A deleted file mode 100644 index 61d6f70..0000000 --- a/geom_bottleneck/tests/data/test_413_A +++ /dev/null @@ -1,4 +0,0 @@ -44 111 -69 88 -8 80 -78 113 diff --git a/geom_bottleneck/tests/data/test_413_B b/geom_bottleneck/tests/data/test_413_B deleted file mode 100644 index 5b9dc54..0000000 --- a/geom_bottleneck/tests/data/test_413_B +++ /dev/null @@ -1,4 +0,0 @@ -87 159 -53 114 -70 136 -63 103 diff --git a/geom_bottleneck/tests/data/test_414_A b/geom_bottleneck/tests/data/test_414_A deleted file mode 100644 index 933f1e4..0000000 --- a/geom_bottleneck/tests/data/test_414_A +++ /dev/null @@ -1,4 +0,0 @@ -39 44 -29 113 -85 158 -59 77 diff --git a/geom_bottleneck/tests/data/test_414_B b/geom_bottleneck/tests/data/test_414_B deleted file mode 100644 index b54a5fe..0000000 --- a/geom_bottleneck/tests/data/test_414_B +++ /dev/null @@ -1,4 +0,0 @@ -14 109 -5 90 -85 134 -60 88 diff --git a/geom_bottleneck/tests/data/test_415_A b/geom_bottleneck/tests/data/test_415_A deleted file mode 100644 index bbce6b8..0000000 --- a/geom_bottleneck/tests/data/test_415_A +++ /dev/null @@ -1,4 +0,0 @@ -23 70 -40 46 -21 109 -50 149 diff --git a/geom_bottleneck/tests/data/test_415_B b/geom_bottleneck/tests/data/test_415_B deleted file mode 100644 index 3943a46..0000000 --- a/geom_bottleneck/tests/data/test_415_B +++ /dev/null @@ -1,4 +0,0 @@ -14 80 -74 154 -50 70 -90 173 diff --git a/geom_bottleneck/tests/data/test_416_A b/geom_bottleneck/tests/data/test_416_A deleted file mode 100644 index c7a9a3d..0000000 --- a/geom_bottleneck/tests/data/test_416_A +++ /dev/null @@ -1,4 +0,0 @@ -23 53 -20 94 -89 105 -98 146 diff --git a/geom_bottleneck/tests/data/test_416_B b/geom_bottleneck/tests/data/test_416_B deleted file mode 100644 index 6e8c430..0000000 --- a/geom_bottleneck/tests/data/test_416_B +++ /dev/null @@ -1,4 +0,0 @@ -73 74 -62 124 -95 126 -62 141 diff --git a/geom_bottleneck/tests/data/test_417_A b/geom_bottleneck/tests/data/test_417_A deleted file mode 100644 index 6e5688c..0000000 --- a/geom_bottleneck/tests/data/test_417_A +++ /dev/null @@ -1,4 +0,0 @@ -66 148 -86 117 -4 32 -95 146 diff --git a/geom_bottleneck/tests/data/test_417_B b/geom_bottleneck/tests/data/test_417_B deleted file mode 100644 index 2bfa9c2..0000000 --- a/geom_bottleneck/tests/data/test_417_B +++ /dev/null @@ -1,4 +0,0 @@ -87 111 -23 122 -62 95 -12 22 diff --git a/geom_bottleneck/tests/data/test_418_A b/geom_bottleneck/tests/data/test_418_A deleted file mode 100644 index 9ab98de..0000000 --- a/geom_bottleneck/tests/data/test_418_A +++ /dev/null @@ -1,4 +0,0 @@ -29 122 -71 102 -70 109 -43 120 diff --git a/geom_bottleneck/tests/data/test_418_B b/geom_bottleneck/tests/data/test_418_B deleted file mode 100644 index f3231de..0000000 --- a/geom_bottleneck/tests/data/test_418_B +++ /dev/null @@ -1,4 +0,0 @@ -45 121 -58 64 -57 105 -41 138 diff --git a/geom_bottleneck/tests/data/test_419_A b/geom_bottleneck/tests/data/test_419_A deleted file mode 100644 index 825d191..0000000 --- a/geom_bottleneck/tests/data/test_419_A +++ /dev/null @@ -1,4 +0,0 @@ -28 111 -100 167 -17 59 -10 38 diff --git a/geom_bottleneck/tests/data/test_419_B b/geom_bottleneck/tests/data/test_419_B deleted file mode 100644 index 101be4f..0000000 --- a/geom_bottleneck/tests/data/test_419_B +++ /dev/null @@ -1,4 +0,0 @@ -63 99 -78 143 -67 150 -24 77 diff --git a/geom_bottleneck/tests/data/test_420_A b/geom_bottleneck/tests/data/test_420_A deleted file mode 100644 index 455d829..0000000 --- a/geom_bottleneck/tests/data/test_420_A +++ /dev/null @@ -1,5 +0,0 @@ -89 160 -26 36 -37 61 -95 137 -41 68 diff --git a/geom_bottleneck/tests/data/test_420_B b/geom_bottleneck/tests/data/test_420_B deleted file mode 100644 index 27e1c6d..0000000 --- a/geom_bottleneck/tests/data/test_420_B +++ /dev/null @@ -1,5 +0,0 @@ -100 185 -31 112 -78 129 -49 143 -74 171 diff --git a/geom_bottleneck/tests/data/test_421_A b/geom_bottleneck/tests/data/test_421_A deleted file mode 100644 index c08ddf1..0000000 --- a/geom_bottleneck/tests/data/test_421_A +++ /dev/null @@ -1,5 +0,0 @@ -27 127 -2 101 -42 52 -5 81 -4 62 diff --git a/geom_bottleneck/tests/data/test_421_B b/geom_bottleneck/tests/data/test_421_B deleted file mode 100644 index 37cbda8..0000000 --- a/geom_bottleneck/tests/data/test_421_B +++ /dev/null @@ -1,5 +0,0 @@ -27 40 -67 78 -50 122 -41 95 -1 63 diff --git a/geom_bottleneck/tests/data/test_422_A b/geom_bottleneck/tests/data/test_422_A deleted file mode 100644 index 348a116..0000000 --- a/geom_bottleneck/tests/data/test_422_A +++ /dev/null @@ -1,5 +0,0 @@ -54 143 -21 24 -96 180 -13 113 -93 134 diff --git a/geom_bottleneck/tests/data/test_422_B b/geom_bottleneck/tests/data/test_422_B deleted file mode 100644 index 0f33ae9..0000000 --- a/geom_bottleneck/tests/data/test_422_B +++ /dev/null @@ -1,5 +0,0 @@ -5 18 -63 106 -29 94 -59 155 -66 155 diff --git a/geom_bottleneck/tests/data/test_423_A b/geom_bottleneck/tests/data/test_423_A deleted file mode 100644 index b3b448e..0000000 --- a/geom_bottleneck/tests/data/test_423_A +++ /dev/null @@ -1,5 +0,0 @@ -47 88 -80 138 -75 129 -2 90 -58 133 diff --git a/geom_bottleneck/tests/data/test_423_B b/geom_bottleneck/tests/data/test_423_B deleted file mode 100644 index 873a875..0000000 --- a/geom_bottleneck/tests/data/test_423_B +++ /dev/null @@ -1,5 +0,0 @@ -77 129 -99 174 -93 104 -71 93 -18 26 diff --git a/geom_bottleneck/tests/data/test_424_A b/geom_bottleneck/tests/data/test_424_A deleted file mode 100644 index ab20fc1..0000000 --- a/geom_bottleneck/tests/data/test_424_A +++ /dev/null @@ -1,5 +0,0 @@ -73 167 -50 133 -25 41 -46 87 -27 93 diff --git a/geom_bottleneck/tests/data/test_424_B b/geom_bottleneck/tests/data/test_424_B deleted file mode 100644 index a0f5059..0000000 --- a/geom_bottleneck/tests/data/test_424_B +++ /dev/null @@ -1,5 +0,0 @@ -71 113 -54 63 -0 33 -27 127 -14 79 diff --git a/geom_bottleneck/tests/data/test_425_A b/geom_bottleneck/tests/data/test_425_A deleted file mode 100644 index 7116974..0000000 --- a/geom_bottleneck/tests/data/test_425_A +++ /dev/null @@ -1,5 +0,0 @@ -90 168 -44 63 -83 88 -80 81 -13 94 diff --git a/geom_bottleneck/tests/data/test_425_B b/geom_bottleneck/tests/data/test_425_B deleted file mode 100644 index 6f1e713..0000000 --- a/geom_bottleneck/tests/data/test_425_B +++ /dev/null @@ -1,5 +0,0 @@ -66 161 -99 137 -71 147 -58 80 -42 96 diff --git a/geom_bottleneck/tests/data/test_426_A b/geom_bottleneck/tests/data/test_426_A deleted file mode 100644 index 6404cdd..0000000 --- a/geom_bottleneck/tests/data/test_426_A +++ /dev/null @@ -1,5 +0,0 @@ -90 161 -75 121 -54 111 -21 84 -73 106 diff --git a/geom_bottleneck/tests/data/test_426_B b/geom_bottleneck/tests/data/test_426_B deleted file mode 100644 index 06fbc21..0000000 --- a/geom_bottleneck/tests/data/test_426_B +++ /dev/null @@ -1,5 +0,0 @@ -82 109 -85 100 -26 92 -52 91 -23 83 diff --git a/geom_bottleneck/tests/data/test_427_A b/geom_bottleneck/tests/data/test_427_A deleted file mode 100644 index ab36b49..0000000 --- a/geom_bottleneck/tests/data/test_427_A +++ /dev/null @@ -1,5 +0,0 @@ -15 28 -39 93 -1 43 -16 98 -81 167 diff --git a/geom_bottleneck/tests/data/test_427_B b/geom_bottleneck/tests/data/test_427_B deleted file mode 100644 index eb34e17..0000000 --- a/geom_bottleneck/tests/data/test_427_B +++ /dev/null @@ -1,5 +0,0 @@ -57 70 -99 181 -26 81 -13 32 -95 153 diff --git a/geom_bottleneck/tests/data/test_428_A b/geom_bottleneck/tests/data/test_428_A deleted file mode 100644 index 12957ab..0000000 --- a/geom_bottleneck/tests/data/test_428_A +++ /dev/null @@ -1,5 +0,0 @@ -85 155 -86 173 -63 88 -50 84 -75 85 diff --git a/geom_bottleneck/tests/data/test_428_B b/geom_bottleneck/tests/data/test_428_B deleted file mode 100644 index b0fd1c4..0000000 --- a/geom_bottleneck/tests/data/test_428_B +++ /dev/null @@ -1,5 +0,0 @@ -70 113 -92 93 -57 103 -40 81 -9 47 diff --git a/geom_bottleneck/tests/data/test_429_A b/geom_bottleneck/tests/data/test_429_A deleted file mode 100644 index 0cdda41..0000000 --- a/geom_bottleneck/tests/data/test_429_A +++ /dev/null @@ -1,5 +0,0 @@ -90 165 -83 128 -5 28 -68 121 -1 67 diff --git a/geom_bottleneck/tests/data/test_429_B b/geom_bottleneck/tests/data/test_429_B deleted file mode 100644 index 0180a92..0000000 --- a/geom_bottleneck/tests/data/test_429_B +++ /dev/null @@ -1,5 +0,0 @@ -31 34 -88 147 -17 91 -46 138 -13 81 diff --git a/geom_bottleneck/tests/data/test_430_A b/geom_bottleneck/tests/data/test_430_A deleted file mode 100644 index 03029c6..0000000 --- a/geom_bottleneck/tests/data/test_430_A +++ /dev/null @@ -1,5 +0,0 @@ -85 181 -93 118 -77 167 -39 110 -21 22 diff --git a/geom_bottleneck/tests/data/test_430_B b/geom_bottleneck/tests/data/test_430_B deleted file mode 100644 index 9c58f1f..0000000 --- a/geom_bottleneck/tests/data/test_430_B +++ /dev/null @@ -1,5 +0,0 @@ -59 88 -28 29 -56 57 -3 73 -78 93 diff --git a/geom_bottleneck/tests/data/test_431_A b/geom_bottleneck/tests/data/test_431_A deleted file mode 100644 index 272ec7d..0000000 --- a/geom_bottleneck/tests/data/test_431_A +++ /dev/null @@ -1,5 +0,0 @@ -26 28 -90 172 -46 118 -25 102 -78 141 diff --git a/geom_bottleneck/tests/data/test_431_B b/geom_bottleneck/tests/data/test_431_B deleted file mode 100644 index 9ccc9d1..0000000 --- a/geom_bottleneck/tests/data/test_431_B +++ /dev/null @@ -1,5 +0,0 @@ -25 107 -61 128 -24 111 -47 48 -70 96 diff --git a/geom_bottleneck/tests/data/test_432_A b/geom_bottleneck/tests/data/test_432_A deleted file mode 100644 index 91dbacb..0000000 --- a/geom_bottleneck/tests/data/test_432_A +++ /dev/null @@ -1,5 +0,0 @@ -53 78 -16 74 -6 106 -46 145 -33 41 diff --git a/geom_bottleneck/tests/data/test_432_B b/geom_bottleneck/tests/data/test_432_B deleted file mode 100644 index 47afd85..0000000 --- a/geom_bottleneck/tests/data/test_432_B +++ /dev/null @@ -1,5 +0,0 @@ -16 100 -70 119 -42 137 -94 164 -94 105 diff --git a/geom_bottleneck/tests/data/test_433_A b/geom_bottleneck/tests/data/test_433_A deleted file mode 100644 index 1577e13..0000000 --- a/geom_bottleneck/tests/data/test_433_A +++ /dev/null @@ -1,5 +0,0 @@ -30 97 -79 93 -42 97 -88 140 -85 131 diff --git a/geom_bottleneck/tests/data/test_433_B b/geom_bottleneck/tests/data/test_433_B deleted file mode 100644 index f63aea0..0000000 --- a/geom_bottleneck/tests/data/test_433_B +++ /dev/null @@ -1,5 +0,0 @@ -38 55 -29 129 -30 97 -11 43 -26 59 diff --git a/geom_bottleneck/tests/data/test_434_A b/geom_bottleneck/tests/data/test_434_A deleted file mode 100644 index 5ef7655..0000000 --- a/geom_bottleneck/tests/data/test_434_A +++ /dev/null @@ -1,5 +0,0 @@ -63 102 -32 38 -98 179 -89 136 -39 67 diff --git a/geom_bottleneck/tests/data/test_434_B b/geom_bottleneck/tests/data/test_434_B deleted file mode 100644 index a089420..0000000 --- a/geom_bottleneck/tests/data/test_434_B +++ /dev/null @@ -1,5 +0,0 @@ -92 101 -9 11 -47 138 -95 176 -8 87 diff --git a/geom_bottleneck/tests/data/test_435_A b/geom_bottleneck/tests/data/test_435_A deleted file mode 100644 index 9021906..0000000 --- a/geom_bottleneck/tests/data/test_435_A +++ /dev/null @@ -1,5 +0,0 @@ -34 98 -33 80 -18 85 -36 100 -60 64 diff --git a/geom_bottleneck/tests/data/test_435_B b/geom_bottleneck/tests/data/test_435_B deleted file mode 100644 index 225d87c..0000000 --- a/geom_bottleneck/tests/data/test_435_B +++ /dev/null @@ -1,5 +0,0 @@ -96 175 -12 80 -79 166 -28 88 -81 150 diff --git a/geom_bottleneck/tests/data/test_436_A b/geom_bottleneck/tests/data/test_436_A deleted file mode 100644 index 4004cfe..0000000 --- a/geom_bottleneck/tests/data/test_436_A +++ /dev/null @@ -1,5 +0,0 @@ -59 101 -23 98 -15 108 -65 119 -67 91 diff --git a/geom_bottleneck/tests/data/test_436_B b/geom_bottleneck/tests/data/test_436_B deleted file mode 100644 index 8fbd097..0000000 --- a/geom_bottleneck/tests/data/test_436_B +++ /dev/null @@ -1,5 +0,0 @@ -23 86 -58 123 -18 62 -100 165 -6 105 diff --git a/geom_bottleneck/tests/data/test_437_A b/geom_bottleneck/tests/data/test_437_A deleted file mode 100644 index 8210316..0000000 --- a/geom_bottleneck/tests/data/test_437_A +++ /dev/null @@ -1,5 +0,0 @@ -10 38 -90 165 -35 122 -100 170 -62 93 diff --git a/geom_bottleneck/tests/data/test_437_B b/geom_bottleneck/tests/data/test_437_B deleted file mode 100644 index c7e55b3..0000000 --- a/geom_bottleneck/tests/data/test_437_B +++ /dev/null @@ -1,5 +0,0 @@ -27 73 -87 187 -78 176 -44 82 -58 77 diff --git a/geom_bottleneck/tests/data/test_438_A b/geom_bottleneck/tests/data/test_438_A deleted file mode 100644 index e2f48a4..0000000 --- a/geom_bottleneck/tests/data/test_438_A +++ /dev/null @@ -1,5 +0,0 @@ -14 74 -65 127 -21 51 -19 42 -58 96 diff --git a/geom_bottleneck/tests/data/test_438_B b/geom_bottleneck/tests/data/test_438_B deleted file mode 100644 index eb84689..0000000 --- a/geom_bottleneck/tests/data/test_438_B +++ /dev/null @@ -1,5 +0,0 @@ -97 165 -49 116 -73 83 -6 8 -99 153 diff --git a/geom_bottleneck/tests/data/test_439_A b/geom_bottleneck/tests/data/test_439_A deleted file mode 100644 index fc36518..0000000 --- a/geom_bottleneck/tests/data/test_439_A +++ /dev/null @@ -1,5 +0,0 @@ -66 120 -59 119 -40 56 -42 120 -48 140 diff --git a/geom_bottleneck/tests/data/test_439_B b/geom_bottleneck/tests/data/test_439_B deleted file mode 100644 index b9de5b7..0000000 --- a/geom_bottleneck/tests/data/test_439_B +++ /dev/null @@ -1,5 +0,0 @@ -25 94 -94 157 -64 156 -79 100 -28 98 diff --git a/geom_bottleneck/tests/data/test_440_A b/geom_bottleneck/tests/data/test_440_A deleted file mode 100644 index 4f0cdc2..0000000 --- a/geom_bottleneck/tests/data/test_440_A +++ /dev/null @@ -1,6 +0,0 @@ -25 32 -90 153 -23 86 -4 29 -52 124 -17 75 diff --git a/geom_bottleneck/tests/data/test_440_B b/geom_bottleneck/tests/data/test_440_B deleted file mode 100644 index c06754e..0000000 --- a/geom_bottleneck/tests/data/test_440_B +++ /dev/null @@ -1,6 +0,0 @@ -47 132 -64 156 -96 149 -31 94 -86 94 -40 63 diff --git a/geom_bottleneck/tests/data/test_441_A b/geom_bottleneck/tests/data/test_441_A deleted file mode 100644 index f1d7779..0000000 --- a/geom_bottleneck/tests/data/test_441_A +++ /dev/null @@ -1,6 +0,0 @@ -45 121 -61 95 -57 68 -10 82 -90 147 -80 179 diff --git a/geom_bottleneck/tests/data/test_441_B b/geom_bottleneck/tests/data/test_441_B deleted file mode 100644 index 039c8db..0000000 --- a/geom_bottleneck/tests/data/test_441_B +++ /dev/null @@ -1,6 +0,0 @@ -97 122 -44 109 -15 48 -49 106 -30 65 -66 70 diff --git a/geom_bottleneck/tests/data/test_442_A b/geom_bottleneck/tests/data/test_442_A deleted file mode 100644 index 9a22bd2..0000000 --- a/geom_bottleneck/tests/data/test_442_A +++ /dev/null @@ -1,6 +0,0 @@ -44 47 -6 81 -66 163 -74 144 -66 135 -62 63 diff --git a/geom_bottleneck/tests/data/test_442_B b/geom_bottleneck/tests/data/test_442_B deleted file mode 100644 index 9663228..0000000 --- a/geom_bottleneck/tests/data/test_442_B +++ /dev/null @@ -1,6 +0,0 @@ -41 65 -52 109 -96 175 -80 93 -32 78 -97 124 diff --git a/geom_bottleneck/tests/data/test_443_A b/geom_bottleneck/tests/data/test_443_A deleted file mode 100644 index 27d9885..0000000 --- a/geom_bottleneck/tests/data/test_443_A +++ /dev/null @@ -1,6 +0,0 @@ -19 38 -86 142 -86 132 -32 118 -73 138 -25 83 diff --git a/geom_bottleneck/tests/data/test_443_B b/geom_bottleneck/tests/data/test_443_B deleted file mode 100644 index c084218..0000000 --- a/geom_bottleneck/tests/data/test_443_B +++ /dev/null @@ -1,6 +0,0 @@ -78 165 -88 138 -5 29 -81 109 -4 96 -69 130 diff --git a/geom_bottleneck/tests/data/test_444_A b/geom_bottleneck/tests/data/test_444_A deleted file mode 100644 index 86dfb79..0000000 --- a/geom_bottleneck/tests/data/test_444_A +++ /dev/null @@ -1,6 +0,0 @@ -22 23 -59 111 -65 91 -0 56 -92 156 -67 69 diff --git a/geom_bottleneck/tests/data/test_444_B b/geom_bottleneck/tests/data/test_444_B deleted file mode 100644 index b7f54f9..0000000 --- a/geom_bottleneck/tests/data/test_444_B +++ /dev/null @@ -1,6 +0,0 @@ -20 39 -0 44 -34 84 -3 30 -70 96 -92 127 diff --git a/geom_bottleneck/tests/data/test_445_A b/geom_bottleneck/tests/data/test_445_A deleted file mode 100644 index 6ec29f6..0000000 --- a/geom_bottleneck/tests/data/test_445_A +++ /dev/null @@ -1,6 +0,0 @@ -49 64 -36 102 -43 120 -98 194 -65 110 -49 89 diff --git a/geom_bottleneck/tests/data/test_445_B b/geom_bottleneck/tests/data/test_445_B deleted file mode 100644 index 7e5ce8e..0000000 --- a/geom_bottleneck/tests/data/test_445_B +++ /dev/null @@ -1,6 +0,0 @@ -84 88 -42 132 -26 36 -11 91 -17 114 -37 70 diff --git a/geom_bottleneck/tests/data/test_446_A b/geom_bottleneck/tests/data/test_446_A deleted file mode 100644 index 2e66159..0000000 --- a/geom_bottleneck/tests/data/test_446_A +++ /dev/null @@ -1,6 +0,0 @@ -48 147 -86 146 -42 64 -39 111 -71 113 -59 63 diff --git a/geom_bottleneck/tests/data/test_446_B b/geom_bottleneck/tests/data/test_446_B deleted file mode 100644 index b4a4baa..0000000 --- a/geom_bottleneck/tests/data/test_446_B +++ /dev/null @@ -1,6 +0,0 @@ -14 15 -64 163 -23 41 -4 90 -3 23 -66 68 diff --git a/geom_bottleneck/tests/data/test_447_A b/geom_bottleneck/tests/data/test_447_A deleted file mode 100644 index adbca26..0000000 --- a/geom_bottleneck/tests/data/test_447_A +++ /dev/null @@ -1,6 +0,0 @@ -91 119 -93 186 -11 53 -85 87 -8 50 -69 84 diff --git a/geom_bottleneck/tests/data/test_447_B b/geom_bottleneck/tests/data/test_447_B deleted file mode 100644 index c996a99..0000000 --- a/geom_bottleneck/tests/data/test_447_B +++ /dev/null @@ -1,6 +0,0 @@ -67 71 -77 143 -48 103 -80 121 -73 107 -18 36 diff --git a/geom_bottleneck/tests/data/test_448_A b/geom_bottleneck/tests/data/test_448_A deleted file mode 100644 index 3b1d2ac..0000000 --- a/geom_bottleneck/tests/data/test_448_A +++ /dev/null @@ -1,6 +0,0 @@ -99 127 -80 81 -72 138 -40 123 -76 120 -13 52 diff --git a/geom_bottleneck/tests/data/test_448_B b/geom_bottleneck/tests/data/test_448_B deleted file mode 100644 index 358c96b..0000000 --- a/geom_bottleneck/tests/data/test_448_B +++ /dev/null @@ -1,6 +0,0 @@ -94 105 -31 105 -2 50 -91 132 -63 86 -81 116 diff --git a/geom_bottleneck/tests/data/test_449_A b/geom_bottleneck/tests/data/test_449_A deleted file mode 100644 index 1b9fdde..0000000 --- a/geom_bottleneck/tests/data/test_449_A +++ /dev/null @@ -1,6 +0,0 @@ -99 164 -24 78 -75 119 -62 129 -93 117 -34 124 diff --git a/geom_bottleneck/tests/data/test_449_B b/geom_bottleneck/tests/data/test_449_B deleted file mode 100644 index 39ca7bf..0000000 --- a/geom_bottleneck/tests/data/test_449_B +++ /dev/null @@ -1,6 +0,0 @@ -5 101 -53 86 -58 92 -99 198 -48 57 -34 102 diff --git a/geom_bottleneck/tests/data/test_450_A b/geom_bottleneck/tests/data/test_450_A deleted file mode 100644 index c97d1bd..0000000 --- a/geom_bottleneck/tests/data/test_450_A +++ /dev/null @@ -1,6 +0,0 @@ -98 112 -27 55 -36 69 -5 32 -36 85 -24 90 diff --git a/geom_bottleneck/tests/data/test_450_B b/geom_bottleneck/tests/data/test_450_B deleted file mode 100644 index 038d497..0000000 --- a/geom_bottleneck/tests/data/test_450_B +++ /dev/null @@ -1,6 +0,0 @@ -66 156 -74 158 -85 136 -4 53 -61 93 -13 37 diff --git a/geom_bottleneck/tests/data/test_451_A b/geom_bottleneck/tests/data/test_451_A deleted file mode 100644 index 1c77ff4..0000000 --- a/geom_bottleneck/tests/data/test_451_A +++ /dev/null @@ -1,6 +0,0 @@ -83 99 -42 129 -82 117 -35 132 -1 101 -53 115 diff --git a/geom_bottleneck/tests/data/test_451_B b/geom_bottleneck/tests/data/test_451_B deleted file mode 100644 index 37c9b78..0000000 --- a/geom_bottleneck/tests/data/test_451_B +++ /dev/null @@ -1,6 +0,0 @@ -18 102 -62 111 -17 40 -78 135 -20 23 -69 77 diff --git a/geom_bottleneck/tests/data/test_452_A b/geom_bottleneck/tests/data/test_452_A deleted file mode 100644 index 24159ea..0000000 --- a/geom_bottleneck/tests/data/test_452_A +++ /dev/null @@ -1,6 +0,0 @@ -12 65 -2 42 -61 93 -22 31 -66 139 -44 106 diff --git a/geom_bottleneck/tests/data/test_452_B b/geom_bottleneck/tests/data/test_452_B deleted file mode 100644 index 602fb45..0000000 --- a/geom_bottleneck/tests/data/test_452_B +++ /dev/null @@ -1,6 +0,0 @@ -88 156 -1 91 -7 42 -83 94 -50 133 -82 146 diff --git a/geom_bottleneck/tests/data/test_453_A b/geom_bottleneck/tests/data/test_453_A deleted file mode 100644 index aa29541..0000000 --- a/geom_bottleneck/tests/data/test_453_A +++ /dev/null @@ -1,6 +0,0 @@ -39 50 -28 76 -83 87 -27 38 -85 120 -57 78 diff --git a/geom_bottleneck/tests/data/test_453_B b/geom_bottleneck/tests/data/test_453_B deleted file mode 100644 index 7cce047..0000000 --- a/geom_bottleneck/tests/data/test_453_B +++ /dev/null @@ -1,6 +0,0 @@ -59 106 -28 69 -91 189 -43 57 -32 33 -75 156 diff --git a/geom_bottleneck/tests/data/test_454_A b/geom_bottleneck/tests/data/test_454_A deleted file mode 100644 index 3e5e41b..0000000 --- a/geom_bottleneck/tests/data/test_454_A +++ /dev/null @@ -1,6 +0,0 @@ -32 39 -6 50 -72 153 -38 115 -23 45 -18 34 diff --git a/geom_bottleneck/tests/data/test_454_B b/geom_bottleneck/tests/data/test_454_B deleted file mode 100644 index e5e2305..0000000 --- a/geom_bottleneck/tests/data/test_454_B +++ /dev/null @@ -1,6 +0,0 @@ -83 180 -76 118 -76 114 -95 192 -19 53 -42 81 diff --git a/geom_bottleneck/tests/data/test_455_A b/geom_bottleneck/tests/data/test_455_A deleted file mode 100644 index d06d256..0000000 --- a/geom_bottleneck/tests/data/test_455_A +++ /dev/null @@ -1,6 +0,0 @@ -80 110 -12 104 -89 151 -71 168 -91 95 -27 55 diff --git a/geom_bottleneck/tests/data/test_455_B b/geom_bottleneck/tests/data/test_455_B deleted file mode 100644 index afdab0b..0000000 --- a/geom_bottleneck/tests/data/test_455_B +++ /dev/null @@ -1,6 +0,0 @@ -68 166 -33 38 -66 158 -72 93 -66 96 -82 88 diff --git a/geom_bottleneck/tests/data/test_456_A b/geom_bottleneck/tests/data/test_456_A deleted file mode 100644 index 7a30bf3..0000000 --- a/geom_bottleneck/tests/data/test_456_A +++ /dev/null @@ -1,6 +0,0 @@ -72 114 -8 79 -19 50 -72 134 -94 108 -5 24 diff --git a/geom_bottleneck/tests/data/test_456_B b/geom_bottleneck/tests/data/test_456_B deleted file mode 100644 index a1a1329..0000000 --- a/geom_bottleneck/tests/data/test_456_B +++ /dev/null @@ -1,6 +0,0 @@ -86 114 -38 105 -46 98 -20 90 -98 118 -52 142 diff --git a/geom_bottleneck/tests/data/test_457_A b/geom_bottleneck/tests/data/test_457_A deleted file mode 100644 index d5339ec..0000000 --- a/geom_bottleneck/tests/data/test_457_A +++ /dev/null @@ -1,6 +0,0 @@ -70 109 -61 79 -55 152 -88 187 -64 136 -71 110 diff --git a/geom_bottleneck/tests/data/test_457_B b/geom_bottleneck/tests/data/test_457_B deleted file mode 100644 index e96c110..0000000 --- a/geom_bottleneck/tests/data/test_457_B +++ /dev/null @@ -1,6 +0,0 @@ -57 128 -47 82 -87 96 -97 132 -23 41 -6 104 diff --git a/geom_bottleneck/tests/data/test_458_A b/geom_bottleneck/tests/data/test_458_A deleted file mode 100644 index a9287b2..0000000 --- a/geom_bottleneck/tests/data/test_458_A +++ /dev/null @@ -1,6 +0,0 @@ -43 63 -79 80 -77 142 -50 116 -43 46 -45 139 diff --git a/geom_bottleneck/tests/data/test_458_B b/geom_bottleneck/tests/data/test_458_B deleted file mode 100644 index 63b7c63..0000000 --- a/geom_bottleneck/tests/data/test_458_B +++ /dev/null @@ -1,6 +0,0 @@ -69 79 -9 64 -29 115 -33 87 -5 100 -24 71 diff --git a/geom_bottleneck/tests/data/test_459_A b/geom_bottleneck/tests/data/test_459_A deleted file mode 100644 index f8a82f8..0000000 --- a/geom_bottleneck/tests/data/test_459_A +++ /dev/null @@ -1,6 +0,0 @@ -90 94 -75 107 -80 88 -35 98 -53 84 -78 93 diff --git a/geom_bottleneck/tests/data/test_459_B b/geom_bottleneck/tests/data/test_459_B deleted file mode 100644 index dc645ee..0000000 --- a/geom_bottleneck/tests/data/test_459_B +++ /dev/null @@ -1,6 +0,0 @@ -95 101 -29 59 -32 77 -17 19 -92 108 -6 19 diff --git a/geom_bottleneck/tests/data/test_460_A b/geom_bottleneck/tests/data/test_460_A deleted file mode 100644 index 000c14e..0000000 --- a/geom_bottleneck/tests/data/test_460_A +++ /dev/null @@ -1,7 +0,0 @@ -88 127 -65 145 -59 149 -69 152 -61 146 -28 90 -21 104 diff --git a/geom_bottleneck/tests/data/test_460_B b/geom_bottleneck/tests/data/test_460_B deleted file mode 100644 index 4a7d4a3..0000000 --- a/geom_bottleneck/tests/data/test_460_B +++ /dev/null @@ -1,7 +0,0 @@ -47 131 -59 153 -24 95 -63 96 -6 102 -91 98 -31 118 diff --git a/geom_bottleneck/tests/data/test_461_A b/geom_bottleneck/tests/data/test_461_A deleted file mode 100644 index aaebf2d..0000000 --- a/geom_bottleneck/tests/data/test_461_A +++ /dev/null @@ -1,7 +0,0 @@ -57 67 -75 82 -63 88 -57 139 -67 103 -15 68 -100 117 diff --git a/geom_bottleneck/tests/data/test_461_B b/geom_bottleneck/tests/data/test_461_B deleted file mode 100644 index 183fa51..0000000 --- a/geom_bottleneck/tests/data/test_461_B +++ /dev/null @@ -1,7 +0,0 @@ -47 127 -9 35 -14 75 -29 92 -76 171 -9 56 -56 86 diff --git a/geom_bottleneck/tests/data/test_462_A b/geom_bottleneck/tests/data/test_462_A deleted file mode 100644 index df1936d..0000000 --- a/geom_bottleneck/tests/data/test_462_A +++ /dev/null @@ -1,7 +0,0 @@ -0 90 -50 113 -73 149 -86 105 -20 105 -14 75 -41 115 diff --git a/geom_bottleneck/tests/data/test_462_B b/geom_bottleneck/tests/data/test_462_B deleted file mode 100644 index 5be3bf0..0000000 --- a/geom_bottleneck/tests/data/test_462_B +++ /dev/null @@ -1,7 +0,0 @@ -88 133 -47 100 -27 48 -54 153 -91 116 -90 150 -0 82 diff --git a/geom_bottleneck/tests/data/test_463_A b/geom_bottleneck/tests/data/test_463_A deleted file mode 100644 index c8776fe..0000000 --- a/geom_bottleneck/tests/data/test_463_A +++ /dev/null @@ -1,7 +0,0 @@ -34 67 -34 92 -53 99 -64 155 -92 157 -16 55 -75 156 diff --git a/geom_bottleneck/tests/data/test_463_B b/geom_bottleneck/tests/data/test_463_B deleted file mode 100644 index a9f1273..0000000 --- a/geom_bottleneck/tests/data/test_463_B +++ /dev/null @@ -1,7 +0,0 @@ -20 72 -99 146 -70 158 -4 38 -92 102 -20 32 -47 135 diff --git a/geom_bottleneck/tests/data/test_464_A b/geom_bottleneck/tests/data/test_464_A deleted file mode 100644 index 98ff6a9..0000000 --- a/geom_bottleneck/tests/data/test_464_A +++ /dev/null @@ -1,7 +0,0 @@ -69 149 -52 115 -32 82 -22 60 -55 56 -80 116 -62 72 diff --git a/geom_bottleneck/tests/data/test_464_B b/geom_bottleneck/tests/data/test_464_B deleted file mode 100644 index 0e57b03..0000000 --- a/geom_bottleneck/tests/data/test_464_B +++ /dev/null @@ -1,7 +0,0 @@ -81 121 -17 86 -57 141 -13 15 -66 80 -66 107 -76 80 diff --git a/geom_bottleneck/tests/data/test_465_A b/geom_bottleneck/tests/data/test_465_A deleted file mode 100644 index b164c7a..0000000 --- a/geom_bottleneck/tests/data/test_465_A +++ /dev/null @@ -1,7 +0,0 @@ -8 34 -48 141 -61 122 -56 130 -58 158 -51 81 -32 100 diff --git a/geom_bottleneck/tests/data/test_465_B b/geom_bottleneck/tests/data/test_465_B deleted file mode 100644 index 610a2a5..0000000 --- a/geom_bottleneck/tests/data/test_465_B +++ /dev/null @@ -1,7 +0,0 @@ -8 89 -62 160 -27 109 -94 112 -59 140 -51 69 -52 136 diff --git a/geom_bottleneck/tests/data/test_466_A b/geom_bottleneck/tests/data/test_466_A deleted file mode 100644 index 3c0052c..0000000 --- a/geom_bottleneck/tests/data/test_466_A +++ /dev/null @@ -1,7 +0,0 @@ -54 113 -15 32 -94 138 -42 132 -84 136 -81 135 -4 62 diff --git a/geom_bottleneck/tests/data/test_466_B b/geom_bottleneck/tests/data/test_466_B deleted file mode 100644 index e8c16f8..0000000 --- a/geom_bottleneck/tests/data/test_466_B +++ /dev/null @@ -1,7 +0,0 @@ -51 116 -81 147 -11 51 -76 148 -90 100 -3 100 -62 138 diff --git a/geom_bottleneck/tests/data/test_467_A b/geom_bottleneck/tests/data/test_467_A deleted file mode 100644 index 69280bb..0000000 --- a/geom_bottleneck/tests/data/test_467_A +++ /dev/null @@ -1,7 +0,0 @@ -40 43 -46 99 -90 137 -93 122 -38 45 -87 134 -48 146 diff --git a/geom_bottleneck/tests/data/test_467_B b/geom_bottleneck/tests/data/test_467_B deleted file mode 100644 index c857912..0000000 --- a/geom_bottleneck/tests/data/test_467_B +++ /dev/null @@ -1,7 +0,0 @@ -22 23 -57 100 -84 162 -30 92 -65 75 -97 133 -47 117 diff --git a/geom_bottleneck/tests/data/test_468_A b/geom_bottleneck/tests/data/test_468_A deleted file mode 100644 index 9f92c43..0000000 --- a/geom_bottleneck/tests/data/test_468_A +++ /dev/null @@ -1,7 +0,0 @@ -93 128 -20 66 -72 134 -97 111 -64 99 -17 47 -12 58 diff --git a/geom_bottleneck/tests/data/test_468_B b/geom_bottleneck/tests/data/test_468_B deleted file mode 100644 index b20cdf4..0000000 --- a/geom_bottleneck/tests/data/test_468_B +++ /dev/null @@ -1,7 +0,0 @@ -84 156 -42 142 -28 43 -83 179 -15 81 -51 113 -56 136 diff --git a/geom_bottleneck/tests/data/test_469_A b/geom_bottleneck/tests/data/test_469_A deleted file mode 100644 index 842bb69..0000000 --- a/geom_bottleneck/tests/data/test_469_A +++ /dev/null @@ -1,7 +0,0 @@ -60 115 -77 137 -40 98 -11 59 -16 29 -60 98 -86 149 diff --git a/geom_bottleneck/tests/data/test_469_B b/geom_bottleneck/tests/data/test_469_B deleted file mode 100644 index e6de4fe..0000000 --- a/geom_bottleneck/tests/data/test_469_B +++ /dev/null @@ -1,7 +0,0 @@ -28 101 -15 65 -55 67 -40 73 -14 69 -87 117 -83 137 diff --git a/geom_bottleneck/tests/data/test_470_A b/geom_bottleneck/tests/data/test_470_A deleted file mode 100644 index 5f2fd6b..0000000 --- a/geom_bottleneck/tests/data/test_470_A +++ /dev/null @@ -1,7 +0,0 @@ -1 17 -80 137 -31 128 -78 83 -95 188 -94 150 -7 103 diff --git a/geom_bottleneck/tests/data/test_470_B b/geom_bottleneck/tests/data/test_470_B deleted file mode 100644 index 5db84e8..0000000 --- a/geom_bottleneck/tests/data/test_470_B +++ /dev/null @@ -1,7 +0,0 @@ -85 178 -3 52 -99 189 -95 115 -98 183 -0 60 -22 120 diff --git a/geom_bottleneck/tests/data/test_471_A b/geom_bottleneck/tests/data/test_471_A deleted file mode 100644 index e88e5ff..0000000 --- a/geom_bottleneck/tests/data/test_471_A +++ /dev/null @@ -1,7 +0,0 @@ -58 107 -6 86 -44 47 -12 97 -48 133 -89 111 -94 155 diff --git a/geom_bottleneck/tests/data/test_471_B b/geom_bottleneck/tests/data/test_471_B deleted file mode 100644 index 26065c0..0000000 --- a/geom_bottleneck/tests/data/test_471_B +++ /dev/null @@ -1,7 +0,0 @@ -51 115 -25 51 -77 165 -21 116 -19 21 -11 77 -5 9 diff --git a/geom_bottleneck/tests/data/test_472_A b/geom_bottleneck/tests/data/test_472_A deleted file mode 100644 index bd2ec1a..0000000 --- a/geom_bottleneck/tests/data/test_472_A +++ /dev/null @@ -1,7 +0,0 @@ -68 75 -12 88 -15 84 -33 120 -76 160 -23 56 -16 116 diff --git a/geom_bottleneck/tests/data/test_472_B b/geom_bottleneck/tests/data/test_472_B deleted file mode 100644 index 3914a18..0000000 --- a/geom_bottleneck/tests/data/test_472_B +++ /dev/null @@ -1,7 +0,0 @@ -75 129 -58 68 -36 119 -11 59 -25 42 -50 65 -12 28 diff --git a/geom_bottleneck/tests/data/test_473_A b/geom_bottleneck/tests/data/test_473_A deleted file mode 100644 index d8e4ed1..0000000 --- a/geom_bottleneck/tests/data/test_473_A +++ /dev/null @@ -1,7 +0,0 @@ -86 119 -34 71 -91 182 -97 170 -73 104 -71 160 -26 120 diff --git a/geom_bottleneck/tests/data/test_473_B b/geom_bottleneck/tests/data/test_473_B deleted file mode 100644 index 1ce2c2f..0000000 --- a/geom_bottleneck/tests/data/test_473_B +++ /dev/null @@ -1,7 +0,0 @@ -53 111 -78 111 -99 134 -42 70 -70 84 -52 85 -55 154 diff --git a/geom_bottleneck/tests/data/test_474_A b/geom_bottleneck/tests/data/test_474_A deleted file mode 100644 index 30c9ad1..0000000 --- a/geom_bottleneck/tests/data/test_474_A +++ /dev/null @@ -1,7 +0,0 @@ -84 139 -74 167 -0 76 -6 33 -73 165 -80 173 -28 38 diff --git a/geom_bottleneck/tests/data/test_474_B b/geom_bottleneck/tests/data/test_474_B deleted file mode 100644 index 35c507a..0000000 --- a/geom_bottleneck/tests/data/test_474_B +++ /dev/null @@ -1,7 +0,0 @@ -76 134 -38 118 -37 87 -61 110 -59 79 -67 75 -45 100 diff --git a/geom_bottleneck/tests/data/test_475_A b/geom_bottleneck/tests/data/test_475_A deleted file mode 100644 index 05023db..0000000 --- a/geom_bottleneck/tests/data/test_475_A +++ /dev/null @@ -1,7 +0,0 @@ -17 92 -69 112 -37 83 -62 116 -69 85 -63 92 -31 55 diff --git a/geom_bottleneck/tests/data/test_475_B b/geom_bottleneck/tests/data/test_475_B deleted file mode 100644 index 0fcc2d0..0000000 --- a/geom_bottleneck/tests/data/test_475_B +++ /dev/null @@ -1,7 +0,0 @@ -18 105 -66 104 -36 67 -50 61 -44 118 -75 99 -41 49 diff --git a/geom_bottleneck/tests/data/test_476_A b/geom_bottleneck/tests/data/test_476_A deleted file mode 100644 index 0c4ede1..0000000 --- a/geom_bottleneck/tests/data/test_476_A +++ /dev/null @@ -1,7 +0,0 @@ -14 109 -64 142 -98 152 -34 115 -47 100 -85 99 -0 7 diff --git a/geom_bottleneck/tests/data/test_476_B b/geom_bottleneck/tests/data/test_476_B deleted file mode 100644 index ae68bae..0000000 --- a/geom_bottleneck/tests/data/test_476_B +++ /dev/null @@ -1,7 +0,0 @@ -99 172 -23 91 -0 80 -89 102 -21 56 -86 169 -48 116 diff --git a/geom_bottleneck/tests/data/test_477_A b/geom_bottleneck/tests/data/test_477_A deleted file mode 100644 index 719e1b7..0000000 --- a/geom_bottleneck/tests/data/test_477_A +++ /dev/null @@ -1,7 +0,0 @@ -2 87 -9 51 -78 81 -26 122 -54 126 -66 128 -88 139 diff --git a/geom_bottleneck/tests/data/test_477_B b/geom_bottleneck/tests/data/test_477_B deleted file mode 100644 index 6c2e706..0000000 --- a/geom_bottleneck/tests/data/test_477_B +++ /dev/null @@ -1,7 +0,0 @@ -9 55 -60 64 -26 57 -6 74 -70 103 -84 87 -35 56 diff --git a/geom_bottleneck/tests/data/test_478_A b/geom_bottleneck/tests/data/test_478_A deleted file mode 100644 index 61b09a8..0000000 --- a/geom_bottleneck/tests/data/test_478_A +++ /dev/null @@ -1,7 +0,0 @@ -76 114 -41 48 -16 34 -28 80 -100 119 -57 64 -53 104 diff --git a/geom_bottleneck/tests/data/test_478_B b/geom_bottleneck/tests/data/test_478_B deleted file mode 100644 index a302122..0000000 --- a/geom_bottleneck/tests/data/test_478_B +++ /dev/null @@ -1,7 +0,0 @@ -81 179 -64 112 -9 49 -64 132 -15 81 -97 137 -17 39 diff --git a/geom_bottleneck/tests/data/test_479_A b/geom_bottleneck/tests/data/test_479_A deleted file mode 100644 index b956a54..0000000 --- a/geom_bottleneck/tests/data/test_479_A +++ /dev/null @@ -1,7 +0,0 @@ -31 104 -56 83 -21 87 -76 135 -63 126 -89 134 -74 159 diff --git a/geom_bottleneck/tests/data/test_479_B b/geom_bottleneck/tests/data/test_479_B deleted file mode 100644 index 10d8948..0000000 --- a/geom_bottleneck/tests/data/test_479_B +++ /dev/null @@ -1,7 +0,0 @@ -98 131 -8 98 -96 101 -78 146 -6 35 -88 116 -82 88 diff --git a/geom_bottleneck/tests/data/test_480_A b/geom_bottleneck/tests/data/test_480_A deleted file mode 100644 index 6ad5182..0000000 --- a/geom_bottleneck/tests/data/test_480_A +++ /dev/null @@ -1,8 +0,0 @@ -75 137 -100 185 -65 142 -7 8 -25 44 -39 108 -94 99 -6 78 diff --git a/geom_bottleneck/tests/data/test_480_B b/geom_bottleneck/tests/data/test_480_B deleted file mode 100644 index 246f278..0000000 --- a/geom_bottleneck/tests/data/test_480_B +++ /dev/null @@ -1,8 +0,0 @@ -80 156 -94 180 -55 143 -39 93 -72 170 -76 176 -72 160 -36 59 diff --git a/geom_bottleneck/tests/data/test_481_A b/geom_bottleneck/tests/data/test_481_A deleted file mode 100644 index 8e414ab..0000000 --- a/geom_bottleneck/tests/data/test_481_A +++ /dev/null @@ -1,8 +0,0 @@ -4 61 -27 91 -83 153 -1 25 -25 33 -71 76 -5 103 -8 34 diff --git a/geom_bottleneck/tests/data/test_481_B b/geom_bottleneck/tests/data/test_481_B deleted file mode 100644 index 5596312..0000000 --- a/geom_bottleneck/tests/data/test_481_B +++ /dev/null @@ -1,8 +0,0 @@ -59 143 -99 148 -21 32 -60 71 -16 51 -78 90 -11 77 -56 145 diff --git a/geom_bottleneck/tests/data/test_482_A b/geom_bottleneck/tests/data/test_482_A deleted file mode 100644 index b40bc32..0000000 --- a/geom_bottleneck/tests/data/test_482_A +++ /dev/null @@ -1,8 +0,0 @@ -56 139 -4 18 -16 47 -99 186 -16 63 -44 50 -99 187 -30 85 diff --git a/geom_bottleneck/tests/data/test_482_B b/geom_bottleneck/tests/data/test_482_B deleted file mode 100644 index 04b23b5..0000000 --- a/geom_bottleneck/tests/data/test_482_B +++ /dev/null @@ -1,8 +0,0 @@ -84 162 -22 52 -12 98 -59 106 -86 155 -93 108 -75 119 -18 20 diff --git a/geom_bottleneck/tests/data/test_483_A b/geom_bottleneck/tests/data/test_483_A deleted file mode 100644 index 7ef0f99..0000000 --- a/geom_bottleneck/tests/data/test_483_A +++ /dev/null @@ -1,8 +0,0 @@ -10 13 -53 81 -57 151 -81 148 -91 132 -9 89 -11 65 -29 85 diff --git a/geom_bottleneck/tests/data/test_483_B b/geom_bottleneck/tests/data/test_483_B deleted file mode 100644 index eabdee1..0000000 --- a/geom_bottleneck/tests/data/test_483_B +++ /dev/null @@ -1,8 +0,0 @@ -87 187 -79 111 -41 93 -54 76 -27 86 -97 150 -97 185 -36 37 diff --git a/geom_bottleneck/tests/data/test_484_A b/geom_bottleneck/tests/data/test_484_A deleted file mode 100644 index 11fa5dd..0000000 --- a/geom_bottleneck/tests/data/test_484_A +++ /dev/null @@ -1,8 +0,0 @@ -58 147 -24 70 -83 171 -78 91 -55 86 -83 168 -40 125 -75 121 diff --git a/geom_bottleneck/tests/data/test_484_B b/geom_bottleneck/tests/data/test_484_B deleted file mode 100644 index 2dda740..0000000 --- a/geom_bottleneck/tests/data/test_484_B +++ /dev/null @@ -1,8 +0,0 @@ -55 66 -48 100 -69 123 -84 152 -56 155 -87 99 -83 167 -39 49 diff --git a/geom_bottleneck/tests/data/test_485_A b/geom_bottleneck/tests/data/test_485_A deleted file mode 100644 index bd500dd..0000000 --- a/geom_bottleneck/tests/data/test_485_A +++ /dev/null @@ -1,8 +0,0 @@ -64 81 -52 69 -62 74 -3 79 -24 117 -81 133 -5 37 -53 90 diff --git a/geom_bottleneck/tests/data/test_485_B b/geom_bottleneck/tests/data/test_485_B deleted file mode 100644 index a117670..0000000 --- a/geom_bottleneck/tests/data/test_485_B +++ /dev/null @@ -1,8 +0,0 @@ -80 97 -10 69 -49 123 -28 123 -92 135 -19 107 -7 53 -99 165 diff --git a/geom_bottleneck/tests/data/test_486_A b/geom_bottleneck/tests/data/test_486_A deleted file mode 100644 index 4dcc3ca..0000000 --- a/geom_bottleneck/tests/data/test_486_A +++ /dev/null @@ -1,8 +0,0 @@ -76 162 -58 117 -91 152 -96 137 -45 49 -64 156 -35 64 -42 114 diff --git a/geom_bottleneck/tests/data/test_486_B b/geom_bottleneck/tests/data/test_486_B deleted file mode 100644 index c808dc5..0000000 --- a/geom_bottleneck/tests/data/test_486_B +++ /dev/null @@ -1,8 +0,0 @@ -35 95 -0 78 -61 78 -100 110 -100 106 -56 91 -97 133 -87 176 diff --git a/geom_bottleneck/tests/data/test_487_A b/geom_bottleneck/tests/data/test_487_A deleted file mode 100644 index 7250b20..0000000 --- a/geom_bottleneck/tests/data/test_487_A +++ /dev/null @@ -1,8 +0,0 @@ -78 114 -95 110 -22 47 -95 181 -6 76 -47 89 -10 27 -69 102 diff --git a/geom_bottleneck/tests/data/test_487_B b/geom_bottleneck/tests/data/test_487_B deleted file mode 100644 index b0a4119..0000000 --- a/geom_bottleneck/tests/data/test_487_B +++ /dev/null @@ -1,8 +0,0 @@ -31 113 -71 115 -10 97 -97 101 -30 61 -79 157 -56 89 -96 184 diff --git a/geom_bottleneck/tests/data/test_488_A b/geom_bottleneck/tests/data/test_488_A deleted file mode 100644 index 92f19ab..0000000 --- a/geom_bottleneck/tests/data/test_488_A +++ /dev/null @@ -1,8 +0,0 @@ -7 28 -32 59 -64 84 -71 156 -89 166 -67 154 -54 89 -49 78 diff --git a/geom_bottleneck/tests/data/test_488_B b/geom_bottleneck/tests/data/test_488_B deleted file mode 100644 index 712480d..0000000 --- a/geom_bottleneck/tests/data/test_488_B +++ /dev/null @@ -1,8 +0,0 @@ -54 128 -20 59 -64 135 -80 106 -35 88 -93 187 -4 5 -73 126 diff --git a/geom_bottleneck/tests/data/test_489_A b/geom_bottleneck/tests/data/test_489_A deleted file mode 100644 index f1c9abf..0000000 --- a/geom_bottleneck/tests/data/test_489_A +++ /dev/null @@ -1,8 +0,0 @@ -52 74 -59 74 -83 84 -51 135 -41 132 -29 113 -7 65 -97 176 diff --git a/geom_bottleneck/tests/data/test_489_B b/geom_bottleneck/tests/data/test_489_B deleted file mode 100644 index 5c5316f..0000000 --- a/geom_bottleneck/tests/data/test_489_B +++ /dev/null @@ -1,8 +0,0 @@ -43 126 -23 64 -16 111 -96 97 -84 112 -39 85 -33 74 -39 97 diff --git a/geom_bottleneck/tests/data/test_490_A b/geom_bottleneck/tests/data/test_490_A deleted file mode 100644 index e907d09..0000000 --- a/geom_bottleneck/tests/data/test_490_A +++ /dev/null @@ -1,8 +0,0 @@ -93 146 -47 99 -6 55 -19 66 -15 28 -2 93 -97 143 -52 125 diff --git a/geom_bottleneck/tests/data/test_490_B b/geom_bottleneck/tests/data/test_490_B deleted file mode 100644 index 6368e47..0000000 --- a/geom_bottleneck/tests/data/test_490_B +++ /dev/null @@ -1,8 +0,0 @@ -82 172 -98 155 -73 119 -50 133 -13 84 -53 73 -5 21 -82 83 diff --git a/geom_bottleneck/tests/data/test_491_A b/geom_bottleneck/tests/data/test_491_A deleted file mode 100644 index 9fdc2fb..0000000 --- a/geom_bottleneck/tests/data/test_491_A +++ /dev/null @@ -1,8 +0,0 @@ -12 35 -75 82 -45 91 -18 27 -99 178 -35 37 -46 113 -70 94 diff --git a/geom_bottleneck/tests/data/test_491_B b/geom_bottleneck/tests/data/test_491_B deleted file mode 100644 index 09cd4ac..0000000 --- a/geom_bottleneck/tests/data/test_491_B +++ /dev/null @@ -1,8 +0,0 @@ -76 121 -84 172 -70 167 -57 143 -4 52 -69 159 -10 100 -96 153 diff --git a/geom_bottleneck/tests/data/test_492_A b/geom_bottleneck/tests/data/test_492_A deleted file mode 100644 index 434683d..0000000 --- a/geom_bottleneck/tests/data/test_492_A +++ /dev/null @@ -1,8 +0,0 @@ -21 92 -42 105 -79 166 -41 78 -72 87 -25 49 -78 104 -60 115 diff --git a/geom_bottleneck/tests/data/test_492_B b/geom_bottleneck/tests/data/test_492_B deleted file mode 100644 index 3f6f5fa..0000000 --- a/geom_bottleneck/tests/data/test_492_B +++ /dev/null @@ -1,8 +0,0 @@ -80 94 -66 106 -36 79 -12 20 -28 36 -94 155 -62 100 -77 136 diff --git a/geom_bottleneck/tests/data/test_493_A b/geom_bottleneck/tests/data/test_493_A deleted file mode 100644 index 12cfc64..0000000 --- a/geom_bottleneck/tests/data/test_493_A +++ /dev/null @@ -1,8 +0,0 @@ -14 46 -79 109 -49 92 -100 181 -32 44 -15 16 -59 62 -66 127 diff --git a/geom_bottleneck/tests/data/test_493_B b/geom_bottleneck/tests/data/test_493_B deleted file mode 100644 index 43dcf08..0000000 --- a/geom_bottleneck/tests/data/test_493_B +++ /dev/null @@ -1,8 +0,0 @@ -18 21 -74 155 -36 57 -28 41 -15 40 -94 133 -72 153 -42 135 diff --git a/geom_bottleneck/tests/data/test_494_A b/geom_bottleneck/tests/data/test_494_A deleted file mode 100644 index b35b505..0000000 --- a/geom_bottleneck/tests/data/test_494_A +++ /dev/null @@ -1,8 +0,0 @@ -31 40 -44 129 -74 92 -41 132 -79 105 -18 58 -93 123 -8 39 diff --git a/geom_bottleneck/tests/data/test_494_B b/geom_bottleneck/tests/data/test_494_B deleted file mode 100644 index fb70ed6..0000000 --- a/geom_bottleneck/tests/data/test_494_B +++ /dev/null @@ -1,8 +0,0 @@ -86 165 -30 101 -85 185 -15 71 -75 175 -61 141 -43 81 -90 128 diff --git a/geom_bottleneck/tests/data/test_495_A b/geom_bottleneck/tests/data/test_495_A deleted file mode 100644 index c244b7a..0000000 --- a/geom_bottleneck/tests/data/test_495_A +++ /dev/null @@ -1,8 +0,0 @@ -90 133 -48 84 -48 126 -0 80 -8 17 -60 82 -17 48 -9 74 diff --git a/geom_bottleneck/tests/data/test_495_B b/geom_bottleneck/tests/data/test_495_B deleted file mode 100644 index 4bd121d..0000000 --- a/geom_bottleneck/tests/data/test_495_B +++ /dev/null @@ -1,8 +0,0 @@ -19 25 -39 63 -0 3 -39 86 -72 91 -27 85 -97 141 -79 174 diff --git a/geom_bottleneck/tests/data/test_496_A b/geom_bottleneck/tests/data/test_496_A deleted file mode 100644 index cc2cc0b..0000000 --- a/geom_bottleneck/tests/data/test_496_A +++ /dev/null @@ -1,8 +0,0 @@ -79 127 -84 146 -58 143 -28 68 -35 100 -38 126 -24 89 -32 70 diff --git a/geom_bottleneck/tests/data/test_496_B b/geom_bottleneck/tests/data/test_496_B deleted file mode 100644 index 5b8aeaa..0000000 --- a/geom_bottleneck/tests/data/test_496_B +++ /dev/null @@ -1,8 +0,0 @@ -9 61 -68 125 -4 98 -98 99 -49 67 -41 50 -38 61 -24 44 diff --git a/geom_bottleneck/tests/data/test_497_A b/geom_bottleneck/tests/data/test_497_A deleted file mode 100644 index b3b511d..0000000 --- a/geom_bottleneck/tests/data/test_497_A +++ /dev/null @@ -1,8 +0,0 @@ -19 24 -89 174 -47 137 -93 131 -50 127 -6 34 -99 118 -86 98 diff --git a/geom_bottleneck/tests/data/test_497_B b/geom_bottleneck/tests/data/test_497_B deleted file mode 100644 index 8870c73..0000000 --- a/geom_bottleneck/tests/data/test_497_B +++ /dev/null @@ -1,8 +0,0 @@ -0 69 -39 100 -58 156 -37 74 -47 62 -81 172 -81 175 -56 147 diff --git a/geom_bottleneck/tests/data/test_498_A b/geom_bottleneck/tests/data/test_498_A deleted file mode 100644 index 5bef5fa..0000000 --- a/geom_bottleneck/tests/data/test_498_A +++ /dev/null @@ -1,8 +0,0 @@ -55 140 -94 160 -22 35 -42 89 -50 127 -8 59 -25 87 -35 103 diff --git a/geom_bottleneck/tests/data/test_498_B b/geom_bottleneck/tests/data/test_498_B deleted file mode 100644 index b1ed38a..0000000 --- a/geom_bottleneck/tests/data/test_498_B +++ /dev/null @@ -1,8 +0,0 @@ -88 164 -14 29 -13 19 -3 49 -86 107 -62 138 -72 77 -2 22 diff --git a/geom_bottleneck/tests/data/test_499_A b/geom_bottleneck/tests/data/test_499_A deleted file mode 100644 index a24f367..0000000 --- a/geom_bottleneck/tests/data/test_499_A +++ /dev/null @@ -1,8 +0,0 @@ -35 68 -22 25 -87 132 -23 119 -64 131 -13 106 -8 22 -83 169 diff --git a/geom_bottleneck/tests/data/test_499_B b/geom_bottleneck/tests/data/test_499_B deleted file mode 100644 index 24d0d92..0000000 --- a/geom_bottleneck/tests/data/test_499_B +++ /dev/null @@ -1,8 +0,0 @@ -27 105 -66 84 -76 101 -96 126 -40 103 -82 159 -41 45 -58 97 diff --git a/geom_bottleneck/tests/data/test_500_A b/geom_bottleneck/tests/data/test_500_A deleted file mode 100644 index ed86941..0000000 --- a/geom_bottleneck/tests/data/test_500_A +++ /dev/null @@ -1,9 +0,0 @@ -96 120 -81 139 -35 58 -14 38 -23 33 -44 97 -26 61 -47 74 -75 124 diff --git a/geom_bottleneck/tests/data/test_500_B b/geom_bottleneck/tests/data/test_500_B deleted file mode 100644 index 58f0cd6..0000000 --- a/geom_bottleneck/tests/data/test_500_B +++ /dev/null @@ -1,9 +0,0 @@ -57 153 -7 107 -56 78 -67 90 -14 86 -97 112 -5 45 -55 151 -51 133 diff --git a/geom_bottleneck/tests/data/test_501_A b/geom_bottleneck/tests/data/test_501_A deleted file mode 100644 index b6f9335..0000000 --- a/geom_bottleneck/tests/data/test_501_A +++ /dev/null @@ -1,9 +0,0 @@ -57 145 -1 34 -98 129 -25 26 -19 94 -90 187 -62 160 -70 115 -88 160 diff --git a/geom_bottleneck/tests/data/test_501_B b/geom_bottleneck/tests/data/test_501_B deleted file mode 100644 index af0d32b..0000000 --- a/geom_bottleneck/tests/data/test_501_B +++ /dev/null @@ -1,9 +0,0 @@ -77 100 -34 41 -79 99 -27 65 -30 69 -58 96 -98 195 -45 144 -82 147 diff --git a/geom_bottleneck/tests/data/test_502_A b/geom_bottleneck/tests/data/test_502_A deleted file mode 100644 index 64c4bfe..0000000 --- a/geom_bottleneck/tests/data/test_502_A +++ /dev/null @@ -1,9 +0,0 @@ -78 102 -66 134 -42 104 -17 68 -33 113 -84 160 -86 119 -32 73 -6 19 diff --git a/geom_bottleneck/tests/data/test_502_B b/geom_bottleneck/tests/data/test_502_B deleted file mode 100644 index 4b1bb48..0000000 --- a/geom_bottleneck/tests/data/test_502_B +++ /dev/null @@ -1,9 +0,0 @@ -2 25 -80 119 -56 147 -94 99 -51 116 -29 109 -89 180 -45 75 -93 170 diff --git a/geom_bottleneck/tests/data/test_503_A b/geom_bottleneck/tests/data/test_503_A deleted file mode 100644 index 7686e8d..0000000 --- a/geom_bottleneck/tests/data/test_503_A +++ /dev/null @@ -1,9 +0,0 @@ -53 55 -1 67 -100 128 -27 39 -17 62 -66 98 -49 85 -13 14 -72 91 diff --git a/geom_bottleneck/tests/data/test_503_B b/geom_bottleneck/tests/data/test_503_B deleted file mode 100644 index c662290..0000000 --- a/geom_bottleneck/tests/data/test_503_B +++ /dev/null @@ -1,9 +0,0 @@ -74 110 -99 192 -22 56 -19 40 -63 99 -31 44 -28 122 -89 161 -85 184 diff --git a/geom_bottleneck/tests/data/test_504_A b/geom_bottleneck/tests/data/test_504_A deleted file mode 100644 index 7b0bcd8..0000000 --- a/geom_bottleneck/tests/data/test_504_A +++ /dev/null @@ -1,9 +0,0 @@ -52 60 -30 76 -55 91 -83 91 -23 53 -64 68 -12 106 -54 99 -0 83 diff --git a/geom_bottleneck/tests/data/test_504_B b/geom_bottleneck/tests/data/test_504_B deleted file mode 100644 index 1fb9704..0000000 --- a/geom_bottleneck/tests/data/test_504_B +++ /dev/null @@ -1,9 +0,0 @@ -10 57 -0 87 -74 85 -13 91 -48 59 -21 109 -85 141 -70 151 -24 103 diff --git a/geom_bottleneck/tests/data/test_505_A b/geom_bottleneck/tests/data/test_505_A deleted file mode 100644 index fd80b53..0000000 --- a/geom_bottleneck/tests/data/test_505_A +++ /dev/null @@ -1,9 +0,0 @@ -90 183 -100 112 -33 120 -94 114 -96 190 -70 109 -22 102 -71 126 -99 150 diff --git a/geom_bottleneck/tests/data/test_505_B b/geom_bottleneck/tests/data/test_505_B deleted file mode 100644 index 9bd046e..0000000 --- a/geom_bottleneck/tests/data/test_505_B +++ /dev/null @@ -1,9 +0,0 @@ -18 83 -61 159 -73 138 -51 137 -20 96 -89 185 -13 52 -54 134 -24 35 diff --git a/geom_bottleneck/tests/data/test_506_A b/geom_bottleneck/tests/data/test_506_A deleted file mode 100644 index 1f5e9ac..0000000 --- a/geom_bottleneck/tests/data/test_506_A +++ /dev/null @@ -1,9 +0,0 @@ -95 117 -41 138 -52 118 -82 163 -9 22 -58 156 -7 74 -24 42 -96 158 diff --git a/geom_bottleneck/tests/data/test_506_B b/geom_bottleneck/tests/data/test_506_B deleted file mode 100644 index 0dc89b8..0000000 --- a/geom_bottleneck/tests/data/test_506_B +++ /dev/null @@ -1,9 +0,0 @@ -91 134 -78 119 -94 141 -5 57 -34 55 -43 101 -27 116 -41 72 -98 126 diff --git a/geom_bottleneck/tests/data/test_507_A b/geom_bottleneck/tests/data/test_507_A deleted file mode 100644 index a6d164e..0000000 --- a/geom_bottleneck/tests/data/test_507_A +++ /dev/null @@ -1,9 +0,0 @@ -34 62 -21 105 -41 63 -74 99 -52 95 -89 100 -11 82 -74 83 -78 132 diff --git a/geom_bottleneck/tests/data/test_507_B b/geom_bottleneck/tests/data/test_507_B deleted file mode 100644 index b39a7fe..0000000 --- a/geom_bottleneck/tests/data/test_507_B +++ /dev/null @@ -1,9 +0,0 @@ -49 76 -24 57 -25 101 -9 99 -65 146 -23 43 -89 165 -63 138 -50 76 diff --git a/geom_bottleneck/tests/data/test_508_A b/geom_bottleneck/tests/data/test_508_A deleted file mode 100644 index c837ce3..0000000 --- a/geom_bottleneck/tests/data/test_508_A +++ /dev/null @@ -1,9 +0,0 @@ -59 141 -59 74 -0 5 -11 105 -15 58 -43 117 -47 93 -60 149 -69 92 diff --git a/geom_bottleneck/tests/data/test_508_B b/geom_bottleneck/tests/data/test_508_B deleted file mode 100644 index 733b5a0..0000000 --- a/geom_bottleneck/tests/data/test_508_B +++ /dev/null @@ -1,9 +0,0 @@ -29 104 -50 67 -43 82 -86 102 -45 81 -19 106 -74 124 -77 150 -80 104 diff --git a/geom_bottleneck/tests/data/test_509_A b/geom_bottleneck/tests/data/test_509_A deleted file mode 100644 index 98137f3..0000000 --- a/geom_bottleneck/tests/data/test_509_A +++ /dev/null @@ -1,9 +0,0 @@ -40 74 -89 138 -20 44 -56 65 -12 14 -87 149 -23 123 -12 28 -56 146 diff --git a/geom_bottleneck/tests/data/test_509_B b/geom_bottleneck/tests/data/test_509_B deleted file mode 100644 index 1edd08c..0000000 --- a/geom_bottleneck/tests/data/test_509_B +++ /dev/null @@ -1,9 +0,0 @@ -89 153 -20 65 -87 128 -27 101 -23 71 -6 53 -50 128 -16 108 -92 157 diff --git a/geom_bottleneck/tests/data/test_510_A b/geom_bottleneck/tests/data/test_510_A deleted file mode 100644 index b1e0e68..0000000 --- a/geom_bottleneck/tests/data/test_510_A +++ /dev/null @@ -1,9 +0,0 @@ -67 70 -99 197 -62 111 -25 59 -61 131 -34 108 -99 185 -73 125 -76 130 diff --git a/geom_bottleneck/tests/data/test_510_B b/geom_bottleneck/tests/data/test_510_B deleted file mode 100644 index 8e48152..0000000 --- a/geom_bottleneck/tests/data/test_510_B +++ /dev/null @@ -1,9 +0,0 @@ -72 74 -57 126 -32 106 -55 88 -75 167 -5 34 -46 72 -86 104 -30 129 diff --git a/geom_bottleneck/tests/data/test_511_A b/geom_bottleneck/tests/data/test_511_A deleted file mode 100644 index a2c6b34..0000000 --- a/geom_bottleneck/tests/data/test_511_A +++ /dev/null @@ -1,9 +0,0 @@ -10 56 -84 163 -34 131 -32 106 -61 84 -71 106 -17 32 -23 43 -44 79 diff --git a/geom_bottleneck/tests/data/test_511_B b/geom_bottleneck/tests/data/test_511_B deleted file mode 100644 index ff48216..0000000 --- a/geom_bottleneck/tests/data/test_511_B +++ /dev/null @@ -1,9 +0,0 @@ -57 66 -89 124 -93 120 -72 119 -83 125 -1 17 -25 97 -32 90 -89 135 diff --git a/geom_bottleneck/tests/data/test_512_A b/geom_bottleneck/tests/data/test_512_A deleted file mode 100644 index 8f875d8..0000000 --- a/geom_bottleneck/tests/data/test_512_A +++ /dev/null @@ -1,9 +0,0 @@ -88 136 -21 65 -12 82 -35 48 -97 127 -38 89 -69 71 -47 107 -91 127 diff --git a/geom_bottleneck/tests/data/test_512_B b/geom_bottleneck/tests/data/test_512_B deleted file mode 100644 index c6988c1..0000000 --- a/geom_bottleneck/tests/data/test_512_B +++ /dev/null @@ -1,9 +0,0 @@ -59 98 -88 114 -90 122 -83 147 -95 153 -9 56 -14 54 -25 70 -47 60 diff --git a/geom_bottleneck/tests/data/test_513_A b/geom_bottleneck/tests/data/test_513_A deleted file mode 100644 index 844c16d..0000000 --- a/geom_bottleneck/tests/data/test_513_A +++ /dev/null @@ -1,9 +0,0 @@ -34 45 -64 149 -94 147 -34 73 -15 91 -2 53 -46 99 -70 100 -28 62 diff --git a/geom_bottleneck/tests/data/test_513_B b/geom_bottleneck/tests/data/test_513_B deleted file mode 100644 index ee75f8c..0000000 --- a/geom_bottleneck/tests/data/test_513_B +++ /dev/null @@ -1,9 +0,0 @@ -14 50 -76 112 -46 60 -45 94 -73 150 -79 128 -5 72 -44 87 -25 97 diff --git a/geom_bottleneck/tests/data/test_514_A b/geom_bottleneck/tests/data/test_514_A deleted file mode 100644 index 9b58831..0000000 --- a/geom_bottleneck/tests/data/test_514_A +++ /dev/null @@ -1,9 +0,0 @@ -4 78 -32 82 -56 106 -56 135 -0 1 -18 103 -29 65 -50 82 -68 82 diff --git a/geom_bottleneck/tests/data/test_514_B b/geom_bottleneck/tests/data/test_514_B deleted file mode 100644 index 39c6534..0000000 --- a/geom_bottleneck/tests/data/test_514_B +++ /dev/null @@ -1,9 +0,0 @@ -34 63 -63 145 -40 63 -3 93 -57 123 -32 51 -100 115 -23 32 -21 23 diff --git a/geom_bottleneck/tests/data/test_515_A b/geom_bottleneck/tests/data/test_515_A deleted file mode 100644 index fc2578b..0000000 --- a/geom_bottleneck/tests/data/test_515_A +++ /dev/null @@ -1,9 +0,0 @@ -32 33 -77 131 -64 160 -26 35 -77 106 -69 70 -98 106 -29 107 -65 69 diff --git a/geom_bottleneck/tests/data/test_515_B b/geom_bottleneck/tests/data/test_515_B deleted file mode 100644 index 715f6e5..0000000 --- a/geom_bottleneck/tests/data/test_515_B +++ /dev/null @@ -1,9 +0,0 @@ -86 101 -89 138 -100 133 -81 103 -9 16 -79 133 -30 113 -98 195 -2 86 diff --git a/geom_bottleneck/tests/data/test_516_A b/geom_bottleneck/tests/data/test_516_A deleted file mode 100644 index bd37e5d..0000000 --- a/geom_bottleneck/tests/data/test_516_A +++ /dev/null @@ -1,9 +0,0 @@ -80 178 -95 153 -66 133 -12 74 -59 87 -85 165 -36 89 -57 145 -85 177 diff --git a/geom_bottleneck/tests/data/test_516_B b/geom_bottleneck/tests/data/test_516_B deleted file mode 100644 index 8d23127..0000000 --- a/geom_bottleneck/tests/data/test_516_B +++ /dev/null @@ -1,9 +0,0 @@ -29 85 -39 41 -50 99 -16 76 -82 131 -20 107 -20 25 -91 105 -98 172 diff --git a/geom_bottleneck/tests/data/test_517_A b/geom_bottleneck/tests/data/test_517_A deleted file mode 100644 index 17ca01c..0000000 --- a/geom_bottleneck/tests/data/test_517_A +++ /dev/null @@ -1,9 +0,0 @@ -39 41 -60 128 -14 32 -52 138 -74 79 -52 100 -4 39 -53 145 -33 127 diff --git a/geom_bottleneck/tests/data/test_517_B b/geom_bottleneck/tests/data/test_517_B deleted file mode 100644 index ba82599..0000000 --- a/geom_bottleneck/tests/data/test_517_B +++ /dev/null @@ -1,9 +0,0 @@ -31 113 -54 116 -69 151 -9 18 -60 62 -0 22 -93 162 -15 62 -63 148 diff --git a/geom_bottleneck/tests/data/test_518_A b/geom_bottleneck/tests/data/test_518_A deleted file mode 100644 index bb1711c..0000000 --- a/geom_bottleneck/tests/data/test_518_A +++ /dev/null @@ -1,9 +0,0 @@ -49 70 -63 113 -60 158 -17 111 -37 112 -35 101 -3 51 -89 126 -91 129 diff --git a/geom_bottleneck/tests/data/test_518_B b/geom_bottleneck/tests/data/test_518_B deleted file mode 100644 index 5b2e95a..0000000 --- a/geom_bottleneck/tests/data/test_518_B +++ /dev/null @@ -1,9 +0,0 @@ -7 97 -72 146 -59 147 -89 103 -72 169 -43 65 -29 98 -28 44 -14 40 diff --git a/geom_bottleneck/tests/data/test_519_A b/geom_bottleneck/tests/data/test_519_A deleted file mode 100644 index f0cb6ea..0000000 --- a/geom_bottleneck/tests/data/test_519_A +++ /dev/null @@ -1,9 +0,0 @@ -6 92 -25 100 -99 156 -12 89 -3 102 -32 107 -13 40 -79 94 -33 118 diff --git a/geom_bottleneck/tests/data/test_519_B b/geom_bottleneck/tests/data/test_519_B deleted file mode 100644 index 03396db..0000000 --- a/geom_bottleneck/tests/data/test_519_B +++ /dev/null @@ -1,9 +0,0 @@ -32 46 -61 155 -98 180 -10 89 -86 127 -0 4 -51 65 -9 85 -32 85 diff --git a/geom_bottleneck/tests/data/test_520_A b/geom_bottleneck/tests/data/test_520_A deleted file mode 100644 index 9353285..0000000 --- a/geom_bottleneck/tests/data/test_520_A +++ /dev/null @@ -1,10 +0,0 @@ -91 117 -68 132 -36 70 -20 75 -47 97 -50 84 -9 79 -63 70 -0 48 -15 75 diff --git a/geom_bottleneck/tests/data/test_520_B b/geom_bottleneck/tests/data/test_520_B deleted file mode 100644 index 1e328cd..0000000 --- a/geom_bottleneck/tests/data/test_520_B +++ /dev/null @@ -1,10 +0,0 @@ -35 51 -16 23 -4 91 -69 133 -21 30 -80 169 -55 100 -34 76 -24 30 -97 167 diff --git a/geom_bottleneck/tests/data/test_521_A b/geom_bottleneck/tests/data/test_521_A deleted file mode 100644 index d0bea91..0000000 --- a/geom_bottleneck/tests/data/test_521_A +++ /dev/null @@ -1,10 +0,0 @@ -22 45 -99 100 -34 81 -41 104 -1 25 -3 93 -26 88 -4 23 -97 159 -7 19 diff --git a/geom_bottleneck/tests/data/test_521_B b/geom_bottleneck/tests/data/test_521_B deleted file mode 100644 index 5e584b0..0000000 --- a/geom_bottleneck/tests/data/test_521_B +++ /dev/null @@ -1,10 +0,0 @@ -2 40 -31 85 -57 105 -28 61 -18 111 -95 115 -0 66 -81 167 -96 174 -85 170 diff --git a/geom_bottleneck/tests/data/test_522_A b/geom_bottleneck/tests/data/test_522_A deleted file mode 100644 index 5631735..0000000 --- a/geom_bottleneck/tests/data/test_522_A +++ /dev/null @@ -1,10 +0,0 @@ -99 187 -92 127 -69 157 -82 161 -94 141 -97 108 -70 94 -20 39 -87 172 -87 122 diff --git a/geom_bottleneck/tests/data/test_522_B b/geom_bottleneck/tests/data/test_522_B deleted file mode 100644 index 903bcdc..0000000 --- a/geom_bottleneck/tests/data/test_522_B +++ /dev/null @@ -1,10 +0,0 @@ -39 51 -28 81 -77 78 -17 52 -42 124 -34 37 -96 117 -39 98 -65 142 -4 72 diff --git a/geom_bottleneck/tests/data/test_523_A b/geom_bottleneck/tests/data/test_523_A deleted file mode 100644 index b4da958..0000000 --- a/geom_bottleneck/tests/data/test_523_A +++ /dev/null @@ -1,10 +0,0 @@ -73 158 -5 34 -4 67 -88 109 -46 137 -86 152 -61 113 -61 93 -71 77 -65 157 diff --git a/geom_bottleneck/tests/data/test_523_B b/geom_bottleneck/tests/data/test_523_B deleted file mode 100644 index bcc7438..0000000 --- a/geom_bottleneck/tests/data/test_523_B +++ /dev/null @@ -1,10 +0,0 @@ -54 78 -6 86 -63 130 -90 183 -59 89 -96 151 -93 117 -74 147 -20 93 -26 110 diff --git a/geom_bottleneck/tests/data/test_524_A b/geom_bottleneck/tests/data/test_524_A deleted file mode 100644 index e260687..0000000 --- a/geom_bottleneck/tests/data/test_524_A +++ /dev/null @@ -1,10 +0,0 @@ -25 116 -12 34 -31 39 -56 152 -47 147 -67 112 -60 146 -77 112 -71 120 -67 75 diff --git a/geom_bottleneck/tests/data/test_524_B b/geom_bottleneck/tests/data/test_524_B deleted file mode 100644 index 92a2d76..0000000 --- a/geom_bottleneck/tests/data/test_524_B +++ /dev/null @@ -1,10 +0,0 @@ -2 10 -32 42 -24 123 -24 32 -84 135 -49 148 -100 181 -81 137 -63 96 -13 16 diff --git a/geom_bottleneck/tests/data/test_525_A b/geom_bottleneck/tests/data/test_525_A deleted file mode 100644 index 25d9d8f..0000000 --- a/geom_bottleneck/tests/data/test_525_A +++ /dev/null @@ -1,10 +0,0 @@ -51 101 -67 155 -84 155 -67 151 -39 122 -93 167 -83 117 -20 67 -39 136 -54 116 diff --git a/geom_bottleneck/tests/data/test_525_B b/geom_bottleneck/tests/data/test_525_B deleted file mode 100644 index d61ee84..0000000 --- a/geom_bottleneck/tests/data/test_525_B +++ /dev/null @@ -1,10 +0,0 @@ -69 120 -93 141 -65 96 -8 81 -27 110 -94 178 -9 89 -1 91 -77 86 -33 49 diff --git a/geom_bottleneck/tests/data/test_526_A b/geom_bottleneck/tests/data/test_526_A deleted file mode 100644 index 985ba29..0000000 --- a/geom_bottleneck/tests/data/test_526_A +++ /dev/null @@ -1,10 +0,0 @@ -10 27 -53 116 -71 93 -88 122 -45 87 -82 167 -89 105 -20 101 -25 71 -61 124 diff --git a/geom_bottleneck/tests/data/test_526_B b/geom_bottleneck/tests/data/test_526_B deleted file mode 100644 index 2ebf00a..0000000 --- a/geom_bottleneck/tests/data/test_526_B +++ /dev/null @@ -1,10 +0,0 @@ -70 95 -68 69 -13 105 -58 156 -51 97 -64 106 -87 95 -63 85 -62 79 -82 87 diff --git a/geom_bottleneck/tests/data/test_527_A b/geom_bottleneck/tests/data/test_527_A deleted file mode 100644 index 802b177..0000000 --- a/geom_bottleneck/tests/data/test_527_A +++ /dev/null @@ -1,10 +0,0 @@ -5 27 -91 164 -68 91 -11 72 -37 66 -12 27 -30 47 -54 58 -34 80 -43 133 diff --git a/geom_bottleneck/tests/data/test_527_B b/geom_bottleneck/tests/data/test_527_B deleted file mode 100644 index a04d9f1..0000000 --- a/geom_bottleneck/tests/data/test_527_B +++ /dev/null @@ -1,10 +0,0 @@ -88 156 -74 105 -64 69 -96 127 -10 93 -52 107 -58 134 -18 108 -80 108 -93 161 diff --git a/geom_bottleneck/tests/data/test_528_A b/geom_bottleneck/tests/data/test_528_A deleted file mode 100644 index da776dc..0000000 --- a/geom_bottleneck/tests/data/test_528_A +++ /dev/null @@ -1,10 +0,0 @@ -36 107 -14 86 -45 96 -22 58 -57 103 -92 138 -65 150 -33 94 -40 79 -50 54 diff --git a/geom_bottleneck/tests/data/test_528_B b/geom_bottleneck/tests/data/test_528_B deleted file mode 100644 index 5329277..0000000 --- a/geom_bottleneck/tests/data/test_528_B +++ /dev/null @@ -1,10 +0,0 @@ -39 122 -19 43 -88 130 -48 106 -27 69 -93 140 -1 23 -50 94 -87 139 -97 151 diff --git a/geom_bottleneck/tests/data/test_529_A b/geom_bottleneck/tests/data/test_529_A deleted file mode 100644 index ebbf6fa..0000000 --- a/geom_bottleneck/tests/data/test_529_A +++ /dev/null @@ -1,10 +0,0 @@ -80 140 -0 97 -28 29 -15 85 -21 35 -34 74 -26 27 -91 135 -21 36 -33 117 diff --git a/geom_bottleneck/tests/data/test_529_B b/geom_bottleneck/tests/data/test_529_B deleted file mode 100644 index 6e0f836..0000000 --- a/geom_bottleneck/tests/data/test_529_B +++ /dev/null @@ -1,10 +0,0 @@ -22 46 -0 79 -33 86 -14 99 -71 108 -83 91 -40 69 -36 45 -42 112 -44 75 diff --git a/geom_bottleneck/tests/data/test_530_A b/geom_bottleneck/tests/data/test_530_A deleted file mode 100644 index 904eac4..0000000 --- a/geom_bottleneck/tests/data/test_530_A +++ /dev/null @@ -1,10 +0,0 @@ -89 119 -35 104 -90 95 -6 77 -44 71 -46 100 -40 127 -11 52 -28 81 -39 73 diff --git a/geom_bottleneck/tests/data/test_530_B b/geom_bottleneck/tests/data/test_530_B deleted file mode 100644 index f4cfc4c..0000000 --- a/geom_bottleneck/tests/data/test_530_B +++ /dev/null @@ -1,10 +0,0 @@ -79 179 -39 89 -5 67 -39 66 -88 162 -82 97 -80 156 -91 182 -44 110 -56 67 diff --git a/geom_bottleneck/tests/data/test_531_A b/geom_bottleneck/tests/data/test_531_A deleted file mode 100644 index 416eb0a..0000000 --- a/geom_bottleneck/tests/data/test_531_A +++ /dev/null @@ -1,10 +0,0 @@ -33 133 -73 98 -77 129 -21 118 -9 21 -68 166 -13 46 -53 84 -48 75 -24 90 diff --git a/geom_bottleneck/tests/data/test_531_B b/geom_bottleneck/tests/data/test_531_B deleted file mode 100644 index afb424a..0000000 --- a/geom_bottleneck/tests/data/test_531_B +++ /dev/null @@ -1,10 +0,0 @@ -89 148 -25 112 -86 132 -78 106 -57 70 -92 160 -67 86 -94 123 -12 26 -65 117 diff --git a/geom_bottleneck/tests/data/test_532_A b/geom_bottleneck/tests/data/test_532_A deleted file mode 100644 index 7eb97c1..0000000 --- a/geom_bottleneck/tests/data/test_532_A +++ /dev/null @@ -1,10 +0,0 @@ -8 62 -77 140 -23 60 -13 93 -67 74 -59 152 -22 65 -16 17 -97 98 -76 91 diff --git a/geom_bottleneck/tests/data/test_532_B b/geom_bottleneck/tests/data/test_532_B deleted file mode 100644 index e86a6a0..0000000 --- a/geom_bottleneck/tests/data/test_532_B +++ /dev/null @@ -1,10 +0,0 @@ -66 111 -54 74 -95 142 -96 167 -63 84 -76 84 -53 59 -97 130 -20 68 -5 58 diff --git a/geom_bottleneck/tests/data/test_533_A b/geom_bottleneck/tests/data/test_533_A deleted file mode 100644 index 0462a89..0000000 --- a/geom_bottleneck/tests/data/test_533_A +++ /dev/null @@ -1,10 +0,0 @@ -66 103 -20 42 -30 31 -61 90 -31 129 -49 53 -2 3 -78 122 -36 103 -59 63 diff --git a/geom_bottleneck/tests/data/test_533_B b/geom_bottleneck/tests/data/test_533_B deleted file mode 100644 index d077aa2..0000000 --- a/geom_bottleneck/tests/data/test_533_B +++ /dev/null @@ -1,10 +0,0 @@ -51 121 -9 63 -71 121 -66 100 -89 111 -15 23 -98 110 -15 96 -4 52 -96 119 diff --git a/geom_bottleneck/tests/data/test_534_A b/geom_bottleneck/tests/data/test_534_A deleted file mode 100644 index a5c6b69..0000000 --- a/geom_bottleneck/tests/data/test_534_A +++ /dev/null @@ -1,10 +0,0 @@ -84 177 -8 103 -81 176 -0 71 -4 80 -59 123 -42 63 -1 98 -86 169 -31 97 diff --git a/geom_bottleneck/tests/data/test_534_B b/geom_bottleneck/tests/data/test_534_B deleted file mode 100644 index 10d4e7b..0000000 --- a/geom_bottleneck/tests/data/test_534_B +++ /dev/null @@ -1,10 +0,0 @@ -8 56 -35 95 -62 104 -26 105 -32 52 -1 48 -87 150 -61 77 -12 66 -62 96 diff --git a/geom_bottleneck/tests/data/test_535_A b/geom_bottleneck/tests/data/test_535_A deleted file mode 100644 index faaf29f..0000000 --- a/geom_bottleneck/tests/data/test_535_A +++ /dev/null @@ -1,10 +0,0 @@ -40 53 -9 46 -94 119 -85 113 -2 97 -62 162 -74 89 -87 118 -76 120 -33 39 diff --git a/geom_bottleneck/tests/data/test_535_B b/geom_bottleneck/tests/data/test_535_B deleted file mode 100644 index 108c8a3..0000000 --- a/geom_bottleneck/tests/data/test_535_B +++ /dev/null @@ -1,10 +0,0 @@ -6 82 -22 100 -2 82 -71 123 -91 179 -14 107 -28 38 -71 83 -6 60 -1 5 diff --git a/geom_bottleneck/tests/data/test_536_A b/geom_bottleneck/tests/data/test_536_A deleted file mode 100644 index 320f5af..0000000 --- a/geom_bottleneck/tests/data/test_536_A +++ /dev/null @@ -1,10 +0,0 @@ -87 179 -24 37 -14 64 -10 103 -92 160 -96 136 -86 171 -21 54 -22 32 -71 169 diff --git a/geom_bottleneck/tests/data/test_536_B b/geom_bottleneck/tests/data/test_536_B deleted file mode 100644 index 9ce91f5..0000000 --- a/geom_bottleneck/tests/data/test_536_B +++ /dev/null @@ -1,10 +0,0 @@ -73 151 -54 87 -79 166 -69 149 -77 132 -49 149 -86 107 -72 119 -35 77 -52 56 diff --git a/geom_bottleneck/tests/data/test_537_A b/geom_bottleneck/tests/data/test_537_A deleted file mode 100644 index c41e293..0000000 --- a/geom_bottleneck/tests/data/test_537_A +++ /dev/null @@ -1,10 +0,0 @@ -4 80 -18 78 -55 56 -32 118 -79 151 -5 78 -11 12 -89 113 -99 120 -26 85 diff --git a/geom_bottleneck/tests/data/test_537_B b/geom_bottleneck/tests/data/test_537_B deleted file mode 100644 index a10f64d..0000000 --- a/geom_bottleneck/tests/data/test_537_B +++ /dev/null @@ -1,10 +0,0 @@ -53 138 -80 135 -34 112 -20 46 -79 122 -21 87 -82 83 -91 112 -59 139 -9 97 diff --git a/geom_bottleneck/tests/data/test_538_A b/geom_bottleneck/tests/data/test_538_A deleted file mode 100644 index 0d98495..0000000 --- a/geom_bottleneck/tests/data/test_538_A +++ /dev/null @@ -1,10 +0,0 @@ -68 91 -38 132 -6 57 -24 46 -71 79 -61 129 -59 82 -15 105 -77 79 -44 117 diff --git a/geom_bottleneck/tests/data/test_538_B b/geom_bottleneck/tests/data/test_538_B deleted file mode 100644 index 6dde6f3..0000000 --- a/geom_bottleneck/tests/data/test_538_B +++ /dev/null @@ -1,10 +0,0 @@ -0 89 -73 128 -54 150 -79 98 -62 137 -51 66 -67 99 -31 100 -68 105 -19 30 diff --git a/geom_bottleneck/tests/data/test_539_A b/geom_bottleneck/tests/data/test_539_A deleted file mode 100644 index a844d1c..0000000 --- a/geom_bottleneck/tests/data/test_539_A +++ /dev/null @@ -1,10 +0,0 @@ -72 140 -32 108 -64 99 -78 130 -74 122 -92 134 -71 75 -14 89 -86 134 -1 36 diff --git a/geom_bottleneck/tests/data/test_539_B b/geom_bottleneck/tests/data/test_539_B deleted file mode 100644 index 824a004..0000000 --- a/geom_bottleneck/tests/data/test_539_B +++ /dev/null @@ -1,10 +0,0 @@ -2 56 -57 82 -6 38 -60 68 -80 101 -27 57 -56 133 -45 75 -42 103 -38 78 diff --git a/geom_bottleneck/tests/data/test_540_A b/geom_bottleneck/tests/data/test_540_A deleted file mode 100644 index 26bd782..0000000 --- a/geom_bottleneck/tests/data/test_540_A +++ /dev/null @@ -1,20 +0,0 @@ -98 163 -65 109 -99 135 -11 83 -36 76 -57 84 -97 180 -22 87 -27 51 -92 190 -66 102 -32 76 -78 125 -70 144 -72 127 -50 51 -34 112 -3 39 -37 79 -55 143 diff --git a/geom_bottleneck/tests/data/test_540_B b/geom_bottleneck/tests/data/test_540_B deleted file mode 100644 index 224839d..0000000 --- a/geom_bottleneck/tests/data/test_540_B +++ /dev/null @@ -1,20 +0,0 @@ -90 182 -48 122 -34 109 -78 115 -60 110 -78 134 -58 59 -14 27 -48 94 -63 100 -88 171 -29 123 -20 61 -66 115 -46 61 -5 74 -94 189 -46 80 -85 88 -9 75 diff --git a/geom_bottleneck/tests/data/test_541_A b/geom_bottleneck/tests/data/test_541_A deleted file mode 100644 index fe8039b..0000000 --- a/geom_bottleneck/tests/data/test_541_A +++ /dev/null @@ -1,20 +0,0 @@ -79 102 -50 71 -80 116 -35 44 -54 112 -89 90 -16 90 -14 30 -44 122 -98 135 -45 68 -46 125 -0 11 -46 94 -75 79 -76 89 -15 82 -84 95 -49 61 -68 123 diff --git a/geom_bottleneck/tests/data/test_541_B b/geom_bottleneck/tests/data/test_541_B deleted file mode 100644 index c33af0e..0000000 --- a/geom_bottleneck/tests/data/test_541_B +++ /dev/null @@ -1,20 +0,0 @@ -39 108 -72 146 -49 50 -31 72 -84 104 -72 90 -57 81 -14 74 -69 74 -88 157 -9 65 -34 46 -44 87 -39 65 -14 77 -22 116 -5 58 -43 113 -62 120 -85 118 diff --git a/geom_bottleneck/tests/data/test_542_A b/geom_bottleneck/tests/data/test_542_A deleted file mode 100644 index d45ea52..0000000 --- a/geom_bottleneck/tests/data/test_542_A +++ /dev/null @@ -1,20 +0,0 @@ -17 49 -64 156 -91 96 -83 142 -90 118 -20 59 -26 69 -82 118 -94 179 -1 20 -81 123 -89 165 -17 71 -60 85 -56 147 -94 175 -82 148 -31 118 -51 95 -12 41 diff --git a/geom_bottleneck/tests/data/test_542_B b/geom_bottleneck/tests/data/test_542_B deleted file mode 100644 index 9dcdf8a..0000000 --- a/geom_bottleneck/tests/data/test_542_B +++ /dev/null @@ -1,20 +0,0 @@ -21 47 -41 90 -78 121 -36 93 -8 108 -78 117 -31 92 -97 102 -12 96 -83 89 -36 85 -2 81 -24 86 -26 105 -10 99 -59 101 -45 98 -94 162 -57 60 -29 81 diff --git a/geom_bottleneck/tests/data/test_543_A b/geom_bottleneck/tests/data/test_543_A deleted file mode 100644 index 511fbc1..0000000 --- a/geom_bottleneck/tests/data/test_543_A +++ /dev/null @@ -1,20 +0,0 @@ -92 188 -94 159 -77 175 -13 23 -92 186 -85 144 -100 191 -34 48 -58 103 -74 113 -73 95 -34 66 -2 98 -80 95 -82 140 -38 133 -67 121 -65 70 -83 86 -90 143 diff --git a/geom_bottleneck/tests/data/test_543_B b/geom_bottleneck/tests/data/test_543_B deleted file mode 100644 index 879080c..0000000 --- a/geom_bottleneck/tests/data/test_543_B +++ /dev/null @@ -1,20 +0,0 @@ -100 168 -52 97 -35 39 -4 38 -42 55 -47 117 -49 145 -16 48 -99 145 -45 54 -69 129 -8 103 -47 108 -25 70 -93 148 -96 133 -44 49 -94 115 -48 53 -44 109 diff --git a/geom_bottleneck/tests/data/test_544_A b/geom_bottleneck/tests/data/test_544_A deleted file mode 100644 index a355d41..0000000 --- a/geom_bottleneck/tests/data/test_544_A +++ /dev/null @@ -1,20 +0,0 @@ -31 114 -22 94 -10 88 -82 134 -28 106 -90 188 -78 130 -87 176 -99 155 -71 116 -39 105 -8 40 -96 184 -53 100 -77 79 -26 96 -30 116 -82 167 -62 122 -95 152 diff --git a/geom_bottleneck/tests/data/test_544_B b/geom_bottleneck/tests/data/test_544_B deleted file mode 100644 index 83587cf..0000000 --- a/geom_bottleneck/tests/data/test_544_B +++ /dev/null @@ -1,20 +0,0 @@ -75 125 -7 26 -61 102 -98 99 -12 88 -49 63 -46 61 -77 111 -13 56 -37 89 -7 84 -51 69 -86 142 -98 140 -91 122 -10 65 -9 33 -6 70 -95 101 -26 111 diff --git a/geom_bottleneck/tests/data/test_545_A b/geom_bottleneck/tests/data/test_545_A deleted file mode 100644 index c5351d7..0000000 --- a/geom_bottleneck/tests/data/test_545_A +++ /dev/null @@ -1,20 +0,0 @@ -52 89 -34 54 -44 124 -82 128 -75 104 -26 120 -77 159 -11 42 -75 153 -89 189 -52 73 -43 128 -45 132 -80 160 -53 55 -76 122 -96 114 -64 109 -20 119 -99 145 diff --git a/geom_bottleneck/tests/data/test_545_B b/geom_bottleneck/tests/data/test_545_B deleted file mode 100644 index 0c60c17..0000000 --- a/geom_bottleneck/tests/data/test_545_B +++ /dev/null @@ -1,20 +0,0 @@ -74 118 -29 69 -19 82 -50 124 -82 155 -15 63 -35 51 -38 52 -11 105 -70 114 -19 86 -91 157 -98 151 -14 83 -39 126 -38 52 -57 68 -79 137 -21 66 -68 92 diff --git a/geom_bottleneck/tests/data/test_546_A b/geom_bottleneck/tests/data/test_546_A deleted file mode 100644 index 4391c84..0000000 --- a/geom_bottleneck/tests/data/test_546_A +++ /dev/null @@ -1,20 +0,0 @@ -60 91 -46 132 -27 127 -4 36 -66 116 -73 113 -56 98 -29 66 -38 88 -18 24 -19 52 -32 119 -39 81 -71 110 -24 46 -81 90 -80 111 -47 88 -94 142 -42 47 diff --git a/geom_bottleneck/tests/data/test_546_B b/geom_bottleneck/tests/data/test_546_B deleted file mode 100644 index 3d3dec6..0000000 --- a/geom_bottleneck/tests/data/test_546_B +++ /dev/null @@ -1,20 +0,0 @@ -82 101 -14 80 -56 78 -28 113 -61 125 -70 88 -30 47 -88 176 -84 169 -15 92 -17 19 -33 61 -33 34 -60 142 -7 8 -5 34 -99 140 -35 113 -14 46 -74 112 diff --git a/geom_bottleneck/tests/data/test_547_A b/geom_bottleneck/tests/data/test_547_A deleted file mode 100644 index 1388d05..0000000 --- a/geom_bottleneck/tests/data/test_547_A +++ /dev/null @@ -1,20 +0,0 @@ -36 57 -27 86 -11 103 -73 132 -5 58 -59 66 -26 35 -0 18 -47 138 -49 118 -23 79 -12 99 -9 35 -15 79 -18 25 -94 137 -8 50 -68 78 -79 179 -31 121 diff --git a/geom_bottleneck/tests/data/test_547_B b/geom_bottleneck/tests/data/test_547_B deleted file mode 100644 index dbb925d..0000000 --- a/geom_bottleneck/tests/data/test_547_B +++ /dev/null @@ -1,20 +0,0 @@ -24 75 -28 29 -35 81 -81 178 -25 79 -78 106 -23 93 -57 151 -96 135 -85 151 -73 149 -37 98 -10 24 -30 61 -39 67 -68 74 -57 79 -66 160 -60 151 -66 139 diff --git a/geom_bottleneck/tests/data/test_548_A b/geom_bottleneck/tests/data/test_548_A deleted file mode 100644 index 08c858e..0000000 --- a/geom_bottleneck/tests/data/test_548_A +++ /dev/null @@ -1,20 +0,0 @@ -15 24 -24 72 -67 142 -71 97 -26 61 -99 158 -61 82 -100 198 -51 114 -10 98 -46 93 -74 171 -14 75 -85 101 -30 40 -37 42 -2 16 -48 64 -48 99 -77 170 diff --git a/geom_bottleneck/tests/data/test_548_B b/geom_bottleneck/tests/data/test_548_B deleted file mode 100644 index b6dda3a..0000000 --- a/geom_bottleneck/tests/data/test_548_B +++ /dev/null @@ -1,20 +0,0 @@ -51 59 -99 108 -89 148 -82 96 -55 117 -52 148 -74 133 -37 99 -6 71 -0 15 -100 170 -28 56 -12 39 -61 98 -24 92 -18 88 -63 158 -91 129 -79 154 -39 85 diff --git a/geom_bottleneck/tests/data/test_549_A b/geom_bottleneck/tests/data/test_549_A deleted file mode 100644 index b0d5ddf..0000000 --- a/geom_bottleneck/tests/data/test_549_A +++ /dev/null @@ -1,20 +0,0 @@ -35 44 -1 25 -100 168 -81 169 -40 84 -28 37 -50 58 -60 122 -4 27 -2 99 -67 145 -51 111 -96 148 -47 65 -64 159 -54 114 -90 113 -4 36 -94 178 -19 20 diff --git a/geom_bottleneck/tests/data/test_549_B b/geom_bottleneck/tests/data/test_549_B deleted file mode 100644 index a44a982..0000000 --- a/geom_bottleneck/tests/data/test_549_B +++ /dev/null @@ -1,20 +0,0 @@ -68 146 -8 27 -6 64 -76 113 -71 89 -29 65 -74 133 -52 57 -21 26 -2 39 -95 194 -67 113 -14 20 -90 160 -93 171 -72 97 -57 157 -23 42 -13 70 -17 44 diff --git a/geom_bottleneck/tests/data/test_550_A b/geom_bottleneck/tests/data/test_550_A deleted file mode 100644 index b8ba8e8..0000000 --- a/geom_bottleneck/tests/data/test_550_A +++ /dev/null @@ -1,20 +0,0 @@ -76 145 -38 79 -44 90 -71 155 -48 63 -88 125 -36 107 -91 136 -25 33 -49 57 -37 70 -69 116 -63 64 -70 118 -43 115 -80 99 -42 71 -86 91 -96 166 -69 121 diff --git a/geom_bottleneck/tests/data/test_550_B b/geom_bottleneck/tests/data/test_550_B deleted file mode 100644 index ed900f0..0000000 --- a/geom_bottleneck/tests/data/test_550_B +++ /dev/null @@ -1,20 +0,0 @@ -25 66 -55 107 -62 87 -15 49 -46 99 -25 39 -73 94 -43 126 -85 163 -12 96 -48 127 -21 26 -40 45 -88 188 -77 109 -38 44 -0 66 -57 59 -85 104 -32 54 diff --git a/geom_bottleneck/tests/data/test_551_A b/geom_bottleneck/tests/data/test_551_A deleted file mode 100644 index 3002ec2..0000000 --- a/geom_bottleneck/tests/data/test_551_A +++ /dev/null @@ -1,20 +0,0 @@ -68 98 -42 48 -4 5 -6 82 -41 83 -94 141 -17 48 -33 105 -71 162 -55 95 -43 132 -81 162 -6 32 -88 101 -76 85 -36 70 -42 45 -60 122 -83 127 -100 148 diff --git a/geom_bottleneck/tests/data/test_551_B b/geom_bottleneck/tests/data/test_551_B deleted file mode 100644 index 5a9b2de..0000000 --- a/geom_bottleneck/tests/data/test_551_B +++ /dev/null @@ -1,20 +0,0 @@ -58 109 -88 154 -56 66 -76 142 -86 125 -95 181 -46 85 -15 43 -55 79 -77 104 -45 113 -66 74 -64 100 -45 138 -6 62 -36 79 -77 106 -82 115 -15 110 -62 156 diff --git a/geom_bottleneck/tests/data/test_552_A b/geom_bottleneck/tests/data/test_552_A deleted file mode 100644 index 19de840..0000000 --- a/geom_bottleneck/tests/data/test_552_A +++ /dev/null @@ -1,20 +0,0 @@ -10 104 -23 89 -7 13 -66 150 -92 157 -22 43 -35 62 -96 187 -84 89 -75 160 -88 118 -74 99 -43 138 -20 37 -90 176 -85 157 -90 168 -63 157 -59 106 -68 92 diff --git a/geom_bottleneck/tests/data/test_552_B b/geom_bottleneck/tests/data/test_552_B deleted file mode 100644 index 54b3e00..0000000 --- a/geom_bottleneck/tests/data/test_552_B +++ /dev/null @@ -1,20 +0,0 @@ -57 121 -94 173 -84 133 -61 106 -71 130 -44 114 -55 73 -100 144 -91 126 -60 109 -44 92 -23 87 -52 116 -24 25 -10 93 -60 140 -11 55 -96 155 -76 165 -38 129 diff --git a/geom_bottleneck/tests/data/test_553_A b/geom_bottleneck/tests/data/test_553_A deleted file mode 100644 index deff96a..0000000 --- a/geom_bottleneck/tests/data/test_553_A +++ /dev/null @@ -1,20 +0,0 @@ -1 4 -23 91 -97 103 -6 68 -13 25 -9 18 -65 122 -91 154 -41 76 -86 132 -31 62 -93 167 -45 50 -70 166 -38 113 -52 132 -77 161 -13 60 -39 65 -60 69 diff --git a/geom_bottleneck/tests/data/test_553_B b/geom_bottleneck/tests/data/test_553_B deleted file mode 100644 index ee7ce9b..0000000 --- a/geom_bottleneck/tests/data/test_553_B +++ /dev/null @@ -1,20 +0,0 @@ -51 60 -76 151 -87 157 -49 110 -78 112 -3 59 -55 98 -26 121 -69 158 -15 63 -70 109 -30 46 -23 75 -65 138 -87 120 -7 46 -99 187 -43 69 -73 161 -37 93 diff --git a/geom_bottleneck/tests/data/test_554_A b/geom_bottleneck/tests/data/test_554_A deleted file mode 100644 index da38226..0000000 --- a/geom_bottleneck/tests/data/test_554_A +++ /dev/null @@ -1,20 +0,0 @@ -69 134 -81 159 -100 168 -96 111 -46 134 -56 61 -8 31 -63 119 -57 137 -16 84 -5 51 -79 128 -20 117 -85 136 -34 88 -23 73 -3 87 -10 34 -72 120 -36 71 diff --git a/geom_bottleneck/tests/data/test_554_B b/geom_bottleneck/tests/data/test_554_B deleted file mode 100644 index 8583236..0000000 --- a/geom_bottleneck/tests/data/test_554_B +++ /dev/null @@ -1,20 +0,0 @@ -14 62 -54 74 -87 164 -57 87 -70 113 -5 75 -86 185 -3 69 -36 52 -31 93 -85 104 -4 97 -89 149 -19 92 -70 120 -13 18 -48 72 -100 152 -35 48 -94 191 diff --git a/geom_bottleneck/tests/data/test_555_A b/geom_bottleneck/tests/data/test_555_A deleted file mode 100644 index 87cd93d..0000000 --- a/geom_bottleneck/tests/data/test_555_A +++ /dev/null @@ -1,20 +0,0 @@ -23 58 -71 106 -56 155 -37 85 -88 186 -12 75 -23 86 -17 92 -30 96 -13 54 -53 152 -84 153 -15 22 -67 86 -93 147 -17 117 -99 170 -75 108 -18 118 -71 131 diff --git a/geom_bottleneck/tests/data/test_555_B b/geom_bottleneck/tests/data/test_555_B deleted file mode 100644 index 2b8c351..0000000 --- a/geom_bottleneck/tests/data/test_555_B +++ /dev/null @@ -1,20 +0,0 @@ -9 71 -95 131 -85 156 -86 142 -10 54 -56 119 -49 100 -30 50 -7 64 -27 82 -14 85 -33 35 -22 52 -92 171 -36 62 -85 133 -4 14 -47 124 -70 131 -14 29 diff --git a/geom_bottleneck/tests/data/test_556_A b/geom_bottleneck/tests/data/test_556_A deleted file mode 100644 index 182965d..0000000 --- a/geom_bottleneck/tests/data/test_556_A +++ /dev/null @@ -1,20 +0,0 @@ -79 147 -83 144 -20 30 -92 185 -29 40 -46 90 -21 106 -15 24 -16 63 -62 67 -18 106 -52 127 -47 64 -15 84 -10 87 -16 102 -89 139 -64 68 -57 128 -37 120 diff --git a/geom_bottleneck/tests/data/test_556_B b/geom_bottleneck/tests/data/test_556_B deleted file mode 100644 index f2e3409..0000000 --- a/geom_bottleneck/tests/data/test_556_B +++ /dev/null @@ -1,20 +0,0 @@ -84 125 -37 84 -38 46 -32 59 -36 76 -95 107 -82 144 -81 121 -72 145 -1 100 -70 143 -76 167 -8 26 -51 90 -74 165 -88 89 -56 155 -95 165 -24 109 -45 141 diff --git a/geom_bottleneck/tests/data/test_557_A b/geom_bottleneck/tests/data/test_557_A deleted file mode 100644 index ac233bb..0000000 --- a/geom_bottleneck/tests/data/test_557_A +++ /dev/null @@ -1,20 +0,0 @@ -47 91 -57 100 -93 157 -12 91 -95 109 -26 103 -55 78 -58 106 -5 96 -25 85 -76 97 -20 78 -85 160 -71 144 -81 145 -58 59 -49 86 -31 35 -89 156 -15 82 diff --git a/geom_bottleneck/tests/data/test_557_B b/geom_bottleneck/tests/data/test_557_B deleted file mode 100644 index f838403..0000000 --- a/geom_bottleneck/tests/data/test_557_B +++ /dev/null @@ -1,20 +0,0 @@ -31 112 -70 120 -12 49 -95 96 -27 87 -50 120 -78 115 -22 108 -54 82 -31 109 -51 74 -55 140 -7 92 -88 133 -61 82 -90 183 -33 64 -90 121 -26 47 -98 120 diff --git a/geom_bottleneck/tests/data/test_558_A b/geom_bottleneck/tests/data/test_558_A deleted file mode 100644 index 7108d09..0000000 --- a/geom_bottleneck/tests/data/test_558_A +++ /dev/null @@ -1,20 +0,0 @@ -57 115 -32 131 -32 111 -46 104 -8 12 -20 69 -65 89 -8 37 -88 153 -61 63 -86 139 -74 88 -3 62 -58 104 -31 100 -29 81 -55 59 -11 18 -63 103 -56 110 diff --git a/geom_bottleneck/tests/data/test_558_B b/geom_bottleneck/tests/data/test_558_B deleted file mode 100644 index dd19869..0000000 --- a/geom_bottleneck/tests/data/test_558_B +++ /dev/null @@ -1,20 +0,0 @@ -43 134 -43 44 -56 124 -97 118 -34 68 -56 140 -41 140 -24 95 -57 91 -22 28 -94 158 -69 141 -94 110 -7 41 -39 59 -69 107 -76 163 -30 105 -96 142 -46 127 diff --git a/geom_bottleneck/tests/data/test_559_A b/geom_bottleneck/tests/data/test_559_A deleted file mode 100644 index 46f07b4..0000000 --- a/geom_bottleneck/tests/data/test_559_A +++ /dev/null @@ -1,20 +0,0 @@ -21 99 -7 104 -89 130 -91 181 -19 90 -57 146 -15 60 -66 123 -13 58 -3 57 -39 114 -4 53 -80 125 -83 132 -81 98 -14 99 -81 175 -49 92 -39 125 -31 111 diff --git a/geom_bottleneck/tests/data/test_559_B b/geom_bottleneck/tests/data/test_559_B deleted file mode 100644 index b747fb8..0000000 --- a/geom_bottleneck/tests/data/test_559_B +++ /dev/null @@ -1,20 +0,0 @@ -13 43 -81 86 -45 84 -84 111 -39 83 -85 115 -70 150 -97 192 -70 107 -21 74 -71 73 -98 184 -14 114 -63 126 -21 59 -53 147 -70 114 -30 56 -34 35 -61 133 diff --git a/geom_bottleneck/tests/data/test_560_A b/geom_bottleneck/tests/data/test_560_A deleted file mode 100644 index 9b704ae..0000000 --- a/geom_bottleneck/tests/data/test_560_A +++ /dev/null @@ -1,30 +0,0 @@ -35 126 -34 37 -78 84 -70 127 -97 106 -42 49 -49 105 -50 150 -80 140 -30 128 -90 136 -77 173 -42 98 -17 97 -100 181 -30 45 -6 40 -30 75 -66 148 -13 66 -39 113 -53 106 -65 133 -1 17 -61 123 -37 114 -1 77 -6 19 -8 11 -20 95 diff --git a/geom_bottleneck/tests/data/test_560_B b/geom_bottleneck/tests/data/test_560_B deleted file mode 100644 index d4ece9d..0000000 --- a/geom_bottleneck/tests/data/test_560_B +++ /dev/null @@ -1,30 +0,0 @@ -100 150 -25 32 -99 187 -42 117 -60 84 -22 104 -15 113 -29 58 -91 185 -92 120 -95 133 -42 67 -62 148 -79 122 -27 66 -14 75 -44 142 -10 25 -54 149 -31 38 -97 161 -63 115 -29 76 -100 102 -59 72 -54 140 -8 108 -12 83 -54 127 -43 95 diff --git a/geom_bottleneck/tests/data/test_561_A b/geom_bottleneck/tests/data/test_561_A deleted file mode 100644 index 81a3e31..0000000 --- a/geom_bottleneck/tests/data/test_561_A +++ /dev/null @@ -1,30 +0,0 @@ -13 66 -67 124 -99 163 -91 163 -42 140 -96 153 -6 77 -6 83 -84 166 -48 79 -50 79 -63 111 -21 85 -55 117 -62 160 -4 101 -30 75 -42 87 -58 60 -88 178 -43 54 -90 120 -72 147 -30 70 -13 66 -89 166 -83 149 -69 160 -66 83 -89 142 diff --git a/geom_bottleneck/tests/data/test_561_B b/geom_bottleneck/tests/data/test_561_B deleted file mode 100644 index c60b08c..0000000 --- a/geom_bottleneck/tests/data/test_561_B +++ /dev/null @@ -1,30 +0,0 @@ -61 97 -8 94 -32 68 -55 101 -24 56 -25 30 -33 79 -16 111 -72 82 -42 86 -93 143 -94 163 -69 168 -68 100 -3 102 -9 72 -6 74 -4 46 -97 130 -15 27 -12 33 -62 67 -37 74 -0 76 -14 102 -33 95 -46 131 -89 90 -79 97 -100 109 diff --git a/geom_bottleneck/tests/data/test_562_A b/geom_bottleneck/tests/data/test_562_A deleted file mode 100644 index 6dadf55..0000000 --- a/geom_bottleneck/tests/data/test_562_A +++ /dev/null @@ -1,30 +0,0 @@ -12 41 -99 100 -15 60 -95 108 -9 108 -4 5 -96 161 -88 168 -12 106 -78 167 -80 164 -69 130 -88 161 -49 134 -18 76 -54 134 -45 136 -22 50 -21 78 -17 88 -46 117 -97 174 -25 95 -8 9 -43 123 -25 107 -58 73 -2 7 -89 152 -81 114 diff --git a/geom_bottleneck/tests/data/test_562_B b/geom_bottleneck/tests/data/test_562_B deleted file mode 100644 index 48eaf77..0000000 --- a/geom_bottleneck/tests/data/test_562_B +++ /dev/null @@ -1,30 +0,0 @@ -5 104 -17 105 -43 120 -87 88 -35 71 -47 55 -57 87 -66 119 -26 114 -4 9 -29 70 -40 95 -61 73 -20 31 -85 148 -47 59 -34 43 -36 50 -70 77 -30 47 -36 56 -9 55 -35 127 -36 84 -83 118 -90 98 -69 85 -34 104 -76 127 -78 99 diff --git a/geom_bottleneck/tests/data/test_563_A b/geom_bottleneck/tests/data/test_563_A deleted file mode 100644 index 954685e..0000000 --- a/geom_bottleneck/tests/data/test_563_A +++ /dev/null @@ -1,30 +0,0 @@ -51 145 -19 119 -94 179 -8 35 -90 155 -34 39 -55 96 -19 27 -84 95 -12 52 -14 101 -72 143 -1 14 -88 138 -95 109 -85 134 -54 149 -35 85 -50 55 -93 173 -81 108 -14 112 -23 67 -13 14 -21 37 -89 177 -63 163 -2 89 -5 61 -18 76 diff --git a/geom_bottleneck/tests/data/test_563_B b/geom_bottleneck/tests/data/test_563_B deleted file mode 100644 index c3d7844..0000000 --- a/geom_bottleneck/tests/data/test_563_B +++ /dev/null @@ -1,30 +0,0 @@ -40 75 -52 88 -0 33 -63 134 -19 77 -34 106 -67 164 -6 61 -67 144 -41 105 -30 108 -17 24 -97 105 -61 90 -45 80 -34 52 -58 140 -46 52 -4 13 -43 143 -74 168 -85 148 -24 55 -80 84 -3 56 -39 138 -1 30 -14 20 -14 91 -42 48 diff --git a/geom_bottleneck/tests/data/test_564_A b/geom_bottleneck/tests/data/test_564_A deleted file mode 100644 index a39b7ae..0000000 --- a/geom_bottleneck/tests/data/test_564_A +++ /dev/null @@ -1,30 +0,0 @@ -85 112 -83 119 -84 128 -36 100 -18 112 -83 89 -17 80 -68 147 -32 76 -42 46 -29 89 -9 49 -40 135 -65 75 -69 113 -87 184 -81 103 -13 81 -44 99 -17 51 -99 102 -86 89 -29 124 -52 140 -19 54 -73 173 -89 172 -6 33 -80 139 -52 58 diff --git a/geom_bottleneck/tests/data/test_564_B b/geom_bottleneck/tests/data/test_564_B deleted file mode 100644 index 22adad2..0000000 --- a/geom_bottleneck/tests/data/test_564_B +++ /dev/null @@ -1,30 +0,0 @@ -56 66 -92 164 -7 68 -87 135 -45 70 -94 109 -32 103 -44 73 -36 124 -50 139 -88 102 -17 116 -3 61 -90 149 -41 62 -13 42 -19 51 -96 105 -55 143 -67 165 -44 129 -72 171 -20 51 -36 119 -35 96 -33 107 -48 106 -9 30 -36 110 -90 114 diff --git a/geom_bottleneck/tests/data/test_565_A b/geom_bottleneck/tests/data/test_565_A deleted file mode 100644 index 34eb265..0000000 --- a/geom_bottleneck/tests/data/test_565_A +++ /dev/null @@ -1,30 +0,0 @@ -33 61 -68 78 -90 98 -66 127 -93 152 -21 29 -49 52 -78 171 -42 55 -95 159 -82 141 -85 152 -22 25 -71 132 -24 75 -3 82 -42 131 -24 73 -89 155 -32 132 -77 159 -97 165 -89 92 -50 82 -52 102 -11 64 -47 135 -45 89 -11 52 -11 25 diff --git a/geom_bottleneck/tests/data/test_565_B b/geom_bottleneck/tests/data/test_565_B deleted file mode 100644 index da5ed1d..0000000 --- a/geom_bottleneck/tests/data/test_565_B +++ /dev/null @@ -1,30 +0,0 @@ -46 66 -86 178 -19 102 -97 140 -22 97 -49 97 -6 48 -23 105 -92 157 -85 103 -67 167 -29 44 -88 183 -85 184 -90 93 -23 113 -30 106 -32 130 -81 154 -76 141 -75 101 -26 84 -9 77 -53 73 -23 84 -83 85 -6 44 -29 31 -26 107 -61 114 diff --git a/geom_bottleneck/tests/data/test_566_A b/geom_bottleneck/tests/data/test_566_A deleted file mode 100644 index 55d0a13..0000000 --- a/geom_bottleneck/tests/data/test_566_A +++ /dev/null @@ -1,30 +0,0 @@ -4 34 -20 53 -59 101 -40 70 -29 58 -67 107 -92 122 -35 120 -34 98 -34 79 -17 20 -12 53 -69 167 -19 88 -92 118 -21 73 -54 78 -0 83 -41 127 -34 59 -41 106 -4 102 -46 48 -99 189 -15 25 -17 19 -25 33 -25 108 -25 105 -64 99 diff --git a/geom_bottleneck/tests/data/test_566_B b/geom_bottleneck/tests/data/test_566_B deleted file mode 100644 index 57c08b6..0000000 --- a/geom_bottleneck/tests/data/test_566_B +++ /dev/null @@ -1,30 +0,0 @@ -36 121 -5 33 -47 137 -95 158 -43 105 -4 15 -0 59 -30 36 -29 106 -58 126 -81 129 -63 108 -52 147 -80 163 -93 94 -32 122 -12 92 -74 135 -25 28 -11 107 -91 182 -68 90 -90 106 -96 126 -83 117 -57 147 -89 181 -36 107 -24 68 -83 131 diff --git a/geom_bottleneck/tests/data/test_567_A b/geom_bottleneck/tests/data/test_567_A deleted file mode 100644 index 3304c25..0000000 --- a/geom_bottleneck/tests/data/test_567_A +++ /dev/null @@ -1,30 +0,0 @@ -67 79 -12 58 -33 85 -25 70 -79 128 -34 59 -22 45 -100 102 -25 57 -30 113 -77 89 -74 83 -43 138 -30 81 -26 64 -91 94 -83 149 -83 119 -44 46 -79 105 -49 140 -58 110 -92 104 -8 65 -40 52 -46 60 -9 17 -25 47 -25 125 -95 109 diff --git a/geom_bottleneck/tests/data/test_567_B b/geom_bottleneck/tests/data/test_567_B deleted file mode 100644 index 4a8f5fa..0000000 --- a/geom_bottleneck/tests/data/test_567_B +++ /dev/null @@ -1,30 +0,0 @@ -46 93 -85 165 -2 24 -29 81 -88 99 -94 109 -78 82 -54 69 -43 139 -3 40 -37 117 -98 138 -12 71 -75 84 -9 100 -56 65 -97 146 -56 105 -17 82 -11 44 -93 100 -6 99 -32 128 -9 35 -9 41 -66 123 -66 163 -34 110 -47 82 -15 97 diff --git a/geom_bottleneck/tests/data/test_568_A b/geom_bottleneck/tests/data/test_568_A deleted file mode 100644 index e6e0ecb..0000000 --- a/geom_bottleneck/tests/data/test_568_A +++ /dev/null @@ -1,30 +0,0 @@ -20 98 -14 51 -82 116 -80 117 -96 109 -61 101 -44 75 -76 80 -64 96 -100 158 -13 89 -84 138 -0 16 -94 138 -32 117 -68 157 -7 24 -1 56 -72 101 -47 128 -85 90 -66 155 -33 106 -97 144 -50 139 -10 54 -23 77 -87 106 -37 104 -11 37 diff --git a/geom_bottleneck/tests/data/test_568_B b/geom_bottleneck/tests/data/test_568_B deleted file mode 100644 index 081ff5e..0000000 --- a/geom_bottleneck/tests/data/test_568_B +++ /dev/null @@ -1,30 +0,0 @@ -49 147 -26 112 -32 71 -30 50 -77 136 -10 110 -50 71 -14 110 -4 24 -64 125 -54 121 -58 142 -50 51 -0 63 -7 96 -49 146 -64 111 -53 122 -2 84 -56 102 -44 102 -5 78 -61 90 -32 92 -99 157 -100 188 -37 70 -6 7 -58 139 -52 138 diff --git a/geom_bottleneck/tests/data/test_569_A b/geom_bottleneck/tests/data/test_569_A deleted file mode 100644 index 7fc96cf..0000000 --- a/geom_bottleneck/tests/data/test_569_A +++ /dev/null @@ -1,30 +0,0 @@ -83 116 -33 112 -58 86 -3 65 -21 46 -51 58 -47 138 -88 112 -4 84 -4 8 -46 74 -74 132 -54 120 -2 68 -99 119 -5 43 -5 61 -54 75 -83 169 -100 192 -47 133 -27 28 -44 128 -19 77 -60 160 -46 55 -78 169 -16 82 -60 97 -57 60 diff --git a/geom_bottleneck/tests/data/test_569_B b/geom_bottleneck/tests/data/test_569_B deleted file mode 100644 index b732aac..0000000 --- a/geom_bottleneck/tests/data/test_569_B +++ /dev/null @@ -1,30 +0,0 @@ -51 97 -59 91 -9 11 -49 50 -54 111 -44 132 -22 53 -11 80 -22 101 -76 79 -29 112 -99 123 -67 116 -69 110 -27 51 -22 55 -3 58 -43 84 -18 68 -88 134 -28 29 -70 137 -36 37 -85 168 -4 69 -50 99 -27 117 -12 69 -55 127 -23 28 diff --git a/geom_bottleneck/tests/data/test_570_A b/geom_bottleneck/tests/data/test_570_A deleted file mode 100644 index 371835b..0000000 --- a/geom_bottleneck/tests/data/test_570_A +++ /dev/null @@ -1,30 +0,0 @@ -30 76 -17 43 -84 85 -45 52 -85 117 -95 172 -36 58 -6 12 -70 147 -82 114 -67 163 -1 85 -1 92 -23 80 -58 60 -42 123 -100 148 -52 127 -45 49 -33 47 -48 124 -77 169 -5 64 -24 49 -16 40 -83 130 -86 121 -73 157 -88 124 -59 80 diff --git a/geom_bottleneck/tests/data/test_570_B b/geom_bottleneck/tests/data/test_570_B deleted file mode 100644 index 3ce3450..0000000 --- a/geom_bottleneck/tests/data/test_570_B +++ /dev/null @@ -1,30 +0,0 @@ -44 134 -28 120 -0 58 -32 41 -64 82 -7 91 -32 123 -22 46 -87 159 -3 13 -79 102 -37 80 -77 91 -64 126 -43 128 -53 107 -50 89 -15 111 -37 101 -6 51 -11 41 -66 110 -99 191 -8 53 -12 59 -53 91 -9 51 -47 57 -35 88 -83 134 diff --git a/geom_bottleneck/tests/data/test_571_A b/geom_bottleneck/tests/data/test_571_A deleted file mode 100644 index 6b58a17..0000000 --- a/geom_bottleneck/tests/data/test_571_A +++ /dev/null @@ -1,30 +0,0 @@ -73 83 -85 94 -20 39 -62 71 -100 146 -84 95 -21 64 -62 136 -49 90 -39 129 -92 156 -27 105 -48 66 -5 100 -86 186 -74 118 -93 173 -93 143 -91 173 -5 59 -75 78 -98 106 -37 125 -24 60 -24 117 -83 131 -69 137 -1 54 -81 154 -26 124 diff --git a/geom_bottleneck/tests/data/test_571_B b/geom_bottleneck/tests/data/test_571_B deleted file mode 100644 index 0bb3b3e..0000000 --- a/geom_bottleneck/tests/data/test_571_B +++ /dev/null @@ -1,30 +0,0 @@ -90 159 -93 97 -57 109 -87 127 -96 185 -53 142 -59 125 -54 132 -26 48 -54 150 -63 65 -36 50 -3 19 -19 95 -47 76 -25 36 -34 70 -63 126 -99 199 -11 38 -96 120 -89 162 -55 125 -3 98 -11 31 -18 103 -68 101 -47 68 -45 48 -36 59 diff --git a/geom_bottleneck/tests/data/test_572_A b/geom_bottleneck/tests/data/test_572_A deleted file mode 100644 index 052ddfe..0000000 --- a/geom_bottleneck/tests/data/test_572_A +++ /dev/null @@ -1,30 +0,0 @@ -83 96 -59 158 -99 133 -98 139 -71 163 -95 138 -83 97 -46 72 -23 29 -49 133 -60 63 -6 84 -33 86 -33 71 -99 188 -51 61 -79 150 -38 61 -68 147 -98 170 -77 131 -32 97 -57 119 -36 37 -66 75 -37 68 -72 150 -42 99 -28 90 -56 123 diff --git a/geom_bottleneck/tests/data/test_572_B b/geom_bottleneck/tests/data/test_572_B deleted file mode 100644 index d816eab..0000000 --- a/geom_bottleneck/tests/data/test_572_B +++ /dev/null @@ -1,30 +0,0 @@ -44 61 -72 88 -8 15 -78 155 -90 99 -87 106 -50 57 -60 126 -75 175 -81 135 -94 181 -6 52 -64 152 -63 79 -23 105 -88 104 -68 145 -9 26 -23 68 -49 144 -5 9 -62 156 -6 94 -61 159 -82 130 -26 84 -78 110 -27 75 -41 123 -56 147 diff --git a/geom_bottleneck/tests/data/test_573_A b/geom_bottleneck/tests/data/test_573_A deleted file mode 100644 index fe68d64..0000000 --- a/geom_bottleneck/tests/data/test_573_A +++ /dev/null @@ -1,30 +0,0 @@ -43 94 -41 75 -26 69 -43 58 -64 94 -54 98 -19 106 -99 119 -52 115 -79 88 -77 84 -96 118 -55 80 -47 114 -64 137 -79 158 -38 60 -79 136 -57 82 -17 103 -28 82 -28 35 -74 86 -99 121 -96 176 -0 55 -2 76 -85 155 -9 40 -76 118 diff --git a/geom_bottleneck/tests/data/test_573_B b/geom_bottleneck/tests/data/test_573_B deleted file mode 100644 index 9824068..0000000 --- a/geom_bottleneck/tests/data/test_573_B +++ /dev/null @@ -1,30 +0,0 @@ -60 107 -11 66 -34 94 -40 87 -1 4 -43 67 -25 76 -73 108 -86 178 -25 58 -95 99 -82 97 -13 54 -58 88 -38 78 -44 131 -92 99 -5 88 -98 120 -56 112 -45 112 -69 110 -48 121 -53 83 -20 52 -3 45 -49 126 -13 17 -30 83 -97 121 diff --git a/geom_bottleneck/tests/data/test_574_A b/geom_bottleneck/tests/data/test_574_A deleted file mode 100644 index 9dbb066..0000000 --- a/geom_bottleneck/tests/data/test_574_A +++ /dev/null @@ -1,30 +0,0 @@ -21 109 -12 79 -44 58 -0 97 -30 124 -58 154 -91 150 -1 92 -34 43 -18 109 -10 11 -0 84 -30 56 -66 166 -43 80 -77 167 -61 94 -58 136 -20 110 -84 144 -100 182 -8 80 -79 124 -89 164 -61 84 -69 129 -30 111 -67 105 -69 70 -38 108 diff --git a/geom_bottleneck/tests/data/test_574_B b/geom_bottleneck/tests/data/test_574_B deleted file mode 100644 index dc0f4c7..0000000 --- a/geom_bottleneck/tests/data/test_574_B +++ /dev/null @@ -1,30 +0,0 @@ -24 53 -49 112 -58 149 -49 136 -66 149 -10 87 -36 113 -66 144 -87 150 -20 40 -41 136 -80 111 -99 199 -76 131 -7 72 -99 122 -93 124 -5 8 -97 105 -23 27 -82 102 -30 84 -62 143 -8 48 -40 119 -29 62 -11 68 -75 128 -68 124 -23 26 diff --git a/geom_bottleneck/tests/data/test_575_A b/geom_bottleneck/tests/data/test_575_A deleted file mode 100644 index 7703382..0000000 --- a/geom_bottleneck/tests/data/test_575_A +++ /dev/null @@ -1,30 +0,0 @@ -78 141 -24 58 -30 120 -71 72 -4 21 -30 61 -7 52 -16 91 -58 109 -28 97 -46 86 -65 134 -86 151 -77 134 -6 32 -31 83 -84 180 -53 118 -78 108 -88 115 -75 137 -92 149 -57 120 -94 109 -59 131 -5 36 -39 91 -65 138 -96 167 -87 164 diff --git a/geom_bottleneck/tests/data/test_575_B b/geom_bottleneck/tests/data/test_575_B deleted file mode 100644 index a5ba6b7..0000000 --- a/geom_bottleneck/tests/data/test_575_B +++ /dev/null @@ -1,30 +0,0 @@ -77 176 -11 43 -38 70 -64 163 -70 101 -18 66 -50 119 -30 48 -18 88 -85 106 -50 56 -42 134 -25 92 -5 53 -86 101 -44 91 -61 127 -42 55 -31 103 -15 23 -93 117 -45 68 -39 84 -64 135 -86 109 -82 174 -72 73 -43 73 -37 41 -71 76 diff --git a/geom_bottleneck/tests/data/test_576_A b/geom_bottleneck/tests/data/test_576_A deleted file mode 100644 index 57eb281..0000000 --- a/geom_bottleneck/tests/data/test_576_A +++ /dev/null @@ -1,30 +0,0 @@ -61 135 -79 123 -27 28 -4 48 -44 120 -40 69 -28 82 -4 45 -28 82 -70 145 -14 102 -84 169 -89 121 -67 137 -65 141 -39 60 -97 162 -90 187 -23 78 -71 168 -76 98 -85 101 -9 86 -57 89 -86 109 -55 62 -90 101 -82 110 -100 153 -33 67 diff --git a/geom_bottleneck/tests/data/test_576_B b/geom_bottleneck/tests/data/test_576_B deleted file mode 100644 index fa63de8..0000000 --- a/geom_bottleneck/tests/data/test_576_B +++ /dev/null @@ -1,30 +0,0 @@ -83 145 -27 62 -71 125 -78 175 -11 55 -81 94 -91 141 -27 103 -68 97 -54 89 -68 143 -50 100 -65 85 -84 179 -83 96 -44 121 -13 86 -29 86 -72 172 -95 140 -83 161 -83 100 -98 167 -8 66 -75 101 -6 50 -10 58 -5 57 -51 77 -87 140 diff --git a/geom_bottleneck/tests/data/test_577_A b/geom_bottleneck/tests/data/test_577_A deleted file mode 100644 index d086e3f..0000000 --- a/geom_bottleneck/tests/data/test_577_A +++ /dev/null @@ -1,30 +0,0 @@ -65 94 -1 2 -30 31 -91 131 -75 170 -38 85 -51 73 -78 155 -43 141 -54 109 -53 54 -36 74 -75 80 -51 144 -33 127 -31 89 -0 10 -18 87 -11 18 -51 126 -64 91 -7 51 -26 71 -92 160 -24 44 -0 58 -3 78 -2 67 -12 88 -68 130 diff --git a/geom_bottleneck/tests/data/test_577_B b/geom_bottleneck/tests/data/test_577_B deleted file mode 100644 index e48e09a..0000000 --- a/geom_bottleneck/tests/data/test_577_B +++ /dev/null @@ -1,30 +0,0 @@ -90 189 -96 195 -64 91 -81 84 -42 76 -17 19 -76 77 -64 149 -85 99 -90 147 -60 95 -59 155 -29 121 -27 104 -10 72 -32 79 -44 129 -9 70 -68 136 -9 75 -27 89 -70 148 -77 149 -8 91 -24 84 -90 123 -86 105 -64 94 -84 109 -31 51 diff --git a/geom_bottleneck/tests/data/test_578_A b/geom_bottleneck/tests/data/test_578_A deleted file mode 100644 index 8b9a6fe..0000000 --- a/geom_bottleneck/tests/data/test_578_A +++ /dev/null @@ -1,30 +0,0 @@ -9 99 -58 83 -62 110 -32 102 -86 169 -95 131 -1 6 -1 55 -88 154 -67 95 -21 22 -31 118 -15 52 -64 92 -36 87 -18 106 -71 150 -10 55 -67 97 -53 145 -31 40 -33 62 -79 116 -70 110 -96 145 -86 182 -43 116 -54 145 -100 172 -74 84 diff --git a/geom_bottleneck/tests/data/test_578_B b/geom_bottleneck/tests/data/test_578_B deleted file mode 100644 index 636f20d..0000000 --- a/geom_bottleneck/tests/data/test_578_B +++ /dev/null @@ -1,30 +0,0 @@ -33 36 -89 175 -83 151 -61 138 -4 15 -9 58 -38 111 -29 117 -22 79 -26 86 -48 55 -65 134 -60 84 -23 96 -69 149 -29 48 -38 137 -39 51 -88 112 -14 41 -29 119 -52 56 -55 96 -58 127 -78 148 -44 64 -35 108 -69 124 -6 80 -43 77 diff --git a/geom_bottleneck/tests/data/test_579_A b/geom_bottleneck/tests/data/test_579_A deleted file mode 100644 index 99bbb96..0000000 --- a/geom_bottleneck/tests/data/test_579_A +++ /dev/null @@ -1,30 +0,0 @@ -90 170 -5 32 -49 116 -37 88 -19 64 -81 177 -39 77 -37 123 -53 127 -31 76 -67 114 -51 125 -48 121 -59 62 -31 119 -35 90 -100 117 -33 130 -22 74 -23 41 -71 159 -3 57 -22 61 -86 123 -91 115 -66 92 -39 104 -85 134 -72 160 -6 94 diff --git a/geom_bottleneck/tests/data/test_579_B b/geom_bottleneck/tests/data/test_579_B deleted file mode 100644 index 6d3e9b6..0000000 --- a/geom_bottleneck/tests/data/test_579_B +++ /dev/null @@ -1,30 +0,0 @@ -76 123 -2 17 -41 123 -62 138 -40 70 -92 164 -70 105 -63 109 -14 23 -26 109 -78 141 -85 162 -37 49 -27 96 -62 68 -80 136 -30 72 -44 85 -59 122 -42 137 -67 140 -81 181 -43 84 -91 108 -71 86 -30 45 -76 94 -25 57 -25 71 -70 90 diff --git a/geom_bottleneck/tests/data/test_580_A b/geom_bottleneck/tests/data/test_580_A deleted file mode 100644 index b8d1c86..0000000 --- a/geom_bottleneck/tests/data/test_580_A +++ /dev/null @@ -1,50 +0,0 @@ -34 78 -25 82 -42 132 -77 154 -15 52 -54 69 -68 78 -36 111 -9 24 -30 53 -53 117 -84 163 -91 124 -13 76 -20 59 -67 151 -17 103 -76 156 -3 41 -2 37 -65 158 -67 75 -42 125 -83 115 -47 147 -13 44 -83 133 -92 146 -57 125 -66 103 -55 69 -39 63 -16 63 -98 108 -23 93 -12 30 -7 70 -70 131 -49 127 -83 90 -97 171 -35 81 -78 130 -88 143 -62 124 -2 40 -66 110 -51 61 -2 25 -69 74 diff --git a/geom_bottleneck/tests/data/test_580_B b/geom_bottleneck/tests/data/test_580_B deleted file mode 100644 index 1fd48af..0000000 --- a/geom_bottleneck/tests/data/test_580_B +++ /dev/null @@ -1,50 +0,0 @@ -60 156 -65 78 -70 102 -52 113 -64 154 -45 126 -45 86 -6 49 -7 93 -99 127 -15 33 -1 36 -12 30 -30 89 -41 84 -66 131 -8 23 -0 9 -95 149 -47 83 -69 165 -79 91 -74 125 -59 77 -93 137 -33 119 -24 113 -98 116 -10 70 -57 124 -97 126 -48 113 -30 67 -2 15 -56 86 -75 111 -81 82 -99 196 -69 105 -51 147 -5 69 -40 136 -79 147 -44 136 -95 194 -67 93 -0 46 -26 90 -58 115 -40 87 diff --git a/geom_bottleneck/tests/data/test_581_A b/geom_bottleneck/tests/data/test_581_A deleted file mode 100644 index cf1555c..0000000 --- a/geom_bottleneck/tests/data/test_581_A +++ /dev/null @@ -1,50 +0,0 @@ -79 87 -81 162 -7 74 -53 79 -19 50 -30 106 -68 155 -17 79 -75 90 -55 71 -30 127 -57 145 -78 80 -11 96 -16 47 -56 131 -45 46 -75 136 -17 75 -72 74 -27 114 -28 112 -31 123 -37 110 -89 159 -57 85 -49 52 -72 130 -68 86 -88 152 -5 66 -67 71 -51 91 -72 82 -3 21 -21 38 -47 86 -37 108 -35 123 -49 119 -36 97 -36 119 -9 48 -16 36 -32 37 -38 68 -82 147 -39 79 -23 101 -33 104 diff --git a/geom_bottleneck/tests/data/test_581_B b/geom_bottleneck/tests/data/test_581_B deleted file mode 100644 index 853ac92..0000000 --- a/geom_bottleneck/tests/data/test_581_B +++ /dev/null @@ -1,50 +0,0 @@ -94 181 -38 90 -83 137 -36 93 -8 53 -59 118 -21 110 -94 175 -18 40 -94 120 -46 81 -54 145 -13 37 -36 100 -73 86 -67 166 -91 187 -11 15 -45 124 -23 29 -89 125 -78 101 -83 98 -52 73 -39 62 -15 86 -80 140 -100 181 -50 55 -80 124 -27 29 -19 76 -92 167 -12 57 -63 134 -45 46 -42 110 -93 179 -31 130 -59 137 -7 99 -77 107 -59 127 -82 160 -27 70 -100 200 -80 101 -16 97 -93 184 -15 48 diff --git a/geom_bottleneck/tests/data/test_582_A b/geom_bottleneck/tests/data/test_582_A deleted file mode 100644 index dcabc9f..0000000 --- a/geom_bottleneck/tests/data/test_582_A +++ /dev/null @@ -1,50 +0,0 @@ -85 106 -23 89 -31 90 -4 42 -45 104 -100 137 -32 115 -65 112 -25 82 -75 158 -74 147 -6 106 -92 179 -91 110 -94 150 -9 19 -91 110 -82 108 -39 90 -49 69 -73 89 -61 68 -22 85 -13 57 -86 102 -23 43 -29 65 -3 72 -85 131 -71 80 -83 89 -73 119 -28 46 -33 101 -18 24 -38 69 -50 51 -84 85 -75 175 -99 153 -84 86 -97 100 -68 115 -91 108 -62 77 -54 80 -7 49 -26 29 -53 101 -64 73 diff --git a/geom_bottleneck/tests/data/test_582_B b/geom_bottleneck/tests/data/test_582_B deleted file mode 100644 index 9420fa9..0000000 --- a/geom_bottleneck/tests/data/test_582_B +++ /dev/null @@ -1,50 +0,0 @@ -99 153 -54 92 -64 65 -40 117 -28 70 -33 105 -70 105 -72 109 -9 34 -72 151 -1 46 -57 133 -51 72 -52 119 -44 92 -13 71 -96 191 -80 123 -47 121 -84 162 -69 111 -15 35 -41 45 -23 86 -36 107 -6 18 -63 118 -4 50 -84 107 -90 132 -74 127 -14 37 -75 167 -42 81 -53 76 -32 88 -2 70 -87 129 -7 8 -6 35 -70 115 -69 137 -80 174 -24 107 -66 116 -22 110 -4 90 -0 41 -63 160 -99 142 diff --git a/geom_bottleneck/tests/data/test_583_A b/geom_bottleneck/tests/data/test_583_A deleted file mode 100644 index cc36f56..0000000 --- a/geom_bottleneck/tests/data/test_583_A +++ /dev/null @@ -1,50 +0,0 @@ -99 127 -62 97 -4 61 -70 121 -74 149 -79 158 -98 193 -22 53 -66 89 -45 58 -49 80 -56 89 -48 124 -100 166 -76 143 -32 33 -15 59 -16 91 -32 33 -1 21 -73 169 -84 171 -49 69 -52 146 -10 57 -26 112 -54 76 -92 125 -47 49 -53 107 -2 69 -99 186 -67 79 -13 113 -54 73 -1 72 -4 20 -43 112 -0 89 -77 150 -31 61 -24 29 -75 169 -56 143 -88 133 -37 38 -90 160 -97 189 -39 72 -30 38 diff --git a/geom_bottleneck/tests/data/test_583_B b/geom_bottleneck/tests/data/test_583_B deleted file mode 100644 index d021fb3..0000000 --- a/geom_bottleneck/tests/data/test_583_B +++ /dev/null @@ -1,50 +0,0 @@ -26 43 -87 160 -74 100 -69 139 -72 87 -22 58 -0 3 -67 133 -52 56 -67 97 -42 117 -30 44 -67 119 -91 164 -45 65 -35 127 -80 91 -75 160 -11 68 -86 92 -24 79 -90 156 -91 94 -64 114 -55 66 -72 80 -36 78 -85 114 -27 69 -40 75 -65 152 -48 106 -72 105 -63 109 -37 108 -48 84 -81 147 -14 91 -46 94 -6 14 -28 100 -41 103 -21 92 -40 111 -42 106 -86 136 -97 113 -24 79 -77 99 -80 89 diff --git a/geom_bottleneck/tests/data/test_584_A b/geom_bottleneck/tests/data/test_584_A deleted file mode 100644 index c934a50..0000000 --- a/geom_bottleneck/tests/data/test_584_A +++ /dev/null @@ -1,50 +0,0 @@ -15 100 -30 70 -46 69 -99 128 -25 93 -75 90 -6 31 -47 141 -51 99 -98 133 -50 69 -3 27 -16 91 -36 95 -29 73 -26 76 -24 45 -9 105 -21 103 -46 81 -91 156 -77 141 -36 72 -92 122 -48 98 -34 105 -80 172 -92 136 -16 81 -30 100 -13 111 -1 51 -1 52 -66 140 -81 96 -18 69 -37 123 -82 132 -64 114 -6 26 -46 70 -39 74 -20 108 -70 128 -43 86 -50 71 -73 98 -42 74 -52 79 -42 101 diff --git a/geom_bottleneck/tests/data/test_584_B b/geom_bottleneck/tests/data/test_584_B deleted file mode 100644 index 9f07efc..0000000 --- a/geom_bottleneck/tests/data/test_584_B +++ /dev/null @@ -1,50 +0,0 @@ -99 143 -58 93 -32 121 -23 112 -64 102 -73 110 -76 128 -18 108 -17 97 -82 97 -40 138 -43 92 -18 33 -36 60 -2 27 -67 132 -45 79 -40 78 -90 97 -98 163 -16 86 -74 83 -98 154 -7 74 -3 41 -43 55 -69 123 -54 154 -96 143 -66 98 -26 52 -6 47 -45 84 -17 50 -32 78 -15 25 -46 133 -41 115 -54 144 -19 39 -71 150 -77 133 -42 90 -100 165 -73 113 -63 67 -19 106 -11 18 -11 73 -67 69 diff --git a/geom_bottleneck/tests/data/test_585_A b/geom_bottleneck/tests/data/test_585_A deleted file mode 100644 index 903e5b1..0000000 --- a/geom_bottleneck/tests/data/test_585_A +++ /dev/null @@ -1,50 +0,0 @@ -50 147 -39 41 -59 153 -79 105 -90 122 -21 31 -34 51 -27 64 -77 125 -46 115 -92 164 -81 167 -91 182 -15 87 -39 115 -43 113 -29 115 -9 60 -81 95 -45 89 -36 101 -29 41 -68 132 -40 110 -33 92 -2 3 -27 113 -90 152 -35 109 -48 90 -63 160 -46 102 -61 146 -48 68 -23 98 -53 91 -80 101 -50 55 -78 163 -89 126 -62 145 -64 129 -18 31 -27 110 -58 91 -6 20 -84 103 -54 120 -87 162 -97 144 diff --git a/geom_bottleneck/tests/data/test_585_B b/geom_bottleneck/tests/data/test_585_B deleted file mode 100644 index 69f116a..0000000 --- a/geom_bottleneck/tests/data/test_585_B +++ /dev/null @@ -1,50 +0,0 @@ -41 56 -85 176 -84 155 -25 40 -33 60 -84 92 -66 123 -63 66 -24 60 -4 51 -74 84 -13 70 -4 15 -86 102 -29 120 -62 70 -29 94 -11 20 -71 162 -87 165 -24 118 -65 93 -28 97 -54 151 -42 126 -55 86 -50 150 -5 35 -80 103 -94 158 -85 147 -73 95 -26 96 -67 151 -38 102 -42 72 -8 36 -78 165 -15 16 -35 67 -0 64 -35 70 -15 69 -75 96 -17 44 -42 66 -41 68 -80 88 -35 128 -34 113 diff --git a/geom_bottleneck/tests/data/test_586_A b/geom_bottleneck/tests/data/test_586_A deleted file mode 100644 index ed8b673..0000000 --- a/geom_bottleneck/tests/data/test_586_A +++ /dev/null @@ -1,50 +0,0 @@ -62 74 -15 108 -49 131 -94 134 -5 6 -24 120 -35 79 -48 73 -84 170 -67 86 -30 98 -6 12 -60 107 -8 106 -6 57 -69 74 -24 120 -20 52 -78 147 -24 124 -76 87 -7 46 -20 115 -68 98 -51 87 -87 147 -83 93 -15 108 -70 103 -63 65 -70 90 -52 112 -54 107 -86 114 -58 137 -93 148 -43 120 -3 55 -20 97 -14 25 -59 111 -68 119 -78 165 -16 50 -3 5 -89 173 -84 181 -93 184 -89 185 -23 61 diff --git a/geom_bottleneck/tests/data/test_586_B b/geom_bottleneck/tests/data/test_586_B deleted file mode 100644 index 715be5e..0000000 --- a/geom_bottleneck/tests/data/test_586_B +++ /dev/null @@ -1,50 +0,0 @@ -5 85 -46 116 -51 79 -20 36 -51 96 -83 170 -40 116 -40 128 -55 92 -51 127 -45 111 -56 65 -16 56 -30 52 -38 84 -56 70 -48 88 -0 6 -99 148 -64 159 -30 101 -14 51 -49 116 -66 71 -9 78 -4 35 -84 128 -39 58 -85 96 -54 60 -14 89 -2 46 -40 120 -76 117 -14 80 -47 118 -86 175 -35 126 -77 112 -75 150 -14 52 -90 169 -25 32 -73 95 -92 157 -5 34 -62 131 -16 26 -5 103 -73 106 diff --git a/geom_bottleneck/tests/data/test_587_A b/geom_bottleneck/tests/data/test_587_A deleted file mode 100644 index 883ddd7..0000000 --- a/geom_bottleneck/tests/data/test_587_A +++ /dev/null @@ -1,50 +0,0 @@ -66 164 -74 81 -56 140 -77 143 -72 139 -77 113 -59 106 -37 42 -58 158 -46 52 -7 30 -73 107 -46 70 -35 120 -74 103 -71 117 -26 93 -11 68 -35 60 -91 151 -33 122 -30 106 -43 134 -90 131 -32 95 -8 72 -4 39 -17 115 -22 32 -28 100 -37 126 -84 152 -72 107 -68 157 -95 193 -93 191 -56 154 -39 42 -5 45 -62 121 -73 166 -14 51 -89 140 -76 166 -85 150 -18 112 -22 103 -65 147 -96 181 -55 123 diff --git a/geom_bottleneck/tests/data/test_587_B b/geom_bottleneck/tests/data/test_587_B deleted file mode 100644 index 589512c..0000000 --- a/geom_bottleneck/tests/data/test_587_B +++ /dev/null @@ -1,50 +0,0 @@ -4 57 -12 64 -65 153 -73 111 -37 134 -11 54 -78 176 -33 77 -31 131 -14 101 -25 107 -83 112 -17 92 -59 139 -4 104 -82 114 -18 64 -13 72 -1 96 -72 112 -19 90 -23 34 -46 63 -45 79 -88 89 -16 105 -100 191 -31 46 -45 133 -86 119 -17 18 -59 140 -49 97 -31 47 -98 154 -70 99 -61 75 -31 34 -4 19 -46 122 -55 57 -81 171 -25 61 -18 89 -0 11 -48 79 -94 128 -73 122 -17 56 -19 39 diff --git a/geom_bottleneck/tests/data/test_588_A b/geom_bottleneck/tests/data/test_588_A deleted file mode 100644 index c486b96..0000000 --- a/geom_bottleneck/tests/data/test_588_A +++ /dev/null @@ -1,50 +0,0 @@ -96 166 -5 58 -87 143 -50 104 -31 106 -80 106 -99 106 -46 52 -42 127 -10 86 -17 18 -20 94 -49 65 -10 75 -85 132 -13 54 -75 123 -8 13 -83 153 -25 47 -57 135 -14 57 -1 37 -29 34 -13 26 -52 94 -62 97 -93 153 -69 84 -87 88 -73 100 -54 97 -11 72 -51 143 -66 94 -85 178 -60 73 -36 126 -99 134 -23 68 -72 134 -81 138 -28 42 -65 84 -11 28 -15 38 -18 51 -79 149 -76 114 -33 53 diff --git a/geom_bottleneck/tests/data/test_588_B b/geom_bottleneck/tests/data/test_588_B deleted file mode 100644 index 13829bc..0000000 --- a/geom_bottleneck/tests/data/test_588_B +++ /dev/null @@ -1,50 +0,0 @@ -87 173 -41 85 -10 87 -43 78 -99 128 -35 64 -28 66 -9 67 -100 194 -22 89 -0 15 -77 90 -59 60 -92 93 -32 84 -62 112 -54 151 -46 47 -52 94 -17 113 -21 100 -5 48 -87 114 -71 112 -2 67 -65 120 -26 74 -69 132 -47 83 -14 20 -5 13 -56 137 -57 79 -76 132 -30 31 -89 145 -84 130 -78 158 -44 76 -70 125 -95 127 -6 53 -17 110 -93 158 -61 94 -32 111 -20 113 -26 105 -63 112 -36 37 diff --git a/geom_bottleneck/tests/data/test_589_A b/geom_bottleneck/tests/data/test_589_A deleted file mode 100644 index 7743778..0000000 --- a/geom_bottleneck/tests/data/test_589_A +++ /dev/null @@ -1,50 +0,0 @@ -71 126 -62 78 -69 164 -34 56 -82 167 -61 138 -63 94 -17 27 -81 135 -94 145 -24 39 -93 134 -99 152 -38 91 -27 100 -21 115 -69 120 -8 42 -93 122 -87 155 -18 104 -0 2 -41 104 -63 159 -93 139 -74 167 -3 94 -68 92 -30 44 -24 101 -8 104 -8 61 -59 111 -53 91 -43 68 -52 143 -11 48 -74 152 -20 115 -27 100 -65 81 -63 67 -84 85 -16 30 -71 80 -58 116 -95 188 -96 106 -7 94 -38 45 diff --git a/geom_bottleneck/tests/data/test_589_B b/geom_bottleneck/tests/data/test_589_B deleted file mode 100644 index bbd5038..0000000 --- a/geom_bottleneck/tests/data/test_589_B +++ /dev/null @@ -1,50 +0,0 @@ -28 114 -87 171 -0 35 -94 100 -98 147 -53 68 -64 95 -54 145 -45 76 -22 98 -83 155 -31 89 -27 79 -32 37 -28 58 -77 139 -87 143 -80 152 -25 28 -61 123 -0 4 -25 42 -64 159 -34 37 -84 153 -13 93 -25 69 -80 112 -89 163 -18 77 -35 119 -35 114 -39 60 -90 187 -0 33 -11 80 -52 140 -59 73 -92 168 -76 91 -49 88 -80 130 -37 104 -65 146 -14 56 -66 95 -87 182 -12 102 -78 135 -73 143 diff --git a/geom_bottleneck/tests/data/test_590_A b/geom_bottleneck/tests/data/test_590_A deleted file mode 100644 index 3dfb2df..0000000 --- a/geom_bottleneck/tests/data/test_590_A +++ /dev/null @@ -1,50 +0,0 @@ -31 67 -88 180 -59 105 -31 117 -19 50 -43 59 -9 60 -4 58 -80 144 -47 71 -63 139 -14 68 -38 136 -8 52 -35 81 -56 116 -81 168 -56 99 -95 142 -24 121 -29 100 -88 174 -47 95 -40 93 -7 25 -3 84 -48 94 -90 128 -59 137 -96 164 -95 115 -69 105 -81 139 -59 65 -66 71 -53 84 -20 59 -29 61 -77 150 -48 138 -41 125 -53 86 -5 86 -42 69 -17 54 -70 105 -69 148 -18 58 -72 100 -67 77 diff --git a/geom_bottleneck/tests/data/test_590_B b/geom_bottleneck/tests/data/test_590_B deleted file mode 100644 index 18d6a7f..0000000 --- a/geom_bottleneck/tests/data/test_590_B +++ /dev/null @@ -1,50 +0,0 @@ -79 84 -10 56 -10 18 -78 175 -50 74 -8 104 -77 116 -5 45 -48 116 -17 92 -72 159 -66 113 -51 140 -60 101 -76 120 -52 75 -3 71 -31 53 -75 156 -93 172 -4 93 -11 42 -89 167 -19 49 -62 119 -55 97 -39 68 -74 140 -64 97 -97 154 -30 98 -16 59 -18 68 -66 139 -9 44 -56 74 -61 82 -51 115 -45 51 -89 121 -71 134 -82 119 -13 113 -36 43 -21 121 -24 115 -37 65 -99 100 -36 135 -37 96 diff --git a/geom_bottleneck/tests/data/test_591_A b/geom_bottleneck/tests/data/test_591_A deleted file mode 100644 index 411c1bb..0000000 --- a/geom_bottleneck/tests/data/test_591_A +++ /dev/null @@ -1,50 +0,0 @@ -13 93 -48 89 -12 53 -4 87 -91 181 -15 16 -29 59 -38 57 -8 29 -73 165 -29 44 -45 67 -24 74 -50 91 -88 162 -30 105 -80 134 -58 61 -69 135 -31 107 -0 15 -17 115 -72 74 -45 50 -75 115 -76 97 -61 89 -45 112 -59 97 -32 50 -85 88 -35 124 -95 112 -76 147 -69 84 -12 47 -100 154 -92 163 -4 55 -23 76 -85 100 -96 170 -28 87 -17 116 -44 57 -22 118 -51 134 -32 91 -8 14 -25 80 diff --git a/geom_bottleneck/tests/data/test_591_B b/geom_bottleneck/tests/data/test_591_B deleted file mode 100644 index cc96d2f..0000000 --- a/geom_bottleneck/tests/data/test_591_B +++ /dev/null @@ -1,50 +0,0 @@ -85 150 -85 96 -57 94 -13 112 -48 89 -7 17 -47 136 -96 173 -100 144 -12 76 -75 90 -51 116 -33 72 -21 65 -41 66 -80 104 -4 53 -71 72 -52 77 -93 94 -20 76 -29 101 -47 104 -33 87 -47 48 -73 161 -32 37 -4 74 -30 57 -56 109 -95 138 -76 135 -70 160 -59 136 -29 105 -75 169 -100 154 -67 139 -28 104 -89 121 -1 18 -7 47 -100 134 -3 4 -29 85 -79 129 -48 89 -97 191 -60 153 -100 199 diff --git a/geom_bottleneck/tests/data/test_592_A b/geom_bottleneck/tests/data/test_592_A deleted file mode 100644 index bac0698..0000000 --- a/geom_bottleneck/tests/data/test_592_A +++ /dev/null @@ -1,50 +0,0 @@ -59 132 -83 149 -50 62 -45 103 -28 32 -74 163 -78 151 -19 85 -26 113 -42 136 -87 123 -49 108 -7 69 -45 84 -96 153 -50 112 -3 72 -91 136 -16 79 -56 105 -92 170 -92 177 -15 57 -13 104 -90 112 -16 87 -99 154 -91 174 -49 76 -39 137 -38 59 -25 33 -88 113 -85 136 -38 67 -44 73 -75 166 -60 131 -56 155 -86 105 -69 75 -54 108 -8 79 -68 103 -56 133 -29 91 -57 77 -42 109 -97 170 -89 92 diff --git a/geom_bottleneck/tests/data/test_592_B b/geom_bottleneck/tests/data/test_592_B deleted file mode 100644 index bc8a8c6..0000000 --- a/geom_bottleneck/tests/data/test_592_B +++ /dev/null @@ -1,50 +0,0 @@ -73 140 -34 69 -82 101 -44 70 -26 87 -76 151 -18 43 -14 83 -35 126 -31 86 -59 125 -89 160 -33 38 -38 79 -54 77 -51 91 -75 87 -4 94 -2 23 -75 152 -1 8 -65 100 -60 80 -62 96 -40 116 -0 66 -10 99 -21 48 -98 161 -0 35 -18 25 -61 68 -58 152 -97 161 -43 99 -25 35 -55 59 -78 151 -6 94 -17 60 -98 142 -81 119 -2 29 -0 95 -55 141 -29 99 -14 44 -32 68 -31 107 -26 74 diff --git a/geom_bottleneck/tests/data/test_593_A b/geom_bottleneck/tests/data/test_593_A deleted file mode 100644 index e62ec21..0000000 --- a/geom_bottleneck/tests/data/test_593_A +++ /dev/null @@ -1,50 +0,0 @@ -15 96 -50 89 -53 59 -42 45 -76 150 -24 110 -27 126 -26 79 -93 132 -65 100 -38 134 -14 68 -88 130 -92 120 -36 122 -24 77 -11 102 -56 91 -12 77 -89 131 -57 137 -86 173 -38 66 -7 27 -49 134 -38 81 -100 122 -85 98 -96 147 -25 80 -49 88 -32 127 -42 122 -3 11 -25 59 -11 31 -82 151 -97 187 -55 99 -11 71 -14 28 -80 105 -4 74 -89 113 -99 127 -40 75 -86 121 -44 52 -74 123 -51 105 diff --git a/geom_bottleneck/tests/data/test_593_B b/geom_bottleneck/tests/data/test_593_B deleted file mode 100644 index a5150da..0000000 --- a/geom_bottleneck/tests/data/test_593_B +++ /dev/null @@ -1,50 +0,0 @@ -70 127 -81 175 -6 42 -67 74 -18 95 -32 33 -98 188 -25 67 -99 170 -60 119 -35 79 -20 42 -28 64 -92 129 -26 110 -95 123 -37 130 -25 97 -44 136 -30 78 -42 72 -52 139 -80 177 -44 143 -79 122 -100 198 -74 90 -15 73 -48 63 -66 146 -77 168 -28 66 -72 103 -23 77 -84 133 -37 127 -70 139 -85 129 -13 32 -57 151 -26 83 -7 45 -14 16 -23 70 -94 117 -71 148 -9 89 -20 109 -64 85 -27 106 diff --git a/geom_bottleneck/tests/data/test_594_A b/geom_bottleneck/tests/data/test_594_A deleted file mode 100644 index ca81d4c..0000000 --- a/geom_bottleneck/tests/data/test_594_A +++ /dev/null @@ -1,50 +0,0 @@ -49 127 -45 58 -50 143 -52 55 -32 102 -79 154 -36 134 -61 161 -41 134 -31 71 -51 86 -88 135 -68 93 -30 68 -8 80 -3 68 -36 101 -15 73 -51 132 -95 180 -27 43 -28 56 -58 73 -32 108 -85 179 -11 17 -65 159 -6 40 -27 53 -72 151 -66 114 -17 56 -84 95 -35 80 -85 110 -97 167 -74 84 -96 134 -76 117 -61 99 -20 91 -89 114 -1 32 -0 29 -71 138 -53 123 -78 96 -57 138 -7 89 -92 105 diff --git a/geom_bottleneck/tests/data/test_594_B b/geom_bottleneck/tests/data/test_594_B deleted file mode 100644 index d366e85..0000000 --- a/geom_bottleneck/tests/data/test_594_B +++ /dev/null @@ -1,50 +0,0 @@ -46 86 -23 69 -40 50 -66 89 -63 123 -23 108 -61 79 -59 144 -60 156 -49 88 -60 92 -65 101 -56 64 -3 53 -84 141 -39 79 -36 101 -8 82 -61 138 -29 78 -14 108 -29 122 -93 124 -53 95 -70 89 -10 102 -10 104 -23 27 -6 53 -8 41 -86 164 -8 41 -51 120 -27 63 -33 60 -62 99 -56 119 -58 84 -39 118 -25 86 -6 67 -50 56 -91 173 -71 121 -28 51 -88 142 -90 186 -69 149 -87 102 -60 129 diff --git a/geom_bottleneck/tests/data/test_595_A b/geom_bottleneck/tests/data/test_595_A deleted file mode 100644 index 805de28..0000000 --- a/geom_bottleneck/tests/data/test_595_A +++ /dev/null @@ -1,50 +0,0 @@ -39 91 -72 162 -80 123 -46 113 -51 65 -80 149 -72 132 -27 124 -17 111 -17 71 -86 120 -82 102 -71 117 -33 86 -15 84 -76 146 -69 102 -97 153 -91 185 -5 53 -61 95 -85 107 -92 101 -80 113 -12 63 -62 111 -29 109 -33 77 -91 134 -49 138 -30 57 -70 106 -98 110 -87 168 -76 140 -20 109 -58 71 -56 99 -49 117 -60 118 -63 149 -9 92 -14 94 -12 52 -21 37 -37 91 -65 107 -98 101 -71 131 -54 108 diff --git a/geom_bottleneck/tests/data/test_595_B b/geom_bottleneck/tests/data/test_595_B deleted file mode 100644 index c458a54..0000000 --- a/geom_bottleneck/tests/data/test_595_B +++ /dev/null @@ -1,50 +0,0 @@ -92 101 -74 76 -47 115 -99 119 -19 44 -57 156 -21 59 -12 86 -92 168 -73 148 -92 164 -47 130 -32 96 -22 116 -58 99 -85 169 -66 147 -31 117 -17 107 -83 158 -10 54 -95 129 -88 158 -72 78 -98 125 -99 170 -22 79 -10 16 -2 31 -52 62 -16 40 -31 103 -38 100 -32 82 -71 133 -55 135 -74 158 -13 45 -6 12 -13 43 -44 57 -25 51 -88 112 -35 66 -31 83 -28 59 -44 103 -40 131 -100 124 -21 107 diff --git a/geom_bottleneck/tests/data/test_596_A b/geom_bottleneck/tests/data/test_596_A deleted file mode 100644 index 3a32cf7..0000000 --- a/geom_bottleneck/tests/data/test_596_A +++ /dev/null @@ -1,50 +0,0 @@ -95 140 -26 108 -52 84 -39 95 -18 48 -29 105 -64 114 -75 103 -59 80 -11 95 -41 52 -43 123 -51 77 -31 54 -64 130 -23 79 -82 102 -53 94 -13 14 -19 74 -74 109 -71 140 -93 94 -76 82 -43 48 -46 70 -53 121 -35 68 -30 32 -13 53 -28 60 -51 111 -64 142 -84 153 -15 79 -89 140 -39 136 -15 37 -35 115 -15 105 -16 62 -3 77 -93 107 -88 104 -56 113 -59 142 -11 52 -22 64 -66 138 -32 75 diff --git a/geom_bottleneck/tests/data/test_596_B b/geom_bottleneck/tests/data/test_596_B deleted file mode 100644 index 1b9c765..0000000 --- a/geom_bottleneck/tests/data/test_596_B +++ /dev/null @@ -1,50 +0,0 @@ -73 154 -65 99 -56 77 -56 70 -67 75 -4 26 -31 64 -89 106 -73 91 -31 43 -98 185 -50 138 -79 131 -47 73 -16 55 -35 98 -24 100 -67 72 -44 95 -66 101 -40 91 -53 90 -6 67 -57 67 -15 111 -2 43 -3 18 -35 116 -44 138 -46 85 -31 41 -16 17 -61 96 -90 100 -45 129 -97 172 -38 70 -47 136 -26 56 -0 95 -100 155 -48 110 -4 60 -16 29 -74 103 -63 113 -93 98 -73 94 -15 86 -40 86 diff --git a/geom_bottleneck/tests/data/test_597_A b/geom_bottleneck/tests/data/test_597_A deleted file mode 100644 index 984cc9f..0000000 --- a/geom_bottleneck/tests/data/test_597_A +++ /dev/null @@ -1,50 +0,0 @@ -75 141 -50 130 -82 143 -98 128 -15 107 -9 22 -27 64 -2 51 -14 42 -15 27 -39 110 -50 95 -62 91 -80 85 -89 92 -56 78 -94 114 -68 130 -80 93 -12 25 -86 88 -33 73 -38 79 -28 100 -65 139 -22 59 -70 169 -45 118 -77 87 -46 49 -87 122 -50 109 -6 101 -8 21 -0 32 -16 81 -89 167 -83 85 -91 185 -85 120 -87 128 -20 58 -76 112 -13 60 -8 15 -93 172 -12 92 -51 132 -92 140 -83 167 diff --git a/geom_bottleneck/tests/data/test_597_B b/geom_bottleneck/tests/data/test_597_B deleted file mode 100644 index d84920c..0000000 --- a/geom_bottleneck/tests/data/test_597_B +++ /dev/null @@ -1,50 +0,0 @@ -89 118 -56 104 -78 101 -56 103 -13 94 -98 186 -99 137 -58 90 -61 154 -0 12 -7 23 -77 158 -66 157 -70 91 -10 38 -14 23 -21 92 -89 189 -84 105 -79 130 -17 27 -93 102 -62 82 -60 84 -18 28 -49 143 -70 157 -54 119 -32 124 -17 89 -1 49 -4 53 -76 109 -61 113 -71 90 -4 95 -78 125 -21 110 -2 72 -26 106 -35 55 -76 90 -80 127 -80 137 -30 63 -12 81 -48 93 -27 123 -24 57 -56 120 diff --git a/geom_bottleneck/tests/data/test_598_A b/geom_bottleneck/tests/data/test_598_A deleted file mode 100644 index 4c4fa46..0000000 --- a/geom_bottleneck/tests/data/test_598_A +++ /dev/null @@ -1,50 +0,0 @@ -62 152 -79 161 -64 158 -93 154 -51 99 -69 113 -21 62 -66 156 -48 137 -66 121 -78 165 -56 107 -87 141 -87 159 -42 50 -61 72 -31 61 -26 125 -33 118 -32 88 -98 110 -75 103 -67 130 -94 192 -97 153 -3 4 -48 136 -56 57 -43 53 -29 113 -82 110 -90 103 -54 93 -53 106 -75 143 -32 44 -85 147 -50 72 -22 71 -49 96 -49 132 -32 113 -24 58 -58 142 -60 106 -100 163 -45 123 -27 31 -41 76 -14 40 diff --git a/geom_bottleneck/tests/data/test_598_B b/geom_bottleneck/tests/data/test_598_B deleted file mode 100644 index 974d069..0000000 --- a/geom_bottleneck/tests/data/test_598_B +++ /dev/null @@ -1,50 +0,0 @@ -8 45 -47 75 -81 128 -60 100 -13 40 -47 96 -97 169 -28 93 -36 92 -80 175 -41 121 -24 55 -94 100 -69 82 -53 97 -64 119 -53 151 -30 51 -11 82 -77 118 -66 113 -54 92 -23 100 -79 82 -44 122 -93 185 -75 169 -98 99 -69 163 -28 100 -66 70 -69 98 -80 99 -23 79 -100 134 -67 126 -57 138 -79 116 -25 44 -48 142 -26 123 -14 51 -93 151 -68 71 -6 27 -4 64 -63 128 -88 166 -59 70 -19 80 diff --git a/geom_bottleneck/tests/data/test_599_A b/geom_bottleneck/tests/data/test_599_A deleted file mode 100644 index 984a0ed..0000000 --- a/geom_bottleneck/tests/data/test_599_A +++ /dev/null @@ -1,50 +0,0 @@ -6 64 -55 70 -74 171 -88 144 -91 170 -61 75 -1 42 -69 72 -99 112 -100 113 -97 165 -78 83 -12 90 -19 103 -91 134 -78 121 -31 75 -57 139 -2 15 -84 129 -73 139 -24 71 -56 135 -17 117 -26 66 -46 110 -21 97 -24 111 -100 177 -59 132 -13 14 -12 73 -4 51 -49 89 -27 82 -23 107 -84 112 -8 52 -96 172 -97 133 -40 80 -21 32 -65 149 -61 125 -92 133 -89 119 -28 37 -46 106 -95 190 -78 91 diff --git a/geom_bottleneck/tests/data/test_599_B b/geom_bottleneck/tests/data/test_599_B deleted file mode 100644 index aaea2a7..0000000 --- a/geom_bottleneck/tests/data/test_599_B +++ /dev/null @@ -1,50 +0,0 @@ -83 144 -54 114 -6 83 -53 109 -60 159 -33 90 -72 83 -3 5 -72 170 -60 116 -75 172 -19 107 -11 36 -36 109 -25 59 -22 100 -30 127 -57 119 -28 87 -81 144 -10 53 -2 27 -71 117 -60 84 -95 99 -77 81 -56 67 -67 85 -32 42 -28 45 -81 148 -6 33 -60 146 -83 86 -30 48 -89 105 -26 53 -65 89 -41 94 -47 84 -88 130 -51 95 -65 74 -98 107 -99 180 -80 107 -89 94 -25 36 -83 106 -24 112 diff --git a/geom_bottleneck/tests/data/test_600_A b/geom_bottleneck/tests/data/test_600_A deleted file mode 100644 index 13c5659..0000000 --- a/geom_bottleneck/tests/data/test_600_A +++ /dev/null @@ -1,100 +0,0 @@ -77 125 -40 107 -52 73 -65 77 -96 158 -26 106 -61 138 -1 10 -56 151 -91 161 -1 20 -100 172 -69 152 -26 57 -33 96 -21 98 -2 24 -54 115 -35 116 -17 31 -21 50 -36 93 -61 74 -98 122 -96 151 -90 168 -49 69 -23 24 -2 67 -28 123 -95 181 -60 81 -33 96 -25 103 -44 114 -84 128 -1 45 -90 154 -34 83 -57 149 -49 109 -57 121 -47 74 -57 77 -37 132 -44 48 -61 98 -37 60 -66 84 -71 73 -30 121 -50 150 -44 99 -86 179 -99 137 -53 125 -85 136 -56 126 -99 163 -43 132 -1 66 -90 132 -27 40 -2 10 -65 115 -39 68 -17 89 -90 153 -22 102 -28 78 -56 101 -89 184 -88 125 -83 85 -75 144 -26 89 -56 108 -83 173 -90 106 -7 72 -97 173 -94 131 -31 104 -95 148 -100 102 -37 82 -86 128 -29 56 -54 109 -81 157 -82 126 -62 71 -33 116 -86 126 -20 103 -34 131 -93 107 -26 104 -31 91 -23 115 diff --git a/geom_bottleneck/tests/data/test_600_B b/geom_bottleneck/tests/data/test_600_B deleted file mode 100644 index 5de1dfa..0000000 --- a/geom_bottleneck/tests/data/test_600_B +++ /dev/null @@ -1,100 +0,0 @@ -99 168 -39 113 -73 109 -91 101 -67 144 -17 57 -3 59 -81 155 -100 159 -48 110 -98 128 -73 167 -55 135 -42 140 -84 129 -18 97 -92 103 -33 86 -68 84 -83 111 -72 111 -97 179 -8 58 -6 80 -21 99 -81 124 -37 85 -19 48 -11 14 -53 122 -16 74 -75 113 -47 74 -87 166 -45 69 -51 68 -74 122 -10 47 -50 90 -66 114 -24 115 -40 65 -74 136 -72 146 -24 114 -48 91 -56 68 -78 102 -30 64 -75 159 -16 101 -58 150 -69 126 -80 136 -6 96 -53 121 -15 115 -76 81 -36 59 -63 68 -85 142 -7 50 -20 83 -9 40 -98 163 -70 165 -88 177 -85 149 -0 17 -30 124 -40 113 -35 91 -66 117 -94 108 -11 106 -78 88 -42 107 -60 121 -55 119 -78 110 -0 76 -63 130 -10 105 -23 68 -13 81 -60 142 -3 81 -53 90 -26 99 -95 165 -52 126 -41 70 -6 29 -14 103 -88 170 -79 102 -9 98 -27 124 -12 60 -59 145 diff --git a/geom_bottleneck/tests/data/test_601_A b/geom_bottleneck/tests/data/test_601_A deleted file mode 100644 index 9f57dd0..0000000 --- a/geom_bottleneck/tests/data/test_601_A +++ /dev/null @@ -1,100 +0,0 @@ -49 135 -27 47 -45 83 -13 49 -15 80 -78 84 -54 128 -20 24 -75 121 -52 90 -15 64 -19 101 -35 80 -35 69 -49 122 -21 49 -51 75 -41 95 -91 162 -26 101 -54 104 -65 164 -74 100 -6 51 -58 68 -99 148 -55 87 -35 51 -51 77 -22 117 -78 141 -80 135 -66 145 -80 145 -68 112 -35 97 -63 91 -10 62 -1 73 -40 106 -76 77 -8 93 -94 136 -57 157 -16 43 -46 92 -49 77 -44 49 -51 120 -68 133 -41 73 -72 109 -42 59 -11 13 -19 86 -24 49 -11 105 -93 113 -81 160 -5 99 -78 159 -37 97 -68 120 -54 111 -41 49 -33 123 -27 35 -71 101 -55 70 -99 183 -68 121 -62 92 -47 53 -4 6 -56 110 -96 113 -85 122 -85 92 -31 97 -1 62 -25 67 -30 39 -16 23 -97 148 -21 22 -21 46 -85 134 -19 23 -12 56 -16 40 -59 138 -9 63 -31 46 -88 161 -72 74 -28 45 -57 95 -90 164 -89 106 -49 134 diff --git a/geom_bottleneck/tests/data/test_601_B b/geom_bottleneck/tests/data/test_601_B deleted file mode 100644 index 64d7ef8..0000000 --- a/geom_bottleneck/tests/data/test_601_B +++ /dev/null @@ -1,100 +0,0 @@ -45 101 -84 90 -70 98 -64 109 -100 111 -82 87 -26 54 -18 90 -84 133 -92 145 -68 139 -90 154 -85 104 -34 76 -30 79 -21 99 -2 85 -20 75 -12 57 -62 102 -69 148 -18 116 -28 97 -52 88 -40 68 -21 26 -66 73 -8 68 -31 130 -83 174 -89 156 -38 43 -62 153 -4 34 -85 123 -51 99 -39 119 -99 149 -19 81 -51 79 -51 136 -25 52 -63 80 -91 166 -62 126 -86 102 -16 39 -0 66 -26 107 -55 89 -72 100 -73 106 -82 129 -77 112 -44 81 -94 118 -57 136 -1 13 -43 52 -24 112 -39 129 -28 97 -41 105 -59 150 -21 84 -38 92 -39 91 -25 36 -52 125 -56 119 -99 171 -51 142 -6 34 -44 77 -100 170 -23 43 -76 138 -67 77 -26 116 -18 49 -25 92 -42 138 -22 41 -48 112 -81 89 -51 67 -64 90 -51 94 -75 147 -49 96 -47 102 -31 114 -7 92 -48 81 -40 41 -84 117 -34 118 -9 27 -86 145 -56 69 diff --git a/geom_bottleneck/tests/data/test_602_A b/geom_bottleneck/tests/data/test_602_A deleted file mode 100644 index df83de7..0000000 --- a/geom_bottleneck/tests/data/test_602_A +++ /dev/null @@ -1,100 +0,0 @@ -8 77 -68 127 -23 104 -15 96 -58 68 -5 77 -70 105 -13 49 -60 133 -31 122 -74 75 -80 132 -72 107 -44 52 -31 124 -32 36 -62 146 -51 98 -31 118 -45 107 -53 85 -76 152 -67 161 -51 92 -10 23 -89 183 -73 117 -47 112 -42 97 -68 101 -82 86 -32 61 -39 134 -9 109 -31 83 -95 137 -82 155 -34 39 -5 6 -24 108 -94 150 -22 68 -95 172 -12 92 -59 107 -31 59 -0 40 -53 64 -32 73 -69 134 -21 63 -13 107 -10 82 -3 94 -85 147 -51 127 -91 169 -17 87 -80 137 -90 178 -89 185 -56 103 -13 18 -83 84 -34 77 -50 148 -1 10 -80 141 -92 191 -9 21 -85 172 -11 50 -98 134 -12 99 -81 137 -66 90 -32 109 -22 73 -39 130 -38 52 -24 68 -71 113 -84 90 -79 102 -92 192 -47 105 -70 132 -4 45 -57 123 -60 125 -48 56 -19 110 -40 130 -36 114 -55 92 -1 66 -77 131 -96 172 -34 85 -79 102 diff --git a/geom_bottleneck/tests/data/test_602_B b/geom_bottleneck/tests/data/test_602_B deleted file mode 100644 index fb19e1c..0000000 --- a/geom_bottleneck/tests/data/test_602_B +++ /dev/null @@ -1,100 +0,0 @@ -4 97 -46 76 -86 104 -38 75 -73 124 -7 52 -42 105 -72 132 -14 114 -38 136 -77 91 -72 92 -36 64 -53 121 -57 62 -20 49 -55 78 -82 151 -9 95 -6 20 -10 51 -50 110 -38 100 -69 150 -80 102 -78 93 -94 157 -7 55 -39 121 -80 136 -24 49 -33 95 -99 150 -55 119 -97 188 -73 82 -26 42 -84 92 -5 103 -88 167 -7 54 -35 74 -68 141 -31 56 -98 182 -38 116 -0 63 -29 39 -19 62 -41 91 -50 81 -37 106 -22 65 -19 113 -55 125 -59 79 -29 75 -6 48 -12 101 -37 102 -48 126 -34 71 -63 90 -87 139 -97 147 -86 143 -22 69 -7 17 -9 93 -82 109 -12 55 -88 126 -97 102 -6 70 -6 21 -39 105 -4 103 -46 139 -38 111 -44 45 -17 31 -79 150 -83 96 -97 101 -66 152 -15 84 -82 99 -2 102 -62 123 -8 101 -32 92 -76 158 -20 26 -20 106 -17 75 -70 89 -13 22 -57 87 -6 27 -16 25 diff --git a/geom_bottleneck/tests/data/test_603_A b/geom_bottleneck/tests/data/test_603_A deleted file mode 100644 index a81f6cb..0000000 --- a/geom_bottleneck/tests/data/test_603_A +++ /dev/null @@ -1,100 +0,0 @@ -59 86 -86 166 -73 114 -3 10 -36 59 -0 33 -24 25 -51 70 -83 129 -7 60 -47 58 -20 97 -30 96 -61 161 -83 143 -83 127 -100 188 -6 28 -18 44 -53 54 -58 94 -53 97 -36 86 -83 133 -37 83 -79 125 -19 104 -67 156 -6 99 -44 128 -37 64 -35 92 -36 126 -55 155 -16 48 -37 108 -72 119 -96 111 -10 83 -96 143 -31 65 -41 138 -94 148 -41 74 -6 92 -53 133 -98 113 -2 71 -15 52 -28 54 -46 58 -81 109 -24 85 -60 159 -61 68 -46 96 -45 138 -99 117 -82 145 -69 121 -15 53 -74 174 -51 114 -100 145 -26 82 -32 115 -72 169 -48 144 -75 172 -65 114 -49 74 -45 119 -31 122 -59 146 -62 67 -43 46 -6 69 -23 25 -76 176 -68 164 -36 113 -26 106 -46 134 -71 151 -59 121 -10 99 -71 167 -82 162 -62 79 -97 127 -68 115 -46 90 -83 156 -12 39 -61 87 -90 187 -0 84 -44 85 -41 93 -98 187 diff --git a/geom_bottleneck/tests/data/test_603_B b/geom_bottleneck/tests/data/test_603_B deleted file mode 100644 index 0ea6eda..0000000 --- a/geom_bottleneck/tests/data/test_603_B +++ /dev/null @@ -1,100 +0,0 @@ -67 101 -34 55 -8 100 -52 112 -78 120 -15 71 -17 58 -83 109 -41 137 -41 107 -26 125 -87 111 -82 141 -77 78 -24 50 -49 78 -79 88 -91 110 -75 78 -84 91 -100 199 -34 70 -66 154 -23 34 -46 73 -43 94 -23 65 -89 175 -44 46 -13 24 -8 95 -94 162 -13 27 -74 102 -80 156 -77 124 -44 100 -13 52 -32 43 -23 38 -87 162 -24 52 -67 103 -97 146 -79 94 -21 100 -97 186 -38 39 -67 123 -99 197 -29 46 -52 139 -1 80 -5 34 -67 86 -49 122 -45 50 -64 80 -73 154 -85 164 -23 42 -93 123 -54 123 -63 64 -84 162 -86 103 -47 117 -32 112 -60 152 -96 111 -79 97 -86 130 -0 98 -65 161 -55 83 -73 139 -82 133 -9 108 -24 123 -92 132 -87 91 -23 40 -55 116 -91 176 -49 100 -25 58 -4 65 -28 39 -3 74 -22 37 -34 128 -98 154 -32 122 -9 84 -53 79 -47 61 -76 82 -11 34 -65 128 -28 82 diff --git a/geom_bottleneck/tests/data/test_604_A b/geom_bottleneck/tests/data/test_604_A deleted file mode 100644 index 11a7c84..0000000 --- a/geom_bottleneck/tests/data/test_604_A +++ /dev/null @@ -1,100 +0,0 @@ -90 168 -97 169 -3 20 -65 71 -61 105 -6 56 -50 122 -9 12 -15 51 -73 121 -54 118 -27 121 -97 135 -38 100 -35 69 -40 57 -64 159 -37 125 -79 116 -11 54 -66 72 -76 162 -69 154 -35 77 -91 177 -77 111 -67 145 -59 100 -94 130 -75 135 -53 106 -43 106 -100 130 -81 159 -14 107 -52 91 -47 136 -83 133 -16 63 -11 98 -4 6 -98 120 -98 117 -69 90 -24 108 -74 138 -100 105 -9 16 -55 81 -86 154 -6 99 -82 85 -86 176 -57 79 -83 136 -70 135 -30 85 -73 126 -73 164 -20 89 -42 93 -97 150 -6 69 -26 66 -43 129 -84 117 -75 132 -68 98 -29 111 -57 140 -15 107 -75 141 -97 180 -47 130 -31 72 -56 150 -30 75 -86 106 -49 50 -16 38 -40 68 -99 176 -10 56 -89 128 -97 124 -35 134 -82 137 -34 97 -34 40 -34 43 -71 149 -33 113 -6 80 -69 160 -54 148 -88 131 -98 141 -91 112 -25 106 -68 149 diff --git a/geom_bottleneck/tests/data/test_604_B b/geom_bottleneck/tests/data/test_604_B deleted file mode 100644 index 6e14339..0000000 --- a/geom_bottleneck/tests/data/test_604_B +++ /dev/null @@ -1,100 +0,0 @@ -4 69 -24 43 -68 72 -33 77 -96 106 -48 134 -18 38 -1 28 -12 112 -70 76 -6 16 -19 65 -35 49 -91 95 -50 147 -94 174 -87 124 -27 29 -17 116 -50 120 -83 183 -60 129 -92 120 -67 125 -60 73 -17 60 -10 12 -65 158 -19 100 -44 92 -86 139 -98 184 -67 100 -28 115 -16 94 -36 94 -40 99 -20 115 -94 149 -80 135 -47 109 -39 53 -62 159 -25 78 -30 118 -71 89 -86 166 -85 159 -58 120 -45 64 -73 156 -66 107 -31 88 -53 88 -67 167 -49 144 -60 71 -69 151 -44 111 -43 93 -95 102 -78 150 -98 120 -22 92 -70 76 -1 98 -25 44 -93 166 -16 100 -94 134 -37 99 -4 70 -32 47 -61 136 -30 95 -99 133 -91 163 -32 112 -78 91 -55 62 -16 33 -13 48 -45 75 -96 155 -20 82 -39 57 -22 51 -7 31 -73 90 -49 55 -32 65 -16 22 -33 71 -80 97 -85 154 -100 172 -86 114 -98 191 -2 7 -35 113 diff --git a/geom_bottleneck/tests/data/test_605_A b/geom_bottleneck/tests/data/test_605_A deleted file mode 100644 index 522dbf9..0000000 --- a/geom_bottleneck/tests/data/test_605_A +++ /dev/null @@ -1,100 +0,0 @@ -59 77 -22 53 -70 99 -32 126 -63 100 -72 89 -93 150 -70 83 -35 53 -96 128 -55 151 -30 96 -6 85 -80 131 -76 80 -36 79 -50 72 -70 134 -20 77 -27 33 -35 37 -44 55 -91 165 -68 132 -52 141 -81 142 -43 106 -46 55 -55 100 -21 86 -100 130 -97 173 -56 142 -26 36 -54 68 -17 23 -57 124 -65 122 -11 30 -70 96 -46 47 -52 114 -65 104 -24 39 -2 102 -91 181 -66 107 -27 120 -24 38 -33 94 -87 166 -35 78 -38 92 -56 125 -15 50 -95 129 -85 174 -53 126 -76 171 -71 154 -67 86 -61 133 -99 183 -92 102 -83 103 -80 174 -63 109 -37 60 -12 78 -30 56 -19 117 -33 99 -3 94 -18 52 -44 133 -53 55 -37 95 -43 92 -64 127 -12 79 -65 129 -48 92 -92 136 -25 64 -83 91 -22 91 -66 96 -33 37 -8 45 -4 5 -21 107 -72 171 -6 14 -75 124 -79 140 -52 114 -61 62 -89 151 -98 102 -4 46 diff --git a/geom_bottleneck/tests/data/test_605_B b/geom_bottleneck/tests/data/test_605_B deleted file mode 100644 index 34f19db..0000000 --- a/geom_bottleneck/tests/data/test_605_B +++ /dev/null @@ -1,100 +0,0 @@ -17 96 -1 57 -57 149 -10 24 -76 155 -3 81 -66 101 -79 85 -17 91 -78 105 -78 155 -91 167 -63 84 -41 45 -12 50 -49 107 -13 31 -93 175 -93 105 -33 46 -70 121 -36 57 -43 103 -44 99 -54 91 -25 65 -26 27 -64 119 -94 161 -29 115 -0 14 -81 152 -15 83 -4 50 -56 132 -27 50 -42 61 -28 39 -2 38 -55 87 -52 91 -70 160 -57 94 -32 41 -52 142 -28 37 -81 92 -89 91 -79 127 -94 179 -45 128 -92 120 -61 124 -61 143 -12 31 -2 36 -42 48 -25 55 -89 184 -56 57 -90 154 -55 94 -70 104 -35 135 -10 39 -45 63 -72 102 -0 12 -45 71 -84 126 -89 146 -52 100 -14 93 -16 42 -89 186 -50 77 -64 75 -29 52 -14 81 -55 73 -69 105 -47 144 -70 102 -59 76 -81 94 -63 163 -19 55 -70 146 -58 118 -56 96 -74 93 -24 30 -100 190 -80 115 -88 172 -0 31 -83 124 -53 153 -68 70 -73 108 diff --git a/geom_bottleneck/tests/data/test_606_A b/geom_bottleneck/tests/data/test_606_A deleted file mode 100644 index 2f4dec4..0000000 --- a/geom_bottleneck/tests/data/test_606_A +++ /dev/null @@ -1,100 +0,0 @@ -49 104 -89 185 -56 72 -44 117 -27 73 -64 87 -30 44 -89 150 -73 105 -80 156 -48 145 -36 87 -62 122 -85 97 -51 144 -48 137 -61 132 -47 66 -78 134 -17 101 -66 119 -74 82 -96 99 -56 57 -66 109 -13 103 -6 40 -55 78 -77 130 -92 133 -65 74 -8 9 -29 123 -6 61 -41 138 -21 98 -85 107 -99 108 -79 95 -93 161 -9 20 -58 150 -33 93 -2 48 -38 40 -83 153 -33 92 -94 155 -44 96 -17 102 -68 99 -32 69 -73 126 -5 43 -86 181 -2 38 -65 163 -86 164 -49 132 -41 86 -96 186 -87 145 -12 81 -11 73 -77 87 -22 116 -14 21 -56 82 -61 120 -2 24 -67 71 -33 93 -89 132 -14 102 -12 29 -7 38 -12 88 -76 123 -46 75 -79 99 -49 74 -27 35 -8 47 -33 84 -79 171 -72 83 -79 106 -96 152 -86 164 -100 128 -7 97 -70 128 -89 156 -15 17 -86 126 -65 110 -53 80 -51 81 -36 85 -50 82 diff --git a/geom_bottleneck/tests/data/test_606_B b/geom_bottleneck/tests/data/test_606_B deleted file mode 100644 index 62417b1..0000000 --- a/geom_bottleneck/tests/data/test_606_B +++ /dev/null @@ -1,100 +0,0 @@ -35 135 -1 41 -63 72 -43 98 -37 71 -24 87 -14 105 -66 67 -12 79 -60 145 -20 72 -0 70 -67 149 -22 30 -86 151 -20 106 -38 74 -58 133 -40 103 -34 111 -81 126 -55 74 -49 133 -44 128 -54 86 -15 82 -84 89 -87 121 -95 135 -53 104 -91 157 -7 101 -45 124 -87 162 -73 164 -60 123 -77 81 -69 78 -44 118 -0 79 -66 106 -67 85 -85 168 -93 122 -0 42 -10 66 -9 23 -29 80 -46 76 -75 126 -2 32 -99 143 -24 90 -31 120 -73 98 -42 57 -67 86 -44 99 -65 135 -100 167 -33 43 -10 29 -36 63 -79 178 -82 85 -35 49 -24 57 -66 142 -2 29 -73 149 -16 76 -27 53 -86 88 -36 75 -54 56 -11 82 -87 183 -33 72 -84 94 -96 108 -13 63 -34 98 -76 173 -57 114 -63 149 -74 131 -20 21 -48 100 -92 98 -3 41 -66 138 -90 130 -62 152 -26 101 -28 102 -41 139 -85 167 -68 84 -64 74 -64 136 diff --git a/geom_bottleneck/tests/data/test_607_A b/geom_bottleneck/tests/data/test_607_A deleted file mode 100644 index abc3b6b..0000000 --- a/geom_bottleneck/tests/data/test_607_A +++ /dev/null @@ -1,100 +0,0 @@ -82 154 -80 107 -94 156 -55 58 -84 183 -82 128 -35 97 -32 105 -12 104 -17 57 -54 67 -59 103 -22 106 -50 122 -31 93 -33 123 -9 105 -78 140 -15 101 -67 117 -34 119 -96 123 -71 169 -91 93 -99 119 -85 169 -59 69 -85 169 -32 76 -62 134 -21 77 -79 141 -5 63 -9 72 -21 41 -2 95 -16 92 -22 54 -44 58 -1 24 -26 54 -33 93 -85 135 -74 110 -63 81 -64 113 -3 21 -24 92 -78 82 -54 63 -66 83 -22 38 -41 59 -99 156 -26 34 -67 78 -9 22 -15 62 -25 43 -0 93 -43 44 -54 63 -16 40 -62 136 -35 85 -80 179 -4 103 -21 73 -91 119 -99 188 -16 42 -63 64 -76 137 -58 61 -20 39 -61 72 -0 9 -7 41 -11 61 -39 124 -70 153 -97 121 -66 166 -7 72 -65 140 -96 140 -60 87 -34 35 -14 15 -17 41 -33 69 -5 101 -49 109 -79 102 -22 57 -50 126 -24 119 -76 166 -84 93 -34 70 diff --git a/geom_bottleneck/tests/data/test_607_B b/geom_bottleneck/tests/data/test_607_B deleted file mode 100644 index 0f79931..0000000 --- a/geom_bottleneck/tests/data/test_607_B +++ /dev/null @@ -1,100 +0,0 @@ -23 33 -0 85 -33 82 -21 38 -41 75 -94 128 -35 107 -9 76 -65 74 -71 133 -83 173 -94 109 -58 83 -61 68 -44 111 -67 107 -97 152 -100 167 -94 105 -94 95 -9 37 -18 47 -87 141 -81 153 -57 90 -10 19 -67 137 -11 75 -86 139 -39 72 -13 51 -65 155 -56 98 -91 149 -58 68 -6 89 -39 95 -82 150 -97 129 -26 73 -87 112 -37 117 -73 137 -68 73 -4 88 -2 70 -79 112 -59 123 -31 93 -36 77 -95 158 -25 52 -33 47 -69 112 -73 160 -95 138 -15 56 -31 96 -1 2 -9 41 -59 129 -48 55 -52 111 -51 139 -38 115 -100 198 -30 46 -77 105 -43 115 -66 151 -69 70 -93 98 -19 59 -10 59 -10 59 -51 89 -21 58 -48 75 -57 58 -0 34 -48 110 -87 152 -9 44 -19 73 -8 76 -82 165 -4 51 -9 24 -62 105 -97 147 -28 102 -37 77 -25 55 -77 86 -80 87 -81 172 -99 152 -57 107 -61 154 -45 93 diff --git a/geom_bottleneck/tests/data/test_608_A b/geom_bottleneck/tests/data/test_608_A deleted file mode 100644 index a4beccc..0000000 --- a/geom_bottleneck/tests/data/test_608_A +++ /dev/null @@ -1,100 +0,0 @@ -91 111 -71 96 -84 176 -57 123 -7 22 -4 76 -83 171 -79 172 -96 173 -75 76 -19 98 -91 135 -13 54 -10 13 -2 53 -65 128 -96 133 -54 64 -43 112 -72 139 -32 33 -45 89 -82 174 -36 79 -5 89 -90 114 -41 90 -16 30 -78 177 -64 77 -40 67 -57 129 -29 51 -53 54 -86 90 -64 116 -87 92 -73 76 -35 108 -25 81 -57 155 -55 123 -56 99 -96 103 -88 93 -28 101 -74 106 -76 166 -28 126 -34 41 -75 91 -19 119 -59 108 -29 121 -0 66 -9 25 -68 150 -26 51 -19 47 -34 55 -37 127 -66 80 -23 52 -8 19 -65 128 -44 109 -16 70 -17 114 -29 31 -40 100 -20 42 -61 121 -89 153 -35 104 -5 81 -33 95 -17 29 -93 132 -72 133 -100 102 -54 109 -23 53 -85 87 -64 69 -20 67 -30 34 -96 143 -40 134 -60 86 -40 91 -92 133 -73 141 -70 117 -43 78 -52 83 -27 114 -2 88 -48 121 -40 66 -96 159 diff --git a/geom_bottleneck/tests/data/test_608_B b/geom_bottleneck/tests/data/test_608_B deleted file mode 100644 index 94f4c9a..0000000 --- a/geom_bottleneck/tests/data/test_608_B +++ /dev/null @@ -1,100 +0,0 @@ -69 152 -69 122 -74 138 -60 95 -88 127 -98 124 -99 193 -82 85 -17 78 -57 130 -50 71 -62 94 -7 39 -89 137 -26 69 -71 146 -9 73 -37 55 -25 111 -65 145 -94 157 -92 99 -31 51 -50 112 -87 99 -64 76 -55 126 -6 56 -48 124 -89 147 -16 18 -93 172 -53 152 -90 102 -25 123 -81 110 -1 93 -74 150 -61 73 -39 100 -74 148 -58 152 -21 94 -39 112 -96 161 -4 85 -61 79 -90 150 -2 42 -100 110 -81 161 -56 71 -90 162 -2 30 -69 80 -33 99 -27 43 -56 74 -57 138 -63 162 -51 121 -80 153 -75 174 -4 29 -91 122 -45 145 -72 74 -66 130 -13 79 -9 91 -59 100 -35 114 -100 124 -40 80 -40 134 -72 123 -43 63 -43 81 -37 83 -74 128 -5 86 -54 66 -88 133 -6 93 -98 166 -8 104 -100 199 -56 130 -88 128 -41 97 -8 17 -44 123 -7 51 -33 59 -0 80 -16 69 -16 55 -77 141 -75 108 -84 117 diff --git a/geom_bottleneck/tests/data/test_609_A b/geom_bottleneck/tests/data/test_609_A deleted file mode 100644 index a8e841e..0000000 --- a/geom_bottleneck/tests/data/test_609_A +++ /dev/null @@ -1,100 +0,0 @@ -52 69 -8 75 -78 173 -64 147 -34 126 -24 107 -83 158 -79 135 -39 119 -72 163 -12 78 -45 107 -7 27 -8 48 -65 133 -43 99 -92 116 -46 61 -78 94 -73 122 -30 89 -27 50 -46 142 -58 92 -7 73 -52 123 -53 77 -28 115 -28 111 -65 159 -95 131 -58 82 -47 103 -31 110 -15 37 -90 139 -76 128 -88 131 -76 145 -96 165 -77 154 -11 36 -36 63 -25 122 -100 144 -13 15 -7 65 -50 128 -97 104 -98 183 -39 81 -55 89 -76 78 -46 87 -2 43 -86 151 -61 130 -40 122 -72 111 -14 113 -26 89 -43 61 -80 176 -83 170 -78 153 -93 171 -87 142 -98 101 -60 71 -24 93 -18 94 -86 103 -22 42 -14 104 -2 85 -26 78 -98 190 -91 191 -9 68 -46 124 -50 105 -0 38 -62 138 -26 27 -78 168 -80 87 -64 68 -64 129 -10 48 -77 171 -79 129 -53 89 -30 92 -71 125 -26 125 -12 112 -96 134 -27 114 -62 91 -10 11 diff --git a/geom_bottleneck/tests/data/test_609_B b/geom_bottleneck/tests/data/test_609_B deleted file mode 100644 index 574351a..0000000 --- a/geom_bottleneck/tests/data/test_609_B +++ /dev/null @@ -1,100 +0,0 @@ -64 90 -2 6 -69 77 -35 119 -59 88 -27 127 -39 134 -68 155 -92 151 -5 84 -79 125 -37 66 -31 116 -48 97 -63 88 -92 176 -36 98 -97 135 -67 130 -21 44 -42 114 -42 114 -56 93 -4 78 -91 128 -87 94 -35 69 -5 25 -46 72 -91 151 -96 180 -87 165 -24 32 -72 134 -78 150 -0 3 -100 197 -84 95 -6 31 -61 97 -25 26 -46 114 -91 152 -64 82 -75 78 -73 134 -43 58 -66 157 -82 130 -66 96 -49 61 -55 82 -25 39 -58 153 -93 184 -17 113 -51 123 -51 77 -61 106 -26 111 -94 187 -28 77 -5 95 -100 123 -0 74 -55 91 -60 76 -2 43 -58 110 -82 153 -22 100 -13 92 -7 22 -82 153 -71 84 -16 26 -3 45 -80 97 -51 143 -99 191 -38 67 -14 112 -4 11 -72 141 -4 34 -86 115 -74 134 -53 102 -87 116 -51 119 -5 105 -62 103 -32 116 -64 152 -41 52 -1 38 -3 57 -50 133 -57 132 -57 93 diff --git a/geom_bottleneck/tests/data/test_610_A b/geom_bottleneck/tests/data/test_610_A deleted file mode 100644 index c37fa9c..0000000 --- a/geom_bottleneck/tests/data/test_610_A +++ /dev/null @@ -1,100 +0,0 @@ -4 71 -61 90 -58 59 -14 102 -53 142 -94 103 -47 71 -72 115 -33 113 -64 142 -82 115 -65 85 -34 101 -78 93 -68 109 -84 112 -45 80 -30 83 -100 164 -88 158 -2 10 -56 135 -22 41 -11 21 -77 128 -34 110 -8 54 -91 184 -57 120 -100 187 -76 115 -52 83 -48 54 -78 173 -10 84 -85 185 -44 129 -100 132 -52 58 -23 84 -65 70 -54 73 -92 167 -91 103 -73 112 -11 85 -38 78 -78 105 -7 22 -3 85 -57 125 -45 77 -15 99 -87 104 -2 70 -11 111 -40 75 -33 47 -99 186 -24 87 -20 78 -14 92 -71 135 -23 30 -58 95 -51 112 -8 21 -75 138 -78 102 -0 48 -86 106 -18 28 -4 103 -75 81 -96 126 -16 88 -83 120 -87 182 -35 48 -31 58 -46 71 -52 73 -71 89 -20 92 -33 107 -10 62 -29 37 -6 22 -0 81 -33 35 -0 81 -20 82 -18 39 -19 84 -88 166 -49 95 -64 74 -58 139 -20 21 -49 105 diff --git a/geom_bottleneck/tests/data/test_610_B b/geom_bottleneck/tests/data/test_610_B deleted file mode 100644 index 0745255..0000000 --- a/geom_bottleneck/tests/data/test_610_B +++ /dev/null @@ -1,100 +0,0 @@ -44 136 -49 63 -56 122 -67 109 -38 136 -87 96 -23 34 -53 130 -94 108 -67 81 -58 88 -74 158 -20 86 -34 42 -76 128 -33 61 -92 156 -97 107 -39 111 -93 165 -56 144 -36 121 -2 34 -90 136 -91 185 -76 125 -13 26 -59 108 -39 131 -65 138 -49 145 -86 179 -56 138 -62 128 -37 106 -11 22 -27 39 -39 116 -83 127 -20 51 -10 20 -14 79 -96 107 -44 122 -85 122 -85 112 -75 95 -55 100 -56 111 -46 127 -72 157 -49 71 -32 126 -90 144 -94 95 -34 81 -21 64 -37 84 -40 103 -53 76 -88 102 -63 73 -28 31 -42 43 -29 50 -17 61 -59 156 -97 164 -22 50 -45 128 -65 159 -56 123 -10 82 -76 132 -9 86 -97 180 -34 62 -63 70 -68 127 -52 104 -75 168 -54 66 -67 154 -94 113 -34 76 -12 106 -34 69 -31 130 -70 105 -27 52 -47 71 -36 128 -68 156 -47 134 -12 79 -42 139 -85 138 -37 91 -43 68 -23 81 diff --git a/geom_bottleneck/tests/data/test_611_A b/geom_bottleneck/tests/data/test_611_A deleted file mode 100644 index f7cfbbe..0000000 --- a/geom_bottleneck/tests/data/test_611_A +++ /dev/null @@ -1,100 +0,0 @@ -79 154 -81 116 -71 125 -5 48 -85 176 -76 115 -3 87 -85 102 -17 116 -49 80 -95 183 -82 92 -23 60 -66 97 -4 37 -81 90 -24 50 -64 136 -54 86 -87 160 -33 102 -40 80 -82 127 -97 118 -68 76 -99 160 -92 107 -14 80 -5 45 -42 83 -40 108 -77 163 -39 105 -91 176 -45 73 -96 169 -78 176 -12 90 -53 135 -87 124 -79 172 -52 65 -26 86 -65 112 -1 60 -57 131 -65 135 -45 57 -28 71 -40 50 -17 110 -95 112 -59 156 -38 86 -63 78 -60 112 -28 108 -18 72 -18 91 -33 94 -41 105 -2 37 -36 93 -49 103 -57 131 -10 108 -29 64 -73 83 -79 85 -30 115 -93 111 -47 90 -41 47 -90 158 -72 137 -55 65 -55 136 -40 52 -38 49 -33 57 -82 125 -53 139 -42 87 -43 55 -16 54 -45 61 -6 92 -21 37 -33 84 -37 137 -39 87 -19 70 -62 79 -9 15 -16 48 -39 131 -59 130 -80 94 -56 126 -76 95 diff --git a/geom_bottleneck/tests/data/test_611_B b/geom_bottleneck/tests/data/test_611_B deleted file mode 100644 index ffc3bf6..0000000 --- a/geom_bottleneck/tests/data/test_611_B +++ /dev/null @@ -1,100 +0,0 @@ -15 50 -61 137 -52 63 -72 148 -89 101 -93 143 -56 127 -30 99 -72 120 -92 114 -53 106 -43 72 -80 116 -67 136 -33 98 -63 111 -39 55 -84 170 -55 106 -1 8 -96 157 -85 143 -30 95 -66 132 -45 51 -36 128 -69 141 -1 31 -20 97 -14 47 -66 163 -44 125 -45 75 -86 185 -13 78 -28 31 -6 14 -96 108 -62 99 -29 120 -11 20 -55 107 -9 19 -32 105 -4 60 -92 160 -29 80 -68 113 -63 161 -78 95 -24 96 -98 128 -28 81 -87 175 -81 165 -70 137 -55 83 -38 43 -96 158 -40 100 -15 21 -66 70 -22 103 -37 106 -61 126 -52 151 -92 113 -36 61 -11 106 -81 141 -38 135 -48 142 -8 16 -88 89 -80 178 -100 160 -43 91 -71 122 -2 79 -21 27 -74 82 -3 6 -56 109 -94 175 -78 153 -32 117 -78 135 -14 53 -68 70 -53 115 -59 143 -41 63 -18 111 -28 109 -30 65 -42 132 -91 135 -5 43 -47 144 -53 103 diff --git a/geom_bottleneck/tests/data/test_612_A b/geom_bottleneck/tests/data/test_612_A deleted file mode 100644 index 1d08d30..0000000 --- a/geom_bottleneck/tests/data/test_612_A +++ /dev/null @@ -1,100 +0,0 @@ -29 103 -5 54 -70 158 -33 82 -96 190 -84 184 -49 139 -37 47 -96 159 -75 126 -37 67 -5 28 -41 44 -64 107 -0 88 -32 35 -41 42 -11 14 -82 107 -36 111 -35 80 -69 142 -22 85 -95 191 -48 102 -78 135 -74 151 -71 73 -92 114 -95 152 -52 85 -52 95 -72 147 -33 133 -57 148 -90 155 -94 192 -97 108 -84 172 -3 46 -36 112 -72 129 -80 132 -17 41 -67 113 -27 77 -45 86 -56 135 -41 65 -13 53 -52 84 -54 101 -34 74 -25 99 -86 87 -36 136 -82 124 -5 95 -86 150 -76 90 -66 127 -54 110 -76 82 -82 101 -75 139 -2 28 -68 156 -38 60 -51 75 -96 161 -98 143 -38 66 -43 67 -72 112 -25 27 -96 195 -24 26 -46 85 -71 157 -12 47 -46 92 -72 109 -14 65 -68 144 -53 56 -61 105 -18 111 -51 95 -18 28 -39 121 -67 71 -42 58 -25 106 -88 169 -66 150 -47 114 -36 61 -12 101 -64 137 -8 31 diff --git a/geom_bottleneck/tests/data/test_612_B b/geom_bottleneck/tests/data/test_612_B deleted file mode 100644 index 712c645..0000000 --- a/geom_bottleneck/tests/data/test_612_B +++ /dev/null @@ -1,100 +0,0 @@ -51 131 -46 143 -100 147 -25 81 -73 151 -74 80 -50 143 -91 157 -46 56 -67 152 -67 75 -78 137 -33 90 -17 45 -82 165 -64 97 -85 168 -44 130 -93 140 -80 137 -68 76 -82 177 -21 60 -73 82 -28 41 -45 121 -6 100 -72 83 -27 74 -53 69 -7 8 -7 93 -30 57 -38 98 -38 44 -58 81 -70 168 -15 112 -25 66 -80 122 -24 38 -60 149 -29 116 -54 75 -53 142 -48 111 -0 21 -82 151 -74 118 -93 155 -14 69 -7 70 -30 125 -9 73 -21 54 -97 144 -14 26 -27 95 -25 74 -60 75 -44 95 -94 168 -82 108 -97 129 -7 49 -86 95 -92 97 -98 166 -31 82 -33 90 -24 47 -48 147 -66 117 -26 66 -29 114 -84 166 -62 127 -72 132 -20 37 -77 170 -21 89 -1 9 -74 83 -96 192 -40 117 -3 8 -38 72 -88 156 -66 109 -22 52 -14 39 -51 92 -65 123 -81 119 -28 43 -75 170 -94 159 -20 96 -63 109 -17 106 diff --git a/geom_bottleneck/tests/data/test_613_A b/geom_bottleneck/tests/data/test_613_A deleted file mode 100644 index 909c462..0000000 --- a/geom_bottleneck/tests/data/test_613_A +++ /dev/null @@ -1,100 +0,0 @@ -43 47 -47 132 -11 66 -37 81 -99 108 -46 54 -47 80 -96 121 -12 18 -56 128 -7 75 -27 104 -43 110 -100 127 -28 29 -75 174 -62 105 -0 13 -43 62 -5 43 -8 27 -54 56 -43 103 -41 105 -96 156 -42 48 -97 134 -25 67 -79 144 -25 29 -99 140 -98 128 -45 144 -37 46 -4 98 -92 121 -12 77 -14 97 -92 119 -72 167 -14 36 -92 101 -30 38 -94 100 -42 55 -8 97 -8 78 -78 135 -46 83 -78 126 -30 58 -80 175 -49 130 -67 85 -4 24 -100 188 -36 49 -88 179 -45 69 -80 89 -1 73 -30 88 -44 124 -29 81 -15 100 -35 70 -29 87 -73 152 -64 102 -47 136 -50 68 -75 127 -80 152 -34 44 -78 167 -98 162 -18 45 -19 60 -90 120 -68 106 -98 198 -61 130 -3 41 -90 100 -22 68 -19 57 -59 88 -19 77 -60 92 -38 61 -7 45 -23 87 -71 155 -23 57 -97 177 -58 128 -77 109 -13 112 -37 129 -54 61 diff --git a/geom_bottleneck/tests/data/test_613_B b/geom_bottleneck/tests/data/test_613_B deleted file mode 100644 index 9569b49..0000000 --- a/geom_bottleneck/tests/data/test_613_B +++ /dev/null @@ -1,100 +0,0 @@ -22 108 -62 83 -61 105 -95 188 -77 78 -7 45 -83 149 -1 65 -14 16 -30 89 -84 112 -29 123 -73 173 -5 35 -37 58 -11 56 -83 125 -71 165 -53 103 -88 176 -28 88 -71 141 -93 170 -95 187 -15 84 -57 70 -19 118 -14 51 -37 117 -69 131 -97 143 -20 117 -54 99 -54 146 -62 104 -76 155 -23 75 -77 155 -23 117 -30 42 -97 137 -44 107 -24 33 -99 188 -30 38 -60 129 -83 102 -95 120 -37 71 -72 106 -90 149 -16 73 -97 127 -81 98 -39 101 -64 149 -43 112 -90 182 -8 93 -36 50 -33 45 -63 78 -25 103 -78 125 -47 143 -83 141 -66 153 -51 125 -53 83 -94 125 -99 199 -67 109 -67 99 -29 55 -68 148 -91 159 -65 96 -25 84 -63 134 -40 136 -94 173 -67 154 -14 107 -73 153 -24 79 -85 116 -66 104 -98 166 -0 42 -100 148 -74 168 -31 86 -42 62 -83 182 -48 131 -18 94 -90 134 -84 150 -78 175 -27 121 diff --git a/geom_bottleneck/tests/data/test_614_A b/geom_bottleneck/tests/data/test_614_A deleted file mode 100644 index 29c02c8..0000000 --- a/geom_bottleneck/tests/data/test_614_A +++ /dev/null @@ -1,100 +0,0 @@ -24 124 -56 99 -57 147 -95 161 -39 104 -63 154 -82 105 -65 89 -82 122 -62 129 -88 181 -75 121 -32 33 -44 68 -12 28 -36 131 -63 64 -23 72 -92 159 -80 112 -2 92 -48 110 -50 98 -23 50 -20 72 -32 39 -32 86 -51 63 -47 114 -61 71 -32 78 -43 110 -69 157 -79 122 -35 48 -74 85 -15 62 -14 72 -29 62 -37 61 -56 75 -35 88 -70 84 -37 91 -45 139 -16 33 -76 145 -8 70 -87 128 -91 183 -29 47 -37 48 -13 102 -88 142 -10 75 -35 109 -84 178 -88 118 -85 93 -17 113 -30 49 -13 47 -83 129 -60 106 -92 154 -29 90 -93 135 -33 66 -60 117 -36 92 -1 22 -13 76 -5 102 -7 102 -76 154 -78 133 -72 135 -93 146 -37 47 -44 103 -68 102 -81 136 -51 58 -92 172 -43 119 -92 140 -62 116 -15 84 -58 82 -94 119 -74 131 -5 42 -37 56 -28 127 -82 85 -60 107 -18 98 -1 80 -95 129 -96 101 diff --git a/geom_bottleneck/tests/data/test_614_B b/geom_bottleneck/tests/data/test_614_B deleted file mode 100644 index f34b836..0000000 --- a/geom_bottleneck/tests/data/test_614_B +++ /dev/null @@ -1,100 +0,0 @@ -28 55 -77 152 -40 97 -23 116 -61 120 -59 143 -27 48 -32 88 -92 117 -66 145 -83 132 -2 51 -57 82 -47 122 -7 40 -68 150 -86 156 -68 122 -74 94 -92 113 -14 46 -61 116 -42 133 -15 55 -9 24 -49 70 -41 108 -20 45 -93 177 -87 144 -81 161 -11 60 -64 92 -24 69 -50 79 -39 82 -28 116 -62 122 -38 48 -64 75 -51 62 -22 34 -10 96 -61 73 -72 146 -10 62 -61 86 -5 41 -43 106 -25 66 -30 55 -91 112 -30 76 -96 176 -84 148 -17 81 -51 127 -90 106 -100 177 -67 129 -23 84 -49 99 -100 124 -11 59 -54 106 -19 113 -76 96 -10 96 -15 114 -83 143 -29 57 -82 143 -32 64 -6 73 -94 142 -22 52 -93 100 -57 154 -100 110 -90 165 -69 110 -54 118 -38 47 -92 142 -45 65 -0 19 -100 196 -71 136 -16 78 -53 148 -76 83 -49 81 -86 148 -59 152 -13 69 -25 101 -57 102 -89 113 -15 17 -1 2 diff --git a/geom_bottleneck/tests/data/test_615_A b/geom_bottleneck/tests/data/test_615_A deleted file mode 100644 index d1b55eb..0000000 --- a/geom_bottleneck/tests/data/test_615_A +++ /dev/null @@ -1,100 +0,0 @@ -98 121 -87 153 -92 109 -60 122 -16 78 -1 43 -29 68 -93 186 -35 121 -95 183 -47 59 -98 129 -57 129 -82 134 -10 104 -20 60 -74 125 -97 158 -96 142 -71 88 -94 192 -37 132 -50 114 -65 96 -43 128 -27 48 -96 180 -10 22 -39 129 -28 29 -36 136 -1 65 -0 80 -3 99 -31 44 -35 94 -73 82 -91 155 -67 166 -36 78 -92 183 -74 157 -46 123 -31 68 -62 72 -21 83 -7 70 -49 137 -23 79 -48 132 -78 171 -51 80 -41 54 -59 108 -82 156 -42 136 -92 163 -27 90 -82 128 -95 96 -20 74 -26 40 -36 86 -29 35 -84 168 -82 151 -80 123 -58 109 -37 74 -53 86 -55 124 -24 91 -52 113 -79 126 -3 82 -68 124 -91 142 -48 85 -36 131 -7 61 -69 150 -66 77 -64 142 -91 95 -11 25 -71 162 -51 58 -20 104 -61 152 -2 19 -26 27 -41 58 -46 102 -29 41 -13 36 -93 145 -7 35 -54 102 -98 158 -85 93 diff --git a/geom_bottleneck/tests/data/test_615_B b/geom_bottleneck/tests/data/test_615_B deleted file mode 100644 index ab204be..0000000 --- a/geom_bottleneck/tests/data/test_615_B +++ /dev/null @@ -1,100 +0,0 @@ -11 38 -73 143 -46 112 -28 29 -68 96 -49 111 -90 154 -98 189 -25 45 -40 129 -76 104 -72 79 -100 121 -3 73 -73 83 -51 84 -81 102 -55 91 -60 96 -54 139 -80 131 -4 84 -97 125 -75 132 -39 84 -90 153 -29 61 -27 31 -14 71 -86 112 -52 87 -1 100 -66 69 -16 51 -70 93 -91 139 -80 140 -92 144 -20 42 -45 122 -27 115 -51 112 -61 94 -54 140 -85 159 -0 99 -31 59 -9 24 -31 122 -5 13 -51 85 -22 65 -14 42 -79 120 -40 43 -13 85 -78 147 -47 48 -87 109 -94 187 -2 74 -36 95 -41 72 -85 105 -36 103 -41 94 -27 90 -66 72 -42 89 -93 170 -84 151 -66 96 -65 162 -2 3 -25 45 -50 77 -20 78 -21 50 -93 119 -76 150 -65 93 -11 68 -42 61 -28 92 -39 129 -92 112 -91 187 -48 97 -59 62 -0 31 -57 107 -83 140 -80 82 -87 135 -35 48 -23 57 -79 166 -7 81 -97 121 -97 98 diff --git a/geom_bottleneck/tests/data/test_616_A b/geom_bottleneck/tests/data/test_616_A deleted file mode 100644 index 2b99b87..0000000 --- a/geom_bottleneck/tests/data/test_616_A +++ /dev/null @@ -1,100 +0,0 @@ -74 170 -100 122 -43 126 -66 162 -54 71 -31 122 -49 55 -100 194 -68 142 -83 94 -4 55 -20 79 -90 117 -67 143 -50 51 -40 123 -21 64 -41 114 -35 44 -75 169 -82 162 -52 138 -69 99 -53 107 -36 95 -99 118 -55 69 -86 102 -70 75 -5 94 -55 133 -79 141 -100 171 -6 73 -22 99 -92 185 -5 94 -34 131 -50 143 -97 184 -51 106 -82 158 -85 173 -81 163 -59 85 -50 93 -49 60 -94 128 -83 167 -29 44 -85 164 -62 138 -33 92 -32 114 -74 80 -64 124 -30 117 -22 116 -37 80 -87 142 -65 143 -0 95 -93 131 -70 168 -35 90 -74 169 -79 173 -49 99 -33 120 -30 63 -57 113 -72 97 -71 127 -53 61 -77 139 -85 159 -0 80 -51 120 -3 76 -65 88 -63 121 -55 73 -23 92 -29 98 -2 31 -65 112 -15 86 -47 86 -100 146 -21 49 -76 158 -75 130 -65 141 -73 112 -6 90 -29 110 -89 93 -99 106 -95 135 -39 101 diff --git a/geom_bottleneck/tests/data/test_616_B b/geom_bottleneck/tests/data/test_616_B deleted file mode 100644 index 55a8c9f..0000000 --- a/geom_bottleneck/tests/data/test_616_B +++ /dev/null @@ -1,100 +0,0 @@ -22 54 -34 134 -72 81 -63 68 -99 119 -35 79 -86 177 -39 120 -68 128 -50 115 -59 119 -60 125 -19 91 -82 118 -81 100 -46 144 -99 152 -7 81 -81 113 -29 93 -68 86 -15 54 -52 67 -85 182 -44 76 -2 55 -51 146 -19 32 -39 111 -41 116 -83 112 -97 190 -83 94 -85 133 -31 103 -55 92 -99 150 -49 136 -72 138 -1 53 -25 89 -37 106 -49 149 -2 10 -39 90 -85 143 -4 17 -8 69 -59 120 -70 80 -73 96 -80 119 -57 86 -30 59 -52 60 -13 93 -16 92 -45 103 -14 27 -4 30 -81 117 -22 39 -14 78 -42 120 -19 118 -97 115 -74 164 -70 158 -12 63 -38 79 -80 150 -37 111 -71 97 -7 13 -73 162 -31 75 -61 98 -54 89 -73 110 -87 137 -61 126 -23 71 -97 146 -20 47 -98 181 -63 69 -4 102 -11 50 -17 46 -19 22 -70 167 -98 147 -99 153 -93 144 -44 72 -67 117 -46 133 -15 48 -64 135 -55 122 diff --git a/geom_bottleneck/tests/data/test_617_A b/geom_bottleneck/tests/data/test_617_A deleted file mode 100644 index 9eb04ba..0000000 --- a/geom_bottleneck/tests/data/test_617_A +++ /dev/null @@ -1,100 +0,0 @@ -91 153 -68 149 -3 63 -83 160 -15 40 -13 60 -92 126 -96 190 -2 94 -75 89 -100 141 -12 107 -66 104 -57 120 -65 91 -91 191 -12 93 -50 66 -30 85 -4 5 -63 124 -69 145 -50 131 -61 94 -23 33 -27 91 -43 46 -67 131 -90 106 -47 128 -99 109 -76 133 -62 89 -68 95 -72 125 -37 55 -10 14 -6 55 -9 13 -99 168 -14 47 -24 62 -27 112 -92 133 -95 166 -36 76 -67 152 -72 94 -72 158 -77 175 -93 143 -38 78 -20 71 -68 122 -39 111 -49 120 -0 62 -52 127 -51 142 -81 168 -63 117 -33 52 -47 48 -4 66 -92 166 -51 120 -77 80 -54 89 -83 124 -90 126 -93 122 -6 83 -63 111 -95 146 -3 57 -39 117 -76 105 -71 76 -13 88 -94 185 -77 147 -47 147 -60 123 -64 134 -97 110 -99 111 -75 119 -15 35 -82 130 -92 129 -27 108 -93 94 -91 138 -43 101 -90 160 -90 155 -27 88 -2 17 -20 43 -9 94 diff --git a/geom_bottleneck/tests/data/test_617_B b/geom_bottleneck/tests/data/test_617_B deleted file mode 100644 index eb300a8..0000000 --- a/geom_bottleneck/tests/data/test_617_B +++ /dev/null @@ -1,100 +0,0 @@ -100 145 -51 93 -52 55 -73 86 -99 166 -80 151 -75 83 -81 105 -10 11 -52 110 -32 102 -38 124 -83 168 -55 116 -47 101 -71 90 -78 163 -19 98 -58 135 -54 137 -79 114 -91 102 -96 119 -9 10 -30 82 -15 60 -69 106 -56 125 -0 7 -71 74 -37 79 -80 102 -89 177 -43 92 -80 94 -9 92 -37 69 -6 95 -85 111 -27 38 -95 138 -92 157 -51 57 -79 96 -67 123 -56 70 -69 153 -82 151 -96 192 -12 34 -66 78 -75 154 -91 135 -79 179 -67 153 -45 86 -88 144 -91 109 -60 115 -92 176 -45 110 -35 117 -58 61 -91 147 -80 86 -9 80 -65 125 -75 78 -29 105 -69 148 -55 138 -54 60 -89 139 -98 131 -73 104 -29 127 -63 123 -7 69 -82 152 -6 92 -20 37 -41 112 -82 182 -73 128 -48 106 -60 98 -35 65 -13 42 -49 52 -8 36 -6 18 -42 70 -16 60 -30 56 -78 120 -80 94 -38 92 -19 52 -78 89 -49 131 diff --git a/geom_bottleneck/tests/data/test_618_A b/geom_bottleneck/tests/data/test_618_A deleted file mode 100644 index a53c5f8..0000000 --- a/geom_bottleneck/tests/data/test_618_A +++ /dev/null @@ -1,100 +0,0 @@ -28 78 -66 159 -45 123 -56 140 -67 109 -32 81 -23 101 -44 121 -82 99 -20 28 -59 137 -93 185 -51 103 -75 89 -47 69 -48 94 -23 52 -35 74 -67 161 -67 138 -12 25 -50 73 -90 158 -55 124 -95 120 -36 96 -91 126 -100 114 -15 66 -89 180 -19 54 -81 137 -65 114 -46 51 -42 141 -74 88 -46 76 -38 69 -21 92 -92 97 -16 29 -97 177 -22 75 -94 155 -10 47 -96 174 -98 155 -16 104 -49 88 -36 44 -1 9 -66 83 -71 117 -45 56 -49 146 -29 66 -31 35 -49 133 -43 123 -6 20 -24 103 -14 103 -13 30 -100 101 -8 68 -71 101 -18 52 -33 94 -82 113 -0 36 -1 79 -63 141 -29 113 -41 105 -5 105 -47 142 -98 159 -48 96 -31 43 -29 76 -63 159 -9 72 -39 62 -75 111 -27 37 -72 81 -39 112 -70 88 -78 149 -69 101 -68 136 -72 77 -18 40 -48 72 -53 115 -12 78 -40 63 -75 163 -57 141 -47 140 diff --git a/geom_bottleneck/tests/data/test_618_B b/geom_bottleneck/tests/data/test_618_B deleted file mode 100644 index 611fb6a..0000000 --- a/geom_bottleneck/tests/data/test_618_B +++ /dev/null @@ -1,100 +0,0 @@ -35 126 -40 82 -62 85 -64 72 -55 138 -43 97 -12 41 -75 142 -12 68 -26 114 -69 169 -65 101 -76 161 -20 63 -25 113 -70 153 -54 70 -41 79 -29 91 -85 100 -53 134 -12 13 -38 56 -28 112 -34 118 -56 111 -17 104 -66 108 -23 26 -47 96 -18 100 -18 100 -51 127 -40 87 -63 75 -40 101 -14 48 -72 90 -80 121 -28 56 -91 147 -25 92 -31 55 -25 106 -41 57 -42 52 -65 98 -14 110 -98 188 -39 75 -68 147 -62 148 -16 96 -91 103 -83 109 -55 91 -85 184 -62 73 -9 105 -70 74 -33 132 -6 82 -97 169 -11 90 -98 194 -91 160 -74 133 -25 69 -73 114 -1 27 -100 120 -77 159 -88 187 -31 42 -24 25 -93 140 -44 96 -0 86 -39 55 -52 96 -2 54 -33 97 -63 151 -7 95 -40 54 -89 127 -71 112 -74 162 -55 113 -20 60 -81 106 -36 111 -17 75 -48 69 -6 33 -11 94 -73 150 -5 28 -62 118 -38 78 diff --git a/geom_bottleneck/tests/data/test_619_A b/geom_bottleneck/tests/data/test_619_A deleted file mode 100644 index 4dd6557..0000000 --- a/geom_bottleneck/tests/data/test_619_A +++ /dev/null @@ -1,100 +0,0 @@ -31 76 -34 130 -70 80 -52 82 -40 116 -77 109 -84 130 -53 111 -63 79 -7 12 -28 70 -35 78 -95 115 -78 123 -23 44 -96 162 -50 139 -58 155 -31 91 -91 129 -82 139 -21 111 -98 117 -75 137 -27 68 -51 125 -93 104 -71 161 -66 147 -97 132 -98 169 -93 186 -22 83 -73 136 -27 70 -100 194 -74 87 -21 31 -11 107 -59 70 -0 77 -99 126 -50 86 -31 123 -62 91 -25 119 -44 104 -68 156 -79 165 -58 89 -66 122 -20 42 -71 77 -97 177 -40 66 -78 122 -73 169 -84 89 -28 107 -58 94 -76 89 -68 103 -50 89 -90 97 -32 94 -30 96 -78 100 -97 186 -99 141 -61 116 -19 32 -19 101 -32 65 -15 67 -69 150 -55 64 -37 53 -76 130 -4 53 -27 79 -90 121 -8 53 -39 75 -90 102 -41 65 -34 124 -16 110 -52 61 -55 58 -23 62 -14 92 -39 88 -5 71 -59 110 -12 100 -14 90 -35 101 -23 105 -50 124 -58 148 diff --git a/geom_bottleneck/tests/data/test_619_B b/geom_bottleneck/tests/data/test_619_B deleted file mode 100644 index 711d7cb..0000000 --- a/geom_bottleneck/tests/data/test_619_B +++ /dev/null @@ -1,100 +0,0 @@ -75 136 -69 74 -21 44 -4 30 -6 70 -27 50 -57 72 -62 67 -50 127 -33 84 -10 71 -87 167 -12 58 -1 41 -86 164 -74 133 -64 132 -80 178 -72 124 -91 165 -4 96 -6 90 -49 97 -87 123 -34 101 -34 66 -94 108 -78 109 -34 87 -23 107 -7 70 -88 108 -100 157 -18 29 -15 38 -81 136 -39 103 -12 96 -56 136 -71 104 -90 137 -100 167 -39 125 -10 102 -8 49 -86 89 -76 153 -21 48 -52 129 -58 61 -41 136 -43 110 -37 39 -20 65 -99 161 -54 82 -17 64 -66 137 -32 44 -13 40 -43 127 -1 21 -41 63 -57 127 -29 126 -64 134 -24 122 -62 73 -20 120 -72 109 -100 156 -35 43 -4 19 -84 174 -64 101 -32 122 -14 43 -68 111 -84 132 -55 92 -21 84 -90 183 -62 63 -10 107 -40 46 -81 124 -62 120 -50 125 -38 112 -72 137 -93 190 -38 57 -27 42 -7 76 -84 169 -45 102 -51 78 -96 111 -84 153 -53 60 diff --git a/geom_bottleneck/tests/data/test_620_A b/geom_bottleneck/tests/data/test_620_A deleted file mode 100644 index 74e7856..0000000 --- a/geom_bottleneck/tests/data/test_620_A +++ /dev/null @@ -1,2 +0,0 @@ -977 1670 -257 583 diff --git a/geom_bottleneck/tests/data/test_620_B b/geom_bottleneck/tests/data/test_620_B deleted file mode 100644 index e7efa97..0000000 --- a/geom_bottleneck/tests/data/test_620_B +++ /dev/null @@ -1,2 +0,0 @@ -519 914 -659 781 diff --git a/geom_bottleneck/tests/data/test_621_A b/geom_bottleneck/tests/data/test_621_A deleted file mode 100644 index 6a24523..0000000 --- a/geom_bottleneck/tests/data/test_621_A +++ /dev/null @@ -1,2 +0,0 @@ -928 1424 -468 1402 diff --git a/geom_bottleneck/tests/data/test_621_B b/geom_bottleneck/tests/data/test_621_B deleted file mode 100644 index 7b49acb..0000000 --- a/geom_bottleneck/tests/data/test_621_B +++ /dev/null @@ -1,2 +0,0 @@ -946 1838 -602 1466 diff --git a/geom_bottleneck/tests/data/test_622_A b/geom_bottleneck/tests/data/test_622_A deleted file mode 100644 index 58d67ac..0000000 --- a/geom_bottleneck/tests/data/test_622_A +++ /dev/null @@ -1,2 +0,0 @@ -199 1177 -163 743 diff --git a/geom_bottleneck/tests/data/test_622_B b/geom_bottleneck/tests/data/test_622_B deleted file mode 100644 index f9a4fdd..0000000 --- a/geom_bottleneck/tests/data/test_622_B +++ /dev/null @@ -1,2 +0,0 @@ -502 1478 -838 1480 diff --git a/geom_bottleneck/tests/data/test_623_A b/geom_bottleneck/tests/data/test_623_A deleted file mode 100644 index 8d99200..0000000 --- a/geom_bottleneck/tests/data/test_623_A +++ /dev/null @@ -1,2 +0,0 @@ -156 443 -264 982 diff --git a/geom_bottleneck/tests/data/test_623_B b/geom_bottleneck/tests/data/test_623_B deleted file mode 100644 index 22ab9fd..0000000 --- a/geom_bottleneck/tests/data/test_623_B +++ /dev/null @@ -1,2 +0,0 @@ -995 1285 -571 1427 diff --git a/geom_bottleneck/tests/data/test_624_A b/geom_bottleneck/tests/data/test_624_A deleted file mode 100644 index 49891f6..0000000 --- a/geom_bottleneck/tests/data/test_624_A +++ /dev/null @@ -1,2 +0,0 @@ -884 1159 -315 1125 diff --git a/geom_bottleneck/tests/data/test_624_B b/geom_bottleneck/tests/data/test_624_B deleted file mode 100644 index fa3e1ea..0000000 --- a/geom_bottleneck/tests/data/test_624_B +++ /dev/null @@ -1,2 +0,0 @@ -236 1034 -474 567 diff --git a/geom_bottleneck/tests/data/test_625_A b/geom_bottleneck/tests/data/test_625_A deleted file mode 100644 index 4da6ce4..0000000 --- a/geom_bottleneck/tests/data/test_625_A +++ /dev/null @@ -1,2 +0,0 @@ -8 375 -509 926 diff --git a/geom_bottleneck/tests/data/test_625_B b/geom_bottleneck/tests/data/test_625_B deleted file mode 100644 index bf587fc..0000000 --- a/geom_bottleneck/tests/data/test_625_B +++ /dev/null @@ -1,2 +0,0 @@ -805 895 -735 1279 diff --git a/geom_bottleneck/tests/data/test_626_A b/geom_bottleneck/tests/data/test_626_A deleted file mode 100644 index 92036c8..0000000 --- a/geom_bottleneck/tests/data/test_626_A +++ /dev/null @@ -1,2 +0,0 @@ -821 1025 -74 936 diff --git a/geom_bottleneck/tests/data/test_626_B b/geom_bottleneck/tests/data/test_626_B deleted file mode 100644 index 3052b59..0000000 --- a/geom_bottleneck/tests/data/test_626_B +++ /dev/null @@ -1,2 +0,0 @@ -155 737 -564 1257 diff --git a/geom_bottleneck/tests/data/test_627_A b/geom_bottleneck/tests/data/test_627_A deleted file mode 100644 index f682247..0000000 --- a/geom_bottleneck/tests/data/test_627_A +++ /dev/null @@ -1,2 +0,0 @@ -680 1473 -354 876 diff --git a/geom_bottleneck/tests/data/test_627_B b/geom_bottleneck/tests/data/test_627_B deleted file mode 100644 index 7c61fad..0000000 --- a/geom_bottleneck/tests/data/test_627_B +++ /dev/null @@ -1,2 +0,0 @@ -767 1509 -998 1182 diff --git a/geom_bottleneck/tests/data/test_628_A b/geom_bottleneck/tests/data/test_628_A deleted file mode 100644 index f499ec3..0000000 --- a/geom_bottleneck/tests/data/test_628_A +++ /dev/null @@ -1,2 +0,0 @@ -481 1127 -66 1027 diff --git a/geom_bottleneck/tests/data/test_628_B b/geom_bottleneck/tests/data/test_628_B deleted file mode 100644 index 5eb5994..0000000 --- a/geom_bottleneck/tests/data/test_628_B +++ /dev/null @@ -1,2 +0,0 @@ -961 1197 -123 388 diff --git a/geom_bottleneck/tests/data/test_629_A b/geom_bottleneck/tests/data/test_629_A deleted file mode 100644 index ff42c12..0000000 --- a/geom_bottleneck/tests/data/test_629_A +++ /dev/null @@ -1,2 +0,0 @@ -457 1026 -405 1343 diff --git a/geom_bottleneck/tests/data/test_629_B b/geom_bottleneck/tests/data/test_629_B deleted file mode 100644 index b0b983a..0000000 --- a/geom_bottleneck/tests/data/test_629_B +++ /dev/null @@ -1,2 +0,0 @@ -575 706 -472 965 diff --git a/geom_bottleneck/tests/data/test_630_A b/geom_bottleneck/tests/data/test_630_A deleted file mode 100644 index 6ed10cf..0000000 --- a/geom_bottleneck/tests/data/test_630_A +++ /dev/null @@ -1,2 +0,0 @@ -480 650 -0 307 diff --git a/geom_bottleneck/tests/data/test_630_B b/geom_bottleneck/tests/data/test_630_B deleted file mode 100644 index 0583a0c..0000000 --- a/geom_bottleneck/tests/data/test_630_B +++ /dev/null @@ -1,2 +0,0 @@ -836 1099 -771 1050 diff --git a/geom_bottleneck/tests/data/test_631_A b/geom_bottleneck/tests/data/test_631_A deleted file mode 100644 index d49637c..0000000 --- a/geom_bottleneck/tests/data/test_631_A +++ /dev/null @@ -1,2 +0,0 @@ -551 1534 -392 820 diff --git a/geom_bottleneck/tests/data/test_631_B b/geom_bottleneck/tests/data/test_631_B deleted file mode 100644 index f522f48..0000000 --- a/geom_bottleneck/tests/data/test_631_B +++ /dev/null @@ -1,2 +0,0 @@ -721 1465 -591 781 diff --git a/geom_bottleneck/tests/data/test_632_A b/geom_bottleneck/tests/data/test_632_A deleted file mode 100644 index 32c4757..0000000 --- a/geom_bottleneck/tests/data/test_632_A +++ /dev/null @@ -1,2 +0,0 @@ -352 417 -814 986 diff --git a/geom_bottleneck/tests/data/test_632_B b/geom_bottleneck/tests/data/test_632_B deleted file mode 100644 index f50a6bb..0000000 --- a/geom_bottleneck/tests/data/test_632_B +++ /dev/null @@ -1,2 +0,0 @@ -211 264 -517 1443 diff --git a/geom_bottleneck/tests/data/test_633_A b/geom_bottleneck/tests/data/test_633_A deleted file mode 100644 index 0199c88..0000000 --- a/geom_bottleneck/tests/data/test_633_A +++ /dev/null @@ -1,2 +0,0 @@ -487 1216 -842 1559 diff --git a/geom_bottleneck/tests/data/test_633_B b/geom_bottleneck/tests/data/test_633_B deleted file mode 100644 index d516834..0000000 --- a/geom_bottleneck/tests/data/test_633_B +++ /dev/null @@ -1,2 +0,0 @@ -353 982 -437 1421 diff --git a/geom_bottleneck/tests/data/test_634_A b/geom_bottleneck/tests/data/test_634_A deleted file mode 100644 index 45493ad..0000000 --- a/geom_bottleneck/tests/data/test_634_A +++ /dev/null @@ -1,2 +0,0 @@ -367 742 -382 796 diff --git a/geom_bottleneck/tests/data/test_634_B b/geom_bottleneck/tests/data/test_634_B deleted file mode 100644 index 8840b3a..0000000 --- a/geom_bottleneck/tests/data/test_634_B +++ /dev/null @@ -1,2 +0,0 @@ -9 723 -351 901 diff --git a/geom_bottleneck/tests/data/test_635_A b/geom_bottleneck/tests/data/test_635_A deleted file mode 100644 index d65240b..0000000 --- a/geom_bottleneck/tests/data/test_635_A +++ /dev/null @@ -1,2 +0,0 @@ -984 1272 -952 1384 diff --git a/geom_bottleneck/tests/data/test_635_B b/geom_bottleneck/tests/data/test_635_B deleted file mode 100644 index 8cc813d..0000000 --- a/geom_bottleneck/tests/data/test_635_B +++ /dev/null @@ -1,2 +0,0 @@ -528 622 -88 466 diff --git a/geom_bottleneck/tests/data/test_636_A b/geom_bottleneck/tests/data/test_636_A deleted file mode 100644 index eee9635..0000000 --- a/geom_bottleneck/tests/data/test_636_A +++ /dev/null @@ -1,2 +0,0 @@ -285 617 -809 1379 diff --git a/geom_bottleneck/tests/data/test_636_B b/geom_bottleneck/tests/data/test_636_B deleted file mode 100644 index e565845..0000000 --- a/geom_bottleneck/tests/data/test_636_B +++ /dev/null @@ -1,2 +0,0 @@ -162 1083 -842 1760 diff --git a/geom_bottleneck/tests/data/test_637_A b/geom_bottleneck/tests/data/test_637_A deleted file mode 100644 index 4ba4314..0000000 --- a/geom_bottleneck/tests/data/test_637_A +++ /dev/null @@ -1,2 +0,0 @@ -624 1031 -118 423 diff --git a/geom_bottleneck/tests/data/test_637_B b/geom_bottleneck/tests/data/test_637_B deleted file mode 100644 index 58aba0f..0000000 --- a/geom_bottleneck/tests/data/test_637_B +++ /dev/null @@ -1,2 +0,0 @@ -453 958 -310 1149 diff --git a/geom_bottleneck/tests/data/test_638_A b/geom_bottleneck/tests/data/test_638_A deleted file mode 100644 index 4d993df..0000000 --- a/geom_bottleneck/tests/data/test_638_A +++ /dev/null @@ -1,2 +0,0 @@ -683 1251 -811 1566 diff --git a/geom_bottleneck/tests/data/test_638_B b/geom_bottleneck/tests/data/test_638_B deleted file mode 100644 index 5750b40..0000000 --- a/geom_bottleneck/tests/data/test_638_B +++ /dev/null @@ -1,2 +0,0 @@ -489 1389 -408 858 diff --git a/geom_bottleneck/tests/data/test_639_A b/geom_bottleneck/tests/data/test_639_A deleted file mode 100644 index 1e86c9b..0000000 --- a/geom_bottleneck/tests/data/test_639_A +++ /dev/null @@ -1,2 +0,0 @@ -907 1067 -329 547 diff --git a/geom_bottleneck/tests/data/test_639_B b/geom_bottleneck/tests/data/test_639_B deleted file mode 100644 index 758fe2d..0000000 --- a/geom_bottleneck/tests/data/test_639_B +++ /dev/null @@ -1,2 +0,0 @@ -896 1777 -769 1237 diff --git a/geom_bottleneck/tests/data/test_640_A b/geom_bottleneck/tests/data/test_640_A deleted file mode 100644 index 981248a..0000000 --- a/geom_bottleneck/tests/data/test_640_A +++ /dev/null @@ -1,3 +0,0 @@ -609 1601 -450 549 -123 590 diff --git a/geom_bottleneck/tests/data/test_640_B b/geom_bottleneck/tests/data/test_640_B deleted file mode 100644 index d4f75ec..0000000 --- a/geom_bottleneck/tests/data/test_640_B +++ /dev/null @@ -1,3 +0,0 @@ -392 752 -844 1720 -51 914 diff --git a/geom_bottleneck/tests/data/test_641_A b/geom_bottleneck/tests/data/test_641_A deleted file mode 100644 index 04100b0..0000000 --- a/geom_bottleneck/tests/data/test_641_A +++ /dev/null @@ -1,3 +0,0 @@ -344 679 -413 673 -647 1475 diff --git a/geom_bottleneck/tests/data/test_641_B b/geom_bottleneck/tests/data/test_641_B deleted file mode 100644 index 840a640..0000000 --- a/geom_bottleneck/tests/data/test_641_B +++ /dev/null @@ -1,3 +0,0 @@ -688 1185 -529 598 -382 1269 diff --git a/geom_bottleneck/tests/data/test_642_A b/geom_bottleneck/tests/data/test_642_A deleted file mode 100644 index a7da9ec..0000000 --- a/geom_bottleneck/tests/data/test_642_A +++ /dev/null @@ -1,3 +0,0 @@ -886 1249 -24 684 -651 895 diff --git a/geom_bottleneck/tests/data/test_642_B b/geom_bottleneck/tests/data/test_642_B deleted file mode 100644 index e25e427..0000000 --- a/geom_bottleneck/tests/data/test_642_B +++ /dev/null @@ -1,3 +0,0 @@ -779 977 -2 736 -978 1769 diff --git a/geom_bottleneck/tests/data/test_643_A b/geom_bottleneck/tests/data/test_643_A deleted file mode 100644 index e818bdc..0000000 --- a/geom_bottleneck/tests/data/test_643_A +++ /dev/null @@ -1,3 +0,0 @@ -891 1186 -391 1185 -921 1300 diff --git a/geom_bottleneck/tests/data/test_643_B b/geom_bottleneck/tests/data/test_643_B deleted file mode 100644 index 7a5f620..0000000 --- a/geom_bottleneck/tests/data/test_643_B +++ /dev/null @@ -1,3 +0,0 @@ -21 783 -84 583 -133 483 diff --git a/geom_bottleneck/tests/data/test_644_A b/geom_bottleneck/tests/data/test_644_A deleted file mode 100644 index f6bc335..0000000 --- a/geom_bottleneck/tests/data/test_644_A +++ /dev/null @@ -1,3 +0,0 @@ -608 1036 -485 1247 -532 1302 diff --git a/geom_bottleneck/tests/data/test_644_B b/geom_bottleneck/tests/data/test_644_B deleted file mode 100644 index 109024d..0000000 --- a/geom_bottleneck/tests/data/test_644_B +++ /dev/null @@ -1,3 +0,0 @@ -639 1059 -177 1044 -680 901 diff --git a/geom_bottleneck/tests/data/test_645_A b/geom_bottleneck/tests/data/test_645_A deleted file mode 100644 index 3f62c52..0000000 --- a/geom_bottleneck/tests/data/test_645_A +++ /dev/null @@ -1,3 +0,0 @@ -353 877 -730 1291 -610 992 diff --git a/geom_bottleneck/tests/data/test_645_B b/geom_bottleneck/tests/data/test_645_B deleted file mode 100644 index f818161..0000000 --- a/geom_bottleneck/tests/data/test_645_B +++ /dev/null @@ -1,3 +0,0 @@ -854 1092 -395 737 -966 1230 diff --git a/geom_bottleneck/tests/data/test_646_A b/geom_bottleneck/tests/data/test_646_A deleted file mode 100644 index 7582a95..0000000 --- a/geom_bottleneck/tests/data/test_646_A +++ /dev/null @@ -1,3 +0,0 @@ -908 946 -490 875 -115 272 diff --git a/geom_bottleneck/tests/data/test_646_B b/geom_bottleneck/tests/data/test_646_B deleted file mode 100644 index af402f8..0000000 --- a/geom_bottleneck/tests/data/test_646_B +++ /dev/null @@ -1,3 +0,0 @@ -787 1300 -123 569 -222 235 diff --git a/geom_bottleneck/tests/data/test_647_A b/geom_bottleneck/tests/data/test_647_A deleted file mode 100644 index caa678f..0000000 --- a/geom_bottleneck/tests/data/test_647_A +++ /dev/null @@ -1,3 +0,0 @@ -165 217 -390 1141 -18 238 diff --git a/geom_bottleneck/tests/data/test_647_B b/geom_bottleneck/tests/data/test_647_B deleted file mode 100644 index a135f9e..0000000 --- a/geom_bottleneck/tests/data/test_647_B +++ /dev/null @@ -1,3 +0,0 @@ -244 641 -97 859 -575 1088 diff --git a/geom_bottleneck/tests/data/test_648_A b/geom_bottleneck/tests/data/test_648_A deleted file mode 100644 index 35e36b8..0000000 --- a/geom_bottleneck/tests/data/test_648_A +++ /dev/null @@ -1,3 +0,0 @@ -461 1111 -285 713 -349 943 diff --git a/geom_bottleneck/tests/data/test_648_B b/geom_bottleneck/tests/data/test_648_B deleted file mode 100644 index 8a28c4a..0000000 --- a/geom_bottleneck/tests/data/test_648_B +++ /dev/null @@ -1,3 +0,0 @@ -808 938 -293 374 -580 976 diff --git a/geom_bottleneck/tests/data/test_649_A b/geom_bottleneck/tests/data/test_649_A deleted file mode 100644 index 065cc77..0000000 --- a/geom_bottleneck/tests/data/test_649_A +++ /dev/null @@ -1,3 +0,0 @@ -57 802 -286 543 -403 1224 diff --git a/geom_bottleneck/tests/data/test_649_B b/geom_bottleneck/tests/data/test_649_B deleted file mode 100644 index b23411e..0000000 --- a/geom_bottleneck/tests/data/test_649_B +++ /dev/null @@ -1,3 +0,0 @@ -548 551 -21 683 -6 490 diff --git a/geom_bottleneck/tests/data/test_650_A b/geom_bottleneck/tests/data/test_650_A deleted file mode 100644 index d87b7b4..0000000 --- a/geom_bottleneck/tests/data/test_650_A +++ /dev/null @@ -1,3 +0,0 @@ -36 367 -273 389 -981 1711 diff --git a/geom_bottleneck/tests/data/test_650_B b/geom_bottleneck/tests/data/test_650_B deleted file mode 100644 index f379676..0000000 --- a/geom_bottleneck/tests/data/test_650_B +++ /dev/null @@ -1,3 +0,0 @@ -659 1452 -551 1121 -551 949 diff --git a/geom_bottleneck/tests/data/test_651_A b/geom_bottleneck/tests/data/test_651_A deleted file mode 100644 index ecf506a..0000000 --- a/geom_bottleneck/tests/data/test_651_A +++ /dev/null @@ -1,3 +0,0 @@ -929 1425 -793 1446 -949 1437 diff --git a/geom_bottleneck/tests/data/test_651_B b/geom_bottleneck/tests/data/test_651_B deleted file mode 100644 index f05128d..0000000 --- a/geom_bottleneck/tests/data/test_651_B +++ /dev/null @@ -1,3 +0,0 @@ -860 1575 -476 1240 -126 1042 diff --git a/geom_bottleneck/tests/data/test_652_A b/geom_bottleneck/tests/data/test_652_A deleted file mode 100644 index 52d5bdf..0000000 --- a/geom_bottleneck/tests/data/test_652_A +++ /dev/null @@ -1,3 +0,0 @@ -842 1066 -564 764 -68 267 diff --git a/geom_bottleneck/tests/data/test_652_B b/geom_bottleneck/tests/data/test_652_B deleted file mode 100644 index 2b12de5..0000000 --- a/geom_bottleneck/tests/data/test_652_B +++ /dev/null @@ -1,3 +0,0 @@ -427 528 -404 1245 -800 994 diff --git a/geom_bottleneck/tests/data/test_653_A b/geom_bottleneck/tests/data/test_653_A deleted file mode 100644 index b4bbdd3..0000000 --- a/geom_bottleneck/tests/data/test_653_A +++ /dev/null @@ -1,3 +0,0 @@ -792 967 -574 1406 -175 533 diff --git a/geom_bottleneck/tests/data/test_653_B b/geom_bottleneck/tests/data/test_653_B deleted file mode 100644 index f349693..0000000 --- a/geom_bottleneck/tests/data/test_653_B +++ /dev/null @@ -1,3 +0,0 @@ -421 822 -339 1231 -723 1052 diff --git a/geom_bottleneck/tests/data/test_654_A b/geom_bottleneck/tests/data/test_654_A deleted file mode 100644 index d090ad8..0000000 --- a/geom_bottleneck/tests/data/test_654_A +++ /dev/null @@ -1,3 +0,0 @@ -175 462 -829 1810 -494 1040 diff --git a/geom_bottleneck/tests/data/test_654_B b/geom_bottleneck/tests/data/test_654_B deleted file mode 100644 index f9944d7..0000000 --- a/geom_bottleneck/tests/data/test_654_B +++ /dev/null @@ -1,3 +0,0 @@ -656 658 -403 1260 -887 1883 diff --git a/geom_bottleneck/tests/data/test_655_A b/geom_bottleneck/tests/data/test_655_A deleted file mode 100644 index 9105397..0000000 --- a/geom_bottleneck/tests/data/test_655_A +++ /dev/null @@ -1,3 +0,0 @@ -1 419 -674 970 -633 664 diff --git a/geom_bottleneck/tests/data/test_655_B b/geom_bottleneck/tests/data/test_655_B deleted file mode 100644 index 9aa2ab6..0000000 --- a/geom_bottleneck/tests/data/test_655_B +++ /dev/null @@ -1,3 +0,0 @@ -194 461 -376 901 -417 723 diff --git a/geom_bottleneck/tests/data/test_656_A b/geom_bottleneck/tests/data/test_656_A deleted file mode 100644 index bcdfd3c..0000000 --- a/geom_bottleneck/tests/data/test_656_A +++ /dev/null @@ -1,3 +0,0 @@ -707 825 -811 1475 -344 915 diff --git a/geom_bottleneck/tests/data/test_656_B b/geom_bottleneck/tests/data/test_656_B deleted file mode 100644 index 5ee0ab0..0000000 --- a/geom_bottleneck/tests/data/test_656_B +++ /dev/null @@ -1,3 +0,0 @@ -928 1504 -366 991 -506 1194 diff --git a/geom_bottleneck/tests/data/test_657_A b/geom_bottleneck/tests/data/test_657_A deleted file mode 100644 index 7d39a99..0000000 --- a/geom_bottleneck/tests/data/test_657_A +++ /dev/null @@ -1,3 +0,0 @@ -101 439 -539 1442 -955 1560 diff --git a/geom_bottleneck/tests/data/test_657_B b/geom_bottleneck/tests/data/test_657_B deleted file mode 100644 index 3b9d726..0000000 --- a/geom_bottleneck/tests/data/test_657_B +++ /dev/null @@ -1,3 +0,0 @@ -505 966 -757 1602 -615 1309 diff --git a/geom_bottleneck/tests/data/test_658_A b/geom_bottleneck/tests/data/test_658_A deleted file mode 100644 index 33f8b08..0000000 --- a/geom_bottleneck/tests/data/test_658_A +++ /dev/null @@ -1,3 +0,0 @@ -829 1642 -95 139 -435 558 diff --git a/geom_bottleneck/tests/data/test_658_B b/geom_bottleneck/tests/data/test_658_B deleted file mode 100644 index b131e5d..0000000 --- a/geom_bottleneck/tests/data/test_658_B +++ /dev/null @@ -1,3 +0,0 @@ -171 1171 -240 780 -363 720 diff --git a/geom_bottleneck/tests/data/test_659_A b/geom_bottleneck/tests/data/test_659_A deleted file mode 100644 index 974d216..0000000 --- a/geom_bottleneck/tests/data/test_659_A +++ /dev/null @@ -1,3 +0,0 @@ -409 1266 -680 909 -942 1270 diff --git a/geom_bottleneck/tests/data/test_659_B b/geom_bottleneck/tests/data/test_659_B deleted file mode 100644 index c3cfbeb..0000000 --- a/geom_bottleneck/tests/data/test_659_B +++ /dev/null @@ -1,3 +0,0 @@ -318 1245 -561 1013 -787 1275 diff --git a/geom_bottleneck/tests/data/test_660_A b/geom_bottleneck/tests/data/test_660_A deleted file mode 100644 index 1c408f3..0000000 --- a/geom_bottleneck/tests/data/test_660_A +++ /dev/null @@ -1,4 +0,0 @@ -526 757 -355 743 -250 1221 -35 439 diff --git a/geom_bottleneck/tests/data/test_660_B b/geom_bottleneck/tests/data/test_660_B deleted file mode 100644 index 5fffa69..0000000 --- a/geom_bottleneck/tests/data/test_660_B +++ /dev/null @@ -1,4 +0,0 @@ -348 611 -127 398 -839 1650 -136 803 diff --git a/geom_bottleneck/tests/data/test_661_A b/geom_bottleneck/tests/data/test_661_A deleted file mode 100644 index df0d8ad..0000000 --- a/geom_bottleneck/tests/data/test_661_A +++ /dev/null @@ -1,4 +0,0 @@ -769 905 -534 1227 -410 422 -937 1744 diff --git a/geom_bottleneck/tests/data/test_661_B b/geom_bottleneck/tests/data/test_661_B deleted file mode 100644 index 56cfa0c..0000000 --- a/geom_bottleneck/tests/data/test_661_B +++ /dev/null @@ -1,4 +0,0 @@ -19 350 -255 390 -910 1001 -853 1070 diff --git a/geom_bottleneck/tests/data/test_662_A b/geom_bottleneck/tests/data/test_662_A deleted file mode 100644 index cb65a38..0000000 --- a/geom_bottleneck/tests/data/test_662_A +++ /dev/null @@ -1,4 +0,0 @@ -394 674 -364 1209 -763 1333 -344 1294 diff --git a/geom_bottleneck/tests/data/test_662_B b/geom_bottleneck/tests/data/test_662_B deleted file mode 100644 index 92f0ee6..0000000 --- a/geom_bottleneck/tests/data/test_662_B +++ /dev/null @@ -1,4 +0,0 @@ -324 939 -829 987 -210 998 -519 756 diff --git a/geom_bottleneck/tests/data/test_663_A b/geom_bottleneck/tests/data/test_663_A deleted file mode 100644 index ed35031..0000000 --- a/geom_bottleneck/tests/data/test_663_A +++ /dev/null @@ -1,4 +0,0 @@ -659 1254 -201 1188 -660 811 -630 1044 diff --git a/geom_bottleneck/tests/data/test_663_B b/geom_bottleneck/tests/data/test_663_B deleted file mode 100644 index 6a6126c..0000000 --- a/geom_bottleneck/tests/data/test_663_B +++ /dev/null @@ -1,4 +0,0 @@ -873 914 -441 1063 -135 468 -584 620 diff --git a/geom_bottleneck/tests/data/test_664_A b/geom_bottleneck/tests/data/test_664_A deleted file mode 100644 index 59f6bfa..0000000 --- a/geom_bottleneck/tests/data/test_664_A +++ /dev/null @@ -1,4 +0,0 @@ -753 1625 -353 1109 -565 650 -321 708 diff --git a/geom_bottleneck/tests/data/test_664_B b/geom_bottleneck/tests/data/test_664_B deleted file mode 100644 index 6b34a5f..0000000 --- a/geom_bottleneck/tests/data/test_664_B +++ /dev/null @@ -1,4 +0,0 @@ -664 794 -572 1058 -754 1119 -899 1445 diff --git a/geom_bottleneck/tests/data/test_665_A b/geom_bottleneck/tests/data/test_665_A deleted file mode 100644 index ff6ce72..0000000 --- a/geom_bottleneck/tests/data/test_665_A +++ /dev/null @@ -1,4 +0,0 @@ -661 1260 -232 833 -820 826 -32 139 diff --git a/geom_bottleneck/tests/data/test_665_B b/geom_bottleneck/tests/data/test_665_B deleted file mode 100644 index 9a5d4a9..0000000 --- a/geom_bottleneck/tests/data/test_665_B +++ /dev/null @@ -1,4 +0,0 @@ -466 1319 -809 1762 -165 235 -636 1460 diff --git a/geom_bottleneck/tests/data/test_666_A b/geom_bottleneck/tests/data/test_666_A deleted file mode 100644 index 455e262..0000000 --- a/geom_bottleneck/tests/data/test_666_A +++ /dev/null @@ -1,4 +0,0 @@ -496 1447 -606 1017 -578 767 -971 1768 diff --git a/geom_bottleneck/tests/data/test_666_B b/geom_bottleneck/tests/data/test_666_B deleted file mode 100644 index 0c9069e..0000000 --- a/geom_bottleneck/tests/data/test_666_B +++ /dev/null @@ -1,4 +0,0 @@ -578 896 -731 1115 -455 1129 -649 1421 diff --git a/geom_bottleneck/tests/data/test_667_A b/geom_bottleneck/tests/data/test_667_A deleted file mode 100644 index 054d14e..0000000 --- a/geom_bottleneck/tests/data/test_667_A +++ /dev/null @@ -1,4 +0,0 @@ -537 1030 -887 1179 -644 905 -403 1382 diff --git a/geom_bottleneck/tests/data/test_667_B b/geom_bottleneck/tests/data/test_667_B deleted file mode 100644 index a4a432a..0000000 --- a/geom_bottleneck/tests/data/test_667_B +++ /dev/null @@ -1,4 +0,0 @@ -981 1100 -582 1487 -603 1448 -526 1059 diff --git a/geom_bottleneck/tests/data/test_668_A b/geom_bottleneck/tests/data/test_668_A deleted file mode 100644 index 00c5554..0000000 --- a/geom_bottleneck/tests/data/test_668_A +++ /dev/null @@ -1,4 +0,0 @@ -376 564 -803 1414 -324 973 -901 1266 diff --git a/geom_bottleneck/tests/data/test_668_B b/geom_bottleneck/tests/data/test_668_B deleted file mode 100644 index 5b7e07c..0000000 --- a/geom_bottleneck/tests/data/test_668_B +++ /dev/null @@ -1,4 +0,0 @@ -901 1627 -805 1168 -867 1069 -156 291 diff --git a/geom_bottleneck/tests/data/test_669_A b/geom_bottleneck/tests/data/test_669_A deleted file mode 100644 index 2abb014..0000000 --- a/geom_bottleneck/tests/data/test_669_A +++ /dev/null @@ -1,4 +0,0 @@ -282 848 -560 1190 -152 342 -998 1524 diff --git a/geom_bottleneck/tests/data/test_669_B b/geom_bottleneck/tests/data/test_669_B deleted file mode 100644 index 5694ce9..0000000 --- a/geom_bottleneck/tests/data/test_669_B +++ /dev/null @@ -1,4 +0,0 @@ -398 731 -835 1681 -791 1026 -939 1024 diff --git a/geom_bottleneck/tests/data/test_670_A b/geom_bottleneck/tests/data/test_670_A deleted file mode 100644 index e7ae4f1..0000000 --- a/geom_bottleneck/tests/data/test_670_A +++ /dev/null @@ -1,4 +0,0 @@ -665 1146 -512 1332 -375 595 -566 1211 diff --git a/geom_bottleneck/tests/data/test_670_B b/geom_bottleneck/tests/data/test_670_B deleted file mode 100644 index 8f6b057..0000000 --- a/geom_bottleneck/tests/data/test_670_B +++ /dev/null @@ -1,4 +0,0 @@ -203 469 -966 1146 -342 638 -290 498 diff --git a/geom_bottleneck/tests/data/test_671_A b/geom_bottleneck/tests/data/test_671_A deleted file mode 100644 index 8ac70f3..0000000 --- a/geom_bottleneck/tests/data/test_671_A +++ /dev/null @@ -1,4 +0,0 @@ -533 1333 -682 1127 -928 1703 -487 781 diff --git a/geom_bottleneck/tests/data/test_671_B b/geom_bottleneck/tests/data/test_671_B deleted file mode 100644 index bcb5f1b..0000000 --- a/geom_bottleneck/tests/data/test_671_B +++ /dev/null @@ -1,4 +0,0 @@ -336 1128 -992 1292 -931 1497 -622 1165 diff --git a/geom_bottleneck/tests/data/test_672_A b/geom_bottleneck/tests/data/test_672_A deleted file mode 100644 index 4ca2b19..0000000 --- a/geom_bottleneck/tests/data/test_672_A +++ /dev/null @@ -1,4 +0,0 @@ -30 600 -893 1394 -112 776 -434 905 diff --git a/geom_bottleneck/tests/data/test_672_B b/geom_bottleneck/tests/data/test_672_B deleted file mode 100644 index 29b8d76..0000000 --- a/geom_bottleneck/tests/data/test_672_B +++ /dev/null @@ -1,4 +0,0 @@ -684 1559 -372 1171 -113 700 -180 865 diff --git a/geom_bottleneck/tests/data/test_673_A b/geom_bottleneck/tests/data/test_673_A deleted file mode 100644 index f6e6e4a..0000000 --- a/geom_bottleneck/tests/data/test_673_A +++ /dev/null @@ -1,4 +0,0 @@ -894 1455 -676 1502 -402 976 -863 1258 diff --git a/geom_bottleneck/tests/data/test_673_B b/geom_bottleneck/tests/data/test_673_B deleted file mode 100644 index 01ac9c7..0000000 --- a/geom_bottleneck/tests/data/test_673_B +++ /dev/null @@ -1,4 +0,0 @@ -190 473 -420 1059 -187 827 -482 1365 diff --git a/geom_bottleneck/tests/data/test_674_A b/geom_bottleneck/tests/data/test_674_A deleted file mode 100644 index 8bbf6ad..0000000 --- a/geom_bottleneck/tests/data/test_674_A +++ /dev/null @@ -1,4 +0,0 @@ -89 681 -460 781 -500 679 -786 827 diff --git a/geom_bottleneck/tests/data/test_674_B b/geom_bottleneck/tests/data/test_674_B deleted file mode 100644 index ddebd4c..0000000 --- a/geom_bottleneck/tests/data/test_674_B +++ /dev/null @@ -1,4 +0,0 @@ -445 1261 -769 1735 -5 81 -964 1477 diff --git a/geom_bottleneck/tests/data/test_675_A b/geom_bottleneck/tests/data/test_675_A deleted file mode 100644 index 30b36bb..0000000 --- a/geom_bottleneck/tests/data/test_675_A +++ /dev/null @@ -1,4 +0,0 @@ -507 965 -1000 1816 -946 1201 -926 1637 diff --git a/geom_bottleneck/tests/data/test_675_B b/geom_bottleneck/tests/data/test_675_B deleted file mode 100644 index c0722ef..0000000 --- a/geom_bottleneck/tests/data/test_675_B +++ /dev/null @@ -1,4 +0,0 @@ -302 1162 -795 1527 -602 747 -646 683 diff --git a/geom_bottleneck/tests/data/test_676_A b/geom_bottleneck/tests/data/test_676_A deleted file mode 100644 index b43ef5e..0000000 --- a/geom_bottleneck/tests/data/test_676_A +++ /dev/null @@ -1,4 +0,0 @@ -343 1040 -556 758 -286 983 -467 700 diff --git a/geom_bottleneck/tests/data/test_676_B b/geom_bottleneck/tests/data/test_676_B deleted file mode 100644 index 59b2fb6..0000000 --- a/geom_bottleneck/tests/data/test_676_B +++ /dev/null @@ -1,4 +0,0 @@ -446 1062 -65 988 -159 1102 -920 1553 diff --git a/geom_bottleneck/tests/data/test_677_A b/geom_bottleneck/tests/data/test_677_A deleted file mode 100644 index 4d9d36e..0000000 --- a/geom_bottleneck/tests/data/test_677_A +++ /dev/null @@ -1,4 +0,0 @@ -355 949 -561 704 -153 945 -407 1134 diff --git a/geom_bottleneck/tests/data/test_677_B b/geom_bottleneck/tests/data/test_677_B deleted file mode 100644 index 4edf573..0000000 --- a/geom_bottleneck/tests/data/test_677_B +++ /dev/null @@ -1,4 +0,0 @@ -758 962 -354 535 -115 782 -309 1207 diff --git a/geom_bottleneck/tests/data/test_678_A b/geom_bottleneck/tests/data/test_678_A deleted file mode 100644 index 54ab668..0000000 --- a/geom_bottleneck/tests/data/test_678_A +++ /dev/null @@ -1,4 +0,0 @@ -946 1489 -594 1446 -686 986 -200 493 diff --git a/geom_bottleneck/tests/data/test_678_B b/geom_bottleneck/tests/data/test_678_B deleted file mode 100644 index f695f5f..0000000 --- a/geom_bottleneck/tests/data/test_678_B +++ /dev/null @@ -1,4 +0,0 @@ -708 725 -761 1309 -47 963 -61 320 diff --git a/geom_bottleneck/tests/data/test_679_A b/geom_bottleneck/tests/data/test_679_A deleted file mode 100644 index 33e4ce8..0000000 --- a/geom_bottleneck/tests/data/test_679_A +++ /dev/null @@ -1,4 +0,0 @@ -153 950 -179 1047 -736 845 -943 1760 diff --git a/geom_bottleneck/tests/data/test_679_B b/geom_bottleneck/tests/data/test_679_B deleted file mode 100644 index a99ec77..0000000 --- a/geom_bottleneck/tests/data/test_679_B +++ /dev/null @@ -1,4 +0,0 @@ -744 1423 -669 1350 -989 1062 -57 823 diff --git a/geom_bottleneck/tests/data/test_680_A b/geom_bottleneck/tests/data/test_680_A deleted file mode 100644 index 4bb43a8..0000000 --- a/geom_bottleneck/tests/data/test_680_A +++ /dev/null @@ -1,5 +0,0 @@ -102 183 -847 1835 -300 1098 -953 1849 -327 1070 diff --git a/geom_bottleneck/tests/data/test_680_B b/geom_bottleneck/tests/data/test_680_B deleted file mode 100644 index efb704f..0000000 --- a/geom_bottleneck/tests/data/test_680_B +++ /dev/null @@ -1,5 +0,0 @@ -917 1904 -340 1190 -128 516 -695 1474 -450 628 diff --git a/geom_bottleneck/tests/data/test_681_A b/geom_bottleneck/tests/data/test_681_A deleted file mode 100644 index 5eb7d6a..0000000 --- a/geom_bottleneck/tests/data/test_681_A +++ /dev/null @@ -1,5 +0,0 @@ -882 1558 -108 921 -479 653 -329 533 -643 952 diff --git a/geom_bottleneck/tests/data/test_681_B b/geom_bottleneck/tests/data/test_681_B deleted file mode 100644 index 092ddc5..0000000 --- a/geom_bottleneck/tests/data/test_681_B +++ /dev/null @@ -1,5 +0,0 @@ -155 350 -686 1081 -791 900 -402 653 -364 610 diff --git a/geom_bottleneck/tests/data/test_682_A b/geom_bottleneck/tests/data/test_682_A deleted file mode 100644 index 7898cba..0000000 --- a/geom_bottleneck/tests/data/test_682_A +++ /dev/null @@ -1,5 +0,0 @@ -548 632 -839 990 -856 1008 -719 1091 -532 1445 diff --git a/geom_bottleneck/tests/data/test_682_B b/geom_bottleneck/tests/data/test_682_B deleted file mode 100644 index f5b1d81..0000000 --- a/geom_bottleneck/tests/data/test_682_B +++ /dev/null @@ -1,5 +0,0 @@ -341 429 -146 682 -40 962 -543 1339 -277 944 diff --git a/geom_bottleneck/tests/data/test_683_A b/geom_bottleneck/tests/data/test_683_A deleted file mode 100644 index 3661bfc..0000000 --- a/geom_bottleneck/tests/data/test_683_A +++ /dev/null @@ -1,5 +0,0 @@ -227 587 -365 708 -565 1465 -240 248 -610 1328 diff --git a/geom_bottleneck/tests/data/test_683_B b/geom_bottleneck/tests/data/test_683_B deleted file mode 100644 index 62c998b..0000000 --- a/geom_bottleneck/tests/data/test_683_B +++ /dev/null @@ -1,5 +0,0 @@ -741 1553 -314 914 -980 1322 -398 1163 -304 901 diff --git a/geom_bottleneck/tests/data/test_684_A b/geom_bottleneck/tests/data/test_684_A deleted file mode 100644 index b22afe3..0000000 --- a/geom_bottleneck/tests/data/test_684_A +++ /dev/null @@ -1,5 +0,0 @@ -196 1047 -489 739 -11 758 -204 1069 -959 976 diff --git a/geom_bottleneck/tests/data/test_684_B b/geom_bottleneck/tests/data/test_684_B deleted file mode 100644 index cbede63..0000000 --- a/geom_bottleneck/tests/data/test_684_B +++ /dev/null @@ -1,5 +0,0 @@ -391 1180 -229 906 -246 1219 -564 1171 -797 1273 diff --git a/geom_bottleneck/tests/data/test_685_A b/geom_bottleneck/tests/data/test_685_A deleted file mode 100644 index c4bd0e9..0000000 --- a/geom_bottleneck/tests/data/test_685_A +++ /dev/null @@ -1,5 +0,0 @@ -628 762 -148 921 -694 1155 -865 1298 -365 1337 diff --git a/geom_bottleneck/tests/data/test_685_B b/geom_bottleneck/tests/data/test_685_B deleted file mode 100644 index 984dd98..0000000 --- a/geom_bottleneck/tests/data/test_685_B +++ /dev/null @@ -1,5 +0,0 @@ -504 1226 -608 1576 -256 475 -479 884 -384 656 diff --git a/geom_bottleneck/tests/data/test_686_A b/geom_bottleneck/tests/data/test_686_A deleted file mode 100644 index e498d5c..0000000 --- a/geom_bottleneck/tests/data/test_686_A +++ /dev/null @@ -1,5 +0,0 @@ -839 1291 -140 808 -539 720 -928 1729 -881 1126 diff --git a/geom_bottleneck/tests/data/test_686_B b/geom_bottleneck/tests/data/test_686_B deleted file mode 100644 index 56ada59..0000000 --- a/geom_bottleneck/tests/data/test_686_B +++ /dev/null @@ -1,5 +0,0 @@ -280 962 -935 1205 -328 1022 -27 247 -554 732 diff --git a/geom_bottleneck/tests/data/test_687_A b/geom_bottleneck/tests/data/test_687_A deleted file mode 100644 index c31c2d2..0000000 --- a/geom_bottleneck/tests/data/test_687_A +++ /dev/null @@ -1,5 +0,0 @@ -323 954 -507 885 -533 1044 -679 1402 -43 918 diff --git a/geom_bottleneck/tests/data/test_687_B b/geom_bottleneck/tests/data/test_687_B deleted file mode 100644 index 471eeed..0000000 --- a/geom_bottleneck/tests/data/test_687_B +++ /dev/null @@ -1,5 +0,0 @@ -243 823 -269 1215 -449 1214 -24 777 -705 1558 diff --git a/geom_bottleneck/tests/data/test_688_A b/geom_bottleneck/tests/data/test_688_A deleted file mode 100644 index 7396099..0000000 --- a/geom_bottleneck/tests/data/test_688_A +++ /dev/null @@ -1,5 +0,0 @@ -471 989 -319 432 -130 900 -856 1389 -422 635 diff --git a/geom_bottleneck/tests/data/test_688_B b/geom_bottleneck/tests/data/test_688_B deleted file mode 100644 index e133e74..0000000 --- a/geom_bottleneck/tests/data/test_688_B +++ /dev/null @@ -1,5 +0,0 @@ -13 373 -575 1199 -553 1347 -158 1148 -111 393 diff --git a/geom_bottleneck/tests/data/test_689_A b/geom_bottleneck/tests/data/test_689_A deleted file mode 100644 index 72febe7..0000000 --- a/geom_bottleneck/tests/data/test_689_A +++ /dev/null @@ -1,5 +0,0 @@ -451 1035 -293 380 -400 648 -9 681 -85 96 diff --git a/geom_bottleneck/tests/data/test_689_B b/geom_bottleneck/tests/data/test_689_B deleted file mode 100644 index f684387..0000000 --- a/geom_bottleneck/tests/data/test_689_B +++ /dev/null @@ -1,5 +0,0 @@ -431 1117 -40 969 -54 1026 -297 710 -722 1143 diff --git a/geom_bottleneck/tests/data/test_690_A b/geom_bottleneck/tests/data/test_690_A deleted file mode 100644 index 4106f49..0000000 --- a/geom_bottleneck/tests/data/test_690_A +++ /dev/null @@ -1,5 +0,0 @@ -624 1464 -228 1205 -638 876 -896 1632 -564 1378 diff --git a/geom_bottleneck/tests/data/test_690_B b/geom_bottleneck/tests/data/test_690_B deleted file mode 100644 index d452cff..0000000 --- a/geom_bottleneck/tests/data/test_690_B +++ /dev/null @@ -1,5 +0,0 @@ -745 1386 -574 898 -472 1427 -922 1325 -592 1053 diff --git a/geom_bottleneck/tests/data/test_691_A b/geom_bottleneck/tests/data/test_691_A deleted file mode 100644 index b6c906e..0000000 --- a/geom_bottleneck/tests/data/test_691_A +++ /dev/null @@ -1,5 +0,0 @@ -291 1111 -75 251 -47 913 -753 1632 -582 739 diff --git a/geom_bottleneck/tests/data/test_691_B b/geom_bottleneck/tests/data/test_691_B deleted file mode 100644 index 57e58ff..0000000 --- a/geom_bottleneck/tests/data/test_691_B +++ /dev/null @@ -1,5 +0,0 @@ -264 911 -478 839 -182 258 -336 1121 -915 1764 diff --git a/geom_bottleneck/tests/data/test_692_A b/geom_bottleneck/tests/data/test_692_A deleted file mode 100644 index 1686c25..0000000 --- a/geom_bottleneck/tests/data/test_692_A +++ /dev/null @@ -1,5 +0,0 @@ -856 1460 -852 1085 -246 328 -508 1202 -900 1487 diff --git a/geom_bottleneck/tests/data/test_692_B b/geom_bottleneck/tests/data/test_692_B deleted file mode 100644 index bf6174a..0000000 --- a/geom_bottleneck/tests/data/test_692_B +++ /dev/null @@ -1,5 +0,0 @@ -624 1180 -247 889 -218 373 -823 1637 -439 597 diff --git a/geom_bottleneck/tests/data/test_693_A b/geom_bottleneck/tests/data/test_693_A deleted file mode 100644 index ea16ba6..0000000 --- a/geom_bottleneck/tests/data/test_693_A +++ /dev/null @@ -1,5 +0,0 @@ -37 175 -952 1934 -808 843 -742 822 -75 863 diff --git a/geom_bottleneck/tests/data/test_693_B b/geom_bottleneck/tests/data/test_693_B deleted file mode 100644 index 52c8f97..0000000 --- a/geom_bottleneck/tests/data/test_693_B +++ /dev/null @@ -1,5 +0,0 @@ -431 1287 -490 765 -552 843 -179 1131 -334 732 diff --git a/geom_bottleneck/tests/data/test_694_A b/geom_bottleneck/tests/data/test_694_A deleted file mode 100644 index e577a0f..0000000 --- a/geom_bottleneck/tests/data/test_694_A +++ /dev/null @@ -1,5 +0,0 @@ -917 1066 -928 1036 -611 1593 -682 1661 -561 810 diff --git a/geom_bottleneck/tests/data/test_694_B b/geom_bottleneck/tests/data/test_694_B deleted file mode 100644 index e406840..0000000 --- a/geom_bottleneck/tests/data/test_694_B +++ /dev/null @@ -1,5 +0,0 @@ -754 918 -735 1730 -430 1284 -588 986 -56 791 diff --git a/geom_bottleneck/tests/data/test_695_A b/geom_bottleneck/tests/data/test_695_A deleted file mode 100644 index ef9cacb..0000000 --- a/geom_bottleneck/tests/data/test_695_A +++ /dev/null @@ -1,5 +0,0 @@ -219 629 -438 1008 -695 1385 -137 844 -394 1126 diff --git a/geom_bottleneck/tests/data/test_695_B b/geom_bottleneck/tests/data/test_695_B deleted file mode 100644 index f2bb91b..0000000 --- a/geom_bottleneck/tests/data/test_695_B +++ /dev/null @@ -1,5 +0,0 @@ -556 1218 -942 975 -730 1199 -110 947 -867 1613 diff --git a/geom_bottleneck/tests/data/test_696_A b/geom_bottleneck/tests/data/test_696_A deleted file mode 100644 index 71fa19f..0000000 --- a/geom_bottleneck/tests/data/test_696_A +++ /dev/null @@ -1,5 +0,0 @@ -929 1104 -287 561 -801 1419 -549 1265 -758 795 diff --git a/geom_bottleneck/tests/data/test_696_B b/geom_bottleneck/tests/data/test_696_B deleted file mode 100644 index a964c63..0000000 --- a/geom_bottleneck/tests/data/test_696_B +++ /dev/null @@ -1,5 +0,0 @@ -446 641 -863 1426 -0 382 -659 945 -707 715 diff --git a/geom_bottleneck/tests/data/test_697_A b/geom_bottleneck/tests/data/test_697_A deleted file mode 100644 index 848e417..0000000 --- a/geom_bottleneck/tests/data/test_697_A +++ /dev/null @@ -1,5 +0,0 @@ -876 1854 -147 864 -249 1095 -965 1723 -548 865 diff --git a/geom_bottleneck/tests/data/test_697_B b/geom_bottleneck/tests/data/test_697_B deleted file mode 100644 index 98a8d15..0000000 --- a/geom_bottleneck/tests/data/test_697_B +++ /dev/null @@ -1,5 +0,0 @@ -478 1175 -40 533 -212 388 -865 1736 -697 1335 diff --git a/geom_bottleneck/tests/data/test_698_A b/geom_bottleneck/tests/data/test_698_A deleted file mode 100644 index a90620d..0000000 --- a/geom_bottleneck/tests/data/test_698_A +++ /dev/null @@ -1,5 +0,0 @@ -714 1561 -967 1649 -57 65 -560 807 -451 1000 diff --git a/geom_bottleneck/tests/data/test_698_B b/geom_bottleneck/tests/data/test_698_B deleted file mode 100644 index ef52ae0..0000000 --- a/geom_bottleneck/tests/data/test_698_B +++ /dev/null @@ -1,5 +0,0 @@ -909 1809 -266 758 -894 1395 -495 1481 -91 646 diff --git a/geom_bottleneck/tests/data/test_699_A b/geom_bottleneck/tests/data/test_699_A deleted file mode 100644 index e00215d..0000000 --- a/geom_bottleneck/tests/data/test_699_A +++ /dev/null @@ -1,5 +0,0 @@ -749 799 -150 307 -463 1009 -503 1047 -613 1549 diff --git a/geom_bottleneck/tests/data/test_699_B b/geom_bottleneck/tests/data/test_699_B deleted file mode 100644 index 0fff210..0000000 --- a/geom_bottleneck/tests/data/test_699_B +++ /dev/null @@ -1,5 +0,0 @@ -915 1430 -582 685 -994 1491 -227 869 -251 1173 diff --git a/geom_bottleneck/tests/data/test_700_A b/geom_bottleneck/tests/data/test_700_A deleted file mode 100644 index 9425b73..0000000 --- a/geom_bottleneck/tests/data/test_700_A +++ /dev/null @@ -1,6 +0,0 @@ -313 977 -396 888 -244 339 -474 1072 -191 1069 -519 940 diff --git a/geom_bottleneck/tests/data/test_700_B b/geom_bottleneck/tests/data/test_700_B deleted file mode 100644 index 19944b2..0000000 --- a/geom_bottleneck/tests/data/test_700_B +++ /dev/null @@ -1,6 +0,0 @@ -547 588 -852 1072 -34 817 -54 441 -222 413 -184 888 diff --git a/geom_bottleneck/tests/data/test_701_A b/geom_bottleneck/tests/data/test_701_A deleted file mode 100644 index 062d6fb..0000000 --- a/geom_bottleneck/tests/data/test_701_A +++ /dev/null @@ -1,6 +0,0 @@ -582 910 -701 1226 -195 619 -541 668 -275 1161 -322 1041 diff --git a/geom_bottleneck/tests/data/test_701_B b/geom_bottleneck/tests/data/test_701_B deleted file mode 100644 index 3149c7c..0000000 --- a/geom_bottleneck/tests/data/test_701_B +++ /dev/null @@ -1,6 +0,0 @@ -868 1747 -559 1027 -635 1354 -337 541 -630 1220 -860 1681 diff --git a/geom_bottleneck/tests/data/test_702_A b/geom_bottleneck/tests/data/test_702_A deleted file mode 100644 index 2a82935..0000000 --- a/geom_bottleneck/tests/data/test_702_A +++ /dev/null @@ -1,6 +0,0 @@ -378 869 -890 1016 -13 941 -706 1365 -879 1261 -334 864 diff --git a/geom_bottleneck/tests/data/test_702_B b/geom_bottleneck/tests/data/test_702_B deleted file mode 100644 index c3854d5..0000000 --- a/geom_bottleneck/tests/data/test_702_B +++ /dev/null @@ -1,6 +0,0 @@ -381 525 -852 1350 -825 884 -984 1542 -614 942 -74 652 diff --git a/geom_bottleneck/tests/data/test_703_A b/geom_bottleneck/tests/data/test_703_A deleted file mode 100644 index fb434c0..0000000 --- a/geom_bottleneck/tests/data/test_703_A +++ /dev/null @@ -1,6 +0,0 @@ -551 801 -116 205 -364 382 -883 1597 -834 1212 -737 988 diff --git a/geom_bottleneck/tests/data/test_703_B b/geom_bottleneck/tests/data/test_703_B deleted file mode 100644 index f8af9dd..0000000 --- a/geom_bottleneck/tests/data/test_703_B +++ /dev/null @@ -1,6 +0,0 @@ -661 695 -904 1528 -65 986 -691 785 -98 1000 -102 592 diff --git a/geom_bottleneck/tests/data/test_704_A b/geom_bottleneck/tests/data/test_704_A deleted file mode 100644 index a89a1aa..0000000 --- a/geom_bottleneck/tests/data/test_704_A +++ /dev/null @@ -1,6 +0,0 @@ -679 1424 -746 1074 -761 1546 -360 934 -139 855 -942 1002 diff --git a/geom_bottleneck/tests/data/test_704_B b/geom_bottleneck/tests/data/test_704_B deleted file mode 100644 index 5abc5fa..0000000 --- a/geom_bottleneck/tests/data/test_704_B +++ /dev/null @@ -1,6 +0,0 @@ -781 1388 -48 645 -242 294 -979 1071 -348 1065 -701 1351 diff --git a/geom_bottleneck/tests/data/test_705_A b/geom_bottleneck/tests/data/test_705_A deleted file mode 100644 index 924a661..0000000 --- a/geom_bottleneck/tests/data/test_705_A +++ /dev/null @@ -1,6 +0,0 @@ -123 751 -405 935 -708 1217 -540 708 -810 1047 -346 1088 diff --git a/geom_bottleneck/tests/data/test_705_B b/geom_bottleneck/tests/data/test_705_B deleted file mode 100644 index 0681a80..0000000 --- a/geom_bottleneck/tests/data/test_705_B +++ /dev/null @@ -1,6 +0,0 @@ -175 1150 -840 1056 -180 658 -805 1787 -123 467 -947 1539 diff --git a/geom_bottleneck/tests/data/test_706_A b/geom_bottleneck/tests/data/test_706_A deleted file mode 100644 index 0a249be..0000000 --- a/geom_bottleneck/tests/data/test_706_A +++ /dev/null @@ -1,6 +0,0 @@ -900 1181 -555 663 -1 750 -883 1197 -33 518 -450 808 diff --git a/geom_bottleneck/tests/data/test_706_B b/geom_bottleneck/tests/data/test_706_B deleted file mode 100644 index 624923c..0000000 --- a/geom_bottleneck/tests/data/test_706_B +++ /dev/null @@ -1,6 +0,0 @@ -682 818 -814 1240 -900 1777 -399 967 -420 921 -723 1022 diff --git a/geom_bottleneck/tests/data/test_707_A b/geom_bottleneck/tests/data/test_707_A deleted file mode 100644 index a251b74..0000000 --- a/geom_bottleneck/tests/data/test_707_A +++ /dev/null @@ -1,6 +0,0 @@ -991 1398 -632 1322 -635 1448 -97 955 -793 1016 -995 1832 diff --git a/geom_bottleneck/tests/data/test_707_B b/geom_bottleneck/tests/data/test_707_B deleted file mode 100644 index 2647b31..0000000 --- a/geom_bottleneck/tests/data/test_707_B +++ /dev/null @@ -1,6 +0,0 @@ -320 551 -552 1125 -383 551 -891 1032 -272 1038 -925 1695 diff --git a/geom_bottleneck/tests/data/test_708_A b/geom_bottleneck/tests/data/test_708_A deleted file mode 100644 index ddc601a..0000000 --- a/geom_bottleneck/tests/data/test_708_A +++ /dev/null @@ -1,6 +0,0 @@ -681 786 -125 980 -146 721 -769 1207 -504 1208 -724 985 diff --git a/geom_bottleneck/tests/data/test_708_B b/geom_bottleneck/tests/data/test_708_B deleted file mode 100644 index 0a64a4f..0000000 --- a/geom_bottleneck/tests/data/test_708_B +++ /dev/null @@ -1,6 +0,0 @@ -571 697 -763 1635 -573 623 -683 1438 -783 1580 -541 1374 diff --git a/geom_bottleneck/tests/data/test_709_A b/geom_bottleneck/tests/data/test_709_A deleted file mode 100644 index 2d3aa30..0000000 --- a/geom_bottleneck/tests/data/test_709_A +++ /dev/null @@ -1,6 +0,0 @@ -704 1089 -764 1349 -322 1100 -731 1284 -42 525 -49 602 diff --git a/geom_bottleneck/tests/data/test_709_B b/geom_bottleneck/tests/data/test_709_B deleted file mode 100644 index c5f7233..0000000 --- a/geom_bottleneck/tests/data/test_709_B +++ /dev/null @@ -1,6 +0,0 @@ -435 502 -150 1140 -356 1273 -592 1292 -552 1331 -905 1713 diff --git a/geom_bottleneck/tests/data/test_710_A b/geom_bottleneck/tests/data/test_710_A deleted file mode 100644 index e611f5a..0000000 --- a/geom_bottleneck/tests/data/test_710_A +++ /dev/null @@ -1,6 +0,0 @@ -257 589 -18 966 -482 1110 -588 763 -989 1857 -479 494 diff --git a/geom_bottleneck/tests/data/test_710_B b/geom_bottleneck/tests/data/test_710_B deleted file mode 100644 index cd9cedb..0000000 --- a/geom_bottleneck/tests/data/test_710_B +++ /dev/null @@ -1,6 +0,0 @@ -2 263 -642 884 -72 321 -632 1186 -633 1310 -263 1219 diff --git a/geom_bottleneck/tests/data/test_711_A b/geom_bottleneck/tests/data/test_711_A deleted file mode 100644 index 900b87a..0000000 --- a/geom_bottleneck/tests/data/test_711_A +++ /dev/null @@ -1,6 +0,0 @@ -954 1912 -243 556 -758 967 -836 1102 -184 1134 -401 434 diff --git a/geom_bottleneck/tests/data/test_711_B b/geom_bottleneck/tests/data/test_711_B deleted file mode 100644 index 31dd505..0000000 --- a/geom_bottleneck/tests/data/test_711_B +++ /dev/null @@ -1,6 +0,0 @@ -454 1045 -606 646 -999 1478 -398 845 -743 1192 -926 1080 diff --git a/geom_bottleneck/tests/data/test_712_A b/geom_bottleneck/tests/data/test_712_A deleted file mode 100644 index 15bc0a2..0000000 --- a/geom_bottleneck/tests/data/test_712_A +++ /dev/null @@ -1,6 +0,0 @@ -395 1052 -984 1461 -792 801 -652 1183 -411 744 -830 876 diff --git a/geom_bottleneck/tests/data/test_712_B b/geom_bottleneck/tests/data/test_712_B deleted file mode 100644 index 3071ea5..0000000 --- a/geom_bottleneck/tests/data/test_712_B +++ /dev/null @@ -1,6 +0,0 @@ -16 294 -910 1274 -495 1113 -4 944 -244 512 -164 1074 diff --git a/geom_bottleneck/tests/data/test_713_A b/geom_bottleneck/tests/data/test_713_A deleted file mode 100644 index 89ee240..0000000 --- a/geom_bottleneck/tests/data/test_713_A +++ /dev/null @@ -1,6 +0,0 @@ -588 1259 -827 1531 -94 877 -171 1137 -482 729 -879 1065 diff --git a/geom_bottleneck/tests/data/test_713_B b/geom_bottleneck/tests/data/test_713_B deleted file mode 100644 index f2b501c..0000000 --- a/geom_bottleneck/tests/data/test_713_B +++ /dev/null @@ -1,6 +0,0 @@ -222 623 -527 1158 -784 1040 -597 1063 -456 525 -713 1476 diff --git a/geom_bottleneck/tests/data/test_714_A b/geom_bottleneck/tests/data/test_714_A deleted file mode 100644 index 73ba892..0000000 --- a/geom_bottleneck/tests/data/test_714_A +++ /dev/null @@ -1,6 +0,0 @@ -81 1045 -398 727 -668 1311 -788 1623 -363 1222 -630 757 diff --git a/geom_bottleneck/tests/data/test_714_B b/geom_bottleneck/tests/data/test_714_B deleted file mode 100644 index c495e7a..0000000 --- a/geom_bottleneck/tests/data/test_714_B +++ /dev/null @@ -1,6 +0,0 @@ -840 1651 -664 995 -984 1812 -501 1183 -859 1373 -224 321 diff --git a/geom_bottleneck/tests/data/test_715_A b/geom_bottleneck/tests/data/test_715_A deleted file mode 100644 index 70b698d..0000000 --- a/geom_bottleneck/tests/data/test_715_A +++ /dev/null @@ -1,6 +0,0 @@ -390 400 -914 963 -118 182 -848 1799 -24 207 -310 917 diff --git a/geom_bottleneck/tests/data/test_715_B b/geom_bottleneck/tests/data/test_715_B deleted file mode 100644 index 3cdf2b3..0000000 --- a/geom_bottleneck/tests/data/test_715_B +++ /dev/null @@ -1,6 +0,0 @@ -999 1621 -121 432 -878 1064 -454 925 -642 1350 -976 1667 diff --git a/geom_bottleneck/tests/data/test_716_A b/geom_bottleneck/tests/data/test_716_A deleted file mode 100644 index ada9ac0..0000000 --- a/geom_bottleneck/tests/data/test_716_A +++ /dev/null @@ -1,6 +0,0 @@ -838 1400 -274 999 -806 1428 -957 1203 -48 503 -600 754 diff --git a/geom_bottleneck/tests/data/test_716_B b/geom_bottleneck/tests/data/test_716_B deleted file mode 100644 index b13c8a1..0000000 --- a/geom_bottleneck/tests/data/test_716_B +++ /dev/null @@ -1,6 +0,0 @@ -64 560 -385 907 -324 1041 -611 868 -685 1605 -320 733 diff --git a/geom_bottleneck/tests/data/test_717_A b/geom_bottleneck/tests/data/test_717_A deleted file mode 100644 index f23e351..0000000 --- a/geom_bottleneck/tests/data/test_717_A +++ /dev/null @@ -1,6 +0,0 @@ -435 538 -281 369 -230 609 -932 1150 -629 1558 -397 511 diff --git a/geom_bottleneck/tests/data/test_717_B b/geom_bottleneck/tests/data/test_717_B deleted file mode 100644 index 150f7ff..0000000 --- a/geom_bottleneck/tests/data/test_717_B +++ /dev/null @@ -1,6 +0,0 @@ -293 1253 -356 1075 -559 754 -309 911 -726 1445 -539 1249 diff --git a/geom_bottleneck/tests/data/test_718_A b/geom_bottleneck/tests/data/test_718_A deleted file mode 100644 index 6efc756..0000000 --- a/geom_bottleneck/tests/data/test_718_A +++ /dev/null @@ -1,6 +0,0 @@ -289 455 -404 1182 -924 1629 -961 1779 -392 1078 -881 1571 diff --git a/geom_bottleneck/tests/data/test_718_B b/geom_bottleneck/tests/data/test_718_B deleted file mode 100644 index 4e45db1..0000000 --- a/geom_bottleneck/tests/data/test_718_B +++ /dev/null @@ -1,6 +0,0 @@ -666 983 -482 1016 -609 1498 -352 882 -92 384 -911 1898 diff --git a/geom_bottleneck/tests/data/test_719_A b/geom_bottleneck/tests/data/test_719_A deleted file mode 100644 index 3512e1f..0000000 --- a/geom_bottleneck/tests/data/test_719_A +++ /dev/null @@ -1,6 +0,0 @@ -589 1272 -999 1340 -628 1428 -112 311 -854 1288 -579 1034 diff --git a/geom_bottleneck/tests/data/test_719_B b/geom_bottleneck/tests/data/test_719_B deleted file mode 100644 index 028f44a..0000000 --- a/geom_bottleneck/tests/data/test_719_B +++ /dev/null @@ -1,6 +0,0 @@ -223 460 -798 1620 -582 901 -542 835 -309 851 -28 133 diff --git a/geom_bottleneck/tests/data/test_720_A b/geom_bottleneck/tests/data/test_720_A deleted file mode 100644 index 57e2829..0000000 --- a/geom_bottleneck/tests/data/test_720_A +++ /dev/null @@ -1,7 +0,0 @@ -842 955 -876 1162 -447 481 -217 1212 -392 731 -112 940 -462 796 diff --git a/geom_bottleneck/tests/data/test_720_B b/geom_bottleneck/tests/data/test_720_B deleted file mode 100644 index f3f2675..0000000 --- a/geom_bottleneck/tests/data/test_720_B +++ /dev/null @@ -1,7 +0,0 @@ -768 1167 -970 1497 -720 809 -848 1278 -264 387 -443 673 -481 643 diff --git a/geom_bottleneck/tests/data/test_721_A b/geom_bottleneck/tests/data/test_721_A deleted file mode 100644 index f8a7f29..0000000 --- a/geom_bottleneck/tests/data/test_721_A +++ /dev/null @@ -1,7 +0,0 @@ -712 1082 -573 1189 -468 579 -431 1140 -543 758 -852 1545 -707 1585 diff --git a/geom_bottleneck/tests/data/test_721_B b/geom_bottleneck/tests/data/test_721_B deleted file mode 100644 index 35b828c..0000000 --- a/geom_bottleneck/tests/data/test_721_B +++ /dev/null @@ -1,7 +0,0 @@ -274 999 -671 1640 -687 969 -641 796 -566 1384 -558 1386 -611 1189 diff --git a/geom_bottleneck/tests/data/test_722_A b/geom_bottleneck/tests/data/test_722_A deleted file mode 100644 index 6e0719f..0000000 --- a/geom_bottleneck/tests/data/test_722_A +++ /dev/null @@ -1,7 +0,0 @@ -292 783 -995 1371 -60 662 -506 531 -294 1245 -966 1027 -750 1180 diff --git a/geom_bottleneck/tests/data/test_722_B b/geom_bottleneck/tests/data/test_722_B deleted file mode 100644 index 0fd37cc..0000000 --- a/geom_bottleneck/tests/data/test_722_B +++ /dev/null @@ -1,7 +0,0 @@ -194 750 -520 773 -206 498 -746 1278 -354 643 -812 1219 -547 707 diff --git a/geom_bottleneck/tests/data/test_723_A b/geom_bottleneck/tests/data/test_723_A deleted file mode 100644 index ad94fdd..0000000 --- a/geom_bottleneck/tests/data/test_723_A +++ /dev/null @@ -1,7 +0,0 @@ -44 715 -470 1287 -692 1635 -849 1409 -636 724 -108 255 -377 1253 diff --git a/geom_bottleneck/tests/data/test_723_B b/geom_bottleneck/tests/data/test_723_B deleted file mode 100644 index 247a17e..0000000 --- a/geom_bottleneck/tests/data/test_723_B +++ /dev/null @@ -1,7 +0,0 @@ -565 1129 -574 725 -387 1204 -990 1093 -548 1447 -547 1294 -394 421 diff --git a/geom_bottleneck/tests/data/test_724_A b/geom_bottleneck/tests/data/test_724_A deleted file mode 100644 index f9a6bcf..0000000 --- a/geom_bottleneck/tests/data/test_724_A +++ /dev/null @@ -1,7 +0,0 @@ -121 963 -4 934 -471 1403 -78 700 -500 749 -577 1241 -961 1123 diff --git a/geom_bottleneck/tests/data/test_724_B b/geom_bottleneck/tests/data/test_724_B deleted file mode 100644 index 71d03b3..0000000 --- a/geom_bottleneck/tests/data/test_724_B +++ /dev/null @@ -1,7 +0,0 @@ -597 1424 -232 317 -618 1105 -593 1007 -410 1158 -534 965 -306 782 diff --git a/geom_bottleneck/tests/data/test_725_A b/geom_bottleneck/tests/data/test_725_A deleted file mode 100644 index 1e20d9e..0000000 --- a/geom_bottleneck/tests/data/test_725_A +++ /dev/null @@ -1,7 +0,0 @@ -365 431 -764 1023 -503 1251 -50 557 -899 930 -906 1266 -698 1582 diff --git a/geom_bottleneck/tests/data/test_725_B b/geom_bottleneck/tests/data/test_725_B deleted file mode 100644 index a215c1e..0000000 --- a/geom_bottleneck/tests/data/test_725_B +++ /dev/null @@ -1,7 +0,0 @@ -591 1250 -643 1388 -429 1007 -953 1625 -604 1075 -486 1455 -999 1790 diff --git a/geom_bottleneck/tests/data/test_726_A b/geom_bottleneck/tests/data/test_726_A deleted file mode 100644 index dd9500a..0000000 --- a/geom_bottleneck/tests/data/test_726_A +++ /dev/null @@ -1,7 +0,0 @@ -193 1032 -813 1060 -401 672 -819 1490 -913 993 -294 753 -107 807 diff --git a/geom_bottleneck/tests/data/test_726_B b/geom_bottleneck/tests/data/test_726_B deleted file mode 100644 index b3d3e50..0000000 --- a/geom_bottleneck/tests/data/test_726_B +++ /dev/null @@ -1,7 +0,0 @@ -57 1011 -861 1503 -669 1185 -630 1360 -636 952 -524 526 -264 1129 diff --git a/geom_bottleneck/tests/data/test_727_A b/geom_bottleneck/tests/data/test_727_A deleted file mode 100644 index dae9ff3..0000000 --- a/geom_bottleneck/tests/data/test_727_A +++ /dev/null @@ -1,7 +0,0 @@ -268 505 -525 1512 -131 265 -534 1402 -810 1044 -474 933 -752 1495 diff --git a/geom_bottleneck/tests/data/test_727_B b/geom_bottleneck/tests/data/test_727_B deleted file mode 100644 index 551d523..0000000 --- a/geom_bottleneck/tests/data/test_727_B +++ /dev/null @@ -1,7 +0,0 @@ -366 1348 -38 470 -594 1547 -97 353 -417 626 -791 1472 -493 1262 diff --git a/geom_bottleneck/tests/data/test_728_A b/geom_bottleneck/tests/data/test_728_A deleted file mode 100644 index 8074ce8..0000000 --- a/geom_bottleneck/tests/data/test_728_A +++ /dev/null @@ -1,7 +0,0 @@ -798 958 -59 406 -670 868 -533 789 -192 727 -52 109 -997 1981 diff --git a/geom_bottleneck/tests/data/test_728_B b/geom_bottleneck/tests/data/test_728_B deleted file mode 100644 index 6d1448a..0000000 --- a/geom_bottleneck/tests/data/test_728_B +++ /dev/null @@ -1,7 +0,0 @@ -211 624 -198 1095 -150 530 -757 1274 -672 1255 -847 1476 -879 1407 diff --git a/geom_bottleneck/tests/data/test_729_A b/geom_bottleneck/tests/data/test_729_A deleted file mode 100644 index f9de136..0000000 --- a/geom_bottleneck/tests/data/test_729_A +++ /dev/null @@ -1,7 +0,0 @@ -574 1387 -241 543 -338 345 -888 1183 -942 1193 -5 802 -357 510 diff --git a/geom_bottleneck/tests/data/test_729_B b/geom_bottleneck/tests/data/test_729_B deleted file mode 100644 index d34621f..0000000 --- a/geom_bottleneck/tests/data/test_729_B +++ /dev/null @@ -1,7 +0,0 @@ -878 1129 -669 805 -56 973 -201 756 -911 1352 -494 887 -161 541 diff --git a/geom_bottleneck/tests/data/test_730_A b/geom_bottleneck/tests/data/test_730_A deleted file mode 100644 index 433cbd8..0000000 --- a/geom_bottleneck/tests/data/test_730_A +++ /dev/null @@ -1,7 +0,0 @@ -135 1110 -126 417 -647 964 -895 1124 -213 1115 -340 755 -154 605 diff --git a/geom_bottleneck/tests/data/test_730_B b/geom_bottleneck/tests/data/test_730_B deleted file mode 100644 index 1b46964..0000000 --- a/geom_bottleneck/tests/data/test_730_B +++ /dev/null @@ -1,7 +0,0 @@ -854 866 -212 1211 -180 272 -386 1292 -47 565 -916 1350 -906 912 diff --git a/geom_bottleneck/tests/data/test_731_A b/geom_bottleneck/tests/data/test_731_A deleted file mode 100644 index 38d42cd..0000000 --- a/geom_bottleneck/tests/data/test_731_A +++ /dev/null @@ -1,7 +0,0 @@ -1000 1606 -332 982 -581 1398 -403 1237 -954 1071 -560 890 -980 1624 diff --git a/geom_bottleneck/tests/data/test_731_B b/geom_bottleneck/tests/data/test_731_B deleted file mode 100644 index 3017d7a..0000000 --- a/geom_bottleneck/tests/data/test_731_B +++ /dev/null @@ -1,7 +0,0 @@ -171 558 -391 1367 -177 1159 -130 343 -914 1175 -774 835 -672 1301 diff --git a/geom_bottleneck/tests/data/test_732_A b/geom_bottleneck/tests/data/test_732_A deleted file mode 100644 index 75a48cf..0000000 --- a/geom_bottleneck/tests/data/test_732_A +++ /dev/null @@ -1,7 +0,0 @@ -330 1018 -692 1639 -213 1060 -138 458 -356 1233 -976 1361 -117 365 diff --git a/geom_bottleneck/tests/data/test_732_B b/geom_bottleneck/tests/data/test_732_B deleted file mode 100644 index fada3b9..0000000 --- a/geom_bottleneck/tests/data/test_732_B +++ /dev/null @@ -1,7 +0,0 @@ -530 729 -842 926 -375 633 -364 987 -507 1398 -303 1096 -137 344 diff --git a/geom_bottleneck/tests/data/test_733_A b/geom_bottleneck/tests/data/test_733_A deleted file mode 100644 index d97ae0b..0000000 --- a/geom_bottleneck/tests/data/test_733_A +++ /dev/null @@ -1,7 +0,0 @@ -155 290 -712 904 -154 668 -518 1267 -224 1022 -997 1304 -551 1015 diff --git a/geom_bottleneck/tests/data/test_733_B b/geom_bottleneck/tests/data/test_733_B deleted file mode 100644 index 529c7de..0000000 --- a/geom_bottleneck/tests/data/test_733_B +++ /dev/null @@ -1,7 +0,0 @@ -930 1406 -626 980 -541 1340 -129 1023 -407 615 -105 850 -688 756 diff --git a/geom_bottleneck/tests/data/test_734_A b/geom_bottleneck/tests/data/test_734_A deleted file mode 100644 index 9aec4b4..0000000 --- a/geom_bottleneck/tests/data/test_734_A +++ /dev/null @@ -1,7 +0,0 @@ -296 1160 -3 574 -642 808 -844 1148 -982 1081 -236 634 -151 904 diff --git a/geom_bottleneck/tests/data/test_734_B b/geom_bottleneck/tests/data/test_734_B deleted file mode 100644 index 4cb7206..0000000 --- a/geom_bottleneck/tests/data/test_734_B +++ /dev/null @@ -1,7 +0,0 @@ -30 884 -13 769 -406 954 -794 1615 -976 1177 -631 816 -400 1099 diff --git a/geom_bottleneck/tests/data/test_735_A b/geom_bottleneck/tests/data/test_735_A deleted file mode 100644 index f364a21..0000000 --- a/geom_bottleneck/tests/data/test_735_A +++ /dev/null @@ -1,7 +0,0 @@ -259 941 -218 975 -286 718 -70 401 -496 830 -220 362 -511 1270 diff --git a/geom_bottleneck/tests/data/test_735_B b/geom_bottleneck/tests/data/test_735_B deleted file mode 100644 index 0f93850..0000000 --- a/geom_bottleneck/tests/data/test_735_B +++ /dev/null @@ -1,7 +0,0 @@ -489 705 -467 962 -110 116 -817 1521 -571 1059 -426 584 -933 1307 diff --git a/geom_bottleneck/tests/data/test_736_A b/geom_bottleneck/tests/data/test_736_A deleted file mode 100644 index d89c563..0000000 --- a/geom_bottleneck/tests/data/test_736_A +++ /dev/null @@ -1,7 +0,0 @@ -624 1466 -288 1004 -552 978 -710 1190 -796 1634 -322 800 -171 197 diff --git a/geom_bottleneck/tests/data/test_736_B b/geom_bottleneck/tests/data/test_736_B deleted file mode 100644 index 25427f3..0000000 --- a/geom_bottleneck/tests/data/test_736_B +++ /dev/null @@ -1,7 +0,0 @@ -385 852 -110 431 -284 646 -803 1541 -436 821 -262 951 -470 1172 diff --git a/geom_bottleneck/tests/data/test_737_A b/geom_bottleneck/tests/data/test_737_A deleted file mode 100644 index 2fbdf41..0000000 --- a/geom_bottleneck/tests/data/test_737_A +++ /dev/null @@ -1,7 +0,0 @@ -340 942 -812 1103 -129 553 -729 781 -779 1100 -99 1059 -720 1532 diff --git a/geom_bottleneck/tests/data/test_737_B b/geom_bottleneck/tests/data/test_737_B deleted file mode 100644 index 42348d5..0000000 --- a/geom_bottleneck/tests/data/test_737_B +++ /dev/null @@ -1,7 +0,0 @@ -677 1323 -268 916 -165 674 -594 689 -975 1246 -717 734 -877 1479 diff --git a/geom_bottleneck/tests/data/test_738_A b/geom_bottleneck/tests/data/test_738_A deleted file mode 100644 index d56b09b..0000000 --- a/geom_bottleneck/tests/data/test_738_A +++ /dev/null @@ -1,7 +0,0 @@ -367 725 -277 1154 -267 994 -780 1005 -293 530 -964 1682 -421 734 diff --git a/geom_bottleneck/tests/data/test_738_B b/geom_bottleneck/tests/data/test_738_B deleted file mode 100644 index 834b2cf..0000000 --- a/geom_bottleneck/tests/data/test_738_B +++ /dev/null @@ -1,7 +0,0 @@ -661 1499 -920 1597 -528 958 -482 957 -143 757 -547 1079 -774 937 diff --git a/geom_bottleneck/tests/data/test_739_A b/geom_bottleneck/tests/data/test_739_A deleted file mode 100644 index 84cbd7c..0000000 --- a/geom_bottleneck/tests/data/test_739_A +++ /dev/null @@ -1,7 +0,0 @@ -414 1244 -395 937 -504 1155 -711 1389 -302 859 -220 731 -725 962 diff --git a/geom_bottleneck/tests/data/test_739_B b/geom_bottleneck/tests/data/test_739_B deleted file mode 100644 index 85afe3e..0000000 --- a/geom_bottleneck/tests/data/test_739_B +++ /dev/null @@ -1,7 +0,0 @@ -598 980 -50 441 -473 1160 -524 1273 -523 1060 -936 1295 -73 910 diff --git a/geom_bottleneck/tests/data/test_740_A b/geom_bottleneck/tests/data/test_740_A deleted file mode 100644 index a99113a..0000000 --- a/geom_bottleneck/tests/data/test_740_A +++ /dev/null @@ -1,8 +0,0 @@ -569 1119 -905 1475 -608 1595 -469 1334 -501 1299 -306 797 -802 1036 -155 379 diff --git a/geom_bottleneck/tests/data/test_740_B b/geom_bottleneck/tests/data/test_740_B deleted file mode 100644 index 5aac504..0000000 --- a/geom_bottleneck/tests/data/test_740_B +++ /dev/null @@ -1,8 +0,0 @@ -729 946 -190 1105 -541 1315 -719 1537 -319 1219 -269 468 -638 838 -51 440 diff --git a/geom_bottleneck/tests/data/test_741_A b/geom_bottleneck/tests/data/test_741_A deleted file mode 100644 index 7c3f3fc..0000000 --- a/geom_bottleneck/tests/data/test_741_A +++ /dev/null @@ -1,8 +0,0 @@ -897 1868 -872 1752 -739 1445 -156 178 -256 714 -198 528 -595 1485 -873 1452 diff --git a/geom_bottleneck/tests/data/test_741_B b/geom_bottleneck/tests/data/test_741_B deleted file mode 100644 index 9f8d386..0000000 --- a/geom_bottleneck/tests/data/test_741_B +++ /dev/null @@ -1,8 +0,0 @@ -193 277 -309 1030 -263 1230 -824 1414 -191 1103 -42 165 -665 690 -414 742 diff --git a/geom_bottleneck/tests/data/test_742_A b/geom_bottleneck/tests/data/test_742_A deleted file mode 100644 index 9effd4c..0000000 --- a/geom_bottleneck/tests/data/test_742_A +++ /dev/null @@ -1,8 +0,0 @@ -268 974 -345 812 -75 359 -178 827 -647 1213 -667 677 -400 521 -703 1302 diff --git a/geom_bottleneck/tests/data/test_742_B b/geom_bottleneck/tests/data/test_742_B deleted file mode 100644 index f17965b..0000000 --- a/geom_bottleneck/tests/data/test_742_B +++ /dev/null @@ -1,8 +0,0 @@ -577 1161 -635 1057 -395 684 -225 312 -194 475 -550 732 -892 1097 -494 987 diff --git a/geom_bottleneck/tests/data/test_743_A b/geom_bottleneck/tests/data/test_743_A deleted file mode 100644 index 3a40cfb..0000000 --- a/geom_bottleneck/tests/data/test_743_A +++ /dev/null @@ -1,8 +0,0 @@ -593 1306 -117 664 -701 1073 -918 1452 -125 1012 -80 106 -26 904 -525 1251 diff --git a/geom_bottleneck/tests/data/test_743_B b/geom_bottleneck/tests/data/test_743_B deleted file mode 100644 index 482d6dd..0000000 --- a/geom_bottleneck/tests/data/test_743_B +++ /dev/null @@ -1,8 +0,0 @@ -913 1090 -957 1355 -465 559 -490 1102 -957 1559 -535 805 -569 1211 -8 570 diff --git a/geom_bottleneck/tests/data/test_744_A b/geom_bottleneck/tests/data/test_744_A deleted file mode 100644 index 25c3e55..0000000 --- a/geom_bottleneck/tests/data/test_744_A +++ /dev/null @@ -1,8 +0,0 @@ -648 773 -599 1278 -940 1503 -127 461 -923 1912 -724 939 -609 633 -720 936 diff --git a/geom_bottleneck/tests/data/test_744_B b/geom_bottleneck/tests/data/test_744_B deleted file mode 100644 index da30f30..0000000 --- a/geom_bottleneck/tests/data/test_744_B +++ /dev/null @@ -1,8 +0,0 @@ -102 119 -262 460 -568 825 -855 1517 -622 1062 -441 607 -183 1095 -446 1422 diff --git a/geom_bottleneck/tests/data/test_745_A b/geom_bottleneck/tests/data/test_745_A deleted file mode 100644 index f8ef7e6..0000000 --- a/geom_bottleneck/tests/data/test_745_A +++ /dev/null @@ -1,8 +0,0 @@ -34 614 -939 1749 -639 698 -16 851 -847 1299 -760 1345 -477 682 -931 1291 diff --git a/geom_bottleneck/tests/data/test_745_B b/geom_bottleneck/tests/data/test_745_B deleted file mode 100644 index f6d32b5..0000000 --- a/geom_bottleneck/tests/data/test_745_B +++ /dev/null @@ -1,8 +0,0 @@ -972 1016 -16 293 -116 641 -230 1015 -164 468 -557 700 -1 477 -437 739 diff --git a/geom_bottleneck/tests/data/test_746_A b/geom_bottleneck/tests/data/test_746_A deleted file mode 100644 index dbd677e..0000000 --- a/geom_bottleneck/tests/data/test_746_A +++ /dev/null @@ -1,8 +0,0 @@ -651 1348 -225 349 -382 755 -986 1090 -601 856 -349 1261 -667 1644 -637 1197 diff --git a/geom_bottleneck/tests/data/test_746_B b/geom_bottleneck/tests/data/test_746_B deleted file mode 100644 index 9d02f4b..0000000 --- a/geom_bottleneck/tests/data/test_746_B +++ /dev/null @@ -1,8 +0,0 @@ -804 1762 -13 403 -615 1487 -810 899 -939 1026 -59 539 -258 803 -199 488 diff --git a/geom_bottleneck/tests/data/test_747_A b/geom_bottleneck/tests/data/test_747_A deleted file mode 100644 index c7886f8..0000000 --- a/geom_bottleneck/tests/data/test_747_A +++ /dev/null @@ -1,8 +0,0 @@ -810 1169 -599 1295 -34 243 -41 247 -828 1689 -884 1265 -57 122 -340 1041 diff --git a/geom_bottleneck/tests/data/test_747_B b/geom_bottleneck/tests/data/test_747_B deleted file mode 100644 index 1ca1b5e..0000000 --- a/geom_bottleneck/tests/data/test_747_B +++ /dev/null @@ -1,8 +0,0 @@ -282 836 -663 822 -874 1239 -911 1439 -704 1085 -593 787 -125 683 -790 1041 diff --git a/geom_bottleneck/tests/data/test_748_A b/geom_bottleneck/tests/data/test_748_A deleted file mode 100644 index 5fe22c2..0000000 --- a/geom_bottleneck/tests/data/test_748_A +++ /dev/null @@ -1,8 +0,0 @@ -713 1382 -941 1859 -531 1460 -239 703 -4 712 -381 1018 -492 1298 -142 765 diff --git a/geom_bottleneck/tests/data/test_748_B b/geom_bottleneck/tests/data/test_748_B deleted file mode 100644 index 2e69002..0000000 --- a/geom_bottleneck/tests/data/test_748_B +++ /dev/null @@ -1,8 +0,0 @@ -993 1036 -886 1574 -892 1880 -649 1474 -228 1041 -124 730 -197 360 -490 1447 diff --git a/geom_bottleneck/tests/data/test_749_A b/geom_bottleneck/tests/data/test_749_A deleted file mode 100644 index b3bf068..0000000 --- a/geom_bottleneck/tests/data/test_749_A +++ /dev/null @@ -1,8 +0,0 @@ -233 929 -150 391 -761 1353 -402 872 -890 1624 -103 482 -855 1150 -173 190 diff --git a/geom_bottleneck/tests/data/test_749_B b/geom_bottleneck/tests/data/test_749_B deleted file mode 100644 index b181d57..0000000 --- a/geom_bottleneck/tests/data/test_749_B +++ /dev/null @@ -1,8 +0,0 @@ -304 960 -633 956 -62 250 -678 1085 -582 1509 -267 1159 -555 872 -828 935 diff --git a/geom_bottleneck/tests/data/test_750_A b/geom_bottleneck/tests/data/test_750_A deleted file mode 100644 index 3bd3e77..0000000 --- a/geom_bottleneck/tests/data/test_750_A +++ /dev/null @@ -1,8 +0,0 @@ -46 814 -299 740 -422 505 -597 674 -626 882 -550 1384 -257 522 -191 537 diff --git a/geom_bottleneck/tests/data/test_750_B b/geom_bottleneck/tests/data/test_750_B deleted file mode 100644 index 837ed3d..0000000 --- a/geom_bottleneck/tests/data/test_750_B +++ /dev/null @@ -1,8 +0,0 @@ -119 1069 -304 1151 -984 1304 -938 1017 -915 1414 -603 1419 -806 1391 -247 563 diff --git a/geom_bottleneck/tests/data/test_751_A b/geom_bottleneck/tests/data/test_751_A deleted file mode 100644 index adb0fe7..0000000 --- a/geom_bottleneck/tests/data/test_751_A +++ /dev/null @@ -1,8 +0,0 @@ -161 749 -884 1266 -52 256 -626 1062 -244 1161 -52 651 -429 513 -123 381 diff --git a/geom_bottleneck/tests/data/test_751_B b/geom_bottleneck/tests/data/test_751_B deleted file mode 100644 index 1ed1651..0000000 --- a/geom_bottleneck/tests/data/test_751_B +++ /dev/null @@ -1,8 +0,0 @@ -646 1122 -980 1686 -3 270 -410 1255 -5 817 -9 390 -601 1013 -786 1675 diff --git a/geom_bottleneck/tests/data/test_752_A b/geom_bottleneck/tests/data/test_752_A deleted file mode 100644 index 4b54da2..0000000 --- a/geom_bottleneck/tests/data/test_752_A +++ /dev/null @@ -1,8 +0,0 @@ -941 1425 -272 829 -904 1623 -562 1306 -223 245 -534 1385 -903 1274 -531 629 diff --git a/geom_bottleneck/tests/data/test_752_B b/geom_bottleneck/tests/data/test_752_B deleted file mode 100644 index 9c05ec9..0000000 --- a/geom_bottleneck/tests/data/test_752_B +++ /dev/null @@ -1,8 +0,0 @@ -514 1333 -981 1676 -949 1493 -952 1015 -572 1224 -131 835 -93 335 -306 906 diff --git a/geom_bottleneck/tests/data/test_753_A b/geom_bottleneck/tests/data/test_753_A deleted file mode 100644 index 5704668..0000000 --- a/geom_bottleneck/tests/data/test_753_A +++ /dev/null @@ -1,8 +0,0 @@ -405 996 -473 1330 -168 804 -516 578 -712 1449 -425 1336 -237 816 -625 1304 diff --git a/geom_bottleneck/tests/data/test_753_B b/geom_bottleneck/tests/data/test_753_B deleted file mode 100644 index 1e845f7..0000000 --- a/geom_bottleneck/tests/data/test_753_B +++ /dev/null @@ -1,8 +0,0 @@ -291 1031 -70 332 -847 973 -311 398 -815 1512 -996 1375 -720 1388 -518 611 diff --git a/geom_bottleneck/tests/data/test_754_A b/geom_bottleneck/tests/data/test_754_A deleted file mode 100644 index 1957784..0000000 --- a/geom_bottleneck/tests/data/test_754_A +++ /dev/null @@ -1,8 +0,0 @@ -138 781 -992 1803 -189 1157 -546 1145 -461 1153 -634 1004 -152 947 -706 713 diff --git a/geom_bottleneck/tests/data/test_754_B b/geom_bottleneck/tests/data/test_754_B deleted file mode 100644 index 4463862..0000000 --- a/geom_bottleneck/tests/data/test_754_B +++ /dev/null @@ -1,8 +0,0 @@ -742 1152 -909 947 -350 1168 -240 769 -415 479 -752 1507 -356 902 -856 1356 diff --git a/geom_bottleneck/tests/data/test_755_A b/geom_bottleneck/tests/data/test_755_A deleted file mode 100644 index d05546d..0000000 --- a/geom_bottleneck/tests/data/test_755_A +++ /dev/null @@ -1,8 +0,0 @@ -163 1000 -403 624 -628 829 -458 854 -319 778 -180 856 -822 1028 -806 923 diff --git a/geom_bottleneck/tests/data/test_755_B b/geom_bottleneck/tests/data/test_755_B deleted file mode 100644 index 47b372a..0000000 --- a/geom_bottleneck/tests/data/test_755_B +++ /dev/null @@ -1,8 +0,0 @@ -922 1134 -900 1378 -200 780 -184 815 -631 1014 -837 1762 -676 789 -298 486 diff --git a/geom_bottleneck/tests/data/test_756_A b/geom_bottleneck/tests/data/test_756_A deleted file mode 100644 index bac3296..0000000 --- a/geom_bottleneck/tests/data/test_756_A +++ /dev/null @@ -1,8 +0,0 @@ -467 1356 -84 188 -215 968 -702 1035 -305 745 -171 880 -724 1223 -916 1487 diff --git a/geom_bottleneck/tests/data/test_756_B b/geom_bottleneck/tests/data/test_756_B deleted file mode 100644 index 0579dd8..0000000 --- a/geom_bottleneck/tests/data/test_756_B +++ /dev/null @@ -1,8 +0,0 @@ -62 816 -781 1333 -496 1018 -211 657 -968 1779 -684 828 -707 816 -133 710 diff --git a/geom_bottleneck/tests/data/test_757_A b/geom_bottleneck/tests/data/test_757_A deleted file mode 100644 index 3d0e16e..0000000 --- a/geom_bottleneck/tests/data/test_757_A +++ /dev/null @@ -1,8 +0,0 @@ -850 1310 -104 459 -439 1185 -320 454 -423 1247 -85 891 -899 1560 -114 246 diff --git a/geom_bottleneck/tests/data/test_757_B b/geom_bottleneck/tests/data/test_757_B deleted file mode 100644 index 7ccedc5..0000000 --- a/geom_bottleneck/tests/data/test_757_B +++ /dev/null @@ -1,8 +0,0 @@ -797 1761 -642 812 -919 1333 -446 703 -330 1069 -575 668 -735 1258 -723 1330 diff --git a/geom_bottleneck/tests/data/test_758_A b/geom_bottleneck/tests/data/test_758_A deleted file mode 100644 index fdabcdd..0000000 --- a/geom_bottleneck/tests/data/test_758_A +++ /dev/null @@ -1,8 +0,0 @@ -310 820 -65 766 -892 1802 -459 1216 -237 358 -371 419 -218 375 -27 127 diff --git a/geom_bottleneck/tests/data/test_758_B b/geom_bottleneck/tests/data/test_758_B deleted file mode 100644 index 4fb7f60..0000000 --- a/geom_bottleneck/tests/data/test_758_B +++ /dev/null @@ -1,8 +0,0 @@ -261 318 -423 669 -485 1330 -814 942 -276 1013 -914 1010 -893 1161 -559 1118 diff --git a/geom_bottleneck/tests/data/test_759_A b/geom_bottleneck/tests/data/test_759_A deleted file mode 100644 index dcf3a28..0000000 --- a/geom_bottleneck/tests/data/test_759_A +++ /dev/null @@ -1,8 +0,0 @@ -235 1080 -801 1281 -406 1012 -157 1091 -394 1385 -217 791 -971 1930 -529 1401 diff --git a/geom_bottleneck/tests/data/test_759_B b/geom_bottleneck/tests/data/test_759_B deleted file mode 100644 index e094e35..0000000 --- a/geom_bottleneck/tests/data/test_759_B +++ /dev/null @@ -1,8 +0,0 @@ -957 1887 -857 1225 -366 386 -678 1429 -828 876 -250 466 -506 1127 -791 946 diff --git a/geom_bottleneck/tests/data/test_760_A b/geom_bottleneck/tests/data/test_760_A deleted file mode 100644 index 38e77f3..0000000 --- a/geom_bottleneck/tests/data/test_760_A +++ /dev/null @@ -1,9 +0,0 @@ -754 1750 -559 782 -889 1821 -897 1093 -380 764 -367 932 -854 1721 -815 1633 -803 939 diff --git a/geom_bottleneck/tests/data/test_760_B b/geom_bottleneck/tests/data/test_760_B deleted file mode 100644 index 1bb3547..0000000 --- a/geom_bottleneck/tests/data/test_760_B +++ /dev/null @@ -1,9 +0,0 @@ -895 1474 -904 1893 -474 832 -238 631 -82 583 -470 797 -461 903 -856 1006 -151 669 diff --git a/geom_bottleneck/tests/data/test_761_A b/geom_bottleneck/tests/data/test_761_A deleted file mode 100644 index 4690752..0000000 --- a/geom_bottleneck/tests/data/test_761_A +++ /dev/null @@ -1,9 +0,0 @@ -377 1284 -139 699 -50 438 -687 919 -35 957 -652 713 -272 1264 -788 1721 -656 1330 diff --git a/geom_bottleneck/tests/data/test_761_B b/geom_bottleneck/tests/data/test_761_B deleted file mode 100644 index 9978d2c..0000000 --- a/geom_bottleneck/tests/data/test_761_B +++ /dev/null @@ -1,9 +0,0 @@ -670 860 -401 500 -127 995 -594 1023 -638 1052 -727 802 -766 1624 -261 880 -172 663 diff --git a/geom_bottleneck/tests/data/test_762_A b/geom_bottleneck/tests/data/test_762_A deleted file mode 100644 index 7918ab6..0000000 --- a/geom_bottleneck/tests/data/test_762_A +++ /dev/null @@ -1,9 +0,0 @@ -457 1270 -23 803 -189 293 -113 500 -911 1041 -504 728 -105 492 -514 1222 -753 923 diff --git a/geom_bottleneck/tests/data/test_762_B b/geom_bottleneck/tests/data/test_762_B deleted file mode 100644 index d36f033..0000000 --- a/geom_bottleneck/tests/data/test_762_B +++ /dev/null @@ -1,9 +0,0 @@ -393 565 -182 184 -852 1821 -702 1558 -157 245 -456 924 -640 1103 -934 1125 -979 1099 diff --git a/geom_bottleneck/tests/data/test_763_A b/geom_bottleneck/tests/data/test_763_A deleted file mode 100644 index 73d90de..0000000 --- a/geom_bottleneck/tests/data/test_763_A +++ /dev/null @@ -1,9 +0,0 @@ -89 776 -785 1157 -846 1324 -854 1048 -968 1721 -653 1216 -707 718 -958 1397 -247 1245 diff --git a/geom_bottleneck/tests/data/test_763_B b/geom_bottleneck/tests/data/test_763_B deleted file mode 100644 index 09d159c..0000000 --- a/geom_bottleneck/tests/data/test_763_B +++ /dev/null @@ -1,9 +0,0 @@ -730 1315 -831 1373 -669 1287 -125 500 -676 1262 -272 524 -173 651 -38 624 -514 1175 diff --git a/geom_bottleneck/tests/data/test_764_A b/geom_bottleneck/tests/data/test_764_A deleted file mode 100644 index 8dead93..0000000 --- a/geom_bottleneck/tests/data/test_764_A +++ /dev/null @@ -1,9 +0,0 @@ -104 150 -837 890 -975 1135 -650 697 -202 393 -972 1174 -619 969 -274 891 -16 366 diff --git a/geom_bottleneck/tests/data/test_764_B b/geom_bottleneck/tests/data/test_764_B deleted file mode 100644 index 014198d..0000000 --- a/geom_bottleneck/tests/data/test_764_B +++ /dev/null @@ -1,9 +0,0 @@ -150 432 -45 234 -8 95 -31 712 -331 1329 -184 531 -44 922 -764 1746 -838 919 diff --git a/geom_bottleneck/tests/data/test_765_A b/geom_bottleneck/tests/data/test_765_A deleted file mode 100644 index 666d2fe..0000000 --- a/geom_bottleneck/tests/data/test_765_A +++ /dev/null @@ -1,9 +0,0 @@ -105 587 -505 1209 -617 651 -120 670 -322 1268 -410 1307 -822 1420 -351 1226 -150 633 diff --git a/geom_bottleneck/tests/data/test_765_B b/geom_bottleneck/tests/data/test_765_B deleted file mode 100644 index c0be6d4..0000000 --- a/geom_bottleneck/tests/data/test_765_B +++ /dev/null @@ -1,9 +0,0 @@ -274 1006 -627 1237 -21 246 -785 1167 -929 1234 -462 904 -539 997 -453 592 -251 513 diff --git a/geom_bottleneck/tests/data/test_766_A b/geom_bottleneck/tests/data/test_766_A deleted file mode 100644 index 48d55d9..0000000 --- a/geom_bottleneck/tests/data/test_766_A +++ /dev/null @@ -1,9 +0,0 @@ -49 532 -799 1331 -372 667 -852 1746 -400 834 -182 499 -889 1775 -831 867 -139 227 diff --git a/geom_bottleneck/tests/data/test_766_B b/geom_bottleneck/tests/data/test_766_B deleted file mode 100644 index 9943c61..0000000 --- a/geom_bottleneck/tests/data/test_766_B +++ /dev/null @@ -1,9 +0,0 @@ -976 1516 -153 908 -103 143 -105 439 -469 744 -981 1387 -267 319 -960 1495 -734 1370 diff --git a/geom_bottleneck/tests/data/test_767_A b/geom_bottleneck/tests/data/test_767_A deleted file mode 100644 index badb767..0000000 --- a/geom_bottleneck/tests/data/test_767_A +++ /dev/null @@ -1,9 +0,0 @@ -244 622 -925 1530 -263 455 -189 991 -342 1273 -266 321 -544 962 -613 1019 -592 791 diff --git a/geom_bottleneck/tests/data/test_767_B b/geom_bottleneck/tests/data/test_767_B deleted file mode 100644 index 3eb4c39..0000000 --- a/geom_bottleneck/tests/data/test_767_B +++ /dev/null @@ -1,9 +0,0 @@ -928 1479 -80 1065 -382 1056 -679 880 -307 891 -685 1466 -278 806 -501 1479 -126 271 diff --git a/geom_bottleneck/tests/data/test_768_A b/geom_bottleneck/tests/data/test_768_A deleted file mode 100644 index 69b6425..0000000 --- a/geom_bottleneck/tests/data/test_768_A +++ /dev/null @@ -1,9 +0,0 @@ -674 1590 -745 1289 -854 1215 -412 627 -538 992 -135 1053 -385 594 -354 569 -702 1010 diff --git a/geom_bottleneck/tests/data/test_768_B b/geom_bottleneck/tests/data/test_768_B deleted file mode 100644 index a0e8eb0..0000000 --- a/geom_bottleneck/tests/data/test_768_B +++ /dev/null @@ -1,9 +0,0 @@ -735 1627 -423 514 -524 1236 -377 412 -372 415 -873 1835 -719 1488 -828 1361 -160 705 diff --git a/geom_bottleneck/tests/data/test_769_A b/geom_bottleneck/tests/data/test_769_A deleted file mode 100644 index 08a46bd..0000000 --- a/geom_bottleneck/tests/data/test_769_A +++ /dev/null @@ -1,9 +0,0 @@ -930 1077 -466 1159 -305 866 -672 1003 -970 1824 -774 1212 -454 611 -702 944 -979 1136 diff --git a/geom_bottleneck/tests/data/test_769_B b/geom_bottleneck/tests/data/test_769_B deleted file mode 100644 index ce18190..0000000 --- a/geom_bottleneck/tests/data/test_769_B +++ /dev/null @@ -1,9 +0,0 @@ -293 996 -973 1865 -346 753 -897 1337 -58 1055 -35 647 -892 1158 -59 174 -342 1131 diff --git a/geom_bottleneck/tests/data/test_770_A b/geom_bottleneck/tests/data/test_770_A deleted file mode 100644 index edfdf26..0000000 --- a/geom_bottleneck/tests/data/test_770_A +++ /dev/null @@ -1,9 +0,0 @@ -61 130 -770 1196 -740 778 -985 1720 -131 208 -740 1516 -798 1185 -609 1141 -159 389 diff --git a/geom_bottleneck/tests/data/test_770_B b/geom_bottleneck/tests/data/test_770_B deleted file mode 100644 index cd59228..0000000 --- a/geom_bottleneck/tests/data/test_770_B +++ /dev/null @@ -1,9 +0,0 @@ -815 1216 -229 652 -696 1309 -585 1011 -882 1621 -398 670 -931 1271 -988 1333 -197 1110 diff --git a/geom_bottleneck/tests/data/test_771_A b/geom_bottleneck/tests/data/test_771_A deleted file mode 100644 index 9c3f4ba..0000000 --- a/geom_bottleneck/tests/data/test_771_A +++ /dev/null @@ -1,9 +0,0 @@ -186 373 -378 642 -448 1022 -866 911 -706 1637 -528 950 -150 216 -327 506 -898 1366 diff --git a/geom_bottleneck/tests/data/test_771_B b/geom_bottleneck/tests/data/test_771_B deleted file mode 100644 index 8c07a06..0000000 --- a/geom_bottleneck/tests/data/test_771_B +++ /dev/null @@ -1,9 +0,0 @@ -968 1807 -686 1584 -296 347 -695 1143 -614 1205 -310 502 -249 694 -420 457 -743 1113 diff --git a/geom_bottleneck/tests/data/test_772_A b/geom_bottleneck/tests/data/test_772_A deleted file mode 100644 index 034ed92..0000000 --- a/geom_bottleneck/tests/data/test_772_A +++ /dev/null @@ -1,9 +0,0 @@ -286 399 -38 700 -884 1344 -201 1085 -285 1278 -661 901 -921 966 -3 728 -237 982 diff --git a/geom_bottleneck/tests/data/test_772_B b/geom_bottleneck/tests/data/test_772_B deleted file mode 100644 index bc29bff..0000000 --- a/geom_bottleneck/tests/data/test_772_B +++ /dev/null @@ -1,9 +0,0 @@ -148 440 -806 1799 -886 1586 -363 1211 -316 683 -229 766 -839 1204 -245 685 -43 841 diff --git a/geom_bottleneck/tests/data/test_773_A b/geom_bottleneck/tests/data/test_773_A deleted file mode 100644 index 0601e04..0000000 --- a/geom_bottleneck/tests/data/test_773_A +++ /dev/null @@ -1,9 +0,0 @@ -796 1034 -635 1409 -52 141 -974 1000 -341 800 -727 820 -343 1278 -138 153 -446 823 diff --git a/geom_bottleneck/tests/data/test_773_B b/geom_bottleneck/tests/data/test_773_B deleted file mode 100644 index 004d2d6..0000000 --- a/geom_bottleneck/tests/data/test_773_B +++ /dev/null @@ -1,9 +0,0 @@ -327 384 -214 341 -815 1156 -868 1138 -369 392 -351 1162 -829 1594 -618 783 -47 656 diff --git a/geom_bottleneck/tests/data/test_774_A b/geom_bottleneck/tests/data/test_774_A deleted file mode 100644 index 3e211a0..0000000 --- a/geom_bottleneck/tests/data/test_774_A +++ /dev/null @@ -1,9 +0,0 @@ -833 1408 -738 1321 -731 825 -670 795 -458 1062 -777 1262 -719 1131 -979 1366 -350 1290 diff --git a/geom_bottleneck/tests/data/test_774_B b/geom_bottleneck/tests/data/test_774_B deleted file mode 100644 index 3cf3985..0000000 --- a/geom_bottleneck/tests/data/test_774_B +++ /dev/null @@ -1,9 +0,0 @@ -421 1393 -851 1666 -633 1458 -560 1168 -936 1833 -855 1548 -275 1067 -899 1767 -539 947 diff --git a/geom_bottleneck/tests/data/test_775_A b/geom_bottleneck/tests/data/test_775_A deleted file mode 100644 index 5676eb4..0000000 --- a/geom_bottleneck/tests/data/test_775_A +++ /dev/null @@ -1,9 +0,0 @@ -210 651 -529 1257 -998 1304 -957 1816 -624 800 -200 460 -319 1051 -422 962 -642 1439 diff --git a/geom_bottleneck/tests/data/test_775_B b/geom_bottleneck/tests/data/test_775_B deleted file mode 100644 index 5c4e8bc..0000000 --- a/geom_bottleneck/tests/data/test_775_B +++ /dev/null @@ -1,9 +0,0 @@ -652 1315 -419 981 -912 1832 -578 1215 -317 992 -785 1422 -528 664 -968 1344 -847 993 diff --git a/geom_bottleneck/tests/data/test_776_A b/geom_bottleneck/tests/data/test_776_A deleted file mode 100644 index 49370ff..0000000 --- a/geom_bottleneck/tests/data/test_776_A +++ /dev/null @@ -1,9 +0,0 @@ -707 768 -983 1893 -386 786 -370 914 -45 501 -625 1184 -175 1073 -262 1227 -819 1257 diff --git a/geom_bottleneck/tests/data/test_776_B b/geom_bottleneck/tests/data/test_776_B deleted file mode 100644 index 575a2d9..0000000 --- a/geom_bottleneck/tests/data/test_776_B +++ /dev/null @@ -1,9 +0,0 @@ -949 1560 -757 1176 -689 1184 -819 1333 -50 884 -872 1695 -992 1145 -909 1889 -516 1376 diff --git a/geom_bottleneck/tests/data/test_777_A b/geom_bottleneck/tests/data/test_777_A deleted file mode 100644 index eb1c980..0000000 --- a/geom_bottleneck/tests/data/test_777_A +++ /dev/null @@ -1,9 +0,0 @@ -958 1247 -143 570 -463 1343 -347 1346 -640 1203 -923 964 -489 701 -712 837 -616 978 diff --git a/geom_bottleneck/tests/data/test_777_B b/geom_bottleneck/tests/data/test_777_B deleted file mode 100644 index eb9c8ee..0000000 --- a/geom_bottleneck/tests/data/test_777_B +++ /dev/null @@ -1,9 +0,0 @@ -781 1080 -494 1278 -123 159 -936 1305 -748 1302 -271 524 -37 953 -758 946 -182 670 diff --git a/geom_bottleneck/tests/data/test_778_A b/geom_bottleneck/tests/data/test_778_A deleted file mode 100644 index 8392b2a..0000000 --- a/geom_bottleneck/tests/data/test_778_A +++ /dev/null @@ -1,9 +0,0 @@ -544 1145 -371 1278 -417 814 -694 1566 -443 1104 -710 827 -617 714 -286 503 -191 568 diff --git a/geom_bottleneck/tests/data/test_778_B b/geom_bottleneck/tests/data/test_778_B deleted file mode 100644 index 017b08d..0000000 --- a/geom_bottleneck/tests/data/test_778_B +++ /dev/null @@ -1,9 +0,0 @@ -746 1177 -291 727 -956 1929 -255 294 -938 1415 -564 1206 -657 1586 -499 1013 -67 1035 diff --git a/geom_bottleneck/tests/data/test_779_A b/geom_bottleneck/tests/data/test_779_A deleted file mode 100644 index 221d574..0000000 --- a/geom_bottleneck/tests/data/test_779_A +++ /dev/null @@ -1,9 +0,0 @@ -771 1728 -948 1405 -842 1792 -956 1247 -194 841 -152 1145 -683 1458 -854 1851 -817 864 diff --git a/geom_bottleneck/tests/data/test_779_B b/geom_bottleneck/tests/data/test_779_B deleted file mode 100644 index 113003e..0000000 --- a/geom_bottleneck/tests/data/test_779_B +++ /dev/null @@ -1,9 +0,0 @@ -911 955 -410 1292 -972 1259 -128 1011 -362 591 -827 834 -677 1611 -783 1570 -844 1426 diff --git a/geom_bottleneck/tests/data/test_780_A b/geom_bottleneck/tests/data/test_780_A deleted file mode 100644 index 3d9a22c..0000000 --- a/geom_bottleneck/tests/data/test_780_A +++ /dev/null @@ -1,10 +0,0 @@ -183 274 -354 862 -922 1354 -560 1351 -235 292 -695 1560 -29 997 -962 1865 -141 1080 -827 1101 diff --git a/geom_bottleneck/tests/data/test_780_B b/geom_bottleneck/tests/data/test_780_B deleted file mode 100644 index defbae9..0000000 --- a/geom_bottleneck/tests/data/test_780_B +++ /dev/null @@ -1,10 +0,0 @@ -42 318 -758 1669 -351 1022 -824 1415 -902 1400 -515 576 -260 586 -28 176 -469 1338 -909 1379 diff --git a/geom_bottleneck/tests/data/test_781_A b/geom_bottleneck/tests/data/test_781_A deleted file mode 100644 index 72201a7..0000000 --- a/geom_bottleneck/tests/data/test_781_A +++ /dev/null @@ -1,10 +0,0 @@ -329 554 -888 1476 -129 806 -786 990 -328 727 -574 1226 -864 1378 -61 561 -154 823 -922 1810 diff --git a/geom_bottleneck/tests/data/test_781_B b/geom_bottleneck/tests/data/test_781_B deleted file mode 100644 index 85c8683..0000000 --- a/geom_bottleneck/tests/data/test_781_B +++ /dev/null @@ -1,10 +0,0 @@ -193 306 -784 949 -446 467 -830 891 -36 174 -28 1028 -135 1113 -689 737 -598 669 -808 1618 diff --git a/geom_bottleneck/tests/data/test_782_A b/geom_bottleneck/tests/data/test_782_A deleted file mode 100644 index b376509..0000000 --- a/geom_bottleneck/tests/data/test_782_A +++ /dev/null @@ -1,10 +0,0 @@ -488 967 -298 299 -687 942 -225 1184 -375 467 -17 355 -165 658 -911 1012 -970 1538 -26 194 diff --git a/geom_bottleneck/tests/data/test_782_B b/geom_bottleneck/tests/data/test_782_B deleted file mode 100644 index 9fba291..0000000 --- a/geom_bottleneck/tests/data/test_782_B +++ /dev/null @@ -1,10 +0,0 @@ -191 1062 -253 1153 -930 1745 -736 1486 -274 503 -830 1830 -769 865 -33 921 -160 304 -229 1012 diff --git a/geom_bottleneck/tests/data/test_783_A b/geom_bottleneck/tests/data/test_783_A deleted file mode 100644 index 83593db..0000000 --- a/geom_bottleneck/tests/data/test_783_A +++ /dev/null @@ -1,10 +0,0 @@ -575 1393 -206 817 -209 288 -181 466 -796 861 -885 1340 -110 346 -18 946 -769 1139 -422 1212 diff --git a/geom_bottleneck/tests/data/test_783_B b/geom_bottleneck/tests/data/test_783_B deleted file mode 100644 index d169a48..0000000 --- a/geom_bottleneck/tests/data/test_783_B +++ /dev/null @@ -1,10 +0,0 @@ -810 1113 -997 1451 -205 1095 -621 1281 -677 1326 -911 1262 -395 916 -224 882 -708 812 -82 824 diff --git a/geom_bottleneck/tests/data/test_784_A b/geom_bottleneck/tests/data/test_784_A deleted file mode 100644 index b10df8b..0000000 --- a/geom_bottleneck/tests/data/test_784_A +++ /dev/null @@ -1,10 +0,0 @@ -963 1352 -692 1376 -910 967 -668 831 -840 962 -348 424 -729 1606 -417 514 -350 871 -289 298 diff --git a/geom_bottleneck/tests/data/test_784_B b/geom_bottleneck/tests/data/test_784_B deleted file mode 100644 index ef2b466..0000000 --- a/geom_bottleneck/tests/data/test_784_B +++ /dev/null @@ -1,10 +0,0 @@ -754 955 -100 1075 -199 738 -800 1132 -419 949 -729 969 -774 941 -559 1196 -692 1096 -741 1061 diff --git a/geom_bottleneck/tests/data/test_785_A b/geom_bottleneck/tests/data/test_785_A deleted file mode 100644 index 3cdfaba..0000000 --- a/geom_bottleneck/tests/data/test_785_A +++ /dev/null @@ -1,10 +0,0 @@ -797 970 -423 870 -289 692 -856 1132 -465 1409 -521 977 -322 545 -137 608 -934 1682 -77 959 diff --git a/geom_bottleneck/tests/data/test_785_B b/geom_bottleneck/tests/data/test_785_B deleted file mode 100644 index 32fe176..0000000 --- a/geom_bottleneck/tests/data/test_785_B +++ /dev/null @@ -1,10 +0,0 @@ -554 985 -793 1614 -915 1231 -215 790 -410 1181 -290 830 -733 1352 -717 829 -37 152 -989 1971 diff --git a/geom_bottleneck/tests/data/test_786_A b/geom_bottleneck/tests/data/test_786_A deleted file mode 100644 index 2d9fcec..0000000 --- a/geom_bottleneck/tests/data/test_786_A +++ /dev/null @@ -1,10 +0,0 @@ -274 873 -62 804 -282 663 -517 1295 -906 921 -967 1806 -724 1674 -976 1641 -923 1492 -529 1316 diff --git a/geom_bottleneck/tests/data/test_786_B b/geom_bottleneck/tests/data/test_786_B deleted file mode 100644 index 417ee4b..0000000 --- a/geom_bottleneck/tests/data/test_786_B +++ /dev/null @@ -1,10 +0,0 @@ -185 563 -774 1322 -467 499 -627 1251 -193 228 -528 1146 -957 1286 -882 891 -271 1024 -43 489 diff --git a/geom_bottleneck/tests/data/test_787_A b/geom_bottleneck/tests/data/test_787_A deleted file mode 100644 index 7c056b6..0000000 --- a/geom_bottleneck/tests/data/test_787_A +++ /dev/null @@ -1,10 +0,0 @@ -297 511 -275 457 -251 1094 -824 1027 -872 1563 -842 1711 -841 1094 -732 1633 -82 105 -397 900 diff --git a/geom_bottleneck/tests/data/test_787_B b/geom_bottleneck/tests/data/test_787_B deleted file mode 100644 index ddc126a..0000000 --- a/geom_bottleneck/tests/data/test_787_B +++ /dev/null @@ -1,10 +0,0 @@ -152 438 -370 689 -859 1398 -697 1574 -294 635 -414 1138 -656 1516 -543 800 -260 902 -55 193 diff --git a/geom_bottleneck/tests/data/test_788_A b/geom_bottleneck/tests/data/test_788_A deleted file mode 100644 index 61a58b0..0000000 --- a/geom_bottleneck/tests/data/test_788_A +++ /dev/null @@ -1,10 +0,0 @@ -820 1238 -143 789 -0 482 -20 414 -838 1690 -810 1160 -178 978 -963 1890 -852 1293 -399 609 diff --git a/geom_bottleneck/tests/data/test_788_B b/geom_bottleneck/tests/data/test_788_B deleted file mode 100644 index d0782d9..0000000 --- a/geom_bottleneck/tests/data/test_788_B +++ /dev/null @@ -1,10 +0,0 @@ -608 1470 -780 828 -436 513 -373 703 -950 1343 -608 949 -996 1248 -400 407 -911 1501 -660 1273 diff --git a/geom_bottleneck/tests/data/test_789_A b/geom_bottleneck/tests/data/test_789_A deleted file mode 100644 index 4805534..0000000 --- a/geom_bottleneck/tests/data/test_789_A +++ /dev/null @@ -1,10 +0,0 @@ -354 1062 -357 491 -915 1394 -385 1352 -461 585 -612 1103 -229 327 -741 1148 -572 1245 -399 863 diff --git a/geom_bottleneck/tests/data/test_789_B b/geom_bottleneck/tests/data/test_789_B deleted file mode 100644 index 808dab9..0000000 --- a/geom_bottleneck/tests/data/test_789_B +++ /dev/null @@ -1,10 +0,0 @@ -806 1352 -254 492 -202 1049 -571 1363 -359 1262 -828 1364 -123 603 -50 581 -502 1455 -218 1133 diff --git a/geom_bottleneck/tests/data/test_790_A b/geom_bottleneck/tests/data/test_790_A deleted file mode 100644 index 231f25c..0000000 --- a/geom_bottleneck/tests/data/test_790_A +++ /dev/null @@ -1,10 +0,0 @@ -411 1365 -920 965 -799 1463 -516 980 -775 1260 -48 353 -828 978 -166 1166 -391 992 -580 970 diff --git a/geom_bottleneck/tests/data/test_790_B b/geom_bottleneck/tests/data/test_790_B deleted file mode 100644 index 0892cfe..0000000 --- a/geom_bottleneck/tests/data/test_790_B +++ /dev/null @@ -1,10 +0,0 @@ -145 299 -605 1499 -534 1303 -440 1163 -628 1355 -2 71 -902 1181 -376 490 -696 1515 -24 40 diff --git a/geom_bottleneck/tests/data/test_791_A b/geom_bottleneck/tests/data/test_791_A deleted file mode 100644 index e12631e..0000000 --- a/geom_bottleneck/tests/data/test_791_A +++ /dev/null @@ -1,10 +0,0 @@ -806 943 -568 1238 -44 633 -424 491 -361 1057 -583 1403 -754 1333 -843 1653 -512 1431 -768 1390 diff --git a/geom_bottleneck/tests/data/test_791_B b/geom_bottleneck/tests/data/test_791_B deleted file mode 100644 index 62aa958..0000000 --- a/geom_bottleneck/tests/data/test_791_B +++ /dev/null @@ -1,10 +0,0 @@ -850 1256 -138 1008 -948 1188 -914 1911 -659 1270 -375 986 -994 1160 -835 863 -73 849 -756 1456 diff --git a/geom_bottleneck/tests/data/test_792_A b/geom_bottleneck/tests/data/test_792_A deleted file mode 100644 index 3b73b46..0000000 --- a/geom_bottleneck/tests/data/test_792_A +++ /dev/null @@ -1,10 +0,0 @@ -610 1074 -927 1375 -497 992 -277 1026 -978 1640 -244 290 -299 814 -80 476 -599 1512 -793 824 diff --git a/geom_bottleneck/tests/data/test_792_B b/geom_bottleneck/tests/data/test_792_B deleted file mode 100644 index 517ff30..0000000 --- a/geom_bottleneck/tests/data/test_792_B +++ /dev/null @@ -1,10 +0,0 @@ -531 1350 -371 1273 -498 546 -487 1299 -347 1067 -638 1257 -205 802 -240 658 -1 249 -147 878 diff --git a/geom_bottleneck/tests/data/test_793_A b/geom_bottleneck/tests/data/test_793_A deleted file mode 100644 index d9b85ae..0000000 --- a/geom_bottleneck/tests/data/test_793_A +++ /dev/null @@ -1,10 +0,0 @@ -267 566 -193 1014 -348 534 -640 670 -795 1157 -752 1273 -439 1172 -254 687 -959 1954 -408 1084 diff --git a/geom_bottleneck/tests/data/test_793_B b/geom_bottleneck/tests/data/test_793_B deleted file mode 100644 index 66180dd..0000000 --- a/geom_bottleneck/tests/data/test_793_B +++ /dev/null @@ -1,10 +0,0 @@ -751 1576 -410 1090 -288 1200 -430 1222 -988 1576 -152 1095 -583 596 -799 1296 -828 1022 -217 956 diff --git a/geom_bottleneck/tests/data/test_794_A b/geom_bottleneck/tests/data/test_794_A deleted file mode 100644 index 3d5401c..0000000 --- a/geom_bottleneck/tests/data/test_794_A +++ /dev/null @@ -1,10 +0,0 @@ -1 160 -264 1182 -662 1435 -659 892 -47 845 -383 744 -773 1409 -895 906 -152 735 -344 870 diff --git a/geom_bottleneck/tests/data/test_794_B b/geom_bottleneck/tests/data/test_794_B deleted file mode 100644 index 26be9a3..0000000 --- a/geom_bottleneck/tests/data/test_794_B +++ /dev/null @@ -1,10 +0,0 @@ -607 934 -865 900 -339 349 -888 1238 -981 1281 -1 554 -514 627 -77 1040 -911 1850 -276 1178 diff --git a/geom_bottleneck/tests/data/test_795_A b/geom_bottleneck/tests/data/test_795_A deleted file mode 100644 index 7c73f4d..0000000 --- a/geom_bottleneck/tests/data/test_795_A +++ /dev/null @@ -1,10 +0,0 @@ -494 905 -440 1385 -496 955 -162 1027 -237 421 -873 1102 -349 1346 -470 880 -364 822 -869 1335 diff --git a/geom_bottleneck/tests/data/test_795_B b/geom_bottleneck/tests/data/test_795_B deleted file mode 100644 index afc371b..0000000 --- a/geom_bottleneck/tests/data/test_795_B +++ /dev/null @@ -1,10 +0,0 @@ -22 509 -741 1484 -558 982 -862 1077 -856 1695 -4 100 -995 1304 -103 990 -64 439 -883 1258 diff --git a/geom_bottleneck/tests/data/test_796_A b/geom_bottleneck/tests/data/test_796_A deleted file mode 100644 index a326a52..0000000 --- a/geom_bottleneck/tests/data/test_796_A +++ /dev/null @@ -1,10 +0,0 @@ -16 636 -823 1691 -880 1198 -967 1441 -501 745 -318 427 -177 192 -944 1596 -229 458 -570 1267 diff --git a/geom_bottleneck/tests/data/test_796_B b/geom_bottleneck/tests/data/test_796_B deleted file mode 100644 index 86d2cf9..0000000 --- a/geom_bottleneck/tests/data/test_796_B +++ /dev/null @@ -1,10 +0,0 @@ -240 255 -28 64 -713 1016 -577 662 -838 1674 -41 365 -889 1477 -1000 1767 -58 393 -870 1574 diff --git a/geom_bottleneck/tests/data/test_797_A b/geom_bottleneck/tests/data/test_797_A deleted file mode 100644 index b5149bf..0000000 --- a/geom_bottleneck/tests/data/test_797_A +++ /dev/null @@ -1,10 +0,0 @@ -258 711 -970 1782 -725 883 -626 1199 -785 1502 -713 820 -754 1570 -311 1068 -866 1364 -50 713 diff --git a/geom_bottleneck/tests/data/test_797_B b/geom_bottleneck/tests/data/test_797_B deleted file mode 100644 index 45ba81b..0000000 --- a/geom_bottleneck/tests/data/test_797_B +++ /dev/null @@ -1,10 +0,0 @@ -381 1350 -844 1724 -531 1460 -472 1208 -659 914 -745 757 -627 1608 -69 357 -298 621 -100 760 diff --git a/geom_bottleneck/tests/data/test_798_A b/geom_bottleneck/tests/data/test_798_A deleted file mode 100644 index a053ddd..0000000 --- a/geom_bottleneck/tests/data/test_798_A +++ /dev/null @@ -1,10 +0,0 @@ -153 558 -364 847 -444 1083 -994 1375 -728 1585 -495 1005 -47 431 -361 1262 -645 646 -816 1742 diff --git a/geom_bottleneck/tests/data/test_798_B b/geom_bottleneck/tests/data/test_798_B deleted file mode 100644 index 69c921b..0000000 --- a/geom_bottleneck/tests/data/test_798_B +++ /dev/null @@ -1,10 +0,0 @@ -416 985 -449 995 -832 1102 -550 775 -367 614 -393 458 -340 890 -264 955 -10 50 -834 1137 diff --git a/geom_bottleneck/tests/data/test_799_A b/geom_bottleneck/tests/data/test_799_A deleted file mode 100644 index 374e56a..0000000 --- a/geom_bottleneck/tests/data/test_799_A +++ /dev/null @@ -1,10 +0,0 @@ -40 603 -309 973 -679 1580 -219 675 -92 934 -537 1366 -63 461 -408 807 -983 1016 -176 789 diff --git a/geom_bottleneck/tests/data/test_799_B b/geom_bottleneck/tests/data/test_799_B deleted file mode 100644 index f92c370..0000000 --- a/geom_bottleneck/tests/data/test_799_B +++ /dev/null @@ -1,10 +0,0 @@ -312 772 -963 1630 -613 920 -597 1153 -941 1187 -150 434 -269 804 -885 887 -649 881 -618 973 diff --git a/geom_bottleneck/tests/data/test_800_A b/geom_bottleneck/tests/data/test_800_A deleted file mode 100644 index 36aab61..0000000 --- a/geom_bottleneck/tests/data/test_800_A +++ /dev/null @@ -1,20 +0,0 @@ -729 1257 -887 1370 -876 1762 -569 878 -13 393 -287 1169 -720 899 -338 892 -594 1438 -248 1204 -315 985 -796 1645 -730 1605 -323 490 -470 1454 -285 1067 -215 757 -92 325 -866 869 -899 1630 diff --git a/geom_bottleneck/tests/data/test_800_B b/geom_bottleneck/tests/data/test_800_B deleted file mode 100644 index 2496bcb..0000000 --- a/geom_bottleneck/tests/data/test_800_B +++ /dev/null @@ -1,20 +0,0 @@ -961 1808 -251 958 -152 851 -834 1250 -727 1719 -968 1220 -107 206 -564 1423 -475 1438 -884 1174 -928 1303 -39 708 -854 1539 -825 1094 -614 989 -281 856 -445 1141 -784 1664 -657 969 -154 1026 diff --git a/geom_bottleneck/tests/data/test_801_A b/geom_bottleneck/tests/data/test_801_A deleted file mode 100644 index 66ed176..0000000 --- a/geom_bottleneck/tests/data/test_801_A +++ /dev/null @@ -1,20 +0,0 @@ -823 1484 -877 1798 -158 361 -59 670 -365 636 -536 831 -669 1574 -51 690 -243 1047 -579 1472 -450 618 -478 706 -850 1720 -10 822 -502 1081 -815 833 -192 629 -745 909 -936 1924 -619 1215 diff --git a/geom_bottleneck/tests/data/test_801_B b/geom_bottleneck/tests/data/test_801_B deleted file mode 100644 index 4376fcf..0000000 --- a/geom_bottleneck/tests/data/test_801_B +++ /dev/null @@ -1,20 +0,0 @@ -911 924 -564 1044 -939 1177 -226 536 -692 1241 -931 1421 -750 767 -427 630 -594 1388 -751 1751 -933 1190 -379 1220 -63 623 -79 190 -650 993 -508 1351 -961 1710 -619 863 -548 1358 -727 1515 diff --git a/geom_bottleneck/tests/data/test_802_A b/geom_bottleneck/tests/data/test_802_A deleted file mode 100644 index 6bfdeda..0000000 --- a/geom_bottleneck/tests/data/test_802_A +++ /dev/null @@ -1,20 +0,0 @@ -63 288 -994 1416 -92 461 -241 742 -325 877 -466 925 -923 1215 -941 1044 -618 1396 -248 1066 -383 442 -583 1016 -947 1095 -186 602 -291 448 -339 384 -467 1107 -771 942 -92 794 -2 533 diff --git a/geom_bottleneck/tests/data/test_802_B b/geom_bottleneck/tests/data/test_802_B deleted file mode 100644 index eaec985..0000000 --- a/geom_bottleneck/tests/data/test_802_B +++ /dev/null @@ -1,20 +0,0 @@ -350 416 -143 1004 -710 1425 -665 1101 -828 1491 -80 449 -977 1801 -497 509 -664 700 -405 670 -688 1502 -102 938 -893 1437 -245 728 -626 1333 -526 1473 -914 1253 -96 268 -693 1302 -982 1487 diff --git a/geom_bottleneck/tests/data/test_803_A b/geom_bottleneck/tests/data/test_803_A deleted file mode 100644 index 501248d..0000000 --- a/geom_bottleneck/tests/data/test_803_A +++ /dev/null @@ -1,20 +0,0 @@ -553 1373 -92 606 -892 1104 -804 1697 -653 953 -421 824 -670 1420 -621 1196 -912 1889 -482 1161 -381 691 -192 1146 -592 670 -920 1293 -754 1475 -217 379 -584 1551 -168 463 -212 251 -303 469 diff --git a/geom_bottleneck/tests/data/test_803_B b/geom_bottleneck/tests/data/test_803_B deleted file mode 100644 index 42dadd9..0000000 --- a/geom_bottleneck/tests/data/test_803_B +++ /dev/null @@ -1,20 +0,0 @@ -252 701 -398 718 -663 871 -257 475 -998 1850 -292 587 -813 1363 -374 757 -295 749 -405 607 -21 374 -489 1313 -975 1840 -773 1423 -204 693 -149 532 -57 191 -307 618 -509 1109 -308 350 diff --git a/geom_bottleneck/tests/data/test_804_A b/geom_bottleneck/tests/data/test_804_A deleted file mode 100644 index 6af9294..0000000 --- a/geom_bottleneck/tests/data/test_804_A +++ /dev/null @@ -1,20 +0,0 @@ -518 993 -44 915 -674 768 -122 870 -394 839 -631 1285 -805 1491 -521 802 -456 474 -450 1083 -555 1280 -858 1839 -131 144 -361 953 -600 985 -158 537 -771 1062 -286 1285 -168 397 -748 1722 diff --git a/geom_bottleneck/tests/data/test_804_B b/geom_bottleneck/tests/data/test_804_B deleted file mode 100644 index 8470b65..0000000 --- a/geom_bottleneck/tests/data/test_804_B +++ /dev/null @@ -1,20 +0,0 @@ -132 843 -202 982 -374 1118 -9 980 -843 852 -537 761 -645 656 -882 1627 -51 619 -217 926 -870 1398 -87 1080 -223 1189 -160 379 -406 561 -536 1522 -353 487 -312 1180 -526 1492 -249 823 diff --git a/geom_bottleneck/tests/data/test_805_A b/geom_bottleneck/tests/data/test_805_A deleted file mode 100644 index 45a3198..0000000 --- a/geom_bottleneck/tests/data/test_805_A +++ /dev/null @@ -1,20 +0,0 @@ -350 546 -268 1153 -401 757 -503 848 -981 1709 -161 948 -688 1661 -234 471 -397 801 -433 1024 -942 1394 -308 969 -32 690 -797 1248 -182 407 -714 1267 -577 1209 -775 919 -140 976 -366 1300 diff --git a/geom_bottleneck/tests/data/test_805_B b/geom_bottleneck/tests/data/test_805_B deleted file mode 100644 index 4967cfd..0000000 --- a/geom_bottleneck/tests/data/test_805_B +++ /dev/null @@ -1,20 +0,0 @@ -330 1222 -792 1359 -905 1402 -933 1482 -322 933 -440 887 -672 1438 -849 1650 -264 794 -21 219 -437 593 -159 598 -466 675 -712 1347 -566 1363 -244 382 -374 520 -729 1295 -998 1116 -954 1362 diff --git a/geom_bottleneck/tests/data/test_806_A b/geom_bottleneck/tests/data/test_806_A deleted file mode 100644 index 8eb1e33..0000000 --- a/geom_bottleneck/tests/data/test_806_A +++ /dev/null @@ -1,20 +0,0 @@ -909 1049 -241 667 -928 1287 -838 1606 -159 1145 -395 714 -445 804 -897 1289 -770 1108 -649 714 -643 684 -436 561 -125 637 -704 856 -738 913 -478 1206 -396 1306 -106 213 -840 929 -320 1037 diff --git a/geom_bottleneck/tests/data/test_806_B b/geom_bottleneck/tests/data/test_806_B deleted file mode 100644 index 27727b2..0000000 --- a/geom_bottleneck/tests/data/test_806_B +++ /dev/null @@ -1,20 +0,0 @@ -342 756 -736 1334 -769 1194 -352 967 -165 282 -209 306 -977 1040 -385 604 -141 566 -458 884 -186 477 -869 1651 -143 850 -742 1329 -212 872 -445 1214 -864 870 -836 1772 -534 1338 -338 1244 diff --git a/geom_bottleneck/tests/data/test_807_A b/geom_bottleneck/tests/data/test_807_A deleted file mode 100644 index 4979b7d..0000000 --- a/geom_bottleneck/tests/data/test_807_A +++ /dev/null @@ -1,20 +0,0 @@ -657 1104 -391 1193 -374 1227 -9 94 -458 555 -982 1529 -840 920 -831 1039 -468 1180 -912 1687 -988 1717 -33 324 -577 639 -426 1103 -733 1096 -41 421 -376 784 -823 1180 -389 1204 -788 1243 diff --git a/geom_bottleneck/tests/data/test_807_B b/geom_bottleneck/tests/data/test_807_B deleted file mode 100644 index 67610cb..0000000 --- a/geom_bottleneck/tests/data/test_807_B +++ /dev/null @@ -1,20 +0,0 @@ -295 1223 -755 1585 -860 1191 -281 873 -86 1000 -508 1264 -16 594 -616 747 -522 1196 -34 270 -422 1196 -22 801 -812 947 -91 517 -233 586 -167 475 -173 233 -130 807 -764 1691 -942 1622 diff --git a/geom_bottleneck/tests/data/test_808_A b/geom_bottleneck/tests/data/test_808_A deleted file mode 100644 index b35d354..0000000 --- a/geom_bottleneck/tests/data/test_808_A +++ /dev/null @@ -1,20 +0,0 @@ -395 768 -234 477 -627 1516 -353 1158 -108 195 -399 496 -787 1246 -330 553 -840 1835 -474 947 -736 1100 -248 381 -559 575 -716 1583 -873 1336 -927 1293 -857 1611 -691 1202 -293 770 -27 585 diff --git a/geom_bottleneck/tests/data/test_808_B b/geom_bottleneck/tests/data/test_808_B deleted file mode 100644 index fb783cb..0000000 --- a/geom_bottleneck/tests/data/test_808_B +++ /dev/null @@ -1,20 +0,0 @@ -801 1397 -119 551 -305 964 -706 1119 -586 1050 -925 1532 -595 1000 -898 1753 -491 699 -450 802 -499 1011 -180 468 -616 768 -179 901 -89 144 -828 1466 -927 1852 -151 584 -213 997 -952 1055 diff --git a/geom_bottleneck/tests/data/test_809_A b/geom_bottleneck/tests/data/test_809_A deleted file mode 100644 index e578429..0000000 --- a/geom_bottleneck/tests/data/test_809_A +++ /dev/null @@ -1,20 +0,0 @@ -512 1083 -60 706 -61 93 -413 1076 -277 298 -766 1458 -984 1052 -762 1727 -356 422 -263 655 -605 968 -422 1373 -174 1033 -983 1676 -666 1005 -179 336 -553 1267 -987 1269 -756 1753 -842 1754 diff --git a/geom_bottleneck/tests/data/test_809_B b/geom_bottleneck/tests/data/test_809_B deleted file mode 100644 index e4deda8..0000000 --- a/geom_bottleneck/tests/data/test_809_B +++ /dev/null @@ -1,20 +0,0 @@ -178 1010 -727 738 -812 1638 -893 1821 -41 650 -797 1295 -174 473 -389 1244 -289 601 -626 1188 -890 1646 -296 318 -861 1582 -860 1410 -670 1574 -310 813 -186 263 -886 1796 -263 760 -396 1314 diff --git a/geom_bottleneck/tests/data/test_810_A b/geom_bottleneck/tests/data/test_810_A deleted file mode 100644 index b7da658..0000000 --- a/geom_bottleneck/tests/data/test_810_A +++ /dev/null @@ -1,20 +0,0 @@ -843 1230 -289 770 -614 776 -512 987 -326 1253 -651 932 -827 839 -945 1361 -492 706 -312 1139 -463 1394 -68 1045 -229 1200 -126 898 -494 1095 -893 1824 -548 889 -45 952 -136 725 -304 1154 diff --git a/geom_bottleneck/tests/data/test_810_B b/geom_bottleneck/tests/data/test_810_B deleted file mode 100644 index 06e2af4..0000000 --- a/geom_bottleneck/tests/data/test_810_B +++ /dev/null @@ -1,20 +0,0 @@ -207 249 -374 690 -287 677 -566 817 -875 1590 -570 1096 -34 543 -344 801 -31 796 -681 1566 -402 835 -404 906 -754 1339 -96 514 -549 1065 -874 1762 -935 1530 -368 1331 -465 831 -890 1413 diff --git a/geom_bottleneck/tests/data/test_811_A b/geom_bottleneck/tests/data/test_811_A deleted file mode 100644 index 708fc33..0000000 --- a/geom_bottleneck/tests/data/test_811_A +++ /dev/null @@ -1,20 +0,0 @@ -605 650 -57 484 -621 641 -794 1393 -951 1609 -132 656 -639 1132 -419 967 -741 1547 -105 466 -306 1270 -827 1475 -260 376 -418 1180 -458 1136 -957 1237 -363 749 -742 1038 -958 1157 -153 252 diff --git a/geom_bottleneck/tests/data/test_811_B b/geom_bottleneck/tests/data/test_811_B deleted file mode 100644 index 69bffab..0000000 --- a/geom_bottleneck/tests/data/test_811_B +++ /dev/null @@ -1,20 +0,0 @@ -687 1060 -622 650 -544 1212 -38 633 -280 956 -695 791 -120 956 -364 435 -825 1760 -137 303 -701 1432 -967 1395 -566 966 -695 951 -85 262 -82 595 -11 100 -312 1104 -669 1424 -157 285 diff --git a/geom_bottleneck/tests/data/test_812_A b/geom_bottleneck/tests/data/test_812_A deleted file mode 100644 index f592f5f..0000000 --- a/geom_bottleneck/tests/data/test_812_A +++ /dev/null @@ -1,20 +0,0 @@ -333 661 -942 1519 -825 1088 -68 726 -443 1398 -918 1335 -853 1787 -163 269 -158 214 -444 1036 -163 670 -124 834 -745 890 -728 1254 -981 1370 -858 1117 -159 700 -978 1371 -554 1366 -112 689 diff --git a/geom_bottleneck/tests/data/test_812_B b/geom_bottleneck/tests/data/test_812_B deleted file mode 100644 index 7e37dec..0000000 --- a/geom_bottleneck/tests/data/test_812_B +++ /dev/null @@ -1,20 +0,0 @@ -228 896 -635 880 -250 930 -8 479 -168 214 -366 775 -41 981 -461 692 -337 839 -870 1634 -497 511 -253 389 -807 913 -487 1348 -245 1186 -222 1169 -254 810 -855 1471 -399 1155 -433 1194 diff --git a/geom_bottleneck/tests/data/test_813_A b/geom_bottleneck/tests/data/test_813_A deleted file mode 100644 index 94bbbc3..0000000 --- a/geom_bottleneck/tests/data/test_813_A +++ /dev/null @@ -1,20 +0,0 @@ -45 843 -606 637 -981 1438 -769 1525 -694 1370 -596 1454 -365 813 -164 704 -198 347 -115 553 -767 1119 -663 1052 -379 697 -294 335 -457 1253 -320 1147 -508 830 -506 738 -381 1010 -896 1376 diff --git a/geom_bottleneck/tests/data/test_813_B b/geom_bottleneck/tests/data/test_813_B deleted file mode 100644 index 54ce63b..0000000 --- a/geom_bottleneck/tests/data/test_813_B +++ /dev/null @@ -1,20 +0,0 @@ -519 1068 -65 460 -199 429 -695 1050 -407 524 -24 581 -54 728 -843 1551 -773 829 -355 644 -145 962 -837 1238 -796 830 -383 791 -86 1028 -461 1145 -270 1231 -374 837 -730 875 -659 1188 diff --git a/geom_bottleneck/tests/data/test_814_A b/geom_bottleneck/tests/data/test_814_A deleted file mode 100644 index 3eb0a25..0000000 --- a/geom_bottleneck/tests/data/test_814_A +++ /dev/null @@ -1,20 +0,0 @@ -571 1312 -384 842 -418 932 -388 1146 -857 1045 -952 1326 -551 631 -820 1105 -791 884 -50 788 -697 1165 -840 1425 -130 169 -106 615 -429 1085 -428 567 -138 762 -364 1304 -116 1013 -50 983 diff --git a/geom_bottleneck/tests/data/test_814_B b/geom_bottleneck/tests/data/test_814_B deleted file mode 100644 index a65d82f..0000000 --- a/geom_bottleneck/tests/data/test_814_B +++ /dev/null @@ -1,20 +0,0 @@ -617 718 -320 697 -164 654 -423 821 -444 1368 -211 382 -184 857 -799 1071 -866 924 -48 829 -90 249 -378 1336 -817 832 -6 246 -115 280 -363 447 -422 964 -902 1809 -637 1073 -585 606 diff --git a/geom_bottleneck/tests/data/test_815_A b/geom_bottleneck/tests/data/test_815_A deleted file mode 100644 index ae366c6..0000000 --- a/geom_bottleneck/tests/data/test_815_A +++ /dev/null @@ -1,20 +0,0 @@ -911 1198 -516 1091 -421 1381 -257 824 -272 394 -75 841 -659 805 -980 1436 -237 431 -668 1221 -441 1057 -560 849 -305 1270 -572 929 -460 812 -471 640 -50 773 -1 446 -895 1610 -837 1400 diff --git a/geom_bottleneck/tests/data/test_815_B b/geom_bottleneck/tests/data/test_815_B deleted file mode 100644 index 6d11d46..0000000 --- a/geom_bottleneck/tests/data/test_815_B +++ /dev/null @@ -1,20 +0,0 @@ -589 1196 -872 1375 -473 627 -522 671 -940 1274 -666 1453 -1 861 -656 1221 -669 866 -916 1378 -340 773 -454 1020 -190 561 -828 1606 -356 693 -876 1220 -644 763 -991 1241 -559 1095 -124 406 diff --git a/geom_bottleneck/tests/data/test_816_A b/geom_bottleneck/tests/data/test_816_A deleted file mode 100644 index 54dc128..0000000 --- a/geom_bottleneck/tests/data/test_816_A +++ /dev/null @@ -1,20 +0,0 @@ -376 1109 -877 1496 -817 1426 -647 703 -92 672 -909 1671 -580 965 -626 1528 -347 1159 -551 1396 -432 941 -7 766 -1 370 -664 1384 -106 448 -763 1190 -768 892 -19 465 -220 1188 -96 554 diff --git a/geom_bottleneck/tests/data/test_816_B b/geom_bottleneck/tests/data/test_816_B deleted file mode 100644 index 56f00ce..0000000 --- a/geom_bottleneck/tests/data/test_816_B +++ /dev/null @@ -1,20 +0,0 @@ -930 1560 -702 1257 -174 988 -712 777 -150 355 -146 617 -265 954 -519 820 -575 1117 -603 1133 -910 1817 -363 415 -102 347 -925 1565 -621 1336 -203 752 -743 1550 -39 310 -904 1206 -696 1445 diff --git a/geom_bottleneck/tests/data/test_817_A b/geom_bottleneck/tests/data/test_817_A deleted file mode 100644 index 8c01be3..0000000 --- a/geom_bottleneck/tests/data/test_817_A +++ /dev/null @@ -1,20 +0,0 @@ -14 829 -708 1194 -415 1028 -395 1236 -294 792 -319 730 -490 889 -424 1364 -512 864 -820 1563 -461 880 -345 686 -318 407 -993 1857 -833 882 -937 1452 -376 719 -171 852 -457 523 -156 784 diff --git a/geom_bottleneck/tests/data/test_817_B b/geom_bottleneck/tests/data/test_817_B deleted file mode 100644 index 1aa1eaa..0000000 --- a/geom_bottleneck/tests/data/test_817_B +++ /dev/null @@ -1,20 +0,0 @@ -544 1398 -776 1241 -56 1054 -942 1736 -752 1563 -475 1241 -423 923 -553 1023 -101 846 -841 1613 -895 1353 -832 1502 -300 915 -986 1488 -397 648 -823 1196 -457 1079 -371 471 -398 1114 -50 853 diff --git a/geom_bottleneck/tests/data/test_818_A b/geom_bottleneck/tests/data/test_818_A deleted file mode 100644 index 44ac7de..0000000 --- a/geom_bottleneck/tests/data/test_818_A +++ /dev/null @@ -1,20 +0,0 @@ -296 395 -102 172 -9 500 -426 574 -931 1885 -76 901 -202 1197 -462 1135 -87 907 -109 780 -186 238 -297 833 -142 360 -719 1106 -25 775 -626 1219 -911 1619 -9 322 -158 222 -843 1086 diff --git a/geom_bottleneck/tests/data/test_818_B b/geom_bottleneck/tests/data/test_818_B deleted file mode 100644 index 83c706c..0000000 --- a/geom_bottleneck/tests/data/test_818_B +++ /dev/null @@ -1,20 +0,0 @@ -989 1945 -718 1675 -126 965 -27 359 -756 962 -158 737 -149 473 -748 896 -779 1215 -685 933 -742 1449 -717 1575 -834 1467 -80 377 -634 1348 -419 766 -345 733 -111 753 -138 1014 -452 1429 diff --git a/geom_bottleneck/tests/data/test_819_A b/geom_bottleneck/tests/data/test_819_A deleted file mode 100644 index 1065f24..0000000 --- a/geom_bottleneck/tests/data/test_819_A +++ /dev/null @@ -1,20 +0,0 @@ -119 806 -187 942 -454 844 -581 583 -753 1715 -199 380 -623 697 -63 469 -929 1518 -960 1306 -996 1011 -157 203 -666 1505 -14 693 -414 536 -461 1330 -975 1260 -375 1004 -375 1145 -453 723 diff --git a/geom_bottleneck/tests/data/test_819_B b/geom_bottleneck/tests/data/test_819_B deleted file mode 100644 index f1c8ba3..0000000 --- a/geom_bottleneck/tests/data/test_819_B +++ /dev/null @@ -1,20 +0,0 @@ -184 385 -214 473 -11 1007 -301 516 -689 820 -267 1052 -26 720 -414 726 -946 1295 -720 1275 -430 1272 -119 349 -850 1371 -738 1125 -450 1222 -728 1503 -951 1796 -843 947 -856 983 -705 996 diff --git a/geom_bottleneck/tests/data/test_820_A b/geom_bottleneck/tests/data/test_820_A deleted file mode 100644 index 1f23572..0000000 --- a/geom_bottleneck/tests/data/test_820_A +++ /dev/null @@ -1,30 +0,0 @@ -232 279 -761 1519 -175 773 -522 1293 -336 381 -478 998 -61 328 -450 1350 -669 1085 -602 870 -286 987 -593 897 -358 742 -900 1878 -441 668 -109 977 -847 1651 -41 863 -94 851 -240 491 -335 1150 -135 748 -480 1052 -420 572 -837 1662 -629 1223 -895 1453 -304 1051 -424 553 -308 714 diff --git a/geom_bottleneck/tests/data/test_820_B b/geom_bottleneck/tests/data/test_820_B deleted file mode 100644 index 3465e1b..0000000 --- a/geom_bottleneck/tests/data/test_820_B +++ /dev/null @@ -1,30 +0,0 @@ -309 934 -8 585 -213 1043 -116 589 -436 679 -70 715 -604 1194 -562 1151 -727 1616 -404 632 -948 1712 -934 1186 -690 1385 -636 682 -140 888 -738 884 -704 1593 -868 979 -954 1310 -605 1513 -955 1763 -730 1719 -393 1159 -325 1279 -35 153 -436 838 -249 1157 -394 921 -634 1242 -914 1138 diff --git a/geom_bottleneck/tests/data/test_821_A b/geom_bottleneck/tests/data/test_821_A deleted file mode 100644 index ab4fa20..0000000 --- a/geom_bottleneck/tests/data/test_821_A +++ /dev/null @@ -1,30 +0,0 @@ -610 907 -704 897 -228 1047 -459 1435 -105 904 -492 1288 -557 863 -368 622 -715 1240 -627 1465 -823 1003 -823 891 -724 853 -227 933 -88 600 -735 1479 -591 757 -260 347 -314 1130 -342 985 -80 990 -93 137 -153 761 -91 408 -497 1011 -980 1277 -916 1437 -81 1038 -735 1143 -374 773 diff --git a/geom_bottleneck/tests/data/test_821_B b/geom_bottleneck/tests/data/test_821_B deleted file mode 100644 index 36073ce..0000000 --- a/geom_bottleneck/tests/data/test_821_B +++ /dev/null @@ -1,30 +0,0 @@ -575 1235 -999 1599 -78 560 -384 694 -217 646 -709 1344 -772 1755 -542 994 -376 1248 -924 1462 -675 892 -927 1354 -306 1292 -573 1316 -731 1424 -445 911 -145 588 -402 822 -584 920 -374 831 -636 1237 -580 614 -490 1107 -529 1074 -652 1460 -892 1245 -917 1530 -679 1511 -725 820 -620 1439 diff --git a/geom_bottleneck/tests/data/test_822_A b/geom_bottleneck/tests/data/test_822_A deleted file mode 100644 index 38b5219..0000000 --- a/geom_bottleneck/tests/data/test_822_A +++ /dev/null @@ -1,30 +0,0 @@ -416 1100 -661 1339 -612 962 -593 1233 -642 1509 -574 969 -202 450 -370 787 -14 937 -974 1336 -420 775 -808 1662 -304 319 -492 555 -740 1524 -935 1749 -88 758 -995 1590 -40 963 -141 1031 -695 886 -504 1111 -684 1360 -861 1552 -482 746 -89 547 -493 598 -190 310 -806 1384 -472 1459 diff --git a/geom_bottleneck/tests/data/test_822_B b/geom_bottleneck/tests/data/test_822_B deleted file mode 100644 index c61c33e..0000000 --- a/geom_bottleneck/tests/data/test_822_B +++ /dev/null @@ -1,30 +0,0 @@ -843 1057 -860 1286 -703 1268 -545 1381 -515 1186 -178 952 -456 907 -713 964 -555 981 -332 1263 -11 112 -291 347 -958 1460 -723 1182 -850 865 -631 677 -227 640 -676 1506 -256 610 -581 1468 -15 619 -233 1100 -35 957 -444 817 -517 1318 -129 318 -765 1584 -733 1001 -932 998 -693 1076 diff --git a/geom_bottleneck/tests/data/test_823_A b/geom_bottleneck/tests/data/test_823_A deleted file mode 100644 index 5d441a2..0000000 --- a/geom_bottleneck/tests/data/test_823_A +++ /dev/null @@ -1,30 +0,0 @@ -817 1477 -662 1416 -722 1408 -43 588 -583 585 -159 836 -752 922 -529 727 -55 60 -447 1200 -248 735 -520 1121 -541 1379 -704 1640 -681 1454 -234 385 -884 1063 -884 1535 -612 704 -55 102 -214 913 -597 1576 -19 919 -907 951 -785 1577 -185 281 -567 680 -577 1162 -323 495 -321 920 diff --git a/geom_bottleneck/tests/data/test_823_B b/geom_bottleneck/tests/data/test_823_B deleted file mode 100644 index e1ae113..0000000 --- a/geom_bottleneck/tests/data/test_823_B +++ /dev/null @@ -1,30 +0,0 @@ -562 1532 -19 557 -758 1238 -732 1011 -116 761 -988 1621 -783 786 -128 964 -208 249 -111 948 -510 719 -711 1630 -99 769 -159 816 -295 807 -485 1332 -848 1845 -721 1534 -344 1341 -678 1465 -665 889 -734 1611 -246 783 -238 618 -401 809 -234 571 -527 1227 -690 1550 -278 729 -454 591 diff --git a/geom_bottleneck/tests/data/test_824_A b/geom_bottleneck/tests/data/test_824_A deleted file mode 100644 index 3bfc169..0000000 --- a/geom_bottleneck/tests/data/test_824_A +++ /dev/null @@ -1,30 +0,0 @@ -333 858 -230 978 -281 1158 -880 1314 -816 1259 -840 1631 -385 979 -413 537 -378 697 -222 486 -213 285 -664 1109 -7 300 -482 903 -325 338 -616 875 -46 548 -145 965 -126 760 -873 1030 -533 1087 -417 487 -510 919 -760 1722 -144 897 -136 412 -88 137 -704 1084 -457 744 -424 1148 diff --git a/geom_bottleneck/tests/data/test_824_B b/geom_bottleneck/tests/data/test_824_B deleted file mode 100644 index 192df92..0000000 --- a/geom_bottleneck/tests/data/test_824_B +++ /dev/null @@ -1,30 +0,0 @@ -285 785 -57 516 -410 1131 -794 1019 -732 1499 -391 1297 -104 689 -294 976 -748 1061 -806 1309 -118 995 -7 994 -952 1007 -994 1296 -340 1335 -387 762 -800 946 -757 1299 -167 976 -538 802 -147 808 -51 694 -20 353 -290 376 -575 1395 -294 1074 -754 1042 -461 474 -634 1525 -491 1208 diff --git a/geom_bottleneck/tests/data/test_825_A b/geom_bottleneck/tests/data/test_825_A deleted file mode 100644 index 5dc0d10..0000000 --- a/geom_bottleneck/tests/data/test_825_A +++ /dev/null @@ -1,30 +0,0 @@ -727 1401 -217 1102 -836 1270 -380 446 -569 1295 -55 504 -239 312 -872 1710 -552 1075 -584 1470 -402 438 -441 1296 -194 1105 -643 1563 -933 1180 -448 735 -749 1583 -725 1624 -533 1043 -952 1467 -548 926 -839 926 -5 724 -768 1115 -557 578 -712 1472 -279 1121 -399 808 -601 951 -293 422 diff --git a/geom_bottleneck/tests/data/test_825_B b/geom_bottleneck/tests/data/test_825_B deleted file mode 100644 index e440801..0000000 --- a/geom_bottleneck/tests/data/test_825_B +++ /dev/null @@ -1,30 +0,0 @@ -466 883 -492 1180 -645 1446 -138 604 -469 1261 -110 409 -923 1649 -101 397 -410 440 -655 1223 -280 822 -564 701 -736 1735 -645 1272 -495 982 -339 389 -188 738 -669 1263 -106 658 -981 1256 -815 1378 -914 1482 -193 855 -361 1134 -885 1858 -98 576 -577 897 -528 549 -152 154 -363 886 diff --git a/geom_bottleneck/tests/data/test_826_A b/geom_bottleneck/tests/data/test_826_A deleted file mode 100644 index 8fbcf93..0000000 --- a/geom_bottleneck/tests/data/test_826_A +++ /dev/null @@ -1,30 +0,0 @@ -669 1220 -577 787 -982 1553 -218 1116 -715 831 -383 780 -328 925 -216 612 -635 1185 -211 707 -915 1130 -223 693 -468 1277 -570 1219 -281 1037 -759 1522 -435 1201 -356 582 -996 1867 -369 833 -584 1415 -472 1174 -6 905 -329 358 -703 1331 -141 180 -136 204 -873 1858 -107 943 -158 1153 diff --git a/geom_bottleneck/tests/data/test_826_B b/geom_bottleneck/tests/data/test_826_B deleted file mode 100644 index 10fe424..0000000 --- a/geom_bottleneck/tests/data/test_826_B +++ /dev/null @@ -1,30 +0,0 @@ -651 1534 -143 212 -685 962 -100 862 -34 102 -333 1131 -274 651 -142 1075 -312 751 -848 1583 -396 548 -377 1071 -824 1067 -932 1352 -510 1339 -435 561 -259 1223 -434 1080 -974 1509 -618 1604 -795 1363 -668 1299 -532 1157 -326 632 -182 768 -611 1431 -62 528 -832 1370 -413 1373 -153 813 diff --git a/geom_bottleneck/tests/data/test_827_A b/geom_bottleneck/tests/data/test_827_A deleted file mode 100644 index c1c63c9..0000000 --- a/geom_bottleneck/tests/data/test_827_A +++ /dev/null @@ -1,30 +0,0 @@ -211 875 -625 678 -698 1671 -942 1243 -129 250 -370 497 -725 1322 -195 1094 -382 1059 -973 1185 -877 1196 -863 1764 -645 1372 -4 484 -29 156 -802 1201 -195 1074 -261 1181 -139 1099 -768 1204 -882 1317 -107 693 -928 1275 -459 1071 -270 633 -384 906 -493 576 -909 1222 -212 437 -74 656 diff --git a/geom_bottleneck/tests/data/test_827_B b/geom_bottleneck/tests/data/test_827_B deleted file mode 100644 index 57ea673..0000000 --- a/geom_bottleneck/tests/data/test_827_B +++ /dev/null @@ -1,30 +0,0 @@ -804 1730 -244 333 -131 547 -866 1012 -364 546 -530 950 -702 824 -290 418 -636 795 -202 618 -858 1059 -140 687 -76 447 -60 499 -502 1080 -858 1704 -555 585 -503 1152 -151 787 -565 1211 -172 556 -322 422 -176 952 -333 572 -40 982 -656 1365 -553 1493 -600 680 -72 555 -711 769 diff --git a/geom_bottleneck/tests/data/test_828_A b/geom_bottleneck/tests/data/test_828_A deleted file mode 100644 index ee02128..0000000 --- a/geom_bottleneck/tests/data/test_828_A +++ /dev/null @@ -1,30 +0,0 @@ -227 983 -778 1655 -311 1256 -462 911 -100 932 -411 895 -738 1086 -375 1308 -899 1896 -742 1425 -909 1290 -68 375 -148 195 -981 1120 -848 1463 -234 616 -45 314 -180 447 -368 1310 -443 734 -721 1345 -617 1376 -340 767 -420 1094 -848 979 -984 1866 -996 1169 -28 895 -203 1153 -535 1241 diff --git a/geom_bottleneck/tests/data/test_828_B b/geom_bottleneck/tests/data/test_828_B deleted file mode 100644 index 92fae09..0000000 --- a/geom_bottleneck/tests/data/test_828_B +++ /dev/null @@ -1,30 +0,0 @@ -309 789 -405 1405 -610 1330 -213 683 -768 1598 -843 1024 -898 1445 -625 1363 -557 996 -455 1026 -146 1137 -411 617 -155 969 -93 444 -92 206 -470 927 -792 1691 -871 984 -551 1271 -801 1755 -134 505 -270 1081 -382 852 -549 686 -2 314 -146 428 -460 1373 -602 1492 -950 1060 -516 1438 diff --git a/geom_bottleneck/tests/data/test_829_A b/geom_bottleneck/tests/data/test_829_A deleted file mode 100644 index fceb407..0000000 --- a/geom_bottleneck/tests/data/test_829_A +++ /dev/null @@ -1,30 +0,0 @@ -222 1184 -346 478 -748 1587 -29 615 -190 1077 -889 1417 -381 1314 -388 448 -654 1525 -876 1242 -306 625 -289 660 -251 355 -4 963 -310 1154 -216 1065 -7 10 -75 525 -249 1084 -972 1796 -938 1780 -218 1156 -959 1810 -530 785 -562 1005 -483 751 -892 1440 -352 493 -676 1329 -718 1688 diff --git a/geom_bottleneck/tests/data/test_829_B b/geom_bottleneck/tests/data/test_829_B deleted file mode 100644 index 85f538c..0000000 --- a/geom_bottleneck/tests/data/test_829_B +++ /dev/null @@ -1,30 +0,0 @@ -910 1441 -681 1671 -845 1784 -354 1210 -4 180 -830 1486 -466 566 -808 1728 -1 589 -808 862 -404 543 -304 879 -618 1013 -905 1788 -912 1187 -228 604 -959 1487 -793 1275 -631 1205 -151 157 -984 1427 -244 578 -875 1741 -654 1288 -506 780 -827 1138 -213 928 -30 420 -670 1438 -448 737 diff --git a/geom_bottleneck/tests/data/test_830_A b/geom_bottleneck/tests/data/test_830_A deleted file mode 100644 index fd54955..0000000 --- a/geom_bottleneck/tests/data/test_830_A +++ /dev/null @@ -1,30 +0,0 @@ -35 644 -830 1511 -414 677 -768 1461 -467 1032 -152 1060 -960 1807 -566 831 -550 1210 -521 1018 -250 651 -698 699 -979 1102 -555 1516 -463 1057 -739 896 -330 549 -412 775 -775 1433 -733 1438 -430 1342 -7 751 -338 943 -923 1173 -734 1460 -880 1453 -225 1004 -571 1375 -739 1085 -288 1202 diff --git a/geom_bottleneck/tests/data/test_830_B b/geom_bottleneck/tests/data/test_830_B deleted file mode 100644 index 5b9d84b..0000000 --- a/geom_bottleneck/tests/data/test_830_B +++ /dev/null @@ -1,30 +0,0 @@ -814 1305 -205 1199 -972 1431 -37 488 -673 1079 -630 1288 -698 828 -970 1666 -516 625 -65 209 -752 1716 -12 992 -563 1552 -821 1168 -460 943 -616 682 -386 546 -249 638 -583 1024 -38 889 -491 1020 -179 964 -995 1256 -861 1632 -252 518 -255 344 -480 1200 -89 711 -598 1022 -632 677 diff --git a/geom_bottleneck/tests/data/test_831_A b/geom_bottleneck/tests/data/test_831_A deleted file mode 100644 index fe09be1..0000000 --- a/geom_bottleneck/tests/data/test_831_A +++ /dev/null @@ -1,30 +0,0 @@ -772 1298 -705 1567 -946 1693 -632 1045 -752 875 -919 1723 -657 884 -708 1156 -442 1086 -571 1454 -641 894 -371 1152 -762 952 -684 760 -275 369 -858 994 -485 730 -921 1267 -643 928 -353 1307 -384 406 -154 380 -299 998 -378 1208 -27 265 -948 1081 -551 1512 -50 308 -773 1297 -134 514 diff --git a/geom_bottleneck/tests/data/test_831_B b/geom_bottleneck/tests/data/test_831_B deleted file mode 100644 index 1f4d148..0000000 --- a/geom_bottleneck/tests/data/test_831_B +++ /dev/null @@ -1,30 +0,0 @@ -757 1588 -145 1094 -523 1331 -687 1430 -877 1046 -573 696 -359 1012 -711 734 -368 552 -588 1267 -231 702 -64 429 -901 1202 -93 467 -647 1449 -747 994 -364 692 -384 833 -143 390 -445 1283 -248 696 -397 451 -695 1014 -852 1363 -512 1491 -983 1278 -506 841 -533 1031 -26 813 -850 1601 diff --git a/geom_bottleneck/tests/data/test_832_A b/geom_bottleneck/tests/data/test_832_A deleted file mode 100644 index 79d3383..0000000 --- a/geom_bottleneck/tests/data/test_832_A +++ /dev/null @@ -1,30 +0,0 @@ -373 1269 -753 1101 -529 825 -462 539 -52 293 -878 1396 -67 683 -106 1096 -973 1589 -129 911 -556 1327 -743 1248 -687 1505 -804 1322 -338 703 -438 1149 -539 730 -802 1046 -462 803 -175 506 -382 796 -470 1219 -608 1146 -12 757 -713 1367 -719 1001 -451 585 -408 1308 -29 510 -67 866 diff --git a/geom_bottleneck/tests/data/test_832_B b/geom_bottleneck/tests/data/test_832_B deleted file mode 100644 index 9106904..0000000 --- a/geom_bottleneck/tests/data/test_832_B +++ /dev/null @@ -1,30 +0,0 @@ -239 1006 -358 806 -53 229 -529 931 -923 1837 -644 1410 -761 1240 -511 966 -639 1127 -874 1114 -604 995 -916 1100 -634 1043 -317 607 -43 613 -9 216 -349 1035 -48 193 -396 986 -809 1193 -307 832 -86 786 -934 1164 -534 1434 -960 1092 -13 799 -658 1056 -411 1382 -378 568 -808 1400 diff --git a/geom_bottleneck/tests/data/test_833_A b/geom_bottleneck/tests/data/test_833_A deleted file mode 100644 index 1dbdd95..0000000 --- a/geom_bottleneck/tests/data/test_833_A +++ /dev/null @@ -1,30 +0,0 @@ -505 885 -170 695 -258 297 -652 996 -987 1055 -937 1159 -846 1133 -984 1715 -243 1199 -596 827 -40 585 -589 1356 -305 943 -974 1253 -965 1615 -840 1238 -842 1407 -596 1296 -603 741 -839 966 -300 951 -852 1656 -783 1676 -45 631 -973 1199 -513 725 -133 391 -633 1132 -442 1271 -100 401 diff --git a/geom_bottleneck/tests/data/test_833_B b/geom_bottleneck/tests/data/test_833_B deleted file mode 100644 index a325070..0000000 --- a/geom_bottleneck/tests/data/test_833_B +++ /dev/null @@ -1,30 +0,0 @@ -152 524 -210 255 -714 1034 -808 1480 -594 1020 -33 742 -285 562 -437 1341 -716 903 -767 1201 -146 938 -608 1275 -54 601 -752 1037 -896 1514 -113 321 -986 1932 -453 1382 -93 547 -687 1677 -134 1122 -5 268 -31 66 -832 1755 -313 966 -602 834 -433 679 -548 789 -414 1414 -734 1061 diff --git a/geom_bottleneck/tests/data/test_834_A b/geom_bottleneck/tests/data/test_834_A deleted file mode 100644 index 7088d54..0000000 --- a/geom_bottleneck/tests/data/test_834_A +++ /dev/null @@ -1,30 +0,0 @@ -709 1214 -541 1328 -291 925 -23 570 -334 447 -648 808 -532 1226 -315 509 -796 1147 -435 1417 -336 1183 -401 893 -184 721 -496 509 -274 841 -463 625 -906 1694 -512 1242 -617 1494 -874 1805 -162 621 -802 1074 -904 993 -124 653 -44 818 -577 1417 -520 1294 -574 709 -317 394 -643 1152 diff --git a/geom_bottleneck/tests/data/test_834_B b/geom_bottleneck/tests/data/test_834_B deleted file mode 100644 index 5dd4204..0000000 --- a/geom_bottleneck/tests/data/test_834_B +++ /dev/null @@ -1,30 +0,0 @@ -176 662 -579 764 -544 706 -68 939 -230 345 -901 1737 -714 1299 -482 1000 -290 802 -760 1461 -647 1412 -781 1498 -354 780 -697 818 -375 709 -794 1664 -989 1869 -320 729 -688 1029 -853 1290 -679 1504 -918 1749 -767 1734 -300 996 -625 900 -123 496 -89 408 -255 679 -329 1248 -659 1003 diff --git a/geom_bottleneck/tests/data/test_835_A b/geom_bottleneck/tests/data/test_835_A deleted file mode 100644 index 47e934b..0000000 --- a/geom_bottleneck/tests/data/test_835_A +++ /dev/null @@ -1,30 +0,0 @@ -554 1108 -257 549 -102 222 -531 715 -977 1231 -292 534 -624 1603 -394 508 -936 1007 -139 427 -457 1069 -873 1535 -789 887 -912 1213 -503 1307 -734 889 -789 1372 -811 1701 -558 1477 -485 763 -711 876 -961 1691 -294 635 -963 1955 -737 1563 -15 980 -23 339 -770 1156 -399 1341 -886 1049 diff --git a/geom_bottleneck/tests/data/test_835_B b/geom_bottleneck/tests/data/test_835_B deleted file mode 100644 index 9a3edbe..0000000 --- a/geom_bottleneck/tests/data/test_835_B +++ /dev/null @@ -1,30 +0,0 @@ -38 645 -994 1933 -145 1066 -900 1210 -691 1208 -672 959 -349 445 -567 1137 -547 1325 -943 1437 -591 712 -526 750 -2 227 -108 667 -137 722 -327 1192 -396 1374 -390 1069 -396 783 -927 1242 -870 1797 -532 1049 -543 1081 -470 917 -738 1731 -814 1558 -794 1555 -439 499 -593 1490 -349 410 diff --git a/geom_bottleneck/tests/data/test_836_A b/geom_bottleneck/tests/data/test_836_A deleted file mode 100644 index 1a9885f..0000000 --- a/geom_bottleneck/tests/data/test_836_A +++ /dev/null @@ -1,30 +0,0 @@ -790 1396 -959 1240 -518 1462 -797 1737 -356 649 -304 716 -773 1583 -888 1299 -355 801 -318 1109 -271 1257 -645 820 -292 1221 -792 968 -879 1494 -253 642 -105 802 -917 1305 -648 1646 -724 1157 -566 1056 -868 1437 -398 1098 -601 917 -436 1368 -26 933 -670 1615 -189 367 -79 1050 -955 1528 diff --git a/geom_bottleneck/tests/data/test_836_B b/geom_bottleneck/tests/data/test_836_B deleted file mode 100644 index 8335ddf..0000000 --- a/geom_bottleneck/tests/data/test_836_B +++ /dev/null @@ -1,30 +0,0 @@ -135 337 -332 1300 -859 1117 -591 988 -441 1441 -174 635 -78 703 -10 648 -188 422 -292 830 -492 1179 -104 276 -263 640 -63 760 -993 1248 -107 644 -723 747 -85 698 -276 410 -407 735 -229 810 -512 561 -802 1555 -542 818 -666 1499 -383 754 -132 216 -581 723 -775 1446 -908 1029 diff --git a/geom_bottleneck/tests/data/test_837_A b/geom_bottleneck/tests/data/test_837_A deleted file mode 100644 index 8d3facc..0000000 --- a/geom_bottleneck/tests/data/test_837_A +++ /dev/null @@ -1,30 +0,0 @@ -456 998 -976 1929 -745 1606 -77 375 -149 692 -508 1466 -68 113 -493 1163 -185 1109 -761 1172 -313 1261 -508 1091 -122 834 -766 1333 -996 1208 -161 468 -688 903 -551 744 -745 1522 -579 1022 -149 722 -458 652 -8 758 -801 1344 -96 696 -589 1125 -589 989 -941 1492 -851 1168 -670 728 diff --git a/geom_bottleneck/tests/data/test_837_B b/geom_bottleneck/tests/data/test_837_B deleted file mode 100644 index 8439a1f..0000000 --- a/geom_bottleneck/tests/data/test_837_B +++ /dev/null @@ -1,30 +0,0 @@ -102 508 -437 603 -199 669 -853 1602 -106 722 -732 771 -301 538 -505 988 -731 1707 -276 1142 -923 1449 -366 1330 -221 833 -107 174 -914 1231 -651 1411 -137 666 -781 1074 -459 655 -509 1344 -74 234 -927 1739 -960 1461 -556 608 -644 805 -457 971 -992 1522 -798 887 -147 944 -96 111 diff --git a/geom_bottleneck/tests/data/test_838_A b/geom_bottleneck/tests/data/test_838_A deleted file mode 100644 index 9f6e83e..0000000 --- a/geom_bottleneck/tests/data/test_838_A +++ /dev/null @@ -1,30 +0,0 @@ -918 952 -225 1163 -801 1184 -786 1485 -512 747 -389 756 -966 1924 -542 720 -742 1207 -329 891 -273 1268 -701 1015 -29 682 -303 1139 -716 1617 -362 1135 -540 1071 -58 497 -725 1445 -46 688 -931 1327 -467 1229 -303 916 -702 1067 -862 1258 -535 1347 -640 1252 -619 1377 -702 1237 -971 1779 diff --git a/geom_bottleneck/tests/data/test_838_B b/geom_bottleneck/tests/data/test_838_B deleted file mode 100644 index 227776e..0000000 --- a/geom_bottleneck/tests/data/test_838_B +++ /dev/null @@ -1,30 +0,0 @@ -898 1448 -295 893 -829 1147 -149 339 -529 1046 -729 1258 -602 1296 -571 672 -953 1890 -26 777 -984 1487 -879 1533 -456 1103 -741 1227 -235 718 -65 102 -432 1037 -307 824 -977 1325 -275 582 -753 1683 -809 1622 -63 478 -648 1273 -945 1446 -234 843 -354 1134 -298 1160 -471 882 -911 1296 diff --git a/geom_bottleneck/tests/data/test_839_A b/geom_bottleneck/tests/data/test_839_A deleted file mode 100644 index 073be3c..0000000 --- a/geom_bottleneck/tests/data/test_839_A +++ /dev/null @@ -1,30 +0,0 @@ -488 765 -890 1359 -573 1009 -876 1603 -430 1408 -774 1380 -786 881 -392 1227 -506 755 -844 1516 -716 1555 -697 1415 -816 908 -981 1231 -775 1437 -224 582 -657 1045 -937 1441 -428 682 -865 1547 -802 1736 -700 1196 -881 1569 -507 875 -884 1852 -176 345 -278 338 -78 384 -562 781 -463 1403 diff --git a/geom_bottleneck/tests/data/test_839_B b/geom_bottleneck/tests/data/test_839_B deleted file mode 100644 index ca5ee3e..0000000 --- a/geom_bottleneck/tests/data/test_839_B +++ /dev/null @@ -1,30 +0,0 @@ -768 1077 -971 1887 -547 1058 -468 905 -54 250 -727 782 -101 407 -111 1085 -637 826 -209 531 -690 1134 -989 1111 -817 848 -862 952 -530 679 -431 823 -958 1666 -973 1598 -423 766 -42 736 -833 1832 -206 848 -148 336 -804 1691 -186 361 -53 288 -449 1314 -618 904 -759 1339 -8 923 diff --git a/geom_bottleneck/tests/data/test_840_A b/geom_bottleneck/tests/data/test_840_A deleted file mode 100644 index 02ed823..0000000 --- a/geom_bottleneck/tests/data/test_840_A +++ /dev/null @@ -1,50 +0,0 @@ -121 1010 -730 1566 -866 872 -984 1105 -12 455 -503 963 -956 1410 -986 1887 -929 1377 -809 823 -129 1090 -545 640 -641 921 -786 916 -222 474 -464 677 -357 1055 -199 1046 -327 892 -449 1272 -564 1505 -867 1494 -383 585 -617 1200 -254 997 -528 994 -458 507 -250 1217 -141 1104 -710 1191 -565 1355 -959 1876 -323 665 -290 1141 -749 1035 -641 817 -855 1596 -296 610 -144 215 -563 776 -77 599 -380 1160 -720 811 -55 905 -389 830 -268 1170 -579 1272 -240 811 -552 737 -498 844 diff --git a/geom_bottleneck/tests/data/test_840_B b/geom_bottleneck/tests/data/test_840_B deleted file mode 100644 index 4bd5737..0000000 --- a/geom_bottleneck/tests/data/test_840_B +++ /dev/null @@ -1,50 +0,0 @@ -156 272 -847 1154 -32 482 -781 1129 -956 1017 -429 1305 -312 1054 -11 979 -495 1463 -645 1524 -521 901 -685 1414 -741 1123 -179 428 -475 1073 -360 1315 -435 524 -897 1422 -668 1253 -538 802 -79 329 -791 1484 -557 772 -831 950 -640 666 -196 358 -214 394 -738 1566 -788 1752 -932 1820 -853 1847 -561 1446 -671 1490 -792 1123 -892 1481 -9 650 -92 308 -760 1021 -807 1449 -721 1693 -932 1892 -674 734 -837 1338 -313 507 -300 686 -264 1045 -210 788 -426 1169 -354 1154 -711 1322 diff --git a/geom_bottleneck/tests/data/test_841_A b/geom_bottleneck/tests/data/test_841_A deleted file mode 100644 index d6b2c08..0000000 --- a/geom_bottleneck/tests/data/test_841_A +++ /dev/null @@ -1,50 +0,0 @@ -932 1449 -350 597 -425 503 -858 1265 -781 1372 -293 300 -593 806 -958 1619 -647 819 -598 1284 -160 571 -651 955 -521 1143 -906 1546 -848 1529 -729 1180 -990 1245 -54 398 -404 1096 -88 896 -679 1094 -737 1504 -609 1460 -32 747 -338 1060 -565 1216 -637 1537 -449 1042 -889 1510 -184 241 -103 584 -136 919 -503 659 -848 1333 -890 941 -360 836 -418 506 -750 994 -963 1068 -712 1501 -331 396 -515 617 -555 728 -81 401 -186 654 -934 1122 -649 843 -953 1342 -316 622 -866 1234 diff --git a/geom_bottleneck/tests/data/test_841_B b/geom_bottleneck/tests/data/test_841_B deleted file mode 100644 index 9775dd8..0000000 --- a/geom_bottleneck/tests/data/test_841_B +++ /dev/null @@ -1,50 +0,0 @@ -381 908 -662 956 -316 894 -326 664 -655 1453 -261 430 -385 866 -630 1168 -117 237 -603 1595 -19 419 -375 1154 -982 1372 -897 1324 -347 687 -868 1049 -53 1031 -722 1078 -918 1107 -675 1326 -485 505 -777 1032 -76 273 -231 1113 -751 1180 -937 1635 -156 873 -641 1316 -632 1052 -54 1021 -993 1159 -905 1039 -606 1293 -235 364 -530 540 -326 843 -636 1442 -474 814 -176 942 -924 1685 -668 817 -560 1090 -805 1794 -679 1076 -409 1108 -582 1311 -21 449 -142 622 -614 1153 -570 908 diff --git a/geom_bottleneck/tests/data/test_842_A b/geom_bottleneck/tests/data/test_842_A deleted file mode 100644 index 49124dc..0000000 --- a/geom_bottleneck/tests/data/test_842_A +++ /dev/null @@ -1,50 +0,0 @@ -205 815 -309 971 -468 1170 -602 1127 -239 434 -403 631 -80 500 -14 864 -594 1199 -406 407 -30 360 -188 993 -381 1063 -175 1087 -357 1063 -153 1117 -600 1365 -662 1189 -513 744 -339 1332 -860 1720 -897 1406 -462 808 -191 234 -542 729 -425 738 -159 160 -821 1536 -327 355 -616 1302 -699 1148 -870 1512 -810 1146 -448 564 -881 1246 -364 833 -889 1160 -102 175 -385 731 -86 659 -14 321 -257 1193 -685 1606 -174 925 -165 1021 -116 419 -775 1510 -53 614 -18 39 -561 670 diff --git a/geom_bottleneck/tests/data/test_842_B b/geom_bottleneck/tests/data/test_842_B deleted file mode 100644 index 36715f2..0000000 --- a/geom_bottleneck/tests/data/test_842_B +++ /dev/null @@ -1,50 +0,0 @@ -577 1182 -779 1169 -525 1384 -851 968 -906 1679 -221 445 -494 653 -813 1061 -478 1174 -37 224 -700 1239 -338 855 -82 670 -159 872 -932 1231 -89 411 -869 1484 -708 966 -814 1075 -108 203 -603 691 -797 1680 -869 1223 -162 165 -281 333 -650 721 -200 665 -692 1332 -497 1331 -948 1098 -351 1188 -844 1508 -319 762 -302 442 -320 617 -220 649 -498 882 -411 711 -833 1373 -943 1586 -310 544 -24 818 -485 903 -58 1028 -84 1023 -69 823 -399 634 -755 945 -460 764 -583 800 diff --git a/geom_bottleneck/tests/data/test_843_A b/geom_bottleneck/tests/data/test_843_A deleted file mode 100644 index aa5cea9..0000000 --- a/geom_bottleneck/tests/data/test_843_A +++ /dev/null @@ -1,50 +0,0 @@ -855 1686 -375 653 -487 968 -501 1179 -269 747 -102 128 -756 1241 -934 1507 -707 1166 -438 644 -215 482 -186 1134 -588 1179 -323 806 -260 948 -999 1181 -809 866 -383 618 -667 1211 -697 1543 -216 289 -618 1318 -230 633 -261 439 -36 430 -926 1424 -573 1382 -545 1489 -198 254 -997 1313 -625 1138 -71 216 -123 152 -966 1260 -583 1455 -685 1595 -319 803 -809 1754 -543 672 -973 1482 -282 1191 -94 413 -933 1847 -593 770 -384 463 -301 531 -306 832 -645 679 -863 1024 -257 716 diff --git a/geom_bottleneck/tests/data/test_843_B b/geom_bottleneck/tests/data/test_843_B deleted file mode 100644 index b14eed6..0000000 --- a/geom_bottleneck/tests/data/test_843_B +++ /dev/null @@ -1,50 +0,0 @@ -36 726 -683 1328 -991 1393 -822 1642 -499 1065 -41 726 -770 903 -83 190 -993 1392 -584 1281 -520 643 -878 1560 -461 694 -715 1155 -752 1593 -592 622 -8 746 -280 816 -571 797 -24 712 -799 1664 -988 1479 -397 1339 -827 1088 -466 1179 -701 1236 -841 1384 -360 1235 -425 739 -982 1503 -188 345 -161 405 -366 1067 -245 975 -834 1160 -19 508 -594 1292 -149 267 -201 891 -22 922 -984 1108 -731 1251 -871 1092 -946 1519 -772 1388 -738 1194 -924 1862 -35 765 -904 1276 -190 235 diff --git a/geom_bottleneck/tests/data/test_844_A b/geom_bottleneck/tests/data/test_844_A deleted file mode 100644 index 753b2fc..0000000 --- a/geom_bottleneck/tests/data/test_844_A +++ /dev/null @@ -1,50 +0,0 @@ -207 275 -665 774 -655 1360 -274 366 -83 646 -435 599 -479 793 -74 1043 -604 1048 -106 557 -885 1524 -694 1680 -770 833 -38 261 -6 547 -893 1287 -732 1589 -343 1201 -531 1088 -962 1666 -979 1708 -206 538 -73 114 -354 1140 -220 330 -299 833 -694 883 -651 701 -256 425 -551 612 -709 1304 -806 1613 -193 901 -29 916 -257 313 -806 1193 -205 530 -981 1851 -878 1208 -327 799 -958 1874 -783 1109 -466 537 -349 1191 -410 630 -513 837 -587 1033 -777 1202 -90 503 -893 1737 diff --git a/geom_bottleneck/tests/data/test_844_B b/geom_bottleneck/tests/data/test_844_B deleted file mode 100644 index 373d26c..0000000 --- a/geom_bottleneck/tests/data/test_844_B +++ /dev/null @@ -1,50 +0,0 @@ -67 793 -551 1443 -572 1395 -51 149 -805 920 -541 1479 -365 1244 -997 1447 -234 900 -144 1068 -418 929 -720 903 -155 219 -937 1905 -371 1112 -983 1372 -607 1244 -259 1217 -708 850 -992 1713 -398 968 -0 588 -167 742 -465 577 -188 892 -924 1045 -103 892 -489 1072 -170 195 -448 1141 -990 1075 -880 894 -703 1565 -318 785 -843 1614 -326 995 -104 185 -333 1186 -483 631 -246 797 -407 701 -333 545 -73 181 -591 1202 -851 1721 -615 1260 -504 1421 -472 486 -65 189 -986 1801 diff --git a/geom_bottleneck/tests/data/test_845_A b/geom_bottleneck/tests/data/test_845_A deleted file mode 100644 index 2015fbb..0000000 --- a/geom_bottleneck/tests/data/test_845_A +++ /dev/null @@ -1,50 +0,0 @@ -446 1114 -872 1568 -544 1415 -144 507 -256 602 -208 382 -899 1217 -756 1597 -428 574 -201 843 -609 770 -443 531 -479 955 -959 1238 -821 1798 -564 1526 -26 545 -264 633 -34 527 -153 213 -215 703 -925 964 -651 1041 -32 797 -234 1162 -166 544 -407 981 -817 1528 -883 1412 -867 1173 -327 358 -326 330 -540 1054 -632 1503 -632 1465 -240 799 -954 1859 -214 374 -546 1395 -914 1529 -680 1588 -367 377 -890 971 -289 1247 -31 846 -810 1172 -658 1366 -537 1089 -256 1134 -16 1008 diff --git a/geom_bottleneck/tests/data/test_845_B b/geom_bottleneck/tests/data/test_845_B deleted file mode 100644 index b053f52..0000000 --- a/geom_bottleneck/tests/data/test_845_B +++ /dev/null @@ -1,50 +0,0 @@ -537 582 -313 723 -386 619 -121 1100 -466 1044 -502 581 -16 838 -599 1395 -899 1523 -589 591 -36 928 -896 1718 -16 252 -99 722 -925 1343 -328 1244 -245 973 -596 1499 -122 763 -945 1563 -38 452 -680 890 -499 1247 -295 803 -385 1357 -885 1780 -597 637 -193 313 -951 1019 -679 1344 -991 1447 -697 1551 -834 1223 -57 795 -657 775 -374 1093 -187 398 -706 1353 -904 1801 -538 932 -843 1632 -370 1250 -590 957 -996 1385 -364 714 -307 689 -866 1687 -547 1072 -451 864 -746 900 diff --git a/geom_bottleneck/tests/data/test_846_A b/geom_bottleneck/tests/data/test_846_A deleted file mode 100644 index 520c6d4..0000000 --- a/geom_bottleneck/tests/data/test_846_A +++ /dev/null @@ -1,50 +0,0 @@ -659 889 -754 1573 -955 1466 -177 454 -109 235 -107 1086 -741 949 -689 1029 -288 564 -987 1133 -235 240 -398 1178 -27 395 -483 863 -509 1192 -920 1870 -732 1501 -494 1321 -190 362 -278 778 -726 1309 -397 1117 -7 888 -514 1366 -598 902 -48 950 -103 506 -770 1359 -689 1403 -340 1072 -191 850 -512 742 -441 507 -67 201 -50 781 -649 1619 -457 843 -756 993 -343 361 -505 1029 -687 707 -496 1371 -854 990 -555 1488 -217 249 -477 837 -150 258 -514 1286 -170 982 -160 521 diff --git a/geom_bottleneck/tests/data/test_846_B b/geom_bottleneck/tests/data/test_846_B deleted file mode 100644 index 3046f20..0000000 --- a/geom_bottleneck/tests/data/test_846_B +++ /dev/null @@ -1,50 +0,0 @@ -701 1467 -679 1557 -705 1082 -845 1787 -776 824 -890 1825 -867 1265 -105 710 -282 1235 -900 1455 -598 1253 -642 794 -304 961 -492 778 -16 233 -301 1249 -524 1358 -884 1577 -542 1423 -856 1110 -768 883 -226 755 -18 940 -846 916 -512 1411 -598 1196 -841 1345 -306 891 -571 981 -353 918 -840 1652 -886 1748 -269 1233 -940 1583 -364 1070 -187 683 -350 1141 -730 1223 -333 701 -284 449 -846 1539 -509 1400 -21 696 -543 778 -714 1428 -304 348 -475 1353 -594 1122 -426 946 -418 1312 diff --git a/geom_bottleneck/tests/data/test_847_A b/geom_bottleneck/tests/data/test_847_A deleted file mode 100644 index ee5c8c1..0000000 --- a/geom_bottleneck/tests/data/test_847_A +++ /dev/null @@ -1,50 +0,0 @@ -780 1633 -384 1190 -605 779 -787 1716 -504 698 -879 1796 -446 1258 -386 649 -830 1220 -576 717 -888 1126 -457 1259 -975 1588 -717 1266 -737 914 -103 695 -906 1516 -454 516 -696 899 -43 921 -613 781 -325 858 -655 1647 -72 601 -143 707 -293 1064 -13 310 -610 1021 -975 1576 -185 1017 -983 1261 -197 286 -68 472 -997 1630 -197 1191 -11 58 -804 1741 -364 519 -977 1124 -557 1184 -727 1681 -652 918 -928 1838 -675 1074 -551 976 -320 1244 -675 1477 -962 1898 -843 1490 -449 640 diff --git a/geom_bottleneck/tests/data/test_847_B b/geom_bottleneck/tests/data/test_847_B deleted file mode 100644 index de6f45a..0000000 --- a/geom_bottleneck/tests/data/test_847_B +++ /dev/null @@ -1,50 +0,0 @@ -198 500 -390 1022 -911 1544 -842 1778 -213 793 -173 1093 -61 455 -340 1005 -905 1418 -814 1236 -476 518 -133 382 -291 1249 -350 359 -967 1585 -441 810 -324 836 -769 1325 -828 1770 -758 1471 -9 499 -649 882 -418 1135 -28 97 -703 1400 -316 535 -799 1286 -16 348 -323 536 -113 864 -248 745 -468 597 -689 1618 -278 1208 -978 1589 -339 402 -232 442 -236 928 -856 1570 -709 1560 -34 260 -810 1365 -787 1781 -675 1043 -800 1255 -479 1118 -363 592 -97 729 -929 1430 -860 1219 diff --git a/geom_bottleneck/tests/data/test_848_A b/geom_bottleneck/tests/data/test_848_A deleted file mode 100644 index e9e603b..0000000 --- a/geom_bottleneck/tests/data/test_848_A +++ /dev/null @@ -1,50 +0,0 @@ -697 1454 -137 892 -466 950 -881 1230 -539 1162 -247 1065 -859 1032 -861 1215 -8 142 -772 1757 -458 1102 -382 730 -166 1086 -606 1008 -74 82 -967 1701 -562 1019 -648 764 -759 1745 -483 1208 -501 808 -942 1717 -569 888 -686 1292 -68 796 -504 1268 -655 1529 -335 451 -139 339 -709 1570 -238 542 -999 1912 -904 1545 -735 1386 -265 909 -935 1749 -745 787 -397 1083 -295 963 -12 523 -769 943 -998 1204 -531 1528 -596 1140 -173 1030 -810 1356 -728 750 -554 1185 -334 643 -879 1368 diff --git a/geom_bottleneck/tests/data/test_848_B b/geom_bottleneck/tests/data/test_848_B deleted file mode 100644 index 00005be..0000000 --- a/geom_bottleneck/tests/data/test_848_B +++ /dev/null @@ -1,50 +0,0 @@ -885 1435 -500 978 -291 765 -353 1157 -527 1446 -734 904 -302 393 -199 918 -561 744 -96 349 -338 631 -503 1162 -286 589 -492 544 -826 1742 -924 1340 -707 877 -691 1487 -883 1530 -233 810 -73 252 -192 595 -271 491 -915 1426 -128 781 -906 1244 -268 308 -979 1349 -823 1647 -993 1177 -318 961 -619 1143 -857 1682 -92 110 -676 1202 -485 1468 -968 1064 -565 634 -49 1043 -487 1316 -668 1425 -552 1443 -589 655 -515 850 -858 1826 -514 779 -322 506 -422 996 -213 1013 -897 1711 diff --git a/geom_bottleneck/tests/data/test_849_A b/geom_bottleneck/tests/data/test_849_A deleted file mode 100644 index 7938a96..0000000 --- a/geom_bottleneck/tests/data/test_849_A +++ /dev/null @@ -1,50 +0,0 @@ -785 1228 -858 997 -734 1553 -888 1700 -553 1433 -352 385 -851 1468 -803 950 -358 715 -376 1290 -419 784 -38 689 -504 1285 -250 768 -344 1015 -295 1063 -501 1219 -995 1383 -781 1320 -260 1154 -290 942 -683 918 -623 1468 -74 654 -742 1201 -919 974 -718 1316 -591 821 -864 1035 -591 951 -922 1553 -751 1468 -57 832 -809 1103 -243 322 -605 919 -947 1101 -7 1003 -655 1586 -737 1610 -537 935 -185 455 -466 834 -160 599 -386 1035 -381 448 -841 1005 -898 1693 -493 729 -506 685 diff --git a/geom_bottleneck/tests/data/test_849_B b/geom_bottleneck/tests/data/test_849_B deleted file mode 100644 index 21da75d..0000000 --- a/geom_bottleneck/tests/data/test_849_B +++ /dev/null @@ -1,50 +0,0 @@ -87 1055 -578 1265 -657 1071 -939 1551 -679 1032 -768 1665 -668 1163 -689 1159 -229 1083 -358 1158 -515 595 -972 1301 -764 1428 -551 1533 -770 929 -104 172 -948 1359 -48 854 -510 995 -914 1735 -228 440 -854 1064 -351 908 -664 1290 -919 1050 -882 1794 -472 819 -826 1133 -279 944 -363 1081 -296 934 -227 749 -172 931 -583 1524 -409 848 -284 804 -436 1098 -96 768 -632 646 -832 1167 -862 1470 -544 1519 -889 1030 -422 1414 -948 1105 -967 1273 -552 589 -986 1793 -52 252 -430 864 diff --git a/geom_bottleneck/tests/data/test_850_A b/geom_bottleneck/tests/data/test_850_A deleted file mode 100644 index dfb2165..0000000 --- a/geom_bottleneck/tests/data/test_850_A +++ /dev/null @@ -1,50 +0,0 @@ -819 907 -322 836 -10 262 -950 1844 -280 419 -724 1489 -982 1737 -183 305 -393 1066 -958 1033 -328 554 -609 1374 -512 835 -563 1444 -671 972 -161 838 -631 851 -867 1362 -995 1134 -990 1841 -479 839 -439 502 -408 917 -879 1633 -725 863 -271 614 -757 1203 -70 980 -745 841 -739 1679 -269 934 -926 1412 -977 1200 -532 1251 -607 708 -524 726 -737 983 -700 1200 -715 1247 -301 596 -136 869 -290 397 -88 764 -250 945 -0 378 -595 1513 -612 874 -706 757 -353 712 -509 953 diff --git a/geom_bottleneck/tests/data/test_850_B b/geom_bottleneck/tests/data/test_850_B deleted file mode 100644 index 573788d..0000000 --- a/geom_bottleneck/tests/data/test_850_B +++ /dev/null @@ -1,50 +0,0 @@ -602 1008 -42 926 -253 1183 -404 631 -779 1700 -698 1638 -92 1004 -296 370 -204 378 -225 593 -685 1259 -982 1447 -544 951 -682 1653 -449 1092 -664 1035 -856 1428 -658 1320 -615 1113 -83 285 -276 745 -297 363 -590 732 -547 999 -440 901 -337 830 -492 595 -487 1018 -159 1115 -853 1350 -139 377 -9 573 -47 505 -187 480 -374 510 -831 1626 -948 1484 -450 1028 -840 1390 -132 288 -472 1025 -74 260 -281 518 -95 248 -699 735 -275 1183 -802 971 -119 1091 -709 1224 -397 855 diff --git a/geom_bottleneck/tests/data/test_851_A b/geom_bottleneck/tests/data/test_851_A deleted file mode 100644 index 0a2f88e..0000000 --- a/geom_bottleneck/tests/data/test_851_A +++ /dev/null @@ -1,50 +0,0 @@ -390 859 -367 1332 -230 1179 -734 1289 -67 554 -186 319 -787 841 -516 1218 -616 1597 -551 1223 -669 862 -265 888 -24 428 -841 1616 -816 1058 -922 1460 -749 1311 -734 1658 -581 973 -780 1708 -99 1091 -851 1503 -161 1118 -944 1804 -456 458 -395 1163 -880 1842 -850 1397 -359 461 -996 1098 -337 1164 -975 994 -512 816 -436 648 -42 59 -586 841 -48 65 -352 821 -58 171 -870 1085 -639 763 -415 1274 -549 913 -37 47 -820 1311 -120 854 -924 1272 -325 800 -483 888 -167 512 diff --git a/geom_bottleneck/tests/data/test_851_B b/geom_bottleneck/tests/data/test_851_B deleted file mode 100644 index 8e4b97e..0000000 --- a/geom_bottleneck/tests/data/test_851_B +++ /dev/null @@ -1,50 +0,0 @@ -173 900 -214 742 -715 941 -288 723 -561 1288 -482 789 -555 1396 -244 1162 -24 229 -897 1127 -809 1700 -785 1558 -76 361 -453 827 -61 728 -600 986 -237 887 -720 1191 -834 1643 -576 1344 -764 1307 -417 1377 -780 1174 -187 235 -776 1010 -952 970 -377 1184 -454 979 -758 970 -330 1179 -364 1105 -101 909 -481 692 -579 1234 -623 1088 -425 464 -360 503 -534 882 -363 1011 -973 1732 -413 504 -171 514 -89 282 -430 1044 -531 610 -713 873 -737 1131 -807 1603 -584 1034 -887 1189 diff --git a/geom_bottleneck/tests/data/test_852_A b/geom_bottleneck/tests/data/test_852_A deleted file mode 100644 index 3d8f706..0000000 --- a/geom_bottleneck/tests/data/test_852_A +++ /dev/null @@ -1,50 +0,0 @@ -473 535 -32 734 -940 1633 -31 264 -217 284 -963 1618 -780 1453 -436 606 -958 1899 -509 1436 -1000 1824 -793 889 -667 1236 -647 1383 -588 1280 -682 1431 -617 765 -740 799 -640 1082 -724 1466 -540 1456 -772 1324 -551 1437 -270 1096 -709 1110 -317 876 -6 185 -612 686 -220 1032 -55 414 -272 669 -233 973 -264 825 -58 779 -92 330 -837 910 -106 237 -980 1316 -806 1161 -433 1270 -304 900 -569 882 -459 563 -991 1221 -33 686 -228 429 -527 542 -911 1456 -395 938 -825 1625 diff --git a/geom_bottleneck/tests/data/test_852_B b/geom_bottleneck/tests/data/test_852_B deleted file mode 100644 index 9de826f..0000000 --- a/geom_bottleneck/tests/data/test_852_B +++ /dev/null @@ -1,50 +0,0 @@ -380 777 -698 1291 -826 1366 -108 741 -88 586 -50 631 -333 860 -51 355 -746 1232 -864 1129 -312 868 -514 591 -818 940 -561 1106 -997 1618 -986 1648 -417 1273 -544 1325 -343 1332 -852 1788 -740 1072 -890 957 -880 1540 -110 1072 -969 1706 -964 1771 -366 1347 -542 631 -863 1294 -216 864 -766 1148 -436 1431 -227 989 -694 786 -216 801 -119 946 -607 1270 -300 1178 -338 572 -374 509 -233 934 -531 542 -174 504 -521 738 -837 1202 -231 528 -595 1041 -530 1474 -218 852 -874 1675 diff --git a/geom_bottleneck/tests/data/test_853_A b/geom_bottleneck/tests/data/test_853_A deleted file mode 100644 index bcf5afe..0000000 --- a/geom_bottleneck/tests/data/test_853_A +++ /dev/null @@ -1,50 +0,0 @@ -200 886 -263 814 -456 853 -495 694 -864 1233 -80 743 -147 356 -164 450 -250 1230 -759 792 -417 1228 -572 1002 -854 1634 -806 1057 -522 1196 -684 1295 -999 1547 -301 1014 -772 1685 -816 923 -820 876 -118 348 -340 849 -686 824 -874 1610 -510 1503 -602 1309 -677 1497 -146 1008 -853 1484 -729 1333 -617 1097 -511 935 -143 938 -485 552 -433 980 -859 1077 -3 717 -176 1136 -436 1213 -163 418 -505 889 -303 689 -837 1225 -296 345 -814 1699 -603 1524 -679 1224 -729 1714 -760 953 diff --git a/geom_bottleneck/tests/data/test_853_B b/geom_bottleneck/tests/data/test_853_B deleted file mode 100644 index d294f05..0000000 --- a/geom_bottleneck/tests/data/test_853_B +++ /dev/null @@ -1,50 +0,0 @@ -223 899 -821 1752 -179 260 -757 1350 -661 1211 -397 1004 -114 557 -579 1379 -752 1531 -292 818 -459 580 -715 1007 -849 1067 -495 1197 -803 991 -588 1569 -362 1316 -38 961 -899 1762 -325 906 -411 1364 -320 1221 -301 674 -811 1126 -464 1441 -220 1130 -514 784 -196 240 -946 1543 -614 928 -610 626 -628 1059 -576 829 -363 1272 -338 888 -470 497 -767 824 -578 645 -136 573 -563 731 -794 1510 -466 1243 -341 1080 -34 787 -901 1260 -339 1068 -406 746 -135 590 -507 1272 -705 756 diff --git a/geom_bottleneck/tests/data/test_854_A b/geom_bottleneck/tests/data/test_854_A deleted file mode 100644 index 4765953..0000000 --- a/geom_bottleneck/tests/data/test_854_A +++ /dev/null @@ -1,50 +0,0 @@ -670 1518 -858 1578 -59 559 -503 768 -14 876 -830 858 -978 1670 -648 1003 -620 1028 -522 809 -678 1574 -303 1157 -238 748 -886 987 -445 1100 -994 1772 -50 602 -134 315 -885 1274 -862 1737 -369 1231 -199 594 -611 1387 -517 1513 -731 865 -357 1222 -137 822 -894 1389 -839 1547 -962 1432 -170 512 -596 907 -480 545 -416 889 -311 1213 -897 1057 -394 1075 -943 1054 -342 1014 -137 742 -163 843 -655 763 -642 1182 -753 1458 -200 958 -289 311 -726 808 -614 1330 -796 1506 -292 555 diff --git a/geom_bottleneck/tests/data/test_854_B b/geom_bottleneck/tests/data/test_854_B deleted file mode 100644 index aa949eb..0000000 --- a/geom_bottleneck/tests/data/test_854_B +++ /dev/null @@ -1,50 +0,0 @@ -232 702 -892 1789 -441 1152 -710 975 -908 1187 -315 530 -255 334 -502 1485 -820 1718 -531 1002 -694 1032 -183 594 -924 1037 -948 1015 -465 906 -854 1761 -257 924 -588 1298 -382 1070 -315 646 -68 997 -924 1788 -927 1813 -522 1496 -667 1585 -884 1720 -373 1104 -140 1087 -988 1426 -690 796 -538 1095 -458 489 -685 805 -554 1389 -708 1480 -155 566 -704 891 -194 356 -607 1330 -512 725 -343 985 -660 1310 -117 1001 -454 1189 -554 1122 -722 1493 -805 1093 -60 419 -403 1277 -847 1750 diff --git a/geom_bottleneck/tests/data/test_855_A b/geom_bottleneck/tests/data/test_855_A deleted file mode 100644 index ab7ec0b..0000000 --- a/geom_bottleneck/tests/data/test_855_A +++ /dev/null @@ -1,50 +0,0 @@ -614 654 -663 1260 -449 1202 -762 985 -173 235 -219 556 -230 1224 -569 739 -65 145 -814 1671 -395 1280 -224 1211 -349 1209 -628 1611 -680 1532 -644 1398 -971 1611 -574 1353 -832 1740 -866 1082 -822 1654 -786 1770 -200 1071 -709 1343 -955 1924 -78 546 -168 872 -251 735 -505 1392 -719 799 -321 327 -823 1682 -327 788 -85 640 -423 1306 -581 665 -476 665 -257 926 -305 600 -828 1419 -957 1645 -22 783 -760 1281 -890 1141 -756 1272 -852 1339 -162 1155 -661 1360 -328 597 -81 549 diff --git a/geom_bottleneck/tests/data/test_855_B b/geom_bottleneck/tests/data/test_855_B deleted file mode 100644 index be6ff94..0000000 --- a/geom_bottleneck/tests/data/test_855_B +++ /dev/null @@ -1,50 +0,0 @@ -758 1131 -201 805 -622 704 -457 770 -211 1153 -604 1593 -658 1229 -845 1733 -3 55 -813 1682 -926 1122 -87 399 -415 1287 -943 1357 -538 884 -39 447 -678 1201 -469 977 -445 1406 -931 992 -137 843 -914 1789 -736 1382 -933 1376 -426 1190 -332 715 -385 1226 -727 1493 -972 1306 -674 1674 -801 1277 -542 1301 -591 1067 -318 1136 -90 552 -168 232 -814 1715 -860 1249 -104 353 -841 1674 -775 1615 -517 693 -103 261 -472 517 -56 570 -767 1433 -839 1303 -683 1605 -311 700 -89 256 diff --git a/geom_bottleneck/tests/data/test_856_A b/geom_bottleneck/tests/data/test_856_A deleted file mode 100644 index 3cbfae3..0000000 --- a/geom_bottleneck/tests/data/test_856_A +++ /dev/null @@ -1,50 +0,0 @@ -719 1457 -209 663 -890 1735 -774 1570 -582 935 -231 1051 -723 1681 -341 1197 -4 150 -30 263 -38 984 -950 1487 -523 609 -453 854 -956 1422 -180 436 -690 966 -848 1237 -972 1095 -120 843 -523 1438 -49 182 -294 622 -586 1385 -750 786 -856 1407 -327 1270 -655 957 -373 1358 -372 785 -727 1497 -308 567 -784 1046 -315 913 -862 1742 -699 1337 -24 662 -407 455 -24 393 -913 1501 -13 1005 -709 1107 -264 1079 -107 781 -275 805 -164 179 -445 1355 -907 1785 -571 629 -953 1080 diff --git a/geom_bottleneck/tests/data/test_856_B b/geom_bottleneck/tests/data/test_856_B deleted file mode 100644 index ec34ae9..0000000 --- a/geom_bottleneck/tests/data/test_856_B +++ /dev/null @@ -1,50 +0,0 @@ -724 1643 -458 1388 -638 1303 -431 1405 -710 861 -659 723 -714 1351 -402 1186 -730 1584 -304 788 -845 850 -331 451 -421 1121 -821 1257 -2 923 -246 1167 -776 1109 -307 963 -553 1262 -841 1061 -27 290 -507 1297 -471 935 -583 1176 -781 955 -286 703 -178 303 -674 1372 -942 968 -521 1497 -6 593 -198 375 -263 1085 -486 1143 -807 1093 -17 795 -921 1559 -577 1316 -45 282 -670 1319 -228 400 -480 1047 -477 1308 -971 1055 -336 396 -731 941 -995 1354 -535 1309 -648 1642 -441 1432 diff --git a/geom_bottleneck/tests/data/test_857_A b/geom_bottleneck/tests/data/test_857_A deleted file mode 100644 index 6bbbf0b..0000000 --- a/geom_bottleneck/tests/data/test_857_A +++ /dev/null @@ -1,50 +0,0 @@ -155 1103 -527 601 -613 714 -27 82 -288 1267 -522 713 -839 925 -554 1132 -148 255 -692 1319 -216 257 -11 251 -199 862 -371 724 -728 1561 -314 918 -452 540 -30 958 -745 1698 -434 1341 -469 1469 -913 1715 -599 1267 -260 953 -182 511 -504 1442 -597 1080 -300 888 -459 1000 -563 1521 -563 1468 -760 1702 -8 519 -393 910 -108 255 -375 1168 -344 1257 -563 1052 -813 1139 -999 1599 -175 785 -847 882 -825 1567 -977 1567 -218 847 -921 1150 -888 1280 -395 761 -495 1444 -195 1091 diff --git a/geom_bottleneck/tests/data/test_857_B b/geom_bottleneck/tests/data/test_857_B deleted file mode 100644 index 2d0ac7d..0000000 --- a/geom_bottleneck/tests/data/test_857_B +++ /dev/null @@ -1,50 +0,0 @@ -781 853 -693 1641 -405 573 -301 1124 -303 1182 -839 1546 -597 1040 -56 318 -13 902 -667 878 -555 979 -486 1277 -647 782 -602 1195 -218 288 -59 487 -581 822 -703 842 -123 587 -173 609 -841 975 -554 641 -828 1660 -872 1486 -511 1069 -454 942 -933 1266 -416 643 -59 582 -278 354 -687 901 -1 930 -473 917 -604 950 -122 639 -126 987 -105 1046 -705 1298 -749 1143 -394 417 -15 16 -356 751 -955 1065 -599 813 -881 1008 -984 1857 -531 1371 -354 668 -747 1406 -738 1675 diff --git a/geom_bottleneck/tests/data/test_858_A b/geom_bottleneck/tests/data/test_858_A deleted file mode 100644 index 1d3b9ad..0000000 --- a/geom_bottleneck/tests/data/test_858_A +++ /dev/null @@ -1,50 +0,0 @@ -997 1050 -873 1795 -636 907 -851 1847 -38 669 -941 1873 -706 814 -776 882 -723 1329 -578 1461 -697 727 -369 1010 -426 1101 -552 720 -196 1177 -346 515 -701 1633 -399 514 -937 1425 -566 1446 -605 962 -260 696 -675 1180 -359 672 -192 355 -919 1323 -38 663 -688 1298 -239 504 -349 402 -842 1446 -831 1046 -442 770 -78 160 -351 1088 -577 1360 -29 290 -290 507 -467 1363 -1000 1796 -58 709 -428 615 -397 470 -628 1481 -874 1036 -32 84 -349 524 -244 821 -552 654 -762 1121 diff --git a/geom_bottleneck/tests/data/test_858_B b/geom_bottleneck/tests/data/test_858_B deleted file mode 100644 index a982114..0000000 --- a/geom_bottleneck/tests/data/test_858_B +++ /dev/null @@ -1,50 +0,0 @@ -788 1123 -394 925 -228 647 -718 993 -774 961 -984 1106 -712 1001 -607 1594 -627 967 -971 1710 -166 510 -25 544 -985 1358 -205 1127 -844 1792 -510 518 -479 517 -828 1454 -61 1061 -647 1410 -727 1585 -94 479 -768 922 -162 895 -735 754 -951 1358 -747 1267 -933 980 -319 1007 -183 1000 -521 778 -129 375 -235 1221 -392 808 -872 1465 -380 794 -915 1896 -242 621 -908 1118 -341 593 -393 1304 -469 1169 -733 1077 -979 1477 -786 1583 -923 1650 -867 896 -714 1479 -860 907 -310 461 diff --git a/geom_bottleneck/tests/data/test_859_A b/geom_bottleneck/tests/data/test_859_A deleted file mode 100644 index 24bd533..0000000 --- a/geom_bottleneck/tests/data/test_859_A +++ /dev/null @@ -1,50 +0,0 @@ -305 883 -599 1497 -157 582 -832 1048 -62 403 -263 1151 -898 962 -258 428 -309 729 -626 1318 -279 415 -635 1029 -898 974 -733 1187 -661 1430 -243 1046 -498 865 -70 189 -834 1801 -820 1278 -972 1686 -255 826 -761 1694 -383 593 -326 491 -442 684 -523 1381 -229 1215 -402 551 -514 1133 -493 677 -415 996 -301 389 -586 1554 -21 956 -861 1058 -625 1082 -599 1208 -672 1147 -335 1229 -119 282 -114 772 -104 250 -236 977 -804 1446 -310 1229 -727 1176 -660 1484 -650 1188 -782 1781 diff --git a/geom_bottleneck/tests/data/test_859_B b/geom_bottleneck/tests/data/test_859_B deleted file mode 100644 index ac8c3b7..0000000 --- a/geom_bottleneck/tests/data/test_859_B +++ /dev/null @@ -1,50 +0,0 @@ -676 874 -562 574 -260 841 -590 1249 -517 1185 -85 807 -447 909 -50 185 -961 1522 -825 1594 -159 879 -105 1015 -767 1661 -828 1827 -341 355 -104 716 -1000 1615 -135 156 -580 1099 -898 1322 -797 1442 -145 272 -397 427 -289 717 -147 535 -543 1442 -491 761 -315 888 -943 1377 -941 1582 -703 1561 -873 1055 -981 1494 -933 989 -54 194 -842 1269 -901 1394 -346 1035 -858 1198 -864 1606 -122 873 -587 936 -705 1286 -176 754 -690 1066 -950 1037 -346 781 -474 1279 -180 1172 -957 1613 diff --git a/geom_bottleneck/tests/data/test_860_A b/geom_bottleneck/tests/data/test_860_A deleted file mode 100644 index bef7e26..0000000 --- a/geom_bottleneck/tests/data/test_860_A +++ /dev/null @@ -1,100 +0,0 @@ -286 883 -351 366 -209 489 -760 1212 -838 1652 -595 660 -603 1448 -39 243 -601 832 -245 589 -258 1170 -586 1359 -639 1499 -233 1078 -722 781 -998 1722 -867 952 -85 635 -625 1224 -545 1458 -103 885 -227 270 -397 911 -28 776 -893 1191 -600 929 -554 1437 -510 611 -768 769 -396 540 -753 1168 -508 915 -609 874 -804 1177 -777 1596 -547 844 -63 286 -979 1153 -672 1523 -620 1414 -189 629 -841 889 -329 1319 -234 432 -267 1009 -441 1379 -954 1894 -908 1341 -313 1305 -671 1250 -296 992 -518 1355 -596 905 -169 366 -333 524 -73 352 -670 1216 -459 560 -945 1546 -279 561 -27 773 -701 1354 -768 1673 -778 829 -698 1194 -680 1054 -138 954 -957 1332 -873 1110 -215 605 -997 1772 -785 935 -985 1406 -999 1441 -849 924 -547 721 -80 977 -181 321 -44 87 -561 763 -448 1065 -694 711 -539 904 -522 1201 -951 1434 -467 766 -261 1178 -900 1180 -440 1158 -134 1038 -375 383 -383 722 -974 1675 -105 380 -42 94 -855 877 -176 220 -379 952 -415 1095 -273 1064 diff --git a/geom_bottleneck/tests/data/test_860_B b/geom_bottleneck/tests/data/test_860_B deleted file mode 100644 index 36f7915..0000000 --- a/geom_bottleneck/tests/data/test_860_B +++ /dev/null @@ -1,100 +0,0 @@ -54 531 -338 1142 -464 1266 -979 1648 -714 782 -478 592 -490 1025 -958 1817 -518 1232 -259 955 -628 1122 -47 423 -831 1649 -30 971 -833 1292 -304 784 -824 1612 -267 1156 -839 926 -190 200 -817 1817 -876 1083 -654 1410 -665 1309 -226 671 -584 640 -234 1111 -806 1282 -227 642 -80 717 -608 1151 -60 808 -216 928 -177 644 -218 1177 -690 1266 -450 1313 -309 861 -979 1696 -210 1066 -461 1403 -317 680 -313 722 -112 770 -166 746 -275 515 -566 1020 -575 931 -483 851 -807 1561 -137 467 -539 1148 -539 1511 -323 563 -633 1434 -287 1046 -260 320 -785 1657 -665 1299 -123 1038 -731 1330 -844 1161 -783 785 -212 619 -712 1288 -617 761 -367 381 -613 1128 -249 372 -977 1165 -202 504 -553 1006 -760 1241 -621 1168 -761 1372 -920 1579 -541 1430 -890 1618 -20 801 -495 809 -685 1544 -709 1130 -321 1130 -802 1219 -122 740 -660 1369 -283 810 -424 425 -475 580 -616 1579 -669 1244 -223 1000 -57 188 -365 1019 -775 1711 -451 512 -234 627 -741 1601 -526 1293 -911 1233 diff --git a/geom_bottleneck/tests/data/test_861_A b/geom_bottleneck/tests/data/test_861_A deleted file mode 100644 index 1058733..0000000 --- a/geom_bottleneck/tests/data/test_861_A +++ /dev/null @@ -1,100 +0,0 @@ -127 281 -555 671 -852 1188 -977 1877 -824 1400 -698 772 -759 1378 -901 1755 -445 1382 -653 1090 -781 1672 -314 1003 -826 861 -86 713 -880 1567 -253 886 -285 1117 -742 1603 -867 1483 -14 632 -845 1280 -649 1074 -322 897 -68 387 -618 679 -918 935 -89 1077 -586 1247 -52 917 -550 1169 -426 952 -535 860 -485 1229 -152 400 -241 1071 -77 181 -795 948 -942 1437 -728 811 -119 577 -433 921 -492 1054 -582 881 -813 1720 -40 497 -389 500 -542 570 -570 580 -672 953 -754 1221 -362 468 -707 1394 -146 927 -142 1098 -820 1494 -539 1194 -422 1194 -277 1109 -975 1238 -718 1181 -1 133 -887 1015 -961 1428 -758 1212 -48 554 -945 1432 -302 1165 -742 1046 -941 1415 -468 634 -964 1097 -220 232 -970 1602 -876 1222 -712 737 -131 471 -939 1209 -579 1496 -953 1937 -295 1269 -757 1470 -141 236 -649 712 -895 1621 -806 1653 -61 736 -695 948 -986 1051 -630 1053 -637 643 -951 1857 -991 1205 -982 1752 -395 549 -216 323 -803 1202 -976 1731 -866 1223 -540 1029 -786 805 diff --git a/geom_bottleneck/tests/data/test_861_B b/geom_bottleneck/tests/data/test_861_B deleted file mode 100644 index a6a11d7..0000000 --- a/geom_bottleneck/tests/data/test_861_B +++ /dev/null @@ -1,100 +0,0 @@ -517 1489 -251 612 -436 1287 -158 969 -181 653 -176 187 -494 1323 -174 1154 -896 926 -101 733 -416 984 -583 763 -161 512 -111 495 -991 1712 -827 854 -342 877 -13 212 -808 1594 -423 1182 -219 666 -195 233 -347 708 -979 1787 -758 1254 -414 1279 -421 563 -340 722 -209 552 -258 704 -776 1610 -672 972 -412 1195 -48 846 -946 1569 -844 1094 -891 1866 -430 925 -661 1317 -819 1214 -837 1824 -731 982 -14 53 -333 1086 -512 868 -789 1264 -15 313 -256 973 -678 1052 -259 1229 -969 1150 -602 1255 -302 1291 -257 1082 -756 1579 -103 110 -125 960 -368 1258 -183 1001 -559 1106 -447 944 -784 1446 -947 1735 -982 1775 -586 1368 -239 1171 -210 856 -94 1017 -138 1075 -59 657 -440 1015 -978 1530 -785 1259 -381 963 -463 1115 -785 1398 -0 147 -952 1432 -573 1345 -592 1443 -829 1357 -250 966 -948 1110 -848 1569 -251 904 -945 1606 -99 1025 -799 863 -690 1141 -21 445 -860 1338 -43 130 -148 853 -261 979 -177 324 -400 1084 -277 1098 -888 1223 -948 1629 -573 1197 diff --git a/geom_bottleneck/tests/data/test_862_A b/geom_bottleneck/tests/data/test_862_A deleted file mode 100644 index d37d3ef..0000000 --- a/geom_bottleneck/tests/data/test_862_A +++ /dev/null @@ -1,100 +0,0 @@ -102 300 -352 359 -521 683 -515 1057 -914 1269 -100 498 -589 1272 -77 129 -417 487 -579 1450 -101 780 -36 807 -588 1009 -556 1004 -875 1497 -488 1097 -842 1462 -221 1204 -328 518 -186 828 -870 992 -309 931 -56 558 -780 1456 -164 1070 -472 934 -412 1210 -842 872 -575 1445 -755 1457 -250 571 -426 1223 -367 1073 -648 749 -303 1009 -147 491 -118 1002 -320 398 -473 1445 -817 1679 -35 369 -170 947 -953 1168 -169 278 -307 547 -260 507 -901 1598 -116 381 -241 765 -98 970 -216 1171 -746 1175 -605 1578 -601 1019 -598 967 -316 723 -838 1609 -78 357 -563 893 -545 1089 -813 1743 -981 1110 -454 514 -613 799 -742 1712 -620 764 -464 702 -643 1186 -674 1638 -418 669 -310 1147 -325 1015 -983 1678 -625 951 -407 750 -973 1792 -552 1354 -391 1120 -463 829 -716 1387 -6 403 -177 756 -505 708 -219 471 -187 714 -852 1248 -913 1610 -971 1722 -943 1812 -452 726 -509 624 -178 767 -699 1085 -771 1634 -140 251 -646 822 -456 754 -263 1179 -430 540 -96 810 diff --git a/geom_bottleneck/tests/data/test_862_B b/geom_bottleneck/tests/data/test_862_B deleted file mode 100644 index a18168e..0000000 --- a/geom_bottleneck/tests/data/test_862_B +++ /dev/null @@ -1,100 +0,0 @@ -123 340 -973 1465 -652 1288 -89 1046 -165 777 -390 986 -139 396 -378 927 -426 1167 -32 223 -259 1177 -771 1250 -494 1143 -528 759 -515 912 -319 992 -134 169 -851 1595 -676 816 -111 304 -35 872 -58 456 -522 1458 -392 1221 -112 1035 -471 1214 -495 580 -339 1276 -143 268 -12 788 -723 1470 -745 1088 -664 1449 -442 463 -268 1026 -289 910 -141 162 -411 1163 -626 1174 -743 1627 -261 1211 -950 1869 -214 1114 -995 1678 -586 960 -754 1098 -363 1013 -808 1761 -58 601 -267 1109 -571 1518 -639 1092 -565 785 -256 537 -490 509 -467 1036 -931 1450 -891 1584 -701 1280 -939 1642 -416 834 -72 964 -530 553 -224 331 -234 683 -722 1338 -190 496 -282 1201 -174 1133 -348 690 -799 1606 -891 1085 -408 1263 -204 522 -867 1729 -856 1102 -175 589 -827 1559 -880 1479 -558 720 -810 1534 -954 1315 -501 901 -675 1031 -721 1091 -265 1103 -670 1553 -587 614 -712 735 -713 1167 -565 714 -67 594 -928 1456 -375 449 -893 1022 -319 500 -101 783 -637 1572 -26 620 -107 845 diff --git a/geom_bottleneck/tests/data/test_863_A b/geom_bottleneck/tests/data/test_863_A deleted file mode 100644 index 011d452..0000000 --- a/geom_bottleneck/tests/data/test_863_A +++ /dev/null @@ -1,100 +0,0 @@ -596 1590 -388 1099 -928 1387 -473 1128 -595 925 -188 767 -40 804 -542 1405 -661 1245 -579 666 -526 616 -235 378 -379 477 -257 781 -910 1279 -882 1387 -562 1374 -499 603 -342 1317 -184 581 -315 1198 -987 1072 -696 1049 -498 1250 -782 1609 -771 1330 -203 354 -227 1171 -506 939 -360 1303 -969 1942 -772 850 -615 1079 -542 1186 -644 1583 -676 1131 -496 1300 -825 1120 -492 1332 -408 1051 -768 1110 -466 1044 -795 1594 -56 577 -529 1378 -899 1752 -943 1916 -509 780 -609 1175 -999 1928 -360 1164 -901 1764 -558 592 -665 752 -7 82 -919 1683 -772 1057 -211 928 -494 1347 -568 1412 -661 1649 -466 551 -75 498 -329 577 -143 636 -112 144 -217 221 -340 1208 -259 1177 -36 364 -63 299 -74 513 -67 186 -201 672 -508 1253 -96 129 -301 991 -925 1873 -340 1050 -237 672 -445 816 -836 1594 -649 1458 -227 1152 -880 933 -209 939 -822 890 -760 1131 -274 1096 -706 1604 -33 589 -552 1228 -69 615 -794 914 -305 423 -956 1053 -914 1411 -421 1282 -261 1067 -967 1966 diff --git a/geom_bottleneck/tests/data/test_863_B b/geom_bottleneck/tests/data/test_863_B deleted file mode 100644 index d9daaae..0000000 --- a/geom_bottleneck/tests/data/test_863_B +++ /dev/null @@ -1,100 +0,0 @@ -986 1775 -226 644 -68 818 -739 1449 -962 1111 -850 1460 -306 1206 -901 1742 -171 513 -83 396 -776 1243 -646 948 -693 1431 -219 627 -247 813 -243 1070 -452 1130 -315 1227 -16 808 -977 1035 -454 583 -566 1521 -437 507 -484 1294 -494 506 -752 1161 -152 1081 -566 1413 -141 331 -706 1243 -258 849 -729 1447 -988 1985 -774 1653 -972 1907 -510 589 -402 905 -981 1420 -688 1112 -291 1016 -975 1800 -240 879 -643 1264 -448 458 -707 1075 -157 654 -51 635 -639 677 -688 1518 -99 198 -914 1734 -445 1036 -897 941 -504 1318 -192 479 -287 1003 -624 1444 -815 961 -956 1436 -445 656 -52 574 -787 987 -994 1875 -354 1317 -189 1072 -264 418 -645 1086 -319 942 -202 676 -841 1204 -695 1354 -289 748 -631 649 -894 1632 -909 1782 -794 1065 -0 430 -4 209 -286 1174 -327 1132 -342 641 -455 1256 -295 819 -749 1381 -811 1469 -69 514 -54 1044 -262 1176 -418 854 -819 1524 -861 1796 -242 996 -990 1068 -19 519 -831 1475 -782 1334 -748 986 -869 1569 -556 1535 -685 1411 diff --git a/geom_bottleneck/tests/data/test_864_A b/geom_bottleneck/tests/data/test_864_A deleted file mode 100644 index f82ed50..0000000 --- a/geom_bottleneck/tests/data/test_864_A +++ /dev/null @@ -1,100 +0,0 @@ -698 789 -78 479 -383 639 -731 1686 -306 787 -614 696 -719 1184 -404 852 -317 776 -91 656 -126 806 -19 775 -976 1941 -876 1716 -501 1160 -851 1078 -547 641 -187 372 -654 1080 -745 1229 -151 577 -219 600 -318 1253 -317 362 -720 1487 -147 720 -900 1717 -402 1317 -187 1156 -573 1301 -173 479 -613 889 -956 1747 -583 1203 -478 1031 -498 1031 -394 1197 -118 842 -204 246 -562 1361 -340 835 -749 871 -847 1637 -776 1643 -731 1242 -302 741 -312 369 -903 1276 -814 1418 -205 336 -485 1196 -897 1667 -442 562 -319 1253 -56 469 -674 923 -51 642 -487 739 -32 759 -631 1091 -219 293 -381 419 -179 761 -935 1358 -408 636 -355 831 -677 1286 -98 306 -893 922 -275 1275 -350 923 -583 1490 -562 1545 -213 634 -538 870 -270 301 -536 1323 -663 1279 -286 325 -1 331 -927 1472 -998 1673 -404 484 -368 1234 -650 803 -238 845 -956 1851 -278 1002 -767 1110 -176 190 -808 841 -910 1693 -242 1010 -523 1133 -364 543 -915 1652 -401 1326 -787 1236 -250 985 -884 1153 diff --git a/geom_bottleneck/tests/data/test_864_B b/geom_bottleneck/tests/data/test_864_B deleted file mode 100644 index 0b56a95..0000000 --- a/geom_bottleneck/tests/data/test_864_B +++ /dev/null @@ -1,100 +0,0 @@ -11 893 -131 282 -718 1633 -802 822 -342 857 -797 1757 -703 704 -296 1271 -439 868 -143 1065 -860 1380 -62 101 -536 1375 -526 533 -482 1222 -338 1199 -665 770 -85 713 -829 930 -366 710 -300 757 -561 1556 -904 905 -711 1575 -30 766 -710 898 -476 897 -592 1142 -731 1153 -799 1176 -31 769 -570 718 -620 1438 -718 1198 -938 1650 -31 296 -342 929 -953 1681 -650 896 -868 1404 -800 1680 -776 1229 -612 1330 -362 1338 -958 1066 -269 978 -981 1035 -160 322 -673 795 -150 1117 -564 1490 -737 1617 -492 1040 -599 954 -261 1094 -691 734 -318 1231 -157 546 -329 916 -982 1956 -211 719 -665 1381 -911 1689 -368 425 -459 749 -706 1410 -103 539 -134 476 -209 341 -469 589 -350 462 -789 1113 -945 1335 -936 1272 -886 1823 -958 1528 -96 492 -532 1243 -119 577 -322 367 -518 1434 -692 839 -509 1104 -668 1357 -139 1127 -258 300 -307 382 -156 403 -171 582 -411 701 -794 944 -937 1602 -6 60 -593 929 -977 1052 -221 1209 -603 832 -881 1176 -394 710 -660 1260 diff --git a/geom_bottleneck/tests/data/test_865_A b/geom_bottleneck/tests/data/test_865_A deleted file mode 100644 index 7453ead..0000000 --- a/geom_bottleneck/tests/data/test_865_A +++ /dev/null @@ -1,100 +0,0 @@ -680 1206 -916 1092 -447 722 -821 1233 -565 1508 -548 1163 -973 1156 -229 1196 -378 542 -334 619 -581 606 -171 644 -143 407 -857 1539 -129 337 -582 780 -378 441 -196 340 -619 746 -28 94 -294 590 -881 1520 -113 174 -1000 1989 -343 395 -633 1542 -348 988 -973 1914 -58 903 -510 767 -440 448 -876 1806 -932 1554 -367 917 -465 820 -359 1185 -793 820 -999 1064 -193 871 -409 1286 -224 631 -381 793 -650 1047 -493 524 -698 1162 -846 1083 -536 1456 -909 1650 -245 982 -714 1104 -867 1447 -709 1527 -831 859 -170 266 -31 541 -578 650 -960 1059 -147 741 -202 407 -110 136 -747 1087 -781 1489 -759 1738 -945 1542 -790 1588 -52 259 -290 1116 -561 1416 -200 740 -50 629 -907 1349 -312 708 -87 433 -33 920 -934 1278 -530 706 -760 879 -834 1301 -819 1372 -656 1622 -950 1152 -452 692 -426 798 -469 811 -158 554 -563 1532 -713 1332 -567 964 -111 921 -237 1102 -156 1100 -113 344 -553 1386 -880 982 -355 655 -81 959 -203 437 -848 1389 -7 377 -305 717 diff --git a/geom_bottleneck/tests/data/test_865_B b/geom_bottleneck/tests/data/test_865_B deleted file mode 100644 index 265e3bd..0000000 --- a/geom_bottleneck/tests/data/test_865_B +++ /dev/null @@ -1,100 +0,0 @@ -121 979 -358 852 -219 696 -216 239 -200 737 -859 1771 -323 826 -192 1007 -129 389 -489 1130 -227 568 -806 1657 -613 1508 -626 1325 -643 1425 -905 1619 -123 372 -26 371 -949 1838 -399 1361 -516 652 -273 485 -346 753 -975 1839 -276 789 -824 893 -937 1262 -34 37 -444 993 -133 860 -190 421 -978 1903 -56 733 -421 756 -583 590 -133 371 -881 1309 -897 1347 -442 979 -700 941 -871 1095 -34 182 -206 603 -858 1533 -284 821 -241 1167 -623 989 -715 1664 -187 822 -970 1681 -26 153 -533 648 -406 873 -791 862 -217 983 -211 930 -781 1001 -973 1393 -204 845 -23 894 -11 772 -863 1663 -126 233 -306 835 -85 370 -802 1738 -526 1171 -429 1118 -697 1462 -196 512 -887 902 -7 401 -881 1262 -743 1392 -676 733 -527 1394 -911 1179 -816 1280 -513 1072 -842 1750 -942 1260 -841 1438 -86 704 -308 639 -478 1085 -56 220 -411 1045 -185 1141 -941 1695 -465 1360 -157 665 -19 599 -540 891 -832 1200 -408 1232 -540 1207 -881 1721 -496 691 -623 1295 -811 873 diff --git a/geom_bottleneck/tests/data/test_866_A b/geom_bottleneck/tests/data/test_866_A deleted file mode 100644 index a05ad71..0000000 --- a/geom_bottleneck/tests/data/test_866_A +++ /dev/null @@ -1,100 +0,0 @@ -554 1091 -21 867 -633 899 -500 663 -971 975 -410 1235 -179 1036 -438 917 -434 678 -378 520 -747 1564 -39 131 -748 1408 -581 1266 -818 915 -527 1287 -452 998 -585 1061 -224 244 -554 1427 -859 1079 -613 1539 -522 738 -392 1170 -788 1437 -288 680 -370 1117 -476 1151 -826 1129 -41 551 -96 839 -480 1110 -909 1050 -59 1059 -549 801 -124 198 -991 1323 -122 1026 -573 1345 -701 1061 -40 265 -872 1116 -579 1464 -807 1198 -269 553 -376 786 -711 866 -864 1301 -716 1185 -366 775 -1000 1991 -970 1156 -921 1050 -599 1510 -49 593 -475 1394 -764 1704 -516 912 -721 805 -986 1006 -728 852 -789 1097 -459 597 -967 1276 -261 1126 -906 920 -466 1134 -419 467 -638 818 -243 738 -188 906 -434 1199 -821 892 -885 1241 -7 664 -963 1398 -576 1142 -84 385 -20 308 -845 1162 -79 730 -203 625 -412 1054 -553 898 -752 920 -640 1312 -169 706 -920 1586 -134 246 -352 619 -90 716 -197 616 -819 1101 -805 1686 -543 1178 -482 1411 -297 1259 -957 1763 -355 808 -591 1221 diff --git a/geom_bottleneck/tests/data/test_866_B b/geom_bottleneck/tests/data/test_866_B deleted file mode 100644 index c3e0b3a..0000000 --- a/geom_bottleneck/tests/data/test_866_B +++ /dev/null @@ -1,100 +0,0 @@ -573 1390 -68 742 -178 1172 -592 975 -294 453 -280 552 -750 1332 -947 1248 -972 1885 -868 942 -269 719 -457 944 -863 1391 -802 1524 -64 235 -161 495 -439 1397 -143 354 -974 1778 -239 643 -831 1814 -216 969 -515 1065 -334 1263 -504 1264 -950 1570 -558 976 -84 242 -125 745 -382 448 -602 1380 -98 211 -994 1767 -140 712 -694 1187 -523 901 -906 970 -65 850 -188 858 -787 1715 -836 1543 -356 1082 -9 932 -945 1142 -653 756 -934 1085 -526 1465 -636 1544 -711 1660 -63 607 -279 482 -716 768 -380 543 -210 885 -597 1476 -172 837 -542 1257 -465 557 -983 1339 -647 1098 -643 1101 -239 688 -658 1241 -448 595 -320 641 -622 673 -788 824 -2 645 -456 1068 -707 984 -334 1093 -81 601 -413 813 -311 345 -129 827 -253 556 -971 1376 -291 534 -846 1646 -61 699 -552 1406 -583 866 -285 635 -772 1351 -937 1014 -688 709 -425 906 -750 1220 -395 685 -93 392 -596 1460 -749 1123 -631 843 -100 311 -774 991 -873 1870 -297 422 -856 1311 -983 1053 -746 1722 diff --git a/geom_bottleneck/tests/data/test_867_A b/geom_bottleneck/tests/data/test_867_A deleted file mode 100644 index 0e5ca13..0000000 --- a/geom_bottleneck/tests/data/test_867_A +++ /dev/null @@ -1,100 +0,0 @@ -324 1024 -307 1299 -253 1161 -488 662 -711 1205 -481 510 -910 1280 -465 1426 -800 1294 -664 1348 -676 1342 -946 1581 -956 1482 -70 194 -312 636 -477 1373 -465 1242 -720 1446 -850 1798 -354 386 -657 998 -126 306 -800 1781 -695 1218 -69 522 -832 1255 -553 1007 -796 1602 -889 1204 -390 1048 -792 1754 -493 1394 -71 545 -200 996 -28 103 -705 1003 -315 489 -140 903 -161 296 -697 1682 -748 1663 -360 1052 -226 776 -18 564 -417 449 -234 350 -639 1585 -574 788 -862 1581 -950 1575 -268 532 -946 1194 -386 613 -782 1325 -494 1069 -792 846 -453 1409 -444 1022 -268 554 -319 792 -187 932 -491 1155 -93 253 -986 1147 -758 1167 -424 780 -194 891 -360 1218 -59 457 -625 1514 -618 919 -680 1182 -31 358 -544 744 -529 1135 -859 1346 -533 1132 -833 873 -583 733 -695 1156 -102 1023 -542 1132 -317 640 -883 1183 -696 1191 -603 1489 -492 1373 -935 1085 -235 620 -37 549 -802 1022 -211 508 -907 1146 -989 1239 -68 909 -367 919 -626 827 -770 1592 -413 414 -427 620 diff --git a/geom_bottleneck/tests/data/test_867_B b/geom_bottleneck/tests/data/test_867_B deleted file mode 100644 index c8eb5e0..0000000 --- a/geom_bottleneck/tests/data/test_867_B +++ /dev/null @@ -1,100 +0,0 @@ -780 1730 -13 771 -347 670 -699 1353 -924 1139 -806 1496 -537 561 -756 1433 -987 1945 -689 1191 -123 972 -46 99 -468 961 -722 997 -675 1491 -626 1171 -315 1095 -582 741 -445 1083 -974 1633 -543 1308 -829 1343 -414 1038 -817 1254 -596 619 -94 438 -545 955 -832 1672 -0 240 -110 729 -444 1151 -331 1174 -684 765 -612 1448 -369 1181 -675 1243 -758 1008 -716 858 -618 931 -642 1279 -219 593 -650 751 -228 998 -40 93 -181 758 -372 658 -87 607 -190 1136 -990 1325 -232 991 -205 1111 -497 965 -767 1480 -896 1862 -777 1234 -790 1452 -734 1521 -457 1207 -934 979 -617 948 -217 767 -654 1122 -902 1565 -951 984 -250 644 -63 299 -726 1472 -406 1249 -749 777 -140 250 -235 1047 -118 1003 -728 833 -158 1021 -243 801 -112 330 -10 912 -629 796 -954 1471 -764 1267 -598 1299 -131 899 -103 405 -187 456 -985 1359 -228 599 -440 1326 -776 852 -156 847 -295 558 -453 786 -236 560 -948 1458 -599 1174 -482 869 -857 1110 -978 1947 -424 446 -699 1688 -886 1793 diff --git a/geom_bottleneck/tests/data/test_868_A b/geom_bottleneck/tests/data/test_868_A deleted file mode 100644 index 0a0fad2..0000000 --- a/geom_bottleneck/tests/data/test_868_A +++ /dev/null @@ -1,100 +0,0 @@ -430 1257 -813 1021 -677 1089 -222 1147 -837 1410 -931 1488 -664 1192 -946 1885 -492 1036 -808 1524 -389 1210 -953 1056 -96 797 -818 1592 -900 1074 -63 516 -46 961 -999 1353 -797 1101 -343 1142 -355 459 -384 1358 -401 800 -354 1100 -661 1246 -76 437 -19 581 -385 760 -704 1218 -25 332 -406 1275 -838 1648 -57 335 -501 638 -826 1431 -682 1568 -803 1533 -894 1845 -38 580 -54 835 -448 507 -132 538 -226 1080 -307 489 -339 596 -334 1283 -573 891 -844 1119 -674 949 -998 1669 -226 599 -487 527 -401 1224 -785 1065 -270 710 -410 545 -981 1732 -602 704 -38 838 -145 646 -671 1128 -621 787 -782 1217 -932 1014 -935 1117 -923 1561 -79 253 -170 548 -343 937 -966 1919 -847 1290 -41 234 -683 926 -279 457 -243 957 -316 1240 -630 1492 -901 1691 -919 1022 -385 574 -902 1474 -640 1197 -805 973 -943 1173 -24 846 -139 140 -48 425 -124 1016 -880 1326 -175 275 -835 1142 -244 331 -770 969 -386 950 -391 886 -334 1284 -754 1503 -179 842 -955 1780 -330 436 diff --git a/geom_bottleneck/tests/data/test_868_B b/geom_bottleneck/tests/data/test_868_B deleted file mode 100644 index 00c87b2..0000000 --- a/geom_bottleneck/tests/data/test_868_B +++ /dev/null @@ -1,100 +0,0 @@ -166 1061 -527 1335 -325 949 -111 649 -488 697 -766 1222 -709 1440 -141 784 -700 939 -798 1136 -861 1837 -628 1376 -473 1366 -145 643 -194 363 -986 1365 -564 979 -870 1837 -451 928 -797 1196 -521 1453 -0 285 -191 1080 -846 1666 -337 494 -790 1644 -759 1570 -46 871 -886 966 -169 897 -55 627 -538 1463 -114 429 -787 827 -850 1806 -31 827 -482 1012 -120 693 -777 1353 -271 916 -15 717 -660 943 -265 446 -985 1045 -22 519 -715 1571 -604 1475 -141 983 -395 1392 -98 851 -179 766 -237 652 -794 1439 -275 451 -47 631 -183 1091 -500 989 -727 1263 -625 1578 -327 1057 -725 1166 -212 731 -699 1449 -471 472 -787 1014 -714 1402 -412 913 -326 1203 -239 592 -920 1395 -303 410 -197 853 -101 1007 -970 1893 -925 1655 -490 670 -158 428 -413 1207 -722 1712 -776 1727 -548 1012 -891 1253 -329 1285 -576 1098 -357 878 -713 1660 -165 726 -786 1231 -447 600 -103 478 -177 764 -386 1263 -307 327 -812 1500 -685 1462 -973 1935 -973 1024 -848 868 -897 1464 -696 1688 diff --git a/geom_bottleneck/tests/data/test_869_A b/geom_bottleneck/tests/data/test_869_A deleted file mode 100644 index fa16527..0000000 --- a/geom_bottleneck/tests/data/test_869_A +++ /dev/null @@ -1,100 +0,0 @@ -723 777 -589 1331 -521 602 -976 1210 -302 783 -550 1430 -254 453 -580 1493 -870 1136 -765 1589 -178 699 -654 1093 -505 739 -285 572 -694 975 -4 681 -733 1644 -258 639 -575 1027 -628 756 -887 1885 -430 1393 -194 371 -57 230 -275 489 -269 458 -254 354 -227 1077 -837 1711 -737 1290 -315 1159 -440 791 -922 1280 -175 615 -137 448 -712 1488 -96 617 -815 1776 -280 540 -595 1107 -545 987 -914 1273 -418 919 -135 1053 -612 653 -194 901 -99 866 -689 1038 -273 789 -350 1046 -433 828 -679 1512 -611 1131 -344 1098 -86 1055 -791 1490 -717 1192 -900 1504 -165 1119 -47 512 -452 858 -290 447 -610 774 -451 1149 -693 809 -513 889 -313 771 -290 604 -419 990 -554 728 -726 1563 -860 1471 -671 767 -735 763 -615 1318 -792 1245 -403 1356 -624 1031 -875 1372 -780 1429 -692 1291 -549 655 -412 1158 -727 982 -780 986 -899 1741 -896 1193 -958 1531 -580 698 -23 296 -735 1275 -400 495 -411 1166 -128 630 -498 1178 -195 459 -829 1674 -678 1531 -329 785 -625 1441 diff --git a/geom_bottleneck/tests/data/test_869_B b/geom_bottleneck/tests/data/test_869_B deleted file mode 100644 index 7ffd8c9..0000000 --- a/geom_bottleneck/tests/data/test_869_B +++ /dev/null @@ -1,100 +0,0 @@ -979 1349 -400 1004 -925 1748 -266 1261 -562 1050 -591 592 -63 630 -404 603 -971 1511 -352 619 -907 1852 -388 830 -8 145 -14 369 -247 938 -648 1230 -625 1083 -231 1003 -926 1824 -143 879 -689 1615 -340 1273 -565 955 -419 443 -92 867 -554 697 -774 1475 -298 1142 -677 1036 -734 811 -831 1211 -585 757 -328 573 -117 789 -575 614 -191 1007 -457 829 -35 193 -518 1335 -5 799 -505 1285 -48 381 -684 990 -767 1230 -953 1161 -51 556 -391 522 -405 419 -217 877 -793 857 -360 455 -259 791 -507 553 -505 1256 -403 842 -981 1524 -223 246 -780 1102 -707 1010 -584 1474 -529 1074 -384 464 -452 668 -28 321 -181 496 -343 1061 -764 1720 -454 1394 -768 822 -217 741 -176 476 -263 306 -914 1258 -526 584 -823 1116 -82 697 -994 1908 -667 982 -231 463 -230 807 -843 1706 -50 369 -521 740 -599 1004 -72 775 -279 502 -833 1423 -880 1593 -371 1093 -703 1272 -815 1096 -125 1058 -497 899 -991 1183 -300 1016 -394 514 -962 1608 -797 1721 -994 1473 -108 421 diff --git a/geom_bottleneck/tests/data/test_870_A b/geom_bottleneck/tests/data/test_870_A deleted file mode 100644 index 72422f7..0000000 --- a/geom_bottleneck/tests/data/test_870_A +++ /dev/null @@ -1,100 +0,0 @@ -60 817 -390 412 -83 364 -762 1271 -949 1643 -874 1468 -411 1354 -897 1800 -66 622 -763 1511 -51 1025 -882 1063 -91 96 -309 1302 -646 1599 -721 1157 -923 1112 -907 1582 -434 517 -854 1679 -719 1601 -38 615 -762 1454 -394 438 -2 40 -828 1110 -994 1556 -647 745 -610 1499 -9 27 -4 572 -829 1229 -44 319 -807 1726 -286 1104 -953 1884 -941 1314 -131 1041 -363 883 -825 1168 -975 1168 -561 1292 -151 204 -465 648 -346 459 -252 1179 -766 917 -583 1401 -353 666 -493 739 -809 1531 -391 964 -410 1172 -180 194 -865 1343 -849 1201 -839 1253 -5 590 -674 1029 -821 1333 -711 874 -557 1038 -101 163 -564 834 -696 707 -631 1249 -762 1107 -343 515 -987 1870 -525 1274 -402 1043 -164 220 -940 1422 -840 1281 -50 1012 -275 1062 -472 790 -61 306 -217 661 -283 1281 -436 972 -952 1838 -374 1049 -577 1482 -486 1288 -743 851 -469 1295 -553 1233 -11 774 -687 1381 -243 481 -399 873 -777 1539 -489 742 -293 513 -755 1047 -881 1154 -757 1457 -261 1097 -693 1283 diff --git a/geom_bottleneck/tests/data/test_870_B b/geom_bottleneck/tests/data/test_870_B deleted file mode 100644 index db4847d..0000000 --- a/geom_bottleneck/tests/data/test_870_B +++ /dev/null @@ -1,100 +0,0 @@ -278 1098 -502 1411 -318 748 -154 189 -605 1475 -556 1482 -377 718 -168 338 -595 921 -962 1686 -301 409 -730 1138 -132 612 -988 1838 -759 1728 -170 465 -654 681 -43 199 -358 1076 -270 316 -602 1382 -657 1138 -211 448 -516 652 -781 1312 -937 1266 -30 227 -769 1102 -91 938 -737 1368 -733 1087 -511 721 -582 997 -261 635 -540 992 -503 590 -189 267 -614 824 -517 1181 -120 447 -545 650 -248 1122 -798 1437 -571 1265 -358 993 -618 1573 -406 861 -540 1382 -213 509 -964 1055 -481 858 -933 1275 -680 1433 -634 665 -963 1365 -612 1163 -895 1316 -95 814 -483 1416 -142 989 -37 588 -17 728 -137 492 -498 1010 -868 1023 -713 1344 -606 1243 -806 1540 -868 1118 -115 780 -329 690 -742 1226 -595 1135 -534 938 -53 175 -627 683 -277 1165 -323 329 -587 869 -308 1234 -266 338 -103 928 -385 863 -628 1620 -157 370 -258 731 -30 588 -202 920 -589 618 -5 221 -882 1659 -68 136 -918 1860 -466 801 -719 1236 -79 664 -562 1234 -258 784 -669 1010 -850 1761 diff --git a/geom_bottleneck/tests/data/test_871_A b/geom_bottleneck/tests/data/test_871_A deleted file mode 100644 index 08ce8b2..0000000 --- a/geom_bottleneck/tests/data/test_871_A +++ /dev/null @@ -1,100 +0,0 @@ -42 835 -829 1708 -683 1618 -329 527 -127 163 -931 1127 -902 1289 -712 755 -344 415 -991 1939 -8 415 -225 1099 -685 1632 -996 1747 -751 1238 -569 1367 -256 401 -711 1157 -58 745 -112 1087 -226 902 -560 1414 -482 1323 -243 382 -672 1335 -202 962 -803 1090 -398 967 -790 1384 -901 1648 -280 296 -684 1484 -432 498 -599 972 -86 497 -703 1327 -730 1472 -889 946 -1000 1305 -735 1569 -606 1155 -916 1843 -246 286 -102 980 -854 1598 -518 944 -341 973 -426 489 -888 1375 -359 409 -49 660 -619 1187 -635 1439 -338 1297 -347 654 -847 989 -161 915 -846 1341 -196 418 -698 1689 -535 634 -407 419 -767 1110 -154 1127 -912 1214 -982 1797 -824 1331 -38 859 -753 867 -297 988 -784 1479 -407 1024 -884 1054 -894 1476 -674 837 -402 1183 -906 1306 -27 471 -672 1594 -480 830 -174 302 -133 928 -858 1186 -541 950 -395 397 -356 1259 -219 1028 -120 465 -703 1595 -9 234 -790 1682 -322 1197 -314 655 -770 1287 -95 775 -444 520 -118 800 -852 1564 -24 333 -906 1508 diff --git a/geom_bottleneck/tests/data/test_871_B b/geom_bottleneck/tests/data/test_871_B deleted file mode 100644 index 23c1dd8..0000000 --- a/geom_bottleneck/tests/data/test_871_B +++ /dev/null @@ -1,100 +0,0 @@ -112 365 -974 1486 -76 198 -108 949 -30 308 -221 985 -687 1236 -255 744 -597 1580 -552 1173 -944 1327 -291 494 -867 1053 -73 595 -265 407 -827 1067 -990 1968 -663 948 -555 1506 -469 1046 -909 939 -59 858 -756 986 -101 335 -57 1047 -516 1348 -615 775 -578 1391 -756 1351 -341 1087 -147 471 -893 1879 -68 603 -433 867 -982 1332 -11 464 -710 1435 -337 967 -468 1092 -282 474 -712 1541 -779 1165 -255 872 -590 1550 -255 949 -316 494 -398 1017 -863 1551 -835 1072 -554 1129 -560 854 -862 1403 -97 304 -71 393 -351 1038 -624 1327 -185 1077 -311 601 -640 736 -542 980 -735 884 -78 879 -230 799 -462 1295 -249 678 -736 900 -867 984 -254 405 -408 543 -271 694 -371 1039 -38 598 -888 1058 -876 1612 -697 1333 -650 1183 -910 1895 -884 1723 -922 1772 -911 1770 -788 1139 -981 1024 -962 1552 -389 612 -661 1027 -583 1188 -649 1291 -793 1505 -442 1158 -356 832 -190 589 -643 713 -496 536 -530 1381 -153 641 -162 335 -629 1071 -110 395 -18 833 -8 423 diff --git a/geom_bottleneck/tests/data/test_872_A b/geom_bottleneck/tests/data/test_872_A deleted file mode 100644 index 9647bed..0000000 --- a/geom_bottleneck/tests/data/test_872_A +++ /dev/null @@ -1,100 +0,0 @@ -357 473 -781 1680 -963 1614 -418 582 -427 979 -738 924 -946 1432 -903 1821 -250 279 -570 1065 -305 1090 -750 756 -317 1028 -865 1402 -464 465 -316 1186 -856 1199 -763 1744 -46 424 -954 1654 -602 843 -232 426 -864 1001 -292 495 -72 455 -907 1762 -575 697 -886 1098 -954 1502 -980 1741 -317 527 -72 711 -614 695 -931 1149 -223 229 -684 1073 -221 897 -1000 1806 -165 358 -454 1067 -569 878 -162 950 -910 1768 -329 508 -247 1201 -469 849 -973 1153 -298 670 -682 1515 -230 777 -876 1085 -438 598 -72 775 -668 687 -254 502 -989 1165 -646 1375 -972 1552 -593 1408 -860 1844 -256 469 -982 1530 -834 1562 -195 280 -81 393 -470 802 -570 667 -95 558 -846 1778 -639 1120 -340 804 -527 530 -413 428 -797 1156 -610 780 -113 323 -287 441 -388 838 -418 743 -859 970 -96 898 -29 592 -396 1004 -463 1417 -641 1130 -880 1301 -176 1121 -286 325 -456 1093 -988 1077 -885 1278 -47 828 -617 1089 -595 1071 -870 895 -661 1423 -720 759 -379 924 -892 1184 -583 589 diff --git a/geom_bottleneck/tests/data/test_872_B b/geom_bottleneck/tests/data/test_872_B deleted file mode 100644 index 1c58840..0000000 --- a/geom_bottleneck/tests/data/test_872_B +++ /dev/null @@ -1,100 +0,0 @@ -153 586 -46 542 -64 130 -498 815 -144 494 -300 1100 -146 383 -431 558 -710 839 -615 648 -680 970 -995 1797 -903 1605 -994 1759 -335 810 -93 670 -928 1252 -754 1015 -941 1668 -105 746 -448 924 -419 1140 -881 1239 -500 831 -794 1571 -780 1613 -892 1155 -133 279 -869 1603 -745 1402 -463 623 -501 686 -510 1155 -806 1373 -302 821 -710 1492 -508 879 -643 787 -494 1172 -427 1018 -37 813 -394 497 -498 1374 -565 1285 -216 453 -315 1039 -356 920 -968 1326 -400 460 -779 964 -179 560 -405 1249 -64 466 -128 978 -99 582 -424 885 -39 675 -912 1624 -531 652 -617 1391 -338 788 -993 1673 -229 301 -879 1305 -356 467 -950 1787 -471 1441 -692 1677 -84 383 -767 1029 -865 1658 -468 988 -854 1028 -483 1097 -898 1321 -605 723 -632 1154 -782 1260 -797 1207 -176 445 -126 827 -333 541 -722 1131 -188 642 -287 1194 -8 607 -955 1136 -44 1000 -515 858 -39 311 -436 1200 -344 1280 -856 1776 -603 1524 -230 617 -953 1413 -592 916 -393 1116 -498 529 -283 734 diff --git a/geom_bottleneck/tests/data/test_873_A b/geom_bottleneck/tests/data/test_873_A deleted file mode 100644 index d9e1da9..0000000 --- a/geom_bottleneck/tests/data/test_873_A +++ /dev/null @@ -1,100 +0,0 @@ -871 918 -442 1110 -786 797 -342 1125 -473 1471 -550 737 -956 1854 -259 420 -592 1059 -861 1049 -50 255 -11 163 -254 810 -649 659 -866 1083 -786 1466 -728 1162 -659 1272 -884 1597 -34 1016 -487 679 -765 1214 -145 505 -994 1925 -711 1474 -207 713 -143 567 -935 1009 -62 1036 -168 713 -7 478 -628 1423 -51 693 -391 575 -18 283 -45 308 -971 1067 -934 1548 -604 1154 -4 558 -425 998 -77 439 -513 1485 -354 1302 -317 816 -5 551 -346 804 -872 1197 -309 418 -691 886 -927 1242 -51 491 -88 645 -835 1584 -377 751 -668 684 -226 1026 -418 691 -335 939 -955 1872 -490 1173 -68 355 -689 740 -284 550 -531 1023 -312 390 -127 875 -3 408 -314 458 -907 932 -489 890 -451 1402 -52 849 -709 1325 -373 1367 -390 1030 -707 1272 -25 607 -742 996 -838 1569 -570 1522 -278 1034 -863 1805 -615 823 -865 1726 -902 1367 -81 1011 -619 1462 -18 422 -433 1195 -154 635 -27 975 -690 1465 -447 1308 -686 1058 -204 1164 -572 1531 -202 609 -772 777 -740 1633 diff --git a/geom_bottleneck/tests/data/test_873_B b/geom_bottleneck/tests/data/test_873_B deleted file mode 100644 index a9f3ea1..0000000 --- a/geom_bottleneck/tests/data/test_873_B +++ /dev/null @@ -1,100 +0,0 @@ -816 1608 -484 669 -486 883 -131 221 -617 1433 -421 578 -277 879 -587 979 -662 783 -275 1001 -538 1142 -135 857 -984 1296 -163 997 -818 1596 -591 1112 -29 465 -156 374 -805 1436 -709 977 -650 1507 -360 1041 -940 1108 -957 1483 -628 775 -109 461 -680 1562 -457 507 -68 693 -795 935 -505 564 -706 951 -60 977 -501 1258 -441 539 -280 658 -787 1427 -311 866 -722 808 -94 679 -979 1850 -408 1002 -246 1068 -125 815 -520 819 -557 1306 -369 1123 -14 940 -666 931 -589 1555 -430 871 -105 907 -294 469 -798 1528 -30 640 -566 1287 -930 1651 -599 691 -139 256 -938 1775 -173 682 -597 899 -430 924 -201 1194 -164 611 -996 1009 -482 807 -680 1375 -281 704 -422 457 -698 963 -742 876 -839 1814 -901 1360 -775 1461 -612 801 -498 1360 -176 707 -430 596 -134 578 -408 742 -867 1346 -66 912 -390 824 -823 1332 -787 1775 -924 1615 -619 1109 -892 1583 -583 904 -591 1270 -805 815 -913 1698 -557 623 -15 98 -28 862 -775 981 -627 1137 -836 1587 -556 988 diff --git a/geom_bottleneck/tests/data/test_874_A b/geom_bottleneck/tests/data/test_874_A deleted file mode 100644 index 4d66819..0000000 --- a/geom_bottleneck/tests/data/test_874_A +++ /dev/null @@ -1,100 +0,0 @@ -401 767 -318 1182 -238 653 -420 702 -684 942 -381 618 -263 1108 -275 381 -659 1140 -301 646 -401 432 -68 350 -147 1106 -670 1593 -792 1332 -779 1462 -129 130 -604 665 -800 1027 -631 945 -961 1286 -767 1426 -123 653 -860 1160 -929 1528 -876 1665 -148 1072 -898 1869 -375 386 -135 943 -847 1128 -455 1273 -28 509 -202 1148 -241 462 -612 732 -655 667 -392 726 -525 655 -993 1778 -241 1229 -185 599 -321 836 -773 1506 -632 1023 -885 1663 -868 985 -84 664 -761 1738 -75 641 -988 1791 -178 992 -34 69 -990 1431 -460 957 -352 453 -102 946 -123 883 -535 1360 -961 1232 -825 885 -259 679 -139 620 -946 1073 -690 753 -39 1022 -741 1612 -662 1215 -156 703 -942 1906 -477 496 -499 737 -175 763 -304 563 -317 1266 -918 1673 -646 686 -941 1023 -502 1266 -811 822 -153 688 -892 1832 -737 1518 -53 475 -140 709 -379 871 -138 816 -228 1106 -272 774 -732 1715 -344 849 -580 971 -983 1855 -312 399 -561 1352 -335 1008 -268 1083 -488 921 -327 449 -177 198 diff --git a/geom_bottleneck/tests/data/test_874_B b/geom_bottleneck/tests/data/test_874_B deleted file mode 100644 index 2142cbc..0000000 --- a/geom_bottleneck/tests/data/test_874_B +++ /dev/null @@ -1,100 +0,0 @@ -682 1578 -580 1035 -713 1240 -664 1644 -492 852 -126 441 -113 329 -144 557 -829 1627 -857 1645 -332 1104 -531 773 -616 1523 -568 831 -251 340 -155 1058 -519 1241 -525 571 -182 334 -148 450 -974 1128 -508 1003 -188 738 -763 1502 -726 1288 -892 954 -418 1171 -414 927 -268 591 -529 1371 -10 396 -379 1371 -578 1428 -493 529 -79 364 -340 1082 -84 653 -847 1396 -905 1164 -526 690 -715 1436 -317 823 -161 223 -19 515 -520 1415 -871 1311 -601 1249 -533 1040 -454 1168 -35 919 -191 668 -102 424 -899 1107 -439 558 -145 1108 -138 1085 -633 756 -616 801 -795 1193 -428 892 -712 1066 -451 723 -294 640 -228 1009 -984 1910 -966 1472 -578 771 -403 896 -341 841 -441 671 -513 665 -137 386 -591 750 -881 1549 -753 1355 -66 695 -500 592 -364 715 -275 485 -841 1194 -204 386 -556 1196 -388 1345 -695 1051 -47 494 -505 1386 -427 933 -635 714 -998 1743 -637 822 -355 1048 -430 1086 -905 1747 -906 1612 -590 804 -709 1164 -852 1511 -205 626 -403 978 -706 1085 diff --git a/geom_bottleneck/tests/data/test_875_A b/geom_bottleneck/tests/data/test_875_A deleted file mode 100644 index 1748357..0000000 --- a/geom_bottleneck/tests/data/test_875_A +++ /dev/null @@ -1,100 +0,0 @@ -501 816 -326 1114 -214 1139 -167 352 -465 1246 -268 284 -830 907 -240 975 -995 1655 -583 822 -320 963 -446 975 -525 1385 -280 1057 -788 978 -238 1027 -731 1643 -154 467 -988 1430 -468 594 -170 779 -931 1377 -332 888 -432 1036 -310 841 -960 1909 -554 1147 -999 1007 -213 626 -667 862 -200 773 -166 657 -830 1352 -698 816 -455 850 -435 1100 -300 584 -935 1403 -544 1425 -78 451 -543 955 -831 1610 -530 633 -443 1150 -16 712 -798 1758 -760 1226 -839 1249 -310 891 -343 553 -341 463 -925 948 -691 851 -899 1768 -486 530 -830 1370 -515 894 -782 1153 -539 1004 -907 1348 -28 395 -335 626 -599 946 -571 1494 -607 1477 -560 1176 -27 63 -190 453 -586 1257 -659 831 -991 1363 -95 851 -226 785 -263 836 -97 531 -768 905 -970 1051 -487 1361 -96 206 -374 979 -539 1321 -837 1108 -776 1081 -381 774 -420 754 -799 983 -636 1239 -863 1608 -531 563 -703 814 -229 958 -874 1208 -553 581 -589 1387 -607 920 -928 1917 -171 351 -571 1035 -528 1318 -168 442 diff --git a/geom_bottleneck/tests/data/test_875_B b/geom_bottleneck/tests/data/test_875_B deleted file mode 100644 index 3a5860e..0000000 --- a/geom_bottleneck/tests/data/test_875_B +++ /dev/null @@ -1,100 +0,0 @@ -380 1025 -918 1126 -119 483 -810 1668 -393 693 -545 1003 -682 862 -357 966 -429 955 -776 1227 -233 522 -559 599 -514 843 -682 906 -535 810 -924 1161 -222 371 -400 741 -561 943 -60 644 -810 1317 -470 1412 -756 1724 -235 1098 -995 1942 -244 776 -189 1011 -549 622 -193 816 -336 535 -232 1076 -614 1332 -38 1001 -764 1255 -337 763 -30 878 -949 1522 -719 741 -446 749 -400 1077 -309 310 -154 677 -458 1246 -476 541 -177 660 -676 1084 -426 968 -422 888 -243 255 -724 901 -994 1350 -623 1151 -387 452 -745 1263 -142 572 -198 388 -789 1416 -445 970 -245 494 -253 499 -401 582 -217 271 -528 1475 -170 850 -978 1681 -68 170 -381 1017 -39 298 -634 1443 -288 447 -867 1061 -24 477 -345 869 -674 1544 -645 1452 -698 723 -838 1195 -419 1214 -468 476 -620 1599 -898 1491 -416 1010 -431 921 -56 242 -867 1451 -759 1102 -396 1226 -559 1364 -212 743 -292 1289 -832 1536 -271 340 -990 1428 -287 1025 -364 839 -471 1138 -17 284 -953 1212 -421 841 -527 1382 diff --git a/geom_bottleneck/tests/data/test_876_A b/geom_bottleneck/tests/data/test_876_A deleted file mode 100644 index 1b65f8d..0000000 --- a/geom_bottleneck/tests/data/test_876_A +++ /dev/null @@ -1,100 +0,0 @@ -466 895 -77 814 -639 1357 -475 1032 -941 1560 -527 749 -839 845 -96 619 -328 455 -385 828 -954 1817 -476 847 -240 463 -477 849 -965 1359 -238 991 -746 1597 -109 529 -567 616 -525 1224 -80 990 -984 1314 -591 1398 -801 1039 -237 332 -529 1232 -8 763 -665 1615 -823 1790 -746 1594 -875 1682 -302 1001 -486 840 -586 1174 -376 903 -782 1083 -680 993 -811 1136 -576 687 -330 1057 -892 963 -547 763 -17 869 -207 455 -162 612 -414 776 -446 498 -455 1151 -292 355 -240 541 -89 545 -672 1017 -375 783 -152 348 -347 525 -678 682 -538 1301 -569 1458 -624 946 -188 283 -300 456 -225 423 -925 1867 -312 600 -849 984 -148 300 -236 862 -336 806 -566 1280 -793 1411 -789 1666 -134 714 -660 1259 -870 1344 -329 1320 -136 684 -743 1016 -904 1005 -271 1059 -28 566 -482 1474 -278 614 -776 1361 -372 1174 -118 589 -793 906 -346 539 -860 892 -588 1255 -590 1394 -258 935 -452 861 -785 1525 -789 1745 -150 622 -720 1458 -486 1477 -937 1381 -317 1224 -37 301 diff --git a/geom_bottleneck/tests/data/test_876_B b/geom_bottleneck/tests/data/test_876_B deleted file mode 100644 index 62102e9..0000000 --- a/geom_bottleneck/tests/data/test_876_B +++ /dev/null @@ -1,100 +0,0 @@ -162 530 -694 1522 -850 1742 -293 471 -254 1094 -293 856 -392 411 -919 1673 -427 629 -116 390 -583 1089 -31 812 -270 769 -297 435 -933 1186 -625 741 -759 868 -632 749 -41 82 -138 528 -933 1746 -910 1135 -312 868 -955 1464 -208 1044 -84 368 -444 1114 -749 1643 -572 1339 -584 1330 -736 1483 -779 780 -459 473 -481 1392 -537 1402 -254 1114 -637 1366 -381 1339 -808 1517 -858 1513 -116 508 -102 675 -133 327 -283 1196 -126 910 -634 699 -253 1086 -75 1063 -93 247 -194 661 -848 1195 -690 1350 -816 1340 -821 1352 -387 569 -487 870 -160 1012 -483 1120 -916 1704 -519 975 -324 533 -791 1611 -128 1011 -477 741 -884 930 -773 1424 -904 1238 -252 1162 -730 750 -292 441 -747 1242 -525 1071 -373 1261 -706 1402 -877 1639 -848 1474 -652 884 -995 1061 -509 1496 -970 1168 -855 1167 -94 289 -759 1697 -153 239 -483 1315 -694 1110 -93 255 -564 1525 -632 1562 -218 1068 -548 1072 -167 906 -803 1710 -635 914 -923 1918 -99 633 -8 712 -138 565 -698 1179 -928 1611 diff --git a/geom_bottleneck/tests/data/test_877_A b/geom_bottleneck/tests/data/test_877_A deleted file mode 100644 index c60479b..0000000 --- a/geom_bottleneck/tests/data/test_877_A +++ /dev/null @@ -1,100 +0,0 @@ -300 707 -123 319 -525 876 -685 1396 -289 961 -27 123 -884 1628 -982 1831 -634 1123 -383 831 -279 637 -349 474 -352 856 -253 1047 -431 679 -986 1871 -923 1654 -991 1073 -686 1337 -848 1810 -180 753 -423 529 -318 466 -356 742 -953 997 -861 865 -205 1200 -423 1141 -976 1485 -698 775 -445 1410 -83 322 -11 585 -384 468 -674 1121 -544 1216 -205 648 -474 745 -860 1595 -624 1216 -970 1721 -505 1397 -886 1137 -184 706 -817 1142 -781 1282 -299 965 -835 940 -954 1359 -304 502 -309 949 -347 441 -80 406 -804 910 -895 1394 -835 1328 -586 634 -790 1152 -884 1203 -252 899 -91 828 -501 968 -971 1076 -676 1214 -217 318 -932 1399 -404 451 -235 1091 -765 1022 -974 1189 -353 989 -828 1769 -948 1846 -914 1206 -589 1406 -551 1139 -317 367 -616 1284 -567 895 -229 528 -533 911 -514 1260 -905 1811 -421 863 -681 925 -252 1023 -365 573 -195 886 -169 710 -327 1311 -348 388 -26 56 -534 1014 -187 263 -927 1764 -3 29 -469 1008 -968 1729 -279 611 -944 1650 diff --git a/geom_bottleneck/tests/data/test_877_B b/geom_bottleneck/tests/data/test_877_B deleted file mode 100644 index 728311d..0000000 --- a/geom_bottleneck/tests/data/test_877_B +++ /dev/null @@ -1,100 +0,0 @@ -628 985 -787 1122 -361 604 -695 1462 -712 977 -294 738 -893 1223 -582 1579 -908 1112 -827 1451 -360 465 -273 375 -123 803 -853 1841 -381 948 -549 868 -34 995 -285 1076 -233 561 -232 1170 -663 1129 -17 34 -41 274 -881 1726 -551 1357 -193 916 -754 852 -384 1061 -745 1426 -954 1188 -950 1469 -493 565 -307 1174 -486 1222 -443 1433 -722 973 -912 1453 -973 1474 -398 1142 -85 779 -961 1952 -928 1842 -351 814 -147 519 -729 877 -26 60 -406 1082 -579 602 -893 1692 -837 1802 -306 457 -945 1792 -461 897 -794 894 -767 1178 -469 1423 -129 833 -251 563 -887 1856 -426 1380 -173 539 -398 1249 -890 1101 -40 864 -481 1123 -651 1126 -520 926 -885 1396 -791 896 -416 1283 -646 1571 -246 1002 -249 394 -650 1543 -378 1225 -918 1043 -58 188 -568 671 -256 796 -315 1143 -840 1449 -709 1260 -730 1655 -525 1409 -561 1149 -338 1162 -204 252 -935 1919 -438 1194 -727 1497 -876 1461 -920 1163 -19 767 -379 427 -953 1926 -912 1022 -423 584 -333 642 -726 1473 -421 1106 diff --git a/geom_bottleneck/tests/data/test_878_A b/geom_bottleneck/tests/data/test_878_A deleted file mode 100644 index c8d0724..0000000 --- a/geom_bottleneck/tests/data/test_878_A +++ /dev/null @@ -1,100 +0,0 @@ -279 1254 -922 1250 -849 997 -144 505 -218 1071 -540 1361 -681 773 -572 1345 -827 848 -105 244 -299 1253 -172 784 -730 1315 -488 1249 -803 1175 -139 611 -910 1599 -387 1304 -851 1418 -392 1256 -642 655 -323 338 -594 802 -761 1161 -980 1822 -272 811 -385 474 -70 568 -518 1331 -528 1188 -138 465 -71 1033 -258 968 -242 319 -644 1125 -988 1292 -828 1367 -726 1657 -61 520 -734 1189 -142 615 -794 1276 -267 575 -738 1043 -653 753 -484 1337 -680 761 -963 972 -415 1343 -167 685 -93 861 -263 506 -609 829 -145 436 -302 484 -10 881 -431 603 -638 764 -723 1348 -470 581 -418 1249 -61 814 -992 1096 -776 1386 -406 842 -204 1047 -450 710 -639 765 -272 807 -932 1571 -982 1321 -559 770 -255 363 -648 1136 -668 1322 -332 588 -387 390 -309 737 -561 1463 -958 981 -359 1053 -994 1768 -243 381 -971 1245 -96 704 -353 1090 -589 1261 -46 789 -459 519 -262 425 -154 710 -870 1103 -30 653 -672 1521 -824 1677 -763 835 -143 753 -658 1168 -8 563 -971 1095 diff --git a/geom_bottleneck/tests/data/test_878_B b/geom_bottleneck/tests/data/test_878_B deleted file mode 100644 index 32723ce..0000000 --- a/geom_bottleneck/tests/data/test_878_B +++ /dev/null @@ -1,100 +0,0 @@ -284 785 -695 1555 -939 1668 -395 439 -587 754 -586 996 -831 1534 -296 1185 -379 1162 -243 923 -818 1623 -410 644 -43 356 -929 1429 -83 937 -885 1611 -427 526 -225 804 -717 1460 -30 590 -125 1119 -600 1356 -803 1729 -462 542 -225 785 -26 79 -780 1711 -372 1148 -113 547 -589 1288 -673 1638 -56 555 -569 1078 -687 1547 -201 777 -860 1372 -317 1268 -481 1465 -577 1347 -355 639 -199 560 -669 911 -64 1003 -654 1047 -254 700 -126 542 -418 1041 -242 1075 -642 1349 -476 1047 -614 1041 -365 507 -117 842 -147 929 -369 835 -138 1031 -177 707 -857 968 -803 821 -562 1007 -231 1021 -872 1803 -84 613 -315 562 -962 965 -648 1619 -425 574 -303 654 -766 1676 -17 975 -127 960 -439 645 -646 1215 -448 1375 -697 1654 -294 314 -151 661 -800 1084 -760 1457 -944 1538 -224 895 -309 355 -688 1059 -509 1108 -770 793 -884 947 -147 963 -708 1229 -398 816 -8 872 -617 1057 -642 1609 -558 1128 -409 705 -777 1406 -454 640 -882 1002 -391 1241 -609 1380 -455 863 diff --git a/geom_bottleneck/tests/data/test_879_A b/geom_bottleneck/tests/data/test_879_A deleted file mode 100644 index 7a92be6..0000000 --- a/geom_bottleneck/tests/data/test_879_A +++ /dev/null @@ -1,100 +0,0 @@ -939 1572 -712 1236 -114 128 -992 1777 -566 617 -460 1258 -681 1380 -716 832 -375 960 -912 1414 -63 1058 -943 1482 -278 690 -123 616 -31 641 -382 862 -962 1798 -709 1518 -190 487 -84 723 -419 515 -105 915 -184 641 -952 1441 -139 760 -462 879 -431 577 -502 1482 -252 1124 -166 413 -406 426 -40 921 -538 936 -850 1574 -64 139 -472 1374 -171 944 -81 128 -107 521 -426 855 -273 278 -139 208 -763 893 -623 973 -433 565 -353 915 -404 945 -981 1151 -200 894 -476 1268 -913 1287 -609 1592 -984 1462 -878 1037 -255 1113 -845 1766 -257 265 -550 1385 -753 1597 -412 1269 -251 1120 -167 851 -288 1117 -392 1279 -213 534 -623 987 -975 1806 -924 1066 -52 676 -822 974 -239 557 -679 1158 -268 524 -241 500 -281 401 -993 1711 -539 1414 -677 1108 -377 482 -315 845 -981 1605 -426 447 -479 1372 -820 1416 -916 1423 -677 1165 -388 1322 -990 1641 -909 914 -814 1225 -851 1151 -78 235 -635 1581 -229 431 -125 877 -708 1338 -763 1354 -877 1794 -225 1171 -232 435 diff --git a/geom_bottleneck/tests/data/test_879_B b/geom_bottleneck/tests/data/test_879_B deleted file mode 100644 index f4c4a36..0000000 --- a/geom_bottleneck/tests/data/test_879_B +++ /dev/null @@ -1,100 +0,0 @@ -826 1808 -951 1166 -931 1147 -239 288 -607 762 -103 692 -78 132 -14 502 -666 982 -207 961 -303 690 -492 1135 -528 1499 -979 1576 -584 704 -921 1134 -874 1791 -51 789 -824 1574 -534 1078 -304 1104 -288 828 -445 1433 -492 788 -158 159 -374 863 -313 766 -716 1156 -540 624 -963 1803 -144 341 -415 1223 -314 501 -203 739 -674 1323 -604 705 -958 1738 -33 994 -179 1002 -23 278 -387 460 -857 1659 -563 865 -248 1032 -612 1147 -809 1802 -488 1003 -572 1525 -197 664 -120 648 -290 793 -475 1101 -97 479 -517 703 -843 1555 -292 482 -293 846 -969 1431 -525 552 -299 795 -543 1520 -685 1208 -689 1139 -564 1021 -478 969 -219 646 -361 718 -390 1038 -167 677 -968 1814 -663 1192 -446 1405 -337 1080 -403 564 -167 1159 -717 1483 -707 1224 -923 1698 -564 833 -988 1819 -48 300 -5 540 -252 378 -385 1039 -65 366 -473 1119 -369 989 -804 1501 -333 580 -321 1033 -693 1147 -291 408 -498 1244 -923 1204 -758 1214 -85 561 -550 647 -589 1155 -512 687 -110 459 diff --git a/geom_bottleneck/tests/data/test_list.txt b/geom_bottleneck/tests/data/test_list.txt deleted file mode 100644 index 24b462a..0000000 --- a/geom_bottleneck/tests/data/test_list.txt +++ /dev/null @@ -1,792 +0,0 @@ -test_001_A test_001_B 0.01 1 -1 0 0 -1 -test_002_A test_002_B 0.01 0.2 0 0 -test_003_A test_003_B 0.01 2 1 1 -test_004_A test_004_B 0.01 inf -1 -1 -test_005_A test_005_B 0.01 4 5 5 -test_008_A test_008_B 0.01 0.55 0 -1 -test_009_A test_009_B 0.01 0.55 0 -1 -test_010_A test_010_B 0.01 1.32937 -test_011_A test_011_B 0.01 1.03125 -test_014_A test_014_B 0.01 0 -test_015_A test_015_B 0.01 0 -test_016_A test_016_B 0.01 0 -test_100_A test_100_B 0.01 1.5 -test_101_A test_101_B 0.01 1.5 -test_102_A test_102_B 0.01 4.5 -test_103_A test_103_B 0.01 3 -test_104_A test_104_B 0.01 3.5 -test_105_A test_105_B 0.01 3.5 -test_106_A test_106_B 0.01 3 -test_107_A test_107_B 0.01 5 -test_108_A test_108_B 0.01 5 -test_109_A test_109_B 0.01 3 -test_110_A test_110_B 0.01 4.5 -test_111_A test_111_B 0.01 4 -test_112_A test_112_B 0.01 4 -test_113_A test_113_B 0.01 2.5 -test_114_A test_114_B 0.01 4.5 -test_115_A test_115_B 0.01 4 -test_116_A test_116_B 0.01 4 -test_117_A test_117_B 0.01 2.5 -test_118_A test_118_B 0.01 3 -test_119_A test_119_B 0.01 5 -test_120_A test_120_B 0.01 2 -test_121_A test_121_B 0.01 3 -test_122_A test_122_B 0.01 1 -test_123_A test_123_B 0.01 4 -test_124_A test_124_B 0.01 4 -test_125_A test_125_B 0.01 4.5 -test_126_A test_126_B 0.01 3 -test_127_A test_127_B 0.01 2.5 -test_128_A test_128_B 0.01 2 -test_129_A test_129_B 0.01 3 -test_130_A test_130_B 0.01 5 -test_131_A test_131_B 0.01 5 -test_132_A test_132_B 0.01 2 -test_133_A test_133_B 0.01 3 -test_134_A test_134_B 0.01 3 -test_135_A test_135_B 0.01 4 -test_136_A test_136_B 0.01 2 -test_137_A test_137_B 0.01 3 -test_138_A test_138_B 0.01 2 -test_139_A test_139_B 0.01 2.5 -test_140_A test_140_B 0.01 2 -test_141_A test_141_B 0.01 4 -test_142_A test_142_B 0.01 3 -test_143_A test_143_B 0.01 4 -test_144_A test_144_B 0.01 3 -test_145_A test_145_B 0.01 4 -test_146_A test_146_B 0.01 3 -test_147_A test_147_B 0.01 4 -test_148_A test_148_B 0.01 3 -test_149_A test_149_B 0.01 4 -test_150_A test_150_B 0.01 3 -test_151_A test_151_B 0.01 4 -test_152_A test_152_B 0.01 3.5 -test_153_A test_153_B 0.01 4 -test_154_A test_154_B 0.01 3.5 -test_155_A test_155_B 0.01 3 -test_156_A test_156_B 0.01 3 -test_157_A test_157_B 0.01 4.5 -test_158_A test_158_B 0.01 3.5 -test_159_A test_159_B 0.01 1 -test_160_A test_160_B 0.01 4 -test_161_A test_161_B 0.01 4 -test_162_A test_162_B 0.01 3 -test_163_A test_163_B 0.01 5 -test_164_A test_164_B 0.01 4 -test_165_A test_165_B 0.01 4 -test_166_A test_166_B 0.01 4 -test_167_A test_167_B 0.01 4.5 -test_168_A test_168_B 0.01 4 -test_169_A test_169_B 0.01 3.5 -test_170_A test_170_B 0.01 4 -test_171_A test_171_B 0.01 2 -test_172_A test_172_B 0.01 3 -test_173_A test_173_B 0.01 4 -test_174_A test_174_B 0.01 3 -test_175_A test_175_B 0.01 5 -test_176_A test_176_B 0.01 4.5 -test_177_A test_177_B 0.01 4.5 -test_178_A test_178_B 0.01 4.5 -test_179_A test_179_B 0.01 4 -test_180_A test_180_B 0.01 5 -test_181_A test_181_B 0.01 4 -test_182_A test_182_B 0.01 4.5 -test_183_A test_183_B 0.01 5 -test_184_A test_184_B 0.01 4 -test_185_A test_185_B 0.01 4.5 -test_186_A test_186_B 0.01 3 -test_187_A test_187_B 0.01 4.5 -test_188_A test_188_B 0.01 3 -test_189_A test_189_B 0.01 2 -test_190_A test_190_B 0.01 3 -test_191_A test_191_B 0.01 3 -test_192_A test_192_B 0.01 3.5 -test_193_A test_193_B 0.01 4.5 -test_194_A test_194_B 0.01 3 -test_195_A test_195_B 0.01 3 -test_196_A test_196_B 0.01 3 -test_197_A test_197_B 0.01 3 -test_198_A test_198_B 0.01 5 -test_199_A test_199_B 0.01 3.5 -test_200_A test_200_B 0.01 3 -test_201_A test_201_B 0.01 5 -test_202_A test_202_B 0.01 3 -test_203_A test_203_B 0.01 4 -test_204_A test_204_B 0.01 2.5 -test_205_A test_205_B 0.01 4 -test_206_A test_206_B 0.01 3.5 -test_207_A test_207_B 0.01 3 -test_208_A test_208_B 0.01 4 -test_209_A test_209_B 0.01 3 -test_210_A test_210_B 0.01 5 -test_211_A test_211_B 0.01 3 -test_212_A test_212_B 0.01 3 -test_213_A test_213_B 0.01 3.5 -test_214_A test_214_B 0.01 4 -test_215_A test_215_B 0.01 3 -test_216_A test_216_B 0.01 3.5 -test_217_A test_217_B 0.01 4 -test_218_A test_218_B 0.01 4 -test_219_A test_219_B 0.01 4 -test_220_A test_220_B 0.01 3 -test_221_A test_221_B 0.01 4 -test_222_A test_222_B 0.01 4 -test_223_A test_223_B 0.01 4 -test_224_A test_224_B 0.01 3 -test_225_A test_225_B 0.01 3 -test_226_A test_226_B 0.01 4 -test_227_A test_227_B 0.01 4 -test_228_A test_228_B 0.01 4 -test_229_A test_229_B 0.01 3 -test_230_A test_230_B 0.01 3 -test_231_A test_231_B 0.01 4 -test_232_A test_232_B 0.01 4 -test_233_A test_233_B 0.01 2 -test_234_A test_234_B 0.01 3.5 -test_235_A test_235_B 0.01 4 -test_236_A test_236_B 0.01 3 -test_237_A test_237_B 0.01 3.5 -test_238_A test_238_B 0.01 4 -test_239_A test_239_B 0.01 3 -test_240_A test_240_B 0.01 3 -test_241_A test_241_B 0.01 5 -test_242_A test_242_B 0.01 4.5 -test_243_A test_243_B 0.01 4 -test_244_A test_244_B 0.01 3.5 -test_245_A test_245_B 0.01 5 -test_246_A test_246_B 0.01 2.5 -test_247_A test_247_B 0.01 3 -test_248_A test_248_B 0.01 4 -test_249_A test_249_B 0.01 2 -test_250_A test_250_B 0.01 5 -test_251_A test_251_B 0.01 4 -test_252_A test_252_B 0.01 4 -test_253_A test_253_B 0.01 4.5 -test_254_A test_254_B 0.01 4 -test_255_A test_255_B 0.01 3 -test_256_A test_256_B 0.01 4.5 -test_257_A test_257_B 0.01 4 -test_258_A test_258_B 0.01 5 -test_259_A test_259_B 0.01 4 -test_260_A test_260_B 0.01 4 -test_261_A test_261_B 0.01 2.5 -test_262_A test_262_B 0.01 2 -test_263_A test_263_B 0.01 4.5 -test_264_A test_264_B 0.01 3.5 -test_265_A test_265_B 0.01 4 -test_266_A test_266_B 0.01 3 -test_267_A test_267_B 0.01 5 -test_268_A test_268_B 0.01 4 -test_269_A test_269_B 0.01 4 -test_270_A test_270_B 0.01 3 -test_271_A test_271_B 0.01 4 -test_272_A test_272_B 0.01 4 -test_273_A test_273_B 0.01 2 -test_274_A test_274_B 0.01 3 -test_275_A test_275_B 0.01 3 -test_276_A test_276_B 0.01 4 -test_277_A test_277_B 0.01 5 -test_278_A test_278_B 0.01 4 -test_279_A test_279_B 0.01 4.5 -test_280_A test_280_B 0.01 3.5 -test_281_A test_281_B 0.01 2 -test_282_A test_282_B 0.01 3 -test_283_A test_283_B 0.01 3 -test_284_A test_284_B 0.01 3 -test_285_A test_285_B 0.01 3 -test_286_A test_286_B 0.01 3 -test_287_A test_287_B 0.01 3.5 -test_288_A test_288_B 0.01 3 -test_289_A test_289_B 0.01 2 -test_290_A test_290_B 0.01 4 -test_291_A test_291_B 0.01 3 -test_292_A test_292_B 0.01 4 -test_293_A test_293_B 0.01 2.5 -test_294_A test_294_B 0.01 4 -test_295_A test_295_B 0.01 3.5 -test_296_A test_296_B 0.01 3 -test_297_A test_297_B 0.01 3 -test_298_A test_298_B 0.01 4 -test_299_A test_299_B 0.01 4 -test_300_A test_300_B 0.01 3 -test_301_A test_301_B 0.01 2 -test_302_A test_302_B 0.01 2 -test_303_A test_303_B 0.01 3 -test_304_A test_304_B 0.01 3 -test_305_A test_305_B 0.01 3 -test_306_A test_306_B 0.01 3 -test_307_A test_307_B 0.01 2 -test_308_A test_308_B 0.01 3 -test_309_A test_309_B 0.01 2.5 -test_310_A test_310_B 0.01 4 -test_311_A test_311_B 0.01 3 -test_312_A test_312_B 0.01 3.5 -test_313_A test_313_B 0.01 3 -test_314_A test_314_B 0.01 2 -test_315_A test_315_B 0.01 3 -test_316_A test_316_B 0.01 4.5 -test_317_A test_317_B 0.01 3 -test_318_A test_318_B 0.01 3 -test_319_A test_319_B 0.01 3 -test_320_A test_320_B 0.01 4 -test_321_A test_321_B 0.01 2 -test_322_A test_322_B 0.01 3 -test_323_A test_323_B 0.01 3 -test_324_A test_324_B 0.01 2 -test_325_A test_325_B 0.01 3 -test_326_A test_326_B 0.01 2 -test_327_A test_327_B 0.01 3 -test_328_A test_328_B 0.01 3 -test_329_A test_329_B 0.01 4 -test_330_A test_330_B 0.01 3 -test_331_A test_331_B 0.01 3 -test_332_A test_332_B 0.01 2 -test_333_A test_333_B 0.01 2 -test_334_A test_334_B 0.01 3 -test_335_A test_335_B 0.01 2 -test_336_A test_336_B 0.01 3 -test_337_A test_337_B 0.01 2 -test_338_A test_338_B 0.01 2 -test_339_A test_339_B 0.01 2 -test_340_A test_340_B 0.01 1 -test_341_A test_341_B 0.01 2 -test_342_A test_342_B 0.01 2 -test_343_A test_343_B 0.01 2 -test_344_A test_344_B 0.01 2 -test_345_A test_345_B 0.01 2 -test_346_A test_346_B 0.01 2 -test_347_A test_347_B 0.01 2 -test_348_A test_348_B 0.01 2 -test_349_A test_349_B 0.01 2 -test_350_A test_350_B 0.01 2 -test_351_A test_351_B 0.01 2 -test_352_A test_352_B 0.01 2 -test_353_A test_353_B 0.01 2.5 -test_354_A test_354_B 0.01 2 -test_355_A test_355_B 0.01 2 -test_356_A test_356_B 0.01 2 -test_357_A test_357_B 0.01 2 -test_358_A test_358_B 0.01 2 -test_359_A test_359_B 0.01 2 -test_360_A test_360_B 0.01 32 -test_361_A test_361_B 0.01 8 -test_362_A test_362_B 0.01 29.5 -test_363_A test_363_B 0.01 41 -test_364_A test_364_B 0.01 41.5 -test_365_A test_365_B 0.01 27.5 -test_366_A test_366_B 0.01 46 -test_367_A test_367_B 0.01 37.5 -test_368_A test_368_B 0.01 27 -test_369_A test_369_B 0.01 42 -test_370_A test_370_B 0.01 45.5 -test_371_A test_371_B 0.01 34 -test_372_A test_372_B 0.01 19.5 -test_373_A test_373_B 0.01 24 -test_374_A test_374_B 0.01 10 -test_375_A test_375_B 0.01 17.5 -test_376_A test_376_B 0.01 28.5 -test_377_A test_377_B 0.01 40 -test_378_A test_378_B 0.01 40 -test_379_A test_379_B 0.01 24.5 -test_380_A test_380_B 0.01 36 -test_381_A test_381_B 0.01 38 -test_382_A test_382_B 0.01 48 -test_383_A test_383_B 0.01 32.5 -test_384_A test_384_B 0.01 44 -test_385_A test_385_B 0.01 44.5 -test_386_A test_386_B 0.01 11 -test_387_A test_387_B 0.01 47.5 -test_388_A test_388_B 0.01 28 -test_389_A test_389_B 0.01 32 -test_390_A test_390_B 0.01 24.5 -test_391_A test_391_B 0.01 47 -test_392_A test_392_B 0.01 28 -test_393_A test_393_B 0.01 16 -test_394_A test_394_B 0.01 44 -test_395_A test_395_B 0.01 38 -test_396_A test_396_B 0.01 47.5 -test_397_A test_397_B 0.01 35 -test_398_A test_398_B 0.01 33 -test_399_A test_399_B 0.01 33 -test_400_A test_400_B 0.01 31 -test_401_A test_401_B 0.01 48 -test_402_A test_402_B 0.01 37.5 -test_403_A test_403_B 0.01 40 -test_404_A test_404_B 0.01 47 -test_405_A test_405_B 0.01 23 -test_406_A test_406_B 0.01 40 -test_407_A test_407_B 0.01 46 -test_408_A test_408_B 0.01 39 -test_409_A test_409_B 0.01 26 -test_410_A test_410_B 0.01 28 -test_411_A test_411_B 0.01 27 -test_412_A test_412_B 0.01 33 -test_413_A test_413_B 0.01 36 -test_414_A test_414_B 0.01 42.5 -test_415_A test_415_B 0.01 40 -test_416_A test_416_B 0.01 37 -test_417_A test_417_B 0.01 43 -test_418_A test_418_B 0.01 16 -test_419_A test_419_B 0.01 34 -test_420_A test_420_B 0.01 42.5 -test_421_A test_421_B 0.01 38 -test_422_A test_422_B 0.01 30 -test_423_A test_423_B 0.01 44 -test_424_A test_424_B 0.01 46 -test_425_A test_425_B 0.01 38 -test_426_A test_426_B 0.01 35.5 -test_427_A test_427_B 0.01 29 -test_428_A test_428_B 0.01 43.5 -test_429_A test_429_B 0.01 34 -test_430_A test_430_B 0.01 48 -test_431_A test_431_B 0.01 41 -test_432_A test_432_B 0.01 35 -test_433_A test_433_B 0.01 32 -test_434_A test_434_B 0.01 36 -test_435_A test_435_B 0.01 43.5 -test_436_A test_436_B 0.01 32.5 -test_437_A test_437_B 0.01 40 -test_438_A test_438_B 0.01 34 -test_439_A test_439_B 0.01 31.5 -test_440_A test_440_B 0.01 26.5 -test_441_A test_441_B 0.01 49.5 -test_442_A test_442_B 0.01 30 -test_443_A test_443_B 0.01 29 -test_444_A test_444_B 0.01 29 -test_445_A test_445_B 0.01 48 -test_446_A test_446_B 0.01 35 -test_447_A test_447_B 0.01 43 -test_448_A test_448_B 0.01 19 -test_449_A test_449_B 0.01 34 -test_450_A test_450_B 0.01 44 -test_451_A test_451_B 0.01 36 -test_452_A test_452_B 0.01 32 -test_453_A test_453_B 0.01 49 -test_454_A test_454_B 0.01 48.5 -test_455_A test_455_B 0.01 46 -test_456_A test_456_B 0.01 33.5 -test_457_A test_457_B 0.01 49.5 -test_458_A test_458_B 0.01 38 -test_459_A test_459_B 0.01 21 -test_460_A test_460_B 0.01 40 -test_461_A test_461_B 0.01 32 -test_462_A test_462_B 0.01 37 -test_463_A test_463_B 0.01 23 -test_464_A test_464_B 0.01 19 -test_465_A test_465_B 0.01 29 -test_466_A test_466_B 0.01 38 -test_467_A test_467_B 0.01 29 -test_468_A test_468_B 0.01 45 -test_469_A test_469_B 0.01 27.5 -test_470_A test_470_B 0.01 43 -test_471_A test_471_B 0.01 24.5 -test_472_A test_472_B 0.01 42 -test_473_A test_473_B 0.01 36.5 -test_474_A test_474_B 0.01 46.5 -test_475_A test_475_B 0.01 18 -test_476_A test_476_B 0.01 29 -test_477_A test_477_B 0.01 44 -test_478_A test_478_B 0.01 49 -test_479_A test_479_B 0.01 33 -test_480_A test_480_B 0.01 43 -test_481_A test_481_B 0.01 42 -test_482_A test_482_B 0.01 31 -test_483_A test_483_B 0.01 37 -test_484_A test_484_B 0.01 25 -test_485_A test_485_B 0.01 33 -test_486_A test_486_B 0.01 35 -test_487_A test_487_B 0.01 39 -test_488_A test_488_B 0.01 26.5 -test_489_A test_489_B 0.01 39.5 -test_490_A test_490_B 0.01 26 -test_491_A test_491_B 0.01 45 -test_492_A test_492_B 0.01 21 -test_493_A test_493_B 0.01 37 -test_494_A test_494_B 0.01 50 -test_495_A test_495_B 0.01 41 -test_496_A test_496_B 0.01 34 -test_497_A test_497_B 0.01 35 -test_498_A test_498_B 0.01 34 -test_499_A test_499_B 0.01 30 -test_500_A test_500_B 0.01 39 -test_501_A test_501_B 0.01 36 -test_502_A test_502_B 0.01 36 -test_503_A test_503_B 0.01 49.5 -test_504_A test_504_B 0.01 40.5 -test_505_A test_505_B 0.01 29 -test_506_A test_506_B 0.01 33 -test_507_A test_507_B 0.01 38 -test_508_A test_508_B 0.01 21.5 -test_509_A test_509_B 0.01 27 -test_510_A test_510_B 0.01 43 -test_511_A test_511_B 0.01 34 -test_512_A test_512_B 0.01 25.5 -test_513_A test_513_B 0.01 19 -test_514_A test_514_B 0.01 28 -test_515_A test_515_B 0.01 41.5 -test_516_A test_516_B 0.01 46 -test_517_A test_517_B 0.01 34 -test_518_A test_518_B 0.01 33 -test_519_A test_519_B 0.01 37.5 -test_520_A test_520_B 0.01 37 -test_521_A test_521_B 0.01 42.5 -test_522_A test_522_B 0.01 44 -test_523_A test_523_B 0.01 36.5 -test_524_A test_524_B 0.01 40 -test_525_A test_525_B 0.01 36.5 -test_526_A test_526_B 0.01 24 -test_527_A test_527_B 0.01 34 -test_528_A test_528_B 0.01 23.5 -test_529_A test_529_B 0.01 30 -test_530_A test_530_B 0.01 50 -test_531_A test_531_B 0.01 33 -test_532_A test_532_B 0.01 36 -test_533_A test_533_B 0.01 24 -test_534_A test_534_B 0.01 46.5 -test_535_A test_535_B 0.01 39 -test_536_A test_536_B 0.01 26 -test_537_A test_537_B 0.01 30 -test_538_A test_538_B 0.01 27.5 -test_539_A test_539_B 0.01 26 -test_540_A test_540_B 0.01 23 -test_541_A test_541_B 0.01 26.5 -test_542_A test_542_B 0.01 40.5 -test_543_A test_543_B 0.01 41 -test_544_A test_544_B 0.01 46 -test_545_A test_545_B 0.01 33 -test_546_A test_546_B 0.01 38 -test_547_A test_547_B 0.01 33 -test_548_A test_548_B 0.01 28 -test_549_A test_549_B 0.01 29 -test_550_A test_550_B 0.01 33 -test_551_A test_551_B 0.01 20 -test_552_A test_552_B 0.01 27 -test_553_A test_553_B 0.01 21.5 -test_554_A test_554_B 0.01 28 -test_555_A test_555_B 0.01 31 -test_556_A test_556_B 0.01 31 -test_557_A test_557_B 0.01 30 -test_558_A test_558_B 0.01 29 -test_559_A test_559_B 0.01 30 -test_560_A test_560_B 0.01 21 -test_561_A test_561_B 0.01 37.5 -test_562_A test_562_B 0.01 40 -test_563_A test_563_B 0.01 25 -test_564_A test_564_B 0.01 22 -test_565_A test_565_B 0.01 24 -test_566_A test_566_B 0.01 39 -test_567_A test_567_B 0.01 27 -test_568_A test_568_B 0.01 30 -test_569_A test_569_B 0.01 35 -test_570_A test_570_B 0.01 29 -test_571_A test_571_B 0.01 27 -test_572_A test_572_B 0.01 23 -test_573_A test_573_B 0.01 34 -test_574_A test_574_B 0.01 26 -test_575_A test_575_B 0.01 28 -test_576_A test_576_B 0.01 22 -test_577_A test_577_B 0.01 29 -test_578_A test_578_B 0.01 24 -test_579_A test_579_B 0.01 22 -test_580_A test_580_B 0.01 31 -test_581_A test_581_B 0.01 39 -test_582_A test_582_B 0.01 21 -test_583_A test_583_B 0.01 32 -test_584_A test_584_B 0.01 22 -test_585_A test_585_B 0.01 26 -test_586_A test_586_B 0.01 20 -test_587_A test_587_B 0.01 28 -test_588_A test_588_B 0.01 22 -test_589_A test_589_B 0.01 20 -test_590_A test_590_B 0.01 17 -test_591_A test_591_B 0.01 24 -test_592_A test_592_B 0.01 27.5 -test_593_A test_593_B 0.01 31 -test_594_A test_594_B 0.01 18 -test_595_A test_595_B 0.01 18 -test_596_A test_596_B 0.01 32 -test_597_A test_597_B 0.01 17 -test_598_A test_598_B 0.01 19 -test_599_A test_599_B 0.01 23 -test_600_A test_600_B 0.01 16 -test_601_A test_601_B 0.01 13 -test_602_A test_602_B 0.01 25 -test_603_A test_603_B 0.01 17 -test_604_A test_604_B 0.01 18 -test_605_A test_605_B 0.01 20 -test_606_A test_606_B 0.01 16 -test_607_A test_607_B 0.01 19 -test_608_A test_608_B 0.01 22 -test_609_A test_609_B 0.01 18 -test_610_A test_610_B 0.01 22 -test_611_A test_611_B 0.01 18 -test_612_A test_612_B 0.01 21 -test_613_A test_613_B 0.01 23 -test_614_A test_614_B 0.01 14 -test_615_A test_615_B 0.01 21 -test_616_A test_616_B 0.01 20 -test_617_A test_617_B 0.01 17 -test_618_A test_618_B 0.01 15 -test_619_A test_619_B 0.01 18 -test_620_A test_620_B 0.01 346.5 -test_621_A test_621_B 0.01 414 -test_622_A test_622_B 0.01 321 -test_623_A test_623_B 0.01 428 -test_624_A test_624_B 0.01 137.5 -test_625_A test_625_B 0.01 272 -test_626_A test_626_B 0.01 257 -test_627_A test_627_B 0.01 261 -test_628_A test_628_B 0.01 480.5 -test_629_A test_629_B 0.01 378 -test_630_A test_630_B 0.01 153.5 -test_631_A test_631_B 0.01 199 -test_632_A test_632_B 0.01 457 -test_633_A test_633_B 0.01 358.5 -test_634_A test_634_B 0.01 357 -test_635_A test_635_B 0.01 216 -test_636_A test_636_B 0.01 460.5 -test_637_A test_637_B 0.01 314 -test_638_A test_638_B 0.01 322 -test_639_A test_639_B 0.01 440.5 -test_640_A test_640_B 0.01 324 -test_641_A test_641_B 0.01 265 -test_642_A test_642_B 0.01 395.5 -test_643_A test_643_B 0.01 397 -test_644_A test_644_B 0.01 308 -test_645_A test_645_B 0.01 199 -test_646_A test_646_B 0.01 256.5 -test_647_A test_647_B 0.01 293 -test_648_A test_648_B 0.01 297 -test_649_A test_649_B 0.01 410.5 -test_650_A test_650_B 0.01 322 -test_651_A test_651_B 0.01 458 -test_652_A test_652_B 0.01 420.5 -test_653_A test_653_B 0.01 235 -test_654_A test_654_B 0.01 220 -test_655_A test_655_B 0.01 257 -test_656_A test_656_B 0.01 305 -test_657_A test_657_B 0.01 230.5 -test_658_A test_658_B 0.01 500 -test_659_A test_659_B 0.01 155 -test_660_A test_660_B 0.01 418 -test_661_A test_661_B 0.01 403.5 -test_662_A test_662_B 0.01 296 -test_663_A test_663_B 0.01 297.5 -test_664_A test_664_B 0.01 219 -test_665_A test_665_B 0.01 476.5 -test_666_A test_666_B 0.01 347 -test_667_A test_667_B 0.01 284 -test_668_A test_668_B 0.01 324.5 -test_669_A test_669_B 0.01 231 -test_670_A test_670_B 0.01 410 -test_671_A test_671_B 0.01 206 -test_672_A test_672_B 0.01 266 -test_673_A test_673_B 0.01 319.5 -test_674_A test_674_B 0.01 483 -test_675_A test_675_B 0.01 355.5 -test_676_A test_676_B 0.01 316.5 -test_677_A test_677_B 0.01 297 -test_678_A test_678_B 0.01 458 -test_679_A test_679_B 0.01 398.5 -test_680_A test_680_B 0.01 371.5 -test_681_A test_681_B 0.01 338 -test_682_A test_682_B 0.01 461 -test_683_A test_683_B 0.01 298.5 -test_684_A test_684_B 0.01 303.5 -test_685_A test_685_B 0.01 265 -test_686_A test_686_B 0.01 400.5 -test_687_A test_687_B 0.01 264 -test_688_A test_688_B 0.01 303 -test_689_A test_689_B 0.01 360 -test_690_A test_690_B 0.01 325 -test_691_A test_691_B 0.01 217 -test_692_A test_692_B 0.01 313 -test_693_A test_693_B 0.01 491 -test_694_A test_694_B 0.01 367.5 -test_695_A test_695_B 0.01 285 -test_696_A test_696_B 0.01 314 -test_697_A test_697_B 0.01 379 -test_698_A test_698_B 0.01 277.5 -test_699_A test_699_B 0.01 302 -test_700_A test_700_B 0.01 299 -test_701_A test_701_B 0.01 439.5 -test_702_A test_702_B 0.01 289 -test_703_A test_703_B 0.01 460.5 -test_704_A test_704_B 0.01 210 -test_705_A test_705_B 0.01 491 -test_706_A test_706_B 0.01 438.5 -test_707_A test_707_B 0.01 323 -test_708_A test_708_B 0.01 427 -test_709_A test_709_B 0.01 364 -test_710_A test_710_B 0.01 434 -test_711_A test_711_B 0.01 434 -test_712_A test_712_B 0.01 391 -test_713_A test_713_B 0.01 356 -test_714_A test_714_B 0.01 420 -test_715_A test_715_B 0.01 354 -test_716_A test_716_B 0.01 281 -test_717_A test_717_B 0.01 359.5 -test_718_A test_718_B 0.01 345 -test_719_A test_719_B 0.01 341.5 -test_720_A test_720_B 0.01 497.5 -test_721_A test_721_B 0.01 199 -test_722_A test_722_B 0.01 452 -test_723_A test_723_B 0.01 335.5 -test_724_A test_724_B 0.01 311 -test_725_A test_725_B 0.01 336 -test_726_A test_726_B 0.01 300 -test_727_A test_727_B 0.01 317 -test_728_A test_728_B 0.01 492 -test_729_A test_729_B 0.01 304 -test_730_A test_730_B 0.01 217 -test_731_A test_731_B 0.01 322 -test_732_A test_732_B 0.01 289 -test_733_A test_733_B 0.01 182 -test_734_A test_734_B 0.01 410.5 -test_735_A test_735_B 0.01 306 -test_736_A test_736_B 0.01 294 -test_737_A test_737_B 0.01 254 -test_738_A test_738_B 0.01 338.5 -test_739_A test_739_B 0.01 225 -test_740_A test_740_B 0.01 280 -test_741_A test_741_B 0.01 454 -test_742_A test_742_B 0.01 226 -test_743_A test_743_B 0.01 365 -test_744_A test_744_B 0.01 456 -test_745_A test_745_B 0.01 405 -test_746_A test_746_B 0.01 322 -test_747_A test_747_B 0.01 279 -test_748_A test_748_B 0.01 311.5 -test_749_A test_749_B 0.01 308 -test_750_A test_750_B 0.01 322 -test_751_A test_751_B 0.01 409 -test_752_A test_752_B 0.01 277 -test_753_A test_753_B 0.01 318 -test_754_A test_754_B 0.01 299.5 -test_755_A test_755_B 0.01 462.5 -test_756_A test_756_B 0.01 314 -test_757_A test_757_B 0.01 300 -test_758_A test_758_B 0.01 455 -test_759_A test_759_B 0.01 422.5 -test_760_A test_760_B 0.01 433.5 -test_761_A test_761_B 0.01 278 -test_762_A test_762_B 0.01 484.5 -test_763_A test_763_B 0.01 348 -test_764_A test_764_B 0.01 491 -test_765_A test_765_B 0.01 280 -test_766_A test_766_B 0.01 259 -test_767_A test_767_B 0.01 275.5 -test_768_A test_768_B 0.01 348 -test_769_A test_769_B 0.01 330 -test_770_A test_770_B 0.01 412 -test_771_A test_771_B 0.01 262 -test_772_A test_772_B 0.01 455 -test_773_A test_773_B 0.01 294 -test_774_A test_774_B 0.01 425 -test_775_A test_775_B 0.01 220.5 -test_776_A test_776_B 0.01 411.5 -test_777_A test_777_B 0.01 383 -test_778_A test_778_B 0.01 363 -test_779_A test_779_B 0.01 302 -test_780_A test_780_B 0.01 328 -test_781_A test_781_B 0.01 294 -test_782_A test_782_B 0.01 407.5 -test_783_A test_783_B 0.01 260.5 -test_784_A test_784_B 0.01 410 -test_785_A test_785_B 0.01 328 -test_786_A test_786_B 0.01 419.5 -test_787_A test_787_B 0.01 165 -test_788_A test_788_B 0.01 389 -test_789_A test_789_B 0.01 254 -test_790_A test_790_B 0.01 311 -test_791_A test_791_B 0.01 258 -test_792_A test_792_B 0.01 331 -test_793_A test_793_B 0.01 378 -test_794_A test_794_B 0.01 415 -test_795_A test_795_B 0.01 364 -test_796_A test_796_B 0.01 279 -test_797_A test_797_B 0.01 249 -test_798_A test_798_B 0.01 463 -test_799_A test_799_B 0.01 304 -test_800_A test_800_B 0.01 187 -test_801_A test_801_B 0.01 305.5 -test_802_A test_802_B 0.01 385 -test_803_A test_803_B 0.01 360.5 -test_804_A test_804_B 0.01 269 -test_805_A test_805_B 0.01 294 -test_806_A test_806_B 0.01 362 -test_807_A test_807_B 0.01 354 -test_808_A test_808_B 0.01 196 -test_809_A test_809_B 0.01 248 -test_810_A test_810_B 0.01 297.5 -test_811_A test_811_B 0.01 243 -test_812_A test_812_B 0.01 312 -test_813_A test_813_B 0.01 241 -test_814_A test_814_B 0.01 384 -test_815_A test_815_B 0.01 250 -test_816_A test_816_B 0.01 205 -test_817_A test_817_B 0.01 308 -test_818_A test_818_B 0.01 356 -test_819_A test_819_B 0.01 230 -test_820_A test_820_B 0.01 178 -test_821_A test_821_B 0.01 294 -test_822_A test_822_B 0.01 227 -test_823_A test_823_B 0.01 234 -test_824_A test_824_B 0.01 241 -test_825_A test_825_B 0.01 233 -test_826_A test_826_B 0.01 284 -test_827_A test_827_B 0.01 287 -test_828_A test_828_B 0.01 192 -test_829_A test_829_B 0.01 359 -test_830_A test_830_B 0.01 225 -test_831_A test_831_B 0.01 273 -test_832_A test_832_B 0.01 248 -test_833_A test_833_B 0.01 217 -test_834_A test_834_B 0.01 332 -test_835_A test_835_B 0.01 218 -test_836_A test_836_B 0.01 335 -test_837_A test_837_B 0.01 192 -test_838_A test_838_B 0.01 188 -test_839_A test_839_B 0.01 347 -test_840_A test_840_B 0.01 273 -test_841_A test_841_B 0.01 187 -test_842_A test_842_B 0.01 170 -test_843_A test_843_B 0.01 230 -test_844_A test_844_B 0.01 206.5 -test_845_A test_845_B 0.01 177 -test_846_A test_846_B 0.01 251 -test_847_A test_847_B 0.01 163 -test_848_A test_848_B 0.01 174 -test_849_A test_849_B 0.01 177 -test_850_A test_850_B 0.01 252 -test_851_A test_851_B 0.01 262 -test_852_A test_852_B 0.01 174 -test_853_A test_853_B 0.01 169 -test_854_A test_854_B 0.01 200 -test_855_A test_855_B 0.01 189 -test_856_A test_856_B 0.01 206.5 -test_857_A test_857_B 0.01 260 -test_858_A test_858_B 0.01 191 -test_859_A test_859_B 0.01 216 -test_860_A test_860_B 0.01 181.5 -test_861_A test_861_B 0.01 219 -test_862_A test_862_B 0.01 143 -test_863_A test_863_B 0.01 173 -test_864_A test_864_B 0.01 134 -test_865_A test_865_B 0.01 159 -test_866_A test_866_B 0.01 205 -test_867_A test_867_B 0.01 178 -test_868_A test_868_B 0.01 189.5 -test_869_A test_869_B 0.01 145 -test_870_A test_870_B 0.01 179 -test_871_A test_871_B 0.01 167 -test_872_A test_872_B 0.01 149 -test_873_A test_873_B 0.01 149 -test_874_A test_874_B 0.01 187 -test_875_A test_875_B 0.01 193 -test_876_A test_876_B 0.01 165 -test_877_A test_877_B 0.01 190 -test_878_A test_878_B 0.01 242 -test_879_A test_879_B 0.01 187 diff --git a/geom_bottleneck/tests/data/test_list.txt.bak b/geom_bottleneck/tests/data/test_list.txt.bak deleted file mode 100644 index 71b89ed..0000000 --- a/geom_bottleneck/tests/data/test_list.txt.bak +++ /dev/null @@ -1,792 +0,0 @@ -test_001_A test_001_B 0.01 1 -1 0 0 -1 -test_002_A test_002_B 0.01 0.2 0 0 -test_003_A test_003_B 0.01 2 1 1 -test_004_A test_004_B 0.01 inf -1 -1 -test_005_A test_005_B 0.01 4 5 5 -test_010_A test_010_B 0.01 1.32937 -test_011_A test_011_B 0.01 1.03125 -test_012_A test_012_B 0.01 0.56679 -test_013_A test_013_B 0.01 1.26332 -test_014_A test_014_B 0.01 0 -test_015_A test_015_B 0.01 0 -test_016_A test_016_B 0.01 0 -test_100_A test_100_B 0.01 1.5 -test_101_A test_101_B 0.01 1.5 -test_102_A test_102_B 0.01 4.5 -test_103_A test_103_B 0.01 3 -test_104_A test_104_B 0.01 3.5 -test_105_A test_105_B 0.01 3.5 -test_106_A test_106_B 0.01 3 -test_107_A test_107_B 0.01 5 -test_108_A test_108_B 0.01 5 -test_109_A test_109_B 0.01 3 -test_110_A test_110_B 0.01 4.5 -test_111_A test_111_B 0.01 4 -test_112_A test_112_B 0.01 4 -test_113_A test_113_B 0.01 2.5 -test_114_A test_114_B 0.01 4.5 -test_115_A test_115_B 0.01 4 -test_116_A test_116_B 0.01 4 -test_117_A test_117_B 0.01 2.5 -test_118_A test_118_B 0.01 3 -test_119_A test_119_B 0.01 5 -test_120_A test_120_B 0.01 2 -test_121_A test_121_B 0.01 3 -test_122_A test_122_B 0.01 1 -test_123_A test_123_B 0.01 4 -test_124_A test_124_B 0.01 4 -test_125_A test_125_B 0.01 4.5 -test_126_A test_126_B 0.01 3 -test_127_A test_127_B 0.01 2.5 -test_128_A test_128_B 0.01 2 -test_129_A test_129_B 0.01 3 -test_130_A test_130_B 0.01 5 -test_131_A test_131_B 0.01 5 -test_132_A test_132_B 0.01 2 -test_133_A test_133_B 0.01 3 -test_134_A test_134_B 0.01 3 -test_135_A test_135_B 0.01 4 -test_136_A test_136_B 0.01 2 -test_137_A test_137_B 0.01 3 -test_138_A test_138_B 0.01 2 -test_139_A test_139_B 0.01 2.5 -test_140_A test_140_B 0.01 2 -test_141_A test_141_B 0.01 4 -test_142_A test_142_B 0.01 3 -test_143_A test_143_B 0.01 4 -test_144_A test_144_B 0.01 3 -test_145_A test_145_B 0.01 4 -test_146_A test_146_B 0.01 3 -test_147_A test_147_B 0.01 4 -test_148_A test_148_B 0.01 3 -test_149_A test_149_B 0.01 4 -test_150_A test_150_B 0.01 3 -test_151_A test_151_B 0.01 4 -test_152_A test_152_B 0.01 3.5 -test_153_A test_153_B 0.01 4 -test_154_A test_154_B 0.01 3.5 -test_155_A test_155_B 0.01 3 -test_156_A test_156_B 0.01 3 -test_157_A test_157_B 0.01 4.5 -test_158_A test_158_B 0.01 3.5 -test_159_A test_159_B 0.01 1 -test_160_A test_160_B 0.01 4 -test_161_A test_161_B 0.01 4 -test_162_A test_162_B 0.01 3 -test_163_A test_163_B 0.01 5 -test_164_A test_164_B 0.01 4 -test_165_A test_165_B 0.01 4 -test_166_A test_166_B 0.01 4 -test_167_A test_167_B 0.01 4.5 -test_168_A test_168_B 0.01 4 -test_169_A test_169_B 0.01 3.5 -test_170_A test_170_B 0.01 4 -test_171_A test_171_B 0.01 2 -test_172_A test_172_B 0.01 3 -test_173_A test_173_B 0.01 4 -test_174_A test_174_B 0.01 3 -test_175_A test_175_B 0.01 5 -test_176_A test_176_B 0.01 4.5 -test_177_A test_177_B 0.01 4.5 -test_178_A test_178_B 0.01 4.5 -test_179_A test_179_B 0.01 4 -test_180_A test_180_B 0.01 5 -test_181_A test_181_B 0.01 4 -test_182_A test_182_B 0.01 4.5 -test_183_A test_183_B 0.01 5 -test_184_A test_184_B 0.01 4 -test_185_A test_185_B 0.01 4.5 -test_186_A test_186_B 0.01 3 -test_187_A test_187_B 0.01 4.5 -test_188_A test_188_B 0.01 3 -test_189_A test_189_B 0.01 2 -test_190_A test_190_B 0.01 3 -test_191_A test_191_B 0.01 3 -test_192_A test_192_B 0.01 3.5 -test_193_A test_193_B 0.01 4.5 -test_194_A test_194_B 0.01 3 -test_195_A test_195_B 0.01 3 -test_196_A test_196_B 0.01 3 -test_197_A test_197_B 0.01 3 -test_198_A test_198_B 0.01 5 -test_199_A test_199_B 0.01 3.5 -test_200_A test_200_B 0.01 3 -test_201_A test_201_B 0.01 5 -test_202_A test_202_B 0.01 3 -test_203_A test_203_B 0.01 4 -test_204_A test_204_B 0.01 2.5 -test_205_A test_205_B 0.01 4 -test_206_A test_206_B 0.01 3.5 -test_207_A test_207_B 0.01 3 -test_208_A test_208_B 0.01 4 -test_209_A test_209_B 0.01 3 -test_210_A test_210_B 0.01 5 -test_211_A test_211_B 0.01 3 -test_212_A test_212_B 0.01 3 -test_213_A test_213_B 0.01 3.5 -test_214_A test_214_B 0.01 4 -test_215_A test_215_B 0.01 3 -test_216_A test_216_B 0.01 3.5 -test_217_A test_217_B 0.01 4 -test_218_A test_218_B 0.01 4 -test_219_A test_219_B 0.01 4 -test_220_A test_220_B 0.01 3 -test_221_A test_221_B 0.01 4 -test_222_A test_222_B 0.01 4 -test_223_A test_223_B 0.01 4 -test_224_A test_224_B 0.01 3 -test_225_A test_225_B 0.01 3 -test_226_A test_226_B 0.01 4 -test_227_A test_227_B 0.01 4 -test_228_A test_228_B 0.01 4 -test_229_A test_229_B 0.01 3 -test_230_A test_230_B 0.01 3 -test_231_A test_231_B 0.01 4 -test_232_A test_232_B 0.01 4 -test_233_A test_233_B 0.01 2 -test_234_A test_234_B 0.01 3.5 -test_235_A test_235_B 0.01 4 -test_236_A test_236_B 0.01 3 -test_237_A test_237_B 0.01 3.5 -test_238_A test_238_B 0.01 4 -test_239_A test_239_B 0.01 3 -test_240_A test_240_B 0.01 3 -test_241_A test_241_B 0.01 5 -test_242_A test_242_B 0.01 4.5 -test_243_A test_243_B 0.01 4 -test_244_A test_244_B 0.01 3.5 -test_245_A test_245_B 0.01 5 -test_246_A test_246_B 0.01 2.5 -test_247_A test_247_B 0.01 3 -test_248_A test_248_B 0.01 4 -test_249_A test_249_B 0.01 2 -test_250_A test_250_B 0.01 5 -test_251_A test_251_B 0.01 4 -test_252_A test_252_B 0.01 4 -test_253_A test_253_B 0.01 4.5 -test_254_A test_254_B 0.01 4 -test_255_A test_255_B 0.01 3 -test_256_A test_256_B 0.01 4.5 -test_257_A test_257_B 0.01 4 -test_258_A test_258_B 0.01 5 -test_259_A test_259_B 0.01 4 -test_260_A test_260_B 0.01 4 -test_261_A test_261_B 0.01 2.5 -test_262_A test_262_B 0.01 2 -test_263_A test_263_B 0.01 4.5 -test_264_A test_264_B 0.01 3.5 -test_265_A test_265_B 0.01 4 -test_266_A test_266_B 0.01 3 -test_267_A test_267_B 0.01 5 -test_268_A test_268_B 0.01 4 -test_269_A test_269_B 0.01 4 -test_270_A test_270_B 0.01 3 -test_271_A test_271_B 0.01 4 -test_272_A test_272_B 0.01 4 -test_273_A test_273_B 0.01 2 -test_274_A test_274_B 0.01 3 -test_275_A test_275_B 0.01 3 -test_276_A test_276_B 0.01 4 -test_277_A test_277_B 0.01 5 -test_278_A test_278_B 0.01 4 -test_279_A test_279_B 0.01 4.5 -test_280_A test_280_B 0.01 3.5 -test_281_A test_281_B 0.01 2 -test_282_A test_282_B 0.01 3 -test_283_A test_283_B 0.01 3 -test_284_A test_284_B 0.01 3 -test_285_A test_285_B 0.01 3 -test_286_A test_286_B 0.01 3 -test_287_A test_287_B 0.01 3.5 -test_288_A test_288_B 0.01 3 -test_289_A test_289_B 0.01 2 -test_290_A test_290_B 0.01 4 -test_291_A test_291_B 0.01 3 -test_292_A test_292_B 0.01 4 -test_293_A test_293_B 0.01 2.5 -test_294_A test_294_B 0.01 4 -test_295_A test_295_B 0.01 3.5 -test_296_A test_296_B 0.01 3 -test_297_A test_297_B 0.01 3 -test_298_A test_298_B 0.01 4 -test_299_A test_299_B 0.01 4 -test_300_A test_300_B 0.01 3 -test_301_A test_301_B 0.01 2 -test_302_A test_302_B 0.01 2 -test_303_A test_303_B 0.01 3 -test_304_A test_304_B 0.01 3 -test_305_A test_305_B 0.01 3 -test_306_A test_306_B 0.01 3 -test_307_A test_307_B 0.01 2 -test_308_A test_308_B 0.01 3 -test_309_A test_309_B 0.01 2.5 -test_310_A test_310_B 0.01 4 -test_311_A test_311_B 0.01 3 -test_312_A test_312_B 0.01 3.5 -test_313_A test_313_B 0.01 3 -test_314_A test_314_B 0.01 2 -test_315_A test_315_B 0.01 3 -test_316_A test_316_B 0.01 4.5 -test_317_A test_317_B 0.01 3 -test_318_A test_318_B 0.01 3 -test_319_A test_319_B 0.01 3 -test_320_A test_320_B 0.01 4 -test_321_A test_321_B 0.01 2 -test_322_A test_322_B 0.01 3 -test_323_A test_323_B 0.01 3 -test_324_A test_324_B 0.01 2 -test_325_A test_325_B 0.01 3 -test_326_A test_326_B 0.01 2 -test_327_A test_327_B 0.01 3 -test_328_A test_328_B 0.01 3 -test_329_A test_329_B 0.01 4 -test_330_A test_330_B 0.01 3 -test_331_A test_331_B 0.01 3 -test_332_A test_332_B 0.01 2 -test_333_A test_333_B 0.01 2 -test_334_A test_334_B 0.01 3 -test_335_A test_335_B 0.01 2 -test_336_A test_336_B 0.01 3 -test_337_A test_337_B 0.01 2 -test_338_A test_338_B 0.01 2 -test_339_A test_339_B 0.01 2 -test_340_A test_340_B 0.01 1 -test_341_A test_341_B 0.01 2 -test_342_A test_342_B 0.01 2 -test_343_A test_343_B 0.01 2 -test_344_A test_344_B 0.01 2 -test_345_A test_345_B 0.01 2 -test_346_A test_346_B 0.01 2 -test_347_A test_347_B 0.01 2 -test_348_A test_348_B 0.01 2 -test_349_A test_349_B 0.01 2 -test_350_A test_350_B 0.01 2 -test_351_A test_351_B 0.01 2 -test_352_A test_352_B 0.01 2 -test_353_A test_353_B 0.01 2.5 -test_354_A test_354_B 0.01 2 -test_355_A test_355_B 0.01 2 -test_356_A test_356_B 0.01 2 -test_357_A test_357_B 0.01 2 -test_358_A test_358_B 0.01 2 -test_359_A test_359_B 0.01 2 -test_360_A test_360_B 0.01 32 -test_361_A test_361_B 0.01 8 -test_362_A test_362_B 0.01 29.5 -test_363_A test_363_B 0.01 41 -test_364_A test_364_B 0.01 41.5 -test_365_A test_365_B 0.01 27.5 -test_366_A test_366_B 0.01 46 -test_367_A test_367_B 0.01 37.5 -test_368_A test_368_B 0.01 27 -test_369_A test_369_B 0.01 42 -test_370_A test_370_B 0.01 45.5 -test_371_A test_371_B 0.01 34 -test_372_A test_372_B 0.01 19.5 -test_373_A test_373_B 0.01 24 -test_374_A test_374_B 0.01 10 -test_375_A test_375_B 0.01 17.5 -test_376_A test_376_B 0.01 28.5 -test_377_A test_377_B 0.01 40 -test_378_A test_378_B 0.01 40 -test_379_A test_379_B 0.01 24.5 -test_380_A test_380_B 0.01 36 -test_381_A test_381_B 0.01 38 -test_382_A test_382_B 0.01 48 -test_383_A test_383_B 0.01 32.5 -test_384_A test_384_B 0.01 44 -test_385_A test_385_B 0.01 44.5 -test_386_A test_386_B 0.01 11 -test_387_A test_387_B 0.01 47.5 -test_388_A test_388_B 0.01 28 -test_389_A test_389_B 0.01 32 -test_390_A test_390_B 0.01 24.5 -test_391_A test_391_B 0.01 47 -test_392_A test_392_B 0.01 28 -test_393_A test_393_B 0.01 16 -test_394_A test_394_B 0.01 44 -test_395_A test_395_B 0.01 38 -test_396_A test_396_B 0.01 47.5 -test_397_A test_397_B 0.01 35 -test_398_A test_398_B 0.01 33 -test_399_A test_399_B 0.01 33 -test_400_A test_400_B 0.01 31 -test_401_A test_401_B 0.01 48 -test_402_A test_402_B 0.01 37.5 -test_403_A test_403_B 0.01 40 -test_404_A test_404_B 0.01 47 -test_405_A test_405_B 0.01 23 -test_406_A test_406_B 0.01 40 -test_407_A test_407_B 0.01 46 -test_408_A test_408_B 0.01 39 -test_409_A test_409_B 0.01 26 -test_410_A test_410_B 0.01 28 -test_411_A test_411_B 0.01 27 -test_412_A test_412_B 0.01 33 -test_413_A test_413_B 0.01 36 -test_414_A test_414_B 0.01 42.5 -test_415_A test_415_B 0.01 40 -test_416_A test_416_B 0.01 37 -test_417_A test_417_B 0.01 43 -test_418_A test_418_B 0.01 16 -test_419_A test_419_B 0.01 34 -test_420_A test_420_B 0.01 42.5 -test_421_A test_421_B 0.01 38 -test_422_A test_422_B 0.01 30 -test_423_A test_423_B 0.01 44 -test_424_A test_424_B 0.01 46 -test_425_A test_425_B 0.01 38 -test_426_A test_426_B 0.01 35.5 -test_427_A test_427_B 0.01 29 -test_428_A test_428_B 0.01 43.5 -test_429_A test_429_B 0.01 34 -test_430_A test_430_B 0.01 48 -test_431_A test_431_B 0.01 41 -test_432_A test_432_B 0.01 35 -test_433_A test_433_B 0.01 32 -test_434_A test_434_B 0.01 36 -test_435_A test_435_B 0.01 43.5 -test_436_A test_436_B 0.01 32.5 -test_437_A test_437_B 0.01 40 -test_438_A test_438_B 0.01 34 -test_439_A test_439_B 0.01 31.5 -test_440_A test_440_B 0.01 26.5 -test_441_A test_441_B 0.01 49.5 -test_442_A test_442_B 0.01 30 -test_443_A test_443_B 0.01 29 -test_444_A test_444_B 0.01 29 -test_445_A test_445_B 0.01 48 -test_446_A test_446_B 0.01 35 -test_447_A test_447_B 0.01 43 -test_448_A test_448_B 0.01 19 -test_449_A test_449_B 0.01 34 -test_450_A test_450_B 0.01 44 -test_451_A test_451_B 0.01 36 -test_452_A test_452_B 0.01 32 -test_453_A test_453_B 0.01 49 -test_454_A test_454_B 0.01 48.5 -test_455_A test_455_B 0.01 46 -test_456_A test_456_B 0.01 33.5 -test_457_A test_457_B 0.01 49.5 -test_458_A test_458_B 0.01 38 -test_459_A test_459_B 0.01 21 -test_460_A test_460_B 0.01 40 -test_461_A test_461_B 0.01 32 -test_462_A test_462_B 0.01 37 -test_463_A test_463_B 0.01 23 -test_464_A test_464_B 0.01 19 -test_465_A test_465_B 0.01 29 -test_466_A test_466_B 0.01 38 -test_467_A test_467_B 0.01 29 -test_468_A test_468_B 0.01 45 -test_469_A test_469_B 0.01 27.5 -test_470_A test_470_B 0.01 43 -test_471_A test_471_B 0.01 24.5 -test_472_A test_472_B 0.01 42 -test_473_A test_473_B 0.01 36.5 -test_474_A test_474_B 0.01 46.5 -test_475_A test_475_B 0.01 18 -test_476_A test_476_B 0.01 29 -test_477_A test_477_B 0.01 44 -test_478_A test_478_B 0.01 49 -test_479_A test_479_B 0.01 33 -test_480_A test_480_B 0.01 43 -test_481_A test_481_B 0.01 42 -test_482_A test_482_B 0.01 31 -test_483_A test_483_B 0.01 37 -test_484_A test_484_B 0.01 25 -test_485_A test_485_B 0.01 33 -test_486_A test_486_B 0.01 35 -test_487_A test_487_B 0.01 39 -test_488_A test_488_B 0.01 26.5 -test_489_A test_489_B 0.01 39.5 -test_490_A test_490_B 0.01 26 -test_491_A test_491_B 0.01 45 -test_492_A test_492_B 0.01 21 -test_493_A test_493_B 0.01 37 -test_494_A test_494_B 0.01 50 -test_495_A test_495_B 0.01 41 -test_496_A test_496_B 0.01 34 -test_497_A test_497_B 0.01 35 -test_498_A test_498_B 0.01 34 -test_499_A test_499_B 0.01 30 -test_500_A test_500_B 0.01 39 -test_501_A test_501_B 0.01 36 -test_502_A test_502_B 0.01 36 -test_503_A test_503_B 0.01 49.5 -test_504_A test_504_B 0.01 40.5 -test_505_A test_505_B 0.01 29 -test_506_A test_506_B 0.01 33 -test_507_A test_507_B 0.01 38 -test_508_A test_508_B 0.01 21.5 -test_509_A test_509_B 0.01 27 -test_510_A test_510_B 0.01 43 -test_511_A test_511_B 0.01 34 -test_512_A test_512_B 0.01 25.5 -test_513_A test_513_B 0.01 19 -test_514_A test_514_B 0.01 28 -test_515_A test_515_B 0.01 41.5 -test_516_A test_516_B 0.01 46 -test_517_A test_517_B 0.01 34 -test_518_A test_518_B 0.01 33 -test_519_A test_519_B 0.01 37.5 -test_520_A test_520_B 0.01 37 -test_521_A test_521_B 0.01 42.5 -test_522_A test_522_B 0.01 44 -test_523_A test_523_B 0.01 36.5 -test_524_A test_524_B 0.01 40 -test_525_A test_525_B 0.01 36.5 -test_526_A test_526_B 0.01 24 -test_527_A test_527_B 0.01 34 -test_528_A test_528_B 0.01 23.5 -test_529_A test_529_B 0.01 30 -test_530_A test_530_B 0.01 50 -test_531_A test_531_B 0.01 33 -test_532_A test_532_B 0.01 36 -test_533_A test_533_B 0.01 24 -test_534_A test_534_B 0.01 46.5 -test_535_A test_535_B 0.01 39 -test_536_A test_536_B 0.01 26 -test_537_A test_537_B 0.01 30 -test_538_A test_538_B 0.01 27.5 -test_539_A test_539_B 0.01 26 -test_540_A test_540_B 0.01 23 -test_541_A test_541_B 0.01 26.5 -test_542_A test_542_B 0.01 40.5 -test_543_A test_543_B 0.01 41 -test_544_A test_544_B 0.01 46 -test_545_A test_545_B 0.01 33 -test_546_A test_546_B 0.01 38 -test_547_A test_547_B 0.01 33 -test_548_A test_548_B 0.01 28 -test_549_A test_549_B 0.01 29 -test_550_A test_550_B 0.01 33 -test_551_A test_551_B 0.01 20 -test_552_A test_552_B 0.01 27 -test_553_A test_553_B 0.01 21.5 -test_554_A test_554_B 0.01 28 -test_555_A test_555_B 0.01 31 -test_556_A test_556_B 0.01 31 -test_557_A test_557_B 0.01 30 -test_558_A test_558_B 0.01 29 -test_559_A test_559_B 0.01 30 -test_560_A test_560_B 0.01 21 -test_561_A test_561_B 0.01 37.5 -test_562_A test_562_B 0.01 40 -test_563_A test_563_B 0.01 25 -test_564_A test_564_B 0.01 22 -test_565_A test_565_B 0.01 24 -test_566_A test_566_B 0.01 39 -test_567_A test_567_B 0.01 27 -test_568_A test_568_B 0.01 30 -test_569_A test_569_B 0.01 35 -test_570_A test_570_B 0.01 29 -test_571_A test_571_B 0.01 27 -test_572_A test_572_B 0.01 23 -test_573_A test_573_B 0.01 34 -test_574_A test_574_B 0.01 26 -test_575_A test_575_B 0.01 28 -test_576_A test_576_B 0.01 22 -test_577_A test_577_B 0.01 29 -test_578_A test_578_B 0.01 24 -test_579_A test_579_B 0.01 22 -test_580_A test_580_B 0.01 31 -test_581_A test_581_B 0.01 39 -test_582_A test_582_B 0.01 21 -test_583_A test_583_B 0.01 32 -test_584_A test_584_B 0.01 22 -test_585_A test_585_B 0.01 26 -test_586_A test_586_B 0.01 20 -test_587_A test_587_B 0.01 28 -test_588_A test_588_B 0.01 22 -test_589_A test_589_B 0.01 20 -test_590_A test_590_B 0.01 17 -test_591_A test_591_B 0.01 24 -test_592_A test_592_B 0.01 27.5 -test_593_A test_593_B 0.01 31 -test_594_A test_594_B 0.01 18 -test_595_A test_595_B 0.01 18 -test_596_A test_596_B 0.01 32 -test_597_A test_597_B 0.01 17 -test_598_A test_598_B 0.01 19 -test_599_A test_599_B 0.01 23 -test_600_A test_600_B 0.01 16 -test_601_A test_601_B 0.01 13 -test_602_A test_602_B 0.01 25 -test_603_A test_603_B 0.01 17 -test_604_A test_604_B 0.01 18 -test_605_A test_605_B 0.01 20 -test_606_A test_606_B 0.01 16 -test_607_A test_607_B 0.01 19 -test_608_A test_608_B 0.01 22 -test_609_A test_609_B 0.01 18 -test_610_A test_610_B 0.01 22 -test_611_A test_611_B 0.01 18 -test_612_A test_612_B 0.01 21 -test_613_A test_613_B 0.01 23 -test_614_A test_614_B 0.01 14 -test_615_A test_615_B 0.01 21 -test_616_A test_616_B 0.01 20 -test_617_A test_617_B 0.01 17 -test_618_A test_618_B 0.01 15 -test_619_A test_619_B 0.01 18 -test_620_A test_620_B 0.01 346.5 -test_621_A test_621_B 0.01 414 -test_622_A test_622_B 0.01 321 -test_623_A test_623_B 0.01 428 -test_624_A test_624_B 0.01 137.5 -test_625_A test_625_B 0.01 272 -test_626_A test_626_B 0.01 257 -test_627_A test_627_B 0.01 261 -test_628_A test_628_B 0.01 480.5 -test_629_A test_629_B 0.01 378 -test_630_A test_630_B 0.01 153.5 -test_631_A test_631_B 0.01 199 -test_632_A test_632_B 0.01 457 -test_633_A test_633_B 0.01 358.5 -test_634_A test_634_B 0.01 357 -test_635_A test_635_B 0.01 216 -test_636_A test_636_B 0.01 460.5 -test_637_A test_637_B 0.01 314 -test_638_A test_638_B 0.01 322 -test_639_A test_639_B 0.01 440.5 -test_640_A test_640_B 0.01 324 -test_641_A test_641_B 0.01 265 -test_642_A test_642_B 0.01 395.5 -test_643_A test_643_B 0.01 397 -test_644_A test_644_B 0.01 308 -test_645_A test_645_B 0.01 199 -test_646_A test_646_B 0.01 256.5 -test_647_A test_647_B 0.01 293 -test_648_A test_648_B 0.01 297 -test_649_A test_649_B 0.01 410.5 -test_650_A test_650_B 0.01 322 -test_651_A test_651_B 0.01 458 -test_652_A test_652_B 0.01 420.5 -test_653_A test_653_B 0.01 235 -test_654_A test_654_B 0.01 220 -test_655_A test_655_B 0.01 257 -test_656_A test_656_B 0.01 305 -test_657_A test_657_B 0.01 230.5 -test_658_A test_658_B 0.01 500 -test_659_A test_659_B 0.01 155 -test_660_A test_660_B 0.01 418 -test_661_A test_661_B 0.01 403.5 -test_662_A test_662_B 0.01 296 -test_663_A test_663_B 0.01 297.5 -test_664_A test_664_B 0.01 219 -test_665_A test_665_B 0.01 476.5 -test_666_A test_666_B 0.01 347 -test_667_A test_667_B 0.01 284 -test_668_A test_668_B 0.01 324.5 -test_669_A test_669_B 0.01 231 -test_670_A test_670_B 0.01 410 -test_671_A test_671_B 0.01 206 -test_672_A test_672_B 0.01 266 -test_673_A test_673_B 0.01 319.5 -test_674_A test_674_B 0.01 483 -test_675_A test_675_B 0.01 355.5 -test_676_A test_676_B 0.01 316.5 -test_677_A test_677_B 0.01 297 -test_678_A test_678_B 0.01 458 -test_679_A test_679_B 0.01 398.5 -test_680_A test_680_B 0.01 371.5 -test_681_A test_681_B 0.01 338 -test_682_A test_682_B 0.01 461 -test_683_A test_683_B 0.01 298.5 -test_684_A test_684_B 0.01 303.5 -test_685_A test_685_B 0.01 265 -test_686_A test_686_B 0.01 400.5 -test_687_A test_687_B 0.01 264 -test_688_A test_688_B 0.01 303 -test_689_A test_689_B 0.01 360 -test_690_A test_690_B 0.01 325 -test_691_A test_691_B 0.01 217 -test_692_A test_692_B 0.01 313 -test_693_A test_693_B 0.01 491 -test_694_A test_694_B 0.01 367.5 -test_695_A test_695_B 0.01 285 -test_696_A test_696_B 0.01 314 -test_697_A test_697_B 0.01 379 -test_698_A test_698_B 0.01 277.5 -test_699_A test_699_B 0.01 302 -test_700_A test_700_B 0.01 299 -test_701_A test_701_B 0.01 439.5 -test_702_A test_702_B 0.01 289 -test_703_A test_703_B 0.01 460.5 -test_704_A test_704_B 0.01 210 -test_705_A test_705_B 0.01 491 -test_706_A test_706_B 0.01 438.5 -test_707_A test_707_B 0.01 323 -test_708_A test_708_B 0.01 427 -test_709_A test_709_B 0.01 364 -test_710_A test_710_B 0.01 434 -test_711_A test_711_B 0.01 434 -test_712_A test_712_B 0.01 391 -test_713_A test_713_B 0.01 356 -test_714_A test_714_B 0.01 420 -test_715_A test_715_B 0.01 354 -test_716_A test_716_B 0.01 281 -test_717_A test_717_B 0.01 359.5 -test_718_A test_718_B 0.01 345 -test_719_A test_719_B 0.01 341.5 -test_720_A test_720_B 0.01 497.5 -test_721_A test_721_B 0.01 199 -test_722_A test_722_B 0.01 452 -test_723_A test_723_B 0.01 335.5 -test_724_A test_724_B 0.01 311 -test_725_A test_725_B 0.01 336 -test_726_A test_726_B 0.01 300 -test_727_A test_727_B 0.01 317 -test_728_A test_728_B 0.01 492 -test_729_A test_729_B 0.01 304 -test_730_A test_730_B 0.01 217 -test_731_A test_731_B 0.01 322 -test_732_A test_732_B 0.01 289 -test_733_A test_733_B 0.01 182 -test_734_A test_734_B 0.01 410.5 -test_735_A test_735_B 0.01 306 -test_736_A test_736_B 0.01 294 -test_737_A test_737_B 0.01 254 -test_738_A test_738_B 0.01 338.5 -test_739_A test_739_B 0.01 225 -test_740_A test_740_B 0.01 280 -test_741_A test_741_B 0.01 454 -test_742_A test_742_B 0.01 226 -test_743_A test_743_B 0.01 365 -test_744_A test_744_B 0.01 456 -test_745_A test_745_B 0.01 405 -test_746_A test_746_B 0.01 322 -test_747_A test_747_B 0.01 279 -test_748_A test_748_B 0.01 311.5 -test_749_A test_749_B 0.01 308 -test_750_A test_750_B 0.01 322 -test_751_A test_751_B 0.01 409 -test_752_A test_752_B 0.01 277 -test_753_A test_753_B 0.01 318 -test_754_A test_754_B 0.01 299.5 -test_755_A test_755_B 0.01 462.5 -test_756_A test_756_B 0.01 314 -test_757_A test_757_B 0.01 300 -test_758_A test_758_B 0.01 455 -test_759_A test_759_B 0.01 422.5 -test_760_A test_760_B 0.01 433.5 -test_761_A test_761_B 0.01 278 -test_762_A test_762_B 0.01 484.5 -test_763_A test_763_B 0.01 348 -test_764_A test_764_B 0.01 491 -test_765_A test_765_B 0.01 280 -test_766_A test_766_B 0.01 259 -test_767_A test_767_B 0.01 275.5 -test_768_A test_768_B 0.01 348 -test_769_A test_769_B 0.01 330 -test_770_A test_770_B 0.01 412 -test_771_A test_771_B 0.01 262 -test_772_A test_772_B 0.01 455 -test_773_A test_773_B 0.01 294 -test_774_A test_774_B 0.01 425 -test_775_A test_775_B 0.01 220.5 -test_776_A test_776_B 0.01 411.5 -test_777_A test_777_B 0.01 383 -test_778_A test_778_B 0.01 363 -test_779_A test_779_B 0.01 302 -test_780_A test_780_B 0.01 328 -test_781_A test_781_B 0.01 294 -test_782_A test_782_B 0.01 407.5 -test_783_A test_783_B 0.01 260.5 -test_784_A test_784_B 0.01 410 -test_785_A test_785_B 0.01 328 -test_786_A test_786_B 0.01 419.5 -test_787_A test_787_B 0.01 165 -test_788_A test_788_B 0.01 389 -test_789_A test_789_B 0.01 254 -test_790_A test_790_B 0.01 311 -test_791_A test_791_B 0.01 258 -test_792_A test_792_B 0.01 331 -test_793_A test_793_B 0.01 378 -test_794_A test_794_B 0.01 415 -test_795_A test_795_B 0.01 364 -test_796_A test_796_B 0.01 279 -test_797_A test_797_B 0.01 249 -test_798_A test_798_B 0.01 463 -test_799_A test_799_B 0.01 304 -test_800_A test_800_B 0.01 187 -test_801_A test_801_B 0.01 305.5 -test_802_A test_802_B 0.01 385 -test_803_A test_803_B 0.01 360.5 -test_804_A test_804_B 0.01 269 -test_805_A test_805_B 0.01 294 -test_806_A test_806_B 0.01 362 -test_807_A test_807_B 0.01 354 -test_808_A test_808_B 0.01 196 -test_809_A test_809_B 0.01 248 -test_810_A test_810_B 0.01 297.5 -test_811_A test_811_B 0.01 243 -test_812_A test_812_B 0.01 312 -test_813_A test_813_B 0.01 241 -test_814_A test_814_B 0.01 384 -test_815_A test_815_B 0.01 250 -test_816_A test_816_B 0.01 205 -test_817_A test_817_B 0.01 308 -test_818_A test_818_B 0.01 356 -test_819_A test_819_B 0.01 230 -test_820_A test_820_B 0.01 178 -test_821_A test_821_B 0.01 294 -test_822_A test_822_B 0.01 227 -test_823_A test_823_B 0.01 234 -test_824_A test_824_B 0.01 241 -test_825_A test_825_B 0.01 233 -test_826_A test_826_B 0.01 284 -test_827_A test_827_B 0.01 287 -test_828_A test_828_B 0.01 192 -test_829_A test_829_B 0.01 359 -test_830_A test_830_B 0.01 225 -test_831_A test_831_B 0.01 273 -test_832_A test_832_B 0.01 248 -test_833_A test_833_B 0.01 217 -test_834_A test_834_B 0.01 332 -test_835_A test_835_B 0.01 218 -test_836_A test_836_B 0.01 335 -test_837_A test_837_B 0.01 192 -test_838_A test_838_B 0.01 188 -test_839_A test_839_B 0.01 347 -test_840_A test_840_B 0.01 273 -test_841_A test_841_B 0.01 187 -test_842_A test_842_B 0.01 170 -test_843_A test_843_B 0.01 230 -test_844_A test_844_B 0.01 206.5 -test_845_A test_845_B 0.01 177 -test_846_A test_846_B 0.01 251 -test_847_A test_847_B 0.01 163 -test_848_A test_848_B 0.01 174 -test_849_A test_849_B 0.01 177 -test_850_A test_850_B 0.01 252 -test_851_A test_851_B 0.01 262 -test_852_A test_852_B 0.01 174 -test_853_A test_853_B 0.01 169 -test_854_A test_854_B 0.01 200 -test_855_A test_855_B 0.01 189 -test_856_A test_856_B 0.01 206.5 -test_857_A test_857_B 0.01 260 -test_858_A test_858_B 0.01 191 -test_859_A test_859_B 0.01 216 -test_860_A test_860_B 0.01 181.5 -test_861_A test_861_B 0.01 219 -test_862_A test_862_B 0.01 143 -test_863_A test_863_B 0.01 173 -test_864_A test_864_B 0.01 134 -test_865_A test_865_B 0.01 159 -test_866_A test_866_B 0.01 205 -test_867_A test_867_B 0.01 178 -test_868_A test_868_B 0.01 189.5 -test_869_A test_869_B 0.01 145 -test_870_A test_870_B 0.01 179 -test_871_A test_871_B 0.01 167 -test_872_A test_872_B 0.01 149 -test_873_A test_873_B 0.01 149 -test_874_A test_874_B 0.01 187 -test_875_A test_875_B 0.01 193 -test_876_A test_876_B 0.01 165 -test_877_A test_877_B 0.01 190 -test_878_A test_878_B 0.01 242 -test_879_A test_879_B 0.01 187 diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_A b/geom_bottleneck/tests/data/ws_tests/test_100_A deleted file mode 100644 index 8d126f0..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_100_A +++ /dev/null @@ -1,100 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 -3.79915 4.51283 -3.17645 3.75321 -0.61305 0.998622 -0.445643 1.13781 -6.38205 6.53669 -5.96392 6.44093 -7.21047 7.26005 -0.6703 1.26593 -0.529933 1.7027 -7.92495 8.83023 -2.1382 2.71695 -3.79209 4.5197 -5.23354 5.82214 --0.395097 2.18831 -3.22028 3.88648 -5.56262 5.79949 -8.39623 9.37185 -2.7452 3.84539 -9.5022 10.2414 -1.01374 1.40504 -3.2029 3.89559 -7.61236 8.28485 -6.4371 6.909 -4.45616 5.35067 -1.57802 1.77895 -6.5991 7.76339 -6.66729 6.71714 -6.11898 6.57121 -2.60663 4.36396 --0.259613 1.17683 -7.72857 9.48862 -4.68398 5.51521 -4.87447 5.4233 -6.86301 6.88244 -4.17814 4.25886 -8.70558 9.72902 -4.40873 4.57389 -6.1824 7.05049 -7.97557 8.79739 -8.52591 8.6985 -5.15336 5.27796 -9.70144 9.77031 -0.561778 1.39045 -9.32553 10.2456 -7.01495 7.74521 -6.83355 7.28255 -1.96721 3.01504 -5.78411 7.59464 -5.64012 6.10721 -3.7249 5.17086 -4.33297 5.91657 -7.11793 7.2545 -5.109 6.76878 -3.02787 3.04077 -0.999365 2.05566 -8.81392 8.9086 -6.20106 6.78943 -6.7987 7.05794 -0.438805 0.449602 -8.71793 9.79853 --0.150282 0.51997 -5.72257 5.93156 -5.71098 6.09535 -9.0378 9.45942 -0.534987 0.872885 -7.72276 8.57754 -9.26069 9.40289 -4.148 4.80519 -1.04579 3.18109 -0.259767 0.93215 -0.250608 0.511569 -4.88108 5.62239 -4.6731 5.3348 -7.84979 7.93545 -0.912521 1.48142 -4.82553 5.38108 -6.02179 7.61665 -3.85848 6.39418 -5.10754 6.02118 -1.71956 1.86238 -6.47336 6.74034 --0.0371018 0.212738 -3.97259 4.15465 -2.17413 3.20188 -4.49098 6.09812 -6.62445 7.84196 -6.57541 7.432 -6.81052 9.6653 -3.67502 4.69734 -3.92378 4.14743 -5.93127 6.46154 -0.63424 0.705454 -7.60129 9.23263 -4.23064 4.74575 -0.397705 1.24458 diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha deleted file mode 100644 index e94f5fe..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_B b/geom_bottleneck/tests/data/ws_tests/test_100_B deleted file mode 100644 index 852799d..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_100_B +++ /dev/null @@ -1,100 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 -3.77337 5.2686 -8.31344 9.05384 -0.734064 1.14844 -7.57606 7.8521 -3.16719 3.86953 -2.55072 2.64932 -9.51707 9.6071 -0.304643 2.41784 -2.79925 3.28234 -5.32901 7.7576 -5.19903 6.30449 -1.87819 2.99454 -8.92272 9.67105 -4.62414 5.05592 -4.0079 4.64148 -2.26369 3.44573 -2.69335 3.13426 -1.90706 2.42652 -2.68113 2.79133 -1.41065 1.56018 -6.55282 7.18725 -5.72986 6.37151 -7.26968 8.22623 -3.32643 3.73606 -3.77325 4.63115 -1.05457 1.83651 -8.6815 8.85251 -3.91285 4.17139 -0.380936 0.842109 -7.33227 7.69334 -8.45635 8.923 -4.1769 5.08373 -0.501374 2.23328 --0.161782 1.28908 -3.44716 3.4662 -3.15394 4.30243 -8.71416 9.3781 -6.3034 8.62893 -6.53824 7.04611 -0.6386 1.35269 -0.862088 0.960371 -5.12963 5.20203 -1.58695 2.0452 -6.57698 6.63228 -3.87747 4.45669 -1.51273 3.25669 --0.0992804 0.667302 -4.7489 4.80059 -0.0280559 1.90471 -6.7462 8.27612 -0.915652 1.30007 -2.79556 3.77404 -9.87989 10.0722 -9.39105 9.84229 -7.57235 9.37122 -5.09426 6.44266 -6.3994 6.72037 -5.73441 6.99341 -6.9079 7.88049 -4.2003 4.41933 --1.72447 2.25877 -9.04907 9.64323 -4.40473 5.3593 -9.31201 9.96079 -7.28343 8.74163 -3.0172 6.23779 -8.08422 8.56069 -6.83038 6.99863 -2.32038 3.1289 -7.42302 8.26286 -6.66905 7.18496 -0.730748 1.61335 -4.00564 5.73993 -2.81231 3.67489 -2.33178 2.37845 -9.03302 9.68681 -0.567816 0.755485 -7.89783 8.7621 -0.177662 0.332833 --0.181569 1.36821 -6.22158 6.55787 -4.67115 5.16995 -0.806432 0.820738 -7.69636 7.87402 -4.40933 4.54995 -9.1329 9.15037 -8.87416 9.04329 -1.14349 1.8993 -3.29756 4.7172 -6.67873 8.31364 -6.91238 7.1654 -0.483084 1.55006 -2.66058 3.86294 -5.93347 6.06085 -7.40514 9.05071 diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha deleted file mode 100644 index 25d6734..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_200_A b/geom_bottleneck/tests/data/ws_tests/test_200_A deleted file mode 100644 index 164b71d..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_200_A +++ /dev/null @@ -1,200 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 diff --git a/geom_bottleneck/tests/data/ws_tests/test_200_B b/geom_bottleneck/tests/data/ws_tests/test_200_B deleted file mode 100644 index 761943d..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_200_B +++ /dev/null @@ -1,200 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 diff --git a/geom_bottleneck/tests/data/ws_tests/test_5000_A b/geom_bottleneck/tests/data/ws_tests/test_5000_A deleted file mode 100644 index 094c6e0..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_5000_A +++ /dev/null @@ -1,5000 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 -0.903753 1.57921 -0.380744 1.88053 -1.3164 1.79885 -0.199366 0.576639 -5.53683 6.49433 -8.8705 9.14396 -3.1401 3.98761 -4.82675 6.69396 -7.28593 8.08916 -8.11312 9.92914 -3.25737 3.42109 -2.58413 4.57223 -2.65202 2.77196 --0.31616 1.51568 -4.1621 5.29563 -4.49155 5.21037 -7.28481 7.31722 -9.70568 10.0406 -2.39057 2.85874 -2.30626 3.16244 -1.15896 2.09616 -5.91343 7.33024 --0.172181 0.177363 -5.08934 6.10928 -7.15508 7.55315 -4.43036 4.68093 -6.00772 6.49566 -7.9247 8.43809 -1.57028 2.52328 -3.45458 4.43692 -3.18257 4.83824 -1.48243 1.91225 -2.59025 2.99596 -6.93059 8.34359 -4.53752 7.51216 -6.42857 6.51513 -5.5663 6.13877 -7.54367 7.56485 -9.01229 9.19913 -2.84158 3.23347 -0.42959 0.620618 -8.77033 9.33787 -8.06103 8.30989 -6.48425 7.83668 -4.66949 6.00205 -4.46683 4.66247 -8.96738 9.07714 -0.463093 0.514808 -7.72986 9.44537 -6.31391 6.8289 -0.883295 1.70946 -3.73278 3.98015 -6.73453 6.92514 -3.58434 4.43262 -0.236286 1.4601 -2.00505 2.38684 -3.845 4.20708 -1.18852 3.04911 -0.766784 1.00641 -7.38781 8.11216 -8.9396 9.27589 -0.369822 1.53322 -8.76527 9.23987 -0.663408 0.803445 -9.69209 10.1455 -9.73379 10.234 -3.47602 4.89968 -4.12754 5.45249 -7.31984 8.57369 -0.989101 1.47678 -5.57662 5.83292 -4.99092 6.85044 -4.35272 4.3683 -0.0517815 1.92227 -7.2694 7.80634 -1.35565 1.42783 -8.5638 8.91707 -1.74557 2.74123 -2.18226 2.19664 --0.901334 1.32691 -0.866613 1.03788 -5.30895 6.31774 -7.70178 8.5675 -4.06894 4.16071 -2.59697 3.53162 -4.30201 5.34212 -4.08762 4.19091 --0.516192 0.848397 -9.85911 10.1066 -0.472991 1.40069 -6.26012 7.0054 -0.707801 2.15445 -1.73825 1.87193 -0.206301 0.831746 -7.77872 7.92715 -4.94477 5.60361 -3.86216 5.16839 -1.35166 1.54482 -2.91721 3.56193 -4.57242 4.75913 -7.09303 8.29678 -8.18431 8.92151 -6.80303 10.87 -1.29208 1.72027 -1.22224 1.31693 -5.26756 6.26459 -2.55221 3.94397 -6.58902 6.78354 -7.85917 8.89791 -6.59279 7.63115 -4.45787 7.26828 -3.48759 5.33991 -2.13838 3.86589 -1.53368 3.57313 -1.41722 3.19336 -3.48388 4.11958 -1.53756 2.98451 -7.29083 8.22109 -1.2713 2.16915 -6.94685 7.31029 -6.2494 7.04676 -3.00376 3.02028 -1.25232 1.43301 -1.50413 2.25 -2.89098 4.77198 -4.50766 5.89294 -5.5403 6.07893 --0.101858 0.409209 -3.87963 6.1053 --0.19564 1.46589 --0.342077 0.694623 -6.63875 7.42223 -7.89982 9.05857 -4.91121 5.48031 -5.90743 8.35815 -7.13881 8.21597 -4.11493 5.08147 -3.59673 3.77176 -8.08236 8.3237 -1.35842 1.48934 -5.42963 5.85906 -4.60778 4.9734 --0.607198 0.91225 -5.40263 5.7017 -5.08624 5.63236 -7.34529 9.02233 -7.30013 8.12907 -6.56106 6.75585 -6.82576 7.25434 -2.96037 3.56454 -3.60283 4.09137 -6.35408 6.71888 --0.688103 0.84579 -8.45128 8.69771 -6.31749 7.3294 -5.82223 6.04761 -1.72983 2.38205 -6.94974 7.76985 -9.681 10.0141 -8.65394 9.2456 -2.52904 3.39548 -6.66609 7.35785 -4.18963 4.5473 -3.58643 3.80513 -2.88796 3.82413 -0.992066 1.1477 -4.57942 5.15419 -3.02826 4.32268 -5.91565 6.82087 -4.13694 5.13393 -6.28717 6.53257 -1.3149 2.36944 -0.488974 0.981461 -4.32763 4.98272 --0.420836 0.63619 -7.13406 7.31362 -0.367782 1.91138 -6.14763 6.16713 -0.837933 1.92794 -9.3781 10.0609 -3.22887 5.44584 -5.91554 6.65974 -5.68608 6.02435 -7.99715 8.55953 -5.37106 5.38574 -0.254544 0.374268 -0.184701 0.917061 -9.38005 9.54042 -6.86741 7.35628 -0.87398 1.69093 -7.75845 8.53773 -0.370425 1.35335 -0.699837 0.810893 -3.73223 4.32089 -3.81804 3.85752 -4.85936 5.10097 -2.70381 3.10519 -3.82523 5.27699 -9.13422 10.3317 -4.62775 4.77988 -7.91139 7.95504 -2.72614 4.79958 -0.863357 1.88643 -4.14155 5.02327 -2.49683 4.11585 -1.06741 1.11516 -6.20979 8.38443 -0.936362 2.46703 -6.58231 7.85063 -1.89469 2.31422 -8.70668 9.14006 -5.76486 6.1122 -3.15778 3.76679 -0.248282 2.19881 -1.25317 1.92694 -7.81837 9.53067 --0.582906 0.818904 -8.34194 8.37845 -4.4913 5.10164 -3.86376 5.5453 -6.94054 7.68699 -2.07462 2.5811 -0.518698 2.1529 -3.51773 4.60946 -8.39915 8.98446 -1.63685 2.19755 -6.60737 9.05917 -2.06667 3.23994 -3.18822 3.31219 -2.44332 3.22088 -4.755 4.87118 -4.34245 4.91565 -4.64562 4.8104 -2.73282 3.35646 -9.48057 9.86441 -0.640899 1.03356 -0.789475 0.925731 -1.4247 1.58347 -1.47747 2.25408 -8.8612 9.81597 -8.44147 10.6885 -9.07046 10.0877 -0.350125 1.15765 -4.45375 5.73964 -4.06526 4.26457 -7.50776 8.23491 -1.55452 1.63786 -2.8399 4.52559 -1.34319 1.47951 -5.21572 5.65702 -5.85695 6.75574 -8.21826 10.657 --0.0479956 1.79162 -1.72905 1.78113 -3.35685 4.03797 -3.7123 5.82296 -8.56751 10.2992 -4.07987 4.25273 -5.8347 6.07253 -3.25283 3.99065 -9.31995 10.3647 -0.649025 1.14496 -1.06966 2.04182 -7.59831 7.85826 -3.35263 3.84374 -4.91371 5.10148 -8.0875 9.23421 -3.00484 5.14282 -8.60448 9.09442 -5.61429 6.24037 -3.4729 4.17907 -7.18702 7.26274 -0.729966 0.928899 -2.27264 2.81241 -2.67248 3.91661 -3.98443 4.64406 -5.50463 6.92435 --0.257961 0.905736 -5.71363 6.67387 -4.12643 4.66467 -3.97623 4.64917 -9.71227 9.8243 -8.66674 8.97634 -7.94673 8.73904 -7.45228 8.14466 -3.78405 4.81189 -4.05505 5.00011 -2.84957 3.15451 -6.93785 7.58172 -1.85006 1.96814 -6.82256 7.00166 -2.42727 2.68161 -8.06129 8.76308 -1.53758 3.67482 -2.5057 4.18495 -7.09618 7.79664 -1.12843 1.46228 -1.61447 2.2668 -5.58639 5.70776 -8.15398 8.34959 -2.49733 2.57643 -5.18817 5.32462 -5.62963 5.86377 -1.95215 2.26641 -7.22129 7.23255 -5.99833 6.18639 -6.20875 7.13868 -6.814 7.6597 -7.41314 9.49798 -5.48819 6.31634 -4.81318 5.08156 -9.15434 9.42787 -4.83201 5.43295 -1.44477 2.6455 -8.8907 10.4727 -3.19487 3.21255 -1.47291 3.13113 -4.14796 5.10058 -5.85016 8.41212 -7.58183 8.53659 -9.5978 10.2877 -1.5954 2.58394 -2.65561 4.0975 --0.157024 0.16627 -7.04379 7.75368 -2.39896 2.7728 -2.42376 3.58085 -0.158653 0.857045 -7.82101 9.01833 -6.80499 7.35261 -6.62833 6.66255 -4.90229 5.45681 -8.50205 8.69236 -2.01845 2.06924 -8.2503 9.04222 -4.58265 5.52758 -8.6176 9.74887 -1.28468 1.77019 -5.40424 6.20705 -0.943905 1.98023 -4.2702 4.41287 -3.89454 4.4814 -0.585132 1.56351 -9.45354 10.5374 -3.7501 5.07553 -7.53248 8.14004 -4.60026 4.78921 -1.61073 4.22368 -6.22591 7.40966 -0.57866 1.0522 -5.877 6.55882 -3.54573 3.7731 -7.64294 7.66103 -8.2399 9.14032 -0.307808 0.571367 -7.89791 9.25734 -5.2852 5.84332 -0.45713 2.42223 -7.73426 8.48158 -8.0058 9.46405 -8.03189 8.41868 -1.54624 1.98914 -7.24167 7.27699 -8.61226 8.83199 -5.38365 6.52599 -0.827018 1.51428 -7.19285 7.48372 --0.0969552 2.16007 -4.08084 6.32563 -9.16026 10.2604 -0.206147 0.717435 -4.00643 4.8093 -2.16139 3.14759 -1.73359 3.13485 -9.1103 9.36052 -7.05621 7.43901 -4.83509 6.07581 -5.67164 7.89488 -7.93353 8.18454 -2.59566 3.1842 -3.62521 4.95121 -3.0297 3.18649 -1.08515 2.69289 -3.77063 5.7789 -0.106035 1.27409 -0.601099 2.13481 -6.98837 7.58833 -9.22955 9.79149 -1.6398 1.78726 -2.30423 3.34814 -2.3912 2.81842 -4.71724 6.16966 -5.13553 5.5016 -5.34117 5.45075 -9.32776 10.0676 -4.54244 5.29058 -4.01337 5.73188 -8.17427 8.39652 -1.96122 2.6921 -0.594267 1.00176 --0.136973 0.977133 -6.41362 6.78056 -1.68388 2.39891 -9.50795 10.2315 --0.262703 1.15557 -8.72229 9.683 -5.41821 5.67519 -4.93514 7.15867 -4.07046 4.26702 --0.00866106 0.252353 -8.65877 10.1527 -2.10958 3.40353 -2.94947 3.43201 -6.32014 7.06279 -2.55034 2.89646 -3.87777 5.68044 -2.05325 3.00968 -5.11855 6.55784 -8.99618 9.22608 -3.36303 3.84902 -2.6234 3.70832 -7.35189 8.30856 -6.43777 7.28495 -5.33954 5.48055 -0.15999 0.391114 -3.4492 5.07088 -2.38503 2.42742 -3.88912 4.93246 -2.76303 4.54991 -6.56261 7.60381 -3.64198 3.72471 -1.70542 1.78806 -9.71115 9.88315 -0.471586 1.82377 -9.27611 10.5725 -0.486889 0.851587 -4.39234 5.10637 -9.54209 9.8955 -6.99602 7.42461 -2.98797 3.74623 -5.89424 6.4498 -9.63845 9.86333 -4.39828 5.18646 -2.30118 3.5758 -8.68128 9.56011 -9.00505 10.4304 --0.22184 0.233296 -6.48492 7.60283 -1.54156 2.60693 -4.06808 6.39369 -5.52361 6.26241 --0.698727 0.745524 -2.30742 2.41924 -0.655833 1.65752 -6.94733 7.81866 -7.83136 9.10651 -6.45284 7.1931 -6.09683 6.66159 -9.03299 9.4163 -1.86392 3.26189 -0.54863 2.07194 -0.364026 1.38376 -0.706954 1.0736 --0.111015 0.584367 -1.54265 2.1413 -0.501172 0.57928 -2.09411 2.28902 -1.89894 4.09104 -8.72895 8.87045 -5.27709 5.72545 -0.164581 1.64188 -8.39203 8.73608 -8.21523 8.45002 -9.62006 10.1665 -4.79076 6.26442 -3.44189 3.68669 -8.93789 9.38343 -7.07036 7.64194 -8.34396 9.56445 -8.29992 8.64954 -5.82566 7.83287 -2.43008 3.4476 -1.81121 2.12203 -4.36108 4.3842 -6.28756 6.95939 -3.8698 5.79519 -0.644581 0.699162 -9.71982 10.2422 -4.86545 5.00544 -8.3808 9.29356 -1.34495 1.40972 -1.03641 2.01838 -8.55609 9.99958 -1.40813 3.46097 -3.20928 4.08838 -8.24345 9.11587 -1.27604 2.03462 -8.28298 8.46252 -2.20644 3.19585 -1.91396 2.30108 -4.2553 5.66006 -7.34925 8.38275 -6.28319 7.22199 -8.42171 9.62596 -1.12059 1.18262 -1.37555 1.84196 -4.39663 4.93639 -9.28044 9.58437 -5.47407 6.88593 -8.36529 8.49813 -9.40208 10.5922 --0.451389 1.92404 -2.89431 3.19453 -6.51433 8.02158 -5.52163 6.06786 -7.63525 9.86457 -4.13898 5.05845 -0.136662 0.503748 -6.13492 6.74997 -8.37416 9.18971 -8.64164 8.82663 -0.941173 1.16158 -6.9073 8.26916 -8.37278 8.44326 -8.8951 9.20427 -8.40149 9.17577 -3.60361 4.57183 -8.67263 10.1127 -5.89716 6.45412 -1.97285 2.35593 -7.22973 8.13467 -9.55645 9.92529 -0.261578 0.836274 -9.04414 9.45485 -6.18043 6.54229 -8.88579 9.54087 -1.82613 2.93849 -5.7599 5.96366 -5.23105 5.5541 -0.425229 1.44436 -0.32065 2.60892 -7.83655 9.48786 -2.3168 3.45972 -2.35466 3.23342 -8.24494 8.27258 -7.32678 7.74264 -8.37275 10.0741 -4.17337 4.98348 --0.162009 0.724431 -9.49757 9.76377 -8.69435 9.08089 -4.13841 4.7514 -7.26358 7.55514 -6.91912 6.93 -6.7883 7.18296 --0.614315 1.1857 -6.05907 7.33557 -4.86704 4.87705 -8.50012 9.14836 -1.83683 3.09895 -6.16389 8.39248 -3.03556 4.41004 -4.72416 5.05782 -1.98183 3.19183 -2.77103 5.71501 -4.90002 4.9817 -0.269258 0.725628 -5.59551 7.05038 -2.95416 3.09633 -2.17662 3.18385 -6.67536 7.56762 -7.31678 7.39321 -3.84158 3.85359 -4.38203 5.10149 -0.816784 1.09918 -0.70131 0.739502 -0.276631 2.32633 -9.15839 9.49433 -0.721295 1.97673 -2.63875 2.75437 -5.00344 5.5645 -2.24555 2.81234 -7.74465 9.07646 -2.35244 4.90632 -0.812093 0.954419 -3.97904 5.2071 -4.19177 4.83646 -0.853012 1.331 -2.64112 3.25613 -0.0894716 1.61954 -3.39617 3.40859 -1.56906 2.28518 -2.37258 4.36515 -1.60997 1.7561 -5.15275 5.33281 -6.47824 7.47529 -2.51145 3.29949 -2.71094 2.77785 -8.84653 9.48398 -1.3246 1.66664 -7.43718 7.5546 -3.68985 4.24649 -4.50553 4.51669 -4.15617 4.54887 -8.55319 10.2136 -2.1448 3.55805 -4.64594 4.71505 -1.71763 1.99977 -4.98066 5.46709 -7.7779 8.36497 --0.0604997 0.301294 -5.11873 7.32867 -4.94567 5.5986 -5.32645 6.26835 -2.5768 3.13511 -3.31604 3.87555 -1.60834 2.68762 -3.30552 3.85211 -4.26741 4.98636 -0.820475 1.18854 -7.91501 10.7203 -5.17391 5.30351 -4.00452 5.75141 -2.37722 3.4602 -2.2373 2.94837 -1.62462 3.48264 -7.98507 9.2566 -5.32504 5.56388 -0.760614 0.7802 -0.855659 1.01522 -3.11231 4.43223 -5.62821 6.21564 -4.96845 5.35921 -8.10559 9.11106 -1.02533 1.13103 -6.99976 7.0788 -1.87628 2.58801 -1.11023 2.24655 -5.23343 5.45086 -0.95875 2.25343 -7.45917 8.23614 -2.72245 3.04663 -8.66816 8.70698 -5.55734 7.12262 -1.01935 1.88271 -0.804417 1.76187 -7.82703 8.78426 -4.77321 6.15199 -2.91503 3.69352 -0.776735 1.08883 -5.19981 5.46442 -9.06483 10.4008 -7.72082 8.26398 -2.9854 3.26573 -0.584028 2.60443 -0.700994 1.10379 -5.47612 5.94502 --0.318442 0.986786 -5.0704 5.08055 -3.83732 4.4826 -5.60843 6.59005 -8.81432 9.7851 -6.28792 6.65284 -1.16812 2.27701 -7.15234 9.66795 -9.02188 9.15339 -1.76112 2.04839 -7.49419 7.6204 -5.1765 5.497 -1.45855 1.94969 -1.35003 1.55822 -2.50453 2.86815 -7.10451 8.51352 -3.87727 4.1124 -1.84876 2.79351 -3.01661 4.05396 --0.16814 0.366484 --0.538895 0.608786 -7.59933 9.00744 -0.938648 2.38471 -5.76934 6.16572 -8.20416 8.62505 -8.64542 8.7264 -2.75784 2.7828 -0.794451 1.97817 -9.21331 10.5156 -8.46671 8.80572 -3.94814 5.16845 -6.73654 6.97397 -4.05301 4.93008 -6.37833 6.77985 -7.21161 8.15994 -3.74993 4.61029 --0.127938 1.09853 -2.82957 4.28816 -6.50564 6.59445 -8.37926 8.48332 -0.757443 1.74585 -0.232438 0.972293 -6.99187 8.7098 -7.20368 8.44301 -4.4801 6.07501 -4.34015 6.1495 -2.19394 3.22334 -7.29817 8.41021 -1.16627 2.68901 -4.62423 5.08039 -0.955655 2.22882 -1.45862 3.07065 -1.69815 2.56291 -4.01179 4.36587 -7.135 7.75829 -6.6823 7.27765 -5.44745 5.67195 -4.94594 5.42067 -0.267772 0.301939 -0.676432 1.6296 -1.37335 1.91645 -1.89051 2.38631 -4.84386 6.30539 -8.95613 10.944 -2.18119 2.41821 -5.74901 6.16952 -7.5431 7.88071 -9.05278 9.8128 -0.201334 1.65323 -2.82787 3.82083 -3.07073 3.08475 -8.99671 10.1766 -5.43261 6.12137 -4.83693 4.86848 -6.31804 7.21544 -2.34491 3.2562 -6.05941 6.53725 --0.483381 1.17347 -5.53777 5.72651 -3.28875 3.47472 -3.94609 4.9418 -7.45585 8.6871 -1.50066 2.57215 -8.10112 8.67954 -6.24737 6.42635 -0.64413 1.05759 -7.1741 8.21476 -0.502722 1.77462 -0.783663 1.74174 -9.52704 9.9109 --0.473873 2.01013 -7.07946 7.11474 -0.857335 1.6501 -4.00225 4.84453 -5.40598 6.30573 -8.18802 8.30067 -9.00412 10.9588 -9.8362 10.1517 -7.62735 8.37572 -3.41477 4.63099 -2.51254 2.81559 -6.36702 6.56061 -5.11842 5.35515 -5.21873 5.73296 -5.73528 7.77276 -3.64993 4.66826 -7.12664 8.46553 -8.7257 9.16851 -1.27615 2.20376 -7.46188 8.20752 -2.64939 2.66373 -4.94147 6.0509 -6.3805 7.48841 -6.25197 7.12327 -0.0885331 1.2682 -4.97356 6.58488 -4.11917 4.27267 -9.08793 9.70385 -0.897277 1.31702 -6.87538 8.25544 -1.55565 1.59492 -2.62483 3.54274 -1.49631 2.92263 -9.45305 9.97728 -6.24087 6.4577 -3.94636 5.13669 --0.000956745 1.08235 -1.46134 1.83767 -9.18517 10.6601 --0.740186 1.81269 -5.81977 6.15818 -7.0529 7.99421 -6.17753 7.49749 -8.63091 9.04205 -9.65219 10.1558 -3.12839 4.99211 -2.97262 4.07384 -4.28605 4.33171 -4.15906 5.6805 -1.35165 1.50732 -0.524207 2.12307 -5.32468 7.01472 -3.16982 4.87893 -6.88786 8.34191 -3.81703 5.22335 -3.86772 4.37359 -8.19386 10.0705 -1.73155 3.16695 -4.31685 4.62261 -9.40618 9.89612 -4.41215 5.19659 -2.35595 2.63543 -7.88481 8.14203 -7.17062 10.3534 -9.41379 10.389 -7.99867 9.01239 -3.31382 4.04915 -5.39222 6.07657 -8.5187 8.65976 -9.30132 10.6131 -7.17351 7.93596 -4.80134 6.72724 -3.59756 4.65182 -1.08248 1.17479 -1.03124 1.06871 -6.43154 6.95098 --0.102199 0.59801 -4.94795 5.18081 -6.39126 7.30258 -1.52738 2.04271 -1.80373 2.33093 -2.72251 3.01677 -0.296722 1.10844 -6.39104 6.51567 -8.70965 8.78714 -2.07858 4.41695 -1.91027 2.9718 -1.42944 2.01864 -1.96347 2.73397 -4.0701 4.22456 -4.02859 4.05107 -7.10977 7.98092 -8.21148 9.54287 -6.59231 7.65109 -0.144191 0.830665 -2.0192 2.23704 -8.03482 8.39591 -8.90473 9.98543 -2.18284 2.70166 -3.05569 3.54238 -8.35319 9.39539 -2.00803 2.42866 -2.35282 3.13763 -2.20155 2.79377 -1.76531 2.94892 -7.52749 7.72567 -3.02266 3.24778 -4.01741 4.22521 -9.75263 9.91571 -6.45502 6.67838 -2.24912 3.47262 -1.84372 2.26517 -4.09559 5.71188 -1.43811 2.33732 -3.89171 4.16905 -3.01506 3.9725 -0.0273168 1.51766 -5.04118 5.80507 -3.08517 4.17316 -8.81637 8.8332 -8.74055 9.50143 -2.36904 2.69008 -6.39733 6.44221 -8.53272 9.51114 -9.48423 9.55002 -8.65645 9.04872 -6.66352 7.48009 -5.64389 7.88656 -5.75301 6.6759 -3.28645 4.22757 -4.99482 5.82988 -3.00004 4.0273 -1.45249 1.56662 -4.96263 5.32195 -7.91351 8.1437 -1.02034 1.56249 -0.71376 1.73319 -0.709968 1.44651 -9.01414 9.54799 -4.02116 4.68005 -7.10903 7.27075 -7.21322 8.71031 -1.6644 2.27186 -3.71304 4.68764 -9.66257 10.1452 -5.34477 5.46136 -9.27722 10.583 -3.82328 4.83316 -4.77019 5.07928 -9.07112 9.23836 -6.99091 7.25634 -2.11871 2.3054 -7.88242 7.98572 -0.570809 0.714073 -8.51532 9.49151 -0.329247 2.48897 -4.78202 5.36476 -1.47969 2.78867 -6.75011 7.36769 -2.31162 2.39533 -3.50434 4.48026 -5.84603 6.28861 -7.5337 7.62538 -1.09955 2.85741 -6.09915 7.20381 -0.933825 2.37925 -0.576363 2.0182 -3.12126 3.22507 -2.85313 3.02656 -3.25724 3.92077 -5.48575 6.58011 -1.02824 1.65415 -8.68703 9.06219 -3.28389 3.86349 -5.80264 6.12775 -7.11846 7.47444 -1.29638 3.38601 -6.37908 7.05986 --0.592438 0.854361 -0.39233 1.17768 -2.1497 3.94423 -2.42336 2.43441 -6.94806 8.30626 -0.79865 1.4173 -1.41455 1.43684 -0.240074 1.16712 -4.18593 5.9929 -6.161 6.564 -0.726091 1.90706 -0.375606 0.694866 -4.09349 4.26452 -2.01652 2.68038 -8.99301 9.90549 -8.93909 9.17673 -1.10427 2.01247 -9.12668 9.15282 -1.08098 1.55374 -0.377836 0.414809 -7.28611 8.86318 -8.3542 8.53251 -3.86353 4.12875 -6.7631 7.40068 -4.61679 4.78182 -2.12935 3.45492 -3.68233 4.0457 -6.68131 8.22111 -8.79197 8.80474 -1.8915 2.26287 -0.387586 3.073 -6.46798 7.57381 -7.79742 9.34526 --1.21538 1.67303 -2.07845 2.66028 -3.14148 4.46647 -1.66789 2.73375 -8.49821 10.0574 -8.42537 8.89906 -0.618349 2.72887 -6.8229 7.54501 -6.99343 7.35322 -7.34223 8.68781 -3.18834 3.98274 -8.86908 10.2535 -3.39839 3.76171 -0.188168 0.392276 -1.68187 3.53401 -6.50423 6.71714 -7.61191 8.89715 -1.68463 2.09275 -5.94627 7.6003 -2.15865 3.24126 -7.93639 8.53826 -2.99626 3.43273 -7.71028 8.41172 -3.19472 4.60878 -8.36123 8.92549 -8.92975 9.02783 -2.87187 3.49672 -6.76949 7.71139 -8.09121 9.31151 -6.84199 7.44009 -0.730655 0.800873 -7.5208 7.54109 -6.75992 7.55017 -6.09818 6.17399 -0.639209 1.27283 -3.01917 3.22327 -1.69181 2.60614 -9.49245 9.5842 --0.418034 1.08035 -5.77705 6.4705 -6.79362 8.51993 -9.73155 9.81609 -3.71503 3.92022 -6.18589 6.77634 -3.94124 4.23942 -7.59911 8.05275 -3.68865 5.10948 -7.63926 8.63019 --0.049855 0.0844425 --0.41188 0.807786 -1.35962 1.81039 -5.40579 6.15098 -1.38594 2.0059 -6.93444 8.71958 -7.01229 9.38008 --0.0974976 0.962679 -4.74131 6.59152 -1.02343 1.59245 -1.55629 1.9128 -6.28353 8.38021 -5.66349 5.79644 -1.72629 2.28563 -1.64539 2.82654 -0.359466 1.05106 -4.37569 4.82703 -5.87657 6.37853 -1.46316 1.65333 -7.44494 7.5985 -1.16846 1.98579 -4.43371 4.93234 -2.31838 2.47777 -7.52687 8.44423 -6.08056 7.42253 -9.16144 9.94783 -4.74382 4.95616 -0.248344 1.05335 -6.12345 7.43941 -9.45647 9.99799 -3.77124 4.75199 -3.31315 3.44873 --0.0909828 1.51271 -7.03234 8.02546 -8.11403 9.11461 -6.734 7.34799 -1.08903 1.18319 -2.72871 4.31607 -6.53688 7.52754 -1.07868 1.27792 -6.28409 6.56795 -4.89866 5.79458 -9.06994 9.1221 -2.54989 3.14338 -3.69971 5.71717 -3.7113 4.55076 -8.91864 9.64522 -8.75634 8.82359 -9.02242 9.03869 -3.59945 4.20169 -4.98557 5.07401 -4.81526 5.74009 -7.264 8.63749 -2.79579 4.43389 -2.87204 4.66432 -2.32487 3.72127 -3.99704 4.72567 -8.17229 9.0158 --0.72926 0.823658 -2.52355 3.32725 -5.3446 6.63868 -4.48935 7.37833 -3.08173 3.0968 -2.41585 3.23026 -9.23187 10.5413 -5.50099 5.51888 -1.29634 1.88846 --0.0113225 1.41526 -6.34508 7.53417 -0.383019 2.25144 -5.0649 5.40222 -3.08221 3.76296 -9.29111 10.6833 -2.19714 2.94735 -8.75711 9.48583 -8.61564 8.69349 -1.9362 3.96191 -3.7962 4.44382 -7.78501 9.03843 -5.79649 7.29675 -6.03048 7.4316 -1.31105 4.36446 -6.5882 7.03622 -4.88148 7.12474 -6.62305 6.90973 -2.27488 2.73731 -8.42703 9.28888 -7.72928 8.53989 -7.27021 8.63879 -0.992908 1.92001 --0.282737 0.511292 -7.88963 8.03117 -6.93371 8.26148 --0.0346633 0.403617 -8.7827 8.82558 -5.16876 5.59742 -8.61275 8.73843 -5.70578 6.02783 -9.08706 9.35903 -9.32728 9.83021 -9.20058 10.2497 -6.79824 7.3024 -7.17979 7.51783 -0.918555 2.67878 -7.9662 8.63241 -8.85903 10.3145 -9.34614 10.1964 -9.05027 9.79872 -8.28959 8.45837 -1.32518 2.04557 -8.72848 9.16742 -5.92126 6.77277 -8.31504 8.78631 -1.02487 1.70172 -4.45204 4.72842 -8.20636 10.4724 -5.86211 6.25457 -6.15754 7.71303 -8.37832 8.82577 -4.25233 4.59417 -9.41451 9.95324 -9.372 10.4461 -1.8346 2.7144 -8.00681 8.14717 -7.03997 7.06753 -7.16892 7.70102 -7.01781 7.46799 -1.78526 1.7969 -1.63304 2.2011 -8.59718 8.61083 -9.43498 10.3636 -4.98718 5.32487 -3.65451 4.89601 -8.82368 9.11333 --0.104862 0.598773 -4.97756 5.62342 -1.99876 3.24686 -2.32242 4.01096 -4.04914 4.77892 -3.81545 4.32583 -3.30153 3.46783 -3.14287 4.04718 -8.65711 8.76768 -9.09385 10.6898 -4.82771 5.64405 -5.98783 6.36785 -7.93397 9.6543 -4.89726 5.65486 -5.08717 5.22314 -6.59377 7.23748 -3.58289 3.98597 -0.177884 0.397629 -5.30856 5.79257 -2.53943 3.98007 -6.51217 6.59644 -0.196888 1.99904 -3.8709 4.1901 -2.37646 2.50997 -7.03837 8.13287 -6.8674 6.89535 -0.576964 2.08851 -0.902928 2.86981 -8.59261 9.20279 -5.96621 7.49899 -0.617602 1.83267 -2.29189 2.6361 -4.34207 4.61026 -6.19963 6.76443 -1.15955 1.44068 -5.25852 6.33905 -6.37306 7.53103 -9.13334 10.039 -8.67743 9.93959 -5.62973 6.04375 -8.32286 8.77042 -3.28772 6.1722 -4.97902 5.47249 -3.37765 5.07238 -4.58025 4.84341 -2.76807 3.18817 -4.27581 4.43023 -6.92572 7.68461 -0.279247 1.0561 -1.10903 2.61106 -6.71708 6.73132 -2.66415 3.75702 -8.0513 9.80334 -4.82466 6.04232 -2.59971 2.85768 -9.04689 9.73945 -3.48338 5.16622 -7.90925 8.92774 -7.30264 8.06247 -7.59087 8.26476 -0.150315 0.423068 -8.62726 9.74636 -9.01983 9.71707 -6.84007 7.40541 -8.87829 9.48342 -2.69214 3.71481 -0.580036 0.77289 -9.474 9.83397 -5.80151 6.08527 -3.63837 5.27137 -8.5848 8.65779 -7.88338 8.13276 -3.27992 4.20963 -6.21244 7.28079 --0.348924 1.38478 -5.26688 5.93787 -3.78941 5.01009 -6.41929 8.38529 -1.41724 1.67733 -0.212821 1.58246 -0.0697189 0.160497 -9.57839 10.2377 -9.03332 9.70645 -4.94572 5.15163 -3.16999 4.536 -5.77494 6.68359 -5.89258 6.11852 -7.72257 8.21668 -8.42501 8.44905 -8.7196 8.86465 -4.392 5.1076 -1.88249 2.54422 -1.38092 1.60326 -5.04142 6.37374 -4.31795 5.91152 -1.79399 2.09314 -6.65405 8.32262 -1.36356 1.58538 -5.45456 6.55824 -4.95807 6.22848 -8.72077 10.2825 -0.745968 2.01546 -6.85041 7.11076 -4.82028 5.34442 -5.77673 8.01294 -8.58582 9.33714 -8.49884 9.21533 -9.05574 9.4096 -3.19932 3.27024 -9.50227 9.96685 -0.771636 1.0617 -9.00621 9.36397 --0.097167 1.39463 -7.79622 8.43537 -8.05228 10.1504 -2.21685 4.17072 -1.82476 2.45381 -4.34408 4.56578 -9.27538 9.54701 -6.80153 7.44115 -7.38884 7.84448 -7.17526 8.00165 -5.85812 7.67326 -5.25545 6.30791 -5.68518 5.94055 -3.77685 4.1545 -0.530928 0.737248 -3.9772 4.59563 -8.96322 9.45618 -7.98322 8.44165 -3.42929 4.22329 -3.66445 4.7583 --0.183652 0.434842 -3.16492 3.95726 -6.87407 7.89944 -5.08921 5.7745 -2.85466 3.04505 -7.12685 7.41248 -0.715419 0.876676 -3.47441 5.21753 -9.13594 9.87799 -5.52459 6.35691 -5.12544 6.12935 -2.44296 2.91543 -2.75148 4.19886 -1.43478 4.3919 -6.6352 7.07768 -4.72283 5.11506 -6.36434 7.69268 -2.32643 2.75289 -5.46566 6.22854 -6.37995 6.76989 -1.52564 3.55871 -1.05807 2.19393 -1.95374 4.08727 -8.11273 8.12767 -2.85955 4.71355 -4.89009 6.88516 -2.06859 2.25512 -7.50556 8.77923 -4.43353 5.11915 -5.16308 5.9695 -1.12072 1.69277 -3.96494 4.38143 -7.06931 7.89524 -0.514522 1.51265 -6.56389 7.01146 -1.51362 1.8541 -4.90339 5.51209 -2.11422 3.15457 -2.50094 3.92557 -8.24319 8.62826 --0.0843505 0.710377 -6.35956 7.89457 --0.790954 1.2964 -4.02253 5.19193 -2.7425 3.46763 -9.41469 10.1367 -1.57636 2.25105 -3.18647 3.38738 -8.36644 9.66791 -0.180846 0.461221 -7.07675 7.71881 -0.265366 1.19275 -5.43007 6.4854 -9.13912 9.23294 -9.52905 10.4029 -1.18712 2.66227 -5.22714 5.62601 -1.87413 2.8716 -5.71882 6.16374 -5.38169 6.13948 --0.196005 0.236738 -5.36803 6.4395 -8.27713 8.71262 -8.82031 8.8598 --0.53845 0.564783 -1.80716 1.94173 -5.67905 7.47291 -2.37779 3.64893 -0.574727 0.766424 -4.60701 4.86591 -3.17989 4.37738 -1.36777 3.15112 -1.48092 3.06573 -3.37009 4.06028 -4.17179 6.2073 -6.47953 6.88994 -5.74431 6.5253 -4.88827 5.49049 -5.44148 5.59239 -1.66153 2.63132 -7.69387 7.82267 -5.20911 5.48488 --0.103218 0.497402 -7.18003 7.33324 -6.54305 8.81732 -0.278108 1.27452 -2.38323 2.94772 -1.2461 2.03246 -5.47052 5.75781 -7.31505 7.35895 -2.22248 4.23589 -0.0305319 0.430773 -8.32043 10.1222 -6.11732 7.09764 -5.08797 5.74991 -6.62491 7.34164 -5.55795 5.66083 -3.27549 4.13145 -1.0113 3.24631 -0.0717186 0.519738 -7.82905 9.30839 -9.90251 9.98691 -0.841457 0.952276 --0.133927 0.510174 -1.14614 2.82218 -2.59767 4.19742 -3.41095 3.95265 -3.38951 3.75838 -8.86766 9.19437 -9.27927 10.261 -2.33249 2.79402 -5.69681 5.93469 -4.02502 5.38732 -0.797157 1.22845 -7.23558 7.8651 -1.1253 1.99184 -8.58296 8.64267 --0.400141 0.74698 -3.46677 3.50526 -6.03252 6.64842 -5.8493 6.68938 -3.53209 3.84014 -7.22078 8.98106 -6.21943 7.69944 -0.887198 2.07323 -3.36591 4.57442 -4.30143 6.41179 -4.07556 4.54276 -8.77552 10.0615 -6.7247 7.04044 -9.05494 10.1126 -7.46604 7.80632 -3.38601 3.8043 -5.60475 7.02788 -9.09811 9.4654 -9.33447 9.80012 -8.66499 10.1002 -3.87007 3.88281 -2.87624 3.11359 -5.92385 6.80801 -4.49711 5.01863 -8.84524 9.36225 -6.40944 6.82093 -2.90915 3.68288 -3.96801 4.82534 -5.51744 5.84233 -3.2959 3.44409 -0.18526 0.207322 -5.49717 5.72648 -6.9522 7.1952 -0.769572 1.79343 -5.95522 6.03918 -6.54327 7.7475 -2.13516 3.83957 --0.388892 0.775076 -1.30128 2.29414 -9.76761 10.1604 -7.38731 8.66002 -7.09229 7.43495 -9.1379 9.52432 -6.75942 7.88717 -7.42824 8.82063 -6.93078 8.19884 -2.307 2.93836 -8.38254 8.84691 -3.90159 5.37938 -0.0413204 0.112203 -0.638217 1.53943 -0.88678 2.49435 -1.99104 2.60847 -6.61595 7.65064 -2.37641 4.71719 -7.94945 9.21404 -5.44594 7.13646 -5.45737 6.12335 -7.39207 8.02885 -5.51588 7.39341 -8.1581 10.0632 -0.197869 1.44516 --0.0161139 0.73487 -4.24155 4.7304 -0.00374564 1.26481 -8.1878 8.20011 --0.115544 1.74771 -0.912347 2.52922 -2.72234 4.83268 -6.45577 7.07776 -9.74201 10.1772 -7.11008 8.72914 -4.41921 4.8673 -7.97673 8.36658 -0.438659 0.647061 -4.35086 5.44482 -8.22919 9.34379 -3.53242 5.65576 -1.126 2.32177 -5.95118 6.51364 -3.10519 3.9447 -1.28889 2.26267 -7.04255 7.67791 -3.12614 3.17626 -8.09968 8.49162 -6.07924 7.219 -5.99554 6.52549 -9.14378 9.5773 -5.82872 6.53112 -9.3361 10.1704 -4.3751 6.51675 -3.288 3.98328 -4.56342 4.80185 -7.16574 7.43901 -7.7638 8.47758 -7.31514 7.78499 -7.98942 9.50252 -4.31211 4.70724 -2.9094 3.33304 -0.108736 0.668815 -8.08409 9.11098 --0.0053985 0.589992 -1.31926 2.72153 -2.28664 2.38813 -7.95237 8.26388 --0.0283047 0.452099 -7.50295 8.71708 -7.72356 8.63468 -3.48953 3.89579 -7.73814 8.73456 -4.54487 5.45817 -6.45109 7.00312 -3.99915 5.41716 -6.81436 8.5682 -6.86726 7.55999 -2.67863 3.7053 -2.6837 3.39567 -2.84347 2.91724 -5.79383 5.80493 -2.41217 3.0619 -8.78163 9.0998 -1.43456 2.50854 -6.73393 8.53005 -3.02563 3.56456 -3.34628 4.2934 -2.44985 2.92819 -1.38262 2.89341 -4.56337 5.75702 -0.275735 1.16604 -1.39763 2.8108 -9.69128 9.90361 -8.54868 9.66756 -3.01838 3.72831 -8.34017 10.5262 -1.82721 3.0476 -5.9732 6.83307 -2.77874 4.25603 -1.71987 3.1227 -6.33773 7.89103 -1.31982 2.82992 -4.21601 4.9627 -6.68166 6.72653 -0.87708 1.06828 -1.03483 1.26625 -2.996 4.03087 -1.54718 1.57452 -2.33087 2.38226 -2.29464 3.36496 -2.03064 3.41867 -5.8456 6.10406 -7.54614 8.2874 -1.42938 2.89154 -2.65935 3.53883 -3.98845 4.42049 -6.85632 7.15487 -8.12038 9.34993 -0.873558 1.32129 -6.61595 8.00766 -9.49147 9.81947 --0.0225601 0.328769 --0.481519 1.37204 -6.31457 7.45251 -4.59738 5.81395 -4.83304 5.63008 -1.95746 2.78657 -2.97889 3.74408 -9.08327 10.702 -3.58219 4.93634 -7.87068 9.77851 -0.330978 1.36031 -4.78145 5.36918 -4.94672 5.56644 -7.66806 8.08613 -4.78512 6.35461 -5.17367 5.74386 -8.65884 9.97088 -9.22053 9.60447 -6.15061 6.58817 -0.0875971 0.541643 -6.45597 7.92002 -0.636824 1.05267 -5.31677 6.12838 -6.51127 6.6731 -0.459551 1.69382 -5.75106 6.41377 -3.68438 4.67415 -9.36302 9.78281 -5.46195 7.99215 -2.55471 2.59231 --0.0640245 1.33755 -9.36027 10.6198 -2.67955 2.77882 -3.51443 4.10619 -6.83904 7.23692 -2.59553 2.81418 -7.74628 8.95169 -3.86464 3.90067 -3.32377 3.992 -1.43737 2.52191 -3.83927 3.99402 -5.24426 5.35179 -0.833857 1.05277 -8.4062 8.51964 -9.62299 9.66254 -3.55427 5.19048 -1.7003 2.62107 -6.8059 7.49246 --0.761104 0.773528 -1.37137 1.95048 -2.1222 2.59387 -0.633505 2.04796 -0.605156 1.04336 -7.22842 8.3365 -4.28716 5.28921 -8.14286 9.52015 -7.62467 9.18603 -1.11029 1.81278 -5.05654 5.13597 -0.862653 0.97827 -7.24766 7.92167 -8.80103 8.91467 -3.05841 4.82292 -1.28204 1.55969 -1.58886 2.57874 -0.0537678 1.28837 -8.09303 9.71678 -8.37599 8.85705 -3.18107 4.01971 -6.67019 7.75848 -6.29836 8.21603 -0.86271 1.30358 -3.86126 6.49694 -5.84446 6.24913 -0.475025 0.598151 -6.3477 7.08327 -3.60161 4.51824 -7.13317 8.13858 -4.89052 6.23701 -5.69441 5.99027 -7.18735 8.34853 -9.30182 9.34894 -6.06589 6.15141 -8.05917 8.89642 -5.6136 7.14058 -0.838337 0.959487 -0.56421 2.00841 -6.46876 6.63629 -2.4434 3.92184 -7.97216 9.45372 -8.17926 8.66756 -1.86522 2.01888 -0.983342 1.89079 -2.07322 2.09765 -3.52974 4.73717 -3.24973 4.88691 -5.47789 5.95384 -4.11218 4.57076 -6.61174 7.47165 -8.09302 8.36193 -1.67911 1.69022 -4.436 6.17515 -5.6544 5.74951 -1.50354 1.76043 -4.41433 4.83589 -1.82528 3.53979 -3.98749 4.65527 -6.42503 7.5787 -8.69554 10.1767 -8.39215 8.56999 -8.71646 9.66209 -1.59091 3.39622 -6.12574 6.94955 -7.92527 8.25049 -9.19858 9.49137 -2.73382 2.97747 -4.56558 5.94738 -8.33983 8.58548 -9.00798 9.01838 -4.93268 5.28383 -3.15356 3.58606 -8.28171 8.79351 -1.47358 1.9581 -0.891797 2.05345 -1.56032 2.38159 -2.5152 3.80485 -8.0963 9.88138 -1.1262 1.89279 -7.99336 8.2352 -5.25067 5.41251 -4.57532 5.20101 -1.87911 4.59415 -4.25142 4.70467 -8.18782 8.76989 -9.20478 9.3612 -7.70898 9.7752 -0.655865 0.958924 -4.8883 5.77477 -3.03279 3.47456 -1.01979 1.41661 -8.94219 10.6987 -2.49348 4.58195 -2.44003 3.29005 -3.4725 3.55572 -9.3917 9.95851 -7.08658 7.47686 -3.56413 4.44089 --0.47868 1.11453 -6.82615 8.00596 -3.49451 3.74705 -8.13286 8.47976 -7.01732 8.82556 -1.19064 1.48887 -5.28851 6.88637 -8.83175 9.49879 -0.939903 1.17024 -7.49124 9.01906 -2.9285 4.23224 -5.68296 6.86273 -8.53897 8.77886 -2.9107 5.01232 -0.748655 1.10265 -4.77258 5.12626 -3.995 4.75289 -2.71467 4.26926 -6.21665 7.16233 -4.53883 5.75731 -4.37153 4.76125 -7.47635 8.75777 -4.82013 6.4699 -9.36015 9.58451 -4.43054 5.86752 -2.10934 2.34705 -3.00306 3.06539 -7.81957 8.44081 -1.97221 3.06916 -0.153393 0.503956 -5.05611 5.27536 -5.73277 5.89001 -3.64807 4.85582 -6.13416 6.1528 -3.85511 4.14045 -0.411725 1.36529 -2.26932 2.5447 -3.51164 4.93266 -2.50955 4.34201 -8.74663 9.39268 -6.2229 6.39303 -4.38059 4.91592 -7.29109 8.62318 -6.31801 6.99532 -9.75036 10.0514 -1.69019 2.41527 -4.20462 5.27729 -6.32944 6.94729 -3.5736 5.21496 -4.48316 4.61828 -1.76915 2.43263 -2.42026 4.09159 -2.08762 2.43074 -5.48161 6.02473 -5.51826 7.47042 -2.78026 3.1552 -7.89469 9.49867 -3.09084 4.54697 -7.20417 7.42408 -5.36528 5.74851 -1.86239 2.41988 -1.55994 2.85743 -4.40182 4.6638 -7.91619 9.01242 -3.08119 3.74714 -1.54108 2.08538 -3.61461 3.64631 -8.76851 9.66257 --0.645571 1.3366 --0.707083 1.21005 -7.19571 8.23405 -5.42865 5.89329 -2.12897 2.59222 -0.603102 0.930391 -3.75025 4.63181 -6.14867 6.4526 -7.30947 7.51461 -7.83183 8.79802 -6.06658 8.53246 -1.67895 2.50063 -1.14179 2.04478 -8.59583 8.90112 --0.918885 1.30717 -0.182607 0.613593 -3.3335 3.77196 -0.783053 2.4368 -6.49331 7.60104 -2.85101 3.28637 -7.42273 7.66905 -3.96433 5.02573 -8.26262 8.40749 -9.24451 9.32783 -4.89036 7.07214 -6.45431 6.96815 -5.20701 6.58747 -7.40142 7.98615 -4.19768 4.9831 -3.32546 3.88811 --0.471996 0.967855 -9.36172 9.63532 -1.96831 3.00632 -7.537 9.72671 -4.67746 4.81135 -3.10782 4.93642 -4.94809 6.54855 -4.16763 5.25628 -9.04992 10.316 -0.668935 0.680886 -4.02935 4.84503 -5.32499 5.76636 -5.32267 7.15457 -5.18886 5.23491 -4.37053 5.36801 -2.39955 2.74657 -8.19764 8.86645 -4.24706 5.69703 -1.87851 2.36988 -0.886553 1.05064 -7.27428 7.90224 -9.08417 9.44879 -3.11534 4.02019 -6.3284 7.39925 -4.96029 5.59076 -2.58248 3.11741 -7.76513 8.13505 -4.93613 6.51523 -0.565355 1.70512 -2.12366 3.0319 -5.32422 6.84146 --0.135396 1.08591 -3.7901 4.86303 -4.49677 5.41847 -0.615748 0.834712 -0.64784 1.81859 -6.65505 7.13894 --1.12744 1.61017 -0.550814 1.24316 -6.66639 6.89866 -6.19271 8.17468 -3.09382 3.78684 -4.41221 4.95889 -7.96091 8.48824 -8.32129 10.2917 -2.13168 2.19835 -1.4635 2.38989 -5.78102 6.42215 -1.70153 3.20616 -5.35068 5.71016 -4.27702 4.37203 -5.13888 6.04764 -4.79644 5.37927 -6.75314 7.66368 -6.04484 6.84064 -4.34947 4.45643 -9.08755 10.396 -0.88804 2.17441 -6.86788 7.88301 -7.94296 8.61664 -8.02387 8.79591 -1.79024 2.40559 -5.50404 6.01044 -7.76772 8.1932 -1.174 1.23693 -6.20571 6.9224 -4.20863 4.48702 -4.16743 4.39075 --0.11965 0.120778 -7.01234 7.52619 -5.91415 6.46151 -5.28713 5.72354 -6.26981 6.31237 -0.643056 1.43864 -1.62562 1.99875 -0.544992 0.721386 -6.92522 7.09165 --0.107048 1.12273 -0.644674 0.91244 -8.56904 9.01883 -2.23079 2.56598 -9.79034 10.1123 -8.13788 8.4131 -1.86753 1.95236 -2.97577 3.33272 -8.57454 10.0193 -1.20043 1.53408 -3.43515 3.86571 -5.79075 6.41293 -1.71558 2.52845 -2.39907 3.46652 -9.08289 9.91182 -0.859644 1.07475 -5.30144 5.42157 --0.441497 0.890794 -3.55044 4.14918 --0.340115 1.19239 -6.5534 6.76908 -0.836514 2.09196 -8.15747 8.96484 -4.80087 5.14227 -7.72071 8.88223 -5.11901 5.65559 -4.44996 4.63562 --0.328404 1.3002 -0.90759 1.34556 -5.94839 6.35058 -1.76504 1.78344 -1.32585 2.08994 -7.18641 8.20945 -0.62657 1.06025 -6.28086 6.40975 -5.05525 5.16143 -5.82694 8.07685 -6.23677 7.55394 --0.226265 0.661443 -1.42599 2.36325 -9.04445 9.92971 --0.169286 0.185741 -8.34636 10.9042 -9.52494 10.0475 -8.39989 10.1377 -3.89956 4.70428 -3.98673 4.97185 -5.43008 5.67936 -7.76475 7.98591 -4.46895 4.73188 -0.584662 1.54474 -2.12622 2.79994 -1.40578 2.2461 -1.45171 2.02105 -2.05665 3.04611 -2.29818 2.68118 -1.77344 2.98698 -4.92092 5.55302 -7.18758 8.37525 -8.83407 10.0565 -2.91182 4.71932 -6.47293 6.74664 -2.49238 3.69749 -0.487234 0.541003 -4.703 4.92744 -9.8867 9.94918 -1.7713 1.9792 -5.68316 6.90242 -5.62485 6.70656 -7.24837 9.60197 -7.71147 7.76519 -5.22324 5.30661 -9.11258 9.28071 -8.2827 8.90115 -8.90865 9.42138 -7.47233 8.72308 -4.89712 5.65153 -4.12392 4.20239 -5.65325 6.55887 -8.65945 9.05845 -7.9165 8.36489 -1.4952 2.43991 -5.49665 5.80793 -1.67206 2.55302 -0.943544 1.58521 -0.47 0.860959 -6.47638 7.43101 -4.38434 5.97278 -8.12782 9.10574 -5.78143 6.6539 -9.23616 9.40513 -1.6845 2.00736 -6.56955 7.37847 -7.42993 9.04718 --0.179632 0.450904 -8.65819 9.07724 -7.86567 8.80824 -1.85428 2.7755 -2.29222 2.65374 -4.03614 4.51729 -6.9326 7.07635 -5.50807 6.498 -6.17637 7.26432 -8.7688 9.16308 -7.65 8.88604 -3.74495 4.29991 -8.5671 10.5661 -7.41964 8.21083 -8.04302 9.78783 -0.269663 0.317601 -8.29804 9.40991 -3.90673 4.22298 -8.82384 10.9441 -7.27081 8.19548 -1.30184 1.98993 -8.13028 8.92385 -7.21224 7.35137 -5.02122 5.69666 -0.817219 0.974073 --0.128067 0.589359 -2.12137 2.74019 -5.24657 5.44714 -1.55805 3.10332 -9.91031 10.0748 -7.13941 7.9143 --0.183908 0.934079 -3.987 4.11053 -3.26678 3.67608 -9.75921 10.1121 -0.755391 1.06346 -7.28479 7.49982 -1.37522 3.80623 -0.944351 1.46531 -9.49278 10.2372 -8.28946 8.67597 -9.43537 9.58003 -7.73357 8.756 -2.64043 2.8687 -4.70448 6.99929 -3.82199 3.89343 -3.43825 4.10908 -4.42362 5.69086 -8.08536 8.60142 -8.43208 9.31272 -7.5889 8.39208 -7.90112 7.9734 -6.10381 6.80568 -8.76283 8.80151 -1.46728 2.53288 -1.68884 2.47102 -7.63343 8.29838 -9.18852 9.5558 -0.977174 1.4792 -4.7577 5.74873 -4.66433 6.37375 --0.0952277 0.378184 -5.30929 6.07469 -4.98811 5.16146 -3.0744 5.59799 -0.944909 1.25222 -1.38561 2.51277 -3.77811 4.23459 -2.11604 3.32458 -0.920929 1.17187 -5.23496 6.34905 -6.9953 7.65745 -4.81803 4.89553 -4.69301 5.36777 --0.208926 2.6111 -7.97334 9.83269 --0.396673 0.779988 -5.91367 6.47682 -6.27249 6.83533 -5.58931 6.89679 -2.03394 2.67025 --0.197752 0.383167 -4.69751 7.695 -4.5989 6.07875 -3.7285 4.27396 -7.9807 8.27693 --0.00248985 1.30934 -2.68016 3.916 -0.881558 1.14567 -4.77066 5.05302 -0.552268 0.919467 -2.46862 2.65199 -1.4009 2.51701 --0.171185 1.28252 -9.27842 9.90243 -3.51778 3.57728 -6.10071 6.92163 -9.05387 10.0894 -5.52995 5.89082 -8.40216 9.0272 -9.02911 10.1602 -4.85818 7.38829 -1.6762 2.32334 -6.45416 8.62337 -5.44592 6.0245 -3.45876 3.94274 -9.07144 9.16725 -6.51885 7.6363 -7.92593 9.01986 -0.270702 1.57395 -6.11245 6.70173 -1.37658 2.19068 -2.42668 3.43827 -7.98226 8.43306 -3.72269 4.74654 -8.16252 8.58873 -8.81456 9.5363 --0.338386 0.864811 -1.90693 2.25796 -3.5305 4.17475 -6.07997 7.67393 -0.53347 1.68815 -7.31182 8.44458 -7.77462 8.33613 -3.79975 4.15552 -9.08822 9.9771 --0.101698 1.05442 -8.44869 9.95724 --0.0318759 0.532673 -8.09238 9.51356 -5.51514 6.60799 -8.66528 10.3297 -8.25556 9.97893 --0.220428 0.247563 -0.00453913 0.540444 -1.53599 1.61735 -3.77213 5.06896 -2.65332 2.75864 -6.05811 6.43112 -0.302534 0.803651 -0.393766 1.11611 -9.31035 9.62387 -0.568281 1.7765 --0.721118 1.27387 -1.83573 2.62578 -1.39953 1.91158 -6.51883 8.52813 -2.60154 2.95054 -6.58322 9.37818 -5.61178 5.67661 -9.56511 10.2767 -9.09174 10.0697 -2.55846 3.39943 -8.38146 9.06138 -7.97019 8.18074 -6.1426 6.42787 -1.15876 1.55463 -2.93483 2.96376 -7.23883 7.29158 -9.64606 10.0674 -4.89825 6.70366 -7.35635 7.96328 -2.2702 2.36797 --0.0464389 0.395244 -1.14883 2.10411 -4.7309 5.10593 -6.07946 7.37741 -5.50202 6.28822 -3.66574 3.96271 -1.9944 2.3862 -7.58159 7.59275 -1.98712 3.30587 -2.10317 2.89161 -9.66889 9.97287 -1.57327 2.15421 -8.14125 8.30983 -3.77185 4.12658 -8.51624 9.51485 -9.25211 9.722 -2.06312 3.0453 -9.34954 9.91254 -7.31475 8.89322 -7.85044 9.20242 -0.226243 1.28465 -0.0260868 0.575177 -9.40743 10.1655 -4.04324 5.05341 -1.02626 1.48332 -3.33074 3.72025 -9.2005 9.61387 -6.68317 7.14109 -6.82083 8.6312 -4.34816 4.50329 --0.48874 0.975608 -4.26651 5.68526 -4.89731 5.57569 -2.68984 3.5661 -0.499714 1.01055 -9.01902 9.36142 -3.22067 4.59054 -0.65132 0.860512 -1.6791 2.36642 -8.28222 8.7579 -2.84349 3.24134 -5.64949 6.09512 -3.44026 4.43245 -2.60889 2.6248 --0.00849234 0.984046 -7.5745 8.65675 -2.07464 2.6488 -2.59747 2.65772 -6.36828 7.42208 -3.83342 4.50127 -5.41167 5.7011 -6.53606 7.53796 -8.21975 9.56176 -1.90113 3.08684 -7.74402 7.82057 -4.26515 5.11327 -5.42743 5.59215 -8.69709 10.0912 -2.87019 3.94798 -9.27013 9.54627 -9.30568 10.2136 -9.02985 9.62917 -3.7589 4.59642 -6.59359 6.86939 -3.26574 4.83488 -5.14545 7.70086 -7.43163 8.05103 -5.72972 5.74457 -0.490113 1.31151 -7.018 7.42627 -6.22976 6.27589 -9.07732 9.30419 -4.3917 4.42663 -8.50298 10.3728 -6.18671 7.53619 -3.51053 4.097 -2.17172 3.56595 -6.08046 6.23691 -9.07361 10.9129 -3.95757 4.11333 --0.136516 0.78995 -1.34923 3.47002 -0.0562579 0.686502 -9.10943 10.2731 -5.80174 6.16971 -7.86011 7.87649 -5.34384 5.51645 -6.32167 6.76387 -7.70566 8.28038 --0.319903 0.867682 --0.372564 0.570014 -8.83696 10.8439 -7.78947 9.38211 -9.25815 10.1092 -5.59721 5.67148 -0.234719 2.42489 -1.06314 2.87416 -1.75391 2.69799 -5.4536 6.66068 -1.35696 1.87102 -2.17418 3.1459 -7.61817 7.98287 -2.92194 3.18393 -7.68243 7.83261 -9.33163 10.5531 -1.14227 2.50228 -5.47911 5.70857 -9.88123 10.0758 -8.81249 8.83145 -6.02747 6.43183 -4.81158 5.79178 -6.65666 7.5047 -4.89085 5.56569 -0.935564 1.71547 --0.0452879 1.16222 -4.03524 4.6206 -5.88518 6.02658 -2.06227 2.9581 -0.207246 2.2404 -2.81757 3.70318 -0.704257 1.98403 -2.38486 3.30039 -3.57073 4.78358 -1.53721 3.00546 -8.37852 8.39527 -1.54619 1.59789 -1.00447 1.40778 -5.31977 6.43861 -3.82175 3.83209 -3.37738 4.44002 -5.46644 5.97254 -3.88191 5.00688 -4.88046 5.39031 -4.15092 4.93679 -1.75182 2.07399 -1.16434 1.76541 -3.37032 4.29676 -3.1685 3.98533 -1.28787 1.59775 -5.86338 6.17993 -3.8645 4.25757 -1.83947 2.48092 -0.184795 0.586724 -3.13752 3.76447 -2.14264 3.03248 -5.78182 5.9029 -2.47969 3.8088 -2.59206 3.08362 --0.354871 1.03627 -7.94041 8.05947 -9.48014 9.93817 -0.992727 1.48877 -6.1525 7.51387 -5.00071 6.15665 -7.42074 8.27606 -9.6539 9.83042 -1.08984 1.46387 -5.46282 6.95907 -4.74506 5.13968 -0.357565 1.91464 -9.07652 9.65474 -0.201095 0.646211 -7.04306 7.69131 -1.17728 1.2237 -5.92183 6.29165 --0.41356 0.491524 -8.38339 10.4509 -8.08648 8.11344 -3.32474 3.39522 -5.762 5.83732 -2.26778 2.55548 -4.86127 5.92868 -3.75949 5.16608 -4.83431 5.88632 -2.65122 3.31344 -9.30295 9.38948 -6.03391 6.32749 -5.12035 5.59414 -5.68785 5.979 -7.89553 9.15202 -2.54445 2.74715 -2.36337 2.49709 -4.71661 6.12198 -3.72447 4.68735 -1.0541 1.53187 -3.45178 4.80929 -7.90773 8.26212 -8.1816 9.18627 -0.322569 0.871041 -7.24823 7.32699 -1.7003 2.78087 -9.70927 10.2515 -3.75922 4.01081 -1.06949 1.40253 -1.21774 1.4734 -6.02123 6.32973 -2.76396 3.09484 -2.80358 3.00026 -5.25666 6.31369 -4.71714 5.30669 -4.37906 4.50557 -7.40824 7.44969 -7.89081 9.18263 -8.8136 10.3074 -9.1757 9.37261 -7.1938 8.51137 -0.580081 2.32678 -2.02497 2.95434 -6.01446 6.78851 -8.54365 9.21454 -3.03567 3.27089 -0.650657 1.5716 -5.05518 6.36521 -1.64301 2.76399 -4.15989 4.34183 -3.72791 3.98156 -3.91372 4.06182 -3.04507 3.88871 -3.82596 4.25694 -3.36492 5.00402 -6.50019 8.17974 -3.54621 3.81009 -0.546921 2.09811 -5.1789 5.9826 -4.98983 6.31221 -2.47557 2.63878 -4.64568 4.81101 -9.1462 9.21888 -7.37417 7.5276 -2.21604 2.50113 -8.29804 10.2722 -5.1282 6.06353 -8.58281 10.1589 -6.47084 7.04085 -6.27806 6.72674 -7.11554 7.85687 -6.01085 6.02773 -5.46694 7.52872 -9.51078 9.85387 -3.36627 4.06552 -2.96126 5.12635 -3.09314 3.40691 -5.05456 6.62548 -7.56469 8.97053 -1.33727 2.87482 -5.6572 6.28169 -0.120924 0.296475 -7.09139 7.41322 -2.10076 3.28507 -8.74998 10.1094 -7.45072 9.50796 -7.75294 8.59218 -0.740374 2.44897 -7.63001 8.91562 -4.30743 4.81716 -6.40813 7.29159 -6.30213 7.35987 -6.44392 7.32584 -8.41155 9.4466 --0.377892 0.689618 -5.88857 6.70983 -6.67779 7.70668 -4.831 5.17464 -2.62342 3.82764 -8.57453 9.29283 -7.32648 7.96725 -9.32937 9.9726 -7.30774 7.65754 -3.97456 4.59876 -5.73092 7.20962 -1.958 2.10551 -3.2115 3.81482 -5.76497 7.42425 -2.77219 3.29692 -4.95297 5.14843 -5.96367 6.3619 -2.49872 4.61736 -8.21817 8.23425 -2.13615 2.61877 -7.84121 9.55011 -8.63416 10.2773 -5.61084 6.32053 -4.86002 5.79944 -9.07858 10.688 -5.95829 6.42504 -3.3289 4.17849 -3.27989 4.91625 -8.28046 9.23021 -2.18691 2.6072 -1.3962 1.75013 -2.13627 3.73117 -2.11128 2.57303 -7.22357 7.50136 -7.43862 8.03136 -2.80578 3.02886 -0.176906 0.761142 -5.99314 6.6075 -1.90398 3.3925 -5.48264 6.73579 -7.18447 7.49811 -3.24434 5.05219 -5.53263 6.04178 -1.71172 2.45682 -0.297266 0.481632 -2.62582 3.36142 -0.243865 1.49321 -8.86142 10.169 -3.93193 4.39404 -4.98182 5.15675 -7.99209 9.73159 -8.18033 9.45596 -4.25235 4.41546 -1.59603 2.15581 -6.47724 8.69649 -5.24138 7.93131 -3.4267 3.49003 -0.0439912 0.316407 -1.99983 3.87206 --0.103124 0.568771 -4.62451 4.80117 -2.89065 4.16315 -5.82817 7.43232 -6.89255 7.82189 -5.71037 6.81241 -4.34551 5.24905 -7.33931 7.3741 --0.855192 1.27129 -8.94842 9.10813 -9.19877 9.68412 -6.42658 7.77968 --0.0669636 0.430107 -6.40366 7.40701 -8.91175 9.24059 -3.21388 4.21676 -3.38557 3.79509 -4.24411 4.97032 -7.259 7.34896 -2.55995 3.18361 -8.77438 10.5503 -8.18685 9.79378 -2.78397 4.4563 -8.6891 9.38337 -6.51749 7.59374 -2.52346 3.46101 -8.40526 9.35647 -5.26942 6.33572 -4.15094 5.00668 -0.471666 1.53842 -7.63441 7.96745 -2.39974 3.7814 -2.71989 3.02994 -8.12085 8.33493 -6.19474 6.84381 -6.6133 8.31417 -5.1758 6.94983 -8.66241 8.79095 -6.10878 8.22083 -8.81883 9.08031 -8.28969 8.45176 -7.19851 8.37836 -1.5722 1.6836 -4.57814 6.95063 -7.66128 8.10631 -0.742483 3.08515 -1.15026 1.98074 -3.90133 4.12003 -7.61145 7.73433 -8.32187 10.2933 -0.407205 1.08089 -1.26545 2.60796 -2.70646 3.92753 --0.196551 1.83536 --0.413063 1.23838 -0.264484 0.556192 -6.30158 6.96097 --0.66246 0.809062 -9.34243 10.3521 -8.70093 8.79679 -0.745195 1.92911 -9.12892 9.68193 -7.98533 8.30538 -6.23671 7.04296 -6.5603 6.95483 -7.08133 7.10563 -2.15769 2.41541 -8.24752 8.73978 -5.27693 5.61904 -0.317419 1.48404 -3.48029 5.46979 -7.38901 8.56554 -1.06587 1.62384 -5.54926 6.04924 -4.46577 6.48749 -5.349 6.15584 -8.04249 8.17359 -3.37651 3.56179 -3.64706 5.57403 -4.49844 5.26404 -3.93361 4.92128 -5.82184 6.29881 -0.984273 1.70318 -1.12773 1.80726 -3.11675 3.17451 -5.07913 5.46291 -0.615591 1.81465 -1.08948 2.77847 -7.97412 8.07365 -5.05207 5.82497 -0.0407709 0.558817 -6.11142 6.48205 -3.4461 3.57315 -8.6547 8.80553 -8.18965 9.64194 -5.55564 7.9703 -4.01776 4.16989 -2.4668 2.82018 -0.911925 2.56662 -4.68814 5.03614 -7.4899 8.49036 -8.40912 9.14001 -2.32725 3.16377 -0.0723972 1.42049 -6.6441 6.6953 -3.65586 4.38222 -6.35844 6.57833 -4.44435 5.73077 -1.81779 2.57257 -4.17692 4.59722 -8.54682 9.38058 -1.61135 1.81629 -3.91926 5.00536 -9.78302 9.85143 -1.25632 3.10345 -5.53191 6.08174 --0.231868 0.676811 -1.03054 2.58105 -0.0402172 0.690608 -0.974571 1.25234 -5.22227 5.92302 -8.05843 10.1439 -8.48938 8.50755 -0.0965782 1.24008 -6.53821 7.47765 -0.189991 0.475204 -8.48963 8.54995 -9.68363 10.0534 -1.49381 2.71302 -6.75552 7.41283 -7.91075 9.15302 -0.520922 1.40928 -1.17957 2.11221 -4.00122 4.40686 -7.32467 7.9273 -6.39126 7.90248 -6.50534 8.19308 -7.19888 7.22234 --0.136797 0.731889 -0.870318 1.25614 -2.07126 2.28297 -6.10995 7.60408 -3.02174 3.90102 --0.657541 1.57517 -0.993121 2.66255 -7.27232 7.50832 -2.16079 3.75428 -9.27397 9.75098 -8.36865 8.5545 -4.56641 4.97607 -3.60746 4.34616 -6.31304 7.70611 -2.91442 3.7602 -4.85814 6.70407 -4.45876 5.67661 -8.06749 8.82229 -2.02826 3.59873 -1.92922 2.50088 -2.63867 3.48117 -2.17665 2.54826 -8.62674 9.10675 -0.96648 1.47671 -8.86336 9.53978 -5.52747 5.80829 -0.77099 3.06106 -2.2307 2.53877 -6.29165 6.63018 -4.44717 5.04651 -3.80894 4.63054 -7.47519 7.87072 -0.933668 1.9949 --0.712945 1.21558 -7.30206 8.38376 -5.80281 7.00022 -7.96578 8.6558 -0.24063 0.706466 -4.41893 4.58472 -4.0132 4.92768 -5.29626 6.09397 -3.43602 4.00728 -0.780945 1.66499 -8.83861 9.15168 -9.06411 9.75544 -3.45618 3.62529 -9.51413 10.0148 -0.842106 1.75695 -1.06485 1.44192 -6.89987 8.05314 -7.89154 8.73313 -8.71675 9.79526 -2.40574 2.58062 -8.55952 8.78132 -5.61716 6.06282 -3.71059 3.77929 -2.50187 2.99137 -6.92852 7.23184 -7.00442 7.93869 -8.82232 8.8756 -4.10389 4.53702 -7.6907 7.77577 -9.31554 10.2674 -8.51082 8.70339 -4.83332 6.70311 -4.6904 5.42892 -4.71407 5.67695 -4.12047 4.44089 -7.51845 8.26858 -1.31781 1.9397 -6.26854 8.02093 -6.92072 7.77774 -0.438156 2.18909 -0.898035 1.72074 -3.81121 3.8643 -1.01676 1.34308 -9.28445 9.42801 -2.43133 4.43516 -4.33664 5.9904 -2.19178 2.37244 -1.5457 1.79785 -2.23781 2.6481 -6.8365 6.87073 -0.82568 2.74775 -9.59404 9.89262 -8.48394 9.15107 -6.16085 6.42224 -3.5667 5.97689 -4.16931 7.41638 -6.95636 7.0982 -6.87987 7.09233 -3.12619 3.14821 -7.76636 7.98459 -4.60371 5.59136 -3.92189 4.88302 -6.90694 8.19858 -3.85132 5.19015 -8.05045 8.32483 -4.8338 6.05032 -1.93576 3.18873 -2.4182 3.55039 -5.56905 5.8172 -4.18436 6.01283 -3.04944 3.85936 -7.83585 8.95233 -1.76281 3.0558 -3.44143 3.6317 -8.69887 9.40371 -5.67867 5.73236 -0.859809 1.76578 -6.92284 7.13601 -8.27495 9.13414 -5.44385 6.42599 --0.941603 1.8215 -7.88161 8.79447 -0.965018 1.17732 -5.56442 5.79546 -8.79032 10.9909 -5.28632 5.79175 -4.80998 6.07002 -8.4021 9.81107 -3.16415 5.08682 --0.212163 1.2052 -5.683 5.83625 -0.738527 1.31842 -2.03835 2.52756 -7.4543 8.91243 --0.568869 1.44659 -3.58855 4.42371 -6.33058 7.18779 --0.645579 1.94313 -2.18149 2.24157 -3.80281 4.67323 -5.14628 5.97452 -2.55239 3.45685 -3.56586 6.23355 -6.74752 7.19693 -8.99006 10.5533 -0.259833 0.99882 -8.9005 9.75401 -7.28058 8.41075 -4.57803 5.70104 -9.82823 9.90251 -6.94375 7.42033 -7.8878 8.81951 -5.01137 5.52693 -2.25503 2.28817 -6.65772 7.11107 -0.647512 2.04416 -4.34796 4.5706 -4.5395 4.91529 -2.65423 3.49531 -7.97384 8.78377 -5.53873 5.76806 -9.78641 10.1351 -6.01664 6.44407 -3.47406 3.75187 -4.59421 4.81804 -1.20641 2.00488 -2.48904 2.80768 -5.77372 6.10692 -2.49363 3.24499 -1.8483 2.62965 -2.28556 3.22209 -3.17819 4.51426 -3.5548 4.23276 -3.25239 3.57895 -0.613317 2.44862 -3.82234 4.78976 -4.72809 6.46528 -9.54107 10.4426 -9.20052 10.1921 -8.24152 9.89817 -5.17594 6.19462 -7.83364 8.17082 -5.67992 6.36464 -8.9943 10.1426 -2.20598 3.0081 -3.38199 5.16464 -0.599928 1.35804 -0.841211 1.60761 -5.29338 5.89919 -1.11061 2.29219 -3.41512 3.95907 -7.9375 10.0203 -8.73852 9.66917 -9.95092 10.0162 -4.02544 4.30219 -4.1461 5.37827 -1.08089 1.59196 -7.87513 8.21121 -7.85673 8.0973 -0.96237 1.56519 -2.45532 2.61678 -6.1829 6.23637 -0.135135 0.613518 -3.18324 3.78587 -5.64796 7.20194 -0.861169 1.71661 -9.66005 10.1169 -0.880774 1.12452 -1.29389 1.57658 -5.60299 5.89759 -5.53642 7.07306 -0.540268 1.31836 -6.60244 7.98105 -4.21877 4.57159 -3.15367 4.75356 -7.81055 8.40378 -8.00942 8.10861 -5.78071 6.35646 -3.15993 4.99293 -2.36526 2.78444 -8.1361 8.76071 -1.40066 2.96474 --0.17906 1.05877 -5.94933 6.6808 -3.43187 4.05553 -3.02912 4.68942 -2.1506 2.29413 -2.3516 2.38305 -2.87496 3.0851 -6.71294 8.99858 -3.76177 5.52545 -1.58417 2.57063 -2.74646 4.27445 -5.48407 6.60696 --0.133321 0.716559 -3.53886 3.58196 -2.28729 2.40198 --0.209646 1.21263 -6.62795 7.32318 -0.714781 0.880466 -2.96831 4.05932 -6.00935 6.38896 -5.39798 6.11983 -8.47679 9.70468 -1.4339 1.74845 -2.35223 4.75732 -4.31357 4.9642 -5.26493 7.70538 -7.91888 8.94851 -6.51439 7.69469 -7.69015 7.85411 -3.94274 5.15373 -6.25852 7.32402 -2.73567 3.43236 -7.09564 8.42242 -2.55932 4.29066 -1.79489 1.84559 -8.86427 9.35669 -7.23854 8.27062 -7.8488 7.98307 -0.710888 2.22424 -0.0413624 1.10578 -1.54302 1.97696 -1.64924 3.01081 -8.15535 10.2397 -0.305662 1.63835 -8.20375 9.03123 -1.66617 2.08748 -4.01691 4.88505 -3.32856 4.10709 -5.15342 5.44616 -5.80751 7.38872 -0.485341 1.07648 -3.98267 4.20211 -6.96867 9.37655 -9.48055 9.85181 -8.39277 9.50424 -2.47589 2.79873 -3.48046 5.37417 -4.98279 6.01686 -1.29845 2.31199 --0.204348 2.50289 -0.23488 1.00378 -6.26899 7.14823 -4.62903 5.49672 -0.199052 0.822066 -6.97297 7.69083 -4.23783 4.65198 -0.530497 0.839143 -6.61355 8.22831 --0.0103941 2.16307 -0.148601 1.20044 -0.314438 0.67632 -3.43415 4.06208 -1.95498 3.25728 -4.23094 4.84942 -9.5493 10.0057 -2.64964 3.52073 -8.21388 9.1622 --0.112496 0.47622 -7.97551 8.19546 -2.16155 2.6289 -0.38442 1.46032 -3.85675 3.91557 -1.00605 1.42016 -2.4853 3.53086 --0.0765625 0.504366 -8.11302 8.46334 -7.18135 7.80218 -6.46466 8.12336 -3.75968 5.33954 -9.08789 9.73677 -6.47459 7.49454 -0.90148 1.47681 -3.44733 3.54163 -7.32968 7.909 -1.30055 2.75407 -8.78735 8.92461 -8.21764 8.59414 -0.888162 1.08404 -5.65195 6.26421 -6.23881 7.33284 -8.69731 9.88088 -3.55695 5.36909 -6.49248 7.02755 -2.31407 3.01952 -5.7803 6.1286 -6.30415 8.01577 -7.73864 8.27496 -0.741078 1.69184 -4.94671 5.68254 -3.28226 5.02894 -1.97446 2.60413 -3.26555 5.54754 -2.56179 3.41897 -3.20058 3.32486 -6.96915 7.69055 -6.89302 7.39856 -1.9659 2.61404 -1.31107 1.36867 -6.23573 6.33677 -0.17616 0.517772 -8.55548 8.79155 -9.61632 10.2651 -2.20331 2.34017 -6.93195 7.42939 -1.25398 2.23119 -1.06577 1.41048 -5.99156 7.09818 -3.34821 4.1271 -4.61618 6.90956 -2.30853 3.52875 -0.0518063 0.113732 -5.38513 6.09734 -1.73468 2.64838 -7.24679 7.63999 -4.18175 5.06728 -7.09602 7.13414 -9.06191 9.11605 -6.2309 7.67675 -3.96576 4.63237 --0.552645 1.37948 -5.76964 6.89903 -4.9272 7.5832 -4.59003 6.49719 -4.12281 6.9664 -5.12256 5.58387 -1.78859 2.76954 -4.36808 5.05712 -8.41165 9.54483 -8.11513 8.43405 -8.42016 9.52715 -8.50598 9.34564 -1.80028 1.83558 -8.08502 8.43726 -6.96667 8.12021 -5.4726 6.26772 -7.1141 9.29989 -7.83324 8.1744 -8.74368 9.16491 -2.5515 3.01706 -5.92375 6.44495 -7.45628 8.41582 -9.04829 9.71503 -4.58856 4.75356 -7.26064 7.32462 -1.81695 2.40529 -6.88067 7.95052 -1.91408 2.02663 -1.32005 1.45025 -7.47733 8.42004 -4.99403 5.85297 -0.95744 2.28875 --0.089503 0.536888 -1.09978 2.48865 -1.9959 3.098 -0.376116 0.448329 -3.98908 6.49684 -9.10178 9.51012 -5.41394 7.31529 -6.60708 7.59071 -4.38466 5.76203 -1.84355 2.60304 -0.658705 0.933522 -6.98725 7.05509 -5.60064 6.98804 -1.0603 1.1521 -4.06192 4.46156 -0.351018 1.00807 -9.17113 10.2192 -6.71641 6.74659 -8.85392 10.5272 -4.50816 5.22908 -1.13934 2.43196 -3.3746 3.57576 -7.62137 9.3234 -6.93482 7.16058 -5.66506 6.44324 -5.13364 5.86068 -1.97257 2.03803 -2.69746 2.73067 -0.989591 1.38342 -4.18819 4.69676 -4.31608 5.12265 -2.79556 4.87763 -3.55387 5.34421 --0.112466 0.585639 -2.43156 2.70221 -5.88314 7.08322 --0.450332 1.29858 -1.22202 2.46588 -6.74433 7.32925 -5.14596 5.37435 -6.76754 7.41799 -1.48762 2.45958 -4.57241 5.3382 -4.17465 5.02296 -6.48856 7.5576 -0.383566 0.823394 -8.50875 9.08734 -1.79393 2.24548 -5.06812 6.49508 -3.55364 3.61502 -5.58973 6.58885 -0.631097 2.10041 -0.323995 0.941782 -8.8798 10.1036 -6.37114 6.88202 -6.9393 7.83288 -3.09503 3.41759 -3.65269 3.70305 -5.61676 5.8924 -1.90199 2.38446 -4.23683 5.35609 -9.18649 9.88878 -8.28736 8.37734 -3.04805 5.03593 -8.02926 8.38975 -3.58161 4.01331 -3.20923 3.48207 -6.85118 8.78281 -5.06518 7.49843 -1.57456 3.05552 -3.0154 4.23782 -2.83557 3.24854 -1.29358 1.89328 -1.42911 2.72661 -3.17067 3.96651 -0.353554 1.48472 -3.46227 4.25611 -6.17639 7.24657 -5.60878 7.13562 -4.11129 5.52476 -9.17596 9.4123 -3.08339 3.65766 -4.083 4.63013 -0.628465 1.92141 -7.81989 8.39386 -3.35589 3.87531 -5.35974 5.41743 -4.48321 4.64376 -0.888177 1.37343 -8.49061 8.50063 -5.09078 6.01801 -9.65314 9.99342 -1.60502 3.0115 -1.37928 2.77642 -6.60322 8.94046 -6.74573 7.45157 --0.291156 0.325249 -6.1518 6.66827 -5.38199 6.46959 -3.50128 5.22692 -1.31774 1.70159 -0.550546 1.48845 -7.51187 7.85496 -4.2014 5.23193 -3.88255 3.97209 -2.60555 2.84958 -5.15706 6.00036 -2.99284 3.27867 -0.395077 0.768383 -3.30863 3.60594 -0.0325231 0.379208 -6.55183 7.33346 -1.44554 2.95846 -0.245421 1.29751 -3.98808 5.41226 -5.90242 6.266 -4.11097 5.02597 -0.134753 0.929866 -0.609287 1.16311 -0.231832 1.06825 -6.22093 7.05584 -9.18429 9.80637 -0.544139 1.30185 -1.69143 2.90306 -6.75109 8.67893 -5.49641 6.76104 -8.91712 10.0271 -7.09126 8.12404 -8.82958 10.2847 -0.569249 0.69421 -3.59288 5.8053 -9.25068 9.4226 -8.51607 9.26259 -5.00906 5.17068 -1.83467 2.99102 -7.32006 7.64842 -0.405532 0.603773 -6.41882 6.60495 -0.721592 1.44375 -2.78393 4.46732 -7.14806 7.16117 -5.12868 5.27918 -2.74138 3.1737 -2.95394 4.26547 -7.82827 8.21028 -9.06982 10.7279 -0.108376 0.290131 -6.34574 6.97141 -4.39022 5.50801 -7.98339 8.79674 -3.80026 4.71831 -5.43594 5.66916 -1.6743 2.61476 -4.29763 5.47402 -7.95714 8.69311 -3.4152 3.7387 -8.01715 8.8941 -6.53723 7.44437 --0.0222108 1.04503 -4.96242 6.01648 -1.70885 1.75511 -7.62434 8.53526 -6.82863 7.39782 -8.19967 9.22283 -1.99719 2.11323 --0.0124079 0.240201 -4.48577 4.87935 -2.586 4.41666 -6.37848 6.67092 -4.39606 5.67983 -9.39761 10.1095 -7.10866 7.15796 -3.91993 4.52129 -5.10552 5.36997 -7.08963 8.32694 -9.12669 9.58509 -9.26894 10.1974 -0.737413 1.26523 -2.77833 5.28516 -3.19039 4.36857 -4.32954 5.45614 -4.98069 5.49295 -7.54745 8.76142 -5.70425 7.05749 --0.250513 0.36578 -4.76997 5.89607 -2.03075 2.32111 -6.54141 6.55896 -4.19799 4.45091 -8.7796 9.11915 -5.75014 6.05646 -5.36885 5.42775 --0.00433056 0.865304 -3.65169 5.4751 -0.23625 0.872926 -0.0386337 0.792214 -4.40245 4.56789 -6.44567 7.42162 -5.51394 5.98005 -3.50146 3.83147 -8.47573 9.85647 -7.91378 8.47044 -9.44297 9.90241 -5.962 6.68782 -4.49034 4.86927 -2.17774 3.47061 -8.80614 9.26595 -7.92096 8.13838 -7.80209 7.93317 -7.78915 8.29735 -6.98111 7.162 -0.491059 1.14901 -8.97965 9.38792 -3.30207 3.53207 -3.17127 4.43581 -3.97564 4.43746 -6.79008 7.17877 -5.61669 7.51263 -4.0853 5.38748 -4.42181 6.32041 -8.08599 8.9095 -2.46938 2.55499 -1.20692 2.06351 -1.98995 2.35216 -8.17116 9.17158 -7.53414 8.37086 -3.7744 4.46197 -3.29464 4.38 -7.33246 7.81959 -4.89572 6.2831 --0.152496 1.56427 -0.636242 0.938556 -5.62066 6.06096 -9.42994 10.473 -8.95446 9.46311 -0.277891 2.80311 -6.92968 7.29845 -2.75677 3.02975 -2.2859 2.51308 -2.96683 3.03857 -6.44584 6.49518 -8.33607 8.60407 -7.20303 7.7616 -7.07205 7.46849 -2.35677 2.7904 -5.86404 6.12906 -2.42371 4.62735 -3.27237 4.11016 -0.0668578 0.644021 -6.77371 7.45187 -3.66596 5.21874 -0.718034 0.755944 -6.06162 7.05 -6.91473 7.09753 -5.0749 6.08914 -0.759874 1.11978 -8.54591 9.64997 -3.97266 4.70679 -1.51133 3.17164 -7.21772 7.69877 -8.00719 8.37052 -0.284003 0.38001 -4.08842 4.16227 -5.04461 5.79973 -4.60604 5.31979 -2.2461 2.28157 -6.25631 7.69766 -9.12404 9.67586 -7.73134 8.98923 -1.0513 1.46408 -9.17225 9.42567 -3.66795 4.29168 -8.84403 9.28497 -9.93613 9.94729 -3.16615 5.09374 --0.149675 1.43397 -2.30855 2.48392 -0.843172 0.951801 -8.32945 8.8506 -8.97012 9.94697 -2.8559 2.92359 --0.321715 0.89173 -7.48565 7.71775 -1.44301 1.47795 -6.6649 6.76187 -9.10721 9.93599 -1.82207 3.03935 -3.61893 4.5306 -2.53746 3.81243 -0.424528 1.29026 -9.51874 9.68841 -7.94954 8.14396 -7.49282 7.52655 -3.04604 3.69656 -9.45461 9.47212 -7.69209 8.16412 -0.607135 1.16564 -0.150291 0.450632 -3.28914 4.01085 -5.45597 6.02921 -8.16157 8.36605 -9.76573 10.2325 -0.151994 1.07074 -1.3748 1.68548 -2.29854 2.63593 -7.92162 8.68895 -1.28795 1.61949 -7.85469 8.26683 -4.32268 6.33174 -6.13964 6.3596 -1.25714 1.88002 -2.05006 2.28294 -8.31864 8.34151 -9.0613 10.0715 --0.041568 0.25139 -6.79984 6.81686 -5.10674 5.70583 -5.92937 7.01652 -7.57649 8.05834 -0.937157 2.25362 -7.48567 7.59746 -2.33403 2.88942 -7.3805 7.73421 -5.586 5.75327 -0.828854 2.12988 -8.22741 8.59954 -9.69214 10.1207 -6.55359 7.08114 -1.85342 2.634 -6.08756 7.28893 -6.34993 6.93474 -8.93548 10.1463 -5.49445 5.8338 -1.47951 2.14646 -2.62089 2.75888 -2.35352 3.10539 -4.98774 5.28931 -4.92239 5.40697 -7.52674 8.78948 -4.52451 4.83819 -5.45854 5.75838 -5.51553 6.3901 -4.82905 6.44407 -6.20655 6.4483 -5.68116 7.06109 -7.97301 9.15827 -8.8854 9.91623 -9.60198 10.2449 -1.93322 2.67684 -0.441852 1.87646 -5.19981 5.71385 -2.54799 2.5809 -4.34591 5.02655 -7.54678 8.75202 -6.1496 7.19033 -1.13658 1.30756 -1.38724 2.08252 -2.13624 2.30419 -8.49196 9.41369 --0.21387 0.685093 -2.47875 4.19982 -3.69093 4.00543 -5.70643 6.50331 -7.07443 8.83588 -6.85756 7.68937 -1.69241 1.83242 -0.140565 0.502156 -2.15007 3.23784 -4.97403 5.69757 -5.08315 6.25554 -3.45026 4.01942 -3.37482 4.73009 -7.4154 8.34013 -6.95399 7.59768 -8.07995 9.86199 -8.43993 8.88645 -7.66844 8.12742 --0.0200687 0.435846 -4.47984 5.9416 -7.66804 10.0801 -4.14578 5.98717 -0.256533 0.89254 -6.43216 7.4474 -3.60295 4.79419 -3.90129 4.29812 -5.30606 5.58674 -9.11552 9.79229 -5.60702 5.85299 -2.39514 2.64865 -4.51164 4.60227 -6.31154 6.77441 -3.12239 3.13505 -7.50962 7.89478 -3.90928 4.88831 -9.64625 10.0629 -5.9465 6.02877 -2.08554 2.10477 -0.087547 0.34748 -2.34295 2.53703 -6.846 7.3043 -1.37869 2.11446 -4.03371 4.26278 -5.38623 6.40917 -4.75848 6.25417 -6.03478 6.15991 --0.585543 1.2091 -2.52824 3.57712 -3.95687 5.40914 -4.42955 4.71909 -2.9328 3.98848 -5.40471 6.97056 -7.64789 9.30279 -6.19595 7.07492 -8.27328 9.41596 -8.29855 9.13665 -2.54035 3.10488 -8.25038 8.87903 -5.66599 5.88701 -7.40067 8.71195 -6.63762 6.67694 --0.0163105 1.72666 -4.77743 6.60356 -0.567991 1.14977 -5.96841 6.42987 -3.02266 4.58424 -6.72121 7.35492 -7.51477 8.65223 -8.55055 8.81014 -5.59759 5.82816 -0.218944 1.82542 -1.03197 2.36652 -7.84302 9.1594 -2.11542 4.7332 -6.37618 6.92981 -1.34963 1.59353 -0.516281 1.08859 --0.0151152 0.0624718 -6.45603 7.23063 -4.76865 5.46588 -7.5893 8.42021 -1.04534 1.99034 -2.62638 3.04997 -5.00254 5.98512 -7.7588 9.44547 -6.82186 7.34321 -8.7629 9.82272 --0.309554 0.54858 -4.19843 4.92981 -5.62327 6.80846 -6.40599 7.6073 -6.1547 6.53898 -3.93941 4.44985 -3.28342 3.72778 -7.17256 7.23035 -2.31269 3.05437 -7.99132 8.20926 -7.19338 8.08381 -7.29139 7.96441 -4.25818 4.4208 -0.802894 0.81938 -0.990115 1.04066 -0.443898 0.490936 -3.44459 3.95977 -9.07812 10.3145 -7.86709 8.26338 --0.230114 0.390748 -7.50905 8.49199 --0.715424 1.97535 -2.92248 3.12903 -5.44209 6.62431 -0.991914 1.99037 -5.92275 6.7724 -9.10818 9.2797 -4.46434 4.83462 -4.21122 5.48353 -1.8721 3.40764 -7.04713 7.60526 -3.76581 4.76317 -7.00667 7.36475 -6.87244 7.39431 -7.6349 8.46695 --0.0728922 0.351194 -5.02925 5.6834 -1.45779 2.83702 -0.339175 1.46574 -6.40414 6.9165 -6.30401 6.91007 -5.6392 5.78172 -5.63288 6.44639 -7.45285 8.89031 -4.09741 4.57929 -8.76728 9.06448 -1.62324 1.84552 -5.72509 6.54553 -8.65273 10.3652 -7.3362 7.8953 -8.96224 10.3113 -0.217316 1.7827 -1.28523 2.90127 -8.78746 9.11602 -8.6075 9.9606 --0.647788 0.779976 -4.9702 5.47602 -4.15553 4.57497 -1.08174 2.80993 -4.01011 4.8145 -6.79603 7.2317 -4.3711 4.43566 -9.65087 9.79922 -8.19407 9.21784 -3.04008 4.94094 -6.0883 7.23919 -6.88708 6.97172 -0.438073 2.00665 -8.53083 8.83004 -4.22258 4.65233 -6.72856 7.61085 -3.17591 3.18978 -5.07955 5.6938 -2.09043 2.55351 -3.28085 4.43556 -7.29225 8.03925 -7.78034 7.82608 -6.59677 7.67719 -5.56032 6.38139 -8.72663 8.82535 -2.96505 3.11983 -1.67192 2.11727 -7.85386 8.49025 -6.30965 6.72799 -8.53082 9.3801 -2.8976 3.39972 -8.90427 9.44661 --0.0665785 0.410254 -4.58099 5.81135 -1.88015 2.21838 -3.38693 4.10149 -7.46378 7.68246 -8.80985 9.72212 -6.54877 7.25642 -7.18249 7.71509 -7.41978 8.64805 -1.00839 1.78626 -0.39421 0.526751 -7.13516 7.28317 -7.28011 7.80573 -1.90158 2.49032 -1.66181 4.17994 -8.81106 9.21133 -9.46151 10.5007 -0.52585 0.575082 -7.66495 8.64072 -7.72794 8.50991 -4.92409 6.23879 -2.28769 3.21774 -3.62671 4.40932 -5.77688 7.31314 -8.94253 10.0664 -0.416618 0.635111 -1.81377 2.41356 -7.91755 8.83363 -1.62715 1.82626 -8.22065 9.51656 -0.020228 0.724724 -8.81119 9.95764 -8.66509 9.61079 -5.28201 5.32152 -3.95724 4.22138 -7.09339 7.77685 -9.63428 10.1514 -3.69117 3.779 -3.82195 4.76757 -5.75824 6.62265 -3.69984 4.75163 -3.58259 4.8788 -8.32635 8.85873 -5.81959 7.32506 -8.11265 9.14304 -2.20118 3.32511 -7.79582 8.52691 -6.5891 7.13584 -0.385393 0.440656 -1.13414 1.9951 -1.76482 2.69977 -4.76194 5.82757 -6.33633 7.5348 -4.7663 5.65083 -1.98298 3.01285 -0.956973 2.38629 -5.60955 7.65827 -9.11064 9.14351 -2.99933 3.37975 -3.36304 4.57437 -3.89886 4.50733 -8.73838 9.3514 -9.11824 9.66042 -1.47961 2.93909 -0.615297 1.13217 -1.70646 2.32478 -4.35168 4.99362 -0.986601 1.18332 -4.01551 4.92342 -7.68944 9.86838 -4.47611 4.85316 -0.051839 0.86288 -3.59624 5.5628 -7.08729 8.90374 -9.53464 9.9196 -4.69871 5.74189 -8.43146 10.6889 -3.23774 3.77777 -9.35399 9.62741 -1.15259 2.69451 -6.6368 7.33773 -5.26395 6.09857 -6.87415 7.21717 --0.925645 1.06118 -8.49641 8.67659 -2.31486 3.25354 -2.51057 2.58303 -0.921997 1.48762 -6.29777 6.74738 -4.03945 4.27305 -7.1668 7.3471 -8.44572 8.80343 -7.16937 7.84526 -8.89008 9.4332 -7.01815 7.66319 --0.420804 0.982878 -1.59755 1.64672 -0.700814 0.72579 -6.3138 7.37379 -8.49276 9.93522 --0.795656 0.819657 -0.772253 1.05926 -0.917593 1.3917 -3.30076 4.12274 --0.0237176 0.260552 -6.82385 7.49119 -6.98638 7.52012 -8.24915 9.08397 -4.17486 4.25908 -3.08435 4.64404 -8.17114 9.91412 -8.95923 9.3751 -0.596707 1.89462 -0.982917 1.40236 -6.79552 7.36657 -8.2599 9.69551 -8.85126 10.4342 -7.98967 9.14514 -0.766355 1.63286 -7.76211 7.99247 -5.23163 5.89338 -4.4707 5.50457 -9.257 9.27862 -2.11049 2.59654 -1.65501 2.06238 -0.551768 2.10873 -0.0285582 0.194421 -3.66153 3.85615 -5.07097 5.55806 -5.29145 5.80735 -2.03499 3.0863 -0.73171 2.29494 -2.63023 3.6417 -6.17478 6.25997 -5.79646 6.46363 -9.10633 10.5516 -7.23415 7.84823 -6.49951 7.1506 -9.94647 10.0242 -7.91236 8.09097 -7.8127 7.97662 -3.34238 3.42907 -8.50796 9.8311 -8.75792 8.98028 -9.34125 10.4441 -2.84413 3.71602 -1.49884 2.35652 -7.52317 9.18955 -9.5587 10.3525 -4.85436 6.1181 -5.91369 6.12194 -6.88463 8.34471 -1.51952 2.99156 -4.29022 5.12674 -8.0229 8.41246 -2.44841 3.04779 -7.59975 7.91485 -2.74491 3.62575 -0.0169968 0.240919 -5.85351 6.29039 -4.99825 5.93439 -2.153 3.35304 -1.19032 1.41763 -6.13337 7.80615 -7.05013 7.89364 -8.38056 9.92 -6.35525 6.64521 -3.93342 5.15885 -2.87656 3.47116 -3.56176 4.41159 -6.72084 7.9171 -8.03801 9.12442 -1.03329 2.56255 -7.64542 8.61709 -2.85627 2.89437 -8.8303 9.79838 -1.08032 2.34573 -7.51366 8.39169 -9.09685 10.3677 -6.753 7.41904 --0.217662 1.42059 -6.72492 7.97553 -7.99325 8.8976 -0.765372 1.10894 -4.37958 6.04671 -8.72027 9.58928 -6.00234 7.29277 -8.43912 9.25356 -2.98816 3.17389 -0.4292 0.552167 -1.69827 2.80318 -5.99904 7.09981 -4.68367 5.87791 --0.203208 1.09587 -2.65367 3.28472 -3.87051 3.88111 -6.36178 7.18853 --0.0815935 0.200848 -6.82255 7.18488 -4.99295 5.08405 -2.67155 3.08447 -5.82099 6.77145 -8.76434 9.01086 -5.94982 6.18665 -3.23369 3.71743 -0.934129 2.73456 -1.13233 1.24208 -8.21931 9.03906 -6.25425 6.69972 -0.971299 4.21205 -5.68426 6.45281 -2.85786 3.3955 -8.17715 8.88439 -2.72802 5.01235 -6.12811 6.53711 -5.22878 6.45864 -0.453655 0.922032 -0.466162 0.85262 -2.40916 2.64759 -5.63583 6.37476 -2.18434 3.14105 -0.912811 2.08432 -8.9464 10.1515 -6.77323 7.27133 -0.7167 1.60579 -5.89813 6.32997 -7.66593 8.4611 -6.54145 6.88337 -5.95421 6.21188 -1.10383 1.92226 -5.37168 5.65707 -1.51874 1.66339 -4.60748 5.00384 -8.97354 10.5394 -2.05022 3.20373 -8.17316 8.19283 -2.33792 2.72643 -8.81577 9.3704 -5.95738 6.59855 -5.69025 6.17335 -6.91889 7.88142 -2.17529 2.81528 -6.65046 7.19698 -7.10694 8.78046 -2.09613 2.47484 -1.92423 2.25333 --0.0906039 0.861376 -6.61481 7.70609 -6.7448 6.84276 -3.43655 5.28405 -6.05404 6.48902 -3.24637 3.36149 -5.69528 5.77157 -5.12352 5.31024 -7.65858 8.80828 -3.69209 4.4851 -0.25765 1.29637 -3.1537 4.13191 -3.12328 3.83765 -2.99798 4.8748 -4.49566 4.67827 -3.50822 4.03987 -8.00334 8.34084 -8.61039 9.00704 -0.0332147 0.166124 -4.55193 5.36546 -4.20308 4.31589 -0.955466 1.20095 --0.382972 1.47625 -0.803913 1.01916 -3.78333 4.0707 -6.58604 6.70173 -3.02066 3.82562 -1.16515 2.2816 -7.87242 8.24214 -4.057 4.60368 -2.84714 3.59726 -2.77804 3.69136 --0.139996 1.36416 -4.50647 6.37579 -8.86647 10.1549 -9.24372 10.1442 -0.743107 1.84722 -6.18761 7.65841 -0.214887 0.443938 -8.8513 9.55063 -4.04856 5.79916 -6.69671 7.10025 -6.97477 7.79702 -4.82551 5.10538 -0.821772 2.85828 -9.3086 9.74805 -5.45623 6.66668 -7.64296 8.67451 -7.53052 8.31024 -7.45352 7.5063 -1.31412 1.4979 -7.81176 8.48083 -0.228964 1.73207 -5.52579 5.93103 -6.58544 8.48938 -2.75407 4.18746 -3.21396 3.96298 -1.13806 2.34106 -0.899331 2.87945 -5.69016 6.61624 -2.48172 2.58082 -0.676004 1.43405 -3.41766 3.9503 -0.104554 0.298373 -6.50673 8.21831 -6.00349 6.69385 -9.62453 10.3147 -4.09379 6.02911 --1.12803 1.68823 -1.83324 3.43133 -8.30576 9.09288 --0.363911 0.405218 -1.91686 3.34928 -6.98331 7.15885 --0.31591 0.996789 -0.145813 0.35408 -5.32016 6.13679 -6.99664 7.48644 --0.140875 0.821045 -9.0119 9.19742 -1.69616 1.72453 -4.38064 5.07542 -6.85898 7.55478 -3.9145 4.27935 -5.77592 6.16806 -1.45345 3.01301 -4.13024 5.59662 -8.14557 8.41669 -4.00075 4.829 --0.283024 1.59436 -5.92468 7.17507 -6.84458 7.18356 -1.06987 1.42839 -8.618 8.66235 -0.432802 1.59512 -3.78058 4.36051 -1.6113 4.21135 -6.73475 7.01057 -6.74819 6.90498 -6.93146 8.54681 -9.02605 9.91613 -3.888 4.00526 -1.07958 2.27915 -4.78456 5.10764 -3.92952 4.89555 -9.09348 9.30304 -6.73107 7.21036 -7.42366 7.73225 -4.04079 4.72919 -1.21726 1.34683 -8.82903 9.73504 -0.577663 1.00786 -1.56822 2.08675 -4.84315 5.44994 -1.01008 1.16524 -5.99782 6.01535 -0.996739 1.75305 -4.76128 6.39012 -8.93563 9.51972 --0.0698166 0.453543 -5.9084 6.95139 -0.535401 0.692258 -4.80729 5.48335 -3.42581 4.76147 -3.58715 4.43541 -7.50236 7.71227 -5.19742 5.87901 -1.79752 2.43097 -7.29762 7.57608 -5.65169 6.47762 -6.02249 7.93642 -0.840131 2.81176 -6.2646 6.96911 -7.46014 8.17136 -9.79049 9.94054 -4.61094 5.35819 -7.30902 7.41873 -1.21883 1.84621 -6.41743 6.57736 -1.53114 1.62859 -6.73237 7.47083 -6.05618 7.56831 -7.63374 8.16821 -5.20839 6.05382 -0.619043 1.44065 -2.38657 4.88786 -3.88289 5.18788 -4.42283 4.51106 -9.15575 9.22388 -3.18678 3.72243 -3.20638 3.65935 -4.2219 4.97961 -4.63725 6.90959 -2.57123 2.59101 -4.08581 4.37325 -6.53926 6.80412 -1.77475 3.89149 -9.22854 10.426 -2.67375 4.36551 -3.17194 4.0433 -1.10304 2.0348 -3.67233 4.04957 -3.23526 3.5012 -5.17684 6.47301 -4.4 4.67662 -4.15842 5.85903 -5.88496 6.61616 -7.26489 7.51279 -4.17402 6.6997 --0.540216 0.54573 -4.36063 4.60442 -9.18146 9.96239 -0.977216 2.42032 -9.09143 9.61178 -5.06686 6.23076 -2.04772 2.92048 -1.4154 2.00707 -7.80442 9.54824 -4.55549 4.7148 -7.56964 8.80172 -1.35347 3.21648 -9.12751 10.0605 -1.81735 2.06061 -5.63798 8.0918 -6.79492 7.98002 -9.23053 10.1299 -1.74639 2.02724 -3.71825 4.09879 -2.4995 3.42493 -4.1255 5.66758 -4.75493 6.99687 -8.22481 8.72036 -6.13689 7.53026 -5.41315 5.66358 -4.21425 5.62743 -6.22936 6.44392 -2.02303 2.96414 --0.0655462 0.130508 -6.1487 6.70994 -4.36674 6.24985 -7.51129 7.63176 -7.9729 8.98613 -3.92117 4.15596 -4.54398 5.43399 -6.34248 6.92305 --0.550253 1.16167 -9.15142 9.53717 -8.99354 9.65952 -6.28988 7.90053 -3.36505 3.782 -8.80005 9.70553 -1.99947 2.18573 -1.15023 2.07069 -0.253723 1.32958 -2.0392 2.93977 -2.89024 3.00836 -8.16735 8.2049 -1.49508 2.95258 -6.19092 7.44552 -2.33328 3.06758 -6.44166 7.4649 -7.34749 7.79488 -7.5557 8.04141 -2.76812 5.13617 -7.97308 9.25668 -4.73539 5.22234 -7.53377 8.41651 --0.355405 1.36499 -4.72111 4.73744 --1.22753 1.84842 -5.5033 5.63808 -3.95421 4.19313 -6.24752 6.98229 -4.49694 5.07277 -3.70871 4.30093 -1.31984 1.50116 -7.16044 8.70868 -2.44587 3.34659 -6.08322 7.20376 -2.75012 2.82555 -0.0394442 0.863634 -3.90896 4.73696 -4.77494 5.04158 -8.41473 8.82932 -1.7049 2.71024 -9.01684 10.1044 -4.57959 5.01066 -3.2484 4.21875 -1.11596 2.88792 -3.53616 4.14001 -5.80672 5.82478 -5.85844 7.70293 -6.18239 6.30124 -2.22913 3.23412 -2.97521 3.08481 -2.2749 3.70611 -2.3457 3.86609 -2.71695 4.04473 -7.22863 7.40115 -1.80428 2.39815 -1.80781 2.33028 -2.78662 3.14936 -9.40717 9.94906 -6.54968 6.80773 -2.76862 3.24492 -1.96034 2.87404 -3.53295 3.54927 -5.36042 5.67073 -8.63339 8.93752 -0.932415 1.70402 -4.32923 4.55594 -9.3491 10.4969 -0.121416 1.15499 --0.172998 1.36319 -2.02349 2.29887 -1.75352 2.35329 -0.502555 2.01665 -6.71754 6.80014 -3.35175 3.93337 -7.17133 7.9851 -8.51299 9.95771 -5.86103 6.36734 -1.44593 3.46008 -4.49699 4.60855 -2.29261 3.10053 -6.68713 8.19499 -5.43776 6.84387 -8.58591 9.02134 -5.24746 6.15595 -1.3847 2.5074 -6.62143 7.07775 -1.7101 2.077 -9.70898 10.2789 -6.67451 7.92058 -2.56858 3.60374 -1.61917 2.60482 -1.77902 2.16908 -4.76209 6.00461 -3.8894 3.98269 -7.0278 7.276 -5.4866 5.59417 -1.69306 2.92506 -2.45744 3.76592 -2.5689 2.80611 -5.98283 6.06154 -9.5267 9.9626 -9.55652 10.4128 -6.6111 6.64606 -3.38826 4.26111 -3.61887 3.73455 -4.14924 6.13796 -7.15863 7.28212 -5.78984 6.56662 -2.09304 2.2681 -4.39867 4.88557 -6.20907 6.81034 -4.63336 4.91476 -0.939805 2.43621 -1.56774 5.13599 -8.40908 9.82058 -2.06273 2.20306 -2.53524 5.01482 -2.9314 3.23661 -2.48535 3.47368 -0.366389 1.4699 -8.81131 9.01654 -2.05102 2.87972 -1.9699 2.22723 -6.18333 6.98224 -1.3425 2.4443 -0.767883 1.77423 -3.1538 3.43248 -0.891006 0.903458 -5.7136 5.8713 -0.437569 1.37539 -3.98533 5.01646 -8.65764 9.89518 -3.74889 3.98561 -7.74507 8.30657 -8.24671 8.43006 -6.88467 7.42036 -1.99426 2.03522 -1.90486 2.04181 -1.12911 1.71807 -9.25253 10.105 -1.92989 2.0346 -5.60044 6.25585 -9.16848 10.087 -6.67824 6.72257 -1.88522 2.80222 -0.242758 0.852689 -5.09249 7.71484 -5.54974 6.44414 -7.66767 8.72936 -3.48884 3.83156 -3.4697 5.14646 -8.48582 8.7692 -6.76259 7.06897 -7.83856 8.62005 -5.81853 6.76571 -2.04803 2.94439 -6.85396 7.22985 -6.52449 7.39764 -9.26838 9.34809 -4.64449 5.64975 -7.51845 7.80279 --1.27268 1.65344 -0.686101 4.20373 -7.80552 8.37119 -7.20419 8.35284 -9.33962 9.87975 -4.31238 5.58683 -2.39198 3.84398 -1.29248 2.59269 -4.71612 6.195 -5.27332 6.52174 -7.71492 7.84702 -8.18064 8.72233 -1.55223 2.31294 -6.34374 7.31758 -6.48966 6.92611 -2.62268 3.09895 -4.09064 5.06197 -2.66367 4.12126 -1.53391 2.93092 -8.64516 8.70655 -9.20047 9.28957 -4.00474 4.11716 -8.5418 9.45901 -8.73386 9.73253 -9.22596 9.63179 -1.34204 2.7834 -8.4489 9.21027 -7.75158 8.51085 -5.98856 6.11212 -1.29906 2.08111 -9.24315 9.76291 -6.84345 6.91607 -5.88294 5.90545 -3.03022 3.39941 -3.22222 3.4089 -1.12791 1.65898 -6.70232 7.36336 -8.60042 8.82377 -1.26451 1.30362 -2.76682 2.92693 -1.54763 2.19582 -6.5865 7.24173 -4.15242 4.21742 -8.39615 8.78524 -1.67017 2.08717 -9.03012 9.97041 -2.31463 2.45877 -8.29872 8.51813 -1.66689 2.51919 --0.807606 1.47794 -1.31452 1.94418 -0.0739222 0.512106 -4.23577 4.25889 -7.45273 7.97505 -3.34234 3.46608 -7.97304 9.14131 -1.9029 2.99946 -8.84087 9.79689 -4.92769 5.68685 -2.74004 3.04513 -0.889257 2.20448 -3.10574 3.9758 -3.91547 4.32303 -7.17475 8.07377 -5.92903 8.03738 -1.57974 1.65527 -3.76339 4.2285 -2.28263 2.7559 -9.53105 9.87477 -2.10154 3.2222 -4.23683 5.34347 -1.38769 2.48482 -5.39838 5.51872 -8.50975 10.1382 -8.04108 9.21474 -8.5252 9.67823 -8.893 10.7726 -7.1294 8.18211 -1.15642 1.73882 -0.436911 0.756698 -3.66142 3.71659 -6.37686 6.7 -8.88506 8.99896 -2.31891 3.79061 -2.61615 2.81909 -1.35216 1.39571 -3.04217 3.52564 -7.8409 9.34099 -0.470596 1.49157 -6.94014 7.18365 -8.05483 8.49979 -8.18511 8.25608 -7.03597 8.45251 -2.47411 2.65172 -0.112716 0.193057 -4.45039 5.10584 -4.53906 5.80013 -5.11702 5.27151 -1.24211 1.90757 -4.64114 4.72912 -1.77254 3.45037 --0.1275 0.99675 -5.69637 7.67722 -2.21252 2.44032 -3.89623 4.40192 -2.79904 3.15569 -8.37911 9.42424 -5.27199 6.2026 -1.84791 3.75411 -0.522801 0.54806 -3.83644 4.64785 -6.65497 7.55638 -6.75104 6.98564 -2.34979 2.98049 -8.27176 8.60459 -5.07773 5.44064 -1.16934 1.98872 -4.2914 5.37557 -6.83462 7.95408 -3.91405 5.73229 -7.77473 8.53538 -9.23441 9.90185 -4.03659 5.2473 -5.99336 7.8004 -4.2432 5.89276 -6.39847 7.81276 -9.13909 10.4164 -1.12009 2.5649 -2.35157 3.18468 -4.46918 5.55572 -3.82512 5.53666 -7.18238 8.10193 -8.40911 9.23639 -8.99555 10.4192 -6.69547 8.87825 -4.79012 5.34858 -9.23615 10.0986 --0.590587 1.14603 -2.74289 3.48244 --0.248403 1.1591 -3.35663 3.7229 -7.37504 7.6481 -6.64796 7.64695 -0.778081 2.41212 -4.49242 4.7772 -8.01419 8.109 -6.6494 7.76619 -8.86331 10.1205 -0.817273 0.937855 -8.00019 8.21556 -6.19405 6.54794 -6.11798 7.30421 -3.40164 4.28921 -5.31927 6.21584 -2.79377 3.40938 -3.59494 3.90321 -7.79218 10.3132 -2.99546 3.86111 -1.71916 3.40283 -6.1768 6.81915 -7.59629 8.68568 -1.59724 2.348 -6.20151 6.5391 -6.30798 6.70478 -0.489786 1.51322 -1.28396 1.86775 -5.18031 5.43007 -6.61276 7.70565 -1.4909 2.11165 -4.56163 5.49277 -1.93598 4.35147 -3.65568 5.00224 -1.68028 2.00363 -7.82874 8.67399 -1.23053 2.87598 --0.164275 0.194491 -2.58349 4.01302 -1.23279 2.02984 -0.599702 1.09257 -9.50965 9.80164 -2.33108 3.58037 -4.38659 4.62378 -2.65097 2.87349 -0.0537058 0.576502 -4.20415 5.15693 -5.41458 5.98382 -4.37747 5.10347 -2.62536 2.70073 -6.96845 8.15356 -6.91533 8.41638 -9.36431 9.58863 -6.13019 7.25915 -2.7818 3.4951 -9.44641 10.1301 -2.68817 4.19772 -5.65664 5.6814 -8.25308 10.498 -3.50374 3.64458 -1.47063 1.78567 -8.21901 8.98152 -3.99261 4.47339 -2.51395 3.38788 -4.66178 5.24959 -9.08415 10.3467 -5.92351 7.20447 -1.74145 2.35957 -7.62653 8.96797 -6.43542 7.68775 -5.49047 6.56355 -4.9225 6.22555 -0.257967 0.704837 -3.42488 3.52873 -8.67606 9.77824 -5.12981 6.37856 -5.97359 6.32151 -1.58517 2.28129 -0.530687 1.54545 -7.04056 8.15296 -1.8541 3.1902 -9.46286 10.0098 -3.17967 4.02237 -3.49966 3.80271 -6.24894 6.49618 -1.19944 1.59215 -5.30422 6.94823 -7.49137 7.78584 -7.02669 8.16282 -2.21673 3.36471 -7.66183 8.34763 -4.13876 4.87421 -3.0199 4.07124 -8.40439 8.82943 --0.274649 0.429602 -6.11215 7.65609 -3.34781 5.03006 -1.28231 1.77258 -7.57256 8.59456 -5.36208 5.81735 -7.18511 8.96618 -8.86053 9.49567 -5.39097 5.93211 -6.59094 7.26553 -3.69159 4.01914 -8.73797 8.81611 -1.41144 1.82827 -7.83555 8.07567 -6.13821 8.44907 -5.83432 6.48744 -2.93596 4.66271 -7.03215 7.59658 -1.65252 2.45337 -2.91358 4.90129 -8.94415 9.14642 -5.21005 6.1166 -0.33225 1.17039 -7.40089 8.07586 -9.30427 9.40776 -2.34188 2.81124 -1.02811 3.3344 -6.28117 7.62089 -4.80105 7.10049 -8.90252 10.0057 -2.20932 2.33093 -8.20746 10.6268 -4.31887 5.23945 -9.258 9.8985 -3.80742 4.15057 -1.11313 1.23711 -9.53067 9.70165 -7.95467 8.67187 -9.66031 9.83223 -3.61385 4.09571 -0.623148 0.652817 -7.77809 8.62118 -0.86157 1.98606 -3.12528 3.75815 -1.9363 3.22621 -8.23521 8.99175 -8.95406 10.4487 -3.38526 3.90652 -0.34281 2.0226 -0.739384 0.793829 -3.55637 3.96384 -6.1562 7.28647 -5.30211 7.51385 -1.46275 1.78688 --0.0144662 0.868488 -0.0740443 0.119828 -9.26206 9.83923 -0.743397 1.40754 -4.68823 6.62985 -8.8291 9.17373 -4.66711 5.09313 -4.023 4.44994 -5.68937 5.79194 -8.04835 8.06763 -6.94662 8.00075 -0.774686 1.13428 -0.381819 2.34757 -2.1235 2.63524 -5.42795 6.89998 -6.07662 6.29083 -6.47821 6.7872 -2.58305 2.6192 --0.598336 1.23458 -4.29089 5.43332 -8.09914 8.28229 -5.05925 5.35258 -0.181705 0.444466 -3.27849 4.79932 -0.310314 1.43125 -1.13836 2.76825 -1.2529 4.09336 -0.198106 0.608625 -1.77442 2.23777 -6.29823 6.64574 -1.22125 1.37929 -1.77592 3.04011 -1.43999 2.90926 -4.20495 5.32396 -4.98874 5.33211 -8.36483 8.67875 -5.65373 7.14132 -2.8303 3.05037 -3.41509 3.54032 -7.21702 7.85857 -5.79848 5.8913 -4.52711 5.65511 -2.04663 2.66919 -5.76363 6.77903 --0.153046 0.77878 -4.37474 4.49936 -6.86786 7.81999 -8.92084 9.16368 -7.5975 8.56954 -0.197493 1.07503 -3.99803 4.67019 -9.35123 9.60094 -1.46442 2.4256 -5.21501 5.79612 -8.80879 8.99085 --0.109252 1.30631 -7.34965 7.87947 -7.08703 8.12723 -0.985946 2.14663 -0.48521 0.856118 -6.57719 6.70623 -8.71165 8.72286 -3.16883 4.8714 --0.21189 0.412944 -3.6526 4.37121 -0.364649 1.3363 -9.27722 9.35135 -3.47517 3.8793 -5.67149 6.28631 -6.52789 6.61039 -9.36323 10.4189 -4.30743 6.18638 -7.93653 9.4877 -8.24024 8.41475 -2.75692 3.13935 -8.80223 9.1489 -3.42656 3.90557 -8.96598 9.3217 -1.99582 4.84803 -5.1178 5.8688 -4.47901 5.73433 -7.30397 7.85527 -0.18463 0.656832 -7.80806 8.41666 -8.50023 9.42628 -7.67563 8.64756 -9.46783 9.52169 -2.06797 3.3107 -5.08863 5.10167 -0.82146 1.39055 -7.5428 8.04736 -9.09407 10.8208 -9.15219 9.99706 -1.61637 3.46354 -5.3812 5.96247 -9.34115 9.73575 -6.49221 7.30031 -1.56337 3.39704 -8.463 8.60841 --0.322779 0.658242 -8.50173 8.72125 -0.854851 1.83405 -7.81945 8.12841 -2.60724 3.19985 -5.03714 5.55331 -1.85041 3.36816 -7.26119 7.64364 -5.75223 5.99653 -4.00026 4.43863 -5.00939 6.03009 -6.22879 6.6638 -6.44231 7.18622 -1.66002 1.88587 -2.59781 2.84919 -4.96399 5.40545 -5.70327 6.95018 -6.97141 7.08346 -3.98535 4.6179 -5.96795 7.14997 -5.07581 5.8262 -4.65665 4.98851 -8.65646 8.70986 -3.04175 3.19155 -0.796073 1.0952 -8.24859 8.57828 -5.26952 6.34245 -7.94685 8.78542 -0.193963 0.968524 -6.61159 6.80186 -9.37533 9.79195 -8.94048 9.74959 -5.77272 6.48616 -6.0092 7.86718 -2.52621 2.58938 -8.91347 9.22421 -4.20466 5.45909 -4.82157 5.09167 -7.35464 7.36611 -5.12413 6.45063 -2.12404 2.81187 -8.88875 9.20752 -2.59731 3.20587 -1.54772 2.08968 -6.70449 7.08952 --0.0967146 0.888521 -3.10207 4.34815 -1.20807 2.35497 -6.00753 6.08492 -3.21837 4.00446 -4.34095 6.0963 -4.24821 4.79576 -4.49523 6.6669 -1.49483 2.52552 -0.0411497 0.641526 -8.3854 9.20954 -8.12419 8.93702 -0.0201515 1.06914 -1.57617 3.44176 -1.4173 1.76847 -5.42261 6.51539 -6.6744 8.46109 -3.05234 3.59179 -6.49059 7.24618 -7.01989 7.69901 -2.34664 2.90601 -9.17324 9.86754 -5.50919 5.70258 -2.40486 4.6009 -3.74368 4.00093 -6.9211 7.33554 -7.41358 8.7413 -8.78284 9.62033 -2.96753 3.01602 --0.200693 0.535532 -6.4383 6.45049 -8.28835 9.42148 -4.2379 5.35128 -4.68397 5.04593 -5.7185 7.03177 -5.37494 6.43977 -2.99518 4.08138 -7.28064 7.54638 -9.10622 10.4907 -1.23839 1.50915 -6.7823 9.24533 -8.45679 8.62427 -0.106718 0.69304 -2.84119 3.50375 -3.60466 4.51338 -8.04709 8.19023 -3.31632 3.48054 -5.9027 7.46331 --0.621072 1.13003 -8.57167 8.69262 -0.301047 1.42246 -1.24229 2.44616 -0.962706 1.55754 -8.77327 9.55275 -1.77899 2.44335 -0.368575 1.84726 -9.05918 9.07832 -6.61723 7.68015 -8.59899 8.80383 --0.133927 0.20271 -5.69266 5.74809 -0.68202 1.52342 -7.17359 7.91482 -5.74049 7.34297 -7.88371 7.9683 -1.58749 2.26543 -3.96728 4.45988 -5.4354 6.88336 -1.68706 1.6976 -6.56907 7.40696 -0.518151 0.724124 -8.99155 9.36995 -6.00506 7.91529 -5.26967 6.11536 -2.37416 2.50887 -8.47983 9.31509 -2.38155 2.54346 -8.08415 9.65214 -1.00693 3.19203 -1.6523 1.73553 -6.85283 6.9958 -4.11425 4.90193 -1.39597 1.58725 -5.05551 5.19458 -5.89969 6.11394 -5.9148 7.26824 -9.32271 9.93989 -1.62911 2.58215 -5.43399 6.14203 -3.11393 3.58792 -8.57619 9.3788 -2.23349 2.7884 -8.09022 8.54326 -9.7114 9.87076 -5.91086 6.10885 -7.35805 7.57276 -0.650002 0.879866 -3.24977 3.75531 -2.73948 3.41051 -3.08006 4.62772 -3.71868 4.31519 -4.13905 5.78577 -1.77297 3.02983 -5.85931 5.89333 -3.68972 3.93193 -1.43922 2.98425 -6.51534 8.33386 -6.6821 7.50874 -1.2541 2.11722 -5.40634 5.54411 -4.55502 4.60346 -4.32484 4.68497 -3.40711 4.31975 -9.20893 10.0853 -6.12594 6.9009 -0.12664 0.347193 -7.53378 8.82258 -7.79572 8.91645 -2.50098 3.39701 -4.17873 4.97732 -1.05822 2.47032 -3.1012 4.97736 -8.42126 8.74568 -7.83301 8.17843 -9.26618 10.584 -3.02667 3.7128 -8.30654 8.69242 -2.87173 3.43275 -6.59917 7.54843 -7.03447 8.20283 -5.75718 6.40637 -2.62899 4.1855 --0.520148 0.902194 -5.1538 5.61763 -1.25625 2.33142 -4.16336 4.3384 -3.01296 3.41026 -3.16515 3.26305 -2.40944 3.21897 -6.80742 8.57141 -1.15125 1.54824 -8.72251 9.50878 -3.15703 4.04482 -0.470308 0.726093 -0.199979 0.878243 -7.8908 9.17915 -6.91793 7.16038 -4.64783 5.00217 -2.21237 3.03073 -1.5825 1.63362 -3.18806 5.20795 -5.92725 5.95595 -4.65027 5.09868 -6.42204 6.87201 -8.08637 9.40221 -4.95542 6.16185 -7.45987 7.57979 -8.826 9.13961 -4.42078 5.27977 -7.26216 8.97585 -2.26919 3.33512 -9.4077 9.81908 -0.722223 1.03378 --0.0497795 1.19355 -8.22686 9.31082 -0.0733766 0.93037 -7.47883 7.9062 -5.28731 5.74181 -1.78496 3.61348 -0.690987 0.764344 -2.56442 3.54999 -4.27944 5.43124 -4.04412 5.35376 -0.663756 1.88268 -1.73567 1.78553 -8.07666 9.41842 -7.70138 8.42873 -9.27113 9.55873 -0.982413 2.5565 -0.994807 1.02007 -5.01226 5.31923 -8.87435 10.0597 -1.74836 3.22578 -0.151528 0.191719 -5.82608 6.06438 -1.17239 1.59955 -3.18515 4.11049 -1.92258 3.70604 -1.63692 1.8266 -1.83542 2.66228 -2.21954 3.11425 -3.97546 4.3928 -0.731374 2.05705 -5.44809 5.96359 -9.85934 10.0553 -8.42169 9.63654 -6.68148 8.43446 -2.00014 3.3485 -0.735924 1.73 -1.61833 3.05643 -7.87934 8.67316 -8.67441 10.0032 -0.794573 1.2493 -6.11926 6.41441 -5.2715 5.82597 -9.41854 9.46625 -3.46299 4.06742 -5.6487 5.79053 -1.46503 3.43496 -0.9957 1.53939 -2.4714 3.1301 -0.887049 1.6196 -3.04884 3.19662 -1.24337 2.05758 -7.61142 8.55766 -0.998279 1.64425 -4.74917 5.85236 -2.97632 3.94611 -4.11786 5.62709 -7.40498 7.62083 -1.47854 3.64736 -2.1176 2.64511 -4.55533 5.89436 -7.44618 9.79926 --0.410242 0.737348 -5.719 6.30861 -8.33692 8.38222 -8.78122 9.98195 -3.75452 4.26866 -2.23771 2.44985 -6.72455 7.61362 -5.9797 6.58846 -6.72885 7.60315 --0.710302 1.18332 -7.73287 9.383 -6.61213 7.67394 -4.12945 5.68527 --0.300887 0.341615 -5.77978 6.41534 -8.34001 9.96874 -1.62323 1.8283 -1.71788 2.23905 -7.43484 8.0418 -3.47322 3.8047 -3.47311 3.51261 -7.82093 8.86377 -2.46973 2.99125 -7.91166 8.55065 -3.39807 3.43599 -8.94792 10.0437 -7.70859 8.32487 -5.86852 7.13103 -7.64996 9.19033 -6.66742 7.8092 -7.88241 8.58675 -9.42939 10.3479 diff --git a/geom_bottleneck/tests/data/ws_tests/test_5000_B b/geom_bottleneck/tests/data/ws_tests/test_5000_B deleted file mode 100644 index 5f6e43c..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_5000_B +++ /dev/null @@ -1,5000 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 -2.04751 3.00998 -3.19365 3.9383 -8.09529 9.45596 -8.88173 9.5618 -0.609816 2.67806 -1.57288 2.60884 -1.68354 1.80124 -4.92058 5.9959 -1.48728 1.84885 -0.299669 0.413905 -9.02156 9.56731 -7.50854 8.49023 -0.667131 1.89987 -2.22472 2.58793 -5.84395 8.79426 -2.35839 2.66935 -3.43111 3.69982 -6.71023 7.36801 -6.75697 9.0991 -2.35352 2.85316 -6.73054 7.39006 -9.48673 10.1493 -6.71226 6.72805 -9.22083 9.71889 -8.36513 9.33921 -0.0652672 0.319993 -3.26467 4.60881 -7.62269 7.79878 -6.48608 6.69515 -6.21737 6.88645 -6.56094 6.9699 -1.61317 2.7167 -5.08621 6.29754 -2.24676 2.8076 -3.09943 3.93921 -9.74093 10.0968 -0.417699 1.6381 -9.2958 10.2973 -3.6663 4.1369 -0.0229943 0.448065 -9.2928 10.1833 -3.66334 4.22032 -0.812172 2.19952 -7.88025 8.71192 -8.69379 9.34922 -1.70691 2.95352 -8.28737 8.29985 -5.22491 5.354 -4.03526 4.14084 -6.49359 7.05924 -0.24853 1.44718 -7.86936 8.75135 -5.76 6.68919 -5.85437 6.14314 -5.86292 6.0516 -2.35692 2.91295 -0.0990674 1.29386 -2.9911 3.56188 -0.552671 0.638929 -5.80756 6.22761 -1.21067 1.77175 -4.51882 4.72936 -1.99969 2.89732 -3.65968 6.61987 -0.478582 1.33355 -0.259061 0.289813 -3.89264 5.02474 -0.349236 0.438003 -7.70442 8.1729 -7.90389 10.1876 -3.06898 3.15219 -4.77811 5.29095 -9.76561 9.89451 -4.14295 4.2489 -0.540224 2.28623 -9.60749 10.2284 -8.49555 9.00307 -7.89668 9.76886 -4.12631 4.70897 -7.87898 7.91814 -9.29858 9.52908 -9.24009 9.91544 -3.73498 4.70275 -5.44467 5.9274 -2.13453 4.85697 -2.29607 2.88771 -0.807842 1.82319 -0.319005 2.08473 -1.62 1.63649 -2.20431 3.23869 -2.00132 2.77136 -6.64752 6.71706 -8.12249 8.28379 -7.55541 7.7813 -3.51763 3.64484 -9.21075 10.2811 -2.24501 2.54426 -5.64566 6.46452 -6.72307 8.56698 -3.91728 4.60262 -4.02535 4.29548 -3.0499 3.53135 -1.30677 2.32194 -9.36908 9.90669 -3.92387 4.33848 -2.87312 3.08243 -4.49167 5.2749 -5.43143 6.74905 -6.94595 9.16539 -1.9784 2.00429 -9.42478 10.2226 -3.7185 3.96576 -9.37729 9.50574 -5.34283 6.89736 -4.95341 5.84626 -2.91654 4.28413 -8.26544 9.3076 -6.23114 7.20273 -1.02585 2.21446 -1.6718 2.29591 -2.28926 2.73452 --0.648145 1.105 -1.44194 2.18562 -6.78584 8.37985 -2.00402 2.08248 -1.64076 2.04067 -0.0419044 0.455962 -5.51723 5.72098 -5.42117 6.81165 -5.70331 5.81707 -4.97889 5.60741 -3.38797 4.46846 -7.20995 7.66784 -3.45388 4.23386 -3.11057 4.35995 -3.29476 4.04676 -2.0519 2.94719 -5.37101 5.38271 -5.99383 6.64188 -7.48444 7.6377 -2.15043 3.05399 -1.54093 1.83799 -5.59223 5.87222 -5.8005 6.08042 -6.1208 7.22563 -1.2938 2.17454 -4.92405 5.0402 -6.91336 7.79688 -1.47978 1.99762 -9.00494 10.8315 -5.84805 6.15303 -4.95368 5.49096 -8.21704 8.31192 -0.715222 2.33517 -0.904183 2.54741 -3.42349 3.74906 -0.627978 2.37092 -8.41477 8.72651 -3.55373 5.58652 -4.12685 4.61533 -0.775274 1.41263 -4.78915 5.08639 -6.35791 8.15015 -2.88242 3.63509 -2.78526 3.07834 -0.39129 1.15933 -3.26615 4.74531 -8.78873 9.8888 -7.25612 7.45972 -4.97452 5.30012 -0.757255 1.35518 -1.29516 2.52446 -4.66838 4.96648 --0.0720209 0.832726 -2.68276 3.21123 -8.44253 10.0311 -3.40809 4.70506 -1.09617 2.35452 -5.19302 6.73599 -1.25316 1.58101 -6.2056 7.10099 -7.7666 8.52777 -0.301239 1.37275 -0.522829 0.731575 -6.73869 6.96826 -2.41703 3.20567 -4.94617 6.22052 -5.41524 7.68272 -6.0408 6.29938 -0.0642067 0.600878 -6.32122 6.63505 -3.25427 4.70611 -5.88704 6.1678 -8.71533 9.08476 -6.25575 6.88392 -1.54462 1.56366 -3.95938 4.03326 -2.54671 3.66798 -8.48603 9.10156 -3.37369 4.65454 -5.25469 5.64636 -7.02624 7.36449 -8.17061 8.44321 -9.23147 10.1149 -1.45589 2.25886 -6.47702 8.25307 -7.69088 7.91753 -0.442832 0.616926 -8.35355 8.83222 -7.65142 9.58906 -4.04877 5.17345 -0.76012 1.8686 -6.54877 7.40058 -7.41774 7.65429 -8.69655 9.3325 -4.8302 6.25306 -1.77203 1.90284 -3.67485 4.94569 -6.60162 6.72031 -3.05924 3.35235 -0.0823162 1.3486 -8.42991 8.86331 -6.81596 6.83527 --0.0174808 1.6745 --0.758131 1.08928 -4.14423 5.46342 -9.26253 9.85714 -7.42749 8.58214 -4.88849 5.86936 -8.99339 9.38141 -8.85301 9.18285 -2.64303 3.45658 -7.1133 8.66473 -3.50745 3.8629 -7.81615 7.83244 -2.94991 3.8741 -7.91822 8.8362 --0.0553088 1.19059 -7.35558 7.77948 -2.11257 2.20563 -8.57533 9.16338 -2.3515 3.13009 -4.13239 5.38696 -2.20763 2.93941 -7.2451 7.3211 -0.834388 1.57413 -4.47024 6.17855 -4.75947 6.80913 -2.99607 3.54732 -8.15998 8.80718 -8.94688 9.27971 -4.46335 4.9522 -5.30725 5.69786 -7.63989 7.86974 -6.69589 7.69565 -5.34018 6.08115 -8.59515 9.62264 -1.80557 3.22507 -8.62429 8.94242 -1.34532 1.95042 -8.60707 8.80741 -8.03275 9.40327 -4.30357 4.39095 -8.97954 10.7076 -2.18143 3.51825 -3.98695 5.62062 -2.48813 2.60622 -5.56957 6.43776 -5.18249 5.55459 -3.45373 3.64101 --0.00345662 0.570597 -3.61127 4.69761 -9.37858 10.6205 -7.24635 8.19639 -4.70142 4.80735 -3.30055 5.14257 -0.860415 1.31635 -4.72924 5.46893 -7.47391 7.72644 -6.22287 6.57754 -0.181652 1.01366 -2.14494 2.80736 -2.16406 3.19383 -8.52991 9.22722 -8.74411 9.06935 -0.575831 1.02699 -2.47315 3.0331 -4.2872 4.59813 -5.82293 7.03604 -2.08982 2.25319 -7.3626 8.41994 -1.23867 3.10885 -7.397 7.78026 -6.78837 7.32977 -0.829368 1.56617 -9.23075 9.35172 -6.76562 7.23578 -0.42851 0.839401 -4.83626 5.5852 -0.150032 2.45322 -2.16811 2.47439 -5.60245 5.81188 -7.43707 7.46519 -0.167317 1.44642 -4.9732 7.58343 -8.67391 10.2957 -0.318592 0.639284 -3.365 4.25929 -7.83683 8.88895 -5.20557 5.30114 -0.940347 1.74022 -5.39149 7.13464 -1.10826 1.27913 -1.9147 2.31276 -0.935283 2.49181 -3.67898 4.33336 -5.10125 6.07734 -0.348807 0.839242 -0.310986 0.58381 -2.03594 2.43119 -5.49755 5.94215 -1.94885 3.34409 -9.66806 9.97883 -4.79099 5.45155 -4.81158 5.30001 -5.17667 5.90019 -9.64168 9.99177 -1.14899 1.22792 -0.466236 0.952985 -6.93679 7.72282 -2.97285 3.23931 -9.22517 9.24315 -7.25783 7.46414 -4.37304 4.51815 -4.01069 4.02979 -0.843132 1.80443 -4.78572 6.04237 -6.02471 6.38074 -4.99536 7.76852 -4.97442 5.17384 -0.731231 1.49497 -2.2797 2.90845 -9.13211 10.341 -4.19545 5.08597 -6.13127 7.09817 -2.65124 5.02208 -5.40235 7.12912 -6.86258 6.91991 -8.24317 8.55273 -7.6877 7.69875 -3.33922 3.53776 -0.089484 0.40755 -1.34909 1.68726 -8.43113 8.72899 -4.90038 5.55994 -0.308089 0.490555 -5.42628 7.1433 -2.11647 2.56987 -3.56934 4.1619 -8.35794 9.24416 -8.8645 9.69151 -5.10701 6.0036 -7.66385 7.8412 -2.89952 4.55221 -6.01533 6.38269 --0.945182 1.07304 -1.79537 1.85576 --0.0313338 0.501067 -8.85689 8.87522 -1.61143 1.7773 -9.53229 9.84943 -3.51669 3.81091 --0.448016 1.10903 -3.16889 3.439 -4.30534 4.36372 -6.20158 8.09618 -2.20949 5.23616 -3.29459 4.17079 -3.90101 4.05611 -5.89688 6.85702 -0.734474 1.04471 -7.84341 8.02702 -8.69431 10.1086 -9.73194 9.92195 -7.63516 7.70631 -8.51416 9.33072 --0.0712911 0.361001 -2.76979 3.22708 -5.34404 7.5165 -5.64429 5.79865 -0.0755012 0.363483 -5.05631 7.27153 --0.60164 1.09659 -0.457228 0.876186 -4.27092 5.38033 -8.63891 9.04134 -6.29608 7.04242 -8.97795 9.93013 -5.00385 5.57737 -8.48068 9.44885 -7.35543 7.78492 -3.55698 4.01035 --0.268117 0.649128 -0.633184 0.66254 -4.54216 4.81132 -6.15574 6.35276 -4.3663 6.36286 -1.45231 2.07039 -7.37031 7.9157 -5.30961 6.3506 -5.80757 5.81762 -4.91767 4.97519 -3.45667 3.60965 -1.7934 2.3807 -4.33289 5.41047 -1.16021 1.29979 -3.75172 4.53521 -3.10835 3.1275 -2.68167 3.00314 -4.10639 4.24094 -4.90776 5.74069 -7.30861 7.86666 -3.52822 3.70998 -5.22222 5.28033 -0.00866476 0.326377 -7.73247 8.61481 -4.25231 4.77499 -8.41148 8.54604 -2.95389 3.63497 -7.76126 9.69124 -6.41218 6.69682 -4.86285 6.44503 -1.84783 1.9065 -4.08788 4.11706 -9.17473 9.50133 -5.15091 5.78649 -1.27694 3.33579 -2.92648 3.37855 -9.37392 10.5123 -4.81878 6.34991 -8.38702 8.83716 -5.07771 6.33618 -1.47438 1.75588 -6.20935 7.11166 -1.08286 1.38 -1.40048 2.0157 -6.60355 7.26234 -5.28396 5.90003 -8.9525 9.59216 --0.0305792 0.544664 --0.571491 0.735471 -6.287 7.03679 -5.35225 5.4104 -0.095812 0.605976 -4.33523 4.4048 -6.13288 6.80949 -4.14654 5.5505 --0.213214 0.260592 -7.56188 7.83088 -7.8132 8.65963 -8.02469 9.3254 -0.00641711 0.420562 -7.49269 8.15849 -9.26359 9.4366 -5.74008 7.86317 -8.62729 9.78825 -4.28946 6.20553 -3.19174 4.54991 -4.16992 4.25203 -2.46138 4.11583 -1.92971 2.16701 -3.43028 3.80842 -6.98297 7.28388 -7.51884 7.55947 -7.79102 9.44326 -0.416342 1.32311 -9.35398 9.85201 -8.72997 9.10384 -6.23398 6.88888 -7.46984 7.4875 -5.92603 6.66938 -1.77761 2.58697 -0.835966 2.06139 -9.63284 10.3565 -6.13677 6.42768 -0.151375 0.382404 -8.10315 8.13441 -5.52283 6.28113 -1.00873 2.44226 -2.5239 3.89871 -5.40599 6.72653 -3.43407 4.0068 -1.22444 1.26601 -7.04395 7.80599 -3.75987 3.77123 -6.43597 7.06249 -8.34435 8.87418 -8.25853 9.04009 -0.415321 2.32725 -0.639046 1.75525 -7.83226 8.12538 -9.55429 10.2734 -3.658 4.35867 -1.8588 3.93292 -7.38922 8.16823 -8.53626 9.23024 -0.848152 1.13412 -6.31667 7.2348 -3.81584 4.62621 -9.24748 10.7408 -2.75953 2.95288 -5.70188 6.62278 -4.22202 4.45368 -3.24616 3.88779 -1.05053 2.09846 -8.67718 9.52693 -2.14107 2.71959 -1.10518 2.69689 -5.01476 5.54139 -4.69244 5.20358 -8.88285 9.93012 -2.55228 2.77382 -6.72118 7.50057 -7.58999 8.71573 -1.83763 2.13481 -4.86135 5.27995 -4.39794 5.42117 -1.42512 2.98262 -4.80489 5.34701 -2.7993 5.13702 -7.52122 8.41729 -9.08613 9.37543 -1.1555 1.3935 -7.34071 8.0428 -8.33361 8.40349 -2.514 2.54741 -8.25732 8.41758 -1.65337 2.57964 -4.20527 5.06565 -0.723443 1.06987 -5.85836 6.64701 -7.908 8.07591 -5.01839 7.0105 -3.15908 5.10364 -4.3574 6.67192 -2.06662 2.46437 -7.5595 8.9108 -7.94919 9.20231 -4.11889 5.49714 -7.28151 7.51881 -1.30685 2.09479 -3.08479 4.47364 -4.50916 5.91511 -7.31605 7.63868 -3.14469 4.07035 -8.38431 8.87993 -7.42277 7.64967 -4.22472 4.26323 -8.49871 8.90746 -7.44431 8.09014 -8.35213 8.7504 -3.85634 4.37584 -9.12975 9.77042 --0.326056 1.17374 -3.53802 4.06211 -6.81775 6.8467 -8.19106 8.64489 -4.20526 5.37727 -2.74081 3.72143 -0.49642 1.10775 -7.76606 8.00524 -4.79825 6.38926 -1.99478 3.20484 -4.69853 6.29508 -5.73058 7.18643 -8.11708 8.64257 -9.62375 9.84838 -5.95271 6.38989 -9.0193 9.93848 -3.91188 4.10834 -6.065 6.60546 -2.62354 3.60072 -8.53665 9.06824 -6.40691 7.44693 -1.62959 2.5825 -9.4128 9.87031 -6.24697 6.62684 -3.31136 3.45626 -4.80347 4.9935 -9.21711 9.53416 --0.491547 1.72886 -4.75174 4.87217 -0.86329 1.53331 -2.4586 4.2578 -5.10301 6.2815 -5.08302 5.86788 -6.12434 6.78948 -9.68323 10.0973 -3.52576 4.40424 -4.9925 6.89084 -0.846638 1.80782 -1.09709 1.7685 -8.38592 9.03312 -9.56243 10.2682 -5.03592 6.6429 -7.8609 8.04599 -1.21404 1.31975 -7.47824 9.2063 -1.47849 2.68795 -1.2909 2.06381 -5.21288 5.54616 -6.27218 6.99345 -4.77622 5.08494 -3.30665 4.14735 -3.38947 3.55545 -7.71197 8.53162 -1.10565 1.50806 -0.7889 0.984689 -2.88598 3.33244 -5.70958 5.81232 -5.16567 6.24511 -6.91255 7.25784 --0.401084 0.753156 -4.81138 6.20671 -1.67301 3.58501 -7.19478 8.25624 -1.24428 2.2523 -4.31631 5.33357 -0.589196 1.02017 -5.69207 6.97803 -2.3854 3.25501 -4.1362 4.91135 -8.9932 10.3184 -7.95871 8.45158 -4.03213 5.26347 -3.09506 4.06425 --0.0310321 0.738171 -7.35733 7.61512 -2.48488 2.96253 -4.72098 5.69867 -5.5395 5.96914 -3.17854 4.283 -6.50012 7.33744 -1.93266 3.00941 -1.49319 2.71826 -9.0187 9.13099 -7.15259 7.40691 -8.71939 8.93257 -1.57203 3.11249 -0.933429 2.16903 -2.99663 3.71667 -2.06144 2.81311 -7.9072 8.2103 -0.490069 0.614737 -7.84111 9.70812 -1.15363 1.6421 -1.15475 1.43307 -8.2228 9.92116 -7.76825 8.40724 -6.15122 7.31322 -7.1427 7.49294 -2.30516 2.7019 -2.03336 4.03387 -8.3918 9.85707 -8.57214 9.59345 -3.8057 4.1119 -8.9223 9.38556 -9.32051 9.60504 -7.13349 7.69154 -1.71855 2.00425 -5.10333 6.0605 --0.149137 0.80973 -0.466224 3.1698 -4.19165 4.29604 -1.64018 2.3161 -9.40397 9.89211 -5.21738 7.06323 -0.525526 1.0331 -8.06992 8.08704 -9.81539 10.0915 -9.33514 9.50521 -5.95494 6.54519 -9.21466 9.35909 -4.96603 5.18164 -3.89238 5.53056 -5.04546 6.32916 -8.63758 8.65805 -7.03226 7.57074 -0.32029 1.10893 -0.194176 0.992252 -8.79061 9.50848 -0.239137 0.300717 -7.7234 8.43747 -3.43679 4.28954 -8.31382 9.18928 -1.39612 1.67253 -6.95733 7.39846 -1.29129 2.12185 -7.93611 10.2305 -3.67764 4.17562 -1.38149 2.42407 -2.2847 2.48412 -9.28655 10.0661 -2.94115 3.21326 -7.04238 7.91536 -5.06012 5.61526 -8.95611 9.91736 -2.18524 3.44007 -1.0692 1.10987 -4.37019 5.18443 -5.82014 6.441 -1.68642 1.70458 -4.93783 4.9535 -9.42003 10.1196 --0.356795 1.30987 -1.37778 2.80527 -9.54126 10.1758 -8.67413 10.5984 -0.914291 2.0697 -6.08696 7.09832 -2.82202 3.31103 -4.07818 5.50195 -2.85223 3.67449 -6.03006 7.10863 -8.84655 10.528 -5.08031 6.2001 -1.00272 2.74191 -0.169102 0.223253 -0.025089 1.26534 --0.203339 0.64667 -0.899666 1.48885 -0.74235 1.49976 -6.28212 6.80412 -5.65159 5.93106 -2.1686 2.7445 -5.02936 5.43091 -8.07124 8.80499 -8.65696 8.95802 -7.68394 8.365 -8.65062 8.69146 -0.058248 1.19535 -5.74545 5.84057 -6.05244 6.52152 -9.3878 10.3328 -7.71379 8.88044 -3.32961 4.54105 -8.51987 8.62854 -4.10821 4.16902 -9.47639 9.78723 -4.72417 4.84793 -2.32867 2.94068 -9.52275 9.57815 -5.32867 6.96127 -4.32462 5.1508 -4.46919 6.45961 -8.62661 10.9533 -0.0244049 0.56156 -1.49207 1.73164 -7.03156 7.81168 -5.88587 5.89732 -8.43632 9.65085 -7.52612 8.06726 -4.82464 5.6193 -3.8062 3.90356 -2.42708 2.51646 -2.06458 2.45877 -0.427218 2.24283 -7.42616 8.11513 -0.617708 1.01833 -8.74218 9.03592 --0.213346 0.599112 -9.05291 9.59124 -5.20365 5.54277 -2.85289 3.99509 -3.08468 4.58456 -0.136826 0.685254 -3.87191 3.99021 -0.970836 1.49673 -2.44355 2.53584 -8.88615 9.94545 -3.90591 4.52798 -1.52518 2.50658 -7.21268 9.07745 -0.767314 1.23833 -8.62975 9.42367 -6.71524 7.67686 -7.61205 8.48292 -5.312 5.65087 -4.75627 5.96261 -7.90674 8.0753 -7.37887 7.71478 -3.74483 5.52984 -2.7187 2.85544 -4.7902 5.62159 -2.89671 5.19815 -7.37268 8.72506 -7.11916 8.28301 -9.19814 9.75279 -1.2085 2.60113 --0.632009 0.889734 -7.99858 8.39743 -6.48346 7.10822 -6.30616 7.06648 -5.56514 6.51183 -2.41505 3.56224 -6.83749 8.84447 -9.05111 9.46906 -7.77476 8.4091 -6.11378 6.31232 -4.42882 5.69917 -5.88107 8.052 -3.75437 4.08893 -2.70487 2.77664 -7.26028 9.77257 -1.44621 2.73267 -2.0384 2.60397 -2.95402 3.68949 -6.04766 6.4054 -0.716046 1.77698 -1.5084 1.72988 -2.58426 2.80376 -8.05255 8.59793 -6.06336 6.20709 -3.29813 4.31473 -2.53477 4.92554 -8.78711 9.88634 -9.26627 9.82082 -6.70683 6.81257 -8.25978 8.99788 -7.28054 7.64237 -5.14556 5.20711 -4.20431 5.87866 -8.96592 9.97597 -4.06216 4.41519 -8.49174 11.0491 -5.24547 6.03094 -4.65885 5.95835 -5.09606 6.34846 -6.30463 6.65933 -6.48022 9.56168 -1.38088 2.98143 -0.486911 1.16767 -8.16327 9.34821 -0.768885 0.782616 -4.51699 6.08086 -9.55086 9.70242 -2.86802 3.72489 -1.88496 2.18749 -4.31876 4.33726 -8.38871 9.45631 -8.80634 9.36198 -5.232 6.42399 -9.86919 10.0492 -3.61902 4.53086 -3.13118 4.42364 -2.69395 3.1816 --0.303144 1.32309 -4.28871 4.36739 -3.8631 4.08745 -4.9291 4.98968 -7.14273 7.25505 -2.56623 2.59122 -6.01753 7.72265 -6.76051 7.53954 -6.76933 8.14741 -0.933137 1.83537 -7.9357 8.57904 -5.55847 5.59984 -4.25563 4.3345 -4.28087 5.21348 -8.88534 9.06554 -1.88575 2.94002 -5.26613 6.04562 -0.514249 1.45538 -0.130644 0.501645 -4.30564 4.86337 -1.57246 2.38451 -0.303814 1.77474 -4.22675 5.02783 -6.75381 6.78634 -5.64096 5.9725 -6.76159 6.98142 -2.35569 2.39119 -3.29794 4.95962 -6.55055 7.03366 -5.31474 5.69404 -9.01335 9.16988 -8.58306 9.37831 -7.06522 7.07778 -1.14695 1.74744 -3.15507 3.22865 -5.5925 7.14168 -2.14679 3.68767 -7.54789 9.71878 -1.5667 2.08742 --0.604726 1.66718 -0.306012 0.54799 -2.61731 5.08257 -0.80957 1.74655 -8.22035 8.81637 -4.401 5.449 -8.89389 9.01988 -4.80574 4.9322 -2.19895 2.88565 -9.06688 10.8095 -1.23727 1.58699 -7.14836 7.92057 -4.65155 6.15149 -0.563061 2.16535 -7.66764 8.0341 -8.32324 8.42774 -4.54541 5.11069 -8.0237 8.09992 -7.26113 8.09404 -2.55196 3.20317 -8.1236 8.60951 -1.90437 3.23006 -0.888133 2.50365 -1.13618 1.69444 -2.60463 3.01696 -7.2311 7.73229 -5.06501 6.01487 -3.9893 4.10116 -1.45278 1.56937 -2.74601 3.80778 -9.40705 10.3843 -3.02533 3.52213 -8.7097 9.2268 -8.73145 10.5552 -2.56059 3.5742 -6.27328 7.57089 -3.23291 3.30811 -6.33804 7.20304 -7.63648 8.34564 -9.82053 9.93597 -3.14924 4.58629 -5.28253 6.33733 -1.99411 2.04104 -0.305593 0.420302 -5.39668 6.64188 -7.99992 9.37823 -5.25169 5.65987 -0.109291 0.875734 -3.08589 5.50296 -6.51358 6.62588 -5.34687 5.58204 -0.043587 0.932787 --0.0264143 0.28677 -8.09722 8.37087 -5.46612 6.30285 -2.89146 3.49892 -6.73278 7.11762 -5.03068 5.90176 -1.7459 2.87727 -0.207707 0.448933 -7.00453 7.63105 -6.02789 7.87991 -8.1917 8.95854 -7.49014 8.73215 -8.48402 9.22063 -1.0467 2.4687 -0.241901 1.38802 -2.65867 2.81258 -5.46725 6.59448 -3.40578 3.75607 -4.2495 4.26392 -5.6608 6.213 -2.99705 3.88852 -6.17231 6.72018 --0.17415 0.492739 -4.89596 6.49895 -4.68876 6.60218 --0.0510568 1.46013 -8.87099 9.28179 -3.98894 4.5838 --0.20015 1.59214 -8.80756 9.51828 -7.74921 8.53538 --0.380041 0.440574 -2.69409 3.91466 -2.42747 4.56745 -6.25881 7.75647 -7.2941 7.77193 -2.60806 2.90251 -0.325028 1.22219 -8.29921 9.01416 -3.85524 5.45451 -5.2612 5.71877 -2.92849 3.73937 -8.6242 8.70808 -7.28153 7.35797 -1.65378 2.87917 -3.46034 4.24143 -3.99989 4.3199 -1.15266 3.60328 -4.8464 6.4887 -4.67021 4.68421 -6.96861 7.31554 -0.00723008 0.817047 -7.59589 8.88352 -5.56725 6.08465 -9.02409 9.19527 -5.81681 6.74193 -1.98221 2.98678 -8.76392 10.7646 -4.3903 4.50531 -1.0186 2.01838 -2.66674 2.74505 -2.41105 3.44579 -8.98295 9.18995 -8.14385 8.98779 -2.69613 3.60144 -0.445704 1.51319 --0.634889 0.860409 -6.32737 7.10112 -7.88824 8.06838 -3.76271 4.43529 -7.66487 9.30221 -8.73974 9.59191 -3.08965 3.43006 -8.9518 9.96154 -0.727194 1.55228 -6.35214 7.12234 -2.71987 3.22996 -7.12786 7.4379 --0.346107 0.837469 -8.47103 9.05987 -9.15744 10.628 -8.3237 10.093 -1.15052 1.16223 -6.95959 7.35423 -7.69488 8.44145 -4.21694 5.65913 -3.10562 3.37534 -9.73437 9.78252 -5.0458 5.53479 -7.80485 8.5163 -2.0442 3.75748 --0.459177 0.498702 -7.38032 8.32195 -0.909659 2.11175 -7.08657 7.56877 -1.84997 3.10206 -4.2517 4.53819 -6.71655 7.04117 -1.06604 1.29153 -2.69273 3.31633 -2.19732 2.84826 --0.723032 0.774865 --0.289734 1.44645 -5.87194 7.71917 -1.01576 2.83685 -0.981927 0.998558 -3.07172 3.73201 --0.112577 1.12642 -3.54063 3.67007 -7.21571 8.53815 -0.109957 0.839052 -6.86046 7.17211 -9.40878 9.69478 -0.989391 1.69046 -8.22287 8.8147 -1.48203 2.83308 -5.86418 8.0993 -0.749797 1.09852 -1.82996 2.50847 -0.28178 0.496017 -2.60694 3.00872 -8.6254 10.1698 -6.11641 6.41537 -7.19529 7.21342 -1.8214 2.17517 -0.991201 1.3788 -2.84924 3.12362 -5.75821 7.13843 -6.7106 7.35932 -6.6055 6.6829 -7.97105 8.58613 -1.56087 1.95845 -6.36782 7.10926 -2.43382 2.74699 -7.40509 8.8029 -8.42459 8.63142 -6.26128 7.55043 -4.6465 5.4431 -2.93214 3.29517 -0.157602 0.545214 -6.05931 6.72188 -1.7908 3.11731 -2.39217 3.58736 -7.07421 7.43852 -8.13419 9.74991 -9.53094 9.65319 -2.35726 3.68679 --0.108561 0.874853 -6.87136 8.84157 -3.40803 4.58835 -7.50448 7.89932 -4.29762 5.53867 -0.863755 2.30032 -7.24847 7.95342 -2.89618 2.98849 --0.928261 1.61922 -0.974105 2.91262 -6.99271 7.25856 -3.60995 5.01832 -1.26865 1.79704 -9.62217 9.80719 -1.02656 1.35514 -7.16502 7.32934 -3.12092 3.28857 -2.81374 3.84317 -8.73626 10.7585 -3.36982 3.61446 -5.08437 5.78949 -2.90218 3.0862 -9.2309 10.2523 -5.0967 5.48926 -9.73088 9.92708 -1.54013 2.78301 -6.73707 10.0789 -6.41735 6.838 -2.57935 3.04287 -5.719 6.70352 -5.42474 5.62732 -4.23904 4.69787 -4.16528 4.28736 -7.73477 8.84143 -4.90346 5.87324 -5.1969 6.14087 -3.48793 4.14182 -0.648493 1.07987 -6.88101 6.97932 -7.67342 8.74418 -5.16759 6.3871 -9.16292 9.49569 -8.77422 10.4817 --0.358149 1.04178 -9.54616 10.3424 -3.12027 4.26504 -3.81223 4.73004 -1.2386 3.32247 -8.21963 8.42629 -9.10312 9.51016 -6.96107 7.43045 -2.98587 3.12365 -0.198165 0.211424 -5.19716 6.10856 -6.10553 6.3327 -3.98176 5.11099 -1.02512 1.04242 -4.27949 5.71947 --0.457956 0.538807 -7.99877 9.48581 -5.88782 7.73303 -1.21496 2.85825 -8.46962 8.7862 -9.50182 10.1527 -5.85223 7.76234 -2.48368 2.52439 -2.35426 2.77405 -0.397056 0.482679 -0.160423 1.15786 -4.47109 4.8633 -4.74523 5.84196 -5.39177 5.75218 -9.00754 10.3249 -3.74813 4.03273 -3.08633 4.08426 -4.62672 5.29012 -1.92055 3.01442 -3.79279 4.5603 -9.52431 9.68334 -2.8126 3.32592 --0.313688 0.490785 -9.06695 9.36835 -2.60321 4.14185 -4.40231 4.99535 -9.32205 10.1041 -5.3879 5.44349 -0.308728 1.0956 -9.05758 9.08283 -1.90313 2.50914 -7.1391 7.59459 -7.47357 7.95993 -1.25267 2.34827 -3.33222 4.36522 -8.78126 9.38611 -0.635979 1.62283 -8.3492 8.57545 --0.572557 1.60517 -8.28855 9.03937 -3.47934 3.90271 -4.64498 5.43501 -0.872177 2.62011 -7.3893 7.58876 -2.14063 2.88063 -1.69361 1.75261 -4.19727 4.86483 -0.814676 1.27639 -8.19899 8.58203 -8.3394 8.99896 -9.31768 10.1694 -4.99218 5.19949 -4.2459 4.75266 -9.6314 9.64249 -4.038 4.75708 -7.92398 8.8579 -4.30747 4.54161 -7.51776 7.78258 -3.77611 5.1385 -3.53275 3.90278 -1.78619 2.12474 -3.18736 3.55159 -8.36759 8.52587 -5.52526 5.7843 -7.64174 8.09773 -4.37925 5.85699 -3.94295 5.31298 --0.464623 0.795523 -7.02408 7.7048 -0.0690458 1.0008 -1.05445 1.32797 -0.126093 0.712612 --0.809973 1.33869 -3.45568 3.96532 -0.433875 1.78679 -8.94667 9.65034 -1.98575 2.76936 -6.47974 7.67912 -2.74186 3.34153 -7.82655 9.32112 -4.71441 6.14932 -0.741177 1.76987 -8.05021 8.23239 -0.818503 0.882959 -7.13341 7.43399 -8.45939 8.93395 -4.44558 5.70161 -3.05657 3.86962 -8.75469 8.85537 -1.0922 2.23475 -6.00278 7.51598 -0.0530968 0.582206 -4.01788 5.48223 -1.30808 2.81869 -8.18848 8.59771 -2.43691 2.80685 -8.54045 10.6178 -7.58523 7.91634 -6.70183 7.49962 -5.81501 7.29783 -0.661853 1.58021 -6.50997 7.20411 -0.334292 1.40252 --0.329585 0.742961 -2.38756 2.48935 -2.78114 3.58788 -7.97227 8.55379 -3.36753 4.57472 -5.14486 5.31457 -3.99691 5.47708 -6.36404 6.8741 -3.22519 4.63321 -1.80583 2.21824 -8.20747 9.42947 -5.90819 6.94368 -6.58559 6.85933 -2.99108 4.03832 -7.20963 9.6252 -3.10244 3.87265 -7.23018 7.91389 -7.18084 9.61063 -6.74145 6.86507 -8.40721 9.5751 -7.12352 9.45614 -2.06653 2.51786 -4.9155 5.04183 -1.34304 2.92777 -0.571315 1.17285 -8.05396 8.28214 -5.29142 6.24974 -8.93797 9.23051 -4.6108 5.45568 -6.46124 7.53124 -3.16695 4.37505 -2.76803 2.82764 -4.1531 4.84927 -8.19433 9.00383 -5.12114 6.22952 -2.2542 4.74849 -0.621192 0.871537 -1.37403 2.28895 -0.305704 1.3287 -8.70471 9.53085 -2.29164 3.56607 -2.42106 3.37382 -1.14309 2.03085 -9.17624 10.3281 -1.88864 2.70161 -0.932647 1.2473 -5.72385 6.55694 -5.25496 5.38675 -5.85771 6.69626 -7.37247 7.93094 -7.73499 7.98782 -4.91417 5.27506 -3.51127 3.84403 -6.96198 7.27686 -6.51176 7.74735 -4.19954 5.08222 -1.58115 1.83842 -2.11889 2.3408 -1.94427 2.00422 -5.59977 6.86555 -9.46942 10.3491 -9.18904 10.1988 -1.71938 3.01547 -4.3515 5.4951 -2.53792 5.85188 -0.3884 1.36228 -5.02469 5.62368 -6.82402 7.72203 --0.320478 0.821539 -0.0885656 0.248783 -3.01725 3.44385 -6.63776 7.74386 -6.57899 7.9332 -4.82656 5.18327 -3.91909 4.43955 -0.0708319 0.101395 -2.59796 4.22775 --0.433109 1.26978 --0.434274 0.624336 -3.22018 4.25282 -4.63351 4.776 -8.889 9.56332 -5.35952 5.46531 -8.73832 9.22756 -2.03432 2.34194 -0.477994 1.43353 -1.2029 2.86844 -5.09945 5.76855 -8.89076 9.01771 -5.30284 6.31732 -1.56375 3.17543 -5.4773 6.36897 -5.30934 5.35073 -7.20096 7.7075 -6.51046 7.12888 -9.37127 10.0531 --0.0484323 0.348687 -1.83241 2.2143 -8.28633 8.60462 -2.51014 3.65817 -3.27798 3.58685 -1.41567 2.23302 -7.50794 8.10378 --0.0579575 2.10373 --0.856005 0.96621 -2.96238 3.48434 -1.36304 1.90594 -2.9997 3.41214 -7.2763 8.087 -1.69207 2.74419 -5.41625 5.83917 -9.22139 9.53794 -1.17477 1.51576 -6.74597 7.90871 -0.678913 1.73759 -5.70863 5.7214 -8.88411 8.93377 -3.44409 4.54586 -0.958963 1.53878 -8.29904 9.3867 -2.52433 3.60238 -8.16257 8.21986 -2.11395 4.23455 -6.85451 7.40364 -0.20286 0.639736 -2.05848 2.49034 -0.547013 0.77336 -7.83609 8.11903 -2.16539 2.29286 -3.94232 4.31368 -8.53475 8.54519 -4.77462 6.4158 -4.08395 4.68214 -1.56902 2.23811 -1.61337 3.11768 -1.51181 1.65521 -0.0821202 2.09269 -4.77622 5.16243 -4.62148 5.75837 -0.613158 0.952696 -1.89128 3.04792 -7.57509 8.92834 -2.70465 4.2941 -4.95906 5.12442 -8.0927 8.17277 -0.796512 1.3215 -5.74134 6.45291 -9.68479 9.78978 -5.89261 6.2292 -6.11377 7.9339 -2.20571 2.67129 -3.46228 4.27058 -5.26723 6.2653 -4.04391 4.26562 -0.380382 0.818995 -7.58108 7.7618 -5.02375 6.13042 -4.20178 4.66297 -2.83039 3.0221 -2.36072 2.45545 -6.68854 9.20726 -2.91388 3.42464 -9.33373 9.73449 -7.75844 7.94625 -2.72414 2.89669 -6.65438 7.96623 -1.00647 1.05385 -2.63018 4.9432 -0.152187 1.60259 -8.86332 10.3631 -2.31523 2.6815 -8.00509 8.61794 -1.69711 1.75938 -8.65442 8.73697 -4.23917 4.32001 -9.66851 10.1925 -6.93943 7.49814 -8.51986 9.03561 -2.10317 2.5175 -0.539549 1.75683 -6.29423 7.93236 -8.64345 9.54556 -1.44069 1.6814 -9.10017 9.77088 -6.16731 7.40496 -0.570043 1.93192 -2.65761 3.88544 -1.46895 1.52688 --0.369067 0.540647 -2.04868 2.72065 -2.1286 2.27858 -5.90157 6.16431 -1.55581 2.51851 -3.29705 3.81635 -3.4137 4.10991 -8.48699 10.1364 -8.43437 9.4642 --0.037842 1.47589 -0.541735 1.7805 -0.499576 2.36065 -4.1415 4.72435 -4.77598 6.16872 -3.30388 3.61854 -6.43796 7.85966 -5.27157 5.70871 -0.919258 2.18653 -4.00961 4.07902 -3.78201 4.23596 -4.50464 4.791 -3.70253 5.30916 -8.59228 8.70036 -4.31103 5.69049 -5.31775 5.34378 -2.24198 2.64194 -6.66937 7.41675 -7.21753 8.42057 -4.35399 4.52398 -6.90698 7.30084 -3.44296 5.44378 -3.36719 4.89951 -3.38624 5.33856 -3.44877 3.53693 -5.81398 6.3016 -7.24655 7.33127 -3.86142 4.53134 -3.85894 6.88112 -6.45704 6.95699 -6.90997 8.24088 -5.68813 5.7611 -0.699911 0.824323 -6.73758 8.42517 -9.34644 10.07 -0.289929 1.30554 -8.30644 8.49113 -6.47667 7.16073 -4.28093 4.90236 -8.32678 8.57064 -7.09205 7.92316 -5.55599 5.63919 -1.0104 2.22875 -1.72237 3.53668 -2.54699 3.14823 --0.668582 1.25485 -1.25582 1.37003 -1.35044 1.57807 -6.17083 6.30811 -0.618816 1.20065 --0.540992 1.21634 -2.06673 4.28857 -9.03398 10.8112 -8.73735 9.22814 -1.30178 2.7599 -6.0221 7.34889 -8.30124 8.52159 -1.92023 3.34545 -2.99331 4.93358 -3.8412 3.93379 -1.455 2.77005 -0.538664 2.1118 -4.16926 4.26053 -0.699746 0.937609 -6.36024 6.6511 -2.34698 4.84463 -8.11109 8.76496 -4.05425 4.67773 -8.2284 9.78568 -1.64423 1.80353 -5.70109 6.93764 -7.2091 9.67224 -4.47015 5.23311 -4.29326 5.36144 -7.93151 8.96494 -4.61889 4.96487 -5.38473 5.43594 -9.35456 9.66489 -1.23737 3.04121 -1.16077 1.19519 -5.91037 7.55679 -6.88344 7.60181 -6.39705 8.65039 -1.61791 2.93041 -9.68285 10.1396 -9.03129 9.05839 -7.0683 8.29875 -7.19624 7.41696 -7.5266 8.38738 --0.254571 1.01098 -1.30218 2.03222 -7.6432 7.73031 -4.99495 6.04757 -2.79394 3.29394 -0.31505 3.55963 -7.55382 8.18787 -6.00032 6.27664 -1.49355 1.79767 -5.21191 7.19537 -3.47816 3.75801 -2.10272 2.39494 -1.31887 1.93829 -7.14313 7.63055 -7.3141 7.77239 -6.03409 6.17265 -4.24946 4.53165 -0.0569272 2.56109 -8.44766 11.4872 -4.22879 4.28007 -6.92817 6.98775 -8.08859 9.0206 --0.0748418 1.48605 -6.56698 7.0488 -4.46624 5.4952 -3.66085 4.05778 -6.44711 8.93943 -2.45735 2.49339 -0.0606673 0.416191 --0.183838 0.750464 -7.08561 7.67275 -6.65423 6.90808 -0.0598735 0.364072 -5.2228 5.41543 -3.14042 3.19043 -2.40069 3.02829 -1.80441 2.1849 -3.47491 3.95775 -5.49162 6.63934 -2.03332 2.32288 -3.17234 5.25109 -2.58274 2.59951 -9.37994 9.97097 -4.71509 6.77966 -5.18915 6.84982 -6.12508 7.04354 -0.811202 1.98808 -1.46825 3.66984 -2.44386 4.15623 -7.60169 7.68242 --0.43208 1.22222 -5.40569 5.66153 -0.391742 1.79408 -6.77742 8.43115 -9.12828 9.3851 -6.39541 6.80626 -5.17919 6.29326 -6.57263 8.12999 -3.439 4.62236 -8.40525 9.80086 -7.60986 7.70099 -1.32123 1.44213 -0.526574 1.92338 -9.57195 9.79591 -9.52103 9.63159 -3.79775 4.20608 -4.74446 4.89606 -9.00085 9.60025 -1.26279 2.08363 -4.13639 4.49232 -6.59409 7.18315 -1.0637 1.78425 -5.4213 6.87661 -4.24407 4.30987 -9.79732 10.1204 -4.24597 4.83541 -8.47705 8.5145 -4.34095 4.93842 -5.68168 6.96086 -7.48654 7.91072 -8.32005 8.45111 -5.24065 5.3032 -3.25982 3.94442 -5.58106 6.18764 -4.4243 5.58619 -6.36467 7.07082 -2.70051 3.56014 -5.94534 6.87688 -7.33638 7.7645 -4.57067 5.86652 -7.83993 8.36854 -9.03617 9.11629 -7.44672 7.95614 -6.05876 6.3594 -4.02496 4.97119 -3.01438 4.36109 -7.4932 7.92357 -7.51661 7.53354 -7.60692 8.49678 -1.76088 2.59103 -7.08578 7.39566 -4.83605 5.42933 --0.186592 0.847663 -1.15879 2.33996 -8.11815 9.35472 -6.02584 7.62549 -0.881084 1.00015 -5.39067 6.27026 -0.910755 0.97444 -5.32174 5.65652 -7.69388 8.24928 -3.40521 3.7615 -5.60321 6.92388 -8.25096 8.34324 -0.00108913 2.16897 -0.508035 0.66573 --0.0517816 0.0876197 -3.26472 4.30955 -1.99494 2.14903 -2.089 4.32368 -5.17378 5.75964 -2.8779 3.54361 -6.56459 6.90645 -1.43196 2.88337 -1.48917 1.94009 -3.40807 4.25784 -8.0334 8.13458 -8.22254 9.6175 -2.96308 3.14349 -5.04768 5.71252 -3.9977 4.72614 -1.44384 1.60782 -7.78147 8.19817 -7.03854 7.50085 -5.90747 7.06091 -2.89169 4.31831 -2.46167 3.16529 -9.13228 9.1504 -2.57975 3.05313 -5.75976 6.52958 -8.10499 8.98982 -8.43162 8.76377 -0.422917 0.668254 -1.69046 2.09962 -5.50386 6.66954 -0.0897183 0.564514 -3.50103 4.1041 -3.91918 4.52559 -4.39297 6.18876 -3.90396 4.90868 -9.69362 9.85528 -6.27994 6.95062 -8.01563 9.09433 -8.25641 9.72944 -8.22072 8.35423 -1.27059 1.61352 -8.53312 8.96235 -3.49185 3.9042 -5.79579 6.046 -0.489013 1.2147 -4.00074 4.177 -2.66625 2.93036 -7.20267 9.34958 -7.44659 8.54707 -8.99915 10.1143 -7.59922 7.82031 -8.38502 9.03222 -0.160075 0.294398 -4.14549 4.3927 -9.35554 10.248 --0.159435 0.467922 -2.17272 3.72336 -8.63811 8.79976 -4.23215 4.66461 -6.99516 8.2035 -6.45212 7.88791 -6.20141 6.28633 -7.69396 8.82204 -4.50807 5.96315 -8.51725 8.89286 -0.939492 2.12064 -7.4615 7.62666 -8.46681 9.11769 -3.92828 5.40884 -9.05622 9.40015 -0.229625 0.860838 -2.05694 2.52113 --0.217927 0.574255 -9.55146 10.3256 -8.31497 8.3417 -3.52833 4.47013 -7.7131 8.52058 -2.15462 2.66777 -5.7674 6.17553 -3.3358 4.10589 -2.06642 3.00412 -2.43387 2.85242 -5.09473 5.84276 -7.3287 7.54846 -4.64254 5.11465 -4.05785 4.93614 -4.25413 5.43513 -2.96476 3.15378 -3.53732 4.48239 -2.34137 4.01272 -2.24879 3.40626 -3.43323 4.49055 -0.871415 1.33068 -0.508929 1.65611 -4.92057 4.94743 -7.03376 7.35193 -5.73043 6.47264 -7.82417 9.93642 -5.24102 5.9178 -2.38528 4.1676 -6.27437 7.19631 -9.29267 9.53262 -4.10098 5.24964 -0.383714 0.833317 -5.97628 7.92987 -8.15799 8.96819 -8.1687 8.29862 -8.16289 10.5149 -7.38205 7.89765 -3.81883 4.15607 -9.46915 9.61755 -1.50756 1.51863 -2.34236 2.84689 -0.398473 1.15027 -1.05302 1.49155 -8.71687 9.35232 -1.0502 1.40395 -7.83685 8.76302 -7.7731 8.46899 -5.56618 5.97458 -2.90035 4.12043 -6.40644 6.68706 -3.95201 4.37075 -7.1831 7.67748 -9.42789 10.0914 -5.45198 7.01256 -8.64609 9.45756 -6.01864 6.31515 -7.64621 8.65533 -5.45654 5.76553 -2.04332 2.75476 -5.49454 5.85693 -6.13688 6.21927 -2.66255 2.7385 -4.8326 6.43772 -9.12704 9.45287 --0.294488 0.318697 -2.26979 2.35516 -4.12949 5.58506 -3.01416 3.62246 -6.64697 7.10221 -6.44307 6.82985 -4.10484 4.73148 -7.42589 7.6029 -5.33055 5.50395 -2.46474 3.05847 -5.43677 5.59206 -2.13807 2.3988 --0.38424 1.8121 -0.00916704 0.219304 -8.62621 10.2262 -3.33927 4.51169 -5.45656 7.13165 -5.29253 6.57917 -3.51704 3.9421 -8.63729 9.13361 -3.92626 4.3469 -6.83104 7.52695 -1.22258 2.28191 -0.447646 0.789809 -7.96543 8.54328 -2.24269 2.42571 -4.4161 5.40481 -0.813992 2.21792 -0.694664 0.974182 -6.50017 6.88902 -4.00723 4.65882 -9.05784 9.85062 -6.80276 6.98196 -0.105446 0.379881 -0.416982 0.53336 -9.01269 9.55204 -3.27197 4.23315 -6.7017 6.89704 -4.21512 4.42378 -4.86735 6.90949 -4.52235 5.36878 -2.62205 3.55746 --0.551048 0.555476 -1.63274 2.71251 -4.26739 4.88085 -8.23129 9.77405 -2.49409 3.96851 -6.66387 6.88886 -7.72383 8.90611 -3.18511 3.27281 -0.73722 1.64435 -7.90329 9.02868 -6.94845 7.06773 -0.509461 1.54928 -4.63885 5.51652 -9.24395 9.5121 -1.00007 1.57161 -5.31349 5.45437 -0.929284 1.71034 -7.05985 7.63288 -7.38418 7.45373 -4.14937 6.5167 -7.49989 8.6081 -9.28313 9.57721 -4.41285 5.1497 -2.96148 3.09221 -1.58256 1.66419 -4.45116 5.43488 -5.70927 7.11699 -3.61105 3.93153 -5.92285 6.63773 -3.50065 4.48453 -7.97338 8.96464 -0.541394 0.965435 -4.46469 5.03925 -7.33695 7.6484 -9.64234 9.6938 -4.16378 4.17886 -7.10741 7.31549 -1.51829 2.62477 -2.1892 2.9684 -9.23767 10.0462 -7.87649 7.97087 -7.05385 7.85952 -6.91232 7.50277 -6.60185 7.81572 -2.27112 3.90211 -5.74452 8.2018 -6.25117 6.26911 -0.525893 1.53447 -0.392956 0.959233 -3.51591 4.71055 -3.10449 5.41156 -7.35964 7.65642 -2.89831 3.54334 -3.42338 3.68259 -4.75496 5.51419 -3.8792 4.48395 -2.18007 4.13236 -3.15798 3.16864 -8.91248 9.21598 -8.54636 9.34037 -7.93697 9.79709 -6.40205 8.9653 -9.67332 10.2252 -4.31771 5.25423 -7.27485 7.3725 -6.22971 7.11411 -1.16538 2.16762 -1.40443 1.6876 -3.14915 4.58847 -7.13761 8.72165 -4.38448 5.88699 -7.98309 9.19449 -8.491 9.05597 -5.55043 6.19359 -2.44006 3.36071 -9.56522 9.79903 -1.86129 2.00225 -1.65239 2.11478 -7.59392 8.4655 -2.44709 2.68538 -6.80932 7.04694 -8.8212 9.4182 -0.276845 0.956468 -8.17008 8.5538 -0.77864 2.06897 -6.78458 7.68692 -0.504907 2.67518 -5.56963 6.9058 -3.42691 3.5414 -2.52065 2.71583 -5.09924 6.26696 -0.223724 0.610039 -3.61258 5.29324 -0.388393 3.11131 -2.87763 4.45415 -8.26438 10.1169 -5.89742 8.17506 -1.89686 2.66651 -5.33662 5.68228 -3.37496 5.67291 -2.25713 2.36127 -0.402185 0.716342 -6.4231 6.79227 -3.22707 4.69314 -7.85092 8.77413 -3.31322 3.72455 -5.43021 7.7167 -8.5883 9.00864 -1.21371 1.71836 -6.35584 7.9706 -5.44438 5.50414 -5.31325 6.11217 -6.08888 6.78794 -7.70604 8.13257 -1.29858 2.48753 -5.54083 6.38817 -8.23948 9.82646 -7.5575 9.0224 -8.00415 9.39763 -0.488455 1.55358 -4.48727 5.20741 -6.46648 7.02349 -0.355939 0.611119 -9.4892 10.2189 -2.61893 2.82832 -0.268193 1.24687 -3.01964 5.19554 -6.29954 7.42795 -8.70796 9.48366 -5.39307 6.64597 -2.47001 2.60746 -5.30949 7.46529 -6.07973 6.16835 -0.764507 1.6144 -7.94123 8.52143 -1.88244 1.96592 -6.42103 7.02205 -7.673 7.73208 -6.66891 7.80675 -6.9305 7.5431 -6.62335 6.93873 -4.34846 5.77621 -0.49878 2.82928 -2.65221 2.80109 -7.45348 7.74372 -4.10129 5.26894 -3.87782 4.19855 -4.62113 5.22658 -2.84558 2.88185 -2.53209 2.86065 -8.94932 9.21967 -6.48046 6.89614 -5.81885 6.66829 -6.49129 6.62015 -8.5663 9.58685 -2.43346 3.89849 -9.36561 9.45886 -1.40232 2.65 -6.66 6.74041 -2.87007 3.49668 -4.71138 6.0184 -5.03638 6.08494 -7.77735 8.14253 -1.0301 1.27179 -2.58337 4.04699 -6.95419 7.89775 -7.81164 8.62551 -3.37669 3.96217 -4.68541 5.58692 -4.79697 6.34841 -3.95334 4.81962 -9.44006 10.0941 -4.91098 5.12386 -8.44273 10.1565 -3.6685 3.73156 -5.07599 5.33357 --0.138235 0.260923 -2.71154 3.45603 -5.75096 6.16127 -4.4775 4.64308 -6.80557 8.97442 -5.49408 5.76652 -8.31937 9.12886 -3.26479 5.51673 -2.57425 3.03145 -2.42465 3.92714 -7.86505 8.50835 -3.29229 3.43549 -4.08537 4.69709 -7.83885 8.60616 -1.61622 2.72716 -9.10228 9.41907 -8.49325 9.46612 --0.174644 0.351716 -1.95648 2.14825 -8.28844 8.4428 -4.35888 5.59521 -5.1396 5.22537 -0.330835 0.879566 -6.14972 6.82967 -3.14811 4.89049 --0.231668 1.08277 -3.13526 4.94545 -8.32674 8.91046 -5.22364 5.48006 -9.84318 9.88416 --1.07813 1.6965 -1.5095 2.0328 -8.03716 8.2792 --1.01307 1.46703 -8.22096 9.0055 -8.9917 9.0415 -5.60623 6.74537 -3.15991 3.19314 -3.13863 3.26451 -0.739618 0.896958 -0.67599 1.18486 -3.37355 4.06303 -0.38605 0.410067 -3.03297 3.46387 -3.45867 3.79806 -8.67249 9.53278 --0.213855 0.787363 -1.52316 2.61117 -8.31846 8.59736 -4.84685 4.94042 -7.41901 7.82623 -4.99029 5.09747 -5.3637 5.37612 -3.22123 4.77749 -3.21668 5.74743 -3.48748 4.59962 -8.00016 8.56269 -1.63631 2.42239 -1.05159 3.72319 -7.22643 7.95706 -5.65694 5.99195 -9.4469 9.66915 -0.857984 1.59867 -4.05869 5.69955 -2.65788 3.07259 -1.8038 3.38748 -3.91934 4.89922 -6.18534 6.70342 -2.85076 3.20176 -8.1897 9.9614 -0.685531 2.05322 -3.31097 4.00809 -8.26537 8.63475 -2.90508 4.07797 -1.25213 2.31285 -3.05752 4.03741 --0.481913 0.605629 -1.87958 2.19386 -7.28689 7.76316 -4.82075 5.20688 --0.08115 0.31839 -3.50085 5.89363 -1.31184 3.30269 -4.03137 4.81493 -6.11688 6.13923 -7.93584 8.43321 -4.9838 5.3733 -3.8174 4.11979 -8.56196 9.02824 -2.87809 3.89589 -7.95309 8.05432 -3.47469 3.63716 -6.61009 7.12576 -8.87374 9.79588 -7.31513 7.99089 -5.78084 6.68535 -4.96985 5.59877 -2.20236 2.52473 -0.661014 1.11035 -6.36183 6.58403 -6.67947 6.85093 --0.242005 0.513902 -0.442966 1.72024 -6.4587 6.74016 -6.67958 8.0837 -8.98524 9.56405 -6.91409 7.59877 -3.73596 3.97705 -5.51193 5.96437 -3.72029 4.50126 -3.09896 3.23616 -8.83312 8.91774 -0.32173 0.486199 -4.21092 4.59955 -2.61616 4.07081 -1.89049 2.65559 -4.96401 5.00629 -9.33156 9.70914 -3.72455 4.61054 -8.91265 9.6563 -7.12401 8.04324 -6.65393 7.25572 -1.04032 1.24927 -3.0174 5.56006 -1.47645 2.26867 -3.49833 4.37416 -6.16877 6.34452 -6.47417 6.90595 -4.27056 4.92535 -7.60439 9.35352 -0.426219 0.754405 -8.5291 8.68579 -5.84717 6.64632 -1.99513 2.5284 -5.10669 7.83064 -6.99006 7.37272 -0.871836 1.5934 -3.6572 4.38875 -0.154617 0.290737 -5.91634 6.50415 -5.33982 5.45293 -6.92602 6.94691 -0.349512 1.61427 -8.02048 8.99943 -5.75598 7.34946 -5.86948 6.51327 -5.11707 5.6181 -6.27656 7.10043 -8.48922 9.73833 -8.35863 8.69746 -6.67829 7.07852 -8.51257 9.50383 -3.76636 4.33757 -4.82804 5.57166 -5.17892 5.61254 -1.35188 1.94069 -6.04969 6.06833 -5.34181 5.82455 -5.71714 6.71234 -0.966462 2.56278 -7.95169 8.15951 -6.53583 6.89673 -6.73246 8.34493 -8.71111 9.76467 -7.53215 9.56537 -0.619041 0.736713 -9.24399 9.50151 -8.57184 9.88538 -2.82682 3.77294 -4.2649 4.84602 -8.6621 8.96426 -8.04469 8.3189 -7.81877 8.42944 -2.78031 5.16589 -1.23076 1.43577 -8.35385 8.49632 -3.27901 3.66774 -0.595941 1.41354 -3.37123 5.16685 -9.11003 9.95515 --0.25959 0.32069 -1.44153 1.70148 -1.61595 1.70799 -7.8201 8.53423 -8.5402 9.36947 -8.39125 9.8221 -6.2909 6.35773 -0.000933745 0.920054 --0.21358 0.491025 -4.00874 4.03866 -3.43552 3.55874 -7.85942 7.98987 -7.6681 8.06748 -6.19541 7.14765 -8.53891 8.96393 -2.38789 3.26866 --0.0162847 1.18379 -1.04764 1.52755 -0.400798 0.55475 -6.32001 6.94897 -5.9692 6.2012 -1.20784 2.67873 -3.58247 4.46372 --0.229647 0.559407 -5.65979 5.73489 -2.32795 2.78462 -0.706144 1.55147 -4.56527 4.6636 -5.98901 7.20908 -9.27329 9.95152 -1.31296 1.70529 -5.82933 6.41329 -4.17452 5.29881 -4.15885 5.25117 -0.35549 1.3511 -1.0591 2.4463 -8.87597 9.55625 -6.66826 8.57255 -0.355945 1.40613 -5.39729 6.10218 -3.78791 4.37501 -9.53885 9.87184 -2.67568 2.82552 -4.44836 4.52939 -5.96764 7.40168 -6.35578 6.98546 -0.636857 1.19517 -3.3986 5.55448 -1.46493 2.66884 --0.0676901 1.80921 -7.83396 8.53452 -8.3508 9.04561 -4.03407 6.0066 -0.997538 3.30635 -7.83064 8.03466 -4.57652 4.97461 -3.85952 4.15471 -0.960261 2.1069 -0.522458 1.52989 -8.81627 9.00768 -0.172256 1.29455 -5.69294 6.15752 -6.86391 7.75307 -2.32429 2.95415 -1.83191 1.90364 -0.400855 0.705649 -5.23264 5.39972 -5.19047 5.79842 -2.40804 2.89401 -0.462887 1.43874 -6.70213 7.90229 -4.37985 4.95797 -3.73768 4.30645 -0.756797 2.11146 -0.458724 0.472099 -3.93098 6.47147 -5.5294 6.00365 -2.97106 3.42174 -5.75875 5.80235 -7.96799 9.02105 -5.36254 7.22823 -6.56124 7.39973 -9.49234 9.57879 -2.87576 3.59509 -3.49182 4.28124 -8.68021 9.94486 -9.60199 10.1276 -9.70115 9.81776 -3.09609 3.98732 -5.00113 8.15031 -5.21248 5.74835 -9.23337 9.5696 -2.92777 3.56297 -2.52044 3.04905 -4.79908 5.05762 -1.98626 3.69659 -4.78726 6.20637 -7.39711 7.42831 -4.44319 4.78716 -9.28452 10.0832 -8.00774 8.85707 -9.22947 10.0523 -4.38653 4.86012 -5.15285 5.23106 -8.95413 9.75947 -2.90286 3.32407 -0.348694 1.39738 --0.0660432 0.293424 -4.09079 4.2922 -6.0407 7.23031 -2.83771 3.72237 -8.54697 9.38898 -2.16742 3.45018 -8.83255 9.30343 -3.59112 3.6531 -7.53452 7.81898 -7.11781 7.19773 -8.2892 10.0259 -4.91072 5.06031 -5.8232 7.25924 -7.0641 8.31604 -9.477 9.63892 -5.8003 6.58306 -9.63988 10.2754 -0.654364 1.02398 -5.9488 6.85043 -7.86867 8.99891 -9.202 9.46902 -4.17932 4.20271 -6.50328 6.71085 -7.19848 8.15579 -5.62459 5.75449 --0.159668 0.791409 -7.55683 8.7315 -1.03278 1.423 -0.751457 0.808785 -6.2203 6.50634 -1.64418 2.98238 -6.87468 7.00652 -6.36966 6.7117 -7.69893 8.89535 -0.419794 1.05032 -2.73928 4.31548 -0.409245 1.55228 -6.03905 6.39323 -0.409695 0.789834 -4.39148 4.40935 -1.14673 3.23607 -5.85562 6.44503 -6.87394 6.88742 -3.761 4.35136 -7.2208 8.01436 -6.49839 6.54002 -4.70791 5.91886 -4.24906 5.96619 -2.53482 3.91496 --0.369254 0.69193 -4.81351 6.31088 -9.76066 10.0736 -1.4413 1.55942 -7.21917 8.88908 -6.03521 7.56826 -1.25568 1.42024 -5.47575 6.04431 -1.43099 1.99979 -5.1004 6.04088 -6.54798 6.56118 -1.0142 3.1564 -1.75267 2.1453 -1.28133 1.36044 -9.60996 10.0563 -1.14397 1.50247 -6.86688 7.08724 -8.38287 9.18041 -0.132076 1.27657 -6.52553 6.9301 -0.223917 1.41325 -1.18902 1.79753 -1.40084 1.75678 -1.94524 2.51929 -1.98276 2.62875 -0.763281 1.05483 -7.97952 8.51249 -1.059 3.05463 -5.33401 5.85094 -8.37442 8.64374 -6.62865 6.67315 -1.01707 1.64386 -0.113335 2.23523 -6.71906 8.00216 --0.886574 1.29366 -4.20078 4.85294 -8.43336 9.06988 -3.55413 4.40768 -6.69076 9.01132 -6.18982 7.14109 -7.14381 7.7046 -8.63195 9.47031 -8.88052 9.84886 -3.34443 3.62637 -4.5862 4.72832 -4.95757 5.23571 -2.85993 4.04966 -1.43846 2.27425 -5.43112 6.30496 --0.452609 1.55525 -7.17706 7.71287 -5.78537 5.79579 -8.51102 8.9466 --0.472904 0.810489 -3.83688 4.24045 -8.04432 9.04582 -1.57259 3.37136 -1.22231 1.33582 -5.73006 6.26477 -2.90855 4.22125 -9.39717 9.4287 -3.63873 4.16094 -0.442035 2.08889 -0.294491 1.31124 -3.14755 3.86305 -6.57634 9.44898 -2.19051 2.41878 -4.99277 5.12569 -4.10425 4.9423 -4.83547 5.62769 -5.73879 5.78179 -8.90329 9.81905 -5.60168 6.17538 -5.83843 6.66128 -1.84271 2.57406 -3.01047 3.33662 -2.85037 3.79158 -3.49007 4.46877 -8.58942 9.51529 -0.613753 1.12824 -8.23757 9.54707 -9.27134 9.4196 -6.27126 6.56417 -2.17206 2.33018 -3.53588 5.17162 -8.6312 10.0868 -5.76342 6.66164 -9.01501 9.90984 -3.22004 4.18954 -4.37918 4.68595 -2.00928 3.49815 -6.64229 7.06693 -2.85962 4.58794 -8.45587 9.8897 -2.8481 3.65956 -8.65849 8.67336 -6.48486 6.58637 -5.82336 7.45254 -4.02267 4.59696 -2.24997 2.83815 -8.16201 8.55518 -7.40645 9.07085 -1.43137 1.50333 -8.7212 10.9419 -1.50523 2.44124 -1.92455 2.85819 -4.50866 4.53052 -5.75781 5.81275 -1.71013 2.0282 -9.31592 9.9015 -6.14972 8.18798 -1.85705 2.20068 -4.80971 5.10509 -3.31201 3.58168 -8.61824 9.31861 -7.19497 7.86933 -3.25381 4.53472 -5.62799 6.29537 -9.00659 10.021 -9.15156 9.74827 -2.0324 2.80741 -0.714403 1.00476 -1.26522 1.80417 --0.362995 0.41758 -7.08785 7.71544 -5.55685 5.74045 -0.428866 3.03773 -7.61574 8.94894 -9.07256 9.69772 -4.49537 5.06822 -5.66388 6.48899 -1.69126 2.69607 -9.90539 10.0783 -6.56455 8.27128 -6.61988 7.86616 -7.42012 7.64493 -2.99922 3.35282 -4.69379 5.18947 -0.87894 1.30518 -9.47632 9.61234 -0.665754 0.855958 --0.422778 2.11197 -3.38786 4.15441 -7.57236 8.75855 -1.89832 3.50224 --0.185929 1.0777 -3.32911 5.53465 -6.91111 8.69247 -6.97456 7.86905 -4.75518 5.0948 -4.23733 5.83368 -8.52456 8.56086 -0.0978267 0.136564 -7.4668 7.99757 -5.52851 5.80858 -8.5833 8.88589 -5.10603 6.41348 -4.70682 6.59981 -8.60265 9.19477 -5.04514 6.24014 -4.49041 4.88669 -7.40925 9.15624 -0.80364 1.35315 -7.11604 8.01153 -0.267749 0.714089 -0.121521 0.822226 -9.30556 9.81307 -2.11398 2.92567 -5.97722 6.08022 -7.13483 7.22211 -8.00161 9.27274 -4.87681 5.51654 -3.11843 3.84311 -5.17747 5.98482 -3.6077 4.46306 -1.37454 2.2443 -4.93385 5.96357 -2.92184 4.0964 -4.88767 5.56353 -2.87394 3.76336 -0.326521 0.622872 -2.42056 2.45007 --0.527891 0.827211 -6.73151 7.20155 -1.82048 2.54905 -1.35563 1.88701 -3.64202 4.10669 -5.22846 5.23953 -6.06271 6.46993 -2.71418 3.2081 -6.41179 7.57176 -7.45823 7.79609 -1.01227 1.39137 -9.0872 9.20132 -5.083 5.64038 -5.63236 5.97945 --0.317645 0.822313 -0.865396 2.65587 -5.71839 5.98983 -1.50978 2.08611 -2.95824 3.70996 -0.264301 1.02233 -8.22351 8.98589 -4.87805 5.24127 -2.31329 3.46752 -6.19539 6.69676 -5.18643 5.40947 -7.15453 7.66643 -1.20694 2.25111 -7.87378 7.89093 -5.16514 5.604 -8.68354 9.01395 -7.33753 9.37499 -2.94627 4.06036 -8.64337 8.85727 -0.0353092 1.0128 -6.98437 7.35718 -6.77073 6.79959 -3.13559 3.70735 -7.40139 8.27017 -4.01174 4.39788 -3.22281 5.11647 -7.79256 8.58737 -0.642233 1.39694 -7.18603 8.69453 -3.37803 3.59355 -0.762287 0.84262 -4.21823 4.52565 -0.894924 1.35434 -0.844327 1.19938 -5.57958 7.05431 --0.631066 1.55134 -3.78962 4.17935 -9.15329 10.4824 -5.47536 5.52975 -8.81243 9.16088 -4.45989 4.94123 -8.68235 9.45112 -8.04719 10.3938 -8.87349 9.40483 -0.502543 0.570283 -2.08512 2.47652 --0.654512 0.804355 -3.68569 5.21711 -5.33017 5.80226 -3.44991 5.31415 --0.00417763 2.95077 -7.17784 7.9318 -1.2721 1.31642 -5.24415 5.64173 -2.79434 3.28746 -4.54991 6.49276 -4.74707 5.12555 -7.36365 8.15777 -0.913049 1.79828 -1.47498 1.83425 -2.64271 3.38567 -4.78159 5.44718 -7.6087 7.66442 --0.484393 0.909893 -3.16824 3.23757 -4.43021 5.90284 -4.25954 4.74995 -6.58742 7.24125 -1.86151 2.27069 -3.16459 4.5945 -1.06471 2.08965 -3.31028 3.83029 -1.52593 2.47521 -0.703789 1.42451 -1.47969 1.68923 -2.92352 4.24089 -9.84088 9.93485 -3.18205 4.27817 -7.39345 7.78945 -3.78808 5.41572 -4.38624 6.75693 -6.93065 7.16977 -1.01289 2.19807 -3.37006 3.54196 -5.50238 5.58285 --0.225113 1.99347 -1.67796 1.86943 -6.1999 6.35102 -3.80494 4.74814 -1.13294 2.02639 -1.1965 2.6548 --0.284453 0.856092 -4.26565 5.02196 -9.66948 9.88874 -6.20287 6.25528 -4.38154 6.65806 -3.77411 4.3075 -5.77177 6.78486 -9.16311 9.816 -3.22861 3.42009 -3.36573 4.34724 -6.76951 7.58025 -4.83813 5.23042 -3.87192 4.37372 -5.56859 5.90066 --0.368163 1.4593 -5.44031 7.81671 -2.66342 2.99253 -6.11846 7.69499 -4.98811 5.17531 -4.45078 4.67513 -4.88206 4.94128 -2.51813 3.0268 -0.461292 1.15264 -2.34766 4.48652 -0.198819 2.23425 -6.85634 6.98248 -0.912438 1.81872 -4.84933 6.34912 -5.15613 5.82891 -0.172772 0.994083 -3.37381 3.64549 -1.98836 3.2697 -1.64344 2.06049 -0.766585 3.09305 -7.8979 8.28046 -4.34856 5.01341 -6.69809 7.24239 -5.19034 7.04959 -5.3747 6.92123 -7.8893 10.1251 -6.11207 6.99125 -5.37115 6.84111 -9.04786 9.11002 -6.45326 6.64415 --0.76294 0.92832 -0.980411 1.8166 -3.05536 3.50031 -6.10827 7.55786 -6.57848 9.06264 -7.66855 8.861 -4.80276 4.82283 -1.99932 3.2877 -9.45229 9.80653 -0.457474 0.778684 -5.44444 5.95239 -5.60974 8.05169 -7.64656 7.79632 -6.78372 7.65134 -6.93878 7.82023 -9.08292 9.55308 -9.16329 9.25802 -1.4909 2.38688 -4.31881 5.3564 -5.12535 5.60119 -2.44591 2.54637 -7.36929 7.80452 -2.13707 2.97655 -9.73557 9.94588 -1.96637 3.36097 -0.857068 2.29643 -5.58224 5.91142 -8.90714 9.0255 -9.77988 10.0711 -0.41121 0.970955 --0.518356 0.91447 -7.58725 7.71255 -8.1435 8.78712 -6.5487 7.17991 -4.94961 5.50283 -8.14086 9.03281 -3.51281 5.24806 -3.5786 3.84066 -6.27435 8.37735 -8.65263 9.5555 -2.87484 3.56117 -5.57707 6.55879 --0.111276 0.264178 -3.60894 4.15477 -2.82322 3.64397 -8.40669 9.1127 -8.43089 10.5298 -1.38472 2.2453 -1.74464 2.00472 -4.01588 4.67572 -0.408869 0.938602 -2.06155 3.46067 -4.4871 5.08963 -2.4435 3.87355 -1.32864 2.55801 -4.78579 5.26122 -7.43027 7.57749 -6.90971 7.32716 -8.01095 9.46872 -9.41627 10.524 -8.83143 10.4474 -0.631816 1.75513 -1.72965 2.17123 --0.513239 1.1886 -6.75616 6.7984 -2.49278 4.26493 -0.230011 0.966298 -3.78506 4.95013 -2.03886 3.14808 -7.87309 10.5637 -3.54564 3.58055 -1.91974 2.9194 -4.8503 4.98668 -4.66494 4.83558 -7.57916 8.24358 -4.78743 5.38547 -2.81034 3.34534 -1.00297 2.0138 -6.87593 7.17736 -3.93157 5.0655 -3.10361 4.05519 -8.22876 8.38326 -7.48377 8.31026 -2.23106 3.4905 -0.130934 0.606709 -1.22344 2.55898 -7.55829 7.92597 -4.10977 4.86263 -0.122756 0.264176 -3.8357 4.15854 -1.28414 2.13031 -0.280029 0.805504 -2.88245 4.1704 -5.57936 6.94781 -6.22719 6.33201 --0.761013 1.16475 -6.16636 7.12566 -2.98935 3.192 -2.23263 2.34362 -3.9082 4.11692 -2.66865 3.5275 -1.87676 2.43966 -4.60035 5.39332 -2.74287 3.73097 -2.81953 3.96666 -5.73644 6.04042 -4.02179 4.52419 -3.26438 4.07346 -1.22509 2.13719 -7.91885 9.71846 -1.28152 1.48079 -7.97918 9.26344 -8.75682 9.8677 -7.25678 7.45362 -8.16161 8.87066 -1.21873 2.37224 -7.76739 9.06346 -3.89932 5.03406 -3.53901 4.37006 -2.93795 4.04333 -6.36543 6.72985 -4.72622 4.98804 -1.86205 1.99008 -0.784581 2.05264 -0.978519 2.91723 -3.9067 6.47195 -0.735425 2.38151 -8.37394 8.41609 -6.91804 7.23374 -9.39259 10.1026 -7.28732 7.43466 -4.75982 5.44264 -6.71504 7.53933 -2.17125 2.54358 -0.703562 1.39087 --0.221711 0.541965 -9.22839 9.39159 -9.53465 9.97585 -1.44304 2.53666 -7.886 8.85051 -9.33174 10.1632 -2.60898 3.42889 -1.73658 2.02589 -6.31651 6.77762 -7.26755 8.34499 -9.01312 10.9837 -7.47361 8.96251 -7.98365 8.02586 -1.40065 3.44891 -9.44617 9.55391 -8.24265 9.34849 -9.366 10.4216 -0.375354 1.17522 -3.37114 3.38278 --0.742469 1.07634 -4.29988 4.81879 -4.18605 7.21928 -7.41047 8.29198 -6.68173 7.60225 -3.24292 3.30695 -1.8951 3.42167 -3.97359 4.2857 -4.72621 5.80575 -4.75014 5.02239 -6.43454 6.94568 -7.16601 8.10355 -2.16685 2.23666 -6.70852 8.63284 -8.16988 8.95848 -0.277002 1.30648 -1.5803 2.28632 -2.22634 2.34679 -0.200623 0.814959 -5.27457 6.51651 -2.49533 2.90705 -6.48922 6.69528 -8.18879 8.63551 -2.75159 3.633 -0.884853 1.56434 -1.87488 3.98951 -4.24783 5.17713 -6.22499 6.56095 -5.68238 5.99272 -3.75553 3.85012 -4.87543 5.39966 -6.62671 8.72493 -3.50262 4.05131 -5.38952 5.4974 -7.84971 7.94051 -5.39123 6.66564 -5.43986 6.17256 -7.48968 7.7677 -4.2685 4.57296 -1.75169 4.11058 -5.03634 5.16102 -4.68003 4.84715 -8.36249 9.98761 -8.94297 10.6969 -6.21572 6.24305 -7.90303 8.0672 -7.90426 8.41244 -5.98512 7.93187 -5.13297 5.27136 -6.58367 7.4971 -4.72663 5.22956 -7.99667 8.59246 -4.3303 5.92188 -1.3132 1.80875 -7.70104 9.20947 -1.78862 2.00473 -9.63678 9.65571 --0.264416 0.318054 -2.70004 3.40777 -2.74642 3.73608 -3.6494 3.6743 -8.03113 9.22851 -1.07526 1.3116 -4.05436 5.33291 -4.60907 6.03605 -7.83426 9.10358 -2.27997 2.77309 -5.63139 6.92616 -4.40717 5.25214 -1.98986 3.5062 -2.42393 2.9584 -1.94336 3.08456 -1.20185 3.01827 -0.641733 2.10095 -7.25046 8.29391 -0.640392 1.26451 -3.9588 4.85492 -6.83036 7.41101 -6.48581 7.08757 -6.48734 8.47856 -9.55084 10.3774 --0.173137 1.26574 -2.32702 2.58775 -2.7463 3.13914 -7.86951 8.62807 -5.96916 7.92759 -0.217046 1.70373 -1.04207 1.05755 -4.79058 5.07902 -4.19024 5.35395 -9.00175 9.83715 -8.37554 9.275 -4.5204 4.82999 -3.49936 4.75519 -7.07916 7.74619 -6.66726 7.35282 -7.39513 8.55523 -7.50381 9.60708 -1.39304 2.26927 -2.84101 4.76376 -1.21779 1.59353 -4.7893 5.70143 -9.12195 9.57131 -5.40461 6.15443 -2.86445 4.26837 -8.01324 10.9082 -2.96659 3.8042 -2.4897 4.59323 -6.37887 7.15878 -7.00143 7.6419 -3.22491 3.41843 -1.22852 3.31783 -2.09881 2.56121 -4.43205 4.67051 -4.39328 4.66715 -2.38355 3.39058 -0.638802 1.59399 -5.32717 5.81376 -8.00353 9.72007 -8.77281 9.81649 -8.95552 9.86609 -2.90915 3.96556 -3.88176 4.93124 -6.45945 7.69942 --0.108577 1.57424 -0.304992 0.320561 -6.47789 6.5515 -1.98211 2.05312 -6.2741 7.35626 -9.45057 9.67918 -5.2916 5.48037 -0.158802 0.712187 -6.42002 6.84323 -9.11085 9.13063 -9.42446 9.95882 -6.03624 6.96469 -9.2473 9.6286 -7.10342 8.71163 -3.34072 3.35187 -7.4602 8.58506 -8.7963 8.81873 -0.323615 2.22687 -0.326746 1.76681 -2.20062 2.76862 -7.55181 7.85006 -0.941035 1.28117 -8.76643 9.60019 -9.19731 9.33092 -6.0479 6.57293 -6.12725 6.24356 -7.53078 8.92488 -3.1841 3.48283 -1.85544 2.01888 -7.3849 9.29183 -5.03915 5.27721 -4.77142 5.46282 --0.291696 1.14641 -1.61367 2.20867 -5.31853 6.69431 -2.52731 3.13139 -4.86677 5.18106 -4.50183 4.60969 -5.95881 6.09964 -2.41939 4.42026 -6.92003 7.17891 -4.29584 5.48557 -8.02803 9.06315 -2.82326 3.49599 -5.8647 5.87561 -2.38814 3.62688 -6.32418 7.17662 -5.99907 6.5059 -3.84698 4.14446 -9.80728 9.82132 -5.2366 6.30871 -9.81878 9.91004 -1.53024 1.83525 -2.98035 3.68531 -4.5418 6.98786 -5.19561 5.9846 -0.946068 1.46672 -3.26948 4.71928 -6.13476 7.68682 -8.36934 9.65072 -6.40074 7.14762 -1.01349 1.80493 -8.4514 10.25 --0.180382 0.682704 -1.03041 1.63565 -5.64642 6.96069 -2.73598 3.67485 -5.8705 6.66157 -4.68343 4.7176 -5.83787 7.6818 -1.42529 2.234 -3.73726 4.19241 -5.38341 5.81884 -1.13088 1.69073 -0.968034 1.98828 -1.06007 1.11039 -3.50129 4.51807 -5.83133 6.77904 --0.334945 1.29129 -0.326706 1.16015 -9.15028 10.4391 -5.13047 6.79712 -1.06952 1.38997 -5.79345 6.49898 -7.88149 8.5143 -8.00404 8.09794 -8.22725 8.28904 -6.38406 6.61356 -6.32166 6.73458 -7.17066 7.32049 -1.64338 3.79327 -7.92135 8.55568 -7.15578 7.42231 -6.70701 7.65427 -5.76608 7.63064 -3.54163 4.08662 -3.81402 6.76906 -4.5998 4.61865 -9.01471 9.18718 -5.21234 5.73335 -0.946018 1.39917 -6.99714 8.29739 -5.64458 6.93965 -3.39809 5.70907 -6.32284 6.83604 -8.50347 8.53097 -3.90118 4.85721 -9.41198 9.62076 -4.41514 5.55152 -7.69979 7.81249 -5.34434 5.37105 -7.25274 7.76114 -7.67383 7.92718 -5.82851 6.29417 -0.935651 1.2842 -0.639586 0.786771 -6.39823 8.31226 -3.67546 4.89035 -9.20323 9.57287 -2.33896 2.99576 -8.51933 8.80243 -0.983098 1.11084 -8.48215 9.42998 -7.29586 7.3914 -2.00695 2.89046 -2.60909 2.62433 -2.04118 2.92033 -7.60386 9.01419 -7.32896 7.73342 -9.51693 9.54891 -5.1323 5.24962 -6.35326 7.18302 -2.50952 3.51872 -3.4149 3.57431 -9.18412 10.4976 -5.68123 6.42697 -5.87758 6.0124 -6.3202 6.64588 -8.2547 9.98176 -5.50949 5.7854 -0.0824268 0.128178 -2.17292 3.76233 -7.22786 7.68214 -5.09326 6.4151 -4.30171 4.86688 -2.39206 3.47399 -7.95152 8.35556 -2.40133 2.936 -2.77819 3.87516 -3.252 4.33376 -9.54269 9.7513 -6.6747 6.73043 -0.611474 1.97158 -7.65864 8.53689 -1.58345 1.8017 -2.56917 2.8152 -8.5424 8.8301 -4.98159 5.44499 -5.82482 6.03578 -3.55509 4.90785 -5.77028 5.94747 -0.163965 1.1379 -2.85039 2.94261 -4.24343 4.67273 -3.22636 4.06084 -6.03662 6.21018 -4.55495 5.07697 -1.91173 2.51739 -6.54894 7.24036 -5.55502 6.92676 -0.245707 0.586188 -2.28044 3.29563 -4.71378 5.25198 -8.28953 8.44891 -9.42282 10.179 -5.0548 5.73614 -6.3203 6.43659 -6.54178 8.82077 -3.67181 4.17365 -8.51445 8.96445 -1.69648 2.84524 -0.194222 0.920147 -2.48533 2.59803 -1.66002 1.6739 -4.79833 4.95404 -1.09801 1.11009 -6.62529 7.4066 -8.0099 8.37262 -3.55429 4.11824 -6.2666 7.12137 -7.83222 8.01342 -9.37156 9.72961 -1.1647 4.04434 -4.50719 5.09068 -3.25175 3.75482 -8.28659 9.30848 -7.30009 8.60755 --1.12073 1.21016 -0.310087 0.725712 -8.3746 9.13511 -9.11925 10.2234 -9.68703 9.7137 -0.603098 0.844291 -5.88373 6.99327 -0.852802 1.43297 -3.7463 5.82283 -7.69639 8.25446 --0.337322 0.977113 -8.76606 9.16618 -3.43527 3.6616 -3.93587 5.39471 -5.66569 7.20462 -5.34999 5.7193 -3.25589 3.706 -1.52012 2.55985 -4.74228 5.43725 -5.15323 5.51652 -7.77237 8.33717 --0.0514419 0.914127 -9.27182 9.59476 -8.14192 9.74859 -6.42702 7.20331 -7.51351 7.68358 -7.0947 7.46059 -7.97635 8.59449 -2.39931 2.66008 -5.79481 5.94673 -4.41054 4.81613 -2.72202 3.61239 -2.86039 3.44719 -1.81115 3.28151 --0.566995 0.734214 -9.61998 9.72024 -7.4163 7.61821 -0.42522 0.552659 -3.17617 4.36942 -0.740294 1.36953 -7.13755 8.39966 -0.219186 0.892588 -3.78307 5.2905 -0.783026 1.76155 -3.01893 3.33055 -3.12143 3.5713 --0.792679 0.92539 -0.668572 1.12961 -3.88619 4.30545 -7.59276 8.1776 -4.71509 5.05622 -6.53406 7.04242 -1.581 2.21984 -4.7144 5.51372 -2.76338 3.50211 -0.16364 0.293599 -5.92365 6.10636 -3.11174 4.29165 -5.49295 6.48717 --0.503239 0.795707 -7.30558 8.12408 -2.10674 4.13456 -7.11985 8.01932 -1.34672 1.48739 -4.05778 5.69084 -2.83686 2.9115 -6.4471 6.53909 -0.467374 1.84371 -2.76467 2.94177 -4.87867 5.33932 -0.892878 1.96273 -1.13934 2.27205 -7.76918 8.39409 -6.72181 7.43901 -7.0836 8.68472 -7.12924 7.56332 -0.689172 1.62922 -9.41146 9.91043 -0.398265 1.27579 -6.29966 7.4874 -5.09438 5.65334 -6.04623 6.4687 -5.75305 6.89731 -0.308118 0.459501 -3.63692 4.30501 -3.1755 3.71009 -7.32787 7.52785 -2.23235 4.09978 -2.71191 2.91513 -0.209457 0.840713 -7.31489 7.38296 -6.21245 6.91111 -5.75983 5.96049 -5.92056 8.24518 --0.354452 0.489638 -4.05894 5.34828 -1.56299 1.57414 -2.85083 3.27455 -8.78323 10.0012 -0.208502 1.26471 -6.10824 6.79285 -5.55114 8.03968 -6.13077 6.32342 -7.34865 7.82592 -3.94835 4.75016 -7.8268 8.72249 -4.85131 5.07903 -5.40398 6.0134 -2.85971 3.85293 -0.126379 1.45545 -3.15768 4.28388 -9.64566 9.70016 -4.47514 6.31064 -6.44995 7.2894 -4.70992 6.13777 -3.91128 4.22263 -7.35627 8.07739 -2.49215 2.68749 -8.09946 9.16929 -0.925679 1.92784 -8.48437 8.63892 -7.2255 9.18109 --0.00840282 0.0168954 -5.91933 6.6274 -4.16086 4.64302 -8.27009 8.47868 -1.73372 2.93094 -8.17421 9.17705 -9.19136 9.43222 -0.0653594 0.648416 -8.69 8.96184 -8.99355 9.40832 -6.25088 6.26945 -6.72391 7.38424 -9.59708 10.3496 -6.00971 6.18818 -4.64468 5.75797 -3.64832 5.30079 -5.99378 7.8792 -6.5388 6.99379 -7.31694 8.43802 -3.66227 4.92638 -9.55964 10.3796 --0.14433 0.29095 -3.56716 3.71252 -3.82062 4.27788 -8.10405 9.35275 -7.17891 7.46539 -1.17698 1.29602 -4.48829 5.03134 -7.18025 8.13852 -9.42388 10.3634 -5.2158 6.17469 -5.22926 6.52397 -5.16731 6.40625 -6.53348 7.269 -2.07834 2.39172 -9.65044 10.1519 -8.64551 10.1294 -9.29006 10.5993 -1.50639 2.83173 -5.71675 5.99216 -3.0783 3.35571 -0.115401 1.31431 -8.03988 8.11942 -3.11917 4.53956 -1.14552 1.1646 -5.34782 6.43017 -0.0701702 1.0368 -0.183335 0.440704 -6.33438 7.71607 -2.11533 2.64323 -7.12104 7.13366 -7.21548 8.26968 -3.13445 4.13568 -4.57452 4.74602 -2.60889 3.69846 -7.21184 7.47573 -6.87651 7.03405 -2.65431 3.94352 -1.50006 1.70087 -6.16344 7.54429 -7.02057 7.73067 -8.27833 9.01489 -0.500833 0.597845 -8.34751 9.88925 -2.80242 2.91837 -5.29424 6.079 -8.36276 9.10074 -0.216887 0.268335 -1.30798 3.16393 -3.93851 4.22658 -2.58028 3.14744 -9.31131 10.3451 -7.37262 8.84852 -4.45306 5.6723 -3.74535 4.0721 -4.90174 5.63875 -3.41847 4.65199 -3.10265 3.82548 -6.56126 6.97557 -2.57449 2.95098 -7.97418 9.06301 -9.2203 9.66829 -4.64922 4.96305 -8.83034 10.115 -6.6685 6.89847 -7.36585 7.48669 -8.66761 9.39287 -0.562216 0.961875 -7.56292 7.81006 -8.50715 8.95572 -0.572825 2.24755 -5.9367 6.06766 --0.769578 0.776163 -4.48224 4.9553 -8.21069 9.29643 -8.57206 9.47175 -1.10032 1.21371 -3.76306 3.87152 -6.46197 8.18457 -6.96501 9.70727 -3.42357 3.93484 -0.818601 2.42743 --0.119739 0.397938 --0.378761 0.523892 -8.03394 9.35409 -3.60283 3.98864 -2.21789 2.70607 --0.255329 0.319063 -6.20806 6.22609 -7.1283 8.04391 -3.73565 4.03638 -8.5374 9.10987 -5.22675 5.35072 -7.51777 7.58439 -9.12636 10.4159 -9.15003 9.40672 -0.217863 1.19883 -9.42416 9.9178 -2.55337 3.8088 -7.03655 7.98242 -9.17171 9.8047 -0.110162 0.722738 -3.16467 3.58897 -6.47244 7.12961 -1.0456 1.65614 -1.58456 1.62844 -1.79039 1.84035 -6.24286 7.07838 -9.08631 9.11684 -3.05068 3.40838 -2.81212 4.03665 -2.52011 3.09841 -8.06001 8.16356 -7.07649 7.52685 -2.47666 2.86548 -8.66241 8.95103 --0.298116 0.662697 -0.822443 2.46125 -2.07619 2.33674 -4.84135 6.21034 -7.49625 8.13026 -7.85854 8.29618 -3.01722 3.37062 -6.54393 7.30306 -2.21113 2.30166 -8.32138 8.57349 -6.2995 6.33514 -3.0018 3.56886 -4.63378 5.52214 -6.71908 8.96715 -2.29809 2.95581 -8.34947 8.71096 -4.96902 5.32075 -9.51051 9.72733 -3.311 4.77789 -3.50233 3.66309 -4.95177 5.76002 -6.12876 7.22391 -6.27743 6.79393 -3.60638 3.6833 -5.20305 5.50848 -7.16065 8.88358 -9.45049 10.2539 -6.16892 7.0314 -8.08479 9.74516 -0.0717867 0.669987 -2.17569 3.34098 -4.81716 5.7509 -7.63999 8.01157 -5.87228 6.60363 -3.39621 4.35575 -4.96079 5.07901 -7.57639 8.82003 -8.27285 8.52609 -0.665858 1.64782 -1.74256 2.07126 -6.19512 6.4258 -0.664592 1.30896 -0.180682 1.43746 -6.46752 6.81303 -2.55562 3.08708 -9.33695 9.63312 -6.33821 6.77092 -7.88252 8.55026 -8.17937 8.45385 --0.415294 0.793096 -5.22077 5.54553 -8.67808 9.10041 -1.72096 1.92024 -0.492778 1.48076 -2.29514 2.88531 -0.0934389 1.37614 -8.40297 9.11121 -3.66605 3.91717 --0.274468 0.867811 -9.41428 9.56659 -1.22657 2.12792 -8.71336 9.85384 -5.09347 5.42905 -2.02877 2.36652 -5.99112 7.40703 -0.911618 3.48138 -4.84352 5.11131 -1.16309 2.08613 -5.58561 5.84805 -0.663543 1.08921 -1.83189 3.93269 -4.07731 4.38879 -4.04789 4.9989 -2.09457 3.61279 -2.00982 2.94396 -7.37537 7.66574 -5.08648 5.80122 -9.19959 10.2263 -4.26136 4.86194 -6.67875 7.61134 -1.27462 2.48399 -7.2237 7.82324 --0.0141009 0.0441377 -8.32069 8.36192 -2.82562 3.0717 --0.528918 1.25301 -1.90486 3.04714 -1.34489 1.75301 -3.14332 4.03322 -8.55351 10.8681 -9.09824 10.3828 -0.496868 0.622499 -7.11112 7.62765 -0.335233 0.528962 -6.71335 7.13937 -6.78574 7.71172 -9.13568 9.22251 -7.10299 7.64765 -3.64747 4.06685 -8.64041 9.40111 -2.43515 2.93081 -2.95476 3.68588 -0.0863751 0.777976 -6.5891 8.18165 -8.80986 10.0735 -0.568868 1.63785 -4.41677 5.42049 -8.72857 9.88426 -3.67467 4.25442 -8.98168 10.1087 -5.08611 5.50098 -1.28982 2.34422 --0.914176 0.969847 -4.35042 4.42735 -4.02282 5.08164 -9.00566 9.4791 -2.71821 3.24065 -3.20252 3.24988 -8.61559 9.6733 -3.15157 4.7685 -3.59348 4.67872 -0.286864 0.36279 -8.40374 10.528 -7.53647 8.13523 -6.81591 6.90226 -7.68111 9.10704 -8.37958 8.73818 -3.25808 4.40893 -1.50348 3.00641 -0.20803 1.40949 -3.93771 4.84177 -2.79232 3.35329 -4.2666 4.63588 -0.341784 1.46241 -1.53063 2.06724 -8.58212 8.86194 -8.95411 9.70651 -8.71591 9.26292 -6.66088 6.7009 -3.95881 5.93917 -8.5823 8.76007 --0.308958 0.34174 -1.03188 1.37677 -7.52675 9.84031 -4.27952 4.32984 -1.83465 2.27607 -8.12096 8.64922 -2.22605 4.40067 -0.00929139 0.871342 -0.376531 1.29354 -3.5257 4.30165 -1.95846 4.09589 --0.200922 0.799272 -0.24432 1.76673 -4.73477 5.06514 -8.97059 9.2276 -2.89618 2.93969 -0.168256 1.03325 -3.44522 3.83622 -2.74889 2.76042 -6.07155 6.7979 -9.06484 9.09804 -7.56658 9.29215 -4.3084 5.45621 --0.0786996 1.12809 -8.48249 9.74107 -6.4196 6.61469 -1.57119 1.87612 -3.15463 3.86251 -2.0089 2.57741 -6.53618 7.12035 -7.07901 7.29396 -0.114756 0.887413 -8.90806 9.65731 -4.0921 5.23407 -2.63441 2.92344 -4.31769 4.98832 -8.90336 9.26837 -8.25313 8.91204 -2.87758 4.00212 --0.708243 0.789072 -3.28656 4.55872 -5.73177 5.80293 -5.40596 5.5844 -4.09318 4.57774 -6.16178 7.00613 -8.5514 10.5495 -6.83987 7.3056 -1.06341 1.97923 -7.82153 9.00722 -0.923069 1.42337 -1.83408 2.82331 -5.75305 7.23576 -0.241909 0.96721 -1.16645 2.10491 -5.41819 6.09839 -7.49242 7.69495 -0.347233 0.383681 -2.33245 2.53467 -4.91249 5.27759 -8.11182 9.2758 -0.0955456 0.548659 --0.359909 0.48055 -1.64759 3.47097 -6.37855 7.40015 -0.423283 2.08857 -4.10068 4.46856 -2.58389 2.69626 -0.848483 2.72258 -8.67321 8.88903 -2.07607 3.42398 -3.11033 3.80741 -2.24735 3.48626 -8.11883 8.7687 -0.29959 1.41603 -4.84924 5.13641 -1.44102 1.74592 -1.13437 2.50296 -1.75876 3.09859 -4.75363 5.90838 -7.36423 8.20074 -5.51578 6.42652 -0.915633 1.86015 -9.44679 10.3479 -2.61691 3.60215 -6.26524 7.2538 -2.74326 3.12649 -5.83934 6.98592 -9.1111 10.4891 -2.27066 2.82709 -8.19359 8.67233 -0.834236 1.7066 -6.19288 7.21392 --0.249843 0.891821 -2.5652 3.25132 -5.25356 5.88905 -3.99545 4.18918 -1.93186 2.51527 -4.44621 4.82421 -5.89181 7.36963 -2.77321 3.60627 -2.76444 3.88016 -2.50062 2.66105 -1.14846 1.66146 -2.951 4.81656 -3.81976 4.01061 -4.75674 5.59916 -6.74092 7.08289 -2.09989 2.32514 -0.220723 0.865303 -5.48107 5.71875 -1.48372 2.88941 -0.484577 1.12051 -8.93618 9.7185 -1.89769 3.65655 -2.0129 3.55214 -9.23173 10.3694 -0.286189 1.22753 -0.453785 1.55541 -2.24068 2.6541 -8.80917 10.4969 -7.12801 7.15222 -9.25745 9.9103 -5.73429 6.76901 -7.54454 8.47157 -1.96008 3.74997 -8.00837 9.25665 -1.66384 2.07613 -5.53014 5.97461 --1.32495 1.33319 -4.58479 5.2263 -7.92048 8.75668 -6.87595 7.02522 -0.157713 0.389585 -7.48277 7.51261 -8.10714 8.38399 -0.0802723 0.587088 -1.13024 1.71135 -5.71769 6.84757 -3.08261 4.31054 -2.95952 5.09762 -6.62815 7.44256 -5.0805 5.8499 -3.38489 3.73265 -1.10644 2.18331 -4.70493 7.31686 -2.2253 2.6338 -0.778359 1.6265 -6.94211 7.2149 -4.20976 4.99342 -7.47792 7.67881 -7.06219 8.76137 -4.97677 6.12206 -6.30829 6.69361 -6.19977 6.76781 -9.67636 10.2172 -3.41958 3.69137 -0.374486 0.943711 -4.00837 4.80107 -8.85401 10.1325 -6.0938 7.8919 -1.51055 3.08998 -8.94594 10.3139 -1.06714 2.65511 -0.703202 0.850595 -4.87735 6.00659 -8.3067 8.39924 -7.78071 8.3155 -1.98737 2.81116 -6.86323 8.07974 -1.03479 1.34584 -0.490512 0.670211 -5.82122 6.1901 -5.50836 6.63385 -7.9192 8.9606 -0.913719 2.18983 -4.97151 5.70909 -4.19907 4.37712 -2.01188 2.63318 -7.84813 9.3771 -5.32667 7.48502 -8.50951 10.1006 --0.551637 0.930509 -1.06511 2.23353 -1.91111 3.42663 -9.37528 9.55327 -7.27975 7.38741 -3.46676 4.83165 -7.36137 8.70333 --0.295762 0.623228 -8.48558 8.81076 -2.71689 3.41873 -6.49265 8.11042 -5.25516 5.57336 -6.10462 7.05991 -8.76997 9.15164 -7.86196 8.30651 -7.82765 9.24604 -5.98573 6.34182 -6.45367 7.47857 -3.27018 5.10835 -1.3079 2.37423 --0.261387 0.338113 -7.60683 8.81791 -4.7346 7.41988 -5.25597 5.28517 -3.76704 4.52226 -3.91774 6.66976 -5.69618 8.92667 -1.86148 3.07531 -5.57404 6.51438 -9.39049 9.77921 -2.38692 4.21416 -6.84909 7.23633 -7.2379 7.58761 -4.73485 6.11606 -7.80013 8.08105 -1.72701 3.40244 -2.44475 4.4072 -9.72565 9.77726 -3.35288 4.06493 -8.91215 9.92325 -8.67991 9.65865 -0.253195 0.764339 -4.23564 5.59497 -1.84752 2.14986 --0.502957 0.528737 -1.32656 2.11347 -9.81563 10.0213 -7.60114 8.05035 -8.51797 8.83342 --0.394604 1.41267 -7.71614 8.63514 -0.530249 0.968898 -2.90463 3.01675 -7.58098 8.71658 --0.253747 1.28827 -1.832 2.39006 -7.2268 7.27225 -3.84076 4.66703 -2.2564 2.73185 -7.31508 8.46008 -4.99387 5.64948 -7.21239 7.79983 -7.60231 7.8473 -0.555482 1.41892 -1.25539 1.73665 -8.41561 8.96404 -5.06771 5.17664 -0.0655744 2.10718 -8.00222 8.65909 -7.48841 7.83609 -6.30909 6.89448 -9.1697 9.55942 -1.36259 2.22582 --0.923854 0.994771 -3.43724 4.64053 -8.09411 8.19574 -4.84869 5.52805 -2.69802 3.4119 -9.0613 9.29405 -0.565216 0.687165 -5.93495 6.57426 -1.86925 2.75493 -1.41068 2.00824 -1.60612 1.62471 -3.11499 5.89909 -2.69806 3.90538 -3.76301 4.22135 -3.30065 4.70725 -5.56461 7.02137 -8.35335 8.99287 -4.79259 4.88508 -6.7911 7.52912 -8.14843 8.28583 -3.67629 5.06406 -5.71462 7.04747 -9.06721 9.99733 -4.87932 6.8586 -8.00814 9.57664 -7.03069 7.51623 -9.0989 9.57644 -2.70873 3.91296 -1.64425 1.7007 -6.53716 6.99033 -8.29874 8.74509 -1.88941 2.57626 -4.65337 5.23247 -9.04723 9.06665 -3.52258 3.61496 -1.1207 1.80143 -0.680601 1.98384 -2.94593 5.38692 -2.65685 2.67932 -9.00469 10.2054 -6.44318 7.2657 -4.66656 5.33893 -3.41719 4.72453 -3.12403 4.21748 -6.67973 6.81775 -3.54347 4.14978 -3.02554 3.50812 -3.91883 3.93657 -7.31721 7.89895 -1.86275 2.85473 -6.23266 6.4449 -7.59855 9.38013 -9.07084 9.49309 -0.557656 2.6851 -6.899 7.37693 -4.23162 5.84314 -8.54108 9.37672 -3.9513 4.79746 -7.299 8.29678 -5.58879 5.88551 -9.14992 9.22385 -9.1914 9.31788 -4.95663 5.56316 -2.16516 2.39538 -0.722262 1.89664 -7.76447 7.80026 -2.77772 3.39136 -9.59513 9.78635 -1.02728 1.2181 -7.32631 7.56611 -7.37389 7.46163 -6.87949 8.18689 -8.95602 9.81169 -5.85364 6.63434 -0.129136 2.13484 -7.09608 7.71167 -7.1487 8.34258 -7.48738 8.3172 -8.77247 9.95985 -7.6706 9.56828 -8.14268 8.61726 -6.5455 7.90871 -4.57866 4.78453 -3.63937 4.42349 -5.18905 5.36516 -4.68884 5.62995 -5.88338 7.83824 --0.002979 0.145818 -4.42981 4.77141 -0.558593 1.07999 -6.91713 7.36159 -5.13948 6.20805 -3.34368 4.07112 -7.27365 7.8383 -9.6898 9.9514 -6.14332 6.75102 -2.16534 2.78843 -2.8007 4.37952 -7.67047 7.72955 -8.77377 9.85092 -1.26087 1.55193 -6.29788 6.58511 -7.68178 9.05777 -0.383336 1.21247 -2.55185 4.30874 -8.91971 9.21836 -3.67638 4.68596 -8.13843 9.13684 --0.424353 1.97502 -2.71499 2.93977 -0.104447 0.387901 -4.09592 4.67009 -0.808593 0.920798 -5.01258 6.30662 -4.97668 6.57412 -8.44135 9.03816 -2.78932 3.72809 -6.71337 7.15128 -4.27234 4.50127 -6.78266 9.70351 -6.48026 7.51491 -7.36296 8.42283 -4.80339 7.3704 -6.24735 7.3132 -0.134626 0.364187 -2.73854 4.09422 -0.809997 1.19657 -6.41154 6.50244 -7.16847 8.56485 -1.53582 3.33985 -1.92874 2.86427 -6.95941 7.01378 -5.8592 6.54917 -2.51802 2.75622 -3.3894 3.6957 -2.2547 2.64693 -8.62054 9.1951 -8.86378 10.0003 -1.87892 2.28732 -3.83146 4.21484 -1.53262 1.99692 -7.86048 7.93125 -1.79437 2.68269 -3.92781 4.24119 -5.43044 5.47935 -0.322904 0.618854 -3.42383 5.18531 -4.00989 5.83612 -7.06304 8.76582 -5.88039 6.77654 -8.638 8.9479 -1.73391 2.09002 -1.04861 2.84779 --0.313019 0.557659 -3.35245 4.1308 -9.05373 9.57205 -5.85684 6.49193 -6.00719 6.86421 -4.25244 4.65772 -5.15865 5.61529 -8.78498 9.77544 -8.33803 9.26452 -3.42915 4.92279 -8.29884 8.94035 -5.10232 5.35924 -4.33571 4.86695 -7.86184 7.90029 -7.34345 7.36214 -0.201624 0.800371 -9.05882 10.5503 -4.32188 5.03154 --0.0456982 1.22298 -2.90921 3.60013 -1.69306 2.36564 -7.79029 9.15059 -4.65205 5.06538 -6.34552 8.32176 -7.92695 9.32585 -7.17903 8.09903 -9.53561 9.60287 -0.365723 1.23929 -0.542889 0.849053 -8.15061 8.93512 -6.40042 6.41053 -5.82666 6.5488 -1.00893 1.83717 -1.76021 2.11893 -7.61076 8.6242 -2.32513 3.4856 -4.39023 6.01094 --0.11754 0.421848 -6.76371 6.94513 -4.67607 5.58732 --0.201992 0.765553 -7.42926 7.44429 -2.57485 2.85339 -2.74138 4.13421 -8.21645 9.18107 -6.28184 6.4996 -7.129 7.74678 -7.76842 8.74924 -3.5359 4.35892 -3.04103 3.24376 -2.29389 2.92164 -6.96306 7.64415 -8.82053 9.04584 -1.19911 2.06167 -5.91357 7.6773 -0.150241 1.23291 -4.48681 5.41762 -6.89156 8.13443 -5.37828 5.79944 -2.13694 2.91102 -1.35932 2.08272 -6.14309 6.23278 -4.03202 5.88521 -7.23417 7.43704 -1.2501 2.60793 -2.12334 3.65727 -7.05722 8.77078 -0.437873 0.585933 -6.33338 9.16643 -2.44724 4.40234 -2.92012 3.64047 -1.2039 3.25195 -8.6611 10.0398 -8.0088 9.13622 -5.96562 7.08515 -5.45181 6.65246 -0.742546 2.38958 -4.12919 4.93571 -0.428823 0.84483 -1.45226 2.5869 -9.50727 10.0211 -7.69194 8.66273 -1.25706 2.44554 -5.23247 5.47762 -0.499178 1.70722 -7.26569 8.72467 -3.59815 5.50022 -1.03601 2.43445 -0.092414 0.927635 -3.7917 3.995 -6.21977 8.40398 -3.1513 3.81188 -9.80482 10.0951 -8.65564 9.33687 -2.06164 3.49152 -2.09754 2.34929 -0.66126 2.31888 -5.34832 6.82603 -7.91038 8.59105 -0.695523 0.800961 -2.33406 2.71629 -8.37774 10.9253 -9.7682 10.106 -9.44382 9.5743 -8.78009 9.47645 -1.87309 3.04127 -1.86724 2.13913 -3.30049 3.52416 -7.18508 7.6648 -1.3736 2.12153 -2.41879 5.06716 -1.87815 2.29743 -1.76646 2.06335 -9.73034 9.95475 -0.497489 0.686102 -6.96908 7.17338 -9.23111 10.0148 -3.30981 4.21787 -9.53311 10.3734 --0.067709 0.147251 -8.44557 8.82047 -7.10407 7.47639 -0.834352 1.36908 -9.1598 10.6508 -4.22018 4.38279 -3.8295 3.95462 -3.97302 4.97247 -1.55856 2.31013 -0.0217962 0.486978 -1.69845 2.65786 --0.489562 0.582187 -5.10621 5.6055 -9.8478 9.85919 -6.15389 6.92324 -7.11469 8.0418 -3.20625 3.78209 -5.93389 7.66892 -1.15134 1.18023 -6.84797 7.4239 -2.9483 3.22279 --0.43205 0.764755 -7.17846 7.33313 -5.4729 8.26894 -6.19512 7.32132 -0.591934 0.767568 -0.49266 1.80691 -9.08272 9.72242 -5.85683 6.36905 -5.27625 7.13913 -3.60853 3.98155 -0.642811 1.10253 -1.27117 1.5329 -8.76096 9.61776 -4.9498 5.12847 -7.53282 7.80438 -1.40487 1.65657 -3.45329 3.84307 -3.25698 3.49614 -2.38651 2.89802 -8.23114 8.99016 -9.58516 10.4145 -5.5185 6.27733 -0.583068 0.892249 -1.93142 2.35084 -7.94845 9.22667 -2.47963 3.9005 -3.46106 3.86301 -7.77744 8.43735 -1.41072 1.73969 -9.12904 10.4307 -3.52227 3.66861 -5.4743 5.86487 --0.51727 1.63657 -5.09861 7.03162 -5.14763 5.93411 -3.23526 3.47376 -0.9702 1.74063 -9.28366 10.3322 -1.80257 1.92265 -8.63597 9.08467 -4.16006 4.97753 -6.37418 6.39374 -5.82376 6.62429 -7.74751 8.68962 -1.63821 2.53399 -4.9864 6.40969 -0.680772 0.995608 -3.74344 3.83319 -0.898055 1.8593 -2.36839 2.39307 -7.21046 7.51006 -0.60893 2.91523 -3.15017 4.30412 -5.02219 6.28886 -4.60541 4.73379 -8.41196 8.58978 -8.84706 10.8198 -6.95807 7.54952 -5.54729 6.9315 -4.62574 4.73423 -3.35252 3.59865 -1.02207 1.71791 -3.16408 3.73993 -0.639222 1.69519 -7.57978 8.05813 -2.41371 2.77174 -8.65544 10.093 -6.31988 6.70758 -6.5301 8.39328 -0.578825 1.20331 -1.1243 2.07824 -5.86555 6.72397 -6.37103 6.81736 -1.12086 3.46541 -2.59503 3.44073 -5.27128 5.3616 -2.87331 3.4352 -5.48408 6.67916 -3.36016 4.09125 -0.813671 0.9811 -0.812162 3.22209 -6.85104 6.86306 -0.671311 0.979685 -2.75962 2.82659 -2.42186 2.49827 -7.82974 9.59669 -3.48851 3.60085 -8.47775 10.9574 -8.6863 10.6155 -0.196484 1.07469 -1.19293 1.45012 -5.79166 6.18466 -6.51597 6.6793 -9.78341 10.1992 -8.17879 9.59257 -6.96178 8.73165 -4.09161 4.31908 -3.19514 3.4072 -5.5101 6.32978 -0.188435 1.84481 -9.41738 10.0379 -1.46994 1.6294 -4.21915 5.39529 -5.46567 5.86638 -8.19414 9.201 -4.38616 4.55193 -2.31105 2.73345 -6.05897 6.12297 -8.84135 9.74232 -9.44943 10.2225 -3.27501 3.66059 -0.524904 1.74374 -7.7228 8.43799 -5.13274 5.82863 -8.2787 8.94491 -1.61463 2.03499 -7.04346 8.69977 -0.938308 2.38676 -0.00208037 0.0186158 -1.98744 2.05864 -7.05787 8.16211 -1.68383 2.04684 -2.24812 2.28257 -0.685061 1.2947 -2.25379 2.92827 -6.0052 6.24797 -7.06213 7.86344 -0.751849 2.96376 -0.0977921 0.513746 -8.43792 9.10545 -2.80769 3.09276 -9.19308 9.59741 -4.74365 4.99708 -8.41385 8.58422 -4.28093 5.9281 -4.26205 4.75417 -1.48035 1.61363 -1.4264 1.80922 -3.48365 4.52935 -1.78396 2.96351 -8.4134 8.96536 -8.65646 9.34781 -1.88027 2.97804 -8.92531 9.02743 -6.91815 7.88895 -5.68023 7.37521 -3.93105 4.6123 -0.385874 1.30785 -1.80151 2.24385 -8.43781 9.33927 -6.69643 8.001 -6.12062 6.673 -4.8316 6.63067 -9.00443 9.08204 -1.5651 2.65023 -3.57517 4.40231 -5.85127 8.02219 -8.02586 10.018 -2.00514 2.75138 -6.32104 7.84285 -8.90914 9.78319 -4.91325 6.27817 -3.87406 4.80327 -8.57887 9.30685 -1.40351 1.71079 --0.217977 0.224497 -8.37711 9.56393 -5.54644 5.77714 -8.18206 8.36015 -0.774967 1.97899 -9.10434 10.1721 -9.39621 10.1135 -4.80108 4.90605 -9.45978 9.96227 -2.85412 4.05215 -5.71985 7.16735 -2.35081 2.82214 -9.34881 10.5899 -7.13014 7.82872 -4.54931 4.89725 -9.41397 9.9131 -8.90226 9.55276 -8.27995 9.83651 -9.2767 9.6053 -0.388751 1.40317 -5.01478 5.88869 -6.41521 7.21754 -1.22552 1.39067 -3.75771 3.81571 -4.39362 6.04592 -8.82639 8.84544 -4.59289 4.89208 -1.52235 1.64285 -1.85893 4.52056 -1.91781 2.78253 -3.34677 4.54987 -9.26905 10.6019 -7.10958 8.02083 -0.765257 1.66957 -2.17169 2.70214 -4.2293 6.38089 -1.41111 2.45992 -5.76864 6.85715 -2.19944 2.93182 -9.03727 9.6454 -3.82652 4.35225 -2.52642 3.09725 -7.77868 9.35844 -0.337665 1.00787 -1.92021 2.04418 -4.41862 5.95486 -9.47606 9.62386 -1.12113 1.55658 -5.26701 7.09712 -8.81478 9.34863 -6.29447 7.43847 -2.82379 3.57268 -7.9735 8.79936 -3.30176 5.50666 -6.36009 6.8864 -4.13583 5.00627 -0.510514 0.882245 -6.93864 7.78543 -2.04039 2.4298 -3.18337 3.19424 -4.20059 4.67088 -0.316687 0.707377 -0.169106 1.68194 -8.26665 10.2362 -1.1124 1.78306 -2.84603 3.33142 -9.48756 9.96651 -9.4301 9.7316 -0.234674 1.23981 -0.493232 0.522565 -1.342 1.41739 -2.57196 4.08221 -1.54201 2.52284 -5.32049 6.00052 -8.54218 8.59452 --0.030524 1.64476 -2.31645 2.72528 -4.71898 4.92827 -0.0872997 1.74969 -0.994278 1.76964 -1.34411 2.77952 -0.156817 2.10245 -5.78094 6.34389 -3.09336 3.10563 -8.14245 9.0928 -9.34202 9.75484 -9.78415 10.0211 -4.68383 5.19384 -6.09441 7.90512 -6.74941 6.76118 -1.78693 1.91697 -2.34369 2.62141 --0.20756 0.829082 -3.57681 5.11448 -2.44234 4.45153 -4.84521 5.31902 -1.80487 3.64498 -2.46125 3.02549 --0.334514 0.64288 -8.06406 8.49886 -1.74559 2.54474 -6.05883 6.46529 -9.00014 10.2271 -8.00064 8.5061 -0.909467 0.980765 -8.65862 8.69736 -8.11457 8.77049 -3.93237 5.02485 -4.64507 5.34852 -3.92405 4.19449 -5.02381 5.21722 -3.76203 3.78396 -6.74925 7.34781 -8.2556 8.63585 -3.92521 3.99739 -1.44641 2.31509 -0.23516 0.917239 -4.4614 6.35489 -3.33221 3.95247 -1.73289 2.07919 -6.92385 7.55052 -8.74351 9.41125 -9.41451 10.1785 -7.4001 8.81081 -2.97038 3.12524 -7.26043 7.77569 -5.56625 5.59344 -5.70977 6.33362 -7.61443 8.43218 -1.05308 1.82947 -0.377602 1.57633 -6.42483 7.51505 -4.73011 5.43693 -7.72 8.09098 -9.20063 9.82287 -6.88273 7.35327 -6.88423 7.68356 -3.55293 3.6227 -0.947096 1.76021 -3.66411 5.67117 -9.31422 10.1035 -6.84847 6.98956 -2.16221 4.45806 -0.853284 3.15932 -2.48673 2.89793 -3.37633 3.90938 -1.6141 1.66363 -1.6658 3.01723 -0.419408 1.01736 -0.712239 0.791538 -2.25249 3.62425 -8.09772 10.2367 -1.46651 1.48148 -1.73233 2.0489 -7.42679 9.23232 -7.97446 9.53281 -2.74677 4.03955 --0.169412 0.872795 -4.90663 5.40277 -7.62122 9.49334 -6.55971 7.34259 -3.71957 5.03775 -3.33226 4.06459 -0.634912 1.52603 -3.65506 4.09318 -4.31463 4.60534 -8.58287 9.85385 -0.334759 0.7232 -2.14027 2.866 -6.06611 6.3625 -2.53013 3.18764 -4.30913 4.89247 -6.53234 6.92328 -7.66419 8.61762 -1.37598 2.26754 -8.06279 8.80692 -5.28688 5.70608 -0.509396 1.34606 -8.80589 9.29765 -9.3801 10.3988 -0.402662 0.597735 -5.87213 6.63371 -2.79136 3.763 -6.20615 7.25189 -7.54065 9.62156 -4.12107 5.04454 -5.60294 6.69246 -1.20845 1.49272 -1.75679 2.56397 -2.83939 3.85147 -6.21362 6.71341 -9.01824 9.2388 -4.66617 5.04944 -1.48766 2.55674 -8.89442 9.42175 -5.29411 5.39531 -6.66271 8.68733 -0.730461 1.42466 -6.22927 6.55086 -0.566776 1.17299 -3.06104 4.17775 -5.28026 5.73966 -5.76071 7.61585 -7.83786 9.58106 -6.32199 6.46961 -8.89555 9.17429 -3.85772 4.97805 -6.63352 8.79211 -7.87234 7.94131 -6.53479 7.87979 -3.90293 4.50376 -6.21371 7.31788 -1.00497 1.75003 -6.90351 8.02435 -2.29142 3.9809 -6.26632 6.45283 --0.0354471 1.31727 -8.80046 9.20169 -7.86905 8.36819 -0.848737 1.82393 -7.98136 9.40712 -3.97765 4.95399 -8.70252 9.26275 -3.13412 4.29389 -2.06446 3.55839 -7.67918 8.44509 -5.96082 6.40336 -1.20461 2.36924 -4.76741 5.74978 -9.41217 9.94305 -7.36736 8.07119 -3.44102 3.56957 -3.59893 4.52751 -4.2613 6.41628 -1.65321 3.02235 -3.70067 3.86657 -0.0176327 1.1215 -4.13592 4.88595 -8.73668 9.0834 -1.80944 2.95584 -6.05721 6.93009 -5.08206 5.38626 -1.86749 1.89392 -3.58284 4.10506 -0.0885586 1.47709 -5.46502 5.93066 -8.45338 8.47878 -3.46789 4.02317 -0.975506 1.15814 -7.12758 7.60073 -7.99582 8.56746 -3.11435 3.83805 -4.51166 4.52472 -8.39096 8.75934 -8.42208 9.66019 -2.48498 4.73703 -3.50301 4.81264 -6.40196 7.0733 -8.52138 8.82265 -1.49822 1.74634 -7.08547 7.93508 -3.47832 4.42948 -6.08646 6.20865 -4.46334 4.65278 -3.80008 4.08214 -3.4853 5.44308 -5.48109 6.18681 -6.59161 8.04307 -7.36554 7.38201 -5.2144 5.31725 -4.62607 7.25804 -1.24345 1.81263 -5.49248 8.16867 -6.4056 8.26316 -7.67828 8.56923 -2.46187 2.56974 -2.22942 3.27248 -7.14933 8.06682 -2.3236 2.95462 -4.18028 4.80535 -4.981 5.54215 -7.23261 7.34863 -4.96309 6.06396 -4.24402 4.44364 -0.917707 1.32687 -1.19806 1.65106 -3.7725 5.31412 -9.70021 9.84203 -5.99824 7.77474 -3.32636 3.84266 -8.59841 9.07653 -7.9916 9.14415 -0.786519 1.84655 -0.166394 1.47834 -2.87633 3.52808 -7.53804 9.56807 -6.14406 6.16189 -1.63428 3.96845 -1.10307 1.58897 -1.30032 2.85313 -7.89803 8.32723 -8.77593 8.90136 -1.68804 2.69447 -4.5956 4.6743 -7.39643 8.29839 -6.93629 7.82243 -6.10289 7.677 -1.83835 2.34295 -1.04506 1.91684 -8.95277 9.43817 -0.36153 0.643665 -1.02408 3.18963 -4.02972 4.40301 -2.80428 2.82552 -6.51718 6.64956 -0.185341 1.56607 -6.1658 7.59364 -4.09288 4.11687 -6.90205 7.16338 -5.0755 5.39478 -4.5614 4.83286 -5.8489 8.76295 -9.70079 10.0431 -8.44334 8.54714 -3.00139 3.66327 -5.34458 6.38895 -7.11481 7.96865 -4.66776 5.15678 -0.390138 0.53352 -2.01116 3.32839 -6.78761 6.97068 -4.57477 5.0724 -1.14098 1.36134 -7.4559 8.30327 -0.700932 2.40437 -1.90469 1.99046 -4.30064 5.11485 -7.84433 8.48543 -5.96212 7.49882 -3.93055 3.96317 -0.546327 1.04814 -8.96011 9.0404 -7.89255 8.06149 -0.669924 2.6944 --0.00972314 0.837474 -6.07199 6.37467 -2.73659 3.19833 -5.9576 7.10966 -9.1316 9.14737 -5.26101 6.59184 -5.77697 8.08876 -0.68623 0.782805 -0.842619 1.39893 -5.82075 6.15957 -4.36394 4.88479 -7.1828 7.90107 -3.3331 4.39923 -6.54243 7.24966 -2.809 2.96491 -4.18514 4.61948 -4.95453 5.33929 -8.33288 9.52867 -9.05785 10.4276 -2.58917 4.74403 -1.34279 1.89014 -4.93626 5.75424 -7.75031 7.92788 -9.00904 9.02402 -3.91286 5.15124 -6.98486 7.34688 --0.173169 0.415019 -0.652242 1.51556 -3.50184 5.30486 -3.72563 4.09022 -4.60463 6.58985 -3.34219 4.31833 -2.55445 2.58651 -6.14573 6.3669 -4.52336 6.37342 -9.37606 9.76836 -2.4198 3.36929 -2.89109 3.66974 -5.62463 6.05989 -0.674219 1.84165 -0.590017 1.71153 -1.54622 2.10277 -6.48003 6.55663 -3.56355 3.98573 -0.743671 1.87049 -3.27833 6.0722 -4.76267 6.9967 -2.80188 4.03037 -0.372694 0.482111 -5.73987 5.9529 -8.84732 9.49033 -0.833944 1.8157 -4.06126 4.36615 -0.884619 2.34622 -6.86723 6.99141 -8.07737 9.05193 -8.35903 9.00761 -8.84777 9.74001 -8.58058 9.05479 -8.28076 8.44566 -4.55155 5.65475 -2.44314 3.38966 -3.22172 4.50395 -7.1808 7.90376 -0.639636 1.72606 -5.46807 5.94322 -9.02146 9.87864 --0.628472 0.655557 -4.29775 5.9553 -6.77525 7.38152 -6.51827 6.93542 -8.95252 9.52939 -0.755406 1.19973 -7.69455 7.86912 -0.170143 1.12949 -7.69254 8.08221 -2.08238 3.27051 -1.28662 1.78628 -1.21208 2.79391 --0.155739 1.7071 -8.28833 9.10011 -5.77789 6.6954 -1.98395 2.35216 -5.77469 6.05177 -2.77565 5.81092 --1.53416 2.30576 -6.93529 8.04506 -3.91553 4.55593 -5.57201 6.29071 -1.54149 1.86613 -4.09163 4.31234 -8.47834 11.1229 -5.70376 7.02981 -2.24683 3.79925 -5.4793 6.41036 -5.27644 6.81729 -0.13273 0.371437 -1.22959 1.41618 -0.551957 1.03276 -2.01269 2.4018 -8.77113 9.09395 -8.11753 8.46262 -0.39406 0.783705 -5.35964 5.48227 -7.24727 8.23233 -7.74525 8.85748 -0.0115736 0.882607 -1.78575 2.19684 -8.32514 9.0503 -3.11074 3.34975 -0.847464 2.13237 -0.310898 0.393528 -8.68841 10.518 -1.10032 1.83755 -2.42286 3.02554 -1.16364 2.80986 -1.46419 2.11421 -7.46021 7.90273 -6.86556 7.62542 -1.91466 3.79843 -3.1056 3.83969 -3.41591 4.26565 -0.285122 1.21372 -3.75441 5.52385 -1.07643 2.63403 -6.17341 7.67244 -9.13122 9.5132 -4.39696 6.15885 -3.7207 4.07729 -6.80782 7.1958 -6.65933 6.67105 -8.51535 8.7263 -5.98305 7.17759 -2.19609 2.46108 -8.21186 8.96908 -2.94729 3.60562 -3.31907 3.9297 -0.463492 0.626603 -2.62143 3.55089 -5.76898 6.79002 -1.45502 1.56525 -4.80797 5.62389 -5.87337 6.70588 -2.92765 3.50929 -0.412987 0.951057 -3.64594 4.40269 --0.043401 0.502176 -4.54802 5.44613 -1.20218 1.8732 -2.75547 2.96745 -7.10348 7.7945 -9.74845 9.98835 -4.83718 6.4836 -2.30563 2.5903 -4.74016 6.30789 -6.42192 6.93329 -5.37294 6.73938 -2.4365 3.05787 -1.08283 3.79193 -4.90426 5.93563 -3.8874 4.83301 -0.13909 0.983027 -4.07407 5.61421 -8.62875 10.6851 -8.10233 8.29952 -2.23047 2.4691 -7.34617 7.39475 -1.66309 2.3032 -7.11207 10.0686 -4.52412 6.38666 -2.48323 2.96878 -7.47877 8.86547 -2.67607 4.33436 -6.83659 8.21075 -2.87313 3.39011 -2.81911 4.07729 -0.227877 0.657898 -6.57843 7.14311 --0.591405 1.56925 -7.08018 7.59 -9.09558 9.3923 -9.48544 9.79474 -0.740233 2.33129 -8.51111 11.134 -7.79219 8.0281 -1.73821 1.89316 -9.21077 9.29488 -5.38354 6.46025 -4.30403 4.5472 -0.0893758 0.919238 -7.94464 8.51053 -5.27119 6.3741 -5.22476 6.00588 diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_A b/geom_bottleneck/tests/data/ws_tests/test_5_A deleted file mode 100644 index 51cff1c..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_5_A +++ /dev/null @@ -1,5 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha deleted file mode 100644 index be84441..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_B b/geom_bottleneck/tests/data/ws_tests/test_5_B deleted file mode 100644 index be62ed3..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_5_B +++ /dev/null @@ -1,5 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha deleted file mode 100644 index 14ca67c..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_A b/geom_bottleneck/tests/data/ws_tests/test_diag1_A deleted file mode 100644 index f7f90ff..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag1_A +++ /dev/null @@ -1 +0,0 @@ -1.0 1.0 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha deleted file mode 100644 index fa4a4d9..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_B b/geom_bottleneck/tests/data/ws_tests/test_diag1_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag1_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_A b/geom_bottleneck/tests/data/ws_tests/test_diag2_A deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag2_A +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_B b/geom_bottleneck/tests/data/ws_tests/test_diag2_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag2_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_A b/geom_bottleneck/tests/data/ws_tests/test_diag3_A deleted file mode 100644 index 151d4b1..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag3_A +++ /dev/null @@ -1,220 +0,0 @@ -1.391781911475341 1.391781911475341 -1.395142124726278 1.395142124726278 -1.514181227875788 1.514181227875788 -1.528291566797427 1.528291566797427 -1.585389310674157 1.585389310674157 -1.629232116709072 1.629232116709072 -1.641428662445941 1.641428662445941 -1.646998748860116 1.646998748860116 -1.652915988616469 1.652915988616469 -1.69199679556404 1.69199679556404 -1.705727462482595 1.705727462482595 -1.706819293048617 1.706819293048617 -1.720175733750729 1.720175733750729 -1.728031840308488 1.728031840308488 -1.73797421040929 1.73797421040929 -1.739519744204842 1.739519744204842 -1.76132425248022 1.76132425248022 -1.767766952966369 1.767766952966369 -1.792444271021371 1.792444271021371 -1.831487552809192 1.831487552809192 -1.837086616049901 1.837086616049901 -1.851186504948943 1.851186504948943 -1.860502132730509 1.860502132730509 -1.8619433117852 1.8619433117852 -1.878229072834972 1.878229072834972 -1.880655074837347 1.880655074837347 -1.883647832802556 1.883647832802556 -1.884127769927503 1.884127769927503 -1.892969784466709 1.892969784466709 -1.916936460787894 1.916936460787894 -1.931545068229315 1.931545068229315 -1.937626522143119 1.937626522143119 -1.942267721488891 1.942267721488891 -1.963295334827521 1.963295334827521 -1.975655395743736 1.975655395743736 -1.981448090925679 1.981448090925679 -1.986220565173897 1.986220565173897 -1.98709020812351 1.98709020812351 -1.989420269013254 1.989420269013254 -2.007874648480185 2.007874648480185 -2.012179388983059 2.012179388983059 -2.019051972834053 2.019051972834053 -2.023278848058142 2.023278848058142 -2.026190677562545 2.026190677562545 -2.041594763633561 2.041594763633561 -2.042508934597344 2.042508934597344 -2.04305394648524 2.04305394648524 -2.052514683218775 2.052514683218775 -2.059038785694094 2.059038785694094 -2.062577320792516 2.062577320792516 -2.063488177732052 2.063488177732052 -2.067806664626417 2.067806664626417 -2.073013782498534 2.073013782498534 -2.08646120854976 2.08646120854976 -2.098476357223667 2.098476357223667 -2.101378199886176 2.101378199886176 -2.101927506425904 2.101927506425904 -2.12671744783454 2.12671744783454 -2.143966150630584 2.143966150630584 -2.145312642688415 2.145312642688415 -2.148704396208969 2.148704396208969 -2.153092682531471 2.153092682531471 -2.157553654759374 2.157553654759374 -2.176659075756566 2.176659075756566 -2.177260578806816 2.177260578806816 -2.179141269427014 2.179141269427014 -2.201895416482074 2.201895416482074 -2.202563945779844 2.202563945779844 -2.205113735193028 2.205113735193028 -2.207345865351049 2.207345865351049 -2.208922099676958 2.208922099676958 -2.218057898922937 2.218057898922937 -2.228610453267036 2.228610453267036 -2.241314066596301 2.241314066596301 -2.242145210071643 2.242145210071643 -2.253976266568437 2.253976266568437 -2.255324860119305 2.255324860119305 -2.271300972641221 2.271300972641221 -2.279438361991067 2.279438361991067 -2.286592331830957 2.286592331830957 -2.287159411646074 2.287159411646074 -2.296653147995115 2.296653147995115 -2.301754785182811 2.301754785182811 -2.30409930499031 2.30409930499031 -2.32141477565108 2.32141477565108 -2.347789281926012 2.347789281926012 -2.347827987256373 2.347827987256373 -2.349391321950732 2.349391321950732 -2.350129292983257 2.350129292983257 -2.358679083392328 2.358679083392328 -2.372845273125388 2.372845273125388 -2.385040766846267 2.385040766846267 -2.42114588843816 2.42114588843816 -2.425116524931602 2.425116524931602 -2.426518521893022 2.426518521893022 -2.43211651886311 2.43211651886311 -2.441302771998711 2.441302771998711 -2.446429340510857 2.446429340510857 -2.446547553904861 2.446547553904861 -2.45764765793376 2.45764765793376 -2.461222149682938 2.461222149682938 -2.467900747394114 2.467900747394114 -2.473214152160872 2.473214152160872 -2.5 2.5 -2.503557913626332 2.503557913626332 -2.504315621146863 2.504315621146863 -2.515634290122204 2.515634290122204 -2.516231935083851 2.516231935083851 -2.517558892374071 2.517558892374071 -2.526325773757754 2.526325773757754 -2.531164001388939 2.531164001388939 -2.53128061055404 2.53128061055404 -2.539387277827314 2.539387277827314 -2.540864599180268 2.540864599180268 -2.548084457784768 2.548084457784768 -2.548923292215475 2.548923292215475 -2.551730202825644 2.551730202825644 -2.553178578801818 2.553178578801818 -2.560295747947446 2.560295747947446 -2.566321603108612 2.566321603108612 -2.568932286976676 2.568932286976676 -2.574887688783916 2.574887688783916 -2.581809142325336 2.581809142325336 -2.584541960262555 2.584541960262555 -2.585511915815223 2.585511915815223 -2.592970592044868 2.592970592044868 -2.596055336381078 2.596055336381078 -2.598560573626668 2.598560573626668 -2.614019084614256 2.614019084614256 -2.618463725327216 2.618463725327216 -2.622883674481145 2.622883674481145 -2.627791161528314 2.627791161528314 -2.63535653879261 2.63535653879261 -2.654825898255443 2.654825898255443 -2.660423271276714 2.660423271276714 -2.667148030102869 2.667148030102869 -2.67012591760915 2.67012591760915 -2.698712599567882 2.698712599567882 -2.72180967799905 2.72180967799905 -2.732466204434637 2.732466204434637 -2.734187392905275 2.734187392905275 -2.737296308103857 2.737296308103857 -2.745724923243991 2.745724923243991 -2.749541709159369 2.749541709159369 -2.752925621447035 2.752925621447035 -2.754183973113479 2.754183973113479 -2.763972022430258 2.763972022430258 -2.766941997926879 2.766941997926879 -2.773850925522978 2.773850925522978 -2.777506755238121 2.777506755238121 -2.780333194223143 2.780333194223143 -2.783060349483276 2.783060349483276 -2.78679029681548 2.78679029681548 -2.786792895521339 2.786792895521339 -2.795170825459034 2.795170825459034 -2.801104989227437 2.801104989227437 -2.80525433080833 2.80525433080833 -2.805376738133109 2.805376738133109 -2.806844454092663 2.806844454092663 -2.811611818684648 2.811611818684648 -2.811994908451803 2.811994908451803 -2.816002798930236 2.816002798930236 -2.816814002472584 2.816814002472584 -2.818569391261086 2.818569391261086 -2.821660827076439 2.821660827076439 -2.822317588351085 2.822317588351085 -2.824910409962511 2.824910409962511 -2.829322097471409 2.829322097471409 -2.833852169620359 2.833852169620359 -2.839287537694811 2.839287537694811 -2.841714730677953 2.841714730677953 -2.841715058318205 2.841715058318205 -2.851653306950001 2.851653306950001 -2.853639002902003 2.853639002902003 -2.85515962291442 2.85515962291442 -2.855333736885793 2.855333736885793 -2.872540314564304 2.872540314564304 -2.879449214478037 2.879449214478037 -2.881003856158217 2.881003856158217 -2.881074731438092 2.881074731438092 -2.893589165559115 2.893589165559115 -2.898664743213686 2.898664743213686 -2.90387832180792 2.90387832180792 -2.919095859678745 2.919095859678745 -2.924945175440496 2.924945175440496 -2.931795145696962 2.931795145696962 -2.932285006979528 2.932285006979528 -2.934606807227626 2.934606807227626 -2.936392671567475 2.936392671567475 -2.953794710898493 2.953794710898493 -2.958055395706548 2.958055395706548 -2.960407744013656 2.960407744013656 -2.960759715914242 2.960759715914242 -2.969702548922556 2.969702548922556 -2.970149844982665 2.970149844982665 -2.978953970679893 2.978953970679893 -2.979075864664287 2.979075864664287 -2.984665519558418 2.984665519558418 -3.04548240149063 3.04548240149063 -3.050688336416719 3.050688336416719 -3.05773927378742 3.05773927378742 -3.059596740753369 3.059596740753369 -3.059762479996741 3.059762479996741 -3.088543279751235 3.088543279751235 -3.093580813520995 3.093580813520995 -3.104787362108069 3.104787362108069 -3.173380191779681 3.173380191779681 -3.583124637167399 3.583124637167399 -3.630658112409034 3.630658112409034 -3.631421639368965 3.631421639368965 -3.751087101339956 3.751087101339956 -3.800845709568037 3.800845709568037 -3.846558940956666 3.846558940956666 -4 4 -4 4 -4.076238038291317 4.076238038291317 -4.455547086147983 4.455547086147983 -5.356087357608394 5.356087357608394 -5.54364842773721 5.54364842773721 -7.587654388717225 7.587654388717225 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha deleted file mode 100644 index 0dbfb89..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_B b/geom_bottleneck/tests/data/ws_tests/test_diag3_B deleted file mode 100644 index bb8655a..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_diag3_B +++ /dev/null @@ -1,193 +0,0 @@ -1.167089173446239 1.167089173446239 -1.256234452640111 1.256234452640111 -1.303693422257498 1.303693422257498 -1.413255970488646 1.413255970488646 -1.697910382446573 1.697910382446573 -1.718844728805093 1.718844728805093 -1.734124820632724 1.734124820632724 -1.749572938304276 1.749572938304276 -1.770320424526358 1.770320424526358 -1.786344763036807 1.786344763036807 -1.810054737907635 1.810054737907635 -1.815127306170105 1.815127306170105 -1.837806648681218 1.837806648681218 -1.870552189043019 1.870552189043019 -1.897240351979503 1.897240351979503 -1.935562152643027 1.935562152643027 -1.952562418976663 1.952562418976663 -1.959552126104175 1.959552126104175 -1.979899732318601 1.979899732318601 -2.00044500769347 2.00044500769347 -2.028951227523087 2.028951227523087 -2.037678749316724 2.037678749316724 -2.047911420446857 2.047911420446857 -2.075181804515723 2.075181804515723 -2.077245386452578 2.077245386452578 -2.084751316684838 2.084751316684838 -2.084860886126203 2.084860886126203 -2.103286477421968 2.103286477421968 -2.106856827309345 2.106856827309345 -2.113139266068691 2.113139266068691 -2.114594962503455 2.114594962503455 -2.115917727493158 2.115917727493158 -2.122335878797089 2.122335878797089 -2.127359082726206 2.127359082726206 -2.131673381033273 2.131673381033273 -2.155015793320908 2.155015793320908 -2.162480684365264 2.162480684365264 -2.195207236194009 2.195207236194009 -2.203279931784429 2.203279931784429 -2.205567995563669 2.205567995563669 -2.212933962936773 2.212933962936773 -2.215081271089993 2.215081271089993 -2.225989037578865 2.225989037578865 -2.24218929203347 2.24218929203347 -2.246321319993257 2.246321319993257 -2.280059407166517 2.280059407166517 -2.284117669032543 2.284117669032543 -2.293233992770926 2.293233992770926 -2.298815356955373 2.298815356955373 -2.300542634724628 2.300542634724628 -2.326408290042679 2.326408290042679 -2.328797162040625 2.328797162040625 -2.36025798094028 2.36025798094028 -2.365031313604634 2.365031313604634 -2.372266311053883 2.372266311053883 -2.400053902049271 2.400053902049271 -2.409134054334209 2.409134054334209 -2.411368235895246 2.411368235895246 -2.415934766378347 2.415934766378347 -2.420989857074179 2.420989857074179 -2.422520269961376 2.422520269961376 -2.43377629944218 2.43377629944218 -2.449308615746858 2.449308615746858 -2.452936540056068 2.452936540056068 -2.453698388060092 2.453698388060092 -2.454711357943602 2.454711357943602 -2.459202673400056 2.459202673400056 -2.493778305287384 2.493778305287384 -2.537394117473177 2.537394117473177 -2.544674753106669 2.544674753106669 -2.558904304820755 2.558904304820755 -2.563089994365716 2.563089994365716 -2.565476194422898 2.565476194422898 -2.599756049189921 2.599756049189921 -2.603619661709009 2.603619661709009 -2.609775379385211 2.609775379385211 -2.622552038976658 2.622552038976658 -2.623798471910885 2.623798471910885 -2.635711198661633 2.635711198661633 -2.644229304223612 2.644229304223612 -2.661919064427223 2.661919064427223 -2.666783921498494 2.666783921498494 -2.675503310152301 2.675503310152301 -2.684228699964661 2.684228699964661 -2.696854617267681 2.696854617267681 -2.700538654666735 2.700538654666735 -2.744886611436907 2.744886611436907 -2.748618547996708 2.748618547996708 -2.757981496641135 2.757981496641135 -2.774766825791652 2.774766825791652 -2.784491736143893 2.784491736143893 -2.796482184304273 2.796482184304273 -2.800849254751463 2.800849254751463 -2.816963410000067 2.816963410000067 -2.825207379914743 2.825207379914743 -2.831286409028398 2.831286409028398 -2.844827082550712 2.844827082550712 -2.853558438121966 2.853558438121966 -2.859806035663089 2.859806035663089 -2.878956033959891 2.878956033959891 -2.886422825109222 2.886422825109222 -2.891566924618832 2.891566924618832 -2.892028419188578 2.892028419188578 -2.893138900330932 2.893138900330932 -2.894250936382814 2.894250936382814 -2.90112201577666 2.90112201577666 -2.902172795370005 2.902172795370005 -2.90967533504119 2.90967533504119 -2.919687125962211 2.919687125962211 -2.923711238894001 2.923711238894001 -2.929041907338841 2.929041907338841 -2.938734873084349 2.938734873084349 -2.939642428979572 2.939642428979572 -2.943010909640486 2.943010909640486 -2.944210926048103 2.944210926048103 -2.951091358234723 2.951091358234723 -2.953950275008233 2.953950275008233 -2.966943157369611 2.966943157369611 -2.982522008227535 2.982522008227535 -2.992174049247434 2.992174049247434 -2.993098995839607 2.993098995839607 -2.995311055519335 2.995311055519335 -2.996708164866609 2.996708164866609 -2.999922110096644 2.999922110096644 -3 3 -3.000364533251431 3.000364533251431 -3.003840990677832 3.003840990677832 -3.006672301312824 3.006672301312824 -3.016489409140306 3.016489409140306 -3.021123787004333 3.021123787004333 -3.039117818612596 3.039117818612596 -3.039555193616473 3.039555193616473 -3.049952247267922 3.049952247267922 -3.057673482371216 3.057673482371216 -3.06920083507411 3.06920083507411 -3.075505231082782 3.075505231082782 -3.079038628197304 3.079038628197304 -3.084265889701239 3.084265889701239 -3.086837468106297 3.086837468106297 -3.103873984398081 3.103873984398081 -3.11528125482979 3.11528125482979 -3.119720021802376 3.119720021802376 -3.132543753577128 3.132543753577128 -3.141822873359038 3.141822873359038 -3.143502053175705 3.143502053175705 -3.153232877003746 3.153232877003746 -3.157586960809866 3.157586960809866 -3.157966892275408 3.157966892275408 -3.163583225161638 3.163583225161638 -3.178188125342772 3.178188125342772 -3.178475867931057 3.178475867931057 -3.179372297765929 3.179372297765929 -3.186437137237586 3.186437137237586 -3.188053957464282 3.188053957464282 -3.199351610026191 3.199351610026191 -3.204566427513051 3.204566427513051 -3.22885278850648 3.22885278850648 -3.229088648916556 3.229088648916556 -3.236685523936269 3.236685523936269 -3.239854786600373 3.239854786600373 -3.255809161351669 3.255809161351669 -3.287718056143732 3.287718056143732 -3.294038308299402 3.294038308299402 -3.313688277153076 3.313688277153076 -3.325783245946608 3.325783245946608 -3.331072954808429 3.331072954808429 -3.354962852285211 3.354962852285211 -3.357502741262644 3.357502741262644 -3.373668509804576 3.373668509804576 -3.408653045775418 3.408653045775418 -3.416281541503763 3.416281541503763 -3.443144279972986 3.443144279972986 -3.492970564191033 3.492970564191033 -3.493767805580122 3.493767805580122 -3.559084134799019 3.559084134799019 -3.559898699300211 3.559898699300211 -3.833585501974904 3.833585501974904 -4.099502076836052 4.099502076836052 -4.484082147277348 4.484082147277348 -4.505718324707756 4.505718324707756 -4.891723119528026 4.891723119528026 -5.065300494905414 5.065300494905414 -5.188599238535201 5.188599238535201 -5.36134479630535 5.36134479630535 -5.609786508140671 5.609786508140671 -7.08640314680382 7.08640314680382 -7.113765883549079 7.113765883549079 -7.328944131981744 7.328944131981744 -7.63625182217108 7.63625182217108 -7.716743341311718 7.716743341311718 -7.938093404092351 7.938093404092351 -8.112783377863046 8.112783377863046 -8.131485096731454 8.131485096731454 diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha deleted file mode 100644 index 3fbfd90..0000000 Binary files a/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha and /dev/null differ diff --git a/geom_bottleneck/tests/data/ws_tests/test_list.txt b/geom_bottleneck/tests/data/ws_tests/test_list.txt deleted file mode 100644 index 27340d8..0000000 --- a/geom_bottleneck/tests/data/ws_tests/test_list.txt +++ /dev/null @@ -1,21 +0,0 @@ -test_5_A test_5_B 1.0 -1.0 4.320655 -test_5_A test_5_B 2.0 -1.0 1.7323016335246 -test_5_A test_5_B 3.0 -1.0 1.396199948 -test_5_A test_5_B 1.0 1.0 6.603006 -test_5_A test_5_B 2.0 1.0 2.73426775794691 -test_5_A test_5_B 3.0 1.0 2.13072755216204 -test_5_A test_5_B 1.0 2.0 5.1888795679967 -test_5_A test_5_B 2.0 2.0 2.26649677575857 -test_5_A test_5_B 3.0 2.0 1.86434961396614 -test_100_A test_100_B 1.0 -1.0 27.5573259 -test_100_A test_100_B 2.0 -1.0 3.38004972483238 -test_100_A test_100_B 3.0 -1.0 1.9045814702967 -test_100_A test_100_B 1.0 1.0 40.4375855 -test_100_A test_100_B 2.0 1.0 4.75252460986668 -test_100_A test_100_B 3.0 1.0 2.556594741819 -test_100_A test_100_B 1.0 2.0 31.7187555735287 -test_100_A test_100_B 2.0 2.0 3.81132239777023 -test_100_A test_100_B 3.0 2.0 2.09695346034248 -test_diag1_A test_diag1_B 1.0 -1.0 0.0 -test_diag2_A test_diag2_B 1.0 -1.0 0.0 -test_diag3_A test_diag3_B 1.0 -1.0 0.0 diff --git a/geom_bottleneck/tests/test_hera_bottleneck.cpp b/geom_bottleneck/tests/test_hera_bottleneck.cpp deleted file mode 100644 index f22e415..0000000 --- a/geom_bottleneck/tests/test_hera_bottleneck.cpp +++ /dev/null @@ -1,611 +0,0 @@ -#include "catch/catch.hpp" - -#include -#include - -#include "bottleneck.h" - -using PairVector = std::vector>; -using PairVectorF = std::vector>; - -std::vector split_on_delim(const std::string& s, char delim) -{ - std::stringstream ss(s); - std::string token; - std::vector tokens; - while(std::getline(ss, token, delim)) { - tokens.push_back(token); - } - return tokens; -} - - -// single row in a file with test cases -struct TestFromFileCase { - - std::string file_1; - std::string file_2; - double delta; - double answer; - std::vector> longest_edges; - double internal_p { hera::get_infinity() }; - - TestFromFileCase(const std::string& s) - { - auto tokens = split_on_delim(s, ' '); -// assert(tokens.size() > 5); - assert(tokens.size() % 2 == 0); - - size_t token_idx = 0; - file_1 = tokens.at(token_idx++); - file_2 = tokens.at(token_idx++); - delta = std::stod(tokens.at(token_idx++)); - answer = std::stod(tokens.at(token_idx++)); - while(token_idx < tokens.size() - 1) { - int v1 = std::stoi(tokens[token_idx++]); - int v2 = std::stoi(tokens[token_idx++]); - longest_edges.emplace_back(v1, v2); - } - } -}; - -std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s) -{ - out << "[" << s.file_1 << ", " << s.file_2 << ", norm = "; - if (s.internal_p != hera::get_infinity()) { - out << s.internal_p; - } else { - out << "infinity"; - } - out << ", answer = " << s.answer << ", edges { "; - for(auto e : s.longest_edges) { - out << e.first << " <-> " << e.second << ", "; - } - out << "} ]"; - return out; -} - - -TEST_CASE("simple cases", "bottleneckDistApprox") -{ - PairVector diagram_A, diagram_B; - double delta = 0.01; - //double internal_p = hera::get_infinity(); - - SECTION("trivial: two empty diagrams") { - REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta)); - } - - SECTION("trivial: one empty diagram, one single-point diagram") { - - diagram_A.emplace_back(1.0, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - REQUIRE( fabs(d1 - 0.5) <= 0.00000000001 ); - - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - REQUIRE( fabs(d2 - 0.5) <= 0.00000000001 ); - } - - SECTION("trivial: two single-point diagrams-1") { - - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double correct_answer = 3.0; - REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer); - REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer); - } - - SECTION("trivial: two single-point diagrams-2") { - - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(130.0, 138.0); // (4, 4) - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double correct_answer = 5.0; - REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); - REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); - - } - -} - -TEST_CASE("float version", "check_template") -{ - PairVectorF diagram_A, diagram_B; - float delta = 0.01; - //float internal_p = hera::get_infinity(); - - SECTION("trivial: two empty diagrams") { - REQUIRE( 0.0 == hera::bottleneckDistApprox(diagram_A, diagram_B, delta)); - REQUIRE( 0.0 == hera::bottleneckDistExact(diagram_A, diagram_B)); - } - - SECTION("trivial: two single-point diagrams-2") { - - diagram_A.emplace_back(10, 20); // (5, 5) - diagram_B.emplace_back(130, 138); // (4, 4) - - float d1 = hera::bottleneckDistApprox(diagram_A, diagram_B, delta); - float d2 = hera::bottleneckDistApprox(diagram_B, diagram_A, delta); - float d3 = hera::bottleneckDistExact(diagram_B, diagram_A); - float correct_answer = 5; - REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); - REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); - - } - -} - - -TEST_CASE("infinity points", "bottleneckDistApprox") -{ - PairVector diagram_A, diagram_B; - double delta = 0.01; - - // do not use Hera's infinity! it is -1 - double inf = std::numeric_limits::infinity(); - - SECTION("two points at infinity, no finite points") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double corr_answer = 1.0; - REQUIRE( fabs(d - corr_answer) <= delta * corr_answer); - } - - SECTION("two points at infinity") { - - // edge cost 3.0 - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double corr_answer = 3.0; - REQUIRE( fabs(d - corr_answer) <= delta * corr_answer); - } - - SECTION("three points at infinity, no finite points") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double corr_answer = inf; - REQUIRE( d == corr_answer ); - } - - SECTION("three points at infinity") { - - // edge cost 3.0 - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double corr_answer = inf; - REQUIRE( d == corr_answer ); - } - - - SECTION("all four corners at infinity, no finite points, finite answer") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double corr_answer = 1.0; - - REQUIRE( d == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-1") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-2") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-3") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-4") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-1") { - - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-2") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-3") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-4") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - - SECTION("simple small example with finite answer") { - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.9, inf); - diagram_B.emplace_back(1.1, inf); - - // 1.1 - 1.0 + 2.0 - 1.9 = 0.2 - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(inf, 1.9); - diagram_B.emplace_back(inf, 1.1); - - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::bottleneckDistExact<>(diagram_A, diagram_B); - double d2 = hera::bottleneckDistExact<>(diagram_B, diagram_A); - double corr_answer = 3.0; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - - - } - -} - -TEST_CASE("longest edge", "bottleneckDistApprox") -{ - PairVector diagram_A, diagram_B; - hera::bt::MatchingEdge longest_edge_1; - hera::bt::MatchingEdge longest_edge_2; - double delta = 0.01; - - SECTION("trivial: two empty diagrams") { - // should not fail - REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true)); - } - - SECTION("trivial: one empty diagram, one single-point diagram") { - - diagram_A.emplace_back(1.0, 2.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true); - REQUIRE(longest_edge_1.first.getRealX() == 1.0); - REQUIRE(longest_edge_1.first.getRealY() == 2.0); - - double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true); - REQUIRE(longest_edge_2.second.getRealX() == 1.0); - REQUIRE(longest_edge_2.second.getRealY() == 2.0); - } - - SECTION("trivial: two single-point diagrams-1") { - - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(11.0, 19.0); - - double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true); - - REQUIRE(longest_edge_1.first.getRealX() == 10.0); - REQUIRE(longest_edge_1.first.getRealY() == 20.0); - - REQUIRE(longest_edge_1.second.getRealX() == 11.0); - REQUIRE(longest_edge_1.second.getRealY() == 19.0); - -// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true); -// REQUIRE(longest_edge_2.second.getRealX() == 1.0); -// REQUIRE(longest_edge_2.second.getRealY() == 2.0); -// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); -// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); -// double correct_answer = 3.0; -// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer); -// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer); - } -// -// SECTION("trivial: two single-point diagrams-2") { -// -// diagram_A.emplace_back(10.0, 20.0); // (5, 5) -// diagram_B.emplace_back(130.0, 138.0); // (4, 4) -// -// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta); -// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta); -// double correct_answer = 5.0; -// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer ); -// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer ); -// -// } - -} - -TEST_CASE("file cases", "bottleneck_dist") -{ - PairVector diagram_A, diagram_B; - hera::bt::MatchingEdge longest_edge; - - const char* file_name = "../tests/data/test_list.txt"; - std::string dir_prefix = "../tests/data/"; - std::ifstream f; - f.open(file_name); - std::vector test_params; - std::string s; - while (std::getline(f, s)) { - test_params.emplace_back(s); - //std::cout << "read test params " << test_params.back() << std::endl; - } - - SECTION("from file:") { - - for (const auto& ts : test_params) { - bool read_file_A = hera::readDiagramPointSet(dir_prefix + ts.file_1, diagram_A); - bool read_file_B = hera::readDiagramPointSet(dir_prefix + ts.file_2, diagram_B); - REQUIRE(read_file_A); - REQUIRE(read_file_B); - - double hera_answer = hera::bottleneckDistApprox(diagram_A, diagram_B, ts.delta, longest_edge, true); - std::pair hera_le { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() }; - - REQUIRE((hera_answer == ts.answer or fabs(hera_answer - ts.answer) <= ts.delta * hera_answer)); - REQUIRE((ts.longest_edges.empty() or - std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le) != ts.longest_edges.end())); - - double hera_answer_exact = hera::bottleneckDistExact(diagram_A, diagram_B, 14, longest_edge, true); - std::pair hera_le_exact { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() }; - - REQUIRE((hera_answer_exact == ts.answer or - fabs(hera_answer_exact - ts.answer) <= 0.0001 * ts.answer)); - - REQUIRE((ts.longest_edges.empty() or - std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le_exact) != - ts.longest_edges.end())); - - // check that longest_edge length matches the bottleneck distance - - double hera_le_cost; - bool check_longest_edge_cost = true; - if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() < 0) { - // longest edge: off-diagonal point of A connected to its diagonal projection - hera_le_cost = longest_edge.first.get_persistence(ts.internal_p); - } else if (longest_edge.first.get_user_id() < 0 and longest_edge.second.get_user_id() >= 0) { - // longest edge: off-diagonal point of B connected to its diagonal projection - hera_le_cost = longest_edge.second.get_persistence(ts.internal_p); - } else if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() >= 0) { - // longest edge connects two off-diagonal points of A and B - hera_le_cost = hera::bt::dist_l_inf_slow(longest_edge.first, longest_edge.second); - } else { - check_longest_edge_cost = false; - } -// if (check_longest_edge_cost and hera_le_cost != hera_answer_exact) { -// std::cout << "PROBLEM HERE: " << ts << ", longest edge " << longest_edge.first << " - " -// << longest_edge.second << ", hera_le_cost " << hera_le_cost << ", answwer " -// << hera_answer_exact << std::endl; -// } - REQUIRE( (not check_longest_edge_cost or fabs(hera_le_cost - hera_answer_exact) < 0.0001 * hera_answer_exact) ); - std::cout << ts << " PASSED " << std::endl; - } - } - -} diff --git a/geom_bottleneck/tests/tests_main.cpp b/geom_bottleneck/tests/tests_main.cpp deleted file mode 100644 index d24407e..0000000 --- a/geom_bottleneck/tests/tests_main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#define LOG_AUCTION -#define CATCH_CONFIG_MAIN -#include "catch/catch.hpp" diff --git a/geom_matching/.gitignore b/geom_matching/.gitignore deleted file mode 100644 index d9458fb..0000000 --- a/geom_matching/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -/*.cfg -wasserstein/build/ -*.gitattributes -*.opensdf -*.sdf -*.suo -*.vcxproj -*.filters -*.log -*.tlog -*.lastbuildstate -*.obj -*.idb -*.pdb -*.exe -*.ilk -*.user -*.out -*.output -*.pyc -*.*~* -*.swp -*.nfs* -*.pdf -*.o -*.d -*.dll -*.lib -*.exe -makeout -tags diff --git a/geom_matching/README b/geom_matching/README deleted file mode 100644 index 5228d63..0000000 --- a/geom_matching/README +++ /dev/null @@ -1,100 +0,0 @@ -This is a program for computing Wasserstein distances between persistence -diagrams using the geometric version of auction algorithm. - -Accompanying paper: M. Kerber, D. Morozov, A. Nigmetov. Geometry Helps To Compare -Persistence Diagrams (ALENEX 2016, http://www.geometrie.tugraz.at/nigmetov/geom_dist.pdf) -Bug reports can be sent to "nigmetov EMAIL SIGN tugraz DOT at". - -Wasserstein distance $W_{q, p}(X, Y)$ between two persistent diagrams is -the minimum over all perfect matchings between $X$ and $Y$ ( $y(x)$ is the point of $Y$ -matched to $x \in X$ ) of the following expression: -$ ( \sum \| x - y(x) \|_p ^ { q } ) ^ { 1 / q} $ - -# Dependencies - -Requires boost 1.58 or higher. -Your compiler must support C++11. - -# Usage: - -To use a standalone command-line utility wasserstein_dist: - -wasserstein_dist file1 file2 [wasserstein degree] [relative error] [internal norm]. - -Parameter wasserstein degree corresponds to $q$, when it tends to infinity, -Wasserstein distance tends to the bottleneck distance. - -If two diagrams are equal, then the exact distance 0.0 is printed (the order -of points in file1 and file2 need not be the same). -Otherwise the output is an approximation of the exact distance. Precisely: -if d_exact is the true distance and d_approx is the output, then - - | d_exact - d_approx | / d_exact < relative_error. - -Parameter internal_p corresponds to p. - -Default values: -wasserstein_degree = 1.0, -relative_error = 0.01, -internal_p = infinity. - -Valid values: -wasserstein_degree must be in $[1.0, \infinity)$, -relative_error must be positive, -internal_p must be in $[1.0, \infinity]$ (to explicitly set internal_p to $\infinity$, supply inf).By default wasserstein degree is 1.0, relative error is 0.01, internal norm is l_infinity. - -file1 and file2 must contain persistence diagrams in plain text format -(one point per line, empty lines are ignored, comments can be made with #): - -# this is how your input can look like -x_1 y_1 # two real numbers per line -... -# empty lines or comments are ignored -x_n y_n - -To use from your code: - -#include "wasserstein.h" - -// All classes and functions are in geom_ws namespace - -std::vector> diagram1, diagram2; -// any container class that supports range-for loops will do. -// A pair represents a single point, -// first component = x-coordinate, -// second component = y-coordinate. -// ... -// load your diagrams into diagram1, diagram2 (off-diagonal points). -// You can use function readDiagramPointSet: -geom_ws::readDiagramPointSet("diagram1.txt", diagram1); -geom_ws::readDiagramPointSet("diagram2.txt", diagram1); -// ... -// to get the distance: -double wsDist = geom_ws::wassersteinDist(diagram1, diagram2, q, delta, p); -// q is wasserstein degree, delta is relative error, -// p is the internal norm in Wasserstein distance, defaults to infinity - -Necessary projections (diagonal points) will be added in the wassersteinDist -function. - -See also code in wasserstein/example/wasserstein_dist.cpp. - -# License - -See ../license.txt - -# Building - -CMakeLists.txt in the root directory can be used to make the library (contained -in wasserstein/src/ directory) and the command-line utility (in wasserstein/example/ directory) -to compute the distance between two diagrams in txt files. - -On Linux/Mac: - -mkdir build -cd build -cmake .. -make - -On Windows (checked with Visual Studio 2015, Community version) -use cmake-gui to create the solution in build directory and build it with VS. diff --git a/geom_matching/wasserstein/CMakeLists.txt b/geom_matching/wasserstein/CMakeLists.txt deleted file mode 100644 index dea4550..0000000 --- a/geom_matching/wasserstein/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -project (wasserstein) -cmake_minimum_required (VERSION 3.5.1) - -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -include (GenerateExportHeader) - -include(TestBigEndian) -test_big_endian(BIG_ENDIAN) -if(BIG_ENDIAN) - add_definitions(-DBIGENDIAN) -endif() - -# Default to Release - -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") -endif (NOT CMAKE_BUILD_TYPE) - -# Boost -find_package (Boost) -include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include - SYSTEM ${Boost_INCLUDE_DIR}) - -if(NOT WIN32) - add_definitions(-std=c++14) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -D_GLIBCXX_DEBUG") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 -g -ggdb") -endif(NOT WIN32) - -file(GLOB WS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) - -#add_library(wasserstein ${WS_SOURCES}) - -#if (WIN32) - #GENERATE_EXPORT_HEADER(wasserstein - #BASE_NAME wasserstein - #EXPORT_MACRO_NAME wasserstein_EXPORT - #EXPORT_FILE_NAME wasserstein_export.h - #STATIC_DEFINE wasserstein_BUILT_AS_STATIC) -#endif(WIN32) - -find_package (Threads) -set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT}) - -add_executable(wasserstein_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist.cpp ${WS_HEADERS} include/hera_infinity.h) -target_link_libraries(wasserstein_dist PUBLIC ${libraries}) - -add_executable(wasserstein_dist_dipha ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_dipha.cpp ${WS_HEADERS} include/hera_infinity.h) -target_link_libraries(wasserstein_dist_dipha PUBLIC ${libraries}) - -# pure geometric version, arbitrary dimension -add_executable(wasserstein_dist_point_cloud ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_point_cloud.cpp ${WS_HEADERS} include/hera_infinity.h) -target_link_libraries(wasserstein_dist_point_cloud PUBLIC ${libraries}) - -# Tests -add_executable(wasserstein_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein_pure_geom.cpp include/hera_infinity.h tests/tests_reader.h) -#add_executable(wasserstein_test EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp) -target_link_libraries(wasserstein_test PUBLIC ${libraries}) diff --git a/geom_matching/wasserstein/example/wasserstein_dist.cpp b/geom_matching/wasserstein/example/wasserstein_dist.cpp deleted file mode 100644 index cbe83e2..0000000 --- a/geom_matching/wasserstein/example/wasserstein_dist.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#include -#include -#include -#include - -#include "opts/opts.h" - -//#define LOG_AUCTION - -//#include "auction_runner_fr.h" -//#include "auction_runner_fr.hpp" - -#include "wasserstein.h" - -// any container of pairs of Reals can be used, -// we use vector in this example. - -int main(int argc, char* argv[]) -{ - using Real = double; - using PairVector = std::vector>; - PairVector diagramA, diagramB; - - hera::AuctionParams params; - params.max_num_phases = 800; - - opts::Options ops(argc, argv); - ops >> opts::Option('q', "degree", params.wasserstein_power, "Wasserstein degree") - >> opts::Option('d', "error", params.delta, "Relative error") - >> opts::Option('p', "internal-p", params.internal_p, "Internal norm") - >> opts::Option("initial-epsilon", params.initial_epsilon, "Initial epsilon") - >> opts::Option("epsilon-factor", params.epsilon_common_ratio, "Epsilon factor") - >> opts::Option("max-bids-per-round", params.max_bids_per_round, "Maximal number of bids per round") - >> opts::Option('m', "max-rounds", params.max_num_phases, "Maximal number of iterations"); - - - bool print_relative_error = ops >> opts::Present('e', "--print-error", "Print real relative error"); - - params.tolerate_max_iter_exceeded = ops >> opts::Present('t', "tolerate", "Suppress max-iterations-exceeded error and print the best result."); - - std::string dgm_fname_1, dgm_fname_2; - bool dgm_1_given = (ops >> opts::PosOption(dgm_fname_1)); - bool dgm_2_given = (ops >> opts::PosOption(dgm_fname_2)); - - //std::cout << "q = " << params.wasserstein_power << ", delta = " << params.delta << ", p = " << params.internal_p << ", max_round = " << params.max_num_phases << std::endl; - //std::cout << "print relative error: " << print_relative_error << std::endl; - //std::cout << "dgm1: " << dgm_fname_1 << std::endl; - //std::cout << "dgm2: " << dgm_fname_2 << std::endl; - - if (not dgm_1_given or not dgm_2_given) { - std::cerr << "Usage: " << argv[0] << " file1 file2 " << std::endl; - std::cerr << "compute Wasserstein distance between persistence diagrams in file1 and file2.\n"; - std::cerr << ops << std::endl; - return 1; - } - - if (ops >> opts::Present('h', "help", "show help message")) { - std::cout << "Usage: " << argv[0] << " file1 file2 " << std::endl; - std::cout << "compute Wasserstein distance between persistence diagrams in file1 and file2.\n"; - std::cout << ops << std::endl; - } - - if (!hera::read_diagram_point_set(dgm_fname_1, diagramA)) { - std::exit(1); - } - - if (!hera::read_diagram_point_set(dgm_fname_2, diagramB)) { - std::exit(1); - } - - if (params.wasserstein_power < 1.0) { - std::cerr << "Wasserstein_degree was \"" << params.wasserstein_power << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - if (params.wasserstein_power == 1.0) { - hera::remove_duplicates(diagramA, diagramB); - } - - //default relative error: 1% - if ( params.delta <= 0.0) { - std::cerr << "relative error was \"" << params.delta << "\", must be a number > 0.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - // default for internal metric is l_infinity - if (std::isinf(params.internal_p)) { - params.internal_p = hera::get_infinity(); - } - - - if (not hera::is_p_valid_norm(params.internal_p)) { - std::cerr << "internal-p was \"" << params.internal_p << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; - std::exit(1); - } - - // if you want to specify initial value for epsilon and the factor - // for epsilon-scaling - if (params.initial_epsilon < 0.0) { - std::cerr << "initial-epsilon was \"" << params.initial_epsilon << "\", must be a non-negative number. Cannot proceed." << std::endl; - std::exit(1); - } - - if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { - std::cerr << "The 7th argument (epsilon factor) was \"" << params.epsilon_common_ratio << "\", must be a number greater than 1. Cannot proceed." << std::endl; - std::exit(1); - } - - if (params.max_bids_per_round == 0) - params.max_bids_per_round = std::numeric_limits::max(); - - - std::string log_filename_prefix = ( 11 <= argc ) ? argv[10] : ""; - - -#ifdef LOG_AUCTION - spdlog::set_level(spdlog::level::info); -#endif - - Real res = hera::wasserstein_dist(diagramA, diagramB, params, log_filename_prefix); - - std::cout << std::setprecision(15) << res << std::endl; - if (print_relative_error) - std::cout << "Relative error: " << params.final_relative_error << std::endl; - - return 0; - -} diff --git a/geom_matching/wasserstein/example/wasserstein_dist_dipha.cpp b/geom_matching/wasserstein/example/wasserstein_dist_dipha.cpp deleted file mode 100644 index 2ed9c2c..0000000 --- a/geom_matching/wasserstein/example/wasserstein_dist_dipha.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -Copyright (c) 2018, G. Spreemann -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#include -#include -#include -#include - -//#define LOG_AUCTION - -//#include "auction_runner_fr.h" -//#include "auction_runner_fr.hpp" - -#include "wasserstein.h" - -// any container of pairs of doubles can be used, -// we use vector in this example. - -int main(int argc, char* argv[]) -{ - using PairVector = std::vector>; - PairVector diagramA, diagramB; - - hera::AuctionParams params; - - if (argc < 4 ) { - std::cerr << "Usage: " << argv[0] << " file1 file2 ph_dim [wasserstein_degree] [relative_error] [internal norm] [initial epsilon] [epsilon_factor] [max_bids_per_round] [gamma_threshold][log_filename_prefix]. By default power is 1.0, relative error is 0.01, internal norm is l_infinity, initall epsilon is chosen automatically, epsilon factor is 5.0, Jacobi variant is used (max bids per round is maximal), gamma_threshold = 0.0." << std::endl; - return 1; - } - - unsigned int dim = std::stoul(argv[3]); - - if (!hera::read_diagram_dipha(argv[1], dim, diagramA)) { - std::exit(1); - } - - if (!hera::read_diagram_dipha(argv[2], dim, diagramB)) { - std::exit(1); - } - - params.wasserstein_power = (5 <= argc) ? atof(argv[4]) : 1.0; - if (params.wasserstein_power < 1.0) { - std::cerr << "The third argument (wasserstein_degree) was \"" << argv[4] << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - if (params.wasserstein_power == 1.0) { - hera::remove_duplicates(diagramA, diagramB); - } - - //default relative error: 1% - params.delta = (6 <= argc) ? atof(argv[5]) : 0.01; - if ( params.delta <= 0.0) { - std::cerr << "The 4th argument (relative error) was \"" << argv[5] << "\", must be a number > 0.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - // default for internal metric is l_infinity - params.internal_p = ( 7 <= argc ) ? atof(argv[6]) : hera::get_infinity(); - if (std::isinf(params.internal_p)) { - params.internal_p = hera::get_infinity(); - } - - - if (not hera::is_p_valid_norm(params.internal_p)) { - std::cerr << "The 6th argument (internal norm) was \"" << argv[6] << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; - std::exit(1); - } - - // if you want to specify initial value for epsilon and the factor - // for epsilon-scaling - params.initial_epsilon= ( 8 <= argc ) ? atof(argv[7]) : 0.0 ; - - if (params.initial_epsilon < 0.0) { - std::cerr << "The 7th argument (initial epsilon) was \"" << argv[7] << "\", must be a non-negative number. Cannot proceed." << std::endl; - std::exit(1); - } - - params.epsilon_common_ratio = ( 9 <= argc ) ? atof(argv[8]) : 0.0 ; - if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { - std::cerr << "The 8th argument (epsilon factor) was \"" << argv[8] << "\", must be a number greater than 1. Cannot proceed." << std::endl; - std::exit(1); - } - - - params.max_bids_per_round = ( 10 <= argc ) ? atoi(argv[9]) : 0; - if (params.max_bids_per_round == 0) - params.max_bids_per_round = std::numeric_limits::max(); - - - params.gamma_threshold = (11 <= argc) ? atof(argv[10]) : 0.0; - - std::string log_filename_prefix = ( 12 <= argc ) ? argv[11] : ""; - - params.max_num_phases = 800; - -#ifdef LOG_AUCTION - spdlog::set_level(spdlog::level::info); -#endif - - double res = hera::wasserstein_dist(diagramA, diagramB, params, log_filename_prefix); - - std::cout << std::setprecision(15) << res << std::endl; - - return 0; - -} diff --git a/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp b/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp deleted file mode 100644 index ab7ff4f..0000000 --- a/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#include -#include -#include -#include - -#include "wasserstein_pure_geom.hpp" - -int main(int argc, char* argv[]) -{ - - //{ - //int n_points = 3; - //int dim = 3; - //using Traits = hera::ws::dnn::DynamicPointTraits; - //hera::ws::dnn::DynamicPointTraits traits(dim); - //hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); - //hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); - - //dgm_a[0][0] = 0.0; - //dgm_a[0][1] = 0.0; - //dgm_a[0][2] = 0.0; - - //dgm_a[1][0] = 1.0; - //dgm_a[1][1] = 0.0; - //dgm_a[1][2] = 0.0; - - //dgm_a[2][0] = 0.0; - //dgm_a[2][1] = 1.0; - //dgm_a[2][2] = 1.0; - - //dgm_b[0][0] = 0.0; - //dgm_b[0][1] = 0.1; - //dgm_b[0][2] = 0.1; - - //dgm_b[1][0] = 1.1; - //dgm_b[1][1] = 0.0; - //dgm_b[1][2] = 0.0; - - //dgm_b[2][0] = 0.0; - //dgm_b[2][1] = 1.1; - //dgm_b[2][2] = 0.9; - - - //hera::AuctionParams params; - //params.dim = dim; - - - //std::cout << hera::ws::wasserstein_cost(dgm_a, dgm_b, params) << std::endl; - - //return 0; - //} - - - using Real = double; - using PointVector = hera::ws::dnn::DynamicPointVector; - PointVector set_A, set_B; - - hera::AuctionParams params; - - if (argc < 3 ) { - std::cerr << "Usage: " << argv[0] << " file1 file2 [wasserstein_degree] [relative_error] [internal norm] [initial epsilon] [epsilon_factor] [max_bids_per_round] [gamma_threshold][log_filename_prefix]. By default power is 1.0, relative error is 0.01, internal norm is l_infinity, initall epsilon is chosen automatically, epsilon factor is 5.0, Jacobi variant is used (max bids per round is maximal), gamma_threshold = 0.0." << std::endl; - return 1; - } - - int dimension_A, dimension_B; - - if (!hera::read_point_cloud(argv[1], set_A, dimension_A)) { - std::exit(1); - } - - if (!hera::read_point_cloud(argv[2], set_B, dimension_B)) { - std::exit(1); - } - - if (dimension_A != dimension_B) { - std::cerr << "Dimension mismatch: " << dimension_A << " != " << dimension_B << std::endl; - std::exit(1); - } - - params.dim = dimension_A; - - params.wasserstein_power = (4 <= argc) ? atof(argv[3]) : 1.0; - if (params.wasserstein_power < 1.0) { - std::cerr << "The third argument (wasserstein_degree) was \"" << argv[3] << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - //if (params.wasserstein_power == 1.0) { - // hera::remove_duplicates 0.0. Cannot proceed. " << std::endl; - std::exit(1); - } - - // default for internal metric is l_infinity - params.internal_p = ( 6 <= argc ) ? atof(argv[5]) : hera::get_infinity(); - if (std::isinf(params.internal_p)) { - params.internal_p = hera::get_infinity(); - } - - - if (not hera::is_p_valid_norm(params.internal_p)) { - std::cerr << "The 5th argument (internal norm) was \"" << argv[5] << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; - std::exit(1); - } - - // if you want to specify initial value for epsilon and the factor - // for epsilon-scaling - params.initial_epsilon= ( 7 <= argc ) ? atof(argv[6]) : 0.0 ; - - if (params.initial_epsilon < 0.0) { - std::cerr << "The 6th argument (initial epsilon) was \"" << argv[6] << "\", must be a non-negative number. Cannot proceed." << std::endl; - std::exit(1); - } - - params.epsilon_common_ratio = ( 8 <= argc ) ? atof(argv[7]) : 0.0 ; - if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { - std::cerr << "The 7th argument (epsilon factor) was \"" << argv[7] << "\", must be a number greater than 1. Cannot proceed." << std::endl; - std::exit(1); - } - - - params.max_bids_per_round = ( 9 <= argc ) ? atoi(argv[8]) : 0; - if (params.max_bids_per_round == 0) - params.max_bids_per_round = std::numeric_limits::max(); - - - params.gamma_threshold = (10 <= argc) ? atof(argv[9]) : 0.0; - - std::string log_filename_prefix = ( 11 <= argc ) ? argv[10] : ""; - - params.max_num_phases = 800; - -#ifdef LOG_AUCTION - spdlog::set_level(spdlog::level::critical); -#endif - - Real res = hera::ws::wasserstein_dist(set_A, set_B, params); - - std::cout << std::setprecision(15) << res << std::endl; - - return 0; -} diff --git a/geom_matching/wasserstein/include/auction_oracle.h b/geom_matching/wasserstein/include/auction_oracle.h deleted file mode 100644 index d285a1f..0000000 --- a/geom_matching/wasserstein/include/auction_oracle.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef HERA_AUCTION_ORACLE_H -#define HERA_AUCTION_ORACLE_H - -// all oracle classes are in separate h-hpp files -// this file comprises all of them - -#include "auction_oracle_base.h" -#include "auction_oracle_kdtree_restricted.h" -#include "auction_oracle_kdtree_single_diag.h" -#include "auction_oracle_stupid_sparse_restricted.h" - -#endif // HERA_AUCTION_ORACLE_H diff --git a/geom_matching/wasserstein/include/auction_oracle_base.h b/geom_matching/wasserstein/include/auction_oracle_base.h deleted file mode 100644 index 08eaf00..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_base.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_BASE_H -#define AUCTION_ORACLE_BASE_H - -#include -#include -#include -#include - -#include "basic_defs_ws.h" - -namespace hera { -namespace ws { - - -template -struct DebugOptimalBid { - DebugOptimalBid() : best_item_idx(k_invalid_index), best_item_value(-666.666), second_best_item_idx(k_invalid_index), second_best_item_value(-666.666) {}; - IdxType best_item_idx; - Real best_item_value; - IdxType second_best_item_idx; - Real second_best_item_value; -}; - -template >> -struct AuctionOracleBase { - AuctionOracleBase(const PointContainer_& _bidders, const PointContainer_& _items, const AuctionParams& params); - ~AuctionOracleBase() {} - Real get_epsilon() const { return epsilon; }; - void set_epsilon(Real new_epsilon) { assert(new_epsilon >= 0.0); epsilon = new_epsilon; }; - const std::vector& get_prices() const { return prices; } - virtual Real get_price(const size_t item_idx) const { return prices[item_idx]; } // TODO make virtual? -//protected: - const PointContainer_& bidders; - const PointContainer_& items; - const size_t num_bidders_; - const size_t num_items_; - std::vector prices; - const Real wasserstein_power; - Real epsilon; - const Real internal_p; - unsigned int dim; // used only in pure geometric version, not for persistence diagrams - Real get_value_for_bidder(size_t bidder_idx, size_t item_idx) const; - Real get_value_for_diagonal_bidder(size_t item_idx) const; - Real get_cost_for_diagonal_bidder(size_t item_idx) const; -}; - - -template -std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db); - -} // ws -} // hera - - -#include "auction_oracle_base.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_base.hpp b/geom_matching/wasserstein/include/auction_oracle_base.hpp deleted file mode 100644 index b74c7fb..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_base.hpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_BASE_HPP -#define AUCTION_ORACLE_BASE_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_oracle.h" - - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - -template -AuctionOracleBase::AuctionOracleBase(const PointContainer& _bidders, - const PointContainer& _items, - const AuctionParams& params) : - bidders(_bidders), - items(_items), - num_bidders_(_bidders.size()), - num_items_(_items.size()), - prices(items.size(), Real(0.0)), - wasserstein_power(params.wasserstein_power), - internal_p(params.internal_p), - dim(params.dim) -{ - assert(bidders.size() == items.size() ); -} - - -template -Real AuctionOracleBase::get_value_for_bidder(size_t bidder_idx, size_t item_idx) const -{ - return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dim), wasserstein_power) + get_price(item_idx); -} - -template -Real AuctionOracleBase::get_value_for_diagonal_bidder(size_t item_idx) const -{ - return get_cost_for_diagonal_bidder(item_idx) + get_price(item_idx); -} - -template -Real AuctionOracleBase::get_cost_for_diagonal_bidder(size_t item_idx) const -{ - return std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); -} - - - -template -std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db) -{ - output << "best_item_value = " << db.best_item_value; - output << "; best_item_idx = " << db.best_item_idx; - output << "; second_best_item_value = " << db.second_best_item_value; - output << "; second_best_item_idx = " << db.second_best_item_idx; - return output; -} - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.h b/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.h deleted file mode 100644 index 096583e..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_KDTREE_PURE_GEOM_H -#define AUCTION_ORACLE_KDTREE_PURE_GEOM_H - - -#include -#include -#include - -#include - -namespace ba = boost::adaptors; - -#include "spdlog/spdlog.h" -#include "basic_defs_ws.h" -#include "auction_oracle_base.h" -#include "dnn/geometry/euclidean-dynamic.h" -#include "dnn/local/kd-tree.h" - -namespace hera -{ -namespace ws -{ - -template > -struct AuctionOracleKDTreePureGeom : AuctionOracleBase { - - using Real = Real_; - using DynamicPointTraitsR = typename hera::ws::dnn::DynamicPointTraits; - using DiagramPointR = typename DynamicPointTraitsR::PointType; - using PointHandleR = typename DynamicPointTraitsR::PointHandle; - using PointContainer = PointContainer_; - using DebugOptimalBidR = typename ws::DebugOptimalBid; - - using DynamicPointTraits = hera::ws::dnn::DynamicPointTraits; - using KDTreeR = hera::ws::dnn::KDTree; - - AuctionOracleKDTreePureGeom(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); - ~AuctionOracleKDTreePureGeom(); - - // data members - // temporarily make everything public - DynamicPointTraits traits; - Real max_val_; - Real weight_adj_const_; - std::unique_ptr kdtree_; - std::vector kdtree_items_; - // methods - void set_price(const IdxType items_idx, const Real new_price); - IdxValPair get_optimal_bid(const IdxType bidder_idx); - void adjust_prices(); - void adjust_prices(const Real delta); - - // debug routines - DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; - void sanity_check(); - - std::shared_ptr console_logger; - - std::pair get_minmax_price() const; - -}; - -} // ws -} // hera - - -#include "auction_oracle_kdtree_pure_geom.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp b/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp deleted file mode 100644 index eaf54cf..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ -#ifndef AUCTION_ORACLE_KDTREE_PURE_GEOM_HPP -#define AUCTION_ORACLE_KDTREE_PURE_GEOM_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_oracle_kdtree_restricted.h" - - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - - -// ***************************** -// AuctionOracleKDTreePureGeom -// ***************************** - - - -template -std::ostream& operator<<(std::ostream& output, const AuctionOracleKDTreePureGeom& oracle) -{ - output << "Oracle " << &oracle << std::endl; - output << fmt::format(" max_val_ = {0}\n", - oracle.max_val_); - - output << fmt::format(" prices = {0}\n", - format_container_to_log(oracle.prices)); - - output << "end of oracle " << &oracle << std::endl; - return output; -} - - -template -AuctionOracleKDTreePureGeom::AuctionOracleKDTreePureGeom(const PointContainer_& _bidders, - const PointContainer_& _items, - const AuctionParams& params) : - AuctionOracleBase(_bidders, _items, params), - traits(params.dim) -{ - - traits.internal_p = params.internal_p; - - std::vector item_handles(this->num_items_); - for(size_t i = 0; i < this->num_items_; ++i) { - item_handles[i] = traits.handle(this->items[i]); - } - - //kdtree_ = std::unique_ptr(new KDTreeR(traits, - // this->items | ba::transformed([this](const DiagramPointR& p) { return traits.handle(p); }), - // params.wasserstein_power)); - - kdtree_ = std::unique_ptr(new KDTreeR(traits, item_handles, params.wasserstein_power)); - - - max_val_ = 3*getFurthestDistance3Approx_pg(this->bidders, this->items, params.internal_p, params.dim); - max_val_ = std::pow(max_val_, params.wasserstein_power); - weight_adj_const_ = max_val_; - - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); - console_logger->debug("KDTree Restricted oracle ctor done"); -} - - -template -typename AuctionOracleKDTreePureGeom::DebugOptimalBidR -AuctionOracleKDTreePureGeom::get_optimal_bid_debug(IdxType bidder_idx) const -{ - auto bidder = this->bidders[bidder_idx]; - - size_t best_item_idx = k_invalid_index; - size_t second_best_item_idx = k_invalid_index; - Real best_item_value = std::numeric_limits::max(); - Real second_best_item_value = std::numeric_limits::max(); - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - auto item = this->items[item_idx]; - auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx]; - if (item_value < best_item_value) { - best_item_value = item_value; - best_item_idx = item_idx; - } - } - - assert(best_item_idx != k_invalid_index); - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - auto item = this->items[item_idx]; - if (item_idx == best_item_idx) - continue; - - auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx]; - if (item_value < second_best_item_value) { - second_best_item_value = item_value; - second_best_item_idx = item_idx; - } - } - - assert(second_best_item_idx != k_invalid_index); - assert(second_best_item_value >= best_item_value); - - DebugOptimalBidR result; - - result.best_item_idx = best_item_idx; - result.best_item_value = best_item_value; - result.second_best_item_idx = second_best_item_idx; - result.second_best_item_value = second_best_item_value; - - return result; -} - - -template -IdxValPair AuctionOracleKDTreePureGeom::get_optimal_bid(IdxType bidder_idx) -{ - auto two_best_items = kdtree_->findK(this->bidders[bidder_idx], 2); - size_t best_item_idx = traits.id(two_best_items[0].p); - Real best_item_value = two_best_items[0].d; - Real second_best_item_value = two_best_items[1].d; - - IdxValPair result; - - assert( second_best_item_value >= best_item_value ); - - result.first = best_item_idx; - result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; - -#ifdef DEBUG_KDTREE_RESTR_ORACLE - auto bid_debug = get_optimal_bid_debug(bidder_idx); - assert(fabs(bid_debug.best_item_value - best_item_value) < 0.000000001); - assert(fabs(bid_debug.second_best_item_value - second_best_item_value) < 0.000000001); -#endif - - return result; -} - -/* -a_{ij} = d_{ij} -value_{ij} = a_{ij} + price_j -*/ - -template -void AuctionOracleKDTreePureGeom::set_price(IdxType item_idx, - Real new_price) -{ - - console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}", item_idx, new_price, this->prices[item_idx]); - - assert(this->prices.size() == this->items.size()); - // adjust_prices decreases prices, - // also this variable must be true in reverse phases of FR-auction - - this->prices[item_idx] = new_price; - kdtree_->change_weight( traits.handle(this->items[item_idx]), new_price); - - console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); -} - - -template -void AuctionOracleKDTreePureGeom::adjust_prices(Real delta) -{ - //console_logger->debug("Enter adjust_prices, delta = {0}", delta); - //std::cerr << *this << std::endl; - - if (delta == 0.0) - return; - - for(auto& p : this->prices) { - p -= delta; - } - - kdtree_->adjust_weights(delta); - - //std::cerr << *this << std::endl; - //console_logger->debug("Exit adjust_prices, delta = {0}", delta); -} - -template -void AuctionOracleKDTreePureGeom::adjust_prices() -{ - auto pr_begin = this->prices.begin(); - auto pr_end = this->prices.end(); - Real min_price = *(std::min_element(pr_begin, pr_end)); - adjust_prices(min_price); -} - -template -std::pair AuctionOracleKDTreePureGeom::get_minmax_price() const -{ - auto r = std::minmax_element(this->prices.begin(), this->prices.end()); - return std::make_pair(*r.first, *r.second); -} - -template -AuctionOracleKDTreePureGeom::~AuctionOracleKDTreePureGeom() -{ -} - -template -void AuctionOracleKDTreePureGeom::sanity_check() -{ -} - - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.h b/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.h deleted file mode 100644 index 1999147..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_H -#define AUCTION_ORACLE_KDTREE_RESTRICTED_H - - -//#define USE_BOOST_HEAP - -#include -#include -#include - - -#include "spdlog/spdlog.h" -#include "basic_defs_ws.h" -#include "diagonal_heap.h" -#include "auction_oracle_base.h" -#include "dnn/geometry/euclidean-fixed.h" -#include "dnn/local/kd-tree.h" - -namespace hera { -namespace ws { - -template >> -struct AuctionOracleKDTreeRestricted : AuctionOracleBase { - - using PointContainer = PointContainer_; - using Real = Real_; - - using LossesHeapR = typename ws::LossesHeapOld; - using LossesHeapRHandle = typename ws::LossesHeapOld::handle_type; - using DiagramPointR = typename ws::DiagramPoint; - using DebugOptimalBidR = typename ws::DebugOptimalBid; - - using DnnPoint = dnn::Point<2, Real>; - using DnnTraits = dnn::PointTraits; - - AuctionOracleKDTreeRestricted(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); - ~AuctionOracleKDTreeRestricted(); - // data members - // temporarily make everything public - Real max_val_; - Real weight_adj_const_; - dnn::KDTree* kdtree_; - std::vector dnn_points_; - std::vector dnn_point_handles_; - LossesHeapR diag_items_heap_; - std::vector diag_heap_handles_; - std::vector heap_handles_indices_; - std::vector kdtree_items_; - std::vector top_diag_indices_; - std::vector top_diag_lookup_; - size_t top_diag_counter_ { 0 }; - bool best_diagonal_items_computed_ { false }; - Real best_diagonal_item_value_; - size_t second_best_diagonal_item_idx_ { k_invalid_index }; - Real second_best_diagonal_item_value_ { std::numeric_limits::max() }; - - - // methods - void set_price(const IdxType items_idx, const Real new_price, const bool update_diag = true); - IdxValPair get_optimal_bid(const IdxType bidder_idx); - void adjust_prices(); - void adjust_prices(const Real delta); - - // debug routines - DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; - void sanity_check(); - - - // heap top vector - size_t get_heap_top_size() const; - void recompute_top_diag_items(bool hard = false); - void recompute_second_best_diag(); - void reset_top_diag_counter(); - void increment_top_diag_counter(); - void add_top_diag_index(const size_t item_idx); - void remove_top_diag_index(const size_t item_idx); - bool is_in_top_diag_indices(const size_t item_idx) const; - - std::shared_ptr console_logger; - - std::pair get_minmax_price() const; - -}; - -template -std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db); - -} // ws -} // hera - - -#include "auction_oracle_kdtree_restricted.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp b/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp deleted file mode 100644 index 8613ee1..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp +++ /dev/null @@ -1,598 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ -#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_HPP -#define AUCTION_ORACLE_KDTREE_RESTRICTED_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_oracle_kdtree_restricted.h" - - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - - -// ***************************** -// AuctionOracleKDTreeRestricted -// ***************************** - - - -template -std::ostream& operator<<(std::ostream& output, const AuctionOracleKDTreeRestricted& oracle) -{ - output << "Oracle " << &oracle << std::endl; - output << fmt::format(" max_val_ = {0}, best_diagonal_items_computed_ = {1}, best_diagonal_item_value_ = {2}, second_best_diagonal_item_idx_ = {3}, second_best_diagonal_item_value_ = {4}\n", - oracle.max_val_, - oracle.best_diagonal_items_computed_, - oracle.best_diagonal_item_value_, - oracle.second_best_diagonal_item_idx_, - oracle.second_best_diagonal_item_value_); - - output << fmt::format(" prices = {0}\n", - format_container_to_log(oracle.prices)); - - output << fmt::format(" diag_items_heap_ = {0}\n", - losses_heap_to_string(oracle.diag_items_heap_)); - - - output << fmt::format(" top_diag_indices_ = {0}\n", - format_container_to_log(oracle.top_diag_indices_)); - - output << fmt::format(" top_diag_counter_ = {0}\n", - oracle.top_diag_counter_); - - output << fmt::format(" top_diag_lookup_ = {0}\n", - format_container_to_log(oracle.top_diag_lookup_)); - - - output << "end of oracle " << &oracle << std::endl; - return output; -} - - -template -AuctionOracleKDTreeRestricted::AuctionOracleKDTreeRestricted(const PointContainer_& _bidders, - const PointContainer_& _items, - const AuctionParams& params) : - AuctionOracleBase(_bidders, _items, params), - heap_handles_indices_(_items.size(), k_invalid_index), - kdtree_items_(_items.size(), k_invalid_index), - top_diag_lookup_(_items.size(), k_invalid_index) -{ - size_t dnn_item_idx { 0 }; - size_t true_idx { 0 }; - dnn_points_.clear(); - dnn_points_.reserve(this->items.size()); - // store normal items in kd-tree - for(const auto& g : this->items) { - if (g.is_normal() ) { - kdtree_items_[true_idx] = dnn_item_idx; - // index of items is id of dnn-point - DnnPoint p(true_idx); - p[0] = g.getRealX(); - p[1] = g.getRealY(); - dnn_points_.push_back(p); - assert(dnn_item_idx == dnn_points_.size() - 1); - dnn_item_idx++; - } - true_idx++; - } - - assert(dnn_points_.size() < _items.size() ); - for(size_t i = 0; i < dnn_points_.size(); ++i) { - dnn_point_handles_.push_back(&dnn_points_[i]); - } - DnnTraits traits; - traits.internal_p = params.internal_p; - kdtree_ = new dnn::KDTree(traits, dnn_point_handles_, params.wasserstein_power); - - size_t handle_idx {0}; - for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { - if (this->items[item_idx].is_diagonal()) { - heap_handles_indices_[item_idx] = handle_idx++; - diag_heap_handles_.push_back(diag_items_heap_.push(std::make_pair(item_idx, 0.0))); - } - } - max_val_ = 3*getFurthestDistance3Approx<>(_bidders, _items, params.internal_p); - max_val_ = std::pow(max_val_, params.wasserstein_power); - weight_adj_const_ = max_val_; - - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); - console_logger->debug("KDTree Restricted oracle ctor done"); -} - - -template -bool AuctionOracleKDTreeRestricted::is_in_top_diag_indices(const size_t item_idx) const -{ - return top_diag_lookup_[item_idx] != k_invalid_index; -} - - -template -void AuctionOracleKDTreeRestricted::add_top_diag_index(const size_t item_idx) -{ - assert(find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx) == top_diag_indices_.end()); - assert(this->items[item_idx].is_diagonal()); - - top_diag_indices_.push_back(item_idx); - top_diag_lookup_[item_idx] = top_diag_indices_.size() - 1; -} - -template -void AuctionOracleKDTreeRestricted::remove_top_diag_index(const size_t item_idx) -{ - if (top_diag_indices_.size() > 1) { - // remove item_idx from top_diag_indices after swapping - // it with the last element, update index lookup appropriately - auto old_index = top_diag_lookup_[item_idx]; - auto end_element = top_diag_indices_.back(); - std::swap(top_diag_indices_[old_index], top_diag_indices_.back()); - top_diag_lookup_[end_element] = old_index; - } - - top_diag_indices_.pop_back(); - top_diag_lookup_[item_idx] = k_invalid_index; - if (top_diag_indices_.size() < 2) { - recompute_second_best_diag(); - } - best_diagonal_items_computed_ = not top_diag_indices_.empty(); - reset_top_diag_counter(); -} - - -template -void AuctionOracleKDTreeRestricted::increment_top_diag_counter() -{ - assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); - - ++top_diag_counter_; - if (top_diag_counter_ >= top_diag_indices_.size()) { - top_diag_counter_ -= top_diag_indices_.size(); - } - - assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); -} - - -template -void AuctionOracleKDTreeRestricted::reset_top_diag_counter() -{ - top_diag_counter_ = 0; -} - -template -void AuctionOracleKDTreeRestricted::recompute_top_diag_items(bool hard) -{ - console_logger->debug("Enter recompute_top_diag_items, hard = {0}", hard); - assert(hard or top_diag_indices_.empty()); - - if (hard) { - std::fill(top_diag_lookup_.begin(), top_diag_lookup_.end(), k_invalid_index); - top_diag_indices_.clear(); - } - - auto top_diag_iter = diag_items_heap_.ordered_begin(); - best_diagonal_item_value_ = top_diag_iter->second; - add_top_diag_index(top_diag_iter->first); - - ++top_diag_iter; - - // traverse the heap while we see the same value - while(top_diag_iter != diag_items_heap_.ordered_end()) { - if ( top_diag_iter->second != best_diagonal_item_value_) { - break; - } else { - add_top_diag_index(top_diag_iter->first); - } - ++top_diag_iter; - } - - recompute_second_best_diag(); - - best_diagonal_items_computed_ = true; - reset_top_diag_counter(); - console_logger->debug("Exit recompute_top_diag_items, hard = {0}", hard); -} - -template -typename AuctionOracleKDTreeRestricted::DebugOptimalBidR -AuctionOracleKDTreeRestricted::get_optimal_bid_debug(IdxType bidder_idx) const -{ - auto bidder = this->bidders[bidder_idx]; - - size_t best_item_idx = k_invalid_index; - size_t second_best_item_idx = k_invalid_index; - Real best_item_value = std::numeric_limits::max(); - Real second_best_item_value = std::numeric_limits::max(); - - for(IdxType item_idx = 0; item_idx < static_cast(this->items.size()); ++item_idx) { - auto item = this->items[item_idx]; - if (item.type != bidder.type and item_idx != bidder_idx) - continue; - auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx]; - if (item_value < best_item_value) { - best_item_value = item_value; - best_item_idx = item_idx; - } - } - - assert(best_item_idx != k_invalid_index); - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - auto item = this->items[item_idx]; - if (item.type != bidder.type and static_cast(item_idx) != bidder_idx) - continue; - if (item_idx == best_item_idx) - continue; - auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx]; - if (item_value < second_best_item_value) { - second_best_item_value = item_value; - second_best_item_idx = item_idx; - } - } - - assert(second_best_item_idx != k_invalid_index); - assert(second_best_item_value >= best_item_value); - - DebugOptimalBidR result; - - result.best_item_idx = best_item_idx; - result.best_item_value = best_item_value; - result.second_best_item_idx = second_best_item_idx; - result.second_best_item_value = second_best_item_value; - - return result; -} - - -template -IdxValPair AuctionOracleKDTreeRestricted::get_optimal_bid(IdxType bidder_idx) -{ - auto bidder = this->bidders[bidder_idx]; - - // corresponding point is always considered as a candidate - // if bidder is a diagonal point, proj_item is a normal point, - // and vice versa. - - size_t best_item_idx { k_invalid_index }; - size_t second_best_item_idx { k_invalid_index }; - size_t best_diagonal_item_idx { k_invalid_index }; - Real best_item_value; - Real second_best_item_value; - - - size_t proj_item_idx = bidder_idx; - assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); - assert(this->items[proj_item_idx].type != bidder.type); - Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); - - if (bidder.is_diagonal()) { - // for diagonal bidder the only normal point has already been added - // the other 2 candidates are diagonal items only, get from the heap - // with prices - - if (not best_diagonal_items_computed_) { - recompute_top_diag_items(); - } - - best_diagonal_item_idx = top_diag_indices_[top_diag_counter_]; - increment_top_diag_counter(); - - if ( proj_item_value < best_diagonal_item_value_) { - best_item_idx = proj_item_idx; - best_item_value = proj_item_value; - second_best_item_value = best_diagonal_item_value_; - second_best_item_idx = best_diagonal_item_idx; - } else if (proj_item_value < second_best_diagonal_item_value_) { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value_; - second_best_item_value = proj_item_value; - second_best_item_idx = proj_item_idx; - } else { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value_; - second_best_item_value = second_best_diagonal_item_value_; - second_best_item_idx = second_best_diagonal_item_idx_; - } - } else { - // for normal bidder get 2 best items among non-diagonal points from - // kdtree_ - DnnPoint bidder_dnn; - bidder_dnn[0] = bidder.getRealX(); - bidder_dnn[1] = bidder.getRealY(); - auto two_best_items = kdtree_->findK(bidder_dnn, 2); - size_t best_normal_item_idx { two_best_items[0].p->id() }; - Real best_normal_item_value { two_best_items[0].d }; - // if there is only one off-diagonal point in the second diagram, - // kd-tree will not return the second candidate. - // Set its value to inf, so it will always lose to the value of the projection - Real second_best_normal_item_value { two_best_items.size() == 1 ? std::numeric_limits::max() : two_best_items[1].d }; - - if ( proj_item_value < best_normal_item_value) { - best_item_idx = proj_item_idx; - best_item_value = proj_item_value; - second_best_item_value = best_normal_item_value; - } else if (proj_item_value < second_best_normal_item_value) { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = proj_item_value; - } else { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = second_best_normal_item_value; - } - } - - IdxValPair result; - - assert( second_best_item_value >= best_item_value ); - - result.first = best_item_idx; - result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; - -#ifdef DEBUG_KDTREE_RESTR_ORACLE - auto db = get_optimal_bid_debug(bidder_idx); - assert(fabs(db.best_item_value - best_item_value) < 0.000001); - if (fabs(db.second_best_item_value - second_best_item_value) >= 0.000001) { - console_logger->debug("Bidder_idx = {0}, best_item_idx = {1}, true_best_item_idx = {2}", bidder_idx, best_item_idx, db.best_item_idx); - console_logger->debug("second_best_item_idx = {0}, true second_best_item_idx = {1}", second_best_item_idx, db.second_best_item_idx); - console_logger->debug("second_best_value = {0}, true second_best_item_value = {1}", second_best_item_value, db.second_best_item_value); - console_logger->debug("prices = {0}", format_container_to_log(this->prices)); - console_logger->debug("top_diag_indices_ = {0}", format_container_to_log(top_diag_indices_)); - console_logger->debug("second_best_diagonal_item_value_ = {0}", second_best_diagonal_item_value_); - } - assert(fabs(db.second_best_item_value - second_best_item_value) < 0.000001); - //std::cout << "bid OK" << std::endl; -#endif - - return result; -} -/* -a_{ij} = d_{ij} -value_{ij} = a_{ij} + price_j -*/ -template -void AuctionOracleKDTreeRestricted::recompute_second_best_diag() -{ - - console_logger->debug("Enter recompute_second_best_diag"); - - if (top_diag_indices_.size() > 1) { - second_best_diagonal_item_value_ = best_diagonal_item_value_; - second_best_diagonal_item_idx_ = top_diag_indices_[0]; - } else { - if (diag_items_heap_.size() == 1) { - second_best_diagonal_item_value_ = std::numeric_limits::max(); - second_best_diagonal_item_idx_ = k_invalid_index; - } else { - auto diag_iter = diag_items_heap_.ordered_begin(); - ++diag_iter; - second_best_diagonal_item_value_ = diag_iter->second; - second_best_diagonal_item_idx_ = diag_iter->first; - } - } - - console_logger->debug("Exit recompute_second_best_diag, second_best_diagonal_item_value_ = {0}, second_best_diagonal_item_idx_ = {1}", second_best_diagonal_item_value_, second_best_diagonal_item_idx_); -} - - -template -void AuctionOracleKDTreeRestricted::set_price(IdxType item_idx, - Real new_price, - const bool update_diag) -{ - - console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}, update_diag = {3}", item_idx, new_price, this->prices[item_idx], update_diag); - - assert(this->prices.size() == this->items.size()); - assert( 0 < diag_heap_handles_.size() and diag_heap_handles_.size() <= this->items.size()); - // adjust_prices decreases prices, - // also this variable must be true in reverse phases of FR-auction - bool item_goes_down = new_price > this->prices[item_idx]; - - this->prices[item_idx] = new_price; - if ( this->items[item_idx].is_normal() ) { - assert(0 <= item_idx and item_idx < static_cast(kdtree_items_.size())); - assert(0 <= kdtree_items_[item_idx] and kdtree_items_[item_idx] < dnn_point_handles_.size()); - kdtree_->change_weight( dnn_point_handles_[kdtree_items_[item_idx]], new_price); - } else { - assert(diag_heap_handles_.size() > heap_handles_indices_.at(item_idx)); - if (item_goes_down) { - diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } else { - diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } - if (update_diag) { - // Update top_diag_indices_ only if necessary: - // normal bidders take their projections, which might not be on top - // also, set_price is called by adjust_prices, and we may have already - // removed the item from top_diag - if (is_in_top_diag_indices(item_idx)) { - remove_top_diag_index(item_idx); - } - - if (item_idx == (IdxType)second_best_diagonal_item_idx_) { - recompute_second_best_diag(); - } - } - } - - console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); -} - - -template -void AuctionOracleKDTreeRestricted::adjust_prices(Real delta) -{ - //console_logger->debug("Enter adjust_prices, delta = {0}", delta); - //std::cerr << *this << std::endl; - - if (delta == 0.0) - return; - - for(auto& p : this->prices) { - p -= delta; - } - - kdtree_->adjust_weights(delta); - - bool price_goes_up = delta < 0; - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - if (this->items[item_idx].is_diagonal()) { - auto new_price = this->prices[item_idx]; - if (price_goes_up) { - diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } else { - diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } - } - } - best_diagonal_item_value_ -= delta; - second_best_diagonal_item_value_ -= delta; - - //std::cerr << *this << std::endl; - //console_logger->debug("Exit adjust_prices, delta = {0}", delta); -} - -template -void AuctionOracleKDTreeRestricted::adjust_prices() -{ - auto pr_begin = this->prices.begin(); - auto pr_end = this->prices.end(); - Real min_price = *(std::min_element(pr_begin, pr_end)); - adjust_prices(min_price); -} - -template -size_t AuctionOracleKDTreeRestricted::get_heap_top_size() const -{ - return top_diag_indices_.size(); -} - -template -std::pair AuctionOracleKDTreeRestricted::get_minmax_price() const -{ - auto r = std::minmax_element(this->prices.begin(), this->prices.end()); - return std::make_pair(*r.first, *r.second); -} - - - -template -AuctionOracleKDTreeRestricted::~AuctionOracleKDTreeRestricted() -{ - delete kdtree_; -} - -template -void AuctionOracleKDTreeRestricted::sanity_check() -{ -#ifdef DEBUG_KDTREE_RESTR_ORACLE - if (best_diagonal_items_computed_) { - std::vector diag_items_price_vec; - diag_items_price_vec.reserve(this->items.size()); - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - if (this->items.at(item_idx).is_diagonal()) { - diag_items_price_vec.push_back(this->prices.at(item_idx)); - } else { - diag_items_price_vec.push_back(std::numeric_limits::max()); - } - } - - auto best_iter = std::min_element(diag_items_price_vec.begin(), diag_items_price_vec.end()); - assert(best_iter != diag_items_price_vec.end()); - Real true_best_diag_value = *best_iter; - size_t true_best_diag_idx = best_iter - diag_items_price_vec.begin(); - assert(true_best_diag_value != std::numeric_limits::max()); - - Real true_second_best_diag_value = std::numeric_limits::max(); - size_t true_second_best_diag_idx = k_invalid_index; - for(size_t item_idx = 0; item_idx < diag_items_price_vec.size(); ++item_idx) { - if (this->items.at(item_idx).is_normal()) { - assert(top_diag_lookup_.at(item_idx) == k_invalid_index); - continue; - } - - auto i_iter = std::find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx); - if (diag_items_price_vec.at(item_idx) == true_best_diag_value) { - assert(i_iter != top_diag_indices_.end()); - assert(top_diag_lookup_.at(item_idx) == i_iter - top_diag_indices_.begin()); - } else { - assert(top_diag_lookup_.at(item_idx) == k_invalid_index); - assert(i_iter == top_diag_indices_.end()); - } - - if (item_idx == true_best_diag_idx) { - continue; - } - if (diag_items_price_vec.at(item_idx) < true_second_best_diag_value) { - true_second_best_diag_value = diag_items_price_vec.at(item_idx); - true_second_best_diag_idx = item_idx; - } - } - - if (true_best_diag_value != best_diagonal_item_value_) { - console_logger->debug("best_diagonal_item_value_ = {0}, true value = {1}", best_diagonal_item_value_, true_best_diag_value); - std::cerr << *this; - //console_logger->debug("{0}", *this); - } - - assert(true_best_diag_value == best_diagonal_item_value_); - - assert(true_second_best_diag_idx != k_invalid_index); - - if (true_second_best_diag_value != second_best_diagonal_item_value_) { - console_logger->debug("second_best_diagonal_item_value_ = {0}, true value = {1}", second_best_diagonal_item_value_, true_second_best_diag_value); - //console_logger->debug("{0}", *this); - } - - assert(true_second_best_diag_value == second_best_diagonal_item_value_); - } -#endif -} - - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.h b/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.h deleted file mode 100644 index 9192993..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_KDTREE_SINGLE_DIAG_H -#define AUCTION_ORACLE_KDTREE_SINGLE_DIAG_H - - -#include -#include -#include -#include -#include - -#include "basic_defs_ws.h" -#include "dnn/geometry/euclidean-fixed.h" -#include "dnn/local/kd-tree.h" - -namespace hera { -namespace ws { - - -template -struct ItemSlice; - -template -bool operator<(const ItemSlice& s_1, const ItemSlice& s_2); - -template -bool operator>(const ItemSlice& s_1, const ItemSlice& s_2); - -template -struct ItemSlice { -public: - using RealType = Real; - - size_t item_idx; - Real loss; - ItemSlice(size_t _item_idx, const Real _loss); - - void set_loss(const Real new_loss) { loss = new_loss; } - void adjust_loss(const Real delta) { loss -= delta; } - - friend bool operator< <>(const ItemSlice&, const ItemSlice&); - friend bool operator> <>(const ItemSlice&, const ItemSlice&); - -private: -}; - - -template -class LossesHeap { -public: - using ItemSliceR = ItemSlice; - using KeeperTypeR = std::set >; - using IterTypeR = typename KeeperTypeR::iterator; - - LossesHeap() {} - LossesHeap(const std::vector&); - void adjust_prices(const Real delta); // subtract delta from all values - ItemSliceR get_best_slice() const; - ItemSliceR get_second_best_slice() const; - - template - decltype(auto) emplace(Args&&... args) - { - return keeper.emplace(std::forward(args)...); - } - - - IterTypeR begin() { return keeper.begin(); } - IterTypeR end() { return keeper.end(); } - void erase(IterTypeR iter) { assert(iter != keeper.end()); keeper.erase(iter); } - decltype(auto) insert(const ItemSliceR& item) { return keeper.insert(item); } - size_t size() const { return keeper.size(); } - bool empty() const { return keeper.empty(); } -//private: - std::set > keeper; -}; - -template -struct DiagonalBid { - DiagonalBid() {} - - std::vector assigned_normal_items; - std::vector assigned_normal_items_bid_values; - - std::vector best_item_indices; - std::vector bid_values; - - // common bid value for diag-diag - Real diag_to_diag_value { 0.0 }; - - // analogous to second best item value; denoted by w in Bertsekas's paper on auction for transportation problem - Real almost_best_value { 0.0 }; - - // how many points to get from unassigned diagonal chunk - int num_from_unassigned_diag { 0 }; -}; - -template >> -struct AuctionOracleKDTreeSingleDiag : AuctionOracleBase { - - using PointContainer = PointContainer_; - using Real = Real_; - - using DnnPoint = dnn::Point<2, Real>; - using DnnTraits = dnn::PointTraits; - - using IdxValPairR = typename ws::IdxValPair; - using ItemSliceR = typename ws::ItemSlice; - using LossesHeapR = typename ws::LossesHeap; - using LossesHeapIterR = typename ws::LossesHeap::IterTypeR; - using DiagramPointR = typename ws::DiagramPoint; - using DiagonalBidR = typename ws::DiagonalBid; - - AuctionOracleKDTreeSingleDiag(const PointContainer& bidders, - const PointContainer& items, - const AuctionParams& params); - ~AuctionOracleKDTreeSingleDiag(); - // data members - // temporarily make everything public - Real max_val_; - size_t num_diag_items_; - size_t num_normal_items_; - size_t num_diag_bidders_; - size_t num_normal_bidders_; - dnn::KDTree* kdtree_; - std::vector dnn_points_; - std::vector dnn_point_handles_; - std::vector kdtree__items_; - - // this heap is used by off-diagonal bidders to get the cheapest diagonal - // item; index in the IdxVal is a valid item index in the vector of items - // items in diag_assigned_to_diag_slice_ and in diag_unassigned_slice_ - // are not stored in this heap - LossesHeapR diag_items_heap_; - // vector of iterators; if item_idx is in diag_assigned_to_diag_slice_ or - // in diag_unassigned_slice_, then diag_items_heap__iters_[item_idx] == - // diag_items_heap_.end() - std::vector diag_items_heap__iters_; - - - // this heap is used by _the_ diagonal bidder to get the cheapest items - // * value in IdxValPair is price + persistence (i.e., price for - // diagonal items) - // * index in IdxValPair is a valid item index in the vector of items - // items in diag_assigned_to_diag_slice_ and in diag_unassigned_slice_ - // are not stored in this heap - LossesHeapR all_items_heap_; - std::vector all_items_heap__iters_; - - std::unordered_set diag_assigned_to_diag_slice_; - std::unordered_set diag_unassigned_slice_; - - - std::unordered_set normal_items_assigned_to_diag_; - - Real diag_to_diag_price_; - Real diag_unassigned_price_; - - // methods - Real get_price(const size_t item_idx) const override; - void set_price(const size_t item_idx, - const Real new_price, - const bool item_is_diagonal, - const bool bidder_is_diagonal, - const OwnerType old_owner_type); - - IdxValPair get_optimal_bid(const IdxType bidder_idx); - - DiagonalBidR get_optimal_bids_for_diagonal(int unassigned_mass); - void process_unassigned_diagonal(const int unassigned_mass, - int& accumulated_mass, - bool& saw_diagonal_slice, - int& num_classes, - Real& w, - DiagonalBidR& result, - bool& found_w); - - void adjust_prices(); - void flush_assignment(); - void sanity_check(); - - bool is_item_diagonal(const size_t item_idx) const; - bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } - -}; - -} // ws -} // hera - -#include "auction_oracle_kdtree_single_diag.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.hpp b/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.hpp deleted file mode 100644 index 42677ab..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_kdtree_single_diag.hpp +++ /dev/null @@ -1,717 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ -#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_SINGLE_DIAG_HPP -#define AUCTION_ORACLE_KDTREE_RESTRICTED_SINGLE_DIAG_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_oracle.h" - - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - -// ***************************** -// AuctionOracleKDTreeSingleDiag -// ***************************** - - - -template -ItemSlice::ItemSlice(size_t _item_idx, - const Real _loss) : - item_idx(_item_idx), - loss(_loss) -{ -} - - -template -bool operator<(const ItemSlice& s_1, const ItemSlice& s_2) -{ - return s_1.loss < s_2.loss - or (s_1.loss == s_2.loss and s_1.item_idx < s_2.item_idx); -} - -template -bool operator>(const ItemSlice& s_1, const ItemSlice& s_2) -{ - return s_1.loss > s_2.loss - or (s_1.loss == s_2.loss and s_1.item_idx > s_2.item_idx); -} - -template -std::ostream& operator<<(std::ostream& s, const ItemSlice& x) -{ - s << "(" << x.item_idx << ", " << x.loss << ")"; - return s; -} - -// ***************************** -// LossesHeap -// ***************************** - - -template -void LossesHeap::adjust_prices(const Real delta) -{ - throw std::runtime_error("not implemented"); -} - -template -typename LossesHeap::ItemSliceR LossesHeap::get_best_slice() const -{ - return *(keeper.begin()); -} - -template -typename LossesHeap::ItemSliceR LossesHeap::get_second_best_slice() const -{ - if (keeper.size() > 1) { - return *std::next(keeper.begin()); - } else { - return ItemSliceR(k_invalid_index, std::numeric_limits::max()); - } -} - -template -std::ostream& operator<<(std::ostream& s, const LossesHeap& x) -{ - s << "Heap[ "; - for(auto iter = x.keeper.begin(); iter != x.keeper.end(); ++iter) { - s << *iter << "\n"; - } - s << "]\n"; - return s; -} - -// ***************************** -// DiagonalBid -// ***************************** - -template -std::ostream& operator<<(std::ostream& s, const DiagonalBid& b) -{ - s << "DiagonalBid { num_from_unassigned_diag = " << b.num_from_unassigned_diag; - s << ", diag_to_diag_value = " << b.diag_to_diag_value; - s << ", almost_best_value = " << b.almost_best_value; - s << ",\nbest_item_indices = ["; - for(const auto i : b.best_item_indices) { - s << i << ", "; - } - s << "]\n"; - - s << ",\nbid_values= ["; - for(const auto v : b.bid_values) { - s << v << ", "; - } - s << "]\n"; - - s << ",\nassigned_normal_items= ["; - for(const auto i : b.assigned_normal_items) { - s << i << ", "; - } - s << "]\n"; - - s << ",\nassigned_normal_items_bid_values = ["; - for(const auto v : b.assigned_normal_items_bid_values) { - s << v << ", "; - } - s << "]\n"; - - return s; -} - -// ***************************** -// AuctionOracleKDTreeSingleDiag -// ***************************** - -template -std::ostream& operator<<(std::ostream& s, const AuctionOracleKDTreeSingleDiag& x) -{ - s << "oracle: bidders" << std::endl; - for(const auto& p : x.bidders) { - s << p << "\n"; - } - s << "items:"; - - for(const auto& p : x.items) { - s << p << "\n"; - } - - s << "diag_unassigned_slice_.size = " << x.diag_unassigned_slice_.size() << ", "; - s << "diag_unassigned_price_ = " << x.diag_unassigned_price_ << ", "; - s << "diag unassigned slice ["; - - for(const auto& i : x.diag_unassigned_slice_) { - s << i << ", "; - } - s << "]\n "; - - s << "diag_assigned_to_diag_slice_.size = " << x.diag_assigned_to_diag_slice_.size() << ", "; - s << "diag_assigned_to_diag_price = " << x.diag_to_diag_price_ << "\n"; - s << "diag_assigned_to_diag_slice_ ["; - - for(const auto& i : x.diag_assigned_to_diag_slice_) { - s << i << ", "; - } - s << "]\n "; - - s << "diag_items_heap_.size = " << x.diag_items_heap_.size() << "\n "; - s << x.diag_items_heap_; - - s << "all_items_heap_.size = " << x.all_items_heap_.size() << "\n "; - s << x.all_items_heap_; - - s << "epsilon = " << x.epsilon << std::endl; - - return s; -} - - -template -AuctionOracleKDTreeSingleDiag::AuctionOracleKDTreeSingleDiag(const PointContainer_& _bidders, - const PointContainer_& _items, - const AuctionParams& params) : - AuctionOracleBase(_bidders, _items, params), - max_val_(std::pow( 3.0 * getFurthestDistance3Approx<>(_bidders, _items, params.internal_p), params.wasserstein_power)), - num_diag_items_(0), - kdtree__items_(_items.size(), k_invalid_index) -{ - size_t dnn_item_idx { 0 }; - dnn_points_.clear(); - - all_items_heap__iters_.clear(); - all_items_heap__iters_.reserve( 4 * _items.size() / 7); - - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - const auto& item = this->items[item_idx]; - if (item.is_normal() ) { - // store normal items in kd-tree - kdtree__items_[item_idx] = dnn_item_idx; - // index of items is id of dnn-point - DnnPoint p(item_idx); - p[0] = item.x; - p[1] = item.y; - dnn_points_.push_back(p); - assert(dnn_item_idx == dnn_points_.size() - 1); - dnn_item_idx++; - // add slice to vector - auto ins_res = all_items_heap_.emplace(item_idx, this->get_value_for_diagonal_bidder(item_idx)); - all_items_heap__iters_.push_back(ins_res.first); - assert(ins_res.second); - } else { - // all diagonal items are initially in the unassigned slice - diag_unassigned_slice_.insert(item_idx); - all_items_heap__iters_.push_back(all_items_heap_.end()); - diag_items_heap__iters_.push_back(diag_items_heap_.end()); - ++num_diag_items_; - } - } - - num_normal_items_ = this->items.size() - num_diag_items_; - num_normal_bidders_ = num_diag_items_; - num_diag_bidders_ = this->bidders.size() - num_normal_bidders_; - - assert(dnn_points_.size() < _items.size() ); - for(size_t i = 0; i < dnn_points_.size(); ++i) { - dnn_point_handles_.push_back(&dnn_points_[i]); - } - - DnnTraits traits; - traits.internal_p = params.internal_p; - - kdtree_ = new dnn::KDTree(traits, dnn_point_handles_, this->wasserstein_power); - - sanity_check(); - - //std::cout << "IN CTOR: " << *this << std::endl; - -} - - -template -void AuctionOracleKDTreeSingleDiag::process_unassigned_diagonal(const int unassigned_mass, int& accumulated_mass, bool& saw_diagonal_slice, int& num_classes, Real& w, DiagonalBidR& result, bool& found_w) -{ - result.num_from_unassigned_diag = std::min(static_cast(diag_unassigned_slice_.size()), static_cast(unassigned_mass - accumulated_mass)); - if (not saw_diagonal_slice) { - saw_diagonal_slice = true; - ++num_classes; - } - - accumulated_mass += result.num_from_unassigned_diag; - //std::cout << "got mass from diagunassigned_slice, result.num_from_unassigned_diag = " << result.num_from_unassigned_diag << ", accumulated_mass = " << accumulated_mass << std::endl; - - if (static_cast(diag_unassigned_slice_.size()) > result.num_from_unassigned_diag and num_classes >= 2) { - found_w = true; - w = diag_unassigned_price_; - //std::cout << "w found from diag_unassigned_slice_, too, w = " << w << std::endl; - result.almost_best_value = w; - } - -} - - -template -typename AuctionOracleKDTreeSingleDiag::DiagonalBidR AuctionOracleKDTreeSingleDiag::get_optimal_bids_for_diagonal(int unassigned_mass) -{ - sanity_check(); - - assert(unassigned_mass == static_cast(num_diag_bidders_) - - static_cast(normal_items_assigned_to_diag_.size()) - - static_cast(diag_assigned_to_diag_slice_.size()) ); - assert(unassigned_mass > 0); - - DiagonalBidR result; - - - // number of similarity classes already assigned to diagonal bidder - // each normal point is a single class - // all diagonal points are in one class - int num_classes = normal_items_assigned_to_diag_.size() + ( diag_assigned_to_diag_slice_.empty() ? 0 : 1 ); - bool saw_diagonal_slice = not diag_assigned_to_diag_slice_.empty(); - bool found_w = false; - - //std::cout << "Enter get_optimal_bids_for_diagonal, unassigned_mass = " << unassigned_mass <<", num_classes = " << num_classes << ", saw_diagonal_slice = " << std::boolalpha << saw_diagonal_slice << std::endl; - - decltype(unassigned_mass) accumulated_mass = 0; - - - Real w { std::numeric_limits::max() }; - bool unassigned_not_processed = not diag_unassigned_slice_.empty(); - - for(auto slice_iter = all_items_heap_.begin(); slice_iter != all_items_heap_.end(); ++slice_iter) { - - auto slice = *slice_iter; - - if ( is_item_normal(slice.item_idx) and normal_items_assigned_to_diag_.count(slice.item_idx) == 1) { - //std::cout << __LINE__ << ": skipping slice " << slice << std::endl; - // this item is already assigned to diagonal bidder, skip - continue; - } - - if (unassigned_not_processed and slice.loss >= diag_unassigned_price_) { - // diag_unassigned slice is better, - // process it first - process_unassigned_diagonal(unassigned_mass, accumulated_mass, saw_diagonal_slice, num_classes, w, result, found_w); - unassigned_not_processed = false; - if (accumulated_mass >= unassigned_mass and found_w) { - break; - } - } - - - if (is_item_normal(slice.item_idx)) { - // all off-diagonal items are distinct - ++num_classes; - } else if (not saw_diagonal_slice) { - saw_diagonal_slice = true; - ++num_classes; - } - - if (accumulated_mass < unassigned_mass) { - //std::cout << __LINE__ << ": added slice to best items " << slice << std::endl; - result.best_item_indices.push_back(slice.item_idx); - } - - if (accumulated_mass >= unassigned_mass and num_classes >= 2) { - //std::cout << "Found w, slice = " << slice << std::endl; - w = slice.loss; - found_w = true; - result.almost_best_value = w; - break; - } - - // all items in all_items heap have mass 1 - ++accumulated_mass; - //std::cout << "accumulated_mass = " << accumulated_mass << std::endl; - - } - - if (unassigned_not_processed and (accumulated_mass < unassigned_mass or not found_w)) { - process_unassigned_diagonal(unassigned_mass, accumulated_mass, saw_diagonal_slice, num_classes, w, result, found_w); - } - - assert(found_w); - - //if (w == std::numeric_limits::max()) { std::cout << "HERE: " << *this << std::endl; } - assert(w != std::numeric_limits::max()); - - result.assigned_normal_items.clear(); - result.assigned_normal_items_bid_values.clear(); - - result.assigned_normal_items.reserve(normal_items_assigned_to_diag_.size()); - result.assigned_normal_items_bid_values.reserve(normal_items_assigned_to_diag_.size()); - - // add already assigned normal items and their new prices to bid - for(const auto item_idx : normal_items_assigned_to_diag_) { - assert( all_items_heap__iters_[item_idx] != all_items_heap_.end() ); - assert( is_item_normal(item_idx) ); - - result.assigned_normal_items.push_back(item_idx); - Real bid_value = w - this->get_cost_for_diagonal_bidder(item_idx) + this->epsilon; - //if ( bid_value <= this->get_price(item_idx) ) { - //std::cout << bid_value << " vs price " << this->get_price(item_idx) << std::endl; - //std::cout << *this << std::endl; - //} - assert( bid_value >= this->get_price(item_idx) ); - result.assigned_normal_items_bid_values.push_back(bid_value); - } - - // calculate bid values - // diag-to-diag items all have the same bid value - if (saw_diagonal_slice) { - result.diag_to_diag_value = w + this->epsilon; - } else { - result.diag_to_diag_value = std::numeric_limits::max(); - } - - result.bid_values.reserve(result.best_item_indices.size()); - for(const auto item_idx : result.best_item_indices) { - Real bid_value = w - this->get_cost_for_diagonal_bidder(item_idx) + this->epsilon; - result.bid_values.push_back(bid_value); - } - - return result; -} - - -template -IdxValPair AuctionOracleKDTreeSingleDiag::get_optimal_bid(IdxType bidder_idx) -{ - //std::cout << "enter get_optimal_bid" << std::endl; - sanity_check(); - - auto bidder = this->bidders[bidder_idx]; - - size_t best_item_idx; - Real best_item_price; - Real best_item_value; - Real second_best_item_value; - - // this function is for normal bidders only - assert(bidder.is_normal()); - - - // get 2 best items among non-diagonal points from kdtree_ - DnnPoint bidder_dnn; - bidder_dnn[0] = bidder.getRealX(); - bidder_dnn[1] = bidder.getRealY(); - auto two_best_items = kdtree_->findK(bidder_dnn, 2); - size_t best_normal_item_idx { two_best_items[0].p->id() }; - Real best_normal_item_value { two_best_items[0].d }; - // if there is only one off-diagonal point in the second diagram, - // kd-tree will not return the second candidate. - // Set its price to inf, so it will always lose to the price of the projection - Real second_best_normal_item_value { two_best_items.size() == 1 ? std::numeric_limits::max() : two_best_items[1].d }; - - size_t best_diag_item_idx; - Real best_diag_value; - Real best_diag_price; - - { - Real diag_edge_cost = std::pow(bidder.persistence_lp(this->internal_p), this->wasserstein_power); - auto best_diag_price_in_heap = diag_items_heap_.empty() ? std::numeric_limits::max() : diag_items_heap_.get_best_slice().loss; - auto best_diag_idx_in_heap = diag_items_heap_.empty() ? k_invalid_index : diag_items_heap_.get_best_slice().item_idx; - // if unassigned_diag_slice is empty, its price is max, - // same for diag-diag assigned slice, so the ifs below will work - - if (best_diag_price_in_heap <= diag_to_diag_price_ and best_diag_price_in_heap <= diag_unassigned_price_) { - best_diag_item_idx = best_diag_idx_in_heap; - best_diag_value = diag_edge_cost + best_diag_price_in_heap; - best_diag_price = best_diag_price_in_heap; - } else if (diag_to_diag_price_ < best_diag_price_in_heap and diag_to_diag_price_ < diag_unassigned_price_) { - best_diag_item_idx = *diag_assigned_to_diag_slice_.begin(); - best_diag_value = diag_edge_cost + diag_to_diag_price_; - best_diag_price = diag_to_diag_price_; - } else { - best_diag_item_idx = *diag_unassigned_slice_.begin(); - best_diag_value = diag_edge_cost + diag_unassigned_price_; - best_diag_price = diag_unassigned_price_; - } - - } - - if ( best_diag_value < best_normal_item_value) { - best_item_idx = best_diag_item_idx; - best_item_price = best_diag_price; - best_item_value = best_diag_value; - second_best_item_value = best_normal_item_value; - } else if (best_diag_value < second_best_normal_item_value) { - best_item_idx = best_normal_item_idx; - best_item_price = this->get_price(best_item_idx); - best_item_value = best_normal_item_value; - second_best_item_value = best_diag_value; - } else { - best_item_idx = best_normal_item_idx; - best_item_price = this->get_price(best_item_idx); - best_item_value = best_normal_item_value; - second_best_item_value = second_best_normal_item_value; - } - - IdxValPair result; - - result.first = best_item_idx; - result.second = ( second_best_item_value - best_item_value ) + best_item_price + this->epsilon; - - //std::cout << "bidder_idx = " << bidder_idx << ", best_item_idx = " << best_item_idx << ", best_item_value = " << best_item_value << ", second_best_item_value = " << second_best_item_value << ", eps = " << this->epsilon << std::endl; - assert( second_best_item_value >= best_item_value ); - //assert( best_item_price == this->get_price(best_item_idx) ); - assert(result.second >= best_item_price); - sanity_check(); - - return result; -} -/* -a_{ij} = d_{ij} -price_{ij} = a_{ij} + price_j -*/ - - - -//template -//std::vector AuctionOracleKDTreeSingleDiag::increase_price_of_assigned_to_diag(WHAT) -//{ - //WHAT; -//} -// - -template -Real_ AuctionOracleKDTreeSingleDiag::get_price(const size_t item_idx) const -{ - if (is_item_diagonal(item_idx)) { - if (diag_assigned_to_diag_slice_.count(item_idx) == 1) { - return diag_to_diag_price_; - } else if (diag_unassigned_slice_.count(item_idx) == 1) { - return diag_unassigned_price_; - } - } - return this-> prices[item_idx]; -} - -template -void AuctionOracleKDTreeSingleDiag::set_price(const size_t item_idx, - const Real new_price, - const bool item_is_diagonal, - const bool bidder_is_diagonal, - const OwnerType old_owner_type) -{ - - //std::cout << std::boolalpha << "enter set_price, item_idx = " << item_idx << ", new_price = " << new_price << ", old price = " << this->get_price(item_idx); - //std::cout << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << ", old_owner_type = " << old_owner_type << std::endl; - - bool item_is_normal = not item_is_diagonal; - bool bidder_is_normal = not bidder_is_diagonal; - - assert( new_price >= this->get_price(item_idx) ); - - // update vector prices - if (item_is_normal or bidder_is_normal) { - this->prices[item_idx] = new_price; - } - - // update kdtree_ - if (item_is_normal) { - assert(0 <= item_idx and item_idx < kdtree__items_.size()); - assert(0 <= kdtree__items_[item_idx] and kdtree__items_[item_idx] < dnn_point_handles_.size()); - kdtree_->change_weight( dnn_point_handles_[kdtree__items_[item_idx]], new_price); - } - - // update all_items_heap_ - if (bidder_is_diagonal and item_is_diagonal) { - // remove slice (item is buried in diag_assigned_to_diag_slice_) - assert(old_owner_type != OwnerType::k_diagonal); - auto iter = all_items_heap__iters_[item_idx]; - assert(iter != all_items_heap_.end()); - all_items_heap_.erase(iter); - all_items_heap__iters_[item_idx] = all_items_heap_.end(); - } else { - auto iter = all_items_heap__iters_[item_idx]; - if (iter != all_items_heap_.end()) { - // update existing element - ItemSliceR x = *iter; - x.set_loss( this->get_value_for_diagonal_bidder(item_idx) ); - all_items_heap_.erase(iter); - auto ins_res = all_items_heap_.insert(x); - all_items_heap__iters_[item_idx] = ins_res.first; - assert(ins_res.second); - } else { - // insert new slice - // for diagonal items value = price - ItemSliceR x { item_idx, new_price }; - auto ins_res = all_items_heap_.insert(x); - all_items_heap__iters_[item_idx] = ins_res.first; - assert(ins_res.second); - } - } - - // update diag_items_heap_ - if (item_is_diagonal and bidder_is_normal) { - // update existing element - auto iter = diag_items_heap__iters_[item_idx]; - if (iter != diag_items_heap_.end()) { - ItemSliceR x = *iter; - x.set_loss( new_price ); - diag_items_heap_.erase(iter); - auto ins_res = diag_items_heap_.insert(x); - diag_items_heap__iters_[item_idx] = ins_res.first; - assert(ins_res.second); - } else { - // insert new slice - // for diagonal items value = price - ItemSliceR x { item_idx, new_price }; - auto ins_res = diag_items_heap_.insert(x); - diag_items_heap__iters_[item_idx] = ins_res.first; - assert(ins_res.second); - } - } else if (bidder_is_diagonal and item_is_diagonal ) { - // remove slice (item is buried in diag_assigned_to_diag_slice_) - assert(old_owner_type != OwnerType::k_diagonal); - auto iter = diag_items_heap__iters_[item_idx]; - assert(iter != diag_items_heap_.end()); - diag_items_heap_.erase(iter); - diag_items_heap__iters_[item_idx] = diag_items_heap_.end(); - } - - // update diag_unassigned_price_ - if (item_is_diagonal and old_owner_type == OwnerType::k_none and diag_unassigned_slice_.empty()) { - diag_unassigned_price_ = std::numeric_limits::max(); - } - -} - - -template -bool AuctionOracleKDTreeSingleDiag::is_item_diagonal(const size_t item_idx) const -{ - return item_idx < this->num_diag_items_; -} - - -template -void AuctionOracleKDTreeSingleDiag::flush_assignment() -{ - //std::cout << "enter oracle->flush_assignment" << std::endl; - sanity_check(); - - for(const auto item_idx : diag_assigned_to_diag_slice_) { - diag_unassigned_slice_.insert(item_idx); - } - diag_assigned_to_diag_slice_.clear(); - - // common price of diag-diag items becomes price of diag-unassigned-slice - // diag_to_diag_slice is now empty, set its price to max - // so that get_optimal_bid works correctly - diag_unassigned_price_ = diag_to_diag_price_; - diag_to_diag_price_ = std::numeric_limits::max(); - - normal_items_assigned_to_diag_.clear(); - - sanity_check(); -} - - -template -void AuctionOracleKDTreeSingleDiag::adjust_prices() -{ - return; - - throw std::runtime_error("not implemented"); - auto pr_begin = this->prices.begin(); - auto pr_end = this->prices.end(); - - Real min_price = *(std::min_element(pr_begin, pr_end)); - - for(auto& p : this->prices) { - p -= min_price; - } - - kdtree_->adjust_weights(min_price); - diag_items_heap_.adjust_prices(min_price); - all_items_heap_.adjust_prices(min_price); -} - - -template -AuctionOracleKDTreeSingleDiag::~AuctionOracleKDTreeSingleDiag() -{ - delete kdtree_; -} - -template -void AuctionOracleKDTreeSingleDiag::sanity_check() -{ -#ifdef DEBUG_AUCTION - - //std::cout << "ORACLE CURRENT STATE IN SANITY CHECK" << *this << std::endl; - - assert( diag_items_heap_.size() + diag_assigned_to_diag_slice_.size() + diag_unassigned_slice_.size() == num_diag_items_ ); - assert( diag_items_heap__iters_.size() == num_diag_items_ ); - for(size_t i = 0; i < num_diag_items_; ++i) { - if (diag_items_heap__iters_.at(i) != diag_items_heap_.end()) { - assert(diag_items_heap__iters_[i]->item_idx == i); - } - } - - assert( all_items_heap_.size() + diag_assigned_to_diag_slice_.size() + diag_unassigned_slice_.size() == this->num_items_ ); - assert( all_items_heap__iters_.size() == this->num_items_ ); - for(size_t i = 0; i < this->num_items_; ++i) { - if (all_items_heap__iters_.at(i) != all_items_heap_.end()) { - assert(all_items_heap__iters_[i]->item_idx == i); - } else { - assert( i < num_diag_items_ ); - } - } - - for(size_t i = 0; i < num_diag_items_; ++i) { - int is_in_assigned_slice = diag_assigned_to_diag_slice_.count(i); - int is_in_unassigned_slice = diag_unassigned_slice_.count(i); - int is_in_heap = diag_items_heap__iters_[i] != diag_items_heap_.end(); - assert( is_in_assigned_slice + is_in_unassigned_slice + is_in_heap == 1); - } - - //assert((diag_assigned_to_diag_slice_.empty() and diag_to_diag_price_ == std::numeric_limits::max()) or (not diag_assigned_to_diag_slice_.empty() and diag_to_diag_price_ != std::numeric_limits::max())); - //assert((diag_unassigned_slice_.empty() and diag_unassigned_price_ == std::numeric_limits::max()) or (not diag_unassigned_slice_.empty() and diag_unassigned_price_ != std::numeric_limits::max())); - - assert(diag_assigned_to_diag_slice_.empty() or diag_to_diag_price_ != std::numeric_limits::max()); - assert(diag_unassigned_slice_.empty() or diag_unassigned_price_ != std::numeric_limits::max()); -#endif -} - - -} // ws -} // hera -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_lazy_heap.h b/geom_matching/wasserstein/include/auction_oracle_lazy_heap.h deleted file mode 100644 index 8b37421..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_lazy_heap.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_LAZY_HEAP_H -#define AUCTION_ORACLE_LAZY_HEAP_H - - -#define USE_BOOST_HEAP - -#include -#include -#include -#include - -#ifdef USE_BOOST_HEAP -#include -#endif - -#include "basic_defs_ws.h" - -namespace ws { - -template -struct CompPairsBySecondStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second < b.second; - } -}; - - -template -struct CompPairsBySecondGreaterStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second > b.second; - } -}; - -template -struct CompPairsBySecondLexStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second < b.second or (a.second == b.second and a.first > b.first); - } -}; - -template -struct CompPairsBySecondLexGreaterStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second > b.second or (a.second == b.second and a.first > b.first); - } -}; - -using ItemsTimePair = std::pair; -using UpdateList = std::list; -using UpdateListIter = UpdateList::iterator; - - -#ifdef USE_BOOST_HEAP -template -using LossesHeap = boost::heap::d_ary_heap, boost::heap::arity<2>, boost::heap::mutable_, boost::heap::compare>>; -#else -template -class IdxValHeap { -public: - using InternalKeeper = std::set, ComparisonStruct>; - using handle_type = typename InternalKeeper::iterator; - // methods - handle_type push(const IdxValPair& val) - { - auto res_pair = _heap.insert(val); - assert(res_pair.second); - assert(res_pair.first != _heap.end()); - return res_pair.first; - } - - void decrease(handle_type& handle, const IdxValPair& new_val) - { - _heap.erase(handle); - handle = push(new_val); - } - - void increase(handle_type& handle, const IdxValPair& new_val) - { - _heap.erase(handle); - handle = push(new_val); - - size_t size() const - { - return _heap.size(); - } - - handle_type ordered_begin() - { - return _heap.begin(); - } - - handle_type ordered_end() - { - return _heap.end(); - } - - -private: - std::set, ComparisonStruct> _heap; -}; - -// if we store losses, the minimal value should come first -template -using LossesHeap = IdxValHeap; -#endif - - -template -struct AuctionOracleLazyHeapRestricted : AuctionOracleBase { - - using LossesHeapR = typename ws::LossesHeap; - using LossesHeapRHandle = typename ws::LossesHeap::handle_type; - using DiagramPointR = typename ws::DiagramPoint; - - - AuctionOracleLazyHeapRestricted(const std::vector& bidders, const std::vector& items, const Real wasserstein_power, const Real _internal_p = get_infinity()); - ~AuctionOracleLazyHeapRestricted(); - // data members - // temporarily make everything public - std::vector> weight_matrix; - //Real weight_adj_const; - Real max_val; - // vector of heaps to find the best items - std::vector losses_heap; - std::vector> items_indices_for_heap_handles; - std::vector> losses_heap_handles; - // methods - void fill_in_losses_heap(); - void set_price(const IdxType items_idx, const Real new_price); - IdxValPair get_optimal_bid(const IdxType bidder_idx); - Real get_matching_weight(const std::vector& bidders_to_items) const; - void adjust_prices(); - // to update the queue in lazy fashion - std::vector items_iterators; - UpdateList update_list; - std::vector bidders_update_moments; - int update_counter; - void update_queue_for_bidder(const IdxType bidder_idx); - LossesHeapR diag_items_heap; - std::vector diag_heap_handles; - std::vector heap_handles_indices; - // debug - - DebugOptimalBid get_optimal_bid_debug(const IdxType bidder_idx); - - // for diagonal points - bool best_diagonal_items_computed; - size_t best_diagonal_item_idx; - Real best_diagonal_item_value; - size_t second_best_diagonal_item_idx; - Real second_best_diagonal_item_value; -}; - -} // end of namespace ws - -#include "auction_oracle_lazy_heap.h" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_lazy_heap.hpp b/geom_matching/wasserstein/include/auction_oracle_lazy_heap.hpp deleted file mode 100644 index d179b3d..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_lazy_heap.hpp +++ /dev/null @@ -1,465 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_oracle.h" - - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace ws { - -// ***************************** -// AuctionOracleLazyHeapRestricted -// ***************************** - - -template -AuctionOracleLazyHeapRestricted::AuctionOracleLazyHeapRestricted(const std::vector>& _bidders, - const std::vector>& _items, - Real _wasserstein_power, - Real _internal_p) : - AuctionOracleAbstract(_bidders, _items, _wasserstein_power, _internal_p), - max_val(0.0), - bidders_update_moments(_bidders.size(), 0), - update_counter(0), - heap_handles_indices(_items.size(), k_invalid_index), - best_diagonal_items_computed(false) -{ - weight_matrix.reserve(_bidders.size()); - //const Real max_dist_upper_bound = 3 * getFurthestDistance3Approx(b, g); - //weight_adj_const = pow(max_dist_upper_bound, wasserstein_power); - // init weight matrix - for(const auto& point_A : _bidders) { - std::vector weight_vec; - weight_vec.clear(); - weight_vec.reserve(_bidders.size()); - for(const auto& point_B : _items) { - Real val = pow(dist_lp(point_A, point_B, _internal_p), _wasserstein_power); - weight_vec.push_back( val ); - if ( val > max_val ) - max_val = val; - } - weight_matrix.push_back(weight_vec); - } - fill_in_losses_heap(); - for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { - update_list.push_back(std::make_pair(static_cast(item_idx), 0)); - } - for(auto update_list_iter = update_list.begin(); update_list_iter != update_list.end(); ++update_list_iter) { - items_iterators.push_back(update_list_iter); - } - - size_t handle_idx {0}; - for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { - if (_items[item_idx].is_diagonal() ) { - heap_handles_indices[item_idx] = handle_idx++; - diag_heap_handles.push_back(diag_items_heap.push(std::make_pair(item_idx, 0))); - } - } -} - - -template -void AuctionOracleLazyHeapRestricted::update_queue_for_bidder(IdxType bidder_idx) -{ - assert(0 <= bidder_idx and bidder_idx < static_cast(this->bidders.size())); - assert(bidder_idx < static_cast(bidders_update_moments.size())); - assert(losses_heap[bidder_idx] != nullptr ); - - int bidder_last_update_time = bidders_update_moments[bidder_idx]; - auto iter = update_list.begin(); - while (iter != update_list.end() and iter->second >= bidder_last_update_time) { - IdxType item_idx = iter->first; - size_t handle_idx = items_indices_for_heap_handles[bidder_idx][item_idx]; - if (handle_idx < this->items.size() ) { - IdxValPair new_val { item_idx, weight_matrix[bidder_idx][item_idx] + this->prices[item_idx]}; - // to-do: change indexing of losses_heap_handles - losses_heap[bidder_idx]->decrease(losses_heap_handles[bidder_idx][handle_idx], new_val); - } - iter++; - } - bidders_update_moments[bidder_idx] = update_counter; -} - - -template -void AuctionOracleLazyHeapRestricted::fill_in_losses_heap() -{ - using LossesHeapR = typename ws::LossesHeap; - using LossesHeapRHandleVec = typename std::vector::handle_type>; - - for(size_t bidder_idx = 0; bidder_idx < this->bidders.size(); ++bidder_idx) { - DiagramPoint bidder { this->bidders[bidder_idx] }; - // no heap for diagonal bidders - if ( bidder.is_diagonal() ) { - losses_heap.push_back( nullptr ); - losses_heap_handles.push_back(LossesHeapRHandleVec()); - items_indices_for_heap_handles.push_back( std::vector() ); - continue; - } else { - losses_heap.push_back( new LossesHeapR() ); - - assert( losses_heap.at(bidder_idx) != nullptr ); - - items_indices_for_heap_handles.push_back( std::vector(this->items.size(), k_invalid_index) ); - LossesHeapRHandleVec handles_vec; - losses_heap_handles.push_back(handles_vec); - size_t handle_idx { 0 }; - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - assert( items_indices_for_heap_handles.at(bidder_idx).at(item_idx) > 0 ); - DiagramPoint item { this->items[item_idx] }; - if ( item.is_normal() ) { - // item can be assigned to bidder, store in heap - IdxValPair vp { item_idx, weight_matrix[bidder_idx][item_idx] + this->prices[item_idx] }; - losses_heap_handles[bidder_idx].push_back( losses_heap[bidder_idx]->push(vp) ); - // keep corresponding index in items_indices_for_heap_handles - items_indices_for_heap_handles[bidder_idx][item_idx] = handle_idx++; - } - } - } - } -} - - -template -AuctionOracleLazyHeapRestricted::~AuctionOracleLazyHeapRestricted() -{ - for(auto h : losses_heap) { - delete h; - } -} - - -template -void AuctionOracleLazyHeapRestricted::set_price(IdxType item_idx, Real new_price) -{ - assert( this->prices.at(item_idx) < new_price ); -#ifdef DEBUG_AUCTION - std::cout << "price incremented by " << this->prices.at(item_idx) - new_price << std::endl; -#endif - this->prices[item_idx] = new_price; - if (this->items[item_idx].is_normal() ) { - // lazy: record the moment we updated the price of the items, - // do not update queues. - // 1. move the items with updated price to the front of the update_list, - update_list.splice(update_list.begin(), update_list, items_iterators[item_idx]); - // 2. record the moment we updated the price and increase the counter - update_list.front().second = update_counter++; - } else { - // diagonal items are stored in one heap - diag_items_heap.decrease(diag_heap_handles[heap_handles_indices[item_idx]], std::make_pair(item_idx, new_price)); - best_diagonal_items_computed = false; - } -} - -// subtract min. price from all prices -template -void AuctionOracleLazyHeapRestricted::adjust_prices() -{ -} - - -template -DebugOptimalBid AuctionOracleLazyHeapRestricted::get_optimal_bid_debug(IdxType bidder_idx) -{ - DebugOptimalBid result; - assert(bidder_idx >=0 and bidder_idx < static_cast(this->bidders.size()) ); - - auto bidder = this->bidders[bidder_idx]; - std::vector> cand_items; - // corresponding point is always considered as a candidate - - size_t proj_item_idx = bidder_idx; - assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); - auto proj_item = this->items[proj_item_idx]; - assert(proj_item.type != bidder.type); - //assert(proj_item.proj_id == bidder.id); - //assert(proj_item.id == bidder.proj_id); - // todo: store precomputed distance? - Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); - cand_items.push_back( std::make_pair(proj_item_idx, proj_item_value) ); - - if (bidder.is_normal()) { - assert(losses_heap.at(bidder_idx) != nullptr); - assert(losses_heap[bidder_idx]->size() >= 2); - update_queue_for_bidder(bidder_idx); - auto pHeap = losses_heap[bidder_idx]; - assert( pHeap != nullptr ); - auto top_iter = pHeap->ordered_begin(); - cand_items.push_back( *top_iter ); - ++top_iter; // now points to the second-best items - cand_items.push_back( *top_iter ); - std::sort(cand_items.begin(), cand_items.end(), CompPairsBySecondStruct()); - assert(cand_items[1].second >= cand_items[0].second); - } else { - // for diagonal bidder the only normal point has already been added - // the other 2 candidates are diagonal items only, get from the heap - // with prices - assert(diag_items_heap.size() > 1); - auto top_diag_iter = diag_items_heap.ordered_begin(); - auto topDiag1 = *top_diag_iter++; - auto topDiag2 = *top_diag_iter; - cand_items.push_back(topDiag1); - cand_items.push_back(topDiag2); - std::sort(cand_items.begin(), cand_items.end(), CompPairsBySecondStruct()); - assert(cand_items.size() == 3); - assert(cand_items[2].second >= cand_items[1].second); - assert(cand_items[1].second >= cand_items[0].second); - } - - result.best_item_idx = cand_items[0].first; - result.second_best_item_idx = cand_items[1].first; - result.best_item_value = cand_items[0].second; - result.second_best_item_value = cand_items[1].second; - - // checking code - - //DebugOptimalBid debug_my_result(result); - //DebugOptimalBid debug_naive_result; - //debug_naive_result.best_item_value = 1e20; - //debug_naive_result.second_best_item_value = 1e20; - //Real curr_item_value; - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and - //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) - //continue; - - //curr_item_value = pow(dist_lp(this->bidders[bidder_idx], this->items[item_idx]), wasserstein_power) + this->prices[item_idx]; - //if (curr_item_value < debug_naive_result.best_item_value) { - //debug_naive_result.best_item_value = curr_item_value; - //debug_naive_result.best_item_idx = item_idx; - //} - //} - - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //if (item_idx == debug_naive_result.best_item_idx) { - //continue; - //} - //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and - //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) - //continue; - - //curr_item_value = pow(dist_lp(this->bidders[bidder_idx], this->items[item_idx]), wasserstein_power) + this->prices[item_idx]; - //if (curr_item_value < debug_naive_result.second_best_item_value) { - //debug_naive_result.second_best_item_value = curr_item_value; - //debug_naive_result.second_best_item_idx = item_idx; - //} - //} - - //if ( fabs( debug_my_result.best_item_value - debug_naive_result.best_item_value ) > 1e-6 or - //fabs( debug_naive_result.second_best_item_value - debug_my_result.second_best_item_value) > 1e-6 ) { - //std::cerr << "bidder_idx = " << bidder_idx << "; "; - //std::cerr << this->bidders[bidder_idx] << std::endl; - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //std::cout << item_idx << ": " << this->items[item_idx] << "; price = " << this->prices[item_idx] << std::endl; - //} - //std::cerr << "debug_my_result: " << debug_my_result << std::endl; - //std::cerr << "debug_naive_result: " << debug_naive_result << std::endl; - //auto pHeap = losses_heap[bidder_idx]; - //assert( pHeap != nullptr ); - //for(auto top_iter = pHeap->ordered_begin(); top_iter != pHeap->ordered_end(); ++top_iter) { - //std::cerr << "in heap: " << top_iter->first << ": " << top_iter->second << "; real value = " << dist_lp(bidder, this->items[top_iter->first]) + this->prices[top_iter->first] << std::endl; - //} - //for(auto ci : cand_items) { - //std::cout << "ci.idx = " << ci.first << ", value = " << ci.second << std::endl; - //} - - ////std::cerr << "two_best_items: " << two_best_items[0].d << " " << two_best_items[1].d << std::endl; - //assert(false); - //} - - - //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_item_value = " << best_item_value << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_value = " << second_best_item_value << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; - //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_items_dist= " << (weight_adj_const - best_item_value) << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_dist= " << (weight_adj_const - second_best_item_value) << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; - - return result; -} - - -template -IdxValPair AuctionOracleLazyHeapRestricted::get_optimal_bid(const IdxType bidder_idx) -{ - IdxType best_item_idx; - //IdxType second_best_item_idx; - Real best_item_value; - Real second_best_item_value; - - auto& bidder = this->bidders[bidder_idx]; - IdxType proj_item_idx = bidder_idx; - assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); - auto proj_item = this->items[proj_item_idx]; - assert(proj_item.type != bidder.type); - //assert(proj_item.proj_id == bidder.id); - //assert(proj_item.id == bidder.proj_id); - // todo: store precomputed distance? - Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); - - if (bidder.is_diagonal()) { - // for diagonal bidder the only normal point has already been added - // the other 2 candidates are diagonal items only, get from the heap - // with prices - assert(diag_items_heap.size() > 1); - if (!best_diagonal_items_computed) { - auto top_diag_iter = diag_items_heap.ordered_begin(); - best_diagonal_item_idx = top_diag_iter->first; - best_diagonal_item_value = top_diag_iter->second; - top_diag_iter++; - second_best_diagonal_item_idx = top_diag_iter->first; - second_best_diagonal_item_value = top_diag_iter->second; - best_diagonal_items_computed = true; - } - - if ( proj_item_value < best_diagonal_item_value) { - best_item_idx = proj_item_idx; - best_item_value = proj_item_value; - second_best_item_value = best_diagonal_item_value; - //second_best_item_idx = best_diagonal_item_idx; - } else if (proj_item_value < second_best_diagonal_item_value) { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value; - second_best_item_value = proj_item_value; - //second_best_item_idx = proj_item_idx; - } else { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value; - second_best_item_value = second_best_diagonal_item_value; - //second_best_item_idx = second_best_diagonal_item_idx; - } - } else { - // for normal bidder get 2 best items among non-diagonal (=normal) points - // from the corresponding heap - assert(diag_items_heap.size() > 1); - update_queue_for_bidder(bidder_idx); - auto top_norm_iter = losses_heap[bidder_idx]->ordered_begin(); - IdxType best_normal_item_idx { top_norm_iter->first }; - Real best_normal_item_value { top_norm_iter->second }; - top_norm_iter++; - Real second_best_normal_item_value { top_norm_iter->second }; - //IdxType second_best_normal_item_idx { top_norm_iter->first }; - - if ( proj_item_value < best_normal_item_value) { - best_item_idx = proj_item_idx; - best_item_value = proj_item_value; - second_best_item_value = best_normal_item_value; - //second_best_item_idx = best_normal_item_idx; - } else if (proj_item_value < second_best_normal_item_value) { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = proj_item_value; - //second_best_item_idx = proj_item_idx; - } else { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = second_best_normal_item_value; - //second_best_item_idx = second_best_normal_item_idx; - } - } - - IdxValPair result; - - assert( second_best_item_value >= best_item_value ); - - result.first = best_item_idx; - result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; - - - // checking code - - //DebugOptimalBid debug_my_result; - //debug_my_result.best_item_idx = best_item_idx; - //debug_my_result.best_item_value = best_item_value; - //debug_my_result.second_best_item_idx = second_best_item_idx; - //debug_my_result.second_best_item_value = second_best_item_value; - //DebugOptimalBid debug_naive_result; - //debug_naive_result.best_item_value = 1e20; - //debug_naive_result.second_best_item_value = 1e20; - //Real curr_item_value; - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and - //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) - //continue; - - //curr_item_value = this->get_value_for_bidder(bidder_idx, item_idx); - //if (curr_item_value < debug_naive_result.best_item_value) { - //debug_naive_result.best_item_value = curr_item_value; - //debug_naive_result.best_item_idx = item_idx; - //} - //} - - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //if (item_idx == debug_naive_result.best_item_idx) { - //continue; - //} - //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and - //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) - //continue; - - //curr_item_value = this->get_value_for_bidder(bidder_idx, item_idx); - //if (curr_item_value < debug_naive_result.second_best_item_value) { - //debug_naive_result.second_best_item_value = curr_item_value; - //debug_naive_result.second_best_item_idx = item_idx; - //} - //} - ////std::cout << "got naive result" << std::endl; - - //if ( fabs( debug_my_result.best_item_value - debug_naive_result.best_item_value ) > 1e-6 or - //fabs( debug_naive_result.second_best_item_value - debug_my_result.second_best_item_value) > 1e-6 ) { - //std::cerr << "bidder_idx = " << bidder_idx << "; "; - //std::cerr << this->bidders[bidder_idx] << std::endl; - //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - //std::cout << item_idx << ": " << this->items[item_idx] << "; price = " << this->prices[item_idx] << std::endl; - //} - //std::cerr << "debug_my_result: " << debug_my_result << std::endl; - //std::cerr << "debug_naive_result: " << debug_naive_result << std::endl; - //auto pHeap = losses_heap[bidder_idx]; - //if ( pHeap != nullptr ) { - //for(auto top_iter = pHeap->ordered_begin(); top_iter != pHeap->ordered_end(); ++top_iter) { - //std::cerr << "in heap: " << top_iter->first << ": " << top_iter->second << "; real value = " << dist_lp(bidder, this->items[top_iter->first]) + this->prices[top_iter->first] << std::endl; - //} - //} - ////for(auto ci : cand_items) { - ////std::cout << "ci.idx = " << ci.first << ", value = " << ci.second << std::endl; - ////} - - ////std::cerr << "two_best_items: " << two_best_items[0].d << " " << two_best_items[1].d << std::endl; - //assert(false); - // } - //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_item_value = " << best_item_value << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_value = " << second_best_item_value << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; - //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_items_dist= " << (weight_adj_const - best_item_value) << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_dist= " << (weight_adj_const - second_best_item_value) << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; - - return result; -} - -} // end of namespace ws diff --git a/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.h b/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.h deleted file mode 100644 index c932396..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_ORACLE_STUPID_SPARSE_RESTRICTED_H -#define AUCTION_ORACLE_STUPID_SPARSE_RESTRICTED_H - -#include -#include -#include - -#include "basic_defs_ws.h" -#include "diagonal_heap.h" -#include "auction_oracle_base.h" -#include "dnn/geometry/euclidean-fixed.h" -#include "dnn/local/kd-tree.h" - - -namespace hera { -namespace ws { - -template >> -struct AuctionOracleStupidSparseRestricted : AuctionOracleBase { - - using PointContainer = PointContainer_; - using Real = Real_; - - using LossesHeapR = typename ws::LossesHeapOld; - using LossesHeapRHandle = typename ws::LossesHeapOld::handle_type; - using DiagramPointR = typename ws::DiagramPoint; - using DebugOptimalBidR = typename ws::DebugOptimalBid; - - using DnnPoint = dnn::Point<2, Real>; - using DnnTraits = dnn::PointTraits; - - - AuctionOracleStupidSparseRestricted(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); - // data members - // temporarily make everything public - std::vector> admissible_items_; - Real max_val_; - LossesHeapR diag_items_heap_; - std::vector diag_heap_handles_; - std::vector heap_handles_indices_; - -// std::vector kdtree_items_; - - std::vector top_diag_indices_; - std::vector top_diag_lookup_; - size_t top_diag_counter_ { 0 }; - bool best_diagonal_items_computed_ { false }; - Real best_diagonal_item_value_; - Real second_best_diagonal_item_idx_ { k_invalid_index }; - Real second_best_diagonal_item_value_ { std::numeric_limits::max() }; - - - // methods - void set_price(const IdxType items_idx, const Real new_price, const bool update_diag = true); - IdxValPair get_optimal_bid(const IdxType bidder_idx); - void adjust_prices(); - void adjust_prices(const Real delta); - - // debug routines - DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; - void sanity_check(); - - - // heap top vector - size_t get_heap_top_size() const; - void recompute_top_diag_items(bool hard = false); - void recompute_second_best_diag(); - void reset_top_diag_counter(); - void increment_top_diag_counter(); - void add_top_diag_index(const size_t item_idx); - void remove_top_diag_index(const size_t item_idx); - bool is_in_top_diag_indices(const size_t item_idx) const; - - std::shared_ptr console_logger; - - std::pair get_minmax_price() const; - -}; - -} // ws -} // hera - - -#include "auction_oracle_stupid_sparse_restricted.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp b/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp deleted file mode 100644 index 8f4504d..0000000 --- a/geom_matching/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp +++ /dev/null @@ -1,568 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ -#ifndef AUCTION_ORACLE_STUPID_SPARSE_HPP -#define AUCTION_ORACLE_STUPID_SPARSE_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "basic_defs_ws.h" -#include "auction_oracle_stupid_sparse_restricted.h" - -#ifdef FOR_R_TDA -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - - -// ***************************** -// AuctionOracleStupidSparseRestricted -// ***************************** - - -template -std::ostream& operator<<(std::ostream& output, const AuctionOracleStupidSparseRestricted& oracle) -{ - output << "Oracle " << &oracle << std::endl; - output << fmt::format(" max_val_ = {0}, best_diagonal_items_computed_ = {1}, best_diagonal_item_value_ = {2}, second_best_diagonal_item_idx_ = {3}, second_best_diagonal_item_value_ = {4}\n", - oracle.max_val_, - oracle.best_diagonal_items_computed_, - oracle.best_diagonal_item_value_, - oracle.second_best_diagonal_item_idx_, - oracle.second_best_diagonal_item_value_); - - output << fmt::format(" prices = {0}\n", - format_container_to_log(oracle.prices)); - - output << fmt::format(" diag_items_heap_ = {0}\n", - losses_heap_to_string(oracle.diag_items_heap_)); - - - output << fmt::format(" top_diag_indices_ = {0}\n", - format_container_to_log(oracle.top_diag_indices_)); - - output << fmt::format(" top_diag_counter_ = {0}\n", - oracle.top_diag_counter_); - - output << fmt::format(" top_diag_lookup_ = {0}\n", - format_container_to_log(oracle.top_diag_lookup_)); - - - output << "end of oracle " << &oracle << std::endl; - return output; -} - - -template -AuctionOracleStupidSparseRestricted::AuctionOracleStupidSparseRestricted(const PointContainer_& _bidders, - const PointContainer_& _items, - const AuctionParams& params) : - AuctionOracleBase(_bidders, _items, params), - admissible_items_(_bidders.size(), std::vector()), - heap_handles_indices_(_items.size(), k_invalid_index), - top_diag_lookup_(_items.size(), k_invalid_index) -{ - // initialize admissible edges - std::vector kdtree_items_(_items.size(), k_invalid_index); - std::vector dnn_points_; - std::vector dnn_point_handles_; - size_t dnn_item_idx { 0 }; - size_t true_idx { 0 }; - dnn_points_.reserve(this->items.size()); - // store normal items in kd-tree - for(const auto& g : this->items) { - if (g.is_normal() ) { - kdtree_items_[true_idx] = dnn_item_idx; - // index of items is id of dnn-point - DnnPoint p(true_idx); - p[0] = g.getRealX(); - p[1] = g.getRealY(); - dnn_points_.push_back(p); - assert(dnn_item_idx == dnn_points_.size() - 1); - dnn_item_idx++; - } - true_idx++; - } - assert(dnn_points_.size() < _items.size() ); - for(size_t i = 0; i < dnn_points_.size(); ++i) { - dnn_point_handles_.push_back(&dnn_points_[i]); - } - DnnTraits traits; - traits.internal_p = params.internal_p; - dnn::KDTree kdtree_(traits, dnn_point_handles_, params.wasserstein_power); - - // loop over normal bidders, find nearest neighbours - size_t bidder_idx = 0; - for(const auto& b : this->bidders) { - if (b.is_normal()) { - admissible_items_[bidder_idx].reserve(k_max_nn); - DnnPoint bidder_dnn; - bidder_dnn[0] = b.getRealX(); - bidder_dnn[1] = b.getRealY(); - auto nearest_neighbours = kdtree_.findK(bidder_dnn, k_max_nn); - assert(nearest_neighbours.size() == k_max_nn); - for(const auto& x : nearest_neighbours) { - admissible_items_[bidder_idx].push_back(x.p->id()); - } - } - bidder_idx++; - } - - size_t handle_idx {0}; - for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { - if (this->items[item_idx].is_diagonal()) { - heap_handles_indices_[item_idx] = handle_idx++; - diag_heap_handles_.push_back(diag_items_heap_.push(std::make_pair(item_idx, 0.0))); - } - } - max_val_ = 3*getFurthestDistance3Approx<>(_bidders, _items, params.internal_p); - max_val_ = std::pow(max_val_, params.wasserstein_power); - - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); - console_logger->info("Stupid sparse oracle ctor done, k = {0}", k_max_nn); -} - - -template -bool AuctionOracleStupidSparseRestricted::is_in_top_diag_indices(const size_t item_idx) const -{ - return top_diag_lookup_[item_idx] != k_invalid_index; -} - - -template -void AuctionOracleStupidSparseRestricted::add_top_diag_index(const size_t item_idx) -{ - assert(find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx) == top_diag_indices_.end()); - assert(this->items[item_idx].is_diagonal()); - - top_diag_indices_.push_back(item_idx); - top_diag_lookup_[item_idx] = top_diag_indices_.size() - 1; -} - -template -void AuctionOracleStupidSparseRestricted::remove_top_diag_index(const size_t item_idx) -{ - if (top_diag_indices_.size() > 1) { - // remove item_idx from top_diag_indices after swapping - // it with the last element, update index lookup appropriately - auto old_index = top_diag_lookup_[item_idx]; - auto end_element = top_diag_indices_.back(); - std::swap(top_diag_indices_[old_index], top_diag_indices_.back()); - top_diag_lookup_[end_element] = old_index; - } - - top_diag_indices_.pop_back(); - top_diag_lookup_[item_idx] = k_invalid_index; - if (top_diag_indices_.size() < 2) { - recompute_second_best_diag(); - } - best_diagonal_items_computed_ = not top_diag_indices_.empty(); - reset_top_diag_counter(); -} - - -template -void AuctionOracleStupidSparseRestricted::increment_top_diag_counter() -{ - assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); - - ++top_diag_counter_; - if (top_diag_counter_ >= top_diag_indices_.size()) { - top_diag_counter_ -= top_diag_indices_.size(); - } - - assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); -} - - -template -void AuctionOracleStupidSparseRestricted::reset_top_diag_counter() -{ - top_diag_counter_ = 0; -} - -template -void AuctionOracleStupidSparseRestricted::recompute_top_diag_items(bool hard) -{ - console_logger->debug("Enter recompute_top_diag_items, hard = {0}", hard); - assert(hard or top_diag_indices_.empty()); - - if (hard) { - std::fill(top_diag_lookup_.begin(), top_diag_lookup_.end(), k_invalid_index); - top_diag_indices_.clear(); - } - - auto top_diag_iter = diag_items_heap_.ordered_begin(); - best_diagonal_item_value_ = top_diag_iter->second; - add_top_diag_index(top_diag_iter->first); - - ++top_diag_iter; - - // traverse the heap while we see the same value - while(top_diag_iter != diag_items_heap_.ordered_end()) { - if ( top_diag_iter->second != best_diagonal_item_value_) { - break; - } else { - add_top_diag_index(top_diag_iter->first); - } - ++top_diag_iter; - } - - recompute_second_best_diag(); - - best_diagonal_items_computed_ = true; - reset_top_diag_counter(); - console_logger->debug("Exit recompute_top_diag_items, hard = {0}", hard); -} - -template -typename AuctionOracleStupidSparseRestricted::DebugOptimalBidR -AuctionOracleStupidSparseRestricted::get_optimal_bid_debug(IdxType bidder_idx) const -{ - DebugOptimalBidR result; - throw std::runtime_error("Not implemented"); - return result; -} - - -template -IdxValPair AuctionOracleStupidSparseRestricted::get_optimal_bid(IdxType bidder_idx) -{ - auto bidder = this->bidders[bidder_idx]; - - // corresponding point is always considered as a candidate - // if bidder is a diagonal point, proj_item is a normal point, - // and vice versa. - - size_t best_item_idx { k_invalid_index }; - size_t second_best_item_idx { k_invalid_index }; - size_t best_diagonal_item_idx { k_invalid_index }; - Real best_item_value; - Real second_best_item_value; - - - size_t proj_item_idx = bidder_idx; - assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); - assert(this->items[proj_item_idx].type != bidder.type); - Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); - - if (bidder.is_diagonal()) { - // for diagonal bidder the only normal point has already been added - // the other 2 candidates are diagonal items only, get from the heap - // with prices - - if (not best_diagonal_items_computed_) { - recompute_top_diag_items(); - } - - best_diagonal_item_idx = top_diag_indices_[top_diag_counter_]; - increment_top_diag_counter(); - - if ( proj_item_value < best_diagonal_item_value_) { - best_item_idx = proj_item_idx; - best_item_value = proj_item_value; - second_best_item_value = best_diagonal_item_value_; - second_best_item_idx = best_diagonal_item_idx; - } else if (proj_item_value < second_best_diagonal_item_value_) { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value_; - second_best_item_value = proj_item_value; - second_best_item_idx = proj_item_idx; - } else { - best_item_idx = best_diagonal_item_idx; - best_item_value = best_diagonal_item_value_; - second_best_item_value = second_best_diagonal_item_value_; - second_best_item_idx = second_best_diagonal_item_idx_; - } - } else { - - size_t best_normal_item_idx { k_invalid_index }; - size_t second_best_normal_item_idx { k_invalid_index }; - Real best_normal_item_value { std::numeric_limits::max() }; - Real second_best_normal_item_value { std::numeric_limits::max() }; - - // find best item - for(const auto curr_item_idx : admissible_items_[bidder_idx]) { - auto curr_item_value = this->get_value_for_bidder(bidder_idx, curr_item_idx); - if (curr_item_value < best_normal_item_value) { - best_normal_item_idx = curr_item_idx; - best_normal_item_value = curr_item_value; - } - } - - // find second-best item - for(const auto curr_item_idx : admissible_items_[bidder_idx]) { - if (curr_item_idx == best_normal_item_idx) { - continue; - } - auto curr_item_value = this->get_value_for_bidder(bidder_idx, curr_item_idx); - if (curr_item_value < second_best_normal_item_value) { - second_best_normal_item_idx = curr_item_idx; - second_best_normal_item_value = curr_item_value; - } - } - - if ( proj_item_value < best_normal_item_value) { - best_item_idx = proj_item_idx; - increment_top_diag_counter(); - best_item_value = proj_item_value; - second_best_item_value = best_normal_item_value; - } else if (proj_item_value < second_best_normal_item_value) { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = proj_item_value; - } else { - best_item_idx = best_normal_item_idx; - best_item_value = best_normal_item_value; - second_best_item_value = second_best_normal_item_value; - } - } - - IdxValPair result; - - assert( second_best_item_value >= best_item_value ); - - result.first = best_item_idx; - result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; - - return result; -} - -template -void AuctionOracleStupidSparseRestricted::recompute_second_best_diag() -{ - - console_logger->debug("Enter recompute_second_best_diag"); - - if (top_diag_indices_.size() > 1) { - second_best_diagonal_item_value_ = best_diagonal_item_value_; - second_best_diagonal_item_idx_ = top_diag_indices_[0]; - } else { - if (diag_items_heap_.size() == 1) { - second_best_diagonal_item_value_ == std::numeric_limits::max(); - second_best_diagonal_item_idx_ = k_invalid_index; - } else { - auto diag_iter = diag_items_heap_.ordered_begin(); - ++diag_iter; - second_best_diagonal_item_value_ = diag_iter->second; - second_best_diagonal_item_idx_ = diag_iter->first; - } - } - - console_logger->debug("Exit recompute_second_best_diag, second_best_diagonal_item_value_ = {0}, second_best_diagonal_item_idx_ = {1}", second_best_diagonal_item_value_, second_best_diagonal_item_idx_); -} - - -template -void AuctionOracleStupidSparseRestricted::set_price(IdxType item_idx, - Real new_price, - const bool update_diag) -{ - - console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}, update_diag = {3}", item_idx, new_price, this->prices[item_idx], update_diag); - - assert(this->prices.size() == this->items.size()); - assert( 0 < diag_heap_handles_.size() and diag_heap_handles_.size() <= this->items.size()); - // adjust_prices decreases prices, - // also this variable must be true in reverse phases of FR-auction - bool item_goes_down = new_price > this->prices[item_idx]; - - this->prices[item_idx] = new_price; - if ( this->items[item_idx].is_diagonal() ) { - assert(diag_heap_handles_.size() > heap_handles_indices_.at(item_idx)); - if (item_goes_down) { - diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } else { - diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } - if (update_diag) { - // Update top_diag_indices_ only if necessary: - // normal bidders take their projections, which might not be on top - // also, set_price is called by adjust_prices, and we may have already - // removed the item from top_diag - if (is_in_top_diag_indices(item_idx)) { - remove_top_diag_index(item_idx); - } - - if (item_idx == second_best_diagonal_item_idx_) { - recompute_second_best_diag(); - } - } - } - - console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); -} - - -template -void AuctionOracleStupidSparseRestricted::adjust_prices(Real delta) -{ - //console_logger->debug("Enter adjust_prices, delta = {0}", delta); - //std::cerr << *this << std::endl; - - if (delta == 0.0) - return; - - for(auto& p : this->prices) { - p -= delta; - } - - bool price_goes_up = delta < 0; - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - if (this->items[item_idx].is_diagonal()) { - auto new_price = this->prices[item_idx]; - if (price_goes_up) { - diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } else { - diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); - } - } - } - best_diagonal_item_value_ -= delta; - second_best_diagonal_item_value_ -= delta; - - //std::cerr << *this << std::endl; - //console_logger->debug("Exit adjust_prices, delta = {0}", delta); -} - -template -void AuctionOracleStupidSparseRestricted::adjust_prices() -{ - auto pr_begin = this->prices.begin(); - auto pr_end = this->prices.end(); - Real min_price = *(std::min_element(pr_begin, pr_end)); - adjust_prices(min_price); -} - -template -size_t AuctionOracleStupidSparseRestricted::get_heap_top_size() const -{ - return top_diag_indices_.size(); -} - -template -std::pair AuctionOracleStupidSparseRestricted::get_minmax_price() const -{ - auto r = std::minmax_element(this->prices.begin(), this->prices.end()); - return std::make_pair(*r.first, *r.second); -} - -template -void AuctionOracleStupidSparseRestricted::sanity_check() -{ -#ifdef DEBUG_STUPID_SPARSE_RESTR_ORACLE - - assert(admissible_items_.size() == this->bidders.size()); - - for(size_t bidder_idx = 0; bidder_idx < this->bidders.size(); ++bidder_idx) { - if (this->bidders[bidder_idx].is_normal()) { - assert(admissible_items_[bidder_idx].size() == k_max_nn); - } else { - assert(admissible_items_[bidder_idx].size() == 0); - } - } - - if (best_diagonal_items_computed_) { - std::vector diag_items_price_vec; - diag_items_price_vec.reserve(this->items.size()); - - for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { - if (this->items.at(item_idx).is_diagonal()) { - diag_items_price_vec.push_back(this->prices.at(item_idx)); - } else { - diag_items_price_vec.push_back(std::numeric_limits::max()); - } - } - - auto best_iter = std::min_element(diag_items_price_vec.begin(), diag_items_price_vec.end()); - assert(best_iter != diag_items_price_vec.end()); - Real true_best_diag_value = *best_iter; - size_t true_best_diag_idx = best_iter - diag_items_price_vec.begin(); - assert(true_best_diag_value != std::numeric_limits::max()); - - Real true_second_best_diag_value = std::numeric_limits::max(); - size_t true_second_best_diag_idx = k_invalid_index; - for(size_t item_idx = 0; item_idx < diag_items_price_vec.size(); ++item_idx) { - if (this->items.at(item_idx).is_normal()) { - assert(top_diag_lookup_.at(item_idx) == k_invalid_index); - continue; - } - - auto i_iter = std::find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx); - if (diag_items_price_vec.at(item_idx) == true_best_diag_value) { - assert(i_iter != top_diag_indices_.end()); - assert(top_diag_lookup_.at(item_idx) == i_iter - top_diag_indices_.begin()); - } else { - assert(top_diag_lookup_.at(item_idx) == k_invalid_index); - assert(i_iter == top_diag_indices_.end()); - } - - if (item_idx == true_best_diag_idx) { - continue; - } - if (diag_items_price_vec.at(item_idx) < true_second_best_diag_value) { - true_second_best_diag_value = diag_items_price_vec.at(item_idx); - true_second_best_diag_idx = item_idx; - } - } - - if (true_best_diag_value != best_diagonal_item_value_) { - console_logger->debug("best_diagonal_item_value_ = {0}, true value = {1}", best_diagonal_item_value_, true_best_diag_value); - std::cerr << *this; - //console_logger->debug("{0}", *this); - } - - assert(true_best_diag_value == best_diagonal_item_value_); - - assert(true_second_best_diag_idx != k_invalid_index); - - if (true_second_best_diag_value != second_best_diagonal_item_value_) { - console_logger->debug("second_best_diagonal_item_value_ = {0}, true value = {1}", second_best_diagonal_item_value_, true_second_best_diag_value); - //console_logger->debug("{0}", *this); - } - - assert(true_second_best_diag_value == second_best_diagonal_item_value_); - } -#endif -} - - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_fr.h b/geom_matching/wasserstein/include/auction_runner_fr.h deleted file mode 100644 index 1abca20..0000000 --- a/geom_matching/wasserstein/include/auction_runner_fr.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_RUNNER_FR_H -#define AUCTION_RUNNER_FR_H - -#define ORDERED_BY_PERSISTENCE - -#include - -#include "auction_oracle.h" - -namespace hera { -namespace ws { - -// the two parameters that you can tweak in auction algorithm are: -// 1. epsilon_common_ratio -// 2. max_num_phases - -template> // alternatively: AuctionOracleLazyHeap --- TODO -class AuctionRunnerFR { -public: - - using Real = RealType_; - using AuctionOracle = AuctionOracle_; - using DgmPoint = DiagramPoint; - using DgmPointVec = std::vector; - using IdxValPairR = IdxValPair; - - const Real k_lowest_bid_value = -(std::numeric_limits::max() - 1); // all bid values must be positive - - - AuctionRunnerFR(const std::vector& A, - const std::vector& B, - const Real q, - const Real _delta, - const Real _internal_p, - const Real _initial_epsilon = 0.0, - const Real _eps_factor = 5.0, - const int _max_num_phases = std::numeric_limits::max(), - const Real _gamma_threshold = 0.0, - const size_t _max_bids_per_round = std::numeric_limits::max(), - const std::string& _log_filename_prefix = ""); - - void set_epsilon(Real new_val); - Real get_epsilon() const { return epsilon; } - void run_auction(); - Real get_wasserstein_distance(); - Real get_wasserstein_cost(); - Real get_relative_error(const bool debug_output = false) const; - bool phase_can_be_final() const; -private: - // private data - std::vector bidders, items; - const size_t num_bidders; - const size_t num_items; - std::vector items_to_bidders; - std::vector bidders_to_items; - Real wasserstein_power; - Real epsilon; - Real delta; - Real internal_p; - Real initial_epsilon; - const Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio - Real cumulative_epsilon_factor { 1.0 }; - const int max_num_phases; // maximal number of phases of epsilon-scaling - bool is_forward { true }; // to use in distributed version only - Real weight_adj_const; - Real wasserstein_cost; - std::vector forward_bid_table; - std::vector reverse_bid_table; - // to get the 2 best items - AuctionOracle forward_oracle; - AuctionOracle reverse_oracle; - std::unordered_set unassigned_bidders; - std::unordered_set unassigned_items; - std::unordered_set items_with_bids; - std::unordered_set bidders_with_bids; - -#ifdef ORDERED_BY_PERSISTENCE - // to process unassigned by persistence - size_t batch_size; - using RealIdxPair = std::pair; - std::set> unassigned_bidders_by_persistence; - std::set> unassigned_items_by_persistence; -#endif - - - // to imitate Gauss-Seidel - const size_t max_bids_per_round; - - // to stop earlier in the last phase - const Real total_items_persistence; - const Real total_bidders_persistence; - Real partial_cost; - Real unassigned_bidders_persistence; - Real unassigned_items_persistence; - Real gamma_threshold; - size_t unassigned_threshold; - - bool is_distance_computed { false }; - int num_rounds { 0 }; - int num_rounds_non_cumulative { 0 }; - int num_phase { 0 }; - - - size_t num_diag_items { 0 }; - size_t num_normal_items { 0 }; - size_t num_diag_bidders { 0 }; - size_t num_normal_bidders { 0 }; - - - - // private methods - void assign_forward(const IdxType item_idx, const IdxType bidder_idx); - void assign_reverse(const IdxType item_idx, const IdxType bidder_idx); - void assign_to_best_bidder(const IdxType item_idx); - void assign_to_best_item(const IdxType bidder_idx); - void clear_forward_bid_table(); - void clear_reverse_bid_table(); - void assign_diag_to_diag(); - void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); - void run_auction_phase(); - void run_forward_auction_phase(); - void run_reverse_auction_phase(); - void submit_forward_bid(IdxType bidder_idx, const IdxValPairR& bid); - void submit_reverse_bid(IdxType item_idx, const IdxValPairR& bid); - void flush_assignment(); - Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const; - Real get_cost_to_diagonal(const DgmPoint& pt) const; - Real get_gamma() const; - - template - void run_forward_bidding_step(const Range& r); - - template - void run_reverse_bidding_step(const Range& r); - - void add_unassigned_bidder(const size_t bidder_idx); - void add_unassigned_item(const size_t item_idx); - void remove_unassigned_bidder(const size_t bidder_idx); - void remove_unassigned_item(const size_t item_idx); - - bool is_item_diagonal(const size_t item_idx) const { return item_idx < num_diag_items; } - bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } - bool is_bidder_diagonal(const size_t bidder_idx) const { return bidder_idx >= num_normal_bidders; } - bool is_bidder_normal(const size_t bidder_idx) const { return not is_bidder_diagonal(bidder_idx); } - - size_t num_forward_bids_submitted { 0 }; - size_t num_reverse_bids_submitted { 0 }; - - void decrease_epsilon(); - // stopping criteria - bool continue_forward(const size_t, const size_t); - bool continue_reverse(const size_t, const size_t); - bool continue_phase(); - - - - // for debug only - void sanity_check(); - void check_epsilon_css(); - void print_debug(); - void print_matching(); - - std::string log_filename_prefix; - const Real k_max_relative_error = 2.0; // if relative error cannot be estimated or is too large, use this value - void reset_round_stat(); // empty, if logging is disable - void reset_phase_stat(); - - std::unordered_set never_assigned_bidders; - std::unordered_set never_assigned_items; - - std::shared_ptr console_logger; -#ifdef LOG_AUCTION - std::unordered_set unassigned_normal_bidders; - std::unordered_set unassigned_diag_bidders; - - std::unordered_set unassigned_normal_items; - std::unordered_set unassigned_diag_items; - - - size_t all_assigned_round { 0 }; - size_t all_assigned_round_found { false }; - - int num_forward_rounds_non_cumulative { 0 }; - int num_forward_rounds { 0 }; - - int num_reverse_rounds_non_cumulative { 0 }; - int num_reverse_rounds { 0 }; - - // all per-round vars are non-cumulative - - // forward rounds - int num_normal_forward_bids_submitted { 0 }; - int num_diag_forward_bids_submitted { 0 }; - - int num_forward_diag_to_diag_assignments { 0 }; - int num_forward_diag_to_normal_assignments { 0 }; - int num_forward_normal_to_diag_assignments { 0 }; - int num_forward_normal_to_normal_assignments { 0 }; - - int num_forward_diag_from_diag_thefts { 0 }; - int num_forward_diag_from_normal_thefts { 0 }; - int num_forward_normal_from_diag_thefts { 0 }; - int num_forward_normal_from_normal_thefts { 0 }; - - // reverse rounds - int num_normal_reverse_bids_submitted { 0 }; - int num_diag_reverse_bids_submitted { 0 }; - - int num_reverse_diag_to_diag_assignments { 0 }; - int num_reverse_diag_to_normal_assignments { 0 }; - int num_reverse_normal_to_diag_assignments { 0 }; - int num_reverse_normal_to_normal_assignments { 0 }; - - int num_reverse_diag_from_diag_thefts { 0 }; - int num_reverse_diag_from_normal_thefts { 0 }; - int num_reverse_normal_from_diag_thefts { 0 }; - int num_reverse_normal_from_normal_thefts { 0 }; - - // price change statistics - std::vector> forward_price_change_cnt_vec; - std::vector> reverse_price_change_cnt_vec; - - const char* forward_plot_logger_name = "forward_plot_logger"; - const char* reverse_plot_logger_name = "reverse_plot_logger"; - const char* forward_price_stat_logger_name = "forward_price_stat_logger"; - const char* reverse_price_stat_logger_name = "reverse_price_stat_logger"; - - std::string forward_plot_logger_file_name; - std::string reverse_plot_logger_file_name; - std::string forward_price_stat_logger_file_name; - std::string reverse_price_stat_logger_file_name; - - std::shared_ptr forward_plot_logger; - std::shared_ptr reverse_plot_logger; - std::shared_ptr forward_price_stat_logger; - std::shared_ptr reverse_price_stat_logger; - - - size_t parallel_threshold = 5000; - int num_parallelizable_rounds { 0 }; - int num_parallelizable_forward_rounds { 0 }; - int num_parallelizable_reverse_rounds { 0 }; - - int num_parallel_bids { 0 }; - int num_total_bids { 0 }; - - int num_parallel_assignments { 0 }; - int num_total_assignments { 0 }; -#endif - -}; - - - -} // ws -} // hera - -#include "auction_runner_fr.hpp" - -#undef ORDERED_BY_PERSISTENCE -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_fr.hpp b/geom_matching/wasserstein/include/auction_runner_fr.hpp deleted file mode 100644 index 07c1459..0000000 --- a/geom_matching/wasserstein/include/auction_runner_fr.hpp +++ /dev/null @@ -1,1440 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_RUNNER_FR_HPP -#define AUCTION_RUNNER_FR_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" - -#include "auction_runner_fr.h" - -#ifdef FOR_R_TDA -#include "Rcpp.h" -#undef DEBUG_FR_AUCTION -#endif - - -namespace hera { -namespace ws { - - -// ***************************** -// AuctionRunnerFR -// ***************************** - -template -AuctionRunnerFR::AuctionRunnerFR(const std::vector& A, - const std::vector& B, - const Real q, - const Real _delta, - const Real _internal_p, - const Real _initial_epsilon, - const Real _eps_factor, - const int _max_num_phases, - const Real _gamma_threshold, - const size_t _max_bids_per_round, - const std::string& _log_filename_prefix - ) : - bidders(A), - items(B), - num_bidders(A.size()), - num_items(A.size()), - items_to_bidders(A.size(), k_invalid_index), - bidders_to_items(A.size(), k_invalid_index), - wasserstein_power(q), - delta(_delta), - internal_p(_internal_p), - initial_epsilon(_initial_epsilon), - epsilon_common_ratio(_eps_factor == 0.0 ? 5.0 : _eps_factor), - max_num_phases(_max_num_phases), - forward_bid_table(A.size(), std::make_pair(k_invalid_index, k_lowest_bid_value) ), - reverse_bid_table(B.size(), std::make_pair(k_invalid_index, k_lowest_bid_value) ), - forward_oracle(bidders, items, q, _internal_p), - reverse_oracle(items, bidders, q, _internal_p), - max_bids_per_round(_max_bids_per_round), - total_items_persistence(std::accumulate(items.begin(), - items.end(), - R(0.0), - [_internal_p, q](const Real& ps, const DgmPoint& item) - { return ps + std::pow(item.persistence_lp(_internal_p), q); } - )), - total_bidders_persistence(std::accumulate(bidders.begin(), - bidders.end(), - R(0.0), - [_internal_p, q](const Real& ps, const DgmPoint& bidder) - { return ps + std::pow(bidder.persistence_lp(_internal_p), q); } - )), - partial_cost(0.0), - unassigned_bidders_persistence(total_bidders_persistence), - unassigned_items_persistence(total_items_persistence), - gamma_threshold(_gamma_threshold), - log_filename_prefix(_log_filename_prefix) -{ - assert(A.size() == B.size()); - for(const auto& p : bidders) { - if (p.is_normal()) { - num_normal_bidders++; - num_diag_items++; - } else { - num_normal_items++; - num_diag_bidders++; - } - } - -#ifdef ORDERED_BY_PERSISTENCE - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_bidders_by_persistence.insert(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); - } - - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - unassigned_items_by_persistence.insert(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); - } -#endif - - // for experiments - unassigned_threshold = bidders.size() / 200; - unassigned_threshold = 0; - -#ifdef ORDERED_BY_PERSISTENCE - batch_size = 5000; -#endif - - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); - console_logger->info("Forward-reverse runnder, max_num_phases = {0}, max_bids_per_round = {1}, gamma_threshold = {2}, unassigned_threshold = {3}", - max_num_phases, - max_bids_per_round, - gamma_threshold, - unassigned_threshold); - - -// check_epsilon_css(); -#ifdef LOG_AUCTION - parallel_threshold = bidders.size() / 100; - forward_plot_logger_file_name = log_filename_prefix + "_forward_plot.txt"; - forward_plot_logger = spdlog::get(forward_plot_logger_name); - if (not forward_plot_logger) { - forward_plot_logger = spdlog::basic_logger_st(forward_plot_logger_name, forward_plot_logger_file_name); - } - forward_plot_logger->info("New forward plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - forward_plot_logger->set_pattern("%v"); - - reverse_plot_logger_file_name = log_filename_prefix + "_reverse_plot.txt"; - reverse_plot_logger = spdlog::get(reverse_plot_logger_name); - if (not reverse_plot_logger) { - reverse_plot_logger = spdlog::basic_logger_st(reverse_plot_logger_name, reverse_plot_logger_file_name); - } - reverse_plot_logger->info("New reverse plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - reverse_plot_logger->set_pattern("%v"); - - - - forward_price_stat_logger_file_name = log_filename_prefix + "_forward_price_change_stat"; - forward_price_stat_logger = spdlog::get(forward_price_stat_logger_name); - if (not forward_price_stat_logger) { - forward_price_stat_logger = spdlog::basic_logger_st(forward_price_stat_logger_name, - forward_price_stat_logger_file_name); - } - forward_price_stat_logger->info("New forward price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - forward_price_stat_logger->set_pattern("%v"); - - reverse_price_stat_logger_file_name = log_filename_prefix + "_reverse_price_change_stat"; - reverse_price_stat_logger = spdlog::get(reverse_price_stat_logger_name); - if (not reverse_price_stat_logger) { - reverse_price_stat_logger = spdlog::basic_logger_st(reverse_price_stat_logger_name, - reverse_price_stat_logger_file_name); - } - reverse_price_stat_logger->info("New reverse price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - reverse_price_stat_logger->set_pattern("%v"); -#endif -} - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_cost_to_diagonal(const DgmPoint& pt) const -{ - if (1.0 == wasserstein_power) { - return pt.persistence_lp(internal_p); - } else { - return std::pow(pt.persistence_lp(internal_p), wasserstein_power); - } -} - - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_gamma() const -{ - if (1.0 == wasserstein_power) { - return unassigned_items_persistence + unassigned_bidders_persistence; - } else { - return std::pow(unassigned_items_persistence + unassigned_bidders_persistence, - 1.0 / wasserstein_power); - } -} - -template -void AuctionRunnerFR::reset_phase_stat() -{ - num_rounds_non_cumulative = 0; -#ifdef LOG_AUCTION - num_parallelizable_rounds = 0; - num_parallelizable_forward_rounds = 0; - num_parallelizable_reverse_rounds = 0; - num_forward_rounds_non_cumulative = 0; - num_reverse_rounds_non_cumulative = 0; -#endif -} - - -template -void AuctionRunnerFR::reset_round_stat() -{ - num_forward_bids_submitted = 0; - num_reverse_bids_submitted = 0; -#ifdef LOG_AUCTION - num_normal_forward_bids_submitted = 0; - num_diag_forward_bids_submitted = 0; - - num_forward_diag_to_diag_assignments = 0; - num_forward_diag_to_normal_assignments = 0; - num_forward_normal_to_diag_assignments = 0; - num_forward_normal_to_normal_assignments = 0; - - num_forward_diag_from_diag_thefts = 0; - num_forward_diag_from_normal_thefts = 0; - num_forward_normal_from_diag_thefts = 0; - num_forward_normal_from_normal_thefts = 0; - - // reverse rounds - num_normal_reverse_bids_submitted = 0; - num_diag_reverse_bids_submitted = 0; - - num_reverse_diag_to_diag_assignments = 0; - num_reverse_diag_to_normal_assignments = 0; - num_reverse_normal_to_diag_assignments = 0; - num_reverse_normal_to_normal_assignments = 0; - - num_reverse_diag_from_diag_thefts = 0; - num_reverse_diag_from_normal_thefts = 0; - num_reverse_normal_from_diag_thefts = 0; - num_reverse_normal_from_normal_thefts = 0; -#endif -} - - -template -void AuctionRunnerFR::assign_forward(IdxType item_idx, IdxType bidder_idx) -{ - console_logger->debug("Enter assign_forward, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); - sanity_check(); - // only unassigned bidders submit bids - assert(bidders_to_items[bidder_idx] == k_invalid_index); - - IdxType old_item_owner = items_to_bidders[item_idx]; - - // set new owner - bidders_to_items[bidder_idx] = item_idx; - items_to_bidders[item_idx] = bidder_idx; - - // remove bidder and item from the sets of unassigned bidders/items - remove_unassigned_bidder(bidder_idx); - - if (k_invalid_index != old_item_owner) { - // old owner of item becomes unassigned - bidders_to_items[old_item_owner] = k_invalid_index; - add_unassigned_bidder(old_item_owner); - // existing edge was removed, decrease partial_cost - partial_cost -= get_item_bidder_cost(item_idx, old_item_owner); - } else { - // item was unassigned before - remove_unassigned_item(item_idx); - } - - // new edge was added to matching, increase partial cost - partial_cost += get_item_bidder_cost(item_idx, bidder_idx); - -#ifdef LOG_AUCTION - - if (unassigned_bidders.size() > parallel_threshold) { - num_parallel_assignments++; - } - num_total_assignments++; - - - int it_d = is_item_diagonal(item_idx); - int b_d = is_bidder_diagonal(bidder_idx); - // 2 - None - int old_d = ( k_invalid_index == old_item_owner ) ? 2 : is_bidder_diagonal(old_item_owner); - int key = 100 * old_d + 10 * b_d + it_d; - switch(key) { - case 211 : num_forward_diag_to_diag_assignments++; - break; - case 210 : num_forward_diag_to_normal_assignments++; - break; - case 201 : num_forward_normal_to_diag_assignments++; - break; - case 200 : num_forward_normal_to_normal_assignments++; - break; - - case 111 : num_forward_diag_to_diag_assignments++; - num_forward_diag_from_diag_thefts++; - break; - case 110 : num_forward_diag_to_normal_assignments++; - num_forward_diag_from_diag_thefts++; - break; - break; - case 101 : num_forward_normal_to_diag_assignments++; - num_forward_normal_from_diag_thefts++; - break; - break; - case 100 : num_forward_normal_to_normal_assignments++; - num_forward_normal_from_diag_thefts++; - break; - - case 11 : num_forward_diag_to_diag_assignments++; - num_forward_diag_from_normal_thefts++; - break; - case 10 : num_forward_diag_to_normal_assignments++; - num_forward_diag_from_normal_thefts++; - break; - break; - case 1 : num_forward_normal_to_diag_assignments++; - num_forward_normal_from_normal_thefts++; - break; - break; - case 0 : num_forward_normal_to_normal_assignments++; - num_forward_normal_from_normal_thefts++; - break; - default : std::cerr << "key = " << key << std::endl; - throw std::runtime_error("Bug in logging, wrong key"); - break; - } -#endif - - sanity_check(); - console_logger->debug("Exit assign_forward, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); -} - - -template -void AuctionRunnerFR::assign_reverse(IdxType item_idx, IdxType bidder_idx) -{ - console_logger->debug("Enter assign_reverse, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); - // only unassigned items submit bids in reverse phase - assert(items_to_bidders[item_idx] == k_invalid_index); - - IdxType old_bidder_owner = bidders_to_items[bidder_idx]; - - // set new owner - bidders_to_items[bidder_idx] = item_idx; - items_to_bidders[item_idx] = bidder_idx; - - // remove bidder and item from the sets of unassigned bidders/items - remove_unassigned_item(item_idx); - - if (k_invalid_index != old_bidder_owner) { - // old owner of item becomes unassigned - items_to_bidders[old_bidder_owner] = k_invalid_index; - add_unassigned_item(old_bidder_owner); - // existing edge was removed, decrease partial_cost - partial_cost -= get_item_bidder_cost(old_bidder_owner, bidder_idx); - } else { - // item was unassigned before - remove_unassigned_bidder(bidder_idx); - } - - // new edge was added to matching, increase partial cost - partial_cost += get_item_bidder_cost(item_idx, bidder_idx); - -#ifdef LOG_AUCTION - if (unassigned_items.size() > parallel_threshold) { - num_parallel_assignments++; - } - num_total_assignments++; - - int it_d = is_item_diagonal(item_idx); - int b_d = is_bidder_diagonal(bidder_idx); - // 2 - None - int old_d = (k_invalid_index == old_bidder_owner) ? 2 : is_item_diagonal(old_bidder_owner); - int key = 100 * old_d + 10 * it_d + b_d; - switch(key) { - case 211 : num_reverse_diag_to_diag_assignments++; - break; - case 210 : num_reverse_diag_to_normal_assignments++; - break; - case 201 : num_reverse_normal_to_diag_assignments++; - break; - case 200 : num_reverse_normal_to_normal_assignments++; - break; - - case 111 : num_reverse_diag_to_diag_assignments++; - num_reverse_diag_from_diag_thefts++; - break; - case 110 : num_reverse_diag_to_normal_assignments++; - num_reverse_diag_from_diag_thefts++; - break; - break; - case 101 : num_reverse_normal_to_diag_assignments++; - num_reverse_normal_from_diag_thefts++; - break; - break; - case 100 : num_reverse_normal_to_normal_assignments++; - num_reverse_normal_from_diag_thefts++; - break; - - case 11 : num_reverse_diag_to_diag_assignments++; - num_reverse_diag_from_normal_thefts++; - break; - case 10 : num_reverse_diag_to_normal_assignments++; - num_reverse_diag_from_normal_thefts++; - break; - break; - case 1 : num_reverse_normal_to_diag_assignments++; - num_reverse_normal_from_normal_thefts++; - break; - break; - case 0 : num_reverse_normal_to_normal_assignments++; - num_reverse_normal_from_normal_thefts++; - break; - default : std::cerr << "key = " << key << std::endl; - throw std::runtime_error("Bug in logging, wrong key"); - break; - } - -#endif - console_logger->debug("Exit assign_reverse, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); -} - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const -{ - if (wasserstein_power == 1.0) { - return dist_lp(bidders[bidder_idx], items[item_idx], internal_p); - } else { - return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p), - wasserstein_power); - } -} - -template -void AuctionRunnerFR::assign_to_best_bidder(IdxType item_idx) -{ - console_logger->debug("Enter assign_to_best_bidder, item_idx = {0}", item_idx); - assert( item_idx >= 0 and item_idx < static_cast(num_items) ); - assert( forward_bid_table[item_idx].first != k_invalid_index); - - auto best_bidder_idx = forward_bid_table[item_idx].first; - auto best_bid_value = forward_bid_table[item_idx].second; - assign_forward(item_idx, best_bidder_idx); - forward_oracle.sanity_check(); - forward_oracle.set_price(item_idx, best_bid_value, true); - forward_oracle.sanity_check(); - auto new_bidder_price = -get_item_bidder_cost(item_idx, best_bidder_idx) - best_bid_value; - reverse_oracle.set_price(best_bidder_idx, new_bidder_price, false); - check_epsilon_css(); -#ifdef LOG_AUCTION - forward_price_change_cnt_vec.back()[item_idx]++; - reverse_price_change_cnt_vec.back()[best_bidder_idx]++; -#endif - console_logger->debug("Exit assign_to_best_bidder, item_idx = {0}", item_idx); -} - -template -void AuctionRunnerFR::assign_to_best_item(IdxType bidder_idx) -{ - console_logger->debug("Enter assign_to_best_item, bidder_idx = {0}", bidder_idx); - check_epsilon_css(); - assert( bidder_idx >= 0 and bidder_idx < static_cast(num_bidders) ); - assert( reverse_bid_table[bidder_idx].first != k_invalid_index); - auto best_item_idx = reverse_bid_table[bidder_idx].first; - auto best_bid_value = reverse_bid_table[bidder_idx].second; - // both assign_forward and assign_reverse take item index first, bidder index second! - assign_reverse(best_item_idx, bidder_idx); - reverse_oracle.sanity_check(); - reverse_oracle.set_price(bidder_idx, best_bid_value, true); - reverse_oracle.sanity_check(); - auto new_item_price = -get_item_bidder_cost(best_item_idx, bidder_idx) - best_bid_value; - forward_oracle.set_price(best_item_idx, new_item_price, false); -#ifdef LOG_AUCTION - forward_price_change_cnt_vec.back()[best_item_idx]++; - reverse_price_change_cnt_vec.back()[bidder_idx]++; -#endif - check_epsilon_css(); - console_logger->debug("Exit assign_to_best_item, bidder_idx = {0}", bidder_idx); -} - -template -void AuctionRunnerFR::clear_forward_bid_table() -{ - auto item_iter = items_with_bids.begin(); - while(item_iter != items_with_bids.end()) { - auto item_with_bid_idx = *item_iter; - forward_bid_table[item_with_bid_idx].first = k_invalid_index; - forward_bid_table[item_with_bid_idx].second = k_lowest_bid_value; - item_iter = items_with_bids.erase(item_iter); - } -} - -template -void AuctionRunnerFR::clear_reverse_bid_table() -{ - auto bidder_iter = bidders_with_bids.begin(); - while(bidder_iter != bidders_with_bids.end()) { - auto bidder_with_bid_idx = *bidder_iter; - reverse_bid_table[bidder_with_bid_idx].first = k_invalid_index; - reverse_bid_table[bidder_with_bid_idx].second = k_lowest_bid_value; - bidder_iter = bidders_with_bids.erase(bidder_iter); - } -} - -template -void AuctionRunnerFR::submit_forward_bid(IdxType bidder_idx, const IdxValPairR& bid) -{ - IdxType best_item_idx = bid.first; - Real bid_value = bid.second; - assert( best_item_idx >= 0 ); - - auto value_in_bid_table = forward_bid_table[best_item_idx].second; - bool new_bid_wins = (value_in_bid_table < bid_value); - // if we have tie, lower persistence wins -// if (value_in_bid_table == bid_value) { -// -// assert(forward_bid_table.at(best_item_idx).first != k_invalid_index); -// assert(&bidders.at(forward_bid_table.at(best_item_idx).first)); -// -// auto bidder_in_bid_table = bidders[forward_bid_table[best_item_idx].first]; -// new_bid_wins = bidders[best_item_idx].persistence_lp(internal_p) < bidder_in_bid_table.persistence_lp(internal_p); -// } - - if (new_bid_wins) { - forward_bid_table[best_item_idx].first = bidder_idx; - forward_bid_table[best_item_idx].second = bid_value; - } - - items_with_bids.insert(best_item_idx); - -#ifdef LOG_AUCTION - - if (unassigned_bidders.size() > parallel_threshold) { - num_parallel_bids++; - } - num_total_bids++; - - - if (is_bidder_diagonal(bidder_idx)) { - num_diag_forward_bids_submitted++; - } else { - num_normal_forward_bids_submitted++; - } -#endif -} - -template -void AuctionRunnerFR::submit_reverse_bid(IdxType item_idx, const IdxValPairR& bid) -{ - assert( items.at(item_idx).is_diagonal() or items.at(item_idx).is_normal() ); - IdxType best_bidder_idx = bid.first; - assert( bidders.at(best_bidder_idx).is_diagonal() or bidders.at(best_bidder_idx).is_normal() ); - Real bid_value = bid.second; - assert(bid_value > k_lowest_bid_value); - auto value_in_bid_table = reverse_bid_table[best_bidder_idx].second; - bool new_bid_wins = (value_in_bid_table < bid_value); - // if we have tie, lower persistence wins -// if (value_in_bid_table == bid_value) { -// assert(reverse_bid_table[best_bidder_idx].first != k_invalid_index); -// auto bidder_in_bid_table = bidders[reverse_bid_table[best_bidder_idx].first]; -// new_bid_wins = bidders[best_bidder_idx].persistence_lp(internal_p) < bidder_in_bid_table.persistence_lp(internal_p); -// } - if (new_bid_wins) { - reverse_bid_table[best_bidder_idx].first = item_idx; - reverse_bid_table[best_bidder_idx].second = bid_value; - } - bidders_with_bids.insert(best_bidder_idx); - -#ifdef LOG_AUCTION - - if (unassigned_items.size() > parallel_threshold) { - num_parallel_bids++; - } - num_total_bids++; - - if (is_item_diagonal(item_idx)) { - num_diag_reverse_bids_submitted++; - } else { - num_normal_reverse_bids_submitted++; - } -#endif -} - - -template -void AuctionRunnerFR::print_debug() -{ -#ifdef DEBUG_FR_AUCTION - std::cout << "**********************" << std::endl; - std::cout << "Current assignment:" << std::endl; - for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { - std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; - } - std::cout << "Weights: " << std::endl; - //for(size_t i = 0; i < num_bidders; ++i) { - //for(size_t j = 0; j < num_items; ++j) { - //std::cout << oracle.weight_matrix[i][j] << " "; - //} - //std::cout << std::endl; - //} - std::cout << "Bidder prices: " << std::endl; - for(const auto price : forward_oracle.get_prices()) { - std::cout << price << std::endl; - } - std::cout << "**********************" << std::endl; -#endif -} - - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_relative_error(const bool debug_output) const -{ - Real result; - Real gamma = get_gamma(); - // cost minus n epsilon - Real reduced_cost = partial_cost - num_bidders * get_epsilon(); - if ( reduced_cost < 0) { -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->debug("Epsilon too large, reduced_cost = {0}", reduced_cost); - } -#endif - result = k_max_relative_error; - } else { - Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power) - gamma; - if (denominator <= 0) { -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->debug("Epsilon too large, reduced_cost = {0}, denominator = {1}, gamma = {2}", reduced_cost, denominator, gamma); - } -#endif - result = k_max_relative_error; - } else { - Real numerator = 2 * gamma + - std::pow(partial_cost, 1.0 / wasserstein_power) - - std::pow(reduced_cost, 1.0 / wasserstein_power); - - result = numerator / denominator; -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->debug("Reduced_cost = {0}, denominator = {1}, numerator {2}, error = {3}, gamma = {4}", - reduced_cost, - denominator, - numerator, - result, - gamma); - } -#endif - } - } - return result; -} - -template -void AuctionRunnerFR::flush_assignment() -{ - console_logger->debug("Enter flush_assignment"); - for(auto& b2i : bidders_to_items) { - b2i = k_invalid_index; - } - for(auto& i2b : items_to_bidders) { - i2b = k_invalid_index; - } - - // all bidders and items become unassigned - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_bidders.insert(bidder_idx); - } - - // all items and items become unassigned - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - unassigned_items.insert(item_idx); - } - - - //forward_oracle.adjust_prices(); - //reverse_oracle.adjust_prices(); - - partial_cost = 0.0; - unassigned_bidders_persistence = total_bidders_persistence; - unassigned_items_persistence = total_items_persistence; - -#ifdef ORDERED_BY_PERSISTENCE - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_bidders_by_persistence.insert(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); - } - - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - unassigned_items_by_persistence.insert(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); - } -#endif - -#ifdef LOG_AUCTION - - reset_phase_stat(); - - forward_price_change_cnt_vec.push_back(std::vector(num_items, 0)); - reverse_price_change_cnt_vec.push_back(std::vector(num_bidders, 0)); - - // all bidders and items become unassigned - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders.insert(bidder_idx); - } else { - unassigned_diag_bidders.insert(bidder_idx); - } - } - - never_assigned_bidders = unassigned_bidders; - - for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { - if (is_item_normal(item_idx)) { - unassigned_normal_items.insert(item_idx); - } else { - unassigned_diag_items.insert(item_idx); - } - } - - never_assigned_items = unassigned_items; -#endif - check_epsilon_css(); - console_logger->debug("Exit flush_assignment"); -} - -template -void AuctionRunnerFR::set_epsilon(Real new_val) -{ - assert(new_val > 0.0); - epsilon = new_val; - forward_oracle.set_epsilon(new_val); - reverse_oracle.set_epsilon(new_val); -} - - -template -bool AuctionRunnerFR::continue_forward(const size_t original_unassigned_bidders, const size_t min_forward_matching_increment) -{ -// if (unassigned_threshold == 0) { -// return not unassigned_bidders.empty() and get_relative_error(false) > delta; -// } - //return unassigned_bidders.size() > unassigned_threshold and - //static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment); - return unassigned_bidders.size() > unassigned_threshold and - static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment) and - get_relative_error() >= delta; -// return not unassigned_bidders.empty() and -// static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment) and -// get_relative_error() >= delta; -} - - -template -bool AuctionRunnerFR::continue_reverse(const size_t original_unassigned_items, const size_t min_reverse_matching_increment) -{ - //return unassigned_items.size() > unassigned_threshold and - //static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment); - return unassigned_items.size() > unassigned_threshold and - static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment) and - get_relative_error() >= delta; -// return not unassigned_items.empty() and -// static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment) and -// get_relative_error() >= delta; -} - - -template -bool AuctionRunnerFR::continue_phase() -{ - //return not unassigned_bidders.empty(); - return unassigned_bidders.size() > unassigned_threshold and get_relative_error() >= delta; -// return not never_assigned_bidders.empty() or -// not never_assigned_items.empty() or -// unassigned_bidders.size() > unassigned_threshold and get_relative_error() >= delta; -} - - - -template -void AuctionRunnerFR::run_auction_phase() -{ - num_phase++; - while(continue_phase()) { - forward_oracle.recompute_top_diag_items(true); - forward_oracle.sanity_check(); - console_logger->debug("forward_oracle recompute_top_diag_items done"); - run_forward_auction_phase(); - reverse_oracle.recompute_top_diag_items(true); - console_logger->debug("reverse_oracle recompute_top_diag_items done"); - reverse_oracle.sanity_check(); - run_reverse_auction_phase(); - } -} - -template -void AuctionRunnerFR::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) -{ - set_epsilon(_initial_epsilon); - assert( forward_oracle.get_epsilon() > 0 ); - assert( reverse_oracle.get_epsilon() > 0 ); - for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { - flush_assignment(); - console_logger->info("Phase {0} started: eps = {1}", - num_phase, - get_epsilon()); - - run_auction_phase(); - Real current_result = partial_cost; -#ifdef LOG_AUCTION - console_logger->info("Phase {0} done: current_result = {1}, eps = {2}, unassigned_threshold = {3}, unassigned = {4}, error = {5}, gamma = {6}", - num_phase, - partial_cost, - get_epsilon(), - format_int<>(unassigned_threshold), - unassigned_bidders.size(), - get_relative_error(false), - get_gamma()); - - console_logger->info("Phase {0} done: num_rounds / num_parallelizable_rounds = {1} / {2} = {3}, cumulative rounds = {4}", - num_phase, - format_int(num_rounds_non_cumulative), - format_int(num_parallelizable_rounds), - static_cast(num_parallelizable_rounds) / static_cast(num_rounds_non_cumulative), - format_int(num_rounds) - ); - - console_logger->info("parallelizable_forward_rounds / num_forward_rounds = {0} / {1} = {2}", - format_int<>(num_parallelizable_forward_rounds), - format_int<>(num_forward_rounds_non_cumulative), - static_cast(num_parallelizable_forward_rounds) / static_cast(num_forward_rounds_non_cumulative) - ); - - num_parallelizable_forward_rounds = 0; - num_forward_rounds_non_cumulative = 0; - - console_logger->info("parallelizable_reverse_rounds / num_reverse_rounds = {0} / {1} = {2}", - format_int<>(num_parallelizable_reverse_rounds), - format_int<>(num_reverse_rounds_non_cumulative), - static_cast(num_parallelizable_reverse_rounds) / static_cast(num_reverse_rounds_non_cumulative) - ); - - num_parallelizable_reverse_rounds = 0; - num_reverse_rounds_non_cumulative = 0; - - console_logger->info("num_parallel_bids / num_total_bids = {0} / {1} = {2}, num_parallel_assignments / num_total_assignments = {3} / {4} = {5}", - format_int<>(num_parallel_bids), - format_int<>(num_total_bids), - static_cast(num_parallel_bids) / static_cast(num_total_bids), - format_int<>(num_parallel_assignments), - format_int<>(num_total_assignments), - static_cast(num_parallel_assignments) / static_cast(num_total_assignments) - ); - - auto forward_min_max_price = forward_oracle.get_minmax_price(); - auto reverse_min_max_price = reverse_oracle.get_minmax_price(); - - console_logger->info("forward min price = {0}, max price = {1}; reverse min price = {2}, reverse max price = {3}", - forward_min_max_price.first, - forward_min_max_price.second, - reverse_min_max_price.first, - reverse_min_max_price.second - ); - - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - forward_price_stat_logger->info("{0} {1} {2} {3} {4}", - phase_num, - item_idx, - items[item_idx].getRealX(), - items[item_idx].getRealY(), - forward_price_change_cnt_vec.back()[item_idx] - ); - } - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - reverse_price_stat_logger->info("{0} {1} {2} {3} {4}", - phase_num, - bidder_idx, - bidders[bidder_idx].getRealX(), - bidders[bidder_idx].getRealY(), - reverse_price_change_cnt_vec.back()[bidder_idx] - ); - } -#endif - - if (get_relative_error(true) <= delta) { - break; - } - // decrease epsilon for the next iteration - decrease_epsilon(); - - unassigned_threshold = std::floor( static_cast(unassigned_threshold) / 1.1 ); - - if (phase_can_be_final()) { - unassigned_threshold = 0; -#ifdef LOG_AUCTION - console_logger->info("Unassigned threshold set to zero!"); -#endif - } - } -} - -template -bool AuctionRunnerFR::phase_can_be_final() const -{ - Real estimated_error; - // cost minus n epsilon - Real reduced_cost = partial_cost - num_bidders * get_epsilon(); - if (reduced_cost <= 0.0) { - return false; - } else { - Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power); - if (denominator <= 0) { - return false; - } else { - Real numerator = std::pow(partial_cost, 1.0 / wasserstein_power) - - std::pow(reduced_cost, 1.0 / wasserstein_power); - - estimated_error = numerator / denominator; - return estimated_error <= delta; - } - } -} - -template -void AuctionRunnerFR::run_auction() -{ - double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : std::min(forward_oracle.max_val_, reverse_oracle.max_val_) / 4.0 ; - assert(init_eps > 0.0); - run_auction_phases(max_num_phases, init_eps); - is_distance_computed = true; - wasserstein_cost = partial_cost; - if (get_relative_error() > delta) { -#ifndef FOR_R_TDA - std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; - std::cerr << get_wasserstein_distance() << std::endl; -#endif - throw std::runtime_error("Maximum iteration number exceeded"); - } -} - -template -void AuctionRunnerFR::add_unassigned_bidder(const size_t bidder_idx) -{ - const DgmPoint& bidder = bidders[bidder_idx]; - unassigned_bidders.insert(bidder_idx); - unassigned_bidders_persistence += get_cost_to_diagonal(bidder); - -#ifdef ORDERED_BY_PERSISTENCE - unassigned_bidders_by_persistence.insert(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); -#endif - -#ifdef LOG_AUCTION - if (is_bidder_diagonal(bidder_idx)) { - unassigned_diag_bidders.insert(bidder_idx); - } else { - unassigned_normal_bidders.insert(bidder_idx); - } -#endif -} - -template -void AuctionRunnerFR::add_unassigned_item(const size_t item_idx) -{ - const DgmPoint& item = items[item_idx]; - unassigned_items.insert(item_idx); - unassigned_items_persistence += get_cost_to_diagonal(item); - -#ifdef ORDERED_BY_PERSISTENCE - unassigned_items_by_persistence.insert(std::make_pair(item.persistence_lp(1.0), item_idx)); -#endif - -#ifdef LOG_AUCTION - if (is_item_diagonal(item_idx)) { - unassigned_diag_items.insert(item_idx); - } else { - unassigned_normal_items.insert(item_idx); - } -#endif -} - - -template -void AuctionRunnerFR::remove_unassigned_bidder(const size_t bidder_idx) -{ - unassigned_bidders_persistence -= get_cost_to_diagonal(bidders[bidder_idx]); - - unassigned_bidders.erase(bidder_idx); - never_assigned_bidders.erase(bidder_idx); - -#ifdef ORDERED_BY_PERSISTENCE - unassigned_bidders_by_persistence.erase(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); -#endif - -#ifdef LOG_AUCTION - if (is_bidder_diagonal(bidder_idx)) { - unassigned_diag_bidders.erase(bidder_idx); - } else { - unassigned_normal_bidders.erase(bidder_idx); - } - if (never_assigned_bidders.empty() and not all_assigned_round_found) { - all_assigned_round = num_rounds_non_cumulative; - all_assigned_round_found = true; - } -#endif -} - -template -void AuctionRunnerFR::remove_unassigned_item(const size_t item_idx) -{ - console_logger->debug("Enter remove_unassigned_item, unassigned_items.size = {0}", unassigned_items.size()); - unassigned_items_persistence -= get_cost_to_diagonal(items[item_idx]); - - never_assigned_items.erase(item_idx); - unassigned_items.erase(item_idx); - -#ifdef ORDERED_BY_PERSISTENCE - unassigned_items_by_persistence.erase(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); -#endif - -#ifdef LOG_AUCTION - if (is_item_normal(item_idx)) { - unassigned_normal_items.erase(item_idx); - } else { - unassigned_diag_items.erase(item_idx); - } - if (never_assigned_items.empty() and not all_assigned_round_found) { - all_assigned_round = num_rounds_non_cumulative; - all_assigned_round_found = true; - } -#endif - console_logger->debug("Exit remove_unassigned_item, unassigned_items.size = {0}", unassigned_items.size()); -} - -template -void AuctionRunnerFR::decrease_epsilon() -{ - auto eps_diff = 1.01 * get_epsilon() * (epsilon_common_ratio - 1.0 ) / epsilon_common_ratio; - reverse_oracle.adjust_prices( -eps_diff ); - set_epsilon( get_epsilon() / epsilon_common_ratio ); - cumulative_epsilon_factor *= epsilon_common_ratio; -} - - - -template -void AuctionRunnerFR::run_reverse_auction_phase() -{ - console_logger->debug("Enter run_reverse_auction_phase"); - size_t original_unassigned_items = unassigned_items.size(); -// const size_t min_reverse_matching_increment = std::max( static_cast(1), static_cast(original_unassigned_items / 10)); - size_t min_reverse_matching_increment = 1; - - while (continue_reverse(original_unassigned_items, min_reverse_matching_increment)) { - num_rounds++; - num_rounds_non_cumulative++; - console_logger->debug("started round = {0}, reverse, unassigned = {1}", num_rounds, unassigned_items.size()); - - check_epsilon_css(); -#ifdef LOG_AUCTION - if (unassigned_items.size() >= parallel_threshold) { - ++num_parallelizable_reverse_rounds; - ++num_parallelizable_rounds; - } - num_reverse_rounds++; - num_reverse_rounds_non_cumulative++; -#endif - - reset_round_stat(); - // bidding -#ifdef ORDERED_BY_PERSISTENCE - std::vector active_items; - active_items.reserve(batch_size); - for(auto iter = unassigned_items_by_persistence.begin(); - iter != unassigned_items_by_persistence.end(); ++iter) { - active_items.push_back(iter->second); - if (active_items.size() >= batch_size) { - break; - } - } - run_reverse_bidding_step(active_items); -#else - //if (not never_assigned_items.empty()) - //run_reverse_bidding_step(never_assigned_items); - //else - //run_reverse_bidding_step(unassigned_items); - run_reverse_bidding_step(unassigned_items); -#endif - - // assignment phase - for(auto bidder_idx : bidders_with_bids ) { - assign_to_best_item(bidder_idx); - } - - check_epsilon_css(); - - console_logger->debug("ended round = {0}, reverse, unassigned = {1}", num_rounds, unassigned_items.size()); - -#ifdef LOG_AUCTION - - reverse_plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22}", - num_phase, - num_rounds, - num_reverse_rounds, - unassigned_bidders.size(), - get_gamma(), - partial_cost, - reverse_oracle.get_epsilon(), - num_normal_reverse_bids_submitted, - num_diag_reverse_bids_submitted, - num_reverse_diag_to_diag_assignments, - num_reverse_diag_to_normal_assignments, - num_reverse_normal_to_diag_assignments, - num_reverse_normal_to_normal_assignments, - num_reverse_diag_from_diag_thefts, - num_reverse_diag_from_normal_thefts, - num_reverse_normal_from_diag_thefts, - num_reverse_normal_from_normal_thefts, - unassigned_normal_bidders.size(), - unassigned_diag_bidders.size(), - unassigned_normal_items.size(), - unassigned_diag_items.size(), - reverse_oracle.get_heap_top_size(), - get_relative_error(false) - ); - sanity_check(); -#endif - } -} - -template -template -void AuctionRunnerFR::run_forward_bidding_step(const Range& active_bidders) -{ - clear_forward_bid_table(); - for(const auto bidder_idx : active_bidders) { - console_logger->debug("current bidder (forward): {0}, persistence = {1}", bidders[bidder_idx], bidders[bidder_idx].persistence_lp(1.0)); - submit_forward_bid(bidder_idx, forward_oracle.get_optimal_bid(bidder_idx)); - if (++num_forward_bids_submitted >= max_bids_per_round) { - break; - } - } -} - -template -template -void AuctionRunnerFR::run_reverse_bidding_step(const Range& active_items) -{ - clear_reverse_bid_table(); - - assert(bidders_with_bids.empty()); - assert(std::all_of(reverse_bid_table.begin(), reverse_bid_table.end(), - [ki = k_invalid_index, kl = k_lowest_bid_value](const IdxValPairR& b) { return static_cast(b.first) == ki and b.second == kl; })); - - for(const auto item_idx : active_items) { - console_logger->debug("current bidder (reverse): {0}, persistence = {1}", items[item_idx], items[item_idx].persistence_lp(1.0)); - submit_reverse_bid(item_idx, reverse_oracle.get_optimal_bid(item_idx)); - if (++num_reverse_bids_submitted >= max_bids_per_round) { - break; - } - } -} - - -template -void AuctionRunnerFR::run_forward_auction_phase() -{ - const size_t original_unassigned_bidders = unassigned_bidders.size(); -// const size_t min_forward_matching_increment = std::max( static_cast(1), static_cast(original_unassigned_bidders / 10)); - const size_t min_forward_matching_increment = 1; - while (continue_forward(original_unassigned_bidders, min_forward_matching_increment)) { - console_logger->debug("started round = {0}, forward, unassigned = {1}", num_rounds, unassigned_bidders.size()); - check_epsilon_css(); - num_rounds++; -#ifdef LOG_AUCTION - if (unassigned_bidders.size() >= parallel_threshold) { - ++num_parallelizable_forward_rounds; - ++num_parallelizable_rounds; - } - num_forward_rounds++; - num_forward_rounds_non_cumulative++; -#endif - - reset_round_stat(); - // bidding step -#ifdef ORDERED_BY_PERSISTENCE - std::vector active_bidders; - active_bidders.reserve(batch_size); - for(auto iter = unassigned_bidders_by_persistence.begin(); - iter != unassigned_bidders_by_persistence.end(); ++iter) { - active_bidders.push_back(iter->second); - if (active_bidders.size() >= batch_size) { - break; - } - } - run_forward_bidding_step(active_bidders); -#else - - //if (not never_assigned_bidders.empty()) - //run_forward_bidding_step(never_assigned_bidders); - //else - //run_forward_bidding_step(unassigned_bidders); - run_forward_bidding_step(unassigned_bidders); -#endif - - // assignment step - for(auto item_idx : items_with_bids ) { - assign_to_best_bidder(item_idx); - } - - console_logger->debug("ended round = {0}, forward, unassigned = {1}", num_rounds, unassigned_bidders.size()); - check_epsilon_css(); - -#ifdef LOG_AUCTION - forward_plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22}", - num_phase, - num_rounds, - num_forward_rounds, - unassigned_bidders.size(), - get_gamma(), - partial_cost, - forward_oracle.get_epsilon(), - num_normal_forward_bids_submitted, - num_diag_forward_bids_submitted, - num_forward_diag_to_diag_assignments, - num_forward_diag_to_normal_assignments, - num_forward_normal_to_diag_assignments, - num_forward_normal_to_normal_assignments, - num_forward_diag_from_diag_thefts, - num_forward_diag_from_normal_thefts, - num_forward_normal_from_diag_thefts, - num_forward_normal_from_normal_thefts, - unassigned_normal_bidders.size(), - unassigned_diag_bidders.size(), - unassigned_normal_items.size(), - unassigned_diag_items.size(), - forward_oracle.get_heap_top_size(), - get_relative_error(false) - ); -#endif - } ; - -} -template -void AuctionRunnerFR::assign_diag_to_diag() -{ - size_t n_diag_to_diag = std::min(num_diag_bidders, num_diag_items); - if (n_diag_to_diag < 2) - return; - for(size_t i = 0; i < n_diag_to_diag; ++i) { - } -} - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_wasserstein_distance() -{ - assert(is_distance_computed); - return std::pow(wasserstein_cost, 1.0 / wasserstein_power); -} - -template -typename AuctionRunnerFR::Real -AuctionRunnerFR::get_wasserstein_cost() -{ - assert(is_distance_computed); - return wasserstein_cost; -} - - - -template -void AuctionRunnerFR::sanity_check() -{ -#ifdef DEBUG_FR_AUCTION - assert(partial_cost >= 0); - - - assert(num_diag_items == num_normal_bidders); - assert(num_diag_bidders == num_normal_items); - assert(num_diag_bidders + num_normal_bidders == num_bidders); - assert(num_diag_items + num_normal_items == num_items); - assert(num_items == num_bidders); - - - for(size_t b = 0; b < num_bidders; ++b) { - assert( is_bidder_diagonal(b) == bidders.at(b).is_diagonal() ); - assert( is_bidder_normal(b) == bidders.at(b).is_normal() ); - } - - for(size_t i = 0; i < num_items; ++i) { - assert( is_item_diagonal(i) == items.at(i).is_diagonal() ); - assert( is_item_normal(i) == items.at(i).is_normal() ); - } - - // check matching consistency - assert(bidders_to_items.size() == num_bidders); - assert(items_to_bidders.size() == num_bidders); - - assert(std::count(bidders_to_items.begin(), bidders_to_items.end(), k_invalid_index) == std::count(items_to_bidders.begin(), items_to_bidders.end(), k_invalid_index)); - - Real true_partial_cost = 0.0; - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (bidders_to_items[bidder_idx] != k_invalid_index) { - assert(items_to_bidders.at(bidders_to_items[bidder_idx]) == static_cast(bidder_idx)); - true_partial_cost += get_item_bidder_cost(bidders_to_items[bidder_idx], bidder_idx); - } - } - - assert(fabs(partial_cost - true_partial_cost) < 0.00001); - - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - if (items_to_bidders[item_idx] != k_invalid_index) { - assert(bidders_to_items.at(items_to_bidders[item_idx]) == static_cast(item_idx)); - } - } - -#ifdef ORDERED_BY_PERSISTENCE - assert(unassigned_bidders.size() == unassigned_bidders_by_persistence.size()); - if (unassigned_items.size() != unassigned_items_by_persistence.size()) { - console_logger->error("unassigned_items.size() = {0}, unassigned_items_by_persistence.size() = {1}", unassigned_items.size(),unassigned_items_by_persistence.size()); - console_logger->error("unassigned_items = {0}, unassigned_items_by_persistence = {1}", format_container_to_log(unassigned_items),format_pair_container_to_log(unassigned_items_by_persistence)); - } - assert(unassigned_items.size() == unassigned_items_by_persistence.size()); - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (bidders_to_items[bidder_idx] == k_invalid_index) { - assert(unassigned_bidders.count(bidder_idx) == 1); - assert(unassigned_bidders_by_persistence.count(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)) == 1); - } else { - assert(unassigned_bidders.count(bidder_idx) == 0); - assert(unassigned_bidders_by_persistence.count(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)) == 0); - } - } - - for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { - if (items_to_bidders[item_idx] == k_invalid_index) { - assert(unassigned_items.count(item_idx) == 1); - assert(unassigned_items_by_persistence.count(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)) == 1); - } else { - assert(unassigned_items.count(item_idx) == 0); - assert(unassigned_items_by_persistence.count(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)) == 0); - } - } -#endif - - -#endif -} - -template -void AuctionRunnerFR::check_epsilon_css() -{ -#ifdef DEBUG_FR_AUCTION - sanity_check(); - - std::vector b_prices = reverse_oracle.get_prices(); - std::vector i_prices = forward_oracle.get_prices(); - double eps = forward_oracle.get_epsilon(); - - for(size_t b = 0; b < num_bidders; ++b) { - for(size_t i = 0; i < num_items; ++i) { - if(((is_bidder_normal(b) and is_item_diagonal(i)) or (is_bidder_diagonal(b) and is_item_normal(i))) and b != i) - continue; - if (b_prices[b] + i_prices[i] + eps < -get_item_bidder_cost(i, b) - 0.000001) { - console_logger->debug("b = {0}, i = {1}, eps = {2}, b_price = {3}, i_price[i] = {4}, cost = {5}, b_price + i_price + eps = {6}", - b, - i, - eps, - b_prices[b], - i_prices[i], - get_item_bidder_cost(i, b), - b_prices[b] + i_prices[i] + eps - ); - } - assert(b_prices[b] + i_prices[i] + eps >= -get_item_bidder_cost(i, b) - 0.000001); - } - } - - for(size_t b = 0; b < num_bidders; ++b) { - auto i = bidders_to_items[b]; - if (i != k_invalid_index) { - assert( fabs(b_prices[b] + i_prices[i] + get_item_bidder_cost(i, b)) < 0.000001 ); - } - } -#endif -} - -template -void AuctionRunnerFR::print_matching() -{ -#ifdef DEBUG_FR_AUCTION - sanity_check(); - for(size_t bidder_idx = 0; bidder_idx < bidders_to_items.size(); ++bidder_idx) { - if (bidders_to_items[bidder_idx] >= 0) { - auto pA = bidders[bidder_idx]; - auto pB = items[bidders_to_items[bidder_idx]]; - std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p), wasserstein_power) << std::endl; - } else { - assert(false); - } - } -#endif -} - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_gs.h b/geom_matching/wasserstein/include/auction_runner_gs.h deleted file mode 100644 index f8b5a8b..0000000 --- a/geom_matching/wasserstein/include/auction_runner_gs.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_RUNNER_GS_H -#define AUCTION_RUNNER_GS_H - -#include -#include - -#include "spdlog/spdlog.h" -#include "auction_oracle.h" - -namespace hera { -namespace ws { - -template, class PointContainer_ = std::vector> > // alternatively: AuctionOracleLazyHeap --- TODO -class AuctionRunnerGS { -public: - using Real = RealType_; - using AuctionOracle = AuctionOracle_; - using DgmPoint = typename AuctionOracle::DiagramPointR; - using IdxValPairR = IdxValPair; - using PointContainer = PointContainer_; - - - AuctionRunnerGS(const PointContainer& A, - const PointContainer& B, - const AuctionParams& params, - const std::string& _log_filename_prefix = ""); - - void set_epsilon(Real new_val) { assert(epsilon > 0.0); epsilon = new_val; }; - Real get_epsilon() const { return oracle.get_epsilon(); } - Real get_wasserstein_cost(); - Real get_wasserstein_distance(); - Real get_relative_error() const { return relative_error; }; - void enable_logging(const char* log_filename, const size_t _max_unassigned_to_log); -//private: - // private data - PointContainer bidders, items; - const size_t num_bidders; - const size_t num_items; - std::vector items_to_bidders; - std::vector bidders_to_items; - Real wasserstein_power; - Real epsilon; - Real delta; - Real internal_p; - Real initial_epsilon; - Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio - const int max_num_phases; // maximal number of iterations of epsilon-scaling - bool tolerate_max_iter_exceeded; - Real weight_adj_const; - Real wasserstein_cost; - Real relative_error; - int dimension; - // to get the 2 best items - AuctionOracle oracle; - std::unordered_set unassigned_bidders; - // private methods - void assign_item_to_bidder(const IdxType bidder_idx, const IdxType items_idx); - void run_auction(); - void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); - void run_auction_phase(); - void flush_assignment(); - // return 0, if item_idx is invalid - Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx = false) const; - - // for debug only - void sanity_check(); - void print_debug(); - int count_unhappy(); - void print_matching(); - Real getDistanceToQthPowerInternal(); - int num_phase { 0 }; - int num_rounds { 0 }; - bool is_distance_computed {false}; -#ifdef LOG_AUCTION - bool log_auction { false }; - std::shared_ptr console_logger; - std::shared_ptr plot_logger; - std::unordered_set unassigned_items; - size_t max_unassigned_to_log { 0 }; - const char* logger_name = "auction_detailed_logger"; // the name in spdlog registry; filename is provided as parameter in enable_logging - const Real total_items_persistence; - const Real total_bidders_persistence; - Real partial_cost; - Real unassigned_bidders_persistence; - Real unassigned_items_persistence; -#endif -}; - -} // ws -} // hera - - -#include "auction_runner_gs.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_gs.hpp b/geom_matching/wasserstein/include/auction_runner_gs.hpp deleted file mode 100644 index 4ef94db..0000000 --- a/geom_matching/wasserstein/include/auction_runner_gs.hpp +++ /dev/null @@ -1,494 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - - -#include -#include -#include -#include -#include -#include -#include - -#include "def_debug_ws.h" - -#define PRINT_DETAILED_TIMING - -#ifdef FOR_R_TDA -#include "Rcpp.h" -#undef DEBUG_AUCTION -#endif - - -namespace hera { -namespace ws { - -// ***************************** -// AuctionRunnerGS -// ***************************** - -template -AuctionRunnerGS::AuctionRunnerGS(const PC& A, - const PC& B, - const AuctionParams& params, - const std::string& _log_filename_prefix) : - bidders(A), - items(B), - num_bidders(A.size()), - num_items(B.size()), - items_to_bidders(B.size(), k_invalid_index), - bidders_to_items(A.size(), k_invalid_index), - wasserstein_power(params.wasserstein_power), - delta(params.delta), - internal_p(params.internal_p), - initial_epsilon(params.initial_epsilon), - epsilon_common_ratio(params.epsilon_common_ratio == 0.0 ? 5.0 : params.epsilon_common_ratio), - max_num_phases(params.max_num_phases), - tolerate_max_iter_exceeded(params.tolerate_max_iter_exceeded), - dimension(params.dim), - oracle(bidders, items, params) -#ifdef LOG_AUCTION - , total_items_persistence(std::accumulate(items.begin(), - items.end(), - R(0.0), - [params](const Real& ps, const DgmPoint& item) - { return ps + std::pow(item.persistence_lp(params.internal_p), params.wasserstein_power); } - )) - - , total_bidders_persistence(std::accumulate(bidders.begin(), - bidders.end(), - R(0.0), - [params](const Real& ps, const DgmPoint& bidder) - { return ps + std::pow(bidder.persistence_lp(params.internal_p), params.wasserstein_power); } - )) - , partial_cost(0.0) - , unassigned_bidders_persistence(0.0) - , unassigned_items_persistence(0.0) -#endif - -{ - assert(initial_epsilon >= 0.0 ); - assert(epsilon_common_ratio >= 0.0 ); - assert(A.size() == B.size()); -#ifdef LOG_AUCTION - - unassigned_items_persistence = total_items_persistence; - unassigned_bidders_persistence = total_bidders_persistence; - - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); - console_logger->debug("Gauss-Seidel, num_bidders = {0}", num_bidders); - - plot_logger = spdlog::get("plot_logger"); - if (not plot_logger) { - plot_logger = spdlog::basic_logger_st("plot_logger", "plot_logger.txt"); - plot_logger->info("New plot starts here"); - plot_logger->set_pattern("%v"); - } -#endif - -} - -#ifdef LOG_AUCTION -template -void AuctionRunnerGS::enable_logging(const char* log_filename, const size_t _max_unassigned_to_log) -{ - log_auction = true; - max_unassigned_to_log = _max_unassigned_to_log; - - auto log = spdlog::basic_logger_st(logger_name, log_filename); - log->set_pattern("%v"); -} -#endif - -template -void AuctionRunnerGS::assign_item_to_bidder(IdxType item_idx, IdxType bidder_idx) -{ - num_rounds++; - sanity_check(); - // only unassigned bidders should submit bids and get items - assert(bidders_to_items[bidder_idx] == k_invalid_index); - IdxType old_item_owner = items_to_bidders[item_idx]; - - // set new owner - bidders_to_items[bidder_idx] = item_idx; - items_to_bidders[item_idx] = bidder_idx; - // remove bidder from the list of unassigned bidders - unassigned_bidders.erase(bidder_idx); - - // old owner becomes unassigned - if (old_item_owner != k_invalid_index) { - bidders_to_items[old_item_owner] = k_invalid_index; - unassigned_bidders.insert(old_item_owner); - } - - -#ifdef LOG_AUCTION - - partial_cost += get_item_bidder_cost(item_idx, bidder_idx, true); - partial_cost -= get_item_bidder_cost(item_idx, old_item_owner, true); - - unassigned_items.erase(item_idx); - - unassigned_bidders_persistence -= std::pow(bidders[bidder_idx].persistence_lp(internal_p), wasserstein_power); - - if (old_item_owner != k_invalid_index) { - // item has been assigned to some other bidder, - // and he became unassigned - unassigned_bidders_persistence += std::pow(bidders[old_item_owner].persistence_lp(internal_p), wasserstein_power); - } else { - // item was unassigned before - unassigned_items_persistence -= std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); - } - - if (log_auction) - plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}", - num_phase, - num_rounds, - unassigned_bidders.size(), - unassigned_items_persistence, - unassigned_bidders_persistence, - unassigned_items_persistence + unassigned_bidders_persistence, - partial_cost, - total_bidders_persistence, - total_items_persistence, - oracle.get_epsilon() - ); - - - if (log_auction and unassigned_bidders.size() <= max_unassigned_to_log) { - auto logger = spdlog::get(logger_name); - if (logger) { - auto item = items[item_idx]; - auto bidder = bidders[bidder_idx]; - logger->info("{0} # ({1}, {2}) # ({3}, {4}) # {5} # {6} # {7}", - num_rounds, - item.getRealX(), - item.getRealY(), - bidder.getRealX(), - bidder.getRealY(), - format_point_set_to_log(unassigned_bidders, bidders), - format_point_set_to_log(unassigned_items, items), - oracle.get_epsilon()); - } - } -#endif -} - - -template -void AuctionRunnerGS::flush_assignment() -{ - for(auto& b2i : bidders_to_items) { - b2i = k_invalid_index; - } - for(auto& i2b : items_to_bidders) { - i2b = k_invalid_index; - } - // we must flush assignment only after we got perfect matching - assert(unassigned_bidders.empty()); - // all bidders become unassigned - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_bidders.insert(bidder_idx); - } - assert(unassigned_bidders.size() == bidders.size()); - -#ifdef LOG_AUCTION - partial_cost = 0.0; - unassigned_bidders_persistence = total_bidders_persistence; - unassigned_items_persistence = total_items_persistence; - - for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { - unassigned_items.insert(item_idx); - } -#endif - - oracle.adjust_prices(); -} - - -template -void AuctionRunnerGS::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) -{ - relative_error = std::numeric_limits::max(); - // choose some initial epsilon - oracle.set_epsilon(_initial_epsilon); - assert( oracle.get_epsilon() > 0 ); - for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { - flush_assignment(); - run_auction_phase(); - Real current_result = getDistanceToQthPowerInternal(); -// Real current_result_1 = 0.0; -// for(size_t i = 0; i < num_bidders; ++i) { -// current_result_1 += oracle.traits.distance(bidders[i], items[bidders_to_items[i]]); -// } -// current_result = current_result_1; -// assert(fabs(current_result - current_result_1) < 0.001); - Real denominator = current_result - num_bidders * oracle.get_epsilon(); - current_result = pow(current_result, 1.0 / wasserstein_power); -#ifdef LOG_AUCTION - console_logger->info("Phase {0} done, num_rounds (cumulative) = {1}, current_result = {2}, epsilon = {3}", - phase_num, format_int(num_rounds), current_result, - oracle.get_epsilon()); -#endif - if ( denominator <= 0 ) { -#ifdef LOG_AUCTION - console_logger->info("Epsilon is too large"); -#endif - } else { - denominator = pow(denominator, 1.0 / wasserstein_power); - Real numerator = current_result - denominator; - relative_error = numerator / denominator; - // spdlog::get("console")->info("relative error = {} / {} = {}, result = {}", numerator, denominator, relative_error, current_result); -#ifdef LOG_AUCTION - console_logger->info("error = {0} / {1} = {2}", - numerator, denominator, relative_error); -#endif - if (relative_error <= delta) { - break; - } - } - // decrease epsilon for the next iteration - oracle.set_epsilon( oracle.get_epsilon() / epsilon_common_ratio ); - } -} - - -template -void AuctionRunnerGS::run_auction() -{ - - if (num_bidders == 1) { - assign_item_to_bidder(0, 0); - wasserstein_cost = get_item_bidder_cost(0,0); - is_distance_computed = true; - return; - } - - double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : oracle.max_val_ / 4.0 ; - run_auction_phases(max_num_phases, init_eps); - is_distance_computed = true; - if (relative_error > delta and not tolerate_max_iter_exceeded) { -#ifndef FOR_R_TDA - std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; - std::cerr << pow(wasserstein_cost, 1.0/wasserstein_power) << std::endl; -#endif - throw std::runtime_error("Maximum iteration number exceeded"); - } -} - - -template -void AuctionRunnerGS::run_auction_phase() -{ - num_phase++; - //std::cout << "Entered run_auction_phase" << std::endl; - do { - size_t bidder_idx = *unassigned_bidders.begin(); - auto optimal_bid = oracle.get_optimal_bid(bidder_idx); - auto optimal_item_idx = optimal_bid.first; - auto bid_value = optimal_bid.second; - assign_item_to_bidder(optimal_bid.first, bidder_idx); - oracle.set_price(optimal_item_idx, bid_value); - //print_debug(); -#ifdef FOR_R_TDA - if ( num_rounds % 10000 == 0 ) { - Rcpp::check_user_interrupt(); - } -#endif - } while (not unassigned_bidders.empty()); - //std::cout << "run_auction_phase finished" << std::endl; - -#ifdef DEBUG_AUCTION - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= (IdxType)num_bidders) { - std::cerr << "After auction terminated bidder " << bidder_idx; - std::cerr << " has no items assigned" << std::endl; - throw std::runtime_error("Auction did not give a perfect matching"); - } - } -#endif - -} - -template -R AuctionRunnerGS::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx) const -{ - if (item_idx != k_invalid_index and bidder_idx != k_invalid_index) { - return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension), wasserstein_power); - } else { - if (tolerate_invalid_idx) - return R(0.0); - else - throw std::runtime_error("Invalid idx in get_item_bidder_cost, item_idx = " + std::to_string(item_idx) + ", bidder_idx = " + std::to_string(bidder_idx)); - } -} - -template -R AuctionRunnerGS::getDistanceToQthPowerInternal() -{ - sanity_check(); - Real result = 0.0; - //std::cout << "-------------------------------------------------------------------------\n"; - for(size_t bIdx = 0; bIdx < num_bidders; ++bIdx) { - result += get_item_bidder_cost(bidders_to_items[bIdx], bIdx); - } - //std::cout << "-------------------------------------------------------------------------\n"; - wasserstein_cost = result; - return result; -} - -template -R AuctionRunnerGS::get_wasserstein_distance() -{ - assert(is_distance_computed); - return pow(get_wasserstein_cost(), 1.0/wasserstein_power); -} - -template -R AuctionRunnerGS::get_wasserstein_cost() -{ - assert(is_distance_computed); - return wasserstein_cost; -} - - - -// Debug routines - -template -void AuctionRunnerGS::print_debug() -{ -#ifdef DEBUG_AUCTION - sanity_check(); - std::cout << "**********************" << std::endl; - std::cout << "Current assignment:" << std::endl; - for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { - std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; - } - std::cout << "Weights: " << std::endl; - //for(size_t i = 0; i < num_bidders; ++i) { - //for(size_t j = 0; j < num_items; ++j) { - //std::cout << oracle.weight_matrix[i][j] << " "; - //} - //std::cout << std::endl; - //} - std::cout << "Prices: " << std::endl; - for(const auto price : oracle.get_prices()) { - std::cout << price << std::endl; - } - std::cout << "**********************" << std::endl; -#endif -} - - -template -void AuctionRunnerGS::sanity_check() -{ -#ifdef DEBUG_AUCTION - if (bidders_to_items.size() != num_bidders) { - std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; - throw std::runtime_error("Wrong size of bidders_to_items"); - } - - if (items_to_bidders.size() != num_bidders) { - std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; - throw std::runtime_error("Wrong size of items_to_bidders"); - } - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < (IdxType)num_items and bidders_to_items[bidder_idx] >= 0)); - - if ( bidders_to_items[bidder_idx] != k_invalid_index) { - - if ( std::count(bidders_to_items.begin(), - bidders_to_items.end(), - bidders_to_items[bidder_idx]) > 1 ) { - std::cerr << "Item " << bidders_to_items[bidder_idx]; - std::cerr << " appears in bidders_to_items more than once" << std::endl; - throw std::runtime_error("Duplicate in bidders_to_items"); - } - - if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { - std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; - std::cerr << ", item_idx in bidders_to_items = "; - std::cerr << bidders_to_items[bidder_idx]; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; - throw std::runtime_error("inconsistent mapping"); - } - } - } - - for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { - assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < static_cast(num_items) and items_to_bidders[item_idx] >= 0)); - if ( items_to_bidders.at(item_idx) != k_invalid_index) { - - // check for uniqueness - if ( std::count(items_to_bidders.begin(), - items_to_bidders.end(), - items_to_bidders[item_idx]) > 1 ) { - std::cerr << "Bidder " << items_to_bidders[item_idx]; - std::cerr << " appears in items_to_bidders more than once" << std::endl; - throw std::runtime_error("Duplicate in items_to_bidders"); - } - // check for consistency - if (bidders_to_items.at(items_to_bidders.at(item_idx)) != static_cast(item_idx)) { - std::cerr << "Inconsitency: item_idx = " << item_idx; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[item_idx]; - std::cerr << ", item_idx in bidders_to_items= "; - std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; - throw std::runtime_error("inconsistent mapping"); - } - } - } -#endif -} - -template -void AuctionRunnerGS::print_matching() -{ -#ifdef DEBUG_AUCTION - sanity_check(); - for(size_t bIdx = 0; bIdx < bidders_to_items.size(); ++bIdx) { - if (bidders_to_items[bIdx] != k_invalid_index) { - auto pA = bidders[bIdx]; - auto pB = items[bidders_to_items[bIdx]]; - std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p, dimension), wasserstein_power) << std::endl; - } else { - assert(false); - } - } -#endif -} - -} // ws -} // hera diff --git a/geom_matching/wasserstein/include/auction_runner_gs_single_diag.h b/geom_matching/wasserstein/include/auction_runner_gs_single_diag.h deleted file mode 100644 index f32fbbc..0000000 --- a/geom_matching/wasserstein/include/auction_runner_gs_single_diag.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef AUCTION_RUNNER_GS_SINGLE_DIAG_H -#define AUCTION_RUNNER_GS_SINGLE_DIAG_H - -#include -#include - -#include "auction_oracle.h" - -namespace hera { -namespace ws { - -// the two parameters that you can tweak in auction algorithm are: -// 1. epsilon_common_ratio -// 2. max_iter_num - -template > // alternatively: AuctionOracleLazyHeap --- TODO -class AuctionRunnerGaussSeidelSingleDiag { -public: - using RealType = RealType_; - using Real = RealType_; - using AuctionOracle = AuctionOracle_; - using DgmPoint = DiagramPoint; - using DgmPointVec = std::vector; - using DiagonalBidR = DiagonalBid; - - - - AuctionRunnerGaussSeidelSingleDiag(const DgmPointVec& A, - const DgmPointVec& B, - const Real q, - const Real _delta, - const Real _internal_p, - const Real _initial_epsilon, - const Real _eps_factor, - const int _max_iter_num = std::numeric_limits::max()); - - void set_epsilon(Real new_val) { oracle->set_epsilon(new_val); }; - Real get_epsilon() const { return oracle->get_epsilon(); } - Real get_wasserstein_cost(); - Real get_wasserstein_distance(); - Real get_relative_error() const { return relative_error; }; - void enable_logging(const char* log_filename, const size_t _max_unassigned_to_log); -//private: - // private data - DgmPointVec bidders, items; - const size_t num_bidders; - const size_t num_items; - size_t num_normal_bidders; - size_t num_diag_bidders; - size_t num_normal_items; - size_t num_diag_items; - std::vector items_to_bidders; - std::vector bidders_to_items; - const Real wasserstein_power; - const Real delta; - const Real internal_p; - const Real initial_epsilon; - Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio - const int max_iter_num; // maximal number of iterations of epsilon-scaling - Real weight_adj_const; - Real wasserstein_cost; - Real relative_error; - // to get the 2 best items we use oracle - std::unique_ptr oracle; - // unassigned guys - std::unordered_set unassigned_normal_bidders; - std::unordered_set unassigned_diag_bidders; - // private methods - // - void process_diagonal_bid(const DiagonalBidR& bid); - - void assign_item_to_bidder(const IdxType item_idx, - const IdxType bidder_idx, - const IdxType old_owner_idx, - const bool item_is_diagonal, - const bool bidder_is_diagonal, - const bool call_set_prices = false, - const Real new_price = std::numeric_limits::max()); - - void run_auction(); - void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); - void run_auction_phase(); - void flush_assignment(); - // return 0, if item_idx is invalid - Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx = false) const; - - bool is_bidder_diagonal(const size_t bidder_idx) const; - bool is_bidder_normal(const size_t bidder_idx) const; - bool is_item_diagonal(const size_t item_idx) const; - bool is_item_normal(const size_t item_idx) const; - - OwnerType get_owner_type(size_t bidder_idx) const; - - // for debug only - void sanity_check(); - void print_debug(); - int count_unhappy(); - void print_matching(); - Real getDistanceToQthPowerInternal(); - int num_phase { 0 }; - int num_rounds { 0 }; -#ifdef LOG_AUCTION - bool log_auction { false }; - std::unordered_set unassigned_items; - size_t max_unassigned_to_log { 0 }; - const char* logger_name = "auction_detailed_logger"; // the name in spdlog registry; filename is provided as parameter in enable_logging - const Real total_items_persistence; - const Real total_bidders_persistence; - Real partial_cost; - Real unassigned_bidders_persistence; - Real unassigned_items_persistence; -#endif -}; - -} // ws -} // hera - - -#include "auction_runner_gs_single_diag.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_gs_single_diag.hpp b/geom_matching/wasserstein/include/auction_runner_gs_single_diag.hpp deleted file mode 100644 index a3c401e..0000000 --- a/geom_matching/wasserstein/include/auction_runner_gs_single_diag.hpp +++ /dev/null @@ -1,738 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - - -#include -#include -#include -#include -#include -#include - -#include "def_debug_ws.h" - -#define PRINT_DETAILED_TIMING - -#ifdef FOR_R_TDA -#include "Rcpp.h" -#undef DEBUG_AUCTION -#endif - - -namespace hera { -namespace ws { - -// ***************************** -// AuctionRunnerGaussSeidelSingleDiag -// ***************************** - -template -std::ostream& operator<<(std::ostream& s, const AuctionRunnerGaussSeidelSingleDiag& ar) -{ - s << "--------------------------------------------------\n"; - s << "AuctionRunnerGaussSeidelSingleDiag, current assignment, bidders_to_items:" << std::endl; - for(size_t idx = 0; idx < ar.bidders_to_items.size(); ++idx) { - s << idx << " <--> " << ar.bidders_to_items[idx] << std::endl; - } - s << "--------------------------------------------------\n"; - s << "AuctionRunnerGaussSeidelSingleDiag, current assignment, items_to_bidders:" << std::endl; - for(size_t idx = 0; idx < ar.items_to_bidders.size(); ++idx) { - s << idx << " <--> " << ar.items_to_bidders[idx] << std::endl; - } - s << "--------------------------------------------------\n"; - s << "AuctionRunnerGaussSeidelSingleDiag, prices:" << std::endl; - for(size_t item_idx = 0; item_idx < ar.num_items; ++item_idx) { - s << item_idx << ": " << ar.oracle->get_price(item_idx) << std::endl; - } - s << "--------------------------------------------------\n"; - s << "AuctionRunnerGaussSeidelSingleDiag, oracle :" << *(ar.oracle) << std::endl; - s << "--------------------------------------------------\n"; - return s; -} - - -template -AuctionRunnerGaussSeidelSingleDiag::AuctionRunnerGaussSeidelSingleDiag(const DgmPointVec& A, - const DgmPointVec& B, - const Real q, - const Real _delta, - const Real _internal_p, - const Real _initial_epsilon, - const Real _eps_factor, - const int _max_iter_num) : - bidders(A), - items(B), - num_bidders(A.size()), - num_items(B.size()), - items_to_bidders(B.size(), k_invalid_index), - bidders_to_items(A.size(), k_invalid_index), - wasserstein_power(q), - delta(_delta), - internal_p(_internal_p), - initial_epsilon(_initial_epsilon), - epsilon_common_ratio(_eps_factor == 0.0 ? 5.0 : _eps_factor), - max_iter_num(_max_iter_num) -#ifdef LOG_AUCTION - , total_items_persistence(std::accumulate(items.begin(), - items.end(), - R(0.0), - [_internal_p, q](const Real& ps, const DgmPoint& item) - { return ps + std::pow(item.persistence_lp(_internal_p), q); } - )) - - , total_bidders_persistence(std::accumulate(bidders.begin(), - bidders.end(), - R(0.0), - [_internal_p, q](const Real& ps, const DgmPoint& bidder) - { return ps + std::pow(bidder.persistence_lp(_internal_p), q); } - )) - , partial_cost(0.0) - , unassigned_bidders_persistence(0.0) - , unassigned_items_persistence(0.0) -#endif - -{ - assert(initial_epsilon >= 0.0 ); - assert(epsilon_common_ratio >= 0.0 ); - assert(A.size() == B.size()); - oracle = std::unique_ptr(new AuctionOracle(bidders, items, wasserstein_power, internal_p)); - - for(num_normal_bidders = 0; num_normal_bidders < num_bidders; ++num_normal_bidders) { - if (bidders[num_normal_bidders].is_diagonal()) - break; - } - - num_diag_bidders = num_bidders - num_normal_bidders; - num_diag_items = num_normal_bidders; - num_normal_items = num_items - num_diag_items; - - for(size_t i = num_normal_bidders; i < num_bidders; ++i) { - assert(bidders[i].is_diagonal()); - } - -#ifdef LOG_AUCTION - - unassigned_items_persistence = total_items_persistence; - unassigned_bidders_persistence = total_bidders_persistence; - - if (not spdlog::get("plot_logger")) { - auto log = spdlog::basic_logger_st("plot_logger", "plot_logger.txt"); - log->info("New plot starts here"); - log->set_pattern("%v"); - } -#endif - -} - -#ifdef LOG_AUCTION -template -void AuctionRunnerGaussSeidelSingleDiag::enable_logging(const char* log_filename, const size_t _max_unassigned_to_log) -{ - log_auction = true; - max_unassigned_to_log = _max_unassigned_to_log; - - auto log = spdlog::basic_logger_st(logger_name, log_filename); - log->set_pattern("%v"); -} -#endif - -template -void AuctionRunnerGaussSeidelSingleDiag::process_diagonal_bid(const DiagonalBidR& bid) -{ - - //std::cout << "Enter process_diagonal_bid, bid = " << bid << std::endl; - - // increase price of already assigned normal items - for(size_t k = 0; k < bid.assigned_normal_items.size(); ++k) { - size_t assigned_normal_item_idx = bid.assigned_normal_items[k]; - Real new_price = bid.assigned_normal_items_bid_values[k]; - bool item_is_diagonal = false; - bool bidder_is_diagonal = true; - - // TODO: SPECIAL PROCEDURE HEER` - oracle->set_price(assigned_normal_item_idx, new_price, item_is_diagonal, bidder_is_diagonal, OwnerType::k_diagonal); - } - - // set common diag-diag price - // if diag_assigned_to_diag_slice_ is empty, it will be - // numeric_limits::max() - - oracle->diag_to_diag_price_ = bid.diag_to_diag_value; - - int unassigned_diag_idx = 0; - auto unassigned_diag_item_iter = oracle->diag_unassigned_slice_.begin(); - auto bid_vec_idx = 0; - for(const auto diag_bidder_idx : unassigned_diag_bidders) { - if (unassigned_diag_idx < bid.num_from_unassigned_diag) { - // take diagonal point from unassigned slice - - //std::cout << "assigning to diag_bidder_idx = " << diag_bidder_idx << std::endl; - assert(unassigned_diag_item_iter != oracle->diag_unassigned_slice_.end()); - - auto item_idx = *unassigned_diag_item_iter; - - ++unassigned_diag_idx; - ++unassigned_diag_item_iter; - assign_item_to_bidder(item_idx, diag_bidder_idx, k_invalid_index, true, true, false); - } else { - // take point from best_item_indices - size_t item_idx = bid.best_item_indices[bid_vec_idx]; - Real new_price = bid.bid_values[bid_vec_idx]; - bid_vec_idx++; - - auto old_owner_idx = items_to_bidders[item_idx]; - bool item_is_diagonal = is_item_diagonal(item_idx); - - assign_item_to_bidder(item_idx, diag_bidder_idx, old_owner_idx, item_is_diagonal, true, true, new_price); - } - } - - // all bids of diagonal bidders are satisfied - unassigned_diag_bidders.clear(); - - if (oracle->diag_unassigned_slice_.empty()) { - oracle->diag_unassigned_price_ = std::numeric_limits::max(); - } - - //std::cout << "Exit process_diagonal_bid\n" << *this; -} - -template -bool AuctionRunnerGaussSeidelSingleDiag::is_bidder_diagonal(const size_t bidder_idx) const -{ - return bidder_idx >= num_normal_bidders; -} - -template -bool AuctionRunnerGaussSeidelSingleDiag::is_bidder_normal(const size_t bidder_idx) const -{ - return bidder_idx < num_normal_bidders; -} - -template -bool AuctionRunnerGaussSeidelSingleDiag::is_item_diagonal(const size_t item_idx) const -{ - return item_idx < num_diag_items; -} - -template -bool AuctionRunnerGaussSeidelSingleDiag::is_item_normal(const size_t item_idx) const -{ - return item_idx >= num_diag_items; -} - -template -void AuctionRunnerGaussSeidelSingleDiag::assign_item_to_bidder(const IdxType item_idx, - const IdxType bidder_idx, - const IdxType old_owner_idx, - const bool item_is_diagonal, - const bool bidder_is_diagonal, - const bool call_set_price, - const R new_price) -{ - //std::cout << "Enter assign_item_to_bidder, " << std::boolalpha ; - //std::cout << "item_idx = " << item_idx << ", bidder_idx = " << bidder_idx << ", old_owner_idx = " << old_owner_idx << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << std::endl; - //std::cout << "################################################################################" << std::endl; - //std::cout << *this << std::endl; - //std::cout << *(this->oracle) << std::endl; - //std::cout << "################################################################################" << std::endl; - num_rounds++; - - // for readability - const bool item_is_normal = not item_is_diagonal; - const bool bidder_is_normal = not bidder_is_diagonal; - - // only unassigned bidders should submit bids and get items - assert(bidders_to_items[bidder_idx] == k_invalid_index); - - - // update matching information - bidders_to_items[bidder_idx] = item_idx; - items_to_bidders[item_idx] = bidder_idx; - - - // remove bidder from the list of unassigned bidders - // for diagonal bidders we don't need to: in Gauss-Seidel they are all - // processed at once, so the set unassigned_diag_bidders will be cleared - if (bidder_is_normal) { - unassigned_normal_bidders.erase(bidder_idx); - } - - OwnerType old_owner_type = get_owner_type(old_owner_idx); - - if (old_owner_type != OwnerType::k_none) { - bidders_to_items[old_owner_idx] = k_invalid_index; - } - - switch(old_owner_type) - { - case OwnerType::k_normal : unassigned_normal_bidders.insert(old_owner_idx); - break; - case OwnerType::k_diagonal : unassigned_diag_bidders.insert(old_owner_idx); - break; - case OwnerType::k_none : break; - } - - - // update normal_items_assigned_to_diag_ - - if (old_owner_type == OwnerType::k_diagonal and item_is_normal and bidder_is_normal) { - // normal item was stolen from diagonal, erase - assert( oracle->normal_items_assigned_to_diag_.count(item_idx) == 1 ); - oracle->normal_items_assigned_to_diag_.erase(item_idx); - } else if (bidder_is_diagonal and item_is_normal and old_owner_type != OwnerType::k_diagonal) { - // diagonal bidder got a new normal item, insert - assert(oracle->normal_items_assigned_to_diag_.count(item_idx) == 0); - oracle->normal_items_assigned_to_diag_.insert(item_idx); - } - - - // update diag_assigned_to_diag_slice_ - if (item_is_diagonal and bidder_is_normal and old_owner_type == OwnerType::k_diagonal) { - assert( oracle->diag_assigned_to_diag_slice_.count(item_idx) == 1); - oracle->diag_assigned_to_diag_slice_.erase(item_idx); - } else if (item_is_diagonal and bidder_is_diagonal) { - assert( old_owner_type != OwnerType::k_diagonal ); // diagonal does not steal from itself - assert( oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); - oracle->diag_assigned_to_diag_slice_.insert(item_idx); - } - - // update diag_unassigned_slice_ - if (item_is_diagonal and old_owner_type == OwnerType::k_none) { - oracle->diag_unassigned_slice_.erase(item_idx); - } - - if ( not (not call_set_price or new_price != std::numeric_limits::max())) { - std::cout << "In the middle of assign_item_to_bidder, " << std::boolalpha ; - std::cout << "item_idx = " << item_idx << ", bidder_idx = " << bidder_idx << ", old_owner_idx = " << old_owner_idx << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << std::endl; - std::cout << "################################################################################" << std::endl; - std::cout << *this << std::endl; - std::cout << "################################################################################" << std::endl; - } - assert(not call_set_price or new_price != std::numeric_limits::max()); - if (call_set_price) { - oracle->set_price(item_idx, new_price, item_is_diagonal, bidder_is_diagonal, old_owner_type); - } - - //std::cout << "Exit assign_item_to_bidder, state\n" << *this << std::endl; - -#ifdef LOG_AUCTION - - partial_cost += get_item_bidder_cost(item_idx, bidder_idx, true); - partial_cost -= get_item_bidder_cost(item_idx, old_owner_idx, true); - - unassigned_items.erase(item_idx); - - unassigned_bidders_persistence -= std::pow(bidders[bidder_idx].persistence_lp(internal_p), wasserstein_power); - - if (old_owner_type != OwnerType::k_none) { - // item has been assigned to some other bidder, - // and he became unassigned - unassigned_bidders_persistence += std::pow(bidders[old_owner_idx].persistence_lp(internal_p), wasserstein_power); - } else { - // item was unassigned before - unassigned_items_persistence -= std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); - } - - auto plot_logger = spdlog::get("plot_logger"); - plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}", - num_phase, - num_rounds, - unassigned_normal_bidders.size(), - unassigned_diag_bidders.size(), - unassigned_items_persistence, - unassigned_bidders_persistence, - unassigned_items_persistence + unassigned_bidders_persistence, - partial_cost, - total_bidders_persistence, - total_items_persistence, - oracle->get_epsilon() - ); - - - if (log_auction and unassigned_normal_bidders.size() + unassigned_diag_bidders.size() <= max_unassigned_to_log) { - auto logger = spdlog::get(logger_name); - if (logger) { - auto item = items[item_idx]; - auto bidder = bidders[bidder_idx]; - logger->info("{0} # ({1}, {2}) # ({3}, {4}) # {5} # {6} # {7} # {8}", - num_rounds, - item.getRealX(), - item.getRealY(), - bidder.getRealX(), - bidder.getRealY(), - format_point_set_to_log(unassigned_diag_bidders, bidders), - format_point_set_to_log(unassigned_normal_bidders, bidders), - format_point_set_to_log(unassigned_items, items), - oracle->get_epsilon()); - } - } -#endif -} - - - -template -void AuctionRunnerGaussSeidelSingleDiag::flush_assignment() -{ - for(auto& b2i : bidders_to_items) { - b2i = k_invalid_index; - } - for(auto& i2b : items_to_bidders) { - i2b = k_invalid_index; - } - - // we must flush assignment only after we got perfect matching - assert(unassigned_normal_bidders.empty() and unassigned_diag_bidders.empty()); - // all bidders become unassigned - for(size_t bidder_idx = 0; bidder_idx < num_normal_bidders; ++bidder_idx) { - unassigned_normal_bidders.insert(bidder_idx); - } - for(size_t bidder_idx = num_normal_bidders; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_diag_bidders.insert(bidder_idx); - } - assert(unassigned_normal_bidders.size() + unassigned_diag_bidders.size() == bidders.size()); - assert(unassigned_normal_bidders.size() == num_normal_bidders); - assert(unassigned_diag_bidders.size() == num_diag_bidders); - - oracle->flush_assignment(); - oracle->adjust_prices(); - -#ifdef LOG_AUCTION - partial_cost = 0.0; - unassigned_bidders_persistence = total_bidders_persistence; - unassigned_items_persistence = total_items_persistence; - - for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { - unassigned_items.insert(item_idx); - } -#endif - -} - - -template -void AuctionRunnerGaussSeidelSingleDiag::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) -{ - relative_error = std::numeric_limits::max(); - // choose some initial epsilon - oracle->set_epsilon(_initial_epsilon); - assert( oracle->get_epsilon() > 0 ); - for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { - flush_assignment(); - run_auction_phase(); - phase_num++; - //std::cout << "Iteration " << phase_num << " completed. " << std::endl; - // result is d^q - Real current_result = getDistanceToQthPowerInternal(); - Real denominator = current_result - num_bidders * oracle->get_epsilon(); - current_result = pow(current_result, 1.0 / wasserstein_power); - //std::cout << "Current result is " << current_result << std::endl; - if ( denominator <= 0 ) { - //std::cout << "Epsilon is too big." << std::endl; - } else { - denominator = pow(denominator, 1.0 / wasserstein_power); - Real numerator = current_result - denominator; - relative_error = numerator / denominator; - //std::cout << " numerator: " << numerator << " denominator: " << denominator << std::endl; - //std::cout << " error bound: " << numerator / denominator << std::endl; - // if relative error is greater than delta, continue - if (relative_error <= delta) { - break; - } - } - // decrease epsilon for the next iteration - oracle->set_epsilon( oracle->get_epsilon() / epsilon_common_ratio ); - } - //print_matching(); -} - - -template -void AuctionRunnerGaussSeidelSingleDiag::run_auction() -{ - double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : oracle->max_val_ / 4.0 ; - run_auction_phases(max_iter_num, init_eps); - if (relative_error > delta) { -#ifndef FOR_R_TDA - std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; - std::cerr << pow(wasserstein_cost, 1.0/wasserstein_power) << std::endl; -#endif - throw std::runtime_error("Maximum iteration number exceeded"); - } -} - -template -OwnerType AuctionRunnerGaussSeidelSingleDiag::get_owner_type(size_t bidder_idx) const -{ - if (bidder_idx == k_invalid_index) { - return OwnerType::k_none; - } else if (is_bidder_diagonal(bidder_idx)) { - return OwnerType::k_diagonal; - } else { - return OwnerType::k_normal; - } -} - -template -void AuctionRunnerGaussSeidelSingleDiag::run_auction_phase() -{ - num_phase++; - //std::cout << "Entered run_auction_phase" << std::endl; - do { - - if (not unassigned_diag_bidders.empty()) { - // process all unassigned diagonal bidders - // easy for Gauss-Seidel: every bidder alwasy gets all he wants - // - sanity_check(); - //std::cout << "Current state " << __LINE__ << *this << std::endl; - process_diagonal_bid(oracle->get_optimal_bids_for_diagonal( unassigned_diag_bidders.size() )); - sanity_check(); - } else { - sanity_check(); - // process normal unassigned bidder - size_t bidder_idx = *(unassigned_normal_bidders.begin()); - auto optimal_bid = oracle->get_optimal_bid(bidder_idx); - auto optimal_item_idx = optimal_bid.first; - auto bid_value = optimal_bid.second; - bool item_is_diagonal = is_item_diagonal(optimal_item_idx); - size_t old_owner_idx = items_to_bidders[optimal_item_idx]; - - //OwnerType old_owner_type = get_owner_type(old_owner_idx); - //std::cout << "bidder_idx = " << bidder_idx << ", item_idx = " << optimal_item_idx << ", old_owner_type = " << old_owner_type << std::endl; - - assign_item_to_bidder(optimal_item_idx, bidder_idx, old_owner_idx, item_is_diagonal, false, true, bid_value); - sanity_check(); - } - -#ifdef FOR_R_TDA - if ( num_rounds % 10000 == 0 ) { - Rcpp::check_user_interrupt(); - } -#endif - } while (not (unassigned_diag_bidders.empty() and unassigned_normal_bidders.empty())); - //std::cout << "run_auction_phase finished" << std::endl; - -#ifdef DEBUG_AUCTION - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= (IdxType)num_bidders) { - std::cerr << "After auction terminated bidder " << bidder_idx; - std::cerr << " has no items assigned" << std::endl; - throw std::runtime_error("Auction did not give a perfect matching"); - } - } -#endif - -} - -template -R AuctionRunnerGaussSeidelSingleDiag::get_item_bidder_cost(size_t item_idx, size_t bidder_idx, const bool tolerate_invalid_idx) const -{ - if (item_idx != k_invalid_index and bidder_idx != k_invalid_index) { - // skew edges are replaced by edges to projection - if (is_bidder_diagonal(bidder_idx) and is_item_normal(item_idx)) { - bidder_idx = item_idx; - } else if (is_bidder_normal(bidder_idx) and is_item_diagonal(item_idx)) { - item_idx = bidder_idx; - } - return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p), - wasserstein_power); - } else { - if (tolerate_invalid_idx) - return R(0.0); - else - throw std::runtime_error("Invalid idx in get_item_bidder_cost, item_idx = " + std::to_string(item_idx) + ", bidder_idx = " + std::to_string(bidder_idx)); - } -} - -template -R AuctionRunnerGaussSeidelSingleDiag::getDistanceToQthPowerInternal() -{ - sanity_check(); - Real result = 0.0; - for(size_t bIdx = 0; bIdx < num_bidders; ++bIdx) { - result += get_item_bidder_cost(bidders_to_items[bIdx], bIdx); - } - wasserstein_cost = result; - return result; -} - -template -R AuctionRunnerGaussSeidelSingleDiag::get_wasserstein_distance() -{ - return pow(get_wasserstein_cost(), 1.0/wasserstein_power); -} - -template -R AuctionRunnerGaussSeidelSingleDiag::get_wasserstein_cost() -{ - run_auction(); - return wasserstein_cost; -} - - - -// Debug routines - - -template -void AuctionRunnerGaussSeidelSingleDiag::print_debug() -{ -#ifdef DEBUG_AUCTION - std::cout << "**********************" << std::endl; - std::cout << "Current assignment:" << std::endl; - for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { - std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; - } - std::cout << "Weights: " << std::endl; - //for(size_t i = 0; i < num_bidders; ++i) { - //for(size_t j = 0; j < num_items; ++j) { - //std::cout << oracle->weight_matrix[i][j] << " "; - //} - //std::cout << std::endl; - //} - std::cout << "Prices: " << std::endl; - for(const auto price : oracle->get_prices()) { - std::cout << price << std::endl; - } - std::cout << "**********************" << std::endl; -#endif -} - - -template -void AuctionRunnerGaussSeidelSingleDiag::sanity_check() -{ -#ifdef DEBUG_AUCTION - if (bidders_to_items.size() != num_bidders) { - std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; - throw std::runtime_error("Wrong size of bidders_to_items"); - } - - if (items_to_bidders.size() != num_bidders) { - std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; - throw std::runtime_error("Wrong size of items_to_bidders"); - } - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < static_cast(num_items) and bidders_to_items[bidder_idx] >= 0)); - - if ( bidders_to_items[bidder_idx] != k_invalid_index) { - - if ( std::count(bidders_to_items.begin(), - bidders_to_items.end(), - bidders_to_items[bidder_idx]) > 1 ) { - std::cerr << "Item " << bidders_to_items[bidder_idx]; - std::cerr << " appears in bidders_to_items more than once" << std::endl; - throw std::runtime_error("Duplicate in bidders_to_items"); - } - - if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { - std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; - std::cerr << ", item_idx in bidders_to_items = "; - std::cerr << bidders_to_items[bidder_idx]; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; - throw std::runtime_error("inconsistent mapping"); - } - } - } - - for(size_t item_idx = 0; item_idx < num_diag_items; ++item_idx) { - auto owner = items_to_bidders.at(item_idx); - if ( owner == k_invalid_index) { - assert((oracle->diag_unassigned_slice_.count(item_idx) == 1 and - oracle->diag_items_heap__iters_[item_idx] == oracle->diag_items_heap_.end() and - oracle->all_items_heap__iters_[item_idx] == oracle->all_items_heap_.end()) - or - (oracle->diag_unassigned_slice_.count(item_idx) == 0 and - oracle->diag_items_heap__iters_[item_idx] != oracle->diag_items_heap_.end() and - oracle->all_items_heap__iters_[item_idx] != oracle->all_items_heap_.end())); - assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); - } else { - if (is_bidder_diagonal(owner)) { - assert(oracle->diag_unassigned_slice_.count(item_idx) == 0); - assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 1); - assert(oracle->diag_items_heap__iters_[item_idx] == oracle->diag_items_heap_.end()); - assert(oracle->all_items_heap__iters_[item_idx] == oracle->all_items_heap_.end()); - } else { - assert(oracle->diag_unassigned_slice_.count(item_idx) == 0); - assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); - assert(oracle->diag_items_heap__iters_[item_idx] != oracle->diag_items_heap_.end()); - assert(oracle->all_items_heap__iters_[item_idx] != oracle->all_items_heap_.end()); - } - } - } - - for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { - assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < static_cast(num_items) and items_to_bidders[item_idx] >= 0)); - if ( items_to_bidders.at(item_idx) != k_invalid_index) { - - // check for uniqueness - if ( std::count(items_to_bidders.begin(), - items_to_bidders.end(), - items_to_bidders[item_idx]) > 1 ) { - std::cerr << "Bidder " << items_to_bidders[item_idx]; - std::cerr << " appears in items_to_bidders more than once" << std::endl; - throw std::runtime_error("Duplicate in items_to_bidders"); - } - // check for consistency - if (bidders_to_items.at(items_to_bidders.at(item_idx)) != static_cast(item_idx)) { - std::cerr << "Inconsitency: item_idx = " << item_idx; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[item_idx]; - std::cerr << ", item_idx in bidders_to_items= "; - std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; - throw std::runtime_error("inconsistent mapping"); - } - } - } - - oracle->sanity_check(); -#endif -} - -template -void AuctionRunnerGaussSeidelSingleDiag::print_matching() -{ -#ifdef DEBUG_AUCTION - sanity_check(); - for(size_t bIdx = 0; bIdx < bidders_to_items.size(); ++bIdx) { - if (bidders_to_items[bIdx] != k_invalid_index) { - auto pA = bidders[bIdx]; - auto pB = items[bidders_to_items[bIdx]]; - std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p), wasserstein_power) << std::endl; - } else { - assert(false); - } - } -#endif -} - -} // ws -} // hera diff --git a/geom_matching/wasserstein/include/auction_runner_jac.h b/geom_matching/wasserstein/include/auction_runner_jac.h deleted file mode 100644 index 252ca32..0000000 --- a/geom_matching/wasserstein/include/auction_runner_jac.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef HERA_AUCTION_RUNNER_JAC_H -#define HERA_AUCTION_RUNNER_JAC_H - -#ifdef WASSERSTEIN_PURE_GEOM -#undef LOG_AUCTION -#undef ORDERED_BY_PERSISTENCE -#endif - -//#define ORDERED_BY_PERSISTENCE - -#include - -#include "auction_oracle.h" - -namespace hera { -namespace ws { - -// the two parameters that you can tweak in auction algorithm are: -// 1. epsilon_common_ratio -// 2. max_num_phases - -template, class PointContainer_ = std::vector> > // alternatively: AuctionOracleLazyHeap --- TODO -class AuctionRunnerJac { -public: - - using Real = RealType_; - using AuctionOracle = AuctionOracle_; - using DgmPoint = typename AuctionOracle::DiagramPointR; - using IdxValPairR = IdxValPair; - using PointContainer = PointContainer_; - - const Real k_lowest_bid_value = -1; // all bid values must be positive - - - AuctionRunnerJac(const PointContainer& A, - const PointContainer& B, - const AuctionParams& params, - const std::string& _log_filename_prefix = ""); - - void set_epsilon(Real new_val); - Real get_epsilon() const { return epsilon; } - void run_auction(); - template - void run_bidding_step(const Range& r); - bool is_done() const; - void decrease_epsilon(); - Real get_wasserstein_distance(); - Real get_wasserstein_cost(); - Real get_relative_error(const bool debug_output = false) const; -//private: - // private data - PointContainer bidders; - PointContainer items; - const size_t num_bidders; - const size_t num_items; - std::vector items_to_bidders; - std::vector bidders_to_items; - Real wasserstein_power; - Real epsilon; - Real delta; - Real internal_p; - Real initial_epsilon; - const Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio - const int max_num_phases; // maximal number of phases of epsilon-scaling - Real weight_adj_const; - Real wasserstein_cost; - std::vector bid_table; - // to get the 2 best items - AuctionOracle oracle; - std::unordered_set unassigned_bidders; - std::unordered_set items_with_bids; - // to imitate Gauss-Seidel - const size_t max_bids_per_round; - Real partial_cost { 0.0 }; - bool is_distance_computed { false }; - int num_rounds { 0 }; - int num_phase { 0 }; - int dimension; - - size_t unassigned_threshold; // for experiments - -#ifndef WASSERSTEIN_PURE_GEOM - std::unordered_set unassigned_normal_bidders; - std::unordered_set unassigned_diag_bidders; - bool diag_first {true}; - size_t batch_size { 1000 }; -#ifdef ORDERED_BY_PERSISTENCE - // to process unassigned by persistence - using RealIdxPair = std::pair; - std::set> unassigned_normal_bidders_by_persistence; -#endif - - // to stop earlier in the last phase - const Real total_items_persistence; - const Real total_bidders_persistence; - Real unassigned_bidders_persistence; - Real unassigned_items_persistence; - Real gamma_threshold; - - - size_t num_diag_items { 0 }; - size_t num_normal_items { 0 }; - size_t num_diag_bidders { 0 }; - size_t num_normal_bidders { 0 }; - - -#endif - - - - // private methods - void assign_item_to_bidder(const IdxType bidder_idx, const IdxType items_idx); - void assign_to_best_bidder(const IdxType items_idx); - void clear_bid_table(); - void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); - void run_auction_phase(); - void submit_bid(IdxType bidder_idx, const IdxValPairR& items_bid_value_pair); - void flush_assignment(); - Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const; -#ifndef WASSERSTEIN_PURE_GEOM - Real get_cost_to_diagonal(const DgmPoint& pt) const; - Real get_gamma() const; -#endif - bool continue_auction_phase() const; - - void add_unassigned_bidder(const size_t bidder_idx); - void remove_unassigned_bidder(const size_t bidder_idx); - void remove_unassigned_item(const size_t item_idx); - -#ifndef WASSERSTEIN_PURE_GEOM - bool is_item_diagonal(const size_t item_idx) const { return item_idx < num_diag_items; } - bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } - bool is_bidder_diagonal(const size_t bidder_idx) const { return bidder_idx >= num_normal_bidders; } - bool is_bidder_normal(const size_t bidder_idx) const { return not is_bidder_diagonal(bidder_idx); } -#endif - - - - // for debug only - void sanity_check(); - void print_debug(); - void print_matching(); - - std::string log_filename_prefix; - const Real k_max_relative_error = 2.0; // if relative error cannot be estimated or is too large, use this value - -#ifdef LOG_AUCTION - - size_t parallel_threshold { 5000 }; - bool is_step_parallel {false}; - std::unordered_set unassigned_items; - std::unordered_set unassigned_normal_items; - std::unordered_set unassigned_diag_items; - std::unordered_set never_assigned_bidders; - size_t all_assigned_round { 0 }; - size_t all_assigned_round_found { false }; - - int num_rounds_non_cumulative { 0 }; // set to 0 in the beginning of each phase - int num_diag_assignments { 0 }; - int num_diag_assignments_non_cumulative { 0 }; - int num_diag_bids_submitted { 0 }; - int num_diag_stole_from_diag { 0 }; - int num_normal_assignments { 0 }; - int num_normal_assignments_non_cumulative { 0 }; - int num_normal_bids_submitted { 0 }; - - std::vector> price_change_cnt_vec; - - - const char* plot_logger_name = "plot_logger"; - const char* price_state_logger_name = "price_stat_logger"; - std::string plot_logger_file_name; - std::string price_stat_logger_file_name; - std::shared_ptr plot_logger; - std::shared_ptr price_stat_logger; - std::shared_ptr console_logger; - - - int num_parallel_bids { 0 }; - int num_total_bids { 0 }; - - int num_parallel_diag_bids { 0 }; - int num_total_diag_bids { 0 }; - - int num_parallel_normal_bids { 0 }; - int num_total_normal_bids { 0 }; - - int num_parallel_assignments { 0 }; - int num_total_assignments { 0 }; -#endif - -}; // AuctionRunnerJac - - -} // ws -} // hera - -#include "auction_runner_jac.hpp" - -#undef ORDERED_BY_PERSISTENCE - -#endif diff --git a/geom_matching/wasserstein/include/auction_runner_jac.hpp b/geom_matching/wasserstein/include/auction_runner_jac.hpp deleted file mode 100644 index e623f4a..0000000 --- a/geom_matching/wasserstein/include/auction_runner_jac.hpp +++ /dev/null @@ -1,879 +0,0 @@ -/* - -Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef AUCTION_RUNNER_JAC_HPP -#define AUCTION_RUNNER_JAC_HPP - -#include -#include -#include -#include - -#include "def_debug_ws.h" -#include "auction_runner_jac.h" - - -#ifdef FOR_R_TDA -#include "Rcpp.h" -#undef DEBUG_AUCTION -#endif - -namespace hera { -namespace ws { - - -// ***************************** -// AuctionRunnerJac -// ***************************** - - template - AuctionRunnerJac::AuctionRunnerJac(const PointContainer& A, - const PointContainer& B, - const AuctionParams& params, - const std::string &_log_filename_prefix - ) : - bidders(A), - items(B), - num_bidders(A.size()), - num_items(A.size()), - items_to_bidders(A.size(), k_invalid_index), - bidders_to_items(A.size(), k_invalid_index), - wasserstein_power(params.wasserstein_power), - delta(params.delta), - internal_p(params.internal_p), - initial_epsilon(params.initial_epsilon), - epsilon_common_ratio(params.epsilon_common_ratio == 0.0 ? 5.0 : params.epsilon_common_ratio), - max_num_phases(params.max_num_phases), - bid_table(A.size(), std::make_pair(k_invalid_index, k_lowest_bid_value)), - oracle(bidders, items, params), - max_bids_per_round(params.max_bids_per_round), - dimension(params.dim), -#ifndef WASSERSTEIN_PURE_GEOM - total_items_persistence(std::accumulate(items.begin(), - items.end(), - R(0.0), - [params](const Real &ps, const DgmPoint &item) { - return ps + std::pow(item.persistence_lp(params.internal_p), params.wasserstein_power); - } - )), - total_bidders_persistence(std::accumulate(bidders.begin(), - bidders.end(), - R(0.0), - [params](const Real &ps, const DgmPoint &bidder) { - return ps + std::pow(bidder.persistence_lp(params.internal_p), params.wasserstein_power); - } - )), - unassigned_bidders_persistence(total_bidders_persistence), - unassigned_items_persistence(total_items_persistence), - gamma_threshold(params.gamma_threshold), -#endif - log_filename_prefix(_log_filename_prefix) - { - assert(A.size() == B.size()); - -#ifndef WASSERSTEIN_PURE_GEOM - for (const auto &p : bidders) { - if (p.is_normal()) { - num_normal_bidders++; - num_diag_items++; - } else { - num_normal_items++; - num_diag_bidders++; - } - } -#endif - // for experiments - unassigned_threshold = 100; - -#ifdef ORDERED_BY_PERSISTENCE - batch_size = 1000; - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders_by_persistence.insert( - std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); - } - } -#endif - -#ifdef LOG_AUCTION - parallel_threshold = 16; - console_logger = spdlog::get("console"); - if (not console_logger) { - console_logger = spdlog::stdout_logger_st("console"); - } - console_logger->set_pattern("[%H:%M:%S.%e] %v"); -#ifdef ORDERED_BY_PERSISTENCE - if (max_bids_per_round == 1) { - console_logger->info("Gauss-Seidel imitated by Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3} ORDERED_BY_PERSISTENCE", - wasserstein_power, - max_bids_per_round, - gamma_threshold, - diag_first, - batch_size); - } else { - console_logger->info("Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3} ORDERED_BY_PERSISTENCE", - wasserstein_power, - max_bids_per_round, - gamma_threshold, - diag_first, - batch_size); - } - -#else - if (max_bids_per_round == 1) { - console_logger->info( - "Gauss-Seidel imitated by Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3}", - wasserstein_power, - max_bids_per_round, - gamma_threshold, - diag_first, - batch_size); - } else { - console_logger->info( - "Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3}", - wasserstein_power, - max_bids_per_round, - gamma_threshold, - diag_first, - batch_size); - } -#endif - - plot_logger_file_name = log_filename_prefix + "_plot.txt"; - plot_logger = spdlog::get(plot_logger_name); - if (not plot_logger) { - plot_logger = spdlog::basic_logger_st(plot_logger_name, plot_logger_file_name); - } - plot_logger->info("New plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - plot_logger->set_pattern("%v"); - - price_stat_logger_file_name = log_filename_prefix + "_price_change_stat"; - price_stat_logger = spdlog::get(price_state_logger_name); - if (not price_stat_logger) { - price_stat_logger = spdlog::basic_logger_st(price_state_logger_name, - price_stat_logger_file_name); - } - price_stat_logger->info( - "New price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", - bidders.size(), - gamma_threshold, - epsilon_common_ratio); - price_stat_logger->set_pattern("%v"); -#endif - } - -#ifndef WASSERSTEIN_PURE_GEOM - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_cost_to_diagonal(const DgmPoint &pt) const { - return std::pow(pt.persistence_lp(internal_p), wasserstein_power); - } - - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_gamma() const { - return std::pow(std::fabs(unassigned_items_persistence + unassigned_bidders_persistence), - 1.0 / wasserstein_power); - } -#endif - - template - void AuctionRunnerJac::assign_item_to_bidder(IdxType item_idx, IdxType bidder_idx) - { - //sanity_check(); - // only unassigned bidders submit bids - assert(bidders_to_items[bidder_idx] == k_invalid_index); - - IdxType old_item_owner = items_to_bidders[item_idx]; - - // set new owner - bidders_to_items[bidder_idx] = item_idx; - items_to_bidders[item_idx] = bidder_idx; - - // remove bidder and item from the sets of unassigned bidders/items - remove_unassigned_bidder(bidder_idx); - - if (k_invalid_index != old_item_owner) { - // old owner of item becomes unassigned - bidders_to_items[old_item_owner] = k_invalid_index; - add_unassigned_bidder(old_item_owner); - // existing edge was removed, decrease partial_cost - partial_cost -= get_item_bidder_cost(item_idx, old_item_owner); - } else { - // item was unassigned before - remove_unassigned_item(item_idx); - } - - // new edge was added to matching, increase partial cost - partial_cost += get_item_bidder_cost(item_idx, bidder_idx); - -#ifdef LOG_AUCTION - if (is_item_diagonal(item_idx)) { - num_diag_assignments++; - num_diag_assignments_non_cumulative++; - } else { - num_normal_assignments++; - num_normal_assignments_non_cumulative++; - } - - if (k_invalid_index != old_item_owner) { - if (is_bidder_diagonal(bidder_idx) and is_bidder_diagonal(old_item_owner)) { - num_diag_stole_from_diag++; - } - } -#endif - - //sanity_check(); - } - - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const - { - return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension), - wasserstein_power); - } - - template - void AuctionRunnerJac::assign_to_best_bidder(IdxType item_idx) { - assert(item_idx >= 0 and item_idx < static_cast(num_items)); - assert(bid_table[item_idx].first != k_invalid_index); - IdxValPairR best_bid{bid_table[item_idx]}; - assign_item_to_bidder(item_idx, best_bid.first); - oracle.set_price(item_idx, best_bid.second); -#ifdef LOG_AUCTION - - if (is_step_parallel) { - num_parallel_assignments++; - } - num_total_assignments++; - - price_change_cnt_vec.back()[item_idx]++; -#endif - } - - template - void AuctionRunnerJac::clear_bid_table() { - auto iter = items_with_bids.begin(); - while (iter != items_with_bids.end()) { - auto item_with_bid_idx = *iter; - bid_table[item_with_bid_idx].first = k_invalid_index; - bid_table[item_with_bid_idx].second = k_lowest_bid_value; - iter = items_with_bids.erase(iter); - } - } - - template - void AuctionRunnerJac::submit_bid(IdxType bidder_idx, const IdxValPairR &bid) { - IdxType item_idx = bid.first; - Real bid_value = bid.second; - assert(item_idx >= 0); - if (bid_table[item_idx].second < bid_value) { - bid_table[item_idx].first = bidder_idx; - bid_table[item_idx].second = bid_value; - } - items_with_bids.insert(item_idx); - -#ifdef LOG_AUCTION - - num_total_bids++; - - - if (is_bidder_diagonal(bidder_idx)) { - num_diag_bids_submitted++; - } else { - num_normal_bids_submitted++; - } -#endif - } - - template - void AuctionRunnerJac::print_debug() { -#ifdef DEBUG_AUCTION - sanity_check(); - std::cout << "**********************" << std::endl; - std::cout << "Current assignment:" << std::endl; - for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { - std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; - } - std::cout << "Weights: " << std::endl; - //for(size_t i = 0; i < num_bidders; ++i) { - //for(size_t j = 0; j < num_items; ++j) { - //std::cout << oracle.weight_matrix[i][j] << " "; - //} - //std::cout << std::endl; - //} - std::cout << "Prices: " << std::endl; - for(const auto price : oracle.get_prices()) { - std::cout << price << std::endl; - } - //std::cout << "Value matrix: " << std::endl; - //for(size_t i = 0; i < num_bidders; ++i) { - //for(size_t j = 0; j < num_items; ++j) { - //std::cout << oracle.weight_matrix[i][j] - oracle.prices[j] << " "; - //} - //std::cout << std::endl; - //} - std::cout << "**********************" << std::endl; -#endif - } - - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_relative_error(const bool debug_output) const - { - if (partial_cost == 0.0 and unassigned_bidders.empty()) - return 0.0; - Real result; -#ifndef WASSERSTEIN_PURE_GEOM - Real gamma = get_gamma(); -#else - Real gamma = 0.0; -#endif - // cost minus n epsilon - Real reduced_cost = partial_cost - num_bidders * get_epsilon(); - if (reduced_cost < 0) { -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->info("Epsilon too large, reduced_cost = {0}, gamma = {1}", reduced_cost, gamma); - } -#endif - result = k_max_relative_error; - } else { - Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power) - gamma; - if (denominator <= 0) { -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->info("Epsilon too large, reduced_cost = {0}, denominator = {1}, gamma = {2}", - reduced_cost, denominator, gamma); - } -#endif - result = k_max_relative_error; - } else { - Real numerator = 2 * gamma + - std::pow(partial_cost, 1.0 / wasserstein_power) - - std::pow(reduced_cost, 1.0 / wasserstein_power); - - result = numerator / denominator; -#ifdef LOG_AUCTION - if (debug_output) { - console_logger->info( - "Reduced_cost = {0}, denominator = {1}, numerator {2}, error = {3}, gamma = {4}", - reduced_cost, - denominator, - numerator, - result, - gamma); - } -#endif - } - } - return result; - } - - template - void AuctionRunnerJac::flush_assignment() { - for (auto &b2i : bidders_to_items) { - b2i = k_invalid_index; - } - for (auto &i2b : items_to_bidders) { - i2b = k_invalid_index; - } - - // all bidders and items become unassigned - for (size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - unassigned_bidders.insert(bidder_idx); - } - -#ifdef ORDERED_BY_PERSISTENCE - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders_by_persistence.insert( - std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); - } - } -#endif - oracle.adjust_prices(); - - partial_cost = 0.0; - - -#ifndef WASSERSTEIN_PURE_GEOM - for (size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders.insert(bidder_idx); - } else { - unassigned_diag_bidders.insert(bidder_idx); - } - } - - unassigned_bidders_persistence = total_bidders_persistence; - unassigned_items_persistence = total_items_persistence; - -#ifdef LOG_AUCTION - - price_change_cnt_vec.push_back(std::vector(num_items, 0)); - - never_assigned_bidders = unassigned_bidders; - - for (size_t item_idx = 0; item_idx < items.size(); ++item_idx) { - unassigned_items.insert(item_idx); - if (is_item_normal(item_idx)) { - unassigned_normal_items.insert(item_idx); - } else { - unassigned_diag_items.insert(item_idx); - } - } - - num_diag_bids_submitted = 0; - num_normal_bids_submitted = 0; - num_diag_assignments = 0; - num_normal_assignments = 0; - - all_assigned_round = 0; - all_assigned_round_found = false; - num_rounds_non_cumulative = 0; -#endif -#endif - - } // flush_assignment - - - template - void AuctionRunnerJac::set_epsilon(Real new_val) { - assert(new_val > 0.0); - epsilon = new_val; - oracle.set_epsilon(new_val); - } - - template - void AuctionRunnerJac::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) { - set_epsilon(_initial_epsilon); - assert(oracle.get_epsilon() > 0); - for (int phase_num = 0; phase_num < max_num_phases; ++phase_num) { - flush_assignment(); - run_auction_phase(); - -#ifdef LOG_AUCTION - console_logger->info( - "Phase {0} done, current_result = {1}, eps = {2}, error = {7}, num_rounds = {3}, num_assignments = {4}, num_bids_submitted = {5}, # unassigned = {6}", - num_phase, - partial_cost, - get_epsilon(), - format_int<>(num_rounds), - format_int<>(num_normal_assignments + num_diag_assignments), - format_int<>(num_normal_bids_submitted + num_diag_bids_submitted), - unassigned_bidders.size(), - get_relative_error(num_phase == 1) - ); - -// console_logger->info("num_rounds (non-cumulative)= {0}, num_diag_assignments = {1}, num_normal_assignments = {2}, num_diag_bids_submitted = {3}, num_normal_bids_submitted = {4}", -// format_int<>(num_rounds_non_cumulative), -// format_int<>(num_diag_assignments), -// format_int<>(num_normal_assignments), -// format_int<>(num_diag_bids_submitted), -// format_int<>(num_normal_bids_submitted) -// ); - - console_logger->info( - "num_parallel_bids / num_total_bids = {0} / {1} = {2}, num_parallel_assignments / num_total_aassignments = {3} / {4} = {5}", - format_int<>(num_parallel_bids), - format_int<>(num_total_bids), - static_cast(num_parallel_bids) / static_cast(num_total_bids), - format_int<>(num_parallel_assignments), - format_int<>(num_total_assignments), - static_cast(num_parallel_assignments) / static_cast(num_total_assignments) - ); - - console_logger->info( - "num_parallel_diag_bids / num_total_diag_bids = {0} / {1} = {2}, num_parallel_normal_bids / num_total_normal_bids = {3} / {4} = {5}", - format_int<>(num_parallel_diag_bids), - format_int<>(num_total_diag_bids), - static_cast(num_parallel_diag_bids) / static_cast(num_total_diag_bids), - format_int<>(num_parallel_normal_bids), - format_int<>(num_total_normal_bids), - static_cast(num_parallel_normal_bids) / static_cast(num_total_normal_bids) - ); - -// console_logger->info("num_rounds before all biders assigned = {0}, num_rounds (non-cumulative)= {1}, fraction = {2}", -// format_int<>(all_assigned_round), -// format_int<>(num_rounds_non_cumulative), -// static_cast(all_assigned_round) / static_cast(num_rounds_non_cumulative) -// ); - - for (size_t item_idx = 0; item_idx < num_items; ++item_idx) { - price_stat_logger->info("{0} {1} {2} {3} {4}", - phase_num, - item_idx, - items[item_idx][0], - items[item_idx][1], - price_change_cnt_vec.back()[item_idx] - ); - } -#endif - - - if (is_done()) - break; - else - decrease_epsilon(); - - } - } - - template - void AuctionRunnerJac::decrease_epsilon() { - set_epsilon(get_epsilon() / epsilon_common_ratio); - } - - template - void AuctionRunnerJac::run_auction() - { - if (num_bidders == 1) { - assign_item_to_bidder(0, 0); - wasserstein_cost = get_item_bidder_cost(0,0); - is_distance_computed = true; - return; - } - R init_eps = (initial_epsilon > 0.0) ? initial_epsilon : oracle.max_val_ / 4.0; - run_auction_phases(max_num_phases, init_eps); - is_distance_computed = true; - wasserstein_cost = partial_cost; - if (not is_done()) { -#ifndef FOR_R_TDA - std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; - std::cerr << get_wasserstein_distance() << std::endl; -#endif - throw std::runtime_error("Maximum iteration number exceeded"); - } - } - - template - void AuctionRunnerJac::add_unassigned_bidder(const size_t bidder_idx) - { - unassigned_bidders.insert(bidder_idx); - -#ifndef WASSERSTEIN_PURE_GEOM - const auto &bidder = bidders[bidder_idx]; - unassigned_bidders_persistence += get_cost_to_diagonal(bidder); - - if (is_bidder_diagonal(bidder_idx)) { - unassigned_diag_bidders.insert(bidder_idx); - } else { - unassigned_normal_bidders.insert(bidder_idx); - } -#ifdef ORDERED_BY_PERSISTENCE - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders_by_persistence.insert(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); - } -#endif - -#endif - } - - template - void AuctionRunnerJac::remove_unassigned_bidder(const size_t bidder_idx) - { - unassigned_bidders.erase(bidder_idx); -#ifndef WASSERSTEIN_PURE_GEOM - const auto &bidder = bidders[bidder_idx]; - unassigned_bidders_persistence -= get_cost_to_diagonal(bidder); - -#ifdef ORDERED_BY_PERSISTENCE - if (is_bidder_normal(bidder_idx)) { - unassigned_normal_bidders_by_persistence.erase(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); - } -#endif - - if (is_bidder_diagonal(bidder_idx)) { - unassigned_diag_bidders.erase(bidder_idx); - } else { - unassigned_normal_bidders.erase(bidder_idx); - } - - -#ifdef LOG_AUCTION - never_assigned_bidders.erase(bidder_idx); - if (never_assigned_bidders.empty() and not all_assigned_round_found) { - all_assigned_round = num_rounds_non_cumulative; - all_assigned_round_found = true; - } -#endif -#endif - } - - template - void AuctionRunnerJac::remove_unassigned_item(const size_t item_idx) { -#ifndef WASSERSTEIN_PURE_GEOM - unassigned_items_persistence -= get_cost_to_diagonal(items[item_idx]); - -#ifdef LOG_AUCTION - unassigned_items.erase(item_idx); - - if (is_item_normal(item_idx)) { - unassigned_normal_items.erase(item_idx); - } else { - unassigned_diag_items.erase(item_idx); - } -#endif -#endif - } - - template - template - void AuctionRunnerJac::run_bidding_step(const Range &active_bidders) - { -#ifdef LOG_AUCTION - is_step_parallel = false; - size_t diag_bids_submitted = 0; - size_t normal_bids_submitted = 0; -#endif - - clear_bid_table(); - size_t bids_submitted = 0; - for (const auto bidder_idx : active_bidders) { - - ++bids_submitted; - - submit_bid(bidder_idx, oracle.get_optimal_bid(bidder_idx)); - -#ifdef LOG_AUCTION - if (is_bidder_diagonal(bidder_idx)) { - diag_bids_submitted++; - } else { - normal_bids_submitted++; - } - - if (bids_submitted >= parallel_threshold) { - is_step_parallel = true; - } - - if (bids_submitted >= max_bids_per_round) { - break; - } - if (diag_first and not unassigned_diag_bidders.empty() and - diag_bids_submitted >= oracle.get_heap_top_size()) { - continue; - } -#endif - } - -#ifdef LOG_AUCTION - num_total_diag_bids += diag_bids_submitted; - num_total_normal_bids += normal_bids_submitted; - if (is_step_parallel) { - num_parallel_bids += bids_submitted; - num_parallel_diag_bids += diag_bids_submitted; - num_parallel_normal_bids += normal_bids_submitted; - } -#endif - } - - template - bool AuctionRunnerJac::is_done() const - { - return get_relative_error() <= delta; - } - - template - bool AuctionRunnerJac::continue_auction_phase() const - { -#ifdef WASSERSTEIN_PURE_GEOM - return not unassigned_bidders.empty(); -#else - return not unassigned_bidders.empty() and not is_done(); -#endif - } - - template - void AuctionRunnerJac::run_auction_phase() - { - num_phase++; - //console_logger->debug("Entered run_auction_phase"); - - do { - num_rounds++; -#ifdef LOG_AUCTION - num_diag_stole_from_diag = 0; - num_normal_assignments_non_cumulative = 0; - num_diag_assignments_non_cumulative = 0; - num_rounds_non_cumulative++; -#endif - - // bidding -#ifdef ORDERED_BY_PERSISTENCE - if (not unassigned_diag_bidders.empty()) { - run_bidding_step(unassigned_diag_bidders); - } else { - std::vector active_bidders; - active_bidders.reserve(batch_size); - for (auto iter = unassigned_normal_bidders_by_persistence.begin(); iter != unassigned_normal_bidders_by_persistence.end(); ++iter) { - active_bidders.push_back(iter->second); - if (active_bidders.size() >= batch_size) { - break; - } - } - run_bidding_step(active_bidders); - } -#elif defined WASSERSTEIN_PURE_GEOM - run_bidding_step(unassigned_bidders); -#else - if (diag_first and not unassigned_diag_bidders.empty()) { - run_bidding_step(unassigned_diag_bidders); - } else { - run_bidding_step(unassigned_bidders); - } -#endif - - // assignment - for (auto item_idx : items_with_bids) { - assign_to_best_bidder(item_idx); - } -#ifdef LOG_AUCTION - plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14}", - num_phase, - num_rounds, - unassigned_bidders.size(), - get_gamma(), - partial_cost, - oracle.get_epsilon(), - unassigned_normal_bidders.size(), - unassigned_diag_bidders.size(), - unassigned_normal_items.size(), - unassigned_diag_items.size(), - num_normal_assignments_non_cumulative, - num_diag_assignments_non_cumulative, - oracle.get_heap_top_size(), - get_relative_error(false), - num_diag_stole_from_diag - ); -#endif - //sanity_check(); - } while (continue_auction_phase()); - } - - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_wasserstein_distance() - { - assert(is_distance_computed); - return std::pow(wasserstein_cost, 1.0 / wasserstein_power); - } - - template - typename AuctionRunnerJac::Real - AuctionRunnerJac::get_wasserstein_cost() - { - assert(is_distance_computed); - return wasserstein_cost; - } - - - template - void AuctionRunnerJac::sanity_check() - { -#ifdef DEBUG_AUCTION - if (bidders_to_items.size() != num_bidders) { - std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; - throw "Wrong size of bidders_to_items"; - } - - if (items_to_bidders.size() != num_bidders) { - std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; - throw "Wrong size of items_to_bidders"; - } - - for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { - if ( bidders_to_items[bidder_idx] >= 0) { - - if ( std::count(bidders_to_items.begin(), - bidders_to_items.end(), - bidders_to_items[bidder_idx]) > 1 ) { - std::cerr << "Good " << bidders_to_items[bidder_idx]; - std::cerr << " appears in bidders_to_items more than once" << std::endl; - throw "Duplicate in bidders_to_items"; - } - - if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { - std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; - std::cerr << ", item_idx in bidders_to_items = "; - std::cerr << bidders_to_items[bidder_idx]; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; - throw "inconsistent mapping"; - } - } - } - - for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { - if ( items_to_bidders[item_idx] >= 0) { - - // check for uniqueness - if ( std::count(items_to_bidders.begin(), - items_to_bidders.end(), - items_to_bidders[item_idx]) > 1 ) { - std::cerr << "Bidder " << items_to_bidders[item_idx]; - std::cerr << " appears in items_to_bidders more than once" << std::endl; - throw "Duplicate in items_to_bidders"; - } - // check for consistency - if (bidders_to_items.at(items_to_bidders[item_idx]) != static_cast(item_idx)) { - std::cerr << "Inconsitency: item_idx = " << item_idx; - std::cerr << ", bidder_idx in items_to_bidders = "; - std::cerr << items_to_bidders[item_idx]; - std::cerr << ", item_idx in bidders_to_items= "; - std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; - throw "inconsistent mapping"; - } - } - } -#endif - } - - template - void AuctionRunnerJac::print_matching() { -#ifdef DEBUG_AUCTION - sanity_check(); - for(size_t bidder_idx = 0; bidder_idx < bidders_to_items.size(); ++bidder_idx) { - if (bidders_to_items[bidder_idx] >= 0) { - auto pA = bidders[bidder_idx]; - auto pB = items[bidders_to_items[bidder_idx]]; - std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p, dimension), wasserstein_power) << std::endl; - } else { - assert(false); - } - } -#endif - } - -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/basic_defs_ws.h b/geom_matching/wasserstein/include/basic_defs_ws.h deleted file mode 100644 index 1712ccf..0000000 --- a/geom_matching/wasserstein/include/basic_defs_ws.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef BASIC_DEFS_WS_H -#define BASIC_DEFS_WS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#endif - -#ifndef FOR_R_TDA -#include "spdlog/spdlog.h" -#include "spdlog/fmt/fmt.h" -#include "spdlog/fmt/ostr.h" -#endif - -#include "hera_infinity.h" -#include "dnn/geometry/euclidean-dynamic.h" -#include "def_debug_ws.h" - -#define MIN_VALID_ID 10 - -namespace hera -{ - -//template -//inline bool is_infinity(const Real& x) -//{ -// return x == Real(-1); -//}; -// -//template -//inline Real get_infinity() -//{ -// return Real( -1 ); -//} - -template -inline bool is_p_valid_norm(const Real& p) -{ - return is_infinity(p) or p >= Real(1); -} - -template -struct AuctionParams -{ - Real wasserstein_power { 1.0 }; - Real delta { 0.01 }; // relative error - Real internal_p { get_infinity() }; - Real initial_epsilon { 0.0 }; // 0.0 means maxVal / 4.0 - Real epsilon_common_ratio { 5.0 }; - Real gamma_threshold { 0.0 }; // for experiments, not in use now - int max_num_phases { std::numeric_limits::max() }; - int max_bids_per_round { 1 }; // imitate Gauss-Seidel is default behaviour - unsigned int dim { 2 }; // for pure geometric version only; ignored in persistence diagrams - Real final_relative_error; // out parameter - after auction terminates, contains the real relative error - bool tolerate_max_iter_exceeded { false }; // whether auction should throw an exception on max. iterations exceeded -}; - -namespace ws -{ - - using IdxType = int; - - constexpr size_t k_invalid_index = std::numeric_limits::max(); - - template - using IdxValPair = std::pair; - - template - inline std::ostream& operator<<(std::ostream& output, const IdxValPair p) - { - output << fmt::format("({0}, {1})", p.first, p.second); - return output; - } - - enum class OwnerType { k_none, k_normal, k_diagonal }; - - inline std::ostream& operator<<(std::ostream& s, const OwnerType t) - { - switch(t) - { - case OwnerType::k_none : s << "NONE"; break; - case OwnerType::k_normal: s << "NORMAL"; break; - case OwnerType::k_diagonal: s << "DIAGONAL"; break; - } - return s; - } - - template - struct Point { - Real x, y; - bool operator==(const Point& other) const; - bool operator!=(const Point& other) const; - Point(Real _x, Real _y) : x(_x), y(_y) {} - Point() : x(0.0), y(0.0) {} - }; - -#ifndef FOR_R_TDA - template - std::ostream& operator<<(std::ostream& output, const Point p); -#endif - - template - inline void hash_combine(std::size_t & seed, const T & v) - { - std::hash hasher; - seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); - } - - template - struct DiagramPoint - { - using Real = Real_; - // data members - // Points above the diagonal have type NORMAL - // Projections onto the diagonal have type DIAG - // for DIAG points only x-coordinate is relevant - enum Type { NORMAL, DIAG}; - Real x, y; - Type type; - // methods - DiagramPoint(Real xx, Real yy, Type ttype); - bool is_diagonal() const { return type == DIAG; } - bool is_normal() const { return type == NORMAL; } - Real getRealX() const; // return the x-coord - Real getRealY() const; // return the y-coord - Real persistence_lp(const Real p) const; - struct LexicographicCmp - { - bool operator()(const DiagramPoint& p1, const DiagramPoint& p2) const - { return p1.type < p2.type || (p1.type == p2.type && (p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y))); } - }; - - const Real& operator[](const int idx) const - { - switch(idx) - { - case 0 : return x; - break; - case 1 : return y; - break; - default: throw std::out_of_range("DiagramPoint has dimension 2"); - } - } - - Real& operator[](const int idx) - { - switch(idx) - { - case 0 : return x; - break; - case 1 : return y; - break; - default: throw std::out_of_range("DiagramPoint has dimension 2"); - } - } - - }; - - - template - struct DiagramPointHash { - size_t operator()(const DiagramPoint &p) const - { - std::size_t seed = 0; - hash_combine(seed, std::hash(p.x)); - hash_combine(seed, std::hash(p.y)); - hash_combine(seed, std::hash(p.is_diagonal())); - return seed; - } - }; - - -#ifndef FOR_R_TDA - template - inline std::ostream& operator<<(std::ostream& output, const DiagramPoint p); -#endif - - template - inline void format_arg(fmt::BasicFormatter &f, const char *&format_str, const DiagramPoint&p) { - if (p.is_diagonal()) { - f.writer().write("({0},{1}, DIAG)", p.x, p.y); - } else { - f.writer().write("({0},{1}, NORM)", p.x, p.y); - } - } - - - template - struct DistImpl - { - Real operator()(const Pt& a, const Pt& b, const Real p, const int dim) - { - Real result = 0.0; - if (hera::is_infinity(p)) { - for(int d = 0; d < dim; ++d) { - result = std::max(result, std::fabs(a[d] - b[d])); - } - } else if (p == 1.0) { - for(int d = 0; d < dim; ++d) { - result += std::fabs(a[d] - b[d]); - } - } else { - assert(p > 1.0); - for(int d = 0; d < dim; ++d) { - result += std::pow(std::fabs(a[d] - b[d]), p); - } - result = std::pow(result, 1.0 / p); - } - return result; - } - }; - - template - struct DistImpl> - { - Real operator()(const DiagramPoint& a, const DiagramPoint& b, const Real p, const int dim) - { - Real result = 0.0; - if ( a.is_diagonal() and b.is_diagonal()) { - return result; - } else if (hera::is_infinity(p)) { - result = std::max(std::fabs(a.getRealX() - b.getRealX()), std::fabs(a.getRealY() - b.getRealY())); - } else if (p == 1.0) { - result = std::fabs(a.getRealX() - b.getRealX()) + std::fabs(a.getRealY() - b.getRealY()); - } else { - assert(p > 1.0); - result = std::pow(std::pow(std::fabs(a.getRealX() - b.getRealX()), p) + std::pow(std::fabs(a.getRealY() - b.getRealY()), p), 1.0 / p); - } - return result; - } - }; - - template - inline R dist_lp(const Pt& a, const Pt& b, const R p, const int dim) - { - return DistImpl()(a, b, p, dim); - } - - // TODO - template - inline double getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B, const Real p) - { - int dim = 2; - Real result { 0.0 }; - DiagramPoint begA = *(A.begin()); - DiagramPoint optB = *(B.begin()); - for(const auto& pointB : B) { - if (dist_lp(begA, pointB, p, dim) > result) { - result = dist_lp(begA, pointB, p, dim); - optB = pointB; - } - } - for(const auto& pointA : A) { - if (dist_lp(pointA, optB, p, dim) > result) { - result = dist_lp(pointA, optB, p, dim); - } - } - return result; - } - - template - inline Real getFurthestDistance3Approx_pg(const hera::ws::dnn::DynamicPointVector& A, const hera::ws::dnn::DynamicPointVector& B, const Real p, const int dim) - { - Real result { 0.0 }; - int opt_b_idx = 0; - for(size_t b_idx = 0; b_idx < B.size(); ++b_idx) { - if (dist_lp(A[0], B[b_idx], p, dim) > result) { - result = dist_lp(A[0], B[b_idx], p, dim); - opt_b_idx = b_idx; - } - } - - for(size_t a_idx = 0; a_idx < A.size(); ++a_idx) { - result = std::max(result, dist_lp(A[a_idx], B[opt_b_idx], p, dim)); - } - - return result; - } - - - template - inline std::string format_container_to_log(const Container& cont); - - template - inline std::string format_point_set_to_log(const IndexContainer& indices, const std::vector>& points); - - template - inline std::string format_int(T i); - -} // ws -} // hera - - - -#include "basic_defs_ws.hpp" - - -#endif diff --git a/geom_matching/wasserstein/include/basic_defs_ws.hpp b/geom_matching/wasserstein/include/basic_defs_ws.hpp deleted file mode 100644 index a1153af..0000000 --- a/geom_matching/wasserstein/include/basic_defs_ws.hpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -Copyright (c) 2018, G. Spreemann -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include "basic_defs_ws.h" - -#ifndef FOR_R_TDA -#include -#endif - -#include - -namespace hera { -static const int64_t DIPHA_MAGIC = 8067171840; -static const int64_t DIPHA_PERSISTENCE_DIAGRAM = 2; - -namespace ws { -// Point - -template -bool Point::operator==(const Point& other) const -{ - return ((this->x == other.x) and (this->y == other.y)); -} - -template -bool Point::operator!=(const Point& other) const -{ - return !(*this == other); -} - - -#ifndef FOR_R_TDA -template -inline std::ostream& operator<<(std::ostream& output, const Point p) -{ - output << "(" << p.x << ", " << p.y << ")"; - return output; -} -#endif - -template -inline Real sqr_dist(const Point& a, const Point& b) -{ - return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); -} - -template -inline Real dist(const Point& a, const Point& b) -{ - return sqrt(sqr_dist(a, b)); -} - - -template -inline Real DiagramPoint::persistence_lp(const Real p) const -{ - if (is_diagonal()) - return 0.0; - else { - Real u { (getRealY() + getRealX())/2 }; - int dim = 2; - DiagramPoint a_proj(u, u, DiagramPoint::DIAG); - return dist_lp(*this, a_proj, p, dim); - } -} - - -#ifndef FOR_R_TDA -template -inline std::ostream& operator<<(std::ostream& output, const DiagramPoint p) -{ - if ( p.type == DiagramPoint::DIAG ) { - output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << " DIAG )"; - } else { - output << "(" << p.x << ", " << p.y << ", " << " NORMAL)"; - } - return output; -} -#endif - -template -DiagramPoint::DiagramPoint(Real xx, Real yy, Type ttype) : - x(xx), - y(yy), - type(ttype) -{ - //if ( yy < xx ) - //throw "Point is below the diagonal"; - //if ( yy == xx and ttype != DiagramPoint::DIAG) - //throw "Point on the main diagonal must have DIAG type"; -} - -template -Real DiagramPoint::getRealX() const -{ - if (is_normal()) - return x; - else - return Real(0.5) * (x + y); -} - -template -Real DiagramPoint::getRealY() const -{ - if (is_normal()) - return y; - else - return Real(0.5) * (x + y); -} - -template -inline std::string format_container_to_log(const Container& cont) -{ - std::stringstream result; - result << "["; - for(auto iter = cont.begin(); iter != cont.end(); ++iter) { - result << *iter; - if (std::next(iter) != cont.end()) { - result << ", "; - } - } - result << "]"; - return result.str(); -} - -template -inline std::string format_pair_container_to_log(const Container& cont) -{ - std::stringstream result; - result << "["; - for(auto iter = cont.begin(); iter != cont.end(); ++iter) { - result << "(" << iter->first << ", " << iter->second << ")"; - if (std::next(iter) != cont.end()) { - result << ", "; - } - } - result << "]"; - return result.str(); -} - - -template -inline std::string format_point_set_to_log(const IndexContainer& indices, - const std::vector>& points) -{ - std::stringstream result; - result << "["; - for(auto iter = indices.begin(); iter != indices.end(); ++iter) { - DiagramPoint p = points[*iter]; - result << "(" << p.getRealX() << ", " << p.getRealY() << ")"; - if (std::next(iter) != indices.end()) - result << ", "; - } - result << "]"; - return result.str(); -} - -template -inline std::string format_int(T i) -{ - std::stringstream ss; - ss.imbue(std::locale("")); - ss << std::fixed << i; - return ss.str(); -} - - -} // end of namespace ws - - -template inline void reverse_endianness(T & x) -{ - uint8_t * p = reinterpret_cast(&x); - std::reverse(p, p + sizeof(T)); -} - -template inline T read_le(std::istream & s) -{ - T result; - s.read(reinterpret_cast(&result), sizeof(T)); - #ifdef BIGENDIAN - reverse_endianness(result); - #endif - return result; -} - -} // hera diff --git a/geom_matching/wasserstein/include/catch/catch.hpp b/geom_matching/wasserstein/include/catch/catch.hpp deleted file mode 100644 index f7681f4..0000000 --- a/geom_matching/wasserstein/include/catch/catch.hpp +++ /dev/null @@ -1,11545 +0,0 @@ -/* - * Catch v1.9.6 - * Generated: 2017-06-27 12:19:54.557875 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// #included from: internal/catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic ignored "-Wglobal-constructors" -# pragma clang diagnostic ignored "-Wvariadic-macros" -# pragma clang diagnostic ignored "-Wc99-extensions" -# pragma clang diagnostic ignored "-Wunused-variable" -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wc++98-compat" -# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic ignored "-Wvariadic-macros" -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic ignored "-Wparentheses" - -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wpadded" -#endif -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -#endif - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? -// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported -// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? -// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? -// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) -// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? -// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? - -// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? -// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? -// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? -// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 - -#ifdef __cplusplus - -# if __cplusplus >= 201103L -# define CATCH_CPP11_OR_GREATER -# endif - -# if __cplusplus >= 201402L -# define CATCH_CPP14_OR_GREATER -# endif - -#endif - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# if defined(CATCH_CPP11_OR_GREATER) -# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic pop" ) -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// We know some environments not to support full POSIX signals -#if defined(__CYGWIN__) || defined(__QNX__) - -# if !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -# endif - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Cygwin -#ifdef __CYGWIN__ - -// Required for some versions of Cygwin to declare gettimeofday -// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin -# define _BSD_SOURCE - -#endif // __CYGWIN__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH - -#if (_MSC_VER >= 1600) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE -#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS - -#endif - -// Use __COUNTER__ if the compiler supports it -#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ - ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \ - ( defined __clang__ && __clang_major__ >= 3 ) - -#define CATCH_INTERNAL_CONFIG_COUNTER - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(CATCH_CPP11_OR_GREATER) - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# endif - -# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) -# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) -# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) -# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) -# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS -# endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NULLPTR -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_IS_ENUM -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TUPLE -#endif -#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) -# define CATCH_CONFIG_VARIADIC_MACROS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_LONG_LONG -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_UNIQUE_PTR -#endif -// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for -// analytics) because, at time of writing, __COUNTER__ is not properly handled by it. -// This does not affect compilation -#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) -# define CATCH_CONFIG_COUNTER -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_SHUFFLE -#endif -# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TYPE_TRAITS -# endif -#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) -# define CATCH_CONFIG_WINDOWS_SEH -#endif -// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. -#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_CONFIG_POSIX_SIGNALS -#endif - -#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CATCH_CONFIG_CPP11_NULLPTR -# define CATCH_NULL nullptr -#else -# define CATCH_NULL NULL -#endif - -// override support -#ifdef CATCH_CONFIG_CPP11_OVERRIDE -# define CATCH_OVERRIDE override -#else -# define CATCH_OVERRIDE -#endif - -// unique_ptr support -#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR -# define CATCH_AUTO_PTR( T ) std::unique_ptr -#else -# define CATCH_AUTO_PTR( T ) std::auto_ptr -#endif - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#ifdef CATCH_CONFIG_COUNTER -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) -#else -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) -#endif - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include - -namespace Catch { - - struct IConfig; - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { -#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; -#else - NonCopyable( NonCopyable const& info ); - NonCopyable& operator = ( NonCopyable const& ); -#endif - - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool startsWith( std::string const& s, char prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool endsWith( std::string const& s, char suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SourceLineInfo(SourceLineInfo const& other) = default; - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - bool operator < ( SourceLineInfo const& other ) const; - - char const* file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - void seedRng( IConfig const& config ); - unsigned int rngSeed(); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( CATCH_NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = CATCH_NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == CATCH_NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -void registerTestCase - ( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - -struct AutoReg { - - AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg - ( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - registerTestCase - ( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ - static void TestName(); \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( ... ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ \ - struct TestName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - void TestName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ - static void TestName(); \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - namespace{ \ - struct TestCaseName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ - void TestCaseName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ - CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \ - CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2, - - FatalErrorCondition = 0x200 | FailureBit - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x01, - - ContinueOnFailure = 0x02, // Failures fail test, but execution continues - FalseTest = 0x04, // Prefix expression with ! - SuppressFail = 0x08 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct DecomposedExpression - { - virtual ~DecomposedExpression() {} - virtual bool isBinaryExpression() const { - return false; - } - virtual void reconstructExpression( std::string& dest ) const = 0; - - // Only simple binary comparisons can be decomposed. - // If more complex check is required then wrap sub-expressions in parentheses. - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); - - private: - DecomposedExpression& operator = (DecomposedExpression const&); - }; - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( char const * _macroName, - SourceLineInfo const& _lineInfo, - char const * _capturedExpression, - ResultDisposition::Flags _resultDisposition, - char const * _secondArg = ""); - - char const * macroName; - SourceLineInfo lineInfo; - char const * capturedExpression; - ResultDisposition::Flags resultDisposition; - char const * secondArg; - }; - - struct AssertionResultData - { - AssertionResultData() : decomposedExpression( CATCH_NULL ) - , resultType( ResultWas::Unknown ) - , negated( false ) - , parenthesized( false ) {} - - void negate( bool parenthesize ) { - negated = !negated; - parenthesized = parenthesize; - if( resultType == ResultWas::Ok ) - resultType = ResultWas::ExpressionFailed; - else if( resultType == ResultWas::ExpressionFailed ) - resultType = ResultWas::Ok; - } - - std::string const& reconstructExpression() const { - if( decomposedExpression != CATCH_NULL ) { - decomposedExpression->reconstructExpression( reconstructedExpression ); - if( parenthesized ) { - reconstructedExpression.insert( 0, 1, '(' ); - reconstructedExpression.append( 1, ')' ); - } - if( negated ) { - reconstructedExpression.insert( 0, 1, '!' ); - } - decomposedExpression = CATCH_NULL; - } - return reconstructedExpression; - } - - mutable DecomposedExpression const* decomposedExpression; - mutable std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - bool negated; - bool parenthesized; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - void discardDecomposedExpression() const; - void expandDecomposedExpression() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -// #included from: catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - template struct MatchAllOf; - template struct MatchAnyOf; - template struct MatchNotOf; - - class MatcherUntypedBase { - public: - std::string toString() const { - if( m_cachedToString.empty() ) - m_cachedToString = describe(); - return m_cachedToString; - } - - protected: - virtual ~MatcherUntypedBase(); - virtual std::string describe() const = 0; - mutable std::string m_cachedToString; - private: - MatcherUntypedBase& operator = ( MatcherUntypedBase const& ); - }; - - template - struct MatcherMethod { - virtual bool match( ObjectT const& arg ) const = 0; - }; - template - struct MatcherMethod { - virtual bool match( PtrT* arg ) const = 0; - }; - - template - struct MatcherBase : MatcherUntypedBase, MatcherMethod { - - MatchAllOf operator && ( MatcherBase const& other ) const; - MatchAnyOf operator || ( MatcherBase const& other ) const; - MatchNotOf operator ! () const; - }; - - template - struct MatchAllOf : MatcherBase { - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if (!m_matchers[i]->match(arg)) - return false; - } - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - description += " and "; - description += m_matchers[i]->toString(); - } - description += " )"; - return description; - } - - MatchAllOf& operator && ( MatcherBase const& other ) { - m_matchers.push_back( &other ); - return *this; - } - - std::vector const*> m_matchers; - }; - template - struct MatchAnyOf : MatcherBase { - - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if (m_matchers[i]->match(arg)) - return true; - } - return false; - } - virtual std::string describe() const CATCH_OVERRIDE { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - description += " or "; - description += m_matchers[i]->toString(); - } - description += " )"; - return description; - } - - MatchAnyOf& operator || ( MatcherBase const& other ) { - m_matchers.push_back( &other ); - return *this; - } - - std::vector const*> m_matchers; - }; - - template - struct MatchNotOf : MatcherBase { - - MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} - - virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { - return !m_underlyingMatcher.match( arg ); - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "not " + m_underlyingMatcher.toString(); - } - MatcherBase const& m_underlyingMatcher; - }; - - template - MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { - return MatchAllOf() && *this && other; - } - template - MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { - return MatchAnyOf() || *this || other; - } - template - MatchNotOf MatcherBase::operator ! () const { - return MatchNotOf( *this ); - } - - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - // - deprecated: prefer ||, && and ! - template - inline Impl::MatchNotOf Not( Impl::MatcherBase const& underlyingMatcher ) { - return Impl::MatchNotOf( underlyingMatcher ); - } - template - inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { - return Impl::MatchAllOf() && m1 && m2; - } - template - inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { - return Impl::MatchAllOf() && m1 && m2 && m3; - } - template - inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { - return Impl::MatchAnyOf() || m1 || m2; - } - template - inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { - return Impl::MatchAnyOf() || m1 || m2 || m3; - } - -} // namespace Matchers - -using namespace Matchers; -using Matchers::Impl::MatcherBase; - -} // namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(std::string()); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder : public DecomposedExpression { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg = "" ); - ~ResultBuilder(); - - template - ExpressionLhs operator <= ( T const& operand ); - ExpressionLhs operator <= ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream().oss << value; - return *this; - } - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - - void endExpression( DecomposedExpression const& expr ); - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; - - AssertionResult build() const; - AssertionResult build( DecomposedExpression const& expr ) const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void captureExpectedException( std::string const& expectedMessage ); - void captureExpectedException( Matchers::Impl::MatcherBase const& matcher ); - void handleResult( AssertionResult const& result ); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - template - void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); - - void setExceptionGuard(); - void unsetExceptionGuard(); - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - - static CopyableStream &m_stream() - { - static CopyableStream s; - return s; - } - - bool m_shouldDebugBreak; - bool m_shouldThrow; - bool m_guardException; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return bool( opCast( lhs ) == opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) != opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) < opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) > opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) >= opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) <= opCast( rhs ) ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - // long long to unsigned X - template bool compare( long long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // unsigned long long to X - template bool compare( unsigned long long lhs, int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long long (when comparing against NULL) - template bool compare( long long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } -#endif // CATCH_CONFIG_CPP11_LONG_LONG - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( nullptr, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, nullptr ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -#ifdef CATCH_CONFIG_CPP11_TUPLE -#include -#endif - -#ifdef CATCH_CONFIG_CPP11_IS_ENUM -#include -#endif - -namespace Catch { - -// Why we're here. -template -std::string toString( T const& value ); - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( const wchar_t* const value ); -std::string toString( wchar_t* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ); -std::string toString( unsigned long long value ); -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG & nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - -namespace Detail { - - extern const std::string unprintableString; - - #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK) - struct BorgType { - template BorgType( T const& ); - }; - - struct TrueType { char sizer[1]; }; - struct FalseType { char sizer[2]; }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; -#else - template - class IsStreamInsertable { - template - static auto test(int) - -> decltype( std::declval() << std::declval(), std::true_type() ); - - template - static auto test(...) -> std::false_type; - - public: - static const bool value = decltype(test(0))::value; - }; -#endif - -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template::value - > - struct EnumStringMaker - { - static std::string convert( T const& ) { return unprintableString; } - }; - - template - struct EnumStringMaker - { - static std::string convert( T const& v ) - { - return ::Catch::toString( - static_cast::type>(v) - ); - } - }; -#endif - template - struct StringMakerBase { -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template - static std::string convert( T const& v ) - { - return EnumStringMaker::convert( v ); - } -#else - template - static std::string convert( T const& ) { return unprintableString; } -#endif - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -//template -//struct StringMaker > { -// static std::string convert( std::vector const& v ) { -// return Detail::rangeToString( v.begin(), v.end() ); -// } -//}; - -template -std::string toString( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); -} - -#ifdef CATCH_CONFIG_CPP11_TUPLE - -// toString for tuples -namespace TupleDetail { - template< - typename Tuple, - std::size_t N = 0, - bool = (N < std::tuple_size::value) - > - struct ElementPrinter { - static void print( const Tuple& tuple, std::ostream& os ) - { - os << ( N ? ", " : " " ) - << Catch::toString(std::get(tuple)); - ElementPrinter::print(tuple,os); - } - }; - - template< - typename Tuple, - std::size_t N - > - struct ElementPrinter { - static void print( const Tuple&, std::ostream& ) {} - }; - -} - -template -struct StringMaker> { - - static std::string convert( const std::tuple& tuple ) - { - std::ostringstream os; - os << '{'; - TupleDetail::ElementPrinter>::print( tuple, os ); - os << " }"; - return os.str(); - } -}; -#endif // CATCH_CONFIG_CPP11_TUPLE - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << Catch::toString( *first ); - for( ++first ; first != last ; ++first ) - oss << ", " << Catch::toString( *first ); - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -template -class BinaryExpression; - -template -class MatchExpression; - -// Wraps the LHS of an expression and overloads comparison operators -// for also capturing those and RHS (if any) -template -class ExpressionLhs : public DecomposedExpression { -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} - - ExpressionLhs& operator = ( const ExpressionLhs& ); - - template - BinaryExpression - operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - BinaryExpression - operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - BinaryExpression operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - BinaryExpression operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - m_truthy = m_lhs ? true : false; - m_rb - .setResultType( m_truthy ) - .endExpression( *this ); - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - dest = Catch::toString( m_lhs ); - } - -private: - template - BinaryExpression captureExpression( RhsT& rhs ) const { - return BinaryExpression( m_rb, m_lhs, rhs ); - } - - template - BinaryExpression captureExpression( bool rhs ) const { - return BinaryExpression( m_rb, m_lhs, rhs ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; - bool m_truthy; -}; - -template -class BinaryExpression : public DecomposedExpression { -public: - BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) - : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} - - BinaryExpression& operator = ( BinaryExpression& ); - - void endExpression() const { - m_rb - .setResultType( Internal::compare( m_lhs, m_rhs ) ) - .endExpression( *this ); - } - - virtual bool isBinaryExpression() const CATCH_OVERRIDE { - return true; - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - std::string lhs = Catch::toString( m_lhs ); - std::string rhs = Catch::toString( m_rhs ); - char delim = lhs.size() + rhs.size() < 40 && - lhs.find('\n') == std::string::npos && - rhs.find('\n') == std::string::npos ? ' ' : '\n'; - dest.reserve( 7 + lhs.size() + rhs.size() ); - // 2 for spaces around operator - // 2 for operator - // 2 for parentheses (conditionally added later) - // 1 for negation (conditionally added later) - dest = lhs; - dest += delim; - dest += Internal::OperatorTraits::getName(); - dest += delim; - dest += rhs; - } - -private: - ResultBuilder& m_rb; - LhsT m_lhs; - RhsT m_rhs; -}; - -template -class MatchExpression : public DecomposedExpression { -public: - MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) - : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} - - virtual bool isBinaryExpression() const CATCH_OVERRIDE { - return true; - } - - virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { - std::string matcherAsString = m_matcher.toString(); - dest = Catch::toString( m_arg ); - dest += ' '; - if( matcherAsString == Detail::unprintableString ) - dest += m_matcherString; - else - dest += matcherAsString; - } - -private: - ArgT m_arg; - MatcherT m_matcher; - char const* m_matcherString; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { - return ExpressionLhs( *this, value ); - } - - template - inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, - char const* matcherString ) { - MatchExpression expr( arg, matcher, matcherString ); - setResultType( matcher.match( arg ) ); - endExpression( expr ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct SectionEndInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - - virtual void exceptionEarlyReported() = 0; - - virtual void handleFatalErrorCondition( std::string const& message ) = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -# define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -# define CATCH_PLATFORM_IPHONE -#elif defined(linux) || defined(__linux) || defined(__linux__) -# define CATCH_PLATFORM_LINUX -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -# define CATCH_PLATFORM_WINDOWS -# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) -# define CATCH_DEFINES_NOMINMAX -# endif -# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) -# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# endif -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_TRAP() \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ) - #else - #define CATCH_TRAP() __asm__("int $3\n" : : ) - #endif - -#elif defined(CATCH_PLATFORM_LINUX) - // If we can use inline assembler, do it because this allows us to break - // directly at the location of the failing check instead of breaking inside - // raise() called from it, i.e. one stack frame below. - #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) - #define CATCH_TRAP() asm volatile ("int $3") - #else // Fall back to the generic way. - #include - - #define CATCH_TRAP() raise(SIGTRAP) - #endif -#elif defined(_MSC_VER) - #define CATCH_TRAP() __debugbreak() -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_TRAP() DebugBreak() -#endif - -#ifdef CATCH_TRAP - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } -#else - #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -#if defined(CATCH_CONFIG_FAST_COMPILE) -/////////////////////////////////////////////////////////////////////////////// -// We can speedup compilation significantly by breaking into debugger lower in -// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER -// macro in each assertion -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -// Another way to speed-up compilation is to omit local try-catch for REQUIRE* -// macros. -// This can potentially cause false negative, if the test code catches -// the exception before it propagates back up to the runner. -#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - __catchResult.setExceptionGuard(); \ - CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - ( __catchResult <= expr ).endExpression(); \ - CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - __catchResult.unsetExceptionGuard(); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look -// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. - -#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - __catchResult.setExceptionGuard(); \ - __catchResult.captureMatch( arg, matcher, #matcher ); \ - __catchResult.unsetExceptionGuard(); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -#else -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - ( __catchResult <= expr ).endExpression(); \ - CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \ - INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \ - INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ - if( __catchResult.allowThrows() ) \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureExpectedException( matcher ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr ", " #exceptionType, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - static_cast(expr); \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( macroName, log ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - try { \ - __catchResult.captureMatch( arg, matcher, #matcher ); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - bool allOk() const { - return failed == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -#include - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - - struct SectionEndInfo { - SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) - : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo sectionInfo; - Counts prevAssertions; - double durationInSeconds; - }; - -} // end namespace Catch - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef _MSC_VER - -namespace Catch { - typedef unsigned long long UInt64; -} -#else -#include -namespace Catch { - typedef uint64_t UInt64; -} -#endif - -namespace Catch { - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedMicroseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - UInt64 m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section : NonCopyable { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -#include - -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - struct ITagAliasRegistry; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; - - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; - virtual void registerListener( Ptr const& factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator; - typedef std::vector ExceptionTranslators; - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { - try { - if( it == itEnd ) - throw; - else - return (*it)->translate( it+1, itEnd ); - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ - static std::string translatorName( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ - static std::string translatorName( signature ) - -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) -#include -#endif - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_margin( 0.0 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_margin( other.m_margin ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - -#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) - - template ::value>::type> - Approx operator()( T value ) { - Approx approx( static_cast(value) ); - approx.epsilon( m_epsilon ); - approx.margin( m_margin ); - approx.scale( m_scale ); - return approx; - } - - template ::value>::type> - explicit Approx( T value ): Approx(static_cast(value)) - {} - - template ::value>::type> - friend bool operator == ( const T& lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - auto lhs_v = double(lhs); - bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); - if (relativeOK) { - return true; - } - return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin; - } - - template ::value>::type> - friend bool operator == ( Approx const& lhs, const T& rhs ) { - return operator==( rhs, lhs ); - } - - template ::value>::type> - friend bool operator != ( T lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - template ::value>::type> - friend bool operator != ( Approx const& lhs, T rhs ) { - return !operator==( rhs, lhs ); - } - - template ::value>::type> - friend bool operator <= ( T lhs, Approx const& rhs ) { - return double(lhs) < rhs.m_value || lhs == rhs; - } - - template ::value>::type> - friend bool operator <= ( Approx const& lhs, T rhs ) { - return lhs.m_value < double(rhs) || lhs == rhs; - } - - template ::value>::type> - friend bool operator >= ( T lhs, Approx const& rhs ) { - return double(lhs) > rhs.m_value || lhs == rhs; - } - - template ::value>::type> - friend bool operator >= ( Approx const& lhs, T rhs ) { - return lhs.m_value > double(rhs) || lhs == rhs; - } - - template ::value>::type> - Approx& epsilon( T newEpsilon ) { - m_epsilon = double(newEpsilon); - return *this; - } - - template ::value>::type> - Approx& margin( T newMargin ) { - m_margin = double(newMargin); - return *this; - } - - template ::value>::type> - Approx& scale( T newScale ) { - m_scale = double(newScale); - return *this; - } - -#else - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.margin( m_margin ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) ); - if (relativeOK) { - return true; - } - return std::fabs(lhs - rhs.m_value) < rhs.m_margin; - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - friend bool operator <= ( double lhs, Approx const& rhs ) { - return lhs < rhs.m_value || lhs == rhs; - } - - friend bool operator <= ( Approx const& lhs, double rhs ) { - return lhs.m_value < rhs || lhs == rhs; - } - - friend bool operator >= ( double lhs, Approx const& rhs ) { - return lhs > rhs.m_value || lhs == rhs; - } - - friend bool operator >= ( Approx const& lhs, double rhs ) { - return lhs.m_value > rhs || lhs == rhs; - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& margin( double newMargin ) { - m_margin = newMargin; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } -#endif - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_margin; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_matchers_string.h -#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED - -namespace Catch { -namespace Matchers { - - namespace StdString { - - struct CasedString - { - CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); - std::string adjustString( std::string const& str ) const; - std::string caseSensitivitySuffix() const; - - CaseSensitive::Choice m_caseSensitivity; - std::string m_str; - }; - - struct StringMatcherBase : MatcherBase { - StringMatcherBase( std::string const& operation, CasedString const& comparator ); - virtual std::string describe() const CATCH_OVERRIDE; - - CasedString m_comparator; - std::string m_operation; - }; - - struct EqualsMatcher : StringMatcherBase { - EqualsMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct ContainsMatcher : StringMatcherBase { - ContainsMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct StartsWithMatcher : StringMatcherBase { - StartsWithMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - struct EndsWithMatcher : StringMatcherBase { - EndsWithMatcher( CasedString const& comparator ); - virtual bool match( std::string const& source ) const CATCH_OVERRIDE; - }; - - } // namespace StdString - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - -} // namespace Matchers -} // namespace Catch - -// #included from: internal/catch_matchers_vector.h -#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED - -namespace Catch { -namespace Matchers { - - namespace Vector { - - template - struct ContainsElementMatcher : MatcherBase, T> { - - ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - return std::find(v.begin(), v.end(), m_comparator) != v.end(); - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "Contains: " + Catch::toString( m_comparator ); - } - - T const& m_comparator; - }; - - template - struct ContainsMatcher : MatcherBase, std::vector > { - - ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - // !TBD: see note in EqualsMatcher - if (m_comparator.size() > v.size()) - return false; - for (size_t i = 0; i < m_comparator.size(); ++i) - if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end()) - return false; - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - return "Contains: " + Catch::toString( m_comparator ); - } - - std::vector const& m_comparator; - }; - - template - struct EqualsMatcher : MatcherBase, std::vector > { - - EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - - bool match(std::vector const &v) const CATCH_OVERRIDE { - // !TBD: This currently works if all elements can be compared using != - // - a more general approach would be via a compare template that defaults - // to using !=. but could be specialised for, e.g. std::vector etc - // - then just call that directly - if (m_comparator.size() != v.size()) - return false; - for (size_t i = 0; i < v.size(); ++i) - if (m_comparator[i] != v[i]) - return false; - return true; - } - virtual std::string describe() const CATCH_OVERRIDE { - return "Equals: " + Catch::toString( m_comparator ); - } - std::vector const& m_comparator; - }; - - } // namespace Vector - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - - template - Vector::ContainsMatcher Contains( std::vector const& comparator ) { - return Vector::ContainsMatcher( comparator ); - } - - template - Vector::ContainsElementMatcher VectorContains( T const& comparator ) { - return Vector::ContainsElementMatcher( comparator ); - } - - template - Vector::EqualsMatcher Equals( std::vector const& comparator ) { - return Vector::EqualsMatcher( comparator ); - } - -} // namespace Matchers -} // namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( CATCH_NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = CATCH_NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != CATCH_NULL; } - bool none() const { return nullableValue == CATCH_NULL; } - - bool operator !() const { return nullableValue == CATCH_NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T *nullableValue; - union { - char storage[sizeof(T)]; - - // These are here to force alignment for the storage - long double dummy1; - void (*dummy2)(); - long double dummy3; -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - long long dummy4; -#endif - }; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4, - NonPortable = 1 << 5 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( CATCH_NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - struct StringHolder : MatcherBase{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - virtual bool match( NSString* arg ) const CATCH_OVERRIDE { - return false; - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const CATCH_OVERRIDE { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( NSString* str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string describe() const CATCH_OVERRIDE { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_IMPL - -// !TBD: Move the leak detector code into a separate header -#ifdef CATCH_CONFIG_WINDOWS_CRTDBG -#include -class LeakDetector { -public: - LeakDetector() { - int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - flag |= _CRTDBG_LEAK_CHECK_DF; - flag |= _CRTDBG_ALLOC_MEM_DF; - _CrtSetDbgFlag(flag); - _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); - // Change this to leaking allocation's number to break there - _CrtSetBreakAlloc(-1); - } -}; -#else -class LeakDetector {}; -#endif - -LeakDetector leakDetector; - -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: ../catch_session.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_wildcard_pattern.hpp -#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED - -#include - -namespace Catch -{ - class WildcardPattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - - WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_wildcard( NoWildcard ), - m_pattern( adjustCase( pattern ) ) - { - if( startsWith( m_pattern, '*' ) ) { - m_pattern = m_pattern.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_pattern, '*' ) ) { - m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~WildcardPattern(); - virtual bool matches( std::string const& str ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_pattern == adjustCase( str ); - case WildcardAtStart: - return endsWith( adjustCase( str ), m_pattern ); - case WildcardAtEnd: - return startsWith( adjustCase( str ), m_pattern ); - case WildcardAtBothEnds: - return contains( adjustCase( str ), m_pattern ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string adjustCase( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; - } - CaseSensitive::Choice m_caseSensitivity; - WildcardPosition m_wildcard; - std::string m_pattern; - }; -} - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - public: - NamePattern( std::string const& name ) - : m_wildcardPattern( toLower( name ), CaseSensitive::No ) - {} - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return m_wildcardPattern.matches( toLower( testCase.name ) ); - } - private: - WildcardPattern m_wildcardPattern; - }; - - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { - if( !(*it)->matches( testCase ) ) - return false; - } - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag, EscapedName }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - std::vector m_escapeChars; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - m_escapeChars.clear(); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - case '\\': return escape(); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - else if( c == '\\' ) - escape(); - } - else if( m_mode == EscapedName ) - m_mode = Name; - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - void escape() { - if( m_mode == None ) - m_start = m_pos; - m_mode = EscapedName; - m_escapeChars.push_back( m_pos ); - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - for( size_t i = 0; i < m_escapeChars.size(); ++i ) - token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); - m_escapeChars.clear(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - struct RunTests { enum InWhatOrder { - InDeclarationOrder, - InLexicographicalOrder, - InRandomOrder - }; }; - struct UseColour { enum YesOrNo { - Auto, - Yes, - No - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - virtual RunTests::InWhatOrder runOrder() const = 0; - virtual unsigned int rngSeed() const = 0; - virtual UseColour::YesOrNo useColour() const = 0; - virtual std::vector const& getSectionsToRun() const = 0; - - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include -#include -#include - -namespace Catch { - - std::ostream& cout(); - std::ostream& cerr(); - - struct IStream { - virtual ~IStream() CATCH_NOEXCEPT; - virtual std::ostream& stream() const = 0; - }; - - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( std::string const& filename ); - virtual ~FileStream() CATCH_NOEXCEPT; - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - CoutStream(); - virtual ~CoutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class DebugOutStream : public IStream { - CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream(); - virtual ~DebugOutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; -} - -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - listExtraInfo( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - filenamesAsTags( false ), - abortAfter( -1 ), - rngSeed( 0 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ), - useColour( UseColour::Auto ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - bool listExtraInfo; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - bool filenamesAsTags; - - int abortAfter; - unsigned int rngSeed; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - RunTests::InWhatOrder runOrder; - UseColour::YesOrNo useColour; - - std::string outputFilename; - std::string name; - std::string processName; - - std::vector reporterNames; - std::vector testsOrTags; - std::vector sectionsToRun; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_stream( openStream() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() {} - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - bool listExtraInfo() const { return m_data.listExtraInfo; } - - std::string getProcessName() const { return m_data.processName; } - - std::vector const& getReporterNames() const { return m_data.reporterNames; } - std::vector const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } - - virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - - // IConfig interface - virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; } - virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); } - virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; } - virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; } - virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; } - virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; } - virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; } - virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; } - virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; } - - private: - - IStream const* openStream() { - if( m_data.outputFilename.empty() ) - return new CoutStream(); - else if( m_data.outputFilename[0] == '%' ) { - if( m_data.outputFilename == "%debug" ) - return new DebugOutStream(); - else - throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); - } - else - return new FileStream( m_data.outputFilename ); - } - ConfigData m_data; - - CATCH_AUTO_PTR( IStream const ) m_stream; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Version 0.0.2.4 - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -// ----------- #included from clara_compilers.h ----------- - -#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED -#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? -// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? - -// In general each macro has a _NO_ form -// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 - -#ifdef __clang__ - -#if __has_feature(cxx_nullptr) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#if __has_feature(cxx_noexcept) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -#define CLARA_CPP11_OR_GREATER - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) -#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE -#endif -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NULLPTR -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_UNIQUE_PTR -#endif - -// noexcept support: -#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) -#define CLARA_NOEXCEPT noexcept -# define CLARA_NOEXCEPT_IS(x) noexcept(x) -#else -#define CLARA_NOEXCEPT throw() -# define CLARA_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CLARA_CONFIG_CPP11_NULLPTR -#define CLARA_NULL nullptr -#else -#define CLARA_NULL NULL -#endif - -// override support -#ifdef CLARA_CONFIG_CPP11_OVERRIDE -#define CLARA_OVERRIDE override -#else -#define CLARA_OVERRIDE -#endif - -// unique_ptr support -#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR -# define CLARA_AUTO_PTR( T ) std::unique_ptr -#else -# define CLARA_AUTO_PTR( T ) std::auto_ptr -#endif - -#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// ----------- end of #include from clara_compilers.h ----------- -// ........... back in clara.h - -#include -#include -#include - -#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CLARA_PLATFORM_WINDOWS -#endif - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - char toLowerCh(char c) { - return static_cast( std::tolower( c ) ); - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -#endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( CLARA_NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != CLARA_NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - inline std::vector argsToVector( int argc, char const* const* const argv ) { - std::vector args( static_cast( argc ) ); - for( std::size_t i = 0; i < static_cast( argc ); ++i ) - args[i] = argv[i]; - - return args; - } - - class Parser { - enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; - Mode mode; - std::size_t from; - bool inQuotes; - public: - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - Parser() : mode( None ), from( 0 ), inQuotes( false ){} - - void parseIntoTokens( std::vector const& args, std::vector& tokens ) { - const std::string doubleDash = "--"; - for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) - parseIntoTokens( args[i], tokens); - } - - void parseIntoTokens( std::string const& arg, std::vector& tokens ) { - for( std::size_t i = 0; i < arg.size(); ++i ) { - char c = arg[i]; - if( c == '"' ) - inQuotes = !inQuotes; - mode = handleMode( i, c, arg, tokens ); - } - mode = handleMode( arg.size(), '\0', arg, tokens ); - } - Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - switch( mode ) { - case None: return handleNone( i, c ); - case MaybeShortOpt: return handleMaybeShortOpt( i, c ); - case ShortOpt: - case LongOpt: - case SlashOpt: return handleOpt( i, c, arg, tokens ); - case Positional: return handlePositional( i, c, arg, tokens ); - default: throw std::logic_error( "Unknown mode" ); - } - } - - Mode handleNone( std::size_t i, char c ) { - if( inQuotes ) { - from = i; - return Positional; - } - switch( c ) { - case '-': return MaybeShortOpt; -#ifdef CLARA_PLATFORM_WINDOWS - case '/': from = i+1; return SlashOpt; -#endif - default: from = i; return Positional; - } - } - Mode handleMaybeShortOpt( std::size_t i, char c ) { - switch( c ) { - case '-': from = i+1; return LongOpt; - default: from = i; return ShortOpt; - } - } - - Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) - return mode; - - std::string optName = arg.substr( from, i-from ); - if( mode == ShortOpt ) - for( std::size_t j = 0; j < optName.size(); ++j ) - tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); - else if( mode == SlashOpt && optName.size() == 1 ) - tokens.push_back( Token( Token::ShortOpt, optName ) ); - else - tokens.push_back( Token( Token::LongOpt, optName ) ); - return None; - } - Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) - return mode; - - std::string data = arg.substr( from, i-from ); - tokens.push_back( Token( Token::Positional, data ) ); - return None; - } - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg.reset( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( std::vector const& args ) const { - ConfigT config; - parseInto( args, config ); - return config; - } - - std::vector parseInto( std::vector const& args, ConfigT& config ) const { - std::string processName = args.empty() ? std::string() : args[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( args, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.set( config, "true" ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( errors.empty() && m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } - inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); - } - inline void setOrder( ConfigData& config, std::string const& order ) { - if( startsWith( "declared", order ) ) - config.runOrder = RunTests::InDeclarationOrder; - else if( startsWith( "lexical", order ) ) - config.runOrder = RunTests::InLexicographicalOrder; - else if( startsWith( "random", order ) ) - config.runOrder = RunTests::InRandomOrder; - else - throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); - } - inline void setRngSeed( ConfigData& config, std::string const& seed ) { - if( seed == "time" ) { - config.rngSeed = static_cast( std::time(0) ); - } - else { - std::stringstream ss; - ss << seed; - ss >> config.rngSeed; - if( ss.fail() ) - throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" ); - } - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void setUseColour( ConfigData& config, std::string const& value ) { - std::string mode = toLower( value ); - - if( mode == "yes" ) - config.useColour = UseColour::Yes; - else if( mode == "no" ) - config.useColour = UseColour::No; - else if( mode == "auto" ) - config.useColour = UseColour::Auto; - else - throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); - } - inline void forceColour( ConfigData& config ) { - config.useColour = UseColour::Yes; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, '#' ) ) { - if( !startsWith( line, '"' ) ) - line = '"' + line + '"'; - addTestOrTags( config, line + ',' ); - } - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &addReporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes|no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - cli["-#"]["--filenames-as-tags"] - .describe( "adds a tag for the filename" ) - .bind( &ConfigData::filenamesAsTags ); - - cli["-c"]["--section"] - .describe( "specify section to run" ) - .bind( &addSectionToRun, "section name" ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-extra-info"] - .describe( "list all/matching test cases with more info" ) - .bind( &ConfigData::listExtraInfo ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - cli["--order"] - .describe( "test case order (defaults to decl)" ) - .bind( &setOrder, "decl|lex|rand" ); - - cli["--rng-seed"] - .describe( "set a specific seed for random numbers" ) - .bind( &setRngSeed, "'time'|number" ); - - cli["--force-colour"] - .describe( "force colourised output (deprecated)" ) - .bind( &forceColour ); - - cli["--use-colour"] - .describe( "should output be colourised" ) - .bind( &setUseColour, "yes|no" ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - const std::string wrappableBeforeChars = "[({<\t"; - const std::string wrappableAfterChars = "])}>-,./|\\"; - const std::string wrappableInsteadOfChars = " \n\r"; - std::string indent = _attr.initialIndent != std::string::npos - ? std::string( _attr.initialIndent, ' ' ) - : std::string( _attr.indent, ' ' ); - - typedef std::string::const_iterator iterator; - iterator it = _str.begin(); - const iterator strEnd = _str.end(); - - while( it != strEnd ) { - - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - - std::string suffix; - std::size_t width = (std::min)( static_cast( strEnd-it ), _attr.width-static_cast( indent.size() ) ); - iterator itEnd = it+width; - iterator itNext = _str.end(); - - iterator itNewLine = std::find( it, itEnd, '\n' ); - if( itNewLine != itEnd ) - itEnd = itNewLine; - - if( itEnd != strEnd ) { - bool foundWrapPoint = false; - iterator findIt = itEnd; - do { - if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { - itEnd = findIt+1; - itNext = findIt+1; - foundWrapPoint = true; - } - else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { - itEnd = findIt; - itNext = findIt; - foundWrapPoint = true; - } - else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { - itNext = findIt+1; - itEnd = findIt; - foundWrapPoint = true; - } - if( findIt == it ) - break; - else - --findIt; - } - while( !foundWrapPoint ); - - if( !foundWrapPoint ) { - // No good wrap char, so we'll break mid word and add a hyphen - --itEnd; - itNext = itEnd; - suffix = "-"; - } - else { - while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) - --itEnd; - } - } - lines.push_back( indent + std::string( it, itEnd ) + suffix ); - - if( indent.size() != _attr.indent ) - indent = std::string( _attr.indent, ' ' ); - it = itNext; - } - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - class MultipleReporters; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - - virtual void skipTest( TestCaseInfo const& testInfo ) = 0; - - virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } - }; - - struct IReporterFactory : IShared { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map > FactoryMap; - typedef std::vector > Listeners; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - virtual Listeners const& getListeners() const = 0; - }; - - Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Matching test cases:\n"; - else { - Catch::cout() << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, descAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - descAttr.setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( config.listExtraInfo() ) { - Catch::cout() << " " << testCaseInfo.lineInfo << std::endl; - std::string description = testCaseInfo.description; - if( description.empty() ) - description = "(NO DESCRIPTION)"; - Catch::cout() << Text( description, descAttr ) << std::endl; - } - if( !testCaseInfo.tags.empty() ) - Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; - else - Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - if( startsWith( testCaseInfo.name, '#' ) ) - Catch::cout() << '"' << testCaseInfo.name << '"'; - else - Catch::cout() << testCaseInfo.name; - if ( config.listExtraInfo() ) - Catch::cout() << "\t@" << testCaseInfo.lineInfo; - Catch::cout() << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Tags for matching test cases:\n"; - else { - Catch::cout() << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - Catch::cout() << oss.str() << wrapper << '\n'; - } - Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - Catch::cout() << "Available reporters:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - Catch::cout() << " " - << it->first - << ':' - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << '\n'; - } - Catch::cout() << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_run_context.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include -#include -#include - -CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS - -namespace Catch { -namespace TestCaseTracking { - - struct NameAndLocation { - std::string name; - SourceLineInfo location; - - NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) - : name( _name ), - location( _location ) - {} - }; - - struct ITracker : SharedImpl<> { - virtual ~ITracker(); - - // static queries - virtual NameAndLocation const& nameAndLocation() const = 0; - - // dynamic queries - virtual bool isComplete() const = 0; // Successfully completed or failed - virtual bool isSuccessfullyCompleted() const = 0; - virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; - - virtual ITracker& parent() = 0; - - // actions - virtual void close() = 0; // Successfully complete - virtual void fail() = 0; - virtual void markAsNeedingAnotherRun() = 0; - - virtual void addChild( Ptr const& child ) = 0; - virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; - virtual void openChild() = 0; - - // Debug/ checking - virtual bool isSectionTracker() const = 0; - virtual bool isIndexTracker() const = 0; - }; - - class TrackerContext { - - enum RunState { - NotStarted, - Executing, - CompletedCycle - }; - - Ptr m_rootTracker; - ITracker* m_currentTracker; - RunState m_runState; - - public: - - static TrackerContext& instance() { - static TrackerContext s_instance; - return s_instance; - } - - TrackerContext() - : m_currentTracker( CATCH_NULL ), - m_runState( NotStarted ) - {} - - ITracker& startRun(); - - void endRun() { - m_rootTracker.reset(); - m_currentTracker = CATCH_NULL; - m_runState = NotStarted; - } - - void startCycle() { - m_currentTracker = m_rootTracker.get(); - m_runState = Executing; - } - void completeCycle() { - m_runState = CompletedCycle; - } - - bool completedCycle() const { - return m_runState == CompletedCycle; - } - ITracker& currentTracker() { - return *m_currentTracker; - } - void setCurrentTracker( ITracker* tracker ) { - m_currentTracker = tracker; - } - }; - - class TrackerBase : public ITracker { - protected: - enum CycleState { - NotStarted, - Executing, - ExecutingChildren, - NeedsAnotherRun, - CompletedSuccessfully, - Failed - }; - class TrackerHasName { - NameAndLocation m_nameAndLocation; - public: - TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} - bool operator ()( Ptr const& tracker ) { - return - tracker->nameAndLocation().name == m_nameAndLocation.name && - tracker->nameAndLocation().location == m_nameAndLocation.location; - } - }; - typedef std::vector > Children; - NameAndLocation m_nameAndLocation; - TrackerContext& m_ctx; - ITracker* m_parent; - Children m_children; - CycleState m_runState; - public: - TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : m_nameAndLocation( nameAndLocation ), - m_ctx( ctx ), - m_parent( parent ), - m_runState( NotStarted ) - {} - virtual ~TrackerBase(); - - virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { - return m_nameAndLocation; - } - virtual bool isComplete() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully || m_runState == Failed; - } - virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully; - } - virtual bool isOpen() const CATCH_OVERRIDE { - return m_runState != NotStarted && !isComplete(); - } - virtual bool hasChildren() const CATCH_OVERRIDE { - return !m_children.empty(); - } - - virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { - m_children.push_back( child ); - } - - virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { - Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); - return( it != m_children.end() ) - ? it->get() - : CATCH_NULL; - } - virtual ITracker& parent() CATCH_OVERRIDE { - assert( m_parent ); // Should always be non-null except for root - return *m_parent; - } - - virtual void openChild() CATCH_OVERRIDE { - if( m_runState != ExecutingChildren ) { - m_runState = ExecutingChildren; - if( m_parent ) - m_parent->openChild(); - } - } - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } - virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } - - void open() { - m_runState = Executing; - moveToThis(); - if( m_parent ) - m_parent->openChild(); - } - - virtual void close() CATCH_OVERRIDE { - - // Close any still open children (e.g. generators) - while( &m_ctx.currentTracker() != this ) - m_ctx.currentTracker().close(); - - switch( m_runState ) { - case NotStarted: - case CompletedSuccessfully: - case Failed: - throw std::logic_error( "Illogical state" ); - - case NeedsAnotherRun: - break;; - - case Executing: - m_runState = CompletedSuccessfully; - break; - case ExecutingChildren: - if( m_children.empty() || m_children.back()->isComplete() ) - m_runState = CompletedSuccessfully; - break; - - default: - throw std::logic_error( "Unexpected state" ); - } - moveToParent(); - m_ctx.completeCycle(); - } - virtual void fail() CATCH_OVERRIDE { - m_runState = Failed; - if( m_parent ) - m_parent->markAsNeedingAnotherRun(); - moveToParent(); - m_ctx.completeCycle(); - } - virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { - m_runState = NeedsAnotherRun; - } - private: - void moveToParent() { - assert( m_parent ); - m_ctx.setCurrentTracker( m_parent ); - } - void moveToThis() { - m_ctx.setCurrentTracker( this ); - } - }; - - class SectionTracker : public TrackerBase { - std::vector m_filters; - public: - SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ) - { - if( parent ) { - while( !parent->isSectionTracker() ) - parent = &parent->parent(); - - SectionTracker& parentSection = static_cast( *parent ); - addNextFilters( parentSection.m_filters ); - } - } - virtual ~SectionTracker(); - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } - - static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { - SectionTracker* section = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { - assert( childTracker ); - assert( childTracker->isSectionTracker() ); - section = static_cast( childTracker ); - } - else { - section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); - currentTracker.addChild( section ); - } - if( !ctx.completedCycle() ) - section->tryOpen(); - return *section; - } - - void tryOpen() { - if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) - open(); - } - - void addInitialFilters( std::vector const& filters ) { - if( !filters.empty() ) { - m_filters.push_back(""); // Root - should never be consulted - m_filters.push_back(""); // Test Case - not a section filter - m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); - } - } - void addNextFilters( std::vector const& filters ) { - if( filters.size() > 1 ) - m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); - } - }; - - class IndexTracker : public TrackerBase { - int m_size; - int m_index; - public: - IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) - : TrackerBase( nameAndLocation, ctx, parent ), - m_size( size ), - m_index( -1 ) - {} - virtual ~IndexTracker(); - - virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } - - static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { - IndexTracker* tracker = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { - assert( childTracker ); - assert( childTracker->isIndexTracker() ); - tracker = static_cast( childTracker ); - } - else { - tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); - currentTracker.addChild( tracker ); - } - - if( !ctx.completedCycle() && !tracker->isComplete() ) { - if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) - tracker->moveNext(); - tracker->open(); - } - - return *tracker; - } - - int index() const { return m_index; } - - void moveNext() { - m_index++; - m_children.clear(); - } - - virtual void close() CATCH_OVERRIDE { - TrackerBase::close(); - if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) - m_runState = Executing; - } - }; - - inline ITracker& TrackerContext::startRun() { - m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); - m_currentTracker = CATCH_NULL; - m_runState = Executing; - return *m_rootTracker; - } - -} // namespace TestCaseTracking - -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; -using TestCaseTracking::IndexTracker; - -} // namespace Catch - -CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS - -// #included from: catch_fatal_condition.hpp -#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED - -namespace Catch { - - // Report the error condition - inline void reportFatal( std::string const& message ) { - IContext& context = Catch::getCurrentContext(); - IResultCapture* resultCapture = context.getResultCapture(); - resultCapture->handleFatalErrorCondition( message ); - } - -} // namespace Catch - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// -// #included from: catch_windows_h_proxy.h - -#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED - -#ifdef CATCH_DEFINES_NOMINMAX -# define NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -#ifdef CATCH_DEFINES_NOMINMAX -# undef NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# undef WIN32_LEAN_AND_MEAN -#endif - - -# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) - -namespace Catch { - struct FatalConditionHandler { - void reset() {} - }; -} - -# else // CATCH_CONFIG_WINDOWS_SEH is defined - -namespace Catch { - - struct SignalDefs { DWORD id; const char* name; }; - extern SignalDefs signalDefs[]; - // There is no 1-1 mapping between signals and windows exceptions. - // Windows can easily distinguish between SO and SigSegV, - // but SigInt, SigTerm, etc are handled differently. - SignalDefs signalDefs[] = { - { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, - { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, - { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, - { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, - }; - - struct FatalConditionHandler { - - static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { - for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { - if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { - reportFatal(signalDefs[i].name); - } - } - // If its not an exception we care about, pass it along. - // This stops us from eating debugger breaks etc. - return EXCEPTION_CONTINUE_SEARCH; - } - - FatalConditionHandler() { - isSet = true; - // 32k seems enough for Catch to handle stack overflow, - // but the value was found experimentally, so there is no strong guarantee - guaranteeSize = 32 * 1024; - exceptionHandlerHandle = CATCH_NULL; - // Register as first handler in current chain - exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); - // Pass in guarantee size to be filled - SetThreadStackGuarantee(&guaranteeSize); - } - - static void reset() { - if (isSet) { - // Unregister handler and restore the old guarantee - RemoveVectoredExceptionHandler(exceptionHandlerHandle); - SetThreadStackGuarantee(&guaranteeSize); - exceptionHandlerHandle = CATCH_NULL; - isSet = false; - } - } - - ~FatalConditionHandler() { - reset(); - } - private: - static bool isSet; - static ULONG guaranteeSize; - static PVOID exceptionHandlerHandle; - }; - - bool FatalConditionHandler::isSet = false; - ULONG FatalConditionHandler::guaranteeSize = 0; - PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; - -} // namespace Catch - -# endif // CATCH_CONFIG_WINDOWS_SEH - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -# if !defined(CATCH_CONFIG_POSIX_SIGNALS) - -namespace Catch { - struct FatalConditionHandler { - void reset() {} - }; -} - -# else // CATCH_CONFIG_POSIX_SIGNALS is defined - -#include - -namespace Catch { - - struct SignalDefs { - int id; - const char* name; - }; - extern SignalDefs signalDefs[]; - SignalDefs signalDefs[] = { - { SIGINT, "SIGINT - Terminal interrupt signal" }, - { SIGILL, "SIGILL - Illegal instruction signal" }, - { SIGFPE, "SIGFPE - Floating point error signal" }, - { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, - { SIGTERM, "SIGTERM - Termination request signal" }, - { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } - }; - - struct FatalConditionHandler { - - static bool isSet; - static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; - static stack_t oldSigStack; - static char altStackMem[SIGSTKSZ]; - - static void handleSignal( int sig ) { - std::string name = ""; - for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { - SignalDefs &def = signalDefs[i]; - if (sig == def.id) { - name = def.name; - break; - } - } - reset(); - reportFatal(name); - raise( sig ); - } - - FatalConditionHandler() { - isSet = true; - stack_t sigStack; - sigStack.ss_sp = altStackMem; - sigStack.ss_size = SIGSTKSZ; - sigStack.ss_flags = 0; - sigaltstack(&sigStack, &oldSigStack); - struct sigaction sa = { 0 }; - - sa.sa_handler = handleSignal; - sa.sa_flags = SA_ONSTACK; - for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { - sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); - } - } - - ~FatalConditionHandler() { - reset(); - } - static void reset() { - if( isSet ) { - // Set signals back to previous values -- hopefully nobody overwrote them in the meantime - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { - sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); - } - // Return the old stack - sigaltstack(&oldSigStack, CATCH_NULL); - isSet = false; - } - } - }; - - bool FatalConditionHandler::isSet = false; - struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; - stack_t FatalConditionHandler::oldSigStack = {}; - char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; - -} // namespace Catch - -# endif // CATCH_CONFIG_POSIX_SIGNALS - -#endif // not Windows - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& _config, Ptr const& reporter ) - : m_runInfo( _config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( CATCH_NULL ), - m_config( _config ), - m_reporter( reporter ), - m_shouldReportUnexpected ( true ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - - do { - ITracker& rootTracker = m_trackerContext.startRun(); - assert( rootTracker.isSectionTracker() ); - static_cast( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); - do { - m_trackerContext.startCycle(); - m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); - } - // !TBD: deprecated - this will be replaced by indexed trackers - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { - deltaTotals.assertions.failed++; - deltaTotals.testCases.passed--; - deltaTotals.testCases.failed++; - } - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = CATCH_NULL; - m_testCaseTracker = CATCH_NULL; - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - // We have no use for the return value (whether messages should be cleared), because messages were made scoped - // and should be let to clear themselves out. - static_cast(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); - if( !sectionTracker.isOpen() ) - return false; - m_activeSections.push_back( §ionTracker ); - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 ) - return false; - if( !m_config->warnAboutMissingAssertions() ) - return false; - if( m_trackerContext.currentTracker().hasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionEndInfo const& endInfo ) { - Counts assertions = m_totals.assertions - endInfo.prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( !m_activeSections.empty() ) { - m_activeSections.back()->close(); - m_activeSections.pop_back(); - } - - m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { - if( m_unfinishedSections.empty() ) - m_activeSections.back()->fail(); - else - m_activeSections.back()->close(); - m_activeSections.pop_back(); - - m_unfinishedSections.push_back( endInfo ); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : std::string(); - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - virtual void exceptionEarlyReported() { - m_shouldReportUnexpected = false; - } - - virtual void handleFatalErrorCondition( std::string const& message ) { - // Don't rebuild the result -- the stringification itself can cause more fatal errors - // Instead, fake a result data. - AssertionResultData tempResult; - tempResult.resultType = ResultWas::FatalErrorCondition; - tempResult.message = message; - AssertionResult result(m_lastAssertionInfo, tempResult); - - getResultCapture().assertionEnded(result); - - handleUnfinishedSections(); - - // Recreate section for test case (as we will lose the one that was in scope) - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - - Counts assertions; - assertions.failed = 1; - SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); - m_reporter->sectionEnded( testCaseSectionStats ); - - TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); - - Totals deltaTotals; - deltaTotals.testCases.failed = 1; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - std::string(), - std::string(), - false ) ); - m_totals.testCases.failed++; - testGroupEnded( std::string(), m_totals, 1, 1 ); - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - m_shouldReportUnexpected = true; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - - seedRng( *m_config ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( Catch::cout(), redirectedCout ); - StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); - invokeActiveTestCase(); - } - else { - invokeActiveTestCase(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions - // are reported without translation at the point of origin. - if (m_shouldReportUnexpected) { - makeUnexpectedResultBuilder().useActiveException(); - } - } - m_testCaseTracker->close(); - handleUnfinishedSections(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - void invokeActiveTestCase() { - FatalConditionHandler fatalConditionHandler; // Handle signals - m_activeTestCase->invoke(); - fatalConditionHandler.reset(); - } - - private: - - ResultBuilder makeUnexpectedResultBuilder() const { - return ResultBuilder( m_lastAssertionInfo.macroName, - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression, - m_lastAssertionInfo.resultDisposition ); - } - - void handleUnfinishedSections() { - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( *it ); - m_unfinishedSections.clear(); - } - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - ITracker* m_testCaseTracker; - ITracker* m_currentSectionTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - std::vector m_activeSections; - TrackerContext m_trackerContext; - bool m_shouldReportUnexpected; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - char const * const _branchName, - unsigned int _buildNumber ); - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const patchNumber; - - // buildNumber is only used if branchName is not null - char const * const branchName; - unsigned int const buildNumber; - - friend std::ostream& operator << ( std::ostream& os, Version const& version ); - - private: - void operator=( Version const& ); - }; - - inline Version libraryVersion(); -} - -#include -#include -#include - -namespace Catch { - - Ptr createReporter( std::string const& reporterName, Ptr const& config ) { - Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); - if( !reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - return reporter; - } - - Ptr makeReporter( Ptr const& config ) { - std::vector reporters = config->getReporterNames(); - if( reporters.empty() ) - reporters.push_back( "console" ); - - Ptr reporter; - for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); - it != itEnd; - ++it ) - reporter = addReporter( reporter, createReporter( *it, config ) ); - return reporter; - } - Ptr addListeners( Ptr const& config, Ptr reporters ) { - IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); - for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); - it != itEnd; - ++it ) - reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); - return reporters; - } - - Totals runTests( Ptr const& config ) { - - Ptr iconfig = config.get(); - - Ptr reporter = makeReporter( config ); - reporter = addListeners( iconfig, reporter ); - - RunContext context( iconfig, reporter ); - - Totals totals; - - context.testGroupStarting( config->name(), 1, 1 ); - - TestSpec testSpec = config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); - for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); - it != itEnd; - ++it ) { - if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) - totals += context.runTest( *it ); - else - reporter->skipTest( *it ); - } - - context.testGroupEnded( iconfig->name(), totals, 1, 1 ); - return totals; - } - - void applyFilenamesAsTags( IConfig const& config ) { - std::vector const& tests = getAllTestCasesSorted( config ); - for(std::size_t i = 0; i < tests.size(); ++i ) { - TestCase& test = const_cast( tests[i] ); - std::set tags = test.tags; - - std::string filename = test.lineInfo.file; - std::string::size_type lastSlash = filename.find_last_of( "\\/" ); - if( lastSlash != std::string::npos ) - filename = filename.substr( lastSlash+1 ); - - std::string::size_type lastDot = filename.find_last_of( "." ); - if( lastDot != std::string::npos ) - filename = filename.substr( 0, lastDot ); - - tags.insert( "#" + filename ); - setTags( test, tags ); - } - } - - class Session : NonCopyable { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - Catch::cerr() << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - Catch::cout() << "\nCatch v" << libraryVersion() << "\n"; - - m_cli.usage( Catch::cout(), processName ); - Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( Catch::cout(), m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char const* const* const argv ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - #if defined(WIN32) && defined(UNICODE) - int run( int argc, wchar_t const* const* const argv ) { - - char **utf8Argv = new char *[ argc ]; - - for ( int i = 0; i < argc; ++i ) { - int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); - - utf8Argv[ i ] = new char[ bufSize ]; - - WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); - } - - int returnCode = applyCommandLine( argc, utf8Argv ); - if( returnCode == 0 ) - returnCode = run(); - - for ( int i = 0; i < argc; ++i ) - delete [] utf8Argv[ i ]; - - delete [] utf8Argv; - - return returnCode; - } - #endif - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - - seedRng( *m_config ); - - if( m_configData.filenamesAsTags ) - applyFilenamesAsTags( *m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runTests( m_config ).assertions.failed ); - } - catch( std::exception& ex ) { - Catch::cerr() << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - struct RandomNumberGenerator { - typedef std::ptrdiff_t result_type; - - result_type operator()( result_type n ) const { return std::rand() % n; } - -#ifdef CATCH_CONFIG_CPP11_SHUFFLE - static constexpr result_type min() { return 0; } - static constexpr result_type max() { return 1000000; } - result_type operator()() const { return std::rand() % max(); } -#endif - template - static void shuffle( V& vector ) { - RandomNumberGenerator rng; -#ifdef CATCH_CONFIG_CPP11_SHUFFLE - std::shuffle( vector.begin(), vector.end(), rng ); -#else - std::random_shuffle( vector.begin(), vector.end(), rng ); -#endif - } - }; - - inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { - - std::vector sorted = unsortedTestCases; - - switch( config.runOrder() ) { - case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end() ); - break; - case RunTests::InRandomOrder: - { - seedRng( config ); - RandomNumberGenerator::shuffle( sorted ); - } - break; - case RunTests::InDeclarationOrder: - // already in declaration order - break; - } - return sorted; - } - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { - return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); - } - - void enforceNoDuplicateTestCases( std::vector const& functions ) { - std::set seenFunctions; - for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); - it != itEnd; - ++it ) { - std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ) { - std::ostringstream ss; - - ss << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - - throw std::runtime_error(ss.str()); - } - } - } - - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { - std::vector filtered; - filtered.reserve( testCases.size() ); - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) - if( matchTest( *it, testSpec, config ) ) - filtered.push_back( *it ); - return filtered; - } - std::vector const& getAllTestCasesSorted( IConfig const& config ) { - return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); - } - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() - : m_currentSortOrder( RunTests::InDeclarationOrder ), - m_unnamedCount( 0 ) - {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name.empty() ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - m_functions.push_back( testCase ); - } - - virtual std::vector const& getAllTests() const { - return m_functions; - } - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { - if( m_sortedFunctions.empty() ) - enforceNoDuplicateTestCases( m_functions ); - - if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { - m_sortedFunctions = sortTests( config, m_functions ); - m_currentSortOrder = config.runOrder(); - } - return m_sortedFunctions; - } - - private: - std::vector m_functions; - mutable RunTests::InWhatOrder m_currentSortOrder; - mutable std::vector m_sortedFunctions; - size_t m_unnamedCount; - std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, '&' ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - void registerTestCase - ( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase - ( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCaseFunction( function, lineInfo, nameAndDesc ); - } - - AutoReg::~AutoReg() {} - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() CATCH_OVERRIDE {} - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return CATCH_NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, Ptr const& factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - void registerListener( Ptr const& factory ) { - m_listeners.push_back( factory ); - } - - virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { - return m_factories; - } - virtual Listeners const& getListeners() const CATCH_OVERRIDE { - return m_listeners; - } - - private: - FactoryMap m_factories; - Listeners m_listeners; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - return tryTranslators(); - } - @catch (NSException *exception) { - return Catch::toString( [exception description] ); - } -#else - return tryTranslators(); -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return "Unknown exception"; - } - } - - std::string tryTranslators() const { - if( m_translators.empty() ) - throw; - else - return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); - } - - private: - std::vector m_translators; - }; -} - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { - return m_exceptionTranslatorRegistry; - } - virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE { - return m_tagAliasRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerListener( factory ); - } - virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE { - m_tagAliasRegistry.add( alias, tag, lineInfo ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - TagAliasRegistry m_tagAliasRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = CATCH_NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = CATCH_NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - FileStream::FileStream( std::string const& filename ) { - m_ofs.open( filename.c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << filename << '\''; - throw std::domain_error( oss.str() ); - } - } - - std::ostream& FileStream::stream() const { - return m_ofs; - } - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - DebugOutStream::DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} - - std::ostream& DebugOutStream::stream() const { - return m_os; - } - - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream::CoutStream() - : m_os( Catch::cout().rdbuf() ) - {} - - std::ostream& CoutStream::stream() const { - return m_os; - } - -#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions - std::ostream& cout() { - return std::cout; - } - std::ostream& cerr() { - return std::cerr; - } -#endif -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: - virtual ~Context() { - deleteAllValues( m_generatorsByTestName ); - } - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : CATCH_NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = CATCH_NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - void cleanUpContext() { - delete currentContext; - currentContext = CATCH_NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -// #included from: catch_errno_guard.hpp -#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED - -#include - -namespace Catch { - - class ErrnoGuard { - public: - ErrnoGuard():m_oldErrno(errno){} - ~ErrnoGuard() { errno = m_oldErrno; } - private: - int m_oldErrno; - }; - -} - -namespace Catch { - namespace { - - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; - - struct NoColourImpl : IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - - } // anon namespace -} // namespace Catch - -#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) -# ifdef CATCH_PLATFORM_WINDOWS -# define CATCH_CONFIG_COLOUR_WINDOWS -# else -# define CATCH_CONFIG_COLOUR_ANSI -# endif -#endif - -#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// - -namespace Catch { -namespace { - - class Win32ColourImpl : public IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); - originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalForegroundAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); - } - HANDLE stdoutHandle; - WORD originalForegroundAttributes; - WORD originalBackgroundAttributes; - }; - - IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = !isDebuggerActive() - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? &s_instance - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0;34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - static IColourImpl* instance() { - static PosixColourImpl s_instance; - return &s_instance; - } - - private: - void setColour( const char* _escapeCode ) { - Catch::cout() << '\033' << _escapeCode; - } - }; - - IColourImpl* platformColourInstance() { - ErrnoGuard guard; - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? PosixColourImpl::instance() - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#else // not Windows or ANSI /////////////////////////////////////////////// - -namespace Catch { - - static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } - -} // end namespace Catch - -#endif // Windows/ ANSI/ None - -namespace Catch { - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - - void Colour::use( Code _colourCode ) { - static IColourImpl* impl = platformColourInstance(); - impl->use( _colourCode ); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( char const * _macroName, - SourceLineInfo const& _lineInfo, - char const * _capturedExpression, - ResultDisposition::Flags _resultDisposition, - char const * _secondArg) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ), - secondArg( _secondArg ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return m_info.capturedExpression[0] != 0; - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) { - return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"') - ? capturedExpression - : std::string(capturedExpression) + ", " + secondArg; - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - else - return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName[0] == 0 ) - return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); - else - return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructExpression(); - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - - void AssertionResult::discardDecomposedExpression() const { - m_resultData.decomposedExpression = CATCH_NULL; - } - - void AssertionResult::expandDecomposedExpression() const { - m_resultData.reconstructExpression(); - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -#include - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( startsWith( tag, '.' ) || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else if( tag == "!nonportable" ) - return TestCaseInfo::NonPortable; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - std::ostringstream ss; - ss << Colour(Colour::Red) - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n" - << Colour(Colour::FileName) - << _lineInfo << '\n'; - throw std::runtime_error(ss.str()); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); - if( prop == TestCaseInfo::IsHidden ) - isHidden = true; - else if( prop == TestCaseInfo::None ) - enforceNotReservedTag( tag, _lineInfo ); - - tags.insert( tag ); - tag.clear(); - inTag = false; - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) - { - testCaseInfo.tags = tags; - testCaseInfo.lcaseTags.clear(); - - std::ostringstream oss; - for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { - oss << '[' << *it << ']'; - std::string lcaseTag = toLower( *it ); - testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); - testCaseInfo.lcaseTags.insert( lcaseTag ); - } - testCaseInfo.tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - lineInfo( _lineInfo ), - properties( None ) - { - setTags( *this, _tags ); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - Version::Version - ( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - char const * const _branchName, - unsigned int _buildNumber ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - patchNumber( _patchNumber ), - branchName( _branchName ), - buildNumber( _buildNumber ) - {} - - std::ostream& operator << ( std::ostream& os, Version const& version ) { - os << version.majorVersion << '.' - << version.minorVersion << '.' - << version.patchNumber; - // branchName is never null -> 0th char is \0 if it is empty - if (version.branchName[0]) { - os << '-' << version.branchName - << '.' << version.buildNumber; - } - return os; - } - - inline Version libraryVersion() { - static Version version( 1, 9, 6, "", 0 ); - return version; - } - -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - if ( !std::uncaught_exception() ){ - getResultCapture().popScopedMessage(m_info); - } - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - virtual void skipTest( TestCaseInfo const& ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } - void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS - -#else - -#include - -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - UInt64 getCurrentTicks() { - static UInt64 hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency( reinterpret_cast( &hz ) ); - QueryPerformanceCounter( reinterpret_cast( &hzo ) ); - } - UInt64 t; - QueryPerformanceCounter( reinterpret_cast( &t ) ); - return ((t-hzo)*1000000)/hz; - } -#else - UInt64 getCurrentTicks() { - timeval t; - gettimeofday(&t,CATCH_NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedMicroseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast(getElapsedMicroseconds()/1000); - } - double Timer::getElapsedSeconds() const { - return getElapsedMicroseconds()/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -#include -#include - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); - } - bool startsWith( std::string const& s, char prefix ) { - return !s.empty() && s[0] == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); - } - bool endsWith( std::string const& s, char suffix ) { - return !s.empty() && s[s.size()-1] == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - char toLowerCh(char c) { - return static_cast( std::tolower( c ) ); - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); - } - - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { - bool replaced = false; - std::size_t i = str.find( replaceThis ); - while( i != std::string::npos ) { - replaced = true; - str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); - if( i < str.size()-withThis.size() ) - i = str.find( replaceThis, i+withThis.size() ); - else - i = std::string::npos; - } - return replaced; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << ' ' << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << 's'; - return os; - } - - SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - bool SourceLineInfo::empty() const { - return file[0] == '\0'; - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); - } - bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { - return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); - } - - void seedRng( IConfig const& config ) { - if( config.rngSeed() != 0 ) - std::srand( config.rngSeed() ); - } - unsigned int rngSeed() { - return getCurrentContext().getConfig()->rngSeed(); - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << '(' << info.line << ')'; -#else - os << info.file << ':' << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << '\''; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 -#endif - Section::~Section() { - if( m_sectionIncluded ) { - SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); - if( std::uncaught_exception() ) - getResultCapture().sectionEndedEarly( endInfo ); - else - getResultCapture().sectionEnded( endInfo ); - } - } -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { - Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(CATCH_PLATFORM_LINUX) - #include - #include - - namespace Catch{ - // The standard POSIX way of detecting a debugger is to attempt to - // ptrace() the process, but this needs to be done from a child and not - // this process itself to still allow attaching to this process later - // if wanted, so is rather heavy. Under Linux we have the PID of the - // "debugger" (which doesn't need to be gdb, of course, it could also - // be strace, for example) in /proc/$PID/status, so just get it from - // there instead. - bool isDebuggerActive(){ - // Libstdc++ has a bug, where std::ifstream sets errno to 0 - // This way our users can properly assert over errno values - ErrnoGuard guard; - std::ifstream in("/proc/self/status"); - for( std::string line; std::getline(in, line); ) { - static const int PREFIX_LEN = 11; - if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { - // We're traced if the PID is not 0 and no other PID starts - // with 0 digit, so it's enough to check for just a single - // character. - return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; - } - } - - return false; - } - } // namespace Catch -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - Catch::cout() << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - const std::string unprintableString = "{?}"; - - namespace { - const int hexThreshold = 255; - - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return '"' + s + '"'; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return Catch::toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( const wchar_t* const value ) -{ - return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); -} - -std::string toString( wchar_t* const value ) -{ - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return Catch::toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + 'f'; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - if ( value == '\r' ) - return "'\\r'"; - if ( value == '\f' ) - return "'\\f'"; - if ( value == '\n' ) - return "'\\n'"; - if ( value == '\t' ) - return "'\\t'"; - if ( '\0' <= value && value < ' ' ) - return toString( static_cast( value ) ); - char chstr[] = "' '"; - chstr[1] = value; - return chstr; -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} -std::string toString( unsigned long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ')'; - return oss.str(); -} -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ), - m_guardException( false ) - { - m_stream().oss.str(""); - } - - ResultBuilder::~ResultBuilder() { -#if defined(CATCH_CONFIG_FAST_COMPILE) - if ( m_guardException ) { - m_stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; - captureResult( ResultWas::ThrewException ); - getCurrentContext().getResultCapture()->exceptionEarlyReported(); - } -#endif - } - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - - void ResultBuilder::endExpression( DecomposedExpression const& expr ) { - AssertionResult result = build( expr ); - handleResult( result ); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream().oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - - void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { - if( expectedMessage.empty() ) - captureExpectedException( Matchers::Impl::MatchAllOf() ); - else - captureExpectedException( Matchers::Equals( expectedMessage ) ); - } - - void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase const& matcher ) { - - assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); - AssertionResultData data = m_data; - data.resultType = ResultWas::Ok; - data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); - - std::string actualMessage = Catch::translateActiveException(); - if( !matcher.match( actualMessage ) ) { - data.resultType = ResultWas::ExpressionFailed; - data.reconstructedExpression = actualMessage; - } - AssertionResult result( m_assertionInfo, data ); - handleResult( result ); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - handleResult( result ); - } - - void ResultBuilder::handleResult( AssertionResult const& result ) - { - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) - m_shouldThrow = true; - } - } - - void ResultBuilder::react() { -#if defined(CATCH_CONFIG_FAST_COMPILE) - if (m_shouldDebugBreak) { - /////////////////////////////////////////////////////////////////// - // To inspect the state during test, you need to go one level up the callstack - // To go back to the test and change execution, jump over the throw statement - /////////////////////////////////////////////////////////////////// - CATCH_BREAK_INTO_DEBUGGER(); - } -#endif - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - return build( *this ); - } - - // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, - // a temporary DecomposedExpression, which in turn holds references to - // operands, possibly temporary as well. - // It should immediately be passed to handleResult; if the expression - // needs to be reported, its string expansion must be composed before - // the temporaries are destroyed. - AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const - { - assert( m_data.resultType != ResultWas::Unknown ); - AssertionResultData data = m_data; - - // Flip bool results if FalseTest flag is set - if( isFalseTest( m_assertionInfo.resultDisposition ) ) { - data.negate( expr.isBinaryExpression() ); - } - - data.message = m_stream().oss.str(); - data.decomposedExpression = &expr; // for lazy reconstruction - return AssertionResult( m_assertionInfo, data ); - } - - void ResultBuilder::reconstructExpression( std::string& dest ) const { - dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); - } - - void ResultBuilder::setExceptionGuard() { - m_guardException = true; - } - void ResultBuilder::unsetExceptionGuard() { - m_guardException = false; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { - std::ostringstream oss; - oss << Colour( Colour::Red ) - << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" - << Colour( Colour::FileName ) - << lineInfo << '\n'; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << Colour( Colour::Red ) - << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " - << Colour( Colour::Red ) << find(alias)->lineInfo << '\n' - << Colour( Colour::Red ) << "\tRedefined at " - << Colour( Colour::FileName) << lineInfo << '\n'; - throw std::domain_error( oss.str().c_str() ); - } - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - - ITagAliasRegistry const& ITagAliasRegistry::get() { - return getRegistryHub().getTagAliasRegistry(); - } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo ); - } - -} // end namespace Catch - -// #included from: catch_matchers_string.hpp - -namespace Catch { -namespace Matchers { - - namespace StdString { - - CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_str( adjustString( str ) ) - {} - std::string CasedString::adjustString( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No - ? toLower( str ) - : str; - } - std::string CasedString::caseSensitivitySuffix() const { - return m_caseSensitivity == CaseSensitive::No - ? " (case insensitive)" - : std::string(); - } - - StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) - : m_comparator( comparator ), - m_operation( operation ) { - } - - std::string StringMatcherBase::describe() const { - std::string description; - description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + - m_comparator.caseSensitivitySuffix().size()); - description += m_operation; - description += ": \""; - description += m_comparator.m_str; - description += "\""; - description += m_comparator.caseSensitivitySuffix(); - return description; - } - - EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} - - bool EqualsMatcher::match( std::string const& source ) const { - return m_comparator.adjustString( source ) == m_comparator.m_str; - } - - ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} - - bool ContainsMatcher::match( std::string const& source ) const { - return contains( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} - - bool StartsWithMatcher::match( std::string const& source ) const { - return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} - - bool EndsWithMatcher::match( std::string const& source ) const { - return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } - - } // namespace StdString - - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } - -} // namespace Matchers -} // namespace Catch -// #included from: ../reporters/catch_reporter_multi.hpp -#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED - -namespace Catch { - -class MultipleReporters : public SharedImpl { - typedef std::vector > Reporters; - Reporters m_reporters; - -public: - void add( Ptr const& reporter ) { - m_reporters.push_back( reporter ); - } - -public: // IStreamingReporter - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporters[0]->getPreferences(); - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->noMatchingTestCases( spec ); - } - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunStarting( testRunInfo ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseStarting( testInfo ); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionStarting( sectionInfo ); - } - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->assertionStarting( assertionInfo ); - } - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - bool clearBuffer = false; - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - clearBuffer |= (*it)->assertionEnded( assertionStats ); - return clearBuffer; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionEnded( sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupEnded( testGroupStats ); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunEnded( testRunStats ); - } - - virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->skipTest( testInfo ); - } - - virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { - return this; - } - -}; - -Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { - Ptr resultingReporter; - - if( existingReporter ) { - MultipleReporters* multi = existingReporter->tryAsMulti(); - if( !multi ) { - multi = new MultipleReporters; - resultingReporter = Ptr( multi ); - if( existingReporter ) - multi->add( existingReporter ); - } - else - resultingReporter = existingReporter; - multi->add( additionalReporter ); - } - else - resultingReporter = additionalReporter; - - return resultingReporter; -} - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - namespace { - // Because formatting using c++ streams is stateful, drop down to C is required - // Alternatively we could use stringstream, but its performance is... not good. - std::string getFormattedDuration( double duration ) { - // Max exponent + 1 is required to represent the whole part - // + 1 for decimal point - // + 3 for the 3 decimal places - // + 1 for null terminator - const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; - char buffer[maxDoubleSize]; - - // Save previous errno, to prevent sprintf from overwriting it - ErrnoGuard guard; -#ifdef _MSC_VER - sprintf_s(buffer, "%.3f", duration); -#else - sprintf(buffer, "%.3f", duration); -#endif - return std::string(buffer); - } - } - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual ~StreamingReporterBase() CATCH_OVERRIDE; - - virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { - // Don't do anything with this by default. - // It can optionally be overridden in the derived class. - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - ReporterPreferences m_reporterPrefs; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - ~CumulativeReporterBase(); - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} - virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} - - virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - // AssertionResult holds a pointer to a temporary DecomposedExpression, - // which getExpandedExpression() calls to build the expression string. - // Our section stack copy of the assertionResult will likely outlive the - // temporary, so it must be expanded or discarded now to avoid calling - // a destroyed object later. - prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void prepareExpandedExpression( AssertionResult& result ) const { - if( result.isOk() ) - result.discardDecomposedExpression(); - else - result.expandDecomposedExpression(); - } - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - ReporterPreferences m_reporterPrefs; - - }; - - template - char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - struct TestEventListenerBase : StreamingReporterBase { - TestEventListenerBase( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { - return false; - } - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public SharedImpl { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ListenerRegistrar { - - class ListenerFactory : public SharedImpl { - - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - virtual std::string getDescription() const { - return std::string(); - } - }; - - public: - - ListenerRegistrar() { - getMutableRegistryHub().registerListener( new ListenerFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -// Deprecated - use the form without INTERNAL_ -#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -#define CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlEncode { - public: - enum ForWhat { ForTextNodes, ForAttributes }; - - XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) - : m_str( str ), - m_forWhat( forWhat ) - {} - - void encodeTo( std::ostream& os ) const { - - // Apostrophe escaping not necessary if we always use " to write attributes - // (see: http://www.w3.org/TR/xml/#syntax) - - for( std::size_t i = 0; i < m_str.size(); ++ i ) { - char c = m_str[i]; - switch( c ) { - case '<': os << "<"; break; - case '&': os << "&"; break; - - case '>': - // See: http://www.w3.org/TR/xml/#syntax - if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) - os << ">"; - else - os << c; - break; - - case '\"': - if( m_forWhat == ForAttributes ) - os << """; - else - os << c; - break; - - default: - // Escape control chars - based on contribution by @espenalb in PR #465 and - // by @mrpi PR #588 - if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) { - // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 - os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) - << static_cast( c ); - } - else - os << c; - } - } - } - - friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { - xmlEncode.encodeTo( os ); - return os; - } - - private: - std::string m_str; - ForWhat m_forWhat; - }; - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = CATCH_NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( Catch::cout() ) - { - writeDeclaration(); - } - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( os ) - { - writeDeclaration(); - } - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - m_os << m_indent << '<' << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - m_os << "/>"; - m_tagIsOpen = false; - } - else { - m_os << m_indent << ""; - } - m_os << std::endl; - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) - m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - std::ostringstream oss; - oss << attribute; - return writeAttribute( name, oss.str() ); - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - m_os << m_indent; - m_os << XmlEncode( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - m_os << m_indent << ""; - m_needsNewline = true; - return *this; - } - - void writeStylesheetRef( std::string const& url ) { - m_os << "\n"; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - m_os << '\n'; - return *this; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - m_os << ">" << std::endl; - m_tagIsOpen = false; - } - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - void writeDeclaration() { - m_os << "\n"; - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - m_os << std::endl; - m_needsNewline = false; - } - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream& m_os; - }; - -} - -namespace Catch { - class XmlReporter : public StreamingReporterBase { - public: - XmlReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_xml(_config.stream()), - m_sectionDepth( 0 ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~XmlReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - - virtual std::string getStylesheetRef() const { - return std::string(); - } - - void writeSourceInfo( SourceLineInfo const& sourceInfo ) { - m_xml - .writeAttribute( "filename", sourceInfo.file ) - .writeAttribute( "line", sourceInfo.line ); - } - - public: // StreamingReporterBase - - virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { - StreamingReporterBase::noMatchingTestCases( s ); - } - - virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testRunStarting( testInfo ); - std::string stylesheetRef = getStylesheetRef(); - if( !stylesheetRef.empty() ) - m_xml.writeStylesheetRef( stylesheetRef ); - m_xml.startElement( "Catch" ); - if( !m_config->name().empty() ) - m_xml.writeAttribute( "name", m_config->name() ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupStarting( groupInfo ); - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupInfo.name ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseStarting(testInfo); - m_xml.startElement( "TestCase" ) - .writeAttribute( "name", trim( testInfo.name ) ) - .writeAttribute( "description", testInfo.description ) - .writeAttribute( "tags", testInfo.tagsAsString ); - - writeSourceInfo( testInfo.lineInfo ); - - if ( m_config->showDurations() == ShowDurations::Always ) - m_testCaseTimer.start(); - m_xml.ensureTagClosed(); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - StreamingReporterBase::sectionStarting( sectionInfo ); - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionInfo.name ) ) - .writeAttribute( "description", sectionInfo.description ); - writeSourceInfo( sectionInfo.lineInfo ); - m_xml.ensureTagClosed(); - } - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - - AssertionResult const& result = assertionStats.assertionResult; - - bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); - - if( includeResults ) { - // Print any info messages in tags. - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - m_xml.scopedElement( "Info" ) - .writeText( it->message ); - } else if ( it->type == ResultWas::Warning ) { - m_xml.scopedElement( "Warning" ) - .writeText( it->message ); - } - } - } - - // Drop out if result was successful but we're not printing them. - if( !includeResults && result.getResultType() != ResultWas::Warning ) - return true; - - // Print the expression if there is one. - if( result.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", result.succeeded() ) - .writeAttribute( "type", result.getTestMacroName() ); - - writeSourceInfo( result.getSourceInfo() ); - - m_xml.scopedElement( "Original" ) - .writeText( result.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( result.getExpandedExpression() ); - } - - // And... Print a result applicable to each result type. - switch( result.getResultType() ) { - case ResultWas::ThrewException: - m_xml.startElement( "Exception" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - case ResultWas::FatalErrorCondition: - m_xml.startElement( "FatalErrorCondition" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( result.getMessage() ); - break; - case ResultWas::Warning: - // Warning will already have been written - break; - case ResultWas::ExplicitFailure: - m_xml.startElement( "Failure" ); - writeSourceInfo( result.getSourceInfo() ); - m_xml.writeText( result.getMessage() ); - m_xml.endElement(); - break; - default: - break; - } - - if( result.hasExpression() ) - m_xml.endElement(); - - return true; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - StreamingReporterBase::sectionEnded( sectionStats ); - if( --m_sectionDepth > 0 ) { - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); - e.writeAttribute( "successes", sectionStats.assertions.passed ); - e.writeAttribute( "failures", sectionStats.assertions.failed ); - e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); - - m_xml.endElement(); - } - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( testCaseStats ); - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); - e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); - - if( !testCaseStats.stdOut.empty() ) - m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); - if( !testCaseStats.stdErr.empty() ) - m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); - - m_xml.endElement(); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupEnded( testGroupStats ); - // TODO: Check testGroupStats.aborting and act accordingly. - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) - .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - StreamingReporterBase::testRunEnded( testRunStats ); - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testRunStats.totals.assertions.passed ) - .writeAttribute( "failures", testRunStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - private: - Timer m_testCaseTimer; - XmlWriter m_xml; - int m_sectionDepth; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - namespace { - std::string getCurrentTimestamp() { - // Beware, this is not reentrant because of backward compatibility issues - // Also, UTC only, again because of backward compatibility (%z is C++11) - time_t rawtime; - std::time(&rawtime); - const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); - -#ifdef _MSC_VER - std::tm timeInfo = {}; - gmtime_s(&timeInfo, &rawtime); -#else - std::tm* timeInfo; - timeInfo = std::gmtime(&rawtime); -#endif - - char timeStamp[timeStampSize]; - const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; - -#ifdef _MSC_VER - std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); -#else - std::strftime(timeStamp, timeStampSize, fmt, timeInfo); -#endif - return std::string(timeStamp); - } - - } - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ), - m_okToFail( false ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~JunitReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE { - m_okToFail = testCaseInfo.okToFail(); - } - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() CATCH_OVERRIDE { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", getCurrentTimestamp() ); - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + '/' + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - case ResultWas::FatalErrorCondition: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << '\n'; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << '\n'; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - bool m_okToFail; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -#include -#include - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter() CATCH_OVERRIDE; - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - stream << "No test cases matched '" << spec << '\'' << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { - AssertionResult const& result = _assertionStats.assertionResult; - - bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); - - // Drop out if result was successful but we're not printing them. - if( !includeResults && result.getResultType() != ResultWas::Warning ) - return false; - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, includeResults ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_config->showDurations() == ShowDurations::Always ) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; - } - if( m_headerPrinted ) { - m_headerPrinted = false; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << '\n' << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with "; - if (_stats.infoMessages.size() == 1) - messageLabel += "message"; - if (_stats.infoMessages.size() > 1) - messageLabel += "messages"; - break; - case ResultWas::FatalErrorCondition: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to a fatal error condition"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << '\n'; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << '\n'; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << '\n'; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ':' << '\n'; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << '\n' << getLineOfChars<'~'>() << '\n'; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion() << " host application.\n" - << "Run with -? for options\n\n"; - - if( m_config->rngSeed() != 0 ) - stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << '\n'; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << '\n'; - } - stream << getLineOfChars<'.'>() << '\n' << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << '\n'; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << '\n'; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << '\n'; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = ' ' + *it; - while( it->size() > row.size() ) - row = ' ' + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ')' - << '\n'; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << ' ' << it->label; - } - } - stream << '\n'; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << '\n'; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << '\n'; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << '\'' << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) {} - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE { - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; - } - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << '\n' << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::FatalErrorCondition: - printResultType( Colour::Error, failedString() ); - printIssue( "fatal error condition with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ':'; - } - - void printResultType( Colour::Code colour, std::string const& passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << ' ' << passOrFail; - } - stream << ':'; - } - } - - void printIssue( std::string const& issue ) const { - stream << ' ' << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ';'; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << ' ' << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << '\''; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ':'; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << '\''; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? std::string() : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : std::string(); - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << '.'; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - // These are all here to avoid warnings about not having any out of line - // virtual methods - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - IStream::~IStream() CATCH_NOEXCEPT {} - FileStream::~FileStream() CATCH_NOEXCEPT {} - CoutStream::~CoutStream() CATCH_NOEXCEPT {} - DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - WildcardPattern::~WildcardPattern() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {} - - void Config::dummy() {} - - namespace TestCaseTracking { - ITracker::~ITracker() {} - TrackerBase::~TrackerBase() {} - SectionTracker::~SectionTracker() {} - IndexTracker::~IndexTracker() {} - } -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) -// Standard C/C++ Win32 Unicode wmain entry point -extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { -#else -// Standard C/C++ main entry point -int main (int argc, char * argv[]) { -#endif - - int result = Catch::Session().run( argc, argv ); - return ( result < 0xff ? result : 0xff ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return ( result < 0xff ? result : 0xff ); -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#else -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#endif - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) -#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) - -#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#else -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#endif - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) - #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) - #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) - -#else -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#endif - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) -#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) - -#if defined(CATCH_CONFIG_FAST_COMPILE) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#else -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) -#endif - -#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) -#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) -#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) -#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) -#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) -#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) -#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) -#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) -#else -#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) - #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) -#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) -#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) -#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) -#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) - -using Catch::Detail::Approx; - -// #included from: internal/catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(pop) -# else -# pragma clang diagnostic pop -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic pop -#endif - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/geom_matching/wasserstein/include/def_debug_ws.h b/geom_matching/wasserstein/include/def_debug_ws.h deleted file mode 100644 index 791ce1d..0000000 --- a/geom_matching/wasserstein/include/def_debug_ws.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef DEF_DEBUG_WS_H -#define DEF_DEBUG_WS_H - -//#define DEBUG_BOUND_MATCH -//#define DEBUG_NEIGHBOUR_ORACLE -//#define DEBUG_MATCHING -//#define DEBUG_AUCTION -// This symbol should be defined only in the version -// for R package TDA, to comply with some CRAN rules -// like no usage of cout, cerr, cin, exit, etc. -//#define FOR_R_TDA -// -//#define DEBUG_KDTREE_RESTR_ORACLE -//#define DEBUG_STUPID_SPARSE_RESTR_ORACLE -//#define DEBUG_FR_AUCTION - -#endif diff --git a/geom_matching/wasserstein/include/diagonal_heap.h b/geom_matching/wasserstein/include/diagonal_heap.h deleted file mode 100644 index 3b3c8bc..0000000 --- a/geom_matching/wasserstein/include/diagonal_heap.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef DIAGONAL_HEAP_H -#define DIAGONAL_HEAP_H - -//#define USE_BOOST_HEAP - -#include -#include -#include -#include - -#ifdef USE_BOOST_HEAP -#include -#endif - -#include "basic_defs_ws.h" - -namespace hera { -namespace ws { - -template -struct CompPairsBySecondLexStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second < b.second or (a.second == b.second and a.first > b.first); - } -}; - - -template -struct CompPairsBySecondGreaterStruct { - bool operator()(const IdxValPair& a, const IdxValPair& b) const - { - return a.second > b.second; - } -}; - -#ifdef USE_BOOST_HEAP -template -using LossesHeapOld = boost::heap::d_ary_heap, boost::heap::arity<2>, boost::heap::mutable_, boost::heap::compare>>; -#else -template -class IdxValHeap { -public: - using InternalKeeper = std::set, ComparisonStruct>; - using handle_type = typename InternalKeeper::iterator; - using const_handle_type = typename InternalKeeper::const_iterator; - // methods - handle_type push(const IdxValPair& val) - { - auto res_pair = _heap.insert(val); - assert(res_pair.second); - assert(res_pair.first != _heap.end()); - return res_pair.first; - } - - void decrease(handle_type& handle, const IdxValPair& new_val) - { - _heap.erase(handle); - handle = push(new_val); - } - - void increase(handle_type& handle, const IdxValPair& new_val) - { - _heap.erase(handle); - handle = push(new_val); - } - - size_t size() const - { - return _heap.size(); - } - - handle_type ordered_begin() - { - return _heap.begin(); - } - - handle_type ordered_end() - { - return _heap.end(); - } - - const_handle_type ordered_begin() const - { - return _heap.cbegin(); - } - - const_handle_type ordered_end() const - { - return _heap.cend(); - } - - -private: - std::set, ComparisonStruct> _heap; -}; - -// if we store losses, the minimal value should come first -template -using LossesHeapOld = IdxValHeap>; -#endif - -template -inline std::string losses_heap_to_string(const LossesHeapOld& h) -{ - std::stringstream result; - result << "["; - for(auto iter = h.ordered_begin(); iter != h.ordered_end(); ++iter) { - result << *iter; - if (std::next(iter) != h.ordered_end()) { - result << ", "; - } - } - result << "]"; - return result.str(); -} - -} // ws -} // hera - -#endif // DIAGONAL_HEAP_H diff --git a/geom_matching/wasserstein/include/diagram_reader.h b/geom_matching/wasserstein/include/diagram_reader.h deleted file mode 100644 index b52fcbd..0000000 --- a/geom_matching/wasserstein/include/diagram_reader.h +++ /dev/null @@ -1,447 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -Copyright (c) 2018, G. Spreemann -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - -*/ - -#ifndef HERA_DIAGRAM_READER_H -#define HERA_DIAGRAM_READER_H - -#ifndef FOR_R_TDA -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "basic_defs_ws.hpp" - -#ifdef WASSERSTEIN_PURE_GEOM -#include "dnn/geometry/euclidean-dynamic.h" -#endif - -namespace hera { - -// cannot choose stod, stof or stold based on RealType, -// lazy solution: partial specialization -template -inline RealType parse_real_from_str(const std::string& s); - -template <> -inline double parse_real_from_str(const std::string& s) -{ - return std::stod(s); -} - - -template <> -inline long double parse_real_from_str(const std::string& s) -{ - return std::stold(s); -} - - -template <> -inline float parse_real_from_str(const std::string& s) -{ - return std::stof(s); -} - - -template -inline RealType parse_real_from_str(const std::string& s) -{ - static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above"); -} - -// fill in result with points from file fname -// return false if file can't be opened -// or error occurred while reading -// decPrecision is the maximal decimal precision in the input, -// it is zero if all coordinates in the input are integers -template>> -inline bool read_diagram_point_set(const char* fname, ContType_& result, int& decPrecision) -{ - size_t lineNumber { 0 }; - result.clear(); - std::ifstream f(fname); - if (!f.good()) { -#ifndef FOR_R_TDA - std::cerr << "Cannot open file " << fname << std::endl; -#endif - return false; - } - std::locale loc; - std::string line; - while(std::getline(f, line)) { - lineNumber++; - // process comments: remove everything after hash - auto hashPos = line.find_first_of("#", 0); - if( std::string::npos != hashPos) { - line = std::string(line.begin(), line.begin() + hashPos); - } - if (line.empty()) { - continue; - } - // trim whitespaces - auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); - auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); - if (whiteSpaceBack <= whiteSpaceFront) { - // line consists of spaces only - move to the next line - continue; - } - line = std::string(whiteSpaceFront,whiteSpaceBack); - - // transform line to lower case - // to parse Infinity - for(auto& c : line) { - c = std::tolower(c, loc); - } - - bool fracPart = false; - int currDecPrecision = 0; - for(auto c : line) { - if (c == '.') { - fracPart = true; - } else if (fracPart) { - if (isdigit(c)) { - currDecPrecision++; - } else { - fracPart = false; - if (currDecPrecision > decPrecision) - decPrecision = currDecPrecision; - currDecPrecision = 0; - } - } - } - - RealType x, y; - std::string str_x, str_y; - std::istringstream iss(line); - try { - iss >> str_x >> str_y; - - x = parse_real_from_str(str_x); - y = parse_real_from_str(str_y); - - if (x != y) { - result.push_back(std::make_pair(x, y)); - } else { -#ifndef FOR_R_TDA - std::cerr << "Warning: point with 0 persistence ignored in " << fname << ":" << lineNumber << "\n"; -#endif - } - } - catch (const std::invalid_argument& e) { -#ifndef FOR_R_TDA - std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; -#endif - return false; - } - catch (const std::out_of_range&) { -#ifndef FOR_R_TDA - std::cerr << "Error while reading file " << fname << ", line number " << lineNumber << ": value too large in \"" << line << "\"" << std::endl; -#endif - return false; - } - } - f.close(); - return true; -} - - -// wrappers -template>> -inline bool read_diagram_point_set(const std::string& fname, ContType_& result, int& decPrecision) -{ - return read_diagram_point_set(fname.c_str(), result, decPrecision); -} - -// these two functions are now just wrappers for the previous ones, -// in case someone needs them; decPrecision is ignored -template>> -inline bool read_diagram_point_set(const char* fname, ContType_& result) -{ - int decPrecision; - return read_diagram_point_set(fname, result, decPrecision); -} - -template>> -inline bool read_diagram_point_set(const std::string& fname, ContType_& result) -{ - int decPrecision; - return read_diagram_point_set(fname.c_str(), result, decPrecision); -} - -template > > -inline bool read_diagram_dipha(const std::string& fname, unsigned int dim, ContType_& result) -{ - std::ifstream file; - file.open(fname, std::ios::in | std::ios::binary); - - if (!file.is_open()) { -#ifndef FOR_R_TDA - std::cerr << "Could not open file " << fname << "." << std::endl; -#endif - return false; - } - - if (read_le(file) != DIPHA_MAGIC) { -#ifndef FOR_R_TDA - std::cerr << "File " << fname << " is not a valid DIPHA file." << std::endl; -#endif - file.close(); - return false; - } - - if (read_le(file) != DIPHA_PERSISTENCE_DIAGRAM) { -#ifndef FOR_R_TDA - std::cerr << "File " << fname << " is not a valid DIPHA persistence diagram file." << std::endl; -#endif - file.close(); - return false; - } - - result.clear(); - - int n = read_le(file); - - for (int i = 0; i < n; ++i) { - int tmp_d = read_le(file); - double birth = read_le(file); - double death = read_le(file); - - if (death < birth) { -#ifndef FOR_R_TDA - std::cerr << "File " << fname << " is malformed." << std::endl; -#endif - file.close(); - return false; - } - - int d = 0; - if (tmp_d < 0) { - d = -tmp_d - 1; - death = std::numeric_limits::infinity(); - } else - d = tmp_d; - - if ((unsigned int)d == dim) { - if (death == birth) { -#ifndef FOR_R_TDA - std::cerr << "Warning: point with 0 persistence ignored in " << fname << "." << std::endl; -#endif - } else { - result.push_back(std::make_pair(birth, death)); - } - } - } - - file.close(); - - return true; -} - - -template -inline void remove_duplicates(ContType& dgm_A, ContType& dgm_B) -{ - std::map, int> map_A, map_B; - // copy points to maps - for(const auto& ptA : dgm_A) { - map_A[ptA]++; - } - for(const auto& ptB : dgm_B) { - map_B[ptB]++; - } - // clear vectors - dgm_A.clear(); - dgm_B.clear(); - // remove duplicates from maps - // loop over the smaller one - if (map_A.size() <= map_B.size()) { - for(auto& point_multiplicity_pair : map_A) { - auto iter_B = map_B.find(point_multiplicity_pair.first); - if (iter_B != map_B.end()) { - int duplicate_multiplicity = std::min(point_multiplicity_pair.second, iter_B->second); - point_multiplicity_pair.second -= duplicate_multiplicity; - iter_B->second -= duplicate_multiplicity; - } - } - } else { - for(auto& point_multiplicity_pair : map_B) { - auto iter_A = map_A.find(point_multiplicity_pair.first); - if (iter_A != map_A.end()) { - int duplicate_multiplicity = std::min(point_multiplicity_pair.second, iter_A->second); - point_multiplicity_pair.second -= duplicate_multiplicity; - iter_A->second -= duplicate_multiplicity; - } - } - } - // copy points back to vectors - for(const auto& pointMultiplicityPairA : map_A) { - assert( pointMultiplicityPairA.second >= 0); - for(int i = 0; i < pointMultiplicityPairA.second; ++i) { - dgm_A.push_back(pointMultiplicityPairA.first); - } - } - - for(const auto& pointMultiplicityPairB : map_B) { - assert( pointMultiplicityPairB.second >= 0); - for(int i = 0; i < pointMultiplicityPairB.second; ++i) { - dgm_B.push_back(pointMultiplicityPairB.first); - } - } -} - - -#ifdef WASSERSTEIN_PURE_GEOM - -template -inline int get_point_dimension(const std::string& line) -{ - Real x; - int dim = 0; - std::istringstream iss(line); - while(iss >> x) { - dim++; - } - return dim; -} - - -template -inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector& result, int& dimension, int& decPrecision) -{ - using DynamicPointTraitsR = typename hera::ws::dnn::DynamicPointTraits; - - size_t lineNumber { 0 }; - result.clear(); - std::ifstream f(fname); - if (!f.good()) { -#ifndef FOR_R_TDA - std::cerr << "Cannot open file " << fname << std::endl; -#endif - return false; - } - std::string line; - DynamicPointTraitsR traits; - bool dim_computed = false; - int point_idx = 0; - while(std::getline(f, line)) { - lineNumber++; - // process comments: remove everything after hash - auto hashPos = line.find_first_of("#", 0); - if( std::string::npos != hashPos) { - line = std::string(line.begin(), line.begin() + hashPos); - } - if (line.empty()) { - continue; - } - // trim whitespaces - auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); - auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); - if (whiteSpaceBack <= whiteSpaceFront) { - // line consists of spaces only - move to the next line - continue; - } - - line = std::string(whiteSpaceFront,whiteSpaceBack); - - if (not dim_computed) { - dimension = get_point_dimension(line); - traits = hera::ws::dnn::DynamicPointTraits(dimension); - result = traits.container(); - result.clear(); - dim_computed = true; - } - - bool fracPart = false; - int currDecPrecision = 0; - for(auto c : line) { - if (c == '.') { - fracPart = true; - } else if (fracPart) { - if (isdigit(c)) { - currDecPrecision++; - } else { - fracPart = false; - if (currDecPrecision > decPrecision) - decPrecision = currDecPrecision; - currDecPrecision = 0; - } - } - } - - result.resize(result.size() + 1); - RealType x; - std::istringstream iss(line); - for(int d = 0; d < dimension; ++d) { - if (not(iss >> x)) { -#ifndef FOR_R_TDA - std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; -#endif - return false; - } - result[point_idx][d] = x; - } - point_idx++; - } - f.close(); - return true; -} - -// wrappers -template -inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector& result, int& dimension) -{ - int dec_precision; - return read_point_cloud(fname, result, dimension, dec_precision); -} - -template -inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector& result, int& dimension, int& dec_precision) -{ - return read_point_cloud(fname.c_str(), result, dimension, dec_precision); -} - -template -inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector& result, int& dimension) -{ - return read_point_cloud(fname.c_str(), result, dimension); -} - -#endif // WASSERSTEIN_PURE_GEOM - -} // end namespace hera -#endif // HERA_DIAGRAM_READER_H diff --git a/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h b/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h deleted file mode 100644 index b003906..0000000 --- a/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h +++ /dev/null @@ -1,270 +0,0 @@ -#ifndef DNN_GEOMETRY_EUCLIDEAN_DYNAMIC_H -#define DNN_GEOMETRY_EUCLIDEAN_DYNAMIC_H - -#include -#include -#include -#include -#include -#include - -#include "hera_infinity.h" - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - -template -class DynamicPointVector -{ - public: - using Real = Real_; - struct PointType - { - void* p; - - Real& operator[](const int i) - { - return (static_cast(p))[i]; - } - - const Real& operator[](const int i) const - { - return (static_cast(p))[i]; - } - - }; - struct iterator; - typedef iterator const_iterator; - - public: - DynamicPointVector(size_t point_capacity = 0): - point_capacity_(point_capacity) {} - - - PointType operator[](size_t i) const { return {(void*) &storage_[i*point_capacity_]}; } - inline void push_back(PointType p); - - inline iterator begin(); - inline iterator end(); - inline const_iterator begin() const; - inline const_iterator end() const; - - size_t size() const { return storage_.size() / point_capacity_; } - - void clear() { storage_.clear(); } - void swap(DynamicPointVector& other) { storage_.swap(other.storage_); std::swap(point_capacity_, other.point_capacity_); } - void reserve(size_t sz) { storage_.reserve(sz * point_capacity_); } - void resize(size_t sz) { storage_.resize(sz * point_capacity_); } - - private: - size_t point_capacity_; - std::vector storage_; - - private: - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) { ar & point_capacity_ & storage_; } -}; - -template -struct DynamicPointTraits -{ - typedef DynamicPointVector PointContainer; - typedef typename PointContainer::PointType PointType; - struct PointHandle - { - void* p; - bool operator==(const PointHandle& other) const { return p == other.p; } - bool operator!=(const PointHandle& other) const { return !(*this == other); } - bool operator<(const PointHandle& other) const { return p < other.p; } - bool operator>(const PointHandle& other) const { return p > other.p; } - }; - - typedef Real Coordinate; - typedef Real DistanceType; - - DynamicPointTraits(unsigned dim = 0): - dim_(dim) {} - - DistanceType distance(PointType p1, PointType p2) const - { - Real result = 0.0; - if (hera::is_infinity(internal_p)) { - // max norm - for (unsigned i = 0; i < dimension(); ++i) - result = std::max(result, fabs(coordinate(p1,i) - coordinate(p2,i))); - } else if (internal_p == Real(1.0)) { - // l1-norm - for (unsigned i = 0; i < dimension(); ++i) - result += fabs(coordinate(p1,i) - coordinate(p2,i)); - } else if (internal_p == Real(2.0)) { - result = sqrt(sq_distance(p1,p2)); - } else { - assert(internal_p > 1.0); - for (unsigned i = 0; i < dimension(); ++i) - result += std::pow(fabs(coordinate(p1,i) - coordinate(p2,i)), internal_p); - result = std::pow(result, Real(1.0) / internal_p); - } - return result; - } - DistanceType distance(PointHandle p1, PointHandle p2) const { return distance(PointType({p1.p}), PointType({p2.p})); } - DistanceType sq_distance(PointType p1, PointType p2) const { Real res = 0; for (unsigned i = 0; i < dimension(); ++i) { Real c1 = coordinate(p1,i), c2 = coordinate(p2,i); res += (c1 - c2)*(c1 - c2); } return res; } - DistanceType sq_distance(PointHandle p1, PointHandle p2) const { return sq_distance(PointType({p1.p}), PointType({p2.p})); } - unsigned dimension() const { return dim_; } - Real& coordinate(PointType p, unsigned i) const { return ((Real*) p.p)[i]; } - Real& coordinate(PointHandle h, unsigned i) const { return ((Real*) h.p)[i]; } - - // it's non-standard to return a reference, but we can rely on it for code that assumes this particular point type - size_t& id(PointType p) const { return *((size_t*) ((Real*) p.p + dimension())); } - size_t& id(PointHandle h) const { return *((size_t*) ((Real*) h.p + dimension())); } - PointHandle handle(PointType p) const { return {p.p}; } - PointType point(PointHandle h) const { return {h.p}; } - - void swap(PointType p1, PointType p2) const { std::swap_ranges((char*) p1.p, ((char*) p1.p) + capacity(), (char*) p2.p); } - bool cmp(PointType p1, PointType p2) const { return std::lexicographical_compare((Real*) p1.p, ((Real*) p1.p) + dimension(), (Real*) p2.p, ((Real*) p2.p) + dimension()); } - bool eq(PointType p1, PointType p2) const { return std::equal((Real*) p1.p, ((Real*) p1.p) + dimension(), (Real*) p2.p); } - - // non-standard, and possibly a weird name - size_t capacity() const { return sizeof(Real)*dimension() + sizeof(size_t); } - - PointContainer container(size_t n = 0) const { PointContainer c(capacity()); c.resize(n); return c; } - PointContainer container(size_t n, const PointType& p) const; - - typename PointContainer::iterator - iterator(PointContainer& c, PointHandle ph) const; - typename PointContainer::const_iterator - iterator(const PointContainer& c, PointHandle ph) const; - - Real internal_p; - - private: - unsigned dim_; - - private: - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) { ar & dim_; } -}; - -} // dnn - -template -struct dnn::DynamicPointVector::iterator: - public boost::iterator_facade -{ - typedef boost::iterator_facade Parent; - - - public: - typedef typename Parent::value_type value_type; - typedef typename Parent::difference_type difference_type; - typedef typename Parent::reference reference; - - iterator(size_t point_capacity = 0): - point_capacity_(point_capacity) {} - - iterator(void* p, size_t point_capacity): - p_(p), point_capacity_(point_capacity) {} - - private: - void increment() { p_ = ((char*) p_) + point_capacity_; } - void decrement() { p_ = ((char*) p_) - point_capacity_; } - void advance(difference_type n) { p_ = ((char*) p_) + n*point_capacity_; } - difference_type - distance_to(iterator other) const { return (((char*) other.p_) - ((char*) p_))/(int) point_capacity_; } - bool equal(const iterator& other) const { return p_ == other.p_; } - reference dereference() const { return {p_}; } - - friend class ::boost::iterator_core_access; - - private: - void* p_; - size_t point_capacity_; -}; - -template -void dnn::DynamicPointVector::push_back(PointType p) -{ - if (storage_.capacity() < storage_.size() + point_capacity_) - storage_.reserve(1.5*storage_.capacity()); - - storage_.resize(storage_.size() + point_capacity_); - - std::copy((char*) p.p, (char*) p.p + point_capacity_, storage_.end() - point_capacity_); -} - -template -typename dnn::DynamicPointVector::iterator dnn::DynamicPointVector::begin() { return iterator((void*) &*storage_.begin(), point_capacity_); } - -template -typename dnn::DynamicPointVector::iterator dnn::DynamicPointVector::end() { return iterator((void*) &*storage_.end(), point_capacity_); } - -template -typename dnn::DynamicPointVector::const_iterator dnn::DynamicPointVector::begin() const { return const_iterator((void*) &*storage_.begin(), point_capacity_); } - -template -typename dnn::DynamicPointVector::const_iterator dnn::DynamicPointVector::end() const { return const_iterator((void*) &*storage_.end(), point_capacity_); } - -template -typename dnn::DynamicPointTraits::PointContainer -dnn::DynamicPointTraits::container(size_t n, const PointType& p) const -{ - PointContainer c = container(n); - for (auto x : c) - std::copy((char*) p.p, (char*) p.p + capacity(), (char*) x.p); - return c; -} - -template -typename dnn::DynamicPointTraits::PointContainer::iterator -dnn::DynamicPointTraits::iterator(PointContainer& c, PointHandle ph) const -{ return typename PointContainer::iterator(ph.p, capacity()); } - -template -typename dnn::DynamicPointTraits::PointContainer::const_iterator -dnn::DynamicPointTraits::iterator(const PointContainer& c, PointHandle ph) const -{ return typename PointContainer::const_iterator(ph.p, capacity()); } - -} // ws -} // hera - -namespace std { - template<> - struct hash::PointHandle> - { - using PointHandle = typename hera::ws::dnn::DynamicPointTraits::PointHandle; - size_t operator()(const PointHandle& ph) const - { - return std::hash()(ph.p); - } - }; - - template<> - struct hash::PointHandle> - { - using PointHandle = typename hera::ws::dnn::DynamicPointTraits::PointHandle; - size_t operator()(const PointHandle& ph) const - { - return std::hash()(ph.p); - } - }; - - -} // std - - -#endif diff --git a/geom_matching/wasserstein/include/dnn/geometry/euclidean-fixed.h b/geom_matching/wasserstein/include/dnn/geometry/euclidean-fixed.h deleted file mode 100644 index 3e38baf..0000000 --- a/geom_matching/wasserstein/include/dnn/geometry/euclidean-fixed.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef HERA_WS_DNN_GEOMETRY_EUCLIDEAN_FIXED_H -#define HERA_WS_DNN_GEOMETRY_EUCLIDEAN_FIXED_H - -#include -#include -#include -#include -#include - -//#include -#include -#include -#include -#include - -#include "../parallel/tbb.h" // for dnn::vector<...> - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - // TODO: wrap in another namespace (e.g., euclidean) - - template - struct Point: - boost::addable< Point, - boost::subtractable< Point, - boost::dividable2< Point, Real, - boost::multipliable2< Point, Real > > > >, - public boost::array - { - public: - typedef Real Coordinate; - typedef Real DistanceType; - - - public: - Point(size_t id = 0): id_(id) {} - template - Point(const Point& p, size_t id = 0): - id_(id) { *this = p; } - - static size_t dimension() { return D; } - - // Assign a point of different dimension - template - Point& operator=(const Point& p) { for (size_t i = 0; i < (D < DD ? D : DD); ++i) (*this)[i] = p[i]; if (DD < D) for (size_t i = DD; i < D; ++i) (*this)[i] = 0; return *this; } - - Point& operator+=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] += p[i]; return *this; } - Point& operator-=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] -= p[i]; return *this; } - Point& operator/=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] /= r; return *this; } - Point& operator*=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] *= r; return *this; } - - Real norm2() const { Real n = 0; for (size_t i = 0; i < D; ++i) n += (*this)[i] * (*this)[i]; return n; } - Real max_norm() const - { - Real res = std::fabs((*this)[0]); - for (size_t i = 1; i < D; ++i) - if (std::fabs((*this)[i]) > res) - res = std::fabs((*this)[i]); - return res; - } - - Real l1_norm() const - { - Real res = std::fabs((*this)[0]); - for (size_t i = 1; i < D; ++i) - res += std::fabs((*this)[i]); - return res; - } - - Real lp_norm(const Real p) const - { - assert( !std::isinf(p) ); - if ( p == 1.0 ) - return l1_norm(); - Real res = std::pow(std::fabs((*this)[0]), p); - for (size_t i = 1; i < D; ++i) - res += std::pow(std::fabs((*this)[i]), p); - return std::pow(res, 1.0 / p); - } - - // quick and dirty for now; make generic later - //DistanceType distance(const Point& other) const { return sqrt(sq_distance(other)); } - //DistanceType sq_distance(const Point& other) const { return (other - *this).norm2(); } - - DistanceType distance(const Point& other) const { return (other - *this).max_norm(); } - DistanceType p_distance(const Point& other, const double p) const { return (other - *this).lp_norm(p); } - - size_t id() const { return id_; } - size_t& id() { return id_; } - - private: - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::base_object< boost::array >(*this) & id_; } - - private: - size_t id_; - }; - - template - std::ostream& - operator<<(std::ostream& out, const Point& p) - { out << p[0]; for (size_t i = 1; i < D; ++i) out << " " << p[i]; return out; } - - - template - struct PointTraits; // intentionally undefined; should be specialized for each type - - - template - struct PointTraits< Point > // specialization for dnn::Point - { - typedef Point PointType; - typedef const PointType* PointHandle; - typedef std::vector PointContainer; - - typedef typename PointType::Coordinate Coordinate; - typedef typename PointType::DistanceType DistanceType; - - - static DistanceType - distance(const PointType& p1, const PointType& p2) { if (hera::is_infinity(internal_p)) return p1.distance(p2); else return p1.p_distance(p2, internal_p); } - - static DistanceType - distance(PointHandle p1, PointHandle p2) { return distance(*p1,*p2); } - - static size_t dimension() { return D; } - static Real coordinate(const PointType& p, size_t i) { return p[i]; } - static Real& coordinate(PointType& p, size_t i) { return p[i]; } - static Real coordinate(PointHandle p, size_t i) { return coordinate(*p,i); } - - static size_t id(const PointType& p) { return p.id(); } - static size_t& id(PointType& p) { return p.id(); } - static size_t id(PointHandle p) { return id(*p); } - - static PointHandle - handle(const PointType& p) { return &p; } - static const PointType& - point(PointHandle ph) { return *ph; } - - void swap(PointType& p1, PointType& p2) const { return std::swap(p1, p2); } - - static PointContainer - container(size_t n = 0, const PointType& p = PointType()) { return PointContainer(n, p); } - static typename PointContainer::iterator - iterator(PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } - static typename PointContainer::const_iterator - iterator(const PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } - - // Internal_p determines which norm will be used in Wasserstein metric (not to - // be confused with wassersteinPower parameter: - // we raise \| p - q \|_{internal_p} to wassersteinPower. - static Real internal_p; - - private: - - friend class boost::serialization::access; - - template - void serialize(Archive& ar, const unsigned int version) {} - - }; - - template - Real PointTraits< Point >::internal_p = hera::get_infinity(); - - - template - void read_points(const std::string& filename, PointContainer& points) - { - typedef typename boost::range_value::type Point; - typedef typename PointTraits::Coordinate Coordinate; - - std::ifstream in(filename.c_str()); - std::string line; - while(std::getline(in, line)) - { - if (line[0] == '#') continue; // comment line in the file - std::stringstream linestream(line); - Coordinate x; - points.push_back(Point()); - size_t i = 0; - while (linestream >> x) - points.back()[i++] = x; - } - } -} // dnn -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/dnn/local/kd-tree.h b/geom_matching/wasserstein/include/dnn/local/kd-tree.h deleted file mode 100644 index 8e52a5c..0000000 --- a/geom_matching/wasserstein/include/dnn/local/kd-tree.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef HERA_WS_DNN_LOCAL_KD_TREE_H -#define HERA_WS_DNN_LOCAL_KD_TREE_H - -#include "../utils.h" -#include "search-functors.h" - -#include - -#include -#include -#include - -#include -#include - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - // Weighted KDTree - // Traits_ provides Coordinate, DistanceType, PointType, dimension(), distance(p1,p2), coordinate(p,i) - template< class Traits_ > - class KDTree - { - public: - typedef Traits_ Traits; - typedef dnn::HandleDistance HandleDistance; - - typedef typename Traits::PointType Point; - typedef typename Traits::PointHandle PointHandle; - typedef typename Traits::Coordinate Coordinate; - typedef typename Traits::DistanceType DistanceType; - typedef std::vector HandleContainer; - typedef std::vector HDContainer; // TODO: use tbb::scalable_allocator - typedef HDContainer Result; - typedef std::vector DistanceContainer; - typedef std::unordered_map HandleMap; - - BOOST_STATIC_ASSERT_MSG(has_coordinates::value, "KDTree requires coordinates"); - - public: - KDTree(const Traits& traits): - traits_(traits) {} - - KDTree(const Traits& traits, HandleContainer&& handles, double _wassersteinPower = 1.0); - - template - KDTree(const Traits& traits, const Range& range, double _wassersteinPower = 1.0); - - template - void init(const Range& range); - - DistanceType weight(PointHandle p) { return weights_[indices_[p]]; } - void change_weight(PointHandle p, DistanceType w); - void adjust_weights(DistanceType delta); // subtract delta from all weights - - HandleDistance find(PointHandle q) const; - Result findR(PointHandle q, DistanceType r) const; // all neighbors within r - Result findK(PointHandle q, size_t k) const; // k nearest neighbors - - HandleDistance find(const Point& q) const { return find(traits().handle(q)); } - Result findR(const Point& q, DistanceType r) const { return findR(traits().handle(q), r); } - Result findK(const Point& q, size_t k) const { return findK(traits().handle(q), k); } - - template - void search(PointHandle q, ResultsFunctor& rf) const; - - const Traits& traits() const { return traits_; } - - void printWeights(void); - - private: - void init(); - - typedef typename HandleContainer::iterator HCIterator; - typedef std::tuple KDTreeNode; - - struct CoordinateComparison; - struct OrderTree; - - private: - Traits traits_; - HandleContainer tree_; - DistanceContainer weights_; // point weight - DistanceContainer subtree_weights_; // min weight in the subtree - HandleMap indices_; - double wassersteinPower; - }; -} // dnn -} // ws -} // hera - -#include "kd-tree.hpp" - -#endif diff --git a/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp b/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp deleted file mode 100644 index bdeef45..0000000 --- a/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp +++ /dev/null @@ -1,330 +0,0 @@ -#include -#include -#include - -#include -#include - -#include "../parallel/tbb.h" -#include "def_debug_ws.h" - -template -hera::ws::dnn::KDTree:: -KDTree(const Traits& traits, HandleContainer&& handles, double _wassersteinPower): - traits_(traits), tree_(std::move(handles)), wassersteinPower(_wassersteinPower) -{ assert(wassersteinPower >= 1.0); init(); } - -template -template -hera::ws::dnn::KDTree:: -KDTree(const Traits& traits, const Range& range, double _wassersteinPower): - traits_(traits), wassersteinPower(_wassersteinPower) -{ - assert( wassersteinPower >= 1.0); - init(range); -} - -template -template -void -hera::ws::dnn::KDTree:: -init(const Range& range) -{ - size_t sz = std::distance(std::begin(range), std::end(range)); - tree_.reserve(sz); - weights_.resize(sz, 0); - subtree_weights_.resize(sz, 0); - for (PointHandle h : range) - tree_.push_back(h); - init(); -} - -template -void -hera::ws::dnn::KDTree:: -init() -{ - if (tree_.empty()) - return; - -#if defined(TBB) - task_group g; - g.run(OrderTree(tree_.begin(), tree_.end(), 0, traits())); - g.wait(); -#else - OrderTree(tree_.begin(), tree_.end(), 0, traits()).serial(); -#endif - - for (size_t i = 0; i < tree_.size(); ++i) - indices_[tree_[i]] = i; -} - -template -struct -hera::ws::dnn::KDTree::OrderTree -{ - OrderTree(HCIterator b_, HCIterator e_, size_t i_, const Traits& traits_): - b(b_), e(e_), i(i_), traits(traits_) {} - - void operator()() const - { - if (e - b < 1000) - { - serial(); - return; - } - - HCIterator m = b + (e - b)/2; - CoordinateComparison cmp(i, traits); - std::nth_element(b,m,e, cmp); - size_t next_i = (i + 1) % traits.dimension(); - - task_group g; - if (b < m - 1) g.run(OrderTree(b, m, next_i, traits)); - if (e > m + 2) g.run(OrderTree(m+1, e, next_i, traits)); - g.wait(); - } - - void serial() const - { - std::queue q; - q.push(KDTreeNode(b,e,i)); - while (!q.empty()) - { - HCIterator b, e; size_t i; - std::tie(b,e,i) = q.front(); - q.pop(); - HCIterator m = b + (e - b)/2; - - CoordinateComparison cmp(i, traits); - std::nth_element(b,m,e, cmp); - size_t next_i = (i + 1) % traits.dimension(); - - // Replace with a size condition instead? - if (m - b > 1) q.push(KDTreeNode(b, m, next_i)); - if (e - m > 2) q.push(KDTreeNode(m+1, e, next_i)); - } - } - - HCIterator b, e; - size_t i; - const Traits& traits; -}; - -template -template -void -hera::ws::dnn::KDTree:: -search(PointHandle q, ResultsFunctor& rf) const -{ - typedef typename HandleContainer::const_iterator HCIterator; - typedef std::tuple KDTreeNode; - - if (tree_.empty()) - return; - - DistanceType D = std::numeric_limits::max(); - - // TODO: use tbb::scalable_allocator for the queue - std::queue nodes; - - nodes.push(KDTreeNode(tree_.begin(), tree_.end(), 0)); - - while (!nodes.empty()) - { - HCIterator b, e; size_t i; - std::tie(b,e,i) = nodes.front(); - nodes.pop(); - - CoordinateComparison cmp(i, traits()); - i = (i + 1) % traits().dimension(); - - HCIterator m = b + (e - b)/2; - - DistanceType dist = (wassersteinPower == 1.0) ? traits().distance(q, *m) + weights_[m - tree_.begin()] : std::pow(traits().distance(q, *m), wassersteinPower) + weights_[m - tree_.begin()]; - - - D = rf(*m, dist); - - // we are really searching w.r.t L_\infty ball; could prune better with an L_2 ball - Coordinate diff = cmp.diff(q, *m); // diff returns signed distance - - DistanceType diffToWasserPower = (wassersteinPower == 1.0) ? diff : ((diff > 0 ? 1.0 : -1.0) * std::pow(fabs(diff), wassersteinPower)); - - size_t lm = m + 1 + (e - (m+1))/2 - tree_.begin(); - if (e > m + 1 && diffToWasserPower - subtree_weights_[lm] >= -D) { - nodes.push(KDTreeNode(m+1, e, i)); - } - - size_t rm = b + (m - b) / 2 - tree_.begin(); - if (b < m && diffToWasserPower + subtree_weights_[rm] <= D) { - nodes.push(KDTreeNode(b, m, i)); - } - } -} - -template -void -hera::ws::dnn::KDTree:: -adjust_weights(DistanceType delta) -{ - for(auto& w : weights_) - w -= delta; - - for(auto& sw : subtree_weights_) - sw -= delta; -} - - -template -void -hera::ws::dnn::KDTree:: -change_weight(PointHandle p, DistanceType w) -{ - size_t idx = indices_[p]; - - if ( weights_[idx] == w ) { - return; - } - - bool weight_increases = ( weights_[idx] < w ); - weights_[idx] = w; - - typedef std::tuple KDTreeNode; - - // find the path down the tree to this node - // not an ideal strategy, but // it's not clear how to move up from the node in general - std::stack s; - s.push(KDTreeNode(tree_.begin(),tree_.end())); - - do - { - HCIterator b,e; - std::tie(b,e) = s.top(); - - size_t im = b + (e - b)/2 - tree_.begin(); - - if (idx == im) - break; - else if (idx < im) - s.push(KDTreeNode(b, tree_.begin() + im)); - else // idx > im - s.push(KDTreeNode(tree_.begin() + im + 1, e)); - } while(1); - - // update subtree_weights_ on the path to the root - DistanceType min_w = w; - while (!s.empty()) - { - HCIterator b,e; - std::tie(b,e) = s.top(); - HCIterator m = b + (e - b)/2; - size_t im = m - tree_.begin(); - s.pop(); - - - // left and right children - if (b < m) - { - size_t lm = b + (m - b)/2 - tree_.begin(); - if (subtree_weights_[lm] < min_w) - min_w = subtree_weights_[lm]; - } - - if (e > m + 1) - { - size_t rm = m + 1 + (e - (m+1))/2 - tree_.begin(); - if (subtree_weights_[rm] < min_w) - min_w = subtree_weights_[rm]; - } - - if (weights_[im] < min_w) { - min_w = weights_[im]; - } - - if (weight_increases) { - - if (subtree_weights_[im] < min_w ) // increase weight - subtree_weights_[im] = min_w; - else - break; - - } else { - - if (subtree_weights_[im] > min_w ) // decrease weight - subtree_weights_[im] = min_w; - else - break; - - } - } -} - -template -typename hera::ws::dnn::KDTree::HandleDistance -hera::ws::dnn::KDTree:: -find(PointHandle q) const -{ - hera::ws::dnn::NNRecord nn; - search(q, nn); - return nn.result; -} - -template -typename hera::ws::dnn::KDTree::Result -hera::ws::dnn::KDTree:: -findR(PointHandle q, DistanceType r) const -{ - hera::ws::dnn::rNNRecord rnn(r); - search(q, rnn); - std::sort(rnn.result.begin(), rnn.result.end()); - return rnn.result; -} - -template -typename hera::ws::dnn::KDTree::Result -hera::ws::dnn::KDTree:: -findK(PointHandle q, size_t k) const -{ - hera::ws::dnn::kNNRecord knn(k); - search(q, knn); - std::sort(knn.result.begin(), knn.result.end()); - return knn.result; -} - - -template -struct hera::ws::dnn::KDTree::CoordinateComparison -{ - CoordinateComparison(size_t i, const Traits& traits): - i_(i), traits_(traits) {} - - bool operator()(PointHandle p1, PointHandle p2) const { return coordinate(p1) < coordinate(p2); } - Coordinate diff(PointHandle p1, PointHandle p2) const { return coordinate(p1) - coordinate(p2); } - - Coordinate coordinate(PointHandle p) const { return traits_.coordinate(p, i_); } - size_t axis() const { return i_; } - - private: - size_t i_; - const Traits& traits_; -}; - -template -void -hera::ws::dnn::KDTree:: -printWeights(void) -{ -#ifndef FOR_R_TDA - std::cout << "weights_:" << std::endl; - for(const auto ph : indices_) { - std::cout << "idx = " << ph.second << ": (" << (ph.first)->at(0) << ", " << (ph.first)->at(1) << ") weight = " << weights_[ph.second] << std::endl; - } - std::cout << "subtree_weights_:" << std::endl; - for(size_t idx = 0; idx < subtree_weights_.size(); ++idx) { - std::cout << idx << " : " << subtree_weights_[idx] << std::endl; - } -#endif -} - - diff --git a/geom_matching/wasserstein/include/dnn/local/search-functors.h b/geom_matching/wasserstein/include/dnn/local/search-functors.h deleted file mode 100644 index 1419f22..0000000 --- a/geom_matching/wasserstein/include/dnn/local/search-functors.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef HERA_WS_DNN_LOCAL_SEARCH_FUNCTORS_H -#define HERA_WS_DNN_LOCAL_SEARCH_FUNCTORS_H - -#include - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - -template -struct HandleDistance -{ - typedef typename NN::PointHandle PointHandle; - typedef typename NN::DistanceType DistanceType; - typedef typename NN::HDContainer HDContainer; - - HandleDistance() {} - HandleDistance(PointHandle pp, DistanceType dd): - p(pp), d(dd) {} - bool operator<(const HandleDistance& other) const { return d < other.d; } - - PointHandle p; - DistanceType d; -}; - -template -struct NNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - - NNRecord() { result.d = std::numeric_limits::max(); } - DistanceType operator()(PointHandle p, DistanceType d) { if (d < result.d) { result.p = p; result.d = d; } return result.d; } - HandleDistance result; -}; - -template -struct rNNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - typedef typename HandleDistance::HDContainer HDContainer; - - rNNRecord(DistanceType r_): r(r_) {} - DistanceType operator()(PointHandle p, DistanceType d) - { - if (d <= r) - result.push_back(HandleDistance(p,d)); - return r; - } - - DistanceType r; - HDContainer result; -}; - -template -struct kNNRecord -{ - typedef typename HandleDistance::PointHandle PointHandle; - typedef typename HandleDistance::DistanceType DistanceType; - typedef typename HandleDistance::HDContainer HDContainer; - - kNNRecord(unsigned k_): k(k_) {} - DistanceType operator()(PointHandle p, DistanceType d) - { - if (result.size() < k) - { - result.push_back(HandleDistance(p,d)); - boost::push_heap(result); - if (result.size() < k) - return std::numeric_limits::max(); - } else if (d < result[0].d) - { - boost::pop_heap(result); - result.back() = HandleDistance(p,d); - boost::push_heap(result); - } - if ( result.size() > 1 ) { - assert( result[0].d >= result[1].d ); - } - return result[0].d; - } - - unsigned k; - HDContainer result; -}; - -} // dnn -} // ws -} // hera - -#endif // DNN_LOCAL_SEARCH_FUNCTORS_H diff --git a/geom_matching/wasserstein/include/dnn/parallel/tbb.h b/geom_matching/wasserstein/include/dnn/parallel/tbb.h deleted file mode 100644 index 3f811d6..0000000 --- a/geom_matching/wasserstein/include/dnn/parallel/tbb.h +++ /dev/null @@ -1,237 +0,0 @@ -#ifndef HERA_WS_PARALLEL_H -#define HERA_WS_PARALLEL_H - -#include - -#include -#include -#include - -#ifdef TBB - -#include -#include -#include - -#include -#include -#include - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - using tbb::mutex; - using tbb::task_scheduler_init; - using tbb::task_group; - using tbb::task; - - template - struct vector - { - typedef tbb::concurrent_vector type; - }; - - template - struct atomic - { - typedef tbb::atomic type; - static T compare_and_swap(type& v, T n, T o) { return v.compare_and_swap(n,o); } - }; - - template - void do_foreach(Iterator begin, Iterator end, const F& f) { tbb::parallel_do(begin, end, f); } - - template - void for_each_range_(const Range& r, const F& f) - { - for (typename Range::iterator cur = r.begin(); cur != r.end(); ++cur) - f(*cur); - } - - template - void for_each_range(size_t from, size_t to, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(from, to, f); - } - - template - void for_each_range(const Container& c, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); - } - - template - void for_each_range(Container& c, const F& f) - { - //static tbb::affinity_partitioner ap; - //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); - tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); - } - - template - struct map_traits - { - typedef tbb::concurrent_hash_map type; - typedef typename type::range_type range; - }; - - struct progress_timer - { - progress_timer(): start(tbb::tick_count::now()) {} - ~progress_timer() - { std::cout << (tbb::tick_count::now() - start).seconds() << " s" << std::endl; } - - tbb::tick_count start; - }; -} // dnn -} // ws -} // hera - -// Serialization for tbb::concurrent_vector<...> -namespace boost -{ - namespace serialization - { - template - void save(Archive& ar, const tbb::concurrent_vector& v, const unsigned int file_version) - { stl::save_collection(ar, v); } - - template - void load(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) - { - stl::load_collection, - stl::archive_input_seq< Archive, tbb::concurrent_vector >, - stl::reserve_imp< tbb::concurrent_vector > - >(ar, v); - } - - template - void serialize(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) - { split_free(ar, v, file_version); } - - template - void save(Archive& ar, const tbb::atomic& v, const unsigned int file_version) - { T v_ = v; ar << v_; } - - template - void load(Archive& ar, tbb::atomic& v, const unsigned int file_version) - { T v_; ar >> v_; v = v_; } - - template - void serialize(Archive& ar, tbb::atomic& v, const unsigned int file_version) - { split_free(ar, v, file_version); } - } -} - -#else - -#include -#include -#include - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - template - struct vector - { - typedef ::std::vector type; - }; - - template - struct atomic - { - typedef T type; - static T compare_and_swap(type& v, T n, T o) { if (v != o) return v; v = n; return o; } - }; - - template - void do_foreach(Iterator begin, Iterator end, const F& f) { std::for_each(begin, end, f); } - - template - void for_each_range(size_t from, size_t to, const F& f) - { - for (size_t i = from; i < to; ++i) - f(i); - } - - template - void for_each_range(Container& c, const F& f) - { - BOOST_FOREACH(const typename Container::value_type& i, c) - f(i); - } - - template - void for_each_range(const Container& c, const F& f) - { - BOOST_FOREACH(const typename Container::value_type& i, c) - f(i); - } - - struct mutex - { - struct scoped_lock - { - scoped_lock() {} - scoped_lock(mutex& ) {} - void acquire(mutex& ) const {} - void release() const {} - }; - }; - - struct task_scheduler_init - { - task_scheduler_init(unsigned) {} - void initialize(unsigned) {} - static const unsigned automatic = 0; - static const unsigned deferred = 0; - }; - - struct task_group - { - template - void run(const Functor& f) const { f(); } - void wait() const {} - }; - - template - struct map_traits - { - typedef std::map type; - typedef type range; - }; - - using boost::progress_timer; -} // dnn -} // ws -} // hera - -#endif // TBB - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - template - void do_foreach(const Range& range, const F& f) { do_foreach(boost::begin(range), boost::end(range), f); } -} // dnn -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/dnn/parallel/utils.h b/geom_matching/wasserstein/include/dnn/parallel/utils.h deleted file mode 100644 index 7104ec3..0000000 --- a/geom_matching/wasserstein/include/dnn/parallel/utils.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef HERA_WS_PARALLEL_UTILS_H -#define HERA_WS_PARALLEL_UTILS_H - -#include "../utils.h" - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - // Assumes rng is synchronized across ranks - template - void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty = DataVector()); - - template - void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng) - { - typedef decltype(data[0]) T; - shuffle(world, data, rng, [](T& x, T& y) { std::swap(x,y); }); - } -} // dnn -} // ws -} // hera - -template -void -hera::ws::dnn::shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty) -{ - // This is not a perfect shuffle: it dishes out data in chunks of 1/size. - // (It can be interpreted as generating a bistochastic matrix by taking the - // sum of size random permutation matrices.) Hopefully, it works for our purposes. - - typedef typename RNGType::result_type RNGResult; - - int size = world.size(); - int rank = world.rank(); - - // Generate local seeds - boost::uniform_int uniform; - RNGResult seed; - for (size_t i = 0; i < size; ++i) - { - RNGResult v = uniform(rng); - if (i == rank) - seed = v; - } - RNGType local_rng(seed); - - // Shuffle local data - hera::ws::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); - - // Decide how much of our data goes to i-th processor - std::vector out_counts(size); - std::vector ranks(boost::counting_iterator(0), - boost::counting_iterator(size)); - for (size_t i = 0; i < size; ++i) - { - hera::ws::dnn::random_shuffle(ranks.begin(), ranks.end(), rng); - ++out_counts[ranks[rank]]; - } - - // Fill the outgoing array - size_t total = 0; - std::vector< DataVector > outgoing(size, empty); - for (size_t i = 0; i < size; ++i) - { - size_t count = data.size()*out_counts[i]/size; - if (total + count > data.size()) - count = data.size() - total; - - outgoing[i].reserve(count); - for (size_t j = total; j < total + count; ++j) - outgoing[i].push_back(data[j]); - - total += count; - } - - boost::uniform_int uniform_outgoing(0,size-1); // in range [0,size-1] - while(total < data.size()) // send leftover to random processes - { - outgoing[uniform_outgoing(local_rng)].push_back(data[total]); - ++total; - } - data.clear(); - - // Exchange the data - std::vector< DataVector > incoming(size, empty); - mpi::all_to_all(world, outgoing, incoming); - outgoing.clear(); - - // Assemble our data - for(const DataVector& vec : incoming) - for (size_t i = 0; i < vec.size(); ++i) - data.push_back(vec[i]); - hera::ws::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); - // XXX: the final shuffle is irrelevant for our purposes. But it's also cheap. -} - -#endif diff --git a/geom_matching/wasserstein/include/dnn/utils.h b/geom_matching/wasserstein/include/dnn/utils.h deleted file mode 100644 index bbce793..0000000 --- a/geom_matching/wasserstein/include/dnn/utils.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef HERA_WS_DNN_UTILS_H -#define HERA_WS_DNN_UTILS_H - -#include -#include -#include - -namespace hera -{ -namespace ws -{ -namespace dnn -{ - -template -struct has_coordinates -{ - template ().coordinate(std::declval()...) )> - static std::true_type test(int); - - template - static std::false_type test(...); - - static constexpr bool value = decltype(test(0))::value; -}; - -template -void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g, const SwapFunctor& swap) -{ - size_t n = last - first; - boost::uniform_int uniform(0,n); - for (size_t i = n-1; i > 0; --i) - swap(first[i], first[uniform(g,i+1)]); // picks a random number in [0,i] range -} - -template -void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g) -{ - typedef decltype(*first) T; - random_shuffle(first, last, g, [](T& x, T& y) { std::swap(x,y); }); -} - -} // dnn -} // ws -} // hera - -#endif diff --git a/geom_matching/wasserstein/include/hera_infinity.h b/geom_matching/wasserstein/include/hera_infinity.h deleted file mode 100644 index 8d86dbb..0000000 --- a/geom_matching/wasserstein/include/hera_infinity.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef WASSERSTEIN_HERA_INFINITY_H -#define WASSERSTEIN_HERA_INFINITY_H - -// we cannot assume that template parameter Real will always provide infinity() value, -// so value -1.0 is used to encode infinity (l_inf norm is used by default) - -namespace hera { - - template - inline bool is_infinity(const Real& x) - { - return x == Real(-1); - }; - - template - inline constexpr Real get_infinity() - { - return Real(-1); - } -} - -#endif //WASSERSTEIN_HERA_INFINITY_H diff --git a/geom_matching/wasserstein/include/opts/opts.h b/geom_matching/wasserstein/include/opts/opts.h deleted file mode 100755 index 74e788b..0000000 --- a/geom_matching/wasserstein/include/opts/opts.h +++ /dev/null @@ -1,353 +0,0 @@ -/** - * Author: Dmitriy Morozov - * The interface is heavily influenced by GetOptPP (https://code.google.com/p/getoptpp/). - */ - -#ifndef OPTS_OPTS_H -#define OPTS_OPTS_H - -#include -#include -#include -#include -#include - -namespace opts { - -// Converters -template -struct Converter -{ - Converter() {} - static - T convert(const std::string& val) { std::istringstream iss(val); T res; iss >> res; return res; } -}; - -// Type -template -struct Traits -{ - static std::string type_string() { return "UNKNOWN TYPE"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "INT"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "SHORT INT"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "UNSIGNED INT"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "SHORT UNSIGNED INT"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "FLOAT"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "DOUBLE"; } -}; - -template<> -struct Traits -{ - static std::string type_string() { return "STRING"; } -}; - - -struct BasicOption -{ - BasicOption(char s_, - std::string l_, - std::string default_, - std::string type_, - std::string help_): - s(s_), l(l_), d(default_), t(type_), help(help_) {} - - int long_size() const { return l.size() + 1 + t.size(); } - - void output(std::ostream& out, int max_long) const - { - out << " "; - if (s) - out << '-' << s << ", "; - else - out << " "; - - out << "--" << l << ' '; - - if (!t.empty()) - out << t; - - for (int i = long_size(); i < max_long; ++i) - out << ' '; - - out << " " << help; - - if (!d.empty()) - { - out << " [default: " << d << "]"; - } - out << '\n'; - } - - char s; - std::string l; - std::string d; - std::string t; - std::string help; -}; - -// Option -template -struct OptionContainer: public BasicOption -{ - OptionContainer(char s_, - const std::string& l_, - T& var_, - const std::string& help_, - const std::string& type_ = Traits::type_string()): - BasicOption(s_, l_, default_value(var_), type_, help_), - var(&var_) {} - - static - std::string default_value(const T& def) - { - std::ostringstream oss; - oss << def; - return oss.str(); - } - - void parse(std::list& args) const - { - std::string short_opt = "-"; short_opt += s; - std::string long_opt = "--" + l; - for (std::list::iterator cur = args.begin(); cur != args.end(); ++cur) - { - if (*cur == short_opt || *cur == long_opt) - { - cur = args.erase(cur); - if (cur != args.end()) - { - *var = Converter::convert(*cur); - cur = args.erase(cur); - break; // finds first occurrence - } - else - break; // if the last option's value is missing, it remains default - - } - } - } - - T* var; -}; - -template -struct OptionContainer< std::vector >: public BasicOption -{ - OptionContainer(char s_, - const std::string& l_, - std::vector& var_, - const std::string& help_, - const std::string& type_ = "SEQUENCE"): - BasicOption(s_, l_, default_value(var_), type_, help_), - var(&var_) { } - - static - std::string default_value(const std::vector& def) - { - std::ostringstream oss; - oss << "("; - if (def.size()) - oss << def[0]; - for (int i = 1; i < def.size(); ++i) - oss << ", " << def[i]; - oss << ")"; - return oss.str(); - } - - void parse(std::list& args) const - { - std::string short_opt = "-"; short_opt += s; - std::string long_opt = "--" + l; - for (std::list::iterator cur = args.begin(); cur != args.end(); ++cur) - { - if (*cur == short_opt || *cur == long_opt) - { - cur = args.erase(cur); - if (cur != args.end()) - { - var->push_back(Converter::convert(*cur)); - cur = args.erase(cur); - } - --cur; - } - } - } - - std::vector* var; -}; - - -template -OptionContainer -Option(char s, const std::string& l, T& var, const std::string& help) { return OptionContainer(s, l, var, help); } - -template -OptionContainer -Option(char s, const std::string& l, T& var, - const std::string& type, const std::string& help) { return OptionContainer(s, l, var, help, type); } - -template -OptionContainer -Option(const std::string& l, T& var, const std::string& help) { return OptionContainer(0, l, var, help); } - -template -OptionContainer -Option(const std::string& l, T& var, - const std::string& type, const std::string& help) { return OptionContainer(0, l, var, help, type); } - -// Present -struct PresentContainer: public BasicOption -{ - PresentContainer(char s, const std::string& l, const std::string& help): - BasicOption(s,l,"","",help) {} -}; - -inline -PresentContainer -Present(char s, const std::string& l, const std::string& help) { return PresentContainer(s, l, help); } - -inline -PresentContainer -Present(const std::string& l, const std::string& help) { return PresentContainer(0, l, help); } - -// PosOption -template -struct PosOptionContainer -{ - PosOptionContainer(T& var_): - var(&var_) {} - - bool parse(std::list& args) const - { - if (args.empty()) - return false; - - *var = Converter::convert(args.front()); - args.pop_front(); - return true; - } - - T* var; -}; - -template -PosOptionContainer -PosOption(T& var) { return PosOptionContainer(var); } - - -// Options -struct Options -{ - Options(int argc_, char** argv_): - args(argv_ + 1, argv_ + argc_), - failed(false) {} - - template - Options& operator>>(const OptionContainer& oc); - bool operator>>(const PresentContainer& pc); - template - Options& operator>>(const PosOptionContainer& poc); - - operator bool() { return !failed; } - - - friend - std::ostream& - operator<<(std::ostream& out, const Options& ops) - { - int max_long = 0; - for (std::list::const_iterator cur = ops.options.begin(); - cur != ops.options.end(); - ++cur) - { - int cur_long = cur->long_size(); - if (cur_long > max_long) - max_long = cur_long; - } - - out << "Options:\n"; - for (std::list::const_iterator cur = ops.options.begin(); - cur != ops.options.end(); - ++cur) - cur->output(out, max_long); - - return out; - } - - - private: - std::list args; - std::list options; - bool failed; -}; - -template -Options& -Options::operator>>(const OptionContainer& oc) -{ - options.push_back(oc); - oc.parse(args); - return *this; -} - -inline -bool -Options::operator>>(const PresentContainer& pc) -{ - options.push_back(pc); - - for(std::list::iterator cur = args.begin(); cur != args.end(); ++cur) - { - std::string short_opt = "-"; short_opt += pc.s; - std::string long_opt = "--" + pc.l; - if (*cur == short_opt || *cur == long_opt) - { - args.erase(cur); - return true; - } - } - return false; -} - -template -Options& -Options::operator>>(const PosOptionContainer& poc) -{ - failed = !poc.parse(args); - return *this; -} - -} - -#endif diff --git a/geom_matching/wasserstein/include/spdlog/async_logger.h b/geom_matching/wasserstein/include/spdlog/async_logger.h deleted file mode 100644 index 9d7e08f..0000000 --- a/geom_matching/wasserstein/include/spdlog/async_logger.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// Very fast asynchronous logger (millions of logs per second on an average desktop) -// Uses pre allocated lockfree queue for maximum throughput even under large number of threads. -// Creates a single back thread to pop messages from the queue and log them. -// -// Upon each log write the logger: -// 1. Checks if its log level is enough to log the message -// 2. Push a new copy of the message to a queue (or block the caller until space is available in the queue) -// 3. will throw spdlog_ex upon log exceptions -// Upon destruction, logs all remaining messages in the queue before destructing.. - -#include "spdlog/common.h" -#include "spdlog/logger.h" - -#include -#include -#include -#include - -namespace spdlog -{ - -namespace details -{ -class async_log_helper; -} - -class async_logger SPDLOG_FINAL :public logger -{ -public: - template - async_logger(const std::string& name, - const It& begin, - const It& end, - size_t queue_size, - const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, - const std::function& worker_warmup_cb = nullptr, - const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), - const std::function& worker_teardown_cb = nullptr); - - async_logger(const std::string& logger_name, - sinks_init_list sinks, - size_t queue_size, - const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, - const std::function& worker_warmup_cb = nullptr, - const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), - const std::function& worker_teardown_cb = nullptr); - - async_logger(const std::string& logger_name, - sink_ptr single_sink, - size_t queue_size, - const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, - const std::function& worker_warmup_cb = nullptr, - const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), - const std::function& worker_teardown_cb = nullptr); - - //Wait for the queue to be empty, and flush synchronously - //Warning: this can potentially last forever as we wait it to complete - void flush() override; - - // Error handler - virtual void set_error_handler(log_err_handler) override; - virtual log_err_handler error_handler() override; - -protected: - void _sink_it(details::log_msg& msg) override; - void _set_formatter(spdlog::formatter_ptr msg_formatter) override; - void _set_pattern(const std::string& pattern, pattern_time_type pattern_time) override; - -private: - std::unique_ptr _async_log_helper; -}; -} - - -#include "spdlog/details/async_logger_impl.h" diff --git a/geom_matching/wasserstein/include/spdlog/common.h b/geom_matching/wasserstein/include/spdlog/common.h deleted file mode 100644 index 7e352fa..0000000 --- a/geom_matching/wasserstein/include/spdlog/common.h +++ /dev/null @@ -1,160 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -#include -#include -#endif - -#include "spdlog/details/null_mutex.h" - -//visual studio upto 2013 does not support noexcept nor constexpr -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define SPDLOG_NOEXCEPT throw() -#define SPDLOG_CONSTEXPR -#else -#define SPDLOG_NOEXCEPT noexcept -#define SPDLOG_CONSTEXPR constexpr -#endif - -// See tweakme.h -#if !defined(SPDLOG_FINAL) -#define SPDLOG_FINAL -#endif - -#if defined(__GNUC__) || defined(__clang__) -#define SPDLOG_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) -#define SPDLOG_DEPRECATED __declspec(deprecated) -#else -#define SPDLOG_DEPRECATED -#endif - - -#include "spdlog/fmt/fmt.h" - -namespace spdlog -{ - -class formatter; - -namespace sinks -{ -class sink; -} - -using log_clock = std::chrono::system_clock; -using sink_ptr = std::shared_ptr < sinks::sink >; -using sinks_init_list = std::initializer_list < sink_ptr >; -using formatter_ptr = std::shared_ptr; -#if defined(SPDLOG_NO_ATOMIC_LEVELS) -using level_t = details::null_atomic_int; -#else -using level_t = std::atomic; -#endif - -using log_err_handler = std::function; - -//Log level enum -namespace level -{ -typedef enum -{ - trace = 0, - debug = 1, - info = 2, - warn = 3, - err = 4, - critical = 5, - off = 6 -} level_enum; - -#if !defined(SPDLOG_LEVEL_NAMES) -#define SPDLOG_LEVEL_NAMES { "trace", "debug", "info", "warning", "error", "critical", "off" }; -#endif -static const char* level_names[] SPDLOG_LEVEL_NAMES - -static const char* short_level_names[] { "T", "D", "I", "W", "E", "C", "O" }; - -inline const char* to_str(spdlog::level::level_enum l) -{ - return level_names[l]; -} - -inline const char* to_short_str(spdlog::level::level_enum l) -{ - return short_level_names[l]; -} -} //level - - -// -// Async overflow policy - block by default. -// -enum class async_overflow_policy -{ - block_retry, // Block / yield / sleep until message can be enqueued - discard_log_msg // Discard the message it enqueue fails -}; - -// -// Pattern time - specific time getting to use for pattern_formatter. -// local time by default -// -enum class pattern_time_type -{ - local, // log localtime - utc // log utc -}; - -// -// Log exception -// -namespace details -{ -namespace os -{ -std::string errno_str(int err_num); -} -} -class spdlog_ex: public std::exception -{ -public: - spdlog_ex(const std::string& msg):_msg(msg) - {} - spdlog_ex(const std::string& msg, int last_errno) - { - _msg = msg + ": " + details::os::errno_str(last_errno); - } - const char* what() const SPDLOG_NOEXCEPT override - { - return _msg.c_str(); - } -private: - std::string _msg; - -}; - -// -// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) -// -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -using filename_t = std::wstring; -#else -using filename_t = std::string; -#endif - - -} //spdlog diff --git a/geom_matching/wasserstein/include/spdlog/details/async_log_helper.h b/geom_matching/wasserstein/include/spdlog/details/async_log_helper.h deleted file mode 100644 index 6145dfa..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/async_log_helper.h +++ /dev/null @@ -1,399 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -// async log helper : -// Process logs asynchronously using a back thread. -// -// If the internal queue of log messages reaches its max size, -// then the client call will block until there is more room. -// - -#pragma once - -#include "spdlog/common.h" -#include "spdlog/sinks/sink.h" -#include "spdlog/details/mpmc_bounded_q.h" -#include "spdlog/details/log_msg.h" -#include "spdlog/details/os.h" -#include "spdlog/formatter.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace spdlog -{ -namespace details -{ - -class async_log_helper -{ - // Async msg to move to/from the queue - // Movable only. should never be copied - enum class async_msg_type - { - log, - flush, - terminate - }; - struct async_msg - { - std::string logger_name; - level::level_enum level; - log_clock::time_point time; - size_t thread_id; - std::string txt; - async_msg_type msg_type; - size_t msg_id; - - async_msg() = default; - ~async_msg() = default; - - -async_msg(async_msg&& other) SPDLOG_NOEXCEPT: - logger_name(std::move(other.logger_name)), - level(std::move(other.level)), - time(std::move(other.time)), - thread_id(other.thread_id), - txt(std::move(other.txt)), - msg_type(std::move(other.msg_type)), - msg_id(other.msg_id) - {} - - async_msg(async_msg_type m_type): - level(level::info), - thread_id(0), - msg_type(m_type), - msg_id(0) - {} - - async_msg& operator=(async_msg&& other) SPDLOG_NOEXCEPT - { - logger_name = std::move(other.logger_name); - level = other.level; - time = std::move(other.time); - thread_id = other.thread_id; - txt = std::move(other.txt); - msg_type = other.msg_type; - msg_id = other.msg_id; - return *this; - } - - // never copy or assign. should only be moved.. - async_msg(const async_msg&) = delete; - async_msg& operator=(const async_msg& other) = delete; - - // construct from log_msg - async_msg(const details::log_msg& m): - level(m.level), - time(m.time), - thread_id(m.thread_id), - txt(m.raw.data(), m.raw.size()), - msg_type(async_msg_type::log), - msg_id(m.msg_id) - { -#ifndef SPDLOG_NO_NAME - logger_name = *m.logger_name; -#endif - } - - - // copy into log_msg - void fill_log_msg(log_msg &msg) - { - msg.logger_name = &logger_name; - msg.level = level; - msg.time = time; - msg.thread_id = thread_id; - msg.raw << txt; - msg.msg_id = msg_id; - } - }; - -public: - - using item_type = async_msg; - using q_type = details::mpmc_bounded_queue; - - using clock = std::chrono::steady_clock; - - - async_log_helper(formatter_ptr formatter, - const std::vector& sinks, - size_t queue_size, - const log_err_handler err_handler, - const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, - const std::function& worker_warmup_cb = nullptr, - const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), - const std::function& worker_teardown_cb = nullptr); - - void log(const details::log_msg& msg); - - // stop logging and join the back thread - ~async_log_helper(); - - void set_formatter(formatter_ptr); - - void flush(bool wait_for_q); - - void set_error_handler(spdlog::log_err_handler err_handler); - -private: - formatter_ptr _formatter; - std::vector> _sinks; - - // queue of messages to log - q_type _q; - - log_err_handler _err_handler; - - bool _flush_requested; - - bool _terminate_requested; - - - // overflow policy - const async_overflow_policy _overflow_policy; - - // worker thread warmup callback - one can set thread priority, affinity, etc - const std::function _worker_warmup_cb; - - // auto periodic sink flush parameter - const std::chrono::milliseconds _flush_interval_ms; - - // worker thread teardown callback - const std::function _worker_teardown_cb; - - // worker thread - std::thread _worker_thread; - - void push_msg(async_msg&& new_msg); - - // worker thread main loop - void worker_loop(); - - // pop next message from the queue and process it. will set the last_pop to the pop time - // return false if termination of the queue is required - bool process_next_msg(log_clock::time_point& last_pop, log_clock::time_point& last_flush); - - void handle_flush_interval(log_clock::time_point& now, log_clock::time_point& last_flush); - - // sleep,yield or return immediately using the time passed since last message as a hint - static void sleep_or_yield(const spdlog::log_clock::time_point& now, const log_clock::time_point& last_op_time); - - // wait until the queue is empty - void wait_empty_q(); - -}; -} -} - -/////////////////////////////////////////////////////////////////////////////// -// async_sink class implementation -/////////////////////////////////////////////////////////////////////////////// -inline spdlog::details::async_log_helper::async_log_helper( - formatter_ptr formatter, - const std::vector& sinks, - size_t queue_size, - log_err_handler err_handler, - const async_overflow_policy overflow_policy, - const std::function& worker_warmup_cb, - const std::chrono::milliseconds& flush_interval_ms, - const std::function& worker_teardown_cb): - _formatter(formatter), - _sinks(sinks), - _q(queue_size), - _err_handler(err_handler), - _flush_requested(false), - _terminate_requested(false), - _overflow_policy(overflow_policy), - _worker_warmup_cb(worker_warmup_cb), - _flush_interval_ms(flush_interval_ms), - _worker_teardown_cb(worker_teardown_cb), - _worker_thread(&async_log_helper::worker_loop, this) -{} - -// Send to the worker thread termination message(level=off) -// and wait for it to finish gracefully -inline spdlog::details::async_log_helper::~async_log_helper() -{ - try - { - push_msg(async_msg(async_msg_type::terminate)); - _worker_thread.join(); - } - catch (...) // don't crash in destructor - { - } -} - - -//Try to push and block until succeeded (if the policy is not to discard when the queue is full) -inline void spdlog::details::async_log_helper::log(const details::log_msg& msg) -{ - push_msg(async_msg(msg)); -} - -inline void spdlog::details::async_log_helper::push_msg(details::async_log_helper::async_msg&& new_msg) -{ - if (!_q.enqueue(std::move(new_msg)) && _overflow_policy != async_overflow_policy::discard_log_msg) - { - auto last_op_time = details::os::now(); - auto now = last_op_time; - do - { - now = details::os::now(); - sleep_or_yield(now, last_op_time); - } - while (!_q.enqueue(std::move(new_msg))); - } -} - -// optionally wait for the queue be empty and request flush from the sinks -inline void spdlog::details::async_log_helper::flush(bool wait_for_q) -{ - push_msg(async_msg(async_msg_type::flush)); - if (wait_for_q) - wait_empty_q(); //return only make after the above flush message was processed -} - -inline void spdlog::details::async_log_helper::worker_loop() -{ - if (_worker_warmup_cb) _worker_warmup_cb(); - auto last_pop = details::os::now(); - auto last_flush = last_pop; - auto active = true; - while (active) - { - try - { - active = process_next_msg(last_pop, last_flush); - } - catch (const std::exception &ex) - { - _err_handler(ex.what()); - } - catch (...) - { - _err_handler("Unknown exception"); - } - } - if (_worker_teardown_cb) _worker_teardown_cb(); - - -} - -// process next message in the queue -// return true if this thread should still be active (while no terminate msg was received) -inline bool spdlog::details::async_log_helper::process_next_msg(log_clock::time_point& last_pop, log_clock::time_point& last_flush) -{ - async_msg incoming_async_msg; - - if (_q.dequeue(incoming_async_msg)) - { - last_pop = details::os::now(); - switch (incoming_async_msg.msg_type) - { - case async_msg_type::flush: - _flush_requested = true; - break; - - case async_msg_type::terminate: - _flush_requested = true; - _terminate_requested = true; - break; - - default: - log_msg incoming_log_msg; - incoming_async_msg.fill_log_msg(incoming_log_msg); - _formatter->format(incoming_log_msg); - for (auto &s : _sinks) - { - if (s->should_log(incoming_log_msg.level)) - { - s->log(incoming_log_msg); - } - } - } - return true; - } - - // Handle empty queue.. - // This is the only place where the queue can terminate or flush to avoid losing messages already in the queue - else - { - auto now = details::os::now(); - handle_flush_interval(now, last_flush); - sleep_or_yield(now, last_pop); - return !_terminate_requested; - } -} - -// flush all sinks if _flush_interval_ms has expired -inline void spdlog::details::async_log_helper::handle_flush_interval(log_clock::time_point& now, log_clock::time_point& last_flush) -{ - auto should_flush = _flush_requested || (_flush_interval_ms != std::chrono::milliseconds::zero() && now - last_flush >= _flush_interval_ms); - if (should_flush) - { - for (auto &s : _sinks) - s->flush(); - now = last_flush = details::os::now(); - _flush_requested = false; - } -} - -inline void spdlog::details::async_log_helper::set_formatter(formatter_ptr msg_formatter) -{ - _formatter = msg_formatter; -} - - -// spin, yield or sleep. use the time passed since last message as a hint -inline void spdlog::details::async_log_helper::sleep_or_yield(const spdlog::log_clock::time_point& now, const spdlog::log_clock::time_point& last_op_time) -{ - using namespace std::this_thread; - using std::chrono::milliseconds; - using std::chrono::microseconds; - - auto time_since_op = now - last_op_time; - - // spin upto 50 micros - if (time_since_op <= microseconds(50)) - return; - - // yield upto 150 micros - if (time_since_op <= microseconds(100)) - return std::this_thread::yield(); - - // sleep for 20 ms upto 200 ms - if (time_since_op <= milliseconds(200)) - return sleep_for(milliseconds(20)); - - // sleep for 200 ms - return sleep_for(milliseconds(200)); -} - -// wait for the queue to be empty -inline void spdlog::details::async_log_helper::wait_empty_q() -{ - auto last_op = details::os::now(); - while (_q.approx_size() > 0) - { - sleep_or_yield(details::os::now(), last_op); - } -} - -inline void spdlog::details::async_log_helper::set_error_handler(spdlog::log_err_handler err_handler) -{ - _err_handler = err_handler; -} - - - diff --git a/geom_matching/wasserstein/include/spdlog/details/async_logger_impl.h b/geom_matching/wasserstein/include/spdlog/details/async_logger_impl.h deleted file mode 100644 index 33486c2..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/async_logger_impl.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// Async Logger implementation -// Use an async_sink (queue per logger) to perform the logging in a worker thread - -#include "spdlog/details/async_log_helper.h" -#include "spdlog/async_logger.h" - -#include -#include -#include -#include - -template -inline spdlog::async_logger::async_logger(const std::string& logger_name, - const It& begin, - const It& end, - size_t queue_size, - const async_overflow_policy overflow_policy, - const std::function& worker_warmup_cb, - const std::chrono::milliseconds& flush_interval_ms, - const std::function& worker_teardown_cb) : - logger(logger_name, begin, end), - _async_log_helper(new details::async_log_helper(_formatter, _sinks, queue_size, _err_handler, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb)) -{ -} - -inline spdlog::async_logger::async_logger(const std::string& logger_name, - sinks_init_list sinks_list, - size_t queue_size, - const async_overflow_policy overflow_policy, - const std::function& worker_warmup_cb, - const std::chrono::milliseconds& flush_interval_ms, - const std::function& worker_teardown_cb) : - async_logger(logger_name, sinks_list.begin(), sinks_list.end(), queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {} - -inline spdlog::async_logger::async_logger(const std::string& logger_name, - sink_ptr single_sink, - size_t queue_size, - const async_overflow_policy overflow_policy, - const std::function& worker_warmup_cb, - const std::chrono::milliseconds& flush_interval_ms, - const std::function& worker_teardown_cb) : - async_logger(logger_name, -{ - single_sink -}, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {} - - -inline void spdlog::async_logger::flush() -{ - _async_log_helper->flush(true); -} - -// Error handler -inline void spdlog::async_logger::set_error_handler(spdlog::log_err_handler err_handler) -{ - _err_handler = err_handler; - _async_log_helper->set_error_handler(err_handler); - -} -inline spdlog::log_err_handler spdlog::async_logger::error_handler() -{ - return _err_handler; -} - - -inline void spdlog::async_logger::_set_formatter(spdlog::formatter_ptr msg_formatter) -{ - _formatter = msg_formatter; - _async_log_helper->set_formatter(_formatter); -} - -inline void spdlog::async_logger::_set_pattern(const std::string& pattern, pattern_time_type pattern_time) -{ - _formatter = std::make_shared(pattern, pattern_time); - _async_log_helper->set_formatter(_formatter); -} - - -inline void spdlog::async_logger::_sink_it(details::log_msg& msg) -{ - try - { -#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) - msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); -#endif - _async_log_helper->log(msg); - if (_should_flush_on(msg)) - _async_log_helper->flush(false); // do async flush - } - catch (const std::exception &ex) - { - _err_handler(ex.what()); - } - catch (...) - { - _err_handler("Unknown exception"); - } -} diff --git a/geom_matching/wasserstein/include/spdlog/details/file_helper.h b/geom_matching/wasserstein/include/spdlog/details/file_helper.h deleted file mode 100644 index d0d730e..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/file_helper.h +++ /dev/null @@ -1,117 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// Helper class for file sink -// When failing to open a file, retry several times(5) with small delay between the tries(10 ms) -// Throw spdlog_ex exception on errors - -#include "spdlog/details/os.h" -#include "spdlog/details/log_msg.h" - -#include -#include -#include -#include -#include - -namespace spdlog -{ -namespace details -{ - -class file_helper -{ - -public: - const int open_tries = 5; - const int open_interval = 10; - - explicit file_helper() : - _fd(nullptr) - {} - - file_helper(const file_helper&) = delete; - file_helper& operator=(const file_helper&) = delete; - - ~file_helper() - { - close(); - } - - - void open(const filename_t& fname, bool truncate = false) - { - - close(); - auto *mode = truncate ? SPDLOG_FILENAME_T("wb") : SPDLOG_FILENAME_T("ab"); - _filename = fname; - for (int tries = 0; tries < open_tries; ++tries) - { - if (!os::fopen_s(&_fd, fname, mode)) - return; - - std::this_thread::sleep_for(std::chrono::milliseconds(open_interval)); - } - - throw spdlog_ex("Failed opening file " + os::filename_to_str(_filename) + " for writing", errno); - } - - void reopen(bool truncate) - { - if (_filename.empty()) - throw spdlog_ex("Failed re opening file - was not opened before"); - open(_filename, truncate); - - } - - void flush() - { - std::fflush(_fd); - } - - void close() - { - if (_fd) - { - std::fclose(_fd); - _fd = nullptr; - } - } - - void write(const log_msg& msg) - { - - size_t msg_size = msg.formatted.size(); - auto data = msg.formatted.data(); - if (std::fwrite(data, 1, msg_size, _fd) != msg_size) - throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno); - } - - size_t size() - { - if (!_fd) - throw spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(_filename)); - return os::filesize(_fd); - } - - const filename_t& filename() const - { - return _filename; - } - - static bool file_exists(const filename_t& name) - { - - return os::file_exists(name); - } - -private: - FILE* _fd; - filename_t _filename; -}; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/details/log_msg.h b/geom_matching/wasserstein/include/spdlog/details/log_msg.h deleted file mode 100644 index 0d7ce4b..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/log_msg.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/common.h" -#include "spdlog/details/os.h" - - -#include -#include - -namespace spdlog -{ -namespace details -{ -struct log_msg -{ - log_msg() = default; - log_msg(const std::string *loggers_name, level::level_enum lvl) : - logger_name(loggers_name), - level(lvl), - msg_id(0) - { -#ifndef SPDLOG_NO_DATETIME - time = os::now(); -#endif - -#ifndef SPDLOG_NO_THREAD_ID - thread_id = os::thread_id(); -#endif - } - - log_msg(const log_msg& other) = delete; - log_msg& operator=(log_msg&& other) = delete; - log_msg(log_msg&& other) = delete; - - - const std::string *logger_name; - level::level_enum level; - log_clock::time_point time; - size_t thread_id; - fmt::MemoryWriter raw; - fmt::MemoryWriter formatted; - size_t msg_id; -}; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/details/logger_impl.h b/geom_matching/wasserstein/include/spdlog/details/logger_impl.h deleted file mode 100644 index 79c4ef6..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/logger_impl.h +++ /dev/null @@ -1,563 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/logger.h" -#include "spdlog/sinks/stdout_sinks.h" - -#include -#include - - -// create logger with given name, sinks and the default pattern formatter -// all other ctors will call this one -template -inline spdlog::logger::logger(const std::string& logger_name, const It& begin, const It& end): - _name(logger_name), - _sinks(begin, end), - _formatter(std::make_shared("%+")), - _level(level::info), - _flush_level(level::off), - _last_err_time(0), - _msg_counter(1) // message counter will start from 1. 0-message id will be reserved for controll messages -{ - _err_handler = [this](const std::string &msg) - { - this->_default_err_handler(msg); - }; -} - -// ctor with sinks as init list -inline spdlog::logger::logger(const std::string& logger_name, sinks_init_list sinks_list): - logger(logger_name, sinks_list.begin(), sinks_list.end()) -{} - - -// ctor with single sink -inline spdlog::logger::logger(const std::string& logger_name, spdlog::sink_ptr single_sink): - logger(logger_name, -{ - single_sink -}) -{} - - -inline spdlog::logger::~logger() = default; - - -inline void spdlog::logger::set_formatter(spdlog::formatter_ptr msg_formatter) -{ - _set_formatter(msg_formatter); -} - -inline void spdlog::logger::set_pattern(const std::string& pattern, pattern_time_type pattern_time) -{ - _set_pattern(pattern, pattern_time); -} - - -template -inline void spdlog::logger::log(level::level_enum lvl, const char* fmt, const Args&... args) -{ - if (!should_log(lvl)) return; - - try - { - details::log_msg log_msg(&_name, lvl); - log_msg.raw.write(fmt, args...); - _sink_it(log_msg); - } - catch (const std::exception &ex) - { - _err_handler(ex.what()); - } - catch (...) - { - _err_handler("Unknown exception"); - } -} - -template -inline void spdlog::logger::log(level::level_enum lvl, const char* msg) -{ - if (!should_log(lvl)) return; - try - { - details::log_msg log_msg(&_name, lvl); - log_msg.raw << msg; - _sink_it(log_msg); - } - catch (const std::exception &ex) - { - _err_handler(ex.what()); - } - catch (...) - { - _err_handler("Unknown exception"); - } - -} - -template -inline void spdlog::logger::log(level::level_enum lvl, const T& msg) -{ - if (!should_log(lvl)) return; - try - { - details::log_msg log_msg(&_name, lvl); - log_msg.raw << msg; - _sink_it(log_msg); - } - catch (const std::exception &ex) - { - _err_handler(ex.what()); - } - catch (...) - { - _err_handler("Unknown exception"); - } -} - - -template -inline void spdlog::logger::trace(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::trace, fmt, arg1, args...); -} - -template -inline void spdlog::logger::debug(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::debug, fmt, arg1, args...); -} - -template -inline void spdlog::logger::info(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::info, fmt, arg1, args...); -} - -template -inline void spdlog::logger::warn(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::warn, fmt, arg1, args...); -} - -template -inline void spdlog::logger::error(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::err, fmt, arg1, args...); -} - -template -inline void spdlog::logger::critical(const char* fmt, const Arg1 &arg1, const Args&... args) -{ - log(level::critical, fmt, arg1, args...); -} - -template -inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const char* msg) -{ - if (flag) - { - log(lvl, msg); - } -} - -template -inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const T& msg) -{ - if (flag) - { - log(lvl, msg); - } -} - -template -inline void spdlog::logger::trace_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) -{ - if (flag) - { - log(level::trace, fmt, arg1, args...); - } -} - -template -inline void spdlog::logger::debug_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) -{ - if (flag) - { - log(level::debug, fmt, arg1, args...); - } -} - -template -inline void spdlog::logger::info_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) -{ - if (flag) - { - log(level::info, fmt, arg1, args...); - } -} - -template -inline void spdlog::logger::warn_if(const bool flag, const char* fmt, const Arg1& arg1, const Args&... args) -{ - if (flag) - { - log(level::warn, fmt, arg1, args...); - } -} - -template -inline void spdlog::logger::error_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) -{ - if (flag) - { - log(level::err, fmt, arg1, args...); - } -} - -template -inline void spdlog::logger::critical_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) -{ - if (flag) - { - log(level::critical, fmt, arg1, args...); - } -} - - -template -inline void spdlog::logger::trace(const T& msg) -{ - log(level::trace, msg); -} - -template -inline void spdlog::logger::debug(const T& msg) -{ - log(level::debug, msg); -} - - -template -inline void spdlog::logger::info(const T& msg) -{ - log(level::info, msg); -} - - -template -inline void spdlog::logger::warn(const T& msg) -{ - log(level::warn, msg); -} - -template -inline void spdlog::logger::error(const T& msg) -{ - log(level::err, msg); -} - -template -inline void spdlog::logger::critical(const T& msg) -{ - log(level::critical, msg); -} - -template -inline void spdlog::logger::trace_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::trace, msg); - } -} - -template -inline void spdlog::logger::debug_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::debug, msg); - } -} - -template -inline void spdlog::logger::info_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::info, msg); - } -} - -template -inline void spdlog::logger::warn_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::warn, msg); - } -} - -template -inline void spdlog::logger::error_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::err, msg); - } -} - -template -inline void spdlog::logger::critical_if(const bool flag, const T& msg) -{ - if (flag) - { - log(level::critical, msg); - } -} - - -#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT -#include - -template -inline void spdlog::logger::log(level::level_enum lvl, const wchar_t* msg) -{ - std::wstring_convert > conv; - - log(lvl, conv.to_bytes(msg)); -} - -template -inline void spdlog::logger::log(level::level_enum lvl, const wchar_t* fmt, const Args&... args) -{ - fmt::WMemoryWriter wWriter; - - wWriter.write(fmt, args...); - log(lvl, wWriter.c_str()); -} - -template -inline void spdlog::logger::trace(const wchar_t* fmt, const Args&... args) -{ - log(level::trace, fmt, args...); -} - -template -inline void spdlog::logger::debug(const wchar_t* fmt, const Args&... args) -{ - log(level::debug, fmt, args...); -} - -template -inline void spdlog::logger::info(const wchar_t* fmt, const Args&... args) -{ - log(level::info, fmt, args...); -} - - -template -inline void spdlog::logger::warn(const wchar_t* fmt, const Args&... args) -{ - log(level::warn, fmt, args...); -} - -template -inline void spdlog::logger::error(const wchar_t* fmt, const Args&... args) -{ - log(level::err, fmt, args...); -} - -template -inline void spdlog::logger::critical(const wchar_t* fmt, const Args&... args) -{ - log(level::critical, fmt, args...); -} - -// -// conditional logging -// - -template -inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const wchar_t* msg) -{ - if (flag) - { - log(lvl, msg); - } -} - -template -inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(lvl, fmt, args); - } -} - -template -inline void spdlog::logger::trace_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::trace, fmt, args...); - } -} - -template -inline void spdlog::logger::debug_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::debug, fmt, args...); - } -} - -template -inline void spdlog::logger::info_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::info, fmt, args...); - } -} - - -template -inline void spdlog::logger::warn_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::warn, fmt, args...); - } -} - -template -inline void spdlog::logger::error_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::err, fmt, args...); - } -} - -template -inline void spdlog::logger::critical_if(const bool flag, const wchar_t* fmt, const Args&... args) -{ - if (flag) - { - log(level::critical, fmt, args...); - } -} - -#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT - - - -// -// name and level -// -inline const std::string& spdlog::logger::name() const -{ - return _name; -} - -inline void spdlog::logger::set_level(spdlog::level::level_enum log_level) -{ - _level.store(log_level); -} - -inline void spdlog::logger::set_error_handler(spdlog::log_err_handler err_handler) -{ - _err_handler = err_handler; -} - -inline spdlog::log_err_handler spdlog::logger::error_handler() -{ - return _err_handler; -} - - -inline void spdlog::logger::flush_on(level::level_enum log_level) -{ - _flush_level.store(log_level); -} - -inline spdlog::level::level_enum spdlog::logger::level() const -{ - return static_cast(_level.load(std::memory_order_relaxed)); -} - -inline bool spdlog::logger::should_log(spdlog::level::level_enum msg_level) const -{ - return msg_level >= _level.load(std::memory_order_relaxed); -} - -// -// protected virtual called at end of each user log call (if enabled) by the line_logger -// -inline void spdlog::logger::_sink_it(details::log_msg& msg) -{ -#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) - msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); -#endif - _formatter->format(msg); - for (auto &sink : _sinks) - { - if( sink->should_log( msg.level)) - { - sink->log(msg); - } - } - - if(_should_flush_on(msg)) - flush(); -} - -inline void spdlog::logger::_set_pattern(const std::string& pattern, pattern_time_type pattern_time) -{ - _formatter = std::make_shared(pattern, pattern_time); -} -inline void spdlog::logger::_set_formatter(formatter_ptr msg_formatter) -{ - _formatter = msg_formatter; -} - -inline void spdlog::logger::flush() -{ - for (auto& sink : _sinks) - sink->flush(); -} - -inline void spdlog::logger::_default_err_handler(const std::string &msg) -{ - auto now = time(nullptr); - if (now - _last_err_time < 60) - return; - auto tm_time = details::os::localtime(now); - char date_buf[100]; - std::strftime(date_buf, sizeof(date_buf), "%Y-%m-%d %H:%M:%S", &tm_time); - details::log_msg err_msg; - err_msg.formatted.write("[*** LOG ERROR ***] [{}] [{}] [{}]{}", name(), msg, date_buf, details::os::eol); - sinks::stderr_sink_mt::instance()->log(err_msg); - _last_err_time = now; -} - -inline bool spdlog::logger::_should_flush_on(const details::log_msg &msg) -{ - const auto flush_level = _flush_level.load(std::memory_order_relaxed); - return (msg.level >= flush_level) && (msg.level != level::off); -} - -inline const std::vector& spdlog::logger::sinks() const -{ - return _sinks; -} diff --git a/geom_matching/wasserstein/include/spdlog/details/mpmc_bounded_q.h b/geom_matching/wasserstein/include/spdlog/details/mpmc_bounded_q.h deleted file mode 100644 index afd4c88..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/mpmc_bounded_q.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -A modified version of Bounded MPMC queue by Dmitry Vyukov. - -Original code from: -http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue - -licensed by Dmitry Vyukov under the terms below: - -Simplified BSD license - -Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list -of conditions and the following disclaimer in the documentation and/or other materials -provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those of the authors and -should not be interpreted as representing official policies, either expressed or implied, of Dmitry Vyukov. -*/ - -/* -The code in its current form adds the license below: - -Copyright(c) 2015 Gabi Melman. -Distributed under the MIT License (http://opensource.org/licenses/MIT) - -*/ - -#pragma once - -#include "spdlog/common.h" - -#include -#include - -namespace spdlog -{ -namespace details -{ - -template -class mpmc_bounded_queue -{ -public: - - using item_type = T; - mpmc_bounded_queue(size_t buffer_size) - :max_size_(buffer_size), - buffer_(new cell_t [buffer_size]), - buffer_mask_(buffer_size - 1) - { - //queue size must be power of two - if(!((buffer_size >= 2) && ((buffer_size & (buffer_size - 1)) == 0))) - throw spdlog_ex("async logger queue size must be power of two"); - - for (size_t i = 0; i != buffer_size; i += 1) - buffer_[i].sequence_.store(i, std::memory_order_relaxed); - enqueue_pos_.store(0, std::memory_order_relaxed); - dequeue_pos_.store(0, std::memory_order_relaxed); - } - - ~mpmc_bounded_queue() - { - delete [] buffer_; - } - - - bool enqueue(T&& data) - { - cell_t* cell; - size_t pos = enqueue_pos_.load(std::memory_order_relaxed); - for (;;) - { - cell = &buffer_[pos & buffer_mask_]; - size_t seq = cell->sequence_.load(std::memory_order_acquire); - intptr_t dif = (intptr_t)seq - (intptr_t)pos; - if (dif == 0) - { - if (enqueue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed)) - break; - } - else if (dif < 0) - { - return false; - } - else - { - pos = enqueue_pos_.load(std::memory_order_relaxed); - } - } - cell->data_ = std::move(data); - cell->sequence_.store(pos + 1, std::memory_order_release); - return true; - } - - bool dequeue(T& data) - { - cell_t* cell; - size_t pos = dequeue_pos_.load(std::memory_order_relaxed); - for (;;) - { - cell = &buffer_[pos & buffer_mask_]; - size_t seq = - cell->sequence_.load(std::memory_order_acquire); - intptr_t dif = (intptr_t)seq - (intptr_t)(pos + 1); - if (dif == 0) - { - if (dequeue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed)) - break; - } - else if (dif < 0) - return false; - else - pos = dequeue_pos_.load(std::memory_order_relaxed); - } - data = std::move(cell->data_); - cell->sequence_.store(pos + buffer_mask_ + 1, std::memory_order_release); - return true; - } - - size_t approx_size() - { - size_t first_pos = dequeue_pos_.load(std::memory_order_relaxed); - size_t last_pos = enqueue_pos_.load(std::memory_order_relaxed); - if (last_pos <= first_pos) - return 0; - auto size = last_pos - first_pos; - return size < max_size_ ? size : max_size_; - } - -private: - struct cell_t - { - std::atomic sequence_; - T data_; - }; - - size_t const max_size_; - - static size_t const cacheline_size = 64; - typedef char cacheline_pad_t [cacheline_size]; - - cacheline_pad_t pad0_; - cell_t* const buffer_; - size_t const buffer_mask_; - cacheline_pad_t pad1_; - std::atomic enqueue_pos_; - cacheline_pad_t pad2_; - std::atomic dequeue_pos_; - cacheline_pad_t pad3_; - - mpmc_bounded_queue(mpmc_bounded_queue const&) = delete; - void operator= (mpmc_bounded_queue const&) = delete; -}; - -} // ns details -} // ns spdlog diff --git a/geom_matching/wasserstein/include/spdlog/details/null_mutex.h b/geom_matching/wasserstein/include/spdlog/details/null_mutex.h deleted file mode 100644 index 67b0aee..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/null_mutex.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include -// null, no cost dummy "mutex" and dummy "atomic" int - -namespace spdlog -{ -namespace details -{ -struct null_mutex -{ - void lock() {} - void unlock() {} - bool try_lock() - { - return true; - } -}; - -struct null_atomic_int -{ - int value; - null_atomic_int() = default; - - null_atomic_int(int val):value(val) - {} - - int load(std::memory_order) const - { - return value; - } - - void store(int val) - { - value = val; - } -}; - -} -} diff --git a/geom_matching/wasserstein/include/spdlog/details/os.h b/geom_matching/wasserstein/include/spdlog/details/os.h deleted file mode 100644 index 735f601..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/os.h +++ /dev/null @@ -1,469 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// -#pragma once - -#include "spdlog/common.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 - -#ifndef NOMINMAX -#define NOMINMAX //prevent windows redefining min/max -#endif - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include // _get_pid support -#include // _get_osfhandle and _isatty support - -#ifdef __MINGW32__ -#include -#endif - -#else // unix - -#include -#include - -#ifdef __linux__ -#include //Use gettid() syscall under linux to get thread id - -#elif __FreeBSD__ -#include //Use thr_self() syscall under FreeBSD to get thread id -#endif - -#endif //unix - -#ifndef __has_feature // Clang - feature checking macros. -#define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif - - -namespace spdlog -{ -namespace details -{ -namespace os -{ - -inline spdlog::log_clock::time_point now() -{ - -#if defined __linux__ && defined SPDLOG_CLOCK_COARSE - timespec ts; - ::clock_gettime(CLOCK_REALTIME_COARSE, &ts); - return std::chrono::time_point( - std::chrono::duration_cast( - std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec))); - - -#else - return log_clock::now(); -#endif - -} -inline std::tm localtime(const std::time_t &time_tt) -{ - -#ifdef _WIN32 - std::tm tm; - localtime_s(&tm, &time_tt); -#else - std::tm tm; - localtime_r(&time_tt, &tm); -#endif - return tm; -} - -inline std::tm localtime() -{ - std::time_t now_t = time(nullptr); - return localtime(now_t); -} - - -inline std::tm gmtime(const std::time_t &time_tt) -{ - -#ifdef _WIN32 - std::tm tm; - gmtime_s(&tm, &time_tt); -#else - std::tm tm; - gmtime_r(&time_tt, &tm); -#endif - return tm; -} - -inline std::tm gmtime() -{ - std::time_t now_t = time(nullptr); - return gmtime(now_t); -} -inline bool operator==(const std::tm& tm1, const std::tm& tm2) -{ - return (tm1.tm_sec == tm2.tm_sec && - tm1.tm_min == tm2.tm_min && - tm1.tm_hour == tm2.tm_hour && - tm1.tm_mday == tm2.tm_mday && - tm1.tm_mon == tm2.tm_mon && - tm1.tm_year == tm2.tm_year && - tm1.tm_isdst == tm2.tm_isdst); -} - -inline bool operator!=(const std::tm& tm1, const std::tm& tm2) -{ - return !(tm1 == tm2); -} - -// eol definition -#if !defined (SPDLOG_EOL) -#ifdef _WIN32 -#define SPDLOG_EOL "\r\n" -#else -#define SPDLOG_EOL "\n" -#endif -#endif - -SPDLOG_CONSTEXPR static const char* eol = SPDLOG_EOL; -SPDLOG_CONSTEXPR static int eol_size = sizeof(SPDLOG_EOL) - 1; - -inline void prevent_child_fd(FILE *f) -{ -#ifdef _WIN32 - auto file_handle = (HANDLE)_get_osfhandle(_fileno(f)); - if (!::SetHandleInformation(file_handle, HANDLE_FLAG_INHERIT, 0)) - throw spdlog_ex("SetHandleInformation failed", errno); -#else - auto fd = fileno(f); - if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) - throw spdlog_ex("fcntl with FD_CLOEXEC failed", errno); -#endif -} - - -//fopen_s on non windows for writing -inline int fopen_s(FILE** fp, const filename_t& filename, const filename_t& mode) -{ -#ifdef _WIN32 -#ifdef SPDLOG_WCHAR_FILENAMES - *fp = _wfsopen((filename.c_str()), mode.c_str(), _SH_DENYWR); -#else - *fp = _fsopen((filename.c_str()), mode.c_str(), _SH_DENYWR); -#endif -#else //unix - *fp = fopen((filename.c_str()), mode.c_str()); -#endif - -#ifdef SPDLOG_PREVENT_CHILD_FD - if (*fp != nullptr) - prevent_child_fd(*fp); -#endif - return *fp == nullptr; -} - - -inline int remove(const filename_t &filename) -{ -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) - return _wremove(filename.c_str()); -#else - return std::remove(filename.c_str()); -#endif -} - -inline int rename(const filename_t& filename1, const filename_t& filename2) -{ -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) - return _wrename(filename1.c_str(), filename2.c_str()); -#else - return std::rename(filename1.c_str(), filename2.c_str()); -#endif -} - - -//Return if file exists -inline bool file_exists(const filename_t& filename) -{ -#ifdef _WIN32 -#ifdef SPDLOG_WCHAR_FILENAMES - auto attribs = GetFileAttributesW(filename.c_str()); -#else - auto attribs = GetFileAttributesA(filename.c_str()); -#endif - return (attribs != INVALID_FILE_ATTRIBUTES && !(attribs & FILE_ATTRIBUTE_DIRECTORY)); -#else //common linux/unix all have the stat system call - struct stat buffer; - return (stat(filename.c_str(), &buffer) == 0); -#endif -} - - - - -//Return file size according to open FILE* object -inline size_t filesize(FILE *f) -{ - if (f == nullptr) - throw spdlog_ex("Failed getting file size. fd is null"); -#ifdef _WIN32 - int fd = _fileno(f); -#if _WIN64 //64 bits - struct _stat64 st; - if (_fstat64(fd, &st) == 0) - return st.st_size; - -#else //windows 32 bits - long ret = _filelength(fd); - if (ret >= 0) - return static_cast(ret); -#endif - -#else // unix - int fd = fileno(f); - //64 bits(but not in osx, where fstat64 is deprecated) -#if !defined(__FreeBSD__) && !defined(__APPLE__) && (defined(__x86_64__) || defined(__ppc64__)) - struct stat64 st; - if (fstat64(fd, &st) == 0) - return static_cast(st.st_size); -#else // unix 32 bits or osx - struct stat st; - if (fstat(fd, &st) == 0) - return static_cast(st.st_size); -#endif -#endif - throw spdlog_ex("Failed getting file size from fd", errno); -} - - - - -//Return utc offset in minutes or throw spdlog_ex on failure -inline int utc_minutes_offset(const std::tm& tm = details::os::localtime()) -{ - -#ifdef _WIN32 -#if _WIN32_WINNT < _WIN32_WINNT_WS08 - TIME_ZONE_INFORMATION tzinfo; - auto rv = GetTimeZoneInformation(&tzinfo); -#else - DYNAMIC_TIME_ZONE_INFORMATION tzinfo; - auto rv = GetDynamicTimeZoneInformation(&tzinfo); -#endif - if (rv == TIME_ZONE_ID_INVALID) - throw spdlog::spdlog_ex("Failed getting timezone info. ", errno); - - int offset = -tzinfo.Bias; - if (tm.tm_isdst) - offset -= tzinfo.DaylightBias; - else - offset -= tzinfo.StandardBias; - return offset; -#else - -#if defined(sun) || defined(__sun) - // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris - struct helper - { - static long int calculate_gmt_offset(const std::tm & localtm = details::os::localtime(), const std::tm & gmtm = details::os::gmtime()) - { - int local_year = localtm.tm_year + (1900 - 1); - int gmt_year = gmtm.tm_year + (1900 - 1); - - long int days = ( - // difference in day of year - localtm.tm_yday - gmtm.tm_yday - - // + intervening leap days - + ((local_year >> 2) - (gmt_year >> 2)) - - (local_year / 100 - gmt_year / 100) - + ((local_year / 100 >> 2) - (gmt_year / 100 >> 2)) - - // + difference in years * 365 */ - + (long int)(local_year - gmt_year) * 365 - ); - - long int hours = (24 * days) + (localtm.tm_hour - gmtm.tm_hour); - long int mins = (60 * hours) + (localtm.tm_min - gmtm.tm_min); - long int secs = (60 * mins) + (localtm.tm_sec - gmtm.tm_sec); - - return secs; - } - }; - - long int offset_seconds = helper::calculate_gmt_offset(tm); -#else - long int offset_seconds = tm.tm_gmtoff; -#endif - - return static_cast(offset_seconds / 60); -#endif -} - -//Return current thread id as size_t -//It exists because the std::this_thread::get_id() is much slower(espcially under VS 2013) -inline size_t _thread_id() -{ -#ifdef _WIN32 - return static_cast(::GetCurrentThreadId()); -#elif __linux__ -# if defined(__ANDROID__) && defined(__ANDROID_API__) && (__ANDROID_API__ < 21) -# define SYS_gettid __NR_gettid -# endif - return static_cast(syscall(SYS_gettid)); -#elif __FreeBSD__ - long tid; - thr_self(&tid); - return static_cast(tid); -#elif __APPLE__ - uint64_t tid; - pthread_threadid_np(nullptr, &tid); - return static_cast(tid); -#else //Default to standard C++11 (other Unix) - return static_cast(std::hash()(std::this_thread::get_id())); -#endif -} - -//Return current thread id as size_t (from thread local storage) -inline size_t thread_id() -{ -#if defined(_MSC_VER) && (_MSC_VER < 1900) || defined(__clang__) && !__has_feature(cxx_thread_local) - return _thread_id(); -#else - static thread_local const size_t tid = _thread_id(); - return tid; -#endif -} - - - - -// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -#define SPDLOG_FILENAME_T(s) L ## s -inline std::string filename_to_str(const filename_t& filename) -{ - std::wstring_convert, wchar_t> c; - return c.to_bytes(filename); -} -#else -#define SPDLOG_FILENAME_T(s) s -inline std::string filename_to_str(const filename_t& filename) -{ - return filename; -} -#endif - -inline std::string errno_to_string(char[256], char* res) -{ - return std::string(res); -} - -inline std::string errno_to_string(char buf[256], int res) -{ - if (res == 0) - { - return std::string(buf); - } - else - { - return "Unknown error"; - } -} - -// Return errno string (thread safe) -inline std::string errno_str(int err_num) -{ - char buf[256]; - SPDLOG_CONSTEXPR auto buf_size = sizeof(buf); - -#ifdef _WIN32 - if (strerror_s(buf, buf_size, err_num) == 0) - return std::string(buf); - else - return "Unknown error"; - -#elif defined(__FreeBSD__) || defined(__APPLE__) || defined(ANDROID) || defined(__SUNPRO_CC) || \ - ((_POSIX_C_SOURCE >= 200112L) && ! defined(_GNU_SOURCE)) // posix version - - if (strerror_r(err_num, buf, buf_size) == 0) - return std::string(buf); - else - return "Unknown error"; - -#else // gnu version (might not use the given buf, so its retval pointer must be used) - auto err = strerror_r(err_num, buf, buf_size); // let compiler choose type - return errno_to_string(buf, err); // use overloading to select correct stringify function -#endif -} - -inline int pid() -{ - -#ifdef _WIN32 - return ::_getpid(); -#else - return static_cast(::getpid()); -#endif - -} - - -// Detrmine if the terminal supports colors -// Source: https://github.com/agauniyal/rang/ -inline bool is_color_terminal() -{ -#ifdef _WIN32 - return true; -#else - static constexpr const char* Terms[] = - { - "ansi", "color", "console", "cygwin", "gnome", "konsole", "kterm", - "linux", "msys", "putty", "rxvt", "screen", "vt100", "xterm" - }; - - const char *env_p = std::getenv("TERM"); - if (env_p == nullptr) - { - return false; - } - - static const bool result = std::any_of( - std::begin(Terms), std::end(Terms), [&](const char* term) - { - return std::strstr(env_p, term) != nullptr; - }); - return result; -#endif -} - - -// Detrmine if the terminal attached -// Source: https://github.com/agauniyal/rang/ -inline bool in_terminal(FILE* file) -{ - -#ifdef _WIN32 - return _isatty(_fileno(file)) ? true : false; -#else - return isatty(fileno(file)) ? true : false; -#endif -} -} //os -} //details -} //spdlog diff --git a/geom_matching/wasserstein/include/spdlog/details/pattern_formatter_impl.h b/geom_matching/wasserstein/include/spdlog/details/pattern_formatter_impl.h deleted file mode 100644 index c1ce719..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/pattern_formatter_impl.h +++ /dev/null @@ -1,690 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/formatter.h" -#include "spdlog/details/log_msg.h" -#include "spdlog/details/os.h" -#include "spdlog/fmt/fmt.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace spdlog -{ -namespace details -{ -class flag_formatter -{ -public: - virtual ~flag_formatter() - {} - virtual void format(details::log_msg& msg, const std::tm& tm_time) = 0; -}; - -/////////////////////////////////////////////////////////////////////// -// name & level pattern appenders -/////////////////////////////////////////////////////////////////////// -namespace -{ -class name_formatter:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << *msg.logger_name; - } -}; -} - -// log level appender -class level_formatter:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << level::to_str(msg.level); - } -}; - -// short log level appender -class short_level_formatter:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << level::to_short_str(msg.level); - } -}; - -/////////////////////////////////////////////////////////////////////// -// Date time pattern appenders -/////////////////////////////////////////////////////////////////////// - -static const char* ampm(const tm& t) -{ - return t.tm_hour >= 12 ? "PM" : "AM"; -} - -static int to12h(const tm& t) -{ - return t.tm_hour > 12 ? t.tm_hour - 12 : t.tm_hour; -} - -//Abbreviated weekday name -using days_array = std::array; -static const days_array& days() -{ - static const days_array arr{ { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } }; - return arr; -} -class a_formatter:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << days()[tm_time.tm_wday]; - } -}; -// message counter formatter -class i_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << '#' << msg.msg_id; - } -}; -//Full weekday name -static const days_array& full_days() -{ - static const days_array arr{ { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" } }; - return arr; -} -class A_formatter SPDLOG_FINAL :public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << full_days()[tm_time.tm_wday]; - } -}; - -//Abbreviated month -using months_array = std::array; -static const months_array& months() -{ - static const months_array arr{ { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec" } }; - return arr; -} -class b_formatter:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << months()[tm_time.tm_mon]; - } -}; - -//Full month name -static const months_array& full_months() -{ - static const months_array arr{ { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" } }; - return arr; -} -class B_formatter SPDLOG_FINAL :public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << full_months()[tm_time.tm_mon]; - } -}; - - -//write 2 ints seperated by sep with padding of 2 -static fmt::MemoryWriter& pad_n_join(fmt::MemoryWriter& w, int v1, int v2, char sep) -{ - w << fmt::pad(v1, 2, '0') << sep << fmt::pad(v2, 2, '0'); - return w; -} - -//write 3 ints seperated by sep with padding of 2 -static fmt::MemoryWriter& pad_n_join(fmt::MemoryWriter& w, int v1, int v2, int v3, char sep) -{ - w << fmt::pad(v1, 2, '0') << sep << fmt::pad(v2, 2, '0') << sep << fmt::pad(v3, 2, '0'); - return w; -} - - -//Date and time representation (Thu Aug 23 15:35:46 2014) -class c_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << days()[tm_time.tm_wday] << ' ' << months()[tm_time.tm_mon] << ' ' << tm_time.tm_mday << ' '; - pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, ':') << ' ' << tm_time.tm_year + 1900; - } -}; - - -// year - 2 digit -class C_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_year % 100, 2, '0'); - } -}; - - - -// Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01 -class D_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - pad_n_join(msg.formatted, tm_time.tm_mon + 1, tm_time.tm_mday, tm_time.tm_year % 100, '/'); - } -}; - - -// year - 4 digit -class Y_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << tm_time.tm_year + 1900; - } -}; - -// month 1-12 -class m_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_mon + 1, 2, '0'); - } -}; - -// day of month 1-31 -class d_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_mday, 2, '0'); - } -}; - -// hours in 24 format 0-23 -class H_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_hour, 2, '0'); - } -}; - -// hours in 12 format 1-12 -class I_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(to12h(tm_time), 2, '0'); - } -}; - -// minutes 0-59 -class M_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_min, 2, '0'); - } -}; - -// seconds 0-59 -class S_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << fmt::pad(tm_time.tm_sec, 2, '0'); - } -}; - -// milliseconds -class e_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - auto duration = msg.time.time_since_epoch(); - auto millis = std::chrono::duration_cast(duration).count() % 1000; - msg.formatted << fmt::pad(static_cast(millis), 3, '0'); - } -}; - -// microseconds -class f_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - auto duration = msg.time.time_since_epoch(); - auto micros = std::chrono::duration_cast(duration).count() % 1000000; - msg.formatted << fmt::pad(static_cast(micros), 6, '0'); - } -}; - -// nanoseconds -class F_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - auto duration = msg.time.time_since_epoch(); - auto ns = std::chrono::duration_cast(duration).count() % 1000000000; - msg.formatted << fmt::pad(static_cast(ns), 9, '0'); - } -}; - -// AM/PM -class p_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - msg.formatted << ampm(tm_time); - } -}; - - -// 12 hour clock 02:55:02 pm -class r_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - pad_n_join(msg.formatted, to12h(tm_time), tm_time.tm_min, tm_time.tm_sec, ':') << ' ' << ampm(tm_time); - } -}; - -// 24-hour HH:MM time, equivalent to %H:%M -class R_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, ':'); - } -}; - -// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S -class T_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { - pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, ':'); - } -}; - -// ISO 8601 offset from UTC in timezone (+-HH:MM) -class z_formatter SPDLOG_FINAL:public flag_formatter -{ -public: - const std::chrono::seconds cache_refresh = std::chrono::seconds(5); - - z_formatter():_last_update(std::chrono::seconds(0)), _offset_minutes(0) - {} - z_formatter(const z_formatter&) = delete; - z_formatter& operator=(const z_formatter&) = delete; - - void format(details::log_msg& msg, const std::tm& tm_time) override - { -#ifdef _WIN32 - int total_minutes = get_cached_offset(msg, tm_time); -#else - // No need to chache under gcc, - // it is very fast (already stored in tm.tm_gmtoff) - int total_minutes = os::utc_minutes_offset(tm_time); -#endif - bool is_negative = total_minutes < 0; - char sign; - if (is_negative) - { - total_minutes = -total_minutes; - sign = '-'; - } - else - { - sign = '+'; - } - - int h = total_minutes / 60; - int m = total_minutes % 60; - msg.formatted << sign; - pad_n_join(msg.formatted, h, m, ':'); - } -private: - log_clock::time_point _last_update; - int _offset_minutes; - std::mutex _mutex; - - int get_cached_offset(const log_msg& msg, const std::tm& tm_time) - { - using namespace std::chrono; - std::lock_guard l(_mutex); - if (msg.time - _last_update >= cache_refresh) - { - _offset_minutes = os::utc_minutes_offset(tm_time); - _last_update = msg.time; - } - return _offset_minutes; - } -}; - - - -// Thread id -class t_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << msg.thread_id; - } -}; - -// Current pid -class pid_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << details::os::pid(); - } -}; - - -class v_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << fmt::StringRef(msg.raw.data(), msg.raw.size()); - } -}; - -class ch_formatter SPDLOG_FINAL:public flag_formatter -{ -public: - explicit ch_formatter(char ch): _ch(ch) - {} - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << _ch; - } -private: - char _ch; -}; - - -//aggregate user chars to display as is -class aggregate_formatter SPDLOG_FINAL:public flag_formatter -{ -public: - aggregate_formatter() - {} - void add_ch(char ch) - { - _str += ch; - } - void format(details::log_msg& msg, const std::tm&) override - { - msg.formatted << _str; - } -private: - std::string _str; -}; - -// Full info formatter -// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] %v -class full_formatter SPDLOG_FINAL:public flag_formatter -{ - void format(details::log_msg& msg, const std::tm& tm_time) override - { -#ifndef SPDLOG_NO_DATETIME - auto duration = msg.time.time_since_epoch(); - auto millis = std::chrono::duration_cast(duration).count() % 1000; - - /* Slower version(while still very fast - about 3.2 million lines/sec under 10 threads), - msg.formatted.write("[{:d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}.{:03d}] [{}] [{}] {} ", - tm_time.tm_year + 1900, - tm_time.tm_mon + 1, - tm_time.tm_mday, - tm_time.tm_hour, - tm_time.tm_min, - tm_time.tm_sec, - static_cast(millis), - msg.logger_name, - level::to_str(msg.level), - msg.raw.str());*/ - - - // Faster (albeit uglier) way to format the line (5.6 million lines/sec under 10 threads) - msg.formatted << '[' << static_cast(tm_time.tm_year + 1900) << '-' - << fmt::pad(static_cast(tm_time.tm_mon + 1), 2, '0') << '-' - << fmt::pad(static_cast(tm_time.tm_mday), 2, '0') << ' ' - << fmt::pad(static_cast(tm_time.tm_hour), 2, '0') << ':' - << fmt::pad(static_cast(tm_time.tm_min), 2, '0') << ':' - << fmt::pad(static_cast(tm_time.tm_sec), 2, '0') << '.' - << fmt::pad(static_cast(millis), 3, '0') << "] "; - - //no datetime needed -#else - (void)tm_time; -#endif - -#ifndef SPDLOG_NO_NAME - msg.formatted << '[' << *msg.logger_name << "] "; -#endif - - msg.formatted << '[' << level::to_str(msg.level) << "] "; - msg.formatted << fmt::StringRef(msg.raw.data(), msg.raw.size()); - } -}; - - - -} -} -/////////////////////////////////////////////////////////////////////////////// -// pattern_formatter inline impl -/////////////////////////////////////////////////////////////////////////////// -inline spdlog::pattern_formatter::pattern_formatter(const std::string& pattern, pattern_time_type pattern_time) - : _pattern_time(pattern_time) -{ - compile_pattern(pattern); -} - -inline void spdlog::pattern_formatter::compile_pattern(const std::string& pattern) -{ - auto end = pattern.end(); - std::unique_ptr user_chars; - for (auto it = pattern.begin(); it != end; ++it) - { - if (*it == '%') - { - if (user_chars) //append user chars found so far - _formatters.push_back(std::move(user_chars)); - - if (++it != end) - handle_flag(*it); - else - break; - } - else // chars not following the % sign should be displayed as is - { - if (!user_chars) - user_chars = std::unique_ptr(new details::aggregate_formatter()); - user_chars->add_ch(*it); - } - } - if (user_chars) //append raw chars found so far - { - _formatters.push_back(std::move(user_chars)); - } - -} -inline void spdlog::pattern_formatter::handle_flag(char flag) -{ - switch (flag) - { - // logger name - case 'n': - _formatters.push_back(std::unique_ptr(new details::name_formatter())); - break; - - case 'l': - _formatters.push_back(std::unique_ptr(new details::level_formatter())); - break; - - case 'L': - _formatters.push_back(std::unique_ptr(new details::short_level_formatter())); - break; - - case('t'): - _formatters.push_back(std::unique_ptr(new details::t_formatter())); - break; - - case('v'): - _formatters.push_back(std::unique_ptr(new details::v_formatter())); - break; - - case('a'): - _formatters.push_back(std::unique_ptr(new details::a_formatter())); - break; - - case('A'): - _formatters.push_back(std::unique_ptr(new details::A_formatter())); - break; - - case('b'): - case('h'): - _formatters.push_back(std::unique_ptr(new details::b_formatter())); - break; - - case('B'): - _formatters.push_back(std::unique_ptr(new details::B_formatter())); - break; - case('c'): - _formatters.push_back(std::unique_ptr(new details::c_formatter())); - break; - - case('C'): - _formatters.push_back(std::unique_ptr(new details::C_formatter())); - break; - - case('Y'): - _formatters.push_back(std::unique_ptr(new details::Y_formatter())); - break; - - case('D'): - case('x'): - - _formatters.push_back(std::unique_ptr(new details::D_formatter())); - break; - - case('m'): - _formatters.push_back(std::unique_ptr(new details::m_formatter())); - break; - - case('d'): - _formatters.push_back(std::unique_ptr(new details::d_formatter())); - break; - - case('H'): - _formatters.push_back(std::unique_ptr(new details::H_formatter())); - break; - - case('I'): - _formatters.push_back(std::unique_ptr(new details::I_formatter())); - break; - - case('M'): - _formatters.push_back(std::unique_ptr(new details::M_formatter())); - break; - - case('S'): - _formatters.push_back(std::unique_ptr(new details::S_formatter())); - break; - - case('e'): - _formatters.push_back(std::unique_ptr(new details::e_formatter())); - break; - - case('f'): - _formatters.push_back(std::unique_ptr(new details::f_formatter())); - break; - case('F'): - _formatters.push_back(std::unique_ptr(new details::F_formatter())); - break; - - case('p'): - _formatters.push_back(std::unique_ptr(new details::p_formatter())); - break; - - case('r'): - _formatters.push_back(std::unique_ptr(new details::r_formatter())); - break; - - case('R'): - _formatters.push_back(std::unique_ptr(new details::R_formatter())); - break; - - case('T'): - case('X'): - _formatters.push_back(std::unique_ptr(new details::T_formatter())); - break; - - case('z'): - _formatters.push_back(std::unique_ptr(new details::z_formatter())); - break; - - case ('+'): - _formatters.push_back(std::unique_ptr(new details::full_formatter())); - break; - - case ('P'): - _formatters.push_back(std::unique_ptr(new details::pid_formatter())); - break; - -#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) - case ('i'): - _formatters.push_back(std::unique_ptr(new details::i_formatter())); - break; -#endif - - default: //Unknown flag appears as is - _formatters.push_back(std::unique_ptr(new details::ch_formatter('%'))); - _formatters.push_back(std::unique_ptr(new details::ch_formatter(flag))); - break; - } -} - -inline std::tm spdlog::pattern_formatter::get_time(details::log_msg& msg) -{ - if (_pattern_time == pattern_time_type::local) - return details::os::localtime(log_clock::to_time_t(msg.time)); - else - return details::os::gmtime(log_clock::to_time_t(msg.time)); -} - -inline void spdlog::pattern_formatter::format(details::log_msg& msg) -{ - -#ifndef SPDLOG_NO_DATETIME - auto tm_time = get_time(msg); -#else - std::tm tm_time; -#endif - for (auto &f : _formatters) - { - f->format(msg, tm_time); - } - //write eol - msg.formatted.write(details::os::eol, details::os::eol_size); -} diff --git a/geom_matching/wasserstein/include/spdlog/details/registry.h b/geom_matching/wasserstein/include/spdlog/details/registry.h deleted file mode 100644 index b518990..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/registry.h +++ /dev/null @@ -1,214 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// Loggers registy of unique name->logger pointer -// An attempt to create a logger with an already existing name will be ignored -// If user requests a non existing logger, nullptr will be returned -// This class is thread safe - -#include "spdlog/details/null_mutex.h" -#include "spdlog/logger.h" -#include "spdlog/async_logger.h" -#include "spdlog/common.h" - -#include -#include -#include -#include -#include -#include - -namespace spdlog -{ -namespace details -{ -template class registry_t -{ -public: - - void register_logger(std::shared_ptr logger) - { - std::lock_guard lock(_mutex); - auto logger_name = logger->name(); - throw_if_exists(logger_name); - _loggers[logger_name] = logger; - } - - - std::shared_ptr get(const std::string& logger_name) - { - std::lock_guard lock(_mutex); - auto found = _loggers.find(logger_name); - return found == _loggers.end() ? nullptr : found->second; - } - - template - std::shared_ptr create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end) - { - std::lock_guard lock(_mutex); - throw_if_exists(logger_name); - std::shared_ptr new_logger; - if (_async_mode) - new_logger = std::make_shared(logger_name, sinks_begin, sinks_end, _async_q_size, _overflow_policy, _worker_warmup_cb, _flush_interval_ms, _worker_teardown_cb); - else - new_logger = std::make_shared(logger_name, sinks_begin, sinks_end); - - if (_formatter) - new_logger->set_formatter(_formatter); - - if (_err_handler) - new_logger->set_error_handler(_err_handler); - - new_logger->set_level(_level); - - - //Add to registry - _loggers[logger_name] = new_logger; - return new_logger; - } - - template - std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, const It& sinks_begin, const It& sinks_end) - { - std::lock_guard lock(_mutex); - throw_if_exists(logger_name); - auto new_logger = std::make_shared(logger_name, sinks_begin, sinks_end, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb); - - if (_formatter) - new_logger->set_formatter(_formatter); - - if (_err_handler) - new_logger->set_error_handler(_err_handler); - - new_logger->set_level(_level); - - //Add to registry - _loggers[logger_name] = new_logger; - return new_logger; - } - - void apply_all(std::function)> fun) - { - std::lock_guard lock(_mutex); - for (auto &l : _loggers) - fun(l.second); - } - - void drop(const std::string& logger_name) - { - std::lock_guard lock(_mutex); - _loggers.erase(logger_name); - } - - void drop_all() - { - std::lock_guard lock(_mutex); - _loggers.clear(); - } - std::shared_ptr create(const std::string& logger_name, sinks_init_list sinks) - { - return create(logger_name, sinks.begin(), sinks.end()); - } - - std::shared_ptr create(const std::string& logger_name, sink_ptr sink) - { - return create(logger_name, { sink }); - } - - std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, sinks_init_list sinks) - { - return create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks.begin(), sinks.end()); - } - - std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, sink_ptr sink) - { - return create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, { sink }); - } - - void formatter(formatter_ptr f) - { - std::lock_guard lock(_mutex); - _formatter = f; - for (auto& l : _loggers) - l.second->set_formatter(_formatter); - } - - void set_pattern(const std::string& pattern) - { - std::lock_guard lock(_mutex); - _formatter = std::make_shared(pattern); - for (auto& l : _loggers) - l.second->set_formatter(_formatter); - } - - void set_level(level::level_enum log_level) - { - std::lock_guard lock(_mutex); - for (auto& l : _loggers) - l.second->set_level(log_level); - _level = log_level; - } - - void set_error_handler(log_err_handler handler) - { - for (auto& l : _loggers) - l.second->set_error_handler(handler); - _err_handler = handler; - } - - void set_async_mode(size_t q_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) - { - std::lock_guard lock(_mutex); - _async_mode = true; - _async_q_size = q_size; - _overflow_policy = overflow_policy; - _worker_warmup_cb = worker_warmup_cb; - _flush_interval_ms = flush_interval_ms; - _worker_teardown_cb = worker_teardown_cb; - } - - void set_sync_mode() - { - std::lock_guard lock(_mutex); - _async_mode = false; - } - - static registry_t& instance() - { - static registry_t s_instance; - return s_instance; - } - -private: - registry_t() {} - registry_t(const registry_t&) = delete; - registry_t& operator=(const registry_t&) = delete; - - void throw_if_exists(const std::string &logger_name) - { - if (_loggers.find(logger_name) != _loggers.end()) - throw spdlog_ex("logger with name '" + logger_name + "' already exists"); - } - Mutex _mutex; - std::unordered_map > _loggers; - formatter_ptr _formatter; - level::level_enum _level = level::info; - log_err_handler _err_handler; - bool _async_mode = false; - size_t _async_q_size = 0; - async_overflow_policy _overflow_policy = async_overflow_policy::block_retry; - std::function _worker_warmup_cb = nullptr; - std::chrono::milliseconds _flush_interval_ms; - std::function _worker_teardown_cb = nullptr; -}; -#ifdef SPDLOG_NO_REGISTRY_MUTEX -typedef registry_t registry; -#else -typedef registry_t registry; -#endif -} -} diff --git a/geom_matching/wasserstein/include/spdlog/details/spdlog_impl.h b/geom_matching/wasserstein/include/spdlog/details/spdlog_impl.h deleted file mode 100644 index 7fe9ab4..0000000 --- a/geom_matching/wasserstein/include/spdlog/details/spdlog_impl.h +++ /dev/null @@ -1,263 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// -// Global registry functions -// -#include "spdlog/spdlog.h" -#include "spdlog/details/registry.h" -#include "spdlog/sinks/file_sinks.h" -#include "spdlog/sinks/stdout_sinks.h" -#ifdef SPDLOG_ENABLE_SYSLOG -#include "spdlog/sinks/syslog_sink.h" -#endif - -#ifdef _WIN32 -#include "spdlog/sinks/wincolor_sink.h" -#else -#include "spdlog/sinks/ansicolor_sink.h" -#endif - - -#ifdef __ANDROID__ -#include "spdlog/sinks/android_sink.h" -#endif - -#include -#include -#include -#include - -inline void spdlog::register_logger(std::shared_ptr logger) -{ - return details::registry::instance().register_logger(logger); -} - -inline std::shared_ptr spdlog::get(const std::string& name) -{ - return details::registry::instance().get(name); -} - -inline void spdlog::drop(const std::string &name) -{ - details::registry::instance().drop(name); -} - -// Create multi/single threaded simple file logger -inline std::shared_ptr spdlog::basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate) -{ - return create(logger_name, filename, truncate); -} - -inline std::shared_ptr spdlog::basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate) -{ - return create(logger_name, filename, truncate); -} - -// Create multi/single threaded rotating file logger -inline std::shared_ptr spdlog::rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files) -{ - return create(logger_name, filename, max_file_size, max_files); -} - -inline std::shared_ptr spdlog::rotating_logger_st(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files) -{ - return create(logger_name, filename, max_file_size, max_files); -} - -// Create file logger which creates new file at midnight): -inline std::shared_ptr spdlog::daily_logger_mt(const std::string& logger_name, const filename_t& filename, int hour, int minute) -{ - return create(logger_name, filename, hour, minute); -} - -inline std::shared_ptr spdlog::daily_logger_st(const std::string& logger_name, const filename_t& filename, int hour, int minute) -{ - return create(logger_name, filename, hour, minute); -} - - -// -// stdout/stderr loggers -// -inline std::shared_ptr spdlog::stdout_logger_mt(const std::string& logger_name) -{ - return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stdout_sink_mt::instance()); -} - -inline std::shared_ptr spdlog::stdout_logger_st(const std::string& logger_name) -{ - return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stdout_sink_st::instance()); -} - -inline std::shared_ptr spdlog::stderr_logger_mt(const std::string& logger_name) -{ - return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stderr_sink_mt::instance()); -} - -inline std::shared_ptr spdlog::stderr_logger_st(const std::string& logger_name) -{ - return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stderr_sink_st::instance()); -} - -// -// stdout/stderr color loggers -// -#ifdef _WIN32 -inline std::shared_ptr spdlog::stdout_color_mt(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -inline std::shared_ptr spdlog::stdout_color_st(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -inline std::shared_ptr spdlog::stderr_color_mt(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - - -inline std::shared_ptr spdlog::stderr_color_st(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -#else //ansi terminal colors - -inline std::shared_ptr spdlog::stdout_color_mt(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -inline std::shared_ptr spdlog::stdout_color_st(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -inline std::shared_ptr spdlog::stderr_color_mt(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} - -inline std::shared_ptr spdlog::stderr_color_st(const std::string& logger_name) -{ - auto sink = std::make_shared(); - return spdlog::details::registry::instance().create(logger_name, sink); -} -#endif - -#ifdef SPDLOG_ENABLE_SYSLOG -// Create syslog logger -inline std::shared_ptr spdlog::syslog_logger(const std::string& logger_name, const std::string& syslog_ident, int syslog_option) -{ - return create(logger_name, syslog_ident, syslog_option); -} -#endif - -#ifdef __ANDROID__ -inline std::shared_ptr spdlog::android_logger(const std::string& logger_name, const std::string& tag) -{ - return create(logger_name, tag); -} -#endif - -// Create and register a logger a single sink -inline std::shared_ptr spdlog::create(const std::string& logger_name, const spdlog::sink_ptr& sink) -{ - return details::registry::instance().create(logger_name, sink); -} - -//Create logger with multiple sinks - -inline std::shared_ptr spdlog::create(const std::string& logger_name, spdlog::sinks_init_list sinks) -{ - return details::registry::instance().create(logger_name, sinks); -} - - -template -inline std::shared_ptr spdlog::create(const std::string& logger_name, Args... args) -{ - sink_ptr sink = std::make_shared(args...); - return details::registry::instance().create(logger_name, { sink }); -} - - -template -inline std::shared_ptr spdlog::create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end) -{ - return details::registry::instance().create(logger_name, sinks_begin, sinks_end); -} - -// Create and register an async logger with a single sink -inline std::shared_ptr spdlog::create_async(const std::string& logger_name, const sink_ptr& sink, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) -{ - return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sink); -} - -// Create and register an async logger with multiple sinks -inline std::shared_ptr spdlog::create_async(const std::string& logger_name, sinks_init_list sinks, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb ) -{ - return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks); -} - -template -inline std::shared_ptr spdlog::create_async(const std::string& logger_name, const It& sinks_begin, const It& sinks_end, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) -{ - return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks_begin, sinks_end); -} - -inline void spdlog::set_formatter(spdlog::formatter_ptr f) -{ - details::registry::instance().formatter(f); -} - -inline void spdlog::set_pattern(const std::string& format_string) -{ - return details::registry::instance().set_pattern(format_string); -} - -inline void spdlog::set_level(level::level_enum log_level) -{ - return details::registry::instance().set_level(log_level); -} - -inline void spdlog::set_error_handler(log_err_handler handler) -{ - return details::registry::instance().set_error_handler(handler); -} - - -inline void spdlog::set_async_mode(size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) -{ - details::registry::instance().set_async_mode(queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb); -} - -inline void spdlog::set_sync_mode() -{ - details::registry::instance().set_sync_mode(); -} - -inline void spdlog::apply_all(std::function)> fun) -{ - details::registry::instance().apply_all(fun); -} - -inline void spdlog::drop_all() -{ - details::registry::instance().drop_all(); -} diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.cc b/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.cc deleted file mode 100644 index 2bd774e..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.cc +++ /dev/null @@ -1,940 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "format.h" - -#include - -#include -#include -#include -#include -#include -#include // for std::ptrdiff_t - -#if defined(_WIN32) && defined(__MINGW32__) -# include -#endif - -#if FMT_USE_WINDOWS_H -# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) -# include -# else -# define NOMINMAX -# include -# undef NOMINMAX -# endif -#endif - -using fmt::internal::Arg; - -#if FMT_EXCEPTIONS -# define FMT_TRY try -# define FMT_CATCH(x) catch (x) -#else -# define FMT_TRY if (true) -# define FMT_CATCH(x) if (false) -#endif - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable: 4127) // conditional expression is constant -# pragma warning(disable: 4702) // unreachable code -// Disable deprecation warning for strerror. The latter is not called but -// MSVC fails to detect it. -# pragma warning(disable: 4996) -#endif - -// Dummy implementations of strerror_r and strerror_s called if corresponding -// system functions are not available. -static inline fmt::internal::Null<> strerror_r(int, char *, ...) { - return fmt::internal::Null<>(); -} -static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { - return fmt::internal::Null<>(); -} - -namespace fmt { - -FMT_FUNC internal::RuntimeError::~RuntimeError() throw() {} -FMT_FUNC FormatError::~FormatError() throw() {} -FMT_FUNC SystemError::~SystemError() throw() {} - -namespace { - -#ifndef _MSC_VER -# define FMT_SNPRINTF snprintf -#else // _MSC_VER -inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { - va_list args; - va_start(args, format); - int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); - va_end(args); - return result; -} -# define FMT_SNPRINTF fmt_snprintf -#endif // _MSC_VER - -#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) -# define FMT_SWPRINTF snwprintf -#else -# define FMT_SWPRINTF swprintf -#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) - -// Checks if a value fits in int - used to avoid warnings about comparing -// signed and unsigned integers. -template -struct IntChecker { - template - static bool fits_in_int(T value) { - unsigned max = INT_MAX; - return value <= max; - } - static bool fits_in_int(bool) { return true; } -}; - -template <> -struct IntChecker { - template - static bool fits_in_int(T value) { - return value >= INT_MIN && value <= INT_MAX; - } - static bool fits_in_int(int) { return true; } -}; - -const char RESET_COLOR[] = "\x1b[0m"; - -typedef void (*FormatFunc)(Writer &, int, StringRef); - -// Portable thread-safe version of strerror. -// Sets buffer to point to a string describing the error code. -// This can be either a pointer to a string stored in buffer, -// or a pointer to some static immutable string. -// Returns one of the following values: -// 0 - success -// ERANGE - buffer is not large enough to store the error message -// other - failure -// Buffer should be at least of size 1. -int safe_strerror( - int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { - FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); - - class StrError { - private: - int error_code_; - char *&buffer_; - std::size_t buffer_size_; - - // A noop assignment operator to avoid bogus warnings. - void operator=(const StrError &) {} - - // Handle the result of XSI-compliant version of strerror_r. - int handle(int result) { - // glibc versions before 2.13 return result in errno. - return result == -1 ? errno : result; - } - - // Handle the result of GNU-specific version of strerror_r. - int handle(char *message) { - // If the buffer is full then the message is probably truncated. - if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) - return ERANGE; - buffer_ = message; - return 0; - } - - // Handle the case when strerror_r is not available. - int handle(internal::Null<>) { - return fallback(strerror_s(buffer_, buffer_size_, error_code_)); - } - - // Fallback to strerror_s when strerror_r is not available. - int fallback(int result) { - // If the buffer is full then the message is probably truncated. - return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? - ERANGE : result; - } - - // Fallback to strerror if strerror_r and strerror_s are not available. - int fallback(internal::Null<>) { - errno = 0; - buffer_ = strerror(error_code_); - return errno; - } - - public: - StrError(int err_code, char *&buf, std::size_t buf_size) - : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} - - int run() { - strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. - return handle(strerror_r(error_code_, buffer_, buffer_size_)); - } - }; - return StrError(error_code, buffer, buffer_size).run(); -} - -void format_error_code(Writer &out, int error_code, - StringRef message) FMT_NOEXCEPT { - // Report error code making sure that the output fits into - // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential - // bad_alloc. - out.clear(); - static const char SEP[] = ": "; - static const char ERROR_STR[] = "error "; - // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. - std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; - typedef internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(error_code); - if (internal::is_negative(error_code)) { - abs_value = 0 - abs_value; - ++error_code_size; - } - error_code_size += internal::count_digits(abs_value); - if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) - out << message << SEP; - out << ERROR_STR << error_code; - assert(out.size() <= internal::INLINE_BUFFER_SIZE); -} - -void report_error(FormatFunc func, int error_code, - StringRef message) FMT_NOEXCEPT { - MemoryWriter full_message; - func(full_message, error_code, message); - // Use Writer::data instead of Writer::c_str to avoid potential memory - // allocation. - std::fwrite(full_message.data(), full_message.size(), 1, stderr); - std::fputc('\n', stderr); -} - -// IsZeroInt::visit(arg) returns true iff arg is a zero integer. -class IsZeroInt : public ArgVisitor { - public: - template - bool visit_any_int(T value) { return value == 0; } -}; - -// Checks if an argument is a valid printf width specifier and sets -// left alignment if it is negative. -class WidthHandler : public ArgVisitor { - private: - FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); - - public: - explicit WidthHandler(FormatSpec &spec) : spec_(spec) {} - - void report_unhandled_arg() { - FMT_THROW(FormatError("width is not integer")); - } - - template - unsigned visit_any_int(T value) { - typedef typename internal::IntTraits::MainType UnsignedType; - UnsignedType width = static_cast(value); - if (internal::is_negative(value)) { - spec_.align_ = ALIGN_LEFT; - width = 0 - width; - } - if (width > INT_MAX) - FMT_THROW(FormatError("number is too big")); - return static_cast(width); - } -}; - -class PrecisionHandler : public ArgVisitor { - public: - void report_unhandled_arg() { - FMT_THROW(FormatError("precision is not integer")); - } - - template - int visit_any_int(T value) { - if (!IntChecker::is_signed>::fits_in_int(value)) - FMT_THROW(FormatError("number is too big")); - return static_cast(value); - } -}; - -template -struct is_same { - enum { value = 0 }; -}; - -template -struct is_same { - enum { value = 1 }; -}; - -// An argument visitor that converts an integer argument to T for printf, -// if T is an integral type. If T is void, the argument is converted to -// corresponding signed or unsigned type depending on the type specifier: -// 'd' and 'i' - signed, other - unsigned) -template -class ArgConverter : public ArgVisitor, void> { - private: - internal::Arg &arg_; - wchar_t type_; - - FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); - - public: - ArgConverter(internal::Arg &arg, wchar_t type) - : arg_(arg), type_(type) {} - - void visit_bool(bool value) { - if (type_ != 's') - visit_any_int(value); - } - - template - void visit_any_int(U value) { - bool is_signed = type_ == 'd' || type_ == 'i'; - using internal::Arg; - typedef typename internal::Conditional< - is_same::value, U, T>::type TargetType; - if (sizeof(TargetType) <= sizeof(int)) { - // Extra casts are used to silence warnings. - if (is_signed) { - arg_.type = Arg::INT; - arg_.int_value = static_cast(static_cast(value)); - } else { - arg_.type = Arg::UINT; - typedef typename internal::MakeUnsigned::Type Unsigned; - arg_.uint_value = static_cast(static_cast(value)); - } - } else { - if (is_signed) { - arg_.type = Arg::LONG_LONG; - // glibc's printf doesn't sign extend arguments of smaller types: - // std::printf("%lld", -42); // prints "4294967254" - // but we don't have to do the same because it's a UB. - arg_.long_long_value = static_cast(value); - } else { - arg_.type = Arg::ULONG_LONG; - arg_.ulong_long_value = - static_cast::Type>(value); - } - } - } -}; - -// Converts an integer argument to char for printf. -class CharConverter : public ArgVisitor { - private: - internal::Arg &arg_; - - FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); - - public: - explicit CharConverter(internal::Arg &arg) : arg_(arg) {} - - template - void visit_any_int(T value) { - arg_.type = internal::Arg::CHAR; - arg_.int_value = static_cast(value); - } -}; -} // namespace - -namespace internal { - -template -class PrintfArgFormatter : - public ArgFormatterBase, Char> { - - void write_null_pointer() { - this->spec().type_ = 0; - this->write("(nil)"); - } - - typedef ArgFormatterBase, Char> Base; - - public: - PrintfArgFormatter(BasicWriter &w, FormatSpec &s) - : ArgFormatterBase, Char>(w, s) {} - - void visit_bool(bool value) { - FormatSpec &fmt_spec = this->spec(); - if (fmt_spec.type_ != 's') - return this->visit_any_int(value); - fmt_spec.type_ = 0; - this->write(value); - } - - void visit_char(int value) { - const FormatSpec &fmt_spec = this->spec(); - BasicWriter &w = this->writer(); - if (fmt_spec.type_ && fmt_spec.type_ != 'c') - w.write_int(value, fmt_spec); - typedef typename BasicWriter::CharPtr CharPtr; - CharPtr out = CharPtr(); - if (fmt_spec.width_ > 1) { - Char fill = ' '; - out = w.grow_buffer(fmt_spec.width_); - if (fmt_spec.align_ != ALIGN_LEFT) { - std::fill_n(out, fmt_spec.width_ - 1, fill); - out += fmt_spec.width_ - 1; - } else { - std::fill_n(out + 1, fmt_spec.width_ - 1, fill); - } - } else { - out = w.grow_buffer(1); - } - *out = static_cast(value); - } - - void visit_cstring(const char *value) { - if (value) - Base::visit_cstring(value); - else if (this->spec().type_ == 'p') - write_null_pointer(); - else - this->write("(null)"); - } - - void visit_pointer(const void *value) { - if (value) - return Base::visit_pointer(value); - this->spec().type_ = 0; - write_null_pointer(); - } - - void visit_custom(Arg::CustomValue c) { - BasicFormatter formatter(ArgList(), this->writer()); - const Char format_str[] = {'}', 0}; - const Char *format = format_str; - c.format(&formatter, c.value, &format); - } -}; -} // namespace internal -} // namespace fmt - -FMT_FUNC void fmt::SystemError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_system_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -template -int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, value) : - FMT_SNPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, width, value) : - FMT_SNPRINTF(buffer, size, format, width, precision, value); -} - -template -int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, value) : - FMT_SWPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, width, value) : - FMT_SWPRINTF(buffer, size, format, width, precision, value); -} - -template -const char fmt::internal::BasicData::DIGITS[] = - "0001020304050607080910111213141516171819" - "2021222324252627282930313233343536373839" - "4041424344454647484950515253545556575859" - "6061626364656667686970717273747576777879" - "8081828384858687888990919293949596979899"; - -#define FMT_POWERS_OF_10(factor) \ - factor * 10, \ - factor * 100, \ - factor * 1000, \ - factor * 10000, \ - factor * 100000, \ - factor * 1000000, \ - factor * 10000000, \ - factor * 100000000, \ - factor * 1000000000 - -template -const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { - 0, FMT_POWERS_OF_10(1) -}; - -template -const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { - 0, - FMT_POWERS_OF_10(1), - FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), - // Multiply several constants instead of using a single long long constant - // to avoid warnings about C++98 not supporting long long. - fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 -}; - -FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { - (void)type; - if (std::isprint(static_cast(code))) { - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '{}' for {}", code, type))); - } - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '\\x{:02x}' for {}", - static_cast(code), type))); -} - -#if FMT_USE_WINDOWS_H - -FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { - static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; - if (s.size() > INT_MAX) - FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); - int s_size = static_cast(s.size()); - int length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_.resize(length + 1); - length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_[length] = 0; -} - -FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { - if (int error_code = convert(s)) { - FMT_THROW(WindowsError(error_code, - "cannot convert string from UTF-16 to UTF-8")); - } -} - -FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { - if (s.size() > INT_MAX) - return ERROR_INVALID_PARAMETER; - int s_size = static_cast(s.size()); - int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); - if (length == 0) - return GetLastError(); - buffer_.resize(length + 1); - length = WideCharToMultiByte( - CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); - if (length == 0) - return GetLastError(); - buffer_[length] = 0; - return 0; -} - -FMT_FUNC void fmt::WindowsError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_windows_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -FMT_FUNC void fmt::internal::format_windows_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - FMT_TRY { - MemoryBuffer buffer; - buffer.resize(INLINE_BUFFER_SIZE); - for (;;) { - wchar_t *system_message = &buffer[0]; - int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - system_message, static_cast(buffer.size()), 0); - if (result != 0) { - UTF16ToUTF8 utf8_message; - if (utf8_message.convert(system_message) == ERROR_SUCCESS) { - out << message << ": " << utf8_message; - return; - } - break; - } - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - break; // Can't get error message, report error code instead. - buffer.resize(buffer.size() * 2); - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -#endif // FMT_USE_WINDOWS_H - -FMT_FUNC void fmt::internal::format_system_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - FMT_TRY { - MemoryBuffer buffer; - buffer.resize(INLINE_BUFFER_SIZE); - for (;;) { - char *system_message = &buffer[0]; - int result = safe_strerror(error_code, system_message, buffer.size()); - if (result == 0) { - out << message << ": " << system_message; - return; - } - if (result != ERANGE) - break; // Can't get error message, report error code instead. - buffer.resize(buffer.size() * 2); - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -template -void fmt::internal::ArgMap::init(const ArgList &args) { - if (!map_.empty()) - return; - typedef internal::NamedArg NamedArg; - const NamedArg *named_arg = 0; - bool use_values = - args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; - if (use_values) { - for (unsigned i = 0;/*nothing*/; ++i) { - internal::Arg::Type arg_type = args.type(i); - switch (arg_type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.values_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } - return; - } - for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { - internal::Arg::Type arg_type = args.type(i); - if (arg_type == internal::Arg::NAMED_ARG) { - named_arg = static_cast(args.args_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - } - } - for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { - switch (args.args_[i].type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.args_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } -} - -template -void fmt::internal::FixedBuffer::grow(std::size_t) { - FMT_THROW(std::runtime_error("buffer overflow")); -} - -FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( - unsigned arg_index, const char *&error) { - Arg arg = args_[arg_index]; - switch (arg.type) { - case Arg::NONE: - error = "argument index out of range"; - break; - case Arg::NAMED_ARG: - arg = *static_cast(arg.pointer); - break; - default: - /*nothing*/; - } - return arg; -} - -template -void fmt::internal::PrintfFormatter::parse_flags( - FormatSpec &spec, const Char *&s) { - for (;;) { - switch (*s++) { - case '-': - spec.align_ = ALIGN_LEFT; - break; - case '+': - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '0': - spec.fill_ = '0'; - break; - case ' ': - spec.flags_ |= SIGN_FLAG; - break; - case '#': - spec.flags_ |= HASH_FLAG; - break; - default: - --s; - return; - } - } -} - -template -Arg fmt::internal::PrintfFormatter::get_arg( - const Char *s, unsigned arg_index) { - (void)s; - const char *error = 0; - Arg arg = arg_index == UINT_MAX ? - next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); - if (error) - FMT_THROW(FormatError(!*s ? "invalid format string" : error)); - return arg; -} - -template -unsigned fmt::internal::PrintfFormatter::parse_header( - const Char *&s, FormatSpec &spec) { - unsigned arg_index = UINT_MAX; - Char c = *s; - if (c >= '0' && c <= '9') { - // Parse an argument index (if followed by '$') or a width possibly - // preceded with '0' flag(s). - unsigned value = parse_nonnegative_int(s); - if (*s == '$') { // value is an argument index - ++s; - arg_index = value; - } else { - if (c == '0') - spec.fill_ = '0'; - if (value != 0) { - // Nonzero value means that we parsed width and don't need to - // parse it or flags again, so return now. - spec.width_ = value; - return arg_index; - } - } - } - parse_flags(spec, s); - // Parse width. - if (*s >= '0' && *s <= '9') { - spec.width_ = parse_nonnegative_int(s); - } else if (*s == '*') { - ++s; - spec.width_ = WidthHandler(spec).visit(get_arg(s)); - } - return arg_index; -} - -template -void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, BasicCStringRef format_str) { - const Char *start = format_str.c_str(); - const Char *s = start; - while (*s) { - Char c = *s++; - if (c != '%') continue; - if (*s == c) { - write(writer, start, s); - start = ++s; - continue; - } - write(writer, start, s - 1); - - FormatSpec spec; - spec.align_ = ALIGN_RIGHT; - - // Parse argument index, flags and width. - unsigned arg_index = parse_header(s, spec); - - // Parse precision. - if (*s == '.') { - ++s; - if ('0' <= *s && *s <= '9') { - spec.precision_ = static_cast(parse_nonnegative_int(s)); - } else if (*s == '*') { - ++s; - spec.precision_ = PrecisionHandler().visit(get_arg(s)); - } - } - - Arg arg = get_arg(s, arg_index); - if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) - spec.flags_ &= ~to_unsigned(HASH_FLAG); - if (spec.fill_ == '0') { - if (arg.type <= Arg::LAST_NUMERIC_TYPE) - spec.align_ = ALIGN_NUMERIC; - else - spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. - } - - // Parse length and convert the argument to the required type. - switch (*s++) { - case 'h': - if (*s == 'h') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'l': - if (*s == 'l') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'j': - ArgConverter(arg, *s).visit(arg); - break; - case 'z': - ArgConverter(arg, *s).visit(arg); - break; - case 't': - ArgConverter(arg, *s).visit(arg); - break; - case 'L': - // printf produces garbage when 'L' is omitted for long double, no - // need to do the same. - break; - default: - --s; - ArgConverter(arg, *s).visit(arg); - } - - // Parse type. - if (!*s) - FMT_THROW(FormatError("invalid format string")); - spec.type_ = static_cast(*s++); - if (arg.type <= Arg::LAST_INTEGER_TYPE) { - // Normalize type. - switch (spec.type_) { - case 'i': case 'u': - spec.type_ = 'd'; - break; - case 'c': - // TODO: handle wchar_t - CharConverter(arg).visit(arg); - break; - } - } - - start = s; - - // Format argument. - internal::PrintfArgFormatter(writer, spec).visit(arg); - } - write(writer, start, s); -} - -FMT_FUNC void fmt::report_system_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_system_error, error_code, message); -} - -#if FMT_USE_WINDOWS_H -FMT_FUNC void fmt::report_windows_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_windows_error, error_code, message); -} -#endif - -FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - std::fwrite(w.data(), 1, w.size(), f); -} - -FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { - print(stdout, format_str, args); -} - -FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { - char escape[] = "\x1b[30m"; - escape[3] = static_cast('0' + c); - std::fputs(escape, stdout); - print(format, args); - std::fputs(RESET_COLOR, stdout); -} - -FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - std::size_t size = w.size(); - return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); -} - -#ifndef FMT_HEADER_ONLY - -template struct fmt::internal::BasicData; - -// Explicit instantiations for char. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template void fmt::internal::ArgMap::init(const fmt::ArgList &args); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, CStringRef format); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, long double value); - -// Explicit instantiations for wchar_t. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template void fmt::internal::ArgMap::init(const fmt::ArgList &args); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, WCStringRef format); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, long double value); - -#endif // FMT_HEADER_ONLY - -#ifdef _MSC_VER -# pragma warning(pop) -#endif diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.h b/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.h deleted file mode 100644 index 64c949b..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/format.h +++ /dev/null @@ -1,4501 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_FORMAT_H_ -#define FMT_FORMAT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _SECURE_SCL -# define FMT_SECURE_SCL _SECURE_SCL -#else -# define FMT_SECURE_SCL 0 -#endif - -#if FMT_SECURE_SCL -# include -#endif - -#ifdef _MSC_VER -# define FMT_MSC_VER _MSC_VER -#else -# define FMT_MSC_VER 0 -#endif - -#if FMT_MSC_VER && FMT_MSC_VER <= 1500 -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -typedef __int64 intmax_t; -#else -#include -#endif - -#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) -# ifdef FMT_EXPORT -# define FMT_API __declspec(dllexport) -# elif defined(FMT_SHARED) -# define FMT_API __declspec(dllimport) -# endif -#endif -#ifndef FMT_API -# define FMT_API -#endif - -#ifdef __GNUC__ -# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -# define FMT_GCC_EXTENSION __extension__ -# if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic push -// Disable the warning about "long long" which is sometimes reported even -// when using __extension__. -# pragma GCC diagnostic ignored "-Wlong-long" -// Disable the warning about declaration shadowing because it affects too -// many valid cases. -# pragma GCC diagnostic ignored "-Wshadow" -// Disable the warning about implicit conversions that may change the sign of -// an integer; silencing it otherwise would require many explicit casts. -# pragma GCC diagnostic ignored "-Wsign-conversion" -# endif -# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ -# define FMT_HAS_GXX_CXX11 1 -# endif -#else -# define FMT_GCC_EXTENSION -#endif - -#if defined(__INTEL_COMPILER) -# define FMT_ICC_VERSION __INTEL_COMPILER -#elif defined(__ICL) -# define FMT_ICC_VERSION __ICL -#endif - -#if defined(__clang__) && !defined(FMT_ICC_VERSION) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wdocumentation-unknown-command" -# pragma clang diagnostic ignored "-Wpadded" -#endif - -#ifdef __GNUC_LIBSTD__ -# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) -#endif - -#ifdef __has_feature -# define FMT_HAS_FEATURE(x) __has_feature(x) -#else -# define FMT_HAS_FEATURE(x) 0 -#endif - -#ifdef __has_builtin -# define FMT_HAS_BUILTIN(x) __has_builtin(x) -#else -# define FMT_HAS_BUILTIN(x) 0 -#endif - -#ifdef __has_cpp_attribute -# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) -#else -# define FMT_HAS_CPP_ATTRIBUTE(x) 0 -#endif - -#ifndef FMT_USE_VARIADIC_TEMPLATES -// Variadic templates are available in GCC since version 4.4 -// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ -// since version 2013. -# define FMT_USE_VARIADIC_TEMPLATES \ - (FMT_HAS_FEATURE(cxx_variadic_templates) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800) -#endif - -#ifndef FMT_USE_RVALUE_REFERENCES -// Don't use rvalue references when compiling with clang and an old libstdc++ -// as the latter doesn't provide std::move. -# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 -# define FMT_USE_RVALUE_REFERENCES 0 -# else -# define FMT_USE_RVALUE_REFERENCES \ - (FMT_HAS_FEATURE(cxx_rvalue_references) || \ - (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1600) -# endif -#endif - -#if FMT_USE_RVALUE_REFERENCES -# include // for std::move -#endif - -// Check if exceptions are disabled. -#if defined(__GNUC__) && !defined(__EXCEPTIONS) -# define FMT_EXCEPTIONS 0 -#endif -#if FMT_MSC_VER && !_HAS_EXCEPTIONS -# define FMT_EXCEPTIONS 0 -#endif -#ifndef FMT_EXCEPTIONS -# define FMT_EXCEPTIONS 1 -#endif - -#ifndef FMT_THROW -# if FMT_EXCEPTIONS -# define FMT_THROW(x) throw x -# else -# define FMT_THROW(x) assert(false) -# endif -#endif - -// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). -#ifndef FMT_USE_NOEXCEPT -# define FMT_USE_NOEXCEPT 0 -#endif - -#ifndef FMT_NOEXCEPT -# if FMT_EXCEPTIONS -# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ - FMT_MSC_VER >= 1900 -# define FMT_NOEXCEPT noexcept -# else -# define FMT_NOEXCEPT throw() -# endif -# else -# define FMT_NOEXCEPT -# endif -#endif - -#ifndef FMT_OVERRIDE -# if FMT_USE_OVERRIDE || FMT_HAS_FEATURE(cxx_override) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ - FMT_MSC_VER >= 1900 -# define FMT_OVERRIDE override -# else -# define FMT_OVERRIDE -# endif -#endif - - -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef FMT_USE_DELETED_FUNCTIONS -# define FMT_USE_DELETED_FUNCTIONS 0 -#endif - -#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800 -# define FMT_DELETED_OR_UNDEFINED = delete -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&) = delete; \ - TypeName& operator=(const TypeName&) = delete -#else -# define FMT_DELETED_OR_UNDEFINED -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - TypeName& operator=(const TypeName&) -#endif - -#ifndef FMT_USE_USER_DEFINED_LITERALS -// All compilers which support UDLs also support variadic templates. This -// makes the fmt::literals implementation easier. However, an explicit check -// for variadic templates is added here just in case. -// For Intel's compiler both it and the system gcc/msc must support UDLs. -# define FMT_USE_USER_DEFINED_LITERALS \ - FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ - (FMT_HAS_FEATURE(cxx_user_literals) || \ - (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900) && \ - (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500) -#endif - -#ifndef FMT_ASSERT -# define FMT_ASSERT(condition, message) assert((condition) && message) -#endif - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) -# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) -#endif - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) -# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) -#endif - -// Some compilers masquerade as both MSVC and GCC-likes or -// otherwise support __builtin_clz and __builtin_clzll, so -// only define FMT_BUILTIN_CLZ using the MSVC intrinsics -// if the clz and clzll builtins are not available. -#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) -# include // _BitScanReverse, _BitScanReverse64 - -namespace fmt -{ -namespace internal -{ -# pragma intrinsic(_BitScanReverse) -inline uint32_t clz(uint32_t x) -{ - unsigned long r = 0; - _BitScanReverse(&r, x); - - assert(x != 0); - // Static analysis complains about using uninitialized data - // "r", but the only way that can happen is if "x" is 0, - // which the callers guarantee to not happen. -# pragma warning(suppress: 6102) - return 31 - r; -} -# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) - -# ifdef _WIN64 -# pragma intrinsic(_BitScanReverse64) -# endif - -inline uint32_t clzll(uint64_t x) -{ - unsigned long r = 0; -# ifdef _WIN64 - _BitScanReverse64(&r, x); -# else - // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast(x >> 32))) - return 63 - (r + 32); - - // Scan the low 32 bits. - _BitScanReverse(&r, static_cast(x)); -# endif - - assert(x != 0); - // Static analysis complains about using uninitialized data - // "r", but the only way that can happen is if "x" is 0, - // which the callers guarantee to not happen. -# pragma warning(suppress: 6102) - return 63 - r; -} -# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) -} -} -#endif - -namespace fmt -{ -namespace internal -{ -struct DummyInt -{ - int data[2]; - operator int() const - { - return 0; - } -}; -typedef std::numeric_limits FPUtil; - -// Dummy implementations of system functions such as signbit and ecvt called -// if the latter are not available. -inline DummyInt signbit(...) -{ - return DummyInt(); -} -inline DummyInt _ecvt_s(...) -{ - return DummyInt(); -} -inline DummyInt isinf(...) -{ - return DummyInt(); -} -inline DummyInt _finite(...) -{ - return DummyInt(); -} -inline DummyInt isnan(...) -{ - return DummyInt(); -} -inline DummyInt _isnan(...) -{ - return DummyInt(); -} - -// A helper function to suppress bogus "conditional expression is constant" -// warnings. -template -inline T const_check(T value) -{ - return value; -} -} -} // namespace fmt - -namespace std -{ -// Standard permits specialization of std::numeric_limits. This specialization -// is used to resolve ambiguity between isinf and std::isinf in glibc: -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 -// and the same for isnan and signbit. -template <> -class numeric_limits : - public std::numeric_limits -{ -public: - // Portable version of isinf. - template - static bool isinfinity(T x) - { - using namespace fmt::internal; - // The resolution "priority" is: - // isinf macro > std::isinf > ::isinf > fmt::internal::isinf - if (const_check(sizeof(isinf(x)) == sizeof(bool) || - sizeof(isinf(x)) == sizeof(int))) - { - return isinf(x) != 0; - } - return !_finite(static_cast(x)); - } - - // Portable version of isnan. - template - static bool isnotanumber(T x) - { - using namespace fmt::internal; - if (const_check(sizeof(isnan(x)) == sizeof(bool) || - sizeof(isnan(x)) == sizeof(int))) - { - return isnan(x) != 0; - } - return _isnan(static_cast(x)) != 0; - } - - // Portable version of signbit. - static bool isnegative(double x) - { - using namespace fmt::internal; - if (const_check(sizeof(signbit(x)) == sizeof(int))) - return signbit(x) != 0; - if (x < 0) return true; - if (!isnotanumber(x)) return false; - int dec = 0, sign = 0; - char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. - _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); - return sign != 0; - } -}; -} // namespace std - -namespace fmt -{ - -// Fix the warning about long long on older versions of GCC -// that don't support the diagnostic pragma. -FMT_GCC_EXTENSION typedef long long LongLong; -FMT_GCC_EXTENSION typedef unsigned long long ULongLong; - -#if FMT_USE_RVALUE_REFERENCES -using std::move; -#endif - -template -class BasicWriter; - -typedef BasicWriter Writer; -typedef BasicWriter WWriter; - -template -class ArgFormatter; - -template > -class BasicFormatter; - -/** - \rst - A string reference. It can be constructed from a C string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +------------+-------------------------+ - | Type | Definition | - +============+=========================+ - | StringRef | BasicStringRef | - +------------+-------------------------+ - | WStringRef | BasicStringRef | - +------------+-------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(StringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicStringRef -{ -private: - const Char *data_; - std::size_t size_; - -public: - /** Constructs a string reference object from a C string and a size. */ - BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} - - /** - \rst - Constructs a string reference object from a C string computing - the size with ``std::char_traits::length``. - \endrst - */ - BasicStringRef(const Char *s) - : data_(s), size_(std::char_traits::length(s)) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicStringRef(const std::basic_string &s) - : data_(s.c_str()), size_(s.size()) {} - - /** - \rst - Converts a string reference to an ``std::string`` object. - \endrst - */ - std::basic_string to_string() const - { - return std::basic_string(data_, size_); - } - - /** Returns a pointer to the string data. */ - const Char *data() const - { - return data_; - } - - /** Returns the string size. */ - std::size_t size() const - { - return size_; - } - - // Lexicographically compare this string reference to other. - int compare(BasicStringRef other) const - { - std::size_t size = size_ < other.size_ ? size_ : other.size_; - int result = std::char_traits::compare(data_, other.data_, size); - if (result == 0) - result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); - return result; - } - - friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) == 0; - } - friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) != 0; - } - friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) < 0; - } - friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) <= 0; - } - friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) > 0; - } - friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) - { - return lhs.compare(rhs) >= 0; - } -}; - -typedef BasicStringRef StringRef; -typedef BasicStringRef WStringRef; - -/** - \rst - A reference to a null terminated string. It can be constructed from a C - string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +-------------+--------------------------+ - | Type | Definition | - +=============+==========================+ - | CStringRef | BasicCStringRef | - +-------------+--------------------------+ - | WCStringRef | BasicCStringRef | - +-------------+--------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(CStringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicCStringRef -{ -private: - const Char *data_; - -public: - /** Constructs a string reference object from a C string. */ - BasicCStringRef(const Char *s) : data_(s) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} - - /** Returns the pointer to a C string. */ - const Char *c_str() const - { - return data_; - } -}; - -typedef BasicCStringRef CStringRef; -typedef BasicCStringRef WCStringRef; - -/** A formatting error such as invalid format string. */ -class FormatError : public std::runtime_error -{ -public: - explicit FormatError(CStringRef message) - : std::runtime_error(message.c_str()) {} - ~FormatError() throw(); -}; - -namespace internal -{ - -// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. -template -struct MakeUnsigned -{ - typedef T Type; -}; - -#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ - template <> \ - struct MakeUnsigned { typedef U Type; } - -FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); -FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); -FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); -FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); - -// Casts nonnegative integer to unsigned. -template -inline typename MakeUnsigned::Type to_unsigned(Int value) -{ - FMT_ASSERT(value >= 0, "negative value"); - return static_cast::Type>(value); -} - -// The number of characters to store in the MemoryBuffer object itself -// to avoid dynamic memory allocation. -enum { INLINE_BUFFER_SIZE = 500 }; - -#if FMT_SECURE_SCL -// Use checked iterator to avoid warnings on MSVC. -template -inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) -{ - return stdext::checked_array_iterator(ptr, size); -} -#else -template -inline T *make_ptr(T *ptr, std::size_t) -{ - return ptr; -} -#endif -} // namespace internal - -/** - \rst - A buffer supporting a subset of ``std::vector``'s operations. - \endrst - */ -template -class Buffer -{ -private: - FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); - -protected: - T *ptr_; - std::size_t size_; - std::size_t capacity_; - - Buffer(T *ptr = 0, std::size_t capacity = 0) - : ptr_(ptr), size_(0), capacity_(capacity) {} - - /** - \rst - Increases the buffer capacity to hold at least *size* elements updating - ``ptr_`` and ``capacity_``. - \endrst - */ - virtual void grow(std::size_t size) = 0; - -public: - virtual ~Buffer() {} - - /** Returns the size of this buffer. */ - std::size_t size() const - { - return size_; - } - - /** Returns the capacity of this buffer. */ - std::size_t capacity() const - { - return capacity_; - } - - /** - Resizes the buffer. If T is a POD type new elements may not be initialized. - */ - void resize(std::size_t new_size) - { - if (new_size > capacity_) - grow(new_size); - size_ = new_size; - } - - /** - \rst - Reserves space to store at least *capacity* elements. - \endrst - */ - void reserve(std::size_t capacity) - { - if (capacity > capacity_) - grow(capacity); - } - - void clear() FMT_NOEXCEPT { size_ = 0; } - - void push_back(const T &value) - { - if (size_ == capacity_) - grow(size_ + 1); - ptr_[size_++] = value; - } - - /** Appends data to the end of the buffer. */ - template - void append(const U *begin, const U *end); - - T &operator[](std::size_t index) - { - return ptr_[index]; - } - const T &operator[](std::size_t index) const - { - return ptr_[index]; - } -}; - -template -template -void Buffer::append(const U *begin, const U *end) -{ - std::size_t new_size = size_ + internal::to_unsigned(end - begin); - if (new_size > capacity_) - grow(new_size); - std::uninitialized_copy(begin, end, - internal::make_ptr(ptr_, capacity_) + size_); - size_ = new_size; -} - -namespace internal -{ - -// A memory buffer for trivially copyable/constructible types with the first -// SIZE elements stored in the object itself. -template > -class MemoryBuffer : private Allocator, public Buffer -{ -private: - T data_[SIZE]; - - // Deallocate memory allocated by the buffer. - void deallocate() - { - if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); - } - -protected: - void grow(std::size_t size) FMT_OVERRIDE; - -public: - explicit MemoryBuffer(const Allocator &alloc = Allocator()) - : Allocator(alloc), Buffer(data_, SIZE) {} - ~MemoryBuffer() - { - deallocate(); - } - -#if FMT_USE_RVALUE_REFERENCES -private: - // Move data from other to this buffer. - void move(MemoryBuffer &other) - { - Allocator &this_alloc = *this, &other_alloc = other; - this_alloc = std::move(other_alloc); - this->size_ = other.size_; - this->capacity_ = other.capacity_; - if (other.ptr_ == other.data_) - { - this->ptr_ = data_; - std::uninitialized_copy(other.data_, other.data_ + this->size_, - make_ptr(data_, this->capacity_)); - } - else - { - this->ptr_ = other.ptr_; - // Set pointer to the inline array so that delete is not called - // when deallocating. - other.ptr_ = other.data_; - } - } - -public: - MemoryBuffer(MemoryBuffer &&other) - { - move(other); - } - - MemoryBuffer &operator=(MemoryBuffer &&other) - { - assert(this != &other); - deallocate(); - move(other); - return *this; - } -#endif - - // Returns a copy of the allocator associated with this buffer. - Allocator get_allocator() const - { - return *this; - } -}; - -template -void MemoryBuffer::grow(std::size_t size) -{ - std::size_t new_capacity = this->capacity_ + this->capacity_ / 2; - if (size > new_capacity) - new_capacity = size; - T *new_ptr = this->allocate(new_capacity); - // The following code doesn't throw, so the raw pointer above doesn't leak. - std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_, - make_ptr(new_ptr, new_capacity)); - std::size_t old_capacity = this->capacity_; - T *old_ptr = this->ptr_; - this->capacity_ = new_capacity; - this->ptr_ = new_ptr; - // deallocate may throw (at least in principle), but it doesn't matter since - // the buffer already uses the new storage and will deallocate it in case - // of exception. - if (old_ptr != data_) - Allocator::deallocate(old_ptr, old_capacity); -} - -// A fixed-size buffer. -template -class FixedBuffer : public fmt::Buffer -{ -public: - FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} - -protected: - FMT_API void grow(std::size_t size); -}; - -template -class BasicCharTraits -{ -public: -#if FMT_SECURE_SCL - typedef stdext::checked_array_iterator CharPtr; -#else - typedef Char *CharPtr; -#endif - static Char cast(int value) - { - return static_cast(value); - } -}; - -template -class CharTraits; - -template <> -class CharTraits : public BasicCharTraits -{ -private: - // Conversion from wchar_t to char is not allowed. - static char convert(wchar_t); - -public: - static char convert(char value) - { - return value; - } - - // Formats a floating-point number. - template - FMT_API static int format_float(char *buffer, std::size_t size, - const char *format, unsigned width, int precision, T value); -}; - -template <> -class CharTraits : public BasicCharTraits -{ -public: - static wchar_t convert(char value) - { - return value; - } - static wchar_t convert(wchar_t value) - { - return value; - } - - template - FMT_API static int format_float(wchar_t *buffer, std::size_t size, - const wchar_t *format, unsigned width, int precision, T value); -}; - -// Checks if a number is negative - used to avoid warnings. -template -struct SignChecker -{ - template - static bool is_negative(T value) - { - return value < 0; - } -}; - -template <> -struct SignChecker -{ - template - static bool is_negative(T) - { - return false; - } -}; - -// Returns true if value is negative, false otherwise. -// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. -template -inline bool is_negative(T value) -{ - return SignChecker::is_signed>::is_negative(value); -} - -// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. -template -struct TypeSelector -{ - typedef uint32_t Type; -}; - -template <> -struct TypeSelector -{ - typedef uint64_t Type; -}; - -template -struct IntTraits -{ - // Smallest of uint32_t and uint64_t that is large enough to represent - // all values of T. - typedef typename - TypeSelector::digits <= 32>::Type MainType; -}; - -FMT_API void report_unknown_type(char code, const char *type); - -// Static data is placed in this class template to allow header-only -// configuration. -template -struct FMT_API BasicData -{ - static const uint32_t POWERS_OF_10_32[]; - static const uint64_t POWERS_OF_10_64[]; - static const char DIGITS[]; -}; - -#ifndef FMT_USE_EXTERN_TEMPLATES -// Clang doesn't have a feature check for extern templates so we check -// for variadic templates which were introduced in the same version. -# define FMT_USE_EXTERN_TEMPLATES (__clang__ && FMT_USE_VARIADIC_TEMPLATES) -#endif - -#if FMT_USE_EXTERN_TEMPLATES && !defined(FMT_HEADER_ONLY) -extern template struct BasicData; -#endif - -typedef BasicData<> Data; - -#ifdef FMT_BUILTIN_CLZLL -// Returns the number of decimal digits in n. Leading zeros are not counted -// except for n == 0 in which case count_digits returns 1. -inline unsigned count_digits(uint64_t n) -{ - // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 - // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. - int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; - return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; -} -#else -// Fallback version of count_digits used when __builtin_clz is not available. -inline unsigned count_digits(uint64_t n) -{ - unsigned count = 1; - for (;;) - { - // Integer division is slow so do it for a group of four digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - if (n < 10) return count; - if (n < 100) return count + 1; - if (n < 1000) return count + 2; - if (n < 10000) return count + 3; - n /= 10000u; - count += 4; - } -} -#endif - -#ifdef FMT_BUILTIN_CLZ -// Optional version of count_digits for better performance on 32-bit platforms. -inline unsigned count_digits(uint32_t n) -{ - int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; - return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; -} -#endif - -// A functor that doesn't add a thousands separator. -struct NoThousandsSep -{ - template - void operator()(Char *) {} -}; - -// A functor that adds a thousands separator. -class ThousandsSep -{ -private: - fmt::StringRef sep_; - - // Index of a decimal digit with the least significant digit having index 0. - unsigned digit_index_; - -public: - explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {} - - template - void operator()(Char *&buffer) - { - if (++digit_index_ % 3 != 0) - return; - buffer -= sep_.size(); - std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(), - internal::make_ptr(buffer, sep_.size())); - } -}; - -// Formats a decimal unsigned integer value writing into buffer. -// thousands_sep is a functor that is called after writing each char to -// add a thousands separator if necessary. -template -inline void format_decimal(Char *buffer, UInt value, unsigned num_digits, - ThousandsSep thousands_sep) -{ - buffer += num_digits; - while (value >= 100) - { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer = Data::DIGITS[index + 1]; - thousands_sep(buffer); - *--buffer = Data::DIGITS[index]; - thousands_sep(buffer); - } - if (value < 10) - { - *--buffer = static_cast('0' + value); - return; - } - unsigned index = static_cast(value * 2); - *--buffer = Data::DIGITS[index + 1]; - thousands_sep(buffer); - *--buffer = Data::DIGITS[index]; -} - -template -inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) -{ - return format_decimal(buffer, value, num_digits, NoThousandsSep()); -} - -#ifndef _WIN32 -# define FMT_USE_WINDOWS_H 0 -#elif !defined(FMT_USE_WINDOWS_H) -# define FMT_USE_WINDOWS_H 1 -#endif - -// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. -// All the functionality that relies on it will be disabled too. -#if FMT_USE_WINDOWS_H -// A converter from UTF-8 to UTF-16. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF8ToUTF16 -{ -private: - MemoryBuffer buffer_; - -public: - FMT_API explicit UTF8ToUTF16(StringRef s); - operator WStringRef() const - { - return WStringRef(&buffer_[0], size()); - } - size_t size() const - { - return buffer_.size() - 1; - } - const wchar_t *c_str() const - { - return &buffer_[0]; - } - std::wstring str() const - { - return std::wstring(&buffer_[0], size()); - } -}; - -// A converter from UTF-16 to UTF-8. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF16ToUTF8 -{ -private: - MemoryBuffer buffer_; - -public: - UTF16ToUTF8() {} - FMT_API explicit UTF16ToUTF8(WStringRef s); - operator StringRef() const - { - return StringRef(&buffer_[0], size()); - } - size_t size() const - { - return buffer_.size() - 1; - } - const char *c_str() const - { - return &buffer_[0]; - } - std::string str() const - { - return std::string(&buffer_[0], size()); - } - - // Performs conversion returning a system error code instead of - // throwing exception on conversion error. This method may still throw - // in case of memory allocation error. - FMT_API int convert(WStringRef s); -}; - -FMT_API void format_windows_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; -#endif - -FMT_API void format_system_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; - -// A formatting argument value. -struct Value -{ - template - struct StringValue - { - const Char *value; - std::size_t size; - }; - - typedef void (*FormatFunc)( - void *formatter, const void *arg, void *format_str_ptr); - - struct CustomValue - { - const void *value; - FormatFunc format; - }; - - union - { - int int_value; - unsigned uint_value; - LongLong long_long_value; - ULongLong ulong_long_value; - double double_value; - long double long_double_value; - const void *pointer; - StringValue string; - StringValue sstring; - StringValue ustring; - StringValue wstring; - CustomValue custom; - }; - - enum Type - { - NONE, NAMED_ARG, - // Integer types should go first, - INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, - // followed by floating-point types. - DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, - CSTRING, STRING, WSTRING, POINTER, CUSTOM - }; -}; - -// A formatting argument. It is a trivially copyable/constructible type to -// allow storage in internal::MemoryBuffer. -struct Arg : Value -{ - Type type; -}; - -template -struct NamedArg; - -template -struct Null {}; - -// A helper class template to enable or disable overloads taking wide -// characters and strings in MakeValue. -template -struct WCharHelper -{ - typedef Null Supported; - typedef T Unsupported; -}; - -template -struct WCharHelper -{ - typedef T Supported; - typedef Null Unsupported; -}; - -typedef char Yes[1]; -typedef char No[2]; - -template -T &get(); - -// These are non-members to workaround an overload resolution bug in bcc32. -Yes &convert(fmt::ULongLong); -No &convert(...); - -template -struct ConvertToIntImpl -{ - enum { value = ENABLE_CONVERSION }; -}; - -template -struct ConvertToIntImpl2 -{ - enum { value = false }; -}; - -template -struct ConvertToIntImpl2 -{ - enum - { - // Don't convert numeric types. - value = ConvertToIntImpl::is_specialized>::value - }; -}; - -template -struct ConvertToInt -{ - enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; - enum { value = ConvertToIntImpl2::value }; -}; - -#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ - template <> \ - struct ConvertToInt { enum { value = 0 }; } - -// Silence warnings about convering float to int. -FMT_DISABLE_CONVERSION_TO_INT(float); -FMT_DISABLE_CONVERSION_TO_INT(double); -FMT_DISABLE_CONVERSION_TO_INT(long double); - -template -struct EnableIf {}; - -template -struct EnableIf -{ - typedef T type; -}; - -template -struct Conditional -{ - typedef T type; -}; - -template -struct Conditional -{ - typedef F type; -}; - -// For bcc32 which doesn't understand ! in template arguments. -template -struct Not -{ - enum { value = 0 }; -}; - -template<> -struct Not -{ - enum { value = 1 }; -}; - -template struct LConvCheck -{ - LConvCheck(int) {} -}; - -// Returns the thousands separator for the current locale. -// We check if ``lconv`` contains ``thousands_sep`` because on Android -// ``lconv`` is stubbed as an empty struct. -template -inline StringRef thousands_sep( - LConv *lc, LConvCheck = 0) -{ - return lc->thousands_sep; -} - -inline fmt::StringRef thousands_sep(...) -{ - return ""; -} - -// Makes an Arg object from any type. -template -class MakeValue : public Arg -{ -public: - typedef typename Formatter::Char Char; - -private: - // The following two methods are private to disallow formatting of - // arbitrary pointers. If you want to output a pointer cast it to - // "void *" or "const void *". In particular, this forbids formatting - // of "[const] volatile char *" which is printed as bool by iostreams. - // Do not implement! - template - MakeValue(const T *value); - template - MakeValue(T *value); - - // The following methods are private to disallow formatting of wide - // characters and strings into narrow strings as in - // fmt::format("{}", L"test"); - // To fix this, use a wide format string: fmt::format(L"{}", L"test"). -#if !FMT_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Unsupported); -#endif - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - - void set_string(StringRef str) - { - string.value = str.data(); - string.size = str.size(); - } - - void set_string(WStringRef str) - { - wstring.value = str.data(); - wstring.size = str.size(); - } - - // Formats an argument of a custom type, such as a user-defined class. - template - static void format_custom_arg( - void *formatter, const void *arg, void *format_str_ptr) - { - format(*static_cast(formatter), - *static_cast(format_str_ptr), - *static_cast(arg)); - } - -public: - MakeValue() {} - -#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ - MakeValue(Type value) { field = rhs; } \ - static uint64_t type(Type) { return Arg::TYPE; } - -#define FMT_MAKE_VALUE(Type, field, TYPE) \ - FMT_MAKE_VALUE_(Type, field, TYPE, value) - - FMT_MAKE_VALUE(bool, int_value, BOOL) - FMT_MAKE_VALUE(short, int_value, INT) - FMT_MAKE_VALUE(unsigned short, uint_value, UINT) - FMT_MAKE_VALUE(int, int_value, INT) - FMT_MAKE_VALUE(unsigned, uint_value, UINT) - - MakeValue(long value) - { - // To minimize the number of types we need to deal with, long is - // translated either to int or to long long depending on its size. - if (const_check(sizeof(long) == sizeof(int))) - int_value = static_cast(value); - else - long_long_value = value; - } - static uint64_t type(long) - { - return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; - } - - MakeValue(unsigned long value) - { - if (const_check(sizeof(unsigned long) == sizeof(unsigned))) - uint_value = static_cast(value); - else - ulong_long_value = value; - } - static uint64_t type(unsigned long) - { - return sizeof(unsigned long) == sizeof(unsigned) ? - Arg::UINT : Arg::ULONG_LONG; - } - - FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) - FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) - FMT_MAKE_VALUE(float, double_value, DOUBLE) - FMT_MAKE_VALUE(double, double_value, DOUBLE) - FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) - FMT_MAKE_VALUE(signed char, int_value, INT) - FMT_MAKE_VALUE(unsigned char, uint_value, UINT) - FMT_MAKE_VALUE(char, int_value, CHAR) - -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Supported value) - { - int_value = value; - } - static uint64_t type(wchar_t) - { - return Arg::CHAR; - } -#endif - -#define FMT_MAKE_STR_VALUE(Type, TYPE) \ - MakeValue(Type value) { set_string(value); } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_VALUE(char *, string.value, CSTRING) - FMT_MAKE_VALUE(const char *, string.value, CSTRING) - FMT_MAKE_VALUE(signed char *, sstring.value, CSTRING) - FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) - FMT_MAKE_VALUE(unsigned char *, ustring.value, CSTRING) - FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) - FMT_MAKE_STR_VALUE(const std::string &, STRING) - FMT_MAKE_STR_VALUE(StringRef, STRING) - FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) - -#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ - MakeValue(typename WCharHelper::Supported value) { \ - set_string(value); \ - } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) - FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) - - FMT_MAKE_VALUE(void *, pointer, POINTER) - FMT_MAKE_VALUE(const void *, pointer, POINTER) - - template - MakeValue(const T &value, - typename EnableIf::value>::value, int>::type = 0) - { - custom.value = &value; - custom.format = &format_custom_arg; - } - - template - MakeValue(const T &value, - typename EnableIf::value, int>::type = 0) - { - int_value = value; - } - - template - static uint64_t type(const T &) - { - return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; - } - - // Additional template param `Char_` is needed here because make_type always - // uses char. - template - MakeValue(const NamedArg &value) - { - pointer = &value; - } - - template - static uint64_t type(const NamedArg &) - { - return Arg::NAMED_ARG; - } -}; - -template -class MakeArg : public Arg -{ -public: - MakeArg() - { - type = Arg::NONE; - } - - template - MakeArg(const T &value) - : Arg(MakeValue(value)) - { - type = static_cast(MakeValue::type(value)); - } -}; - -template -struct NamedArg : Arg -{ - BasicStringRef name; - - template - NamedArg(BasicStringRef argname, const T &value) - : Arg(MakeArg< BasicFormatter >(value)), name(argname) {} -}; - -class RuntimeError : public std::runtime_error -{ -protected: - RuntimeError() : std::runtime_error("") {} - ~RuntimeError() throw(); -}; - -template -class PrintfArgFormatter; - -template -class ArgMap; -} // namespace internal - -/** An argument list. */ -class ArgList -{ -private: - // To reduce compiled code size per formatting function call, types of first - // MAX_PACKED_ARGS arguments are passed in the types_ field. - uint64_t types_; - union - { - // If the number of arguments is less than MAX_PACKED_ARGS, the argument - // values are stored in values_, otherwise they are stored in args_. - // This is done to reduce compiled code size as storing larger objects - // may require more code (at least on x86-64) even if the same amount of - // data is actually copied to stack. It saves ~10% on the bloat test. - const internal::Value *values_; - const internal::Arg *args_; - }; - - internal::Arg::Type type(unsigned index) const - { - unsigned shift = index * 4; - uint64_t mask = 0xf; - return static_cast( - (types_ & (mask << shift)) >> shift); - } - - template - friend class internal::ArgMap; - -public: - // Maximum number of arguments with packed types. - enum { MAX_PACKED_ARGS = 16 }; - - ArgList() : types_(0) {} - - ArgList(ULongLong types, const internal::Value *values) - : types_(types), values_(values) {} - ArgList(ULongLong types, const internal::Arg *args) - : types_(types), args_(args) {} - - /** Returns the argument at specified index. */ - internal::Arg operator[](unsigned index) const - { - using internal::Arg; - Arg arg; - bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; - if (index < MAX_PACKED_ARGS) - { - Arg::Type arg_type = type(index); - internal::Value &val = arg; - if (arg_type != Arg::NONE) - val = use_values ? values_[index] : args_[index]; - arg.type = arg_type; - return arg; - } - if (use_values) - { - // The index is greater than the number of arguments that can be stored - // in values, so return a "none" argument. - arg.type = Arg::NONE; - return arg; - } - for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) - { - if (args_[i].type == Arg::NONE) - return args_[i]; - } - return args_[index]; - } -}; - -#define FMT_DISPATCH(call) static_cast(this)->call - -/** - \rst - An argument visitor based on the `curiously recurring template pattern - `_. - - To use `~fmt::ArgVisitor` define a subclass that implements some or all of the - visit methods with the same signatures as the methods in `~fmt::ArgVisitor`, - for example, `~fmt::ArgVisitor::visit_int()`. - Pass the subclass as the *Impl* template parameter. Then calling - `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method - specific to the argument type. For example, if the argument type is - ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass - will be called. If the subclass doesn't contain a method with this signature, - then a corresponding method of `~fmt::ArgVisitor` will be called. - - **Example**:: - - class MyArgVisitor : public fmt::ArgVisitor { - public: - void visit_int(int value) { fmt::print("{}", value); } - void visit_double(double value) { fmt::print("{}", value ); } - }; - \endrst - */ -template -class ArgVisitor -{ -private: - typedef internal::Arg Arg; - -public: - void report_unhandled_arg() {} - - Result visit_unhandled_arg() - { - FMT_DISPATCH(report_unhandled_arg()); - return Result(); - } - - /** Visits an ``int`` argument. **/ - Result visit_int(int value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``long long`` argument. **/ - Result visit_long_long(LongLong value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an ``unsigned`` argument. **/ - Result visit_uint(unsigned value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an ``unsigned long long`` argument. **/ - Result visit_ulong_long(ULongLong value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``bool`` argument. **/ - Result visit_bool(bool value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``char`` or ``wchar_t`` argument. **/ - Result visit_char(int value) - { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an argument of any integral type. **/ - template - Result visit_any_int(T) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a ``double`` argument. **/ - Result visit_double(double value) - { - return FMT_DISPATCH(visit_any_double(value)); - } - - /** Visits a ``long double`` argument. **/ - Result visit_long_double(long double value) - { - return FMT_DISPATCH(visit_any_double(value)); - } - - /** Visits a ``double`` or ``long double`` argument. **/ - template - Result visit_any_double(T) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a null-terminated C string (``const char *``) argument. **/ - Result visit_cstring(const char *) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a string argument. **/ - Result visit_string(Arg::StringValue) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a wide string argument. **/ - Result visit_wstring(Arg::StringValue) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a pointer argument. **/ - Result visit_pointer(const void *) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits an argument of a custom (user-defined) type. **/ - Result visit_custom(Arg::CustomValue) - { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** - \rst - Visits an argument dispatching to the appropriate visit method based on - the argument type. For example, if the argument type is ``double`` then - the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be - called. - \endrst - */ - Result visit(const Arg &arg) - { - switch (arg.type) - { - case Arg::NONE: - case Arg::NAMED_ARG: - FMT_ASSERT(false, "invalid argument type"); - break; - case Arg::INT: - return FMT_DISPATCH(visit_int(arg.int_value)); - case Arg::UINT: - return FMT_DISPATCH(visit_uint(arg.uint_value)); - case Arg::LONG_LONG: - return FMT_DISPATCH(visit_long_long(arg.long_long_value)); - case Arg::ULONG_LONG: - return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); - case Arg::BOOL: - return FMT_DISPATCH(visit_bool(arg.int_value != 0)); - case Arg::CHAR: - return FMT_DISPATCH(visit_char(arg.int_value)); - case Arg::DOUBLE: - return FMT_DISPATCH(visit_double(arg.double_value)); - case Arg::LONG_DOUBLE: - return FMT_DISPATCH(visit_long_double(arg.long_double_value)); - case Arg::CSTRING: - return FMT_DISPATCH(visit_cstring(arg.string.value)); - case Arg::STRING: - return FMT_DISPATCH(visit_string(arg.string)); - case Arg::WSTRING: - return FMT_DISPATCH(visit_wstring(arg.wstring)); - case Arg::POINTER: - return FMT_DISPATCH(visit_pointer(arg.pointer)); - case Arg::CUSTOM: - return FMT_DISPATCH(visit_custom(arg.custom)); - } - return Result(); - } -}; - -enum Alignment -{ - ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC -}; - -// Flags. -enum -{ - SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, - CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. -}; - -// An empty format specifier. -struct EmptySpec {}; - -// A type specifier. -template -struct TypeSpec : EmptySpec -{ - Alignment align() const - { - return ALIGN_DEFAULT; - } - unsigned width() const - { - return 0; - } - int precision() const - { - return -1; - } - bool flag(unsigned) const - { - return false; - } - char type() const - { - return TYPE; - } - char fill() const - { - return ' '; - } -}; - -// A width specifier. -struct WidthSpec -{ - unsigned width_; - // Fill is always wchar_t and cast to char if necessary to avoid having - // two specialization of WidthSpec and its subclasses. - wchar_t fill_; - - WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} - - unsigned width() const - { - return width_; - } - wchar_t fill() const - { - return fill_; - } -}; - -// An alignment specifier. -struct AlignSpec : WidthSpec -{ - Alignment align_; - - AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) - : WidthSpec(width, fill), align_(align) {} - - Alignment align() const - { - return align_; - } - - int precision() const - { - return -1; - } -}; - -// An alignment and type specifier. -template -struct AlignTypeSpec : AlignSpec -{ - AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} - - bool flag(unsigned) const - { - return false; - } - char type() const - { - return TYPE; - } -}; - -// A full format specifier. -struct FormatSpec : AlignSpec -{ - unsigned flags_; - int precision_; - char type_; - - FormatSpec( - unsigned width = 0, char type = 0, wchar_t fill = ' ') - : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} - - bool flag(unsigned f) const - { - return (flags_ & f) != 0; - } - int precision() const - { - return precision_; - } - char type() const - { - return type_; - } -}; - -// An integer format specifier. -template , typename Char = char> -class IntFormatSpec : public SpecT -{ -private: - T value_; - -public: - IntFormatSpec(T val, const SpecT &spec = SpecT()) - : SpecT(spec), value_(val) {} - - T value() const - { - return value_; - } -}; - -// A string format specifier. -template -class StrFormatSpec : public AlignSpec -{ -private: - const Char *str_; - -public: - template - StrFormatSpec(const Char *str, unsigned width, FillChar fill) - : AlignSpec(width, fill), str_(str) - { - internal::CharTraits::convert(FillChar()); - } - - const Char *str() const - { - return str_; - } -}; - -/** - Returns an integer format specifier to format the value in base 2. - */ -IntFormatSpec > bin(int value); - -/** - Returns an integer format specifier to format the value in base 8. - */ -IntFormatSpec > oct(int value); - -/** - Returns an integer format specifier to format the value in base 16 using - lower-case letters for the digits above 9. - */ -IntFormatSpec > hex(int value); - -/** - Returns an integer formatter format specifier to format in base 16 using - upper-case letters for the digits above 9. - */ -IntFormatSpec > hexu(int value); - -/** - \rst - Returns an integer format specifier to pad the formatted argument with the - fill character to the specified width using the default (right) numeric - alignment. - - **Example**:: - - MemoryWriter out; - out << pad(hex(0xcafe), 8, '0'); - // out.str() == "0000cafe" - - \endrst - */ -template -IntFormatSpec, Char> pad( - int value, unsigned width, Char fill = ' '); - -#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ -inline IntFormatSpec > bin(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'b'>()); \ -} \ - \ -inline IntFormatSpec > oct(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'o'>()); \ -} \ - \ -inline IntFormatSpec > hex(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'x'>()); \ -} \ - \ -inline IntFormatSpec > hexu(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'X'>()); \ -} \ - \ -template \ -inline IntFormatSpec > pad( \ - IntFormatSpec > f, unsigned width) { \ - return IntFormatSpec >( \ - f.value(), AlignTypeSpec(width, ' ')); \ -} \ - \ -/* For compatibility with older compilers we provide two overloads for pad, */ \ -/* one that takes a fill character and one that doesn't. In the future this */ \ -/* can be replaced with one overload making the template argument Char */ \ -/* default to char (C++11). */ \ -template \ -inline IntFormatSpec, Char> pad( \ - IntFormatSpec, Char> f, \ - unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - f.value(), AlignTypeSpec(width, fill)); \ -} \ - \ -inline IntFormatSpec > pad( \ - TYPE value, unsigned width) { \ - return IntFormatSpec >( \ - value, AlignTypeSpec<0>(width, ' ')); \ -} \ - \ -template \ -inline IntFormatSpec, Char> pad( \ - TYPE value, unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - value, AlignTypeSpec<0>(width, fill)); \ -} - -FMT_DEFINE_INT_FORMATTERS(int) -FMT_DEFINE_INT_FORMATTERS(long) -FMT_DEFINE_INT_FORMATTERS(unsigned) -FMT_DEFINE_INT_FORMATTERS(unsigned long) -FMT_DEFINE_INT_FORMATTERS(LongLong) -FMT_DEFINE_INT_FORMATTERS(ULongLong) - -/** - \rst - Returns a string formatter that pads the formatted argument with the fill - character to the specified width using the default (left) string alignment. - - **Example**:: - - std::string s = str(MemoryWriter() << pad("abc", 8)); - // s == "abc " - - \endrst - */ -template -inline StrFormatSpec pad( - const Char *str, unsigned width, Char fill = ' ') -{ - return StrFormatSpec(str, width, fill); -} - -inline StrFormatSpec pad( - const wchar_t *str, unsigned width, char fill = ' ') -{ - return StrFormatSpec(str, width, fill); -} - -namespace internal -{ - -template -class ArgMap -{ -private: - typedef std::vector< - std::pair, internal::Arg> > MapType; - typedef typename MapType::value_type Pair; - - MapType map_; - -public: - FMT_API void init(const ArgList &args); - - const internal::Arg* find(const fmt::BasicStringRef &name) const - { - // The list is unsorted, so just return the first matching name. - for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); - it != end; ++it) - { - if (it->first == name) - return &it->second; - } - return 0; - } -}; - -template -class ArgFormatterBase : public ArgVisitor -{ -private: - BasicWriter &writer_; - FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase); - - void write_pointer(const void *p) - { - spec_.flags_ = HASH_FLAG; - spec_.type_ = 'x'; - writer_.write_int(reinterpret_cast(p), spec_); - } - -protected: - BasicWriter &writer() - { - return writer_; - } - FormatSpec &spec() - { - return spec_; - } - - void write(bool value) - { - const char *str_value = value ? "true" : "false"; - Arg::StringValue str = { str_value, std::strlen(str_value) }; - writer_.write_str(str, spec_); - } - - void write(const char *value) - { - Arg::StringValue str = {value, value != 0 ? std::strlen(value) : 0}; - writer_.write_str(str, spec_); - } - -public: - ArgFormatterBase(BasicWriter &w, FormatSpec &s) - : writer_(w), spec_(s) {} - - template - void visit_any_int(T value) - { - writer_.write_int(value, spec_); - } - - template - void visit_any_double(T value) - { - writer_.write_double(value, spec_); - } - - void visit_bool(bool value) - { - if (spec_.type_) - return visit_any_int(value); - write(value); - } - - void visit_char(int value) - { - if (spec_.type_ && spec_.type_ != 'c') - { - spec_.flags_ |= CHAR_FLAG; - writer_.write_int(value, spec_); - return; - } - if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) - FMT_THROW(FormatError("invalid format specifier for char")); - typedef typename BasicWriter::CharPtr CharPtr; - Char fill = internal::CharTraits::cast(spec_.fill()); - CharPtr out = CharPtr(); - const unsigned CHAR_SIZE = 1; - if (spec_.width_ > CHAR_SIZE) - { - out = writer_.grow_buffer(spec_.width_); - if (spec_.align_ == ALIGN_RIGHT) - { - std::uninitialized_fill_n(out, spec_.width_ - CHAR_SIZE, fill); - out += spec_.width_ - CHAR_SIZE; - } - else if (spec_.align_ == ALIGN_CENTER) - { - out = writer_.fill_padding(out, spec_.width_, - internal::const_check(CHAR_SIZE), fill); - } - else - { - std::uninitialized_fill_n(out + CHAR_SIZE, - spec_.width_ - CHAR_SIZE, fill); - } - } - else - { - out = writer_.grow_buffer(CHAR_SIZE); - } - *out = internal::CharTraits::cast(value); - } - - void visit_cstring(const char *value) - { - if (spec_.type_ == 'p') - return write_pointer(value); - write(value); - } - - void visit_string(Arg::StringValue value) - { - writer_.write_str(value, spec_); - } - - using ArgVisitor::visit_wstring; - - void visit_wstring(Arg::StringValue value) - { - writer_.write_str(value, spec_); - } - - void visit_pointer(const void *value) - { - if (spec_.type_ && spec_.type_ != 'p') - report_unknown_type(spec_.type_, "pointer"); - write_pointer(value); - } -}; - -class FormatterBase -{ -private: - ArgList args_; - int next_arg_index_; - - // Returns the argument with specified index. - FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); - -protected: - const ArgList &args() const - { - return args_; - } - - explicit FormatterBase(const ArgList &args) - { - args_ = args; - next_arg_index_ = 0; - } - - // Returns the next argument. - Arg next_arg(const char *&error) - { - if (next_arg_index_ >= 0) - return do_get_arg(internal::to_unsigned(next_arg_index_++), error); - error = "cannot switch from manual to automatic argument indexing"; - return Arg(); - } - - // Checks if manual indexing is used and returns the argument with - // specified index. - Arg get_arg(unsigned arg_index, const char *&error) - { - return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); - } - - bool check_no_auto_index(const char *&error) - { - if (next_arg_index_ > 0) - { - error = "cannot switch from automatic to manual argument indexing"; - return false; - } - next_arg_index_ = -1; - return true; - } - - template - void write(BasicWriter &w, const Char *start, const Char *end) - { - if (start != end) - w << BasicStringRef(start, internal::to_unsigned(end - start)); - } -}; - -// A printf formatter. -template -class PrintfFormatter : private FormatterBase -{ -private: - void parse_flags(FormatSpec &spec, const Char *&s); - - // Returns the argument with specified index or, if arg_index is equal - // to the maximum unsigned value, the next argument. - Arg get_arg(const Char *s, - unsigned arg_index = (std::numeric_limits::max)()); - - // Parses argument index, flags and width and returns the argument index. - unsigned parse_header(const Char *&s, FormatSpec &spec); - -public: - explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} - FMT_API void format(BasicWriter &writer, - BasicCStringRef format_str); -}; -} // namespace internal - -/** - \rst - An argument formatter based on the `curiously recurring template pattern - `_. - - To use `~fmt::BasicArgFormatter` define a subclass that implements some or - all of the visit methods with the same signatures as the methods in - `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`. - Pass the subclass as the *Impl* template parameter. When a formatting - function processes an argument, it will dispatch to a visit method - specific to the argument type. For example, if the argument type is - ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass - will be called. If the subclass doesn't contain a method with this signature, - then a corresponding method of `~fmt::BasicArgFormatter` or its superclass - will be called. - \endrst - */ -template -class BasicArgFormatter : public internal::ArgFormatterBase -{ -private: - BasicFormatter &formatter_; - const Char *format_; - -public: - /** - \rst - Constructs an argument formatter object. - *formatter* is a reference to the main formatter object, *spec* contains - format specifier information for standard argument types, and *fmt* points - to the part of the format string being parsed for custom argument types. - \endrst - */ - BasicArgFormatter(BasicFormatter &formatter, - FormatSpec &spec, const Char *fmt) - : internal::ArgFormatterBase(formatter.writer(), spec), - formatter_(formatter), format_(fmt) {} - - /** Formats argument of a custom (user-defined) type. */ - void visit_custom(internal::Arg::CustomValue c) - { - c.format(&formatter_, c.value, &format_); - } -}; - -/** The default argument formatter. */ -template -class ArgFormatter : public BasicArgFormatter, Char> -{ -public: - /** Constructs an argument formatter object. */ - ArgFormatter(BasicFormatter &formatter, - FormatSpec &spec, const Char *fmt) - : BasicArgFormatter, Char>(formatter, spec, fmt) {} -}; - -/** This template formats data and writes the output to a writer. */ -template -class BasicFormatter : private internal::FormatterBase -{ -public: - /** The character type for the output. */ - typedef CharType Char; - -private: - BasicWriter &writer_; - internal::ArgMap map_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); - - using internal::FormatterBase::get_arg; - - // Checks if manual indexing is used and returns the argument with - // specified name. - internal::Arg get_arg(BasicStringRef arg_name, const char *&error); - - // Parses argument index and returns corresponding argument. - internal::Arg parse_arg_index(const Char *&s); - - // Parses argument name and returns corresponding argument. - internal::Arg parse_arg_name(const Char *&s); - -public: - /** - \rst - Constructs a ``BasicFormatter`` object. References to the arguments and - the writer are stored in the formatter object so make sure they have - appropriate lifetimes. - \endrst - */ - BasicFormatter(const ArgList &args, BasicWriter &w) - : internal::FormatterBase(args), writer_(w) {} - - /** Returns a reference to the writer associated with this formatter. */ - BasicWriter &writer() - { - return writer_; - } - - /** Formats stored arguments and writes the output to the writer. */ - void format(BasicCStringRef format_str); - - // Formats a single argument and advances format_str, a format string pointer. - const Char *format(const Char *&format_str, const internal::Arg &arg); -}; - -// Generates a comma-separated list with results of applying f to -// numbers 0..n-1. -# define FMT_GEN(n, f) FMT_GEN##n(f) -# define FMT_GEN1(f) f(0) -# define FMT_GEN2(f) FMT_GEN1(f), f(1) -# define FMT_GEN3(f) FMT_GEN2(f), f(2) -# define FMT_GEN4(f) FMT_GEN3(f), f(3) -# define FMT_GEN5(f) FMT_GEN4(f), f(4) -# define FMT_GEN6(f) FMT_GEN5(f), f(5) -# define FMT_GEN7(f) FMT_GEN6(f), f(6) -# define FMT_GEN8(f) FMT_GEN7(f), f(7) -# define FMT_GEN9(f) FMT_GEN8(f), f(8) -# define FMT_GEN10(f) FMT_GEN9(f), f(9) -# define FMT_GEN11(f) FMT_GEN10(f), f(10) -# define FMT_GEN12(f) FMT_GEN11(f), f(11) -# define FMT_GEN13(f) FMT_GEN12(f), f(12) -# define FMT_GEN14(f) FMT_GEN13(f), f(13) -# define FMT_GEN15(f) FMT_GEN14(f), f(14) - -namespace internal -{ -inline uint64_t make_type() -{ - return 0; -} - -template -inline uint64_t make_type(const T &arg) -{ - return MakeValue< BasicFormatter >::type(arg); -} - -template - struct ArgArray; - -template -struct ArgArray -{ - typedef Value Type[N > 0 ? N : 1]; - -template -static Value make(const T &value) -{ -#ifdef __clang__ - Value result = MakeValue(value); - // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: - // https://github.com/fmtlib/fmt/issues/276 - (void)result.custom.format; - return result; -#else - return MakeValue(value); -#endif -} - }; - -template -struct ArgArray -{ - typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE - - template - static Arg make(const T &value) - { - return MakeArg(value); - } -}; - -#if FMT_USE_VARIADIC_TEMPLATES -template -inline uint64_t make_type(const Arg &first, const Args & ... tail) -{ - return make_type(first) | (make_type(tail...) << 4); -} - -#else - -struct ArgType -{ - uint64_t type; - - ArgType() : type(0) {} - - template - ArgType(const T &arg) : type(make_type(arg)) {} -}; - -# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() - -inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) -{ - return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | - (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | - (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | - (t12.type << 48) | (t13.type << 52) | (t14.type << 56); -} -#endif -} // namespace internal - -# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n -# define FMT_MAKE_ARG_TYPE(n) T##n -# define FMT_MAKE_ARG(n) const T##n &v##n -# define FMT_ASSIGN_char(n) \ - arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) -# define FMT_ASSIGN_wchar_t(n) \ - arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) - -#if FMT_USE_VARIADIC_TEMPLATES -// Defines a variadic function returning void. -# define FMT_VARIADIC_VOID(func, arg_type) \ - template \ - void func(arg_type arg0, const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } - -// Defines a variadic constructor. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } - -#else - -# define FMT_MAKE_REF(n) \ - fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) -# define FMT_MAKE_REF2(n) v##n - -// Defines a wrapper for a function taking one argument of type arg_type -// and n additional arguments of arbitrary types. -# define FMT_WRAP1(func, arg_type, n) \ - template \ - inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic function returning void on a pre-C++11 compiler. -# define FMT_VARIADIC_VOID(func, arg_type) \ - inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ - FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ - FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ - FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ - FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ - FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) - -# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg0, arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic constructor on a pre-C++11 compiler. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) -#endif - -// Generates a comma-separated list with results of applying f to pairs -// (argument, index). -#define FMT_FOR_EACH1(f, x0) f(x0, 0) -#define FMT_FOR_EACH2(f, x0, x1) \ - FMT_FOR_EACH1(f, x0), f(x1, 1) -#define FMT_FOR_EACH3(f, x0, x1, x2) \ - FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) -#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ - FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) -#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ - FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) -#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ - FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) -#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ - FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) -#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ - FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) -#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ - FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) -#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ - FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) - -/** - An error returned by an operating system or a language runtime, - for example a file opening error. -*/ -class SystemError : public internal::RuntimeError -{ -private: - void init(int err_code, CStringRef format_str, ArgList args); - -protected: - int error_code_; - - typedef char Char; // For FMT_VARIADIC_CTOR. - - SystemError() {} - -public: - /** - \rst - Constructs a :class:`fmt::SystemError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is - the system message corresponding to the error code. - *error_code* is a system error code as given by ``errno``. - If *error_code* is not a valid error code such as -1, the system message - may look like "Unknown error -1" and is platform-dependent. - - **Example**:: - - // This throws a SystemError with the description - // cannot open file 'madeup': No such file or directory - // or similar (system message may vary). - const char *filename = "madeup"; - std::FILE *file = std::fopen(filename, "r"); - if (!file) - throw fmt::SystemError(errno, "cannot open file '{}'", filename); - \endrst - */ - SystemError(int error_code, CStringRef message) - { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) - - ~SystemError() throw(); - - int error_code() const - { - return error_code_; - } -}; - -/** - \rst - This template provides operations for formatting and writing data into - a character stream. The output is stored in a buffer provided by a subclass - such as :class:`fmt::BasicMemoryWriter`. - - You can use one of the following typedefs for common character types: - - +---------+----------------------+ - | Type | Definition | - +=========+======================+ - | Writer | BasicWriter | - +---------+----------------------+ - | WWriter | BasicWriter | - +---------+----------------------+ - - \endrst - */ -template -class BasicWriter -{ -private: - // Output buffer. - Buffer &buffer_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); - - typedef typename internal::CharTraits::CharPtr CharPtr; - -#if FMT_SECURE_SCL - // Returns pointer value. - static Char *get(CharPtr p) - { - return p.base(); - } -#else - static Char *get(Char *p) - { - return p; - } -#endif - - // Fills the padding around the content and returns the pointer to the - // content area. - static CharPtr fill_padding(CharPtr buffer, - unsigned total_size, std::size_t content_size, wchar_t fill); - - // Grows the buffer by n characters and returns a pointer to the newly - // allocated area. - CharPtr grow_buffer(std::size_t n) - { - std::size_t size = buffer_.size(); - buffer_.resize(size + n); - return internal::make_ptr(&buffer_[size], n); - } - - // Writes an unsigned decimal integer. - template - Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) - { - unsigned num_digits = internal::count_digits(value); - Char *ptr = get(grow_buffer(prefix_size + num_digits)); - internal::format_decimal(ptr + prefix_size, value, num_digits); - return ptr; - } - - // Writes a decimal integer. - template - void write_decimal(Int value) - { - typedef typename internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(value); - if (internal::is_negative(value)) - { - abs_value = 0 - abs_value; - *write_unsigned_decimal(abs_value, 1) = '-'; - } - else - { - write_unsigned_decimal(abs_value, 0); - } - } - - // Prepare a buffer for integer formatting. - CharPtr prepare_int_buffer(unsigned num_digits, - const EmptySpec &, const char *prefix, unsigned prefix_size) - { - unsigned size = prefix_size + num_digits; - CharPtr p = grow_buffer(size); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - - template - CharPtr prepare_int_buffer(unsigned num_digits, - const Spec &spec, const char *prefix, unsigned prefix_size); - - // Formats an integer. - template - void write_int(T value, Spec spec); - - // Formats a floating-point number (double or long double). - template - void write_double(T value, const FormatSpec &spec); - - // Writes a formatted string. - template - CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec); - - template - void write_str(const internal::Arg::StringValue &str, - const FormatSpec &spec); - - // This following methods are private to disallow writing wide characters - // and strings to a char stream. If you want to print a wide string as a - // pointer as std::ostream does, cast it to const void*. - // Do not implement! - void operator<<(typename internal::WCharHelper::Unsupported); - void operator<<( - typename internal::WCharHelper::Unsupported); - - // Appends floating-point length specifier to the format string. - // The second argument is only used for overload resolution. - void append_float_length(Char *&format_ptr, long double) - { - *format_ptr++ = 'L'; - } - - template - void append_float_length(Char *&, T) {} - - template - friend class internal::ArgFormatterBase; - - friend class internal::PrintfArgFormatter; - -protected: - /** - Constructs a ``BasicWriter`` object. - */ - explicit BasicWriter(Buffer &b) : buffer_(b) {} - -public: - /** - \rst - Destroys a ``BasicWriter`` object. - \endrst - */ - virtual ~BasicWriter() {} - - /** - Returns the total number of characters written. - */ - std::size_t size() const - { - return buffer_.size(); - } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const Char *data() const FMT_NOEXCEPT - { - return &buffer_[0]; - } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const Char *c_str() const - { - std::size_t size = buffer_.size(); - buffer_.reserve(size + 1); - buffer_[size] = '\0'; - return &buffer_[0]; - } - - /** - \rst - Returns the content of the output buffer as an `std::string`. - \endrst - */ - std::basic_string str() const - { - return std::basic_string(&buffer_[0], buffer_.size()); - } - - /** - \rst - Writes formatted data. - - *args* is an argument list representing arbitrary arguments. - - **Example**:: - - MemoryWriter out; - out.write("Current point:\n"); - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - Current point: - (-3.140000, +3.140000) - - The output can be accessed using :func:`data()`, :func:`c_str` or - :func:`str` methods. - - See also :ref:`syntax`. - \endrst - */ - void write(BasicCStringRef format, ArgList args) - { - BasicFormatter(args, *this).format(format); - } - FMT_VARIADIC_VOID(write, BasicCStringRef) - - BasicWriter &operator<<(int value) - { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned value) - { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(long value) - { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned long value) - { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(LongLong value) - { - write_decimal(value); - return *this; - } - - /** - \rst - Formats *value* and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(ULongLong value) - { - return *this << IntFormatSpec(value); - } - - BasicWriter &operator<<(double value) - { - write_double(value, FormatSpec()); - return *this; - } - - /** - \rst - Formats *value* using the general format for floating-point numbers - (``'g'``) and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(long double value) - { - write_double(value, FormatSpec()); - return *this; - } - - /** - Writes a character to the stream. - */ - BasicWriter &operator<<(char value) - { - buffer_.push_back(value); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) - { - buffer_.push_back(value); - return *this; - } - - /** - \rst - Writes *value* to the stream. - \endrst - */ - BasicWriter &operator<<(fmt::BasicStringRef value) - { - const Char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) - { - const char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - template - BasicWriter &operator<<(IntFormatSpec spec) - { - internal::CharTraits::convert(FillChar()); - write_int(spec.value(), spec); - return *this; - } - - template - BasicWriter &operator<<(const StrFormatSpec &spec) - { - const StrChar *s = spec.str(); - write_str(s, std::char_traits::length(s), spec); - return *this; - } - - void clear() FMT_NOEXCEPT { buffer_.clear(); } - - Buffer &buffer() FMT_NOEXCEPT { return buffer_; } -}; - -template -template -typename BasicWriter::CharPtr BasicWriter::write_str( - const StrChar *s, std::size_t size, const AlignSpec &spec) -{ - CharPtr out = CharPtr(); - if (spec.width() > size) - { - out = grow_buffer(spec.width()); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.align() == ALIGN_RIGHT) - { - std::uninitialized_fill_n(out, spec.width() - size, fill); - out += spec.width() - size; - } - else if (spec.align() == ALIGN_CENTER) - { - out = fill_padding(out, spec.width(), size, fill); - } - else - { - std::uninitialized_fill_n(out + size, spec.width() - size, fill); - } - } - else - { - out = grow_buffer(size); - } - std::uninitialized_copy(s, s + size, out); - return out; -} - -template -template -void BasicWriter::write_str( - const internal::Arg::StringValue &s, const FormatSpec &spec) -{ - // Check if StrChar is convertible to Char. - internal::CharTraits::convert(StrChar()); - if (spec.type_ && spec.type_ != 's') - internal::report_unknown_type(spec.type_, "string"); - const StrChar *str_value = s.value; - std::size_t str_size = s.size; - if (str_size == 0) - { - if (!str_value) - { - FMT_THROW(FormatError("string pointer is null")); - } - } - std::size_t precision = static_cast(spec.precision_); - if (spec.precision_ >= 0 && precision < str_size) - str_size = precision; - write_str(str_value, str_size, spec); -} - -template -typename BasicWriter::CharPtr -BasicWriter::fill_padding( - CharPtr buffer, unsigned total_size, - std::size_t content_size, wchar_t fill) -{ - std::size_t padding = total_size - content_size; - std::size_t left_padding = padding / 2; - Char fill_char = internal::CharTraits::cast(fill); - std::uninitialized_fill_n(buffer, left_padding, fill_char); - buffer += left_padding; - CharPtr content = buffer; - std::uninitialized_fill_n(buffer + content_size, - padding - left_padding, fill_char); - return content; -} - -template -template -typename BasicWriter::CharPtr -BasicWriter::prepare_int_buffer( - unsigned num_digits, const Spec &spec, - const char *prefix, unsigned prefix_size) -{ - unsigned width = spec.width(); - Alignment align = spec.align(); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.precision() > static_cast(num_digits)) - { - // Octal prefix '0' is counted as a digit, so ignore it if precision - // is specified. - if (prefix_size > 0 && prefix[prefix_size - 1] == '0') - --prefix_size; - unsigned number_size = - prefix_size + internal::to_unsigned(spec.precision()); - AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); - if (number_size >= width) - return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); - buffer_.reserve(width); - unsigned fill_size = width - number_size; - if (align != ALIGN_LEFT) - { - CharPtr p = grow_buffer(fill_size); - std::uninitialized_fill(p, p + fill_size, fill); - } - CharPtr result = prepare_int_buffer( - num_digits, subspec, prefix, prefix_size); - if (align == ALIGN_LEFT) - { - CharPtr p = grow_buffer(fill_size); - std::uninitialized_fill(p, p + fill_size, fill); - } - return result; - } - unsigned size = prefix_size + num_digits; - if (width <= size) - { - CharPtr p = grow_buffer(size); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - CharPtr p = grow_buffer(width); - CharPtr end = p + width; - if (align == ALIGN_LEFT) - { - std::uninitialized_copy(prefix, prefix + prefix_size, p); - p += size; - std::uninitialized_fill(p, end, fill); - } - else if (align == ALIGN_CENTER) - { - p = fill_padding(p, width, size, fill); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - p += size; - } - else - { - if (align == ALIGN_NUMERIC) - { - if (prefix_size != 0) - { - p = std::uninitialized_copy(prefix, prefix + prefix_size, p); - size -= prefix_size; - } - } - else - { - std::uninitialized_copy(prefix, prefix + prefix_size, end - size); - } - std::uninitialized_fill(p, end - size, fill); - p = end; - } - return p - 1; -} - -template -template -void BasicWriter::write_int(T value, Spec spec) -{ - unsigned prefix_size = 0; - typedef typename internal::IntTraits::MainType UnsignedType; - UnsignedType abs_value = static_cast(value); - char prefix[4] = ""; - if (internal::is_negative(value)) - { - prefix[0] = '-'; - ++prefix_size; - abs_value = 0 - abs_value; - } - else if (spec.flag(SIGN_FLAG)) - { - prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; - ++prefix_size; - } - switch (spec.type()) - { - case 0: - case 'd': - { - unsigned num_digits = internal::count_digits(abs_value); - CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1; - internal::format_decimal(get(p), abs_value, 0); - break; - } - case 'x': - case 'X': - { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) - { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do - { - ++num_digits; - } - while ((n >>= 4) != 0); - Char *p = get(prepare_int_buffer( - num_digits, spec, prefix, prefix_size)); - n = abs_value; - const char *digits = spec.type() == 'x' ? - "0123456789abcdef" : "0123456789ABCDEF"; - do - { - *p-- = digits[n & 0xf]; - } - while ((n >>= 4) != 0); - break; - } - case 'b': - case 'B': - { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) - { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do - { - ++num_digits; - } - while ((n >>= 1) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do - { - *p-- = static_cast('0' + (n & 1)); - } - while ((n >>= 1) != 0); - break; - } - case 'o': - { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) - prefix[prefix_size++] = '0'; - unsigned num_digits = 0; - do - { - ++num_digits; - } - while ((n >>= 3) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do - { - *p-- = static_cast('0' + (n & 7)); - } - while ((n >>= 3) != 0); - break; - } - case 'n': - { - unsigned num_digits = internal::count_digits(abs_value); - fmt::StringRef sep = ""; -#ifndef ANDROID - sep = internal::thousands_sep(std::localeconv()); -#endif - unsigned size = static_cast( - num_digits + sep.size() * ((num_digits - 1) / 3)); - CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1; - internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep)); - break; - } - default: - internal::report_unknown_type( - spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); - break; - } -} - -template -template -void BasicWriter::write_double(T value, const FormatSpec &spec) -{ - // Check type. - char type = spec.type(); - bool upper = false; - switch (type) - { - case 0: - type = 'g'; - break; - case 'e': - case 'f': - case 'g': - case 'a': - break; - case 'F': -#if FMT_MSC_VER - // MSVC's printf doesn't support 'F'. - type = 'f'; -#endif - // Fall through. - case 'E': - case 'G': - case 'A': - upper = true; - break; - default: - internal::report_unknown_type(type, "double"); - break; - } - - char sign = 0; - // Use isnegative instead of value < 0 because the latter is always - // false for NaN. - if (internal::FPUtil::isnegative(static_cast(value))) - { - sign = '-'; - value = -value; - } - else if (spec.flag(SIGN_FLAG)) - { - sign = spec.flag(PLUS_FLAG) ? '+' : ' '; - } - - if (internal::FPUtil::isnotanumber(value)) - { - // Format NaN ourselves because sprintf's output is not consistent - // across platforms. - std::size_t nan_size = 4; - const char *nan = upper ? " NAN" : " nan"; - if (!sign) - { - --nan_size; - ++nan; - } - CharPtr out = write_str(nan, nan_size, spec); - if (sign) - *out = sign; - return; - } - - if (internal::FPUtil::isinfinity(value)) - { - // Format infinity ourselves because sprintf's output is not consistent - // across platforms. - std::size_t inf_size = 4; - const char *inf = upper ? " INF" : " inf"; - if (!sign) - { - --inf_size; - ++inf; - } - CharPtr out = write_str(inf, inf_size, spec); - if (sign) - *out = sign; - return; - } - - std::size_t offset = buffer_.size(); - unsigned width = spec.width(); - if (sign) - { - buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u)); - if (width > 0) - --width; - ++offset; - } - - // Build format string. - enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg - Char format[MAX_FORMAT_SIZE]; - Char *format_ptr = format; - *format_ptr++ = '%'; - unsigned width_for_sprintf = width; - if (spec.flag(HASH_FLAG)) - *format_ptr++ = '#'; - if (spec.align() == ALIGN_CENTER) - { - width_for_sprintf = 0; - } - else - { - if (spec.align() == ALIGN_LEFT) - *format_ptr++ = '-'; - if (width != 0) - *format_ptr++ = '*'; - } - if (spec.precision() >= 0) - { - *format_ptr++ = '.'; - *format_ptr++ = '*'; - } - - append_float_length(format_ptr, value); - *format_ptr++ = type; - *format_ptr = '\0'; - - // Format using snprintf. - Char fill = internal::CharTraits::cast(spec.fill()); - unsigned n = 0; - Char *start = 0; - for (;;) - { - std::size_t buffer_size = buffer_.capacity() - offset; -#if FMT_MSC_VER - // MSVC's vsnprintf_s doesn't work with zero size, so reserve - // space for at least one extra character to make the size non-zero. - // Note that the buffer's capacity will increase by more than 1. - if (buffer_size == 0) - { - buffer_.reserve(offset + 1); - buffer_size = buffer_.capacity() - offset; - } -#endif - start = &buffer_[offset]; - int result = internal::CharTraits::format_float( - start, buffer_size, format, width_for_sprintf, spec.precision(), value); - if (result >= 0) - { - n = internal::to_unsigned(result); - if (offset + n < buffer_.capacity()) - break; // The buffer is large enough - continue with formatting. - buffer_.reserve(offset + n + 1); - } - else - { - // If result is negative we ask to increase the capacity by at least 1, - // but as std::vector, the buffer grows exponentially. - buffer_.reserve(buffer_.capacity() + 1); - } - } - if (sign) - { - if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || - *start != ' ') - { - *(start - 1) = sign; - sign = 0; - } - else - { - *(start - 1) = fill; - } - ++n; - } - if (spec.align() == ALIGN_CENTER && spec.width() > n) - { - width = spec.width(); - CharPtr p = grow_buffer(width); - std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); - fill_padding(p, spec.width(), n, fill); - return; - } - if (spec.fill() != ' ' || sign) - { - while (*start == ' ') - *start++ = fill; - if (sign) - *(start - 1) = sign; - } - grow_buffer(n); -} - -/** - \rst - This class template provides operations for formatting and writing data - into a character stream. The output is stored in a memory buffer that grows - dynamically. - - You can use one of the following typedefs for common character types - and the standard allocator: - - +---------------+-----------------------------------------------------+ - | Type | Definition | - +===============+=====================================================+ - | MemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - | WMemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - - **Example**:: - - MemoryWriter out; - out << "The answer is " << 42 << "\n"; - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - The answer is 42 - (-3.140000, +3.140000) - - The output can be converted to an ``std::string`` with ``out.str()`` or - accessed as a C string with ``out.c_str()``. - \endrst - */ -template > -class BasicMemoryWriter : public BasicWriter -{ -private: - internal::MemoryBuffer buffer_; - -public: - explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) - : BasicWriter(buffer_), buffer_(alloc) {} - -#if FMT_USE_RVALUE_REFERENCES - /** - \rst - Constructs a :class:`fmt::BasicMemoryWriter` object moving the content - of the other object to it. - \endrst - */ - BasicMemoryWriter(BasicMemoryWriter &&other) - : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) - { - } - - /** - \rst - Moves the content of the other ``BasicMemoryWriter`` object to this one. - \endrst - */ - BasicMemoryWriter &operator=(BasicMemoryWriter &&other) - { - buffer_ = std::move(other.buffer_); - return *this; - } -#endif -}; - -typedef BasicMemoryWriter MemoryWriter; -typedef BasicMemoryWriter WMemoryWriter; - -/** - \rst - This class template provides operations for formatting and writing data - into a fixed-size array. For writing into a dynamically growing buffer - use :class:`fmt::BasicMemoryWriter`. - - Any write method will throw ``std::runtime_error`` if the output doesn't fit - into the array. - - You can use one of the following typedefs for common character types: - - +--------------+---------------------------+ - | Type | Definition | - +==============+===========================+ - | ArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - | WArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - \endrst - */ -template -class BasicArrayWriter : public BasicWriter -{ -private: - internal::FixedBuffer buffer_; - -public: - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - given size. - \endrst - */ - BasicArrayWriter(Char *array, std::size_t size) - : BasicWriter(buffer_), buffer_(array, size) {} - - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - size known at compile time. - \endrst - */ - template - explicit BasicArrayWriter(Char (&array)[SIZE]) - : BasicWriter(buffer_), buffer_(array, SIZE) {} -}; - -typedef BasicArrayWriter ArrayWriter; -typedef BasicArrayWriter WArrayWriter; - -// Reports a system error without throwing an exception. -// Can be used to report errors from destructors. -FMT_API void report_system_error(int error_code, - StringRef message) FMT_NOEXCEPT; - -#if FMT_USE_WINDOWS_H - -/** A Windows error. */ -class WindowsError : public SystemError -{ -private: - FMT_API void init(int error_code, CStringRef format_str, ArgList args); - -public: - /** - \rst - Constructs a :class:`fmt::WindowsError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is the - system message corresponding to the error code. - *error_code* is a Windows error code as given by ``GetLastError``. - If *error_code* is not a valid error code such as -1, the system message - will look like "error -1". - - **Example**:: - - // This throws a WindowsError with the description - // cannot open file 'madeup': The system cannot find the file specified. - // or similar (system message may vary). - const char *filename = "madeup"; - LPOFSTRUCT of = LPOFSTRUCT(); - HFILE file = OpenFile(filename, &of, OF_READ); - if (file == HFILE_ERROR) { - throw fmt::WindowsError(GetLastError(), - "cannot open file '{}'", filename); - } - \endrst - */ - WindowsError(int error_code, CStringRef message) - { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) -}; - -// Reports a Windows error without throwing an exception. -// Can be used to report errors from destructors. -FMT_API void report_windows_error(int error_code, - StringRef message) FMT_NOEXCEPT; - -#endif - -enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; - -/** - Formats a string and prints it to stdout using ANSI escape sequences - to specify color (experimental). - Example: - print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); - */ -FMT_API void print_colored(Color c, CStringRef format, ArgList args); - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = format("The answer is {}", 42); - \endrst -*/ -inline std::string format(CStringRef format_str, ArgList args) -{ - MemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -inline std::wstring format(WCStringRef format_str, ArgList args) -{ - WMemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - print(stderr, "Don't {}!", "panic"); - \endrst - */ -FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - print("Elapsed time: {0:.2f} seconds", 1.23); - \endrst - */ -FMT_API void print(CStringRef format_str, ArgList args); - -template -void printf(BasicWriter &w, BasicCStringRef format, ArgList args) -{ - internal::PrintfFormatter(args).format(w, format); -} - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = fmt::sprintf("The answer is %d", 42); - \endrst -*/ -inline std::string sprintf(CStringRef format, ArgList args) -{ - MemoryWriter w; - printf(w, format, args); - return w.str(); -} - -inline std::wstring sprintf(WCStringRef format, ArgList args) -{ - WMemoryWriter w; - printf(w, format, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - fmt::fprintf(stderr, "Don't %s!", "panic"); - \endrst - */ -FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - fmt::printf("Elapsed time: %.2f seconds", 1.23); - \endrst - */ -inline int printf(CStringRef format, ArgList args) -{ - return fprintf(stdout, format, args); -} - -/** - Fast integer formatter. - */ -class FormatInt -{ -private: - // Buffer should be large enough to hold all digits (digits10 + 1), - // a sign and a null character. - enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; - mutable char buffer_[BUFFER_SIZE]; - char *str_; - - // Formats value in reverse and returns the number of digits. - char *format_decimal(ULongLong value) - { - char *buffer_end = buffer_ + BUFFER_SIZE - 1; - while (value >= 100) - { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - } - if (value < 10) - { - *--buffer_end = static_cast('0' + value); - return buffer_end; - } - unsigned index = static_cast(value * 2); - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - return buffer_end; - } - - void FormatSigned(LongLong value) - { - ULongLong abs_value = static_cast(value); - bool negative = value < 0; - if (negative) - abs_value = 0 - abs_value; - str_ = format_decimal(abs_value); - if (negative) - *--str_ = '-'; - } - -public: - explicit FormatInt(int value) - { - FormatSigned(value); - } - explicit FormatInt(long value) - { - FormatSigned(value); - } - explicit FormatInt(LongLong value) - { - FormatSigned(value); - } - explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} - explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} - explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} - - /** Returns the number of characters written to the output buffer. */ - std::size_t size() const - { - return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); - } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const char *data() const - { - return str_; - } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const char *c_str() const - { - buffer_[BUFFER_SIZE - 1] = '\0'; - return str_; - } - - /** - \rst - Returns the content of the output buffer as an ``std::string``. - \endrst - */ - std::string str() const - { - return std::string(str_, size()); - } -}; - -// Formats a decimal integer value writing into buffer and returns -// a pointer to the end of the formatted string. This function doesn't -// write a terminating null character. -template -inline void format_decimal(char *&buffer, T value) -{ - typedef typename internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(value); - if (internal::is_negative(value)) - { - *buffer++ = '-'; - abs_value = 0 - abs_value; - } - if (abs_value < 100) - { - if (abs_value < 10) - { - *buffer++ = static_cast('0' + abs_value); - return; - } - unsigned index = static_cast(abs_value * 2); - *buffer++ = internal::Data::DIGITS[index]; - *buffer++ = internal::Data::DIGITS[index + 1]; - return; - } - unsigned num_digits = internal::count_digits(abs_value); - internal::format_decimal(buffer, abs_value, num_digits); - buffer += num_digits; -} - -/** - \rst - Returns a named argument for formatting functions. - - **Example**:: - - print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); - - \endrst - */ -template -inline internal::NamedArg arg(StringRef name, const T &arg) -{ - return internal::NamedArg(name, arg); -} - -template -inline internal::NamedArg arg(WStringRef name, const T &arg) -{ - return internal::NamedArg(name, arg); -} - -// The following two functions are deleted intentionally to disable -// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. -template -void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -template -void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -} - -#if FMT_GCC_VERSION -// Use the system_header pragma to suppress warnings about variadic macros -// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't -// work. It is used at the end because we want to suppress as little warnings -// as possible. -# pragma GCC system_header -#endif - -// This is used to work around VC++ bugs in handling variadic macros. -#define FMT_EXPAND(args) args - -// Returns the number of arguments. -// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. -#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) -#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) -#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N -#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - -#define FMT_CONCAT(a, b) a##b -#define FMT_FOR_EACH_(N, f, ...) \ - FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) -#define FMT_FOR_EACH(f, ...) \ - FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) - -#define FMT_ADD_ARG_NAME(type, index) type arg##index -#define FMT_GET_ARG_NAME(type, index) arg##index - -#if FMT_USE_VARIADIC_TEMPLATES -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - template \ - ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ - fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } -#else -// Defines a wrapper for a function taking __VA_ARGS__ arguments -// and n additional arguments of arbitrary types. -# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ - template \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - FMT_GEN(n, FMT_MAKE_ARG)) { \ - fmt::internal::ArgArray::Type arr; \ - FMT_GEN(n, FMT_ASSIGN_##Char); \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ - } - -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ - } \ - FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) -#endif // FMT_USE_VARIADIC_TEMPLATES - -/** - \rst - Defines a variadic function with the specified return type, function name - and argument types passed as variable arguments to this macro. - - **Example**:: - - void print_error(const char *file, int line, const char *format, - fmt::ArgList args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args); - } - FMT_VARIADIC(void, print_error, const char *, int, const char *) - - ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that - don't implement variadic templates. You don't have to use this macro if - you don't need legacy compiler support and can use variadic templates - directly:: - - template - void print_error(const char *file, int line, const char *format, - const Args & ... args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args...); - } - \endrst - */ -#define FMT_VARIADIC(ReturnType, func, ...) \ - FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_VARIADIC_W(ReturnType, func, ...) \ - FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) - -#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) - -/** - \rst - Convenient macro to capture the arguments' names and values into several - ``fmt::arg(name, value)``. - - **Example**:: - - int x = 1, y = 2; - print("point: ({x}, {y})", FMT_CAPTURE(x, y)); - // same as: - // print("point: ({x}, {y})", arg("x", x), arg("y", y)); - - \endrst - */ -#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) - -#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) - -namespace fmt -{ -FMT_VARIADIC(std::string, format, CStringRef) -FMT_VARIADIC_W(std::wstring, format, WCStringRef) -FMT_VARIADIC(void, print, CStringRef) -FMT_VARIADIC(void, print, std::FILE *, CStringRef) - -FMT_VARIADIC(void, print_colored, Color, CStringRef) -FMT_VARIADIC(std::string, sprintf, CStringRef) -FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) -FMT_VARIADIC(int, printf, CStringRef) -FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) - -namespace internal -{ -template -inline bool is_name_start(Char c) -{ - return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; -} - -// Parses an unsigned integer advancing s to the end of the parsed input. -// This function assumes that the first character of s is a digit. -template -unsigned parse_nonnegative_int(const Char *&s) -{ - assert('0' <= *s && *s <= '9'); - unsigned value = 0; - do - { - unsigned new_value = value * 10 + (*s++ - '0'); - // Check if value wrapped around. - if (new_value < value) - { - value = (std::numeric_limits::max)(); - break; - } - value = new_value; - } - while ('0' <= *s && *s <= '9'); - // Convert to unsigned to prevent a warning. - unsigned max_int = (std::numeric_limits::max)(); - if (value > max_int) - FMT_THROW(FormatError("number is too big")); - return value; -} - -inline void require_numeric_argument(const Arg &arg, char spec) -{ - if (arg.type > Arg::LAST_NUMERIC_TYPE) - { - std::string message = - fmt::format("format specifier '{}' requires numeric argument", spec); - FMT_THROW(fmt::FormatError(message)); - } -} - -template -void check_sign(const Char *&s, const Arg &arg) -{ - char sign = static_cast(*s); - require_numeric_argument(arg, sign); - if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) - { - FMT_THROW(FormatError(fmt::format( - "format specifier '{}' requires signed argument", sign))); - } - ++s; -} -} // namespace internal - -template -inline internal::Arg BasicFormatter::get_arg( - BasicStringRef arg_name, const char *&error) -{ - if (check_no_auto_index(error)) - { - map_.init(args()); - const internal::Arg *arg = map_.find(arg_name); - if (arg) - return *arg; - error = "argument not found"; - } - return internal::Arg(); -} - -template -inline internal::Arg BasicFormatter::parse_arg_index(const Char *&s) -{ - const char *error = 0; - internal::Arg arg = *s < '0' || *s > '9' ? - next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error); - if (error) - { - FMT_THROW(FormatError( - *s != '}' && *s != ':' ? "invalid format string" : error)); - } - return arg; -} - -template -inline internal::Arg BasicFormatter::parse_arg_name(const Char *&s) -{ - assert(internal::is_name_start(*s)); - const Char *start = s; - Char c; - do - { - c = *++s; - } - while (internal::is_name_start(c) || ('0' <= c && c <= '9')); - const char *error = 0; - internal::Arg arg = get_arg(BasicStringRef(start, s - start), error); - if (error) - FMT_THROW(FormatError(error)); - return arg; -} - -template -const Char *BasicFormatter::format( - const Char *&format_str, const internal::Arg &arg) -{ - using internal::Arg; - const Char *s = format_str; - FormatSpec spec; - if (*s == ':') - { - if (arg.type == Arg::CUSTOM) - { - arg.custom.format(this, arg.custom.value, &s); - return s; - } - ++s; - // Parse fill and alignment. - if (Char c = *s) - { - const Char *p = s + 1; - spec.align_ = ALIGN_DEFAULT; - do - { - switch (*p) - { - case '<': - spec.align_ = ALIGN_LEFT; - break; - case '>': - spec.align_ = ALIGN_RIGHT; - break; - case '=': - spec.align_ = ALIGN_NUMERIC; - break; - case '^': - spec.align_ = ALIGN_CENTER; - break; - } - if (spec.align_ != ALIGN_DEFAULT) - { - if (p != s) - { - if (c == '}') break; - if (c == '{') - FMT_THROW(FormatError("invalid fill character '{'")); - s += 2; - spec.fill_ = c; - } - else ++s; - if (spec.align_ == ALIGN_NUMERIC) - require_numeric_argument(arg, '='); - break; - } - } - while (--p >= s); - } - - // Parse sign. - switch (*s) - { - case '+': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '-': - check_sign(s, arg); - spec.flags_ |= MINUS_FLAG; - break; - case ' ': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG; - break; - } - - if (*s == '#') - { - require_numeric_argument(arg, '#'); - spec.flags_ |= HASH_FLAG; - ++s; - } - - // Parse zero flag. - if (*s == '0') - { - require_numeric_argument(arg, '0'); - spec.align_ = ALIGN_NUMERIC; - spec.fill_ = '0'; - ++s; - } - - // Parse width. - if ('0' <= *s && *s <= '9') - { - spec.width_ = internal::parse_nonnegative_int(s); - } - else if (*s == '{') - { - ++s; - Arg width_arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (width_arg.type) - { - case Arg::INT: - if (width_arg.int_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.int_value; - break; - case Arg::UINT: - value = width_arg.uint_value; - break; - case Arg::LONG_LONG: - if (width_arg.long_long_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = width_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("width is not integer")); - } - if (value > (std::numeric_limits::max)()) - FMT_THROW(FormatError("number is too big")); - spec.width_ = static_cast(value); - } - - // Parse precision. - if (*s == '.') - { - ++s; - spec.precision_ = 0; - if ('0' <= *s && *s <= '9') - { - spec.precision_ = internal::parse_nonnegative_int(s); - } - else if (*s == '{') - { - ++s; - Arg precision_arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (precision_arg.type) - { - case Arg::INT: - if (precision_arg.int_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.int_value; - break; - case Arg::UINT: - value = precision_arg.uint_value; - break; - case Arg::LONG_LONG: - if (precision_arg.long_long_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = precision_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("precision is not integer")); - } - if (value > (std::numeric_limits::max)()) - FMT_THROW(FormatError("number is too big")); - spec.precision_ = static_cast(value); - } - else - { - FMT_THROW(FormatError("missing precision specifier")); - } - if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) - { - FMT_THROW(FormatError( - fmt::format("precision not allowed in {} format specifier", - arg.type == Arg::POINTER ? "pointer" : "integer"))); - } - } - - // Parse type. - if (*s != '}' && *s) - spec.type_ = static_cast(*s++); - } - - if (*s++ != '}') - FMT_THROW(FormatError("missing '}' in format string")); - - // Format argument. - ArgFormatter(*this, spec, s - 1).visit(arg); - return s; -} - -template -void BasicFormatter::format(BasicCStringRef format_str) -{ - const Char *s = format_str.c_str(); - const Char *start = s; - while (*s) - { - Char c = *s++; - if (c != '{' && c != '}') continue; - if (*s == c) - { - write(writer_, start, s); - start = ++s; - continue; - } - if (c == '}') - FMT_THROW(FormatError("unmatched '}' in format string")); - write(writer_, start, s - 1); - internal::Arg arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - start = s = format(s, arg); - } - write(writer_, start, s); -} -} // namespace fmt - -#if FMT_USE_USER_DEFINED_LITERALS -namespace fmt -{ -namespace internal -{ - -template -struct UdlFormat -{ - const Char *str; - - template - auto operator()(Args && ... args) const - -> decltype(format(str, std::forward(args)...)) - { - return format(str, std::forward(args)...); - } -}; - -template -struct UdlArg -{ - const Char *str; - - template - NamedArg operator=(T &&value) const - { - return {str, std::forward(value)}; - } -}; - -} // namespace internal - -inline namespace literals -{ - -/** - \rst - C++11 literal equivalent of :func:`fmt::format`. - - **Example**:: - - using namespace fmt::literals; - std::string message = "The answer is {}"_format(42); - \endrst - */ -inline internal::UdlFormat -operator"" _format(const char *s, std::size_t) -{ - return {s}; -} -inline internal::UdlFormat -operator"" _format(const wchar_t *s, std::size_t) -{ - return {s}; -} - -/** - \rst - C++11 literal equivalent of :func:`fmt::arg`. - - **Example**:: - - using namespace fmt::literals; - print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); - \endrst - */ -inline internal::UdlArg -operator"" _a(const char *s, std::size_t) -{ - return {s}; -} -inline internal::UdlArg -operator"" _a(const wchar_t *s, std::size_t) -{ - return {s}; -} - -} // inline namespace literals -} // namespace fmt -#endif // FMT_USE_USER_DEFINED_LITERALS - -// Restore warnings. -#if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic pop -#endif - -#if defined(__clang__) && !defined(FMT_ICC_VERSION) -# pragma clang diagnostic pop -#endif - -#ifdef FMT_HEADER_ONLY -# define FMT_FUNC inline -# include "format.cc" -#else -# define FMT_FUNC -#endif - -#endif // FMT_FORMAT_H_ diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.cc b/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.cc deleted file mode 100644 index bcb67fe..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.cc +++ /dev/null @@ -1,43 +0,0 @@ -/* - Formatting library for C++ - std::ostream support - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - For the license information refer to format.h. - */ - -#include "ostream.h" - -namespace fmt { - -namespace { -// Write the content of w to os. -void write(std::ostream &os, Writer &w) { - const char *data = w.data(); - typedef internal::MakeUnsigned::Type UnsignedStreamSize; - UnsignedStreamSize size = w.size(); - UnsignedStreamSize max_size = - internal::to_unsigned((std::numeric_limits::max)()); - do { - UnsignedStreamSize n = size <= max_size ? size : max_size; - os.write(data, static_cast(n)); - data += n; - size -= n; - } while (size != 0); -} -} - -FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - write(os, w); -} - -FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - write(os, w); - return static_cast(w.size()); -} -} // namespace fmt diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.h b/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.h deleted file mode 100644 index c52646d..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/ostream.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - Formatting library for C++ - std::ostream support - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - For the license information refer to format.h. - */ - -#ifndef FMT_OSTREAM_H_ -#define FMT_OSTREAM_H_ - -#include "format.h" -#include - -namespace fmt -{ - -namespace internal -{ - -template -class FormatBuf : public std::basic_streambuf -{ -private: - typedef typename std::basic_streambuf::int_type int_type; - typedef typename std::basic_streambuf::traits_type traits_type; - - Buffer &buffer_; - Char *start_; - -public: - FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) - { - this->setp(start_, start_ + buffer_.capacity()); - } - - int_type overflow(int_type ch = traits_type::eof()) - { - if (!traits_type::eq_int_type(ch, traits_type::eof())) - { - size_t buf_size = size(); - buffer_.resize(buf_size); - buffer_.reserve(buf_size * 2); - - start_ = &buffer_[0]; - start_[buf_size] = traits_type::to_char_type(ch); - this->setp(start_+ buf_size + 1, start_ + buf_size * 2); - } - return ch; - } - - size_t size() const - { - return to_unsigned(this->pptr() - start_); - } -}; - -Yes &convert(std::ostream &); - -struct DummyStream : std::ostream -{ - DummyStream(); // Suppress a bogus warning in MSVC. - // Hide all operator<< overloads from std::ostream. - void operator<<(Null<>); -}; - -No &operator<<(std::ostream &, int); - -template -struct ConvertToIntImpl -{ - // Convert to int only if T doesn't have an overloaded operator<<. - enum - { - value = sizeof(convert(get() << get())) == sizeof(No) - }; -}; -} // namespace internal - -// Formats a value. -template -void format(BasicFormatter &f, - const Char *&format_str, const T &value) -{ - internal::MemoryBuffer buffer; - - internal::FormatBuf format_buf(buffer); - std::basic_ostream output(&format_buf); - output << value; - - BasicStringRef str(&buffer[0], format_buf.size()); - typedef internal::MakeArg< BasicFormatter > MakeArg; - format_str = f.format(format_str, MakeArg(str)); -} - -/** - \rst - Prints formatted data to the stream *os*. - - **Example**:: - - print(cerr, "Don't {}!", "panic"); - \endrst - */ -FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); -FMT_VARIADIC(void, print, std::ostream &, CStringRef) - -/** - \rst - Prints formatted data to the stream *os*. - - **Example**:: - - fprintf(cerr, "Don't %s!", "panic"); - \endrst - */ -FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); -FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) -} // namespace fmt - -#ifdef FMT_HEADER_ONLY -# include "ostream.cc" -#endif - -#endif // FMT_OSTREAM_H_ diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.cc b/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.cc deleted file mode 100644 index 76eb7f0..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.cc +++ /dev/null @@ -1,238 +0,0 @@ -/* - A C++ interface to POSIX functions. - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - For the license information refer to format.h. - */ - -// Disable bogus MSVC warnings. -#ifndef _CRT_SECURE_NO_WARNINGS -# define _CRT_SECURE_NO_WARNINGS -#endif - -#include "posix.h" - -#include -#include -#include - -#ifndef _WIN32 -# include -#else -# include -# include - -# define O_CREAT _O_CREAT -# define O_TRUNC _O_TRUNC - -# ifndef S_IRUSR -# define S_IRUSR _S_IREAD -# endif - -# ifndef S_IWUSR -# define S_IWUSR _S_IWRITE -# endif - -# ifdef __MINGW32__ -# define _SH_DENYNO 0x40 -# endif - -#endif // _WIN32 - -#ifdef fileno -# undef fileno -#endif - -namespace { -#ifdef _WIN32 -// Return type of read and write functions. -typedef int RWResult; - -// On Windows the count argument to read and write is unsigned, so convert -// it from size_t preventing integer overflow. -inline unsigned convert_rwcount(std::size_t count) { - return count <= UINT_MAX ? static_cast(count) : UINT_MAX; -} -#else -// Return type of read and write functions. -typedef ssize_t RWResult; - -inline std::size_t convert_rwcount(std::size_t count) { return count; } -#endif -} - -fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT { - if (file_ && FMT_SYSTEM(fclose(file_)) != 0) - fmt::report_system_error(errno, "cannot close file"); -} - -fmt::BufferedFile::BufferedFile( - fmt::CStringRef filename, fmt::CStringRef mode) { - FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0); - if (!file_) - FMT_THROW(SystemError(errno, "cannot open file {}", filename)); -} - -void fmt::BufferedFile::close() { - if (!file_) - return; - int result = FMT_SYSTEM(fclose(file_)); - file_ = 0; - if (result != 0) - FMT_THROW(SystemError(errno, "cannot close file")); -} - -// A macro used to prevent expansion of fileno on broken versions of MinGW. -#define FMT_ARGS - -int fmt::BufferedFile::fileno() const { - int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_)); - if (fd == -1) - FMT_THROW(SystemError(errno, "cannot get file descriptor")); - return fd; -} - -fmt::File::File(fmt::CStringRef path, int oflag) { - int mode = S_IRUSR | S_IWUSR; -#if defined(_WIN32) && !defined(__MINGW32__) - fd_ = -1; - FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode)); -#else - FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode))); -#endif - if (fd_ == -1) - FMT_THROW(SystemError(errno, "cannot open file {}", path)); -} - -fmt::File::~File() FMT_NOEXCEPT { - // Don't retry close in case of EINTR! - // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html - if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0) - fmt::report_system_error(errno, "cannot close file"); -} - -void fmt::File::close() { - if (fd_ == -1) - return; - // Don't retry close in case of EINTR! - // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html - int result = FMT_POSIX_CALL(close(fd_)); - fd_ = -1; - if (result != 0) - FMT_THROW(SystemError(errno, "cannot close file")); -} - -fmt::LongLong fmt::File::size() const { -#ifdef _WIN32 - // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT - // is less than 0x0500 as is the case with some default MinGW builds. - // Both functions support large file sizes. - DWORD size_upper = 0; - HANDLE handle = reinterpret_cast(_get_osfhandle(fd_)); - DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper)); - if (size_lower == INVALID_FILE_SIZE) { - DWORD error = GetLastError(); - if (error != NO_ERROR) - FMT_THROW(WindowsError(GetLastError(), "cannot get file size")); - } - fmt::ULongLong long_size = size_upper; - return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower; -#else - typedef struct stat Stat; - Stat file_stat = Stat(); - if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1) - FMT_THROW(SystemError(errno, "cannot get file attributes")); - FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size), - "return type of File::size is not large enough"); - return file_stat.st_size; -#endif -} - -std::size_t fmt::File::read(void *buffer, std::size_t count) { - RWResult result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); - if (result < 0) - FMT_THROW(SystemError(errno, "cannot read from file")); - return internal::to_unsigned(result); -} - -std::size_t fmt::File::write(const void *buffer, std::size_t count) { - RWResult result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); - if (result < 0) - FMT_THROW(SystemError(errno, "cannot write to file")); - return internal::to_unsigned(result); -} - -fmt::File fmt::File::dup(int fd) { - // Don't retry as dup doesn't return EINTR. - // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html - int new_fd = FMT_POSIX_CALL(dup(fd)); - if (new_fd == -1) - FMT_THROW(SystemError(errno, "cannot duplicate file descriptor {}", fd)); - return File(new_fd); -} - -void fmt::File::dup2(int fd) { - int result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); - if (result == -1) { - FMT_THROW(SystemError(errno, - "cannot duplicate file descriptor {} to {}", fd_, fd)); - } -} - -void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT { - int result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); - if (result == -1) - ec = ErrorCode(errno); -} - -void fmt::File::pipe(File &read_end, File &write_end) { - // Close the descriptors first to make sure that assignments don't throw - // and there are no leaks. - read_end.close(); - write_end.close(); - int fds[2] = {}; -#ifdef _WIN32 - // Make the default pipe capacity same as on Linux 2.6.11+. - enum { DEFAULT_CAPACITY = 65536 }; - int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY)); -#else - // Don't retry as the pipe function doesn't return EINTR. - // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html - int result = FMT_POSIX_CALL(pipe(fds)); -#endif - if (result != 0) - FMT_THROW(SystemError(errno, "cannot create pipe")); - // The following assignments don't throw because read_fd and write_fd - // are closed. - read_end = File(fds[0]); - write_end = File(fds[1]); -} - -fmt::BufferedFile fmt::File::fdopen(const char *mode) { - // Don't retry as fdopen doesn't return EINTR. - FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode)); - if (!f) - FMT_THROW(SystemError(errno, "cannot associate stream with file descriptor")); - BufferedFile file(f); - fd_ = -1; - return file; -} - -long fmt::getpagesize() { -#ifdef _WIN32 - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwPageSize; -#else - long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE)); - if (size < 0) - FMT_THROW(SystemError(errno, "cannot get memory page size")); - return size; -#endif -} diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.h b/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.h deleted file mode 100644 index 859fcaa..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/posix.h +++ /dev/null @@ -1,443 +0,0 @@ -/* - A C++ interface to POSIX functions. - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - For the license information refer to format.h. - */ - -#ifndef FMT_POSIX_H_ -#define FMT_POSIX_H_ - -#if defined(__MINGW32__) || defined(__CYGWIN__) -// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/. -# undef __STRICT_ANSI__ -#endif - -#include -#include // for O_RDONLY -#include // for locale_t -#include -#include // for strtod_l - -#include - -#if defined __APPLE__ || defined(__FreeBSD__) -# include // for LC_NUMERIC_MASK on OS X -#endif - -#include "format.h" - -#ifndef FMT_POSIX -# if defined(_WIN32) && !defined(__MINGW32__) -// Fix warnings about deprecated symbols. -# define FMT_POSIX(call) _##call -# else -# define FMT_POSIX(call) call -# endif -#endif - -// Calls to system functions are wrapped in FMT_SYSTEM for testability. -#ifdef FMT_SYSTEM -# define FMT_POSIX_CALL(call) FMT_SYSTEM(call) -#else -# define FMT_SYSTEM(call) call -# ifdef _WIN32 -// Fix warnings about deprecated symbols. -# define FMT_POSIX_CALL(call) ::_##call -# else -# define FMT_POSIX_CALL(call) ::call -# endif -#endif - -#if FMT_GCC_VERSION >= 407 -# define FMT_UNUSED __attribute__((unused)) -#else -# define FMT_UNUSED -#endif - -#ifndef FMT_USE_STATIC_ASSERT -# define FMT_USE_STATIC_ASSERT 0 -#endif - -#if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \ - (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600 -# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message) -#else -# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b) -# define FMT_STATIC_ASSERT(cond, message) \ - typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED -#endif - -// Retries the expression while it evaluates to error_result and errno -// equals to EINTR. -#ifndef _WIN32 -# define FMT_RETRY_VAL(result, expression, error_result) \ - do { \ - result = (expression); \ - } while (result == error_result && errno == EINTR) -#else -# define FMT_RETRY_VAL(result, expression, error_result) result = (expression) -#endif - -#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1) - -namespace fmt -{ - -// An error code. -class ErrorCode -{ -private: - int value_; - -public: -explicit ErrorCode(int value = 0) FMT_NOEXCEPT : - value_(value) {} - - int get() const FMT_NOEXCEPT - { - return value_; - } -}; - -// A buffered file. -class BufferedFile -{ -private: - FILE *file_; - - friend class File; - - explicit BufferedFile(FILE *f) : file_(f) {} - -public: - // Constructs a BufferedFile object which doesn't represent any file. -BufferedFile() FMT_NOEXCEPT : - file_(0) {} - - // Destroys the object closing the file it represents if any. - ~BufferedFile() FMT_NOEXCEPT; - -#if !FMT_USE_RVALUE_REFERENCES - // Emulate a move constructor and a move assignment operator if rvalue - // references are not supported. - -private: - // A proxy object to emulate a move constructor. - // It is private to make it impossible call operator Proxy directly. - struct Proxy - { - FILE *file; - }; - -public: - // A "move constructor" for moving from a temporary. -BufferedFile(Proxy p) FMT_NOEXCEPT : - file_(p.file) {} - - // A "move constructor" for moving from an lvalue. -BufferedFile(BufferedFile &f) FMT_NOEXCEPT : - file_(f.file_) - { - f.file_ = 0; - } - - // A "move assignment operator" for moving from a temporary. - BufferedFile &operator=(Proxy p) - { - close(); - file_ = p.file; - return *this; - } - - // A "move assignment operator" for moving from an lvalue. - BufferedFile &operator=(BufferedFile &other) - { - close(); - file_ = other.file_; - other.file_ = 0; - return *this; - } - - // Returns a proxy object for moving from a temporary: - // BufferedFile file = BufferedFile(...); - operator Proxy() FMT_NOEXCEPT - { - Proxy p = {file_}; - file_ = 0; - return p; - } - -#else -private: - FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile); - -public: -BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : - file_(other.file_) - { - other.file_ = 0; - } - - BufferedFile& operator=(BufferedFile &&other) - { - close(); - file_ = other.file_; - other.file_ = 0; - return *this; - } -#endif - - // Opens a file. - BufferedFile(CStringRef filename, CStringRef mode); - - // Closes the file. - void close(); - - // Returns the pointer to a FILE object representing this file. - FILE *get() const FMT_NOEXCEPT - { - return file_; - } - - // We place parentheses around fileno to workaround a bug in some versions - // of MinGW that define fileno as a macro. - int (fileno)() const; - - void print(CStringRef format_str, const ArgList &args) - { - fmt::print(file_, format_str, args); - } - FMT_VARIADIC(void, print, CStringRef) -}; - -// A file. Closed file is represented by a File object with descriptor -1. -// Methods that are not declared with FMT_NOEXCEPT may throw -// fmt::SystemError in case of failure. Note that some errors such as -// closing the file multiple times will cause a crash on Windows rather -// than an exception. You can get standard behavior by overriding the -// invalid parameter handler with _set_invalid_parameter_handler. -class File -{ -private: - int fd_; // File descriptor. - - // Constructs a File object with a given descriptor. - explicit File(int fd) : fd_(fd) {} - -public: - // Possible values for the oflag argument to the constructor. - enum - { - RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only. - WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only. - RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing. - }; - - // Constructs a File object which doesn't represent any file. -File() FMT_NOEXCEPT : - fd_(-1) {} - - // Opens a file and constructs a File object representing this file. - File(CStringRef path, int oflag); - -#if !FMT_USE_RVALUE_REFERENCES - // Emulate a move constructor and a move assignment operator if rvalue - // references are not supported. - -private: - // A proxy object to emulate a move constructor. - // It is private to make it impossible call operator Proxy directly. - struct Proxy - { - int fd; - }; - -public: - // A "move constructor" for moving from a temporary. -File(Proxy p) FMT_NOEXCEPT : - fd_(p.fd) {} - - // A "move constructor" for moving from an lvalue. -File(File &other) FMT_NOEXCEPT : - fd_(other.fd_) - { - other.fd_ = -1; - } - - // A "move assignment operator" for moving from a temporary. - File &operator=(Proxy p) - { - close(); - fd_ = p.fd; - return *this; - } - - // A "move assignment operator" for moving from an lvalue. - File &operator=(File &other) - { - close(); - fd_ = other.fd_; - other.fd_ = -1; - return *this; - } - - // Returns a proxy object for moving from a temporary: - // File file = File(...); - operator Proxy() FMT_NOEXCEPT - { - Proxy p = {fd_}; - fd_ = -1; - return p; - } - -#else -private: - FMT_DISALLOW_COPY_AND_ASSIGN(File); - -public: -File(File &&other) FMT_NOEXCEPT : - fd_(other.fd_) - { - other.fd_ = -1; - } - - File& operator=(File &&other) - { - close(); - fd_ = other.fd_; - other.fd_ = -1; - return *this; - } -#endif - - // Destroys the object closing the file it represents if any. - ~File() FMT_NOEXCEPT; - - // Returns the file descriptor. - int descriptor() const FMT_NOEXCEPT - { - return fd_; - } - - // Closes the file. - void close(); - - // Returns the file size. The size has signed type for consistency with - // stat::st_size. - LongLong size() const; - - // Attempts to read count bytes from the file into the specified buffer. - std::size_t read(void *buffer, std::size_t count); - - // Attempts to write count bytes from the specified buffer to the file. - std::size_t write(const void *buffer, std::size_t count); - - // Duplicates a file descriptor with the dup function and returns - // the duplicate as a file object. - static File dup(int fd); - - // Makes fd be the copy of this file descriptor, closing fd first if - // necessary. - void dup2(int fd); - - // Makes fd be the copy of this file descriptor, closing fd first if - // necessary. - void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; - - // Creates a pipe setting up read_end and write_end file objects for reading - // and writing respectively. - static void pipe(File &read_end, File &write_end); - - // Creates a BufferedFile object associated with this file and detaches - // this File object from the file. - BufferedFile fdopen(const char *mode); -}; - -// Returns the memory page size. -long getpagesize(); - -#if (defined(LC_NUMERIC_MASK) || defined(_MSC_VER)) && \ - !defined(__ANDROID__) && !defined(__CYGWIN__) -# define FMT_LOCALE -#endif - -#ifdef FMT_LOCALE -// A "C" numeric locale. -class Locale -{ -private: -# ifdef _MSC_VER - typedef _locale_t locale_t; - - enum { LC_NUMERIC_MASK = LC_NUMERIC }; - - static locale_t newlocale(int category_mask, const char *locale, locale_t) - { - return _create_locale(category_mask, locale); - } - - static void freelocale(locale_t locale) - { - _free_locale(locale); - } - - static double strtod_l(const char *nptr, char **endptr, _locale_t locale) - { - return _strtod_l(nptr, endptr, locale); - } -# endif - - locale_t locale_; - - FMT_DISALLOW_COPY_AND_ASSIGN(Locale); - -public: - typedef locale_t Type; - - Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) - { - if (!locale_) - FMT_THROW(fmt::SystemError(errno, "cannot create locale")); - } - ~Locale() - { - freelocale(locale_); - } - - Type get() const - { - return locale_; - } - - // Converts string to floating-point number and advances str past the end - // of the parsed input. - double strtod(const char *&str) const - { - char *end = 0; - double result = strtod_l(str, &end, locale_); - str = end; - return result; - } -}; -#endif // FMT_LOCALE -} // namespace fmt - -#if !FMT_USE_RVALUE_REFERENCES -namespace std -{ -// For compatibility with C++98. -inline fmt::BufferedFile &move(fmt::BufferedFile &f) -{ - return f; -} -inline fmt::File &move(fmt::File &f) -{ - return f; -} -} -#endif - -#endif // FMT_POSIX_H_ diff --git a/geom_matching/wasserstein/include/spdlog/fmt/bundled/time.h b/geom_matching/wasserstein/include/spdlog/fmt/bundled/time.h deleted file mode 100644 index 10c6cfc..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/bundled/time.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - Formatting library for C++ - time formatting - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - For the license information refer to format.h. - */ - -#ifndef FMT_TIME_H_ -#define FMT_TIME_H_ - -#include "format.h" -#include - -namespace fmt -{ -template -void format(BasicFormatter &f, - const char *&format_str, const std::tm &tm) -{ - if (*format_str == ':') - ++format_str; - const char *end = format_str; - while (*end && *end != '}') - ++end; - if (*end != '}') - FMT_THROW(FormatError("missing '}' in format string")); - internal::MemoryBuffer format; - format.append(format_str, end + 1); - format[format.size() - 1] = '\0'; - Buffer &buffer = f.writer().buffer(); - std::size_t start = buffer.size(); - for (;;) - { - std::size_t size = buffer.capacity() - start; - std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm); - if (count != 0) - { - buffer.resize(start + count); - break; - } - if (size >= format.size() * 256) - { - // If the buffer is 256 times larger than the format string, assume - // that `strftime` gives an empty result. There doesn't seem to be a - // better way to distinguish the two cases: - // https://github.com/fmtlib/fmt/issues/367 - break; - } - const std::size_t MIN_GROWTH = 10; - buffer.reserve(buffer.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH)); - } - format_str = end + 1; -} -} - -#endif // FMT_TIME_H_ diff --git a/geom_matching/wasserstein/include/spdlog/fmt/fmt.h b/geom_matching/wasserstein/include/spdlog/fmt/fmt.h deleted file mode 100644 index a4ee467..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/fmt.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright(c) 2016 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// -// Include a bundled header-only copy of fmtlib or an external one. -// By default spdlog include its own copy. -// - -#if !defined(SPDLOG_FMT_EXTERNAL) - -#ifndef FMT_HEADER_ONLY -#define FMT_HEADER_ONLY -#endif -#ifndef FMT_USE_WINDOWS_H -#define FMT_USE_WINDOWS_H 0 -#endif -#include "spdlog/fmt/bundled/format.h" - -#else //external fmtlib - -#include - -#endif - diff --git a/geom_matching/wasserstein/include/spdlog/fmt/ostr.h b/geom_matching/wasserstein/include/spdlog/fmt/ostr.h deleted file mode 100644 index 49b5e98..0000000 --- a/geom_matching/wasserstein/include/spdlog/fmt/ostr.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright(c) 2016 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// include external or bundled copy of fmtlib's ostream support -// -#if !defined(SPDLOG_FMT_EXTERNAL) -#include "spdlog/fmt/fmt.h" -#include "spdlog/fmt/bundled/ostream.h" -#else -#include -#endif - - diff --git a/geom_matching/wasserstein/include/spdlog/formatter.h b/geom_matching/wasserstein/include/spdlog/formatter.h deleted file mode 100644 index 6bba902..0000000 --- a/geom_matching/wasserstein/include/spdlog/formatter.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/details/log_msg.h" - -#include -#include -#include - -namespace spdlog -{ -namespace details -{ -class flag_formatter; -} - -class formatter -{ -public: - virtual ~formatter() {} - virtual void format(details::log_msg& msg) = 0; -}; - -class pattern_formatter SPDLOG_FINAL : public formatter -{ - -public: - explicit pattern_formatter(const std::string& pattern, pattern_time_type pattern_time = pattern_time_type::local); - pattern_formatter(const pattern_formatter&) = delete; - pattern_formatter& operator=(const pattern_formatter&) = delete; - void format(details::log_msg& msg) override; -private: - const std::string _pattern; - const pattern_time_type _pattern_time; - std::vector> _formatters; - std::tm get_time(details::log_msg& msg); - void handle_flag(char flag); - void compile_pattern(const std::string& pattern); -}; -} - -#include "spdlog/details/pattern_formatter_impl.h" - diff --git a/geom_matching/wasserstein/include/spdlog/logger.h b/geom_matching/wasserstein/include/spdlog/logger.h deleted file mode 100644 index 642208e..0000000 --- a/geom_matching/wasserstein/include/spdlog/logger.h +++ /dev/null @@ -1,132 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -// Thread safe logger (except for set_pattern(..), set_formatter(..) and set_error_handler()) -// Has name, log level, vector of std::shared sink pointers and formatter -// Upon each log write the logger: -// 1. Checks if its log level is enough to log the message -// 2. Format the message using the formatter function -// 3. Pass the formatted message to its sinks to performa the actual logging - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/common.h" - -#include -#include -#include - -namespace spdlog -{ - -class logger -{ -public: - logger(const std::string& logger_name, sink_ptr single_sink); - logger(const std::string& name, sinks_init_list); - template - logger(const std::string& name, const It& begin, const It& end); - - virtual ~logger(); - logger(const logger&) = delete; - logger& operator=(const logger&) = delete; - - - template void log(level::level_enum lvl, const char* fmt, const Args&... args); - template void log(level::level_enum lvl, const char* msg); - template void trace(const char* fmt, const Arg1&, const Args&... args); - template void debug(const char* fmt, const Arg1&, const Args&... args); - template void info(const char* fmt, const Arg1&, const Args&... args); - template void warn(const char* fmt, const Arg1&, const Args&... args); - template void error(const char* fmt, const Arg1&, const Args&... args); - template void critical(const char* fmt, const Arg1&, const Args&... args); - - template void log_if(const bool flag, level::level_enum lvl, const char* fmt, const Args&... args); - template void log_if(const bool flag, level::level_enum lvl, const char* msg); - template void trace_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - template void debug_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - template void info_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - template void warn_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - template void error_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - template void critical_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); - -#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT - template void log(level::level_enum lvl, const wchar_t* msg); - template void log(level::level_enum lvl, const wchar_t* fmt, const Args&... args); - template void trace(const wchar_t* fmt, const Args&... args); - template void debug(const wchar_t* fmt, const Args&... args); - template void info(const wchar_t* fmt, const Args&... args); - template void warn(const wchar_t* fmt, const Args&... args); - template void error(const wchar_t* fmt, const Args&... args); - template void critical(const wchar_t* fmt, const Args&... args); - - template void log_if(const bool flag, level::level_enum lvl, const wchar_t* msg); - template void log_if(const bool flag, level::level_enum lvl, const wchar_t* fmt, const Args&... args); - template void trace_if(const bool flag, const wchar_t* fmt, const Args&... args); - template void debug_if(const bool flag, const wchar_t* fmt, const Args&... args); - template void info_if(const bool flag, const wchar_t* fmt, const Args&... args); - template void warn_if(const bool flag, const wchar_t* fmt, const Args&... args); - template void error_if(const bool flag, const wchar_t* fmt, const Args&... args); - template void critical_if(const bool flag, const wchar_t* fmt, const Args&... args); -#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT - - template void log(level::level_enum lvl, const T&); - template void trace(const T&); - template void debug(const T&); - template void info(const T&); - template void warn(const T&); - template void error(const T&); - template void critical(const T&); - - template void log_if(const bool flag, level::level_enum lvl, const T&); - template void trace_if(const bool flag, const T&); - template void debug_if(const bool flag, const T&); - template void info_if(const bool flag, const T&); - template void warn_if(const bool flag, const T&); - template void error_if(const bool flag, const T&); - template void critical_if(const bool flag, const T&); - - bool should_log(level::level_enum) const; - void set_level(level::level_enum); - level::level_enum level() const; - const std::string& name() const; - void set_pattern(const std::string&, pattern_time_type = pattern_time_type::local); - void set_formatter(formatter_ptr); - - // automatically call flush() if message level >= log_level - void flush_on(level::level_enum log_level); - - virtual void flush(); - - const std::vector& sinks() const; - - // error handler - virtual void set_error_handler(log_err_handler); - virtual log_err_handler error_handler(); - -protected: - virtual void _sink_it(details::log_msg&); - virtual void _set_pattern(const std::string&, pattern_time_type); - virtual void _set_formatter(formatter_ptr); - - // default error handler: print the error to stderr with the max rate of 1 message/minute - virtual void _default_err_handler(const std::string &msg); - - // return true if the given message level should trigger a flush - bool _should_flush_on(const details::log_msg&); - - const std::string _name; - std::vector _sinks; - formatter_ptr _formatter; - spdlog::level_t _level; - spdlog::level_t _flush_level; - log_err_handler _err_handler; - std::atomic _last_err_time; - std::atomic _msg_counter; -}; -} - -#include "spdlog/details/logger_impl.h" diff --git a/geom_matching/wasserstein/include/spdlog/sinks/android_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/android_sink.h deleted file mode 100644 index 239f2d2..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/android_sink.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#if defined(__ANDROID__) - -#include "spdlog/sinks/sink.h" - -#include -#include -#include -#include -#include - -#if !defined(SPDLOG_ANDROID_RETRIES) -#define SPDLOG_ANDROID_RETRIES 2 -#endif - -namespace spdlog -{ -namespace sinks -{ - -/* -* Android sink (logging using __android_log_write) -* __android_log_write is thread-safe. No lock is needed. -*/ -class android_sink : public sink -{ -public: - explicit android_sink(const std::string& tag = "spdlog", bool use_raw_msg = false): _tag(tag), _use_raw_msg(use_raw_msg) {} - - void log(const details::log_msg& msg) override - { - const android_LogPriority priority = convert_to_android(msg.level); - const char *msg_output = (_use_raw_msg ? msg.raw.c_str() : msg.formatted.c_str()); - - // See system/core/liblog/logger_write.c for explanation of return value - int ret = __android_log_write(priority, _tag.c_str(), msg_output); - int retry_count = 0; - while ((ret == -11/*EAGAIN*/) && (retry_count < SPDLOG_ANDROID_RETRIES)) - { - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - ret = __android_log_write(priority, _tag.c_str(), msg_output); - retry_count++; - } - - if (ret < 0) - { - throw spdlog_ex("__android_log_write() failed", ret); - } - } - - void flush() override - { - } - -private: - static android_LogPriority convert_to_android(spdlog::level::level_enum level) - { - switch(level) - { - case spdlog::level::trace: - return ANDROID_LOG_VERBOSE; - case spdlog::level::debug: - return ANDROID_LOG_DEBUG; - case spdlog::level::info: - return ANDROID_LOG_INFO; - case spdlog::level::warn: - return ANDROID_LOG_WARN; - case spdlog::level::err: - return ANDROID_LOG_ERROR; - case spdlog::level::critical: - return ANDROID_LOG_FATAL; - default: - return ANDROID_LOG_DEFAULT; - } - } - - std::string _tag; - bool _use_raw_msg; -}; - -} -} - -#endif diff --git a/geom_matching/wasserstein/include/spdlog/sinks/ansicolor_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/ansicolor_sink.h deleted file mode 100644 index 56fd3fd..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/ansicolor_sink.h +++ /dev/null @@ -1,133 +0,0 @@ -// -// Copyright(c) 2017 spdlog authors. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/common.h" -#include "spdlog/details/os.h" - -#include -#include - -namespace spdlog -{ -namespace sinks -{ - -/** - * This sink prefixes the output with an ANSI escape sequence color code depending on the severity - * of the message. - * If no color terminal detected, omit the escape codes. - */ -template -class ansicolor_sink: public base_sink -{ -public: - ansicolor_sink(FILE* file): target_file_(file) - { - should_do_colors_ = details::os::in_terminal(file) && details::os::is_color_terminal(); - colors_[level::trace] = cyan; - colors_[level::debug] = cyan; - colors_[level::info] = reset; - colors_[level::warn] = yellow + bold; - colors_[level::err] = red + bold; - colors_[level::critical] = bold + on_red; - colors_[level::off] = reset; - } - virtual ~ansicolor_sink() - { - _flush(); - } - - void set_color(level::level_enum color_level, const std::string& color) - { - std::lock_guard lock(base_sink::_mutex); - colors_[color_level] = color; - } - - /// Formatting codes - const std::string reset = "\033[00m"; - const std::string bold = "\033[1m"; - const std::string dark = "\033[2m"; - const std::string underline = "\033[4m"; - const std::string blink = "\033[5m"; - const std::string reverse = "\033[7m"; - const std::string concealed = "\033[8m"; - - // Foreground colors - const std::string grey = "\033[30m"; - const std::string red = "\033[31m"; - const std::string green = "\033[32m"; - const std::string yellow = "\033[33m"; - const std::string blue = "\033[34m"; - const std::string magenta = "\033[35m"; - const std::string cyan = "\033[36m"; - const std::string white = "\033[37m"; - - /// Background colors - const std::string on_grey = "\033[40m"; - const std::string on_red = "\033[41m"; - const std::string on_green = "\033[42m"; - const std::string on_yellow = "\033[43m"; - const std::string on_blue = "\033[44m"; - const std::string on_magenta = "\033[45m"; - const std::string on_cyan = "\033[46m"; - const std::string on_white = "\033[47m"; - -protected: - virtual void _sink_it(const details::log_msg& msg) override - { - // Wrap the originally formatted message in color codes. - // If color is not supported in the terminal, log as is instead. - if (should_do_colors_) - { - const std::string& prefix = colors_[msg.level]; - fwrite(prefix.data(), sizeof(char), prefix.size(), target_file_); - fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), target_file_); - fwrite(reset.data(), sizeof(char), reset.size(), target_file_); - } - else - { - fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), target_file_); - } - _flush(); - } - - void _flush() override - { - fflush(target_file_); - } - FILE* target_file_; - bool should_do_colors_; - std::map colors_; -}; - - -template -class ansicolor_stdout_sink: public ansicolor_sink -{ -public: - ansicolor_stdout_sink(): ansicolor_sink(stdout) - {} -}; - -template -class ansicolor_stderr_sink: public ansicolor_sink -{ -public: - ansicolor_stderr_sink(): ansicolor_sink(stderr) - {} -}; - -typedef ansicolor_stdout_sink ansicolor_stdout_sink_mt; -typedef ansicolor_stdout_sink ansicolor_stdout_sink_st; - -typedef ansicolor_stderr_sink ansicolor_stderr_sink_mt; -typedef ansicolor_stderr_sink ansicolor_stderr_sink_st; - -} // namespace sinks -} // namespace spdlog - diff --git a/geom_matching/wasserstein/include/spdlog/sinks/base_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/base_sink.h deleted file mode 100644 index 926f493..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/base_sink.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once -// -// base sink templated over a mutex (either dummy or real) -// concrete implementation should only override the _sink_it method. -// all locking is taken care of here so no locking needed by the implementers.. -// - -#include "spdlog/sinks/sink.h" -#include "spdlog/formatter.h" -#include "spdlog/common.h" -#include "spdlog/details/log_msg.h" - -#include - -namespace spdlog -{ -namespace sinks -{ -template -class base_sink:public sink -{ -public: - base_sink():_mutex() {} - virtual ~base_sink() = default; - - base_sink(const base_sink&) = delete; - base_sink& operator=(const base_sink&) = delete; - - void log(const details::log_msg& msg) SPDLOG_FINAL override - { - std::lock_guard lock(_mutex); - _sink_it(msg); - } - void flush() SPDLOG_FINAL override - { - _flush(); - } - -protected: - virtual void _sink_it(const details::log_msg& msg) = 0; - virtual void _flush() = 0; - Mutex _mutex; -}; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/sinks/dist_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/dist_sink.h deleted file mode 100644 index 4d4b6b6..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/dist_sink.h +++ /dev/null @@ -1,73 +0,0 @@ -// -// Copyright (c) 2015 David Schury, Gabi Melman -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/details/log_msg.h" -#include "spdlog/details/null_mutex.h" -#include "spdlog/sinks/base_sink.h" -#include "spdlog/sinks/sink.h" - -#include -#include -#include -#include - -// Distribution sink (mux). Stores a vector of sinks which get called when log is called - -namespace spdlog -{ -namespace sinks -{ -template -class dist_sink: public base_sink -{ -public: - explicit dist_sink() :_sinks() {} - dist_sink(const dist_sink&) = delete; - dist_sink& operator=(const dist_sink&) = delete; - virtual ~dist_sink() = default; - -protected: - std::vector> _sinks; - - void _sink_it(const details::log_msg& msg) override - { - for (auto &sink : _sinks) - { - if( sink->should_log( msg.level)) - { - sink->log(msg); - } - } - } - - void _flush() override - { - std::lock_guard lock(base_sink::_mutex); - for (auto &sink : _sinks) - sink->flush(); - } - -public: - - - void add_sink(std::shared_ptr sink) - { - std::lock_guard lock(base_sink::_mutex); - _sinks.push_back(sink); - } - - void remove_sink(std::shared_ptr sink) - { - std::lock_guard lock(base_sink::_mutex); - _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end()); - } -}; - -typedef dist_sink dist_sink_mt; -typedef dist_sink dist_sink_st; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/sinks/file_sinks.h b/geom_matching/wasserstein/include/spdlog/sinks/file_sinks.h deleted file mode 100644 index 421acc8..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/file_sinks.h +++ /dev/null @@ -1,242 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/details/null_mutex.h" -#include "spdlog/details/file_helper.h" -#include "spdlog/fmt/fmt.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace spdlog -{ -namespace sinks -{ -/* - * Trivial file sink with single file as target - */ -template -class simple_file_sink SPDLOG_FINAL : public base_sink < Mutex > -{ -public: - explicit simple_file_sink(const filename_t &filename, bool truncate = false):_force_flush(false) - { - _file_helper.open(filename, truncate); - } - - void set_force_flush(bool force_flush) - { - _force_flush = force_flush; - } - -protected: - void _sink_it(const details::log_msg& msg) override - { - _file_helper.write(msg); - if(_force_flush) - _file_helper.flush(); - } - void _flush() override - { - _file_helper.flush(); - } -private: - details::file_helper _file_helper; - bool _force_flush; -}; - -typedef simple_file_sink simple_file_sink_mt; -typedef simple_file_sink simple_file_sink_st; - -/* - * Rotating file sink based on size - */ -template -class rotating_file_sink SPDLOG_FINAL : public base_sink < Mutex > -{ -public: - rotating_file_sink(const filename_t &base_filename, - std::size_t max_size, std::size_t max_files) : - _base_filename(base_filename), - _max_size(max_size), - _max_files(max_files), - _current_size(0), - _file_helper() - { - _file_helper.open(calc_filename(_base_filename, 0)); - _current_size = _file_helper.size(); //expensive. called only once - } - - -protected: - void _sink_it(const details::log_msg& msg) override - { - _current_size += msg.formatted.size(); - if (_current_size > _max_size) - { - _rotate(); - _current_size = msg.formatted.size(); - } - _file_helper.write(msg); - } - - void _flush() override - { - _file_helper.flush(); - } - -private: - static filename_t calc_filename(const filename_t& filename, std::size_t index) - { - std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; - if (index) - w.write(SPDLOG_FILENAME_T("{}.{}"), filename, index); - else - w.write(SPDLOG_FILENAME_T("{}"), filename); - return w.str(); - } - - // Rotate files: - // log.txt -> log.txt.1 - // log.txt.1 -> log.txt.2 - // log.txt.2 -> log.txt.3 - // lo3.txt.3 -> delete - - void _rotate() - { - using details::os::filename_to_str; - _file_helper.close(); - for (auto i = _max_files; i > 0; --i) - { - filename_t src = calc_filename(_base_filename, i - 1); - filename_t target = calc_filename(_base_filename, i); - - if (details::file_helper::file_exists(target)) - { - if (details::os::remove(target) != 0) - { - throw spdlog_ex("rotating_file_sink: failed removing " + filename_to_str(target), errno); - } - } - if (details::file_helper::file_exists(src) && details::os::rename(src, target)) - { - throw spdlog_ex("rotating_file_sink: failed renaming " + filename_to_str(src) + " to " + filename_to_str(target), errno); - } - } - _file_helper.reopen(true); - } - filename_t _base_filename; - std::size_t _max_size; - std::size_t _max_files; - std::size_t _current_size; - details::file_helper _file_helper; -}; - -typedef rotating_file_sink rotating_file_sink_mt; -typedef rotating_file_sinkrotating_file_sink_st; - -/* - * Default generator of daily log file names. - */ -struct default_daily_file_name_calculator -{ - // Create filename for the form basename.YYYY-MM-DD_hh-mm - static filename_t calc_filename(const filename_t& basename) - { - std::tm tm = spdlog::details::os::localtime(); - std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; - w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min); - return w.str(); - } -}; - -/* - * Generator of daily log file names in format basename.YYYY-MM-DD - */ -struct dateonly_daily_file_name_calculator -{ - // Create filename for the form basename.YYYY-MM-DD - static filename_t calc_filename(const filename_t& basename) - { - std::tm tm = spdlog::details::os::localtime(); - std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; - w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); - return w.str(); - } -}; - -/* - * Rotating file sink based on date. rotates at midnight - */ -template -class daily_file_sink SPDLOG_FINAL :public base_sink < Mutex > -{ -public: - //create daily file sink which rotates on given time - daily_file_sink( - const filename_t& base_filename, - int rotation_hour, - int rotation_minute) : _base_filename(base_filename), - _rotation_h(rotation_hour), - _rotation_m(rotation_minute) - { - if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59) - throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); - _rotation_tp = _next_rotation_tp(); - _file_helper.open(FileNameCalc::calc_filename(_base_filename)); - } - - -protected: - void _sink_it(const details::log_msg& msg) override - { - if (std::chrono::system_clock::now() >= _rotation_tp) - { - _file_helper.open(FileNameCalc::calc_filename(_base_filename)); - _rotation_tp = _next_rotation_tp(); - } - _file_helper.write(msg); - } - - void _flush() override - { - _file_helper.flush(); - } - -private: - std::chrono::system_clock::time_point _next_rotation_tp() - { - auto now = std::chrono::system_clock::now(); - time_t tnow = std::chrono::system_clock::to_time_t(now); - tm date = spdlog::details::os::localtime(tnow); - date.tm_hour = _rotation_h; - date.tm_min = _rotation_m; - date.tm_sec = 0; - auto rotation_time = std::chrono::system_clock::from_time_t(std::mktime(&date)); - if (rotation_time > now) - return rotation_time; - else - return std::chrono::system_clock::time_point(rotation_time + std::chrono::hours(24)); - } - - filename_t _base_filename; - int _rotation_h; - int _rotation_m; - std::chrono::system_clock::time_point _rotation_tp; - details::file_helper _file_helper; -}; - -typedef daily_file_sink daily_file_sink_mt; -typedef daily_file_sink daily_file_sink_st; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/sinks/msvc_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/msvc_sink.h deleted file mode 100644 index 68b0255..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/msvc_sink.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright(c) 2016 Alexander Dalshov. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#if defined(_MSC_VER) - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/details/null_mutex.h" - -#include - -#include -#include - -namespace spdlog -{ -namespace sinks -{ -/* -* MSVC sink (logging using OutputDebugStringA) -*/ -template -class msvc_sink : public base_sink < Mutex > -{ -public: - explicit msvc_sink() - { - } - - - -protected: - void _sink_it(const details::log_msg& msg) override - { - OutputDebugStringA(msg.formatted.c_str()); - } - - void _flush() override - {} -}; - -typedef msvc_sink msvc_sink_mt; -typedef msvc_sink msvc_sink_st; - -} -} - -#endif diff --git a/geom_matching/wasserstein/include/spdlog/sinks/null_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/null_sink.h deleted file mode 100644 index ed4b5e4..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/null_sink.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/details/null_mutex.h" - -#include - -namespace spdlog -{ -namespace sinks -{ - -template -class null_sink : public base_sink < Mutex > -{ -protected: - void _sink_it(const details::log_msg&) override - {} - - void _flush() override - {} - -}; -typedef null_sink null_sink_st; -typedef null_sink null_sink_mt; - -} -} - diff --git a/geom_matching/wasserstein/include/spdlog/sinks/ostream_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/ostream_sink.h deleted file mode 100644 index f056107..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/ostream_sink.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/details/null_mutex.h" -#include "spdlog/sinks/base_sink.h" - -#include -#include - -namespace spdlog -{ -namespace sinks -{ -template -class ostream_sink: public base_sink -{ -public: - explicit ostream_sink(std::ostream& os, bool force_flush=false) :_ostream(os), _force_flush(force_flush) {} - ostream_sink(const ostream_sink&) = delete; - ostream_sink& operator=(const ostream_sink&) = delete; - virtual ~ostream_sink() = default; - -protected: - void _sink_it(const details::log_msg& msg) override - { - _ostream.write(msg.formatted.data(), msg.formatted.size()); - if (_force_flush) - _ostream.flush(); - } - - void _flush() override - { - _ostream.flush(); - } - - std::ostream& _ostream; - bool _force_flush; -}; - -typedef ostream_sink ostream_sink_mt; -typedef ostream_sink ostream_sink_st; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/sinks/sink.h b/geom_matching/wasserstein/include/spdlog/sinks/sink.h deleted file mode 100644 index 0974f33..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/sink.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - - -#pragma once - -#include "spdlog/details/log_msg.h" - -namespace spdlog -{ -namespace sinks -{ -class sink -{ -public: - sink() - { - _level = level::trace; - } - - virtual ~sink() {} - virtual void log(const details::log_msg& msg) = 0; - virtual void flush() = 0; - - bool should_log(level::level_enum msg_level) const; - void set_level(level::level_enum log_level); - level::level_enum level() const; - -private: - level_t _level; - -}; - -inline bool sink::should_log(level::level_enum msg_level) const -{ - return msg_level >= _level.load(std::memory_order_relaxed); -} - -inline void sink::set_level(level::level_enum log_level) -{ - _level.store(log_level); -} - -inline level::level_enum sink::level() const -{ - return static_cast(_level.load(std::memory_order_relaxed)); -} - -} -} - diff --git a/geom_matching/wasserstein/include/spdlog/sinks/stdout_sinks.h b/geom_matching/wasserstein/include/spdlog/sinks/stdout_sinks.h deleted file mode 100644 index dcdcc7c..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/stdout_sinks.h +++ /dev/null @@ -1,77 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/details/null_mutex.h" -#include "spdlog/sinks/base_sink.h" - -#include -#include -#include - -namespace spdlog -{ -namespace sinks -{ - -template -class stdout_sink SPDLOG_FINAL : public base_sink -{ - using MyType = stdout_sink; -public: - stdout_sink() - {} - static std::shared_ptr instance() - { - static std::shared_ptr instance = std::make_shared(); - return instance; - } -protected: - void _sink_it(const details::log_msg& msg) override - { - fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), stdout); - _flush(); - } - - void _flush() override - { - fflush(stdout); - } -}; - -typedef stdout_sink stdout_sink_st; -typedef stdout_sink stdout_sink_mt; - - -template -class stderr_sink SPDLOG_FINAL : public base_sink -{ - using MyType = stderr_sink; -public: - stderr_sink() - {} - static std::shared_ptr instance() - { - static std::shared_ptr instance = std::make_shared(); - return instance; - } -protected: - void _sink_it(const details::log_msg& msg) override - { - fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), stderr); - _flush(); - } - - void _flush() override - { - fflush(stderr); - } -}; - -typedef stderr_sink stderr_sink_mt; -typedef stderr_sink stderr_sink_st; -} -} diff --git a/geom_matching/wasserstein/include/spdlog/sinks/syslog_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/syslog_sink.h deleted file mode 100644 index 0b509c4..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/syslog_sink.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/common.h" - -#ifdef SPDLOG_ENABLE_SYSLOG - -#include "spdlog/sinks/sink.h" -#include "spdlog/details/log_msg.h" - -#include -#include -#include - - -namespace spdlog -{ -namespace sinks -{ -/** - * Sink that write to syslog using the `syscall()` library call. - * - * Locking is not needed, as `syslog()` itself is thread-safe. - */ -class syslog_sink : public sink -{ -public: - // - syslog_sink(const std::string& ident = "", int syslog_option=0, int syslog_facility=LOG_USER): - _ident(ident) - { - _priorities[static_cast(level::trace)] = LOG_DEBUG; - _priorities[static_cast(level::debug)] = LOG_DEBUG; - _priorities[static_cast(level::info)] = LOG_INFO; - _priorities[static_cast(level::warn)] = LOG_WARNING; - _priorities[static_cast(level::err)] = LOG_ERR; - _priorities[static_cast(level::critical)] = LOG_CRIT; - _priorities[static_cast(level::off)] = LOG_INFO; - - //set ident to be program name if empty - ::openlog(_ident.empty()? nullptr:_ident.c_str(), syslog_option, syslog_facility); - } - ~syslog_sink() - { - ::closelog(); - } - - syslog_sink(const syslog_sink&) = delete; - syslog_sink& operator=(const syslog_sink&) = delete; - - void log(const details::log_msg &msg) override - { - ::syslog(syslog_prio_from_level(msg), "%s", msg.raw.str().c_str()); - } - - void flush() override - { - } - - -private: - std::array _priorities; - //must store the ident because the man says openlog might use the pointer as is and not a string copy - const std::string _ident; - - // - // Simply maps spdlog's log level to syslog priority level. - // - int syslog_prio_from_level(const details::log_msg &msg) const - { - return _priorities[static_cast(msg.level)]; - } -}; -} -} - -#endif diff --git a/geom_matching/wasserstein/include/spdlog/sinks/wincolor_sink.h b/geom_matching/wasserstein/include/spdlog/sinks/wincolor_sink.h deleted file mode 100644 index 6611124..0000000 --- a/geom_matching/wasserstein/include/spdlog/sinks/wincolor_sink.h +++ /dev/null @@ -1,117 +0,0 @@ -// -// Copyright(c) 2016 spdlog -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include "spdlog/sinks/base_sink.h" -#include "spdlog/details/null_mutex.h" -#include "spdlog/common.h" - -#include -#include -#include -#include - -namespace spdlog -{ -namespace sinks -{ -/* - * Windows color console sink. Uses WriteConsoleA to write to the console with colors - */ -template -class wincolor_sink: public base_sink -{ -public: - const WORD BOLD = FOREGROUND_INTENSITY; - const WORD RED = FOREGROUND_RED; - const WORD CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE; - const WORD WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; - const WORD YELLOW = FOREGROUND_RED | FOREGROUND_GREEN; - - wincolor_sink(HANDLE std_handle): out_handle_(std_handle) - { - colors_[level::trace] = CYAN; - colors_[level::debug] = CYAN; - colors_[level::info] = WHITE | BOLD; - colors_[level::warn] = YELLOW | BOLD; - colors_[level::err] = RED | BOLD; // red bold - colors_[level::critical] = BACKGROUND_RED | WHITE | BOLD; // white bold on red background - colors_[level::off] = 0; - } - - virtual ~wincolor_sink() - { - this->flush(); - } - - wincolor_sink(const wincolor_sink& other) = delete; - wincolor_sink& operator=(const wincolor_sink& other) = delete; - -protected: - virtual void _sink_it(const details::log_msg& msg) override - { - auto color = colors_[msg.level]; - auto orig_attribs = set_console_attribs(color); - WriteConsoleA(out_handle_, msg.formatted.data(), static_cast(msg.formatted.size()), nullptr, nullptr); - SetConsoleTextAttribute(out_handle_, orig_attribs); //reset to orig colors - } - - virtual void _flush() override - { - // windows console always flushed? - } - - // change the color for the given level - void set_color(level::level_enum level, WORD color) - { - std::lock_guard lock(base_sink::_mutex); - colors_[level] = color; - } - -private: - HANDLE out_handle_; - std::map colors_; - - // set color and return the orig console attributes (for resetting later) - WORD set_console_attribs(WORD attribs) - { - CONSOLE_SCREEN_BUFFER_INFO orig_buffer_info; - GetConsoleScreenBufferInfo(out_handle_, &orig_buffer_info); - SetConsoleTextAttribute(out_handle_, attribs); - return orig_buffer_info.wAttributes; //return orig attribs - } -}; - -// -// windows color console to stdout -// -template -class wincolor_stdout_sink: public wincolor_sink -{ -public: - wincolor_stdout_sink() : wincolor_sink(GetStdHandle(STD_OUTPUT_HANDLE)) - {} -}; - -typedef wincolor_stdout_sink wincolor_stdout_sink_mt; -typedef wincolor_stdout_sink wincolor_stdout_sink_st; - -// -// windows color console to stderr -// -template -class wincolor_stderr_sink: public wincolor_sink -{ -public: - wincolor_stderr_sink() : wincolor_sink(GetStdHandle(STD_ERROR_HANDLE)) - {} -}; - -typedef wincolor_stderr_sink wincolor_stderr_sink_mt; -typedef wincolor_stderr_sink wincolor_stderr_sink_st; - -} -} diff --git a/geom_matching/wasserstein/include/spdlog/spdlog.h b/geom_matching/wasserstein/include/spdlog/spdlog.h deleted file mode 100644 index fb4ea59..0000000 --- a/geom_matching/wasserstein/include/spdlog/spdlog.h +++ /dev/null @@ -1,187 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// -// spdlog main header file. -// see example.cpp for usage example - -#pragma once - -#define SPDLOG_VERSION "0.13.0" - -#include "spdlog/tweakme.h" -#include "spdlog/common.h" -#include "spdlog/logger.h" - -#include -#include -#include -#include - -namespace spdlog -{ - -// -// Return an existing logger or nullptr if a logger with such name doesn't exist. -// example: spdlog::get("my_logger")->info("hello {}", "world"); -// -std::shared_ptr get(const std::string& name); - - -// -// Set global formatting -// example: spdlog::set_pattern("%Y-%m-%d %H:%M:%S.%e %l : %v"); -// -void set_pattern(const std::string& format_string); -void set_formatter(formatter_ptr f); - -// -// Set global logging level for -// -void set_level(level::level_enum log_level); - -// -// Set global error handler -// -void set_error_handler(log_err_handler); - -// -// Turn on async mode (off by default) and set the queue size for each async_logger. -// effective only for loggers created after this call. -// queue_size: size of queue (must be power of 2): -// Each logger will pre-allocate a dedicated queue with queue_size entries upon construction. -// -// async_overflow_policy (optional, block_retry by default): -// async_overflow_policy::block_retry - if queue is full, block until queue has room for the new log entry. -// async_overflow_policy::discard_log_msg - never block and discard any new messages when queue overflows. -// -// worker_warmup_cb (optional): -// callback function that will be called in worker thread upon start (can be used to init stuff like thread affinity) -// -// worker_teardown_cb (optional): -// callback function that will be called in worker thread upon exit -// -void set_async_mode(size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); - -// Turn off async mode -void set_sync_mode(); - - -// -// Create and register multi/single threaded basic file logger. -// Basic logger simply writes to given file without any limitatons or rotations. -// -std::shared_ptr basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate = false); -std::shared_ptr basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate = false); - -// -// Create and register multi/single threaded rotating file logger -// -std::shared_ptr rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files); -std::shared_ptr rotating_logger_st(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files); - -// -// Create file logger which creates new file on the given time (default in midnight): -// -std::shared_ptr daily_logger_mt(const std::string& logger_name, const filename_t& filename, int hour=0, int minute=0); -std::shared_ptr daily_logger_st(const std::string& logger_name, const filename_t& filename, int hour=0, int minute=0); - -// -// Create and register stdout/stderr loggers -// -std::shared_ptr stdout_logger_mt(const std::string& logger_name); -std::shared_ptr stdout_logger_st(const std::string& logger_name); -std::shared_ptr stderr_logger_mt(const std::string& logger_name); -std::shared_ptr stderr_logger_st(const std::string& logger_name); -// -// Create and register colored stdout/stderr loggers -// -std::shared_ptr stdout_color_mt(const std::string& logger_name); -std::shared_ptr stdout_color_st(const std::string& logger_name); -std::shared_ptr stderr_color_mt(const std::string& logger_name); -std::shared_ptr stderr_color_st(const std::string& logger_name); - - -// -// Create and register a syslog logger -// -#ifdef SPDLOG_ENABLE_SYSLOG -std::shared_ptr syslog_logger(const std::string& logger_name, const std::string& ident = "", int syslog_option = 0); -#endif - -#if defined(__ANDROID__) -std::shared_ptr android_logger(const std::string& logger_name, const std::string& tag = "spdlog"); -#endif - -// Create and register a logger with a single sink -std::shared_ptr create(const std::string& logger_name, const sink_ptr& sink); - -// Create and register a logger with multiple sinks -std::shared_ptr create(const std::string& logger_name, sinks_init_list sinks); -template -std::shared_ptr create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end); - - -// Create and register a logger with templated sink type -// Example: -// spdlog::create("mylog", "dailylog_filename"); -template -std::shared_ptr create(const std::string& logger_name, Args...); - -// Create and register an async logger with a single sink -std::shared_ptr create_async(const std::string& logger_name, const sink_ptr& sink, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); - -// Create and register an async logger with multiple sinks -std::shared_ptr create_async(const std::string& logger_name, sinks_init_list sinks, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); -template -std::shared_ptr create_async(const std::string& logger_name, const It& sinks_begin, const It& sinks_end, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); - -// Register the given logger with the given name -void register_logger(std::shared_ptr logger); - -// Apply a user defined function on all registered loggers -// Example: -// spdlog::apply_all([&](std::shared_ptr l) {l->flush();}); -void apply_all(std::function)> fun); - -// Drop the reference to the given logger -void drop(const std::string &name); - -// Drop all references from the registry -void drop_all(); - - -/////////////////////////////////////////////////////////////////////////////// -// -// Trace & Debug can be switched on/off at compile time for zero cost debug statements. -// Uncomment SPDLOG_DEBUG_ON/SPDLOG_TRACE_ON in teakme.h to enable. -// SPDLOG_TRACE(..) will also print current file and line. -// -// Example: -// spdlog::set_level(spdlog::level::trace); -// SPDLOG_TRACE(my_logger, "some trace message"); -// SPDLOG_TRACE(my_logger, "another trace message {} {}", 1, 2); -// SPDLOG_DEBUG(my_logger, "some debug message {} {}", 3, 4); -// SPDLOG_DEBUG_IF(my_logger, true, "some debug message {} {}", 3, 4); -/////////////////////////////////////////////////////////////////////////////// - -#ifdef SPDLOG_TRACE_ON -#define SPDLOG_STR_H(x) #x -#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x) -#define SPDLOG_TRACE(logger, ...) logger->trace("[" __FILE__ " line #" SPDLOG_STR_HELPER(__LINE__) "] " __VA_ARGS__) -#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[" __FILE__ " line #" SPDLOG_STR_HELPER(__LINE__) "] " __VA_ARGS__) -#else -#define SPDLOG_TRACE(logger, ...) -#endif - -#ifdef SPDLOG_DEBUG_ON -#define SPDLOG_DEBUG(logger, ...) logger->debug(__VA_ARGS__) -#define SPDLOG_DEBUG_IF(logger, flag, ...) logger->debug_if(flag, __VA_ARGS__) -#else -#define SPDLOG_DEBUG(logger, ...) -#endif - -} - - -#include "spdlog/details/spdlog_impl.h" diff --git a/geom_matching/wasserstein/include/spdlog/tweakme.h b/geom_matching/wasserstein/include/spdlog/tweakme.h deleted file mode 100644 index 53f5cf7..0000000 --- a/geom_matching/wasserstein/include/spdlog/tweakme.h +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -/////////////////////////////////////////////////////////////////////////////// -// -// Edit this file to squeeze more performance, and to customize supported features -// -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Under Linux, the much faster CLOCK_REALTIME_COARSE clock can be used. -// This clock is less accurate - can be off by dozens of millis - depending on the kernel HZ. -// Uncomment to use it instead of the regular clock. -// -// #define SPDLOG_CLOCK_COARSE -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment if date/time logging is not needed and never appear in the log pattern. -// This will prevent spdlog from quering the clock on each log call. -// -// WARNING: If the log pattern contains any date/time while this flag is on, the result is undefined. -// You must set new pattern(spdlog::set_pattern(..") without any date/time in it -// -// #define SPDLOG_NO_DATETIME -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment if thread id logging is not needed (i.e. no %t in the log pattern). -// This will prevent spdlog from quering the thread id on each log call. -// -// WARNING: If the log pattern contains thread id (i.e, %t) while this flag is on, the result is undefined. -// -// #define SPDLOG_NO_THREAD_ID -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment if logger name logging is not needed. -// This will prevent spdlog from copying the logger name on each log call. -// -// #define SPDLOG_NO_NAME -/////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable the SPDLOG_DEBUG/SPDLOG_TRACE macros. -// -// #define SPDLOG_DEBUG_ON -// #define SPDLOG_TRACE_ON -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to avoid locking in the registry operations (spdlog::get(), spdlog::drop() spdlog::register()). -// Use only if your code never modifes concurrently the registry. -// Note that upon creating a logger the registry is modified by spdlog.. -// -// #define SPDLOG_NO_REGISTRY_MUTEX -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to avoid spdlog's usage of atomic log levels -// Use only if your code never modifies a logger's log levels concurrently by different threads. -// -// #define SPDLOG_NO_ATOMIC_LEVELS -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable usage of wchar_t for file names on Windows. -// -// #define SPDLOG_WCHAR_FILENAMES -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to override default eol ("\n" or "\r\n" under Linux/Windows) -// -// #define SPDLOG_EOL ";-)\n" -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to use your own copy of the fmt library instead of spdlog's copy. -// In this case spdlog will try to include so set your -I flag accordingly. -// -// #define SPDLOG_FMT_EXTERNAL -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable syslog (disabled by default) -// -// #define SPDLOG_ENABLE_SYSLOG -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable wchar_t support (convert to utf8) -// -// #define SPDLOG_WCHAR_TO_UTF8_SUPPORT -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to prevent child processes from inheriting log file descriptors -// -// #define SPDLOG_PREVENT_CHILD_FD -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to mark some types as final, allowing more optimizations in release -// mode with recent compilers. See GCC's documentation for -Wsuggest-final-types -// for instance. -// -// #define SPDLOG_FINAL final -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable message counting feature. Adds %i logger pattern that -// prints log message sequence id. -// -// #define SPDLOG_ENABLE_MESSAGE_COUNTER -/////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////// -// Uncomment to enable user defined tag names -// -// #define SPDLOG_LEVEL_NAMES { " TRACE", " DEBUG", " INFO", -// " WARNING", " ERROR", "CRITICAL", "OFF" }; -/////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/geom_matching/wasserstein/include/wasserstein.h b/geom_matching/wasserstein/include/wasserstein.h deleted file mode 100644 index d8d6b2e..0000000 --- a/geom_matching/wasserstein/include/wasserstein.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - -Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -(Enhancements) to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to copyright holder, -without imposing a separate written license agreement for such Enhancements, -then you hereby grant the following license: a non-exclusive, royalty-free -perpetual license to install, use, modify, prepare derivative works, incorporate -into other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. - - */ - -#ifndef HERA_WASSERSTEIN_H -#define HERA_WASSERSTEIN_H - -#include -#include -#include - -#include "def_debug_ws.h" -#include "basic_defs_ws.h" -#include "diagram_reader.h" -#include "auction_runner_gs.h" -#include "auction_runner_gs_single_diag.h" -#include "auction_runner_jac.h" -#include "auction_runner_fr.h" - - -namespace hera -{ - -template().begin())>::type > -struct DiagramTraits -{ - using Container = PairContainer_; - using PointType = PointType_; - using RealType = typename std::remove_reference< decltype(std::declval()[0]) >::type; - - static RealType get_x(const PointType& p) { return p[0]; } - static RealType get_y(const PointType& p) { return p[1]; } -}; - -template -struct DiagramTraits> -{ - using PointType = std::pair; - using RealType = long double; - using Container = std::vector; - - static RealType get_x(const PointType& p) { return p.first; } - static RealType get_y(const PointType& p) { return p.second; } -}; - -template -struct DiagramTraits> -{ - using PointType = std::pair; - using RealType = double; - using Container = std::vector; - - static RealType get_x(const PointType& p) { return p.first; } - static RealType get_y(const PointType& p) { return p.second; } -}; - -template -struct DiagramTraits> -{ - using PointType = std::pair; - using RealType = float; - using Container = std::vector; - - static RealType get_x(const PointType& p) { return p.first; } - static RealType get_y(const PointType& p) { return p.second; } -}; - - -namespace ws -{ - - // compare as multisets - template - inline bool are_equal(const PairContainer& dgm1, const PairContainer& dgm2) - { - if (dgm1.size() != dgm2.size()) { - return false; - } - - using Traits = typename hera::DiagramTraits; - using PointType = typename Traits::PointType; - - std::map m1, m2; - - for(const auto& pair1 : dgm1) { - m1[pair1]++; - } - - for(const auto& pair2 : dgm2) { - m2[pair2]++; - } - - return m1 == m2; - } - - // to handle points with one coordinate = infinity - template - inline RealType get_one_dimensional_cost(std::vector& set_A, - std::vector& set_B, - const RealType wasserstein_power) - { - if (set_A.size() != set_B.size()) { - return std::numeric_limits::infinity(); - } - std::sort(set_A.begin(), set_A.end()); - std::sort(set_B.begin(), set_B.end()); - RealType result = 0.0; - for(size_t i = 0; i < set_A.size(); ++i) { - result += std::pow(std::fabs(set_A[i] - set_B[i]), wasserstein_power); - } - return result; - } - - - template - struct SplitProblemInput - { - std::vector> A_1; - std::vector> B_1; - std::vector> A_2; - std::vector> B_2; - - std::unordered_map A_1_indices; - std::unordered_map A_2_indices; - std::unordered_map B_1_indices; - std::unordered_map B_2_indices; - - RealType mid_coord { 0.0 }; - RealType strip_width { 0.0 }; - - void init_vectors(size_t n) - { - - A_1_indices.clear(); - A_2_indices.clear(); - B_1_indices.clear(); - B_2_indices.clear(); - - A_1.clear(); - A_2.clear(); - B_1.clear(); - B_2.clear(); - - A_1.reserve(n / 2); - B_1.reserve(n / 2); - A_2.reserve(n / 2); - B_2.reserve(n / 2); - } - - void init(const std::vector>& A, - const std::vector>& B) - { - using DiagramPointR = DiagramPoint; - - init_vectors(A.size()); - - RealType min_sum = std::numeric_limits::max(); - RealType max_sum = -std::numeric_limits::max(); - for(const auto& p_A : A) { - RealType s = p_A[0] + p_A[1]; - if (s > max_sum) - max_sum = s; - if (s < min_sum) - min_sum = s; - mid_coord += s; - } - - mid_coord /= A.size(); - - strip_width = 0.25 * (max_sum - min_sum); - - auto first_diag_iter = std::upper_bound(A.begin(), A.end(), 0, [](const int& a, const DiagramPointR& p) { return a < (int)(p.is_diagonal()); }); - size_t num_normal_A_points = std::distance(A.begin(), first_diag_iter); - - // process all normal points in A, - // projections follow normal points - for(size_t i = 0; i < A.size(); ++i) { - - assert(i < num_normal_A_points and A.is_normal() or i >= num_normal_A_points and A.is_diagonal()); - assert(i < num_normal_A_points and B.is_diagonal() or i >= num_normal_A_points and B.is_normal()); - - RealType s = i < num_normal_A_points ? A[i][0] + A[i][1] : B[i][0] + B[i][1]; - - if (s < mid_coord + strip_width) { - // add normal point and its projection to the - // left half - A_1.push_back(A[i]); - B_1.push_back(B[i]); - A_1_indices[i] = A_1.size() - 1; - B_1_indices[i] = B_1.size() - 1; - } - - if (s > mid_coord - strip_width) { - // to the right half - A_2.push_back(A[i]); - B_2.push_back(B[i]); - A_2_indices[i] = A_2.size() - 1; - B_2_indices[i] = B_2.size() - 1; - } - - } - } // end init - - }; - - - // CAUTION: - // this function assumes that all coordinates are finite - // points at infinity are processed in wasserstein_cost - template - inline RealType wasserstein_cost_vec(const std::vector>& A, - const std::vector>& B, - AuctionParams& params, - const std::string& _log_filename_prefix) - { - if (params.wasserstein_power < 1.0) { - throw std::runtime_error("Bad q in Wasserstein " + std::to_string(params.wasserstein_power)); - } - if (params.delta < 0.0) { - throw std::runtime_error("Bad delta in Wasserstein " + std::to_string(params.delta)); - } - if (params.initial_epsilon < 0.0) { - throw std::runtime_error("Bad initial epsilon in Wasserstein" + std::to_string(params.initial_epsilon)); - } - if (params.epsilon_common_ratio < 0.0) { - throw std::runtime_error("Bad epsilon factor in Wasserstein " + std::to_string(params.epsilon_common_ratio)); - } - - if (A.empty() and B.empty()) - return 0.0; - - RealType result; - - // just use Gauss-Seidel - AuctionRunnerGS auction(A, B, params, _log_filename_prefix); - auction.run_auction(); - result = auction.get_wasserstein_cost(); - params.final_relative_error = auction.get_relative_error(); - return result; - } - -} // ws - - - -template -inline typename DiagramTraits::RealType -wasserstein_cost(const PairContainer& A, - const PairContainer& B, - AuctionParams< typename DiagramTraits::RealType >& params, - const std::string& _log_filename_prefix = "") -{ - using Traits = DiagramTraits; - - //using PointType = typename Traits::PointType; - using RealType = typename Traits::RealType; - - if (hera::ws::are_equal(A, B)) { - return 0.0; - } - - bool a_empty = true; - bool b_empty = true; - RealType total_cost_A = 0.0; - RealType total_cost_B = 0.0; - - using DgmPoint = hera::ws::DiagramPoint; - - std::vector dgm_A, dgm_B; - // coordinates of points at infinity - std::vector x_plus_A, x_minus_A, y_plus_A, y_minus_A; - std::vector x_plus_B, x_minus_B, y_plus_B, y_minus_B; - // loop over A, add projections of A-points to corresponding positions - // in B-vector - for(auto& pair_A : A) { - a_empty = false; - RealType x = Traits::get_x(pair_A); - RealType y = Traits::get_y(pair_A); - if ( x == std::numeric_limits::infinity()) { - y_plus_A.push_back(y); - } else if (x == -std::numeric_limits::infinity()) { - y_minus_A.push_back(y); - } else if (y == std::numeric_limits::infinity()) { - x_plus_A.push_back(x); - } else if (y == -std::numeric_limits::infinity()) { - x_minus_A.push_back(x); - } else { - dgm_A.emplace_back(x, y, DgmPoint::NORMAL); - dgm_B.emplace_back(x, y, DgmPoint::DIAG); - total_cost_A += std::pow(dgm_A.back().persistence_lp(params.internal_p), params.wasserstein_power); - } - } - // the same for B - for(auto& pair_B : B) { - b_empty = false; - RealType x = Traits::get_x(pair_B); - RealType y = Traits::get_y(pair_B); - if (x == std::numeric_limits::infinity()) { - y_plus_B.push_back(y); - } else if (x == -std::numeric_limits::infinity()) { - y_minus_B.push_back(y); - } else if (y == std::numeric_limits::infinity()) { - x_plus_B.push_back(x); - } else if (y == -std::numeric_limits::infinity()) { - x_minus_B.push_back(x); - } else { - dgm_A.emplace_back(x, y, DgmPoint::DIAG); - dgm_B.emplace_back(x, y, DgmPoint::NORMAL); - total_cost_B += std::pow(dgm_B.back().persistence_lp(params.internal_p), params.wasserstein_power); - } - } - - RealType infinity_cost = ws::get_one_dimensional_cost(x_plus_A, x_plus_B, params.wasserstein_power); - infinity_cost += ws::get_one_dimensional_cost(x_minus_A, x_minus_B, params.wasserstein_power); - infinity_cost += ws::get_one_dimensional_cost(y_plus_A, y_plus_B, params.wasserstein_power); - infinity_cost += ws::get_one_dimensional_cost(y_minus_A, y_minus_B, params.wasserstein_power); - - if (a_empty) - return total_cost_B + infinity_cost; - - if (b_empty) - return total_cost_A + infinity_cost; - - - if (infinity_cost == std::numeric_limits::infinity()) { - return infinity_cost; - } else { - return infinity_cost + wasserstein_cost_vec(dgm_A, dgm_B, params, _log_filename_prefix); - } - -} - -template -inline typename DiagramTraits::RealType -wasserstein_dist(const PairContainer& A, - const PairContainer& B, - AuctionParams::RealType>& params, - const std::string& _log_filename_prefix = "") -{ - using Real = typename DiagramTraits::RealType; - return std::pow(hera::wasserstein_cost(A, B, params, _log_filename_prefix), Real(1.)/params.wasserstein_power); -} - -} // end of namespace hera - -#endif diff --git a/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp b/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp deleted file mode 100644 index 096d95d..0000000 --- a/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef WASSERSTEIN_PURE_GEOM_HPP -#define WASSERSTEIN_PURE_GEOM_HPP - -#define WASSERSTEIN_PURE_GEOM - - -#include "diagram_reader.h" -#include "auction_oracle_kdtree_pure_geom.h" -#include "auction_runner_gs.h" -#include "auction_runner_jac.h" - -namespace hera -{ -namespace ws -{ - - template - using DynamicTraits = typename hera::ws::dnn::DynamicPointTraits; - - template - using DynamicPoint = typename hera::ws::dnn::DynamicPointTraits::PointType; - - template - using DynamicPointVector = typename hera::ws::dnn::DynamicPointVector; - - template - using AuctionRunnerGSR = typename hera::ws::AuctionRunnerGS, hera::ws::dnn::DynamicPointVector>; - - template - using AuctionRunnerJacR = typename hera::ws::AuctionRunnerJac, hera::ws::dnn::DynamicPointVector>; - - -inline double wasserstein_cost(const DynamicPointVector& set_A, const DynamicPointVector& set_B, const AuctionParams& params) -{ - if (params.wasserstein_power < 1.0) { - throw std::runtime_error("Bad q in Wasserstein " + std::to_string(params.wasserstein_power)); - } - - if (params.delta < 0.0) { - throw std::runtime_error("Bad delta in Wasserstein " + std::to_string(params.delta)); - } - - if (params.initial_epsilon < 0.0) { - throw std::runtime_error("Bad initial epsilon in Wasserstein" + std::to_string(params.initial_epsilon)); - } - - if (params.epsilon_common_ratio < 0.0) { - throw std::runtime_error("Bad epsilon factor in Wasserstein " + std::to_string(params.epsilon_common_ratio)); - } - - if (set_A.size() != set_B.size()) { - throw std::runtime_error("Different cardinalities of point clouds: " + std::to_string(set_A.size()) + " != " + std::to_string(set_B.size())); - } - - DynamicTraits traits(params.dim); - - DynamicPointVector set_A_copy(set_A); - DynamicPointVector set_B_copy(set_B); - - // set point id to the index in vector - for(size_t i = 0; i < set_A.size(); ++i) { - traits.id(set_A_copy[i]) = i; - traits.id(set_B_copy[i]) = i; - } - - if (params.max_bids_per_round == 1) { - hera::ws::AuctionRunnerGSR auction(set_A_copy, set_B_copy, params); - auction.run_auction(); - return auction.get_wasserstein_cost(); - } else { - hera::ws::AuctionRunnerJacR auction(set_A_copy, set_B_copy, params); - auction.run_auction(); - return auction.get_wasserstein_cost(); - } -} - -inline double wasserstein_dist(const DynamicPointVector& set_A, const DynamicPointVector& set_B, const AuctionParams& params) -{ - return std::pow(wasserstein_cost(set_A, set_B, params), 1.0 / params.wasserstein_power); -} - -} // ws -} // hera - - -#endif diff --git a/geom_matching/wasserstein/tests/data/test_100_A b/geom_matching/wasserstein/tests/data/test_100_A deleted file mode 100644 index 8d126f0..0000000 --- a/geom_matching/wasserstein/tests/data/test_100_A +++ /dev/null @@ -1,100 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 -3.79915 4.51283 -3.17645 3.75321 -0.61305 0.998622 -0.445643 1.13781 -6.38205 6.53669 -5.96392 6.44093 -7.21047 7.26005 -0.6703 1.26593 -0.529933 1.7027 -7.92495 8.83023 -2.1382 2.71695 -3.79209 4.5197 -5.23354 5.82214 --0.395097 2.18831 -3.22028 3.88648 -5.56262 5.79949 -8.39623 9.37185 -2.7452 3.84539 -9.5022 10.2414 -1.01374 1.40504 -3.2029 3.89559 -7.61236 8.28485 -6.4371 6.909 -4.45616 5.35067 -1.57802 1.77895 -6.5991 7.76339 -6.66729 6.71714 -6.11898 6.57121 -2.60663 4.36396 --0.259613 1.17683 -7.72857 9.48862 -4.68398 5.51521 -4.87447 5.4233 -6.86301 6.88244 -4.17814 4.25886 -8.70558 9.72902 -4.40873 4.57389 -6.1824 7.05049 -7.97557 8.79739 -8.52591 8.6985 -5.15336 5.27796 -9.70144 9.77031 -0.561778 1.39045 -9.32553 10.2456 -7.01495 7.74521 -6.83355 7.28255 -1.96721 3.01504 -5.78411 7.59464 -5.64012 6.10721 -3.7249 5.17086 -4.33297 5.91657 -7.11793 7.2545 -5.109 6.76878 -3.02787 3.04077 -0.999365 2.05566 -8.81392 8.9086 -6.20106 6.78943 -6.7987 7.05794 -0.438805 0.449602 -8.71793 9.79853 --0.150282 0.51997 -5.72257 5.93156 -5.71098 6.09535 -9.0378 9.45942 -0.534987 0.872885 -7.72276 8.57754 -9.26069 9.40289 -4.148 4.80519 -1.04579 3.18109 -0.259767 0.93215 -0.250608 0.511569 -4.88108 5.62239 -4.6731 5.3348 -7.84979 7.93545 -0.912521 1.48142 -4.82553 5.38108 -6.02179 7.61665 -3.85848 6.39418 -5.10754 6.02118 -1.71956 1.86238 -6.47336 6.74034 --0.0371018 0.212738 -3.97259 4.15465 -2.17413 3.20188 -4.49098 6.09812 -6.62445 7.84196 -6.57541 7.432 -6.81052 9.6653 -3.67502 4.69734 -3.92378 4.14743 -5.93127 6.46154 -0.63424 0.705454 -7.60129 9.23263 -4.23064 4.74575 -0.397705 1.24458 diff --git a/geom_matching/wasserstein/tests/data/test_100_A.pd.dipha b/geom_matching/wasserstein/tests/data/test_100_A.pd.dipha deleted file mode 100644 index e94f5fe..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_100_A.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_100_B b/geom_matching/wasserstein/tests/data/test_100_B deleted file mode 100644 index 852799d..0000000 --- a/geom_matching/wasserstein/tests/data/test_100_B +++ /dev/null @@ -1,100 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 -3.77337 5.2686 -8.31344 9.05384 -0.734064 1.14844 -7.57606 7.8521 -3.16719 3.86953 -2.55072 2.64932 -9.51707 9.6071 -0.304643 2.41784 -2.79925 3.28234 -5.32901 7.7576 -5.19903 6.30449 -1.87819 2.99454 -8.92272 9.67105 -4.62414 5.05592 -4.0079 4.64148 -2.26369 3.44573 -2.69335 3.13426 -1.90706 2.42652 -2.68113 2.79133 -1.41065 1.56018 -6.55282 7.18725 -5.72986 6.37151 -7.26968 8.22623 -3.32643 3.73606 -3.77325 4.63115 -1.05457 1.83651 -8.6815 8.85251 -3.91285 4.17139 -0.380936 0.842109 -7.33227 7.69334 -8.45635 8.923 -4.1769 5.08373 -0.501374 2.23328 --0.161782 1.28908 -3.44716 3.4662 -3.15394 4.30243 -8.71416 9.3781 -6.3034 8.62893 -6.53824 7.04611 -0.6386 1.35269 -0.862088 0.960371 -5.12963 5.20203 -1.58695 2.0452 -6.57698 6.63228 -3.87747 4.45669 -1.51273 3.25669 --0.0992804 0.667302 -4.7489 4.80059 -0.0280559 1.90471 -6.7462 8.27612 -0.915652 1.30007 -2.79556 3.77404 -9.87989 10.0722 -9.39105 9.84229 -7.57235 9.37122 -5.09426 6.44266 -6.3994 6.72037 -5.73441 6.99341 -6.9079 7.88049 -4.2003 4.41933 --1.72447 2.25877 -9.04907 9.64323 -4.40473 5.3593 -9.31201 9.96079 -7.28343 8.74163 -3.0172 6.23779 -8.08422 8.56069 -6.83038 6.99863 -2.32038 3.1289 -7.42302 8.26286 -6.66905 7.18496 -0.730748 1.61335 -4.00564 5.73993 -2.81231 3.67489 -2.33178 2.37845 -9.03302 9.68681 -0.567816 0.755485 -7.89783 8.7621 -0.177662 0.332833 --0.181569 1.36821 -6.22158 6.55787 -4.67115 5.16995 -0.806432 0.820738 -7.69636 7.87402 -4.40933 4.54995 -9.1329 9.15037 -8.87416 9.04329 -1.14349 1.8993 -3.29756 4.7172 -6.67873 8.31364 -6.91238 7.1654 -0.483084 1.55006 -2.66058 3.86294 -5.93347 6.06085 -7.40514 9.05071 diff --git a/geom_matching/wasserstein/tests/data/test_100_B.pd.dipha b/geom_matching/wasserstein/tests/data/test_100_B.pd.dipha deleted file mode 100644 index 25d6734..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_100_B.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_200_A b/geom_matching/wasserstein/tests/data/test_200_A deleted file mode 100644 index 164b71d..0000000 --- a/geom_matching/wasserstein/tests/data/test_200_A +++ /dev/null @@ -1,200 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 diff --git a/geom_matching/wasserstein/tests/data/test_200_B b/geom_matching/wasserstein/tests/data/test_200_B deleted file mode 100644 index 761943d..0000000 --- a/geom_matching/wasserstein/tests/data/test_200_B +++ /dev/null @@ -1,200 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 diff --git a/geom_matching/wasserstein/tests/data/test_5000_A b/geom_matching/wasserstein/tests/data/test_5000_A deleted file mode 100644 index 094c6e0..0000000 --- a/geom_matching/wasserstein/tests/data/test_5000_A +++ /dev/null @@ -1,5000 +0,0 @@ -0.471299 1.89241 -2.82136 3.97846 -8.81923 9.20678 -1.42474 1.65425 -8.36963 9.16097 --0.236476 0.692489 -7.57182 8.06148 -2.89878 3.21958 -7.1285 7.51707 -5.75496 7.09461 -6.00081 6.10914 -9.60869 9.64676 -7.42889 8.97174 -7.26061 8.55944 -2.41226 2.5146 -8.5616 9.44847 -7.4946 8.86962 -5.42244 6.98028 -9.62386 9.96039 -7.70591 9.92849 -1.34119 3.2048 -3.92169 5.15228 -8.82955 9.60318 -7.94213 9.39997 -2.6716 4.02057 -0.375206 0.497663 -1.94572 3.65599 -1.03366 1.46356 -8.91855 10.1838 -7.11087 8.64425 -2.63266 2.78706 -8.93611 10.2943 -8.51999 9.28356 -1.31436 3.13725 -1.92871 4.00178 -8.30503 8.45555 -2.58739 2.82076 -3.20419 5.29453 -7.4015 8.13225 -9.07991 9.74729 -0.822366 0.938371 -2.90508 4.29367 -4.32385 5.4787 -3.63054 4.6918 -8.52962 9.87004 -1.16994 2.39465 -2.61903 3.33772 -4.15505 4.52942 -8.7068 9.66579 -8.10373 9.31351 -0.7954 1.23001 -7.82253 8.69505 -4.59616 5.91996 -1.02032 1.93931 -6.98421 8.46017 -8.42263 11.3447 -2.63444 3.7158 -7.49059 9.1137 --0.122109 1.41074 -8.29578 8.81161 -6.24793 6.32368 -4.07212 4.39695 -5.32453 7.457 -8.3892 9.82048 -4.35981 4.78063 -5.49932 6.08321 -1.0107 1.53369 -2.48759 2.94139 -4.24977 5.52034 -1.93104 3.35207 --0.733247 1.22412 --0.354283 2.36812 -6.34728 6.44213 -5.98172 7.8753 -5.47963 6.82986 -6.01986 6.6588 -4.62793 5.22134 -7.73923 8.29761 -8.85565 9.51494 -5.55307 6.15804 -6.30963 7.17248 -9.4775 10.2636 -7.45333 7.74006 -1.79317 2.33273 -7.73056 8.44999 -3.94172 5.02778 -8.36177 9.85172 -5.91765 8.12935 -7.95436 8.97583 -5.06238 5.37907 -4.56153 4.97175 -9.47572 9.65038 -9.54745 9.922 -7.82271 8.66299 -4.19056 4.75156 -4.15657 5.72352 -0.213845 0.312444 -2.30944 2.6806 -2.42391 3.41888 -6.00512 6.88274 -6.64546 7.61145 --0.204229 2.78228 --0.417104 0.667252 -8.18696 8.67785 -9.27818 9.67924 --0.0174685 0.21355 -5.91137 6.39606 -9.49268 10.1457 -2.11362 4.36526 -6.51084 7.82167 -6.07066 6.44843 --0.653518 1.08588 -7.46736 7.87137 -5.26045 7.92188 -6.4171 6.8133 -6.73709 7.70383 -3.46451 4.23679 -0.122365 0.809853 -7.98627 8.0505 -1.71192 2.63047 -1.20624 2.12087 -4.6812 5.51566 -2.62672 2.67648 -4.203 5.1052 -5.26482 6.5186 -3.68166 3.74701 -2.72011 3.98338 -3.41652 3.71477 -2.26211 2.90374 -0.930209 1.43211 -1.98603 3.36662 -4.55838 5.9933 -5.66292 6.59838 -3.12432 3.87457 -6.54384 8.38959 -0.205059 0.331022 -8.70617 9.34121 -7.02182 7.38679 -2.36908 2.84197 -9.13221 9.76563 -7.50113 9.49245 -8.15671 8.45093 -1.9517 2.20923 -3.23368 3.43695 -2.97273 4.10133 -7.36338 8.96733 -4.77525 5.18347 -9.47774 10.3537 -1.75218 1.97051 -5.42544 6.18939 -9.75801 10.0151 -6.31285 6.38327 -8.43389 8.721 -7.6108 7.81113 -8.72029 10.3153 -5.18655 7.1101 -7.96243 8.43151 -0.798103 0.860125 -1.1289 2.77549 -5.91084 6.03085 -4.95884 5.46913 -5.88125 6.49667 -7.9394 8.9545 -5.07492 5.55063 -5.92251 6.08548 -3.88602 5.41487 -1.40122 2.15276 -8.74244 8.83223 -4.75577 6.60338 -0.921272 1.44873 -3.77361 3.90348 -8.8999 9.8518 -3.11077 4.85674 -8.56185 10.6345 -8.76335 9.00169 -6.8734 8.60197 -4.54408 4.93892 -5.57849 6.31727 -7.95161 8.30843 -1.55798 2.4957 -3.86082 3.97131 -6.45433 7.17065 -0.96021 2.32897 -6.84576 6.89531 -8.59095 8.70199 -3.57754 4.26457 -5.27979 5.74385 -2.06602 2.90525 -3.0856 4.18179 -2.76214 3.9982 -2.11943 5.4285 -3.1197 3.24389 -0.495798 1.23632 -3.18253 3.99433 -7.02072 8.37949 -2.77905 3.42643 -1.57093 2.30655 -7.10979 7.14006 -6.20994 6.72092 -8.15136 8.33899 -0.903753 1.57921 -0.380744 1.88053 -1.3164 1.79885 -0.199366 0.576639 -5.53683 6.49433 -8.8705 9.14396 -3.1401 3.98761 -4.82675 6.69396 -7.28593 8.08916 -8.11312 9.92914 -3.25737 3.42109 -2.58413 4.57223 -2.65202 2.77196 --0.31616 1.51568 -4.1621 5.29563 -4.49155 5.21037 -7.28481 7.31722 -9.70568 10.0406 -2.39057 2.85874 -2.30626 3.16244 -1.15896 2.09616 -5.91343 7.33024 --0.172181 0.177363 -5.08934 6.10928 -7.15508 7.55315 -4.43036 4.68093 -6.00772 6.49566 -7.9247 8.43809 -1.57028 2.52328 -3.45458 4.43692 -3.18257 4.83824 -1.48243 1.91225 -2.59025 2.99596 -6.93059 8.34359 -4.53752 7.51216 -6.42857 6.51513 -5.5663 6.13877 -7.54367 7.56485 -9.01229 9.19913 -2.84158 3.23347 -0.42959 0.620618 -8.77033 9.33787 -8.06103 8.30989 -6.48425 7.83668 -4.66949 6.00205 -4.46683 4.66247 -8.96738 9.07714 -0.463093 0.514808 -7.72986 9.44537 -6.31391 6.8289 -0.883295 1.70946 -3.73278 3.98015 -6.73453 6.92514 -3.58434 4.43262 -0.236286 1.4601 -2.00505 2.38684 -3.845 4.20708 -1.18852 3.04911 -0.766784 1.00641 -7.38781 8.11216 -8.9396 9.27589 -0.369822 1.53322 -8.76527 9.23987 -0.663408 0.803445 -9.69209 10.1455 -9.73379 10.234 -3.47602 4.89968 -4.12754 5.45249 -7.31984 8.57369 -0.989101 1.47678 -5.57662 5.83292 -4.99092 6.85044 -4.35272 4.3683 -0.0517815 1.92227 -7.2694 7.80634 -1.35565 1.42783 -8.5638 8.91707 -1.74557 2.74123 -2.18226 2.19664 --0.901334 1.32691 -0.866613 1.03788 -5.30895 6.31774 -7.70178 8.5675 -4.06894 4.16071 -2.59697 3.53162 -4.30201 5.34212 -4.08762 4.19091 --0.516192 0.848397 -9.85911 10.1066 -0.472991 1.40069 -6.26012 7.0054 -0.707801 2.15445 -1.73825 1.87193 -0.206301 0.831746 -7.77872 7.92715 -4.94477 5.60361 -3.86216 5.16839 -1.35166 1.54482 -2.91721 3.56193 -4.57242 4.75913 -7.09303 8.29678 -8.18431 8.92151 -6.80303 10.87 -1.29208 1.72027 -1.22224 1.31693 -5.26756 6.26459 -2.55221 3.94397 -6.58902 6.78354 -7.85917 8.89791 -6.59279 7.63115 -4.45787 7.26828 -3.48759 5.33991 -2.13838 3.86589 -1.53368 3.57313 -1.41722 3.19336 -3.48388 4.11958 -1.53756 2.98451 -7.29083 8.22109 -1.2713 2.16915 -6.94685 7.31029 -6.2494 7.04676 -3.00376 3.02028 -1.25232 1.43301 -1.50413 2.25 -2.89098 4.77198 -4.50766 5.89294 -5.5403 6.07893 --0.101858 0.409209 -3.87963 6.1053 --0.19564 1.46589 --0.342077 0.694623 -6.63875 7.42223 -7.89982 9.05857 -4.91121 5.48031 -5.90743 8.35815 -7.13881 8.21597 -4.11493 5.08147 -3.59673 3.77176 -8.08236 8.3237 -1.35842 1.48934 -5.42963 5.85906 -4.60778 4.9734 --0.607198 0.91225 -5.40263 5.7017 -5.08624 5.63236 -7.34529 9.02233 -7.30013 8.12907 -6.56106 6.75585 -6.82576 7.25434 -2.96037 3.56454 -3.60283 4.09137 -6.35408 6.71888 --0.688103 0.84579 -8.45128 8.69771 -6.31749 7.3294 -5.82223 6.04761 -1.72983 2.38205 -6.94974 7.76985 -9.681 10.0141 -8.65394 9.2456 -2.52904 3.39548 -6.66609 7.35785 -4.18963 4.5473 -3.58643 3.80513 -2.88796 3.82413 -0.992066 1.1477 -4.57942 5.15419 -3.02826 4.32268 -5.91565 6.82087 -4.13694 5.13393 -6.28717 6.53257 -1.3149 2.36944 -0.488974 0.981461 -4.32763 4.98272 --0.420836 0.63619 -7.13406 7.31362 -0.367782 1.91138 -6.14763 6.16713 -0.837933 1.92794 -9.3781 10.0609 -3.22887 5.44584 -5.91554 6.65974 -5.68608 6.02435 -7.99715 8.55953 -5.37106 5.38574 -0.254544 0.374268 -0.184701 0.917061 -9.38005 9.54042 -6.86741 7.35628 -0.87398 1.69093 -7.75845 8.53773 -0.370425 1.35335 -0.699837 0.810893 -3.73223 4.32089 -3.81804 3.85752 -4.85936 5.10097 -2.70381 3.10519 -3.82523 5.27699 -9.13422 10.3317 -4.62775 4.77988 -7.91139 7.95504 -2.72614 4.79958 -0.863357 1.88643 -4.14155 5.02327 -2.49683 4.11585 -1.06741 1.11516 -6.20979 8.38443 -0.936362 2.46703 -6.58231 7.85063 -1.89469 2.31422 -8.70668 9.14006 -5.76486 6.1122 -3.15778 3.76679 -0.248282 2.19881 -1.25317 1.92694 -7.81837 9.53067 --0.582906 0.818904 -8.34194 8.37845 -4.4913 5.10164 -3.86376 5.5453 -6.94054 7.68699 -2.07462 2.5811 -0.518698 2.1529 -3.51773 4.60946 -8.39915 8.98446 -1.63685 2.19755 -6.60737 9.05917 -2.06667 3.23994 -3.18822 3.31219 -2.44332 3.22088 -4.755 4.87118 -4.34245 4.91565 -4.64562 4.8104 -2.73282 3.35646 -9.48057 9.86441 -0.640899 1.03356 -0.789475 0.925731 -1.4247 1.58347 -1.47747 2.25408 -8.8612 9.81597 -8.44147 10.6885 -9.07046 10.0877 -0.350125 1.15765 -4.45375 5.73964 -4.06526 4.26457 -7.50776 8.23491 -1.55452 1.63786 -2.8399 4.52559 -1.34319 1.47951 -5.21572 5.65702 -5.85695 6.75574 -8.21826 10.657 --0.0479956 1.79162 -1.72905 1.78113 -3.35685 4.03797 -3.7123 5.82296 -8.56751 10.2992 -4.07987 4.25273 -5.8347 6.07253 -3.25283 3.99065 -9.31995 10.3647 -0.649025 1.14496 -1.06966 2.04182 -7.59831 7.85826 -3.35263 3.84374 -4.91371 5.10148 -8.0875 9.23421 -3.00484 5.14282 -8.60448 9.09442 -5.61429 6.24037 -3.4729 4.17907 -7.18702 7.26274 -0.729966 0.928899 -2.27264 2.81241 -2.67248 3.91661 -3.98443 4.64406 -5.50463 6.92435 --0.257961 0.905736 -5.71363 6.67387 -4.12643 4.66467 -3.97623 4.64917 -9.71227 9.8243 -8.66674 8.97634 -7.94673 8.73904 -7.45228 8.14466 -3.78405 4.81189 -4.05505 5.00011 -2.84957 3.15451 -6.93785 7.58172 -1.85006 1.96814 -6.82256 7.00166 -2.42727 2.68161 -8.06129 8.76308 -1.53758 3.67482 -2.5057 4.18495 -7.09618 7.79664 -1.12843 1.46228 -1.61447 2.2668 -5.58639 5.70776 -8.15398 8.34959 -2.49733 2.57643 -5.18817 5.32462 -5.62963 5.86377 -1.95215 2.26641 -7.22129 7.23255 -5.99833 6.18639 -6.20875 7.13868 -6.814 7.6597 -7.41314 9.49798 -5.48819 6.31634 -4.81318 5.08156 -9.15434 9.42787 -4.83201 5.43295 -1.44477 2.6455 -8.8907 10.4727 -3.19487 3.21255 -1.47291 3.13113 -4.14796 5.10058 -5.85016 8.41212 -7.58183 8.53659 -9.5978 10.2877 -1.5954 2.58394 -2.65561 4.0975 --0.157024 0.16627 -7.04379 7.75368 -2.39896 2.7728 -2.42376 3.58085 -0.158653 0.857045 -7.82101 9.01833 -6.80499 7.35261 -6.62833 6.66255 -4.90229 5.45681 -8.50205 8.69236 -2.01845 2.06924 -8.2503 9.04222 -4.58265 5.52758 -8.6176 9.74887 -1.28468 1.77019 -5.40424 6.20705 -0.943905 1.98023 -4.2702 4.41287 -3.89454 4.4814 -0.585132 1.56351 -9.45354 10.5374 -3.7501 5.07553 -7.53248 8.14004 -4.60026 4.78921 -1.61073 4.22368 -6.22591 7.40966 -0.57866 1.0522 -5.877 6.55882 -3.54573 3.7731 -7.64294 7.66103 -8.2399 9.14032 -0.307808 0.571367 -7.89791 9.25734 -5.2852 5.84332 -0.45713 2.42223 -7.73426 8.48158 -8.0058 9.46405 -8.03189 8.41868 -1.54624 1.98914 -7.24167 7.27699 -8.61226 8.83199 -5.38365 6.52599 -0.827018 1.51428 -7.19285 7.48372 --0.0969552 2.16007 -4.08084 6.32563 -9.16026 10.2604 -0.206147 0.717435 -4.00643 4.8093 -2.16139 3.14759 -1.73359 3.13485 -9.1103 9.36052 -7.05621 7.43901 -4.83509 6.07581 -5.67164 7.89488 -7.93353 8.18454 -2.59566 3.1842 -3.62521 4.95121 -3.0297 3.18649 -1.08515 2.69289 -3.77063 5.7789 -0.106035 1.27409 -0.601099 2.13481 -6.98837 7.58833 -9.22955 9.79149 -1.6398 1.78726 -2.30423 3.34814 -2.3912 2.81842 -4.71724 6.16966 -5.13553 5.5016 -5.34117 5.45075 -9.32776 10.0676 -4.54244 5.29058 -4.01337 5.73188 -8.17427 8.39652 -1.96122 2.6921 -0.594267 1.00176 --0.136973 0.977133 -6.41362 6.78056 -1.68388 2.39891 -9.50795 10.2315 --0.262703 1.15557 -8.72229 9.683 -5.41821 5.67519 -4.93514 7.15867 -4.07046 4.26702 --0.00866106 0.252353 -8.65877 10.1527 -2.10958 3.40353 -2.94947 3.43201 -6.32014 7.06279 -2.55034 2.89646 -3.87777 5.68044 -2.05325 3.00968 -5.11855 6.55784 -8.99618 9.22608 -3.36303 3.84902 -2.6234 3.70832 -7.35189 8.30856 -6.43777 7.28495 -5.33954 5.48055 -0.15999 0.391114 -3.4492 5.07088 -2.38503 2.42742 -3.88912 4.93246 -2.76303 4.54991 -6.56261 7.60381 -3.64198 3.72471 -1.70542 1.78806 -9.71115 9.88315 -0.471586 1.82377 -9.27611 10.5725 -0.486889 0.851587 -4.39234 5.10637 -9.54209 9.8955 -6.99602 7.42461 -2.98797 3.74623 -5.89424 6.4498 -9.63845 9.86333 -4.39828 5.18646 -2.30118 3.5758 -8.68128 9.56011 -9.00505 10.4304 --0.22184 0.233296 -6.48492 7.60283 -1.54156 2.60693 -4.06808 6.39369 -5.52361 6.26241 --0.698727 0.745524 -2.30742 2.41924 -0.655833 1.65752 -6.94733 7.81866 -7.83136 9.10651 -6.45284 7.1931 -6.09683 6.66159 -9.03299 9.4163 -1.86392 3.26189 -0.54863 2.07194 -0.364026 1.38376 -0.706954 1.0736 --0.111015 0.584367 -1.54265 2.1413 -0.501172 0.57928 -2.09411 2.28902 -1.89894 4.09104 -8.72895 8.87045 -5.27709 5.72545 -0.164581 1.64188 -8.39203 8.73608 -8.21523 8.45002 -9.62006 10.1665 -4.79076 6.26442 -3.44189 3.68669 -8.93789 9.38343 -7.07036 7.64194 -8.34396 9.56445 -8.29992 8.64954 -5.82566 7.83287 -2.43008 3.4476 -1.81121 2.12203 -4.36108 4.3842 -6.28756 6.95939 -3.8698 5.79519 -0.644581 0.699162 -9.71982 10.2422 -4.86545 5.00544 -8.3808 9.29356 -1.34495 1.40972 -1.03641 2.01838 -8.55609 9.99958 -1.40813 3.46097 -3.20928 4.08838 -8.24345 9.11587 -1.27604 2.03462 -8.28298 8.46252 -2.20644 3.19585 -1.91396 2.30108 -4.2553 5.66006 -7.34925 8.38275 -6.28319 7.22199 -8.42171 9.62596 -1.12059 1.18262 -1.37555 1.84196 -4.39663 4.93639 -9.28044 9.58437 -5.47407 6.88593 -8.36529 8.49813 -9.40208 10.5922 --0.451389 1.92404 -2.89431 3.19453 -6.51433 8.02158 -5.52163 6.06786 -7.63525 9.86457 -4.13898 5.05845 -0.136662 0.503748 -6.13492 6.74997 -8.37416 9.18971 -8.64164 8.82663 -0.941173 1.16158 -6.9073 8.26916 -8.37278 8.44326 -8.8951 9.20427 -8.40149 9.17577 -3.60361 4.57183 -8.67263 10.1127 -5.89716 6.45412 -1.97285 2.35593 -7.22973 8.13467 -9.55645 9.92529 -0.261578 0.836274 -9.04414 9.45485 -6.18043 6.54229 -8.88579 9.54087 -1.82613 2.93849 -5.7599 5.96366 -5.23105 5.5541 -0.425229 1.44436 -0.32065 2.60892 -7.83655 9.48786 -2.3168 3.45972 -2.35466 3.23342 -8.24494 8.27258 -7.32678 7.74264 -8.37275 10.0741 -4.17337 4.98348 --0.162009 0.724431 -9.49757 9.76377 -8.69435 9.08089 -4.13841 4.7514 -7.26358 7.55514 -6.91912 6.93 -6.7883 7.18296 --0.614315 1.1857 -6.05907 7.33557 -4.86704 4.87705 -8.50012 9.14836 -1.83683 3.09895 -6.16389 8.39248 -3.03556 4.41004 -4.72416 5.05782 -1.98183 3.19183 -2.77103 5.71501 -4.90002 4.9817 -0.269258 0.725628 -5.59551 7.05038 -2.95416 3.09633 -2.17662 3.18385 -6.67536 7.56762 -7.31678 7.39321 -3.84158 3.85359 -4.38203 5.10149 -0.816784 1.09918 -0.70131 0.739502 -0.276631 2.32633 -9.15839 9.49433 -0.721295 1.97673 -2.63875 2.75437 -5.00344 5.5645 -2.24555 2.81234 -7.74465 9.07646 -2.35244 4.90632 -0.812093 0.954419 -3.97904 5.2071 -4.19177 4.83646 -0.853012 1.331 -2.64112 3.25613 -0.0894716 1.61954 -3.39617 3.40859 -1.56906 2.28518 -2.37258 4.36515 -1.60997 1.7561 -5.15275 5.33281 -6.47824 7.47529 -2.51145 3.29949 -2.71094 2.77785 -8.84653 9.48398 -1.3246 1.66664 -7.43718 7.5546 -3.68985 4.24649 -4.50553 4.51669 -4.15617 4.54887 -8.55319 10.2136 -2.1448 3.55805 -4.64594 4.71505 -1.71763 1.99977 -4.98066 5.46709 -7.7779 8.36497 --0.0604997 0.301294 -5.11873 7.32867 -4.94567 5.5986 -5.32645 6.26835 -2.5768 3.13511 -3.31604 3.87555 -1.60834 2.68762 -3.30552 3.85211 -4.26741 4.98636 -0.820475 1.18854 -7.91501 10.7203 -5.17391 5.30351 -4.00452 5.75141 -2.37722 3.4602 -2.2373 2.94837 -1.62462 3.48264 -7.98507 9.2566 -5.32504 5.56388 -0.760614 0.7802 -0.855659 1.01522 -3.11231 4.43223 -5.62821 6.21564 -4.96845 5.35921 -8.10559 9.11106 -1.02533 1.13103 -6.99976 7.0788 -1.87628 2.58801 -1.11023 2.24655 -5.23343 5.45086 -0.95875 2.25343 -7.45917 8.23614 -2.72245 3.04663 -8.66816 8.70698 -5.55734 7.12262 -1.01935 1.88271 -0.804417 1.76187 -7.82703 8.78426 -4.77321 6.15199 -2.91503 3.69352 -0.776735 1.08883 -5.19981 5.46442 -9.06483 10.4008 -7.72082 8.26398 -2.9854 3.26573 -0.584028 2.60443 -0.700994 1.10379 -5.47612 5.94502 --0.318442 0.986786 -5.0704 5.08055 -3.83732 4.4826 -5.60843 6.59005 -8.81432 9.7851 -6.28792 6.65284 -1.16812 2.27701 -7.15234 9.66795 -9.02188 9.15339 -1.76112 2.04839 -7.49419 7.6204 -5.1765 5.497 -1.45855 1.94969 -1.35003 1.55822 -2.50453 2.86815 -7.10451 8.51352 -3.87727 4.1124 -1.84876 2.79351 -3.01661 4.05396 --0.16814 0.366484 --0.538895 0.608786 -7.59933 9.00744 -0.938648 2.38471 -5.76934 6.16572 -8.20416 8.62505 -8.64542 8.7264 -2.75784 2.7828 -0.794451 1.97817 -9.21331 10.5156 -8.46671 8.80572 -3.94814 5.16845 -6.73654 6.97397 -4.05301 4.93008 -6.37833 6.77985 -7.21161 8.15994 -3.74993 4.61029 --0.127938 1.09853 -2.82957 4.28816 -6.50564 6.59445 -8.37926 8.48332 -0.757443 1.74585 -0.232438 0.972293 -6.99187 8.7098 -7.20368 8.44301 -4.4801 6.07501 -4.34015 6.1495 -2.19394 3.22334 -7.29817 8.41021 -1.16627 2.68901 -4.62423 5.08039 -0.955655 2.22882 -1.45862 3.07065 -1.69815 2.56291 -4.01179 4.36587 -7.135 7.75829 -6.6823 7.27765 -5.44745 5.67195 -4.94594 5.42067 -0.267772 0.301939 -0.676432 1.6296 -1.37335 1.91645 -1.89051 2.38631 -4.84386 6.30539 -8.95613 10.944 -2.18119 2.41821 -5.74901 6.16952 -7.5431 7.88071 -9.05278 9.8128 -0.201334 1.65323 -2.82787 3.82083 -3.07073 3.08475 -8.99671 10.1766 -5.43261 6.12137 -4.83693 4.86848 -6.31804 7.21544 -2.34491 3.2562 -6.05941 6.53725 --0.483381 1.17347 -5.53777 5.72651 -3.28875 3.47472 -3.94609 4.9418 -7.45585 8.6871 -1.50066 2.57215 -8.10112 8.67954 -6.24737 6.42635 -0.64413 1.05759 -7.1741 8.21476 -0.502722 1.77462 -0.783663 1.74174 -9.52704 9.9109 --0.473873 2.01013 -7.07946 7.11474 -0.857335 1.6501 -4.00225 4.84453 -5.40598 6.30573 -8.18802 8.30067 -9.00412 10.9588 -9.8362 10.1517 -7.62735 8.37572 -3.41477 4.63099 -2.51254 2.81559 -6.36702 6.56061 -5.11842 5.35515 -5.21873 5.73296 -5.73528 7.77276 -3.64993 4.66826 -7.12664 8.46553 -8.7257 9.16851 -1.27615 2.20376 -7.46188 8.20752 -2.64939 2.66373 -4.94147 6.0509 -6.3805 7.48841 -6.25197 7.12327 -0.0885331 1.2682 -4.97356 6.58488 -4.11917 4.27267 -9.08793 9.70385 -0.897277 1.31702 -6.87538 8.25544 -1.55565 1.59492 -2.62483 3.54274 -1.49631 2.92263 -9.45305 9.97728 -6.24087 6.4577 -3.94636 5.13669 --0.000956745 1.08235 -1.46134 1.83767 -9.18517 10.6601 --0.740186 1.81269 -5.81977 6.15818 -7.0529 7.99421 -6.17753 7.49749 -8.63091 9.04205 -9.65219 10.1558 -3.12839 4.99211 -2.97262 4.07384 -4.28605 4.33171 -4.15906 5.6805 -1.35165 1.50732 -0.524207 2.12307 -5.32468 7.01472 -3.16982 4.87893 -6.88786 8.34191 -3.81703 5.22335 -3.86772 4.37359 -8.19386 10.0705 -1.73155 3.16695 -4.31685 4.62261 -9.40618 9.89612 -4.41215 5.19659 -2.35595 2.63543 -7.88481 8.14203 -7.17062 10.3534 -9.41379 10.389 -7.99867 9.01239 -3.31382 4.04915 -5.39222 6.07657 -8.5187 8.65976 -9.30132 10.6131 -7.17351 7.93596 -4.80134 6.72724 -3.59756 4.65182 -1.08248 1.17479 -1.03124 1.06871 -6.43154 6.95098 --0.102199 0.59801 -4.94795 5.18081 -6.39126 7.30258 -1.52738 2.04271 -1.80373 2.33093 -2.72251 3.01677 -0.296722 1.10844 -6.39104 6.51567 -8.70965 8.78714 -2.07858 4.41695 -1.91027 2.9718 -1.42944 2.01864 -1.96347 2.73397 -4.0701 4.22456 -4.02859 4.05107 -7.10977 7.98092 -8.21148 9.54287 -6.59231 7.65109 -0.144191 0.830665 -2.0192 2.23704 -8.03482 8.39591 -8.90473 9.98543 -2.18284 2.70166 -3.05569 3.54238 -8.35319 9.39539 -2.00803 2.42866 -2.35282 3.13763 -2.20155 2.79377 -1.76531 2.94892 -7.52749 7.72567 -3.02266 3.24778 -4.01741 4.22521 -9.75263 9.91571 -6.45502 6.67838 -2.24912 3.47262 -1.84372 2.26517 -4.09559 5.71188 -1.43811 2.33732 -3.89171 4.16905 -3.01506 3.9725 -0.0273168 1.51766 -5.04118 5.80507 -3.08517 4.17316 -8.81637 8.8332 -8.74055 9.50143 -2.36904 2.69008 -6.39733 6.44221 -8.53272 9.51114 -9.48423 9.55002 -8.65645 9.04872 -6.66352 7.48009 -5.64389 7.88656 -5.75301 6.6759 -3.28645 4.22757 -4.99482 5.82988 -3.00004 4.0273 -1.45249 1.56662 -4.96263 5.32195 -7.91351 8.1437 -1.02034 1.56249 -0.71376 1.73319 -0.709968 1.44651 -9.01414 9.54799 -4.02116 4.68005 -7.10903 7.27075 -7.21322 8.71031 -1.6644 2.27186 -3.71304 4.68764 -9.66257 10.1452 -5.34477 5.46136 -9.27722 10.583 -3.82328 4.83316 -4.77019 5.07928 -9.07112 9.23836 -6.99091 7.25634 -2.11871 2.3054 -7.88242 7.98572 -0.570809 0.714073 -8.51532 9.49151 -0.329247 2.48897 -4.78202 5.36476 -1.47969 2.78867 -6.75011 7.36769 -2.31162 2.39533 -3.50434 4.48026 -5.84603 6.28861 -7.5337 7.62538 -1.09955 2.85741 -6.09915 7.20381 -0.933825 2.37925 -0.576363 2.0182 -3.12126 3.22507 -2.85313 3.02656 -3.25724 3.92077 -5.48575 6.58011 -1.02824 1.65415 -8.68703 9.06219 -3.28389 3.86349 -5.80264 6.12775 -7.11846 7.47444 -1.29638 3.38601 -6.37908 7.05986 --0.592438 0.854361 -0.39233 1.17768 -2.1497 3.94423 -2.42336 2.43441 -6.94806 8.30626 -0.79865 1.4173 -1.41455 1.43684 -0.240074 1.16712 -4.18593 5.9929 -6.161 6.564 -0.726091 1.90706 -0.375606 0.694866 -4.09349 4.26452 -2.01652 2.68038 -8.99301 9.90549 -8.93909 9.17673 -1.10427 2.01247 -9.12668 9.15282 -1.08098 1.55374 -0.377836 0.414809 -7.28611 8.86318 -8.3542 8.53251 -3.86353 4.12875 -6.7631 7.40068 -4.61679 4.78182 -2.12935 3.45492 -3.68233 4.0457 -6.68131 8.22111 -8.79197 8.80474 -1.8915 2.26287 -0.387586 3.073 -6.46798 7.57381 -7.79742 9.34526 --1.21538 1.67303 -2.07845 2.66028 -3.14148 4.46647 -1.66789 2.73375 -8.49821 10.0574 -8.42537 8.89906 -0.618349 2.72887 -6.8229 7.54501 -6.99343 7.35322 -7.34223 8.68781 -3.18834 3.98274 -8.86908 10.2535 -3.39839 3.76171 -0.188168 0.392276 -1.68187 3.53401 -6.50423 6.71714 -7.61191 8.89715 -1.68463 2.09275 -5.94627 7.6003 -2.15865 3.24126 -7.93639 8.53826 -2.99626 3.43273 -7.71028 8.41172 -3.19472 4.60878 -8.36123 8.92549 -8.92975 9.02783 -2.87187 3.49672 -6.76949 7.71139 -8.09121 9.31151 -6.84199 7.44009 -0.730655 0.800873 -7.5208 7.54109 -6.75992 7.55017 -6.09818 6.17399 -0.639209 1.27283 -3.01917 3.22327 -1.69181 2.60614 -9.49245 9.5842 --0.418034 1.08035 -5.77705 6.4705 -6.79362 8.51993 -9.73155 9.81609 -3.71503 3.92022 -6.18589 6.77634 -3.94124 4.23942 -7.59911 8.05275 -3.68865 5.10948 -7.63926 8.63019 --0.049855 0.0844425 --0.41188 0.807786 -1.35962 1.81039 -5.40579 6.15098 -1.38594 2.0059 -6.93444 8.71958 -7.01229 9.38008 --0.0974976 0.962679 -4.74131 6.59152 -1.02343 1.59245 -1.55629 1.9128 -6.28353 8.38021 -5.66349 5.79644 -1.72629 2.28563 -1.64539 2.82654 -0.359466 1.05106 -4.37569 4.82703 -5.87657 6.37853 -1.46316 1.65333 -7.44494 7.5985 -1.16846 1.98579 -4.43371 4.93234 -2.31838 2.47777 -7.52687 8.44423 -6.08056 7.42253 -9.16144 9.94783 -4.74382 4.95616 -0.248344 1.05335 -6.12345 7.43941 -9.45647 9.99799 -3.77124 4.75199 -3.31315 3.44873 --0.0909828 1.51271 -7.03234 8.02546 -8.11403 9.11461 -6.734 7.34799 -1.08903 1.18319 -2.72871 4.31607 -6.53688 7.52754 -1.07868 1.27792 -6.28409 6.56795 -4.89866 5.79458 -9.06994 9.1221 -2.54989 3.14338 -3.69971 5.71717 -3.7113 4.55076 -8.91864 9.64522 -8.75634 8.82359 -9.02242 9.03869 -3.59945 4.20169 -4.98557 5.07401 -4.81526 5.74009 -7.264 8.63749 -2.79579 4.43389 -2.87204 4.66432 -2.32487 3.72127 -3.99704 4.72567 -8.17229 9.0158 --0.72926 0.823658 -2.52355 3.32725 -5.3446 6.63868 -4.48935 7.37833 -3.08173 3.0968 -2.41585 3.23026 -9.23187 10.5413 -5.50099 5.51888 -1.29634 1.88846 --0.0113225 1.41526 -6.34508 7.53417 -0.383019 2.25144 -5.0649 5.40222 -3.08221 3.76296 -9.29111 10.6833 -2.19714 2.94735 -8.75711 9.48583 -8.61564 8.69349 -1.9362 3.96191 -3.7962 4.44382 -7.78501 9.03843 -5.79649 7.29675 -6.03048 7.4316 -1.31105 4.36446 -6.5882 7.03622 -4.88148 7.12474 -6.62305 6.90973 -2.27488 2.73731 -8.42703 9.28888 -7.72928 8.53989 -7.27021 8.63879 -0.992908 1.92001 --0.282737 0.511292 -7.88963 8.03117 -6.93371 8.26148 --0.0346633 0.403617 -8.7827 8.82558 -5.16876 5.59742 -8.61275 8.73843 -5.70578 6.02783 -9.08706 9.35903 -9.32728 9.83021 -9.20058 10.2497 -6.79824 7.3024 -7.17979 7.51783 -0.918555 2.67878 -7.9662 8.63241 -8.85903 10.3145 -9.34614 10.1964 -9.05027 9.79872 -8.28959 8.45837 -1.32518 2.04557 -8.72848 9.16742 -5.92126 6.77277 -8.31504 8.78631 -1.02487 1.70172 -4.45204 4.72842 -8.20636 10.4724 -5.86211 6.25457 -6.15754 7.71303 -8.37832 8.82577 -4.25233 4.59417 -9.41451 9.95324 -9.372 10.4461 -1.8346 2.7144 -8.00681 8.14717 -7.03997 7.06753 -7.16892 7.70102 -7.01781 7.46799 -1.78526 1.7969 -1.63304 2.2011 -8.59718 8.61083 -9.43498 10.3636 -4.98718 5.32487 -3.65451 4.89601 -8.82368 9.11333 --0.104862 0.598773 -4.97756 5.62342 -1.99876 3.24686 -2.32242 4.01096 -4.04914 4.77892 -3.81545 4.32583 -3.30153 3.46783 -3.14287 4.04718 -8.65711 8.76768 -9.09385 10.6898 -4.82771 5.64405 -5.98783 6.36785 -7.93397 9.6543 -4.89726 5.65486 -5.08717 5.22314 -6.59377 7.23748 -3.58289 3.98597 -0.177884 0.397629 -5.30856 5.79257 -2.53943 3.98007 -6.51217 6.59644 -0.196888 1.99904 -3.8709 4.1901 -2.37646 2.50997 -7.03837 8.13287 -6.8674 6.89535 -0.576964 2.08851 -0.902928 2.86981 -8.59261 9.20279 -5.96621 7.49899 -0.617602 1.83267 -2.29189 2.6361 -4.34207 4.61026 -6.19963 6.76443 -1.15955 1.44068 -5.25852 6.33905 -6.37306 7.53103 -9.13334 10.039 -8.67743 9.93959 -5.62973 6.04375 -8.32286 8.77042 -3.28772 6.1722 -4.97902 5.47249 -3.37765 5.07238 -4.58025 4.84341 -2.76807 3.18817 -4.27581 4.43023 -6.92572 7.68461 -0.279247 1.0561 -1.10903 2.61106 -6.71708 6.73132 -2.66415 3.75702 -8.0513 9.80334 -4.82466 6.04232 -2.59971 2.85768 -9.04689 9.73945 -3.48338 5.16622 -7.90925 8.92774 -7.30264 8.06247 -7.59087 8.26476 -0.150315 0.423068 -8.62726 9.74636 -9.01983 9.71707 -6.84007 7.40541 -8.87829 9.48342 -2.69214 3.71481 -0.580036 0.77289 -9.474 9.83397 -5.80151 6.08527 -3.63837 5.27137 -8.5848 8.65779 -7.88338 8.13276 -3.27992 4.20963 -6.21244 7.28079 --0.348924 1.38478 -5.26688 5.93787 -3.78941 5.01009 -6.41929 8.38529 -1.41724 1.67733 -0.212821 1.58246 -0.0697189 0.160497 -9.57839 10.2377 -9.03332 9.70645 -4.94572 5.15163 -3.16999 4.536 -5.77494 6.68359 -5.89258 6.11852 -7.72257 8.21668 -8.42501 8.44905 -8.7196 8.86465 -4.392 5.1076 -1.88249 2.54422 -1.38092 1.60326 -5.04142 6.37374 -4.31795 5.91152 -1.79399 2.09314 -6.65405 8.32262 -1.36356 1.58538 -5.45456 6.55824 -4.95807 6.22848 -8.72077 10.2825 -0.745968 2.01546 -6.85041 7.11076 -4.82028 5.34442 -5.77673 8.01294 -8.58582 9.33714 -8.49884 9.21533 -9.05574 9.4096 -3.19932 3.27024 -9.50227 9.96685 -0.771636 1.0617 -9.00621 9.36397 --0.097167 1.39463 -7.79622 8.43537 -8.05228 10.1504 -2.21685 4.17072 -1.82476 2.45381 -4.34408 4.56578 -9.27538 9.54701 -6.80153 7.44115 -7.38884 7.84448 -7.17526 8.00165 -5.85812 7.67326 -5.25545 6.30791 -5.68518 5.94055 -3.77685 4.1545 -0.530928 0.737248 -3.9772 4.59563 -8.96322 9.45618 -7.98322 8.44165 -3.42929 4.22329 -3.66445 4.7583 --0.183652 0.434842 -3.16492 3.95726 -6.87407 7.89944 -5.08921 5.7745 -2.85466 3.04505 -7.12685 7.41248 -0.715419 0.876676 -3.47441 5.21753 -9.13594 9.87799 -5.52459 6.35691 -5.12544 6.12935 -2.44296 2.91543 -2.75148 4.19886 -1.43478 4.3919 -6.6352 7.07768 -4.72283 5.11506 -6.36434 7.69268 -2.32643 2.75289 -5.46566 6.22854 -6.37995 6.76989 -1.52564 3.55871 -1.05807 2.19393 -1.95374 4.08727 -8.11273 8.12767 -2.85955 4.71355 -4.89009 6.88516 -2.06859 2.25512 -7.50556 8.77923 -4.43353 5.11915 -5.16308 5.9695 -1.12072 1.69277 -3.96494 4.38143 -7.06931 7.89524 -0.514522 1.51265 -6.56389 7.01146 -1.51362 1.8541 -4.90339 5.51209 -2.11422 3.15457 -2.50094 3.92557 -8.24319 8.62826 --0.0843505 0.710377 -6.35956 7.89457 --0.790954 1.2964 -4.02253 5.19193 -2.7425 3.46763 -9.41469 10.1367 -1.57636 2.25105 -3.18647 3.38738 -8.36644 9.66791 -0.180846 0.461221 -7.07675 7.71881 -0.265366 1.19275 -5.43007 6.4854 -9.13912 9.23294 -9.52905 10.4029 -1.18712 2.66227 -5.22714 5.62601 -1.87413 2.8716 -5.71882 6.16374 -5.38169 6.13948 --0.196005 0.236738 -5.36803 6.4395 -8.27713 8.71262 -8.82031 8.8598 --0.53845 0.564783 -1.80716 1.94173 -5.67905 7.47291 -2.37779 3.64893 -0.574727 0.766424 -4.60701 4.86591 -3.17989 4.37738 -1.36777 3.15112 -1.48092 3.06573 -3.37009 4.06028 -4.17179 6.2073 -6.47953 6.88994 -5.74431 6.5253 -4.88827 5.49049 -5.44148 5.59239 -1.66153 2.63132 -7.69387 7.82267 -5.20911 5.48488 --0.103218 0.497402 -7.18003 7.33324 -6.54305 8.81732 -0.278108 1.27452 -2.38323 2.94772 -1.2461 2.03246 -5.47052 5.75781 -7.31505 7.35895 -2.22248 4.23589 -0.0305319 0.430773 -8.32043 10.1222 -6.11732 7.09764 -5.08797 5.74991 -6.62491 7.34164 -5.55795 5.66083 -3.27549 4.13145 -1.0113 3.24631 -0.0717186 0.519738 -7.82905 9.30839 -9.90251 9.98691 -0.841457 0.952276 --0.133927 0.510174 -1.14614 2.82218 -2.59767 4.19742 -3.41095 3.95265 -3.38951 3.75838 -8.86766 9.19437 -9.27927 10.261 -2.33249 2.79402 -5.69681 5.93469 -4.02502 5.38732 -0.797157 1.22845 -7.23558 7.8651 -1.1253 1.99184 -8.58296 8.64267 --0.400141 0.74698 -3.46677 3.50526 -6.03252 6.64842 -5.8493 6.68938 -3.53209 3.84014 -7.22078 8.98106 -6.21943 7.69944 -0.887198 2.07323 -3.36591 4.57442 -4.30143 6.41179 -4.07556 4.54276 -8.77552 10.0615 -6.7247 7.04044 -9.05494 10.1126 -7.46604 7.80632 -3.38601 3.8043 -5.60475 7.02788 -9.09811 9.4654 -9.33447 9.80012 -8.66499 10.1002 -3.87007 3.88281 -2.87624 3.11359 -5.92385 6.80801 -4.49711 5.01863 -8.84524 9.36225 -6.40944 6.82093 -2.90915 3.68288 -3.96801 4.82534 -5.51744 5.84233 -3.2959 3.44409 -0.18526 0.207322 -5.49717 5.72648 -6.9522 7.1952 -0.769572 1.79343 -5.95522 6.03918 -6.54327 7.7475 -2.13516 3.83957 --0.388892 0.775076 -1.30128 2.29414 -9.76761 10.1604 -7.38731 8.66002 -7.09229 7.43495 -9.1379 9.52432 -6.75942 7.88717 -7.42824 8.82063 -6.93078 8.19884 -2.307 2.93836 -8.38254 8.84691 -3.90159 5.37938 -0.0413204 0.112203 -0.638217 1.53943 -0.88678 2.49435 -1.99104 2.60847 -6.61595 7.65064 -2.37641 4.71719 -7.94945 9.21404 -5.44594 7.13646 -5.45737 6.12335 -7.39207 8.02885 -5.51588 7.39341 -8.1581 10.0632 -0.197869 1.44516 --0.0161139 0.73487 -4.24155 4.7304 -0.00374564 1.26481 -8.1878 8.20011 --0.115544 1.74771 -0.912347 2.52922 -2.72234 4.83268 -6.45577 7.07776 -9.74201 10.1772 -7.11008 8.72914 -4.41921 4.8673 -7.97673 8.36658 -0.438659 0.647061 -4.35086 5.44482 -8.22919 9.34379 -3.53242 5.65576 -1.126 2.32177 -5.95118 6.51364 -3.10519 3.9447 -1.28889 2.26267 -7.04255 7.67791 -3.12614 3.17626 -8.09968 8.49162 -6.07924 7.219 -5.99554 6.52549 -9.14378 9.5773 -5.82872 6.53112 -9.3361 10.1704 -4.3751 6.51675 -3.288 3.98328 -4.56342 4.80185 -7.16574 7.43901 -7.7638 8.47758 -7.31514 7.78499 -7.98942 9.50252 -4.31211 4.70724 -2.9094 3.33304 -0.108736 0.668815 -8.08409 9.11098 --0.0053985 0.589992 -1.31926 2.72153 -2.28664 2.38813 -7.95237 8.26388 --0.0283047 0.452099 -7.50295 8.71708 -7.72356 8.63468 -3.48953 3.89579 -7.73814 8.73456 -4.54487 5.45817 -6.45109 7.00312 -3.99915 5.41716 -6.81436 8.5682 -6.86726 7.55999 -2.67863 3.7053 -2.6837 3.39567 -2.84347 2.91724 -5.79383 5.80493 -2.41217 3.0619 -8.78163 9.0998 -1.43456 2.50854 -6.73393 8.53005 -3.02563 3.56456 -3.34628 4.2934 -2.44985 2.92819 -1.38262 2.89341 -4.56337 5.75702 -0.275735 1.16604 -1.39763 2.8108 -9.69128 9.90361 -8.54868 9.66756 -3.01838 3.72831 -8.34017 10.5262 -1.82721 3.0476 -5.9732 6.83307 -2.77874 4.25603 -1.71987 3.1227 -6.33773 7.89103 -1.31982 2.82992 -4.21601 4.9627 -6.68166 6.72653 -0.87708 1.06828 -1.03483 1.26625 -2.996 4.03087 -1.54718 1.57452 -2.33087 2.38226 -2.29464 3.36496 -2.03064 3.41867 -5.8456 6.10406 -7.54614 8.2874 -1.42938 2.89154 -2.65935 3.53883 -3.98845 4.42049 -6.85632 7.15487 -8.12038 9.34993 -0.873558 1.32129 -6.61595 8.00766 -9.49147 9.81947 --0.0225601 0.328769 --0.481519 1.37204 -6.31457 7.45251 -4.59738 5.81395 -4.83304 5.63008 -1.95746 2.78657 -2.97889 3.74408 -9.08327 10.702 -3.58219 4.93634 -7.87068 9.77851 -0.330978 1.36031 -4.78145 5.36918 -4.94672 5.56644 -7.66806 8.08613 -4.78512 6.35461 -5.17367 5.74386 -8.65884 9.97088 -9.22053 9.60447 -6.15061 6.58817 -0.0875971 0.541643 -6.45597 7.92002 -0.636824 1.05267 -5.31677 6.12838 -6.51127 6.6731 -0.459551 1.69382 -5.75106 6.41377 -3.68438 4.67415 -9.36302 9.78281 -5.46195 7.99215 -2.55471 2.59231 --0.0640245 1.33755 -9.36027 10.6198 -2.67955 2.77882 -3.51443 4.10619 -6.83904 7.23692 -2.59553 2.81418 -7.74628 8.95169 -3.86464 3.90067 -3.32377 3.992 -1.43737 2.52191 -3.83927 3.99402 -5.24426 5.35179 -0.833857 1.05277 -8.4062 8.51964 -9.62299 9.66254 -3.55427 5.19048 -1.7003 2.62107 -6.8059 7.49246 --0.761104 0.773528 -1.37137 1.95048 -2.1222 2.59387 -0.633505 2.04796 -0.605156 1.04336 -7.22842 8.3365 -4.28716 5.28921 -8.14286 9.52015 -7.62467 9.18603 -1.11029 1.81278 -5.05654 5.13597 -0.862653 0.97827 -7.24766 7.92167 -8.80103 8.91467 -3.05841 4.82292 -1.28204 1.55969 -1.58886 2.57874 -0.0537678 1.28837 -8.09303 9.71678 -8.37599 8.85705 -3.18107 4.01971 -6.67019 7.75848 -6.29836 8.21603 -0.86271 1.30358 -3.86126 6.49694 -5.84446 6.24913 -0.475025 0.598151 -6.3477 7.08327 -3.60161 4.51824 -7.13317 8.13858 -4.89052 6.23701 -5.69441 5.99027 -7.18735 8.34853 -9.30182 9.34894 -6.06589 6.15141 -8.05917 8.89642 -5.6136 7.14058 -0.838337 0.959487 -0.56421 2.00841 -6.46876 6.63629 -2.4434 3.92184 -7.97216 9.45372 -8.17926 8.66756 -1.86522 2.01888 -0.983342 1.89079 -2.07322 2.09765 -3.52974 4.73717 -3.24973 4.88691 -5.47789 5.95384 -4.11218 4.57076 -6.61174 7.47165 -8.09302 8.36193 -1.67911 1.69022 -4.436 6.17515 -5.6544 5.74951 -1.50354 1.76043 -4.41433 4.83589 -1.82528 3.53979 -3.98749 4.65527 -6.42503 7.5787 -8.69554 10.1767 -8.39215 8.56999 -8.71646 9.66209 -1.59091 3.39622 -6.12574 6.94955 -7.92527 8.25049 -9.19858 9.49137 -2.73382 2.97747 -4.56558 5.94738 -8.33983 8.58548 -9.00798 9.01838 -4.93268 5.28383 -3.15356 3.58606 -8.28171 8.79351 -1.47358 1.9581 -0.891797 2.05345 -1.56032 2.38159 -2.5152 3.80485 -8.0963 9.88138 -1.1262 1.89279 -7.99336 8.2352 -5.25067 5.41251 -4.57532 5.20101 -1.87911 4.59415 -4.25142 4.70467 -8.18782 8.76989 -9.20478 9.3612 -7.70898 9.7752 -0.655865 0.958924 -4.8883 5.77477 -3.03279 3.47456 -1.01979 1.41661 -8.94219 10.6987 -2.49348 4.58195 -2.44003 3.29005 -3.4725 3.55572 -9.3917 9.95851 -7.08658 7.47686 -3.56413 4.44089 --0.47868 1.11453 -6.82615 8.00596 -3.49451 3.74705 -8.13286 8.47976 -7.01732 8.82556 -1.19064 1.48887 -5.28851 6.88637 -8.83175 9.49879 -0.939903 1.17024 -7.49124 9.01906 -2.9285 4.23224 -5.68296 6.86273 -8.53897 8.77886 -2.9107 5.01232 -0.748655 1.10265 -4.77258 5.12626 -3.995 4.75289 -2.71467 4.26926 -6.21665 7.16233 -4.53883 5.75731 -4.37153 4.76125 -7.47635 8.75777 -4.82013 6.4699 -9.36015 9.58451 -4.43054 5.86752 -2.10934 2.34705 -3.00306 3.06539 -7.81957 8.44081 -1.97221 3.06916 -0.153393 0.503956 -5.05611 5.27536 -5.73277 5.89001 -3.64807 4.85582 -6.13416 6.1528 -3.85511 4.14045 -0.411725 1.36529 -2.26932 2.5447 -3.51164 4.93266 -2.50955 4.34201 -8.74663 9.39268 -6.2229 6.39303 -4.38059 4.91592 -7.29109 8.62318 -6.31801 6.99532 -9.75036 10.0514 -1.69019 2.41527 -4.20462 5.27729 -6.32944 6.94729 -3.5736 5.21496 -4.48316 4.61828 -1.76915 2.43263 -2.42026 4.09159 -2.08762 2.43074 -5.48161 6.02473 -5.51826 7.47042 -2.78026 3.1552 -7.89469 9.49867 -3.09084 4.54697 -7.20417 7.42408 -5.36528 5.74851 -1.86239 2.41988 -1.55994 2.85743 -4.40182 4.6638 -7.91619 9.01242 -3.08119 3.74714 -1.54108 2.08538 -3.61461 3.64631 -8.76851 9.66257 --0.645571 1.3366 --0.707083 1.21005 -7.19571 8.23405 -5.42865 5.89329 -2.12897 2.59222 -0.603102 0.930391 -3.75025 4.63181 -6.14867 6.4526 -7.30947 7.51461 -7.83183 8.79802 -6.06658 8.53246 -1.67895 2.50063 -1.14179 2.04478 -8.59583 8.90112 --0.918885 1.30717 -0.182607 0.613593 -3.3335 3.77196 -0.783053 2.4368 -6.49331 7.60104 -2.85101 3.28637 -7.42273 7.66905 -3.96433 5.02573 -8.26262 8.40749 -9.24451 9.32783 -4.89036 7.07214 -6.45431 6.96815 -5.20701 6.58747 -7.40142 7.98615 -4.19768 4.9831 -3.32546 3.88811 --0.471996 0.967855 -9.36172 9.63532 -1.96831 3.00632 -7.537 9.72671 -4.67746 4.81135 -3.10782 4.93642 -4.94809 6.54855 -4.16763 5.25628 -9.04992 10.316 -0.668935 0.680886 -4.02935 4.84503 -5.32499 5.76636 -5.32267 7.15457 -5.18886 5.23491 -4.37053 5.36801 -2.39955 2.74657 -8.19764 8.86645 -4.24706 5.69703 -1.87851 2.36988 -0.886553 1.05064 -7.27428 7.90224 -9.08417 9.44879 -3.11534 4.02019 -6.3284 7.39925 -4.96029 5.59076 -2.58248 3.11741 -7.76513 8.13505 -4.93613 6.51523 -0.565355 1.70512 -2.12366 3.0319 -5.32422 6.84146 --0.135396 1.08591 -3.7901 4.86303 -4.49677 5.41847 -0.615748 0.834712 -0.64784 1.81859 -6.65505 7.13894 --1.12744 1.61017 -0.550814 1.24316 -6.66639 6.89866 -6.19271 8.17468 -3.09382 3.78684 -4.41221 4.95889 -7.96091 8.48824 -8.32129 10.2917 -2.13168 2.19835 -1.4635 2.38989 -5.78102 6.42215 -1.70153 3.20616 -5.35068 5.71016 -4.27702 4.37203 -5.13888 6.04764 -4.79644 5.37927 -6.75314 7.66368 -6.04484 6.84064 -4.34947 4.45643 -9.08755 10.396 -0.88804 2.17441 -6.86788 7.88301 -7.94296 8.61664 -8.02387 8.79591 -1.79024 2.40559 -5.50404 6.01044 -7.76772 8.1932 -1.174 1.23693 -6.20571 6.9224 -4.20863 4.48702 -4.16743 4.39075 --0.11965 0.120778 -7.01234 7.52619 -5.91415 6.46151 -5.28713 5.72354 -6.26981 6.31237 -0.643056 1.43864 -1.62562 1.99875 -0.544992 0.721386 -6.92522 7.09165 --0.107048 1.12273 -0.644674 0.91244 -8.56904 9.01883 -2.23079 2.56598 -9.79034 10.1123 -8.13788 8.4131 -1.86753 1.95236 -2.97577 3.33272 -8.57454 10.0193 -1.20043 1.53408 -3.43515 3.86571 -5.79075 6.41293 -1.71558 2.52845 -2.39907 3.46652 -9.08289 9.91182 -0.859644 1.07475 -5.30144 5.42157 --0.441497 0.890794 -3.55044 4.14918 --0.340115 1.19239 -6.5534 6.76908 -0.836514 2.09196 -8.15747 8.96484 -4.80087 5.14227 -7.72071 8.88223 -5.11901 5.65559 -4.44996 4.63562 --0.328404 1.3002 -0.90759 1.34556 -5.94839 6.35058 -1.76504 1.78344 -1.32585 2.08994 -7.18641 8.20945 -0.62657 1.06025 -6.28086 6.40975 -5.05525 5.16143 -5.82694 8.07685 -6.23677 7.55394 --0.226265 0.661443 -1.42599 2.36325 -9.04445 9.92971 --0.169286 0.185741 -8.34636 10.9042 -9.52494 10.0475 -8.39989 10.1377 -3.89956 4.70428 -3.98673 4.97185 -5.43008 5.67936 -7.76475 7.98591 -4.46895 4.73188 -0.584662 1.54474 -2.12622 2.79994 -1.40578 2.2461 -1.45171 2.02105 -2.05665 3.04611 -2.29818 2.68118 -1.77344 2.98698 -4.92092 5.55302 -7.18758 8.37525 -8.83407 10.0565 -2.91182 4.71932 -6.47293 6.74664 -2.49238 3.69749 -0.487234 0.541003 -4.703 4.92744 -9.8867 9.94918 -1.7713 1.9792 -5.68316 6.90242 -5.62485 6.70656 -7.24837 9.60197 -7.71147 7.76519 -5.22324 5.30661 -9.11258 9.28071 -8.2827 8.90115 -8.90865 9.42138 -7.47233 8.72308 -4.89712 5.65153 -4.12392 4.20239 -5.65325 6.55887 -8.65945 9.05845 -7.9165 8.36489 -1.4952 2.43991 -5.49665 5.80793 -1.67206 2.55302 -0.943544 1.58521 -0.47 0.860959 -6.47638 7.43101 -4.38434 5.97278 -8.12782 9.10574 -5.78143 6.6539 -9.23616 9.40513 -1.6845 2.00736 -6.56955 7.37847 -7.42993 9.04718 --0.179632 0.450904 -8.65819 9.07724 -7.86567 8.80824 -1.85428 2.7755 -2.29222 2.65374 -4.03614 4.51729 -6.9326 7.07635 -5.50807 6.498 -6.17637 7.26432 -8.7688 9.16308 -7.65 8.88604 -3.74495 4.29991 -8.5671 10.5661 -7.41964 8.21083 -8.04302 9.78783 -0.269663 0.317601 -8.29804 9.40991 -3.90673 4.22298 -8.82384 10.9441 -7.27081 8.19548 -1.30184 1.98993 -8.13028 8.92385 -7.21224 7.35137 -5.02122 5.69666 -0.817219 0.974073 --0.128067 0.589359 -2.12137 2.74019 -5.24657 5.44714 -1.55805 3.10332 -9.91031 10.0748 -7.13941 7.9143 --0.183908 0.934079 -3.987 4.11053 -3.26678 3.67608 -9.75921 10.1121 -0.755391 1.06346 -7.28479 7.49982 -1.37522 3.80623 -0.944351 1.46531 -9.49278 10.2372 -8.28946 8.67597 -9.43537 9.58003 -7.73357 8.756 -2.64043 2.8687 -4.70448 6.99929 -3.82199 3.89343 -3.43825 4.10908 -4.42362 5.69086 -8.08536 8.60142 -8.43208 9.31272 -7.5889 8.39208 -7.90112 7.9734 -6.10381 6.80568 -8.76283 8.80151 -1.46728 2.53288 -1.68884 2.47102 -7.63343 8.29838 -9.18852 9.5558 -0.977174 1.4792 -4.7577 5.74873 -4.66433 6.37375 --0.0952277 0.378184 -5.30929 6.07469 -4.98811 5.16146 -3.0744 5.59799 -0.944909 1.25222 -1.38561 2.51277 -3.77811 4.23459 -2.11604 3.32458 -0.920929 1.17187 -5.23496 6.34905 -6.9953 7.65745 -4.81803 4.89553 -4.69301 5.36777 --0.208926 2.6111 -7.97334 9.83269 --0.396673 0.779988 -5.91367 6.47682 -6.27249 6.83533 -5.58931 6.89679 -2.03394 2.67025 --0.197752 0.383167 -4.69751 7.695 -4.5989 6.07875 -3.7285 4.27396 -7.9807 8.27693 --0.00248985 1.30934 -2.68016 3.916 -0.881558 1.14567 -4.77066 5.05302 -0.552268 0.919467 -2.46862 2.65199 -1.4009 2.51701 --0.171185 1.28252 -9.27842 9.90243 -3.51778 3.57728 -6.10071 6.92163 -9.05387 10.0894 -5.52995 5.89082 -8.40216 9.0272 -9.02911 10.1602 -4.85818 7.38829 -1.6762 2.32334 -6.45416 8.62337 -5.44592 6.0245 -3.45876 3.94274 -9.07144 9.16725 -6.51885 7.6363 -7.92593 9.01986 -0.270702 1.57395 -6.11245 6.70173 -1.37658 2.19068 -2.42668 3.43827 -7.98226 8.43306 -3.72269 4.74654 -8.16252 8.58873 -8.81456 9.5363 --0.338386 0.864811 -1.90693 2.25796 -3.5305 4.17475 -6.07997 7.67393 -0.53347 1.68815 -7.31182 8.44458 -7.77462 8.33613 -3.79975 4.15552 -9.08822 9.9771 --0.101698 1.05442 -8.44869 9.95724 --0.0318759 0.532673 -8.09238 9.51356 -5.51514 6.60799 -8.66528 10.3297 -8.25556 9.97893 --0.220428 0.247563 -0.00453913 0.540444 -1.53599 1.61735 -3.77213 5.06896 -2.65332 2.75864 -6.05811 6.43112 -0.302534 0.803651 -0.393766 1.11611 -9.31035 9.62387 -0.568281 1.7765 --0.721118 1.27387 -1.83573 2.62578 -1.39953 1.91158 -6.51883 8.52813 -2.60154 2.95054 -6.58322 9.37818 -5.61178 5.67661 -9.56511 10.2767 -9.09174 10.0697 -2.55846 3.39943 -8.38146 9.06138 -7.97019 8.18074 -6.1426 6.42787 -1.15876 1.55463 -2.93483 2.96376 -7.23883 7.29158 -9.64606 10.0674 -4.89825 6.70366 -7.35635 7.96328 -2.2702 2.36797 --0.0464389 0.395244 -1.14883 2.10411 -4.7309 5.10593 -6.07946 7.37741 -5.50202 6.28822 -3.66574 3.96271 -1.9944 2.3862 -7.58159 7.59275 -1.98712 3.30587 -2.10317 2.89161 -9.66889 9.97287 -1.57327 2.15421 -8.14125 8.30983 -3.77185 4.12658 -8.51624 9.51485 -9.25211 9.722 -2.06312 3.0453 -9.34954 9.91254 -7.31475 8.89322 -7.85044 9.20242 -0.226243 1.28465 -0.0260868 0.575177 -9.40743 10.1655 -4.04324 5.05341 -1.02626 1.48332 -3.33074 3.72025 -9.2005 9.61387 -6.68317 7.14109 -6.82083 8.6312 -4.34816 4.50329 --0.48874 0.975608 -4.26651 5.68526 -4.89731 5.57569 -2.68984 3.5661 -0.499714 1.01055 -9.01902 9.36142 -3.22067 4.59054 -0.65132 0.860512 -1.6791 2.36642 -8.28222 8.7579 -2.84349 3.24134 -5.64949 6.09512 -3.44026 4.43245 -2.60889 2.6248 --0.00849234 0.984046 -7.5745 8.65675 -2.07464 2.6488 -2.59747 2.65772 -6.36828 7.42208 -3.83342 4.50127 -5.41167 5.7011 -6.53606 7.53796 -8.21975 9.56176 -1.90113 3.08684 -7.74402 7.82057 -4.26515 5.11327 -5.42743 5.59215 -8.69709 10.0912 -2.87019 3.94798 -9.27013 9.54627 -9.30568 10.2136 -9.02985 9.62917 -3.7589 4.59642 -6.59359 6.86939 -3.26574 4.83488 -5.14545 7.70086 -7.43163 8.05103 -5.72972 5.74457 -0.490113 1.31151 -7.018 7.42627 -6.22976 6.27589 -9.07732 9.30419 -4.3917 4.42663 -8.50298 10.3728 -6.18671 7.53619 -3.51053 4.097 -2.17172 3.56595 -6.08046 6.23691 -9.07361 10.9129 -3.95757 4.11333 --0.136516 0.78995 -1.34923 3.47002 -0.0562579 0.686502 -9.10943 10.2731 -5.80174 6.16971 -7.86011 7.87649 -5.34384 5.51645 -6.32167 6.76387 -7.70566 8.28038 --0.319903 0.867682 --0.372564 0.570014 -8.83696 10.8439 -7.78947 9.38211 -9.25815 10.1092 -5.59721 5.67148 -0.234719 2.42489 -1.06314 2.87416 -1.75391 2.69799 -5.4536 6.66068 -1.35696 1.87102 -2.17418 3.1459 -7.61817 7.98287 -2.92194 3.18393 -7.68243 7.83261 -9.33163 10.5531 -1.14227 2.50228 -5.47911 5.70857 -9.88123 10.0758 -8.81249 8.83145 -6.02747 6.43183 -4.81158 5.79178 -6.65666 7.5047 -4.89085 5.56569 -0.935564 1.71547 --0.0452879 1.16222 -4.03524 4.6206 -5.88518 6.02658 -2.06227 2.9581 -0.207246 2.2404 -2.81757 3.70318 -0.704257 1.98403 -2.38486 3.30039 -3.57073 4.78358 -1.53721 3.00546 -8.37852 8.39527 -1.54619 1.59789 -1.00447 1.40778 -5.31977 6.43861 -3.82175 3.83209 -3.37738 4.44002 -5.46644 5.97254 -3.88191 5.00688 -4.88046 5.39031 -4.15092 4.93679 -1.75182 2.07399 -1.16434 1.76541 -3.37032 4.29676 -3.1685 3.98533 -1.28787 1.59775 -5.86338 6.17993 -3.8645 4.25757 -1.83947 2.48092 -0.184795 0.586724 -3.13752 3.76447 -2.14264 3.03248 -5.78182 5.9029 -2.47969 3.8088 -2.59206 3.08362 --0.354871 1.03627 -7.94041 8.05947 -9.48014 9.93817 -0.992727 1.48877 -6.1525 7.51387 -5.00071 6.15665 -7.42074 8.27606 -9.6539 9.83042 -1.08984 1.46387 -5.46282 6.95907 -4.74506 5.13968 -0.357565 1.91464 -9.07652 9.65474 -0.201095 0.646211 -7.04306 7.69131 -1.17728 1.2237 -5.92183 6.29165 --0.41356 0.491524 -8.38339 10.4509 -8.08648 8.11344 -3.32474 3.39522 -5.762 5.83732 -2.26778 2.55548 -4.86127 5.92868 -3.75949 5.16608 -4.83431 5.88632 -2.65122 3.31344 -9.30295 9.38948 -6.03391 6.32749 -5.12035 5.59414 -5.68785 5.979 -7.89553 9.15202 -2.54445 2.74715 -2.36337 2.49709 -4.71661 6.12198 -3.72447 4.68735 -1.0541 1.53187 -3.45178 4.80929 -7.90773 8.26212 -8.1816 9.18627 -0.322569 0.871041 -7.24823 7.32699 -1.7003 2.78087 -9.70927 10.2515 -3.75922 4.01081 -1.06949 1.40253 -1.21774 1.4734 -6.02123 6.32973 -2.76396 3.09484 -2.80358 3.00026 -5.25666 6.31369 -4.71714 5.30669 -4.37906 4.50557 -7.40824 7.44969 -7.89081 9.18263 -8.8136 10.3074 -9.1757 9.37261 -7.1938 8.51137 -0.580081 2.32678 -2.02497 2.95434 -6.01446 6.78851 -8.54365 9.21454 -3.03567 3.27089 -0.650657 1.5716 -5.05518 6.36521 -1.64301 2.76399 -4.15989 4.34183 -3.72791 3.98156 -3.91372 4.06182 -3.04507 3.88871 -3.82596 4.25694 -3.36492 5.00402 -6.50019 8.17974 -3.54621 3.81009 -0.546921 2.09811 -5.1789 5.9826 -4.98983 6.31221 -2.47557 2.63878 -4.64568 4.81101 -9.1462 9.21888 -7.37417 7.5276 -2.21604 2.50113 -8.29804 10.2722 -5.1282 6.06353 -8.58281 10.1589 -6.47084 7.04085 -6.27806 6.72674 -7.11554 7.85687 -6.01085 6.02773 -5.46694 7.52872 -9.51078 9.85387 -3.36627 4.06552 -2.96126 5.12635 -3.09314 3.40691 -5.05456 6.62548 -7.56469 8.97053 -1.33727 2.87482 -5.6572 6.28169 -0.120924 0.296475 -7.09139 7.41322 -2.10076 3.28507 -8.74998 10.1094 -7.45072 9.50796 -7.75294 8.59218 -0.740374 2.44897 -7.63001 8.91562 -4.30743 4.81716 -6.40813 7.29159 -6.30213 7.35987 -6.44392 7.32584 -8.41155 9.4466 --0.377892 0.689618 -5.88857 6.70983 -6.67779 7.70668 -4.831 5.17464 -2.62342 3.82764 -8.57453 9.29283 -7.32648 7.96725 -9.32937 9.9726 -7.30774 7.65754 -3.97456 4.59876 -5.73092 7.20962 -1.958 2.10551 -3.2115 3.81482 -5.76497 7.42425 -2.77219 3.29692 -4.95297 5.14843 -5.96367 6.3619 -2.49872 4.61736 -8.21817 8.23425 -2.13615 2.61877 -7.84121 9.55011 -8.63416 10.2773 -5.61084 6.32053 -4.86002 5.79944 -9.07858 10.688 -5.95829 6.42504 -3.3289 4.17849 -3.27989 4.91625 -8.28046 9.23021 -2.18691 2.6072 -1.3962 1.75013 -2.13627 3.73117 -2.11128 2.57303 -7.22357 7.50136 -7.43862 8.03136 -2.80578 3.02886 -0.176906 0.761142 -5.99314 6.6075 -1.90398 3.3925 -5.48264 6.73579 -7.18447 7.49811 -3.24434 5.05219 -5.53263 6.04178 -1.71172 2.45682 -0.297266 0.481632 -2.62582 3.36142 -0.243865 1.49321 -8.86142 10.169 -3.93193 4.39404 -4.98182 5.15675 -7.99209 9.73159 -8.18033 9.45596 -4.25235 4.41546 -1.59603 2.15581 -6.47724 8.69649 -5.24138 7.93131 -3.4267 3.49003 -0.0439912 0.316407 -1.99983 3.87206 --0.103124 0.568771 -4.62451 4.80117 -2.89065 4.16315 -5.82817 7.43232 -6.89255 7.82189 -5.71037 6.81241 -4.34551 5.24905 -7.33931 7.3741 --0.855192 1.27129 -8.94842 9.10813 -9.19877 9.68412 -6.42658 7.77968 --0.0669636 0.430107 -6.40366 7.40701 -8.91175 9.24059 -3.21388 4.21676 -3.38557 3.79509 -4.24411 4.97032 -7.259 7.34896 -2.55995 3.18361 -8.77438 10.5503 -8.18685 9.79378 -2.78397 4.4563 -8.6891 9.38337 -6.51749 7.59374 -2.52346 3.46101 -8.40526 9.35647 -5.26942 6.33572 -4.15094 5.00668 -0.471666 1.53842 -7.63441 7.96745 -2.39974 3.7814 -2.71989 3.02994 -8.12085 8.33493 -6.19474 6.84381 -6.6133 8.31417 -5.1758 6.94983 -8.66241 8.79095 -6.10878 8.22083 -8.81883 9.08031 -8.28969 8.45176 -7.19851 8.37836 -1.5722 1.6836 -4.57814 6.95063 -7.66128 8.10631 -0.742483 3.08515 -1.15026 1.98074 -3.90133 4.12003 -7.61145 7.73433 -8.32187 10.2933 -0.407205 1.08089 -1.26545 2.60796 -2.70646 3.92753 --0.196551 1.83536 --0.413063 1.23838 -0.264484 0.556192 -6.30158 6.96097 --0.66246 0.809062 -9.34243 10.3521 -8.70093 8.79679 -0.745195 1.92911 -9.12892 9.68193 -7.98533 8.30538 -6.23671 7.04296 -6.5603 6.95483 -7.08133 7.10563 -2.15769 2.41541 -8.24752 8.73978 -5.27693 5.61904 -0.317419 1.48404 -3.48029 5.46979 -7.38901 8.56554 -1.06587 1.62384 -5.54926 6.04924 -4.46577 6.48749 -5.349 6.15584 -8.04249 8.17359 -3.37651 3.56179 -3.64706 5.57403 -4.49844 5.26404 -3.93361 4.92128 -5.82184 6.29881 -0.984273 1.70318 -1.12773 1.80726 -3.11675 3.17451 -5.07913 5.46291 -0.615591 1.81465 -1.08948 2.77847 -7.97412 8.07365 -5.05207 5.82497 -0.0407709 0.558817 -6.11142 6.48205 -3.4461 3.57315 -8.6547 8.80553 -8.18965 9.64194 -5.55564 7.9703 -4.01776 4.16989 -2.4668 2.82018 -0.911925 2.56662 -4.68814 5.03614 -7.4899 8.49036 -8.40912 9.14001 -2.32725 3.16377 -0.0723972 1.42049 -6.6441 6.6953 -3.65586 4.38222 -6.35844 6.57833 -4.44435 5.73077 -1.81779 2.57257 -4.17692 4.59722 -8.54682 9.38058 -1.61135 1.81629 -3.91926 5.00536 -9.78302 9.85143 -1.25632 3.10345 -5.53191 6.08174 --0.231868 0.676811 -1.03054 2.58105 -0.0402172 0.690608 -0.974571 1.25234 -5.22227 5.92302 -8.05843 10.1439 -8.48938 8.50755 -0.0965782 1.24008 -6.53821 7.47765 -0.189991 0.475204 -8.48963 8.54995 -9.68363 10.0534 -1.49381 2.71302 -6.75552 7.41283 -7.91075 9.15302 -0.520922 1.40928 -1.17957 2.11221 -4.00122 4.40686 -7.32467 7.9273 -6.39126 7.90248 -6.50534 8.19308 -7.19888 7.22234 --0.136797 0.731889 -0.870318 1.25614 -2.07126 2.28297 -6.10995 7.60408 -3.02174 3.90102 --0.657541 1.57517 -0.993121 2.66255 -7.27232 7.50832 -2.16079 3.75428 -9.27397 9.75098 -8.36865 8.5545 -4.56641 4.97607 -3.60746 4.34616 -6.31304 7.70611 -2.91442 3.7602 -4.85814 6.70407 -4.45876 5.67661 -8.06749 8.82229 -2.02826 3.59873 -1.92922 2.50088 -2.63867 3.48117 -2.17665 2.54826 -8.62674 9.10675 -0.96648 1.47671 -8.86336 9.53978 -5.52747 5.80829 -0.77099 3.06106 -2.2307 2.53877 -6.29165 6.63018 -4.44717 5.04651 -3.80894 4.63054 -7.47519 7.87072 -0.933668 1.9949 --0.712945 1.21558 -7.30206 8.38376 -5.80281 7.00022 -7.96578 8.6558 -0.24063 0.706466 -4.41893 4.58472 -4.0132 4.92768 -5.29626 6.09397 -3.43602 4.00728 -0.780945 1.66499 -8.83861 9.15168 -9.06411 9.75544 -3.45618 3.62529 -9.51413 10.0148 -0.842106 1.75695 -1.06485 1.44192 -6.89987 8.05314 -7.89154 8.73313 -8.71675 9.79526 -2.40574 2.58062 -8.55952 8.78132 -5.61716 6.06282 -3.71059 3.77929 -2.50187 2.99137 -6.92852 7.23184 -7.00442 7.93869 -8.82232 8.8756 -4.10389 4.53702 -7.6907 7.77577 -9.31554 10.2674 -8.51082 8.70339 -4.83332 6.70311 -4.6904 5.42892 -4.71407 5.67695 -4.12047 4.44089 -7.51845 8.26858 -1.31781 1.9397 -6.26854 8.02093 -6.92072 7.77774 -0.438156 2.18909 -0.898035 1.72074 -3.81121 3.8643 -1.01676 1.34308 -9.28445 9.42801 -2.43133 4.43516 -4.33664 5.9904 -2.19178 2.37244 -1.5457 1.79785 -2.23781 2.6481 -6.8365 6.87073 -0.82568 2.74775 -9.59404 9.89262 -8.48394 9.15107 -6.16085 6.42224 -3.5667 5.97689 -4.16931 7.41638 -6.95636 7.0982 -6.87987 7.09233 -3.12619 3.14821 -7.76636 7.98459 -4.60371 5.59136 -3.92189 4.88302 -6.90694 8.19858 -3.85132 5.19015 -8.05045 8.32483 -4.8338 6.05032 -1.93576 3.18873 -2.4182 3.55039 -5.56905 5.8172 -4.18436 6.01283 -3.04944 3.85936 -7.83585 8.95233 -1.76281 3.0558 -3.44143 3.6317 -8.69887 9.40371 -5.67867 5.73236 -0.859809 1.76578 -6.92284 7.13601 -8.27495 9.13414 -5.44385 6.42599 --0.941603 1.8215 -7.88161 8.79447 -0.965018 1.17732 -5.56442 5.79546 -8.79032 10.9909 -5.28632 5.79175 -4.80998 6.07002 -8.4021 9.81107 -3.16415 5.08682 --0.212163 1.2052 -5.683 5.83625 -0.738527 1.31842 -2.03835 2.52756 -7.4543 8.91243 --0.568869 1.44659 -3.58855 4.42371 -6.33058 7.18779 --0.645579 1.94313 -2.18149 2.24157 -3.80281 4.67323 -5.14628 5.97452 -2.55239 3.45685 -3.56586 6.23355 -6.74752 7.19693 -8.99006 10.5533 -0.259833 0.99882 -8.9005 9.75401 -7.28058 8.41075 -4.57803 5.70104 -9.82823 9.90251 -6.94375 7.42033 -7.8878 8.81951 -5.01137 5.52693 -2.25503 2.28817 -6.65772 7.11107 -0.647512 2.04416 -4.34796 4.5706 -4.5395 4.91529 -2.65423 3.49531 -7.97384 8.78377 -5.53873 5.76806 -9.78641 10.1351 -6.01664 6.44407 -3.47406 3.75187 -4.59421 4.81804 -1.20641 2.00488 -2.48904 2.80768 -5.77372 6.10692 -2.49363 3.24499 -1.8483 2.62965 -2.28556 3.22209 -3.17819 4.51426 -3.5548 4.23276 -3.25239 3.57895 -0.613317 2.44862 -3.82234 4.78976 -4.72809 6.46528 -9.54107 10.4426 -9.20052 10.1921 -8.24152 9.89817 -5.17594 6.19462 -7.83364 8.17082 -5.67992 6.36464 -8.9943 10.1426 -2.20598 3.0081 -3.38199 5.16464 -0.599928 1.35804 -0.841211 1.60761 -5.29338 5.89919 -1.11061 2.29219 -3.41512 3.95907 -7.9375 10.0203 -8.73852 9.66917 -9.95092 10.0162 -4.02544 4.30219 -4.1461 5.37827 -1.08089 1.59196 -7.87513 8.21121 -7.85673 8.0973 -0.96237 1.56519 -2.45532 2.61678 -6.1829 6.23637 -0.135135 0.613518 -3.18324 3.78587 -5.64796 7.20194 -0.861169 1.71661 -9.66005 10.1169 -0.880774 1.12452 -1.29389 1.57658 -5.60299 5.89759 -5.53642 7.07306 -0.540268 1.31836 -6.60244 7.98105 -4.21877 4.57159 -3.15367 4.75356 -7.81055 8.40378 -8.00942 8.10861 -5.78071 6.35646 -3.15993 4.99293 -2.36526 2.78444 -8.1361 8.76071 -1.40066 2.96474 --0.17906 1.05877 -5.94933 6.6808 -3.43187 4.05553 -3.02912 4.68942 -2.1506 2.29413 -2.3516 2.38305 -2.87496 3.0851 -6.71294 8.99858 -3.76177 5.52545 -1.58417 2.57063 -2.74646 4.27445 -5.48407 6.60696 --0.133321 0.716559 -3.53886 3.58196 -2.28729 2.40198 --0.209646 1.21263 -6.62795 7.32318 -0.714781 0.880466 -2.96831 4.05932 -6.00935 6.38896 -5.39798 6.11983 -8.47679 9.70468 -1.4339 1.74845 -2.35223 4.75732 -4.31357 4.9642 -5.26493 7.70538 -7.91888 8.94851 -6.51439 7.69469 -7.69015 7.85411 -3.94274 5.15373 -6.25852 7.32402 -2.73567 3.43236 -7.09564 8.42242 -2.55932 4.29066 -1.79489 1.84559 -8.86427 9.35669 -7.23854 8.27062 -7.8488 7.98307 -0.710888 2.22424 -0.0413624 1.10578 -1.54302 1.97696 -1.64924 3.01081 -8.15535 10.2397 -0.305662 1.63835 -8.20375 9.03123 -1.66617 2.08748 -4.01691 4.88505 -3.32856 4.10709 -5.15342 5.44616 -5.80751 7.38872 -0.485341 1.07648 -3.98267 4.20211 -6.96867 9.37655 -9.48055 9.85181 -8.39277 9.50424 -2.47589 2.79873 -3.48046 5.37417 -4.98279 6.01686 -1.29845 2.31199 --0.204348 2.50289 -0.23488 1.00378 -6.26899 7.14823 -4.62903 5.49672 -0.199052 0.822066 -6.97297 7.69083 -4.23783 4.65198 -0.530497 0.839143 -6.61355 8.22831 --0.0103941 2.16307 -0.148601 1.20044 -0.314438 0.67632 -3.43415 4.06208 -1.95498 3.25728 -4.23094 4.84942 -9.5493 10.0057 -2.64964 3.52073 -8.21388 9.1622 --0.112496 0.47622 -7.97551 8.19546 -2.16155 2.6289 -0.38442 1.46032 -3.85675 3.91557 -1.00605 1.42016 -2.4853 3.53086 --0.0765625 0.504366 -8.11302 8.46334 -7.18135 7.80218 -6.46466 8.12336 -3.75968 5.33954 -9.08789 9.73677 -6.47459 7.49454 -0.90148 1.47681 -3.44733 3.54163 -7.32968 7.909 -1.30055 2.75407 -8.78735 8.92461 -8.21764 8.59414 -0.888162 1.08404 -5.65195 6.26421 -6.23881 7.33284 -8.69731 9.88088 -3.55695 5.36909 -6.49248 7.02755 -2.31407 3.01952 -5.7803 6.1286 -6.30415 8.01577 -7.73864 8.27496 -0.741078 1.69184 -4.94671 5.68254 -3.28226 5.02894 -1.97446 2.60413 -3.26555 5.54754 -2.56179 3.41897 -3.20058 3.32486 -6.96915 7.69055 -6.89302 7.39856 -1.9659 2.61404 -1.31107 1.36867 -6.23573 6.33677 -0.17616 0.517772 -8.55548 8.79155 -9.61632 10.2651 -2.20331 2.34017 -6.93195 7.42939 -1.25398 2.23119 -1.06577 1.41048 -5.99156 7.09818 -3.34821 4.1271 -4.61618 6.90956 -2.30853 3.52875 -0.0518063 0.113732 -5.38513 6.09734 -1.73468 2.64838 -7.24679 7.63999 -4.18175 5.06728 -7.09602 7.13414 -9.06191 9.11605 -6.2309 7.67675 -3.96576 4.63237 --0.552645 1.37948 -5.76964 6.89903 -4.9272 7.5832 -4.59003 6.49719 -4.12281 6.9664 -5.12256 5.58387 -1.78859 2.76954 -4.36808 5.05712 -8.41165 9.54483 -8.11513 8.43405 -8.42016 9.52715 -8.50598 9.34564 -1.80028 1.83558 -8.08502 8.43726 -6.96667 8.12021 -5.4726 6.26772 -7.1141 9.29989 -7.83324 8.1744 -8.74368 9.16491 -2.5515 3.01706 -5.92375 6.44495 -7.45628 8.41582 -9.04829 9.71503 -4.58856 4.75356 -7.26064 7.32462 -1.81695 2.40529 -6.88067 7.95052 -1.91408 2.02663 -1.32005 1.45025 -7.47733 8.42004 -4.99403 5.85297 -0.95744 2.28875 --0.089503 0.536888 -1.09978 2.48865 -1.9959 3.098 -0.376116 0.448329 -3.98908 6.49684 -9.10178 9.51012 -5.41394 7.31529 -6.60708 7.59071 -4.38466 5.76203 -1.84355 2.60304 -0.658705 0.933522 -6.98725 7.05509 -5.60064 6.98804 -1.0603 1.1521 -4.06192 4.46156 -0.351018 1.00807 -9.17113 10.2192 -6.71641 6.74659 -8.85392 10.5272 -4.50816 5.22908 -1.13934 2.43196 -3.3746 3.57576 -7.62137 9.3234 -6.93482 7.16058 -5.66506 6.44324 -5.13364 5.86068 -1.97257 2.03803 -2.69746 2.73067 -0.989591 1.38342 -4.18819 4.69676 -4.31608 5.12265 -2.79556 4.87763 -3.55387 5.34421 --0.112466 0.585639 -2.43156 2.70221 -5.88314 7.08322 --0.450332 1.29858 -1.22202 2.46588 -6.74433 7.32925 -5.14596 5.37435 -6.76754 7.41799 -1.48762 2.45958 -4.57241 5.3382 -4.17465 5.02296 -6.48856 7.5576 -0.383566 0.823394 -8.50875 9.08734 -1.79393 2.24548 -5.06812 6.49508 -3.55364 3.61502 -5.58973 6.58885 -0.631097 2.10041 -0.323995 0.941782 -8.8798 10.1036 -6.37114 6.88202 -6.9393 7.83288 -3.09503 3.41759 -3.65269 3.70305 -5.61676 5.8924 -1.90199 2.38446 -4.23683 5.35609 -9.18649 9.88878 -8.28736 8.37734 -3.04805 5.03593 -8.02926 8.38975 -3.58161 4.01331 -3.20923 3.48207 -6.85118 8.78281 -5.06518 7.49843 -1.57456 3.05552 -3.0154 4.23782 -2.83557 3.24854 -1.29358 1.89328 -1.42911 2.72661 -3.17067 3.96651 -0.353554 1.48472 -3.46227 4.25611 -6.17639 7.24657 -5.60878 7.13562 -4.11129 5.52476 -9.17596 9.4123 -3.08339 3.65766 -4.083 4.63013 -0.628465 1.92141 -7.81989 8.39386 -3.35589 3.87531 -5.35974 5.41743 -4.48321 4.64376 -0.888177 1.37343 -8.49061 8.50063 -5.09078 6.01801 -9.65314 9.99342 -1.60502 3.0115 -1.37928 2.77642 -6.60322 8.94046 -6.74573 7.45157 --0.291156 0.325249 -6.1518 6.66827 -5.38199 6.46959 -3.50128 5.22692 -1.31774 1.70159 -0.550546 1.48845 -7.51187 7.85496 -4.2014 5.23193 -3.88255 3.97209 -2.60555 2.84958 -5.15706 6.00036 -2.99284 3.27867 -0.395077 0.768383 -3.30863 3.60594 -0.0325231 0.379208 -6.55183 7.33346 -1.44554 2.95846 -0.245421 1.29751 -3.98808 5.41226 -5.90242 6.266 -4.11097 5.02597 -0.134753 0.929866 -0.609287 1.16311 -0.231832 1.06825 -6.22093 7.05584 -9.18429 9.80637 -0.544139 1.30185 -1.69143 2.90306 -6.75109 8.67893 -5.49641 6.76104 -8.91712 10.0271 -7.09126 8.12404 -8.82958 10.2847 -0.569249 0.69421 -3.59288 5.8053 -9.25068 9.4226 -8.51607 9.26259 -5.00906 5.17068 -1.83467 2.99102 -7.32006 7.64842 -0.405532 0.603773 -6.41882 6.60495 -0.721592 1.44375 -2.78393 4.46732 -7.14806 7.16117 -5.12868 5.27918 -2.74138 3.1737 -2.95394 4.26547 -7.82827 8.21028 -9.06982 10.7279 -0.108376 0.290131 -6.34574 6.97141 -4.39022 5.50801 -7.98339 8.79674 -3.80026 4.71831 -5.43594 5.66916 -1.6743 2.61476 -4.29763 5.47402 -7.95714 8.69311 -3.4152 3.7387 -8.01715 8.8941 -6.53723 7.44437 --0.0222108 1.04503 -4.96242 6.01648 -1.70885 1.75511 -7.62434 8.53526 -6.82863 7.39782 -8.19967 9.22283 -1.99719 2.11323 --0.0124079 0.240201 -4.48577 4.87935 -2.586 4.41666 -6.37848 6.67092 -4.39606 5.67983 -9.39761 10.1095 -7.10866 7.15796 -3.91993 4.52129 -5.10552 5.36997 -7.08963 8.32694 -9.12669 9.58509 -9.26894 10.1974 -0.737413 1.26523 -2.77833 5.28516 -3.19039 4.36857 -4.32954 5.45614 -4.98069 5.49295 -7.54745 8.76142 -5.70425 7.05749 --0.250513 0.36578 -4.76997 5.89607 -2.03075 2.32111 -6.54141 6.55896 -4.19799 4.45091 -8.7796 9.11915 -5.75014 6.05646 -5.36885 5.42775 --0.00433056 0.865304 -3.65169 5.4751 -0.23625 0.872926 -0.0386337 0.792214 -4.40245 4.56789 -6.44567 7.42162 -5.51394 5.98005 -3.50146 3.83147 -8.47573 9.85647 -7.91378 8.47044 -9.44297 9.90241 -5.962 6.68782 -4.49034 4.86927 -2.17774 3.47061 -8.80614 9.26595 -7.92096 8.13838 -7.80209 7.93317 -7.78915 8.29735 -6.98111 7.162 -0.491059 1.14901 -8.97965 9.38792 -3.30207 3.53207 -3.17127 4.43581 -3.97564 4.43746 -6.79008 7.17877 -5.61669 7.51263 -4.0853 5.38748 -4.42181 6.32041 -8.08599 8.9095 -2.46938 2.55499 -1.20692 2.06351 -1.98995 2.35216 -8.17116 9.17158 -7.53414 8.37086 -3.7744 4.46197 -3.29464 4.38 -7.33246 7.81959 -4.89572 6.2831 --0.152496 1.56427 -0.636242 0.938556 -5.62066 6.06096 -9.42994 10.473 -8.95446 9.46311 -0.277891 2.80311 -6.92968 7.29845 -2.75677 3.02975 -2.2859 2.51308 -2.96683 3.03857 -6.44584 6.49518 -8.33607 8.60407 -7.20303 7.7616 -7.07205 7.46849 -2.35677 2.7904 -5.86404 6.12906 -2.42371 4.62735 -3.27237 4.11016 -0.0668578 0.644021 -6.77371 7.45187 -3.66596 5.21874 -0.718034 0.755944 -6.06162 7.05 -6.91473 7.09753 -5.0749 6.08914 -0.759874 1.11978 -8.54591 9.64997 -3.97266 4.70679 -1.51133 3.17164 -7.21772 7.69877 -8.00719 8.37052 -0.284003 0.38001 -4.08842 4.16227 -5.04461 5.79973 -4.60604 5.31979 -2.2461 2.28157 -6.25631 7.69766 -9.12404 9.67586 -7.73134 8.98923 -1.0513 1.46408 -9.17225 9.42567 -3.66795 4.29168 -8.84403 9.28497 -9.93613 9.94729 -3.16615 5.09374 --0.149675 1.43397 -2.30855 2.48392 -0.843172 0.951801 -8.32945 8.8506 -8.97012 9.94697 -2.8559 2.92359 --0.321715 0.89173 -7.48565 7.71775 -1.44301 1.47795 -6.6649 6.76187 -9.10721 9.93599 -1.82207 3.03935 -3.61893 4.5306 -2.53746 3.81243 -0.424528 1.29026 -9.51874 9.68841 -7.94954 8.14396 -7.49282 7.52655 -3.04604 3.69656 -9.45461 9.47212 -7.69209 8.16412 -0.607135 1.16564 -0.150291 0.450632 -3.28914 4.01085 -5.45597 6.02921 -8.16157 8.36605 -9.76573 10.2325 -0.151994 1.07074 -1.3748 1.68548 -2.29854 2.63593 -7.92162 8.68895 -1.28795 1.61949 -7.85469 8.26683 -4.32268 6.33174 -6.13964 6.3596 -1.25714 1.88002 -2.05006 2.28294 -8.31864 8.34151 -9.0613 10.0715 --0.041568 0.25139 -6.79984 6.81686 -5.10674 5.70583 -5.92937 7.01652 -7.57649 8.05834 -0.937157 2.25362 -7.48567 7.59746 -2.33403 2.88942 -7.3805 7.73421 -5.586 5.75327 -0.828854 2.12988 -8.22741 8.59954 -9.69214 10.1207 -6.55359 7.08114 -1.85342 2.634 -6.08756 7.28893 -6.34993 6.93474 -8.93548 10.1463 -5.49445 5.8338 -1.47951 2.14646 -2.62089 2.75888 -2.35352 3.10539 -4.98774 5.28931 -4.92239 5.40697 -7.52674 8.78948 -4.52451 4.83819 -5.45854 5.75838 -5.51553 6.3901 -4.82905 6.44407 -6.20655 6.4483 -5.68116 7.06109 -7.97301 9.15827 -8.8854 9.91623 -9.60198 10.2449 -1.93322 2.67684 -0.441852 1.87646 -5.19981 5.71385 -2.54799 2.5809 -4.34591 5.02655 -7.54678 8.75202 -6.1496 7.19033 -1.13658 1.30756 -1.38724 2.08252 -2.13624 2.30419 -8.49196 9.41369 --0.21387 0.685093 -2.47875 4.19982 -3.69093 4.00543 -5.70643 6.50331 -7.07443 8.83588 -6.85756 7.68937 -1.69241 1.83242 -0.140565 0.502156 -2.15007 3.23784 -4.97403 5.69757 -5.08315 6.25554 -3.45026 4.01942 -3.37482 4.73009 -7.4154 8.34013 -6.95399 7.59768 -8.07995 9.86199 -8.43993 8.88645 -7.66844 8.12742 --0.0200687 0.435846 -4.47984 5.9416 -7.66804 10.0801 -4.14578 5.98717 -0.256533 0.89254 -6.43216 7.4474 -3.60295 4.79419 -3.90129 4.29812 -5.30606 5.58674 -9.11552 9.79229 -5.60702 5.85299 -2.39514 2.64865 -4.51164 4.60227 -6.31154 6.77441 -3.12239 3.13505 -7.50962 7.89478 -3.90928 4.88831 -9.64625 10.0629 -5.9465 6.02877 -2.08554 2.10477 -0.087547 0.34748 -2.34295 2.53703 -6.846 7.3043 -1.37869 2.11446 -4.03371 4.26278 -5.38623 6.40917 -4.75848 6.25417 -6.03478 6.15991 --0.585543 1.2091 -2.52824 3.57712 -3.95687 5.40914 -4.42955 4.71909 -2.9328 3.98848 -5.40471 6.97056 -7.64789 9.30279 -6.19595 7.07492 -8.27328 9.41596 -8.29855 9.13665 -2.54035 3.10488 -8.25038 8.87903 -5.66599 5.88701 -7.40067 8.71195 -6.63762 6.67694 --0.0163105 1.72666 -4.77743 6.60356 -0.567991 1.14977 -5.96841 6.42987 -3.02266 4.58424 -6.72121 7.35492 -7.51477 8.65223 -8.55055 8.81014 -5.59759 5.82816 -0.218944 1.82542 -1.03197 2.36652 -7.84302 9.1594 -2.11542 4.7332 -6.37618 6.92981 -1.34963 1.59353 -0.516281 1.08859 --0.0151152 0.0624718 -6.45603 7.23063 -4.76865 5.46588 -7.5893 8.42021 -1.04534 1.99034 -2.62638 3.04997 -5.00254 5.98512 -7.7588 9.44547 -6.82186 7.34321 -8.7629 9.82272 --0.309554 0.54858 -4.19843 4.92981 -5.62327 6.80846 -6.40599 7.6073 -6.1547 6.53898 -3.93941 4.44985 -3.28342 3.72778 -7.17256 7.23035 -2.31269 3.05437 -7.99132 8.20926 -7.19338 8.08381 -7.29139 7.96441 -4.25818 4.4208 -0.802894 0.81938 -0.990115 1.04066 -0.443898 0.490936 -3.44459 3.95977 -9.07812 10.3145 -7.86709 8.26338 --0.230114 0.390748 -7.50905 8.49199 --0.715424 1.97535 -2.92248 3.12903 -5.44209 6.62431 -0.991914 1.99037 -5.92275 6.7724 -9.10818 9.2797 -4.46434 4.83462 -4.21122 5.48353 -1.8721 3.40764 -7.04713 7.60526 -3.76581 4.76317 -7.00667 7.36475 -6.87244 7.39431 -7.6349 8.46695 --0.0728922 0.351194 -5.02925 5.6834 -1.45779 2.83702 -0.339175 1.46574 -6.40414 6.9165 -6.30401 6.91007 -5.6392 5.78172 -5.63288 6.44639 -7.45285 8.89031 -4.09741 4.57929 -8.76728 9.06448 -1.62324 1.84552 -5.72509 6.54553 -8.65273 10.3652 -7.3362 7.8953 -8.96224 10.3113 -0.217316 1.7827 -1.28523 2.90127 -8.78746 9.11602 -8.6075 9.9606 --0.647788 0.779976 -4.9702 5.47602 -4.15553 4.57497 -1.08174 2.80993 -4.01011 4.8145 -6.79603 7.2317 -4.3711 4.43566 -9.65087 9.79922 -8.19407 9.21784 -3.04008 4.94094 -6.0883 7.23919 -6.88708 6.97172 -0.438073 2.00665 -8.53083 8.83004 -4.22258 4.65233 -6.72856 7.61085 -3.17591 3.18978 -5.07955 5.6938 -2.09043 2.55351 -3.28085 4.43556 -7.29225 8.03925 -7.78034 7.82608 -6.59677 7.67719 -5.56032 6.38139 -8.72663 8.82535 -2.96505 3.11983 -1.67192 2.11727 -7.85386 8.49025 -6.30965 6.72799 -8.53082 9.3801 -2.8976 3.39972 -8.90427 9.44661 --0.0665785 0.410254 -4.58099 5.81135 -1.88015 2.21838 -3.38693 4.10149 -7.46378 7.68246 -8.80985 9.72212 -6.54877 7.25642 -7.18249 7.71509 -7.41978 8.64805 -1.00839 1.78626 -0.39421 0.526751 -7.13516 7.28317 -7.28011 7.80573 -1.90158 2.49032 -1.66181 4.17994 -8.81106 9.21133 -9.46151 10.5007 -0.52585 0.575082 -7.66495 8.64072 -7.72794 8.50991 -4.92409 6.23879 -2.28769 3.21774 -3.62671 4.40932 -5.77688 7.31314 -8.94253 10.0664 -0.416618 0.635111 -1.81377 2.41356 -7.91755 8.83363 -1.62715 1.82626 -8.22065 9.51656 -0.020228 0.724724 -8.81119 9.95764 -8.66509 9.61079 -5.28201 5.32152 -3.95724 4.22138 -7.09339 7.77685 -9.63428 10.1514 -3.69117 3.779 -3.82195 4.76757 -5.75824 6.62265 -3.69984 4.75163 -3.58259 4.8788 -8.32635 8.85873 -5.81959 7.32506 -8.11265 9.14304 -2.20118 3.32511 -7.79582 8.52691 -6.5891 7.13584 -0.385393 0.440656 -1.13414 1.9951 -1.76482 2.69977 -4.76194 5.82757 -6.33633 7.5348 -4.7663 5.65083 -1.98298 3.01285 -0.956973 2.38629 -5.60955 7.65827 -9.11064 9.14351 -2.99933 3.37975 -3.36304 4.57437 -3.89886 4.50733 -8.73838 9.3514 -9.11824 9.66042 -1.47961 2.93909 -0.615297 1.13217 -1.70646 2.32478 -4.35168 4.99362 -0.986601 1.18332 -4.01551 4.92342 -7.68944 9.86838 -4.47611 4.85316 -0.051839 0.86288 -3.59624 5.5628 -7.08729 8.90374 -9.53464 9.9196 -4.69871 5.74189 -8.43146 10.6889 -3.23774 3.77777 -9.35399 9.62741 -1.15259 2.69451 -6.6368 7.33773 -5.26395 6.09857 -6.87415 7.21717 --0.925645 1.06118 -8.49641 8.67659 -2.31486 3.25354 -2.51057 2.58303 -0.921997 1.48762 -6.29777 6.74738 -4.03945 4.27305 -7.1668 7.3471 -8.44572 8.80343 -7.16937 7.84526 -8.89008 9.4332 -7.01815 7.66319 --0.420804 0.982878 -1.59755 1.64672 -0.700814 0.72579 -6.3138 7.37379 -8.49276 9.93522 --0.795656 0.819657 -0.772253 1.05926 -0.917593 1.3917 -3.30076 4.12274 --0.0237176 0.260552 -6.82385 7.49119 -6.98638 7.52012 -8.24915 9.08397 -4.17486 4.25908 -3.08435 4.64404 -8.17114 9.91412 -8.95923 9.3751 -0.596707 1.89462 -0.982917 1.40236 -6.79552 7.36657 -8.2599 9.69551 -8.85126 10.4342 -7.98967 9.14514 -0.766355 1.63286 -7.76211 7.99247 -5.23163 5.89338 -4.4707 5.50457 -9.257 9.27862 -2.11049 2.59654 -1.65501 2.06238 -0.551768 2.10873 -0.0285582 0.194421 -3.66153 3.85615 -5.07097 5.55806 -5.29145 5.80735 -2.03499 3.0863 -0.73171 2.29494 -2.63023 3.6417 -6.17478 6.25997 -5.79646 6.46363 -9.10633 10.5516 -7.23415 7.84823 -6.49951 7.1506 -9.94647 10.0242 -7.91236 8.09097 -7.8127 7.97662 -3.34238 3.42907 -8.50796 9.8311 -8.75792 8.98028 -9.34125 10.4441 -2.84413 3.71602 -1.49884 2.35652 -7.52317 9.18955 -9.5587 10.3525 -4.85436 6.1181 -5.91369 6.12194 -6.88463 8.34471 -1.51952 2.99156 -4.29022 5.12674 -8.0229 8.41246 -2.44841 3.04779 -7.59975 7.91485 -2.74491 3.62575 -0.0169968 0.240919 -5.85351 6.29039 -4.99825 5.93439 -2.153 3.35304 -1.19032 1.41763 -6.13337 7.80615 -7.05013 7.89364 -8.38056 9.92 -6.35525 6.64521 -3.93342 5.15885 -2.87656 3.47116 -3.56176 4.41159 -6.72084 7.9171 -8.03801 9.12442 -1.03329 2.56255 -7.64542 8.61709 -2.85627 2.89437 -8.8303 9.79838 -1.08032 2.34573 -7.51366 8.39169 -9.09685 10.3677 -6.753 7.41904 --0.217662 1.42059 -6.72492 7.97553 -7.99325 8.8976 -0.765372 1.10894 -4.37958 6.04671 -8.72027 9.58928 -6.00234 7.29277 -8.43912 9.25356 -2.98816 3.17389 -0.4292 0.552167 -1.69827 2.80318 -5.99904 7.09981 -4.68367 5.87791 --0.203208 1.09587 -2.65367 3.28472 -3.87051 3.88111 -6.36178 7.18853 --0.0815935 0.200848 -6.82255 7.18488 -4.99295 5.08405 -2.67155 3.08447 -5.82099 6.77145 -8.76434 9.01086 -5.94982 6.18665 -3.23369 3.71743 -0.934129 2.73456 -1.13233 1.24208 -8.21931 9.03906 -6.25425 6.69972 -0.971299 4.21205 -5.68426 6.45281 -2.85786 3.3955 -8.17715 8.88439 -2.72802 5.01235 -6.12811 6.53711 -5.22878 6.45864 -0.453655 0.922032 -0.466162 0.85262 -2.40916 2.64759 -5.63583 6.37476 -2.18434 3.14105 -0.912811 2.08432 -8.9464 10.1515 -6.77323 7.27133 -0.7167 1.60579 -5.89813 6.32997 -7.66593 8.4611 -6.54145 6.88337 -5.95421 6.21188 -1.10383 1.92226 -5.37168 5.65707 -1.51874 1.66339 -4.60748 5.00384 -8.97354 10.5394 -2.05022 3.20373 -8.17316 8.19283 -2.33792 2.72643 -8.81577 9.3704 -5.95738 6.59855 -5.69025 6.17335 -6.91889 7.88142 -2.17529 2.81528 -6.65046 7.19698 -7.10694 8.78046 -2.09613 2.47484 -1.92423 2.25333 --0.0906039 0.861376 -6.61481 7.70609 -6.7448 6.84276 -3.43655 5.28405 -6.05404 6.48902 -3.24637 3.36149 -5.69528 5.77157 -5.12352 5.31024 -7.65858 8.80828 -3.69209 4.4851 -0.25765 1.29637 -3.1537 4.13191 -3.12328 3.83765 -2.99798 4.8748 -4.49566 4.67827 -3.50822 4.03987 -8.00334 8.34084 -8.61039 9.00704 -0.0332147 0.166124 -4.55193 5.36546 -4.20308 4.31589 -0.955466 1.20095 --0.382972 1.47625 -0.803913 1.01916 -3.78333 4.0707 -6.58604 6.70173 -3.02066 3.82562 -1.16515 2.2816 -7.87242 8.24214 -4.057 4.60368 -2.84714 3.59726 -2.77804 3.69136 --0.139996 1.36416 -4.50647 6.37579 -8.86647 10.1549 -9.24372 10.1442 -0.743107 1.84722 -6.18761 7.65841 -0.214887 0.443938 -8.8513 9.55063 -4.04856 5.79916 -6.69671 7.10025 -6.97477 7.79702 -4.82551 5.10538 -0.821772 2.85828 -9.3086 9.74805 -5.45623 6.66668 -7.64296 8.67451 -7.53052 8.31024 -7.45352 7.5063 -1.31412 1.4979 -7.81176 8.48083 -0.228964 1.73207 -5.52579 5.93103 -6.58544 8.48938 -2.75407 4.18746 -3.21396 3.96298 -1.13806 2.34106 -0.899331 2.87945 -5.69016 6.61624 -2.48172 2.58082 -0.676004 1.43405 -3.41766 3.9503 -0.104554 0.298373 -6.50673 8.21831 -6.00349 6.69385 -9.62453 10.3147 -4.09379 6.02911 --1.12803 1.68823 -1.83324 3.43133 -8.30576 9.09288 --0.363911 0.405218 -1.91686 3.34928 -6.98331 7.15885 --0.31591 0.996789 -0.145813 0.35408 -5.32016 6.13679 -6.99664 7.48644 --0.140875 0.821045 -9.0119 9.19742 -1.69616 1.72453 -4.38064 5.07542 -6.85898 7.55478 -3.9145 4.27935 -5.77592 6.16806 -1.45345 3.01301 -4.13024 5.59662 -8.14557 8.41669 -4.00075 4.829 --0.283024 1.59436 -5.92468 7.17507 -6.84458 7.18356 -1.06987 1.42839 -8.618 8.66235 -0.432802 1.59512 -3.78058 4.36051 -1.6113 4.21135 -6.73475 7.01057 -6.74819 6.90498 -6.93146 8.54681 -9.02605 9.91613 -3.888 4.00526 -1.07958 2.27915 -4.78456 5.10764 -3.92952 4.89555 -9.09348 9.30304 -6.73107 7.21036 -7.42366 7.73225 -4.04079 4.72919 -1.21726 1.34683 -8.82903 9.73504 -0.577663 1.00786 -1.56822 2.08675 -4.84315 5.44994 -1.01008 1.16524 -5.99782 6.01535 -0.996739 1.75305 -4.76128 6.39012 -8.93563 9.51972 --0.0698166 0.453543 -5.9084 6.95139 -0.535401 0.692258 -4.80729 5.48335 -3.42581 4.76147 -3.58715 4.43541 -7.50236 7.71227 -5.19742 5.87901 -1.79752 2.43097 -7.29762 7.57608 -5.65169 6.47762 -6.02249 7.93642 -0.840131 2.81176 -6.2646 6.96911 -7.46014 8.17136 -9.79049 9.94054 -4.61094 5.35819 -7.30902 7.41873 -1.21883 1.84621 -6.41743 6.57736 -1.53114 1.62859 -6.73237 7.47083 -6.05618 7.56831 -7.63374 8.16821 -5.20839 6.05382 -0.619043 1.44065 -2.38657 4.88786 -3.88289 5.18788 -4.42283 4.51106 -9.15575 9.22388 -3.18678 3.72243 -3.20638 3.65935 -4.2219 4.97961 -4.63725 6.90959 -2.57123 2.59101 -4.08581 4.37325 -6.53926 6.80412 -1.77475 3.89149 -9.22854 10.426 -2.67375 4.36551 -3.17194 4.0433 -1.10304 2.0348 -3.67233 4.04957 -3.23526 3.5012 -5.17684 6.47301 -4.4 4.67662 -4.15842 5.85903 -5.88496 6.61616 -7.26489 7.51279 -4.17402 6.6997 --0.540216 0.54573 -4.36063 4.60442 -9.18146 9.96239 -0.977216 2.42032 -9.09143 9.61178 -5.06686 6.23076 -2.04772 2.92048 -1.4154 2.00707 -7.80442 9.54824 -4.55549 4.7148 -7.56964 8.80172 -1.35347 3.21648 -9.12751 10.0605 -1.81735 2.06061 -5.63798 8.0918 -6.79492 7.98002 -9.23053 10.1299 -1.74639 2.02724 -3.71825 4.09879 -2.4995 3.42493 -4.1255 5.66758 -4.75493 6.99687 -8.22481 8.72036 -6.13689 7.53026 -5.41315 5.66358 -4.21425 5.62743 -6.22936 6.44392 -2.02303 2.96414 --0.0655462 0.130508 -6.1487 6.70994 -4.36674 6.24985 -7.51129 7.63176 -7.9729 8.98613 -3.92117 4.15596 -4.54398 5.43399 -6.34248 6.92305 --0.550253 1.16167 -9.15142 9.53717 -8.99354 9.65952 -6.28988 7.90053 -3.36505 3.782 -8.80005 9.70553 -1.99947 2.18573 -1.15023 2.07069 -0.253723 1.32958 -2.0392 2.93977 -2.89024 3.00836 -8.16735 8.2049 -1.49508 2.95258 -6.19092 7.44552 -2.33328 3.06758 -6.44166 7.4649 -7.34749 7.79488 -7.5557 8.04141 -2.76812 5.13617 -7.97308 9.25668 -4.73539 5.22234 -7.53377 8.41651 --0.355405 1.36499 -4.72111 4.73744 --1.22753 1.84842 -5.5033 5.63808 -3.95421 4.19313 -6.24752 6.98229 -4.49694 5.07277 -3.70871 4.30093 -1.31984 1.50116 -7.16044 8.70868 -2.44587 3.34659 -6.08322 7.20376 -2.75012 2.82555 -0.0394442 0.863634 -3.90896 4.73696 -4.77494 5.04158 -8.41473 8.82932 -1.7049 2.71024 -9.01684 10.1044 -4.57959 5.01066 -3.2484 4.21875 -1.11596 2.88792 -3.53616 4.14001 -5.80672 5.82478 -5.85844 7.70293 -6.18239 6.30124 -2.22913 3.23412 -2.97521 3.08481 -2.2749 3.70611 -2.3457 3.86609 -2.71695 4.04473 -7.22863 7.40115 -1.80428 2.39815 -1.80781 2.33028 -2.78662 3.14936 -9.40717 9.94906 -6.54968 6.80773 -2.76862 3.24492 -1.96034 2.87404 -3.53295 3.54927 -5.36042 5.67073 -8.63339 8.93752 -0.932415 1.70402 -4.32923 4.55594 -9.3491 10.4969 -0.121416 1.15499 --0.172998 1.36319 -2.02349 2.29887 -1.75352 2.35329 -0.502555 2.01665 -6.71754 6.80014 -3.35175 3.93337 -7.17133 7.9851 -8.51299 9.95771 -5.86103 6.36734 -1.44593 3.46008 -4.49699 4.60855 -2.29261 3.10053 -6.68713 8.19499 -5.43776 6.84387 -8.58591 9.02134 -5.24746 6.15595 -1.3847 2.5074 -6.62143 7.07775 -1.7101 2.077 -9.70898 10.2789 -6.67451 7.92058 -2.56858 3.60374 -1.61917 2.60482 -1.77902 2.16908 -4.76209 6.00461 -3.8894 3.98269 -7.0278 7.276 -5.4866 5.59417 -1.69306 2.92506 -2.45744 3.76592 -2.5689 2.80611 -5.98283 6.06154 -9.5267 9.9626 -9.55652 10.4128 -6.6111 6.64606 -3.38826 4.26111 -3.61887 3.73455 -4.14924 6.13796 -7.15863 7.28212 -5.78984 6.56662 -2.09304 2.2681 -4.39867 4.88557 -6.20907 6.81034 -4.63336 4.91476 -0.939805 2.43621 -1.56774 5.13599 -8.40908 9.82058 -2.06273 2.20306 -2.53524 5.01482 -2.9314 3.23661 -2.48535 3.47368 -0.366389 1.4699 -8.81131 9.01654 -2.05102 2.87972 -1.9699 2.22723 -6.18333 6.98224 -1.3425 2.4443 -0.767883 1.77423 -3.1538 3.43248 -0.891006 0.903458 -5.7136 5.8713 -0.437569 1.37539 -3.98533 5.01646 -8.65764 9.89518 -3.74889 3.98561 -7.74507 8.30657 -8.24671 8.43006 -6.88467 7.42036 -1.99426 2.03522 -1.90486 2.04181 -1.12911 1.71807 -9.25253 10.105 -1.92989 2.0346 -5.60044 6.25585 -9.16848 10.087 -6.67824 6.72257 -1.88522 2.80222 -0.242758 0.852689 -5.09249 7.71484 -5.54974 6.44414 -7.66767 8.72936 -3.48884 3.83156 -3.4697 5.14646 -8.48582 8.7692 -6.76259 7.06897 -7.83856 8.62005 -5.81853 6.76571 -2.04803 2.94439 -6.85396 7.22985 -6.52449 7.39764 -9.26838 9.34809 -4.64449 5.64975 -7.51845 7.80279 --1.27268 1.65344 -0.686101 4.20373 -7.80552 8.37119 -7.20419 8.35284 -9.33962 9.87975 -4.31238 5.58683 -2.39198 3.84398 -1.29248 2.59269 -4.71612 6.195 -5.27332 6.52174 -7.71492 7.84702 -8.18064 8.72233 -1.55223 2.31294 -6.34374 7.31758 -6.48966 6.92611 -2.62268 3.09895 -4.09064 5.06197 -2.66367 4.12126 -1.53391 2.93092 -8.64516 8.70655 -9.20047 9.28957 -4.00474 4.11716 -8.5418 9.45901 -8.73386 9.73253 -9.22596 9.63179 -1.34204 2.7834 -8.4489 9.21027 -7.75158 8.51085 -5.98856 6.11212 -1.29906 2.08111 -9.24315 9.76291 -6.84345 6.91607 -5.88294 5.90545 -3.03022 3.39941 -3.22222 3.4089 -1.12791 1.65898 -6.70232 7.36336 -8.60042 8.82377 -1.26451 1.30362 -2.76682 2.92693 -1.54763 2.19582 -6.5865 7.24173 -4.15242 4.21742 -8.39615 8.78524 -1.67017 2.08717 -9.03012 9.97041 -2.31463 2.45877 -8.29872 8.51813 -1.66689 2.51919 --0.807606 1.47794 -1.31452 1.94418 -0.0739222 0.512106 -4.23577 4.25889 -7.45273 7.97505 -3.34234 3.46608 -7.97304 9.14131 -1.9029 2.99946 -8.84087 9.79689 -4.92769 5.68685 -2.74004 3.04513 -0.889257 2.20448 -3.10574 3.9758 -3.91547 4.32303 -7.17475 8.07377 -5.92903 8.03738 -1.57974 1.65527 -3.76339 4.2285 -2.28263 2.7559 -9.53105 9.87477 -2.10154 3.2222 -4.23683 5.34347 -1.38769 2.48482 -5.39838 5.51872 -8.50975 10.1382 -8.04108 9.21474 -8.5252 9.67823 -8.893 10.7726 -7.1294 8.18211 -1.15642 1.73882 -0.436911 0.756698 -3.66142 3.71659 -6.37686 6.7 -8.88506 8.99896 -2.31891 3.79061 -2.61615 2.81909 -1.35216 1.39571 -3.04217 3.52564 -7.8409 9.34099 -0.470596 1.49157 -6.94014 7.18365 -8.05483 8.49979 -8.18511 8.25608 -7.03597 8.45251 -2.47411 2.65172 -0.112716 0.193057 -4.45039 5.10584 -4.53906 5.80013 -5.11702 5.27151 -1.24211 1.90757 -4.64114 4.72912 -1.77254 3.45037 --0.1275 0.99675 -5.69637 7.67722 -2.21252 2.44032 -3.89623 4.40192 -2.79904 3.15569 -8.37911 9.42424 -5.27199 6.2026 -1.84791 3.75411 -0.522801 0.54806 -3.83644 4.64785 -6.65497 7.55638 -6.75104 6.98564 -2.34979 2.98049 -8.27176 8.60459 -5.07773 5.44064 -1.16934 1.98872 -4.2914 5.37557 -6.83462 7.95408 -3.91405 5.73229 -7.77473 8.53538 -9.23441 9.90185 -4.03659 5.2473 -5.99336 7.8004 -4.2432 5.89276 -6.39847 7.81276 -9.13909 10.4164 -1.12009 2.5649 -2.35157 3.18468 -4.46918 5.55572 -3.82512 5.53666 -7.18238 8.10193 -8.40911 9.23639 -8.99555 10.4192 -6.69547 8.87825 -4.79012 5.34858 -9.23615 10.0986 --0.590587 1.14603 -2.74289 3.48244 --0.248403 1.1591 -3.35663 3.7229 -7.37504 7.6481 -6.64796 7.64695 -0.778081 2.41212 -4.49242 4.7772 -8.01419 8.109 -6.6494 7.76619 -8.86331 10.1205 -0.817273 0.937855 -8.00019 8.21556 -6.19405 6.54794 -6.11798 7.30421 -3.40164 4.28921 -5.31927 6.21584 -2.79377 3.40938 -3.59494 3.90321 -7.79218 10.3132 -2.99546 3.86111 -1.71916 3.40283 -6.1768 6.81915 -7.59629 8.68568 -1.59724 2.348 -6.20151 6.5391 -6.30798 6.70478 -0.489786 1.51322 -1.28396 1.86775 -5.18031 5.43007 -6.61276 7.70565 -1.4909 2.11165 -4.56163 5.49277 -1.93598 4.35147 -3.65568 5.00224 -1.68028 2.00363 -7.82874 8.67399 -1.23053 2.87598 --0.164275 0.194491 -2.58349 4.01302 -1.23279 2.02984 -0.599702 1.09257 -9.50965 9.80164 -2.33108 3.58037 -4.38659 4.62378 -2.65097 2.87349 -0.0537058 0.576502 -4.20415 5.15693 -5.41458 5.98382 -4.37747 5.10347 -2.62536 2.70073 -6.96845 8.15356 -6.91533 8.41638 -9.36431 9.58863 -6.13019 7.25915 -2.7818 3.4951 -9.44641 10.1301 -2.68817 4.19772 -5.65664 5.6814 -8.25308 10.498 -3.50374 3.64458 -1.47063 1.78567 -8.21901 8.98152 -3.99261 4.47339 -2.51395 3.38788 -4.66178 5.24959 -9.08415 10.3467 -5.92351 7.20447 -1.74145 2.35957 -7.62653 8.96797 -6.43542 7.68775 -5.49047 6.56355 -4.9225 6.22555 -0.257967 0.704837 -3.42488 3.52873 -8.67606 9.77824 -5.12981 6.37856 -5.97359 6.32151 -1.58517 2.28129 -0.530687 1.54545 -7.04056 8.15296 -1.8541 3.1902 -9.46286 10.0098 -3.17967 4.02237 -3.49966 3.80271 -6.24894 6.49618 -1.19944 1.59215 -5.30422 6.94823 -7.49137 7.78584 -7.02669 8.16282 -2.21673 3.36471 -7.66183 8.34763 -4.13876 4.87421 -3.0199 4.07124 -8.40439 8.82943 --0.274649 0.429602 -6.11215 7.65609 -3.34781 5.03006 -1.28231 1.77258 -7.57256 8.59456 -5.36208 5.81735 -7.18511 8.96618 -8.86053 9.49567 -5.39097 5.93211 -6.59094 7.26553 -3.69159 4.01914 -8.73797 8.81611 -1.41144 1.82827 -7.83555 8.07567 -6.13821 8.44907 -5.83432 6.48744 -2.93596 4.66271 -7.03215 7.59658 -1.65252 2.45337 -2.91358 4.90129 -8.94415 9.14642 -5.21005 6.1166 -0.33225 1.17039 -7.40089 8.07586 -9.30427 9.40776 -2.34188 2.81124 -1.02811 3.3344 -6.28117 7.62089 -4.80105 7.10049 -8.90252 10.0057 -2.20932 2.33093 -8.20746 10.6268 -4.31887 5.23945 -9.258 9.8985 -3.80742 4.15057 -1.11313 1.23711 -9.53067 9.70165 -7.95467 8.67187 -9.66031 9.83223 -3.61385 4.09571 -0.623148 0.652817 -7.77809 8.62118 -0.86157 1.98606 -3.12528 3.75815 -1.9363 3.22621 -8.23521 8.99175 -8.95406 10.4487 -3.38526 3.90652 -0.34281 2.0226 -0.739384 0.793829 -3.55637 3.96384 -6.1562 7.28647 -5.30211 7.51385 -1.46275 1.78688 --0.0144662 0.868488 -0.0740443 0.119828 -9.26206 9.83923 -0.743397 1.40754 -4.68823 6.62985 -8.8291 9.17373 -4.66711 5.09313 -4.023 4.44994 -5.68937 5.79194 -8.04835 8.06763 -6.94662 8.00075 -0.774686 1.13428 -0.381819 2.34757 -2.1235 2.63524 -5.42795 6.89998 -6.07662 6.29083 -6.47821 6.7872 -2.58305 2.6192 --0.598336 1.23458 -4.29089 5.43332 -8.09914 8.28229 -5.05925 5.35258 -0.181705 0.444466 -3.27849 4.79932 -0.310314 1.43125 -1.13836 2.76825 -1.2529 4.09336 -0.198106 0.608625 -1.77442 2.23777 -6.29823 6.64574 -1.22125 1.37929 -1.77592 3.04011 -1.43999 2.90926 -4.20495 5.32396 -4.98874 5.33211 -8.36483 8.67875 -5.65373 7.14132 -2.8303 3.05037 -3.41509 3.54032 -7.21702 7.85857 -5.79848 5.8913 -4.52711 5.65511 -2.04663 2.66919 -5.76363 6.77903 --0.153046 0.77878 -4.37474 4.49936 -6.86786 7.81999 -8.92084 9.16368 -7.5975 8.56954 -0.197493 1.07503 -3.99803 4.67019 -9.35123 9.60094 -1.46442 2.4256 -5.21501 5.79612 -8.80879 8.99085 --0.109252 1.30631 -7.34965 7.87947 -7.08703 8.12723 -0.985946 2.14663 -0.48521 0.856118 -6.57719 6.70623 -8.71165 8.72286 -3.16883 4.8714 --0.21189 0.412944 -3.6526 4.37121 -0.364649 1.3363 -9.27722 9.35135 -3.47517 3.8793 -5.67149 6.28631 -6.52789 6.61039 -9.36323 10.4189 -4.30743 6.18638 -7.93653 9.4877 -8.24024 8.41475 -2.75692 3.13935 -8.80223 9.1489 -3.42656 3.90557 -8.96598 9.3217 -1.99582 4.84803 -5.1178 5.8688 -4.47901 5.73433 -7.30397 7.85527 -0.18463 0.656832 -7.80806 8.41666 -8.50023 9.42628 -7.67563 8.64756 -9.46783 9.52169 -2.06797 3.3107 -5.08863 5.10167 -0.82146 1.39055 -7.5428 8.04736 -9.09407 10.8208 -9.15219 9.99706 -1.61637 3.46354 -5.3812 5.96247 -9.34115 9.73575 -6.49221 7.30031 -1.56337 3.39704 -8.463 8.60841 --0.322779 0.658242 -8.50173 8.72125 -0.854851 1.83405 -7.81945 8.12841 -2.60724 3.19985 -5.03714 5.55331 -1.85041 3.36816 -7.26119 7.64364 -5.75223 5.99653 -4.00026 4.43863 -5.00939 6.03009 -6.22879 6.6638 -6.44231 7.18622 -1.66002 1.88587 -2.59781 2.84919 -4.96399 5.40545 -5.70327 6.95018 -6.97141 7.08346 -3.98535 4.6179 -5.96795 7.14997 -5.07581 5.8262 -4.65665 4.98851 -8.65646 8.70986 -3.04175 3.19155 -0.796073 1.0952 -8.24859 8.57828 -5.26952 6.34245 -7.94685 8.78542 -0.193963 0.968524 -6.61159 6.80186 -9.37533 9.79195 -8.94048 9.74959 -5.77272 6.48616 -6.0092 7.86718 -2.52621 2.58938 -8.91347 9.22421 -4.20466 5.45909 -4.82157 5.09167 -7.35464 7.36611 -5.12413 6.45063 -2.12404 2.81187 -8.88875 9.20752 -2.59731 3.20587 -1.54772 2.08968 -6.70449 7.08952 --0.0967146 0.888521 -3.10207 4.34815 -1.20807 2.35497 -6.00753 6.08492 -3.21837 4.00446 -4.34095 6.0963 -4.24821 4.79576 -4.49523 6.6669 -1.49483 2.52552 -0.0411497 0.641526 -8.3854 9.20954 -8.12419 8.93702 -0.0201515 1.06914 -1.57617 3.44176 -1.4173 1.76847 -5.42261 6.51539 -6.6744 8.46109 -3.05234 3.59179 -6.49059 7.24618 -7.01989 7.69901 -2.34664 2.90601 -9.17324 9.86754 -5.50919 5.70258 -2.40486 4.6009 -3.74368 4.00093 -6.9211 7.33554 -7.41358 8.7413 -8.78284 9.62033 -2.96753 3.01602 --0.200693 0.535532 -6.4383 6.45049 -8.28835 9.42148 -4.2379 5.35128 -4.68397 5.04593 -5.7185 7.03177 -5.37494 6.43977 -2.99518 4.08138 -7.28064 7.54638 -9.10622 10.4907 -1.23839 1.50915 -6.7823 9.24533 -8.45679 8.62427 -0.106718 0.69304 -2.84119 3.50375 -3.60466 4.51338 -8.04709 8.19023 -3.31632 3.48054 -5.9027 7.46331 --0.621072 1.13003 -8.57167 8.69262 -0.301047 1.42246 -1.24229 2.44616 -0.962706 1.55754 -8.77327 9.55275 -1.77899 2.44335 -0.368575 1.84726 -9.05918 9.07832 -6.61723 7.68015 -8.59899 8.80383 --0.133927 0.20271 -5.69266 5.74809 -0.68202 1.52342 -7.17359 7.91482 -5.74049 7.34297 -7.88371 7.9683 -1.58749 2.26543 -3.96728 4.45988 -5.4354 6.88336 -1.68706 1.6976 -6.56907 7.40696 -0.518151 0.724124 -8.99155 9.36995 -6.00506 7.91529 -5.26967 6.11536 -2.37416 2.50887 -8.47983 9.31509 -2.38155 2.54346 -8.08415 9.65214 -1.00693 3.19203 -1.6523 1.73553 -6.85283 6.9958 -4.11425 4.90193 -1.39597 1.58725 -5.05551 5.19458 -5.89969 6.11394 -5.9148 7.26824 -9.32271 9.93989 -1.62911 2.58215 -5.43399 6.14203 -3.11393 3.58792 -8.57619 9.3788 -2.23349 2.7884 -8.09022 8.54326 -9.7114 9.87076 -5.91086 6.10885 -7.35805 7.57276 -0.650002 0.879866 -3.24977 3.75531 -2.73948 3.41051 -3.08006 4.62772 -3.71868 4.31519 -4.13905 5.78577 -1.77297 3.02983 -5.85931 5.89333 -3.68972 3.93193 -1.43922 2.98425 -6.51534 8.33386 -6.6821 7.50874 -1.2541 2.11722 -5.40634 5.54411 -4.55502 4.60346 -4.32484 4.68497 -3.40711 4.31975 -9.20893 10.0853 -6.12594 6.9009 -0.12664 0.347193 -7.53378 8.82258 -7.79572 8.91645 -2.50098 3.39701 -4.17873 4.97732 -1.05822 2.47032 -3.1012 4.97736 -8.42126 8.74568 -7.83301 8.17843 -9.26618 10.584 -3.02667 3.7128 -8.30654 8.69242 -2.87173 3.43275 -6.59917 7.54843 -7.03447 8.20283 -5.75718 6.40637 -2.62899 4.1855 --0.520148 0.902194 -5.1538 5.61763 -1.25625 2.33142 -4.16336 4.3384 -3.01296 3.41026 -3.16515 3.26305 -2.40944 3.21897 -6.80742 8.57141 -1.15125 1.54824 -8.72251 9.50878 -3.15703 4.04482 -0.470308 0.726093 -0.199979 0.878243 -7.8908 9.17915 -6.91793 7.16038 -4.64783 5.00217 -2.21237 3.03073 -1.5825 1.63362 -3.18806 5.20795 -5.92725 5.95595 -4.65027 5.09868 -6.42204 6.87201 -8.08637 9.40221 -4.95542 6.16185 -7.45987 7.57979 -8.826 9.13961 -4.42078 5.27977 -7.26216 8.97585 -2.26919 3.33512 -9.4077 9.81908 -0.722223 1.03378 --0.0497795 1.19355 -8.22686 9.31082 -0.0733766 0.93037 -7.47883 7.9062 -5.28731 5.74181 -1.78496 3.61348 -0.690987 0.764344 -2.56442 3.54999 -4.27944 5.43124 -4.04412 5.35376 -0.663756 1.88268 -1.73567 1.78553 -8.07666 9.41842 -7.70138 8.42873 -9.27113 9.55873 -0.982413 2.5565 -0.994807 1.02007 -5.01226 5.31923 -8.87435 10.0597 -1.74836 3.22578 -0.151528 0.191719 -5.82608 6.06438 -1.17239 1.59955 -3.18515 4.11049 -1.92258 3.70604 -1.63692 1.8266 -1.83542 2.66228 -2.21954 3.11425 -3.97546 4.3928 -0.731374 2.05705 -5.44809 5.96359 -9.85934 10.0553 -8.42169 9.63654 -6.68148 8.43446 -2.00014 3.3485 -0.735924 1.73 -1.61833 3.05643 -7.87934 8.67316 -8.67441 10.0032 -0.794573 1.2493 -6.11926 6.41441 -5.2715 5.82597 -9.41854 9.46625 -3.46299 4.06742 -5.6487 5.79053 -1.46503 3.43496 -0.9957 1.53939 -2.4714 3.1301 -0.887049 1.6196 -3.04884 3.19662 -1.24337 2.05758 -7.61142 8.55766 -0.998279 1.64425 -4.74917 5.85236 -2.97632 3.94611 -4.11786 5.62709 -7.40498 7.62083 -1.47854 3.64736 -2.1176 2.64511 -4.55533 5.89436 -7.44618 9.79926 --0.410242 0.737348 -5.719 6.30861 -8.33692 8.38222 -8.78122 9.98195 -3.75452 4.26866 -2.23771 2.44985 -6.72455 7.61362 -5.9797 6.58846 -6.72885 7.60315 --0.710302 1.18332 -7.73287 9.383 -6.61213 7.67394 -4.12945 5.68527 --0.300887 0.341615 -5.77978 6.41534 -8.34001 9.96874 -1.62323 1.8283 -1.71788 2.23905 -7.43484 8.0418 -3.47322 3.8047 -3.47311 3.51261 -7.82093 8.86377 -2.46973 2.99125 -7.91166 8.55065 -3.39807 3.43599 -8.94792 10.0437 -7.70859 8.32487 -5.86852 7.13103 -7.64996 9.19033 -6.66742 7.8092 -7.88241 8.58675 -9.42939 10.3479 diff --git a/geom_matching/wasserstein/tests/data/test_5000_B b/geom_matching/wasserstein/tests/data/test_5000_B deleted file mode 100644 index 5f6e43c..0000000 --- a/geom_matching/wasserstein/tests/data/test_5000_B +++ /dev/null @@ -1,5000 +0,0 @@ -1.17434 1.46837 -2.58198 4.16589 -0.234041 0.968658 -1.52703 1.59579 -6.7103 7.44033 -3.19227 4.41539 -5.42556 5.57369 -3.45417 4.86089 -3.82256 4.1092 -7.82551 7.90784 -3.9384 4.71796 -5.60335 5.9054 -7.96663 9.8987 -6.30305 6.64853 -7.33246 10.5316 -0.623312 1.09008 -2.63041 2.64616 -5.36028 6.28956 -4.64202 5.91858 -7.55219 7.96304 -7.73736 9.18221 -1.67114 1.84851 -5.07514 5.12159 -7.03732 7.05228 -7.5006 7.59212 -0.244947 1.55875 -0.0170454 1.10485 -1.95394 3.53669 -5.66015 6.01949 -5.88211 7.64639 -7.46698 9.27085 -6.37429 7.10154 -4.54535 4.81932 -8.21203 9.35896 -4.89933 6.20802 -3.68683 4.17831 -0.477467 0.828394 -6.17871 6.77834 -9.77523 9.92676 -0.854808 2.38709 -7.93326 8.3553 -2.10917 2.27771 -4.07045 4.72793 -8.2016 8.8011 -2.9205 3.95746 -2.89806 4.39725 -5.5654 5.78669 -9.5219 9.98543 -7.08591 7.19588 -8.35359 9.57893 -9.81348 10.0345 -8.5994 9.71835 -5.43903 7.25234 -1.82768 2.92724 -4.44952 6.79754 -5.66747 7.34386 -5.88153 6.39253 -3.34008 4.22032 -2.46068 2.76051 -0.370778 2.61681 -6.02508 6.26809 -4.32654 4.93262 -7.41536 7.99616 -8.84229 9.87911 -3.8551 5.84353 -1.56832 2.34694 -6.96099 7.42028 -8.15753 8.72014 -9.23141 10.3815 -7.4484 7.80228 -0.473671 0.874895 -3.15689 3.50687 -3.58122 4.09945 -3.55022 3.74767 -4.42708 5.80211 -4.40956 4.68699 -3.80576 4.61856 -7.29965 8.28614 -7.40582 8.15308 -1.69789 1.77669 -1.66419 3.44308 -0.473997 0.872506 -7.83959 8.52898 -6.22416 6.36949 --0.187159 0.871822 -0.232336 0.585965 -9.29905 9.44357 -1.4459 2.40589 -2.83008 3.19758 -1.15291 2.12112 -2.58686 3.33896 -6.79362 7.88068 -0.228178 1.48318 -5.60001 6.20258 -4.97803 7.10992 -1.70429 1.962 -2.72659 3.13886 -9.22714 9.25889 -3.84694 3.88778 --0.282077 1.48155 -9.28756 9.58517 -4.34069 5.59751 -8.63909 8.76839 -8.86236 10.7642 -6.77597 8.41888 -7.30621 8.64164 -0.685607 1.22755 -2.91514 3.22638 -2.72098 3.66837 -8.17528 8.32638 -5.19632 5.7506 -7.34177 8.70639 -5.74082 6.35524 -5.95975 6.69284 -9.40187 10.4488 -2.92761 3.36735 -0.399531 3.13082 -4.83399 4.92635 -7.74539 8.56852 -1.76322 3.5086 -6.54479 6.72963 -7.64362 8.12404 -1.35542 1.45313 -0.214385 0.718085 -1.7006 3.21962 -5.91009 6.47862 -2.21093 2.34636 -5.96919 6.79365 -6.59951 8.22203 -1.54571 1.59397 -3.27012 3.79128 -0.32455 0.622995 -1.73926 2.78017 -9.81035 9.84077 -7.38441 7.85171 -8.90372 9.34186 -7.26323 8.41174 -5.7363 5.97348 -8.25473 10.1281 -2.3981 2.52096 -8.53783 9.63442 -8.51755 9.2735 -6.48614 6.773 -3.40182 3.65137 -2.1353 3.04852 -2.95397 3.73285 -6.98063 7.4963 -4.50189 5.26384 -0.21416 1.49363 -0.632196 1.36307 -6.57833 6.60481 -8.0634 9.33903 -2.79759 2.94462 -4.43747 4.58861 -6.48733 6.86569 -2.28008 3.47037 -6.87452 7.77431 --0.156821 2.71557 -0.72595 1.78862 -1.97586 2.38196 -8.61839 9.1468 -4.55496 5.68986 -0.26923 1.15728 -9.63757 9.7236 -1.39497 1.96698 -4.8643 5.04172 -6.64675 7.66435 -2.56256 2.6015 --0.381989 0.611211 -0.676336 1.26896 -8.95304 9.03243 -5.62058 6.07997 -3.36522 4.04276 -8.64868 10.5024 -4.75813 5.19834 -1.96608 2.05864 -9.01449 9.10397 -3.72786 4.51921 -5.6938 6.96584 -1.73499 2.9314 -2.73099 3.41409 -8.77171 9.07665 -4.63865 4.67649 -8.6698 9.30782 --0.168259 2.09581 -9.29672 9.56 -0.372544 2.60567 -0.450487 1.32919 -6.95341 7.6399 -3.4403 5.24993 -5.53469 6.97831 --0.79664 1.21306 -5.68831 6.14413 -8.85601 8.95444 -3.83309 5.211 -5.51573 6.5114 -3.64009 3.99648 -4.40759 4.99283 -1.85198 2.6457 -2.72645 3.74803 -2.04751 3.00998 -3.19365 3.9383 -8.09529 9.45596 -8.88173 9.5618 -0.609816 2.67806 -1.57288 2.60884 -1.68354 1.80124 -4.92058 5.9959 -1.48728 1.84885 -0.299669 0.413905 -9.02156 9.56731 -7.50854 8.49023 -0.667131 1.89987 -2.22472 2.58793 -5.84395 8.79426 -2.35839 2.66935 -3.43111 3.69982 -6.71023 7.36801 -6.75697 9.0991 -2.35352 2.85316 -6.73054 7.39006 -9.48673 10.1493 -6.71226 6.72805 -9.22083 9.71889 -8.36513 9.33921 -0.0652672 0.319993 -3.26467 4.60881 -7.62269 7.79878 -6.48608 6.69515 -6.21737 6.88645 -6.56094 6.9699 -1.61317 2.7167 -5.08621 6.29754 -2.24676 2.8076 -3.09943 3.93921 -9.74093 10.0968 -0.417699 1.6381 -9.2958 10.2973 -3.6663 4.1369 -0.0229943 0.448065 -9.2928 10.1833 -3.66334 4.22032 -0.812172 2.19952 -7.88025 8.71192 -8.69379 9.34922 -1.70691 2.95352 -8.28737 8.29985 -5.22491 5.354 -4.03526 4.14084 -6.49359 7.05924 -0.24853 1.44718 -7.86936 8.75135 -5.76 6.68919 -5.85437 6.14314 -5.86292 6.0516 -2.35692 2.91295 -0.0990674 1.29386 -2.9911 3.56188 -0.552671 0.638929 -5.80756 6.22761 -1.21067 1.77175 -4.51882 4.72936 -1.99969 2.89732 -3.65968 6.61987 -0.478582 1.33355 -0.259061 0.289813 -3.89264 5.02474 -0.349236 0.438003 -7.70442 8.1729 -7.90389 10.1876 -3.06898 3.15219 -4.77811 5.29095 -9.76561 9.89451 -4.14295 4.2489 -0.540224 2.28623 -9.60749 10.2284 -8.49555 9.00307 -7.89668 9.76886 -4.12631 4.70897 -7.87898 7.91814 -9.29858 9.52908 -9.24009 9.91544 -3.73498 4.70275 -5.44467 5.9274 -2.13453 4.85697 -2.29607 2.88771 -0.807842 1.82319 -0.319005 2.08473 -1.62 1.63649 -2.20431 3.23869 -2.00132 2.77136 -6.64752 6.71706 -8.12249 8.28379 -7.55541 7.7813 -3.51763 3.64484 -9.21075 10.2811 -2.24501 2.54426 -5.64566 6.46452 -6.72307 8.56698 -3.91728 4.60262 -4.02535 4.29548 -3.0499 3.53135 -1.30677 2.32194 -9.36908 9.90669 -3.92387 4.33848 -2.87312 3.08243 -4.49167 5.2749 -5.43143 6.74905 -6.94595 9.16539 -1.9784 2.00429 -9.42478 10.2226 -3.7185 3.96576 -9.37729 9.50574 -5.34283 6.89736 -4.95341 5.84626 -2.91654 4.28413 -8.26544 9.3076 -6.23114 7.20273 -1.02585 2.21446 -1.6718 2.29591 -2.28926 2.73452 --0.648145 1.105 -1.44194 2.18562 -6.78584 8.37985 -2.00402 2.08248 -1.64076 2.04067 -0.0419044 0.455962 -5.51723 5.72098 -5.42117 6.81165 -5.70331 5.81707 -4.97889 5.60741 -3.38797 4.46846 -7.20995 7.66784 -3.45388 4.23386 -3.11057 4.35995 -3.29476 4.04676 -2.0519 2.94719 -5.37101 5.38271 -5.99383 6.64188 -7.48444 7.6377 -2.15043 3.05399 -1.54093 1.83799 -5.59223 5.87222 -5.8005 6.08042 -6.1208 7.22563 -1.2938 2.17454 -4.92405 5.0402 -6.91336 7.79688 -1.47978 1.99762 -9.00494 10.8315 -5.84805 6.15303 -4.95368 5.49096 -8.21704 8.31192 -0.715222 2.33517 -0.904183 2.54741 -3.42349 3.74906 -0.627978 2.37092 -8.41477 8.72651 -3.55373 5.58652 -4.12685 4.61533 -0.775274 1.41263 -4.78915 5.08639 -6.35791 8.15015 -2.88242 3.63509 -2.78526 3.07834 -0.39129 1.15933 -3.26615 4.74531 -8.78873 9.8888 -7.25612 7.45972 -4.97452 5.30012 -0.757255 1.35518 -1.29516 2.52446 -4.66838 4.96648 --0.0720209 0.832726 -2.68276 3.21123 -8.44253 10.0311 -3.40809 4.70506 -1.09617 2.35452 -5.19302 6.73599 -1.25316 1.58101 -6.2056 7.10099 -7.7666 8.52777 -0.301239 1.37275 -0.522829 0.731575 -6.73869 6.96826 -2.41703 3.20567 -4.94617 6.22052 -5.41524 7.68272 -6.0408 6.29938 -0.0642067 0.600878 -6.32122 6.63505 -3.25427 4.70611 -5.88704 6.1678 -8.71533 9.08476 -6.25575 6.88392 -1.54462 1.56366 -3.95938 4.03326 -2.54671 3.66798 -8.48603 9.10156 -3.37369 4.65454 -5.25469 5.64636 -7.02624 7.36449 -8.17061 8.44321 -9.23147 10.1149 -1.45589 2.25886 -6.47702 8.25307 -7.69088 7.91753 -0.442832 0.616926 -8.35355 8.83222 -7.65142 9.58906 -4.04877 5.17345 -0.76012 1.8686 -6.54877 7.40058 -7.41774 7.65429 -8.69655 9.3325 -4.8302 6.25306 -1.77203 1.90284 -3.67485 4.94569 -6.60162 6.72031 -3.05924 3.35235 -0.0823162 1.3486 -8.42991 8.86331 -6.81596 6.83527 --0.0174808 1.6745 --0.758131 1.08928 -4.14423 5.46342 -9.26253 9.85714 -7.42749 8.58214 -4.88849 5.86936 -8.99339 9.38141 -8.85301 9.18285 -2.64303 3.45658 -7.1133 8.66473 -3.50745 3.8629 -7.81615 7.83244 -2.94991 3.8741 -7.91822 8.8362 --0.0553088 1.19059 -7.35558 7.77948 -2.11257 2.20563 -8.57533 9.16338 -2.3515 3.13009 -4.13239 5.38696 -2.20763 2.93941 -7.2451 7.3211 -0.834388 1.57413 -4.47024 6.17855 -4.75947 6.80913 -2.99607 3.54732 -8.15998 8.80718 -8.94688 9.27971 -4.46335 4.9522 -5.30725 5.69786 -7.63989 7.86974 -6.69589 7.69565 -5.34018 6.08115 -8.59515 9.62264 -1.80557 3.22507 -8.62429 8.94242 -1.34532 1.95042 -8.60707 8.80741 -8.03275 9.40327 -4.30357 4.39095 -8.97954 10.7076 -2.18143 3.51825 -3.98695 5.62062 -2.48813 2.60622 -5.56957 6.43776 -5.18249 5.55459 -3.45373 3.64101 --0.00345662 0.570597 -3.61127 4.69761 -9.37858 10.6205 -7.24635 8.19639 -4.70142 4.80735 -3.30055 5.14257 -0.860415 1.31635 -4.72924 5.46893 -7.47391 7.72644 -6.22287 6.57754 -0.181652 1.01366 -2.14494 2.80736 -2.16406 3.19383 -8.52991 9.22722 -8.74411 9.06935 -0.575831 1.02699 -2.47315 3.0331 -4.2872 4.59813 -5.82293 7.03604 -2.08982 2.25319 -7.3626 8.41994 -1.23867 3.10885 -7.397 7.78026 -6.78837 7.32977 -0.829368 1.56617 -9.23075 9.35172 -6.76562 7.23578 -0.42851 0.839401 -4.83626 5.5852 -0.150032 2.45322 -2.16811 2.47439 -5.60245 5.81188 -7.43707 7.46519 -0.167317 1.44642 -4.9732 7.58343 -8.67391 10.2957 -0.318592 0.639284 -3.365 4.25929 -7.83683 8.88895 -5.20557 5.30114 -0.940347 1.74022 -5.39149 7.13464 -1.10826 1.27913 -1.9147 2.31276 -0.935283 2.49181 -3.67898 4.33336 -5.10125 6.07734 -0.348807 0.839242 -0.310986 0.58381 -2.03594 2.43119 -5.49755 5.94215 -1.94885 3.34409 -9.66806 9.97883 -4.79099 5.45155 -4.81158 5.30001 -5.17667 5.90019 -9.64168 9.99177 -1.14899 1.22792 -0.466236 0.952985 -6.93679 7.72282 -2.97285 3.23931 -9.22517 9.24315 -7.25783 7.46414 -4.37304 4.51815 -4.01069 4.02979 -0.843132 1.80443 -4.78572 6.04237 -6.02471 6.38074 -4.99536 7.76852 -4.97442 5.17384 -0.731231 1.49497 -2.2797 2.90845 -9.13211 10.341 -4.19545 5.08597 -6.13127 7.09817 -2.65124 5.02208 -5.40235 7.12912 -6.86258 6.91991 -8.24317 8.55273 -7.6877 7.69875 -3.33922 3.53776 -0.089484 0.40755 -1.34909 1.68726 -8.43113 8.72899 -4.90038 5.55994 -0.308089 0.490555 -5.42628 7.1433 -2.11647 2.56987 -3.56934 4.1619 -8.35794 9.24416 -8.8645 9.69151 -5.10701 6.0036 -7.66385 7.8412 -2.89952 4.55221 -6.01533 6.38269 --0.945182 1.07304 -1.79537 1.85576 --0.0313338 0.501067 -8.85689 8.87522 -1.61143 1.7773 -9.53229 9.84943 -3.51669 3.81091 --0.448016 1.10903 -3.16889 3.439 -4.30534 4.36372 -6.20158 8.09618 -2.20949 5.23616 -3.29459 4.17079 -3.90101 4.05611 -5.89688 6.85702 -0.734474 1.04471 -7.84341 8.02702 -8.69431 10.1086 -9.73194 9.92195 -7.63516 7.70631 -8.51416 9.33072 --0.0712911 0.361001 -2.76979 3.22708 -5.34404 7.5165 -5.64429 5.79865 -0.0755012 0.363483 -5.05631 7.27153 --0.60164 1.09659 -0.457228 0.876186 -4.27092 5.38033 -8.63891 9.04134 -6.29608 7.04242 -8.97795 9.93013 -5.00385 5.57737 -8.48068 9.44885 -7.35543 7.78492 -3.55698 4.01035 --0.268117 0.649128 -0.633184 0.66254 -4.54216 4.81132 -6.15574 6.35276 -4.3663 6.36286 -1.45231 2.07039 -7.37031 7.9157 -5.30961 6.3506 -5.80757 5.81762 -4.91767 4.97519 -3.45667 3.60965 -1.7934 2.3807 -4.33289 5.41047 -1.16021 1.29979 -3.75172 4.53521 -3.10835 3.1275 -2.68167 3.00314 -4.10639 4.24094 -4.90776 5.74069 -7.30861 7.86666 -3.52822 3.70998 -5.22222 5.28033 -0.00866476 0.326377 -7.73247 8.61481 -4.25231 4.77499 -8.41148 8.54604 -2.95389 3.63497 -7.76126 9.69124 -6.41218 6.69682 -4.86285 6.44503 -1.84783 1.9065 -4.08788 4.11706 -9.17473 9.50133 -5.15091 5.78649 -1.27694 3.33579 -2.92648 3.37855 -9.37392 10.5123 -4.81878 6.34991 -8.38702 8.83716 -5.07771 6.33618 -1.47438 1.75588 -6.20935 7.11166 -1.08286 1.38 -1.40048 2.0157 -6.60355 7.26234 -5.28396 5.90003 -8.9525 9.59216 --0.0305792 0.544664 --0.571491 0.735471 -6.287 7.03679 -5.35225 5.4104 -0.095812 0.605976 -4.33523 4.4048 -6.13288 6.80949 -4.14654 5.5505 --0.213214 0.260592 -7.56188 7.83088 -7.8132 8.65963 -8.02469 9.3254 -0.00641711 0.420562 -7.49269 8.15849 -9.26359 9.4366 -5.74008 7.86317 -8.62729 9.78825 -4.28946 6.20553 -3.19174 4.54991 -4.16992 4.25203 -2.46138 4.11583 -1.92971 2.16701 -3.43028 3.80842 -6.98297 7.28388 -7.51884 7.55947 -7.79102 9.44326 -0.416342 1.32311 -9.35398 9.85201 -8.72997 9.10384 -6.23398 6.88888 -7.46984 7.4875 -5.92603 6.66938 -1.77761 2.58697 -0.835966 2.06139 -9.63284 10.3565 -6.13677 6.42768 -0.151375 0.382404 -8.10315 8.13441 -5.52283 6.28113 -1.00873 2.44226 -2.5239 3.89871 -5.40599 6.72653 -3.43407 4.0068 -1.22444 1.26601 -7.04395 7.80599 -3.75987 3.77123 -6.43597 7.06249 -8.34435 8.87418 -8.25853 9.04009 -0.415321 2.32725 -0.639046 1.75525 -7.83226 8.12538 -9.55429 10.2734 -3.658 4.35867 -1.8588 3.93292 -7.38922 8.16823 -8.53626 9.23024 -0.848152 1.13412 -6.31667 7.2348 -3.81584 4.62621 -9.24748 10.7408 -2.75953 2.95288 -5.70188 6.62278 -4.22202 4.45368 -3.24616 3.88779 -1.05053 2.09846 -8.67718 9.52693 -2.14107 2.71959 -1.10518 2.69689 -5.01476 5.54139 -4.69244 5.20358 -8.88285 9.93012 -2.55228 2.77382 -6.72118 7.50057 -7.58999 8.71573 -1.83763 2.13481 -4.86135 5.27995 -4.39794 5.42117 -1.42512 2.98262 -4.80489 5.34701 -2.7993 5.13702 -7.52122 8.41729 -9.08613 9.37543 -1.1555 1.3935 -7.34071 8.0428 -8.33361 8.40349 -2.514 2.54741 -8.25732 8.41758 -1.65337 2.57964 -4.20527 5.06565 -0.723443 1.06987 -5.85836 6.64701 -7.908 8.07591 -5.01839 7.0105 -3.15908 5.10364 -4.3574 6.67192 -2.06662 2.46437 -7.5595 8.9108 -7.94919 9.20231 -4.11889 5.49714 -7.28151 7.51881 -1.30685 2.09479 -3.08479 4.47364 -4.50916 5.91511 -7.31605 7.63868 -3.14469 4.07035 -8.38431 8.87993 -7.42277 7.64967 -4.22472 4.26323 -8.49871 8.90746 -7.44431 8.09014 -8.35213 8.7504 -3.85634 4.37584 -9.12975 9.77042 --0.326056 1.17374 -3.53802 4.06211 -6.81775 6.8467 -8.19106 8.64489 -4.20526 5.37727 -2.74081 3.72143 -0.49642 1.10775 -7.76606 8.00524 -4.79825 6.38926 -1.99478 3.20484 -4.69853 6.29508 -5.73058 7.18643 -8.11708 8.64257 -9.62375 9.84838 -5.95271 6.38989 -9.0193 9.93848 -3.91188 4.10834 -6.065 6.60546 -2.62354 3.60072 -8.53665 9.06824 -6.40691 7.44693 -1.62959 2.5825 -9.4128 9.87031 -6.24697 6.62684 -3.31136 3.45626 -4.80347 4.9935 -9.21711 9.53416 --0.491547 1.72886 -4.75174 4.87217 -0.86329 1.53331 -2.4586 4.2578 -5.10301 6.2815 -5.08302 5.86788 -6.12434 6.78948 -9.68323 10.0973 -3.52576 4.40424 -4.9925 6.89084 -0.846638 1.80782 -1.09709 1.7685 -8.38592 9.03312 -9.56243 10.2682 -5.03592 6.6429 -7.8609 8.04599 -1.21404 1.31975 -7.47824 9.2063 -1.47849 2.68795 -1.2909 2.06381 -5.21288 5.54616 -6.27218 6.99345 -4.77622 5.08494 -3.30665 4.14735 -3.38947 3.55545 -7.71197 8.53162 -1.10565 1.50806 -0.7889 0.984689 -2.88598 3.33244 -5.70958 5.81232 -5.16567 6.24511 -6.91255 7.25784 --0.401084 0.753156 -4.81138 6.20671 -1.67301 3.58501 -7.19478 8.25624 -1.24428 2.2523 -4.31631 5.33357 -0.589196 1.02017 -5.69207 6.97803 -2.3854 3.25501 -4.1362 4.91135 -8.9932 10.3184 -7.95871 8.45158 -4.03213 5.26347 -3.09506 4.06425 --0.0310321 0.738171 -7.35733 7.61512 -2.48488 2.96253 -4.72098 5.69867 -5.5395 5.96914 -3.17854 4.283 -6.50012 7.33744 -1.93266 3.00941 -1.49319 2.71826 -9.0187 9.13099 -7.15259 7.40691 -8.71939 8.93257 -1.57203 3.11249 -0.933429 2.16903 -2.99663 3.71667 -2.06144 2.81311 -7.9072 8.2103 -0.490069 0.614737 -7.84111 9.70812 -1.15363 1.6421 -1.15475 1.43307 -8.2228 9.92116 -7.76825 8.40724 -6.15122 7.31322 -7.1427 7.49294 -2.30516 2.7019 -2.03336 4.03387 -8.3918 9.85707 -8.57214 9.59345 -3.8057 4.1119 -8.9223 9.38556 -9.32051 9.60504 -7.13349 7.69154 -1.71855 2.00425 -5.10333 6.0605 --0.149137 0.80973 -0.466224 3.1698 -4.19165 4.29604 -1.64018 2.3161 -9.40397 9.89211 -5.21738 7.06323 -0.525526 1.0331 -8.06992 8.08704 -9.81539 10.0915 -9.33514 9.50521 -5.95494 6.54519 -9.21466 9.35909 -4.96603 5.18164 -3.89238 5.53056 -5.04546 6.32916 -8.63758 8.65805 -7.03226 7.57074 -0.32029 1.10893 -0.194176 0.992252 -8.79061 9.50848 -0.239137 0.300717 -7.7234 8.43747 -3.43679 4.28954 -8.31382 9.18928 -1.39612 1.67253 -6.95733 7.39846 -1.29129 2.12185 -7.93611 10.2305 -3.67764 4.17562 -1.38149 2.42407 -2.2847 2.48412 -9.28655 10.0661 -2.94115 3.21326 -7.04238 7.91536 -5.06012 5.61526 -8.95611 9.91736 -2.18524 3.44007 -1.0692 1.10987 -4.37019 5.18443 -5.82014 6.441 -1.68642 1.70458 -4.93783 4.9535 -9.42003 10.1196 --0.356795 1.30987 -1.37778 2.80527 -9.54126 10.1758 -8.67413 10.5984 -0.914291 2.0697 -6.08696 7.09832 -2.82202 3.31103 -4.07818 5.50195 -2.85223 3.67449 -6.03006 7.10863 -8.84655 10.528 -5.08031 6.2001 -1.00272 2.74191 -0.169102 0.223253 -0.025089 1.26534 --0.203339 0.64667 -0.899666 1.48885 -0.74235 1.49976 -6.28212 6.80412 -5.65159 5.93106 -2.1686 2.7445 -5.02936 5.43091 -8.07124 8.80499 -8.65696 8.95802 -7.68394 8.365 -8.65062 8.69146 -0.058248 1.19535 -5.74545 5.84057 -6.05244 6.52152 -9.3878 10.3328 -7.71379 8.88044 -3.32961 4.54105 -8.51987 8.62854 -4.10821 4.16902 -9.47639 9.78723 -4.72417 4.84793 -2.32867 2.94068 -9.52275 9.57815 -5.32867 6.96127 -4.32462 5.1508 -4.46919 6.45961 -8.62661 10.9533 -0.0244049 0.56156 -1.49207 1.73164 -7.03156 7.81168 -5.88587 5.89732 -8.43632 9.65085 -7.52612 8.06726 -4.82464 5.6193 -3.8062 3.90356 -2.42708 2.51646 -2.06458 2.45877 -0.427218 2.24283 -7.42616 8.11513 -0.617708 1.01833 -8.74218 9.03592 --0.213346 0.599112 -9.05291 9.59124 -5.20365 5.54277 -2.85289 3.99509 -3.08468 4.58456 -0.136826 0.685254 -3.87191 3.99021 -0.970836 1.49673 -2.44355 2.53584 -8.88615 9.94545 -3.90591 4.52798 -1.52518 2.50658 -7.21268 9.07745 -0.767314 1.23833 -8.62975 9.42367 -6.71524 7.67686 -7.61205 8.48292 -5.312 5.65087 -4.75627 5.96261 -7.90674 8.0753 -7.37887 7.71478 -3.74483 5.52984 -2.7187 2.85544 -4.7902 5.62159 -2.89671 5.19815 -7.37268 8.72506 -7.11916 8.28301 -9.19814 9.75279 -1.2085 2.60113 --0.632009 0.889734 -7.99858 8.39743 -6.48346 7.10822 -6.30616 7.06648 -5.56514 6.51183 -2.41505 3.56224 -6.83749 8.84447 -9.05111 9.46906 -7.77476 8.4091 -6.11378 6.31232 -4.42882 5.69917 -5.88107 8.052 -3.75437 4.08893 -2.70487 2.77664 -7.26028 9.77257 -1.44621 2.73267 -2.0384 2.60397 -2.95402 3.68949 -6.04766 6.4054 -0.716046 1.77698 -1.5084 1.72988 -2.58426 2.80376 -8.05255 8.59793 -6.06336 6.20709 -3.29813 4.31473 -2.53477 4.92554 -8.78711 9.88634 -9.26627 9.82082 -6.70683 6.81257 -8.25978 8.99788 -7.28054 7.64237 -5.14556 5.20711 -4.20431 5.87866 -8.96592 9.97597 -4.06216 4.41519 -8.49174 11.0491 -5.24547 6.03094 -4.65885 5.95835 -5.09606 6.34846 -6.30463 6.65933 -6.48022 9.56168 -1.38088 2.98143 -0.486911 1.16767 -8.16327 9.34821 -0.768885 0.782616 -4.51699 6.08086 -9.55086 9.70242 -2.86802 3.72489 -1.88496 2.18749 -4.31876 4.33726 -8.38871 9.45631 -8.80634 9.36198 -5.232 6.42399 -9.86919 10.0492 -3.61902 4.53086 -3.13118 4.42364 -2.69395 3.1816 --0.303144 1.32309 -4.28871 4.36739 -3.8631 4.08745 -4.9291 4.98968 -7.14273 7.25505 -2.56623 2.59122 -6.01753 7.72265 -6.76051 7.53954 -6.76933 8.14741 -0.933137 1.83537 -7.9357 8.57904 -5.55847 5.59984 -4.25563 4.3345 -4.28087 5.21348 -8.88534 9.06554 -1.88575 2.94002 -5.26613 6.04562 -0.514249 1.45538 -0.130644 0.501645 -4.30564 4.86337 -1.57246 2.38451 -0.303814 1.77474 -4.22675 5.02783 -6.75381 6.78634 -5.64096 5.9725 -6.76159 6.98142 -2.35569 2.39119 -3.29794 4.95962 -6.55055 7.03366 -5.31474 5.69404 -9.01335 9.16988 -8.58306 9.37831 -7.06522 7.07778 -1.14695 1.74744 -3.15507 3.22865 -5.5925 7.14168 -2.14679 3.68767 -7.54789 9.71878 -1.5667 2.08742 --0.604726 1.66718 -0.306012 0.54799 -2.61731 5.08257 -0.80957 1.74655 -8.22035 8.81637 -4.401 5.449 -8.89389 9.01988 -4.80574 4.9322 -2.19895 2.88565 -9.06688 10.8095 -1.23727 1.58699 -7.14836 7.92057 -4.65155 6.15149 -0.563061 2.16535 -7.66764 8.0341 -8.32324 8.42774 -4.54541 5.11069 -8.0237 8.09992 -7.26113 8.09404 -2.55196 3.20317 -8.1236 8.60951 -1.90437 3.23006 -0.888133 2.50365 -1.13618 1.69444 -2.60463 3.01696 -7.2311 7.73229 -5.06501 6.01487 -3.9893 4.10116 -1.45278 1.56937 -2.74601 3.80778 -9.40705 10.3843 -3.02533 3.52213 -8.7097 9.2268 -8.73145 10.5552 -2.56059 3.5742 -6.27328 7.57089 -3.23291 3.30811 -6.33804 7.20304 -7.63648 8.34564 -9.82053 9.93597 -3.14924 4.58629 -5.28253 6.33733 -1.99411 2.04104 -0.305593 0.420302 -5.39668 6.64188 -7.99992 9.37823 -5.25169 5.65987 -0.109291 0.875734 -3.08589 5.50296 -6.51358 6.62588 -5.34687 5.58204 -0.043587 0.932787 --0.0264143 0.28677 -8.09722 8.37087 -5.46612 6.30285 -2.89146 3.49892 -6.73278 7.11762 -5.03068 5.90176 -1.7459 2.87727 -0.207707 0.448933 -7.00453 7.63105 -6.02789 7.87991 -8.1917 8.95854 -7.49014 8.73215 -8.48402 9.22063 -1.0467 2.4687 -0.241901 1.38802 -2.65867 2.81258 -5.46725 6.59448 -3.40578 3.75607 -4.2495 4.26392 -5.6608 6.213 -2.99705 3.88852 -6.17231 6.72018 --0.17415 0.492739 -4.89596 6.49895 -4.68876 6.60218 --0.0510568 1.46013 -8.87099 9.28179 -3.98894 4.5838 --0.20015 1.59214 -8.80756 9.51828 -7.74921 8.53538 --0.380041 0.440574 -2.69409 3.91466 -2.42747 4.56745 -6.25881 7.75647 -7.2941 7.77193 -2.60806 2.90251 -0.325028 1.22219 -8.29921 9.01416 -3.85524 5.45451 -5.2612 5.71877 -2.92849 3.73937 -8.6242 8.70808 -7.28153 7.35797 -1.65378 2.87917 -3.46034 4.24143 -3.99989 4.3199 -1.15266 3.60328 -4.8464 6.4887 -4.67021 4.68421 -6.96861 7.31554 -0.00723008 0.817047 -7.59589 8.88352 -5.56725 6.08465 -9.02409 9.19527 -5.81681 6.74193 -1.98221 2.98678 -8.76392 10.7646 -4.3903 4.50531 -1.0186 2.01838 -2.66674 2.74505 -2.41105 3.44579 -8.98295 9.18995 -8.14385 8.98779 -2.69613 3.60144 -0.445704 1.51319 --0.634889 0.860409 -6.32737 7.10112 -7.88824 8.06838 -3.76271 4.43529 -7.66487 9.30221 -8.73974 9.59191 -3.08965 3.43006 -8.9518 9.96154 -0.727194 1.55228 -6.35214 7.12234 -2.71987 3.22996 -7.12786 7.4379 --0.346107 0.837469 -8.47103 9.05987 -9.15744 10.628 -8.3237 10.093 -1.15052 1.16223 -6.95959 7.35423 -7.69488 8.44145 -4.21694 5.65913 -3.10562 3.37534 -9.73437 9.78252 -5.0458 5.53479 -7.80485 8.5163 -2.0442 3.75748 --0.459177 0.498702 -7.38032 8.32195 -0.909659 2.11175 -7.08657 7.56877 -1.84997 3.10206 -4.2517 4.53819 -6.71655 7.04117 -1.06604 1.29153 -2.69273 3.31633 -2.19732 2.84826 --0.723032 0.774865 --0.289734 1.44645 -5.87194 7.71917 -1.01576 2.83685 -0.981927 0.998558 -3.07172 3.73201 --0.112577 1.12642 -3.54063 3.67007 -7.21571 8.53815 -0.109957 0.839052 -6.86046 7.17211 -9.40878 9.69478 -0.989391 1.69046 -8.22287 8.8147 -1.48203 2.83308 -5.86418 8.0993 -0.749797 1.09852 -1.82996 2.50847 -0.28178 0.496017 -2.60694 3.00872 -8.6254 10.1698 -6.11641 6.41537 -7.19529 7.21342 -1.8214 2.17517 -0.991201 1.3788 -2.84924 3.12362 -5.75821 7.13843 -6.7106 7.35932 -6.6055 6.6829 -7.97105 8.58613 -1.56087 1.95845 -6.36782 7.10926 -2.43382 2.74699 -7.40509 8.8029 -8.42459 8.63142 -6.26128 7.55043 -4.6465 5.4431 -2.93214 3.29517 -0.157602 0.545214 -6.05931 6.72188 -1.7908 3.11731 -2.39217 3.58736 -7.07421 7.43852 -8.13419 9.74991 -9.53094 9.65319 -2.35726 3.68679 --0.108561 0.874853 -6.87136 8.84157 -3.40803 4.58835 -7.50448 7.89932 -4.29762 5.53867 -0.863755 2.30032 -7.24847 7.95342 -2.89618 2.98849 --0.928261 1.61922 -0.974105 2.91262 -6.99271 7.25856 -3.60995 5.01832 -1.26865 1.79704 -9.62217 9.80719 -1.02656 1.35514 -7.16502 7.32934 -3.12092 3.28857 -2.81374 3.84317 -8.73626 10.7585 -3.36982 3.61446 -5.08437 5.78949 -2.90218 3.0862 -9.2309 10.2523 -5.0967 5.48926 -9.73088 9.92708 -1.54013 2.78301 -6.73707 10.0789 -6.41735 6.838 -2.57935 3.04287 -5.719 6.70352 -5.42474 5.62732 -4.23904 4.69787 -4.16528 4.28736 -7.73477 8.84143 -4.90346 5.87324 -5.1969 6.14087 -3.48793 4.14182 -0.648493 1.07987 -6.88101 6.97932 -7.67342 8.74418 -5.16759 6.3871 -9.16292 9.49569 -8.77422 10.4817 --0.358149 1.04178 -9.54616 10.3424 -3.12027 4.26504 -3.81223 4.73004 -1.2386 3.32247 -8.21963 8.42629 -9.10312 9.51016 -6.96107 7.43045 -2.98587 3.12365 -0.198165 0.211424 -5.19716 6.10856 -6.10553 6.3327 -3.98176 5.11099 -1.02512 1.04242 -4.27949 5.71947 --0.457956 0.538807 -7.99877 9.48581 -5.88782 7.73303 -1.21496 2.85825 -8.46962 8.7862 -9.50182 10.1527 -5.85223 7.76234 -2.48368 2.52439 -2.35426 2.77405 -0.397056 0.482679 -0.160423 1.15786 -4.47109 4.8633 -4.74523 5.84196 -5.39177 5.75218 -9.00754 10.3249 -3.74813 4.03273 -3.08633 4.08426 -4.62672 5.29012 -1.92055 3.01442 -3.79279 4.5603 -9.52431 9.68334 -2.8126 3.32592 --0.313688 0.490785 -9.06695 9.36835 -2.60321 4.14185 -4.40231 4.99535 -9.32205 10.1041 -5.3879 5.44349 -0.308728 1.0956 -9.05758 9.08283 -1.90313 2.50914 -7.1391 7.59459 -7.47357 7.95993 -1.25267 2.34827 -3.33222 4.36522 -8.78126 9.38611 -0.635979 1.62283 -8.3492 8.57545 --0.572557 1.60517 -8.28855 9.03937 -3.47934 3.90271 -4.64498 5.43501 -0.872177 2.62011 -7.3893 7.58876 -2.14063 2.88063 -1.69361 1.75261 -4.19727 4.86483 -0.814676 1.27639 -8.19899 8.58203 -8.3394 8.99896 -9.31768 10.1694 -4.99218 5.19949 -4.2459 4.75266 -9.6314 9.64249 -4.038 4.75708 -7.92398 8.8579 -4.30747 4.54161 -7.51776 7.78258 -3.77611 5.1385 -3.53275 3.90278 -1.78619 2.12474 -3.18736 3.55159 -8.36759 8.52587 -5.52526 5.7843 -7.64174 8.09773 -4.37925 5.85699 -3.94295 5.31298 --0.464623 0.795523 -7.02408 7.7048 -0.0690458 1.0008 -1.05445 1.32797 -0.126093 0.712612 --0.809973 1.33869 -3.45568 3.96532 -0.433875 1.78679 -8.94667 9.65034 -1.98575 2.76936 -6.47974 7.67912 -2.74186 3.34153 -7.82655 9.32112 -4.71441 6.14932 -0.741177 1.76987 -8.05021 8.23239 -0.818503 0.882959 -7.13341 7.43399 -8.45939 8.93395 -4.44558 5.70161 -3.05657 3.86962 -8.75469 8.85537 -1.0922 2.23475 -6.00278 7.51598 -0.0530968 0.582206 -4.01788 5.48223 -1.30808 2.81869 -8.18848 8.59771 -2.43691 2.80685 -8.54045 10.6178 -7.58523 7.91634 -6.70183 7.49962 -5.81501 7.29783 -0.661853 1.58021 -6.50997 7.20411 -0.334292 1.40252 --0.329585 0.742961 -2.38756 2.48935 -2.78114 3.58788 -7.97227 8.55379 -3.36753 4.57472 -5.14486 5.31457 -3.99691 5.47708 -6.36404 6.8741 -3.22519 4.63321 -1.80583 2.21824 -8.20747 9.42947 -5.90819 6.94368 -6.58559 6.85933 -2.99108 4.03832 -7.20963 9.6252 -3.10244 3.87265 -7.23018 7.91389 -7.18084 9.61063 -6.74145 6.86507 -8.40721 9.5751 -7.12352 9.45614 -2.06653 2.51786 -4.9155 5.04183 -1.34304 2.92777 -0.571315 1.17285 -8.05396 8.28214 -5.29142 6.24974 -8.93797 9.23051 -4.6108 5.45568 -6.46124 7.53124 -3.16695 4.37505 -2.76803 2.82764 -4.1531 4.84927 -8.19433 9.00383 -5.12114 6.22952 -2.2542 4.74849 -0.621192 0.871537 -1.37403 2.28895 -0.305704 1.3287 -8.70471 9.53085 -2.29164 3.56607 -2.42106 3.37382 -1.14309 2.03085 -9.17624 10.3281 -1.88864 2.70161 -0.932647 1.2473 -5.72385 6.55694 -5.25496 5.38675 -5.85771 6.69626 -7.37247 7.93094 -7.73499 7.98782 -4.91417 5.27506 -3.51127 3.84403 -6.96198 7.27686 -6.51176 7.74735 -4.19954 5.08222 -1.58115 1.83842 -2.11889 2.3408 -1.94427 2.00422 -5.59977 6.86555 -9.46942 10.3491 -9.18904 10.1988 -1.71938 3.01547 -4.3515 5.4951 -2.53792 5.85188 -0.3884 1.36228 -5.02469 5.62368 -6.82402 7.72203 --0.320478 0.821539 -0.0885656 0.248783 -3.01725 3.44385 -6.63776 7.74386 -6.57899 7.9332 -4.82656 5.18327 -3.91909 4.43955 -0.0708319 0.101395 -2.59796 4.22775 --0.433109 1.26978 --0.434274 0.624336 -3.22018 4.25282 -4.63351 4.776 -8.889 9.56332 -5.35952 5.46531 -8.73832 9.22756 -2.03432 2.34194 -0.477994 1.43353 -1.2029 2.86844 -5.09945 5.76855 -8.89076 9.01771 -5.30284 6.31732 -1.56375 3.17543 -5.4773 6.36897 -5.30934 5.35073 -7.20096 7.7075 -6.51046 7.12888 -9.37127 10.0531 --0.0484323 0.348687 -1.83241 2.2143 -8.28633 8.60462 -2.51014 3.65817 -3.27798 3.58685 -1.41567 2.23302 -7.50794 8.10378 --0.0579575 2.10373 --0.856005 0.96621 -2.96238 3.48434 -1.36304 1.90594 -2.9997 3.41214 -7.2763 8.087 -1.69207 2.74419 -5.41625 5.83917 -9.22139 9.53794 -1.17477 1.51576 -6.74597 7.90871 -0.678913 1.73759 -5.70863 5.7214 -8.88411 8.93377 -3.44409 4.54586 -0.958963 1.53878 -8.29904 9.3867 -2.52433 3.60238 -8.16257 8.21986 -2.11395 4.23455 -6.85451 7.40364 -0.20286 0.639736 -2.05848 2.49034 -0.547013 0.77336 -7.83609 8.11903 -2.16539 2.29286 -3.94232 4.31368 -8.53475 8.54519 -4.77462 6.4158 -4.08395 4.68214 -1.56902 2.23811 -1.61337 3.11768 -1.51181 1.65521 -0.0821202 2.09269 -4.77622 5.16243 -4.62148 5.75837 -0.613158 0.952696 -1.89128 3.04792 -7.57509 8.92834 -2.70465 4.2941 -4.95906 5.12442 -8.0927 8.17277 -0.796512 1.3215 -5.74134 6.45291 -9.68479 9.78978 -5.89261 6.2292 -6.11377 7.9339 -2.20571 2.67129 -3.46228 4.27058 -5.26723 6.2653 -4.04391 4.26562 -0.380382 0.818995 -7.58108 7.7618 -5.02375 6.13042 -4.20178 4.66297 -2.83039 3.0221 -2.36072 2.45545 -6.68854 9.20726 -2.91388 3.42464 -9.33373 9.73449 -7.75844 7.94625 -2.72414 2.89669 -6.65438 7.96623 -1.00647 1.05385 -2.63018 4.9432 -0.152187 1.60259 -8.86332 10.3631 -2.31523 2.6815 -8.00509 8.61794 -1.69711 1.75938 -8.65442 8.73697 -4.23917 4.32001 -9.66851 10.1925 -6.93943 7.49814 -8.51986 9.03561 -2.10317 2.5175 -0.539549 1.75683 -6.29423 7.93236 -8.64345 9.54556 -1.44069 1.6814 -9.10017 9.77088 -6.16731 7.40496 -0.570043 1.93192 -2.65761 3.88544 -1.46895 1.52688 --0.369067 0.540647 -2.04868 2.72065 -2.1286 2.27858 -5.90157 6.16431 -1.55581 2.51851 -3.29705 3.81635 -3.4137 4.10991 -8.48699 10.1364 -8.43437 9.4642 --0.037842 1.47589 -0.541735 1.7805 -0.499576 2.36065 -4.1415 4.72435 -4.77598 6.16872 -3.30388 3.61854 -6.43796 7.85966 -5.27157 5.70871 -0.919258 2.18653 -4.00961 4.07902 -3.78201 4.23596 -4.50464 4.791 -3.70253 5.30916 -8.59228 8.70036 -4.31103 5.69049 -5.31775 5.34378 -2.24198 2.64194 -6.66937 7.41675 -7.21753 8.42057 -4.35399 4.52398 -6.90698 7.30084 -3.44296 5.44378 -3.36719 4.89951 -3.38624 5.33856 -3.44877 3.53693 -5.81398 6.3016 -7.24655 7.33127 -3.86142 4.53134 -3.85894 6.88112 -6.45704 6.95699 -6.90997 8.24088 -5.68813 5.7611 -0.699911 0.824323 -6.73758 8.42517 -9.34644 10.07 -0.289929 1.30554 -8.30644 8.49113 -6.47667 7.16073 -4.28093 4.90236 -8.32678 8.57064 -7.09205 7.92316 -5.55599 5.63919 -1.0104 2.22875 -1.72237 3.53668 -2.54699 3.14823 --0.668582 1.25485 -1.25582 1.37003 -1.35044 1.57807 -6.17083 6.30811 -0.618816 1.20065 --0.540992 1.21634 -2.06673 4.28857 -9.03398 10.8112 -8.73735 9.22814 -1.30178 2.7599 -6.0221 7.34889 -8.30124 8.52159 -1.92023 3.34545 -2.99331 4.93358 -3.8412 3.93379 -1.455 2.77005 -0.538664 2.1118 -4.16926 4.26053 -0.699746 0.937609 -6.36024 6.6511 -2.34698 4.84463 -8.11109 8.76496 -4.05425 4.67773 -8.2284 9.78568 -1.64423 1.80353 -5.70109 6.93764 -7.2091 9.67224 -4.47015 5.23311 -4.29326 5.36144 -7.93151 8.96494 -4.61889 4.96487 -5.38473 5.43594 -9.35456 9.66489 -1.23737 3.04121 -1.16077 1.19519 -5.91037 7.55679 -6.88344 7.60181 -6.39705 8.65039 -1.61791 2.93041 -9.68285 10.1396 -9.03129 9.05839 -7.0683 8.29875 -7.19624 7.41696 -7.5266 8.38738 --0.254571 1.01098 -1.30218 2.03222 -7.6432 7.73031 -4.99495 6.04757 -2.79394 3.29394 -0.31505 3.55963 -7.55382 8.18787 -6.00032 6.27664 -1.49355 1.79767 -5.21191 7.19537 -3.47816 3.75801 -2.10272 2.39494 -1.31887 1.93829 -7.14313 7.63055 -7.3141 7.77239 -6.03409 6.17265 -4.24946 4.53165 -0.0569272 2.56109 -8.44766 11.4872 -4.22879 4.28007 -6.92817 6.98775 -8.08859 9.0206 --0.0748418 1.48605 -6.56698 7.0488 -4.46624 5.4952 -3.66085 4.05778 -6.44711 8.93943 -2.45735 2.49339 -0.0606673 0.416191 --0.183838 0.750464 -7.08561 7.67275 -6.65423 6.90808 -0.0598735 0.364072 -5.2228 5.41543 -3.14042 3.19043 -2.40069 3.02829 -1.80441 2.1849 -3.47491 3.95775 -5.49162 6.63934 -2.03332 2.32288 -3.17234 5.25109 -2.58274 2.59951 -9.37994 9.97097 -4.71509 6.77966 -5.18915 6.84982 -6.12508 7.04354 -0.811202 1.98808 -1.46825 3.66984 -2.44386 4.15623 -7.60169 7.68242 --0.43208 1.22222 -5.40569 5.66153 -0.391742 1.79408 -6.77742 8.43115 -9.12828 9.3851 -6.39541 6.80626 -5.17919 6.29326 -6.57263 8.12999 -3.439 4.62236 -8.40525 9.80086 -7.60986 7.70099 -1.32123 1.44213 -0.526574 1.92338 -9.57195 9.79591 -9.52103 9.63159 -3.79775 4.20608 -4.74446 4.89606 -9.00085 9.60025 -1.26279 2.08363 -4.13639 4.49232 -6.59409 7.18315 -1.0637 1.78425 -5.4213 6.87661 -4.24407 4.30987 -9.79732 10.1204 -4.24597 4.83541 -8.47705 8.5145 -4.34095 4.93842 -5.68168 6.96086 -7.48654 7.91072 -8.32005 8.45111 -5.24065 5.3032 -3.25982 3.94442 -5.58106 6.18764 -4.4243 5.58619 -6.36467 7.07082 -2.70051 3.56014 -5.94534 6.87688 -7.33638 7.7645 -4.57067 5.86652 -7.83993 8.36854 -9.03617 9.11629 -7.44672 7.95614 -6.05876 6.3594 -4.02496 4.97119 -3.01438 4.36109 -7.4932 7.92357 -7.51661 7.53354 -7.60692 8.49678 -1.76088 2.59103 -7.08578 7.39566 -4.83605 5.42933 --0.186592 0.847663 -1.15879 2.33996 -8.11815 9.35472 -6.02584 7.62549 -0.881084 1.00015 -5.39067 6.27026 -0.910755 0.97444 -5.32174 5.65652 -7.69388 8.24928 -3.40521 3.7615 -5.60321 6.92388 -8.25096 8.34324 -0.00108913 2.16897 -0.508035 0.66573 --0.0517816 0.0876197 -3.26472 4.30955 -1.99494 2.14903 -2.089 4.32368 -5.17378 5.75964 -2.8779 3.54361 -6.56459 6.90645 -1.43196 2.88337 -1.48917 1.94009 -3.40807 4.25784 -8.0334 8.13458 -8.22254 9.6175 -2.96308 3.14349 -5.04768 5.71252 -3.9977 4.72614 -1.44384 1.60782 -7.78147 8.19817 -7.03854 7.50085 -5.90747 7.06091 -2.89169 4.31831 -2.46167 3.16529 -9.13228 9.1504 -2.57975 3.05313 -5.75976 6.52958 -8.10499 8.98982 -8.43162 8.76377 -0.422917 0.668254 -1.69046 2.09962 -5.50386 6.66954 -0.0897183 0.564514 -3.50103 4.1041 -3.91918 4.52559 -4.39297 6.18876 -3.90396 4.90868 -9.69362 9.85528 -6.27994 6.95062 -8.01563 9.09433 -8.25641 9.72944 -8.22072 8.35423 -1.27059 1.61352 -8.53312 8.96235 -3.49185 3.9042 -5.79579 6.046 -0.489013 1.2147 -4.00074 4.177 -2.66625 2.93036 -7.20267 9.34958 -7.44659 8.54707 -8.99915 10.1143 -7.59922 7.82031 -8.38502 9.03222 -0.160075 0.294398 -4.14549 4.3927 -9.35554 10.248 --0.159435 0.467922 -2.17272 3.72336 -8.63811 8.79976 -4.23215 4.66461 -6.99516 8.2035 -6.45212 7.88791 -6.20141 6.28633 -7.69396 8.82204 -4.50807 5.96315 -8.51725 8.89286 -0.939492 2.12064 -7.4615 7.62666 -8.46681 9.11769 -3.92828 5.40884 -9.05622 9.40015 -0.229625 0.860838 -2.05694 2.52113 --0.217927 0.574255 -9.55146 10.3256 -8.31497 8.3417 -3.52833 4.47013 -7.7131 8.52058 -2.15462 2.66777 -5.7674 6.17553 -3.3358 4.10589 -2.06642 3.00412 -2.43387 2.85242 -5.09473 5.84276 -7.3287 7.54846 -4.64254 5.11465 -4.05785 4.93614 -4.25413 5.43513 -2.96476 3.15378 -3.53732 4.48239 -2.34137 4.01272 -2.24879 3.40626 -3.43323 4.49055 -0.871415 1.33068 -0.508929 1.65611 -4.92057 4.94743 -7.03376 7.35193 -5.73043 6.47264 -7.82417 9.93642 -5.24102 5.9178 -2.38528 4.1676 -6.27437 7.19631 -9.29267 9.53262 -4.10098 5.24964 -0.383714 0.833317 -5.97628 7.92987 -8.15799 8.96819 -8.1687 8.29862 -8.16289 10.5149 -7.38205 7.89765 -3.81883 4.15607 -9.46915 9.61755 -1.50756 1.51863 -2.34236 2.84689 -0.398473 1.15027 -1.05302 1.49155 -8.71687 9.35232 -1.0502 1.40395 -7.83685 8.76302 -7.7731 8.46899 -5.56618 5.97458 -2.90035 4.12043 -6.40644 6.68706 -3.95201 4.37075 -7.1831 7.67748 -9.42789 10.0914 -5.45198 7.01256 -8.64609 9.45756 -6.01864 6.31515 -7.64621 8.65533 -5.45654 5.76553 -2.04332 2.75476 -5.49454 5.85693 -6.13688 6.21927 -2.66255 2.7385 -4.8326 6.43772 -9.12704 9.45287 --0.294488 0.318697 -2.26979 2.35516 -4.12949 5.58506 -3.01416 3.62246 -6.64697 7.10221 -6.44307 6.82985 -4.10484 4.73148 -7.42589 7.6029 -5.33055 5.50395 -2.46474 3.05847 -5.43677 5.59206 -2.13807 2.3988 --0.38424 1.8121 -0.00916704 0.219304 -8.62621 10.2262 -3.33927 4.51169 -5.45656 7.13165 -5.29253 6.57917 -3.51704 3.9421 -8.63729 9.13361 -3.92626 4.3469 -6.83104 7.52695 -1.22258 2.28191 -0.447646 0.789809 -7.96543 8.54328 -2.24269 2.42571 -4.4161 5.40481 -0.813992 2.21792 -0.694664 0.974182 -6.50017 6.88902 -4.00723 4.65882 -9.05784 9.85062 -6.80276 6.98196 -0.105446 0.379881 -0.416982 0.53336 -9.01269 9.55204 -3.27197 4.23315 -6.7017 6.89704 -4.21512 4.42378 -4.86735 6.90949 -4.52235 5.36878 -2.62205 3.55746 --0.551048 0.555476 -1.63274 2.71251 -4.26739 4.88085 -8.23129 9.77405 -2.49409 3.96851 -6.66387 6.88886 -7.72383 8.90611 -3.18511 3.27281 -0.73722 1.64435 -7.90329 9.02868 -6.94845 7.06773 -0.509461 1.54928 -4.63885 5.51652 -9.24395 9.5121 -1.00007 1.57161 -5.31349 5.45437 -0.929284 1.71034 -7.05985 7.63288 -7.38418 7.45373 -4.14937 6.5167 -7.49989 8.6081 -9.28313 9.57721 -4.41285 5.1497 -2.96148 3.09221 -1.58256 1.66419 -4.45116 5.43488 -5.70927 7.11699 -3.61105 3.93153 -5.92285 6.63773 -3.50065 4.48453 -7.97338 8.96464 -0.541394 0.965435 -4.46469 5.03925 -7.33695 7.6484 -9.64234 9.6938 -4.16378 4.17886 -7.10741 7.31549 -1.51829 2.62477 -2.1892 2.9684 -9.23767 10.0462 -7.87649 7.97087 -7.05385 7.85952 -6.91232 7.50277 -6.60185 7.81572 -2.27112 3.90211 -5.74452 8.2018 -6.25117 6.26911 -0.525893 1.53447 -0.392956 0.959233 -3.51591 4.71055 -3.10449 5.41156 -7.35964 7.65642 -2.89831 3.54334 -3.42338 3.68259 -4.75496 5.51419 -3.8792 4.48395 -2.18007 4.13236 -3.15798 3.16864 -8.91248 9.21598 -8.54636 9.34037 -7.93697 9.79709 -6.40205 8.9653 -9.67332 10.2252 -4.31771 5.25423 -7.27485 7.3725 -6.22971 7.11411 -1.16538 2.16762 -1.40443 1.6876 -3.14915 4.58847 -7.13761 8.72165 -4.38448 5.88699 -7.98309 9.19449 -8.491 9.05597 -5.55043 6.19359 -2.44006 3.36071 -9.56522 9.79903 -1.86129 2.00225 -1.65239 2.11478 -7.59392 8.4655 -2.44709 2.68538 -6.80932 7.04694 -8.8212 9.4182 -0.276845 0.956468 -8.17008 8.5538 -0.77864 2.06897 -6.78458 7.68692 -0.504907 2.67518 -5.56963 6.9058 -3.42691 3.5414 -2.52065 2.71583 -5.09924 6.26696 -0.223724 0.610039 -3.61258 5.29324 -0.388393 3.11131 -2.87763 4.45415 -8.26438 10.1169 -5.89742 8.17506 -1.89686 2.66651 -5.33662 5.68228 -3.37496 5.67291 -2.25713 2.36127 -0.402185 0.716342 -6.4231 6.79227 -3.22707 4.69314 -7.85092 8.77413 -3.31322 3.72455 -5.43021 7.7167 -8.5883 9.00864 -1.21371 1.71836 -6.35584 7.9706 -5.44438 5.50414 -5.31325 6.11217 -6.08888 6.78794 -7.70604 8.13257 -1.29858 2.48753 -5.54083 6.38817 -8.23948 9.82646 -7.5575 9.0224 -8.00415 9.39763 -0.488455 1.55358 -4.48727 5.20741 -6.46648 7.02349 -0.355939 0.611119 -9.4892 10.2189 -2.61893 2.82832 -0.268193 1.24687 -3.01964 5.19554 -6.29954 7.42795 -8.70796 9.48366 -5.39307 6.64597 -2.47001 2.60746 -5.30949 7.46529 -6.07973 6.16835 -0.764507 1.6144 -7.94123 8.52143 -1.88244 1.96592 -6.42103 7.02205 -7.673 7.73208 -6.66891 7.80675 -6.9305 7.5431 -6.62335 6.93873 -4.34846 5.77621 -0.49878 2.82928 -2.65221 2.80109 -7.45348 7.74372 -4.10129 5.26894 -3.87782 4.19855 -4.62113 5.22658 -2.84558 2.88185 -2.53209 2.86065 -8.94932 9.21967 -6.48046 6.89614 -5.81885 6.66829 -6.49129 6.62015 -8.5663 9.58685 -2.43346 3.89849 -9.36561 9.45886 -1.40232 2.65 -6.66 6.74041 -2.87007 3.49668 -4.71138 6.0184 -5.03638 6.08494 -7.77735 8.14253 -1.0301 1.27179 -2.58337 4.04699 -6.95419 7.89775 -7.81164 8.62551 -3.37669 3.96217 -4.68541 5.58692 -4.79697 6.34841 -3.95334 4.81962 -9.44006 10.0941 -4.91098 5.12386 -8.44273 10.1565 -3.6685 3.73156 -5.07599 5.33357 --0.138235 0.260923 -2.71154 3.45603 -5.75096 6.16127 -4.4775 4.64308 -6.80557 8.97442 -5.49408 5.76652 -8.31937 9.12886 -3.26479 5.51673 -2.57425 3.03145 -2.42465 3.92714 -7.86505 8.50835 -3.29229 3.43549 -4.08537 4.69709 -7.83885 8.60616 -1.61622 2.72716 -9.10228 9.41907 -8.49325 9.46612 --0.174644 0.351716 -1.95648 2.14825 -8.28844 8.4428 -4.35888 5.59521 -5.1396 5.22537 -0.330835 0.879566 -6.14972 6.82967 -3.14811 4.89049 --0.231668 1.08277 -3.13526 4.94545 -8.32674 8.91046 -5.22364 5.48006 -9.84318 9.88416 --1.07813 1.6965 -1.5095 2.0328 -8.03716 8.2792 --1.01307 1.46703 -8.22096 9.0055 -8.9917 9.0415 -5.60623 6.74537 -3.15991 3.19314 -3.13863 3.26451 -0.739618 0.896958 -0.67599 1.18486 -3.37355 4.06303 -0.38605 0.410067 -3.03297 3.46387 -3.45867 3.79806 -8.67249 9.53278 --0.213855 0.787363 -1.52316 2.61117 -8.31846 8.59736 -4.84685 4.94042 -7.41901 7.82623 -4.99029 5.09747 -5.3637 5.37612 -3.22123 4.77749 -3.21668 5.74743 -3.48748 4.59962 -8.00016 8.56269 -1.63631 2.42239 -1.05159 3.72319 -7.22643 7.95706 -5.65694 5.99195 -9.4469 9.66915 -0.857984 1.59867 -4.05869 5.69955 -2.65788 3.07259 -1.8038 3.38748 -3.91934 4.89922 -6.18534 6.70342 -2.85076 3.20176 -8.1897 9.9614 -0.685531 2.05322 -3.31097 4.00809 -8.26537 8.63475 -2.90508 4.07797 -1.25213 2.31285 -3.05752 4.03741 --0.481913 0.605629 -1.87958 2.19386 -7.28689 7.76316 -4.82075 5.20688 --0.08115 0.31839 -3.50085 5.89363 -1.31184 3.30269 -4.03137 4.81493 -6.11688 6.13923 -7.93584 8.43321 -4.9838 5.3733 -3.8174 4.11979 -8.56196 9.02824 -2.87809 3.89589 -7.95309 8.05432 -3.47469 3.63716 -6.61009 7.12576 -8.87374 9.79588 -7.31513 7.99089 -5.78084 6.68535 -4.96985 5.59877 -2.20236 2.52473 -0.661014 1.11035 -6.36183 6.58403 -6.67947 6.85093 --0.242005 0.513902 -0.442966 1.72024 -6.4587 6.74016 -6.67958 8.0837 -8.98524 9.56405 -6.91409 7.59877 -3.73596 3.97705 -5.51193 5.96437 -3.72029 4.50126 -3.09896 3.23616 -8.83312 8.91774 -0.32173 0.486199 -4.21092 4.59955 -2.61616 4.07081 -1.89049 2.65559 -4.96401 5.00629 -9.33156 9.70914 -3.72455 4.61054 -8.91265 9.6563 -7.12401 8.04324 -6.65393 7.25572 -1.04032 1.24927 -3.0174 5.56006 -1.47645 2.26867 -3.49833 4.37416 -6.16877 6.34452 -6.47417 6.90595 -4.27056 4.92535 -7.60439 9.35352 -0.426219 0.754405 -8.5291 8.68579 -5.84717 6.64632 -1.99513 2.5284 -5.10669 7.83064 -6.99006 7.37272 -0.871836 1.5934 -3.6572 4.38875 -0.154617 0.290737 -5.91634 6.50415 -5.33982 5.45293 -6.92602 6.94691 -0.349512 1.61427 -8.02048 8.99943 -5.75598 7.34946 -5.86948 6.51327 -5.11707 5.6181 -6.27656 7.10043 -8.48922 9.73833 -8.35863 8.69746 -6.67829 7.07852 -8.51257 9.50383 -3.76636 4.33757 -4.82804 5.57166 -5.17892 5.61254 -1.35188 1.94069 -6.04969 6.06833 -5.34181 5.82455 -5.71714 6.71234 -0.966462 2.56278 -7.95169 8.15951 -6.53583 6.89673 -6.73246 8.34493 -8.71111 9.76467 -7.53215 9.56537 -0.619041 0.736713 -9.24399 9.50151 -8.57184 9.88538 -2.82682 3.77294 -4.2649 4.84602 -8.6621 8.96426 -8.04469 8.3189 -7.81877 8.42944 -2.78031 5.16589 -1.23076 1.43577 -8.35385 8.49632 -3.27901 3.66774 -0.595941 1.41354 -3.37123 5.16685 -9.11003 9.95515 --0.25959 0.32069 -1.44153 1.70148 -1.61595 1.70799 -7.8201 8.53423 -8.5402 9.36947 -8.39125 9.8221 -6.2909 6.35773 -0.000933745 0.920054 --0.21358 0.491025 -4.00874 4.03866 -3.43552 3.55874 -7.85942 7.98987 -7.6681 8.06748 -6.19541 7.14765 -8.53891 8.96393 -2.38789 3.26866 --0.0162847 1.18379 -1.04764 1.52755 -0.400798 0.55475 -6.32001 6.94897 -5.9692 6.2012 -1.20784 2.67873 -3.58247 4.46372 --0.229647 0.559407 -5.65979 5.73489 -2.32795 2.78462 -0.706144 1.55147 -4.56527 4.6636 -5.98901 7.20908 -9.27329 9.95152 -1.31296 1.70529 -5.82933 6.41329 -4.17452 5.29881 -4.15885 5.25117 -0.35549 1.3511 -1.0591 2.4463 -8.87597 9.55625 -6.66826 8.57255 -0.355945 1.40613 -5.39729 6.10218 -3.78791 4.37501 -9.53885 9.87184 -2.67568 2.82552 -4.44836 4.52939 -5.96764 7.40168 -6.35578 6.98546 -0.636857 1.19517 -3.3986 5.55448 -1.46493 2.66884 --0.0676901 1.80921 -7.83396 8.53452 -8.3508 9.04561 -4.03407 6.0066 -0.997538 3.30635 -7.83064 8.03466 -4.57652 4.97461 -3.85952 4.15471 -0.960261 2.1069 -0.522458 1.52989 -8.81627 9.00768 -0.172256 1.29455 -5.69294 6.15752 -6.86391 7.75307 -2.32429 2.95415 -1.83191 1.90364 -0.400855 0.705649 -5.23264 5.39972 -5.19047 5.79842 -2.40804 2.89401 -0.462887 1.43874 -6.70213 7.90229 -4.37985 4.95797 -3.73768 4.30645 -0.756797 2.11146 -0.458724 0.472099 -3.93098 6.47147 -5.5294 6.00365 -2.97106 3.42174 -5.75875 5.80235 -7.96799 9.02105 -5.36254 7.22823 -6.56124 7.39973 -9.49234 9.57879 -2.87576 3.59509 -3.49182 4.28124 -8.68021 9.94486 -9.60199 10.1276 -9.70115 9.81776 -3.09609 3.98732 -5.00113 8.15031 -5.21248 5.74835 -9.23337 9.5696 -2.92777 3.56297 -2.52044 3.04905 -4.79908 5.05762 -1.98626 3.69659 -4.78726 6.20637 -7.39711 7.42831 -4.44319 4.78716 -9.28452 10.0832 -8.00774 8.85707 -9.22947 10.0523 -4.38653 4.86012 -5.15285 5.23106 -8.95413 9.75947 -2.90286 3.32407 -0.348694 1.39738 --0.0660432 0.293424 -4.09079 4.2922 -6.0407 7.23031 -2.83771 3.72237 -8.54697 9.38898 -2.16742 3.45018 -8.83255 9.30343 -3.59112 3.6531 -7.53452 7.81898 -7.11781 7.19773 -8.2892 10.0259 -4.91072 5.06031 -5.8232 7.25924 -7.0641 8.31604 -9.477 9.63892 -5.8003 6.58306 -9.63988 10.2754 -0.654364 1.02398 -5.9488 6.85043 -7.86867 8.99891 -9.202 9.46902 -4.17932 4.20271 -6.50328 6.71085 -7.19848 8.15579 -5.62459 5.75449 --0.159668 0.791409 -7.55683 8.7315 -1.03278 1.423 -0.751457 0.808785 -6.2203 6.50634 -1.64418 2.98238 -6.87468 7.00652 -6.36966 6.7117 -7.69893 8.89535 -0.419794 1.05032 -2.73928 4.31548 -0.409245 1.55228 -6.03905 6.39323 -0.409695 0.789834 -4.39148 4.40935 -1.14673 3.23607 -5.85562 6.44503 -6.87394 6.88742 -3.761 4.35136 -7.2208 8.01436 -6.49839 6.54002 -4.70791 5.91886 -4.24906 5.96619 -2.53482 3.91496 --0.369254 0.69193 -4.81351 6.31088 -9.76066 10.0736 -1.4413 1.55942 -7.21917 8.88908 -6.03521 7.56826 -1.25568 1.42024 -5.47575 6.04431 -1.43099 1.99979 -5.1004 6.04088 -6.54798 6.56118 -1.0142 3.1564 -1.75267 2.1453 -1.28133 1.36044 -9.60996 10.0563 -1.14397 1.50247 -6.86688 7.08724 -8.38287 9.18041 -0.132076 1.27657 -6.52553 6.9301 -0.223917 1.41325 -1.18902 1.79753 -1.40084 1.75678 -1.94524 2.51929 -1.98276 2.62875 -0.763281 1.05483 -7.97952 8.51249 -1.059 3.05463 -5.33401 5.85094 -8.37442 8.64374 -6.62865 6.67315 -1.01707 1.64386 -0.113335 2.23523 -6.71906 8.00216 --0.886574 1.29366 -4.20078 4.85294 -8.43336 9.06988 -3.55413 4.40768 -6.69076 9.01132 -6.18982 7.14109 -7.14381 7.7046 -8.63195 9.47031 -8.88052 9.84886 -3.34443 3.62637 -4.5862 4.72832 -4.95757 5.23571 -2.85993 4.04966 -1.43846 2.27425 -5.43112 6.30496 --0.452609 1.55525 -7.17706 7.71287 -5.78537 5.79579 -8.51102 8.9466 --0.472904 0.810489 -3.83688 4.24045 -8.04432 9.04582 -1.57259 3.37136 -1.22231 1.33582 -5.73006 6.26477 -2.90855 4.22125 -9.39717 9.4287 -3.63873 4.16094 -0.442035 2.08889 -0.294491 1.31124 -3.14755 3.86305 -6.57634 9.44898 -2.19051 2.41878 -4.99277 5.12569 -4.10425 4.9423 -4.83547 5.62769 -5.73879 5.78179 -8.90329 9.81905 -5.60168 6.17538 -5.83843 6.66128 -1.84271 2.57406 -3.01047 3.33662 -2.85037 3.79158 -3.49007 4.46877 -8.58942 9.51529 -0.613753 1.12824 -8.23757 9.54707 -9.27134 9.4196 -6.27126 6.56417 -2.17206 2.33018 -3.53588 5.17162 -8.6312 10.0868 -5.76342 6.66164 -9.01501 9.90984 -3.22004 4.18954 -4.37918 4.68595 -2.00928 3.49815 -6.64229 7.06693 -2.85962 4.58794 -8.45587 9.8897 -2.8481 3.65956 -8.65849 8.67336 -6.48486 6.58637 -5.82336 7.45254 -4.02267 4.59696 -2.24997 2.83815 -8.16201 8.55518 -7.40645 9.07085 -1.43137 1.50333 -8.7212 10.9419 -1.50523 2.44124 -1.92455 2.85819 -4.50866 4.53052 -5.75781 5.81275 -1.71013 2.0282 -9.31592 9.9015 -6.14972 8.18798 -1.85705 2.20068 -4.80971 5.10509 -3.31201 3.58168 -8.61824 9.31861 -7.19497 7.86933 -3.25381 4.53472 -5.62799 6.29537 -9.00659 10.021 -9.15156 9.74827 -2.0324 2.80741 -0.714403 1.00476 -1.26522 1.80417 --0.362995 0.41758 -7.08785 7.71544 -5.55685 5.74045 -0.428866 3.03773 -7.61574 8.94894 -9.07256 9.69772 -4.49537 5.06822 -5.66388 6.48899 -1.69126 2.69607 -9.90539 10.0783 -6.56455 8.27128 -6.61988 7.86616 -7.42012 7.64493 -2.99922 3.35282 -4.69379 5.18947 -0.87894 1.30518 -9.47632 9.61234 -0.665754 0.855958 --0.422778 2.11197 -3.38786 4.15441 -7.57236 8.75855 -1.89832 3.50224 --0.185929 1.0777 -3.32911 5.53465 -6.91111 8.69247 -6.97456 7.86905 -4.75518 5.0948 -4.23733 5.83368 -8.52456 8.56086 -0.0978267 0.136564 -7.4668 7.99757 -5.52851 5.80858 -8.5833 8.88589 -5.10603 6.41348 -4.70682 6.59981 -8.60265 9.19477 -5.04514 6.24014 -4.49041 4.88669 -7.40925 9.15624 -0.80364 1.35315 -7.11604 8.01153 -0.267749 0.714089 -0.121521 0.822226 -9.30556 9.81307 -2.11398 2.92567 -5.97722 6.08022 -7.13483 7.22211 -8.00161 9.27274 -4.87681 5.51654 -3.11843 3.84311 -5.17747 5.98482 -3.6077 4.46306 -1.37454 2.2443 -4.93385 5.96357 -2.92184 4.0964 -4.88767 5.56353 -2.87394 3.76336 -0.326521 0.622872 -2.42056 2.45007 --0.527891 0.827211 -6.73151 7.20155 -1.82048 2.54905 -1.35563 1.88701 -3.64202 4.10669 -5.22846 5.23953 -6.06271 6.46993 -2.71418 3.2081 -6.41179 7.57176 -7.45823 7.79609 -1.01227 1.39137 -9.0872 9.20132 -5.083 5.64038 -5.63236 5.97945 --0.317645 0.822313 -0.865396 2.65587 -5.71839 5.98983 -1.50978 2.08611 -2.95824 3.70996 -0.264301 1.02233 -8.22351 8.98589 -4.87805 5.24127 -2.31329 3.46752 -6.19539 6.69676 -5.18643 5.40947 -7.15453 7.66643 -1.20694 2.25111 -7.87378 7.89093 -5.16514 5.604 -8.68354 9.01395 -7.33753 9.37499 -2.94627 4.06036 -8.64337 8.85727 -0.0353092 1.0128 -6.98437 7.35718 -6.77073 6.79959 -3.13559 3.70735 -7.40139 8.27017 -4.01174 4.39788 -3.22281 5.11647 -7.79256 8.58737 -0.642233 1.39694 -7.18603 8.69453 -3.37803 3.59355 -0.762287 0.84262 -4.21823 4.52565 -0.894924 1.35434 -0.844327 1.19938 -5.57958 7.05431 --0.631066 1.55134 -3.78962 4.17935 -9.15329 10.4824 -5.47536 5.52975 -8.81243 9.16088 -4.45989 4.94123 -8.68235 9.45112 -8.04719 10.3938 -8.87349 9.40483 -0.502543 0.570283 -2.08512 2.47652 --0.654512 0.804355 -3.68569 5.21711 -5.33017 5.80226 -3.44991 5.31415 --0.00417763 2.95077 -7.17784 7.9318 -1.2721 1.31642 -5.24415 5.64173 -2.79434 3.28746 -4.54991 6.49276 -4.74707 5.12555 -7.36365 8.15777 -0.913049 1.79828 -1.47498 1.83425 -2.64271 3.38567 -4.78159 5.44718 -7.6087 7.66442 --0.484393 0.909893 -3.16824 3.23757 -4.43021 5.90284 -4.25954 4.74995 -6.58742 7.24125 -1.86151 2.27069 -3.16459 4.5945 -1.06471 2.08965 -3.31028 3.83029 -1.52593 2.47521 -0.703789 1.42451 -1.47969 1.68923 -2.92352 4.24089 -9.84088 9.93485 -3.18205 4.27817 -7.39345 7.78945 -3.78808 5.41572 -4.38624 6.75693 -6.93065 7.16977 -1.01289 2.19807 -3.37006 3.54196 -5.50238 5.58285 --0.225113 1.99347 -1.67796 1.86943 -6.1999 6.35102 -3.80494 4.74814 -1.13294 2.02639 -1.1965 2.6548 --0.284453 0.856092 -4.26565 5.02196 -9.66948 9.88874 -6.20287 6.25528 -4.38154 6.65806 -3.77411 4.3075 -5.77177 6.78486 -9.16311 9.816 -3.22861 3.42009 -3.36573 4.34724 -6.76951 7.58025 -4.83813 5.23042 -3.87192 4.37372 -5.56859 5.90066 --0.368163 1.4593 -5.44031 7.81671 -2.66342 2.99253 -6.11846 7.69499 -4.98811 5.17531 -4.45078 4.67513 -4.88206 4.94128 -2.51813 3.0268 -0.461292 1.15264 -2.34766 4.48652 -0.198819 2.23425 -6.85634 6.98248 -0.912438 1.81872 -4.84933 6.34912 -5.15613 5.82891 -0.172772 0.994083 -3.37381 3.64549 -1.98836 3.2697 -1.64344 2.06049 -0.766585 3.09305 -7.8979 8.28046 -4.34856 5.01341 -6.69809 7.24239 -5.19034 7.04959 -5.3747 6.92123 -7.8893 10.1251 -6.11207 6.99125 -5.37115 6.84111 -9.04786 9.11002 -6.45326 6.64415 --0.76294 0.92832 -0.980411 1.8166 -3.05536 3.50031 -6.10827 7.55786 -6.57848 9.06264 -7.66855 8.861 -4.80276 4.82283 -1.99932 3.2877 -9.45229 9.80653 -0.457474 0.778684 -5.44444 5.95239 -5.60974 8.05169 -7.64656 7.79632 -6.78372 7.65134 -6.93878 7.82023 -9.08292 9.55308 -9.16329 9.25802 -1.4909 2.38688 -4.31881 5.3564 -5.12535 5.60119 -2.44591 2.54637 -7.36929 7.80452 -2.13707 2.97655 -9.73557 9.94588 -1.96637 3.36097 -0.857068 2.29643 -5.58224 5.91142 -8.90714 9.0255 -9.77988 10.0711 -0.41121 0.970955 --0.518356 0.91447 -7.58725 7.71255 -8.1435 8.78712 -6.5487 7.17991 -4.94961 5.50283 -8.14086 9.03281 -3.51281 5.24806 -3.5786 3.84066 -6.27435 8.37735 -8.65263 9.5555 -2.87484 3.56117 -5.57707 6.55879 --0.111276 0.264178 -3.60894 4.15477 -2.82322 3.64397 -8.40669 9.1127 -8.43089 10.5298 -1.38472 2.2453 -1.74464 2.00472 -4.01588 4.67572 -0.408869 0.938602 -2.06155 3.46067 -4.4871 5.08963 -2.4435 3.87355 -1.32864 2.55801 -4.78579 5.26122 -7.43027 7.57749 -6.90971 7.32716 -8.01095 9.46872 -9.41627 10.524 -8.83143 10.4474 -0.631816 1.75513 -1.72965 2.17123 --0.513239 1.1886 -6.75616 6.7984 -2.49278 4.26493 -0.230011 0.966298 -3.78506 4.95013 -2.03886 3.14808 -7.87309 10.5637 -3.54564 3.58055 -1.91974 2.9194 -4.8503 4.98668 -4.66494 4.83558 -7.57916 8.24358 -4.78743 5.38547 -2.81034 3.34534 -1.00297 2.0138 -6.87593 7.17736 -3.93157 5.0655 -3.10361 4.05519 -8.22876 8.38326 -7.48377 8.31026 -2.23106 3.4905 -0.130934 0.606709 -1.22344 2.55898 -7.55829 7.92597 -4.10977 4.86263 -0.122756 0.264176 -3.8357 4.15854 -1.28414 2.13031 -0.280029 0.805504 -2.88245 4.1704 -5.57936 6.94781 -6.22719 6.33201 --0.761013 1.16475 -6.16636 7.12566 -2.98935 3.192 -2.23263 2.34362 -3.9082 4.11692 -2.66865 3.5275 -1.87676 2.43966 -4.60035 5.39332 -2.74287 3.73097 -2.81953 3.96666 -5.73644 6.04042 -4.02179 4.52419 -3.26438 4.07346 -1.22509 2.13719 -7.91885 9.71846 -1.28152 1.48079 -7.97918 9.26344 -8.75682 9.8677 -7.25678 7.45362 -8.16161 8.87066 -1.21873 2.37224 -7.76739 9.06346 -3.89932 5.03406 -3.53901 4.37006 -2.93795 4.04333 -6.36543 6.72985 -4.72622 4.98804 -1.86205 1.99008 -0.784581 2.05264 -0.978519 2.91723 -3.9067 6.47195 -0.735425 2.38151 -8.37394 8.41609 -6.91804 7.23374 -9.39259 10.1026 -7.28732 7.43466 -4.75982 5.44264 -6.71504 7.53933 -2.17125 2.54358 -0.703562 1.39087 --0.221711 0.541965 -9.22839 9.39159 -9.53465 9.97585 -1.44304 2.53666 -7.886 8.85051 -9.33174 10.1632 -2.60898 3.42889 -1.73658 2.02589 -6.31651 6.77762 -7.26755 8.34499 -9.01312 10.9837 -7.47361 8.96251 -7.98365 8.02586 -1.40065 3.44891 -9.44617 9.55391 -8.24265 9.34849 -9.366 10.4216 -0.375354 1.17522 -3.37114 3.38278 --0.742469 1.07634 -4.29988 4.81879 -4.18605 7.21928 -7.41047 8.29198 -6.68173 7.60225 -3.24292 3.30695 -1.8951 3.42167 -3.97359 4.2857 -4.72621 5.80575 -4.75014 5.02239 -6.43454 6.94568 -7.16601 8.10355 -2.16685 2.23666 -6.70852 8.63284 -8.16988 8.95848 -0.277002 1.30648 -1.5803 2.28632 -2.22634 2.34679 -0.200623 0.814959 -5.27457 6.51651 -2.49533 2.90705 -6.48922 6.69528 -8.18879 8.63551 -2.75159 3.633 -0.884853 1.56434 -1.87488 3.98951 -4.24783 5.17713 -6.22499 6.56095 -5.68238 5.99272 -3.75553 3.85012 -4.87543 5.39966 -6.62671 8.72493 -3.50262 4.05131 -5.38952 5.4974 -7.84971 7.94051 -5.39123 6.66564 -5.43986 6.17256 -7.48968 7.7677 -4.2685 4.57296 -1.75169 4.11058 -5.03634 5.16102 -4.68003 4.84715 -8.36249 9.98761 -8.94297 10.6969 -6.21572 6.24305 -7.90303 8.0672 -7.90426 8.41244 -5.98512 7.93187 -5.13297 5.27136 -6.58367 7.4971 -4.72663 5.22956 -7.99667 8.59246 -4.3303 5.92188 -1.3132 1.80875 -7.70104 9.20947 -1.78862 2.00473 -9.63678 9.65571 --0.264416 0.318054 -2.70004 3.40777 -2.74642 3.73608 -3.6494 3.6743 -8.03113 9.22851 -1.07526 1.3116 -4.05436 5.33291 -4.60907 6.03605 -7.83426 9.10358 -2.27997 2.77309 -5.63139 6.92616 -4.40717 5.25214 -1.98986 3.5062 -2.42393 2.9584 -1.94336 3.08456 -1.20185 3.01827 -0.641733 2.10095 -7.25046 8.29391 -0.640392 1.26451 -3.9588 4.85492 -6.83036 7.41101 -6.48581 7.08757 -6.48734 8.47856 -9.55084 10.3774 --0.173137 1.26574 -2.32702 2.58775 -2.7463 3.13914 -7.86951 8.62807 -5.96916 7.92759 -0.217046 1.70373 -1.04207 1.05755 -4.79058 5.07902 -4.19024 5.35395 -9.00175 9.83715 -8.37554 9.275 -4.5204 4.82999 -3.49936 4.75519 -7.07916 7.74619 -6.66726 7.35282 -7.39513 8.55523 -7.50381 9.60708 -1.39304 2.26927 -2.84101 4.76376 -1.21779 1.59353 -4.7893 5.70143 -9.12195 9.57131 -5.40461 6.15443 -2.86445 4.26837 -8.01324 10.9082 -2.96659 3.8042 -2.4897 4.59323 -6.37887 7.15878 -7.00143 7.6419 -3.22491 3.41843 -1.22852 3.31783 -2.09881 2.56121 -4.43205 4.67051 -4.39328 4.66715 -2.38355 3.39058 -0.638802 1.59399 -5.32717 5.81376 -8.00353 9.72007 -8.77281 9.81649 -8.95552 9.86609 -2.90915 3.96556 -3.88176 4.93124 -6.45945 7.69942 --0.108577 1.57424 -0.304992 0.320561 -6.47789 6.5515 -1.98211 2.05312 -6.2741 7.35626 -9.45057 9.67918 -5.2916 5.48037 -0.158802 0.712187 -6.42002 6.84323 -9.11085 9.13063 -9.42446 9.95882 -6.03624 6.96469 -9.2473 9.6286 -7.10342 8.71163 -3.34072 3.35187 -7.4602 8.58506 -8.7963 8.81873 -0.323615 2.22687 -0.326746 1.76681 -2.20062 2.76862 -7.55181 7.85006 -0.941035 1.28117 -8.76643 9.60019 -9.19731 9.33092 -6.0479 6.57293 -6.12725 6.24356 -7.53078 8.92488 -3.1841 3.48283 -1.85544 2.01888 -7.3849 9.29183 -5.03915 5.27721 -4.77142 5.46282 --0.291696 1.14641 -1.61367 2.20867 -5.31853 6.69431 -2.52731 3.13139 -4.86677 5.18106 -4.50183 4.60969 -5.95881 6.09964 -2.41939 4.42026 -6.92003 7.17891 -4.29584 5.48557 -8.02803 9.06315 -2.82326 3.49599 -5.8647 5.87561 -2.38814 3.62688 -6.32418 7.17662 -5.99907 6.5059 -3.84698 4.14446 -9.80728 9.82132 -5.2366 6.30871 -9.81878 9.91004 -1.53024 1.83525 -2.98035 3.68531 -4.5418 6.98786 -5.19561 5.9846 -0.946068 1.46672 -3.26948 4.71928 -6.13476 7.68682 -8.36934 9.65072 -6.40074 7.14762 -1.01349 1.80493 -8.4514 10.25 --0.180382 0.682704 -1.03041 1.63565 -5.64642 6.96069 -2.73598 3.67485 -5.8705 6.66157 -4.68343 4.7176 -5.83787 7.6818 -1.42529 2.234 -3.73726 4.19241 -5.38341 5.81884 -1.13088 1.69073 -0.968034 1.98828 -1.06007 1.11039 -3.50129 4.51807 -5.83133 6.77904 --0.334945 1.29129 -0.326706 1.16015 -9.15028 10.4391 -5.13047 6.79712 -1.06952 1.38997 -5.79345 6.49898 -7.88149 8.5143 -8.00404 8.09794 -8.22725 8.28904 -6.38406 6.61356 -6.32166 6.73458 -7.17066 7.32049 -1.64338 3.79327 -7.92135 8.55568 -7.15578 7.42231 -6.70701 7.65427 -5.76608 7.63064 -3.54163 4.08662 -3.81402 6.76906 -4.5998 4.61865 -9.01471 9.18718 -5.21234 5.73335 -0.946018 1.39917 -6.99714 8.29739 -5.64458 6.93965 -3.39809 5.70907 -6.32284 6.83604 -8.50347 8.53097 -3.90118 4.85721 -9.41198 9.62076 -4.41514 5.55152 -7.69979 7.81249 -5.34434 5.37105 -7.25274 7.76114 -7.67383 7.92718 -5.82851 6.29417 -0.935651 1.2842 -0.639586 0.786771 -6.39823 8.31226 -3.67546 4.89035 -9.20323 9.57287 -2.33896 2.99576 -8.51933 8.80243 -0.983098 1.11084 -8.48215 9.42998 -7.29586 7.3914 -2.00695 2.89046 -2.60909 2.62433 -2.04118 2.92033 -7.60386 9.01419 -7.32896 7.73342 -9.51693 9.54891 -5.1323 5.24962 -6.35326 7.18302 -2.50952 3.51872 -3.4149 3.57431 -9.18412 10.4976 -5.68123 6.42697 -5.87758 6.0124 -6.3202 6.64588 -8.2547 9.98176 -5.50949 5.7854 -0.0824268 0.128178 -2.17292 3.76233 -7.22786 7.68214 -5.09326 6.4151 -4.30171 4.86688 -2.39206 3.47399 -7.95152 8.35556 -2.40133 2.936 -2.77819 3.87516 -3.252 4.33376 -9.54269 9.7513 -6.6747 6.73043 -0.611474 1.97158 -7.65864 8.53689 -1.58345 1.8017 -2.56917 2.8152 -8.5424 8.8301 -4.98159 5.44499 -5.82482 6.03578 -3.55509 4.90785 -5.77028 5.94747 -0.163965 1.1379 -2.85039 2.94261 -4.24343 4.67273 -3.22636 4.06084 -6.03662 6.21018 -4.55495 5.07697 -1.91173 2.51739 -6.54894 7.24036 -5.55502 6.92676 -0.245707 0.586188 -2.28044 3.29563 -4.71378 5.25198 -8.28953 8.44891 -9.42282 10.179 -5.0548 5.73614 -6.3203 6.43659 -6.54178 8.82077 -3.67181 4.17365 -8.51445 8.96445 -1.69648 2.84524 -0.194222 0.920147 -2.48533 2.59803 -1.66002 1.6739 -4.79833 4.95404 -1.09801 1.11009 -6.62529 7.4066 -8.0099 8.37262 -3.55429 4.11824 -6.2666 7.12137 -7.83222 8.01342 -9.37156 9.72961 -1.1647 4.04434 -4.50719 5.09068 -3.25175 3.75482 -8.28659 9.30848 -7.30009 8.60755 --1.12073 1.21016 -0.310087 0.725712 -8.3746 9.13511 -9.11925 10.2234 -9.68703 9.7137 -0.603098 0.844291 -5.88373 6.99327 -0.852802 1.43297 -3.7463 5.82283 -7.69639 8.25446 --0.337322 0.977113 -8.76606 9.16618 -3.43527 3.6616 -3.93587 5.39471 -5.66569 7.20462 -5.34999 5.7193 -3.25589 3.706 -1.52012 2.55985 -4.74228 5.43725 -5.15323 5.51652 -7.77237 8.33717 --0.0514419 0.914127 -9.27182 9.59476 -8.14192 9.74859 -6.42702 7.20331 -7.51351 7.68358 -7.0947 7.46059 -7.97635 8.59449 -2.39931 2.66008 -5.79481 5.94673 -4.41054 4.81613 -2.72202 3.61239 -2.86039 3.44719 -1.81115 3.28151 --0.566995 0.734214 -9.61998 9.72024 -7.4163 7.61821 -0.42522 0.552659 -3.17617 4.36942 -0.740294 1.36953 -7.13755 8.39966 -0.219186 0.892588 -3.78307 5.2905 -0.783026 1.76155 -3.01893 3.33055 -3.12143 3.5713 --0.792679 0.92539 -0.668572 1.12961 -3.88619 4.30545 -7.59276 8.1776 -4.71509 5.05622 -6.53406 7.04242 -1.581 2.21984 -4.7144 5.51372 -2.76338 3.50211 -0.16364 0.293599 -5.92365 6.10636 -3.11174 4.29165 -5.49295 6.48717 --0.503239 0.795707 -7.30558 8.12408 -2.10674 4.13456 -7.11985 8.01932 -1.34672 1.48739 -4.05778 5.69084 -2.83686 2.9115 -6.4471 6.53909 -0.467374 1.84371 -2.76467 2.94177 -4.87867 5.33932 -0.892878 1.96273 -1.13934 2.27205 -7.76918 8.39409 -6.72181 7.43901 -7.0836 8.68472 -7.12924 7.56332 -0.689172 1.62922 -9.41146 9.91043 -0.398265 1.27579 -6.29966 7.4874 -5.09438 5.65334 -6.04623 6.4687 -5.75305 6.89731 -0.308118 0.459501 -3.63692 4.30501 -3.1755 3.71009 -7.32787 7.52785 -2.23235 4.09978 -2.71191 2.91513 -0.209457 0.840713 -7.31489 7.38296 -6.21245 6.91111 -5.75983 5.96049 -5.92056 8.24518 --0.354452 0.489638 -4.05894 5.34828 -1.56299 1.57414 -2.85083 3.27455 -8.78323 10.0012 -0.208502 1.26471 -6.10824 6.79285 -5.55114 8.03968 -6.13077 6.32342 -7.34865 7.82592 -3.94835 4.75016 -7.8268 8.72249 -4.85131 5.07903 -5.40398 6.0134 -2.85971 3.85293 -0.126379 1.45545 -3.15768 4.28388 -9.64566 9.70016 -4.47514 6.31064 -6.44995 7.2894 -4.70992 6.13777 -3.91128 4.22263 -7.35627 8.07739 -2.49215 2.68749 -8.09946 9.16929 -0.925679 1.92784 -8.48437 8.63892 -7.2255 9.18109 --0.00840282 0.0168954 -5.91933 6.6274 -4.16086 4.64302 -8.27009 8.47868 -1.73372 2.93094 -8.17421 9.17705 -9.19136 9.43222 -0.0653594 0.648416 -8.69 8.96184 -8.99355 9.40832 -6.25088 6.26945 -6.72391 7.38424 -9.59708 10.3496 -6.00971 6.18818 -4.64468 5.75797 -3.64832 5.30079 -5.99378 7.8792 -6.5388 6.99379 -7.31694 8.43802 -3.66227 4.92638 -9.55964 10.3796 --0.14433 0.29095 -3.56716 3.71252 -3.82062 4.27788 -8.10405 9.35275 -7.17891 7.46539 -1.17698 1.29602 -4.48829 5.03134 -7.18025 8.13852 -9.42388 10.3634 -5.2158 6.17469 -5.22926 6.52397 -5.16731 6.40625 -6.53348 7.269 -2.07834 2.39172 -9.65044 10.1519 -8.64551 10.1294 -9.29006 10.5993 -1.50639 2.83173 -5.71675 5.99216 -3.0783 3.35571 -0.115401 1.31431 -8.03988 8.11942 -3.11917 4.53956 -1.14552 1.1646 -5.34782 6.43017 -0.0701702 1.0368 -0.183335 0.440704 -6.33438 7.71607 -2.11533 2.64323 -7.12104 7.13366 -7.21548 8.26968 -3.13445 4.13568 -4.57452 4.74602 -2.60889 3.69846 -7.21184 7.47573 -6.87651 7.03405 -2.65431 3.94352 -1.50006 1.70087 -6.16344 7.54429 -7.02057 7.73067 -8.27833 9.01489 -0.500833 0.597845 -8.34751 9.88925 -2.80242 2.91837 -5.29424 6.079 -8.36276 9.10074 -0.216887 0.268335 -1.30798 3.16393 -3.93851 4.22658 -2.58028 3.14744 -9.31131 10.3451 -7.37262 8.84852 -4.45306 5.6723 -3.74535 4.0721 -4.90174 5.63875 -3.41847 4.65199 -3.10265 3.82548 -6.56126 6.97557 -2.57449 2.95098 -7.97418 9.06301 -9.2203 9.66829 -4.64922 4.96305 -8.83034 10.115 -6.6685 6.89847 -7.36585 7.48669 -8.66761 9.39287 -0.562216 0.961875 -7.56292 7.81006 -8.50715 8.95572 -0.572825 2.24755 -5.9367 6.06766 --0.769578 0.776163 -4.48224 4.9553 -8.21069 9.29643 -8.57206 9.47175 -1.10032 1.21371 -3.76306 3.87152 -6.46197 8.18457 -6.96501 9.70727 -3.42357 3.93484 -0.818601 2.42743 --0.119739 0.397938 --0.378761 0.523892 -8.03394 9.35409 -3.60283 3.98864 -2.21789 2.70607 --0.255329 0.319063 -6.20806 6.22609 -7.1283 8.04391 -3.73565 4.03638 -8.5374 9.10987 -5.22675 5.35072 -7.51777 7.58439 -9.12636 10.4159 -9.15003 9.40672 -0.217863 1.19883 -9.42416 9.9178 -2.55337 3.8088 -7.03655 7.98242 -9.17171 9.8047 -0.110162 0.722738 -3.16467 3.58897 -6.47244 7.12961 -1.0456 1.65614 -1.58456 1.62844 -1.79039 1.84035 -6.24286 7.07838 -9.08631 9.11684 -3.05068 3.40838 -2.81212 4.03665 -2.52011 3.09841 -8.06001 8.16356 -7.07649 7.52685 -2.47666 2.86548 -8.66241 8.95103 --0.298116 0.662697 -0.822443 2.46125 -2.07619 2.33674 -4.84135 6.21034 -7.49625 8.13026 -7.85854 8.29618 -3.01722 3.37062 -6.54393 7.30306 -2.21113 2.30166 -8.32138 8.57349 -6.2995 6.33514 -3.0018 3.56886 -4.63378 5.52214 -6.71908 8.96715 -2.29809 2.95581 -8.34947 8.71096 -4.96902 5.32075 -9.51051 9.72733 -3.311 4.77789 -3.50233 3.66309 -4.95177 5.76002 -6.12876 7.22391 -6.27743 6.79393 -3.60638 3.6833 -5.20305 5.50848 -7.16065 8.88358 -9.45049 10.2539 -6.16892 7.0314 -8.08479 9.74516 -0.0717867 0.669987 -2.17569 3.34098 -4.81716 5.7509 -7.63999 8.01157 -5.87228 6.60363 -3.39621 4.35575 -4.96079 5.07901 -7.57639 8.82003 -8.27285 8.52609 -0.665858 1.64782 -1.74256 2.07126 -6.19512 6.4258 -0.664592 1.30896 -0.180682 1.43746 -6.46752 6.81303 -2.55562 3.08708 -9.33695 9.63312 -6.33821 6.77092 -7.88252 8.55026 -8.17937 8.45385 --0.415294 0.793096 -5.22077 5.54553 -8.67808 9.10041 -1.72096 1.92024 -0.492778 1.48076 -2.29514 2.88531 -0.0934389 1.37614 -8.40297 9.11121 -3.66605 3.91717 --0.274468 0.867811 -9.41428 9.56659 -1.22657 2.12792 -8.71336 9.85384 -5.09347 5.42905 -2.02877 2.36652 -5.99112 7.40703 -0.911618 3.48138 -4.84352 5.11131 -1.16309 2.08613 -5.58561 5.84805 -0.663543 1.08921 -1.83189 3.93269 -4.07731 4.38879 -4.04789 4.9989 -2.09457 3.61279 -2.00982 2.94396 -7.37537 7.66574 -5.08648 5.80122 -9.19959 10.2263 -4.26136 4.86194 -6.67875 7.61134 -1.27462 2.48399 -7.2237 7.82324 --0.0141009 0.0441377 -8.32069 8.36192 -2.82562 3.0717 --0.528918 1.25301 -1.90486 3.04714 -1.34489 1.75301 -3.14332 4.03322 -8.55351 10.8681 -9.09824 10.3828 -0.496868 0.622499 -7.11112 7.62765 -0.335233 0.528962 -6.71335 7.13937 -6.78574 7.71172 -9.13568 9.22251 -7.10299 7.64765 -3.64747 4.06685 -8.64041 9.40111 -2.43515 2.93081 -2.95476 3.68588 -0.0863751 0.777976 -6.5891 8.18165 -8.80986 10.0735 -0.568868 1.63785 -4.41677 5.42049 -8.72857 9.88426 -3.67467 4.25442 -8.98168 10.1087 -5.08611 5.50098 -1.28982 2.34422 --0.914176 0.969847 -4.35042 4.42735 -4.02282 5.08164 -9.00566 9.4791 -2.71821 3.24065 -3.20252 3.24988 -8.61559 9.6733 -3.15157 4.7685 -3.59348 4.67872 -0.286864 0.36279 -8.40374 10.528 -7.53647 8.13523 -6.81591 6.90226 -7.68111 9.10704 -8.37958 8.73818 -3.25808 4.40893 -1.50348 3.00641 -0.20803 1.40949 -3.93771 4.84177 -2.79232 3.35329 -4.2666 4.63588 -0.341784 1.46241 -1.53063 2.06724 -8.58212 8.86194 -8.95411 9.70651 -8.71591 9.26292 -6.66088 6.7009 -3.95881 5.93917 -8.5823 8.76007 --0.308958 0.34174 -1.03188 1.37677 -7.52675 9.84031 -4.27952 4.32984 -1.83465 2.27607 -8.12096 8.64922 -2.22605 4.40067 -0.00929139 0.871342 -0.376531 1.29354 -3.5257 4.30165 -1.95846 4.09589 --0.200922 0.799272 -0.24432 1.76673 -4.73477 5.06514 -8.97059 9.2276 -2.89618 2.93969 -0.168256 1.03325 -3.44522 3.83622 -2.74889 2.76042 -6.07155 6.7979 -9.06484 9.09804 -7.56658 9.29215 -4.3084 5.45621 --0.0786996 1.12809 -8.48249 9.74107 -6.4196 6.61469 -1.57119 1.87612 -3.15463 3.86251 -2.0089 2.57741 -6.53618 7.12035 -7.07901 7.29396 -0.114756 0.887413 -8.90806 9.65731 -4.0921 5.23407 -2.63441 2.92344 -4.31769 4.98832 -8.90336 9.26837 -8.25313 8.91204 -2.87758 4.00212 --0.708243 0.789072 -3.28656 4.55872 -5.73177 5.80293 -5.40596 5.5844 -4.09318 4.57774 -6.16178 7.00613 -8.5514 10.5495 -6.83987 7.3056 -1.06341 1.97923 -7.82153 9.00722 -0.923069 1.42337 -1.83408 2.82331 -5.75305 7.23576 -0.241909 0.96721 -1.16645 2.10491 -5.41819 6.09839 -7.49242 7.69495 -0.347233 0.383681 -2.33245 2.53467 -4.91249 5.27759 -8.11182 9.2758 -0.0955456 0.548659 --0.359909 0.48055 -1.64759 3.47097 -6.37855 7.40015 -0.423283 2.08857 -4.10068 4.46856 -2.58389 2.69626 -0.848483 2.72258 -8.67321 8.88903 -2.07607 3.42398 -3.11033 3.80741 -2.24735 3.48626 -8.11883 8.7687 -0.29959 1.41603 -4.84924 5.13641 -1.44102 1.74592 -1.13437 2.50296 -1.75876 3.09859 -4.75363 5.90838 -7.36423 8.20074 -5.51578 6.42652 -0.915633 1.86015 -9.44679 10.3479 -2.61691 3.60215 -6.26524 7.2538 -2.74326 3.12649 -5.83934 6.98592 -9.1111 10.4891 -2.27066 2.82709 -8.19359 8.67233 -0.834236 1.7066 -6.19288 7.21392 --0.249843 0.891821 -2.5652 3.25132 -5.25356 5.88905 -3.99545 4.18918 -1.93186 2.51527 -4.44621 4.82421 -5.89181 7.36963 -2.77321 3.60627 -2.76444 3.88016 -2.50062 2.66105 -1.14846 1.66146 -2.951 4.81656 -3.81976 4.01061 -4.75674 5.59916 -6.74092 7.08289 -2.09989 2.32514 -0.220723 0.865303 -5.48107 5.71875 -1.48372 2.88941 -0.484577 1.12051 -8.93618 9.7185 -1.89769 3.65655 -2.0129 3.55214 -9.23173 10.3694 -0.286189 1.22753 -0.453785 1.55541 -2.24068 2.6541 -8.80917 10.4969 -7.12801 7.15222 -9.25745 9.9103 -5.73429 6.76901 -7.54454 8.47157 -1.96008 3.74997 -8.00837 9.25665 -1.66384 2.07613 -5.53014 5.97461 --1.32495 1.33319 -4.58479 5.2263 -7.92048 8.75668 -6.87595 7.02522 -0.157713 0.389585 -7.48277 7.51261 -8.10714 8.38399 -0.0802723 0.587088 -1.13024 1.71135 -5.71769 6.84757 -3.08261 4.31054 -2.95952 5.09762 -6.62815 7.44256 -5.0805 5.8499 -3.38489 3.73265 -1.10644 2.18331 -4.70493 7.31686 -2.2253 2.6338 -0.778359 1.6265 -6.94211 7.2149 -4.20976 4.99342 -7.47792 7.67881 -7.06219 8.76137 -4.97677 6.12206 -6.30829 6.69361 -6.19977 6.76781 -9.67636 10.2172 -3.41958 3.69137 -0.374486 0.943711 -4.00837 4.80107 -8.85401 10.1325 -6.0938 7.8919 -1.51055 3.08998 -8.94594 10.3139 -1.06714 2.65511 -0.703202 0.850595 -4.87735 6.00659 -8.3067 8.39924 -7.78071 8.3155 -1.98737 2.81116 -6.86323 8.07974 -1.03479 1.34584 -0.490512 0.670211 -5.82122 6.1901 -5.50836 6.63385 -7.9192 8.9606 -0.913719 2.18983 -4.97151 5.70909 -4.19907 4.37712 -2.01188 2.63318 -7.84813 9.3771 -5.32667 7.48502 -8.50951 10.1006 --0.551637 0.930509 -1.06511 2.23353 -1.91111 3.42663 -9.37528 9.55327 -7.27975 7.38741 -3.46676 4.83165 -7.36137 8.70333 --0.295762 0.623228 -8.48558 8.81076 -2.71689 3.41873 -6.49265 8.11042 -5.25516 5.57336 -6.10462 7.05991 -8.76997 9.15164 -7.86196 8.30651 -7.82765 9.24604 -5.98573 6.34182 -6.45367 7.47857 -3.27018 5.10835 -1.3079 2.37423 --0.261387 0.338113 -7.60683 8.81791 -4.7346 7.41988 -5.25597 5.28517 -3.76704 4.52226 -3.91774 6.66976 -5.69618 8.92667 -1.86148 3.07531 -5.57404 6.51438 -9.39049 9.77921 -2.38692 4.21416 -6.84909 7.23633 -7.2379 7.58761 -4.73485 6.11606 -7.80013 8.08105 -1.72701 3.40244 -2.44475 4.4072 -9.72565 9.77726 -3.35288 4.06493 -8.91215 9.92325 -8.67991 9.65865 -0.253195 0.764339 -4.23564 5.59497 -1.84752 2.14986 --0.502957 0.528737 -1.32656 2.11347 -9.81563 10.0213 -7.60114 8.05035 -8.51797 8.83342 --0.394604 1.41267 -7.71614 8.63514 -0.530249 0.968898 -2.90463 3.01675 -7.58098 8.71658 --0.253747 1.28827 -1.832 2.39006 -7.2268 7.27225 -3.84076 4.66703 -2.2564 2.73185 -7.31508 8.46008 -4.99387 5.64948 -7.21239 7.79983 -7.60231 7.8473 -0.555482 1.41892 -1.25539 1.73665 -8.41561 8.96404 -5.06771 5.17664 -0.0655744 2.10718 -8.00222 8.65909 -7.48841 7.83609 -6.30909 6.89448 -9.1697 9.55942 -1.36259 2.22582 --0.923854 0.994771 -3.43724 4.64053 -8.09411 8.19574 -4.84869 5.52805 -2.69802 3.4119 -9.0613 9.29405 -0.565216 0.687165 -5.93495 6.57426 -1.86925 2.75493 -1.41068 2.00824 -1.60612 1.62471 -3.11499 5.89909 -2.69806 3.90538 -3.76301 4.22135 -3.30065 4.70725 -5.56461 7.02137 -8.35335 8.99287 -4.79259 4.88508 -6.7911 7.52912 -8.14843 8.28583 -3.67629 5.06406 -5.71462 7.04747 -9.06721 9.99733 -4.87932 6.8586 -8.00814 9.57664 -7.03069 7.51623 -9.0989 9.57644 -2.70873 3.91296 -1.64425 1.7007 -6.53716 6.99033 -8.29874 8.74509 -1.88941 2.57626 -4.65337 5.23247 -9.04723 9.06665 -3.52258 3.61496 -1.1207 1.80143 -0.680601 1.98384 -2.94593 5.38692 -2.65685 2.67932 -9.00469 10.2054 -6.44318 7.2657 -4.66656 5.33893 -3.41719 4.72453 -3.12403 4.21748 -6.67973 6.81775 -3.54347 4.14978 -3.02554 3.50812 -3.91883 3.93657 -7.31721 7.89895 -1.86275 2.85473 -6.23266 6.4449 -7.59855 9.38013 -9.07084 9.49309 -0.557656 2.6851 -6.899 7.37693 -4.23162 5.84314 -8.54108 9.37672 -3.9513 4.79746 -7.299 8.29678 -5.58879 5.88551 -9.14992 9.22385 -9.1914 9.31788 -4.95663 5.56316 -2.16516 2.39538 -0.722262 1.89664 -7.76447 7.80026 -2.77772 3.39136 -9.59513 9.78635 -1.02728 1.2181 -7.32631 7.56611 -7.37389 7.46163 -6.87949 8.18689 -8.95602 9.81169 -5.85364 6.63434 -0.129136 2.13484 -7.09608 7.71167 -7.1487 8.34258 -7.48738 8.3172 -8.77247 9.95985 -7.6706 9.56828 -8.14268 8.61726 -6.5455 7.90871 -4.57866 4.78453 -3.63937 4.42349 -5.18905 5.36516 -4.68884 5.62995 -5.88338 7.83824 --0.002979 0.145818 -4.42981 4.77141 -0.558593 1.07999 -6.91713 7.36159 -5.13948 6.20805 -3.34368 4.07112 -7.27365 7.8383 -9.6898 9.9514 -6.14332 6.75102 -2.16534 2.78843 -2.8007 4.37952 -7.67047 7.72955 -8.77377 9.85092 -1.26087 1.55193 -6.29788 6.58511 -7.68178 9.05777 -0.383336 1.21247 -2.55185 4.30874 -8.91971 9.21836 -3.67638 4.68596 -8.13843 9.13684 --0.424353 1.97502 -2.71499 2.93977 -0.104447 0.387901 -4.09592 4.67009 -0.808593 0.920798 -5.01258 6.30662 -4.97668 6.57412 -8.44135 9.03816 -2.78932 3.72809 -6.71337 7.15128 -4.27234 4.50127 -6.78266 9.70351 -6.48026 7.51491 -7.36296 8.42283 -4.80339 7.3704 -6.24735 7.3132 -0.134626 0.364187 -2.73854 4.09422 -0.809997 1.19657 -6.41154 6.50244 -7.16847 8.56485 -1.53582 3.33985 -1.92874 2.86427 -6.95941 7.01378 -5.8592 6.54917 -2.51802 2.75622 -3.3894 3.6957 -2.2547 2.64693 -8.62054 9.1951 -8.86378 10.0003 -1.87892 2.28732 -3.83146 4.21484 -1.53262 1.99692 -7.86048 7.93125 -1.79437 2.68269 -3.92781 4.24119 -5.43044 5.47935 -0.322904 0.618854 -3.42383 5.18531 -4.00989 5.83612 -7.06304 8.76582 -5.88039 6.77654 -8.638 8.9479 -1.73391 2.09002 -1.04861 2.84779 --0.313019 0.557659 -3.35245 4.1308 -9.05373 9.57205 -5.85684 6.49193 -6.00719 6.86421 -4.25244 4.65772 -5.15865 5.61529 -8.78498 9.77544 -8.33803 9.26452 -3.42915 4.92279 -8.29884 8.94035 -5.10232 5.35924 -4.33571 4.86695 -7.86184 7.90029 -7.34345 7.36214 -0.201624 0.800371 -9.05882 10.5503 -4.32188 5.03154 --0.0456982 1.22298 -2.90921 3.60013 -1.69306 2.36564 -7.79029 9.15059 -4.65205 5.06538 -6.34552 8.32176 -7.92695 9.32585 -7.17903 8.09903 -9.53561 9.60287 -0.365723 1.23929 -0.542889 0.849053 -8.15061 8.93512 -6.40042 6.41053 -5.82666 6.5488 -1.00893 1.83717 -1.76021 2.11893 -7.61076 8.6242 -2.32513 3.4856 -4.39023 6.01094 --0.11754 0.421848 -6.76371 6.94513 -4.67607 5.58732 --0.201992 0.765553 -7.42926 7.44429 -2.57485 2.85339 -2.74138 4.13421 -8.21645 9.18107 -6.28184 6.4996 -7.129 7.74678 -7.76842 8.74924 -3.5359 4.35892 -3.04103 3.24376 -2.29389 2.92164 -6.96306 7.64415 -8.82053 9.04584 -1.19911 2.06167 -5.91357 7.6773 -0.150241 1.23291 -4.48681 5.41762 -6.89156 8.13443 -5.37828 5.79944 -2.13694 2.91102 -1.35932 2.08272 -6.14309 6.23278 -4.03202 5.88521 -7.23417 7.43704 -1.2501 2.60793 -2.12334 3.65727 -7.05722 8.77078 -0.437873 0.585933 -6.33338 9.16643 -2.44724 4.40234 -2.92012 3.64047 -1.2039 3.25195 -8.6611 10.0398 -8.0088 9.13622 -5.96562 7.08515 -5.45181 6.65246 -0.742546 2.38958 -4.12919 4.93571 -0.428823 0.84483 -1.45226 2.5869 -9.50727 10.0211 -7.69194 8.66273 -1.25706 2.44554 -5.23247 5.47762 -0.499178 1.70722 -7.26569 8.72467 -3.59815 5.50022 -1.03601 2.43445 -0.092414 0.927635 -3.7917 3.995 -6.21977 8.40398 -3.1513 3.81188 -9.80482 10.0951 -8.65564 9.33687 -2.06164 3.49152 -2.09754 2.34929 -0.66126 2.31888 -5.34832 6.82603 -7.91038 8.59105 -0.695523 0.800961 -2.33406 2.71629 -8.37774 10.9253 -9.7682 10.106 -9.44382 9.5743 -8.78009 9.47645 -1.87309 3.04127 -1.86724 2.13913 -3.30049 3.52416 -7.18508 7.6648 -1.3736 2.12153 -2.41879 5.06716 -1.87815 2.29743 -1.76646 2.06335 -9.73034 9.95475 -0.497489 0.686102 -6.96908 7.17338 -9.23111 10.0148 -3.30981 4.21787 -9.53311 10.3734 --0.067709 0.147251 -8.44557 8.82047 -7.10407 7.47639 -0.834352 1.36908 -9.1598 10.6508 -4.22018 4.38279 -3.8295 3.95462 -3.97302 4.97247 -1.55856 2.31013 -0.0217962 0.486978 -1.69845 2.65786 --0.489562 0.582187 -5.10621 5.6055 -9.8478 9.85919 -6.15389 6.92324 -7.11469 8.0418 -3.20625 3.78209 -5.93389 7.66892 -1.15134 1.18023 -6.84797 7.4239 -2.9483 3.22279 --0.43205 0.764755 -7.17846 7.33313 -5.4729 8.26894 -6.19512 7.32132 -0.591934 0.767568 -0.49266 1.80691 -9.08272 9.72242 -5.85683 6.36905 -5.27625 7.13913 -3.60853 3.98155 -0.642811 1.10253 -1.27117 1.5329 -8.76096 9.61776 -4.9498 5.12847 -7.53282 7.80438 -1.40487 1.65657 -3.45329 3.84307 -3.25698 3.49614 -2.38651 2.89802 -8.23114 8.99016 -9.58516 10.4145 -5.5185 6.27733 -0.583068 0.892249 -1.93142 2.35084 -7.94845 9.22667 -2.47963 3.9005 -3.46106 3.86301 -7.77744 8.43735 -1.41072 1.73969 -9.12904 10.4307 -3.52227 3.66861 -5.4743 5.86487 --0.51727 1.63657 -5.09861 7.03162 -5.14763 5.93411 -3.23526 3.47376 -0.9702 1.74063 -9.28366 10.3322 -1.80257 1.92265 -8.63597 9.08467 -4.16006 4.97753 -6.37418 6.39374 -5.82376 6.62429 -7.74751 8.68962 -1.63821 2.53399 -4.9864 6.40969 -0.680772 0.995608 -3.74344 3.83319 -0.898055 1.8593 -2.36839 2.39307 -7.21046 7.51006 -0.60893 2.91523 -3.15017 4.30412 -5.02219 6.28886 -4.60541 4.73379 -8.41196 8.58978 -8.84706 10.8198 -6.95807 7.54952 -5.54729 6.9315 -4.62574 4.73423 -3.35252 3.59865 -1.02207 1.71791 -3.16408 3.73993 -0.639222 1.69519 -7.57978 8.05813 -2.41371 2.77174 -8.65544 10.093 -6.31988 6.70758 -6.5301 8.39328 -0.578825 1.20331 -1.1243 2.07824 -5.86555 6.72397 -6.37103 6.81736 -1.12086 3.46541 -2.59503 3.44073 -5.27128 5.3616 -2.87331 3.4352 -5.48408 6.67916 -3.36016 4.09125 -0.813671 0.9811 -0.812162 3.22209 -6.85104 6.86306 -0.671311 0.979685 -2.75962 2.82659 -2.42186 2.49827 -7.82974 9.59669 -3.48851 3.60085 -8.47775 10.9574 -8.6863 10.6155 -0.196484 1.07469 -1.19293 1.45012 -5.79166 6.18466 -6.51597 6.6793 -9.78341 10.1992 -8.17879 9.59257 -6.96178 8.73165 -4.09161 4.31908 -3.19514 3.4072 -5.5101 6.32978 -0.188435 1.84481 -9.41738 10.0379 -1.46994 1.6294 -4.21915 5.39529 -5.46567 5.86638 -8.19414 9.201 -4.38616 4.55193 -2.31105 2.73345 -6.05897 6.12297 -8.84135 9.74232 -9.44943 10.2225 -3.27501 3.66059 -0.524904 1.74374 -7.7228 8.43799 -5.13274 5.82863 -8.2787 8.94491 -1.61463 2.03499 -7.04346 8.69977 -0.938308 2.38676 -0.00208037 0.0186158 -1.98744 2.05864 -7.05787 8.16211 -1.68383 2.04684 -2.24812 2.28257 -0.685061 1.2947 -2.25379 2.92827 -6.0052 6.24797 -7.06213 7.86344 -0.751849 2.96376 -0.0977921 0.513746 -8.43792 9.10545 -2.80769 3.09276 -9.19308 9.59741 -4.74365 4.99708 -8.41385 8.58422 -4.28093 5.9281 -4.26205 4.75417 -1.48035 1.61363 -1.4264 1.80922 -3.48365 4.52935 -1.78396 2.96351 -8.4134 8.96536 -8.65646 9.34781 -1.88027 2.97804 -8.92531 9.02743 -6.91815 7.88895 -5.68023 7.37521 -3.93105 4.6123 -0.385874 1.30785 -1.80151 2.24385 -8.43781 9.33927 -6.69643 8.001 -6.12062 6.673 -4.8316 6.63067 -9.00443 9.08204 -1.5651 2.65023 -3.57517 4.40231 -5.85127 8.02219 -8.02586 10.018 -2.00514 2.75138 -6.32104 7.84285 -8.90914 9.78319 -4.91325 6.27817 -3.87406 4.80327 -8.57887 9.30685 -1.40351 1.71079 --0.217977 0.224497 -8.37711 9.56393 -5.54644 5.77714 -8.18206 8.36015 -0.774967 1.97899 -9.10434 10.1721 -9.39621 10.1135 -4.80108 4.90605 -9.45978 9.96227 -2.85412 4.05215 -5.71985 7.16735 -2.35081 2.82214 -9.34881 10.5899 -7.13014 7.82872 -4.54931 4.89725 -9.41397 9.9131 -8.90226 9.55276 -8.27995 9.83651 -9.2767 9.6053 -0.388751 1.40317 -5.01478 5.88869 -6.41521 7.21754 -1.22552 1.39067 -3.75771 3.81571 -4.39362 6.04592 -8.82639 8.84544 -4.59289 4.89208 -1.52235 1.64285 -1.85893 4.52056 -1.91781 2.78253 -3.34677 4.54987 -9.26905 10.6019 -7.10958 8.02083 -0.765257 1.66957 -2.17169 2.70214 -4.2293 6.38089 -1.41111 2.45992 -5.76864 6.85715 -2.19944 2.93182 -9.03727 9.6454 -3.82652 4.35225 -2.52642 3.09725 -7.77868 9.35844 -0.337665 1.00787 -1.92021 2.04418 -4.41862 5.95486 -9.47606 9.62386 -1.12113 1.55658 -5.26701 7.09712 -8.81478 9.34863 -6.29447 7.43847 -2.82379 3.57268 -7.9735 8.79936 -3.30176 5.50666 -6.36009 6.8864 -4.13583 5.00627 -0.510514 0.882245 -6.93864 7.78543 -2.04039 2.4298 -3.18337 3.19424 -4.20059 4.67088 -0.316687 0.707377 -0.169106 1.68194 -8.26665 10.2362 -1.1124 1.78306 -2.84603 3.33142 -9.48756 9.96651 -9.4301 9.7316 -0.234674 1.23981 -0.493232 0.522565 -1.342 1.41739 -2.57196 4.08221 -1.54201 2.52284 -5.32049 6.00052 -8.54218 8.59452 --0.030524 1.64476 -2.31645 2.72528 -4.71898 4.92827 -0.0872997 1.74969 -0.994278 1.76964 -1.34411 2.77952 -0.156817 2.10245 -5.78094 6.34389 -3.09336 3.10563 -8.14245 9.0928 -9.34202 9.75484 -9.78415 10.0211 -4.68383 5.19384 -6.09441 7.90512 -6.74941 6.76118 -1.78693 1.91697 -2.34369 2.62141 --0.20756 0.829082 -3.57681 5.11448 -2.44234 4.45153 -4.84521 5.31902 -1.80487 3.64498 -2.46125 3.02549 --0.334514 0.64288 -8.06406 8.49886 -1.74559 2.54474 -6.05883 6.46529 -9.00014 10.2271 -8.00064 8.5061 -0.909467 0.980765 -8.65862 8.69736 -8.11457 8.77049 -3.93237 5.02485 -4.64507 5.34852 -3.92405 4.19449 -5.02381 5.21722 -3.76203 3.78396 -6.74925 7.34781 -8.2556 8.63585 -3.92521 3.99739 -1.44641 2.31509 -0.23516 0.917239 -4.4614 6.35489 -3.33221 3.95247 -1.73289 2.07919 -6.92385 7.55052 -8.74351 9.41125 -9.41451 10.1785 -7.4001 8.81081 -2.97038 3.12524 -7.26043 7.77569 -5.56625 5.59344 -5.70977 6.33362 -7.61443 8.43218 -1.05308 1.82947 -0.377602 1.57633 -6.42483 7.51505 -4.73011 5.43693 -7.72 8.09098 -9.20063 9.82287 -6.88273 7.35327 -6.88423 7.68356 -3.55293 3.6227 -0.947096 1.76021 -3.66411 5.67117 -9.31422 10.1035 -6.84847 6.98956 -2.16221 4.45806 -0.853284 3.15932 -2.48673 2.89793 -3.37633 3.90938 -1.6141 1.66363 -1.6658 3.01723 -0.419408 1.01736 -0.712239 0.791538 -2.25249 3.62425 -8.09772 10.2367 -1.46651 1.48148 -1.73233 2.0489 -7.42679 9.23232 -7.97446 9.53281 -2.74677 4.03955 --0.169412 0.872795 -4.90663 5.40277 -7.62122 9.49334 -6.55971 7.34259 -3.71957 5.03775 -3.33226 4.06459 -0.634912 1.52603 -3.65506 4.09318 -4.31463 4.60534 -8.58287 9.85385 -0.334759 0.7232 -2.14027 2.866 -6.06611 6.3625 -2.53013 3.18764 -4.30913 4.89247 -6.53234 6.92328 -7.66419 8.61762 -1.37598 2.26754 -8.06279 8.80692 -5.28688 5.70608 -0.509396 1.34606 -8.80589 9.29765 -9.3801 10.3988 -0.402662 0.597735 -5.87213 6.63371 -2.79136 3.763 -6.20615 7.25189 -7.54065 9.62156 -4.12107 5.04454 -5.60294 6.69246 -1.20845 1.49272 -1.75679 2.56397 -2.83939 3.85147 -6.21362 6.71341 -9.01824 9.2388 -4.66617 5.04944 -1.48766 2.55674 -8.89442 9.42175 -5.29411 5.39531 -6.66271 8.68733 -0.730461 1.42466 -6.22927 6.55086 -0.566776 1.17299 -3.06104 4.17775 -5.28026 5.73966 -5.76071 7.61585 -7.83786 9.58106 -6.32199 6.46961 -8.89555 9.17429 -3.85772 4.97805 -6.63352 8.79211 -7.87234 7.94131 -6.53479 7.87979 -3.90293 4.50376 -6.21371 7.31788 -1.00497 1.75003 -6.90351 8.02435 -2.29142 3.9809 -6.26632 6.45283 --0.0354471 1.31727 -8.80046 9.20169 -7.86905 8.36819 -0.848737 1.82393 -7.98136 9.40712 -3.97765 4.95399 -8.70252 9.26275 -3.13412 4.29389 -2.06446 3.55839 -7.67918 8.44509 -5.96082 6.40336 -1.20461 2.36924 -4.76741 5.74978 -9.41217 9.94305 -7.36736 8.07119 -3.44102 3.56957 -3.59893 4.52751 -4.2613 6.41628 -1.65321 3.02235 -3.70067 3.86657 -0.0176327 1.1215 -4.13592 4.88595 -8.73668 9.0834 -1.80944 2.95584 -6.05721 6.93009 -5.08206 5.38626 -1.86749 1.89392 -3.58284 4.10506 -0.0885586 1.47709 -5.46502 5.93066 -8.45338 8.47878 -3.46789 4.02317 -0.975506 1.15814 -7.12758 7.60073 -7.99582 8.56746 -3.11435 3.83805 -4.51166 4.52472 -8.39096 8.75934 -8.42208 9.66019 -2.48498 4.73703 -3.50301 4.81264 -6.40196 7.0733 -8.52138 8.82265 -1.49822 1.74634 -7.08547 7.93508 -3.47832 4.42948 -6.08646 6.20865 -4.46334 4.65278 -3.80008 4.08214 -3.4853 5.44308 -5.48109 6.18681 -6.59161 8.04307 -7.36554 7.38201 -5.2144 5.31725 -4.62607 7.25804 -1.24345 1.81263 -5.49248 8.16867 -6.4056 8.26316 -7.67828 8.56923 -2.46187 2.56974 -2.22942 3.27248 -7.14933 8.06682 -2.3236 2.95462 -4.18028 4.80535 -4.981 5.54215 -7.23261 7.34863 -4.96309 6.06396 -4.24402 4.44364 -0.917707 1.32687 -1.19806 1.65106 -3.7725 5.31412 -9.70021 9.84203 -5.99824 7.77474 -3.32636 3.84266 -8.59841 9.07653 -7.9916 9.14415 -0.786519 1.84655 -0.166394 1.47834 -2.87633 3.52808 -7.53804 9.56807 -6.14406 6.16189 -1.63428 3.96845 -1.10307 1.58897 -1.30032 2.85313 -7.89803 8.32723 -8.77593 8.90136 -1.68804 2.69447 -4.5956 4.6743 -7.39643 8.29839 -6.93629 7.82243 -6.10289 7.677 -1.83835 2.34295 -1.04506 1.91684 -8.95277 9.43817 -0.36153 0.643665 -1.02408 3.18963 -4.02972 4.40301 -2.80428 2.82552 -6.51718 6.64956 -0.185341 1.56607 -6.1658 7.59364 -4.09288 4.11687 -6.90205 7.16338 -5.0755 5.39478 -4.5614 4.83286 -5.8489 8.76295 -9.70079 10.0431 -8.44334 8.54714 -3.00139 3.66327 -5.34458 6.38895 -7.11481 7.96865 -4.66776 5.15678 -0.390138 0.53352 -2.01116 3.32839 -6.78761 6.97068 -4.57477 5.0724 -1.14098 1.36134 -7.4559 8.30327 -0.700932 2.40437 -1.90469 1.99046 -4.30064 5.11485 -7.84433 8.48543 -5.96212 7.49882 -3.93055 3.96317 -0.546327 1.04814 -8.96011 9.0404 -7.89255 8.06149 -0.669924 2.6944 --0.00972314 0.837474 -6.07199 6.37467 -2.73659 3.19833 -5.9576 7.10966 -9.1316 9.14737 -5.26101 6.59184 -5.77697 8.08876 -0.68623 0.782805 -0.842619 1.39893 -5.82075 6.15957 -4.36394 4.88479 -7.1828 7.90107 -3.3331 4.39923 -6.54243 7.24966 -2.809 2.96491 -4.18514 4.61948 -4.95453 5.33929 -8.33288 9.52867 -9.05785 10.4276 -2.58917 4.74403 -1.34279 1.89014 -4.93626 5.75424 -7.75031 7.92788 -9.00904 9.02402 -3.91286 5.15124 -6.98486 7.34688 --0.173169 0.415019 -0.652242 1.51556 -3.50184 5.30486 -3.72563 4.09022 -4.60463 6.58985 -3.34219 4.31833 -2.55445 2.58651 -6.14573 6.3669 -4.52336 6.37342 -9.37606 9.76836 -2.4198 3.36929 -2.89109 3.66974 -5.62463 6.05989 -0.674219 1.84165 -0.590017 1.71153 -1.54622 2.10277 -6.48003 6.55663 -3.56355 3.98573 -0.743671 1.87049 -3.27833 6.0722 -4.76267 6.9967 -2.80188 4.03037 -0.372694 0.482111 -5.73987 5.9529 -8.84732 9.49033 -0.833944 1.8157 -4.06126 4.36615 -0.884619 2.34622 -6.86723 6.99141 -8.07737 9.05193 -8.35903 9.00761 -8.84777 9.74001 -8.58058 9.05479 -8.28076 8.44566 -4.55155 5.65475 -2.44314 3.38966 -3.22172 4.50395 -7.1808 7.90376 -0.639636 1.72606 -5.46807 5.94322 -9.02146 9.87864 --0.628472 0.655557 -4.29775 5.9553 -6.77525 7.38152 -6.51827 6.93542 -8.95252 9.52939 -0.755406 1.19973 -7.69455 7.86912 -0.170143 1.12949 -7.69254 8.08221 -2.08238 3.27051 -1.28662 1.78628 -1.21208 2.79391 --0.155739 1.7071 -8.28833 9.10011 -5.77789 6.6954 -1.98395 2.35216 -5.77469 6.05177 -2.77565 5.81092 --1.53416 2.30576 -6.93529 8.04506 -3.91553 4.55593 -5.57201 6.29071 -1.54149 1.86613 -4.09163 4.31234 -8.47834 11.1229 -5.70376 7.02981 -2.24683 3.79925 -5.4793 6.41036 -5.27644 6.81729 -0.13273 0.371437 -1.22959 1.41618 -0.551957 1.03276 -2.01269 2.4018 -8.77113 9.09395 -8.11753 8.46262 -0.39406 0.783705 -5.35964 5.48227 -7.24727 8.23233 -7.74525 8.85748 -0.0115736 0.882607 -1.78575 2.19684 -8.32514 9.0503 -3.11074 3.34975 -0.847464 2.13237 -0.310898 0.393528 -8.68841 10.518 -1.10032 1.83755 -2.42286 3.02554 -1.16364 2.80986 -1.46419 2.11421 -7.46021 7.90273 -6.86556 7.62542 -1.91466 3.79843 -3.1056 3.83969 -3.41591 4.26565 -0.285122 1.21372 -3.75441 5.52385 -1.07643 2.63403 -6.17341 7.67244 -9.13122 9.5132 -4.39696 6.15885 -3.7207 4.07729 -6.80782 7.1958 -6.65933 6.67105 -8.51535 8.7263 -5.98305 7.17759 -2.19609 2.46108 -8.21186 8.96908 -2.94729 3.60562 -3.31907 3.9297 -0.463492 0.626603 -2.62143 3.55089 -5.76898 6.79002 -1.45502 1.56525 -4.80797 5.62389 -5.87337 6.70588 -2.92765 3.50929 -0.412987 0.951057 -3.64594 4.40269 --0.043401 0.502176 -4.54802 5.44613 -1.20218 1.8732 -2.75547 2.96745 -7.10348 7.7945 -9.74845 9.98835 -4.83718 6.4836 -2.30563 2.5903 -4.74016 6.30789 -6.42192 6.93329 -5.37294 6.73938 -2.4365 3.05787 -1.08283 3.79193 -4.90426 5.93563 -3.8874 4.83301 -0.13909 0.983027 -4.07407 5.61421 -8.62875 10.6851 -8.10233 8.29952 -2.23047 2.4691 -7.34617 7.39475 -1.66309 2.3032 -7.11207 10.0686 -4.52412 6.38666 -2.48323 2.96878 -7.47877 8.86547 -2.67607 4.33436 -6.83659 8.21075 -2.87313 3.39011 -2.81911 4.07729 -0.227877 0.657898 -6.57843 7.14311 --0.591405 1.56925 -7.08018 7.59 -9.09558 9.3923 -9.48544 9.79474 -0.740233 2.33129 -8.51111 11.134 -7.79219 8.0281 -1.73821 1.89316 -9.21077 9.29488 -5.38354 6.46025 -4.30403 4.5472 -0.0893758 0.919238 -7.94464 8.51053 -5.27119 6.3741 -5.22476 6.00588 diff --git a/geom_matching/wasserstein/tests/data/test_5_A b/geom_matching/wasserstein/tests/data/test_5_A deleted file mode 100644 index 51cff1c..0000000 --- a/geom_matching/wasserstein/tests/data/test_5_A +++ /dev/null @@ -1,5 +0,0 @@ -7.50638 7.78005 -0.991758 2.12178 -5.18481 6.61702 -6.14703 7.08581 -4.09936 4.83024 diff --git a/geom_matching/wasserstein/tests/data/test_5_A.pd.dipha b/geom_matching/wasserstein/tests/data/test_5_A.pd.dipha deleted file mode 100644 index be84441..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_5_A.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_5_B b/geom_matching/wasserstein/tests/data/test_5_B deleted file mode 100644 index be62ed3..0000000 --- a/geom_matching/wasserstein/tests/data/test_5_B +++ /dev/null @@ -1,5 +0,0 @@ -5.8232 6.36308 -2.16066 2.48668 -2.38754 4.91418 -4.77403 5.43982 -0.291412 1.11147 diff --git a/geom_matching/wasserstein/tests/data/test_5_B.pd.dipha b/geom_matching/wasserstein/tests/data/test_5_B.pd.dipha deleted file mode 100644 index 14ca67c..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_5_B.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag1_A b/geom_matching/wasserstein/tests/data/test_diag1_A deleted file mode 100644 index f7f90ff..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag1_A +++ /dev/null @@ -1 +0,0 @@ -1.0 1.0 diff --git a/geom_matching/wasserstein/tests/data/test_diag1_A.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag1_A.pd.dipha deleted file mode 100644 index fa4a4d9..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag1_A.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag1_B b/geom_matching/wasserstein/tests/data/test_diag1_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag1_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_matching/wasserstein/tests/data/test_diag1_B.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag1_B.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag1_B.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag2_A b/geom_matching/wasserstein/tests/data/test_diag2_A deleted file mode 100644 index a167a4f..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag2_A +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_matching/wasserstein/tests/data/test_diag2_A.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag2_A.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag2_A.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag2_B b/geom_matching/wasserstein/tests/data/test_diag2_B deleted file mode 100644 index a167a4f..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag2_B +++ /dev/null @@ -1 +0,0 @@ -5.0 5.0 diff --git a/geom_matching/wasserstein/tests/data/test_diag2_B.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag2_B.pd.dipha deleted file mode 100644 index 621a55f..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag2_B.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag3_A b/geom_matching/wasserstein/tests/data/test_diag3_A deleted file mode 100644 index 151d4b1..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag3_A +++ /dev/null @@ -1,220 +0,0 @@ -1.391781911475341 1.391781911475341 -1.395142124726278 1.395142124726278 -1.514181227875788 1.514181227875788 -1.528291566797427 1.528291566797427 -1.585389310674157 1.585389310674157 -1.629232116709072 1.629232116709072 -1.641428662445941 1.641428662445941 -1.646998748860116 1.646998748860116 -1.652915988616469 1.652915988616469 -1.69199679556404 1.69199679556404 -1.705727462482595 1.705727462482595 -1.706819293048617 1.706819293048617 -1.720175733750729 1.720175733750729 -1.728031840308488 1.728031840308488 -1.73797421040929 1.73797421040929 -1.739519744204842 1.739519744204842 -1.76132425248022 1.76132425248022 -1.767766952966369 1.767766952966369 -1.792444271021371 1.792444271021371 -1.831487552809192 1.831487552809192 -1.837086616049901 1.837086616049901 -1.851186504948943 1.851186504948943 -1.860502132730509 1.860502132730509 -1.8619433117852 1.8619433117852 -1.878229072834972 1.878229072834972 -1.880655074837347 1.880655074837347 -1.883647832802556 1.883647832802556 -1.884127769927503 1.884127769927503 -1.892969784466709 1.892969784466709 -1.916936460787894 1.916936460787894 -1.931545068229315 1.931545068229315 -1.937626522143119 1.937626522143119 -1.942267721488891 1.942267721488891 -1.963295334827521 1.963295334827521 -1.975655395743736 1.975655395743736 -1.981448090925679 1.981448090925679 -1.986220565173897 1.986220565173897 -1.98709020812351 1.98709020812351 -1.989420269013254 1.989420269013254 -2.007874648480185 2.007874648480185 -2.012179388983059 2.012179388983059 -2.019051972834053 2.019051972834053 -2.023278848058142 2.023278848058142 -2.026190677562545 2.026190677562545 -2.041594763633561 2.041594763633561 -2.042508934597344 2.042508934597344 -2.04305394648524 2.04305394648524 -2.052514683218775 2.052514683218775 -2.059038785694094 2.059038785694094 -2.062577320792516 2.062577320792516 -2.063488177732052 2.063488177732052 -2.067806664626417 2.067806664626417 -2.073013782498534 2.073013782498534 -2.08646120854976 2.08646120854976 -2.098476357223667 2.098476357223667 -2.101378199886176 2.101378199886176 -2.101927506425904 2.101927506425904 -2.12671744783454 2.12671744783454 -2.143966150630584 2.143966150630584 -2.145312642688415 2.145312642688415 -2.148704396208969 2.148704396208969 -2.153092682531471 2.153092682531471 -2.157553654759374 2.157553654759374 -2.176659075756566 2.176659075756566 -2.177260578806816 2.177260578806816 -2.179141269427014 2.179141269427014 -2.201895416482074 2.201895416482074 -2.202563945779844 2.202563945779844 -2.205113735193028 2.205113735193028 -2.207345865351049 2.207345865351049 -2.208922099676958 2.208922099676958 -2.218057898922937 2.218057898922937 -2.228610453267036 2.228610453267036 -2.241314066596301 2.241314066596301 -2.242145210071643 2.242145210071643 -2.253976266568437 2.253976266568437 -2.255324860119305 2.255324860119305 -2.271300972641221 2.271300972641221 -2.279438361991067 2.279438361991067 -2.286592331830957 2.286592331830957 -2.287159411646074 2.287159411646074 -2.296653147995115 2.296653147995115 -2.301754785182811 2.301754785182811 -2.30409930499031 2.30409930499031 -2.32141477565108 2.32141477565108 -2.347789281926012 2.347789281926012 -2.347827987256373 2.347827987256373 -2.349391321950732 2.349391321950732 -2.350129292983257 2.350129292983257 -2.358679083392328 2.358679083392328 -2.372845273125388 2.372845273125388 -2.385040766846267 2.385040766846267 -2.42114588843816 2.42114588843816 -2.425116524931602 2.425116524931602 -2.426518521893022 2.426518521893022 -2.43211651886311 2.43211651886311 -2.441302771998711 2.441302771998711 -2.446429340510857 2.446429340510857 -2.446547553904861 2.446547553904861 -2.45764765793376 2.45764765793376 -2.461222149682938 2.461222149682938 -2.467900747394114 2.467900747394114 -2.473214152160872 2.473214152160872 -2.5 2.5 -2.503557913626332 2.503557913626332 -2.504315621146863 2.504315621146863 -2.515634290122204 2.515634290122204 -2.516231935083851 2.516231935083851 -2.517558892374071 2.517558892374071 -2.526325773757754 2.526325773757754 -2.531164001388939 2.531164001388939 -2.53128061055404 2.53128061055404 -2.539387277827314 2.539387277827314 -2.540864599180268 2.540864599180268 -2.548084457784768 2.548084457784768 -2.548923292215475 2.548923292215475 -2.551730202825644 2.551730202825644 -2.553178578801818 2.553178578801818 -2.560295747947446 2.560295747947446 -2.566321603108612 2.566321603108612 -2.568932286976676 2.568932286976676 -2.574887688783916 2.574887688783916 -2.581809142325336 2.581809142325336 -2.584541960262555 2.584541960262555 -2.585511915815223 2.585511915815223 -2.592970592044868 2.592970592044868 -2.596055336381078 2.596055336381078 -2.598560573626668 2.598560573626668 -2.614019084614256 2.614019084614256 -2.618463725327216 2.618463725327216 -2.622883674481145 2.622883674481145 -2.627791161528314 2.627791161528314 -2.63535653879261 2.63535653879261 -2.654825898255443 2.654825898255443 -2.660423271276714 2.660423271276714 -2.667148030102869 2.667148030102869 -2.67012591760915 2.67012591760915 -2.698712599567882 2.698712599567882 -2.72180967799905 2.72180967799905 -2.732466204434637 2.732466204434637 -2.734187392905275 2.734187392905275 -2.737296308103857 2.737296308103857 -2.745724923243991 2.745724923243991 -2.749541709159369 2.749541709159369 -2.752925621447035 2.752925621447035 -2.754183973113479 2.754183973113479 -2.763972022430258 2.763972022430258 -2.766941997926879 2.766941997926879 -2.773850925522978 2.773850925522978 -2.777506755238121 2.777506755238121 -2.780333194223143 2.780333194223143 -2.783060349483276 2.783060349483276 -2.78679029681548 2.78679029681548 -2.786792895521339 2.786792895521339 -2.795170825459034 2.795170825459034 -2.801104989227437 2.801104989227437 -2.80525433080833 2.80525433080833 -2.805376738133109 2.805376738133109 -2.806844454092663 2.806844454092663 -2.811611818684648 2.811611818684648 -2.811994908451803 2.811994908451803 -2.816002798930236 2.816002798930236 -2.816814002472584 2.816814002472584 -2.818569391261086 2.818569391261086 -2.821660827076439 2.821660827076439 -2.822317588351085 2.822317588351085 -2.824910409962511 2.824910409962511 -2.829322097471409 2.829322097471409 -2.833852169620359 2.833852169620359 -2.839287537694811 2.839287537694811 -2.841714730677953 2.841714730677953 -2.841715058318205 2.841715058318205 -2.851653306950001 2.851653306950001 -2.853639002902003 2.853639002902003 -2.85515962291442 2.85515962291442 -2.855333736885793 2.855333736885793 -2.872540314564304 2.872540314564304 -2.879449214478037 2.879449214478037 -2.881003856158217 2.881003856158217 -2.881074731438092 2.881074731438092 -2.893589165559115 2.893589165559115 -2.898664743213686 2.898664743213686 -2.90387832180792 2.90387832180792 -2.919095859678745 2.919095859678745 -2.924945175440496 2.924945175440496 -2.931795145696962 2.931795145696962 -2.932285006979528 2.932285006979528 -2.934606807227626 2.934606807227626 -2.936392671567475 2.936392671567475 -2.953794710898493 2.953794710898493 -2.958055395706548 2.958055395706548 -2.960407744013656 2.960407744013656 -2.960759715914242 2.960759715914242 -2.969702548922556 2.969702548922556 -2.970149844982665 2.970149844982665 -2.978953970679893 2.978953970679893 -2.979075864664287 2.979075864664287 -2.984665519558418 2.984665519558418 -3.04548240149063 3.04548240149063 -3.050688336416719 3.050688336416719 -3.05773927378742 3.05773927378742 -3.059596740753369 3.059596740753369 -3.059762479996741 3.059762479996741 -3.088543279751235 3.088543279751235 -3.093580813520995 3.093580813520995 -3.104787362108069 3.104787362108069 -3.173380191779681 3.173380191779681 -3.583124637167399 3.583124637167399 -3.630658112409034 3.630658112409034 -3.631421639368965 3.631421639368965 -3.751087101339956 3.751087101339956 -3.800845709568037 3.800845709568037 -3.846558940956666 3.846558940956666 -4 4 -4 4 -4.076238038291317 4.076238038291317 -4.455547086147983 4.455547086147983 -5.356087357608394 5.356087357608394 -5.54364842773721 5.54364842773721 -7.587654388717225 7.587654388717225 diff --git a/geom_matching/wasserstein/tests/data/test_diag3_A.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag3_A.pd.dipha deleted file mode 100644 index 0dbfb89..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag3_A.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_diag3_B b/geom_matching/wasserstein/tests/data/test_diag3_B deleted file mode 100644 index bb8655a..0000000 --- a/geom_matching/wasserstein/tests/data/test_diag3_B +++ /dev/null @@ -1,193 +0,0 @@ -1.167089173446239 1.167089173446239 -1.256234452640111 1.256234452640111 -1.303693422257498 1.303693422257498 -1.413255970488646 1.413255970488646 -1.697910382446573 1.697910382446573 -1.718844728805093 1.718844728805093 -1.734124820632724 1.734124820632724 -1.749572938304276 1.749572938304276 -1.770320424526358 1.770320424526358 -1.786344763036807 1.786344763036807 -1.810054737907635 1.810054737907635 -1.815127306170105 1.815127306170105 -1.837806648681218 1.837806648681218 -1.870552189043019 1.870552189043019 -1.897240351979503 1.897240351979503 -1.935562152643027 1.935562152643027 -1.952562418976663 1.952562418976663 -1.959552126104175 1.959552126104175 -1.979899732318601 1.979899732318601 -2.00044500769347 2.00044500769347 -2.028951227523087 2.028951227523087 -2.037678749316724 2.037678749316724 -2.047911420446857 2.047911420446857 -2.075181804515723 2.075181804515723 -2.077245386452578 2.077245386452578 -2.084751316684838 2.084751316684838 -2.084860886126203 2.084860886126203 -2.103286477421968 2.103286477421968 -2.106856827309345 2.106856827309345 -2.113139266068691 2.113139266068691 -2.114594962503455 2.114594962503455 -2.115917727493158 2.115917727493158 -2.122335878797089 2.122335878797089 -2.127359082726206 2.127359082726206 -2.131673381033273 2.131673381033273 -2.155015793320908 2.155015793320908 -2.162480684365264 2.162480684365264 -2.195207236194009 2.195207236194009 -2.203279931784429 2.203279931784429 -2.205567995563669 2.205567995563669 -2.212933962936773 2.212933962936773 -2.215081271089993 2.215081271089993 -2.225989037578865 2.225989037578865 -2.24218929203347 2.24218929203347 -2.246321319993257 2.246321319993257 -2.280059407166517 2.280059407166517 -2.284117669032543 2.284117669032543 -2.293233992770926 2.293233992770926 -2.298815356955373 2.298815356955373 -2.300542634724628 2.300542634724628 -2.326408290042679 2.326408290042679 -2.328797162040625 2.328797162040625 -2.36025798094028 2.36025798094028 -2.365031313604634 2.365031313604634 -2.372266311053883 2.372266311053883 -2.400053902049271 2.400053902049271 -2.409134054334209 2.409134054334209 -2.411368235895246 2.411368235895246 -2.415934766378347 2.415934766378347 -2.420989857074179 2.420989857074179 -2.422520269961376 2.422520269961376 -2.43377629944218 2.43377629944218 -2.449308615746858 2.449308615746858 -2.452936540056068 2.452936540056068 -2.453698388060092 2.453698388060092 -2.454711357943602 2.454711357943602 -2.459202673400056 2.459202673400056 -2.493778305287384 2.493778305287384 -2.537394117473177 2.537394117473177 -2.544674753106669 2.544674753106669 -2.558904304820755 2.558904304820755 -2.563089994365716 2.563089994365716 -2.565476194422898 2.565476194422898 -2.599756049189921 2.599756049189921 -2.603619661709009 2.603619661709009 -2.609775379385211 2.609775379385211 -2.622552038976658 2.622552038976658 -2.623798471910885 2.623798471910885 -2.635711198661633 2.635711198661633 -2.644229304223612 2.644229304223612 -2.661919064427223 2.661919064427223 -2.666783921498494 2.666783921498494 -2.675503310152301 2.675503310152301 -2.684228699964661 2.684228699964661 -2.696854617267681 2.696854617267681 -2.700538654666735 2.700538654666735 -2.744886611436907 2.744886611436907 -2.748618547996708 2.748618547996708 -2.757981496641135 2.757981496641135 -2.774766825791652 2.774766825791652 -2.784491736143893 2.784491736143893 -2.796482184304273 2.796482184304273 -2.800849254751463 2.800849254751463 -2.816963410000067 2.816963410000067 -2.825207379914743 2.825207379914743 -2.831286409028398 2.831286409028398 -2.844827082550712 2.844827082550712 -2.853558438121966 2.853558438121966 -2.859806035663089 2.859806035663089 -2.878956033959891 2.878956033959891 -2.886422825109222 2.886422825109222 -2.891566924618832 2.891566924618832 -2.892028419188578 2.892028419188578 -2.893138900330932 2.893138900330932 -2.894250936382814 2.894250936382814 -2.90112201577666 2.90112201577666 -2.902172795370005 2.902172795370005 -2.90967533504119 2.90967533504119 -2.919687125962211 2.919687125962211 -2.923711238894001 2.923711238894001 -2.929041907338841 2.929041907338841 -2.938734873084349 2.938734873084349 -2.939642428979572 2.939642428979572 -2.943010909640486 2.943010909640486 -2.944210926048103 2.944210926048103 -2.951091358234723 2.951091358234723 -2.953950275008233 2.953950275008233 -2.966943157369611 2.966943157369611 -2.982522008227535 2.982522008227535 -2.992174049247434 2.992174049247434 -2.993098995839607 2.993098995839607 -2.995311055519335 2.995311055519335 -2.996708164866609 2.996708164866609 -2.999922110096644 2.999922110096644 -3 3 -3.000364533251431 3.000364533251431 -3.003840990677832 3.003840990677832 -3.006672301312824 3.006672301312824 -3.016489409140306 3.016489409140306 -3.021123787004333 3.021123787004333 -3.039117818612596 3.039117818612596 -3.039555193616473 3.039555193616473 -3.049952247267922 3.049952247267922 -3.057673482371216 3.057673482371216 -3.06920083507411 3.06920083507411 -3.075505231082782 3.075505231082782 -3.079038628197304 3.079038628197304 -3.084265889701239 3.084265889701239 -3.086837468106297 3.086837468106297 -3.103873984398081 3.103873984398081 -3.11528125482979 3.11528125482979 -3.119720021802376 3.119720021802376 -3.132543753577128 3.132543753577128 -3.141822873359038 3.141822873359038 -3.143502053175705 3.143502053175705 -3.153232877003746 3.153232877003746 -3.157586960809866 3.157586960809866 -3.157966892275408 3.157966892275408 -3.163583225161638 3.163583225161638 -3.178188125342772 3.178188125342772 -3.178475867931057 3.178475867931057 -3.179372297765929 3.179372297765929 -3.186437137237586 3.186437137237586 -3.188053957464282 3.188053957464282 -3.199351610026191 3.199351610026191 -3.204566427513051 3.204566427513051 -3.22885278850648 3.22885278850648 -3.229088648916556 3.229088648916556 -3.236685523936269 3.236685523936269 -3.239854786600373 3.239854786600373 -3.255809161351669 3.255809161351669 -3.287718056143732 3.287718056143732 -3.294038308299402 3.294038308299402 -3.313688277153076 3.313688277153076 -3.325783245946608 3.325783245946608 -3.331072954808429 3.331072954808429 -3.354962852285211 3.354962852285211 -3.357502741262644 3.357502741262644 -3.373668509804576 3.373668509804576 -3.408653045775418 3.408653045775418 -3.416281541503763 3.416281541503763 -3.443144279972986 3.443144279972986 -3.492970564191033 3.492970564191033 -3.493767805580122 3.493767805580122 -3.559084134799019 3.559084134799019 -3.559898699300211 3.559898699300211 -3.833585501974904 3.833585501974904 -4.099502076836052 4.099502076836052 -4.484082147277348 4.484082147277348 -4.505718324707756 4.505718324707756 -4.891723119528026 4.891723119528026 -5.065300494905414 5.065300494905414 -5.188599238535201 5.188599238535201 -5.36134479630535 5.36134479630535 -5.609786508140671 5.609786508140671 -7.08640314680382 7.08640314680382 -7.113765883549079 7.113765883549079 -7.328944131981744 7.328944131981744 -7.63625182217108 7.63625182217108 -7.716743341311718 7.716743341311718 -7.938093404092351 7.938093404092351 -8.112783377863046 8.112783377863046 -8.131485096731454 8.131485096731454 diff --git a/geom_matching/wasserstein/tests/data/test_diag3_B.pd.dipha b/geom_matching/wasserstein/tests/data/test_diag3_B.pd.dipha deleted file mode 100644 index 3fbfd90..0000000 Binary files a/geom_matching/wasserstein/tests/data/test_diag3_B.pd.dipha and /dev/null differ diff --git a/geom_matching/wasserstein/tests/data/test_list.txt b/geom_matching/wasserstein/tests/data/test_list.txt deleted file mode 100644 index 27340d8..0000000 --- a/geom_matching/wasserstein/tests/data/test_list.txt +++ /dev/null @@ -1,21 +0,0 @@ -test_5_A test_5_B 1.0 -1.0 4.320655 -test_5_A test_5_B 2.0 -1.0 1.7323016335246 -test_5_A test_5_B 3.0 -1.0 1.396199948 -test_5_A test_5_B 1.0 1.0 6.603006 -test_5_A test_5_B 2.0 1.0 2.73426775794691 -test_5_A test_5_B 3.0 1.0 2.13072755216204 -test_5_A test_5_B 1.0 2.0 5.1888795679967 -test_5_A test_5_B 2.0 2.0 2.26649677575857 -test_5_A test_5_B 3.0 2.0 1.86434961396614 -test_100_A test_100_B 1.0 -1.0 27.5573259 -test_100_A test_100_B 2.0 -1.0 3.38004972483238 -test_100_A test_100_B 3.0 -1.0 1.9045814702967 -test_100_A test_100_B 1.0 1.0 40.4375855 -test_100_A test_100_B 2.0 1.0 4.75252460986668 -test_100_A test_100_B 3.0 1.0 2.556594741819 -test_100_A test_100_B 1.0 2.0 31.7187555735287 -test_100_A test_100_B 2.0 2.0 3.81132239777023 -test_100_A test_100_B 3.0 2.0 2.09695346034248 -test_diag1_A test_diag1_B 1.0 -1.0 0.0 -test_diag2_A test_diag2_B 1.0 -1.0 0.0 -test_diag3_A test_diag3_B 1.0 -1.0 0.0 diff --git a/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp b/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp deleted file mode 100644 index 0a80d2f..0000000 --- a/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp +++ /dev/null @@ -1,532 +0,0 @@ -#define LOG_AUCTION -#include "catch/catch.hpp" - -#include -#include - - -#undef LOG_AUCTION - -#include "wasserstein.h" -#include "tests_reader.h" - -using namespace hera_test; - -using PairVector = std::vector>; - - -TEST_CASE("simple cases", "wasserstein_dist") -{ - PairVector diagram_A, diagram_B; - hera::AuctionParams params; - params.wasserstein_power = 1.0; - params.delta = 0.01; - params.internal_p = hera::get_infinity(); - params.initial_epsilon = 0.0; - params.epsilon_common_ratio = 0.0; - params.max_num_phases = 30; - params.gamma_threshold = 0.0; - params.max_bids_per_round = 0; // use Jacobi - - SECTION("trivial: two empty diagrams") { - REQUIRE( 0.0 == hera::wasserstein_dist<>(diagram_A, diagram_B, params)); - } - - SECTION("trivial: one empty diagram, one single-point diagram") { - - diagram_A.emplace_back(1.0, 2.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - REQUIRE( fabs(d1 - 0.5) <= 0.00000000001 ); - - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d2 - 0.5) <= 0.00000000001 ); - - params.internal_p = 2.0; - double corr_answer = 1.0 / std::sqrt(2.0); - double d3 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d3 - corr_answer) <= 0.00000000001 ); - - } - - SECTION("trivial: two single-point diagrams-1") { - - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d1 - d2) <= 0.00000000001 ); - REQUIRE( fabs(d1 - 3.0) <= 0.00000000001 ); - - params.wasserstein_power = 2.0; - double d3 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d4 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d3 - d4) <= 0.00000000001 ); - REQUIRE( fabs(d4 - 9.0) <= 0.00000000001 ); - - params.wasserstein_power = 1.0; - params.internal_p = 1.0; - double d5 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d6 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d5 - d6) <= 0.00000000001 ); - REQUIRE( fabs(d5 - 4.0) <= 0.00000000001 ); - - params.internal_p = 2.0; - double d7 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d8 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d7 - d8) <= 0.00000000001 ); - REQUIRE( fabs(d7 - std::sqrt(10.0)) <= 0.00000000001 ); - - } - - SECTION("trivial: two single-point diagrams-2") { - - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(130.0, 138.0); // (4, 4) - - double d1 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d1 - d2) <= 0.00000000001 ); - REQUIRE( fabs(d1 - 9.0) <= 0.00000000001 ); - - params.wasserstein_power = 2.0; - double d3 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d4 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d3 - d4) <= 0.00000000001 ); - REQUIRE( fabs(d4 - 41.0) <= 0.00000000001 ); // 5^2 + 4^2 - - params.wasserstein_power = 1.0; - params.internal_p = 1.0; - double d5 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d6 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d5 - d6) <= 0.00000000001 ); - REQUIRE( fabs(d5 - 18.0) <= 0.00000000001 ); // 5 + 5 + 4 + 4 - - params.internal_p = 2.0; - double d7 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); - double d8 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); - REQUIRE( fabs(d7 - d8) <= 0.00000000001 ); - REQUIRE( fabs(d7 - 9 * std::sqrt(2.0)) <= 0.00000000001 ); // sqrt(5^2 + 5^2) + sqrt(4^2 + 4^2) = 9 sqrt(2) - - } - -} - - - -TEST_CASE("file cases", "wasserstein_dist") -{ - PairVector diagram_A, diagram_B; - hera::AuctionParams params; - params.wasserstein_power = 1.0; - params.delta = 0.01; - params.internal_p = hera::get_infinity(); - params.initial_epsilon = 0.0; - params.epsilon_common_ratio = 0.0; - params.max_num_phases = 30; - params.gamma_threshold = 0.0; - params.max_bids_per_round = 1; // use Jacobi - - - SECTION("from file:") { - const char* file_name = "../tests/data/test_list.txt"; - std::ifstream f; - f.open(file_name); - std::vector test_params; - std::string s; - while (std::getline(f, s)) { - test_params.emplace_back(s); - } - - for(const auto& ts : test_params) { - params.wasserstein_power = ts.q; - params.internal_p = ts.internal_p; - bool read_file_A = hera::read_diagram_point_set(ts.file_1, diagram_A); - bool read_file_B = hera::read_diagram_point_set(ts.file_2, diagram_B); - REQUIRE( read_file_A ); - REQUIRE( read_file_B ); - double hera_answer = hera::wasserstein_dist(diagram_A, diagram_B, params); - REQUIRE( fabs(hera_answer - ts.answer) <= 0.01 * hera_answer ); - std::cout << ts << " PASSED " << std::endl; - } - } - - SECTION("from DIPHA file:") { - const char* file_name = "../tests/data/test_list.txt"; - std::ifstream f; - f.open(file_name); - std::vector test_params; - std::string s; - while (std::getline(f, s)) { - test_params.emplace_back(s); - } - - for(const auto& ts : test_params) { - params.wasserstein_power = ts.q; - params.internal_p = ts.internal_p; - bool read_file_A = hera::read_diagram_dipha(ts.file_1 + std::string(".pd.dipha"), 1, diagram_A); - bool read_file_B = hera::read_diagram_dipha(ts.file_2 + std::string(".pd.dipha"), 1, diagram_B); - REQUIRE( read_file_A ); - REQUIRE( read_file_B ); - double hera_answer = hera::wasserstein_dist(diagram_A, diagram_B, params); - REQUIRE( fabs(hera_answer - ts.answer) <= 0.01 * hera_answer ); - std::cout << ts << " PASSED " << std::endl; - } - } -} - - - -TEST_CASE("infinity points", "wasserstein_dist") -{ - PairVector diagram_A, diagram_B; - hera::AuctionParams params; - params.wasserstein_power = 1.0; - params.delta = 0.01; - params.internal_p = hera::get_infinity(); - params.initial_epsilon = 0.0; - params.epsilon_common_ratio = 0.0; - params.max_num_phases = 30; - params.gamma_threshold = 0.0; - params.max_bids_per_round = 0; // use Jacobi - - // do not use Hera's infinity! it is -1 - double inf = std::numeric_limits::infinity(); - - SECTION("two points at infinity, no finite points") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double corr_answer = 1.0; - REQUIRE( fabs(d - corr_answer) <= 0.00000000001 ); - } - - SECTION("two points at infinity") { - - // edge cost 3.0 - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double corr_answer = 1.0 + 3.0; - REQUIRE( fabs(d - corr_answer) <= 0.00000000001 ); - } - - SECTION("three points at infinity, no finite points") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double corr_answer = inf; - REQUIRE( d == corr_answer ); - } - - SECTION("three points at infinity") { - - // edge cost 3.0 - diagram_A.emplace_back(10.0, 20.0); // (5, 5) - diagram_B.emplace_back(13.0, 19.0); // (3, 3) - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double corr_answer = inf; - REQUIRE( d == corr_answer ); - } - - - SECTION("all four corners at infinity, no finite points, finite answer") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double corr_answer = 4.0; - - REQUIRE( d == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-1") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-2") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-3") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-4") { - - // edge cost 1.0 - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - // edge cost 1.0 - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - // edge cost 1.0 - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - // edge cost 1.0 - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - diagram_B.emplace_back(-inf, 2.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-1") { - - diagram_A.emplace_back(1.0, inf); - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-2") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, with finite points, infinite answer-3") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - SECTION("all four corners at infinity, no finite points, infinite answer-4") { - - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.0, -inf); - diagram_B.emplace_back(2.0, -inf); - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(-inf, 1.0); - diagram_B.emplace_back(-inf, 2.0); - diagram_B.emplace_back(-inf, 2.0); - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = inf; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - } - - - SECTION("simple small example with finite answer") { - diagram_A.emplace_back(1.0, inf); - diagram_B.emplace_back(2.0, inf); - - diagram_A.emplace_back(1.9, inf); - diagram_B.emplace_back(1.1, inf); - - // 1.1 - 1.0 + 2.0 - 1.9 = 0.2 - - diagram_A.emplace_back(inf, 1.0); - diagram_B.emplace_back(inf, 2.0); - - diagram_A.emplace_back(inf, 1.9); - diagram_B.emplace_back(inf, 1.1); - - - // finite edge - diagram_A.emplace_back(10.0, 20.0); - diagram_B.emplace_back(13.0, 19.0); - - double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - double corr_answer = 3.0 + 0.2 + 0.2; - - REQUIRE( d1 == corr_answer ); - REQUIRE( d2 == corr_answer ); - - params.wasserstein_power = 2.0; - - d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); - d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); - corr_answer = std::sqrt(3.0 * 3.0 + 4 * 0.1 * 0.1); - - REQUIRE( fabs(d1 - corr_answer) < 0.000000000001 ); - REQUIRE( fabs(d2 - corr_answer) < 0.000000000001 ); - - } - -} - diff --git a/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp b/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp deleted file mode 100644 index 9603ceb..0000000 --- a/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "catch/catch.hpp" - -#include -#include - - -#undef LOG_AUCTION - -#include "wasserstein_pure_geom.hpp" -#include "tests_reader.h" - -using namespace hera_test; - -TEST_CASE("simple point clouds", "wasserstein_dist_pure_geom") -{ -// int n_points = 3; -// int dim = 3; -// using Traits = hera::ws::dnn::DynamicPointTraits; -// hera::ws::dnn::DynamicPointTraits traits(dim); -// hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); -// hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); -// -// dgm_a[0][0] = 0.0; -// dgm_a[0][1] = 0.0; -// dgm_a[0][2] = 0.0; -// -// dgm_a[1][0] = 1.0; -// dgm_a[1][1] = 0.0; -// dgm_a[1][2] = 0.0; -// -// dgm_a[2][0] = 0.0; -// dgm_a[2][1] = 1.0; -// dgm_a[2][2] = 1.0; -// -// dgm_b[0][0] = 0.0; -// dgm_b[0][1] = 0.1; -// dgm_b[0][2] = 0.1; -// -// dgm_b[1][0] = 1.1; -// dgm_b[1][1] = 0.0; -// dgm_b[1][2] = 0.0; -// -// dgm_b[2][0] = 0.0; -// dgm_b[2][1] = 1.1; -// dgm_b[2][2] = 0.9; - - const int dim = 3; - using Traits = hera::ws::dnn::DynamicPointTraits; - hera::ws::dnn::DynamicPointTraits traits(dim); - hera::AuctionParams params; - params.dim = dim; - params.wasserstein_power = 1.0; - params.delta = 0.01; - params.internal_p = hera::get_infinity(); - params.initial_epsilon = 0.0; - params.epsilon_common_ratio = 0.0; - params.max_num_phases = 30; - params.gamma_threshold = 0.0; - params.max_bids_per_round = 0; // use Jacobi - - - SECTION("trivial: two single-point diagrams-1") { - - int n_points = 1; - hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); - hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); - - dgm_a[0][0] = 0.0; - dgm_a[0][1] = 0.0; - dgm_a[0][2] = 0.0; - - dgm_b[0][0] = 1.0; - dgm_b[0][1] = 1.0; - dgm_b[0][2] = 1.0; - - std::vector max_bids { 1, 10, 0 }; - std::vector internal_ps{ 1, 2, static_cast(hera::get_infinity()) }; - std::vector wasserstein_powers { 1, 2, 3 }; - - for(auto internal_p : internal_ps) { - // there is only one point, so the answer does not depend wasserstein power - double correct_answer; - switch (internal_p) { - case 1 : - correct_answer = 3.0; - break; - case 2 : - correct_answer = sqrt(3.0); - break; - case static_cast(hera::get_infinity()) : - correct_answer = 1.0; - break; - default : - throw std::runtime_error("Correct answer not specified in test case"); - } - - for (auto max_bid : max_bids) { - for (auto wasserstein_power : wasserstein_powers) { - params.max_bids_per_round = max_bid; - params.internal_p = internal_p; - params.wasserstein_power = wasserstein_power; - double d1 = hera::ws::wasserstein_dist(dgm_a, dgm_b, params); - double d2 = hera::ws::wasserstein_dist(dgm_b, dgm_a, params); - REQUIRE(fabs(d1 - d2) <= 0.00000000001); - REQUIRE(fabs(d1 - correct_answer) <= 0.00000000001); - } - } - } - } -} - diff --git a/geom_matching/wasserstein/tests/tests_main.cpp b/geom_matching/wasserstein/tests/tests_main.cpp deleted file mode 100644 index d24407e..0000000 --- a/geom_matching/wasserstein/tests/tests_main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#define LOG_AUCTION -#define CATCH_CONFIG_MAIN -#include "catch/catch.hpp" diff --git a/geom_matching/wasserstein/tests/tests_reader.h b/geom_matching/wasserstein/tests/tests_reader.h deleted file mode 100644 index f2d5735..0000000 --- a/geom_matching/wasserstein/tests/tests_reader.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef WASSERSTEIN_TESTS_READER_H -#define WASSERSTEIN_TESTS_READER_H - -#include -#include -#include -#include -#include -#include -#include - -#include "hera_infinity.h" - -namespace hera_test { - inline std::vector split_on_delim(const std::string& s, char delim) - { - std::stringstream ss(s); - std::string token; - std::vector tokens; - while (std::getline(ss, token, delim)) { - tokens.push_back(token); - } - return tokens; - } - - - // single row in a file with test cases - struct TestFromFileCase - { - - std::string file_1; - std::string file_2; - double q; - double internal_p; - double answer; - - TestFromFileCase(std::string s) - { - auto tokens = split_on_delim(s, ' '); - assert(tokens.size() == 5); - - file_1 = tokens.at(0); - file_2 = tokens.at(1); - q = std::stod(tokens.at(2)); - internal_p = std::stod(tokens.at(3)); - answer = std::stod(tokens.at(4)); - - if (q < 1.0 or std::isinf(q) or - (internal_p != hera::get_infinity() and internal_p < 1.0)) { - throw std::runtime_error("Bad line in test_list.txt"); - } - } - }; - - inline std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s) - { - out << "[" << s.file_1 << ", " << s.file_2 << ", q = " << s.q << ", norm = "; - if (s.internal_p != hera::get_infinity()) { - out << s.internal_p; - } else { - out << "infinity"; - } - out << ", answer = " << s.answer << "]"; - return out; - } -} // namespace hera_test -#endif //WASSERSTEIN_TESTS_READER_H diff --git a/wasserstein/.gitignore b/wasserstein/.gitignore new file mode 100644 index 0000000..d9458fb --- /dev/null +++ b/wasserstein/.gitignore @@ -0,0 +1,31 @@ +/*.cfg +wasserstein/build/ +*.gitattributes +*.opensdf +*.sdf +*.suo +*.vcxproj +*.filters +*.log +*.tlog +*.lastbuildstate +*.obj +*.idb +*.pdb +*.exe +*.ilk +*.user +*.out +*.output +*.pyc +*.*~* +*.swp +*.nfs* +*.pdf +*.o +*.d +*.dll +*.lib +*.exe +makeout +tags diff --git a/wasserstein/CMakeLists.txt b/wasserstein/CMakeLists.txt new file mode 100644 index 0000000..dea4550 --- /dev/null +++ b/wasserstein/CMakeLists.txt @@ -0,0 +1,62 @@ +project (wasserstein) +cmake_minimum_required (VERSION 3.5.1) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +include (GenerateExportHeader) + +include(TestBigEndian) +test_big_endian(BIG_ENDIAN) +if(BIG_ENDIAN) + add_definitions(-DBIGENDIAN) +endif() + +# Default to Release + +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif (NOT CMAKE_BUILD_TYPE) + +# Boost +find_package (Boost) +include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include + SYSTEM ${Boost_INCLUDE_DIR}) + +if(NOT WIN32) + add_definitions(-std=c++14) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -D_GLIBCXX_DEBUG") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 -g -ggdb") +endif(NOT WIN32) + +file(GLOB WS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) + +#add_library(wasserstein ${WS_SOURCES}) + +#if (WIN32) + #GENERATE_EXPORT_HEADER(wasserstein + #BASE_NAME wasserstein + #EXPORT_MACRO_NAME wasserstein_EXPORT + #EXPORT_FILE_NAME wasserstein_export.h + #STATIC_DEFINE wasserstein_BUILT_AS_STATIC) +#endif(WIN32) + +find_package (Threads) +set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT}) + +add_executable(wasserstein_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist.cpp ${WS_HEADERS} include/hera_infinity.h) +target_link_libraries(wasserstein_dist PUBLIC ${libraries}) + +add_executable(wasserstein_dist_dipha ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_dipha.cpp ${WS_HEADERS} include/hera_infinity.h) +target_link_libraries(wasserstein_dist_dipha PUBLIC ${libraries}) + +# pure geometric version, arbitrary dimension +add_executable(wasserstein_dist_point_cloud ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_point_cloud.cpp ${WS_HEADERS} include/hera_infinity.h) +target_link_libraries(wasserstein_dist_point_cloud PUBLIC ${libraries}) + +# Tests +add_executable(wasserstein_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein_pure_geom.cpp include/hera_infinity.h tests/tests_reader.h) +#add_executable(wasserstein_test EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp) +target_link_libraries(wasserstein_test PUBLIC ${libraries}) diff --git a/wasserstein/README b/wasserstein/README new file mode 100644 index 0000000..5228d63 --- /dev/null +++ b/wasserstein/README @@ -0,0 +1,100 @@ +This is a program for computing Wasserstein distances between persistence +diagrams using the geometric version of auction algorithm. + +Accompanying paper: M. Kerber, D. Morozov, A. Nigmetov. Geometry Helps To Compare +Persistence Diagrams (ALENEX 2016, http://www.geometrie.tugraz.at/nigmetov/geom_dist.pdf) +Bug reports can be sent to "nigmetov EMAIL SIGN tugraz DOT at". + +Wasserstein distance $W_{q, p}(X, Y)$ between two persistent diagrams is +the minimum over all perfect matchings between $X$ and $Y$ ( $y(x)$ is the point of $Y$ +matched to $x \in X$ ) of the following expression: +$ ( \sum \| x - y(x) \|_p ^ { q } ) ^ { 1 / q} $ + +# Dependencies + +Requires boost 1.58 or higher. +Your compiler must support C++11. + +# Usage: + +To use a standalone command-line utility wasserstein_dist: + +wasserstein_dist file1 file2 [wasserstein degree] [relative error] [internal norm]. + +Parameter wasserstein degree corresponds to $q$, when it tends to infinity, +Wasserstein distance tends to the bottleneck distance. + +If two diagrams are equal, then the exact distance 0.0 is printed (the order +of points in file1 and file2 need not be the same). +Otherwise the output is an approximation of the exact distance. Precisely: +if d_exact is the true distance and d_approx is the output, then + + | d_exact - d_approx | / d_exact < relative_error. + +Parameter internal_p corresponds to p. + +Default values: +wasserstein_degree = 1.0, +relative_error = 0.01, +internal_p = infinity. + +Valid values: +wasserstein_degree must be in $[1.0, \infinity)$, +relative_error must be positive, +internal_p must be in $[1.0, \infinity]$ (to explicitly set internal_p to $\infinity$, supply inf).By default wasserstein degree is 1.0, relative error is 0.01, internal norm is l_infinity. + +file1 and file2 must contain persistence diagrams in plain text format +(one point per line, empty lines are ignored, comments can be made with #): + +# this is how your input can look like +x_1 y_1 # two real numbers per line +... +# empty lines or comments are ignored +x_n y_n + +To use from your code: + +#include "wasserstein.h" + +// All classes and functions are in geom_ws namespace + +std::vector> diagram1, diagram2; +// any container class that supports range-for loops will do. +// A pair represents a single point, +// first component = x-coordinate, +// second component = y-coordinate. +// ... +// load your diagrams into diagram1, diagram2 (off-diagonal points). +// You can use function readDiagramPointSet: +geom_ws::readDiagramPointSet("diagram1.txt", diagram1); +geom_ws::readDiagramPointSet("diagram2.txt", diagram1); +// ... +// to get the distance: +double wsDist = geom_ws::wassersteinDist(diagram1, diagram2, q, delta, p); +// q is wasserstein degree, delta is relative error, +// p is the internal norm in Wasserstein distance, defaults to infinity + +Necessary projections (diagonal points) will be added in the wassersteinDist +function. + +See also code in wasserstein/example/wasserstein_dist.cpp. + +# License + +See ../license.txt + +# Building + +CMakeLists.txt in the root directory can be used to make the library (contained +in wasserstein/src/ directory) and the command-line utility (in wasserstein/example/ directory) +to compute the distance between two diagrams in txt files. + +On Linux/Mac: + +mkdir build +cd build +cmake .. +make + +On Windows (checked with Visual Studio 2015, Community version) +use cmake-gui to create the solution in build directory and build it with VS. diff --git a/wasserstein/example/wasserstein_dist.cpp b/wasserstein/example/wasserstein_dist.cpp new file mode 100644 index 0000000..cbe83e2 --- /dev/null +++ b/wasserstein/example/wasserstein_dist.cpp @@ -0,0 +1,156 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#include +#include +#include +#include + +#include "opts/opts.h" + +//#define LOG_AUCTION + +//#include "auction_runner_fr.h" +//#include "auction_runner_fr.hpp" + +#include "wasserstein.h" + +// any container of pairs of Reals can be used, +// we use vector in this example. + +int main(int argc, char* argv[]) +{ + using Real = double; + using PairVector = std::vector>; + PairVector diagramA, diagramB; + + hera::AuctionParams params; + params.max_num_phases = 800; + + opts::Options ops(argc, argv); + ops >> opts::Option('q', "degree", params.wasserstein_power, "Wasserstein degree") + >> opts::Option('d', "error", params.delta, "Relative error") + >> opts::Option('p', "internal-p", params.internal_p, "Internal norm") + >> opts::Option("initial-epsilon", params.initial_epsilon, "Initial epsilon") + >> opts::Option("epsilon-factor", params.epsilon_common_ratio, "Epsilon factor") + >> opts::Option("max-bids-per-round", params.max_bids_per_round, "Maximal number of bids per round") + >> opts::Option('m', "max-rounds", params.max_num_phases, "Maximal number of iterations"); + + + bool print_relative_error = ops >> opts::Present('e', "--print-error", "Print real relative error"); + + params.tolerate_max_iter_exceeded = ops >> opts::Present('t', "tolerate", "Suppress max-iterations-exceeded error and print the best result."); + + std::string dgm_fname_1, dgm_fname_2; + bool dgm_1_given = (ops >> opts::PosOption(dgm_fname_1)); + bool dgm_2_given = (ops >> opts::PosOption(dgm_fname_2)); + + //std::cout << "q = " << params.wasserstein_power << ", delta = " << params.delta << ", p = " << params.internal_p << ", max_round = " << params.max_num_phases << std::endl; + //std::cout << "print relative error: " << print_relative_error << std::endl; + //std::cout << "dgm1: " << dgm_fname_1 << std::endl; + //std::cout << "dgm2: " << dgm_fname_2 << std::endl; + + if (not dgm_1_given or not dgm_2_given) { + std::cerr << "Usage: " << argv[0] << " file1 file2 " << std::endl; + std::cerr << "compute Wasserstein distance between persistence diagrams in file1 and file2.\n"; + std::cerr << ops << std::endl; + return 1; + } + + if (ops >> opts::Present('h', "help", "show help message")) { + std::cout << "Usage: " << argv[0] << " file1 file2 " << std::endl; + std::cout << "compute Wasserstein distance between persistence diagrams in file1 and file2.\n"; + std::cout << ops << std::endl; + } + + if (!hera::read_diagram_point_set(dgm_fname_1, diagramA)) { + std::exit(1); + } + + if (!hera::read_diagram_point_set(dgm_fname_2, diagramB)) { + std::exit(1); + } + + if (params.wasserstein_power < 1.0) { + std::cerr << "Wasserstein_degree was \"" << params.wasserstein_power << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + if (params.wasserstein_power == 1.0) { + hera::remove_duplicates(diagramA, diagramB); + } + + //default relative error: 1% + if ( params.delta <= 0.0) { + std::cerr << "relative error was \"" << params.delta << "\", must be a number > 0.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + // default for internal metric is l_infinity + if (std::isinf(params.internal_p)) { + params.internal_p = hera::get_infinity(); + } + + + if (not hera::is_p_valid_norm(params.internal_p)) { + std::cerr << "internal-p was \"" << params.internal_p << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; + std::exit(1); + } + + // if you want to specify initial value for epsilon and the factor + // for epsilon-scaling + if (params.initial_epsilon < 0.0) { + std::cerr << "initial-epsilon was \"" << params.initial_epsilon << "\", must be a non-negative number. Cannot proceed." << std::endl; + std::exit(1); + } + + if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { + std::cerr << "The 7th argument (epsilon factor) was \"" << params.epsilon_common_ratio << "\", must be a number greater than 1. Cannot proceed." << std::endl; + std::exit(1); + } + + if (params.max_bids_per_round == 0) + params.max_bids_per_round = std::numeric_limits::max(); + + + std::string log_filename_prefix = ( 11 <= argc ) ? argv[10] : ""; + + +#ifdef LOG_AUCTION + spdlog::set_level(spdlog::level::info); +#endif + + Real res = hera::wasserstein_dist(diagramA, diagramB, params, log_filename_prefix); + + std::cout << std::setprecision(15) << res << std::endl; + if (print_relative_error) + std::cout << "Relative error: " << params.final_relative_error << std::endl; + + return 0; + +} diff --git a/wasserstein/example/wasserstein_dist_dipha.cpp b/wasserstein/example/wasserstein_dist_dipha.cpp new file mode 100644 index 0000000..2ed9c2c --- /dev/null +++ b/wasserstein/example/wasserstein_dist_dipha.cpp @@ -0,0 +1,133 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +Copyright (c) 2018, G. Spreemann +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#include +#include +#include +#include + +//#define LOG_AUCTION + +//#include "auction_runner_fr.h" +//#include "auction_runner_fr.hpp" + +#include "wasserstein.h" + +// any container of pairs of doubles can be used, +// we use vector in this example. + +int main(int argc, char* argv[]) +{ + using PairVector = std::vector>; + PairVector diagramA, diagramB; + + hera::AuctionParams params; + + if (argc < 4 ) { + std::cerr << "Usage: " << argv[0] << " file1 file2 ph_dim [wasserstein_degree] [relative_error] [internal norm] [initial epsilon] [epsilon_factor] [max_bids_per_round] [gamma_threshold][log_filename_prefix]. By default power is 1.0, relative error is 0.01, internal norm is l_infinity, initall epsilon is chosen automatically, epsilon factor is 5.0, Jacobi variant is used (max bids per round is maximal), gamma_threshold = 0.0." << std::endl; + return 1; + } + + unsigned int dim = std::stoul(argv[3]); + + if (!hera::read_diagram_dipha(argv[1], dim, diagramA)) { + std::exit(1); + } + + if (!hera::read_diagram_dipha(argv[2], dim, diagramB)) { + std::exit(1); + } + + params.wasserstein_power = (5 <= argc) ? atof(argv[4]) : 1.0; + if (params.wasserstein_power < 1.0) { + std::cerr << "The third argument (wasserstein_degree) was \"" << argv[4] << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + if (params.wasserstein_power == 1.0) { + hera::remove_duplicates(diagramA, diagramB); + } + + //default relative error: 1% + params.delta = (6 <= argc) ? atof(argv[5]) : 0.01; + if ( params.delta <= 0.0) { + std::cerr << "The 4th argument (relative error) was \"" << argv[5] << "\", must be a number > 0.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + // default for internal metric is l_infinity + params.internal_p = ( 7 <= argc ) ? atof(argv[6]) : hera::get_infinity(); + if (std::isinf(params.internal_p)) { + params.internal_p = hera::get_infinity(); + } + + + if (not hera::is_p_valid_norm(params.internal_p)) { + std::cerr << "The 6th argument (internal norm) was \"" << argv[6] << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; + std::exit(1); + } + + // if you want to specify initial value for epsilon and the factor + // for epsilon-scaling + params.initial_epsilon= ( 8 <= argc ) ? atof(argv[7]) : 0.0 ; + + if (params.initial_epsilon < 0.0) { + std::cerr << "The 7th argument (initial epsilon) was \"" << argv[7] << "\", must be a non-negative number. Cannot proceed." << std::endl; + std::exit(1); + } + + params.epsilon_common_ratio = ( 9 <= argc ) ? atof(argv[8]) : 0.0 ; + if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { + std::cerr << "The 8th argument (epsilon factor) was \"" << argv[8] << "\", must be a number greater than 1. Cannot proceed." << std::endl; + std::exit(1); + } + + + params.max_bids_per_round = ( 10 <= argc ) ? atoi(argv[9]) : 0; + if (params.max_bids_per_round == 0) + params.max_bids_per_round = std::numeric_limits::max(); + + + params.gamma_threshold = (11 <= argc) ? atof(argv[10]) : 0.0; + + std::string log_filename_prefix = ( 12 <= argc ) ? argv[11] : ""; + + params.max_num_phases = 800; + +#ifdef LOG_AUCTION + spdlog::set_level(spdlog::level::info); +#endif + + double res = hera::wasserstein_dist(diagramA, diagramB, params, log_filename_prefix); + + std::cout << std::setprecision(15) << res << std::endl; + + return 0; + +} diff --git a/wasserstein/example/wasserstein_dist_point_cloud.cpp b/wasserstein/example/wasserstein_dist_point_cloud.cpp new file mode 100644 index 0000000..ab7ff4f --- /dev/null +++ b/wasserstein/example/wasserstein_dist_point_cloud.cpp @@ -0,0 +1,175 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#include +#include +#include +#include + +#include "wasserstein_pure_geom.hpp" + +int main(int argc, char* argv[]) +{ + + //{ + //int n_points = 3; + //int dim = 3; + //using Traits = hera::ws::dnn::DynamicPointTraits; + //hera::ws::dnn::DynamicPointTraits traits(dim); + //hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); + //hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); + + //dgm_a[0][0] = 0.0; + //dgm_a[0][1] = 0.0; + //dgm_a[0][2] = 0.0; + + //dgm_a[1][0] = 1.0; + //dgm_a[1][1] = 0.0; + //dgm_a[1][2] = 0.0; + + //dgm_a[2][0] = 0.0; + //dgm_a[2][1] = 1.0; + //dgm_a[2][2] = 1.0; + + //dgm_b[0][0] = 0.0; + //dgm_b[0][1] = 0.1; + //dgm_b[0][2] = 0.1; + + //dgm_b[1][0] = 1.1; + //dgm_b[1][1] = 0.0; + //dgm_b[1][2] = 0.0; + + //dgm_b[2][0] = 0.0; + //dgm_b[2][1] = 1.1; + //dgm_b[2][2] = 0.9; + + + //hera::AuctionParams params; + //params.dim = dim; + + + //std::cout << hera::ws::wasserstein_cost(dgm_a, dgm_b, params) << std::endl; + + //return 0; + //} + + + using Real = double; + using PointVector = hera::ws::dnn::DynamicPointVector; + PointVector set_A, set_B; + + hera::AuctionParams params; + + if (argc < 3 ) { + std::cerr << "Usage: " << argv[0] << " file1 file2 [wasserstein_degree] [relative_error] [internal norm] [initial epsilon] [epsilon_factor] [max_bids_per_round] [gamma_threshold][log_filename_prefix]. By default power is 1.0, relative error is 0.01, internal norm is l_infinity, initall epsilon is chosen automatically, epsilon factor is 5.0, Jacobi variant is used (max bids per round is maximal), gamma_threshold = 0.0." << std::endl; + return 1; + } + + int dimension_A, dimension_B; + + if (!hera::read_point_cloud(argv[1], set_A, dimension_A)) { + std::exit(1); + } + + if (!hera::read_point_cloud(argv[2], set_B, dimension_B)) { + std::exit(1); + } + + if (dimension_A != dimension_B) { + std::cerr << "Dimension mismatch: " << dimension_A << " != " << dimension_B << std::endl; + std::exit(1); + } + + params.dim = dimension_A; + + params.wasserstein_power = (4 <= argc) ? atof(argv[3]) : 1.0; + if (params.wasserstein_power < 1.0) { + std::cerr << "The third argument (wasserstein_degree) was \"" << argv[3] << "\", must be a number >= 1.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + //if (params.wasserstein_power == 1.0) { + // hera::remove_duplicates 0.0. Cannot proceed. " << std::endl; + std::exit(1); + } + + // default for internal metric is l_infinity + params.internal_p = ( 6 <= argc ) ? atof(argv[5]) : hera::get_infinity(); + if (std::isinf(params.internal_p)) { + params.internal_p = hera::get_infinity(); + } + + + if (not hera::is_p_valid_norm(params.internal_p)) { + std::cerr << "The 5th argument (internal norm) was \"" << argv[5] << "\", must be a number >= 1.0 or inf. Cannot proceed. " << std::endl; + std::exit(1); + } + + // if you want to specify initial value for epsilon and the factor + // for epsilon-scaling + params.initial_epsilon= ( 7 <= argc ) ? atof(argv[6]) : 0.0 ; + + if (params.initial_epsilon < 0.0) { + std::cerr << "The 6th argument (initial epsilon) was \"" << argv[6] << "\", must be a non-negative number. Cannot proceed." << std::endl; + std::exit(1); + } + + params.epsilon_common_ratio = ( 8 <= argc ) ? atof(argv[7]) : 0.0 ; + if (params.epsilon_common_ratio <= 1.0 and params.epsilon_common_ratio != 0.0) { + std::cerr << "The 7th argument (epsilon factor) was \"" << argv[7] << "\", must be a number greater than 1. Cannot proceed." << std::endl; + std::exit(1); + } + + + params.max_bids_per_round = ( 9 <= argc ) ? atoi(argv[8]) : 0; + if (params.max_bids_per_round == 0) + params.max_bids_per_round = std::numeric_limits::max(); + + + params.gamma_threshold = (10 <= argc) ? atof(argv[9]) : 0.0; + + std::string log_filename_prefix = ( 11 <= argc ) ? argv[10] : ""; + + params.max_num_phases = 800; + +#ifdef LOG_AUCTION + spdlog::set_level(spdlog::level::critical); +#endif + + Real res = hera::ws::wasserstein_dist(set_A, set_B, params); + + std::cout << std::setprecision(15) << res << std::endl; + + return 0; +} diff --git a/wasserstein/include/auction_oracle.h b/wasserstein/include/auction_oracle.h new file mode 100644 index 0000000..d285a1f --- /dev/null +++ b/wasserstein/include/auction_oracle.h @@ -0,0 +1,40 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef HERA_AUCTION_ORACLE_H +#define HERA_AUCTION_ORACLE_H + +// all oracle classes are in separate h-hpp files +// this file comprises all of them + +#include "auction_oracle_base.h" +#include "auction_oracle_kdtree_restricted.h" +#include "auction_oracle_kdtree_single_diag.h" +#include "auction_oracle_stupid_sparse_restricted.h" + +#endif // HERA_AUCTION_ORACLE_H diff --git a/wasserstein/include/auction_oracle_base.h b/wasserstein/include/auction_oracle_base.h new file mode 100644 index 0000000..08eaf00 --- /dev/null +++ b/wasserstein/include/auction_oracle_base.h @@ -0,0 +1,85 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_BASE_H +#define AUCTION_ORACLE_BASE_H + +#include +#include +#include +#include + +#include "basic_defs_ws.h" + +namespace hera { +namespace ws { + + +template +struct DebugOptimalBid { + DebugOptimalBid() : best_item_idx(k_invalid_index), best_item_value(-666.666), second_best_item_idx(k_invalid_index), second_best_item_value(-666.666) {}; + IdxType best_item_idx; + Real best_item_value; + IdxType second_best_item_idx; + Real second_best_item_value; +}; + +template >> +struct AuctionOracleBase { + AuctionOracleBase(const PointContainer_& _bidders, const PointContainer_& _items, const AuctionParams& params); + ~AuctionOracleBase() {} + Real get_epsilon() const { return epsilon; }; + void set_epsilon(Real new_epsilon) { assert(new_epsilon >= 0.0); epsilon = new_epsilon; }; + const std::vector& get_prices() const { return prices; } + virtual Real get_price(const size_t item_idx) const { return prices[item_idx]; } // TODO make virtual? +//protected: + const PointContainer_& bidders; + const PointContainer_& items; + const size_t num_bidders_; + const size_t num_items_; + std::vector prices; + const Real wasserstein_power; + Real epsilon; + const Real internal_p; + unsigned int dim; // used only in pure geometric version, not for persistence diagrams + Real get_value_for_bidder(size_t bidder_idx, size_t item_idx) const; + Real get_value_for_diagonal_bidder(size_t item_idx) const; + Real get_cost_for_diagonal_bidder(size_t item_idx) const; +}; + + +template +std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db); + +} // ws +} // hera + + +#include "auction_oracle_base.hpp" + +#endif diff --git a/wasserstein/include/auction_oracle_base.hpp b/wasserstein/include/auction_oracle_base.hpp new file mode 100644 index 0000000..b74c7fb --- /dev/null +++ b/wasserstein/include/auction_oracle_base.hpp @@ -0,0 +1,97 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_BASE_HPP +#define AUCTION_ORACLE_BASE_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_oracle.h" + + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + +template +AuctionOracleBase::AuctionOracleBase(const PointContainer& _bidders, + const PointContainer& _items, + const AuctionParams& params) : + bidders(_bidders), + items(_items), + num_bidders_(_bidders.size()), + num_items_(_items.size()), + prices(items.size(), Real(0.0)), + wasserstein_power(params.wasserstein_power), + internal_p(params.internal_p), + dim(params.dim) +{ + assert(bidders.size() == items.size() ); +} + + +template +Real AuctionOracleBase::get_value_for_bidder(size_t bidder_idx, size_t item_idx) const +{ + return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dim), wasserstein_power) + get_price(item_idx); +} + +template +Real AuctionOracleBase::get_value_for_diagonal_bidder(size_t item_idx) const +{ + return get_cost_for_diagonal_bidder(item_idx) + get_price(item_idx); +} + +template +Real AuctionOracleBase::get_cost_for_diagonal_bidder(size_t item_idx) const +{ + return std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); +} + + + +template +std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db) +{ + output << "best_item_value = " << db.best_item_value; + output << "; best_item_idx = " << db.best_item_idx; + output << "; second_best_item_value = " << db.second_best_item_value; + output << "; second_best_item_idx = " << db.second_best_item_idx; + return output; +} + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_pure_geom.h b/wasserstein/include/auction_oracle_kdtree_pure_geom.h new file mode 100644 index 0000000..096583e --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_pure_geom.h @@ -0,0 +1,97 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_KDTREE_PURE_GEOM_H +#define AUCTION_ORACLE_KDTREE_PURE_GEOM_H + + +#include +#include +#include + +#include + +namespace ba = boost::adaptors; + +#include "spdlog/spdlog.h" +#include "basic_defs_ws.h" +#include "auction_oracle_base.h" +#include "dnn/geometry/euclidean-dynamic.h" +#include "dnn/local/kd-tree.h" + +namespace hera +{ +namespace ws +{ + +template > +struct AuctionOracleKDTreePureGeom : AuctionOracleBase { + + using Real = Real_; + using DynamicPointTraitsR = typename hera::ws::dnn::DynamicPointTraits; + using DiagramPointR = typename DynamicPointTraitsR::PointType; + using PointHandleR = typename DynamicPointTraitsR::PointHandle; + using PointContainer = PointContainer_; + using DebugOptimalBidR = typename ws::DebugOptimalBid; + + using DynamicPointTraits = hera::ws::dnn::DynamicPointTraits; + using KDTreeR = hera::ws::dnn::KDTree; + + AuctionOracleKDTreePureGeom(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); + ~AuctionOracleKDTreePureGeom(); + + // data members + // temporarily make everything public + DynamicPointTraits traits; + Real max_val_; + Real weight_adj_const_; + std::unique_ptr kdtree_; + std::vector kdtree_items_; + // methods + void set_price(const IdxType items_idx, const Real new_price); + IdxValPair get_optimal_bid(const IdxType bidder_idx); + void adjust_prices(); + void adjust_prices(const Real delta); + + // debug routines + DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; + void sanity_check(); + + std::shared_ptr console_logger; + + std::pair get_minmax_price() const; + +}; + +} // ws +} // hera + + +#include "auction_oracle_kdtree_pure_geom.hpp" + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp b/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp new file mode 100644 index 0000000..eaf54cf --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp @@ -0,0 +1,247 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ +#ifndef AUCTION_ORACLE_KDTREE_PURE_GEOM_HPP +#define AUCTION_ORACLE_KDTREE_PURE_GEOM_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_oracle_kdtree_restricted.h" + + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + + +// ***************************** +// AuctionOracleKDTreePureGeom +// ***************************** + + + +template +std::ostream& operator<<(std::ostream& output, const AuctionOracleKDTreePureGeom& oracle) +{ + output << "Oracle " << &oracle << std::endl; + output << fmt::format(" max_val_ = {0}\n", + oracle.max_val_); + + output << fmt::format(" prices = {0}\n", + format_container_to_log(oracle.prices)); + + output << "end of oracle " << &oracle << std::endl; + return output; +} + + +template +AuctionOracleKDTreePureGeom::AuctionOracleKDTreePureGeom(const PointContainer_& _bidders, + const PointContainer_& _items, + const AuctionParams& params) : + AuctionOracleBase(_bidders, _items, params), + traits(params.dim) +{ + + traits.internal_p = params.internal_p; + + std::vector item_handles(this->num_items_); + for(size_t i = 0; i < this->num_items_; ++i) { + item_handles[i] = traits.handle(this->items[i]); + } + + //kdtree_ = std::unique_ptr(new KDTreeR(traits, + // this->items | ba::transformed([this](const DiagramPointR& p) { return traits.handle(p); }), + // params.wasserstein_power)); + + kdtree_ = std::unique_ptr(new KDTreeR(traits, item_handles, params.wasserstein_power)); + + + max_val_ = 3*getFurthestDistance3Approx_pg(this->bidders, this->items, params.internal_p, params.dim); + max_val_ = std::pow(max_val_, params.wasserstein_power); + weight_adj_const_ = max_val_; + + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); + console_logger->debug("KDTree Restricted oracle ctor done"); +} + + +template +typename AuctionOracleKDTreePureGeom::DebugOptimalBidR +AuctionOracleKDTreePureGeom::get_optimal_bid_debug(IdxType bidder_idx) const +{ + auto bidder = this->bidders[bidder_idx]; + + size_t best_item_idx = k_invalid_index; + size_t second_best_item_idx = k_invalid_index; + Real best_item_value = std::numeric_limits::max(); + Real second_best_item_value = std::numeric_limits::max(); + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + auto item = this->items[item_idx]; + auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx]; + if (item_value < best_item_value) { + best_item_value = item_value; + best_item_idx = item_idx; + } + } + + assert(best_item_idx != k_invalid_index); + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + auto item = this->items[item_idx]; + if (item_idx == best_item_idx) + continue; + + auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx]; + if (item_value < second_best_item_value) { + second_best_item_value = item_value; + second_best_item_idx = item_idx; + } + } + + assert(second_best_item_idx != k_invalid_index); + assert(second_best_item_value >= best_item_value); + + DebugOptimalBidR result; + + result.best_item_idx = best_item_idx; + result.best_item_value = best_item_value; + result.second_best_item_idx = second_best_item_idx; + result.second_best_item_value = second_best_item_value; + + return result; +} + + +template +IdxValPair AuctionOracleKDTreePureGeom::get_optimal_bid(IdxType bidder_idx) +{ + auto two_best_items = kdtree_->findK(this->bidders[bidder_idx], 2); + size_t best_item_idx = traits.id(two_best_items[0].p); + Real best_item_value = two_best_items[0].d; + Real second_best_item_value = two_best_items[1].d; + + IdxValPair result; + + assert( second_best_item_value >= best_item_value ); + + result.first = best_item_idx; + result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; + +#ifdef DEBUG_KDTREE_RESTR_ORACLE + auto bid_debug = get_optimal_bid_debug(bidder_idx); + assert(fabs(bid_debug.best_item_value - best_item_value) < 0.000000001); + assert(fabs(bid_debug.second_best_item_value - second_best_item_value) < 0.000000001); +#endif + + return result; +} + +/* +a_{ij} = d_{ij} +value_{ij} = a_{ij} + price_j +*/ + +template +void AuctionOracleKDTreePureGeom::set_price(IdxType item_idx, + Real new_price) +{ + + console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}", item_idx, new_price, this->prices[item_idx]); + + assert(this->prices.size() == this->items.size()); + // adjust_prices decreases prices, + // also this variable must be true in reverse phases of FR-auction + + this->prices[item_idx] = new_price; + kdtree_->change_weight( traits.handle(this->items[item_idx]), new_price); + + console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); +} + + +template +void AuctionOracleKDTreePureGeom::adjust_prices(Real delta) +{ + //console_logger->debug("Enter adjust_prices, delta = {0}", delta); + //std::cerr << *this << std::endl; + + if (delta == 0.0) + return; + + for(auto& p : this->prices) { + p -= delta; + } + + kdtree_->adjust_weights(delta); + + //std::cerr << *this << std::endl; + //console_logger->debug("Exit adjust_prices, delta = {0}", delta); +} + +template +void AuctionOracleKDTreePureGeom::adjust_prices() +{ + auto pr_begin = this->prices.begin(); + auto pr_end = this->prices.end(); + Real min_price = *(std::min_element(pr_begin, pr_end)); + adjust_prices(min_price); +} + +template +std::pair AuctionOracleKDTreePureGeom::get_minmax_price() const +{ + auto r = std::minmax_element(this->prices.begin(), this->prices.end()); + return std::make_pair(*r.first, *r.second); +} + +template +AuctionOracleKDTreePureGeom::~AuctionOracleKDTreePureGeom() +{ +} + +template +void AuctionOracleKDTreePureGeom::sanity_check() +{ +} + + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_restricted.h b/wasserstein/include/auction_oracle_kdtree_restricted.h new file mode 100644 index 0000000..1999147 --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_restricted.h @@ -0,0 +1,122 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_H +#define AUCTION_ORACLE_KDTREE_RESTRICTED_H + + +//#define USE_BOOST_HEAP + +#include +#include +#include + + +#include "spdlog/spdlog.h" +#include "basic_defs_ws.h" +#include "diagonal_heap.h" +#include "auction_oracle_base.h" +#include "dnn/geometry/euclidean-fixed.h" +#include "dnn/local/kd-tree.h" + +namespace hera { +namespace ws { + +template >> +struct AuctionOracleKDTreeRestricted : AuctionOracleBase { + + using PointContainer = PointContainer_; + using Real = Real_; + + using LossesHeapR = typename ws::LossesHeapOld; + using LossesHeapRHandle = typename ws::LossesHeapOld::handle_type; + using DiagramPointR = typename ws::DiagramPoint; + using DebugOptimalBidR = typename ws::DebugOptimalBid; + + using DnnPoint = dnn::Point<2, Real>; + using DnnTraits = dnn::PointTraits; + + AuctionOracleKDTreeRestricted(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); + ~AuctionOracleKDTreeRestricted(); + // data members + // temporarily make everything public + Real max_val_; + Real weight_adj_const_; + dnn::KDTree* kdtree_; + std::vector dnn_points_; + std::vector dnn_point_handles_; + LossesHeapR diag_items_heap_; + std::vector diag_heap_handles_; + std::vector heap_handles_indices_; + std::vector kdtree_items_; + std::vector top_diag_indices_; + std::vector top_diag_lookup_; + size_t top_diag_counter_ { 0 }; + bool best_diagonal_items_computed_ { false }; + Real best_diagonal_item_value_; + size_t second_best_diagonal_item_idx_ { k_invalid_index }; + Real second_best_diagonal_item_value_ { std::numeric_limits::max() }; + + + // methods + void set_price(const IdxType items_idx, const Real new_price, const bool update_diag = true); + IdxValPair get_optimal_bid(const IdxType bidder_idx); + void adjust_prices(); + void adjust_prices(const Real delta); + + // debug routines + DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; + void sanity_check(); + + + // heap top vector + size_t get_heap_top_size() const; + void recompute_top_diag_items(bool hard = false); + void recompute_second_best_diag(); + void reset_top_diag_counter(); + void increment_top_diag_counter(); + void add_top_diag_index(const size_t item_idx); + void remove_top_diag_index(const size_t item_idx); + bool is_in_top_diag_indices(const size_t item_idx) const; + + std::shared_ptr console_logger; + + std::pair get_minmax_price() const; + +}; + +template +std::ostream& operator<< (std::ostream& output, const DebugOptimalBid& db); + +} // ws +} // hera + + +#include "auction_oracle_kdtree_restricted.hpp" + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_restricted.hpp b/wasserstein/include/auction_oracle_kdtree_restricted.hpp new file mode 100644 index 0000000..8613ee1 --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_restricted.hpp @@ -0,0 +1,598 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ +#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_HPP +#define AUCTION_ORACLE_KDTREE_RESTRICTED_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_oracle_kdtree_restricted.h" + + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + + +// ***************************** +// AuctionOracleKDTreeRestricted +// ***************************** + + + +template +std::ostream& operator<<(std::ostream& output, const AuctionOracleKDTreeRestricted& oracle) +{ + output << "Oracle " << &oracle << std::endl; + output << fmt::format(" max_val_ = {0}, best_diagonal_items_computed_ = {1}, best_diagonal_item_value_ = {2}, second_best_diagonal_item_idx_ = {3}, second_best_diagonal_item_value_ = {4}\n", + oracle.max_val_, + oracle.best_diagonal_items_computed_, + oracle.best_diagonal_item_value_, + oracle.second_best_diagonal_item_idx_, + oracle.second_best_diagonal_item_value_); + + output << fmt::format(" prices = {0}\n", + format_container_to_log(oracle.prices)); + + output << fmt::format(" diag_items_heap_ = {0}\n", + losses_heap_to_string(oracle.diag_items_heap_)); + + + output << fmt::format(" top_diag_indices_ = {0}\n", + format_container_to_log(oracle.top_diag_indices_)); + + output << fmt::format(" top_diag_counter_ = {0}\n", + oracle.top_diag_counter_); + + output << fmt::format(" top_diag_lookup_ = {0}\n", + format_container_to_log(oracle.top_diag_lookup_)); + + + output << "end of oracle " << &oracle << std::endl; + return output; +} + + +template +AuctionOracleKDTreeRestricted::AuctionOracleKDTreeRestricted(const PointContainer_& _bidders, + const PointContainer_& _items, + const AuctionParams& params) : + AuctionOracleBase(_bidders, _items, params), + heap_handles_indices_(_items.size(), k_invalid_index), + kdtree_items_(_items.size(), k_invalid_index), + top_diag_lookup_(_items.size(), k_invalid_index) +{ + size_t dnn_item_idx { 0 }; + size_t true_idx { 0 }; + dnn_points_.clear(); + dnn_points_.reserve(this->items.size()); + // store normal items in kd-tree + for(const auto& g : this->items) { + if (g.is_normal() ) { + kdtree_items_[true_idx] = dnn_item_idx; + // index of items is id of dnn-point + DnnPoint p(true_idx); + p[0] = g.getRealX(); + p[1] = g.getRealY(); + dnn_points_.push_back(p); + assert(dnn_item_idx == dnn_points_.size() - 1); + dnn_item_idx++; + } + true_idx++; + } + + assert(dnn_points_.size() < _items.size() ); + for(size_t i = 0; i < dnn_points_.size(); ++i) { + dnn_point_handles_.push_back(&dnn_points_[i]); + } + DnnTraits traits; + traits.internal_p = params.internal_p; + kdtree_ = new dnn::KDTree(traits, dnn_point_handles_, params.wasserstein_power); + + size_t handle_idx {0}; + for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { + if (this->items[item_idx].is_diagonal()) { + heap_handles_indices_[item_idx] = handle_idx++; + diag_heap_handles_.push_back(diag_items_heap_.push(std::make_pair(item_idx, 0.0))); + } + } + max_val_ = 3*getFurthestDistance3Approx<>(_bidders, _items, params.internal_p); + max_val_ = std::pow(max_val_, params.wasserstein_power); + weight_adj_const_ = max_val_; + + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); + console_logger->debug("KDTree Restricted oracle ctor done"); +} + + +template +bool AuctionOracleKDTreeRestricted::is_in_top_diag_indices(const size_t item_idx) const +{ + return top_diag_lookup_[item_idx] != k_invalid_index; +} + + +template +void AuctionOracleKDTreeRestricted::add_top_diag_index(const size_t item_idx) +{ + assert(find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx) == top_diag_indices_.end()); + assert(this->items[item_idx].is_diagonal()); + + top_diag_indices_.push_back(item_idx); + top_diag_lookup_[item_idx] = top_diag_indices_.size() - 1; +} + +template +void AuctionOracleKDTreeRestricted::remove_top_diag_index(const size_t item_idx) +{ + if (top_diag_indices_.size() > 1) { + // remove item_idx from top_diag_indices after swapping + // it with the last element, update index lookup appropriately + auto old_index = top_diag_lookup_[item_idx]; + auto end_element = top_diag_indices_.back(); + std::swap(top_diag_indices_[old_index], top_diag_indices_.back()); + top_diag_lookup_[end_element] = old_index; + } + + top_diag_indices_.pop_back(); + top_diag_lookup_[item_idx] = k_invalid_index; + if (top_diag_indices_.size() < 2) { + recompute_second_best_diag(); + } + best_diagonal_items_computed_ = not top_diag_indices_.empty(); + reset_top_diag_counter(); +} + + +template +void AuctionOracleKDTreeRestricted::increment_top_diag_counter() +{ + assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); + + ++top_diag_counter_; + if (top_diag_counter_ >= top_diag_indices_.size()) { + top_diag_counter_ -= top_diag_indices_.size(); + } + + assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); +} + + +template +void AuctionOracleKDTreeRestricted::reset_top_diag_counter() +{ + top_diag_counter_ = 0; +} + +template +void AuctionOracleKDTreeRestricted::recompute_top_diag_items(bool hard) +{ + console_logger->debug("Enter recompute_top_diag_items, hard = {0}", hard); + assert(hard or top_diag_indices_.empty()); + + if (hard) { + std::fill(top_diag_lookup_.begin(), top_diag_lookup_.end(), k_invalid_index); + top_diag_indices_.clear(); + } + + auto top_diag_iter = diag_items_heap_.ordered_begin(); + best_diagonal_item_value_ = top_diag_iter->second; + add_top_diag_index(top_diag_iter->first); + + ++top_diag_iter; + + // traverse the heap while we see the same value + while(top_diag_iter != diag_items_heap_.ordered_end()) { + if ( top_diag_iter->second != best_diagonal_item_value_) { + break; + } else { + add_top_diag_index(top_diag_iter->first); + } + ++top_diag_iter; + } + + recompute_second_best_diag(); + + best_diagonal_items_computed_ = true; + reset_top_diag_counter(); + console_logger->debug("Exit recompute_top_diag_items, hard = {0}", hard); +} + +template +typename AuctionOracleKDTreeRestricted::DebugOptimalBidR +AuctionOracleKDTreeRestricted::get_optimal_bid_debug(IdxType bidder_idx) const +{ + auto bidder = this->bidders[bidder_idx]; + + size_t best_item_idx = k_invalid_index; + size_t second_best_item_idx = k_invalid_index; + Real best_item_value = std::numeric_limits::max(); + Real second_best_item_value = std::numeric_limits::max(); + + for(IdxType item_idx = 0; item_idx < static_cast(this->items.size()); ++item_idx) { + auto item = this->items[item_idx]; + if (item.type != bidder.type and item_idx != bidder_idx) + continue; + auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx]; + if (item_value < best_item_value) { + best_item_value = item_value; + best_item_idx = item_idx; + } + } + + assert(best_item_idx != k_invalid_index); + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + auto item = this->items[item_idx]; + if (item.type != bidder.type and static_cast(item_idx) != bidder_idx) + continue; + if (item_idx == best_item_idx) + continue; + auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx]; + if (item_value < second_best_item_value) { + second_best_item_value = item_value; + second_best_item_idx = item_idx; + } + } + + assert(second_best_item_idx != k_invalid_index); + assert(second_best_item_value >= best_item_value); + + DebugOptimalBidR result; + + result.best_item_idx = best_item_idx; + result.best_item_value = best_item_value; + result.second_best_item_idx = second_best_item_idx; + result.second_best_item_value = second_best_item_value; + + return result; +} + + +template +IdxValPair AuctionOracleKDTreeRestricted::get_optimal_bid(IdxType bidder_idx) +{ + auto bidder = this->bidders[bidder_idx]; + + // corresponding point is always considered as a candidate + // if bidder is a diagonal point, proj_item is a normal point, + // and vice versa. + + size_t best_item_idx { k_invalid_index }; + size_t second_best_item_idx { k_invalid_index }; + size_t best_diagonal_item_idx { k_invalid_index }; + Real best_item_value; + Real second_best_item_value; + + + size_t proj_item_idx = bidder_idx; + assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); + assert(this->items[proj_item_idx].type != bidder.type); + Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); + + if (bidder.is_diagonal()) { + // for diagonal bidder the only normal point has already been added + // the other 2 candidates are diagonal items only, get from the heap + // with prices + + if (not best_diagonal_items_computed_) { + recompute_top_diag_items(); + } + + best_diagonal_item_idx = top_diag_indices_[top_diag_counter_]; + increment_top_diag_counter(); + + if ( proj_item_value < best_diagonal_item_value_) { + best_item_idx = proj_item_idx; + best_item_value = proj_item_value; + second_best_item_value = best_diagonal_item_value_; + second_best_item_idx = best_diagonal_item_idx; + } else if (proj_item_value < second_best_diagonal_item_value_) { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value_; + second_best_item_value = proj_item_value; + second_best_item_idx = proj_item_idx; + } else { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value_; + second_best_item_value = second_best_diagonal_item_value_; + second_best_item_idx = second_best_diagonal_item_idx_; + } + } else { + // for normal bidder get 2 best items among non-diagonal points from + // kdtree_ + DnnPoint bidder_dnn; + bidder_dnn[0] = bidder.getRealX(); + bidder_dnn[1] = bidder.getRealY(); + auto two_best_items = kdtree_->findK(bidder_dnn, 2); + size_t best_normal_item_idx { two_best_items[0].p->id() }; + Real best_normal_item_value { two_best_items[0].d }; + // if there is only one off-diagonal point in the second diagram, + // kd-tree will not return the second candidate. + // Set its value to inf, so it will always lose to the value of the projection + Real second_best_normal_item_value { two_best_items.size() == 1 ? std::numeric_limits::max() : two_best_items[1].d }; + + if ( proj_item_value < best_normal_item_value) { + best_item_idx = proj_item_idx; + best_item_value = proj_item_value; + second_best_item_value = best_normal_item_value; + } else if (proj_item_value < second_best_normal_item_value) { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = proj_item_value; + } else { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = second_best_normal_item_value; + } + } + + IdxValPair result; + + assert( second_best_item_value >= best_item_value ); + + result.first = best_item_idx; + result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; + +#ifdef DEBUG_KDTREE_RESTR_ORACLE + auto db = get_optimal_bid_debug(bidder_idx); + assert(fabs(db.best_item_value - best_item_value) < 0.000001); + if (fabs(db.second_best_item_value - second_best_item_value) >= 0.000001) { + console_logger->debug("Bidder_idx = {0}, best_item_idx = {1}, true_best_item_idx = {2}", bidder_idx, best_item_idx, db.best_item_idx); + console_logger->debug("second_best_item_idx = {0}, true second_best_item_idx = {1}", second_best_item_idx, db.second_best_item_idx); + console_logger->debug("second_best_value = {0}, true second_best_item_value = {1}", second_best_item_value, db.second_best_item_value); + console_logger->debug("prices = {0}", format_container_to_log(this->prices)); + console_logger->debug("top_diag_indices_ = {0}", format_container_to_log(top_diag_indices_)); + console_logger->debug("second_best_diagonal_item_value_ = {0}", second_best_diagonal_item_value_); + } + assert(fabs(db.second_best_item_value - second_best_item_value) < 0.000001); + //std::cout << "bid OK" << std::endl; +#endif + + return result; +} +/* +a_{ij} = d_{ij} +value_{ij} = a_{ij} + price_j +*/ +template +void AuctionOracleKDTreeRestricted::recompute_second_best_diag() +{ + + console_logger->debug("Enter recompute_second_best_diag"); + + if (top_diag_indices_.size() > 1) { + second_best_diagonal_item_value_ = best_diagonal_item_value_; + second_best_diagonal_item_idx_ = top_diag_indices_[0]; + } else { + if (diag_items_heap_.size() == 1) { + second_best_diagonal_item_value_ = std::numeric_limits::max(); + second_best_diagonal_item_idx_ = k_invalid_index; + } else { + auto diag_iter = diag_items_heap_.ordered_begin(); + ++diag_iter; + second_best_diagonal_item_value_ = diag_iter->second; + second_best_diagonal_item_idx_ = diag_iter->first; + } + } + + console_logger->debug("Exit recompute_second_best_diag, second_best_diagonal_item_value_ = {0}, second_best_diagonal_item_idx_ = {1}", second_best_diagonal_item_value_, second_best_diagonal_item_idx_); +} + + +template +void AuctionOracleKDTreeRestricted::set_price(IdxType item_idx, + Real new_price, + const bool update_diag) +{ + + console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}, update_diag = {3}", item_idx, new_price, this->prices[item_idx], update_diag); + + assert(this->prices.size() == this->items.size()); + assert( 0 < diag_heap_handles_.size() and diag_heap_handles_.size() <= this->items.size()); + // adjust_prices decreases prices, + // also this variable must be true in reverse phases of FR-auction + bool item_goes_down = new_price > this->prices[item_idx]; + + this->prices[item_idx] = new_price; + if ( this->items[item_idx].is_normal() ) { + assert(0 <= item_idx and item_idx < static_cast(kdtree_items_.size())); + assert(0 <= kdtree_items_[item_idx] and kdtree_items_[item_idx] < dnn_point_handles_.size()); + kdtree_->change_weight( dnn_point_handles_[kdtree_items_[item_idx]], new_price); + } else { + assert(diag_heap_handles_.size() > heap_handles_indices_.at(item_idx)); + if (item_goes_down) { + diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } else { + diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } + if (update_diag) { + // Update top_diag_indices_ only if necessary: + // normal bidders take their projections, which might not be on top + // also, set_price is called by adjust_prices, and we may have already + // removed the item from top_diag + if (is_in_top_diag_indices(item_idx)) { + remove_top_diag_index(item_idx); + } + + if (item_idx == (IdxType)second_best_diagonal_item_idx_) { + recompute_second_best_diag(); + } + } + } + + console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); +} + + +template +void AuctionOracleKDTreeRestricted::adjust_prices(Real delta) +{ + //console_logger->debug("Enter adjust_prices, delta = {0}", delta); + //std::cerr << *this << std::endl; + + if (delta == 0.0) + return; + + for(auto& p : this->prices) { + p -= delta; + } + + kdtree_->adjust_weights(delta); + + bool price_goes_up = delta < 0; + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + if (this->items[item_idx].is_diagonal()) { + auto new_price = this->prices[item_idx]; + if (price_goes_up) { + diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } else { + diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } + } + } + best_diagonal_item_value_ -= delta; + second_best_diagonal_item_value_ -= delta; + + //std::cerr << *this << std::endl; + //console_logger->debug("Exit adjust_prices, delta = {0}", delta); +} + +template +void AuctionOracleKDTreeRestricted::adjust_prices() +{ + auto pr_begin = this->prices.begin(); + auto pr_end = this->prices.end(); + Real min_price = *(std::min_element(pr_begin, pr_end)); + adjust_prices(min_price); +} + +template +size_t AuctionOracleKDTreeRestricted::get_heap_top_size() const +{ + return top_diag_indices_.size(); +} + +template +std::pair AuctionOracleKDTreeRestricted::get_minmax_price() const +{ + auto r = std::minmax_element(this->prices.begin(), this->prices.end()); + return std::make_pair(*r.first, *r.second); +} + + + +template +AuctionOracleKDTreeRestricted::~AuctionOracleKDTreeRestricted() +{ + delete kdtree_; +} + +template +void AuctionOracleKDTreeRestricted::sanity_check() +{ +#ifdef DEBUG_KDTREE_RESTR_ORACLE + if (best_diagonal_items_computed_) { + std::vector diag_items_price_vec; + diag_items_price_vec.reserve(this->items.size()); + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + if (this->items.at(item_idx).is_diagonal()) { + diag_items_price_vec.push_back(this->prices.at(item_idx)); + } else { + diag_items_price_vec.push_back(std::numeric_limits::max()); + } + } + + auto best_iter = std::min_element(diag_items_price_vec.begin(), diag_items_price_vec.end()); + assert(best_iter != diag_items_price_vec.end()); + Real true_best_diag_value = *best_iter; + size_t true_best_diag_idx = best_iter - diag_items_price_vec.begin(); + assert(true_best_diag_value != std::numeric_limits::max()); + + Real true_second_best_diag_value = std::numeric_limits::max(); + size_t true_second_best_diag_idx = k_invalid_index; + for(size_t item_idx = 0; item_idx < diag_items_price_vec.size(); ++item_idx) { + if (this->items.at(item_idx).is_normal()) { + assert(top_diag_lookup_.at(item_idx) == k_invalid_index); + continue; + } + + auto i_iter = std::find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx); + if (diag_items_price_vec.at(item_idx) == true_best_diag_value) { + assert(i_iter != top_diag_indices_.end()); + assert(top_diag_lookup_.at(item_idx) == i_iter - top_diag_indices_.begin()); + } else { + assert(top_diag_lookup_.at(item_idx) == k_invalid_index); + assert(i_iter == top_diag_indices_.end()); + } + + if (item_idx == true_best_diag_idx) { + continue; + } + if (diag_items_price_vec.at(item_idx) < true_second_best_diag_value) { + true_second_best_diag_value = diag_items_price_vec.at(item_idx); + true_second_best_diag_idx = item_idx; + } + } + + if (true_best_diag_value != best_diagonal_item_value_) { + console_logger->debug("best_diagonal_item_value_ = {0}, true value = {1}", best_diagonal_item_value_, true_best_diag_value); + std::cerr << *this; + //console_logger->debug("{0}", *this); + } + + assert(true_best_diag_value == best_diagonal_item_value_); + + assert(true_second_best_diag_idx != k_invalid_index); + + if (true_second_best_diag_value != second_best_diagonal_item_value_) { + console_logger->debug("second_best_diagonal_item_value_ = {0}, true value = {1}", second_best_diagonal_item_value_, true_second_best_diag_value); + //console_logger->debug("{0}", *this); + } + + assert(true_second_best_diag_value == second_best_diagonal_item_value_); + } +#endif +} + + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_single_diag.h b/wasserstein/include/auction_oracle_kdtree_single_diag.h new file mode 100644 index 0000000..9192993 --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_single_diag.h @@ -0,0 +1,219 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_KDTREE_SINGLE_DIAG_H +#define AUCTION_ORACLE_KDTREE_SINGLE_DIAG_H + + +#include +#include +#include +#include +#include + +#include "basic_defs_ws.h" +#include "dnn/geometry/euclidean-fixed.h" +#include "dnn/local/kd-tree.h" + +namespace hera { +namespace ws { + + +template +struct ItemSlice; + +template +bool operator<(const ItemSlice& s_1, const ItemSlice& s_2); + +template +bool operator>(const ItemSlice& s_1, const ItemSlice& s_2); + +template +struct ItemSlice { +public: + using RealType = Real; + + size_t item_idx; + Real loss; + ItemSlice(size_t _item_idx, const Real _loss); + + void set_loss(const Real new_loss) { loss = new_loss; } + void adjust_loss(const Real delta) { loss -= delta; } + + friend bool operator< <>(const ItemSlice&, const ItemSlice&); + friend bool operator> <>(const ItemSlice&, const ItemSlice&); + +private: +}; + + +template +class LossesHeap { +public: + using ItemSliceR = ItemSlice; + using KeeperTypeR = std::set >; + using IterTypeR = typename KeeperTypeR::iterator; + + LossesHeap() {} + LossesHeap(const std::vector&); + void adjust_prices(const Real delta); // subtract delta from all values + ItemSliceR get_best_slice() const; + ItemSliceR get_second_best_slice() const; + + template + decltype(auto) emplace(Args&&... args) + { + return keeper.emplace(std::forward(args)...); + } + + + IterTypeR begin() { return keeper.begin(); } + IterTypeR end() { return keeper.end(); } + void erase(IterTypeR iter) { assert(iter != keeper.end()); keeper.erase(iter); } + decltype(auto) insert(const ItemSliceR& item) { return keeper.insert(item); } + size_t size() const { return keeper.size(); } + bool empty() const { return keeper.empty(); } +//private: + std::set > keeper; +}; + +template +struct DiagonalBid { + DiagonalBid() {} + + std::vector assigned_normal_items; + std::vector assigned_normal_items_bid_values; + + std::vector best_item_indices; + std::vector bid_values; + + // common bid value for diag-diag + Real diag_to_diag_value { 0.0 }; + + // analogous to second best item value; denoted by w in Bertsekas's paper on auction for transportation problem + Real almost_best_value { 0.0 }; + + // how many points to get from unassigned diagonal chunk + int num_from_unassigned_diag { 0 }; +}; + +template >> +struct AuctionOracleKDTreeSingleDiag : AuctionOracleBase { + + using PointContainer = PointContainer_; + using Real = Real_; + + using DnnPoint = dnn::Point<2, Real>; + using DnnTraits = dnn::PointTraits; + + using IdxValPairR = typename ws::IdxValPair; + using ItemSliceR = typename ws::ItemSlice; + using LossesHeapR = typename ws::LossesHeap; + using LossesHeapIterR = typename ws::LossesHeap::IterTypeR; + using DiagramPointR = typename ws::DiagramPoint; + using DiagonalBidR = typename ws::DiagonalBid; + + AuctionOracleKDTreeSingleDiag(const PointContainer& bidders, + const PointContainer& items, + const AuctionParams& params); + ~AuctionOracleKDTreeSingleDiag(); + // data members + // temporarily make everything public + Real max_val_; + size_t num_diag_items_; + size_t num_normal_items_; + size_t num_diag_bidders_; + size_t num_normal_bidders_; + dnn::KDTree* kdtree_; + std::vector dnn_points_; + std::vector dnn_point_handles_; + std::vector kdtree__items_; + + // this heap is used by off-diagonal bidders to get the cheapest diagonal + // item; index in the IdxVal is a valid item index in the vector of items + // items in diag_assigned_to_diag_slice_ and in diag_unassigned_slice_ + // are not stored in this heap + LossesHeapR diag_items_heap_; + // vector of iterators; if item_idx is in diag_assigned_to_diag_slice_ or + // in diag_unassigned_slice_, then diag_items_heap__iters_[item_idx] == + // diag_items_heap_.end() + std::vector diag_items_heap__iters_; + + + // this heap is used by _the_ diagonal bidder to get the cheapest items + // * value in IdxValPair is price + persistence (i.e., price for + // diagonal items) + // * index in IdxValPair is a valid item index in the vector of items + // items in diag_assigned_to_diag_slice_ and in diag_unassigned_slice_ + // are not stored in this heap + LossesHeapR all_items_heap_; + std::vector all_items_heap__iters_; + + std::unordered_set diag_assigned_to_diag_slice_; + std::unordered_set diag_unassigned_slice_; + + + std::unordered_set normal_items_assigned_to_diag_; + + Real diag_to_diag_price_; + Real diag_unassigned_price_; + + // methods + Real get_price(const size_t item_idx) const override; + void set_price(const size_t item_idx, + const Real new_price, + const bool item_is_diagonal, + const bool bidder_is_diagonal, + const OwnerType old_owner_type); + + IdxValPair get_optimal_bid(const IdxType bidder_idx); + + DiagonalBidR get_optimal_bids_for_diagonal(int unassigned_mass); + void process_unassigned_diagonal(const int unassigned_mass, + int& accumulated_mass, + bool& saw_diagonal_slice, + int& num_classes, + Real& w, + DiagonalBidR& result, + bool& found_w); + + void adjust_prices(); + void flush_assignment(); + void sanity_check(); + + bool is_item_diagonal(const size_t item_idx) const; + bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } + +}; + +} // ws +} // hera + +#include "auction_oracle_kdtree_single_diag.hpp" + +#endif diff --git a/wasserstein/include/auction_oracle_kdtree_single_diag.hpp b/wasserstein/include/auction_oracle_kdtree_single_diag.hpp new file mode 100644 index 0000000..42677ab --- /dev/null +++ b/wasserstein/include/auction_oracle_kdtree_single_diag.hpp @@ -0,0 +1,717 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ +#ifndef AUCTION_ORACLE_KDTREE_RESTRICTED_SINGLE_DIAG_HPP +#define AUCTION_ORACLE_KDTREE_RESTRICTED_SINGLE_DIAG_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_oracle.h" + + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + +// ***************************** +// AuctionOracleKDTreeSingleDiag +// ***************************** + + + +template +ItemSlice::ItemSlice(size_t _item_idx, + const Real _loss) : + item_idx(_item_idx), + loss(_loss) +{ +} + + +template +bool operator<(const ItemSlice& s_1, const ItemSlice& s_2) +{ + return s_1.loss < s_2.loss + or (s_1.loss == s_2.loss and s_1.item_idx < s_2.item_idx); +} + +template +bool operator>(const ItemSlice& s_1, const ItemSlice& s_2) +{ + return s_1.loss > s_2.loss + or (s_1.loss == s_2.loss and s_1.item_idx > s_2.item_idx); +} + +template +std::ostream& operator<<(std::ostream& s, const ItemSlice& x) +{ + s << "(" << x.item_idx << ", " << x.loss << ")"; + return s; +} + +// ***************************** +// LossesHeap +// ***************************** + + +template +void LossesHeap::adjust_prices(const Real delta) +{ + throw std::runtime_error("not implemented"); +} + +template +typename LossesHeap::ItemSliceR LossesHeap::get_best_slice() const +{ + return *(keeper.begin()); +} + +template +typename LossesHeap::ItemSliceR LossesHeap::get_second_best_slice() const +{ + if (keeper.size() > 1) { + return *std::next(keeper.begin()); + } else { + return ItemSliceR(k_invalid_index, std::numeric_limits::max()); + } +} + +template +std::ostream& operator<<(std::ostream& s, const LossesHeap& x) +{ + s << "Heap[ "; + for(auto iter = x.keeper.begin(); iter != x.keeper.end(); ++iter) { + s << *iter << "\n"; + } + s << "]\n"; + return s; +} + +// ***************************** +// DiagonalBid +// ***************************** + +template +std::ostream& operator<<(std::ostream& s, const DiagonalBid& b) +{ + s << "DiagonalBid { num_from_unassigned_diag = " << b.num_from_unassigned_diag; + s << ", diag_to_diag_value = " << b.diag_to_diag_value; + s << ", almost_best_value = " << b.almost_best_value; + s << ",\nbest_item_indices = ["; + for(const auto i : b.best_item_indices) { + s << i << ", "; + } + s << "]\n"; + + s << ",\nbid_values= ["; + for(const auto v : b.bid_values) { + s << v << ", "; + } + s << "]\n"; + + s << ",\nassigned_normal_items= ["; + for(const auto i : b.assigned_normal_items) { + s << i << ", "; + } + s << "]\n"; + + s << ",\nassigned_normal_items_bid_values = ["; + for(const auto v : b.assigned_normal_items_bid_values) { + s << v << ", "; + } + s << "]\n"; + + return s; +} + +// ***************************** +// AuctionOracleKDTreeSingleDiag +// ***************************** + +template +std::ostream& operator<<(std::ostream& s, const AuctionOracleKDTreeSingleDiag& x) +{ + s << "oracle: bidders" << std::endl; + for(const auto& p : x.bidders) { + s << p << "\n"; + } + s << "items:"; + + for(const auto& p : x.items) { + s << p << "\n"; + } + + s << "diag_unassigned_slice_.size = " << x.diag_unassigned_slice_.size() << ", "; + s << "diag_unassigned_price_ = " << x.diag_unassigned_price_ << ", "; + s << "diag unassigned slice ["; + + for(const auto& i : x.diag_unassigned_slice_) { + s << i << ", "; + } + s << "]\n "; + + s << "diag_assigned_to_diag_slice_.size = " << x.diag_assigned_to_diag_slice_.size() << ", "; + s << "diag_assigned_to_diag_price = " << x.diag_to_diag_price_ << "\n"; + s << "diag_assigned_to_diag_slice_ ["; + + for(const auto& i : x.diag_assigned_to_diag_slice_) { + s << i << ", "; + } + s << "]\n "; + + s << "diag_items_heap_.size = " << x.diag_items_heap_.size() << "\n "; + s << x.diag_items_heap_; + + s << "all_items_heap_.size = " << x.all_items_heap_.size() << "\n "; + s << x.all_items_heap_; + + s << "epsilon = " << x.epsilon << std::endl; + + return s; +} + + +template +AuctionOracleKDTreeSingleDiag::AuctionOracleKDTreeSingleDiag(const PointContainer_& _bidders, + const PointContainer_& _items, + const AuctionParams& params) : + AuctionOracleBase(_bidders, _items, params), + max_val_(std::pow( 3.0 * getFurthestDistance3Approx<>(_bidders, _items, params.internal_p), params.wasserstein_power)), + num_diag_items_(0), + kdtree__items_(_items.size(), k_invalid_index) +{ + size_t dnn_item_idx { 0 }; + dnn_points_.clear(); + + all_items_heap__iters_.clear(); + all_items_heap__iters_.reserve( 4 * _items.size() / 7); + + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + const auto& item = this->items[item_idx]; + if (item.is_normal() ) { + // store normal items in kd-tree + kdtree__items_[item_idx] = dnn_item_idx; + // index of items is id of dnn-point + DnnPoint p(item_idx); + p[0] = item.x; + p[1] = item.y; + dnn_points_.push_back(p); + assert(dnn_item_idx == dnn_points_.size() - 1); + dnn_item_idx++; + // add slice to vector + auto ins_res = all_items_heap_.emplace(item_idx, this->get_value_for_diagonal_bidder(item_idx)); + all_items_heap__iters_.push_back(ins_res.first); + assert(ins_res.second); + } else { + // all diagonal items are initially in the unassigned slice + diag_unassigned_slice_.insert(item_idx); + all_items_heap__iters_.push_back(all_items_heap_.end()); + diag_items_heap__iters_.push_back(diag_items_heap_.end()); + ++num_diag_items_; + } + } + + num_normal_items_ = this->items.size() - num_diag_items_; + num_normal_bidders_ = num_diag_items_; + num_diag_bidders_ = this->bidders.size() - num_normal_bidders_; + + assert(dnn_points_.size() < _items.size() ); + for(size_t i = 0; i < dnn_points_.size(); ++i) { + dnn_point_handles_.push_back(&dnn_points_[i]); + } + + DnnTraits traits; + traits.internal_p = params.internal_p; + + kdtree_ = new dnn::KDTree(traits, dnn_point_handles_, this->wasserstein_power); + + sanity_check(); + + //std::cout << "IN CTOR: " << *this << std::endl; + +} + + +template +void AuctionOracleKDTreeSingleDiag::process_unassigned_diagonal(const int unassigned_mass, int& accumulated_mass, bool& saw_diagonal_slice, int& num_classes, Real& w, DiagonalBidR& result, bool& found_w) +{ + result.num_from_unassigned_diag = std::min(static_cast(diag_unassigned_slice_.size()), static_cast(unassigned_mass - accumulated_mass)); + if (not saw_diagonal_slice) { + saw_diagonal_slice = true; + ++num_classes; + } + + accumulated_mass += result.num_from_unassigned_diag; + //std::cout << "got mass from diagunassigned_slice, result.num_from_unassigned_diag = " << result.num_from_unassigned_diag << ", accumulated_mass = " << accumulated_mass << std::endl; + + if (static_cast(diag_unassigned_slice_.size()) > result.num_from_unassigned_diag and num_classes >= 2) { + found_w = true; + w = diag_unassigned_price_; + //std::cout << "w found from diag_unassigned_slice_, too, w = " << w << std::endl; + result.almost_best_value = w; + } + +} + + +template +typename AuctionOracleKDTreeSingleDiag::DiagonalBidR AuctionOracleKDTreeSingleDiag::get_optimal_bids_for_diagonal(int unassigned_mass) +{ + sanity_check(); + + assert(unassigned_mass == static_cast(num_diag_bidders_) + - static_cast(normal_items_assigned_to_diag_.size()) + - static_cast(diag_assigned_to_diag_slice_.size()) ); + assert(unassigned_mass > 0); + + DiagonalBidR result; + + + // number of similarity classes already assigned to diagonal bidder + // each normal point is a single class + // all diagonal points are in one class + int num_classes = normal_items_assigned_to_diag_.size() + ( diag_assigned_to_diag_slice_.empty() ? 0 : 1 ); + bool saw_diagonal_slice = not diag_assigned_to_diag_slice_.empty(); + bool found_w = false; + + //std::cout << "Enter get_optimal_bids_for_diagonal, unassigned_mass = " << unassigned_mass <<", num_classes = " << num_classes << ", saw_diagonal_slice = " << std::boolalpha << saw_diagonal_slice << std::endl; + + decltype(unassigned_mass) accumulated_mass = 0; + + + Real w { std::numeric_limits::max() }; + bool unassigned_not_processed = not diag_unassigned_slice_.empty(); + + for(auto slice_iter = all_items_heap_.begin(); slice_iter != all_items_heap_.end(); ++slice_iter) { + + auto slice = *slice_iter; + + if ( is_item_normal(slice.item_idx) and normal_items_assigned_to_diag_.count(slice.item_idx) == 1) { + //std::cout << __LINE__ << ": skipping slice " << slice << std::endl; + // this item is already assigned to diagonal bidder, skip + continue; + } + + if (unassigned_not_processed and slice.loss >= diag_unassigned_price_) { + // diag_unassigned slice is better, + // process it first + process_unassigned_diagonal(unassigned_mass, accumulated_mass, saw_diagonal_slice, num_classes, w, result, found_w); + unassigned_not_processed = false; + if (accumulated_mass >= unassigned_mass and found_w) { + break; + } + } + + + if (is_item_normal(slice.item_idx)) { + // all off-diagonal items are distinct + ++num_classes; + } else if (not saw_diagonal_slice) { + saw_diagonal_slice = true; + ++num_classes; + } + + if (accumulated_mass < unassigned_mass) { + //std::cout << __LINE__ << ": added slice to best items " << slice << std::endl; + result.best_item_indices.push_back(slice.item_idx); + } + + if (accumulated_mass >= unassigned_mass and num_classes >= 2) { + //std::cout << "Found w, slice = " << slice << std::endl; + w = slice.loss; + found_w = true; + result.almost_best_value = w; + break; + } + + // all items in all_items heap have mass 1 + ++accumulated_mass; + //std::cout << "accumulated_mass = " << accumulated_mass << std::endl; + + } + + if (unassigned_not_processed and (accumulated_mass < unassigned_mass or not found_w)) { + process_unassigned_diagonal(unassigned_mass, accumulated_mass, saw_diagonal_slice, num_classes, w, result, found_w); + } + + assert(found_w); + + //if (w == std::numeric_limits::max()) { std::cout << "HERE: " << *this << std::endl; } + assert(w != std::numeric_limits::max()); + + result.assigned_normal_items.clear(); + result.assigned_normal_items_bid_values.clear(); + + result.assigned_normal_items.reserve(normal_items_assigned_to_diag_.size()); + result.assigned_normal_items_bid_values.reserve(normal_items_assigned_to_diag_.size()); + + // add already assigned normal items and their new prices to bid + for(const auto item_idx : normal_items_assigned_to_diag_) { + assert( all_items_heap__iters_[item_idx] != all_items_heap_.end() ); + assert( is_item_normal(item_idx) ); + + result.assigned_normal_items.push_back(item_idx); + Real bid_value = w - this->get_cost_for_diagonal_bidder(item_idx) + this->epsilon; + //if ( bid_value <= this->get_price(item_idx) ) { + //std::cout << bid_value << " vs price " << this->get_price(item_idx) << std::endl; + //std::cout << *this << std::endl; + //} + assert( bid_value >= this->get_price(item_idx) ); + result.assigned_normal_items_bid_values.push_back(bid_value); + } + + // calculate bid values + // diag-to-diag items all have the same bid value + if (saw_diagonal_slice) { + result.diag_to_diag_value = w + this->epsilon; + } else { + result.diag_to_diag_value = std::numeric_limits::max(); + } + + result.bid_values.reserve(result.best_item_indices.size()); + for(const auto item_idx : result.best_item_indices) { + Real bid_value = w - this->get_cost_for_diagonal_bidder(item_idx) + this->epsilon; + result.bid_values.push_back(bid_value); + } + + return result; +} + + +template +IdxValPair AuctionOracleKDTreeSingleDiag::get_optimal_bid(IdxType bidder_idx) +{ + //std::cout << "enter get_optimal_bid" << std::endl; + sanity_check(); + + auto bidder = this->bidders[bidder_idx]; + + size_t best_item_idx; + Real best_item_price; + Real best_item_value; + Real second_best_item_value; + + // this function is for normal bidders only + assert(bidder.is_normal()); + + + // get 2 best items among non-diagonal points from kdtree_ + DnnPoint bidder_dnn; + bidder_dnn[0] = bidder.getRealX(); + bidder_dnn[1] = bidder.getRealY(); + auto two_best_items = kdtree_->findK(bidder_dnn, 2); + size_t best_normal_item_idx { two_best_items[0].p->id() }; + Real best_normal_item_value { two_best_items[0].d }; + // if there is only one off-diagonal point in the second diagram, + // kd-tree will not return the second candidate. + // Set its price to inf, so it will always lose to the price of the projection + Real second_best_normal_item_value { two_best_items.size() == 1 ? std::numeric_limits::max() : two_best_items[1].d }; + + size_t best_diag_item_idx; + Real best_diag_value; + Real best_diag_price; + + { + Real diag_edge_cost = std::pow(bidder.persistence_lp(this->internal_p), this->wasserstein_power); + auto best_diag_price_in_heap = diag_items_heap_.empty() ? std::numeric_limits::max() : diag_items_heap_.get_best_slice().loss; + auto best_diag_idx_in_heap = diag_items_heap_.empty() ? k_invalid_index : diag_items_heap_.get_best_slice().item_idx; + // if unassigned_diag_slice is empty, its price is max, + // same for diag-diag assigned slice, so the ifs below will work + + if (best_diag_price_in_heap <= diag_to_diag_price_ and best_diag_price_in_heap <= diag_unassigned_price_) { + best_diag_item_idx = best_diag_idx_in_heap; + best_diag_value = diag_edge_cost + best_diag_price_in_heap; + best_diag_price = best_diag_price_in_heap; + } else if (diag_to_diag_price_ < best_diag_price_in_heap and diag_to_diag_price_ < diag_unassigned_price_) { + best_diag_item_idx = *diag_assigned_to_diag_slice_.begin(); + best_diag_value = diag_edge_cost + diag_to_diag_price_; + best_diag_price = diag_to_diag_price_; + } else { + best_diag_item_idx = *diag_unassigned_slice_.begin(); + best_diag_value = diag_edge_cost + diag_unassigned_price_; + best_diag_price = diag_unassigned_price_; + } + + } + + if ( best_diag_value < best_normal_item_value) { + best_item_idx = best_diag_item_idx; + best_item_price = best_diag_price; + best_item_value = best_diag_value; + second_best_item_value = best_normal_item_value; + } else if (best_diag_value < second_best_normal_item_value) { + best_item_idx = best_normal_item_idx; + best_item_price = this->get_price(best_item_idx); + best_item_value = best_normal_item_value; + second_best_item_value = best_diag_value; + } else { + best_item_idx = best_normal_item_idx; + best_item_price = this->get_price(best_item_idx); + best_item_value = best_normal_item_value; + second_best_item_value = second_best_normal_item_value; + } + + IdxValPair result; + + result.first = best_item_idx; + result.second = ( second_best_item_value - best_item_value ) + best_item_price + this->epsilon; + + //std::cout << "bidder_idx = " << bidder_idx << ", best_item_idx = " << best_item_idx << ", best_item_value = " << best_item_value << ", second_best_item_value = " << second_best_item_value << ", eps = " << this->epsilon << std::endl; + assert( second_best_item_value >= best_item_value ); + //assert( best_item_price == this->get_price(best_item_idx) ); + assert(result.second >= best_item_price); + sanity_check(); + + return result; +} +/* +a_{ij} = d_{ij} +price_{ij} = a_{ij} + price_j +*/ + + + +//template +//std::vector AuctionOracleKDTreeSingleDiag::increase_price_of_assigned_to_diag(WHAT) +//{ + //WHAT; +//} +// + +template +Real_ AuctionOracleKDTreeSingleDiag::get_price(const size_t item_idx) const +{ + if (is_item_diagonal(item_idx)) { + if (diag_assigned_to_diag_slice_.count(item_idx) == 1) { + return diag_to_diag_price_; + } else if (diag_unassigned_slice_.count(item_idx) == 1) { + return diag_unassigned_price_; + } + } + return this-> prices[item_idx]; +} + +template +void AuctionOracleKDTreeSingleDiag::set_price(const size_t item_idx, + const Real new_price, + const bool item_is_diagonal, + const bool bidder_is_diagonal, + const OwnerType old_owner_type) +{ + + //std::cout << std::boolalpha << "enter set_price, item_idx = " << item_idx << ", new_price = " << new_price << ", old price = " << this->get_price(item_idx); + //std::cout << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << ", old_owner_type = " << old_owner_type << std::endl; + + bool item_is_normal = not item_is_diagonal; + bool bidder_is_normal = not bidder_is_diagonal; + + assert( new_price >= this->get_price(item_idx) ); + + // update vector prices + if (item_is_normal or bidder_is_normal) { + this->prices[item_idx] = new_price; + } + + // update kdtree_ + if (item_is_normal) { + assert(0 <= item_idx and item_idx < kdtree__items_.size()); + assert(0 <= kdtree__items_[item_idx] and kdtree__items_[item_idx] < dnn_point_handles_.size()); + kdtree_->change_weight( dnn_point_handles_[kdtree__items_[item_idx]], new_price); + } + + // update all_items_heap_ + if (bidder_is_diagonal and item_is_diagonal) { + // remove slice (item is buried in diag_assigned_to_diag_slice_) + assert(old_owner_type != OwnerType::k_diagonal); + auto iter = all_items_heap__iters_[item_idx]; + assert(iter != all_items_heap_.end()); + all_items_heap_.erase(iter); + all_items_heap__iters_[item_idx] = all_items_heap_.end(); + } else { + auto iter = all_items_heap__iters_[item_idx]; + if (iter != all_items_heap_.end()) { + // update existing element + ItemSliceR x = *iter; + x.set_loss( this->get_value_for_diagonal_bidder(item_idx) ); + all_items_heap_.erase(iter); + auto ins_res = all_items_heap_.insert(x); + all_items_heap__iters_[item_idx] = ins_res.first; + assert(ins_res.second); + } else { + // insert new slice + // for diagonal items value = price + ItemSliceR x { item_idx, new_price }; + auto ins_res = all_items_heap_.insert(x); + all_items_heap__iters_[item_idx] = ins_res.first; + assert(ins_res.second); + } + } + + // update diag_items_heap_ + if (item_is_diagonal and bidder_is_normal) { + // update existing element + auto iter = diag_items_heap__iters_[item_idx]; + if (iter != diag_items_heap_.end()) { + ItemSliceR x = *iter; + x.set_loss( new_price ); + diag_items_heap_.erase(iter); + auto ins_res = diag_items_heap_.insert(x); + diag_items_heap__iters_[item_idx] = ins_res.first; + assert(ins_res.second); + } else { + // insert new slice + // for diagonal items value = price + ItemSliceR x { item_idx, new_price }; + auto ins_res = diag_items_heap_.insert(x); + diag_items_heap__iters_[item_idx] = ins_res.first; + assert(ins_res.second); + } + } else if (bidder_is_diagonal and item_is_diagonal ) { + // remove slice (item is buried in diag_assigned_to_diag_slice_) + assert(old_owner_type != OwnerType::k_diagonal); + auto iter = diag_items_heap__iters_[item_idx]; + assert(iter != diag_items_heap_.end()); + diag_items_heap_.erase(iter); + diag_items_heap__iters_[item_idx] = diag_items_heap_.end(); + } + + // update diag_unassigned_price_ + if (item_is_diagonal and old_owner_type == OwnerType::k_none and diag_unassigned_slice_.empty()) { + diag_unassigned_price_ = std::numeric_limits::max(); + } + +} + + +template +bool AuctionOracleKDTreeSingleDiag::is_item_diagonal(const size_t item_idx) const +{ + return item_idx < this->num_diag_items_; +} + + +template +void AuctionOracleKDTreeSingleDiag::flush_assignment() +{ + //std::cout << "enter oracle->flush_assignment" << std::endl; + sanity_check(); + + for(const auto item_idx : diag_assigned_to_diag_slice_) { + diag_unassigned_slice_.insert(item_idx); + } + diag_assigned_to_diag_slice_.clear(); + + // common price of diag-diag items becomes price of diag-unassigned-slice + // diag_to_diag_slice is now empty, set its price to max + // so that get_optimal_bid works correctly + diag_unassigned_price_ = diag_to_diag_price_; + diag_to_diag_price_ = std::numeric_limits::max(); + + normal_items_assigned_to_diag_.clear(); + + sanity_check(); +} + + +template +void AuctionOracleKDTreeSingleDiag::adjust_prices() +{ + return; + + throw std::runtime_error("not implemented"); + auto pr_begin = this->prices.begin(); + auto pr_end = this->prices.end(); + + Real min_price = *(std::min_element(pr_begin, pr_end)); + + for(auto& p : this->prices) { + p -= min_price; + } + + kdtree_->adjust_weights(min_price); + diag_items_heap_.adjust_prices(min_price); + all_items_heap_.adjust_prices(min_price); +} + + +template +AuctionOracleKDTreeSingleDiag::~AuctionOracleKDTreeSingleDiag() +{ + delete kdtree_; +} + +template +void AuctionOracleKDTreeSingleDiag::sanity_check() +{ +#ifdef DEBUG_AUCTION + + //std::cout << "ORACLE CURRENT STATE IN SANITY CHECK" << *this << std::endl; + + assert( diag_items_heap_.size() + diag_assigned_to_diag_slice_.size() + diag_unassigned_slice_.size() == num_diag_items_ ); + assert( diag_items_heap__iters_.size() == num_diag_items_ ); + for(size_t i = 0; i < num_diag_items_; ++i) { + if (diag_items_heap__iters_.at(i) != diag_items_heap_.end()) { + assert(diag_items_heap__iters_[i]->item_idx == i); + } + } + + assert( all_items_heap_.size() + diag_assigned_to_diag_slice_.size() + diag_unassigned_slice_.size() == this->num_items_ ); + assert( all_items_heap__iters_.size() == this->num_items_ ); + for(size_t i = 0; i < this->num_items_; ++i) { + if (all_items_heap__iters_.at(i) != all_items_heap_.end()) { + assert(all_items_heap__iters_[i]->item_idx == i); + } else { + assert( i < num_diag_items_ ); + } + } + + for(size_t i = 0; i < num_diag_items_; ++i) { + int is_in_assigned_slice = diag_assigned_to_diag_slice_.count(i); + int is_in_unassigned_slice = diag_unassigned_slice_.count(i); + int is_in_heap = diag_items_heap__iters_[i] != diag_items_heap_.end(); + assert( is_in_assigned_slice + is_in_unassigned_slice + is_in_heap == 1); + } + + //assert((diag_assigned_to_diag_slice_.empty() and diag_to_diag_price_ == std::numeric_limits::max()) or (not diag_assigned_to_diag_slice_.empty() and diag_to_diag_price_ != std::numeric_limits::max())); + //assert((diag_unassigned_slice_.empty() and diag_unassigned_price_ == std::numeric_limits::max()) or (not diag_unassigned_slice_.empty() and diag_unassigned_price_ != std::numeric_limits::max())); + + assert(diag_assigned_to_diag_slice_.empty() or diag_to_diag_price_ != std::numeric_limits::max()); + assert(diag_unassigned_slice_.empty() or diag_unassigned_price_ != std::numeric_limits::max()); +#endif +} + + +} // ws +} // hera +#endif diff --git a/wasserstein/include/auction_oracle_lazy_heap.h b/wasserstein/include/auction_oracle_lazy_heap.h new file mode 100644 index 0000000..8b37421 --- /dev/null +++ b/wasserstein/include/auction_oracle_lazy_heap.h @@ -0,0 +1,191 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_LAZY_HEAP_H +#define AUCTION_ORACLE_LAZY_HEAP_H + + +#define USE_BOOST_HEAP + +#include +#include +#include +#include + +#ifdef USE_BOOST_HEAP +#include +#endif + +#include "basic_defs_ws.h" + +namespace ws { + +template +struct CompPairsBySecondStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second < b.second; + } +}; + + +template +struct CompPairsBySecondGreaterStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second > b.second; + } +}; + +template +struct CompPairsBySecondLexStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second < b.second or (a.second == b.second and a.first > b.first); + } +}; + +template +struct CompPairsBySecondLexGreaterStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second > b.second or (a.second == b.second and a.first > b.first); + } +}; + +using ItemsTimePair = std::pair; +using UpdateList = std::list; +using UpdateListIter = UpdateList::iterator; + + +#ifdef USE_BOOST_HEAP +template +using LossesHeap = boost::heap::d_ary_heap, boost::heap::arity<2>, boost::heap::mutable_, boost::heap::compare>>; +#else +template +class IdxValHeap { +public: + using InternalKeeper = std::set, ComparisonStruct>; + using handle_type = typename InternalKeeper::iterator; + // methods + handle_type push(const IdxValPair& val) + { + auto res_pair = _heap.insert(val); + assert(res_pair.second); + assert(res_pair.first != _heap.end()); + return res_pair.first; + } + + void decrease(handle_type& handle, const IdxValPair& new_val) + { + _heap.erase(handle); + handle = push(new_val); + } + + void increase(handle_type& handle, const IdxValPair& new_val) + { + _heap.erase(handle); + handle = push(new_val); + + size_t size() const + { + return _heap.size(); + } + + handle_type ordered_begin() + { + return _heap.begin(); + } + + handle_type ordered_end() + { + return _heap.end(); + } + + +private: + std::set, ComparisonStruct> _heap; +}; + +// if we store losses, the minimal value should come first +template +using LossesHeap = IdxValHeap; +#endif + + +template +struct AuctionOracleLazyHeapRestricted : AuctionOracleBase { + + using LossesHeapR = typename ws::LossesHeap; + using LossesHeapRHandle = typename ws::LossesHeap::handle_type; + using DiagramPointR = typename ws::DiagramPoint; + + + AuctionOracleLazyHeapRestricted(const std::vector& bidders, const std::vector& items, const Real wasserstein_power, const Real _internal_p = get_infinity()); + ~AuctionOracleLazyHeapRestricted(); + // data members + // temporarily make everything public + std::vector> weight_matrix; + //Real weight_adj_const; + Real max_val; + // vector of heaps to find the best items + std::vector losses_heap; + std::vector> items_indices_for_heap_handles; + std::vector> losses_heap_handles; + // methods + void fill_in_losses_heap(); + void set_price(const IdxType items_idx, const Real new_price); + IdxValPair get_optimal_bid(const IdxType bidder_idx); + Real get_matching_weight(const std::vector& bidders_to_items) const; + void adjust_prices(); + // to update the queue in lazy fashion + std::vector items_iterators; + UpdateList update_list; + std::vector bidders_update_moments; + int update_counter; + void update_queue_for_bidder(const IdxType bidder_idx); + LossesHeapR diag_items_heap; + std::vector diag_heap_handles; + std::vector heap_handles_indices; + // debug + + DebugOptimalBid get_optimal_bid_debug(const IdxType bidder_idx); + + // for diagonal points + bool best_diagonal_items_computed; + size_t best_diagonal_item_idx; + Real best_diagonal_item_value; + size_t second_best_diagonal_item_idx; + Real second_best_diagonal_item_value; +}; + +} // end of namespace ws + +#include "auction_oracle_lazy_heap.h" + +#endif diff --git a/wasserstein/include/auction_oracle_lazy_heap.hpp b/wasserstein/include/auction_oracle_lazy_heap.hpp new file mode 100644 index 0000000..d179b3d --- /dev/null +++ b/wasserstein/include/auction_oracle_lazy_heap.hpp @@ -0,0 +1,465 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_oracle.h" + + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace ws { + +// ***************************** +// AuctionOracleLazyHeapRestricted +// ***************************** + + +template +AuctionOracleLazyHeapRestricted::AuctionOracleLazyHeapRestricted(const std::vector>& _bidders, + const std::vector>& _items, + Real _wasserstein_power, + Real _internal_p) : + AuctionOracleAbstract(_bidders, _items, _wasserstein_power, _internal_p), + max_val(0.0), + bidders_update_moments(_bidders.size(), 0), + update_counter(0), + heap_handles_indices(_items.size(), k_invalid_index), + best_diagonal_items_computed(false) +{ + weight_matrix.reserve(_bidders.size()); + //const Real max_dist_upper_bound = 3 * getFurthestDistance3Approx(b, g); + //weight_adj_const = pow(max_dist_upper_bound, wasserstein_power); + // init weight matrix + for(const auto& point_A : _bidders) { + std::vector weight_vec; + weight_vec.clear(); + weight_vec.reserve(_bidders.size()); + for(const auto& point_B : _items) { + Real val = pow(dist_lp(point_A, point_B, _internal_p), _wasserstein_power); + weight_vec.push_back( val ); + if ( val > max_val ) + max_val = val; + } + weight_matrix.push_back(weight_vec); + } + fill_in_losses_heap(); + for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { + update_list.push_back(std::make_pair(static_cast(item_idx), 0)); + } + for(auto update_list_iter = update_list.begin(); update_list_iter != update_list.end(); ++update_list_iter) { + items_iterators.push_back(update_list_iter); + } + + size_t handle_idx {0}; + for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { + if (_items[item_idx].is_diagonal() ) { + heap_handles_indices[item_idx] = handle_idx++; + diag_heap_handles.push_back(diag_items_heap.push(std::make_pair(item_idx, 0))); + } + } +} + + +template +void AuctionOracleLazyHeapRestricted::update_queue_for_bidder(IdxType bidder_idx) +{ + assert(0 <= bidder_idx and bidder_idx < static_cast(this->bidders.size())); + assert(bidder_idx < static_cast(bidders_update_moments.size())); + assert(losses_heap[bidder_idx] != nullptr ); + + int bidder_last_update_time = bidders_update_moments[bidder_idx]; + auto iter = update_list.begin(); + while (iter != update_list.end() and iter->second >= bidder_last_update_time) { + IdxType item_idx = iter->first; + size_t handle_idx = items_indices_for_heap_handles[bidder_idx][item_idx]; + if (handle_idx < this->items.size() ) { + IdxValPair new_val { item_idx, weight_matrix[bidder_idx][item_idx] + this->prices[item_idx]}; + // to-do: change indexing of losses_heap_handles + losses_heap[bidder_idx]->decrease(losses_heap_handles[bidder_idx][handle_idx], new_val); + } + iter++; + } + bidders_update_moments[bidder_idx] = update_counter; +} + + +template +void AuctionOracleLazyHeapRestricted::fill_in_losses_heap() +{ + using LossesHeapR = typename ws::LossesHeap; + using LossesHeapRHandleVec = typename std::vector::handle_type>; + + for(size_t bidder_idx = 0; bidder_idx < this->bidders.size(); ++bidder_idx) { + DiagramPoint bidder { this->bidders[bidder_idx] }; + // no heap for diagonal bidders + if ( bidder.is_diagonal() ) { + losses_heap.push_back( nullptr ); + losses_heap_handles.push_back(LossesHeapRHandleVec()); + items_indices_for_heap_handles.push_back( std::vector() ); + continue; + } else { + losses_heap.push_back( new LossesHeapR() ); + + assert( losses_heap.at(bidder_idx) != nullptr ); + + items_indices_for_heap_handles.push_back( std::vector(this->items.size(), k_invalid_index) ); + LossesHeapRHandleVec handles_vec; + losses_heap_handles.push_back(handles_vec); + size_t handle_idx { 0 }; + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + assert( items_indices_for_heap_handles.at(bidder_idx).at(item_idx) > 0 ); + DiagramPoint item { this->items[item_idx] }; + if ( item.is_normal() ) { + // item can be assigned to bidder, store in heap + IdxValPair vp { item_idx, weight_matrix[bidder_idx][item_idx] + this->prices[item_idx] }; + losses_heap_handles[bidder_idx].push_back( losses_heap[bidder_idx]->push(vp) ); + // keep corresponding index in items_indices_for_heap_handles + items_indices_for_heap_handles[bidder_idx][item_idx] = handle_idx++; + } + } + } + } +} + + +template +AuctionOracleLazyHeapRestricted::~AuctionOracleLazyHeapRestricted() +{ + for(auto h : losses_heap) { + delete h; + } +} + + +template +void AuctionOracleLazyHeapRestricted::set_price(IdxType item_idx, Real new_price) +{ + assert( this->prices.at(item_idx) < new_price ); +#ifdef DEBUG_AUCTION + std::cout << "price incremented by " << this->prices.at(item_idx) - new_price << std::endl; +#endif + this->prices[item_idx] = new_price; + if (this->items[item_idx].is_normal() ) { + // lazy: record the moment we updated the price of the items, + // do not update queues. + // 1. move the items with updated price to the front of the update_list, + update_list.splice(update_list.begin(), update_list, items_iterators[item_idx]); + // 2. record the moment we updated the price and increase the counter + update_list.front().second = update_counter++; + } else { + // diagonal items are stored in one heap + diag_items_heap.decrease(diag_heap_handles[heap_handles_indices[item_idx]], std::make_pair(item_idx, new_price)); + best_diagonal_items_computed = false; + } +} + +// subtract min. price from all prices +template +void AuctionOracleLazyHeapRestricted::adjust_prices() +{ +} + + +template +DebugOptimalBid AuctionOracleLazyHeapRestricted::get_optimal_bid_debug(IdxType bidder_idx) +{ + DebugOptimalBid result; + assert(bidder_idx >=0 and bidder_idx < static_cast(this->bidders.size()) ); + + auto bidder = this->bidders[bidder_idx]; + std::vector> cand_items; + // corresponding point is always considered as a candidate + + size_t proj_item_idx = bidder_idx; + assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); + auto proj_item = this->items[proj_item_idx]; + assert(proj_item.type != bidder.type); + //assert(proj_item.proj_id == bidder.id); + //assert(proj_item.id == bidder.proj_id); + // todo: store precomputed distance? + Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); + cand_items.push_back( std::make_pair(proj_item_idx, proj_item_value) ); + + if (bidder.is_normal()) { + assert(losses_heap.at(bidder_idx) != nullptr); + assert(losses_heap[bidder_idx]->size() >= 2); + update_queue_for_bidder(bidder_idx); + auto pHeap = losses_heap[bidder_idx]; + assert( pHeap != nullptr ); + auto top_iter = pHeap->ordered_begin(); + cand_items.push_back( *top_iter ); + ++top_iter; // now points to the second-best items + cand_items.push_back( *top_iter ); + std::sort(cand_items.begin(), cand_items.end(), CompPairsBySecondStruct()); + assert(cand_items[1].second >= cand_items[0].second); + } else { + // for diagonal bidder the only normal point has already been added + // the other 2 candidates are diagonal items only, get from the heap + // with prices + assert(diag_items_heap.size() > 1); + auto top_diag_iter = diag_items_heap.ordered_begin(); + auto topDiag1 = *top_diag_iter++; + auto topDiag2 = *top_diag_iter; + cand_items.push_back(topDiag1); + cand_items.push_back(topDiag2); + std::sort(cand_items.begin(), cand_items.end(), CompPairsBySecondStruct()); + assert(cand_items.size() == 3); + assert(cand_items[2].second >= cand_items[1].second); + assert(cand_items[1].second >= cand_items[0].second); + } + + result.best_item_idx = cand_items[0].first; + result.second_best_item_idx = cand_items[1].first; + result.best_item_value = cand_items[0].second; + result.second_best_item_value = cand_items[1].second; + + // checking code + + //DebugOptimalBid debug_my_result(result); + //DebugOptimalBid debug_naive_result; + //debug_naive_result.best_item_value = 1e20; + //debug_naive_result.second_best_item_value = 1e20; + //Real curr_item_value; + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and + //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) + //continue; + + //curr_item_value = pow(dist_lp(this->bidders[bidder_idx], this->items[item_idx]), wasserstein_power) + this->prices[item_idx]; + //if (curr_item_value < debug_naive_result.best_item_value) { + //debug_naive_result.best_item_value = curr_item_value; + //debug_naive_result.best_item_idx = item_idx; + //} + //} + + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //if (item_idx == debug_naive_result.best_item_idx) { + //continue; + //} + //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and + //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) + //continue; + + //curr_item_value = pow(dist_lp(this->bidders[bidder_idx], this->items[item_idx]), wasserstein_power) + this->prices[item_idx]; + //if (curr_item_value < debug_naive_result.second_best_item_value) { + //debug_naive_result.second_best_item_value = curr_item_value; + //debug_naive_result.second_best_item_idx = item_idx; + //} + //} + + //if ( fabs( debug_my_result.best_item_value - debug_naive_result.best_item_value ) > 1e-6 or + //fabs( debug_naive_result.second_best_item_value - debug_my_result.second_best_item_value) > 1e-6 ) { + //std::cerr << "bidder_idx = " << bidder_idx << "; "; + //std::cerr << this->bidders[bidder_idx] << std::endl; + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //std::cout << item_idx << ": " << this->items[item_idx] << "; price = " << this->prices[item_idx] << std::endl; + //} + //std::cerr << "debug_my_result: " << debug_my_result << std::endl; + //std::cerr << "debug_naive_result: " << debug_naive_result << std::endl; + //auto pHeap = losses_heap[bidder_idx]; + //assert( pHeap != nullptr ); + //for(auto top_iter = pHeap->ordered_begin(); top_iter != pHeap->ordered_end(); ++top_iter) { + //std::cerr << "in heap: " << top_iter->first << ": " << top_iter->second << "; real value = " << dist_lp(bidder, this->items[top_iter->first]) + this->prices[top_iter->first] << std::endl; + //} + //for(auto ci : cand_items) { + //std::cout << "ci.idx = " << ci.first << ", value = " << ci.second << std::endl; + //} + + ////std::cerr << "two_best_items: " << two_best_items[0].d << " " << two_best_items[1].d << std::endl; + //assert(false); + //} + + + //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_item_value = " << best_item_value << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_value = " << second_best_item_value << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; + //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_items_dist= " << (weight_adj_const - best_item_value) << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_dist= " << (weight_adj_const - second_best_item_value) << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; + + return result; +} + + +template +IdxValPair AuctionOracleLazyHeapRestricted::get_optimal_bid(const IdxType bidder_idx) +{ + IdxType best_item_idx; + //IdxType second_best_item_idx; + Real best_item_value; + Real second_best_item_value; + + auto& bidder = this->bidders[bidder_idx]; + IdxType proj_item_idx = bidder_idx; + assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); + auto proj_item = this->items[proj_item_idx]; + assert(proj_item.type != bidder.type); + //assert(proj_item.proj_id == bidder.id); + //assert(proj_item.id == bidder.proj_id); + // todo: store precomputed distance? + Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); + + if (bidder.is_diagonal()) { + // for diagonal bidder the only normal point has already been added + // the other 2 candidates are diagonal items only, get from the heap + // with prices + assert(diag_items_heap.size() > 1); + if (!best_diagonal_items_computed) { + auto top_diag_iter = diag_items_heap.ordered_begin(); + best_diagonal_item_idx = top_diag_iter->first; + best_diagonal_item_value = top_diag_iter->second; + top_diag_iter++; + second_best_diagonal_item_idx = top_diag_iter->first; + second_best_diagonal_item_value = top_diag_iter->second; + best_diagonal_items_computed = true; + } + + if ( proj_item_value < best_diagonal_item_value) { + best_item_idx = proj_item_idx; + best_item_value = proj_item_value; + second_best_item_value = best_diagonal_item_value; + //second_best_item_idx = best_diagonal_item_idx; + } else if (proj_item_value < second_best_diagonal_item_value) { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value; + second_best_item_value = proj_item_value; + //second_best_item_idx = proj_item_idx; + } else { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value; + second_best_item_value = second_best_diagonal_item_value; + //second_best_item_idx = second_best_diagonal_item_idx; + } + } else { + // for normal bidder get 2 best items among non-diagonal (=normal) points + // from the corresponding heap + assert(diag_items_heap.size() > 1); + update_queue_for_bidder(bidder_idx); + auto top_norm_iter = losses_heap[bidder_idx]->ordered_begin(); + IdxType best_normal_item_idx { top_norm_iter->first }; + Real best_normal_item_value { top_norm_iter->second }; + top_norm_iter++; + Real second_best_normal_item_value { top_norm_iter->second }; + //IdxType second_best_normal_item_idx { top_norm_iter->first }; + + if ( proj_item_value < best_normal_item_value) { + best_item_idx = proj_item_idx; + best_item_value = proj_item_value; + second_best_item_value = best_normal_item_value; + //second_best_item_idx = best_normal_item_idx; + } else if (proj_item_value < second_best_normal_item_value) { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = proj_item_value; + //second_best_item_idx = proj_item_idx; + } else { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = second_best_normal_item_value; + //second_best_item_idx = second_best_normal_item_idx; + } + } + + IdxValPair result; + + assert( second_best_item_value >= best_item_value ); + + result.first = best_item_idx; + result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; + + + // checking code + + //DebugOptimalBid debug_my_result; + //debug_my_result.best_item_idx = best_item_idx; + //debug_my_result.best_item_value = best_item_value; + //debug_my_result.second_best_item_idx = second_best_item_idx; + //debug_my_result.second_best_item_value = second_best_item_value; + //DebugOptimalBid debug_naive_result; + //debug_naive_result.best_item_value = 1e20; + //debug_naive_result.second_best_item_value = 1e20; + //Real curr_item_value; + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and + //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) + //continue; + + //curr_item_value = this->get_value_for_bidder(bidder_idx, item_idx); + //if (curr_item_value < debug_naive_result.best_item_value) { + //debug_naive_result.best_item_value = curr_item_value; + //debug_naive_result.best_item_idx = item_idx; + //} + //} + + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //if (item_idx == debug_naive_result.best_item_idx) { + //continue; + //} + //if ( this->bidders[bidder_idx].type != this->items[item_idx].type and + //this->bidders[bidder_idx].proj_id != this->items[item_idx].id) + //continue; + + //curr_item_value = this->get_value_for_bidder(bidder_idx, item_idx); + //if (curr_item_value < debug_naive_result.second_best_item_value) { + //debug_naive_result.second_best_item_value = curr_item_value; + //debug_naive_result.second_best_item_idx = item_idx; + //} + //} + ////std::cout << "got naive result" << std::endl; + + //if ( fabs( debug_my_result.best_item_value - debug_naive_result.best_item_value ) > 1e-6 or + //fabs( debug_naive_result.second_best_item_value - debug_my_result.second_best_item_value) > 1e-6 ) { + //std::cerr << "bidder_idx = " << bidder_idx << "; "; + //std::cerr << this->bidders[bidder_idx] << std::endl; + //for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + //std::cout << item_idx << ": " << this->items[item_idx] << "; price = " << this->prices[item_idx] << std::endl; + //} + //std::cerr << "debug_my_result: " << debug_my_result << std::endl; + //std::cerr << "debug_naive_result: " << debug_naive_result << std::endl; + //auto pHeap = losses_heap[bidder_idx]; + //if ( pHeap != nullptr ) { + //for(auto top_iter = pHeap->ordered_begin(); top_iter != pHeap->ordered_end(); ++top_iter) { + //std::cerr << "in heap: " << top_iter->first << ": " << top_iter->second << "; real value = " << dist_lp(bidder, this->items[top_iter->first]) + this->prices[top_iter->first] << std::endl; + //} + //} + ////for(auto ci : cand_items) { + ////std::cout << "ci.idx = " << ci.first << ", value = " << ci.second << std::endl; + ////} + + ////std::cerr << "two_best_items: " << two_best_items[0].d << " " << two_best_items[1].d << std::endl; + //assert(false); + // } + //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_item_value = " << best_item_value << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_value = " << second_best_item_value << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; + //std::cout << "get_optimal_bid: bidder_idx = " << bidder_idx << "; best_item_idx = " << best_item_idx << "; best_items_dist= " << (weight_adj_const - best_item_value) << "; best_items_price = " << this->prices[best_item_idx] << "; second_best_item_idx = " << top_iter->first << "; second_best_dist= " << (weight_adj_const - second_best_item_value) << "; second_best_price = " << this->prices[top_iter->first] << "; bid = " << this->prices[best_item_idx] + ( best_item_value - second_best_item_value ) + epsilon << "; epsilon = " << epsilon << std::endl; + + return result; +} + +} // end of namespace ws diff --git a/wasserstein/include/auction_oracle_stupid_sparse_restricted.h b/wasserstein/include/auction_oracle_stupid_sparse_restricted.h new file mode 100644 index 0000000..c932396 --- /dev/null +++ b/wasserstein/include/auction_oracle_stupid_sparse_restricted.h @@ -0,0 +1,114 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_ORACLE_STUPID_SPARSE_RESTRICTED_H +#define AUCTION_ORACLE_STUPID_SPARSE_RESTRICTED_H + +#include +#include +#include + +#include "basic_defs_ws.h" +#include "diagonal_heap.h" +#include "auction_oracle_base.h" +#include "dnn/geometry/euclidean-fixed.h" +#include "dnn/local/kd-tree.h" + + +namespace hera { +namespace ws { + +template >> +struct AuctionOracleStupidSparseRestricted : AuctionOracleBase { + + using PointContainer = PointContainer_; + using Real = Real_; + + using LossesHeapR = typename ws::LossesHeapOld; + using LossesHeapRHandle = typename ws::LossesHeapOld::handle_type; + using DiagramPointR = typename ws::DiagramPoint; + using DebugOptimalBidR = typename ws::DebugOptimalBid; + + using DnnPoint = dnn::Point<2, Real>; + using DnnTraits = dnn::PointTraits; + + + AuctionOracleStupidSparseRestricted(const PointContainer& bidders, const PointContainer& items, const AuctionParams& params); + // data members + // temporarily make everything public + std::vector> admissible_items_; + Real max_val_; + LossesHeapR diag_items_heap_; + std::vector diag_heap_handles_; + std::vector heap_handles_indices_; + +// std::vector kdtree_items_; + + std::vector top_diag_indices_; + std::vector top_diag_lookup_; + size_t top_diag_counter_ { 0 }; + bool best_diagonal_items_computed_ { false }; + Real best_diagonal_item_value_; + Real second_best_diagonal_item_idx_ { k_invalid_index }; + Real second_best_diagonal_item_value_ { std::numeric_limits::max() }; + + + // methods + void set_price(const IdxType items_idx, const Real new_price, const bool update_diag = true); + IdxValPair get_optimal_bid(const IdxType bidder_idx); + void adjust_prices(); + void adjust_prices(const Real delta); + + // debug routines + DebugOptimalBidR get_optimal_bid_debug(IdxType bidder_idx) const; + void sanity_check(); + + + // heap top vector + size_t get_heap_top_size() const; + void recompute_top_diag_items(bool hard = false); + void recompute_second_best_diag(); + void reset_top_diag_counter(); + void increment_top_diag_counter(); + void add_top_diag_index(const size_t item_idx); + void remove_top_diag_index(const size_t item_idx); + bool is_in_top_diag_indices(const size_t item_idx) const; + + std::shared_ptr console_logger; + + std::pair get_minmax_price() const; + +}; + +} // ws +} // hera + + +#include "auction_oracle_stupid_sparse_restricted.hpp" + +#endif diff --git a/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp b/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp new file mode 100644 index 0000000..8f4504d --- /dev/null +++ b/wasserstein/include/auction_oracle_stupid_sparse_restricted.hpp @@ -0,0 +1,568 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ +#ifndef AUCTION_ORACLE_STUPID_SPARSE_HPP +#define AUCTION_ORACLE_STUPID_SPARSE_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "basic_defs_ws.h" +#include "auction_oracle_stupid_sparse_restricted.h" + +#ifdef FOR_R_TDA +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + + +// ***************************** +// AuctionOracleStupidSparseRestricted +// ***************************** + + +template +std::ostream& operator<<(std::ostream& output, const AuctionOracleStupidSparseRestricted& oracle) +{ + output << "Oracle " << &oracle << std::endl; + output << fmt::format(" max_val_ = {0}, best_diagonal_items_computed_ = {1}, best_diagonal_item_value_ = {2}, second_best_diagonal_item_idx_ = {3}, second_best_diagonal_item_value_ = {4}\n", + oracle.max_val_, + oracle.best_diagonal_items_computed_, + oracle.best_diagonal_item_value_, + oracle.second_best_diagonal_item_idx_, + oracle.second_best_diagonal_item_value_); + + output << fmt::format(" prices = {0}\n", + format_container_to_log(oracle.prices)); + + output << fmt::format(" diag_items_heap_ = {0}\n", + losses_heap_to_string(oracle.diag_items_heap_)); + + + output << fmt::format(" top_diag_indices_ = {0}\n", + format_container_to_log(oracle.top_diag_indices_)); + + output << fmt::format(" top_diag_counter_ = {0}\n", + oracle.top_diag_counter_); + + output << fmt::format(" top_diag_lookup_ = {0}\n", + format_container_to_log(oracle.top_diag_lookup_)); + + + output << "end of oracle " << &oracle << std::endl; + return output; +} + + +template +AuctionOracleStupidSparseRestricted::AuctionOracleStupidSparseRestricted(const PointContainer_& _bidders, + const PointContainer_& _items, + const AuctionParams& params) : + AuctionOracleBase(_bidders, _items, params), + admissible_items_(_bidders.size(), std::vector()), + heap_handles_indices_(_items.size(), k_invalid_index), + top_diag_lookup_(_items.size(), k_invalid_index) +{ + // initialize admissible edges + std::vector kdtree_items_(_items.size(), k_invalid_index); + std::vector dnn_points_; + std::vector dnn_point_handles_; + size_t dnn_item_idx { 0 }; + size_t true_idx { 0 }; + dnn_points_.reserve(this->items.size()); + // store normal items in kd-tree + for(const auto& g : this->items) { + if (g.is_normal() ) { + kdtree_items_[true_idx] = dnn_item_idx; + // index of items is id of dnn-point + DnnPoint p(true_idx); + p[0] = g.getRealX(); + p[1] = g.getRealY(); + dnn_points_.push_back(p); + assert(dnn_item_idx == dnn_points_.size() - 1); + dnn_item_idx++; + } + true_idx++; + } + assert(dnn_points_.size() < _items.size() ); + for(size_t i = 0; i < dnn_points_.size(); ++i) { + dnn_point_handles_.push_back(&dnn_points_[i]); + } + DnnTraits traits; + traits.internal_p = params.internal_p; + dnn::KDTree kdtree_(traits, dnn_point_handles_, params.wasserstein_power); + + // loop over normal bidders, find nearest neighbours + size_t bidder_idx = 0; + for(const auto& b : this->bidders) { + if (b.is_normal()) { + admissible_items_[bidder_idx].reserve(k_max_nn); + DnnPoint bidder_dnn; + bidder_dnn[0] = b.getRealX(); + bidder_dnn[1] = b.getRealY(); + auto nearest_neighbours = kdtree_.findK(bidder_dnn, k_max_nn); + assert(nearest_neighbours.size() == k_max_nn); + for(const auto& x : nearest_neighbours) { + admissible_items_[bidder_idx].push_back(x.p->id()); + } + } + bidder_idx++; + } + + size_t handle_idx {0}; + for(size_t item_idx = 0; item_idx < _items.size(); ++item_idx) { + if (this->items[item_idx].is_diagonal()) { + heap_handles_indices_[item_idx] = handle_idx++; + diag_heap_handles_.push_back(diag_items_heap_.push(std::make_pair(item_idx, 0.0))); + } + } + max_val_ = 3*getFurthestDistance3Approx<>(_bidders, _items, params.internal_p); + max_val_ = std::pow(max_val_, params.wasserstein_power); + + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); + console_logger->info("Stupid sparse oracle ctor done, k = {0}", k_max_nn); +} + + +template +bool AuctionOracleStupidSparseRestricted::is_in_top_diag_indices(const size_t item_idx) const +{ + return top_diag_lookup_[item_idx] != k_invalid_index; +} + + +template +void AuctionOracleStupidSparseRestricted::add_top_diag_index(const size_t item_idx) +{ + assert(find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx) == top_diag_indices_.end()); + assert(this->items[item_idx].is_diagonal()); + + top_diag_indices_.push_back(item_idx); + top_diag_lookup_[item_idx] = top_diag_indices_.size() - 1; +} + +template +void AuctionOracleStupidSparseRestricted::remove_top_diag_index(const size_t item_idx) +{ + if (top_diag_indices_.size() > 1) { + // remove item_idx from top_diag_indices after swapping + // it with the last element, update index lookup appropriately + auto old_index = top_diag_lookup_[item_idx]; + auto end_element = top_diag_indices_.back(); + std::swap(top_diag_indices_[old_index], top_diag_indices_.back()); + top_diag_lookup_[end_element] = old_index; + } + + top_diag_indices_.pop_back(); + top_diag_lookup_[item_idx] = k_invalid_index; + if (top_diag_indices_.size() < 2) { + recompute_second_best_diag(); + } + best_diagonal_items_computed_ = not top_diag_indices_.empty(); + reset_top_diag_counter(); +} + + +template +void AuctionOracleStupidSparseRestricted::increment_top_diag_counter() +{ + assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); + + ++top_diag_counter_; + if (top_diag_counter_ >= top_diag_indices_.size()) { + top_diag_counter_ -= top_diag_indices_.size(); + } + + assert(top_diag_counter_ >= 0 and top_diag_counter_ < top_diag_indices_.size()); +} + + +template +void AuctionOracleStupidSparseRestricted::reset_top_diag_counter() +{ + top_diag_counter_ = 0; +} + +template +void AuctionOracleStupidSparseRestricted::recompute_top_diag_items(bool hard) +{ + console_logger->debug("Enter recompute_top_diag_items, hard = {0}", hard); + assert(hard or top_diag_indices_.empty()); + + if (hard) { + std::fill(top_diag_lookup_.begin(), top_diag_lookup_.end(), k_invalid_index); + top_diag_indices_.clear(); + } + + auto top_diag_iter = diag_items_heap_.ordered_begin(); + best_diagonal_item_value_ = top_diag_iter->second; + add_top_diag_index(top_diag_iter->first); + + ++top_diag_iter; + + // traverse the heap while we see the same value + while(top_diag_iter != diag_items_heap_.ordered_end()) { + if ( top_diag_iter->second != best_diagonal_item_value_) { + break; + } else { + add_top_diag_index(top_diag_iter->first); + } + ++top_diag_iter; + } + + recompute_second_best_diag(); + + best_diagonal_items_computed_ = true; + reset_top_diag_counter(); + console_logger->debug("Exit recompute_top_diag_items, hard = {0}", hard); +} + +template +typename AuctionOracleStupidSparseRestricted::DebugOptimalBidR +AuctionOracleStupidSparseRestricted::get_optimal_bid_debug(IdxType bidder_idx) const +{ + DebugOptimalBidR result; + throw std::runtime_error("Not implemented"); + return result; +} + + +template +IdxValPair AuctionOracleStupidSparseRestricted::get_optimal_bid(IdxType bidder_idx) +{ + auto bidder = this->bidders[bidder_idx]; + + // corresponding point is always considered as a candidate + // if bidder is a diagonal point, proj_item is a normal point, + // and vice versa. + + size_t best_item_idx { k_invalid_index }; + size_t second_best_item_idx { k_invalid_index }; + size_t best_diagonal_item_idx { k_invalid_index }; + Real best_item_value; + Real second_best_item_value; + + + size_t proj_item_idx = bidder_idx; + assert( 0 <= proj_item_idx and proj_item_idx < this->items.size() ); + assert(this->items[proj_item_idx].type != bidder.type); + Real proj_item_value = this->get_value_for_bidder(bidder_idx, proj_item_idx); + + if (bidder.is_diagonal()) { + // for diagonal bidder the only normal point has already been added + // the other 2 candidates are diagonal items only, get from the heap + // with prices + + if (not best_diagonal_items_computed_) { + recompute_top_diag_items(); + } + + best_diagonal_item_idx = top_diag_indices_[top_diag_counter_]; + increment_top_diag_counter(); + + if ( proj_item_value < best_diagonal_item_value_) { + best_item_idx = proj_item_idx; + best_item_value = proj_item_value; + second_best_item_value = best_diagonal_item_value_; + second_best_item_idx = best_diagonal_item_idx; + } else if (proj_item_value < second_best_diagonal_item_value_) { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value_; + second_best_item_value = proj_item_value; + second_best_item_idx = proj_item_idx; + } else { + best_item_idx = best_diagonal_item_idx; + best_item_value = best_diagonal_item_value_; + second_best_item_value = second_best_diagonal_item_value_; + second_best_item_idx = second_best_diagonal_item_idx_; + } + } else { + + size_t best_normal_item_idx { k_invalid_index }; + size_t second_best_normal_item_idx { k_invalid_index }; + Real best_normal_item_value { std::numeric_limits::max() }; + Real second_best_normal_item_value { std::numeric_limits::max() }; + + // find best item + for(const auto curr_item_idx : admissible_items_[bidder_idx]) { + auto curr_item_value = this->get_value_for_bidder(bidder_idx, curr_item_idx); + if (curr_item_value < best_normal_item_value) { + best_normal_item_idx = curr_item_idx; + best_normal_item_value = curr_item_value; + } + } + + // find second-best item + for(const auto curr_item_idx : admissible_items_[bidder_idx]) { + if (curr_item_idx == best_normal_item_idx) { + continue; + } + auto curr_item_value = this->get_value_for_bidder(bidder_idx, curr_item_idx); + if (curr_item_value < second_best_normal_item_value) { + second_best_normal_item_idx = curr_item_idx; + second_best_normal_item_value = curr_item_value; + } + } + + if ( proj_item_value < best_normal_item_value) { + best_item_idx = proj_item_idx; + increment_top_diag_counter(); + best_item_value = proj_item_value; + second_best_item_value = best_normal_item_value; + } else if (proj_item_value < second_best_normal_item_value) { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = proj_item_value; + } else { + best_item_idx = best_normal_item_idx; + best_item_value = best_normal_item_value; + second_best_item_value = second_best_normal_item_value; + } + } + + IdxValPair result; + + assert( second_best_item_value >= best_item_value ); + + result.first = best_item_idx; + result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon; + + return result; +} + +template +void AuctionOracleStupidSparseRestricted::recompute_second_best_diag() +{ + + console_logger->debug("Enter recompute_second_best_diag"); + + if (top_diag_indices_.size() > 1) { + second_best_diagonal_item_value_ = best_diagonal_item_value_; + second_best_diagonal_item_idx_ = top_diag_indices_[0]; + } else { + if (diag_items_heap_.size() == 1) { + second_best_diagonal_item_value_ == std::numeric_limits::max(); + second_best_diagonal_item_idx_ = k_invalid_index; + } else { + auto diag_iter = diag_items_heap_.ordered_begin(); + ++diag_iter; + second_best_diagonal_item_value_ = diag_iter->second; + second_best_diagonal_item_idx_ = diag_iter->first; + } + } + + console_logger->debug("Exit recompute_second_best_diag, second_best_diagonal_item_value_ = {0}, second_best_diagonal_item_idx_ = {1}", second_best_diagonal_item_value_, second_best_diagonal_item_idx_); +} + + +template +void AuctionOracleStupidSparseRestricted::set_price(IdxType item_idx, + Real new_price, + const bool update_diag) +{ + + console_logger->debug("Enter set_price, item_idx = {0}, new_price = {1}, old price = {2}, update_diag = {3}", item_idx, new_price, this->prices[item_idx], update_diag); + + assert(this->prices.size() == this->items.size()); + assert( 0 < diag_heap_handles_.size() and diag_heap_handles_.size() <= this->items.size()); + // adjust_prices decreases prices, + // also this variable must be true in reverse phases of FR-auction + bool item_goes_down = new_price > this->prices[item_idx]; + + this->prices[item_idx] = new_price; + if ( this->items[item_idx].is_diagonal() ) { + assert(diag_heap_handles_.size() > heap_handles_indices_.at(item_idx)); + if (item_goes_down) { + diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } else { + diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } + if (update_diag) { + // Update top_diag_indices_ only if necessary: + // normal bidders take their projections, which might not be on top + // also, set_price is called by adjust_prices, and we may have already + // removed the item from top_diag + if (is_in_top_diag_indices(item_idx)) { + remove_top_diag_index(item_idx); + } + + if (item_idx == second_best_diagonal_item_idx_) { + recompute_second_best_diag(); + } + } + } + + console_logger->debug("Exit set_price, item_idx = {0}, new_price = {1}", item_idx, new_price); +} + + +template +void AuctionOracleStupidSparseRestricted::adjust_prices(Real delta) +{ + //console_logger->debug("Enter adjust_prices, delta = {0}", delta); + //std::cerr << *this << std::endl; + + if (delta == 0.0) + return; + + for(auto& p : this->prices) { + p -= delta; + } + + bool price_goes_up = delta < 0; + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + if (this->items[item_idx].is_diagonal()) { + auto new_price = this->prices[item_idx]; + if (price_goes_up) { + diag_items_heap_.decrease(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } else { + diag_items_heap_.increase(diag_heap_handles_[heap_handles_indices_[item_idx]], std::make_pair(item_idx, new_price)); + } + } + } + best_diagonal_item_value_ -= delta; + second_best_diagonal_item_value_ -= delta; + + //std::cerr << *this << std::endl; + //console_logger->debug("Exit adjust_prices, delta = {0}", delta); +} + +template +void AuctionOracleStupidSparseRestricted::adjust_prices() +{ + auto pr_begin = this->prices.begin(); + auto pr_end = this->prices.end(); + Real min_price = *(std::min_element(pr_begin, pr_end)); + adjust_prices(min_price); +} + +template +size_t AuctionOracleStupidSparseRestricted::get_heap_top_size() const +{ + return top_diag_indices_.size(); +} + +template +std::pair AuctionOracleStupidSparseRestricted::get_minmax_price() const +{ + auto r = std::minmax_element(this->prices.begin(), this->prices.end()); + return std::make_pair(*r.first, *r.second); +} + +template +void AuctionOracleStupidSparseRestricted::sanity_check() +{ +#ifdef DEBUG_STUPID_SPARSE_RESTR_ORACLE + + assert(admissible_items_.size() == this->bidders.size()); + + for(size_t bidder_idx = 0; bidder_idx < this->bidders.size(); ++bidder_idx) { + if (this->bidders[bidder_idx].is_normal()) { + assert(admissible_items_[bidder_idx].size() == k_max_nn); + } else { + assert(admissible_items_[bidder_idx].size() == 0); + } + } + + if (best_diagonal_items_computed_) { + std::vector diag_items_price_vec; + diag_items_price_vec.reserve(this->items.size()); + + for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) { + if (this->items.at(item_idx).is_diagonal()) { + diag_items_price_vec.push_back(this->prices.at(item_idx)); + } else { + diag_items_price_vec.push_back(std::numeric_limits::max()); + } + } + + auto best_iter = std::min_element(diag_items_price_vec.begin(), diag_items_price_vec.end()); + assert(best_iter != diag_items_price_vec.end()); + Real true_best_diag_value = *best_iter; + size_t true_best_diag_idx = best_iter - diag_items_price_vec.begin(); + assert(true_best_diag_value != std::numeric_limits::max()); + + Real true_second_best_diag_value = std::numeric_limits::max(); + size_t true_second_best_diag_idx = k_invalid_index; + for(size_t item_idx = 0; item_idx < diag_items_price_vec.size(); ++item_idx) { + if (this->items.at(item_idx).is_normal()) { + assert(top_diag_lookup_.at(item_idx) == k_invalid_index); + continue; + } + + auto i_iter = std::find(top_diag_indices_.begin(), top_diag_indices_.end(), item_idx); + if (diag_items_price_vec.at(item_idx) == true_best_diag_value) { + assert(i_iter != top_diag_indices_.end()); + assert(top_diag_lookup_.at(item_idx) == i_iter - top_diag_indices_.begin()); + } else { + assert(top_diag_lookup_.at(item_idx) == k_invalid_index); + assert(i_iter == top_diag_indices_.end()); + } + + if (item_idx == true_best_diag_idx) { + continue; + } + if (diag_items_price_vec.at(item_idx) < true_second_best_diag_value) { + true_second_best_diag_value = diag_items_price_vec.at(item_idx); + true_second_best_diag_idx = item_idx; + } + } + + if (true_best_diag_value != best_diagonal_item_value_) { + console_logger->debug("best_diagonal_item_value_ = {0}, true value = {1}", best_diagonal_item_value_, true_best_diag_value); + std::cerr << *this; + //console_logger->debug("{0}", *this); + } + + assert(true_best_diag_value == best_diagonal_item_value_); + + assert(true_second_best_diag_idx != k_invalid_index); + + if (true_second_best_diag_value != second_best_diagonal_item_value_) { + console_logger->debug("second_best_diagonal_item_value_ = {0}, true value = {1}", second_best_diagonal_item_value_, true_second_best_diag_value); + //console_logger->debug("{0}", *this); + } + + assert(true_second_best_diag_value == second_best_diagonal_item_value_); + } +#endif +} + + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/auction_runner_fr.h b/wasserstein/include/auction_runner_fr.h new file mode 100644 index 0000000..1abca20 --- /dev/null +++ b/wasserstein/include/auction_runner_fr.h @@ -0,0 +1,289 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_RUNNER_FR_H +#define AUCTION_RUNNER_FR_H + +#define ORDERED_BY_PERSISTENCE + +#include + +#include "auction_oracle.h" + +namespace hera { +namespace ws { + +// the two parameters that you can tweak in auction algorithm are: +// 1. epsilon_common_ratio +// 2. max_num_phases + +template> // alternatively: AuctionOracleLazyHeap --- TODO +class AuctionRunnerFR { +public: + + using Real = RealType_; + using AuctionOracle = AuctionOracle_; + using DgmPoint = DiagramPoint; + using DgmPointVec = std::vector; + using IdxValPairR = IdxValPair; + + const Real k_lowest_bid_value = -(std::numeric_limits::max() - 1); // all bid values must be positive + + + AuctionRunnerFR(const std::vector& A, + const std::vector& B, + const Real q, + const Real _delta, + const Real _internal_p, + const Real _initial_epsilon = 0.0, + const Real _eps_factor = 5.0, + const int _max_num_phases = std::numeric_limits::max(), + const Real _gamma_threshold = 0.0, + const size_t _max_bids_per_round = std::numeric_limits::max(), + const std::string& _log_filename_prefix = ""); + + void set_epsilon(Real new_val); + Real get_epsilon() const { return epsilon; } + void run_auction(); + Real get_wasserstein_distance(); + Real get_wasserstein_cost(); + Real get_relative_error(const bool debug_output = false) const; + bool phase_can_be_final() const; +private: + // private data + std::vector bidders, items; + const size_t num_bidders; + const size_t num_items; + std::vector items_to_bidders; + std::vector bidders_to_items; + Real wasserstein_power; + Real epsilon; + Real delta; + Real internal_p; + Real initial_epsilon; + const Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio + Real cumulative_epsilon_factor { 1.0 }; + const int max_num_phases; // maximal number of phases of epsilon-scaling + bool is_forward { true }; // to use in distributed version only + Real weight_adj_const; + Real wasserstein_cost; + std::vector forward_bid_table; + std::vector reverse_bid_table; + // to get the 2 best items + AuctionOracle forward_oracle; + AuctionOracle reverse_oracle; + std::unordered_set unassigned_bidders; + std::unordered_set unassigned_items; + std::unordered_set items_with_bids; + std::unordered_set bidders_with_bids; + +#ifdef ORDERED_BY_PERSISTENCE + // to process unassigned by persistence + size_t batch_size; + using RealIdxPair = std::pair; + std::set> unassigned_bidders_by_persistence; + std::set> unassigned_items_by_persistence; +#endif + + + // to imitate Gauss-Seidel + const size_t max_bids_per_round; + + // to stop earlier in the last phase + const Real total_items_persistence; + const Real total_bidders_persistence; + Real partial_cost; + Real unassigned_bidders_persistence; + Real unassigned_items_persistence; + Real gamma_threshold; + size_t unassigned_threshold; + + bool is_distance_computed { false }; + int num_rounds { 0 }; + int num_rounds_non_cumulative { 0 }; + int num_phase { 0 }; + + + size_t num_diag_items { 0 }; + size_t num_normal_items { 0 }; + size_t num_diag_bidders { 0 }; + size_t num_normal_bidders { 0 }; + + + + // private methods + void assign_forward(const IdxType item_idx, const IdxType bidder_idx); + void assign_reverse(const IdxType item_idx, const IdxType bidder_idx); + void assign_to_best_bidder(const IdxType item_idx); + void assign_to_best_item(const IdxType bidder_idx); + void clear_forward_bid_table(); + void clear_reverse_bid_table(); + void assign_diag_to_diag(); + void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); + void run_auction_phase(); + void run_forward_auction_phase(); + void run_reverse_auction_phase(); + void submit_forward_bid(IdxType bidder_idx, const IdxValPairR& bid); + void submit_reverse_bid(IdxType item_idx, const IdxValPairR& bid); + void flush_assignment(); + Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const; + Real get_cost_to_diagonal(const DgmPoint& pt) const; + Real get_gamma() const; + + template + void run_forward_bidding_step(const Range& r); + + template + void run_reverse_bidding_step(const Range& r); + + void add_unassigned_bidder(const size_t bidder_idx); + void add_unassigned_item(const size_t item_idx); + void remove_unassigned_bidder(const size_t bidder_idx); + void remove_unassigned_item(const size_t item_idx); + + bool is_item_diagonal(const size_t item_idx) const { return item_idx < num_diag_items; } + bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } + bool is_bidder_diagonal(const size_t bidder_idx) const { return bidder_idx >= num_normal_bidders; } + bool is_bidder_normal(const size_t bidder_idx) const { return not is_bidder_diagonal(bidder_idx); } + + size_t num_forward_bids_submitted { 0 }; + size_t num_reverse_bids_submitted { 0 }; + + void decrease_epsilon(); + // stopping criteria + bool continue_forward(const size_t, const size_t); + bool continue_reverse(const size_t, const size_t); + bool continue_phase(); + + + + // for debug only + void sanity_check(); + void check_epsilon_css(); + void print_debug(); + void print_matching(); + + std::string log_filename_prefix; + const Real k_max_relative_error = 2.0; // if relative error cannot be estimated or is too large, use this value + void reset_round_stat(); // empty, if logging is disable + void reset_phase_stat(); + + std::unordered_set never_assigned_bidders; + std::unordered_set never_assigned_items; + + std::shared_ptr console_logger; +#ifdef LOG_AUCTION + std::unordered_set unassigned_normal_bidders; + std::unordered_set unassigned_diag_bidders; + + std::unordered_set unassigned_normal_items; + std::unordered_set unassigned_diag_items; + + + size_t all_assigned_round { 0 }; + size_t all_assigned_round_found { false }; + + int num_forward_rounds_non_cumulative { 0 }; + int num_forward_rounds { 0 }; + + int num_reverse_rounds_non_cumulative { 0 }; + int num_reverse_rounds { 0 }; + + // all per-round vars are non-cumulative + + // forward rounds + int num_normal_forward_bids_submitted { 0 }; + int num_diag_forward_bids_submitted { 0 }; + + int num_forward_diag_to_diag_assignments { 0 }; + int num_forward_diag_to_normal_assignments { 0 }; + int num_forward_normal_to_diag_assignments { 0 }; + int num_forward_normal_to_normal_assignments { 0 }; + + int num_forward_diag_from_diag_thefts { 0 }; + int num_forward_diag_from_normal_thefts { 0 }; + int num_forward_normal_from_diag_thefts { 0 }; + int num_forward_normal_from_normal_thefts { 0 }; + + // reverse rounds + int num_normal_reverse_bids_submitted { 0 }; + int num_diag_reverse_bids_submitted { 0 }; + + int num_reverse_diag_to_diag_assignments { 0 }; + int num_reverse_diag_to_normal_assignments { 0 }; + int num_reverse_normal_to_diag_assignments { 0 }; + int num_reverse_normal_to_normal_assignments { 0 }; + + int num_reverse_diag_from_diag_thefts { 0 }; + int num_reverse_diag_from_normal_thefts { 0 }; + int num_reverse_normal_from_diag_thefts { 0 }; + int num_reverse_normal_from_normal_thefts { 0 }; + + // price change statistics + std::vector> forward_price_change_cnt_vec; + std::vector> reverse_price_change_cnt_vec; + + const char* forward_plot_logger_name = "forward_plot_logger"; + const char* reverse_plot_logger_name = "reverse_plot_logger"; + const char* forward_price_stat_logger_name = "forward_price_stat_logger"; + const char* reverse_price_stat_logger_name = "reverse_price_stat_logger"; + + std::string forward_plot_logger_file_name; + std::string reverse_plot_logger_file_name; + std::string forward_price_stat_logger_file_name; + std::string reverse_price_stat_logger_file_name; + + std::shared_ptr forward_plot_logger; + std::shared_ptr reverse_plot_logger; + std::shared_ptr forward_price_stat_logger; + std::shared_ptr reverse_price_stat_logger; + + + size_t parallel_threshold = 5000; + int num_parallelizable_rounds { 0 }; + int num_parallelizable_forward_rounds { 0 }; + int num_parallelizable_reverse_rounds { 0 }; + + int num_parallel_bids { 0 }; + int num_total_bids { 0 }; + + int num_parallel_assignments { 0 }; + int num_total_assignments { 0 }; +#endif + +}; + + + +} // ws +} // hera + +#include "auction_runner_fr.hpp" + +#undef ORDERED_BY_PERSISTENCE +#endif diff --git a/wasserstein/include/auction_runner_fr.hpp b/wasserstein/include/auction_runner_fr.hpp new file mode 100644 index 0000000..07c1459 --- /dev/null +++ b/wasserstein/include/auction_runner_fr.hpp @@ -0,0 +1,1440 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_RUNNER_FR_HPP +#define AUCTION_RUNNER_FR_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" + +#include "auction_runner_fr.h" + +#ifdef FOR_R_TDA +#include "Rcpp.h" +#undef DEBUG_FR_AUCTION +#endif + + +namespace hera { +namespace ws { + + +// ***************************** +// AuctionRunnerFR +// ***************************** + +template +AuctionRunnerFR::AuctionRunnerFR(const std::vector& A, + const std::vector& B, + const Real q, + const Real _delta, + const Real _internal_p, + const Real _initial_epsilon, + const Real _eps_factor, + const int _max_num_phases, + const Real _gamma_threshold, + const size_t _max_bids_per_round, + const std::string& _log_filename_prefix + ) : + bidders(A), + items(B), + num_bidders(A.size()), + num_items(A.size()), + items_to_bidders(A.size(), k_invalid_index), + bidders_to_items(A.size(), k_invalid_index), + wasserstein_power(q), + delta(_delta), + internal_p(_internal_p), + initial_epsilon(_initial_epsilon), + epsilon_common_ratio(_eps_factor == 0.0 ? 5.0 : _eps_factor), + max_num_phases(_max_num_phases), + forward_bid_table(A.size(), std::make_pair(k_invalid_index, k_lowest_bid_value) ), + reverse_bid_table(B.size(), std::make_pair(k_invalid_index, k_lowest_bid_value) ), + forward_oracle(bidders, items, q, _internal_p), + reverse_oracle(items, bidders, q, _internal_p), + max_bids_per_round(_max_bids_per_round), + total_items_persistence(std::accumulate(items.begin(), + items.end(), + R(0.0), + [_internal_p, q](const Real& ps, const DgmPoint& item) + { return ps + std::pow(item.persistence_lp(_internal_p), q); } + )), + total_bidders_persistence(std::accumulate(bidders.begin(), + bidders.end(), + R(0.0), + [_internal_p, q](const Real& ps, const DgmPoint& bidder) + { return ps + std::pow(bidder.persistence_lp(_internal_p), q); } + )), + partial_cost(0.0), + unassigned_bidders_persistence(total_bidders_persistence), + unassigned_items_persistence(total_items_persistence), + gamma_threshold(_gamma_threshold), + log_filename_prefix(_log_filename_prefix) +{ + assert(A.size() == B.size()); + for(const auto& p : bidders) { + if (p.is_normal()) { + num_normal_bidders++; + num_diag_items++; + } else { + num_normal_items++; + num_diag_bidders++; + } + } + +#ifdef ORDERED_BY_PERSISTENCE + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_bidders_by_persistence.insert(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); + } + + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + unassigned_items_by_persistence.insert(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); + } +#endif + + // for experiments + unassigned_threshold = bidders.size() / 200; + unassigned_threshold = 0; + +#ifdef ORDERED_BY_PERSISTENCE + batch_size = 5000; +#endif + + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); + console_logger->info("Forward-reverse runnder, max_num_phases = {0}, max_bids_per_round = {1}, gamma_threshold = {2}, unassigned_threshold = {3}", + max_num_phases, + max_bids_per_round, + gamma_threshold, + unassigned_threshold); + + +// check_epsilon_css(); +#ifdef LOG_AUCTION + parallel_threshold = bidders.size() / 100; + forward_plot_logger_file_name = log_filename_prefix + "_forward_plot.txt"; + forward_plot_logger = spdlog::get(forward_plot_logger_name); + if (not forward_plot_logger) { + forward_plot_logger = spdlog::basic_logger_st(forward_plot_logger_name, forward_plot_logger_file_name); + } + forward_plot_logger->info("New forward plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + forward_plot_logger->set_pattern("%v"); + + reverse_plot_logger_file_name = log_filename_prefix + "_reverse_plot.txt"; + reverse_plot_logger = spdlog::get(reverse_plot_logger_name); + if (not reverse_plot_logger) { + reverse_plot_logger = spdlog::basic_logger_st(reverse_plot_logger_name, reverse_plot_logger_file_name); + } + reverse_plot_logger->info("New reverse plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + reverse_plot_logger->set_pattern("%v"); + + + + forward_price_stat_logger_file_name = log_filename_prefix + "_forward_price_change_stat"; + forward_price_stat_logger = spdlog::get(forward_price_stat_logger_name); + if (not forward_price_stat_logger) { + forward_price_stat_logger = spdlog::basic_logger_st(forward_price_stat_logger_name, + forward_price_stat_logger_file_name); + } + forward_price_stat_logger->info("New forward price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + forward_price_stat_logger->set_pattern("%v"); + + reverse_price_stat_logger_file_name = log_filename_prefix + "_reverse_price_change_stat"; + reverse_price_stat_logger = spdlog::get(reverse_price_stat_logger_name); + if (not reverse_price_stat_logger) { + reverse_price_stat_logger = spdlog::basic_logger_st(reverse_price_stat_logger_name, + reverse_price_stat_logger_file_name); + } + reverse_price_stat_logger->info("New reverse price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + reverse_price_stat_logger->set_pattern("%v"); +#endif +} + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_cost_to_diagonal(const DgmPoint& pt) const +{ + if (1.0 == wasserstein_power) { + return pt.persistence_lp(internal_p); + } else { + return std::pow(pt.persistence_lp(internal_p), wasserstein_power); + } +} + + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_gamma() const +{ + if (1.0 == wasserstein_power) { + return unassigned_items_persistence + unassigned_bidders_persistence; + } else { + return std::pow(unassigned_items_persistence + unassigned_bidders_persistence, + 1.0 / wasserstein_power); + } +} + +template +void AuctionRunnerFR::reset_phase_stat() +{ + num_rounds_non_cumulative = 0; +#ifdef LOG_AUCTION + num_parallelizable_rounds = 0; + num_parallelizable_forward_rounds = 0; + num_parallelizable_reverse_rounds = 0; + num_forward_rounds_non_cumulative = 0; + num_reverse_rounds_non_cumulative = 0; +#endif +} + + +template +void AuctionRunnerFR::reset_round_stat() +{ + num_forward_bids_submitted = 0; + num_reverse_bids_submitted = 0; +#ifdef LOG_AUCTION + num_normal_forward_bids_submitted = 0; + num_diag_forward_bids_submitted = 0; + + num_forward_diag_to_diag_assignments = 0; + num_forward_diag_to_normal_assignments = 0; + num_forward_normal_to_diag_assignments = 0; + num_forward_normal_to_normal_assignments = 0; + + num_forward_diag_from_diag_thefts = 0; + num_forward_diag_from_normal_thefts = 0; + num_forward_normal_from_diag_thefts = 0; + num_forward_normal_from_normal_thefts = 0; + + // reverse rounds + num_normal_reverse_bids_submitted = 0; + num_diag_reverse_bids_submitted = 0; + + num_reverse_diag_to_diag_assignments = 0; + num_reverse_diag_to_normal_assignments = 0; + num_reverse_normal_to_diag_assignments = 0; + num_reverse_normal_to_normal_assignments = 0; + + num_reverse_diag_from_diag_thefts = 0; + num_reverse_diag_from_normal_thefts = 0; + num_reverse_normal_from_diag_thefts = 0; + num_reverse_normal_from_normal_thefts = 0; +#endif +} + + +template +void AuctionRunnerFR::assign_forward(IdxType item_idx, IdxType bidder_idx) +{ + console_logger->debug("Enter assign_forward, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); + sanity_check(); + // only unassigned bidders submit bids + assert(bidders_to_items[bidder_idx] == k_invalid_index); + + IdxType old_item_owner = items_to_bidders[item_idx]; + + // set new owner + bidders_to_items[bidder_idx] = item_idx; + items_to_bidders[item_idx] = bidder_idx; + + // remove bidder and item from the sets of unassigned bidders/items + remove_unassigned_bidder(bidder_idx); + + if (k_invalid_index != old_item_owner) { + // old owner of item becomes unassigned + bidders_to_items[old_item_owner] = k_invalid_index; + add_unassigned_bidder(old_item_owner); + // existing edge was removed, decrease partial_cost + partial_cost -= get_item_bidder_cost(item_idx, old_item_owner); + } else { + // item was unassigned before + remove_unassigned_item(item_idx); + } + + // new edge was added to matching, increase partial cost + partial_cost += get_item_bidder_cost(item_idx, bidder_idx); + +#ifdef LOG_AUCTION + + if (unassigned_bidders.size() > parallel_threshold) { + num_parallel_assignments++; + } + num_total_assignments++; + + + int it_d = is_item_diagonal(item_idx); + int b_d = is_bidder_diagonal(bidder_idx); + // 2 - None + int old_d = ( k_invalid_index == old_item_owner ) ? 2 : is_bidder_diagonal(old_item_owner); + int key = 100 * old_d + 10 * b_d + it_d; + switch(key) { + case 211 : num_forward_diag_to_diag_assignments++; + break; + case 210 : num_forward_diag_to_normal_assignments++; + break; + case 201 : num_forward_normal_to_diag_assignments++; + break; + case 200 : num_forward_normal_to_normal_assignments++; + break; + + case 111 : num_forward_diag_to_diag_assignments++; + num_forward_diag_from_diag_thefts++; + break; + case 110 : num_forward_diag_to_normal_assignments++; + num_forward_diag_from_diag_thefts++; + break; + break; + case 101 : num_forward_normal_to_diag_assignments++; + num_forward_normal_from_diag_thefts++; + break; + break; + case 100 : num_forward_normal_to_normal_assignments++; + num_forward_normal_from_diag_thefts++; + break; + + case 11 : num_forward_diag_to_diag_assignments++; + num_forward_diag_from_normal_thefts++; + break; + case 10 : num_forward_diag_to_normal_assignments++; + num_forward_diag_from_normal_thefts++; + break; + break; + case 1 : num_forward_normal_to_diag_assignments++; + num_forward_normal_from_normal_thefts++; + break; + break; + case 0 : num_forward_normal_to_normal_assignments++; + num_forward_normal_from_normal_thefts++; + break; + default : std::cerr << "key = " << key << std::endl; + throw std::runtime_error("Bug in logging, wrong key"); + break; + } +#endif + + sanity_check(); + console_logger->debug("Exit assign_forward, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); +} + + +template +void AuctionRunnerFR::assign_reverse(IdxType item_idx, IdxType bidder_idx) +{ + console_logger->debug("Enter assign_reverse, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); + // only unassigned items submit bids in reverse phase + assert(items_to_bidders[item_idx] == k_invalid_index); + + IdxType old_bidder_owner = bidders_to_items[bidder_idx]; + + // set new owner + bidders_to_items[bidder_idx] = item_idx; + items_to_bidders[item_idx] = bidder_idx; + + // remove bidder and item from the sets of unassigned bidders/items + remove_unassigned_item(item_idx); + + if (k_invalid_index != old_bidder_owner) { + // old owner of item becomes unassigned + items_to_bidders[old_bidder_owner] = k_invalid_index; + add_unassigned_item(old_bidder_owner); + // existing edge was removed, decrease partial_cost + partial_cost -= get_item_bidder_cost(old_bidder_owner, bidder_idx); + } else { + // item was unassigned before + remove_unassigned_bidder(bidder_idx); + } + + // new edge was added to matching, increase partial cost + partial_cost += get_item_bidder_cost(item_idx, bidder_idx); + +#ifdef LOG_AUCTION + if (unassigned_items.size() > parallel_threshold) { + num_parallel_assignments++; + } + num_total_assignments++; + + int it_d = is_item_diagonal(item_idx); + int b_d = is_bidder_diagonal(bidder_idx); + // 2 - None + int old_d = (k_invalid_index == old_bidder_owner) ? 2 : is_item_diagonal(old_bidder_owner); + int key = 100 * old_d + 10 * it_d + b_d; + switch(key) { + case 211 : num_reverse_diag_to_diag_assignments++; + break; + case 210 : num_reverse_diag_to_normal_assignments++; + break; + case 201 : num_reverse_normal_to_diag_assignments++; + break; + case 200 : num_reverse_normal_to_normal_assignments++; + break; + + case 111 : num_reverse_diag_to_diag_assignments++; + num_reverse_diag_from_diag_thefts++; + break; + case 110 : num_reverse_diag_to_normal_assignments++; + num_reverse_diag_from_diag_thefts++; + break; + break; + case 101 : num_reverse_normal_to_diag_assignments++; + num_reverse_normal_from_diag_thefts++; + break; + break; + case 100 : num_reverse_normal_to_normal_assignments++; + num_reverse_normal_from_diag_thefts++; + break; + + case 11 : num_reverse_diag_to_diag_assignments++; + num_reverse_diag_from_normal_thefts++; + break; + case 10 : num_reverse_diag_to_normal_assignments++; + num_reverse_diag_from_normal_thefts++; + break; + break; + case 1 : num_reverse_normal_to_diag_assignments++; + num_reverse_normal_from_normal_thefts++; + break; + break; + case 0 : num_reverse_normal_to_normal_assignments++; + num_reverse_normal_from_normal_thefts++; + break; + default : std::cerr << "key = " << key << std::endl; + throw std::runtime_error("Bug in logging, wrong key"); + break; + } + +#endif + console_logger->debug("Exit assign_reverse, item_idx = {0}, bidder_idx = {1}", item_idx, bidder_idx); +} + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const +{ + if (wasserstein_power == 1.0) { + return dist_lp(bidders[bidder_idx], items[item_idx], internal_p); + } else { + return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p), + wasserstein_power); + } +} + +template +void AuctionRunnerFR::assign_to_best_bidder(IdxType item_idx) +{ + console_logger->debug("Enter assign_to_best_bidder, item_idx = {0}", item_idx); + assert( item_idx >= 0 and item_idx < static_cast(num_items) ); + assert( forward_bid_table[item_idx].first != k_invalid_index); + + auto best_bidder_idx = forward_bid_table[item_idx].first; + auto best_bid_value = forward_bid_table[item_idx].second; + assign_forward(item_idx, best_bidder_idx); + forward_oracle.sanity_check(); + forward_oracle.set_price(item_idx, best_bid_value, true); + forward_oracle.sanity_check(); + auto new_bidder_price = -get_item_bidder_cost(item_idx, best_bidder_idx) - best_bid_value; + reverse_oracle.set_price(best_bidder_idx, new_bidder_price, false); + check_epsilon_css(); +#ifdef LOG_AUCTION + forward_price_change_cnt_vec.back()[item_idx]++; + reverse_price_change_cnt_vec.back()[best_bidder_idx]++; +#endif + console_logger->debug("Exit assign_to_best_bidder, item_idx = {0}", item_idx); +} + +template +void AuctionRunnerFR::assign_to_best_item(IdxType bidder_idx) +{ + console_logger->debug("Enter assign_to_best_item, bidder_idx = {0}", bidder_idx); + check_epsilon_css(); + assert( bidder_idx >= 0 and bidder_idx < static_cast(num_bidders) ); + assert( reverse_bid_table[bidder_idx].first != k_invalid_index); + auto best_item_idx = reverse_bid_table[bidder_idx].first; + auto best_bid_value = reverse_bid_table[bidder_idx].second; + // both assign_forward and assign_reverse take item index first, bidder index second! + assign_reverse(best_item_idx, bidder_idx); + reverse_oracle.sanity_check(); + reverse_oracle.set_price(bidder_idx, best_bid_value, true); + reverse_oracle.sanity_check(); + auto new_item_price = -get_item_bidder_cost(best_item_idx, bidder_idx) - best_bid_value; + forward_oracle.set_price(best_item_idx, new_item_price, false); +#ifdef LOG_AUCTION + forward_price_change_cnt_vec.back()[best_item_idx]++; + reverse_price_change_cnt_vec.back()[bidder_idx]++; +#endif + check_epsilon_css(); + console_logger->debug("Exit assign_to_best_item, bidder_idx = {0}", bidder_idx); +} + +template +void AuctionRunnerFR::clear_forward_bid_table() +{ + auto item_iter = items_with_bids.begin(); + while(item_iter != items_with_bids.end()) { + auto item_with_bid_idx = *item_iter; + forward_bid_table[item_with_bid_idx].first = k_invalid_index; + forward_bid_table[item_with_bid_idx].second = k_lowest_bid_value; + item_iter = items_with_bids.erase(item_iter); + } +} + +template +void AuctionRunnerFR::clear_reverse_bid_table() +{ + auto bidder_iter = bidders_with_bids.begin(); + while(bidder_iter != bidders_with_bids.end()) { + auto bidder_with_bid_idx = *bidder_iter; + reverse_bid_table[bidder_with_bid_idx].first = k_invalid_index; + reverse_bid_table[bidder_with_bid_idx].second = k_lowest_bid_value; + bidder_iter = bidders_with_bids.erase(bidder_iter); + } +} + +template +void AuctionRunnerFR::submit_forward_bid(IdxType bidder_idx, const IdxValPairR& bid) +{ + IdxType best_item_idx = bid.first; + Real bid_value = bid.second; + assert( best_item_idx >= 0 ); + + auto value_in_bid_table = forward_bid_table[best_item_idx].second; + bool new_bid_wins = (value_in_bid_table < bid_value); + // if we have tie, lower persistence wins +// if (value_in_bid_table == bid_value) { +// +// assert(forward_bid_table.at(best_item_idx).first != k_invalid_index); +// assert(&bidders.at(forward_bid_table.at(best_item_idx).first)); +// +// auto bidder_in_bid_table = bidders[forward_bid_table[best_item_idx].first]; +// new_bid_wins = bidders[best_item_idx].persistence_lp(internal_p) < bidder_in_bid_table.persistence_lp(internal_p); +// } + + if (new_bid_wins) { + forward_bid_table[best_item_idx].first = bidder_idx; + forward_bid_table[best_item_idx].second = bid_value; + } + + items_with_bids.insert(best_item_idx); + +#ifdef LOG_AUCTION + + if (unassigned_bidders.size() > parallel_threshold) { + num_parallel_bids++; + } + num_total_bids++; + + + if (is_bidder_diagonal(bidder_idx)) { + num_diag_forward_bids_submitted++; + } else { + num_normal_forward_bids_submitted++; + } +#endif +} + +template +void AuctionRunnerFR::submit_reverse_bid(IdxType item_idx, const IdxValPairR& bid) +{ + assert( items.at(item_idx).is_diagonal() or items.at(item_idx).is_normal() ); + IdxType best_bidder_idx = bid.first; + assert( bidders.at(best_bidder_idx).is_diagonal() or bidders.at(best_bidder_idx).is_normal() ); + Real bid_value = bid.second; + assert(bid_value > k_lowest_bid_value); + auto value_in_bid_table = reverse_bid_table[best_bidder_idx].second; + bool new_bid_wins = (value_in_bid_table < bid_value); + // if we have tie, lower persistence wins +// if (value_in_bid_table == bid_value) { +// assert(reverse_bid_table[best_bidder_idx].first != k_invalid_index); +// auto bidder_in_bid_table = bidders[reverse_bid_table[best_bidder_idx].first]; +// new_bid_wins = bidders[best_bidder_idx].persistence_lp(internal_p) < bidder_in_bid_table.persistence_lp(internal_p); +// } + if (new_bid_wins) { + reverse_bid_table[best_bidder_idx].first = item_idx; + reverse_bid_table[best_bidder_idx].second = bid_value; + } + bidders_with_bids.insert(best_bidder_idx); + +#ifdef LOG_AUCTION + + if (unassigned_items.size() > parallel_threshold) { + num_parallel_bids++; + } + num_total_bids++; + + if (is_item_diagonal(item_idx)) { + num_diag_reverse_bids_submitted++; + } else { + num_normal_reverse_bids_submitted++; + } +#endif +} + + +template +void AuctionRunnerFR::print_debug() +{ +#ifdef DEBUG_FR_AUCTION + std::cout << "**********************" << std::endl; + std::cout << "Current assignment:" << std::endl; + for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { + std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; + } + std::cout << "Weights: " << std::endl; + //for(size_t i = 0; i < num_bidders; ++i) { + //for(size_t j = 0; j < num_items; ++j) { + //std::cout << oracle.weight_matrix[i][j] << " "; + //} + //std::cout << std::endl; + //} + std::cout << "Bidder prices: " << std::endl; + for(const auto price : forward_oracle.get_prices()) { + std::cout << price << std::endl; + } + std::cout << "**********************" << std::endl; +#endif +} + + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_relative_error(const bool debug_output) const +{ + Real result; + Real gamma = get_gamma(); + // cost minus n epsilon + Real reduced_cost = partial_cost - num_bidders * get_epsilon(); + if ( reduced_cost < 0) { +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->debug("Epsilon too large, reduced_cost = {0}", reduced_cost); + } +#endif + result = k_max_relative_error; + } else { + Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power) - gamma; + if (denominator <= 0) { +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->debug("Epsilon too large, reduced_cost = {0}, denominator = {1}, gamma = {2}", reduced_cost, denominator, gamma); + } +#endif + result = k_max_relative_error; + } else { + Real numerator = 2 * gamma + + std::pow(partial_cost, 1.0 / wasserstein_power) - + std::pow(reduced_cost, 1.0 / wasserstein_power); + + result = numerator / denominator; +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->debug("Reduced_cost = {0}, denominator = {1}, numerator {2}, error = {3}, gamma = {4}", + reduced_cost, + denominator, + numerator, + result, + gamma); + } +#endif + } + } + return result; +} + +template +void AuctionRunnerFR::flush_assignment() +{ + console_logger->debug("Enter flush_assignment"); + for(auto& b2i : bidders_to_items) { + b2i = k_invalid_index; + } + for(auto& i2b : items_to_bidders) { + i2b = k_invalid_index; + } + + // all bidders and items become unassigned + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_bidders.insert(bidder_idx); + } + + // all items and items become unassigned + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + unassigned_items.insert(item_idx); + } + + + //forward_oracle.adjust_prices(); + //reverse_oracle.adjust_prices(); + + partial_cost = 0.0; + unassigned_bidders_persistence = total_bidders_persistence; + unassigned_items_persistence = total_items_persistence; + +#ifdef ORDERED_BY_PERSISTENCE + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_bidders_by_persistence.insert(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); + } + + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + unassigned_items_by_persistence.insert(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); + } +#endif + +#ifdef LOG_AUCTION + + reset_phase_stat(); + + forward_price_change_cnt_vec.push_back(std::vector(num_items, 0)); + reverse_price_change_cnt_vec.push_back(std::vector(num_bidders, 0)); + + // all bidders and items become unassigned + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders.insert(bidder_idx); + } else { + unassigned_diag_bidders.insert(bidder_idx); + } + } + + never_assigned_bidders = unassigned_bidders; + + for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { + if (is_item_normal(item_idx)) { + unassigned_normal_items.insert(item_idx); + } else { + unassigned_diag_items.insert(item_idx); + } + } + + never_assigned_items = unassigned_items; +#endif + check_epsilon_css(); + console_logger->debug("Exit flush_assignment"); +} + +template +void AuctionRunnerFR::set_epsilon(Real new_val) +{ + assert(new_val > 0.0); + epsilon = new_val; + forward_oracle.set_epsilon(new_val); + reverse_oracle.set_epsilon(new_val); +} + + +template +bool AuctionRunnerFR::continue_forward(const size_t original_unassigned_bidders, const size_t min_forward_matching_increment) +{ +// if (unassigned_threshold == 0) { +// return not unassigned_bidders.empty() and get_relative_error(false) > delta; +// } + //return unassigned_bidders.size() > unassigned_threshold and + //static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment); + return unassigned_bidders.size() > unassigned_threshold and + static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment) and + get_relative_error() >= delta; +// return not unassigned_bidders.empty() and +// static_cast(unassigned_bidders.size()) >= static_cast(original_unassigned_bidders) - static_cast(min_forward_matching_increment) and +// get_relative_error() >= delta; +} + + +template +bool AuctionRunnerFR::continue_reverse(const size_t original_unassigned_items, const size_t min_reverse_matching_increment) +{ + //return unassigned_items.size() > unassigned_threshold and + //static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment); + return unassigned_items.size() > unassigned_threshold and + static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment) and + get_relative_error() >= delta; +// return not unassigned_items.empty() and +// static_cast(unassigned_items.size()) >= static_cast(original_unassigned_items) - static_cast(min_reverse_matching_increment) and +// get_relative_error() >= delta; +} + + +template +bool AuctionRunnerFR::continue_phase() +{ + //return not unassigned_bidders.empty(); + return unassigned_bidders.size() > unassigned_threshold and get_relative_error() >= delta; +// return not never_assigned_bidders.empty() or +// not never_assigned_items.empty() or +// unassigned_bidders.size() > unassigned_threshold and get_relative_error() >= delta; +} + + + +template +void AuctionRunnerFR::run_auction_phase() +{ + num_phase++; + while(continue_phase()) { + forward_oracle.recompute_top_diag_items(true); + forward_oracle.sanity_check(); + console_logger->debug("forward_oracle recompute_top_diag_items done"); + run_forward_auction_phase(); + reverse_oracle.recompute_top_diag_items(true); + console_logger->debug("reverse_oracle recompute_top_diag_items done"); + reverse_oracle.sanity_check(); + run_reverse_auction_phase(); + } +} + +template +void AuctionRunnerFR::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) +{ + set_epsilon(_initial_epsilon); + assert( forward_oracle.get_epsilon() > 0 ); + assert( reverse_oracle.get_epsilon() > 0 ); + for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { + flush_assignment(); + console_logger->info("Phase {0} started: eps = {1}", + num_phase, + get_epsilon()); + + run_auction_phase(); + Real current_result = partial_cost; +#ifdef LOG_AUCTION + console_logger->info("Phase {0} done: current_result = {1}, eps = {2}, unassigned_threshold = {3}, unassigned = {4}, error = {5}, gamma = {6}", + num_phase, + partial_cost, + get_epsilon(), + format_int<>(unassigned_threshold), + unassigned_bidders.size(), + get_relative_error(false), + get_gamma()); + + console_logger->info("Phase {0} done: num_rounds / num_parallelizable_rounds = {1} / {2} = {3}, cumulative rounds = {4}", + num_phase, + format_int(num_rounds_non_cumulative), + format_int(num_parallelizable_rounds), + static_cast(num_parallelizable_rounds) / static_cast(num_rounds_non_cumulative), + format_int(num_rounds) + ); + + console_logger->info("parallelizable_forward_rounds / num_forward_rounds = {0} / {1} = {2}", + format_int<>(num_parallelizable_forward_rounds), + format_int<>(num_forward_rounds_non_cumulative), + static_cast(num_parallelizable_forward_rounds) / static_cast(num_forward_rounds_non_cumulative) + ); + + num_parallelizable_forward_rounds = 0; + num_forward_rounds_non_cumulative = 0; + + console_logger->info("parallelizable_reverse_rounds / num_reverse_rounds = {0} / {1} = {2}", + format_int<>(num_parallelizable_reverse_rounds), + format_int<>(num_reverse_rounds_non_cumulative), + static_cast(num_parallelizable_reverse_rounds) / static_cast(num_reverse_rounds_non_cumulative) + ); + + num_parallelizable_reverse_rounds = 0; + num_reverse_rounds_non_cumulative = 0; + + console_logger->info("num_parallel_bids / num_total_bids = {0} / {1} = {2}, num_parallel_assignments / num_total_assignments = {3} / {4} = {5}", + format_int<>(num_parallel_bids), + format_int<>(num_total_bids), + static_cast(num_parallel_bids) / static_cast(num_total_bids), + format_int<>(num_parallel_assignments), + format_int<>(num_total_assignments), + static_cast(num_parallel_assignments) / static_cast(num_total_assignments) + ); + + auto forward_min_max_price = forward_oracle.get_minmax_price(); + auto reverse_min_max_price = reverse_oracle.get_minmax_price(); + + console_logger->info("forward min price = {0}, max price = {1}; reverse min price = {2}, reverse max price = {3}", + forward_min_max_price.first, + forward_min_max_price.second, + reverse_min_max_price.first, + reverse_min_max_price.second + ); + + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + forward_price_stat_logger->info("{0} {1} {2} {3} {4}", + phase_num, + item_idx, + items[item_idx].getRealX(), + items[item_idx].getRealY(), + forward_price_change_cnt_vec.back()[item_idx] + ); + } + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + reverse_price_stat_logger->info("{0} {1} {2} {3} {4}", + phase_num, + bidder_idx, + bidders[bidder_idx].getRealX(), + bidders[bidder_idx].getRealY(), + reverse_price_change_cnt_vec.back()[bidder_idx] + ); + } +#endif + + if (get_relative_error(true) <= delta) { + break; + } + // decrease epsilon for the next iteration + decrease_epsilon(); + + unassigned_threshold = std::floor( static_cast(unassigned_threshold) / 1.1 ); + + if (phase_can_be_final()) { + unassigned_threshold = 0; +#ifdef LOG_AUCTION + console_logger->info("Unassigned threshold set to zero!"); +#endif + } + } +} + +template +bool AuctionRunnerFR::phase_can_be_final() const +{ + Real estimated_error; + // cost minus n epsilon + Real reduced_cost = partial_cost - num_bidders * get_epsilon(); + if (reduced_cost <= 0.0) { + return false; + } else { + Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power); + if (denominator <= 0) { + return false; + } else { + Real numerator = std::pow(partial_cost, 1.0 / wasserstein_power) - + std::pow(reduced_cost, 1.0 / wasserstein_power); + + estimated_error = numerator / denominator; + return estimated_error <= delta; + } + } +} + +template +void AuctionRunnerFR::run_auction() +{ + double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : std::min(forward_oracle.max_val_, reverse_oracle.max_val_) / 4.0 ; + assert(init_eps > 0.0); + run_auction_phases(max_num_phases, init_eps); + is_distance_computed = true; + wasserstein_cost = partial_cost; + if (get_relative_error() > delta) { +#ifndef FOR_R_TDA + std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; + std::cerr << get_wasserstein_distance() << std::endl; +#endif + throw std::runtime_error("Maximum iteration number exceeded"); + } +} + +template +void AuctionRunnerFR::add_unassigned_bidder(const size_t bidder_idx) +{ + const DgmPoint& bidder = bidders[bidder_idx]; + unassigned_bidders.insert(bidder_idx); + unassigned_bidders_persistence += get_cost_to_diagonal(bidder); + +#ifdef ORDERED_BY_PERSISTENCE + unassigned_bidders_by_persistence.insert(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); +#endif + +#ifdef LOG_AUCTION + if (is_bidder_diagonal(bidder_idx)) { + unassigned_diag_bidders.insert(bidder_idx); + } else { + unassigned_normal_bidders.insert(bidder_idx); + } +#endif +} + +template +void AuctionRunnerFR::add_unassigned_item(const size_t item_idx) +{ + const DgmPoint& item = items[item_idx]; + unassigned_items.insert(item_idx); + unassigned_items_persistence += get_cost_to_diagonal(item); + +#ifdef ORDERED_BY_PERSISTENCE + unassigned_items_by_persistence.insert(std::make_pair(item.persistence_lp(1.0), item_idx)); +#endif + +#ifdef LOG_AUCTION + if (is_item_diagonal(item_idx)) { + unassigned_diag_items.insert(item_idx); + } else { + unassigned_normal_items.insert(item_idx); + } +#endif +} + + +template +void AuctionRunnerFR::remove_unassigned_bidder(const size_t bidder_idx) +{ + unassigned_bidders_persistence -= get_cost_to_diagonal(bidders[bidder_idx]); + + unassigned_bidders.erase(bidder_idx); + never_assigned_bidders.erase(bidder_idx); + +#ifdef ORDERED_BY_PERSISTENCE + unassigned_bidders_by_persistence.erase(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); +#endif + +#ifdef LOG_AUCTION + if (is_bidder_diagonal(bidder_idx)) { + unassigned_diag_bidders.erase(bidder_idx); + } else { + unassigned_normal_bidders.erase(bidder_idx); + } + if (never_assigned_bidders.empty() and not all_assigned_round_found) { + all_assigned_round = num_rounds_non_cumulative; + all_assigned_round_found = true; + } +#endif +} + +template +void AuctionRunnerFR::remove_unassigned_item(const size_t item_idx) +{ + console_logger->debug("Enter remove_unassigned_item, unassigned_items.size = {0}", unassigned_items.size()); + unassigned_items_persistence -= get_cost_to_diagonal(items[item_idx]); + + never_assigned_items.erase(item_idx); + unassigned_items.erase(item_idx); + +#ifdef ORDERED_BY_PERSISTENCE + unassigned_items_by_persistence.erase(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)); +#endif + +#ifdef LOG_AUCTION + if (is_item_normal(item_idx)) { + unassigned_normal_items.erase(item_idx); + } else { + unassigned_diag_items.erase(item_idx); + } + if (never_assigned_items.empty() and not all_assigned_round_found) { + all_assigned_round = num_rounds_non_cumulative; + all_assigned_round_found = true; + } +#endif + console_logger->debug("Exit remove_unassigned_item, unassigned_items.size = {0}", unassigned_items.size()); +} + +template +void AuctionRunnerFR::decrease_epsilon() +{ + auto eps_diff = 1.01 * get_epsilon() * (epsilon_common_ratio - 1.0 ) / epsilon_common_ratio; + reverse_oracle.adjust_prices( -eps_diff ); + set_epsilon( get_epsilon() / epsilon_common_ratio ); + cumulative_epsilon_factor *= epsilon_common_ratio; +} + + + +template +void AuctionRunnerFR::run_reverse_auction_phase() +{ + console_logger->debug("Enter run_reverse_auction_phase"); + size_t original_unassigned_items = unassigned_items.size(); +// const size_t min_reverse_matching_increment = std::max( static_cast(1), static_cast(original_unassigned_items / 10)); + size_t min_reverse_matching_increment = 1; + + while (continue_reverse(original_unassigned_items, min_reverse_matching_increment)) { + num_rounds++; + num_rounds_non_cumulative++; + console_logger->debug("started round = {0}, reverse, unassigned = {1}", num_rounds, unassigned_items.size()); + + check_epsilon_css(); +#ifdef LOG_AUCTION + if (unassigned_items.size() >= parallel_threshold) { + ++num_parallelizable_reverse_rounds; + ++num_parallelizable_rounds; + } + num_reverse_rounds++; + num_reverse_rounds_non_cumulative++; +#endif + + reset_round_stat(); + // bidding +#ifdef ORDERED_BY_PERSISTENCE + std::vector active_items; + active_items.reserve(batch_size); + for(auto iter = unassigned_items_by_persistence.begin(); + iter != unassigned_items_by_persistence.end(); ++iter) { + active_items.push_back(iter->second); + if (active_items.size() >= batch_size) { + break; + } + } + run_reverse_bidding_step(active_items); +#else + //if (not never_assigned_items.empty()) + //run_reverse_bidding_step(never_assigned_items); + //else + //run_reverse_bidding_step(unassigned_items); + run_reverse_bidding_step(unassigned_items); +#endif + + // assignment phase + for(auto bidder_idx : bidders_with_bids ) { + assign_to_best_item(bidder_idx); + } + + check_epsilon_css(); + + console_logger->debug("ended round = {0}, reverse, unassigned = {1}", num_rounds, unassigned_items.size()); + +#ifdef LOG_AUCTION + + reverse_plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22}", + num_phase, + num_rounds, + num_reverse_rounds, + unassigned_bidders.size(), + get_gamma(), + partial_cost, + reverse_oracle.get_epsilon(), + num_normal_reverse_bids_submitted, + num_diag_reverse_bids_submitted, + num_reverse_diag_to_diag_assignments, + num_reverse_diag_to_normal_assignments, + num_reverse_normal_to_diag_assignments, + num_reverse_normal_to_normal_assignments, + num_reverse_diag_from_diag_thefts, + num_reverse_diag_from_normal_thefts, + num_reverse_normal_from_diag_thefts, + num_reverse_normal_from_normal_thefts, + unassigned_normal_bidders.size(), + unassigned_diag_bidders.size(), + unassigned_normal_items.size(), + unassigned_diag_items.size(), + reverse_oracle.get_heap_top_size(), + get_relative_error(false) + ); + sanity_check(); +#endif + } +} + +template +template +void AuctionRunnerFR::run_forward_bidding_step(const Range& active_bidders) +{ + clear_forward_bid_table(); + for(const auto bidder_idx : active_bidders) { + console_logger->debug("current bidder (forward): {0}, persistence = {1}", bidders[bidder_idx], bidders[bidder_idx].persistence_lp(1.0)); + submit_forward_bid(bidder_idx, forward_oracle.get_optimal_bid(bidder_idx)); + if (++num_forward_bids_submitted >= max_bids_per_round) { + break; + } + } +} + +template +template +void AuctionRunnerFR::run_reverse_bidding_step(const Range& active_items) +{ + clear_reverse_bid_table(); + + assert(bidders_with_bids.empty()); + assert(std::all_of(reverse_bid_table.begin(), reverse_bid_table.end(), + [ki = k_invalid_index, kl = k_lowest_bid_value](const IdxValPairR& b) { return static_cast(b.first) == ki and b.second == kl; })); + + for(const auto item_idx : active_items) { + console_logger->debug("current bidder (reverse): {0}, persistence = {1}", items[item_idx], items[item_idx].persistence_lp(1.0)); + submit_reverse_bid(item_idx, reverse_oracle.get_optimal_bid(item_idx)); + if (++num_reverse_bids_submitted >= max_bids_per_round) { + break; + } + } +} + + +template +void AuctionRunnerFR::run_forward_auction_phase() +{ + const size_t original_unassigned_bidders = unassigned_bidders.size(); +// const size_t min_forward_matching_increment = std::max( static_cast(1), static_cast(original_unassigned_bidders / 10)); + const size_t min_forward_matching_increment = 1; + while (continue_forward(original_unassigned_bidders, min_forward_matching_increment)) { + console_logger->debug("started round = {0}, forward, unassigned = {1}", num_rounds, unassigned_bidders.size()); + check_epsilon_css(); + num_rounds++; +#ifdef LOG_AUCTION + if (unassigned_bidders.size() >= parallel_threshold) { + ++num_parallelizable_forward_rounds; + ++num_parallelizable_rounds; + } + num_forward_rounds++; + num_forward_rounds_non_cumulative++; +#endif + + reset_round_stat(); + // bidding step +#ifdef ORDERED_BY_PERSISTENCE + std::vector active_bidders; + active_bidders.reserve(batch_size); + for(auto iter = unassigned_bidders_by_persistence.begin(); + iter != unassigned_bidders_by_persistence.end(); ++iter) { + active_bidders.push_back(iter->second); + if (active_bidders.size() >= batch_size) { + break; + } + } + run_forward_bidding_step(active_bidders); +#else + + //if (not never_assigned_bidders.empty()) + //run_forward_bidding_step(never_assigned_bidders); + //else + //run_forward_bidding_step(unassigned_bidders); + run_forward_bidding_step(unassigned_bidders); +#endif + + // assignment step + for(auto item_idx : items_with_bids ) { + assign_to_best_bidder(item_idx); + } + + console_logger->debug("ended round = {0}, forward, unassigned = {1}", num_rounds, unassigned_bidders.size()); + check_epsilon_css(); + +#ifdef LOG_AUCTION + forward_plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22}", + num_phase, + num_rounds, + num_forward_rounds, + unassigned_bidders.size(), + get_gamma(), + partial_cost, + forward_oracle.get_epsilon(), + num_normal_forward_bids_submitted, + num_diag_forward_bids_submitted, + num_forward_diag_to_diag_assignments, + num_forward_diag_to_normal_assignments, + num_forward_normal_to_diag_assignments, + num_forward_normal_to_normal_assignments, + num_forward_diag_from_diag_thefts, + num_forward_diag_from_normal_thefts, + num_forward_normal_from_diag_thefts, + num_forward_normal_from_normal_thefts, + unassigned_normal_bidders.size(), + unassigned_diag_bidders.size(), + unassigned_normal_items.size(), + unassigned_diag_items.size(), + forward_oracle.get_heap_top_size(), + get_relative_error(false) + ); +#endif + } ; + +} +template +void AuctionRunnerFR::assign_diag_to_diag() +{ + size_t n_diag_to_diag = std::min(num_diag_bidders, num_diag_items); + if (n_diag_to_diag < 2) + return; + for(size_t i = 0; i < n_diag_to_diag; ++i) { + } +} + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_wasserstein_distance() +{ + assert(is_distance_computed); + return std::pow(wasserstein_cost, 1.0 / wasserstein_power); +} + +template +typename AuctionRunnerFR::Real +AuctionRunnerFR::get_wasserstein_cost() +{ + assert(is_distance_computed); + return wasserstein_cost; +} + + + +template +void AuctionRunnerFR::sanity_check() +{ +#ifdef DEBUG_FR_AUCTION + assert(partial_cost >= 0); + + + assert(num_diag_items == num_normal_bidders); + assert(num_diag_bidders == num_normal_items); + assert(num_diag_bidders + num_normal_bidders == num_bidders); + assert(num_diag_items + num_normal_items == num_items); + assert(num_items == num_bidders); + + + for(size_t b = 0; b < num_bidders; ++b) { + assert( is_bidder_diagonal(b) == bidders.at(b).is_diagonal() ); + assert( is_bidder_normal(b) == bidders.at(b).is_normal() ); + } + + for(size_t i = 0; i < num_items; ++i) { + assert( is_item_diagonal(i) == items.at(i).is_diagonal() ); + assert( is_item_normal(i) == items.at(i).is_normal() ); + } + + // check matching consistency + assert(bidders_to_items.size() == num_bidders); + assert(items_to_bidders.size() == num_bidders); + + assert(std::count(bidders_to_items.begin(), bidders_to_items.end(), k_invalid_index) == std::count(items_to_bidders.begin(), items_to_bidders.end(), k_invalid_index)); + + Real true_partial_cost = 0.0; + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (bidders_to_items[bidder_idx] != k_invalid_index) { + assert(items_to_bidders.at(bidders_to_items[bidder_idx]) == static_cast(bidder_idx)); + true_partial_cost += get_item_bidder_cost(bidders_to_items[bidder_idx], bidder_idx); + } + } + + assert(fabs(partial_cost - true_partial_cost) < 0.00001); + + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + if (items_to_bidders[item_idx] != k_invalid_index) { + assert(bidders_to_items.at(items_to_bidders[item_idx]) == static_cast(item_idx)); + } + } + +#ifdef ORDERED_BY_PERSISTENCE + assert(unassigned_bidders.size() == unassigned_bidders_by_persistence.size()); + if (unassigned_items.size() != unassigned_items_by_persistence.size()) { + console_logger->error("unassigned_items.size() = {0}, unassigned_items_by_persistence.size() = {1}", unassigned_items.size(),unassigned_items_by_persistence.size()); + console_logger->error("unassigned_items = {0}, unassigned_items_by_persistence = {1}", format_container_to_log(unassigned_items),format_pair_container_to_log(unassigned_items_by_persistence)); + } + assert(unassigned_items.size() == unassigned_items_by_persistence.size()); + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (bidders_to_items[bidder_idx] == k_invalid_index) { + assert(unassigned_bidders.count(bidder_idx) == 1); + assert(unassigned_bidders_by_persistence.count(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)) == 1); + } else { + assert(unassigned_bidders.count(bidder_idx) == 0); + assert(unassigned_bidders_by_persistence.count(std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)) == 0); + } + } + + for(size_t item_idx = 0; item_idx < num_items; ++item_idx) { + if (items_to_bidders[item_idx] == k_invalid_index) { + assert(unassigned_items.count(item_idx) == 1); + assert(unassigned_items_by_persistence.count(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)) == 1); + } else { + assert(unassigned_items.count(item_idx) == 0); + assert(unassigned_items_by_persistence.count(std::make_pair(items[item_idx].persistence_lp(1.0), item_idx)) == 0); + } + } +#endif + + +#endif +} + +template +void AuctionRunnerFR::check_epsilon_css() +{ +#ifdef DEBUG_FR_AUCTION + sanity_check(); + + std::vector b_prices = reverse_oracle.get_prices(); + std::vector i_prices = forward_oracle.get_prices(); + double eps = forward_oracle.get_epsilon(); + + for(size_t b = 0; b < num_bidders; ++b) { + for(size_t i = 0; i < num_items; ++i) { + if(((is_bidder_normal(b) and is_item_diagonal(i)) or (is_bidder_diagonal(b) and is_item_normal(i))) and b != i) + continue; + if (b_prices[b] + i_prices[i] + eps < -get_item_bidder_cost(i, b) - 0.000001) { + console_logger->debug("b = {0}, i = {1}, eps = {2}, b_price = {3}, i_price[i] = {4}, cost = {5}, b_price + i_price + eps = {6}", + b, + i, + eps, + b_prices[b], + i_prices[i], + get_item_bidder_cost(i, b), + b_prices[b] + i_prices[i] + eps + ); + } + assert(b_prices[b] + i_prices[i] + eps >= -get_item_bidder_cost(i, b) - 0.000001); + } + } + + for(size_t b = 0; b < num_bidders; ++b) { + auto i = bidders_to_items[b]; + if (i != k_invalid_index) { + assert( fabs(b_prices[b] + i_prices[i] + get_item_bidder_cost(i, b)) < 0.000001 ); + } + } +#endif +} + +template +void AuctionRunnerFR::print_matching() +{ +#ifdef DEBUG_FR_AUCTION + sanity_check(); + for(size_t bidder_idx = 0; bidder_idx < bidders_to_items.size(); ++bidder_idx) { + if (bidders_to_items[bidder_idx] >= 0) { + auto pA = bidders[bidder_idx]; + auto pB = items[bidders_to_items[bidder_idx]]; + std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p), wasserstein_power) << std::endl; + } else { + assert(false); + } + } +#endif +} + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/auction_runner_gs.h b/wasserstein/include/auction_runner_gs.h new file mode 100644 index 0000000..f8b5a8b --- /dev/null +++ b/wasserstein/include/auction_runner_gs.h @@ -0,0 +1,123 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_RUNNER_GS_H +#define AUCTION_RUNNER_GS_H + +#include +#include + +#include "spdlog/spdlog.h" +#include "auction_oracle.h" + +namespace hera { +namespace ws { + +template, class PointContainer_ = std::vector> > // alternatively: AuctionOracleLazyHeap --- TODO +class AuctionRunnerGS { +public: + using Real = RealType_; + using AuctionOracle = AuctionOracle_; + using DgmPoint = typename AuctionOracle::DiagramPointR; + using IdxValPairR = IdxValPair; + using PointContainer = PointContainer_; + + + AuctionRunnerGS(const PointContainer& A, + const PointContainer& B, + const AuctionParams& params, + const std::string& _log_filename_prefix = ""); + + void set_epsilon(Real new_val) { assert(epsilon > 0.0); epsilon = new_val; }; + Real get_epsilon() const { return oracle.get_epsilon(); } + Real get_wasserstein_cost(); + Real get_wasserstein_distance(); + Real get_relative_error() const { return relative_error; }; + void enable_logging(const char* log_filename, const size_t _max_unassigned_to_log); +//private: + // private data + PointContainer bidders, items; + const size_t num_bidders; + const size_t num_items; + std::vector items_to_bidders; + std::vector bidders_to_items; + Real wasserstein_power; + Real epsilon; + Real delta; + Real internal_p; + Real initial_epsilon; + Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio + const int max_num_phases; // maximal number of iterations of epsilon-scaling + bool tolerate_max_iter_exceeded; + Real weight_adj_const; + Real wasserstein_cost; + Real relative_error; + int dimension; + // to get the 2 best items + AuctionOracle oracle; + std::unordered_set unassigned_bidders; + // private methods + void assign_item_to_bidder(const IdxType bidder_idx, const IdxType items_idx); + void run_auction(); + void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); + void run_auction_phase(); + void flush_assignment(); + // return 0, if item_idx is invalid + Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx = false) const; + + // for debug only + void sanity_check(); + void print_debug(); + int count_unhappy(); + void print_matching(); + Real getDistanceToQthPowerInternal(); + int num_phase { 0 }; + int num_rounds { 0 }; + bool is_distance_computed {false}; +#ifdef LOG_AUCTION + bool log_auction { false }; + std::shared_ptr console_logger; + std::shared_ptr plot_logger; + std::unordered_set unassigned_items; + size_t max_unassigned_to_log { 0 }; + const char* logger_name = "auction_detailed_logger"; // the name in spdlog registry; filename is provided as parameter in enable_logging + const Real total_items_persistence; + const Real total_bidders_persistence; + Real partial_cost; + Real unassigned_bidders_persistence; + Real unassigned_items_persistence; +#endif +}; + +} // ws +} // hera + + +#include "auction_runner_gs.hpp" + +#endif diff --git a/wasserstein/include/auction_runner_gs.hpp b/wasserstein/include/auction_runner_gs.hpp new file mode 100644 index 0000000..4ef94db --- /dev/null +++ b/wasserstein/include/auction_runner_gs.hpp @@ -0,0 +1,494 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "def_debug_ws.h" + +#define PRINT_DETAILED_TIMING + +#ifdef FOR_R_TDA +#include "Rcpp.h" +#undef DEBUG_AUCTION +#endif + + +namespace hera { +namespace ws { + +// ***************************** +// AuctionRunnerGS +// ***************************** + +template +AuctionRunnerGS::AuctionRunnerGS(const PC& A, + const PC& B, + const AuctionParams& params, + const std::string& _log_filename_prefix) : + bidders(A), + items(B), + num_bidders(A.size()), + num_items(B.size()), + items_to_bidders(B.size(), k_invalid_index), + bidders_to_items(A.size(), k_invalid_index), + wasserstein_power(params.wasserstein_power), + delta(params.delta), + internal_p(params.internal_p), + initial_epsilon(params.initial_epsilon), + epsilon_common_ratio(params.epsilon_common_ratio == 0.0 ? 5.0 : params.epsilon_common_ratio), + max_num_phases(params.max_num_phases), + tolerate_max_iter_exceeded(params.tolerate_max_iter_exceeded), + dimension(params.dim), + oracle(bidders, items, params) +#ifdef LOG_AUCTION + , total_items_persistence(std::accumulate(items.begin(), + items.end(), + R(0.0), + [params](const Real& ps, const DgmPoint& item) + { return ps + std::pow(item.persistence_lp(params.internal_p), params.wasserstein_power); } + )) + + , total_bidders_persistence(std::accumulate(bidders.begin(), + bidders.end(), + R(0.0), + [params](const Real& ps, const DgmPoint& bidder) + { return ps + std::pow(bidder.persistence_lp(params.internal_p), params.wasserstein_power); } + )) + , partial_cost(0.0) + , unassigned_bidders_persistence(0.0) + , unassigned_items_persistence(0.0) +#endif + +{ + assert(initial_epsilon >= 0.0 ); + assert(epsilon_common_ratio >= 0.0 ); + assert(A.size() == B.size()); +#ifdef LOG_AUCTION + + unassigned_items_persistence = total_items_persistence; + unassigned_bidders_persistence = total_bidders_persistence; + + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); + console_logger->debug("Gauss-Seidel, num_bidders = {0}", num_bidders); + + plot_logger = spdlog::get("plot_logger"); + if (not plot_logger) { + plot_logger = spdlog::basic_logger_st("plot_logger", "plot_logger.txt"); + plot_logger->info("New plot starts here"); + plot_logger->set_pattern("%v"); + } +#endif + +} + +#ifdef LOG_AUCTION +template +void AuctionRunnerGS::enable_logging(const char* log_filename, const size_t _max_unassigned_to_log) +{ + log_auction = true; + max_unassigned_to_log = _max_unassigned_to_log; + + auto log = spdlog::basic_logger_st(logger_name, log_filename); + log->set_pattern("%v"); +} +#endif + +template +void AuctionRunnerGS::assign_item_to_bidder(IdxType item_idx, IdxType bidder_idx) +{ + num_rounds++; + sanity_check(); + // only unassigned bidders should submit bids and get items + assert(bidders_to_items[bidder_idx] == k_invalid_index); + IdxType old_item_owner = items_to_bidders[item_idx]; + + // set new owner + bidders_to_items[bidder_idx] = item_idx; + items_to_bidders[item_idx] = bidder_idx; + // remove bidder from the list of unassigned bidders + unassigned_bidders.erase(bidder_idx); + + // old owner becomes unassigned + if (old_item_owner != k_invalid_index) { + bidders_to_items[old_item_owner] = k_invalid_index; + unassigned_bidders.insert(old_item_owner); + } + + +#ifdef LOG_AUCTION + + partial_cost += get_item_bidder_cost(item_idx, bidder_idx, true); + partial_cost -= get_item_bidder_cost(item_idx, old_item_owner, true); + + unassigned_items.erase(item_idx); + + unassigned_bidders_persistence -= std::pow(bidders[bidder_idx].persistence_lp(internal_p), wasserstein_power); + + if (old_item_owner != k_invalid_index) { + // item has been assigned to some other bidder, + // and he became unassigned + unassigned_bidders_persistence += std::pow(bidders[old_item_owner].persistence_lp(internal_p), wasserstein_power); + } else { + // item was unassigned before + unassigned_items_persistence -= std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); + } + + if (log_auction) + plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}", + num_phase, + num_rounds, + unassigned_bidders.size(), + unassigned_items_persistence, + unassigned_bidders_persistence, + unassigned_items_persistence + unassigned_bidders_persistence, + partial_cost, + total_bidders_persistence, + total_items_persistence, + oracle.get_epsilon() + ); + + + if (log_auction and unassigned_bidders.size() <= max_unassigned_to_log) { + auto logger = spdlog::get(logger_name); + if (logger) { + auto item = items[item_idx]; + auto bidder = bidders[bidder_idx]; + logger->info("{0} # ({1}, {2}) # ({3}, {4}) # {5} # {6} # {7}", + num_rounds, + item.getRealX(), + item.getRealY(), + bidder.getRealX(), + bidder.getRealY(), + format_point_set_to_log(unassigned_bidders, bidders), + format_point_set_to_log(unassigned_items, items), + oracle.get_epsilon()); + } + } +#endif +} + + +template +void AuctionRunnerGS::flush_assignment() +{ + for(auto& b2i : bidders_to_items) { + b2i = k_invalid_index; + } + for(auto& i2b : items_to_bidders) { + i2b = k_invalid_index; + } + // we must flush assignment only after we got perfect matching + assert(unassigned_bidders.empty()); + // all bidders become unassigned + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_bidders.insert(bidder_idx); + } + assert(unassigned_bidders.size() == bidders.size()); + +#ifdef LOG_AUCTION + partial_cost = 0.0; + unassigned_bidders_persistence = total_bidders_persistence; + unassigned_items_persistence = total_items_persistence; + + for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { + unassigned_items.insert(item_idx); + } +#endif + + oracle.adjust_prices(); +} + + +template +void AuctionRunnerGS::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) +{ + relative_error = std::numeric_limits::max(); + // choose some initial epsilon + oracle.set_epsilon(_initial_epsilon); + assert( oracle.get_epsilon() > 0 ); + for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { + flush_assignment(); + run_auction_phase(); + Real current_result = getDistanceToQthPowerInternal(); +// Real current_result_1 = 0.0; +// for(size_t i = 0; i < num_bidders; ++i) { +// current_result_1 += oracle.traits.distance(bidders[i], items[bidders_to_items[i]]); +// } +// current_result = current_result_1; +// assert(fabs(current_result - current_result_1) < 0.001); + Real denominator = current_result - num_bidders * oracle.get_epsilon(); + current_result = pow(current_result, 1.0 / wasserstein_power); +#ifdef LOG_AUCTION + console_logger->info("Phase {0} done, num_rounds (cumulative) = {1}, current_result = {2}, epsilon = {3}", + phase_num, format_int(num_rounds), current_result, + oracle.get_epsilon()); +#endif + if ( denominator <= 0 ) { +#ifdef LOG_AUCTION + console_logger->info("Epsilon is too large"); +#endif + } else { + denominator = pow(denominator, 1.0 / wasserstein_power); + Real numerator = current_result - denominator; + relative_error = numerator / denominator; + // spdlog::get("console")->info("relative error = {} / {} = {}, result = {}", numerator, denominator, relative_error, current_result); +#ifdef LOG_AUCTION + console_logger->info("error = {0} / {1} = {2}", + numerator, denominator, relative_error); +#endif + if (relative_error <= delta) { + break; + } + } + // decrease epsilon for the next iteration + oracle.set_epsilon( oracle.get_epsilon() / epsilon_common_ratio ); + } +} + + +template +void AuctionRunnerGS::run_auction() +{ + + if (num_bidders == 1) { + assign_item_to_bidder(0, 0); + wasserstein_cost = get_item_bidder_cost(0,0); + is_distance_computed = true; + return; + } + + double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : oracle.max_val_ / 4.0 ; + run_auction_phases(max_num_phases, init_eps); + is_distance_computed = true; + if (relative_error > delta and not tolerate_max_iter_exceeded) { +#ifndef FOR_R_TDA + std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; + std::cerr << pow(wasserstein_cost, 1.0/wasserstein_power) << std::endl; +#endif + throw std::runtime_error("Maximum iteration number exceeded"); + } +} + + +template +void AuctionRunnerGS::run_auction_phase() +{ + num_phase++; + //std::cout << "Entered run_auction_phase" << std::endl; + do { + size_t bidder_idx = *unassigned_bidders.begin(); + auto optimal_bid = oracle.get_optimal_bid(bidder_idx); + auto optimal_item_idx = optimal_bid.first; + auto bid_value = optimal_bid.second; + assign_item_to_bidder(optimal_bid.first, bidder_idx); + oracle.set_price(optimal_item_idx, bid_value); + //print_debug(); +#ifdef FOR_R_TDA + if ( num_rounds % 10000 == 0 ) { + Rcpp::check_user_interrupt(); + } +#endif + } while (not unassigned_bidders.empty()); + //std::cout << "run_auction_phase finished" << std::endl; + +#ifdef DEBUG_AUCTION + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= (IdxType)num_bidders) { + std::cerr << "After auction terminated bidder " << bidder_idx; + std::cerr << " has no items assigned" << std::endl; + throw std::runtime_error("Auction did not give a perfect matching"); + } + } +#endif + +} + +template +R AuctionRunnerGS::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx) const +{ + if (item_idx != k_invalid_index and bidder_idx != k_invalid_index) { + return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension), wasserstein_power); + } else { + if (tolerate_invalid_idx) + return R(0.0); + else + throw std::runtime_error("Invalid idx in get_item_bidder_cost, item_idx = " + std::to_string(item_idx) + ", bidder_idx = " + std::to_string(bidder_idx)); + } +} + +template +R AuctionRunnerGS::getDistanceToQthPowerInternal() +{ + sanity_check(); + Real result = 0.0; + //std::cout << "-------------------------------------------------------------------------\n"; + for(size_t bIdx = 0; bIdx < num_bidders; ++bIdx) { + result += get_item_bidder_cost(bidders_to_items[bIdx], bIdx); + } + //std::cout << "-------------------------------------------------------------------------\n"; + wasserstein_cost = result; + return result; +} + +template +R AuctionRunnerGS::get_wasserstein_distance() +{ + assert(is_distance_computed); + return pow(get_wasserstein_cost(), 1.0/wasserstein_power); +} + +template +R AuctionRunnerGS::get_wasserstein_cost() +{ + assert(is_distance_computed); + return wasserstein_cost; +} + + + +// Debug routines + +template +void AuctionRunnerGS::print_debug() +{ +#ifdef DEBUG_AUCTION + sanity_check(); + std::cout << "**********************" << std::endl; + std::cout << "Current assignment:" << std::endl; + for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { + std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; + } + std::cout << "Weights: " << std::endl; + //for(size_t i = 0; i < num_bidders; ++i) { + //for(size_t j = 0; j < num_items; ++j) { + //std::cout << oracle.weight_matrix[i][j] << " "; + //} + //std::cout << std::endl; + //} + std::cout << "Prices: " << std::endl; + for(const auto price : oracle.get_prices()) { + std::cout << price << std::endl; + } + std::cout << "**********************" << std::endl; +#endif +} + + +template +void AuctionRunnerGS::sanity_check() +{ +#ifdef DEBUG_AUCTION + if (bidders_to_items.size() != num_bidders) { + std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; + throw std::runtime_error("Wrong size of bidders_to_items"); + } + + if (items_to_bidders.size() != num_bidders) { + std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; + throw std::runtime_error("Wrong size of items_to_bidders"); + } + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < (IdxType)num_items and bidders_to_items[bidder_idx] >= 0)); + + if ( bidders_to_items[bidder_idx] != k_invalid_index) { + + if ( std::count(bidders_to_items.begin(), + bidders_to_items.end(), + bidders_to_items[bidder_idx]) > 1 ) { + std::cerr << "Item " << bidders_to_items[bidder_idx]; + std::cerr << " appears in bidders_to_items more than once" << std::endl; + throw std::runtime_error("Duplicate in bidders_to_items"); + } + + if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { + std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; + std::cerr << ", item_idx in bidders_to_items = "; + std::cerr << bidders_to_items[bidder_idx]; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; + throw std::runtime_error("inconsistent mapping"); + } + } + } + + for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { + assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < static_cast(num_items) and items_to_bidders[item_idx] >= 0)); + if ( items_to_bidders.at(item_idx) != k_invalid_index) { + + // check for uniqueness + if ( std::count(items_to_bidders.begin(), + items_to_bidders.end(), + items_to_bidders[item_idx]) > 1 ) { + std::cerr << "Bidder " << items_to_bidders[item_idx]; + std::cerr << " appears in items_to_bidders more than once" << std::endl; + throw std::runtime_error("Duplicate in items_to_bidders"); + } + // check for consistency + if (bidders_to_items.at(items_to_bidders.at(item_idx)) != static_cast(item_idx)) { + std::cerr << "Inconsitency: item_idx = " << item_idx; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[item_idx]; + std::cerr << ", item_idx in bidders_to_items= "; + std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; + throw std::runtime_error("inconsistent mapping"); + } + } + } +#endif +} + +template +void AuctionRunnerGS::print_matching() +{ +#ifdef DEBUG_AUCTION + sanity_check(); + for(size_t bIdx = 0; bIdx < bidders_to_items.size(); ++bIdx) { + if (bidders_to_items[bIdx] != k_invalid_index) { + auto pA = bidders[bIdx]; + auto pB = items[bidders_to_items[bIdx]]; + std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p, dimension), wasserstein_power) << std::endl; + } else { + assert(false); + } + } +#endif +} + +} // ws +} // hera diff --git a/wasserstein/include/auction_runner_gs_single_diag.h b/wasserstein/include/auction_runner_gs_single_diag.h new file mode 100644 index 0000000..f32fbbc --- /dev/null +++ b/wasserstein/include/auction_runner_gs_single_diag.h @@ -0,0 +1,149 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef AUCTION_RUNNER_GS_SINGLE_DIAG_H +#define AUCTION_RUNNER_GS_SINGLE_DIAG_H + +#include +#include + +#include "auction_oracle.h" + +namespace hera { +namespace ws { + +// the two parameters that you can tweak in auction algorithm are: +// 1. epsilon_common_ratio +// 2. max_iter_num + +template > // alternatively: AuctionOracleLazyHeap --- TODO +class AuctionRunnerGaussSeidelSingleDiag { +public: + using RealType = RealType_; + using Real = RealType_; + using AuctionOracle = AuctionOracle_; + using DgmPoint = DiagramPoint; + using DgmPointVec = std::vector; + using DiagonalBidR = DiagonalBid; + + + + AuctionRunnerGaussSeidelSingleDiag(const DgmPointVec& A, + const DgmPointVec& B, + const Real q, + const Real _delta, + const Real _internal_p, + const Real _initial_epsilon, + const Real _eps_factor, + const int _max_iter_num = std::numeric_limits::max()); + + void set_epsilon(Real new_val) { oracle->set_epsilon(new_val); }; + Real get_epsilon() const { return oracle->get_epsilon(); } + Real get_wasserstein_cost(); + Real get_wasserstein_distance(); + Real get_relative_error() const { return relative_error; }; + void enable_logging(const char* log_filename, const size_t _max_unassigned_to_log); +//private: + // private data + DgmPointVec bidders, items; + const size_t num_bidders; + const size_t num_items; + size_t num_normal_bidders; + size_t num_diag_bidders; + size_t num_normal_items; + size_t num_diag_items; + std::vector items_to_bidders; + std::vector bidders_to_items; + const Real wasserstein_power; + const Real delta; + const Real internal_p; + const Real initial_epsilon; + Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio + const int max_iter_num; // maximal number of iterations of epsilon-scaling + Real weight_adj_const; + Real wasserstein_cost; + Real relative_error; + // to get the 2 best items we use oracle + std::unique_ptr oracle; + // unassigned guys + std::unordered_set unassigned_normal_bidders; + std::unordered_set unassigned_diag_bidders; + // private methods + // + void process_diagonal_bid(const DiagonalBidR& bid); + + void assign_item_to_bidder(const IdxType item_idx, + const IdxType bidder_idx, + const IdxType old_owner_idx, + const bool item_is_diagonal, + const bool bidder_is_diagonal, + const bool call_set_prices = false, + const Real new_price = std::numeric_limits::max()); + + void run_auction(); + void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); + void run_auction_phase(); + void flush_assignment(); + // return 0, if item_idx is invalid + Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx = false) const; + + bool is_bidder_diagonal(const size_t bidder_idx) const; + bool is_bidder_normal(const size_t bidder_idx) const; + bool is_item_diagonal(const size_t item_idx) const; + bool is_item_normal(const size_t item_idx) const; + + OwnerType get_owner_type(size_t bidder_idx) const; + + // for debug only + void sanity_check(); + void print_debug(); + int count_unhappy(); + void print_matching(); + Real getDistanceToQthPowerInternal(); + int num_phase { 0 }; + int num_rounds { 0 }; +#ifdef LOG_AUCTION + bool log_auction { false }; + std::unordered_set unassigned_items; + size_t max_unassigned_to_log { 0 }; + const char* logger_name = "auction_detailed_logger"; // the name in spdlog registry; filename is provided as parameter in enable_logging + const Real total_items_persistence; + const Real total_bidders_persistence; + Real partial_cost; + Real unassigned_bidders_persistence; + Real unassigned_items_persistence; +#endif +}; + +} // ws +} // hera + + +#include "auction_runner_gs_single_diag.hpp" + +#endif diff --git a/wasserstein/include/auction_runner_gs_single_diag.hpp b/wasserstein/include/auction_runner_gs_single_diag.hpp new file mode 100644 index 0000000..a3c401e --- /dev/null +++ b/wasserstein/include/auction_runner_gs_single_diag.hpp @@ -0,0 +1,738 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + + +#include +#include +#include +#include +#include +#include + +#include "def_debug_ws.h" + +#define PRINT_DETAILED_TIMING + +#ifdef FOR_R_TDA +#include "Rcpp.h" +#undef DEBUG_AUCTION +#endif + + +namespace hera { +namespace ws { + +// ***************************** +// AuctionRunnerGaussSeidelSingleDiag +// ***************************** + +template +std::ostream& operator<<(std::ostream& s, const AuctionRunnerGaussSeidelSingleDiag& ar) +{ + s << "--------------------------------------------------\n"; + s << "AuctionRunnerGaussSeidelSingleDiag, current assignment, bidders_to_items:" << std::endl; + for(size_t idx = 0; idx < ar.bidders_to_items.size(); ++idx) { + s << idx << " <--> " << ar.bidders_to_items[idx] << std::endl; + } + s << "--------------------------------------------------\n"; + s << "AuctionRunnerGaussSeidelSingleDiag, current assignment, items_to_bidders:" << std::endl; + for(size_t idx = 0; idx < ar.items_to_bidders.size(); ++idx) { + s << idx << " <--> " << ar.items_to_bidders[idx] << std::endl; + } + s << "--------------------------------------------------\n"; + s << "AuctionRunnerGaussSeidelSingleDiag, prices:" << std::endl; + for(size_t item_idx = 0; item_idx < ar.num_items; ++item_idx) { + s << item_idx << ": " << ar.oracle->get_price(item_idx) << std::endl; + } + s << "--------------------------------------------------\n"; + s << "AuctionRunnerGaussSeidelSingleDiag, oracle :" << *(ar.oracle) << std::endl; + s << "--------------------------------------------------\n"; + return s; +} + + +template +AuctionRunnerGaussSeidelSingleDiag::AuctionRunnerGaussSeidelSingleDiag(const DgmPointVec& A, + const DgmPointVec& B, + const Real q, + const Real _delta, + const Real _internal_p, + const Real _initial_epsilon, + const Real _eps_factor, + const int _max_iter_num) : + bidders(A), + items(B), + num_bidders(A.size()), + num_items(B.size()), + items_to_bidders(B.size(), k_invalid_index), + bidders_to_items(A.size(), k_invalid_index), + wasserstein_power(q), + delta(_delta), + internal_p(_internal_p), + initial_epsilon(_initial_epsilon), + epsilon_common_ratio(_eps_factor == 0.0 ? 5.0 : _eps_factor), + max_iter_num(_max_iter_num) +#ifdef LOG_AUCTION + , total_items_persistence(std::accumulate(items.begin(), + items.end(), + R(0.0), + [_internal_p, q](const Real& ps, const DgmPoint& item) + { return ps + std::pow(item.persistence_lp(_internal_p), q); } + )) + + , total_bidders_persistence(std::accumulate(bidders.begin(), + bidders.end(), + R(0.0), + [_internal_p, q](const Real& ps, const DgmPoint& bidder) + { return ps + std::pow(bidder.persistence_lp(_internal_p), q); } + )) + , partial_cost(0.0) + , unassigned_bidders_persistence(0.0) + , unassigned_items_persistence(0.0) +#endif + +{ + assert(initial_epsilon >= 0.0 ); + assert(epsilon_common_ratio >= 0.0 ); + assert(A.size() == B.size()); + oracle = std::unique_ptr(new AuctionOracle(bidders, items, wasserstein_power, internal_p)); + + for(num_normal_bidders = 0; num_normal_bidders < num_bidders; ++num_normal_bidders) { + if (bidders[num_normal_bidders].is_diagonal()) + break; + } + + num_diag_bidders = num_bidders - num_normal_bidders; + num_diag_items = num_normal_bidders; + num_normal_items = num_items - num_diag_items; + + for(size_t i = num_normal_bidders; i < num_bidders; ++i) { + assert(bidders[i].is_diagonal()); + } + +#ifdef LOG_AUCTION + + unassigned_items_persistence = total_items_persistence; + unassigned_bidders_persistence = total_bidders_persistence; + + if (not spdlog::get("plot_logger")) { + auto log = spdlog::basic_logger_st("plot_logger", "plot_logger.txt"); + log->info("New plot starts here"); + log->set_pattern("%v"); + } +#endif + +} + +#ifdef LOG_AUCTION +template +void AuctionRunnerGaussSeidelSingleDiag::enable_logging(const char* log_filename, const size_t _max_unassigned_to_log) +{ + log_auction = true; + max_unassigned_to_log = _max_unassigned_to_log; + + auto log = spdlog::basic_logger_st(logger_name, log_filename); + log->set_pattern("%v"); +} +#endif + +template +void AuctionRunnerGaussSeidelSingleDiag::process_diagonal_bid(const DiagonalBidR& bid) +{ + + //std::cout << "Enter process_diagonal_bid, bid = " << bid << std::endl; + + // increase price of already assigned normal items + for(size_t k = 0; k < bid.assigned_normal_items.size(); ++k) { + size_t assigned_normal_item_idx = bid.assigned_normal_items[k]; + Real new_price = bid.assigned_normal_items_bid_values[k]; + bool item_is_diagonal = false; + bool bidder_is_diagonal = true; + + // TODO: SPECIAL PROCEDURE HEER` + oracle->set_price(assigned_normal_item_idx, new_price, item_is_diagonal, bidder_is_diagonal, OwnerType::k_diagonal); + } + + // set common diag-diag price + // if diag_assigned_to_diag_slice_ is empty, it will be + // numeric_limits::max() + + oracle->diag_to_diag_price_ = bid.diag_to_diag_value; + + int unassigned_diag_idx = 0; + auto unassigned_diag_item_iter = oracle->diag_unassigned_slice_.begin(); + auto bid_vec_idx = 0; + for(const auto diag_bidder_idx : unassigned_diag_bidders) { + if (unassigned_diag_idx < bid.num_from_unassigned_diag) { + // take diagonal point from unassigned slice + + //std::cout << "assigning to diag_bidder_idx = " << diag_bidder_idx << std::endl; + assert(unassigned_diag_item_iter != oracle->diag_unassigned_slice_.end()); + + auto item_idx = *unassigned_diag_item_iter; + + ++unassigned_diag_idx; + ++unassigned_diag_item_iter; + assign_item_to_bidder(item_idx, diag_bidder_idx, k_invalid_index, true, true, false); + } else { + // take point from best_item_indices + size_t item_idx = bid.best_item_indices[bid_vec_idx]; + Real new_price = bid.bid_values[bid_vec_idx]; + bid_vec_idx++; + + auto old_owner_idx = items_to_bidders[item_idx]; + bool item_is_diagonal = is_item_diagonal(item_idx); + + assign_item_to_bidder(item_idx, diag_bidder_idx, old_owner_idx, item_is_diagonal, true, true, new_price); + } + } + + // all bids of diagonal bidders are satisfied + unassigned_diag_bidders.clear(); + + if (oracle->diag_unassigned_slice_.empty()) { + oracle->diag_unassigned_price_ = std::numeric_limits::max(); + } + + //std::cout << "Exit process_diagonal_bid\n" << *this; +} + +template +bool AuctionRunnerGaussSeidelSingleDiag::is_bidder_diagonal(const size_t bidder_idx) const +{ + return bidder_idx >= num_normal_bidders; +} + +template +bool AuctionRunnerGaussSeidelSingleDiag::is_bidder_normal(const size_t bidder_idx) const +{ + return bidder_idx < num_normal_bidders; +} + +template +bool AuctionRunnerGaussSeidelSingleDiag::is_item_diagonal(const size_t item_idx) const +{ + return item_idx < num_diag_items; +} + +template +bool AuctionRunnerGaussSeidelSingleDiag::is_item_normal(const size_t item_idx) const +{ + return item_idx >= num_diag_items; +} + +template +void AuctionRunnerGaussSeidelSingleDiag::assign_item_to_bidder(const IdxType item_idx, + const IdxType bidder_idx, + const IdxType old_owner_idx, + const bool item_is_diagonal, + const bool bidder_is_diagonal, + const bool call_set_price, + const R new_price) +{ + //std::cout << "Enter assign_item_to_bidder, " << std::boolalpha ; + //std::cout << "item_idx = " << item_idx << ", bidder_idx = " << bidder_idx << ", old_owner_idx = " << old_owner_idx << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << std::endl; + //std::cout << "################################################################################" << std::endl; + //std::cout << *this << std::endl; + //std::cout << *(this->oracle) << std::endl; + //std::cout << "################################################################################" << std::endl; + num_rounds++; + + // for readability + const bool item_is_normal = not item_is_diagonal; + const bool bidder_is_normal = not bidder_is_diagonal; + + // only unassigned bidders should submit bids and get items + assert(bidders_to_items[bidder_idx] == k_invalid_index); + + + // update matching information + bidders_to_items[bidder_idx] = item_idx; + items_to_bidders[item_idx] = bidder_idx; + + + // remove bidder from the list of unassigned bidders + // for diagonal bidders we don't need to: in Gauss-Seidel they are all + // processed at once, so the set unassigned_diag_bidders will be cleared + if (bidder_is_normal) { + unassigned_normal_bidders.erase(bidder_idx); + } + + OwnerType old_owner_type = get_owner_type(old_owner_idx); + + if (old_owner_type != OwnerType::k_none) { + bidders_to_items[old_owner_idx] = k_invalid_index; + } + + switch(old_owner_type) + { + case OwnerType::k_normal : unassigned_normal_bidders.insert(old_owner_idx); + break; + case OwnerType::k_diagonal : unassigned_diag_bidders.insert(old_owner_idx); + break; + case OwnerType::k_none : break; + } + + + // update normal_items_assigned_to_diag_ + + if (old_owner_type == OwnerType::k_diagonal and item_is_normal and bidder_is_normal) { + // normal item was stolen from diagonal, erase + assert( oracle->normal_items_assigned_to_diag_.count(item_idx) == 1 ); + oracle->normal_items_assigned_to_diag_.erase(item_idx); + } else if (bidder_is_diagonal and item_is_normal and old_owner_type != OwnerType::k_diagonal) { + // diagonal bidder got a new normal item, insert + assert(oracle->normal_items_assigned_to_diag_.count(item_idx) == 0); + oracle->normal_items_assigned_to_diag_.insert(item_idx); + } + + + // update diag_assigned_to_diag_slice_ + if (item_is_diagonal and bidder_is_normal and old_owner_type == OwnerType::k_diagonal) { + assert( oracle->diag_assigned_to_diag_slice_.count(item_idx) == 1); + oracle->diag_assigned_to_diag_slice_.erase(item_idx); + } else if (item_is_diagonal and bidder_is_diagonal) { + assert( old_owner_type != OwnerType::k_diagonal ); // diagonal does not steal from itself + assert( oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); + oracle->diag_assigned_to_diag_slice_.insert(item_idx); + } + + // update diag_unassigned_slice_ + if (item_is_diagonal and old_owner_type == OwnerType::k_none) { + oracle->diag_unassigned_slice_.erase(item_idx); + } + + if ( not (not call_set_price or new_price != std::numeric_limits::max())) { + std::cout << "In the middle of assign_item_to_bidder, " << std::boolalpha ; + std::cout << "item_idx = " << item_idx << ", bidder_idx = " << bidder_idx << ", old_owner_idx = " << old_owner_idx << ", item_is_diagonal = " << item_is_diagonal << ", bidder_is_diagonal = " << bidder_is_diagonal << std::endl; + std::cout << "################################################################################" << std::endl; + std::cout << *this << std::endl; + std::cout << "################################################################################" << std::endl; + } + assert(not call_set_price or new_price != std::numeric_limits::max()); + if (call_set_price) { + oracle->set_price(item_idx, new_price, item_is_diagonal, bidder_is_diagonal, old_owner_type); + } + + //std::cout << "Exit assign_item_to_bidder, state\n" << *this << std::endl; + +#ifdef LOG_AUCTION + + partial_cost += get_item_bidder_cost(item_idx, bidder_idx, true); + partial_cost -= get_item_bidder_cost(item_idx, old_owner_idx, true); + + unassigned_items.erase(item_idx); + + unassigned_bidders_persistence -= std::pow(bidders[bidder_idx].persistence_lp(internal_p), wasserstein_power); + + if (old_owner_type != OwnerType::k_none) { + // item has been assigned to some other bidder, + // and he became unassigned + unassigned_bidders_persistence += std::pow(bidders[old_owner_idx].persistence_lp(internal_p), wasserstein_power); + } else { + // item was unassigned before + unassigned_items_persistence -= std::pow(items[item_idx].persistence_lp(internal_p), wasserstein_power); + } + + auto plot_logger = spdlog::get("plot_logger"); + plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}", + num_phase, + num_rounds, + unassigned_normal_bidders.size(), + unassigned_diag_bidders.size(), + unassigned_items_persistence, + unassigned_bidders_persistence, + unassigned_items_persistence + unassigned_bidders_persistence, + partial_cost, + total_bidders_persistence, + total_items_persistence, + oracle->get_epsilon() + ); + + + if (log_auction and unassigned_normal_bidders.size() + unassigned_diag_bidders.size() <= max_unassigned_to_log) { + auto logger = spdlog::get(logger_name); + if (logger) { + auto item = items[item_idx]; + auto bidder = bidders[bidder_idx]; + logger->info("{0} # ({1}, {2}) # ({3}, {4}) # {5} # {6} # {7} # {8}", + num_rounds, + item.getRealX(), + item.getRealY(), + bidder.getRealX(), + bidder.getRealY(), + format_point_set_to_log(unassigned_diag_bidders, bidders), + format_point_set_to_log(unassigned_normal_bidders, bidders), + format_point_set_to_log(unassigned_items, items), + oracle->get_epsilon()); + } + } +#endif +} + + + +template +void AuctionRunnerGaussSeidelSingleDiag::flush_assignment() +{ + for(auto& b2i : bidders_to_items) { + b2i = k_invalid_index; + } + for(auto& i2b : items_to_bidders) { + i2b = k_invalid_index; + } + + // we must flush assignment only after we got perfect matching + assert(unassigned_normal_bidders.empty() and unassigned_diag_bidders.empty()); + // all bidders become unassigned + for(size_t bidder_idx = 0; bidder_idx < num_normal_bidders; ++bidder_idx) { + unassigned_normal_bidders.insert(bidder_idx); + } + for(size_t bidder_idx = num_normal_bidders; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_diag_bidders.insert(bidder_idx); + } + assert(unassigned_normal_bidders.size() + unassigned_diag_bidders.size() == bidders.size()); + assert(unassigned_normal_bidders.size() == num_normal_bidders); + assert(unassigned_diag_bidders.size() == num_diag_bidders); + + oracle->flush_assignment(); + oracle->adjust_prices(); + +#ifdef LOG_AUCTION + partial_cost = 0.0; + unassigned_bidders_persistence = total_bidders_persistence; + unassigned_items_persistence = total_items_persistence; + + for(size_t item_idx = 0; item_idx < items.size(); ++item_idx) { + unassigned_items.insert(item_idx); + } +#endif + +} + + +template +void AuctionRunnerGaussSeidelSingleDiag::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) +{ + relative_error = std::numeric_limits::max(); + // choose some initial epsilon + oracle->set_epsilon(_initial_epsilon); + assert( oracle->get_epsilon() > 0 ); + for(int phase_num = 0; phase_num < max_num_phases; ++phase_num) { + flush_assignment(); + run_auction_phase(); + phase_num++; + //std::cout << "Iteration " << phase_num << " completed. " << std::endl; + // result is d^q + Real current_result = getDistanceToQthPowerInternal(); + Real denominator = current_result - num_bidders * oracle->get_epsilon(); + current_result = pow(current_result, 1.0 / wasserstein_power); + //std::cout << "Current result is " << current_result << std::endl; + if ( denominator <= 0 ) { + //std::cout << "Epsilon is too big." << std::endl; + } else { + denominator = pow(denominator, 1.0 / wasserstein_power); + Real numerator = current_result - denominator; + relative_error = numerator / denominator; + //std::cout << " numerator: " << numerator << " denominator: " << denominator << std::endl; + //std::cout << " error bound: " << numerator / denominator << std::endl; + // if relative error is greater than delta, continue + if (relative_error <= delta) { + break; + } + } + // decrease epsilon for the next iteration + oracle->set_epsilon( oracle->get_epsilon() / epsilon_common_ratio ); + } + //print_matching(); +} + + +template +void AuctionRunnerGaussSeidelSingleDiag::run_auction() +{ + double init_eps = ( initial_epsilon > 0.0 ) ? initial_epsilon : oracle->max_val_ / 4.0 ; + run_auction_phases(max_iter_num, init_eps); + if (relative_error > delta) { +#ifndef FOR_R_TDA + std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; + std::cerr << pow(wasserstein_cost, 1.0/wasserstein_power) << std::endl; +#endif + throw std::runtime_error("Maximum iteration number exceeded"); + } +} + +template +OwnerType AuctionRunnerGaussSeidelSingleDiag::get_owner_type(size_t bidder_idx) const +{ + if (bidder_idx == k_invalid_index) { + return OwnerType::k_none; + } else if (is_bidder_diagonal(bidder_idx)) { + return OwnerType::k_diagonal; + } else { + return OwnerType::k_normal; + } +} + +template +void AuctionRunnerGaussSeidelSingleDiag::run_auction_phase() +{ + num_phase++; + //std::cout << "Entered run_auction_phase" << std::endl; + do { + + if (not unassigned_diag_bidders.empty()) { + // process all unassigned diagonal bidders + // easy for Gauss-Seidel: every bidder alwasy gets all he wants + // + sanity_check(); + //std::cout << "Current state " << __LINE__ << *this << std::endl; + process_diagonal_bid(oracle->get_optimal_bids_for_diagonal( unassigned_diag_bidders.size() )); + sanity_check(); + } else { + sanity_check(); + // process normal unassigned bidder + size_t bidder_idx = *(unassigned_normal_bidders.begin()); + auto optimal_bid = oracle->get_optimal_bid(bidder_idx); + auto optimal_item_idx = optimal_bid.first; + auto bid_value = optimal_bid.second; + bool item_is_diagonal = is_item_diagonal(optimal_item_idx); + size_t old_owner_idx = items_to_bidders[optimal_item_idx]; + + //OwnerType old_owner_type = get_owner_type(old_owner_idx); + //std::cout << "bidder_idx = " << bidder_idx << ", item_idx = " << optimal_item_idx << ", old_owner_type = " << old_owner_type << std::endl; + + assign_item_to_bidder(optimal_item_idx, bidder_idx, old_owner_idx, item_is_diagonal, false, true, bid_value); + sanity_check(); + } + +#ifdef FOR_R_TDA + if ( num_rounds % 10000 == 0 ) { + Rcpp::check_user_interrupt(); + } +#endif + } while (not (unassigned_diag_bidders.empty() and unassigned_normal_bidders.empty())); + //std::cout << "run_auction_phase finished" << std::endl; + +#ifdef DEBUG_AUCTION + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= (IdxType)num_bidders) { + std::cerr << "After auction terminated bidder " << bidder_idx; + std::cerr << " has no items assigned" << std::endl; + throw std::runtime_error("Auction did not give a perfect matching"); + } + } +#endif + +} + +template +R AuctionRunnerGaussSeidelSingleDiag::get_item_bidder_cost(size_t item_idx, size_t bidder_idx, const bool tolerate_invalid_idx) const +{ + if (item_idx != k_invalid_index and bidder_idx != k_invalid_index) { + // skew edges are replaced by edges to projection + if (is_bidder_diagonal(bidder_idx) and is_item_normal(item_idx)) { + bidder_idx = item_idx; + } else if (is_bidder_normal(bidder_idx) and is_item_diagonal(item_idx)) { + item_idx = bidder_idx; + } + return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p), + wasserstein_power); + } else { + if (tolerate_invalid_idx) + return R(0.0); + else + throw std::runtime_error("Invalid idx in get_item_bidder_cost, item_idx = " + std::to_string(item_idx) + ", bidder_idx = " + std::to_string(bidder_idx)); + } +} + +template +R AuctionRunnerGaussSeidelSingleDiag::getDistanceToQthPowerInternal() +{ + sanity_check(); + Real result = 0.0; + for(size_t bIdx = 0; bIdx < num_bidders; ++bIdx) { + result += get_item_bidder_cost(bidders_to_items[bIdx], bIdx); + } + wasserstein_cost = result; + return result; +} + +template +R AuctionRunnerGaussSeidelSingleDiag::get_wasserstein_distance() +{ + return pow(get_wasserstein_cost(), 1.0/wasserstein_power); +} + +template +R AuctionRunnerGaussSeidelSingleDiag::get_wasserstein_cost() +{ + run_auction(); + return wasserstein_cost; +} + + + +// Debug routines + + +template +void AuctionRunnerGaussSeidelSingleDiag::print_debug() +{ +#ifdef DEBUG_AUCTION + std::cout << "**********************" << std::endl; + std::cout << "Current assignment:" << std::endl; + for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { + std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; + } + std::cout << "Weights: " << std::endl; + //for(size_t i = 0; i < num_bidders; ++i) { + //for(size_t j = 0; j < num_items; ++j) { + //std::cout << oracle->weight_matrix[i][j] << " "; + //} + //std::cout << std::endl; + //} + std::cout << "Prices: " << std::endl; + for(const auto price : oracle->get_prices()) { + std::cout << price << std::endl; + } + std::cout << "**********************" << std::endl; +#endif +} + + +template +void AuctionRunnerGaussSeidelSingleDiag::sanity_check() +{ +#ifdef DEBUG_AUCTION + if (bidders_to_items.size() != num_bidders) { + std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; + throw std::runtime_error("Wrong size of bidders_to_items"); + } + + if (items_to_bidders.size() != num_bidders) { + std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; + throw std::runtime_error("Wrong size of items_to_bidders"); + } + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < static_cast(num_items) and bidders_to_items[bidder_idx] >= 0)); + + if ( bidders_to_items[bidder_idx] != k_invalid_index) { + + if ( std::count(bidders_to_items.begin(), + bidders_to_items.end(), + bidders_to_items[bidder_idx]) > 1 ) { + std::cerr << "Item " << bidders_to_items[bidder_idx]; + std::cerr << " appears in bidders_to_items more than once" << std::endl; + throw std::runtime_error("Duplicate in bidders_to_items"); + } + + if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { + std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; + std::cerr << ", item_idx in bidders_to_items = "; + std::cerr << bidders_to_items[bidder_idx]; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; + throw std::runtime_error("inconsistent mapping"); + } + } + } + + for(size_t item_idx = 0; item_idx < num_diag_items; ++item_idx) { + auto owner = items_to_bidders.at(item_idx); + if ( owner == k_invalid_index) { + assert((oracle->diag_unassigned_slice_.count(item_idx) == 1 and + oracle->diag_items_heap__iters_[item_idx] == oracle->diag_items_heap_.end() and + oracle->all_items_heap__iters_[item_idx] == oracle->all_items_heap_.end()) + or + (oracle->diag_unassigned_slice_.count(item_idx) == 0 and + oracle->diag_items_heap__iters_[item_idx] != oracle->diag_items_heap_.end() and + oracle->all_items_heap__iters_[item_idx] != oracle->all_items_heap_.end())); + assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); + } else { + if (is_bidder_diagonal(owner)) { + assert(oracle->diag_unassigned_slice_.count(item_idx) == 0); + assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 1); + assert(oracle->diag_items_heap__iters_[item_idx] == oracle->diag_items_heap_.end()); + assert(oracle->all_items_heap__iters_[item_idx] == oracle->all_items_heap_.end()); + } else { + assert(oracle->diag_unassigned_slice_.count(item_idx) == 0); + assert(oracle->diag_assigned_to_diag_slice_.count(item_idx) == 0); + assert(oracle->diag_items_heap__iters_[item_idx] != oracle->diag_items_heap_.end()); + assert(oracle->all_items_heap__iters_[item_idx] != oracle->all_items_heap_.end()); + } + } + } + + for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { + assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < static_cast(num_items) and items_to_bidders[item_idx] >= 0)); + if ( items_to_bidders.at(item_idx) != k_invalid_index) { + + // check for uniqueness + if ( std::count(items_to_bidders.begin(), + items_to_bidders.end(), + items_to_bidders[item_idx]) > 1 ) { + std::cerr << "Bidder " << items_to_bidders[item_idx]; + std::cerr << " appears in items_to_bidders more than once" << std::endl; + throw std::runtime_error("Duplicate in items_to_bidders"); + } + // check for consistency + if (bidders_to_items.at(items_to_bidders.at(item_idx)) != static_cast(item_idx)) { + std::cerr << "Inconsitency: item_idx = " << item_idx; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[item_idx]; + std::cerr << ", item_idx in bidders_to_items= "; + std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; + throw std::runtime_error("inconsistent mapping"); + } + } + } + + oracle->sanity_check(); +#endif +} + +template +void AuctionRunnerGaussSeidelSingleDiag::print_matching() +{ +#ifdef DEBUG_AUCTION + sanity_check(); + for(size_t bIdx = 0; bIdx < bidders_to_items.size(); ++bIdx) { + if (bidders_to_items[bIdx] != k_invalid_index) { + auto pA = bidders[bIdx]; + auto pB = items[bidders_to_items[bIdx]]; + std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p), wasserstein_power) << std::endl; + } else { + assert(false); + } + } +#endif +} + +} // ws +} // hera diff --git a/wasserstein/include/auction_runner_jac.h b/wasserstein/include/auction_runner_jac.h new file mode 100644 index 0000000..252ca32 --- /dev/null +++ b/wasserstein/include/auction_runner_jac.h @@ -0,0 +1,230 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef HERA_AUCTION_RUNNER_JAC_H +#define HERA_AUCTION_RUNNER_JAC_H + +#ifdef WASSERSTEIN_PURE_GEOM +#undef LOG_AUCTION +#undef ORDERED_BY_PERSISTENCE +#endif + +//#define ORDERED_BY_PERSISTENCE + +#include + +#include "auction_oracle.h" + +namespace hera { +namespace ws { + +// the two parameters that you can tweak in auction algorithm are: +// 1. epsilon_common_ratio +// 2. max_num_phases + +template, class PointContainer_ = std::vector> > // alternatively: AuctionOracleLazyHeap --- TODO +class AuctionRunnerJac { +public: + + using Real = RealType_; + using AuctionOracle = AuctionOracle_; + using DgmPoint = typename AuctionOracle::DiagramPointR; + using IdxValPairR = IdxValPair; + using PointContainer = PointContainer_; + + const Real k_lowest_bid_value = -1; // all bid values must be positive + + + AuctionRunnerJac(const PointContainer& A, + const PointContainer& B, + const AuctionParams& params, + const std::string& _log_filename_prefix = ""); + + void set_epsilon(Real new_val); + Real get_epsilon() const { return epsilon; } + void run_auction(); + template + void run_bidding_step(const Range& r); + bool is_done() const; + void decrease_epsilon(); + Real get_wasserstein_distance(); + Real get_wasserstein_cost(); + Real get_relative_error(const bool debug_output = false) const; +//private: + // private data + PointContainer bidders; + PointContainer items; + const size_t num_bidders; + const size_t num_items; + std::vector items_to_bidders; + std::vector bidders_to_items; + Real wasserstein_power; + Real epsilon; + Real delta; + Real internal_p; + Real initial_epsilon; + const Real epsilon_common_ratio; // next epsilon = current epsilon / epsilon_common_ratio + const int max_num_phases; // maximal number of phases of epsilon-scaling + Real weight_adj_const; + Real wasserstein_cost; + std::vector bid_table; + // to get the 2 best items + AuctionOracle oracle; + std::unordered_set unassigned_bidders; + std::unordered_set items_with_bids; + // to imitate Gauss-Seidel + const size_t max_bids_per_round; + Real partial_cost { 0.0 }; + bool is_distance_computed { false }; + int num_rounds { 0 }; + int num_phase { 0 }; + int dimension; + + size_t unassigned_threshold; // for experiments + +#ifndef WASSERSTEIN_PURE_GEOM + std::unordered_set unassigned_normal_bidders; + std::unordered_set unassigned_diag_bidders; + bool diag_first {true}; + size_t batch_size { 1000 }; +#ifdef ORDERED_BY_PERSISTENCE + // to process unassigned by persistence + using RealIdxPair = std::pair; + std::set> unassigned_normal_bidders_by_persistence; +#endif + + // to stop earlier in the last phase + const Real total_items_persistence; + const Real total_bidders_persistence; + Real unassigned_bidders_persistence; + Real unassigned_items_persistence; + Real gamma_threshold; + + + size_t num_diag_items { 0 }; + size_t num_normal_items { 0 }; + size_t num_diag_bidders { 0 }; + size_t num_normal_bidders { 0 }; + + +#endif + + + + // private methods + void assign_item_to_bidder(const IdxType bidder_idx, const IdxType items_idx); + void assign_to_best_bidder(const IdxType items_idx); + void clear_bid_table(); + void run_auction_phases(const int max_num_phases, const Real _initial_epsilon); + void run_auction_phase(); + void submit_bid(IdxType bidder_idx, const IdxValPairR& items_bid_value_pair); + void flush_assignment(); + Real get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const; +#ifndef WASSERSTEIN_PURE_GEOM + Real get_cost_to_diagonal(const DgmPoint& pt) const; + Real get_gamma() const; +#endif + bool continue_auction_phase() const; + + void add_unassigned_bidder(const size_t bidder_idx); + void remove_unassigned_bidder(const size_t bidder_idx); + void remove_unassigned_item(const size_t item_idx); + +#ifndef WASSERSTEIN_PURE_GEOM + bool is_item_diagonal(const size_t item_idx) const { return item_idx < num_diag_items; } + bool is_item_normal(const size_t item_idx) const { return not is_item_diagonal(item_idx); } + bool is_bidder_diagonal(const size_t bidder_idx) const { return bidder_idx >= num_normal_bidders; } + bool is_bidder_normal(const size_t bidder_idx) const { return not is_bidder_diagonal(bidder_idx); } +#endif + + + + // for debug only + void sanity_check(); + void print_debug(); + void print_matching(); + + std::string log_filename_prefix; + const Real k_max_relative_error = 2.0; // if relative error cannot be estimated or is too large, use this value + +#ifdef LOG_AUCTION + + size_t parallel_threshold { 5000 }; + bool is_step_parallel {false}; + std::unordered_set unassigned_items; + std::unordered_set unassigned_normal_items; + std::unordered_set unassigned_diag_items; + std::unordered_set never_assigned_bidders; + size_t all_assigned_round { 0 }; + size_t all_assigned_round_found { false }; + + int num_rounds_non_cumulative { 0 }; // set to 0 in the beginning of each phase + int num_diag_assignments { 0 }; + int num_diag_assignments_non_cumulative { 0 }; + int num_diag_bids_submitted { 0 }; + int num_diag_stole_from_diag { 0 }; + int num_normal_assignments { 0 }; + int num_normal_assignments_non_cumulative { 0 }; + int num_normal_bids_submitted { 0 }; + + std::vector> price_change_cnt_vec; + + + const char* plot_logger_name = "plot_logger"; + const char* price_state_logger_name = "price_stat_logger"; + std::string plot_logger_file_name; + std::string price_stat_logger_file_name; + std::shared_ptr plot_logger; + std::shared_ptr price_stat_logger; + std::shared_ptr console_logger; + + + int num_parallel_bids { 0 }; + int num_total_bids { 0 }; + + int num_parallel_diag_bids { 0 }; + int num_total_diag_bids { 0 }; + + int num_parallel_normal_bids { 0 }; + int num_total_normal_bids { 0 }; + + int num_parallel_assignments { 0 }; + int num_total_assignments { 0 }; +#endif + +}; // AuctionRunnerJac + + +} // ws +} // hera + +#include "auction_runner_jac.hpp" + +#undef ORDERED_BY_PERSISTENCE + +#endif diff --git a/wasserstein/include/auction_runner_jac.hpp b/wasserstein/include/auction_runner_jac.hpp new file mode 100644 index 0000000..e623f4a --- /dev/null +++ b/wasserstein/include/auction_runner_jac.hpp @@ -0,0 +1,879 @@ +/* + +Copyright (c) 2016, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef AUCTION_RUNNER_JAC_HPP +#define AUCTION_RUNNER_JAC_HPP + +#include +#include +#include +#include + +#include "def_debug_ws.h" +#include "auction_runner_jac.h" + + +#ifdef FOR_R_TDA +#include "Rcpp.h" +#undef DEBUG_AUCTION +#endif + +namespace hera { +namespace ws { + + +// ***************************** +// AuctionRunnerJac +// ***************************** + + template + AuctionRunnerJac::AuctionRunnerJac(const PointContainer& A, + const PointContainer& B, + const AuctionParams& params, + const std::string &_log_filename_prefix + ) : + bidders(A), + items(B), + num_bidders(A.size()), + num_items(A.size()), + items_to_bidders(A.size(), k_invalid_index), + bidders_to_items(A.size(), k_invalid_index), + wasserstein_power(params.wasserstein_power), + delta(params.delta), + internal_p(params.internal_p), + initial_epsilon(params.initial_epsilon), + epsilon_common_ratio(params.epsilon_common_ratio == 0.0 ? 5.0 : params.epsilon_common_ratio), + max_num_phases(params.max_num_phases), + bid_table(A.size(), std::make_pair(k_invalid_index, k_lowest_bid_value)), + oracle(bidders, items, params), + max_bids_per_round(params.max_bids_per_round), + dimension(params.dim), +#ifndef WASSERSTEIN_PURE_GEOM + total_items_persistence(std::accumulate(items.begin(), + items.end(), + R(0.0), + [params](const Real &ps, const DgmPoint &item) { + return ps + std::pow(item.persistence_lp(params.internal_p), params.wasserstein_power); + } + )), + total_bidders_persistence(std::accumulate(bidders.begin(), + bidders.end(), + R(0.0), + [params](const Real &ps, const DgmPoint &bidder) { + return ps + std::pow(bidder.persistence_lp(params.internal_p), params.wasserstein_power); + } + )), + unassigned_bidders_persistence(total_bidders_persistence), + unassigned_items_persistence(total_items_persistence), + gamma_threshold(params.gamma_threshold), +#endif + log_filename_prefix(_log_filename_prefix) + { + assert(A.size() == B.size()); + +#ifndef WASSERSTEIN_PURE_GEOM + for (const auto &p : bidders) { + if (p.is_normal()) { + num_normal_bidders++; + num_diag_items++; + } else { + num_normal_items++; + num_diag_bidders++; + } + } +#endif + // for experiments + unassigned_threshold = 100; + +#ifdef ORDERED_BY_PERSISTENCE + batch_size = 1000; + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders_by_persistence.insert( + std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); + } + } +#endif + +#ifdef LOG_AUCTION + parallel_threshold = 16; + console_logger = spdlog::get("console"); + if (not console_logger) { + console_logger = spdlog::stdout_logger_st("console"); + } + console_logger->set_pattern("[%H:%M:%S.%e] %v"); +#ifdef ORDERED_BY_PERSISTENCE + if (max_bids_per_round == 1) { + console_logger->info("Gauss-Seidel imitated by Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3} ORDERED_BY_PERSISTENCE", + wasserstein_power, + max_bids_per_round, + gamma_threshold, + diag_first, + batch_size); + } else { + console_logger->info("Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3} ORDERED_BY_PERSISTENCE", + wasserstein_power, + max_bids_per_round, + gamma_threshold, + diag_first, + batch_size); + } + +#else + if (max_bids_per_round == 1) { + console_logger->info( + "Gauss-Seidel imitated by Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3}", + wasserstein_power, + max_bids_per_round, + gamma_threshold, + diag_first, + batch_size); + } else { + console_logger->info( + "Jacobi runner, q = {0}, max_bids_per_round = {1}, batch_size = {4}, gamma_threshold = {2}, diag_first = {3}", + wasserstein_power, + max_bids_per_round, + gamma_threshold, + diag_first, + batch_size); + } +#endif + + plot_logger_file_name = log_filename_prefix + "_plot.txt"; + plot_logger = spdlog::get(plot_logger_name); + if (not plot_logger) { + plot_logger = spdlog::basic_logger_st(plot_logger_name, plot_logger_file_name); + } + plot_logger->info("New plot starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + plot_logger->set_pattern("%v"); + + price_stat_logger_file_name = log_filename_prefix + "_price_change_stat"; + price_stat_logger = spdlog::get(price_state_logger_name); + if (not price_stat_logger) { + price_stat_logger = spdlog::basic_logger_st(price_state_logger_name, + price_stat_logger_file_name); + } + price_stat_logger->info( + "New price statistics starts here, diagram size = {0}, gamma_threshold = {1}, epsilon_common_ratio = {2}", + bidders.size(), + gamma_threshold, + epsilon_common_ratio); + price_stat_logger->set_pattern("%v"); +#endif + } + +#ifndef WASSERSTEIN_PURE_GEOM + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_cost_to_diagonal(const DgmPoint &pt) const { + return std::pow(pt.persistence_lp(internal_p), wasserstein_power); + } + + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_gamma() const { + return std::pow(std::fabs(unassigned_items_persistence + unassigned_bidders_persistence), + 1.0 / wasserstein_power); + } +#endif + + template + void AuctionRunnerJac::assign_item_to_bidder(IdxType item_idx, IdxType bidder_idx) + { + //sanity_check(); + // only unassigned bidders submit bids + assert(bidders_to_items[bidder_idx] == k_invalid_index); + + IdxType old_item_owner = items_to_bidders[item_idx]; + + // set new owner + bidders_to_items[bidder_idx] = item_idx; + items_to_bidders[item_idx] = bidder_idx; + + // remove bidder and item from the sets of unassigned bidders/items + remove_unassigned_bidder(bidder_idx); + + if (k_invalid_index != old_item_owner) { + // old owner of item becomes unassigned + bidders_to_items[old_item_owner] = k_invalid_index; + add_unassigned_bidder(old_item_owner); + // existing edge was removed, decrease partial_cost + partial_cost -= get_item_bidder_cost(item_idx, old_item_owner); + } else { + // item was unassigned before + remove_unassigned_item(item_idx); + } + + // new edge was added to matching, increase partial cost + partial_cost += get_item_bidder_cost(item_idx, bidder_idx); + +#ifdef LOG_AUCTION + if (is_item_diagonal(item_idx)) { + num_diag_assignments++; + num_diag_assignments_non_cumulative++; + } else { + num_normal_assignments++; + num_normal_assignments_non_cumulative++; + } + + if (k_invalid_index != old_item_owner) { + if (is_bidder_diagonal(bidder_idx) and is_bidder_diagonal(old_item_owner)) { + num_diag_stole_from_diag++; + } + } +#endif + + //sanity_check(); + } + + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx) const + { + return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension), + wasserstein_power); + } + + template + void AuctionRunnerJac::assign_to_best_bidder(IdxType item_idx) { + assert(item_idx >= 0 and item_idx < static_cast(num_items)); + assert(bid_table[item_idx].first != k_invalid_index); + IdxValPairR best_bid{bid_table[item_idx]}; + assign_item_to_bidder(item_idx, best_bid.first); + oracle.set_price(item_idx, best_bid.second); +#ifdef LOG_AUCTION + + if (is_step_parallel) { + num_parallel_assignments++; + } + num_total_assignments++; + + price_change_cnt_vec.back()[item_idx]++; +#endif + } + + template + void AuctionRunnerJac::clear_bid_table() { + auto iter = items_with_bids.begin(); + while (iter != items_with_bids.end()) { + auto item_with_bid_idx = *iter; + bid_table[item_with_bid_idx].first = k_invalid_index; + bid_table[item_with_bid_idx].second = k_lowest_bid_value; + iter = items_with_bids.erase(iter); + } + } + + template + void AuctionRunnerJac::submit_bid(IdxType bidder_idx, const IdxValPairR &bid) { + IdxType item_idx = bid.first; + Real bid_value = bid.second; + assert(item_idx >= 0); + if (bid_table[item_idx].second < bid_value) { + bid_table[item_idx].first = bidder_idx; + bid_table[item_idx].second = bid_value; + } + items_with_bids.insert(item_idx); + +#ifdef LOG_AUCTION + + num_total_bids++; + + + if (is_bidder_diagonal(bidder_idx)) { + num_diag_bids_submitted++; + } else { + num_normal_bids_submitted++; + } +#endif + } + + template + void AuctionRunnerJac::print_debug() { +#ifdef DEBUG_AUCTION + sanity_check(); + std::cout << "**********************" << std::endl; + std::cout << "Current assignment:" << std::endl; + for(size_t idx = 0; idx < bidders_to_items.size(); ++idx) { + std::cout << idx << " <--> " << bidders_to_items[idx] << std::endl; + } + std::cout << "Weights: " << std::endl; + //for(size_t i = 0; i < num_bidders; ++i) { + //for(size_t j = 0; j < num_items; ++j) { + //std::cout << oracle.weight_matrix[i][j] << " "; + //} + //std::cout << std::endl; + //} + std::cout << "Prices: " << std::endl; + for(const auto price : oracle.get_prices()) { + std::cout << price << std::endl; + } + //std::cout << "Value matrix: " << std::endl; + //for(size_t i = 0; i < num_bidders; ++i) { + //for(size_t j = 0; j < num_items; ++j) { + //std::cout << oracle.weight_matrix[i][j] - oracle.prices[j] << " "; + //} + //std::cout << std::endl; + //} + std::cout << "**********************" << std::endl; +#endif + } + + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_relative_error(const bool debug_output) const + { + if (partial_cost == 0.0 and unassigned_bidders.empty()) + return 0.0; + Real result; +#ifndef WASSERSTEIN_PURE_GEOM + Real gamma = get_gamma(); +#else + Real gamma = 0.0; +#endif + // cost minus n epsilon + Real reduced_cost = partial_cost - num_bidders * get_epsilon(); + if (reduced_cost < 0) { +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->info("Epsilon too large, reduced_cost = {0}, gamma = {1}", reduced_cost, gamma); + } +#endif + result = k_max_relative_error; + } else { + Real denominator = std::pow(reduced_cost, 1.0 / wasserstein_power) - gamma; + if (denominator <= 0) { +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->info("Epsilon too large, reduced_cost = {0}, denominator = {1}, gamma = {2}", + reduced_cost, denominator, gamma); + } +#endif + result = k_max_relative_error; + } else { + Real numerator = 2 * gamma + + std::pow(partial_cost, 1.0 / wasserstein_power) - + std::pow(reduced_cost, 1.0 / wasserstein_power); + + result = numerator / denominator; +#ifdef LOG_AUCTION + if (debug_output) { + console_logger->info( + "Reduced_cost = {0}, denominator = {1}, numerator {2}, error = {3}, gamma = {4}", + reduced_cost, + denominator, + numerator, + result, + gamma); + } +#endif + } + } + return result; + } + + template + void AuctionRunnerJac::flush_assignment() { + for (auto &b2i : bidders_to_items) { + b2i = k_invalid_index; + } + for (auto &i2b : items_to_bidders) { + i2b = k_invalid_index; + } + + // all bidders and items become unassigned + for (size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + unassigned_bidders.insert(bidder_idx); + } + +#ifdef ORDERED_BY_PERSISTENCE + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders_by_persistence.insert( + std::make_pair(bidders[bidder_idx].persistence_lp(1.0), bidder_idx)); + } + } +#endif + oracle.adjust_prices(); + + partial_cost = 0.0; + + +#ifndef WASSERSTEIN_PURE_GEOM + for (size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders.insert(bidder_idx); + } else { + unassigned_diag_bidders.insert(bidder_idx); + } + } + + unassigned_bidders_persistence = total_bidders_persistence; + unassigned_items_persistence = total_items_persistence; + +#ifdef LOG_AUCTION + + price_change_cnt_vec.push_back(std::vector(num_items, 0)); + + never_assigned_bidders = unassigned_bidders; + + for (size_t item_idx = 0; item_idx < items.size(); ++item_idx) { + unassigned_items.insert(item_idx); + if (is_item_normal(item_idx)) { + unassigned_normal_items.insert(item_idx); + } else { + unassigned_diag_items.insert(item_idx); + } + } + + num_diag_bids_submitted = 0; + num_normal_bids_submitted = 0; + num_diag_assignments = 0; + num_normal_assignments = 0; + + all_assigned_round = 0; + all_assigned_round_found = false; + num_rounds_non_cumulative = 0; +#endif +#endif + + } // flush_assignment + + + template + void AuctionRunnerJac::set_epsilon(Real new_val) { + assert(new_val > 0.0); + epsilon = new_val; + oracle.set_epsilon(new_val); + } + + template + void AuctionRunnerJac::run_auction_phases(const int max_num_phases, const Real _initial_epsilon) { + set_epsilon(_initial_epsilon); + assert(oracle.get_epsilon() > 0); + for (int phase_num = 0; phase_num < max_num_phases; ++phase_num) { + flush_assignment(); + run_auction_phase(); + +#ifdef LOG_AUCTION + console_logger->info( + "Phase {0} done, current_result = {1}, eps = {2}, error = {7}, num_rounds = {3}, num_assignments = {4}, num_bids_submitted = {5}, # unassigned = {6}", + num_phase, + partial_cost, + get_epsilon(), + format_int<>(num_rounds), + format_int<>(num_normal_assignments + num_diag_assignments), + format_int<>(num_normal_bids_submitted + num_diag_bids_submitted), + unassigned_bidders.size(), + get_relative_error(num_phase == 1) + ); + +// console_logger->info("num_rounds (non-cumulative)= {0}, num_diag_assignments = {1}, num_normal_assignments = {2}, num_diag_bids_submitted = {3}, num_normal_bids_submitted = {4}", +// format_int<>(num_rounds_non_cumulative), +// format_int<>(num_diag_assignments), +// format_int<>(num_normal_assignments), +// format_int<>(num_diag_bids_submitted), +// format_int<>(num_normal_bids_submitted) +// ); + + console_logger->info( + "num_parallel_bids / num_total_bids = {0} / {1} = {2}, num_parallel_assignments / num_total_aassignments = {3} / {4} = {5}", + format_int<>(num_parallel_bids), + format_int<>(num_total_bids), + static_cast(num_parallel_bids) / static_cast(num_total_bids), + format_int<>(num_parallel_assignments), + format_int<>(num_total_assignments), + static_cast(num_parallel_assignments) / static_cast(num_total_assignments) + ); + + console_logger->info( + "num_parallel_diag_bids / num_total_diag_bids = {0} / {1} = {2}, num_parallel_normal_bids / num_total_normal_bids = {3} / {4} = {5}", + format_int<>(num_parallel_diag_bids), + format_int<>(num_total_diag_bids), + static_cast(num_parallel_diag_bids) / static_cast(num_total_diag_bids), + format_int<>(num_parallel_normal_bids), + format_int<>(num_total_normal_bids), + static_cast(num_parallel_normal_bids) / static_cast(num_total_normal_bids) + ); + +// console_logger->info("num_rounds before all biders assigned = {0}, num_rounds (non-cumulative)= {1}, fraction = {2}", +// format_int<>(all_assigned_round), +// format_int<>(num_rounds_non_cumulative), +// static_cast(all_assigned_round) / static_cast(num_rounds_non_cumulative) +// ); + + for (size_t item_idx = 0; item_idx < num_items; ++item_idx) { + price_stat_logger->info("{0} {1} {2} {3} {4}", + phase_num, + item_idx, + items[item_idx][0], + items[item_idx][1], + price_change_cnt_vec.back()[item_idx] + ); + } +#endif + + + if (is_done()) + break; + else + decrease_epsilon(); + + } + } + + template + void AuctionRunnerJac::decrease_epsilon() { + set_epsilon(get_epsilon() / epsilon_common_ratio); + } + + template + void AuctionRunnerJac::run_auction() + { + if (num_bidders == 1) { + assign_item_to_bidder(0, 0); + wasserstein_cost = get_item_bidder_cost(0,0); + is_distance_computed = true; + return; + } + R init_eps = (initial_epsilon > 0.0) ? initial_epsilon : oracle.max_val_ / 4.0; + run_auction_phases(max_num_phases, init_eps); + is_distance_computed = true; + wasserstein_cost = partial_cost; + if (not is_done()) { +#ifndef FOR_R_TDA + std::cerr << "Maximum iteration number exceeded, exiting. Current result is: "; + std::cerr << get_wasserstein_distance() << std::endl; +#endif + throw std::runtime_error("Maximum iteration number exceeded"); + } + } + + template + void AuctionRunnerJac::add_unassigned_bidder(const size_t bidder_idx) + { + unassigned_bidders.insert(bidder_idx); + +#ifndef WASSERSTEIN_PURE_GEOM + const auto &bidder = bidders[bidder_idx]; + unassigned_bidders_persistence += get_cost_to_diagonal(bidder); + + if (is_bidder_diagonal(bidder_idx)) { + unassigned_diag_bidders.insert(bidder_idx); + } else { + unassigned_normal_bidders.insert(bidder_idx); + } +#ifdef ORDERED_BY_PERSISTENCE + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders_by_persistence.insert(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); + } +#endif + +#endif + } + + template + void AuctionRunnerJac::remove_unassigned_bidder(const size_t bidder_idx) + { + unassigned_bidders.erase(bidder_idx); +#ifndef WASSERSTEIN_PURE_GEOM + const auto &bidder = bidders[bidder_idx]; + unassigned_bidders_persistence -= get_cost_to_diagonal(bidder); + +#ifdef ORDERED_BY_PERSISTENCE + if (is_bidder_normal(bidder_idx)) { + unassigned_normal_bidders_by_persistence.erase(std::make_pair(bidder.persistence_lp(1.0), bidder_idx)); + } +#endif + + if (is_bidder_diagonal(bidder_idx)) { + unassigned_diag_bidders.erase(bidder_idx); + } else { + unassigned_normal_bidders.erase(bidder_idx); + } + + +#ifdef LOG_AUCTION + never_assigned_bidders.erase(bidder_idx); + if (never_assigned_bidders.empty() and not all_assigned_round_found) { + all_assigned_round = num_rounds_non_cumulative; + all_assigned_round_found = true; + } +#endif +#endif + } + + template + void AuctionRunnerJac::remove_unassigned_item(const size_t item_idx) { +#ifndef WASSERSTEIN_PURE_GEOM + unassigned_items_persistence -= get_cost_to_diagonal(items[item_idx]); + +#ifdef LOG_AUCTION + unassigned_items.erase(item_idx); + + if (is_item_normal(item_idx)) { + unassigned_normal_items.erase(item_idx); + } else { + unassigned_diag_items.erase(item_idx); + } +#endif +#endif + } + + template + template + void AuctionRunnerJac::run_bidding_step(const Range &active_bidders) + { +#ifdef LOG_AUCTION + is_step_parallel = false; + size_t diag_bids_submitted = 0; + size_t normal_bids_submitted = 0; +#endif + + clear_bid_table(); + size_t bids_submitted = 0; + for (const auto bidder_idx : active_bidders) { + + ++bids_submitted; + + submit_bid(bidder_idx, oracle.get_optimal_bid(bidder_idx)); + +#ifdef LOG_AUCTION + if (is_bidder_diagonal(bidder_idx)) { + diag_bids_submitted++; + } else { + normal_bids_submitted++; + } + + if (bids_submitted >= parallel_threshold) { + is_step_parallel = true; + } + + if (bids_submitted >= max_bids_per_round) { + break; + } + if (diag_first and not unassigned_diag_bidders.empty() and + diag_bids_submitted >= oracle.get_heap_top_size()) { + continue; + } +#endif + } + +#ifdef LOG_AUCTION + num_total_diag_bids += diag_bids_submitted; + num_total_normal_bids += normal_bids_submitted; + if (is_step_parallel) { + num_parallel_bids += bids_submitted; + num_parallel_diag_bids += diag_bids_submitted; + num_parallel_normal_bids += normal_bids_submitted; + } +#endif + } + + template + bool AuctionRunnerJac::is_done() const + { + return get_relative_error() <= delta; + } + + template + bool AuctionRunnerJac::continue_auction_phase() const + { +#ifdef WASSERSTEIN_PURE_GEOM + return not unassigned_bidders.empty(); +#else + return not unassigned_bidders.empty() and not is_done(); +#endif + } + + template + void AuctionRunnerJac::run_auction_phase() + { + num_phase++; + //console_logger->debug("Entered run_auction_phase"); + + do { + num_rounds++; +#ifdef LOG_AUCTION + num_diag_stole_from_diag = 0; + num_normal_assignments_non_cumulative = 0; + num_diag_assignments_non_cumulative = 0; + num_rounds_non_cumulative++; +#endif + + // bidding +#ifdef ORDERED_BY_PERSISTENCE + if (not unassigned_diag_bidders.empty()) { + run_bidding_step(unassigned_diag_bidders); + } else { + std::vector active_bidders; + active_bidders.reserve(batch_size); + for (auto iter = unassigned_normal_bidders_by_persistence.begin(); iter != unassigned_normal_bidders_by_persistence.end(); ++iter) { + active_bidders.push_back(iter->second); + if (active_bidders.size() >= batch_size) { + break; + } + } + run_bidding_step(active_bidders); + } +#elif defined WASSERSTEIN_PURE_GEOM + run_bidding_step(unassigned_bidders); +#else + if (diag_first and not unassigned_diag_bidders.empty()) { + run_bidding_step(unassigned_diag_bidders); + } else { + run_bidding_step(unassigned_bidders); + } +#endif + + // assignment + for (auto item_idx : items_with_bids) { + assign_to_best_bidder(item_idx); + } +#ifdef LOG_AUCTION + plot_logger->info("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14}", + num_phase, + num_rounds, + unassigned_bidders.size(), + get_gamma(), + partial_cost, + oracle.get_epsilon(), + unassigned_normal_bidders.size(), + unassigned_diag_bidders.size(), + unassigned_normal_items.size(), + unassigned_diag_items.size(), + num_normal_assignments_non_cumulative, + num_diag_assignments_non_cumulative, + oracle.get_heap_top_size(), + get_relative_error(false), + num_diag_stole_from_diag + ); +#endif + //sanity_check(); + } while (continue_auction_phase()); + } + + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_wasserstein_distance() + { + assert(is_distance_computed); + return std::pow(wasserstein_cost, 1.0 / wasserstein_power); + } + + template + typename AuctionRunnerJac::Real + AuctionRunnerJac::get_wasserstein_cost() + { + assert(is_distance_computed); + return wasserstein_cost; + } + + + template + void AuctionRunnerJac::sanity_check() + { +#ifdef DEBUG_AUCTION + if (bidders_to_items.size() != num_bidders) { + std::cerr << "Wrong size of bidders_to_items, must be " << num_bidders << ", is " << bidders_to_items.size() << std::endl; + throw "Wrong size of bidders_to_items"; + } + + if (items_to_bidders.size() != num_bidders) { + std::cerr << "Wrong size of items_to_bidders, must be " << num_bidders << ", is " << items_to_bidders.size() << std::endl; + throw "Wrong size of items_to_bidders"; + } + + for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) { + if ( bidders_to_items[bidder_idx] >= 0) { + + if ( std::count(bidders_to_items.begin(), + bidders_to_items.end(), + bidders_to_items[bidder_idx]) > 1 ) { + std::cerr << "Good " << bidders_to_items[bidder_idx]; + std::cerr << " appears in bidders_to_items more than once" << std::endl; + throw "Duplicate in bidders_to_items"; + } + + if (items_to_bidders.at(bidders_to_items[bidder_idx]) != static_cast(bidder_idx)) { + std::cerr << "Inconsitency: bidder_idx = " << bidder_idx; + std::cerr << ", item_idx in bidders_to_items = "; + std::cerr << bidders_to_items[bidder_idx]; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[bidders_to_items[bidder_idx]] << std::endl; + throw "inconsistent mapping"; + } + } + } + + for(IdxType item_idx = 0; item_idx < static_cast(num_bidders); ++item_idx) { + if ( items_to_bidders[item_idx] >= 0) { + + // check for uniqueness + if ( std::count(items_to_bidders.begin(), + items_to_bidders.end(), + items_to_bidders[item_idx]) > 1 ) { + std::cerr << "Bidder " << items_to_bidders[item_idx]; + std::cerr << " appears in items_to_bidders more than once" << std::endl; + throw "Duplicate in items_to_bidders"; + } + // check for consistency + if (bidders_to_items.at(items_to_bidders[item_idx]) != static_cast(item_idx)) { + std::cerr << "Inconsitency: item_idx = " << item_idx; + std::cerr << ", bidder_idx in items_to_bidders = "; + std::cerr << items_to_bidders[item_idx]; + std::cerr << ", item_idx in bidders_to_items= "; + std::cerr << bidders_to_items[items_to_bidders[item_idx]] << std::endl; + throw "inconsistent mapping"; + } + } + } +#endif + } + + template + void AuctionRunnerJac::print_matching() { +#ifdef DEBUG_AUCTION + sanity_check(); + for(size_t bidder_idx = 0; bidder_idx < bidders_to_items.size(); ++bidder_idx) { + if (bidders_to_items[bidder_idx] >= 0) { + auto pA = bidders[bidder_idx]; + auto pB = items[bidders_to_items[bidder_idx]]; + std::cout << pA << " <-> " << pB << "+" << pow(dist_lp(pA, pB, internal_p, dimension), wasserstein_power) << std::endl; + } else { + assert(false); + } + } +#endif + } + +} // ws +} // hera + +#endif diff --git a/wasserstein/include/basic_defs_ws.h b/wasserstein/include/basic_defs_ws.h new file mode 100644 index 0000000..1712ccf --- /dev/null +++ b/wasserstein/include/basic_defs_ws.h @@ -0,0 +1,337 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef BASIC_DEFS_WS_H +#define BASIC_DEFS_WS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +#ifndef FOR_R_TDA +#include "spdlog/spdlog.h" +#include "spdlog/fmt/fmt.h" +#include "spdlog/fmt/ostr.h" +#endif + +#include "hera_infinity.h" +#include "dnn/geometry/euclidean-dynamic.h" +#include "def_debug_ws.h" + +#define MIN_VALID_ID 10 + +namespace hera +{ + +//template +//inline bool is_infinity(const Real& x) +//{ +// return x == Real(-1); +//}; +// +//template +//inline Real get_infinity() +//{ +// return Real( -1 ); +//} + +template +inline bool is_p_valid_norm(const Real& p) +{ + return is_infinity(p) or p >= Real(1); +} + +template +struct AuctionParams +{ + Real wasserstein_power { 1.0 }; + Real delta { 0.01 }; // relative error + Real internal_p { get_infinity() }; + Real initial_epsilon { 0.0 }; // 0.0 means maxVal / 4.0 + Real epsilon_common_ratio { 5.0 }; + Real gamma_threshold { 0.0 }; // for experiments, not in use now + int max_num_phases { std::numeric_limits::max() }; + int max_bids_per_round { 1 }; // imitate Gauss-Seidel is default behaviour + unsigned int dim { 2 }; // for pure geometric version only; ignored in persistence diagrams + Real final_relative_error; // out parameter - after auction terminates, contains the real relative error + bool tolerate_max_iter_exceeded { false }; // whether auction should throw an exception on max. iterations exceeded +}; + +namespace ws +{ + + using IdxType = int; + + constexpr size_t k_invalid_index = std::numeric_limits::max(); + + template + using IdxValPair = std::pair; + + template + inline std::ostream& operator<<(std::ostream& output, const IdxValPair p) + { + output << fmt::format("({0}, {1})", p.first, p.second); + return output; + } + + enum class OwnerType { k_none, k_normal, k_diagonal }; + + inline std::ostream& operator<<(std::ostream& s, const OwnerType t) + { + switch(t) + { + case OwnerType::k_none : s << "NONE"; break; + case OwnerType::k_normal: s << "NORMAL"; break; + case OwnerType::k_diagonal: s << "DIAGONAL"; break; + } + return s; + } + + template + struct Point { + Real x, y; + bool operator==(const Point& other) const; + bool operator!=(const Point& other) const; + Point(Real _x, Real _y) : x(_x), y(_y) {} + Point() : x(0.0), y(0.0) {} + }; + +#ifndef FOR_R_TDA + template + std::ostream& operator<<(std::ostream& output, const Point p); +#endif + + template + inline void hash_combine(std::size_t & seed, const T & v) + { + std::hash hasher; + seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + } + + template + struct DiagramPoint + { + using Real = Real_; + // data members + // Points above the diagonal have type NORMAL + // Projections onto the diagonal have type DIAG + // for DIAG points only x-coordinate is relevant + enum Type { NORMAL, DIAG}; + Real x, y; + Type type; + // methods + DiagramPoint(Real xx, Real yy, Type ttype); + bool is_diagonal() const { return type == DIAG; } + bool is_normal() const { return type == NORMAL; } + Real getRealX() const; // return the x-coord + Real getRealY() const; // return the y-coord + Real persistence_lp(const Real p) const; + struct LexicographicCmp + { + bool operator()(const DiagramPoint& p1, const DiagramPoint& p2) const + { return p1.type < p2.type || (p1.type == p2.type && (p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y))); } + }; + + const Real& operator[](const int idx) const + { + switch(idx) + { + case 0 : return x; + break; + case 1 : return y; + break; + default: throw std::out_of_range("DiagramPoint has dimension 2"); + } + } + + Real& operator[](const int idx) + { + switch(idx) + { + case 0 : return x; + break; + case 1 : return y; + break; + default: throw std::out_of_range("DiagramPoint has dimension 2"); + } + } + + }; + + + template + struct DiagramPointHash { + size_t operator()(const DiagramPoint &p) const + { + std::size_t seed = 0; + hash_combine(seed, std::hash(p.x)); + hash_combine(seed, std::hash(p.y)); + hash_combine(seed, std::hash(p.is_diagonal())); + return seed; + } + }; + + +#ifndef FOR_R_TDA + template + inline std::ostream& operator<<(std::ostream& output, const DiagramPoint p); +#endif + + template + inline void format_arg(fmt::BasicFormatter &f, const char *&format_str, const DiagramPoint&p) { + if (p.is_diagonal()) { + f.writer().write("({0},{1}, DIAG)", p.x, p.y); + } else { + f.writer().write("({0},{1}, NORM)", p.x, p.y); + } + } + + + template + struct DistImpl + { + Real operator()(const Pt& a, const Pt& b, const Real p, const int dim) + { + Real result = 0.0; + if (hera::is_infinity(p)) { + for(int d = 0; d < dim; ++d) { + result = std::max(result, std::fabs(a[d] - b[d])); + } + } else if (p == 1.0) { + for(int d = 0; d < dim; ++d) { + result += std::fabs(a[d] - b[d]); + } + } else { + assert(p > 1.0); + for(int d = 0; d < dim; ++d) { + result += std::pow(std::fabs(a[d] - b[d]), p); + } + result = std::pow(result, 1.0 / p); + } + return result; + } + }; + + template + struct DistImpl> + { + Real operator()(const DiagramPoint& a, const DiagramPoint& b, const Real p, const int dim) + { + Real result = 0.0; + if ( a.is_diagonal() and b.is_diagonal()) { + return result; + } else if (hera::is_infinity(p)) { + result = std::max(std::fabs(a.getRealX() - b.getRealX()), std::fabs(a.getRealY() - b.getRealY())); + } else if (p == 1.0) { + result = std::fabs(a.getRealX() - b.getRealX()) + std::fabs(a.getRealY() - b.getRealY()); + } else { + assert(p > 1.0); + result = std::pow(std::pow(std::fabs(a.getRealX() - b.getRealX()), p) + std::pow(std::fabs(a.getRealY() - b.getRealY()), p), 1.0 / p); + } + return result; + } + }; + + template + inline R dist_lp(const Pt& a, const Pt& b, const R p, const int dim) + { + return DistImpl()(a, b, p, dim); + } + + // TODO + template + inline double getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B, const Real p) + { + int dim = 2; + Real result { 0.0 }; + DiagramPoint begA = *(A.begin()); + DiagramPoint optB = *(B.begin()); + for(const auto& pointB : B) { + if (dist_lp(begA, pointB, p, dim) > result) { + result = dist_lp(begA, pointB, p, dim); + optB = pointB; + } + } + for(const auto& pointA : A) { + if (dist_lp(pointA, optB, p, dim) > result) { + result = dist_lp(pointA, optB, p, dim); + } + } + return result; + } + + template + inline Real getFurthestDistance3Approx_pg(const hera::ws::dnn::DynamicPointVector& A, const hera::ws::dnn::DynamicPointVector& B, const Real p, const int dim) + { + Real result { 0.0 }; + int opt_b_idx = 0; + for(size_t b_idx = 0; b_idx < B.size(); ++b_idx) { + if (dist_lp(A[0], B[b_idx], p, dim) > result) { + result = dist_lp(A[0], B[b_idx], p, dim); + opt_b_idx = b_idx; + } + } + + for(size_t a_idx = 0; a_idx < A.size(); ++a_idx) { + result = std::max(result, dist_lp(A[a_idx], B[opt_b_idx], p, dim)); + } + + return result; + } + + + template + inline std::string format_container_to_log(const Container& cont); + + template + inline std::string format_point_set_to_log(const IndexContainer& indices, const std::vector>& points); + + template + inline std::string format_int(T i); + +} // ws +} // hera + + + +#include "basic_defs_ws.hpp" + + +#endif diff --git a/wasserstein/include/basic_defs_ws.hpp b/wasserstein/include/basic_defs_ws.hpp new file mode 100644 index 0000000..a1153af --- /dev/null +++ b/wasserstein/include/basic_defs_ws.hpp @@ -0,0 +1,220 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +Copyright (c) 2018, G. Spreemann +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "basic_defs_ws.h" + +#ifndef FOR_R_TDA +#include +#endif + +#include + +namespace hera { +static const int64_t DIPHA_MAGIC = 8067171840; +static const int64_t DIPHA_PERSISTENCE_DIAGRAM = 2; + +namespace ws { +// Point + +template +bool Point::operator==(const Point& other) const +{ + return ((this->x == other.x) and (this->y == other.y)); +} + +template +bool Point::operator!=(const Point& other) const +{ + return !(*this == other); +} + + +#ifndef FOR_R_TDA +template +inline std::ostream& operator<<(std::ostream& output, const Point p) +{ + output << "(" << p.x << ", " << p.y << ")"; + return output; +} +#endif + +template +inline Real sqr_dist(const Point& a, const Point& b) +{ + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); +} + +template +inline Real dist(const Point& a, const Point& b) +{ + return sqrt(sqr_dist(a, b)); +} + + +template +inline Real DiagramPoint::persistence_lp(const Real p) const +{ + if (is_diagonal()) + return 0.0; + else { + Real u { (getRealY() + getRealX())/2 }; + int dim = 2; + DiagramPoint a_proj(u, u, DiagramPoint::DIAG); + return dist_lp(*this, a_proj, p, dim); + } +} + + +#ifndef FOR_R_TDA +template +inline std::ostream& operator<<(std::ostream& output, const DiagramPoint p) +{ + if ( p.type == DiagramPoint::DIAG ) { + output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << " DIAG )"; + } else { + output << "(" << p.x << ", " << p.y << ", " << " NORMAL)"; + } + return output; +} +#endif + +template +DiagramPoint::DiagramPoint(Real xx, Real yy, Type ttype) : + x(xx), + y(yy), + type(ttype) +{ + //if ( yy < xx ) + //throw "Point is below the diagonal"; + //if ( yy == xx and ttype != DiagramPoint::DIAG) + //throw "Point on the main diagonal must have DIAG type"; +} + +template +Real DiagramPoint::getRealX() const +{ + if (is_normal()) + return x; + else + return Real(0.5) * (x + y); +} + +template +Real DiagramPoint::getRealY() const +{ + if (is_normal()) + return y; + else + return Real(0.5) * (x + y); +} + +template +inline std::string format_container_to_log(const Container& cont) +{ + std::stringstream result; + result << "["; + for(auto iter = cont.begin(); iter != cont.end(); ++iter) { + result << *iter; + if (std::next(iter) != cont.end()) { + result << ", "; + } + } + result << "]"; + return result.str(); +} + +template +inline std::string format_pair_container_to_log(const Container& cont) +{ + std::stringstream result; + result << "["; + for(auto iter = cont.begin(); iter != cont.end(); ++iter) { + result << "(" << iter->first << ", " << iter->second << ")"; + if (std::next(iter) != cont.end()) { + result << ", "; + } + } + result << "]"; + return result.str(); +} + + +template +inline std::string format_point_set_to_log(const IndexContainer& indices, + const std::vector>& points) +{ + std::stringstream result; + result << "["; + for(auto iter = indices.begin(); iter != indices.end(); ++iter) { + DiagramPoint p = points[*iter]; + result << "(" << p.getRealX() << ", " << p.getRealY() << ")"; + if (std::next(iter) != indices.end()) + result << ", "; + } + result << "]"; + return result.str(); +} + +template +inline std::string format_int(T i) +{ + std::stringstream ss; + ss.imbue(std::locale("")); + ss << std::fixed << i; + return ss.str(); +} + + +} // end of namespace ws + + +template inline void reverse_endianness(T & x) +{ + uint8_t * p = reinterpret_cast(&x); + std::reverse(p, p + sizeof(T)); +} + +template inline T read_le(std::istream & s) +{ + T result; + s.read(reinterpret_cast(&result), sizeof(T)); + #ifdef BIGENDIAN + reverse_endianness(result); + #endif + return result; +} + +} // hera diff --git a/wasserstein/include/catch/catch.hpp b/wasserstein/include/catch/catch.hpp new file mode 100644 index 0000000..f7681f4 --- /dev/null +++ b/wasserstein/include/catch/catch.hpp @@ -0,0 +1,11545 @@ +/* + * Catch v1.9.6 + * Generated: 2017-06-27 12:19:54.557875 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + +#define TWOBLUECUBES_CATCH_HPP_INCLUDED + +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + +// #included from: internal/catch_suppress_warnings.h + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic ignored "-Wglobal-constructors" +# pragma clang diagnostic ignored "-Wvariadic-macros" +# pragma clang diagnostic ignored "-Wc99-extensions" +# pragma clang diagnostic ignored "-Wunused-variable" +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wc++98-compat" +# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic ignored "-Wvariadic-macros" +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wparentheses" + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpadded" +#endif +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL +#endif + +#ifdef CATCH_IMPL +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// #included from: internal/catch_notimplemented_exception.h +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED + +// #included from: catch_common.h +#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED + +// #included from: catch_compiler_capabilities.h +#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED + +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? +// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported +// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? +// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? +// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) +// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? +// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? + +// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_ form +// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 + +#ifdef __cplusplus + +# if __cplusplus >= 201103L +# define CATCH_CPP11_OR_GREATER +# endif + +# if __cplusplus >= 201402L +# define CATCH_CPP14_OR_GREATER +# endif + +#endif + +#ifdef __clang__ + +# if __has_feature(cxx_nullptr) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# if __has_feature(cxx_noexcept) +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# endif + +# if defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic pop" ) + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic pop" ) +# endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# endif + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE + +#endif // __CYGWIN__ + +//////////////////////////////////////////////////////////////////////////////// +// Borland +#ifdef __BORLANDC__ + +#endif // __BORLANDC__ + +//////////////////////////////////////////////////////////////////////////////// +// EDG +#ifdef __EDG_VERSION__ + +#endif // __EDG_VERSION__ + +//////////////////////////////////////////////////////////////////////////////// +// Digital Mars +#ifdef __DMC__ + +#endif // __DMC__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH + +#if (_MSC_VER >= 1600) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS +#endif + +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// + +// Use variadic macros if the compiler supports them +#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ + ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ + ( defined __GNUC__ && __GNUC__ >= 3 ) || \ + ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) + +#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS + +#endif + +// Use __COUNTER__ if the compiler supports it +#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ + ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \ + ( defined __clang__ && __clang_major__ >= 3 ) + +#define CATCH_INTERNAL_CONFIG_COUNTER + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// catch all support for C++11 +#if defined(CATCH_CPP11_OR_GREATER) + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# endif + +# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) +# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) +# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) +# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) +# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS +# endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NULLPTR +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_IS_ENUM +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TUPLE +#endif +#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) +# define CATCH_CONFIG_VARIADIC_MACROS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_LONG_LONG +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_UNIQUE_PTR +#endif +// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for +// analytics) because, at time of writing, __COUNTER__ is not properly handled by it. +// This does not affect compilation +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_SHUFFLE +#endif +# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TYPE_TRAITS +# endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS +#endif + +// noexcept support: +#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) +# define CATCH_NOEXCEPT noexcept +# define CATCH_NOEXCEPT_IS(x) noexcept(x) +#else +# define CATCH_NOEXCEPT throw() +# define CATCH_NOEXCEPT_IS(x) +#endif + +// nullptr support +#ifdef CATCH_CONFIG_CPP11_NULLPTR +# define CATCH_NULL nullptr +#else +# define CATCH_NULL NULL +#endif + +// override support +#ifdef CATCH_CONFIG_CPP11_OVERRIDE +# define CATCH_OVERRIDE override +#else +# define CATCH_OVERRIDE +#endif + +// unique_ptr support +#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR +# define CATCH_AUTO_PTR( T ) std::unique_ptr +#else +# define CATCH_AUTO_PTR( T ) std::auto_ptr +#endif + +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr +#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) + +#include +#include + +namespace Catch { + + struct IConfig; + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + + class NonCopyable { +#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; +#else + NonCopyable( NonCopyable const& info ); + NonCopyable& operator = ( NonCopyable const& ); +#endif + + protected: + NonCopyable() {} + virtual ~NonCopyable(); + }; + + class SafeBool { + public: + typedef void (SafeBool::*type)() const; + + static type makeSafe( bool value ) { + return value ? &SafeBool::trueValue : 0; + } + private: + void trueValue() const {} + }; + + template + inline void deleteAll( ContainerT& container ) { + typename ContainerT::const_iterator it = container.begin(); + typename ContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete *it; + } + template + inline void deleteAllValues( AssociativeContainerT& container ) { + typename AssociativeContainerT::const_iterator it = container.begin(); + typename AssociativeContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete it->second; + } + + bool startsWith( std::string const& s, std::string const& prefix ); + bool startsWith( std::string const& s, char prefix ); + bool endsWith( std::string const& s, std::string const& suffix ); + bool endsWith( std::string const& s, char suffix ); + bool contains( std::string const& s, std::string const& infix ); + void toLowerInPlace( std::string& s ); + std::string toLower( std::string const& s ); + std::string trim( std::string const& str ); + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); + + struct pluralise { + pluralise( std::size_t count, std::string const& label ); + + friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); + + std::size_t m_count; + std::string m_label; + }; + + struct SourceLineInfo { + + SourceLineInfo(); + SourceLineInfo( char const* _file, std::size_t _line ); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + SourceLineInfo(SourceLineInfo const& other) = default; + SourceLineInfo( SourceLineInfo && ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo& operator = ( SourceLineInfo && ) = default; +# endif + bool empty() const; + bool operator == ( SourceLineInfo const& other ) const; + bool operator < ( SourceLineInfo const& other ) const; + + char const* file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // This is just here to avoid compiler warnings with macro constants and boolean literals + inline bool isTrue( bool value ){ return value; } + inline bool alwaysTrue() { return true; } + inline bool alwaysFalse() { return false; } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); + + void seedRng( IConfig const& config ); + unsigned int rngSeed(); + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() { + return std::string(); + } + }; + template + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) +#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); + +namespace Catch { + + class NotImplementedException : public std::exception + { + public: + NotImplementedException( SourceLineInfo const& lineInfo ); + NotImplementedException( NotImplementedException const& ) {} + + virtual ~NotImplementedException() CATCH_NOEXCEPT {} + + virtual const char* what() const CATCH_NOEXCEPT; + + private: + std::string m_what; + SourceLineInfo m_lineInfo; + }; + +} // end namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) + +// #included from: internal/catch_context.h +#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED + +// #included from: catch_interfaces_generators.h +#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED + +#include + +namespace Catch { + + struct IGeneratorInfo { + virtual ~IGeneratorInfo(); + virtual bool moveNext() = 0; + virtual std::size_t getCurrentIndex() const = 0; + }; + + struct IGeneratorsForTest { + virtual ~IGeneratorsForTest(); + + virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; + virtual bool moveNext() = 0; + }; + + IGeneratorsForTest* createGeneratorsForTest(); + +} // end namespace Catch + +// #included from: catch_ptr.hpp +#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + // An intrusive reference counting smart pointer. + // T must implement addRef() and release() methods + // typically implementing the IShared interface + template + class Ptr { + public: + Ptr() : m_p( CATCH_NULL ){} + Ptr( T* p ) : m_p( p ){ + if( m_p ) + m_p->addRef(); + } + Ptr( Ptr const& other ) : m_p( other.m_p ){ + if( m_p ) + m_p->addRef(); + } + ~Ptr(){ + if( m_p ) + m_p->release(); + } + void reset() { + if( m_p ) + m_p->release(); + m_p = CATCH_NULL; + } + Ptr& operator = ( T* p ){ + Ptr temp( p ); + swap( temp ); + return *this; + } + Ptr& operator = ( Ptr const& other ){ + Ptr temp( other ); + swap( temp ); + return *this; + } + void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } + T* get() const{ return m_p; } + T& operator*() const { return *m_p; } + T* operator->() const { return m_p; } + bool operator !() const { return m_p == CATCH_NULL; } + operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } + + private: + T* m_p; + }; + + struct IShared : NonCopyable { + virtual ~IShared(); + virtual void addRef() const = 0; + virtual void release() const = 0; + }; + + template + struct SharedImpl : T { + + SharedImpl() : m_rc( 0 ){} + + virtual void addRef() const { + ++m_rc; + } + virtual void release() const { + if( --m_rc == 0 ) + delete this; + } + + mutable unsigned int m_rc; + }; + +} // end namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +namespace Catch { + + class TestCase; + class Stream; + struct IResultCapture; + struct IRunner; + struct IGeneratorsForTest; + struct IConfig; + + struct IContext + { + virtual ~IContext(); + + virtual IResultCapture* getResultCapture() = 0; + virtual IRunner* getRunner() = 0; + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; + virtual bool advanceGeneratorsForCurrentTest() = 0; + virtual Ptr getConfig() const = 0; + }; + + struct IMutableContext : IContext + { + virtual ~IMutableContext(); + virtual void setResultCapture( IResultCapture* resultCapture ) = 0; + virtual void setRunner( IRunner* runner ) = 0; + virtual void setConfig( Ptr const& config ) = 0; + }; + + IContext& getCurrentContext(); + IMutableContext& getCurrentMutableContext(); + void cleanUpContext(); + Stream createStream( std::string const& streamName ); + +} + +// #included from: internal/catch_test_registry.hpp +#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED + +// #included from: catch_interfaces_testcase.h +#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED + +#include + +namespace Catch { + + class TestSpec; + + struct ITestCase : IShared { + virtual void invoke () const = 0; + protected: + virtual ~ITestCase(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector const& getAllTests() const = 0; + virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; + }; + + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector const& getAllTestCasesSorted( IConfig const& config ); + +} + +namespace Catch { + +template +class MethodTestCase : public SharedImpl { + +public: + MethodTestCase( void (C::*method)() ) : m_method( method ) {} + + virtual void invoke() const { + C obj; + (obj.*m_method)(); + } + +private: + virtual ~MethodTestCase() {} + + void (C::*m_method)(); +}; + +typedef void(*TestFunction)(); + +struct NameAndDesc { + NameAndDesc( const char* _name = "", const char* _description= "" ) + : name( _name ), description( _description ) + {} + + const char* name; + const char* description; +}; + +void registerTestCase + ( ITestCase* testCase, + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ); + +struct AutoReg { + + AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + + template + AutoReg + ( void (C::*method)(), + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + + registerTestCase + ( new MethodTestCase( method ), + className, + nameAndDesc, + lineInfo ); + } + + ~AutoReg(); + +private: + AutoReg( AutoReg const& ); + void operator= ( AutoReg const& ); +}; + +void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( ... ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ \ + struct TestName : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +#else + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ \ + struct TestCaseName : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + } \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestCaseName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +#endif + +// #included from: internal/catch_capture.hpp +#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED + +// #included from: catch_result_builder.h +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED + +// #included from: catch_result_type.h +#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED + +namespace Catch { + + // ResultWas::OfType enum + struct ResultWas { enum OfType { + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, + + FailureBit = 0x10, + + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, + + Exception = 0x100 | FailureBit, + + ThrewException = Exception | 1, + DidntThrowException = Exception | 2, + + FatalErrorCondition = 0x200 | FailureBit + + }; }; + + inline bool isOk( ResultWas::OfType resultType ) { + return ( resultType & ResultWas::FailureBit ) == 0; + } + inline bool isJustInfo( int flags ) { + return flags == ResultWas::Info; + } + + // ResultDisposition::Flags enum + struct ResultDisposition { enum Flags { + Normal = 0x01, + + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test + }; }; + + inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { + return static_cast( static_cast( lhs ) | static_cast( rhs ) ); + } + + inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } + inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } + inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } + +} // end namespace Catch + +// #included from: catch_assertionresult.h +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED + +#include + +namespace Catch { + + struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; + + struct DecomposedExpression + { + virtual ~DecomposedExpression() {} + virtual bool isBinaryExpression() const { + return false; + } + virtual void reconstructExpression( std::string& dest ) const = 0; + + // Only simple binary comparisons can be decomposed. + // If more complex check is required then wrap sub-expressions in parentheses. + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); + template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); + + private: + DecomposedExpression& operator = (DecomposedExpression const&); + }; + + struct AssertionInfo + { + AssertionInfo() {} + AssertionInfo( char const * _macroName, + SourceLineInfo const& _lineInfo, + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg = ""); + + char const * macroName; + SourceLineInfo lineInfo; + char const * capturedExpression; + ResultDisposition::Flags resultDisposition; + char const * secondArg; + }; + + struct AssertionResultData + { + AssertionResultData() : decomposedExpression( CATCH_NULL ) + , resultType( ResultWas::Unknown ) + , negated( false ) + , parenthesized( false ) {} + + void negate( bool parenthesize ) { + negated = !negated; + parenthesized = parenthesize; + if( resultType == ResultWas::Ok ) + resultType = ResultWas::ExpressionFailed; + else if( resultType == ResultWas::ExpressionFailed ) + resultType = ResultWas::Ok; + } + + std::string const& reconstructExpression() const { + if( decomposedExpression != CATCH_NULL ) { + decomposedExpression->reconstructExpression( reconstructedExpression ); + if( parenthesized ) { + reconstructedExpression.insert( 0, 1, '(' ); + reconstructedExpression.append( 1, ')' ); + } + if( negated ) { + reconstructedExpression.insert( 0, 1, '!' ); + } + decomposedExpression = CATCH_NULL; + } + return reconstructedExpression; + } + + mutable DecomposedExpression const* decomposedExpression; + mutable std::string reconstructedExpression; + std::string message; + ResultWas::OfType resultType; + bool negated; + bool parenthesized; + }; + + class AssertionResult { + public: + AssertionResult(); + AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); + ~AssertionResult(); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + AssertionResult( AssertionResult const& ) = default; + AssertionResult( AssertionResult && ) = default; + AssertionResult& operator = ( AssertionResult const& ) = default; + AssertionResult& operator = ( AssertionResult && ) = default; +# endif + + bool isOk() const; + bool succeeded() const; + ResultWas::OfType getResultType() const; + bool hasExpression() const; + bool hasMessage() const; + std::string getExpression() const; + std::string getExpressionInMacro() const; + bool hasExpandedExpression() const; + std::string getExpandedExpression() const; + std::string getMessage() const; + SourceLineInfo getSourceInfo() const; + std::string getTestMacroName() const; + void discardDecomposedExpression() const; + void expandDecomposedExpression() const; + + protected: + AssertionInfo m_info; + AssertionResultData m_resultData; + }; + +} // end namespace Catch + +// #included from: catch_matchers.hpp +#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED + +namespace Catch { +namespace Matchers { + namespace Impl { + + template struct MatchAllOf; + template struct MatchAnyOf; + template struct MatchNotOf; + + class MatcherUntypedBase { + public: + std::string toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + private: + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ); + }; + + template + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; + template + struct MatcherMethod { + virtual bool match( PtrT* arg ) const = 0; + }; + + template + struct MatcherBase : MatcherUntypedBase, MatcherMethod { + + MatchAllOf operator && ( MatcherBase const& other ) const; + MatchAnyOf operator || ( MatcherBase const& other ) const; + MatchNotOf operator ! () const; + }; + + template + struct MatchAllOf : MatcherBase { + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (!m_matchers[i]->match(arg)) + return false; + } + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " and "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAllOf& operator && ( MatcherBase const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector const*> m_matchers; + }; + template + struct MatchAnyOf : MatcherBase { + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (m_matchers[i]->match(arg)) + return true; + } + return false; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " or "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAnyOf& operator || ( MatcherBase const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector const*> m_matchers; + }; + + template + struct MatchNotOf : MatcherBase { + + MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + return !m_underlyingMatcher.match( arg ); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase const& m_underlyingMatcher; + }; + + template + MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { + return MatchAllOf() && *this && other; + } + template + MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { + return MatchAnyOf() || *this || other; + } + template + MatchNotOf MatcherBase::operator ! () const { + return MatchNotOf( *this ); + } + + } // namespace Impl + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + // - deprecated: prefer ||, && and ! + template + inline Impl::MatchNotOf Not( Impl::MatcherBase const& underlyingMatcher ) { + return Impl::MatchNotOf( underlyingMatcher ); + } + template + inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { + return Impl::MatchAllOf() && m1 && m2; + } + template + inline Impl::MatchAllOf AllOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { + return Impl::MatchAllOf() && m1 && m2 && m3; + } + template + inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2 ) { + return Impl::MatchAnyOf() || m1 || m2; + } + template + inline Impl::MatchAnyOf AnyOf( Impl::MatcherBase const& m1, Impl::MatcherBase const& m2, Impl::MatcherBase const& m3 ) { + return Impl::MatchAnyOf() || m1 || m2 || m3; + } + +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch + +namespace Catch { + + struct TestFailureException{}; + + template class ExpressionLhs; + + struct CopyableStream { + CopyableStream() {} + CopyableStream( CopyableStream const& other ) { + oss << other.oss.str(); + } + CopyableStream& operator=( CopyableStream const& other ) { + oss.str(std::string()); + oss << other.oss.str(); + return *this; + } + std::ostringstream oss; + }; + + class ResultBuilder : public DecomposedExpression { + public: + ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition, + char const* secondArg = "" ); + ~ResultBuilder(); + + template + ExpressionLhs operator <= ( T const& operand ); + ExpressionLhs operator <= ( bool value ); + + template + ResultBuilder& operator << ( T const& value ) { + m_stream().oss << value; + return *this; + } + + ResultBuilder& setResultType( ResultWas::OfType result ); + ResultBuilder& setResultType( bool result ); + + void endExpression( DecomposedExpression const& expr ); + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; + + AssertionResult build() const; + AssertionResult build( DecomposedExpression const& expr ) const; + + void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); + void captureResult( ResultWas::OfType resultType ); + void captureExpression(); + void captureExpectedException( std::string const& expectedMessage ); + void captureExpectedException( Matchers::Impl::MatcherBase const& matcher ); + void handleResult( AssertionResult const& result ); + void react(); + bool shouldDebugBreak() const; + bool allowThrows() const; + + template + void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); + + void setExceptionGuard(); + void unsetExceptionGuard(); + + private: + AssertionInfo m_assertionInfo; + AssertionResultData m_data; + + static CopyableStream &m_stream() + { + static CopyableStream s; + return s; + } + + bool m_shouldDebugBreak; + bool m_shouldThrow; + bool m_guardException; + }; + +} // namespace Catch + +// Include after due to circular dependency: +// #included from: catch_expression_lhs.hpp +#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED + +// #included from: catch_evaluate.hpp +#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) +#endif + +#include + +namespace Catch { +namespace Internal { + + enum Operator { + IsEqualTo, + IsNotEqualTo, + IsLessThan, + IsGreaterThan, + IsLessThanOrEqualTo, + IsGreaterThanOrEqualTo + }; + + template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; + template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; + template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; + template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; + template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; + template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; + template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; + + template + inline T& opCast(T const& t) { return const_cast(t); } + +// nullptr_t support based on pull request #154 from Konstantin Baumann +#ifdef CATCH_CONFIG_CPP11_NULLPTR + inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } +#endif // CATCH_CONFIG_CPP11_NULLPTR + + // So the compare overloads can be operator agnostic we convey the operator as a template + // enum, which is used to specialise an Evaluator for doing the comparison. + template + class Evaluator{}; + + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs) { + return bool( opCast( lhs ) == opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) != opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) < opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) > opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) >= opCast( rhs ) ); + } + }; + template + struct Evaluator { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return bool( opCast( lhs ) <= opCast( rhs ) ); + } + }; + + template + bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { + return Evaluator::evaluate( lhs, rhs ); + } + + // This level of indirection allows us to specialise for integer types + // to avoid signed/ unsigned warnings + + // "base" overload + template + bool compare( T1 const& lhs, T2 const& rhs ) { + return Evaluator::evaluate( lhs, rhs ); + } + + // unsigned X to int + template bool compare( unsigned int lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned long lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned char lhs, int rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + + // unsigned X to long + template bool compare( unsigned int lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned long lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + template bool compare( unsigned char lhs, long rhs ) { + return applyEvaluator( lhs, static_cast( rhs ) ); + } + + // int to unsigned X + template bool compare( int lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( int lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( int lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // long to unsigned X + template bool compare( long lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // pointer to long (when comparing against NULL) + template bool compare( long lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, long rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } + + // pointer to int (when comparing against NULL) + template bool compare( int lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, int rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + // long long to unsigned X + template bool compare( long long lhs, unsigned int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned long long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( long long lhs, unsigned char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // unsigned long long to X + template bool compare( unsigned long long lhs, int rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, long long rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + template bool compare( unsigned long long lhs, char rhs ) { + return applyEvaluator( static_cast( lhs ), rhs ); + } + + // pointer to long long (when comparing against NULL) + template bool compare( long long lhs, T* rhs ) { + return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); + } + template bool compare( T* lhs, long long rhs ) { + return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); + } +#endif // CATCH_CONFIG_CPP11_LONG_LONG + +#ifdef CATCH_CONFIG_CPP11_NULLPTR + // pointer to nullptr_t (when comparing against nullptr) + template bool compare( std::nullptr_t, T* rhs ) { + return Evaluator::evaluate( nullptr, rhs ); + } + template bool compare( T* lhs, std::nullptr_t ) { + return Evaluator::evaluate( lhs, nullptr ); + } +#endif // CATCH_CONFIG_CPP11_NULLPTR + +} // end of namespace Internal +} // end of namespace Catch + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// #included from: catch_tostring.h +#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED + +#include +#include +#include +#include +#include + +#ifdef __OBJC__ +// #included from: catch_objc_arc.hpp +#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED + +#import + +#ifdef __has_feature +#define CATCH_ARC_ENABLED __has_feature(objc_arc) +#else +#define CATCH_ARC_ENABLED 0 +#endif + +void arcSafeRelease( NSObject* obj ); +id performOptionalSelector( id obj, SEL sel ); + +#if !CATCH_ARC_ENABLED +inline void arcSafeRelease( NSObject* obj ) { + [obj release]; +} +inline id performOptionalSelector( id obj, SEL sel ) { + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; + return nil; +} +#define CATCH_UNSAFE_UNRETAINED +#define CATCH_ARC_STRONG +#else +inline void arcSafeRelease( NSObject* ){} +inline id performOptionalSelector( id obj, SEL sel ) { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#endif + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + return nil; +} +#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained +#define CATCH_ARC_STRONG __strong +#endif + +#endif + +#ifdef CATCH_CONFIG_CPP11_TUPLE +#include +#endif + +#ifdef CATCH_CONFIG_CPP11_IS_ENUM +#include +#endif + +namespace Catch { + +// Why we're here. +template +std::string toString( T const& value ); + +// Built in overloads + +std::string toString( std::string const& value ); +std::string toString( std::wstring const& value ); +std::string toString( const char* const value ); +std::string toString( char* const value ); +std::string toString( const wchar_t* const value ); +std::string toString( wchar_t* const value ); +std::string toString( int value ); +std::string toString( unsigned long value ); +std::string toString( unsigned int value ); +std::string toString( const double value ); +std::string toString( const float value ); +std::string toString( bool value ); +std::string toString( char value ); +std::string toString( signed char value ); +std::string toString( unsigned char value ); + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ); +std::string toString( unsigned long long value ); +#endif + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ); +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ); + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ); + std::string toString( NSObject* const& nsObject ); +#endif + +namespace Detail { + + extern const std::string unprintableString; + + #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK) + struct BorgType { + template BorgType( T const& ); + }; + + struct TrueType { char sizer[1]; }; + struct FalseType { char sizer[2]; }; + + TrueType& testStreamable( std::ostream& ); + FalseType testStreamable( FalseType ); + + FalseType operator<<( std::ostream const&, BorgType const& ); + + template + struct IsStreamInsertable { + static std::ostream &s; + static T const&t; + enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; + }; +#else + template + class IsStreamInsertable { + template + static auto test(int) + -> decltype( std::declval() << std::declval(), std::true_type() ); + + template + static auto test(...) -> std::false_type; + + public: + static const bool value = decltype(test(0))::value; + }; +#endif + +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) + template::value + > + struct EnumStringMaker + { + static std::string convert( T const& ) { return unprintableString; } + }; + + template + struct EnumStringMaker + { + static std::string convert( T const& v ) + { + return ::Catch::toString( + static_cast::type>(v) + ); + } + }; +#endif + template + struct StringMakerBase { +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) + template + static std::string convert( T const& v ) + { + return EnumStringMaker::convert( v ); + } +#else + template + static std::string convert( T const& ) { return unprintableString; } +#endif + }; + + template<> + struct StringMakerBase { + template + static std::string convert( T const& _value ) { + std::ostringstream oss; + oss << _value; + return oss.str(); + } + }; + + std::string rawMemoryToString( const void *object, std::size_t size ); + + template + inline std::string rawMemoryToString( const T& object ) { + return rawMemoryToString( &object, sizeof(object) ); + } + +} // end namespace Detail + +template +struct StringMaker : + Detail::StringMakerBase::value> {}; + +template +struct StringMaker { + template + static std::string convert( U* p ) { + if( !p ) + return "NULL"; + else + return Detail::rawMemoryToString( p ); + } +}; + +template +struct StringMaker { + static std::string convert( R C::* p ) { + if( !p ) + return "NULL"; + else + return Detail::rawMemoryToString( p ); + } +}; + +namespace Detail { + template + std::string rangeToString( InputIterator first, InputIterator last ); +} + +//template +//struct StringMaker > { +// static std::string convert( std::vector const& v ) { +// return Detail::rangeToString( v.begin(), v.end() ); +// } +//}; + +template +std::string toString( std::vector const& v ) { + return Detail::rangeToString( v.begin(), v.end() ); +} + +#ifdef CATCH_CONFIG_CPP11_TUPLE + +// toString for tuples +namespace TupleDetail { + template< + typename Tuple, + std::size_t N = 0, + bool = (N < std::tuple_size::value) + > + struct ElementPrinter { + static void print( const Tuple& tuple, std::ostream& os ) + { + os << ( N ? ", " : " " ) + << Catch::toString(std::get(tuple)); + ElementPrinter::print(tuple,os); + } + }; + + template< + typename Tuple, + std::size_t N + > + struct ElementPrinter { + static void print( const Tuple&, std::ostream& ) {} + }; + +} + +template +struct StringMaker> { + + static std::string convert( const std::tuple& tuple ) + { + std::ostringstream os; + os << '{'; + TupleDetail::ElementPrinter>::print( tuple, os ); + os << " }"; + return os.str(); + } +}; +#endif // CATCH_CONFIG_CPP11_TUPLE + +namespace Detail { + template + std::string makeString( T const& value ) { + return StringMaker::convert( value ); + } +} // end namespace Detail + +/// \brief converts any type to a string +/// +/// The default template forwards on to ostringstream - except when an +/// ostringstream overload does not exist - in which case it attempts to detect +/// that and writes {?}. +/// Overload (not specialise) this template for custom typs that you don't want +/// to provide an ostream overload for. +template +std::string toString( T const& value ) { + return StringMaker::convert( value ); +} + + namespace Detail { + template + std::string rangeToString( InputIterator first, InputIterator last ) { + std::ostringstream oss; + oss << "{ "; + if( first != last ) { + oss << Catch::toString( *first ); + for( ++first ; first != last ; ++first ) + oss << ", " << Catch::toString( *first ); + } + oss << " }"; + return oss.str(); + } +} + +} // end namespace Catch + +namespace Catch { + +template +class BinaryExpression; + +template +class MatchExpression; + +// Wraps the LHS of an expression and overloads comparison operators +// for also capturing those and RHS (if any) +template +class ExpressionLhs : public DecomposedExpression { +public: + ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} + + ExpressionLhs& operator = ( const ExpressionLhs& ); + + template + BinaryExpression + operator == ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator != ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator < ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator > ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator <= ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + template + BinaryExpression + operator >= ( RhsT const& rhs ) { + return captureExpression( rhs ); + } + + BinaryExpression operator == ( bool rhs ) { + return captureExpression( rhs ); + } + + BinaryExpression operator != ( bool rhs ) { + return captureExpression( rhs ); + } + + void endExpression() { + m_truthy = m_lhs ? true : false; + m_rb + .setResultType( m_truthy ) + .endExpression( *this ); + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + dest = Catch::toString( m_lhs ); + } + +private: + template + BinaryExpression captureExpression( RhsT& rhs ) const { + return BinaryExpression( m_rb, m_lhs, rhs ); + } + + template + BinaryExpression captureExpression( bool rhs ) const { + return BinaryExpression( m_rb, m_lhs, rhs ); + } + +private: + ResultBuilder& m_rb; + T m_lhs; + bool m_truthy; +}; + +template +class BinaryExpression : public DecomposedExpression { +public: + BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) + : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} + + BinaryExpression& operator = ( BinaryExpression& ); + + void endExpression() const { + m_rb + .setResultType( Internal::compare( m_lhs, m_rhs ) ) + .endExpression( *this ); + } + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string lhs = Catch::toString( m_lhs ); + std::string rhs = Catch::toString( m_rhs ); + char delim = lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ? ' ' : '\n'; + dest.reserve( 7 + lhs.size() + rhs.size() ); + // 2 for spaces around operator + // 2 for operator + // 2 for parentheses (conditionally added later) + // 1 for negation (conditionally added later) + dest = lhs; + dest += delim; + dest += Internal::OperatorTraits::getName(); + dest += delim; + dest += rhs; + } + +private: + ResultBuilder& m_rb; + LhsT m_lhs; + RhsT m_rhs; +}; + +template +class MatchExpression : public DecomposedExpression { +public: + MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) + : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string matcherAsString = m_matcher.toString(); + dest = Catch::toString( m_arg ); + dest += ' '; + if( matcherAsString == Detail::unprintableString ) + dest += m_matcherString; + else + dest += matcherAsString; + } + +private: + ArgT m_arg; + MatcherT m_matcher; + char const* m_matcherString; +}; + +} // end namespace Catch + + +namespace Catch { + + template + inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { + return ExpressionLhs( *this, operand ); + } + + inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { + return ExpressionLhs( *this, value ); + } + + template + inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, + char const* matcherString ) { + MatchExpression expr( arg, matcher, matcherString ); + setResultType( matcher.match( arg ) ); + endExpression( expr ); + } + +} // namespace Catch + +// #included from: catch_message.h +#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED + +#include + +namespace Catch { + + struct MessageInfo { + MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ); + + std::string macroName; + SourceLineInfo lineInfo; + ResultWas::OfType type; + std::string message; + unsigned int sequence; + + bool operator == ( MessageInfo const& other ) const { + return sequence == other.sequence; + } + bool operator < ( MessageInfo const& other ) const { + return sequence < other.sequence; + } + private: + static unsigned int globalCount; + }; + + struct MessageBuilder { + MessageBuilder( std::string const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ) + : m_info( macroName, lineInfo, type ) + {} + + template + MessageBuilder& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + MessageInfo m_info; + std::ostringstream m_stream; + }; + + class ScopedMessage { + public: + ScopedMessage( MessageBuilder const& builder ); + ScopedMessage( ScopedMessage const& other ); + ~ScopedMessage(); + + MessageInfo m_info; + }; + +} // end namespace Catch + +// #included from: catch_interfaces_capture.h +#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED + +#include + +namespace Catch { + + class TestCase; + class AssertionResult; + struct AssertionInfo; + struct SectionInfo; + struct SectionEndInfo; + struct MessageInfo; + class ScopedMessageBuilder; + struct Counts; + + struct IResultCapture { + + virtual ~IResultCapture(); + + virtual void assertionEnded( AssertionResult const& result ) = 0; + virtual bool sectionStarted( SectionInfo const& sectionInfo, + Counts& assertions ) = 0; + virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; + virtual void pushScopedMessage( MessageInfo const& message ) = 0; + virtual void popScopedMessage( MessageInfo const& message ) = 0; + + virtual std::string getCurrentTestName() const = 0; + virtual const AssertionResult* getLastResult() const = 0; + + virtual void exceptionEarlyReported() = 0; + + virtual void handleFatalErrorCondition( std::string const& message ) = 0; + }; + + IResultCapture& getResultCapture(); +} + +// #included from: catch_debugger.h +#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED + +// #included from: catch_platform.h +#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED + +#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +# define CATCH_PLATFORM_MAC +#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define CATCH_PLATFORM_IPHONE +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +# define CATCH_PLATFORM_WINDOWS +# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) +# define CATCH_DEFINES_NOMINMAX +# endif +# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) +# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# endif +#endif + +#include + +namespace Catch{ + + bool isDebuggerActive(); + void writeToDebugConsole( std::string const& text ); +} + +#ifdef CATCH_PLATFORM_MAC + + // The following code snippet based on: + // http://cocoawithlove.com/2008/03/break-into-debugger.html + #if defined(__ppc64__) || defined(__ppc__) + #define CATCH_TRAP() \ + __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ + : : : "memory","r0","r3","r4" ) + #else + #define CATCH_TRAP() __asm__("int $3\n" : : ) + #endif + +#elif defined(CATCH_PLATFORM_LINUX) + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") + #else // Fall back to the generic way. + #include + + #define CATCH_TRAP() raise(SIGTRAP) + #endif +#elif defined(_MSC_VER) + #define CATCH_TRAP() __debugbreak() +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) void __stdcall DebugBreak(); + #define CATCH_TRAP() DebugBreak() +#endif + +#ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } +#else + #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); +#endif + +// #included from: catch_interfaces_runner.h +#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED + +namespace Catch { + class TestCase; + + struct IRunner { + virtual ~IRunner(); + virtual bool aborting() const = 0; + }; +} + +#if defined(CATCH_CONFIG_FAST_COMPILE) +/////////////////////////////////////////////////////////////////////////////// +// We can speedup compilation significantly by breaking into debugger lower in +// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER +// macro in each assertion +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + resultBuilder.react(); + +/////////////////////////////////////////////////////////////////////////////// +// Another way to speed-up compilation is to omit local try-catch for REQUIRE* +// macros. +// This can potentially cause false negative, if the test code catches +// the exception before it propagates back up to the runner. +#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look +// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + +#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + __catchResult.captureMatch( arg, matcher, #matcher ); \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +#else +/////////////////////////////////////////////////////////////////////////////// +// In the event of a failure works out if the debugger needs to be invoked +// and/or an exception thrown and takes appropriate action. +// This needs to be done as a macro so the debugger will stop in the user +// source code rather than in Catch library code +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ + resultBuilder.react(); +#endif + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( !Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ + if( __catchResult.allowThrows() ) \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( ... ) { \ + __catchResult.captureExpectedException( matcher ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr ", " #exceptionType, resultDisposition ); \ + if( __catchResult.allowThrows() ) \ + try { \ + static_cast(expr); \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( exceptionType ) { \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#else + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << log + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#endif + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_INFO( macroName, log ) \ + Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ + try { \ + __catchResult.captureMatch( arg, matcher, #matcher ); \ + } catch( ... ) { \ + __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +// #included from: internal/catch_section.h +#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED + +// #included from: catch_section_info.h +#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED + +// #included from: catch_totals.hpp +#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED + +#include + +namespace Catch { + + struct Counts { + Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} + + Counts operator - ( Counts const& other ) const { + Counts diff; + diff.passed = passed - other.passed; + diff.failed = failed - other.failed; + diff.failedButOk = failedButOk - other.failedButOk; + return diff; + } + Counts& operator += ( Counts const& other ) { + passed += other.passed; + failed += other.failed; + failedButOk += other.failedButOk; + return *this; + } + + std::size_t total() const { + return passed + failed + failedButOk; + } + bool allPassed() const { + return failed == 0 && failedButOk == 0; + } + bool allOk() const { + return failed == 0; + } + + std::size_t passed; + std::size_t failed; + std::size_t failedButOk; + }; + + struct Totals { + + Totals operator - ( Totals const& other ) const { + Totals diff; + diff.assertions = assertions - other.assertions; + diff.testCases = testCases - other.testCases; + return diff; + } + + Totals delta( Totals const& prevTotals ) const { + Totals diff = *this - prevTotals; + if( diff.assertions.failed > 0 ) + ++diff.testCases.failed; + else if( diff.assertions.failedButOk > 0 ) + ++diff.testCases.failedButOk; + else + ++diff.testCases.passed; + return diff; + } + + Totals& operator += ( Totals const& other ) { + assertions += other.assertions; + testCases += other.testCases; + return *this; + } + + Counts assertions; + Counts testCases; + }; +} + +#include + +namespace Catch { + + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description = std::string() ); + + std::string name; + std::string description; + SourceLineInfo lineInfo; + }; + + struct SectionEndInfo { + SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) + : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) + {} + + SectionInfo sectionInfo; + Counts prevAssertions; + double durationInSeconds; + }; + +} // end namespace Catch + +// #included from: catch_timer.h +#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED + +#ifdef _MSC_VER + +namespace Catch { + typedef unsigned long long UInt64; +} +#else +#include +namespace Catch { + typedef uint64_t UInt64; +} +#endif + +namespace Catch { + class Timer { + public: + Timer() : m_ticks( 0 ) {} + void start(); + unsigned int getElapsedMicroseconds() const; + unsigned int getElapsedMilliseconds() const; + double getElapsedSeconds() const; + + private: + UInt64 m_ticks; + }; + +} // namespace Catch + +#include + +namespace Catch { + + class Section : NonCopyable { + public: + Section( SectionInfo const& info ); + ~Section(); + + // This indicates whether the section should be executed or not + operator bool() const; + + private: + SectionInfo m_info; + + std::string m_name; + Counts m_assertions; + bool m_sectionIncluded; + Timer m_timer; + }; + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_SECTION( ... ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) +#else + #define INTERNAL_CATCH_SECTION( name, desc ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) +#endif + +// #included from: internal/catch_generators.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + +template +struct IGenerator { + virtual ~IGenerator() {} + virtual T getValue( std::size_t index ) const = 0; + virtual std::size_t size () const = 0; +}; + +template +class BetweenGenerator : public IGenerator { +public: + BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} + + virtual T getValue( std::size_t index ) const { + return m_from+static_cast( index ); + } + + virtual std::size_t size() const { + return static_cast( 1+m_to-m_from ); + } + +private: + + T m_from; + T m_to; +}; + +template +class ValuesGenerator : public IGenerator { +public: + ValuesGenerator(){} + + void add( T value ) { + m_values.push_back( value ); + } + + virtual T getValue( std::size_t index ) const { + return m_values[index]; + } + + virtual std::size_t size() const { + return m_values.size(); + } + +private: + std::vector m_values; +}; + +template +class CompositeGenerator { +public: + CompositeGenerator() : m_totalSize( 0 ) {} + + // *** Move semantics, similar to auto_ptr *** + CompositeGenerator( CompositeGenerator& other ) + : m_fileInfo( other.m_fileInfo ), + m_totalSize( 0 ) + { + move( other ); + } + + CompositeGenerator& setFileInfo( const char* fileInfo ) { + m_fileInfo = fileInfo; + return *this; + } + + ~CompositeGenerator() { + deleteAll( m_composed ); + } + + operator T () const { + size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); + + typename std::vector*>::const_iterator it = m_composed.begin(); + typename std::vector*>::const_iterator itEnd = m_composed.end(); + for( size_t index = 0; it != itEnd; ++it ) + { + const IGenerator* generator = *it; + if( overallIndex >= index && overallIndex < index + generator->size() ) + { + return generator->getValue( overallIndex-index ); + } + index += generator->size(); + } + CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); + return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so + } + + void add( const IGenerator* generator ) { + m_totalSize += generator->size(); + m_composed.push_back( generator ); + } + + CompositeGenerator& then( CompositeGenerator& other ) { + move( other ); + return *this; + } + + CompositeGenerator& then( T value ) { + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( value ); + add( valuesGen ); + return *this; + } + +private: + + void move( CompositeGenerator& other ) { + m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() ); + m_totalSize += other.m_totalSize; + other.m_composed.clear(); + } + + std::vector*> m_composed; + std::string m_fileInfo; + size_t m_totalSize; +}; + +namespace Generators +{ + template + CompositeGenerator between( T from, T to ) { + CompositeGenerator generators; + generators.add( new BetweenGenerator( from, to ) ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2 ) { + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + generators.add( valuesGen ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2, T val3 ){ + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + generators.add( valuesGen ); + return generators; + } + + template + CompositeGenerator values( T val1, T val2, T val3, T val4 ) { + CompositeGenerator generators; + ValuesGenerator* valuesGen = new ValuesGenerator(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + valuesGen->add( val4 ); + generators.add( valuesGen ); + return generators; + } + +} // end namespace Generators + +using namespace Generators; + +} // end namespace Catch + +#define INTERNAL_CATCH_LINESTR2( line ) #line +#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) + +#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) + +// #included from: internal/catch_interfaces_exception.h +#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED + +#include +#include + +// #included from: catch_interfaces_registry_hub.h +#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED + +#include + +namespace Catch { + + class TestCase; + struct ITestCaseRegistry; + struct IExceptionTranslatorRegistry; + struct IExceptionTranslator; + struct IReporterRegistry; + struct IReporterFactory; + struct ITagAliasRegistry; + + struct IRegistryHub { + virtual ~IRegistryHub(); + + virtual IReporterRegistry const& getReporterRegistry() const = 0; + virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; + + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; + }; + + struct IMutableRegistryHub { + virtual ~IMutableRegistryHub(); + virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; + virtual void registerListener( Ptr const& factory ) = 0; + virtual void registerTest( TestCase const& testInfo ) = 0; + virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; + }; + + IRegistryHub& getRegistryHub(); + IMutableRegistryHub& getMutableRegistryHub(); + void cleanUp(); + std::string translateActiveException(); + +} + +namespace Catch { + + typedef std::string(*exceptionTranslateFunction)(); + + struct IExceptionTranslator; + typedef std::vector ExceptionTranslators; + + struct IExceptionTranslator { + virtual ~IExceptionTranslator(); + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; + }; + + struct IExceptionTranslatorRegistry { + virtual ~IExceptionTranslatorRegistry(); + + virtual std::string translateActiveException() const = 0; + }; + + class ExceptionTranslatorRegistrar { + template + class ExceptionTranslator : public IExceptionTranslator { + public: + + ExceptionTranslator( std::string(*translateFunction)( T& ) ) + : m_translateFunction( translateFunction ) + {} + + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { + try { + if( it == itEnd ) + throw; + else + return (*it)->translate( it+1, itEnd ); + } + catch( T& ex ) { + return m_translateFunction( ex ); + } + } + + protected: + std::string(*m_translateFunction)( T& ); + }; + + public: + template + ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { + getMutableRegistryHub().registerTranslator + ( new ExceptionTranslator( translateFunction ) ); + } + }; +} + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// #included from: internal/catch_approx.hpp +#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED + +#include +#include + +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) +#include +#endif + +namespace Catch { +namespace Detail { + + class Approx { + public: + explicit Approx ( double value ) + : m_epsilon( std::numeric_limits::epsilon()*100 ), + m_margin( 0.0 ), + m_scale( 1.0 ), + m_value( value ) + {} + + Approx( Approx const& other ) + : m_epsilon( other.m_epsilon ), + m_margin( other.m_margin ), + m_scale( other.m_scale ), + m_value( other.m_value ) + {} + + static Approx custom() { + return Approx( 0 ); + } + +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) + + template ::value>::type> + Approx operator()( T value ) { + Approx approx( static_cast(value) ); + approx.epsilon( m_epsilon ); + approx.margin( m_margin ); + approx.scale( m_scale ); + return approx; + } + + template ::value>::type> + explicit Approx( T value ): Approx(static_cast(value)) + {} + + template ::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + auto lhs_v = double(lhs); + bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); + if (relativeOK) { + return true; + } + return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin; + } + + template ::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } + + template ::value>::type> + friend bool operator != ( T lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + template ::value>::type> + friend bool operator != ( Approx const& lhs, T rhs ) { + return !operator==( rhs, lhs ); + } + + template ::value>::type> + friend bool operator <= ( T lhs, Approx const& rhs ) { + return double(lhs) < rhs.m_value || lhs == rhs; + } + + template ::value>::type> + friend bool operator <= ( Approx const& lhs, T rhs ) { + return lhs.m_value < double(rhs) || lhs == rhs; + } + + template ::value>::type> + friend bool operator >= ( T lhs, Approx const& rhs ) { + return double(lhs) > rhs.m_value || lhs == rhs; + } + + template ::value>::type> + friend bool operator >= ( Approx const& lhs, T rhs ) { + return lhs.m_value > double(rhs) || lhs == rhs; + } + + template ::value>::type> + Approx& epsilon( T newEpsilon ) { + m_epsilon = double(newEpsilon); + return *this; + } + + template ::value>::type> + Approx& margin( T newMargin ) { + m_margin = double(newMargin); + return *this; + } + + template ::value>::type> + Approx& scale( T newScale ) { + m_scale = double(newScale); + return *this; + } + +#else + + Approx operator()( double value ) { + Approx approx( value ); + approx.epsilon( m_epsilon ); + approx.margin( m_margin ); + approx.scale( m_scale ); + return approx; + } + + friend bool operator == ( double lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) ); + if (relativeOK) { + return true; + } + return std::fabs(lhs - rhs.m_value) < rhs.m_margin; + } + + friend bool operator == ( Approx const& lhs, double rhs ) { + return operator==( rhs, lhs ); + } + + friend bool operator != ( double lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + friend bool operator != ( Approx const& lhs, double rhs ) { + return !operator==( rhs, lhs ); + } + + friend bool operator <= ( double lhs, Approx const& rhs ) { + return lhs < rhs.m_value || lhs == rhs; + } + + friend bool operator <= ( Approx const& lhs, double rhs ) { + return lhs.m_value < rhs || lhs == rhs; + } + + friend bool operator >= ( double lhs, Approx const& rhs ) { + return lhs > rhs.m_value || lhs == rhs; + } + + friend bool operator >= ( Approx const& lhs, double rhs ) { + return lhs.m_value > rhs || lhs == rhs; + } + + Approx& epsilon( double newEpsilon ) { + m_epsilon = newEpsilon; + return *this; + } + + Approx& margin( double newMargin ) { + m_margin = newMargin; + return *this; + } + + Approx& scale( double newScale ) { + m_scale = newScale; + return *this; + } +#endif + + std::string toString() const { + std::ostringstream oss; + oss << "Approx( " << Catch::toString( m_value ) << " )"; + return oss.str(); + } + + private: + double m_epsilon; + double m_margin; + double m_scale; + double m_value; + }; +} + +template<> +inline std::string toString( Detail::Approx const& value ) { + return value.toString(); +} + +} // end namespace Catch + +// #included from: internal/catch_matchers_string.h +#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED + +namespace Catch { +namespace Matchers { + + namespace StdString { + + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; + + CaseSensitive::Choice m_caseSensitivity; + std::string m_str; + }; + + struct StringMatcherBase : MatcherBase { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + virtual std::string describe() const CATCH_OVERRIDE; + + CasedString m_comparator; + std::string m_operation; + }; + + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + + } // namespace StdString + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + +} // namespace Matchers +} // namespace Catch + +// #included from: internal/catch_matchers_vector.h +#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED + +namespace Catch { +namespace Matchers { + + namespace Vector { + + template + struct ContainsElementMatcher : MatcherBase, T> { + + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + return std::find(v.begin(), v.end(), m_comparator) != v.end(); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + T const& m_comparator; + }; + + template + struct ContainsMatcher : MatcherBase, std::vector > { + + ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) + return false; + for (size_t i = 0; i < m_comparator.size(); ++i) + if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end()) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + std::vector const& m_comparator; + }; + + template + struct EqualsMatcher : MatcherBase, std::vector > { + + EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector const &v) const CATCH_OVERRIDE { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector etc + // - then just call that directly + if (m_comparator.size() != v.size()) + return false; + for (size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Equals: " + Catch::toString( m_comparator ); + } + std::vector const& m_comparator; + }; + + } // namespace Vector + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + template + Vector::ContainsMatcher Contains( std::vector const& comparator ) { + return Vector::ContainsMatcher( comparator ); + } + + template + Vector::ContainsElementMatcher VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher( comparator ); + } + + template + Vector::EqualsMatcher Equals( std::vector const& comparator ) { + return Vector::EqualsMatcher( comparator ); + } + +} // namespace Matchers +} // namespace Catch + +// #included from: internal/catch_interfaces_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED + +// #included from: catch_tag_alias.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED + +#include + +namespace Catch { + + struct TagAlias { + TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} + + std::string tag; + SourceLineInfo lineInfo; + }; + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } +// #included from: catch_option.hpp +#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED + +namespace Catch { + + // An optional type + template + class Option { + public: + Option() : nullableValue( CATCH_NULL ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) + {} + + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = CATCH_NULL; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != CATCH_NULL; } + bool none() const { return nullableValue == CATCH_NULL; } + + bool operator !() const { return nullableValue == CATCH_NULL; } + operator SafeBool::type() const { + return SafeBool::makeSafe( some() ); + } + + private: + T *nullableValue; + union { + char storage[sizeof(T)]; + + // These are here to force alignment for the storage + long double dummy1; + void (*dummy2)(); + long double dummy3; +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + long long dummy4; +#endif + }; + }; + +} // end namespace Catch + +namespace Catch { + + struct ITagAliasRegistry { + virtual ~ITagAliasRegistry(); + virtual Option find( std::string const& alias ) const = 0; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; + + static ITagAliasRegistry const& get(); + }; + +} // end namespace Catch + +// These files are included here so the single_include script doesn't put them +// in the conditionally compiled sections +// #included from: internal/catch_test_case_info.h +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED + +#include +#include + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct ITestCase; + + struct TestCaseInfo { + enum SpecialProperties{ + None = 0, + IsHidden = 1 << 1, + ShouldFail = 1 << 2, + MayFail = 1 << 3, + Throws = 1 << 4, + NonPortable = 1 << 5 + }; + + TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set const& _tags, + SourceLineInfo const& _lineInfo ); + + TestCaseInfo( TestCaseInfo const& other ); + + friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); + + bool isHidden() const; + bool throws() const; + bool okToFail() const; + bool expectedToFail() const; + + std::string name; + std::string className; + std::string description; + std::set tags; + std::set lcaseTags; + std::string tagsAsString; + SourceLineInfo lineInfo; + SpecialProperties properties; + }; + + class TestCase : public TestCaseInfo { + public: + + TestCase( ITestCase* testCase, TestCaseInfo const& info ); + TestCase( TestCase const& other ); + + TestCase withName( std::string const& _newName ) const; + + void invoke() const; + + TestCaseInfo const& getTestCaseInfo() const; + + void swap( TestCase& other ); + bool operator == ( TestCase const& other ) const; + bool operator < ( TestCase const& other ) const; + TestCase& operator = ( TestCase const& other ); + + private: + Ptr test; + }; + + TestCase makeTestCase( ITestCase* testCase, + std::string const& className, + std::string const& name, + std::string const& description, + SourceLineInfo const& lineInfo ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + +#ifdef __OBJC__ +// #included from: internal/catch_objc.hpp +#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED + +#import + +#include + +// NB. Any general catch headers included here must be included +// in catch.hpp first to make sure they are included by the single +// header for non obj-usage + +/////////////////////////////////////////////////////////////////////////////// +// This protocol is really only here for (self) documenting purposes, since +// all its methods are optional. +@protocol OcFixture + +@optional + +-(void) setUp; +-(void) tearDown; + +@end + +namespace Catch { + + class OcMethod : public SharedImpl { + + public: + OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} + + virtual void invoke() const { + id obj = [[m_cls alloc] init]; + + performOptionalSelector( obj, @selector(setUp) ); + performOptionalSelector( obj, m_sel ); + performOptionalSelector( obj, @selector(tearDown) ); + + arcSafeRelease( obj ); + } + private: + virtual ~OcMethod() {} + + Class m_cls; + SEL m_sel; + }; + + namespace Detail{ + + inline std::string getAnnotation( Class cls, + std::string const& annotationName, + std::string const& testCaseName ) { + NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; + SEL sel = NSSelectorFromString( selStr ); + arcSafeRelease( selStr ); + id value = performOptionalSelector( cls, sel ); + if( value ) + return [(NSString*)value UTF8String]; + return ""; + } + } + + inline size_t registerTestMethods() { + size_t noTestMethods = 0; + int noClasses = objc_getClassList( CATCH_NULL, 0 ); + + Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); + objc_getClassList( classes, noClasses ); + + for( int c = 0; c < noClasses; c++ ) { + Class cls = classes[c]; + { + u_int count; + Method* methods = class_copyMethodList( cls, &count ); + for( u_int m = 0; m < count ; m++ ) { + SEL selector = method_getName(methods[m]); + std::string methodName = sel_getName(selector); + if( startsWith( methodName, "Catch_TestCase_" ) ) { + std::string testCaseName = methodName.substr( 15 ); + std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); + std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); + const char* className = class_getName( cls ); + + getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); + noTestMethods++; + } + } + free(methods); + } + } + return noTestMethods; + } + + namespace Matchers { + namespace Impl { + namespace NSStringMatchers { + + struct StringHolder : MatcherBase{ + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} + StringHolder() { + arcSafeRelease( m_substr ); + } + + virtual bool match( NSString* arg ) const CATCH_OVERRIDE { + return false; + } + + NSString* m_substr; + }; + + struct Equals : StringHolder { + Equals( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const CATCH_OVERRIDE { + return (str != nil || m_substr == nil ) && + [str isEqualToString:m_substr]; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "equals string: " + Catch::toString( m_substr ); + } + }; + + struct Contains : StringHolder { + Contains( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location != NSNotFound; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "contains string: " + Catch::toString( m_substr ); + } + }; + + struct StartsWith : StringHolder { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == 0; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "starts with: " + Catch::toString( m_substr ); + } + }; + struct EndsWith : StringHolder { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( NSString* str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "ends with: " + Catch::toString( m_substr ); + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Equals + Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define OC_TEST_CASE( name, desc )\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ +{\ +return @ name; \ +}\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ +{ \ +return @ desc; \ +} \ +-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) + +#endif + +#ifdef CATCH_IMPL + +// !TBD: Move the leak detector code into a separate header +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include +class LeakDetector { +public: + LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +}; +#else +class LeakDetector {}; +#endif + +LeakDetector leakDetector; + +// #included from: internal/catch_impl.hpp +#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED + +// Collect all the implementation files together here +// These are the equivalent of what would usually be cpp files + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + +// #included from: ../catch_session.hpp +#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED + +// #included from: internal/catch_commandline.hpp +#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED + +// #included from: catch_config.hpp +#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED + +// #included from: catch_test_spec_parser.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// #included from: catch_test_spec.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// #included from: catch_wildcard_pattern.hpp +#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED + +#include + +namespace Catch +{ + class WildcardPattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + + WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_wildcard( NoWildcard ), + m_pattern( adjustCase( pattern ) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); + m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); + } + } + virtual ~WildcardPattern(); + virtual bool matches( std::string const& str ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_pattern == adjustCase( str ); + case WildcardAtStart: + return endsWith( adjustCase( str ), m_pattern ); + case WildcardAtEnd: + return startsWith( adjustCase( str ), m_pattern ); + case WildcardAtBothEnds: + return contains( adjustCase( str ), m_pattern ); + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + throw std::logic_error( "Unknown enum" ); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } + private: + std::string adjustCase( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; + } + CaseSensitive::Choice m_caseSensitivity; + WildcardPosition m_wildcard; + std::string m_pattern; + }; +} + +#include +#include + +namespace Catch { + + class TestSpec { + struct Pattern : SharedImpl<> { + virtual ~Pattern(); + virtual bool matches( TestCaseInfo const& testCase ) const = 0; + }; + class NamePattern : public Pattern { + public: + NamePattern( std::string const& name ) + : m_wildcardPattern( toLower( name ), CaseSensitive::No ) + {} + virtual ~NamePattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + return m_wildcardPattern.matches( toLower( testCase.name ) ); + } + private: + WildcardPattern m_wildcardPattern; + }; + + class TagPattern : public Pattern { + public: + TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} + virtual ~TagPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); + } + private: + std::string m_tag; + }; + + class ExcludedPattern : public Pattern { + public: + ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} + virtual ~ExcludedPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } + private: + Ptr m_underlyingPattern; + }; + + struct Filter { + std::vector > m_patterns; + + bool matches( TestCaseInfo const& testCase ) const { + // All patterns in a filter must match for the filter to be a match + for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { + if( !(*it)->matches( testCase ) ) + return false; + } + return true; + } + }; + + public: + bool hasFilters() const { + return !m_filters.empty(); + } + bool matches( TestCaseInfo const& testCase ) const { + // A TestSpec matches if any filter matches + for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) + if( it->matches( testCase ) ) + return true; + return false; + } + + private: + std::vector m_filters; + + friend class TestSpecParser; + }; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +namespace Catch { + + class TestSpecParser { + enum Mode{ None, Name, QuotedName, Tag, EscapedName }; + Mode m_mode; + bool m_exclusion; + std::size_t m_start, m_pos; + std::string m_arg; + std::vector m_escapeChars; + TestSpec::Filter m_currentFilter; + TestSpec m_testSpec; + ITagAliasRegistry const* m_tagAliases; + + public: + TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + + TestSpecParser& parse( std::string const& arg ) { + m_mode = None; + m_exclusion = false; + m_start = std::string::npos; + m_arg = m_tagAliases->expandAliases( arg ); + m_escapeChars.clear(); + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) + visitChar( m_arg[m_pos] ); + if( m_mode == Name ) + addPattern(); + return *this; + } + TestSpec testSpec() { + addFilter(); + return m_testSpec; + } + private: + void visitChar( char c ) { + if( m_mode == None ) { + switch( c ) { + case ' ': return; + case '~': m_exclusion = true; return; + case '[': return startNewMode( Tag, ++m_pos ); + case '"': return startNewMode( QuotedName, ++m_pos ); + case '\\': return escape(); + default: startNewMode( Name, m_pos ); break; + } + } + if( m_mode == Name ) { + if( c == ',' ) { + addPattern(); + addFilter(); + } + else if( c == '[' ) { + if( subString() == "exclude:" ) + m_exclusion = true; + else + addPattern(); + startNewMode( Tag, ++m_pos ); + } + else if( c == '\\' ) + escape(); + } + else if( m_mode == EscapedName ) + m_mode = Name; + else if( m_mode == QuotedName && c == '"' ) + addPattern(); + else if( m_mode == Tag && c == ']' ) + addPattern(); + } + void startNewMode( Mode mode, std::size_t start ) { + m_mode = mode; + m_start = start; + } + void escape() { + if( m_mode == None ) + m_start = m_pos; + m_mode = EscapedName; + m_escapeChars.push_back( m_pos ); + } + std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } + template + void addPattern() { + std::string token = subString(); + for( size_t i = 0; i < m_escapeChars.size(); ++i ) + token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); + m_escapeChars.clear(); + if( startsWith( token, "exclude:" ) ) { + m_exclusion = true; + token = token.substr( 8 ); + } + if( !token.empty() ) { + Ptr pattern = new T( token ); + if( m_exclusion ) + pattern = new TestSpec::ExcludedPattern( pattern ); + m_currentFilter.m_patterns.push_back( pattern ); + } + m_exclusion = false; + m_mode = None; + } + void addFilter() { + if( !m_currentFilter.m_patterns.empty() ) { + m_testSpec.m_filters.push_back( m_currentFilter ); + m_currentFilter = TestSpec::Filter(); + } + } + }; + inline TestSpec parseTestSpec( std::string const& arg ) { + return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// #included from: catch_interfaces_config.h +#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED + +#include +#include +#include + +namespace Catch { + + struct Verbosity { enum Level { + NoOutput = 0, + Quiet, + Normal + }; }; + + struct WarnAbout { enum What { + Nothing = 0x00, + NoAssertions = 0x01 + }; }; + + struct ShowDurations { enum OrNot { + DefaultForReporter, + Always, + Never + }; }; + struct RunTests { enum InWhatOrder { + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; + + class TestSpec; + + struct IConfig : IShared { + + virtual ~IConfig(); + + virtual bool allowThrows() const = 0; + virtual std::ostream& stream() const = 0; + virtual std::string name() const = 0; + virtual bool includeSuccessfulResults() const = 0; + virtual bool shouldDebugBreak() const = 0; + virtual bool warnAboutMissingAssertions() const = 0; + virtual int abortAfter() const = 0; + virtual bool showInvisibles() const = 0; + virtual ShowDurations::OrNot showDurations() const = 0; + virtual TestSpec const& testSpec() const = 0; + virtual RunTests::InWhatOrder runOrder() const = 0; + virtual unsigned int rngSeed() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; + virtual std::vector const& getSectionsToRun() const = 0; + + }; +} + +// #included from: catch_stream.h +#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED + +// #included from: catch_streambuf.h +#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED + +#include + +namespace Catch { + + class StreamBufBase : public std::streambuf { + public: + virtual ~StreamBufBase() CATCH_NOEXCEPT; + }; +} + +#include +#include +#include +#include + +namespace Catch { + + std::ostream& cout(); + std::ostream& cerr(); + + struct IStream { + virtual ~IStream() CATCH_NOEXCEPT; + virtual std::ostream& stream() const = 0; + }; + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( std::string const& filename ); + virtual ~FileStream() CATCH_NOEXCEPT; + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + CoutStream(); + virtual ~CoutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class DebugOutStream : public IStream { + CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream(); + virtual ~DebugOutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; +} + +#include +#include +#include +#include + +#ifndef CATCH_CONFIG_CONSOLE_WIDTH +#define CATCH_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { + + struct ConfigData { + + ConfigData() + : listTests( false ), + listTags( false ), + listReporters( false ), + listTestNamesOnly( false ), + listExtraInfo( false ), + showSuccessfulTests( false ), + shouldDebugBreak( false ), + noThrow( false ), + showHelp( false ), + showInvisibles( false ), + filenamesAsTags( false ), + abortAfter( -1 ), + rngSeed( 0 ), + verbosity( Verbosity::Normal ), + warnings( WarnAbout::Nothing ), + showDurations( ShowDurations::DefaultForReporter ), + runOrder( RunTests::InDeclarationOrder ), + useColour( UseColour::Auto ) + {} + + bool listTests; + bool listTags; + bool listReporters; + bool listTestNamesOnly; + bool listExtraInfo; + + bool showSuccessfulTests; + bool shouldDebugBreak; + bool noThrow; + bool showHelp; + bool showInvisibles; + bool filenamesAsTags; + + int abortAfter; + unsigned int rngSeed; + + Verbosity::Level verbosity; + WarnAbout::What warnings; + ShowDurations::OrNot showDurations; + RunTests::InWhatOrder runOrder; + UseColour::YesOrNo useColour; + + std::string outputFilename; + std::string name; + std::string processName; + + std::vector reporterNames; + std::vector testsOrTags; + std::vector sectionsToRun; + }; + + class Config : public SharedImpl { + private: + Config( Config const& other ); + Config& operator = ( Config const& other ); + virtual void dummy(); + public: + + Config() + {} + + Config( ConfigData const& data ) + : m_data( data ), + m_stream( openStream() ) + { + if( !data.testsOrTags.empty() ) { + TestSpecParser parser( ITagAliasRegistry::get() ); + for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) + parser.parse( data.testsOrTags[i] ); + m_testSpec = parser.testSpec(); + } + } + + virtual ~Config() {} + + std::string const& getFilename() const { + return m_data.outputFilename ; + } + + bool listTests() const { return m_data.listTests; } + bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } + bool listTags() const { return m_data.listTags; } + bool listReporters() const { return m_data.listReporters; } + bool listExtraInfo() const { return m_data.listExtraInfo; } + + std::string getProcessName() const { return m_data.processName; } + + std::vector const& getReporterNames() const { return m_data.reporterNames; } + std::vector const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } + + virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; } + + bool showHelp() const { return m_data.showHelp; } + + // IConfig interface + virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; } + virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); } + virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; } + virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; } + virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; } + virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; } + virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; } + virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; } + virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; } + virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; } + virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; } + virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; } + + private: + + IStream const* openStream() { + if( m_data.outputFilename.empty() ) + return new CoutStream(); + else if( m_data.outputFilename[0] == '%' ) { + if( m_data.outputFilename == "%debug" ) + return new DebugOutStream(); + else + throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); + } + else + return new FileStream( m_data.outputFilename ); + } + ConfigData m_data; + + CATCH_AUTO_PTR( IStream const ) m_stream; + TestSpec m_testSpec; + }; + +} // end namespace Catch + +// #included from: catch_clara.h +#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED + +// Use Catch's value for console width (store Clara's off to the side, if present) +#ifdef CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH +#undef CLARA_CONFIG_CONSOLE_WIDTH +#endif +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +// Declare Clara inside the Catch namespace +#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { +// #included from: ../external/clara.h + +// Version 0.0.2.4 + +// Only use header guard if we are not using an outer namespace +#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) + +#ifndef STITCH_CLARA_OPEN_NAMESPACE +#define TWOBLUECUBES_CLARA_H_INCLUDED +#define STITCH_CLARA_OPEN_NAMESPACE +#define STITCH_CLARA_CLOSE_NAMESPACE +#else +#define STITCH_CLARA_CLOSE_NAMESPACE } +#endif + +#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE + +// ----------- #included from tbc_text_format.h ----------- + +// Only use header guard if we are not using an outer namespace +#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) +#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define TBC_TEXT_FORMAT_H_INCLUDED +#endif + +#include +#include +#include +#include +#include + +// Use optional outer namespace +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ), + tabChar( '\t' ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + char tabChar; // If this char is seen the indent is changed to current pos + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + std::string wrappableChars = " [({.,/|\\-"; + std::size_t indent = _attr.initialIndent != std::string::npos + ? _attr.initialIndent + : _attr.indent; + std::string remainder = _str; + + while( !remainder.empty() ) { + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + std::size_t tabPos = std::string::npos; + std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); + std::size_t pos = remainder.find_first_of( '\n' ); + if( pos <= width ) { + width = pos; + } + pos = remainder.find_last_of( _attr.tabChar, width ); + if( pos != std::string::npos ) { + tabPos = pos; + if( remainder[width] == '\n' ) + width--; + remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); + } + + if( width == remainder.size() ) { + spliceLine( indent, remainder, width ); + } + else if( remainder[width] == '\n' ) { + spliceLine( indent, remainder, width ); + if( width <= 1 || remainder.size() != 1 ) + remainder = remainder.substr( 1 ); + indent = _attr.indent; + } + else { + pos = remainder.find_last_of( wrappableChars, width ); + if( pos != std::string::npos && pos > 0 ) { + spliceLine( indent, remainder, pos ); + if( remainder[0] == ' ' ) + remainder = remainder.substr( 1 ); + } + else { + spliceLine( indent, remainder, width-1 ); + lines.back() += "-"; + } + if( lines.size() == 1 ) + indent = _attr.indent; + if( tabPos != std::string::npos ) + indent += tabPos; + } + } + } + + void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { + lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); + _remainder = _remainder.substr( _pos ); + } + + typedef std::vector::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector lines; + }; + +} // end namespace Tbc + +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TBC_TEXT_FORMAT_H_INCLUDED + +// ----------- end of #include from tbc_text_format.h ----------- +// ........... back in clara.h + +#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE + +// ----------- #included from clara_compilers.h ----------- + +#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED +#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? +// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) + +// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? + +// In general each macro has a _NO_ form +// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 + +#ifdef __clang__ + +#if __has_feature(cxx_nullptr) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#if __has_feature(cxx_noexcept) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#if (_MSC_VER >= 1600) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// catch all support for C++11 +#if defined(__cplusplus) && __cplusplus >= 201103L + +#define CLARA_CPP11_OR_GREATER + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) +#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE +#endif +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NULLPTR +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_UNIQUE_PTR +#endif + +// noexcept support: +#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) +#define CLARA_NOEXCEPT noexcept +# define CLARA_NOEXCEPT_IS(x) noexcept(x) +#else +#define CLARA_NOEXCEPT throw() +# define CLARA_NOEXCEPT_IS(x) +#endif + +// nullptr support +#ifdef CLARA_CONFIG_CPP11_NULLPTR +#define CLARA_NULL nullptr +#else +#define CLARA_NULL NULL +#endif + +// override support +#ifdef CLARA_CONFIG_CPP11_OVERRIDE +#define CLARA_OVERRIDE override +#else +#define CLARA_OVERRIDE +#endif + +// unique_ptr support +#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR +# define CLARA_AUTO_PTR( T ) std::unique_ptr +#else +# define CLARA_AUTO_PTR( T ) std::auto_ptr +#endif + +#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// ----------- end of #include from clara_compilers.h ----------- +// ........... back in clara.h + +#include +#include +#include + +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CLARA_PLATFORM_WINDOWS +#endif + +// Use optional outer namespace +#ifdef STITCH_CLARA_OPEN_NAMESPACE +STITCH_CLARA_OPEN_NAMESPACE +#endif + +namespace Clara { + + struct UnpositionalTag {}; + + extern UnpositionalTag _; + +#ifdef CLARA_CONFIG_MAIN + UnpositionalTag _; +#endif + + namespace Detail { + +#ifdef CLARA_CONSOLE_WIDTH + const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + using namespace Tbc; + + inline bool startsWith( std::string const& str, std::string const& prefix ) { + return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; + } + + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + template struct RemoveConstRef{ typedef T type; }; + + template struct IsBool { static const bool value = false; }; + template<> struct IsBool { static const bool value = true; }; + + template + void convertInto( std::string const& _source, T& _dest ) { + std::stringstream ss; + ss << _source; + ss >> _dest; + if( ss.fail() ) + throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); + } + inline void convertInto( std::string const& _source, std::string& _dest ) { + _dest = _source; + } + char toLowerCh(char c) { + return static_cast( std::tolower( c ) ); + } + inline void convertInto( std::string const& _source, bool& _dest ) { + std::string sourceLC = _source; + std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); + if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) + _dest = true; + else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) + _dest = false; + else + throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); + } + + template + struct IArgFunction { + virtual ~IArgFunction() {} +#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS + IArgFunction() = default; + IArgFunction( IArgFunction const& ) = default; +#endif + virtual void set( ConfigT& config, std::string const& value ) const = 0; + virtual bool takesArg() const = 0; + virtual IArgFunction* clone() const = 0; + }; + + template + class BoundArgFunction { + public: + BoundArgFunction() : functionObj( CLARA_NULL ) {} + BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} + BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} + BoundArgFunction& operator = ( BoundArgFunction const& other ) { + IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; + delete functionObj; + functionObj = newFunctionObj; + return *this; + } + ~BoundArgFunction() { delete functionObj; } + + void set( ConfigT& config, std::string const& value ) const { + functionObj->set( config, value ); + } + bool takesArg() const { return functionObj->takesArg(); } + + bool isSet() const { + return functionObj != CLARA_NULL; + } + private: + IArgFunction* functionObj; + }; + + template + struct NullBinder : IArgFunction{ + virtual void set( C&, std::string const& ) const {} + virtual bool takesArg() const { return true; } + virtual IArgFunction* clone() const { return new NullBinder( *this ); } + }; + + template + struct BoundDataMember : IArgFunction{ + BoundDataMember( M C::* _member ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + convertInto( stringValue, p.*member ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } + M C::* member; + }; + template + struct BoundUnaryMethod : IArgFunction{ + BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + typename RemoveConstRef::type value; + convertInto( stringValue, value ); + (p.*member)( value ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } + void (C::*member)( M ); + }; + template + struct BoundNullaryMethod : IArgFunction{ + BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + (p.*member)(); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } + void (C::*member)(); + }; + + template + struct BoundUnaryFunction : IArgFunction{ + BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + function( obj ); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } + void (*function)( C& ); + }; + + template + struct BoundBinaryFunction : IArgFunction{ + BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + typename RemoveConstRef::type value; + convertInto( stringValue, value ); + function( obj, value ); + } + virtual bool takesArg() const { return !IsBool::value; } + virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } + void (*function)( C&, T ); + }; + + } // namespace Detail + + inline std::vector argsToVector( int argc, char const* const* const argv ) { + std::vector args( static_cast( argc ) ); + for( std::size_t i = 0; i < static_cast( argc ); ++i ) + args[i] = argv[i]; + + return args; + } + + class Parser { + enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; + Mode mode; + std::size_t from; + bool inQuotes; + public: + + struct Token { + enum Type { Positional, ShortOpt, LongOpt }; + Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} + Type type; + std::string data; + }; + + Parser() : mode( None ), from( 0 ), inQuotes( false ){} + + void parseIntoTokens( std::vector const& args, std::vector& tokens ) { + const std::string doubleDash = "--"; + for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) + parseIntoTokens( args[i], tokens); + } + + void parseIntoTokens( std::string const& arg, std::vector& tokens ) { + for( std::size_t i = 0; i < arg.size(); ++i ) { + char c = arg[i]; + if( c == '"' ) + inQuotes = !inQuotes; + mode = handleMode( i, c, arg, tokens ); + } + mode = handleMode( arg.size(), '\0', arg, tokens ); + } + Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + switch( mode ) { + case None: return handleNone( i, c ); + case MaybeShortOpt: return handleMaybeShortOpt( i, c ); + case ShortOpt: + case LongOpt: + case SlashOpt: return handleOpt( i, c, arg, tokens ); + case Positional: return handlePositional( i, c, arg, tokens ); + default: throw std::logic_error( "Unknown mode" ); + } + } + + Mode handleNone( std::size_t i, char c ) { + if( inQuotes ) { + from = i; + return Positional; + } + switch( c ) { + case '-': return MaybeShortOpt; +#ifdef CLARA_PLATFORM_WINDOWS + case '/': from = i+1; return SlashOpt; +#endif + default: from = i; return Positional; + } + } + Mode handleMaybeShortOpt( std::size_t i, char c ) { + switch( c ) { + case '-': from = i+1; return LongOpt; + default: from = i; return ShortOpt; + } + } + + Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) + return mode; + + std::string optName = arg.substr( from, i-from ); + if( mode == ShortOpt ) + for( std::size_t j = 0; j < optName.size(); ++j ) + tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); + else if( mode == SlashOpt && optName.size() == 1 ) + tokens.push_back( Token( Token::ShortOpt, optName ) ); + else + tokens.push_back( Token( Token::LongOpt, optName ) ); + return None; + } + Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) + return mode; + + std::string data = arg.substr( from, i-from ); + tokens.push_back( Token( Token::Positional, data ) ); + return None; + } + }; + + template + struct CommonArgProperties { + CommonArgProperties() {} + CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} + + Detail::BoundArgFunction boundField; + std::string description; + std::string detail; + std::string placeholder; // Only value if boundField takes an arg + + bool takesArg() const { + return !placeholder.empty(); + } + void validate() const { + if( !boundField.isSet() ) + throw std::logic_error( "option not bound" ); + } + }; + struct OptionArgProperties { + std::vector shortNames; + std::string longName; + + bool hasShortName( std::string const& shortName ) const { + return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); + } + bool hasLongName( std::string const& _longName ) const { + return _longName == longName; + } + }; + struct PositionalArgProperties { + PositionalArgProperties() : position( -1 ) {} + int position; // -1 means non-positional (floating) + + bool isFixedPositional() const { + return position != -1; + } + }; + + template + class CommandLine { + + struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { + Arg() {} + Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} + + using CommonArgProperties::placeholder; // !TBD + + std::string dbgName() const { + if( !longName.empty() ) + return "--" + longName; + if( !shortNames.empty() ) + return "-" + shortNames[0]; + return "positional args"; + } + std::string commands() const { + std::ostringstream oss; + bool first = true; + std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); + for(; it != itEnd; ++it ) { + if( first ) + first = false; + else + oss << ", "; + oss << "-" << *it; + } + if( !longName.empty() ) { + if( !first ) + oss << ", "; + oss << "--" << longName; + } + if( !placeholder.empty() ) + oss << " <" << placeholder << ">"; + return oss.str(); + } + }; + + typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; + + friend void addOptName( Arg& arg, std::string const& optName ) + { + if( optName.empty() ) + return; + if( Detail::startsWith( optName, "--" ) ) { + if( !arg.longName.empty() ) + throw std::logic_error( "Only one long opt may be specified. '" + + arg.longName + + "' already specified, now attempting to add '" + + optName + "'" ); + arg.longName = optName.substr( 2 ); + } + else if( Detail::startsWith( optName, "-" ) ) + arg.shortNames.push_back( optName.substr( 1 ) ); + else + throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); + } + friend void setPositionalArg( Arg& arg, int position ) + { + arg.position = position; + } + + class ArgBuilder { + public: + ArgBuilder( Arg* arg ) : m_arg( arg ) {} + + // Bind a non-boolean data member (requires placeholder string) + template + void bind( M C::* field, std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundDataMember( field ); + m_arg->placeholder = placeholder; + } + // Bind a boolean data member (no placeholder required) + template + void bind( bool C::* field ) { + m_arg->boundField = new Detail::BoundDataMember( field ); + } + + // Bind a method taking a single, non-boolean argument (requires a placeholder string) + template + void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); + m_arg->placeholder = placeholder; + } + + // Bind a method taking a single, boolean argument (no placeholder string required) + template + void bind( void (C::* unaryMethod)( bool ) ) { + m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); + } + + // Bind a method that takes no arguments (will be called if opt is present) + template + void bind( void (C::* nullaryMethod)() ) { + m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); + } + + // Bind a free function taking a single argument - the object to operate on (no placeholder string required) + template + void bind( void (* unaryFunction)( C& ) ) { + m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); + } + + // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) + template + void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); + m_arg->placeholder = placeholder; + } + + ArgBuilder& describe( std::string const& description ) { + m_arg->description = description; + return *this; + } + ArgBuilder& detail( std::string const& detail ) { + m_arg->detail = detail; + return *this; + } + + protected: + Arg* m_arg; + }; + + class OptBuilder : public ArgBuilder { + public: + OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} + OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} + + OptBuilder& operator[]( std::string const& optName ) { + addOptName( *ArgBuilder::m_arg, optName ); + return *this; + } + }; + + public: + + CommandLine() + : m_boundProcessName( new Detail::NullBinder() ), + m_highestSpecifiedArgPosition( 0 ), + m_throwOnUnrecognisedTokens( false ) + {} + CommandLine( CommandLine const& other ) + : m_boundProcessName( other.m_boundProcessName ), + m_options ( other.m_options ), + m_positionalArgs( other.m_positionalArgs ), + m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), + m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) + { + if( other.m_floatingArg.get() ) + m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); + } + + CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { + m_throwOnUnrecognisedTokens = shouldThrow; + return *this; + } + + OptBuilder operator[]( std::string const& optName ) { + m_options.push_back( Arg() ); + addOptName( m_options.back(), optName ); + OptBuilder builder( &m_options.back() ); + return builder; + } + + ArgBuilder operator[]( int position ) { + m_positionalArgs.insert( std::make_pair( position, Arg() ) ); + if( position > m_highestSpecifiedArgPosition ) + m_highestSpecifiedArgPosition = position; + setPositionalArg( m_positionalArgs[position], position ); + ArgBuilder builder( &m_positionalArgs[position] ); + return builder; + } + + // Invoke this with the _ instance + ArgBuilder operator[]( UnpositionalTag ) { + if( m_floatingArg.get() ) + throw std::logic_error( "Only one unpositional argument can be added" ); + m_floatingArg.reset( new Arg() ); + ArgBuilder builder( m_floatingArg.get() ); + return builder; + } + + template + void bindProcessName( M C::* field ) { + m_boundProcessName = new Detail::BoundDataMember( field ); + } + template + void bindProcessName( void (C::*_unaryMethod)( M ) ) { + m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); + } + + void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { + typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; + std::size_t maxWidth = 0; + for( it = itBegin; it != itEnd; ++it ) + maxWidth = (std::max)( maxWidth, it->commands().size() ); + + for( it = itBegin; it != itEnd; ++it ) { + Detail::Text usage( it->commands(), Detail::TextAttributes() + .setWidth( maxWidth+indent ) + .setIndent( indent ) ); + Detail::Text desc( it->description, Detail::TextAttributes() + .setWidth( width - maxWidth - 3 ) ); + + for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { + std::string usageCol = i < usage.size() ? usage[i] : ""; + os << usageCol; + + if( i < desc.size() && !desc[i].empty() ) + os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) + << desc[i]; + os << "\n"; + } + } + } + std::string optUsage() const { + std::ostringstream oss; + optUsage( oss ); + return oss.str(); + } + + void argSynopsis( std::ostream& os ) const { + for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { + if( i > 1 ) + os << " "; + typename std::map::const_iterator it = m_positionalArgs.find( i ); + if( it != m_positionalArgs.end() ) + os << "<" << it->second.placeholder << ">"; + else if( m_floatingArg.get() ) + os << "<" << m_floatingArg->placeholder << ">"; + else + throw std::logic_error( "non consecutive positional arguments with no floating args" ); + } + // !TBD No indication of mandatory args + if( m_floatingArg.get() ) { + if( m_highestSpecifiedArgPosition > 1 ) + os << " "; + os << "[<" << m_floatingArg->placeholder << "> ...]"; + } + } + std::string argSynopsis() const { + std::ostringstream oss; + argSynopsis( oss ); + return oss.str(); + } + + void usage( std::ostream& os, std::string const& procName ) const { + validate(); + os << "usage:\n " << procName << " "; + argSynopsis( os ); + if( !m_options.empty() ) { + os << " [options]\n\nwhere options are: \n"; + optUsage( os, 2 ); + } + os << "\n"; + } + std::string usage( std::string const& procName ) const { + std::ostringstream oss; + usage( oss, procName ); + return oss.str(); + } + + ConfigT parse( std::vector const& args ) const { + ConfigT config; + parseInto( args, config ); + return config; + } + + std::vector parseInto( std::vector const& args, ConfigT& config ) const { + std::string processName = args.empty() ? std::string() : args[0]; + std::size_t lastSlash = processName.find_last_of( "/\\" ); + if( lastSlash != std::string::npos ) + processName = processName.substr( lastSlash+1 ); + m_boundProcessName.set( config, processName ); + std::vector tokens; + Parser parser; + parser.parseIntoTokens( args, tokens ); + return populate( tokens, config ); + } + + std::vector populate( std::vector const& tokens, ConfigT& config ) const { + validate(); + std::vector unusedTokens = populateOptions( tokens, config ); + unusedTokens = populateFixedArgs( unusedTokens, config ); + unusedTokens = populateFloatingArgs( unusedTokens, config ); + return unusedTokens; + } + + std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { + std::vector unusedTokens; + std::vector errors; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); + for(; it != itEnd; ++it ) { + Arg const& arg = *it; + + try { + if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || + ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { + if( arg.takesArg() ) { + if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) + errors.push_back( "Expected argument to option: " + token.data ); + else + arg.boundField.set( config, tokens[++i].data ); + } + else { + arg.boundField.set( config, "true" ); + } + break; + } + } + catch( std::exception& ex ) { + errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); + } + } + if( it == itEnd ) { + if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) + unusedTokens.push_back( token ); + else if( errors.empty() && m_throwOnUnrecognisedTokens ) + errors.push_back( "unrecognised option: " + token.data ); + } + } + if( !errors.empty() ) { + std::ostringstream oss; + for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); + it != itEnd; + ++it ) { + if( it != errors.begin() ) + oss << "\n"; + oss << *it; + } + throw std::runtime_error( oss.str() ); + } + return unusedTokens; + } + std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { + std::vector unusedTokens; + int position = 1; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::map::const_iterator it = m_positionalArgs.find( position ); + if( it != m_positionalArgs.end() ) + it->second.boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + if( token.type == Parser::Token::Positional ) + position++; + } + return unusedTokens; + } + std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { + if( !m_floatingArg.get() ) + return tokens; + std::vector unusedTokens; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + if( token.type == Parser::Token::Positional ) + m_floatingArg->boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + } + return unusedTokens; + } + + void validate() const + { + if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) + throw std::logic_error( "No options or arguments specified" ); + + for( typename std::vector::const_iterator it = m_options.begin(), + itEnd = m_options.end(); + it != itEnd; ++it ) + it->validate(); + } + + private: + Detail::BoundArgFunction m_boundProcessName; + std::vector m_options; + std::map m_positionalArgs; + ArgAutoPtr m_floatingArg; + int m_highestSpecifiedArgPosition; + bool m_throwOnUnrecognisedTokens; + }; + +} // end namespace Clara + +STITCH_CLARA_CLOSE_NAMESPACE +#undef STITCH_CLARA_OPEN_NAMESPACE +#undef STITCH_CLARA_CLOSE_NAMESPACE + +#endif // TWOBLUECUBES_CLARA_H_INCLUDED +#undef STITCH_CLARA_OPEN_NAMESPACE + +// Restore Clara's value for console width, if present +#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +#include +#include + +namespace Catch { + + inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } + inline void abortAfterX( ConfigData& config, int x ) { + if( x < 1 ) + throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); + config.abortAfter = x; + } + inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } + inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } + inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } + + inline void addWarning( ConfigData& config, std::string const& _warning ) { + if( _warning == "NoAssertions" ) + config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); + else + throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); + } + inline void setOrder( ConfigData& config, std::string const& order ) { + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); + } + inline void setRngSeed( ConfigData& config, std::string const& seed ) { + if( seed == "time" ) { + config.rngSeed = static_cast( std::time(0) ); + } + else { + std::stringstream ss; + ss << seed; + ss >> config.rngSeed; + if( ss.fail() ) + throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" ); + } + } + inline void setVerbosity( ConfigData& config, int level ) { + // !TBD: accept strings? + config.verbosity = static_cast( level ); + } + inline void setShowDurations( ConfigData& config, bool _showDurations ) { + config.showDurations = _showDurations + ? ShowDurations::Always + : ShowDurations::Never; + } + inline void setUseColour( ConfigData& config, std::string const& value ) { + std::string mode = toLower( value ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); + } + inline void forceColour( ConfigData& config ) { + config.useColour = UseColour::Yes; + } + inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { + std::ifstream f( _filename.c_str() ); + if( !f.is_open() ) + throw std::domain_error( "Unable to load input file: " + _filename ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + addTestOrTags( config, line + ',' ); + } + } + } + + inline Clara::CommandLine makeCommandLineParser() { + + using namespace Clara; + CommandLine cli; + + cli.bindProcessName( &ConfigData::processName ); + + cli["-?"]["-h"]["--help"] + .describe( "display usage information" ) + .bind( &ConfigData::showHelp ); + + cli["-l"]["--list-tests"] + .describe( "list all/matching test cases" ) + .bind( &ConfigData::listTests ); + + cli["-t"]["--list-tags"] + .describe( "list all/matching tags" ) + .bind( &ConfigData::listTags ); + + cli["-s"]["--success"] + .describe( "include successful tests in output" ) + .bind( &ConfigData::showSuccessfulTests ); + + cli["-b"]["--break"] + .describe( "break into debugger on failure" ) + .bind( &ConfigData::shouldDebugBreak ); + + cli["-e"]["--nothrow"] + .describe( "skip exception tests" ) + .bind( &ConfigData::noThrow ); + + cli["-i"]["--invisibles"] + .describe( "show invisibles (tabs, newlines)" ) + .bind( &ConfigData::showInvisibles ); + + cli["-o"]["--out"] + .describe( "output filename" ) + .bind( &ConfigData::outputFilename, "filename" ); + + cli["-r"]["--reporter"] +// .placeholder( "name[:filename]" ) + .describe( "reporter to use (defaults to console)" ) + .bind( &addReporterName, "name" ); + + cli["-n"]["--name"] + .describe( "suite name" ) + .bind( &ConfigData::name, "name" ); + + cli["-a"]["--abort"] + .describe( "abort at first failure" ) + .bind( &abortAfterFirst ); + + cli["-x"]["--abortx"] + .describe( "abort after x failures" ) + .bind( &abortAfterX, "no. failures" ); + + cli["-w"]["--warn"] + .describe( "enable warnings" ) + .bind( &addWarning, "warning name" ); + +// - needs updating if reinstated +// cli.into( &setVerbosity ) +// .describe( "level of verbosity (0=no output)" ) +// .shortOpt( "v") +// .longOpt( "verbosity" ) +// .placeholder( "level" ); + + cli[_] + .describe( "which test or tests to use" ) + .bind( &addTestOrTags, "test name, pattern or tags" ); + + cli["-d"]["--durations"] + .describe( "show test durations" ) + .bind( &setShowDurations, "yes|no" ); + + cli["-f"]["--input-file"] + .describe( "load test names to run from a file" ) + .bind( &loadTestNamesFromFile, "filename" ); + + cli["-#"]["--filenames-as-tags"] + .describe( "adds a tag for the filename" ) + .bind( &ConfigData::filenamesAsTags ); + + cli["-c"]["--section"] + .describe( "specify section to run" ) + .bind( &addSectionToRun, "section name" ); + + // Less common commands which don't have a short form + cli["--list-test-names-only"] + .describe( "list all/matching test cases names only" ) + .bind( &ConfigData::listTestNamesOnly ); + + cli["--list-extra-info"] + .describe( "list all/matching test cases with more info" ) + .bind( &ConfigData::listExtraInfo ); + + cli["--list-reporters"] + .describe( "list all reporters" ) + .bind( &ConfigData::listReporters ); + + cli["--order"] + .describe( "test case order (defaults to decl)" ) + .bind( &setOrder, "decl|lex|rand" ); + + cli["--rng-seed"] + .describe( "set a specific seed for random numbers" ) + .bind( &setRngSeed, "'time'|number" ); + + cli["--force-colour"] + .describe( "force colourised output (deprecated)" ) + .bind( &forceColour ); + + cli["--use-colour"] + .describe( "should output be colourised" ) + .bind( &setUseColour, "yes|no" ); + + return cli; + } + +} // end namespace Catch + +// #included from: internal/catch_list.hpp +#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED + +// #included from: catch_text.h +#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED + +#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch +// #included from: ../external/tbc_text_format.h +// Only use header guard if we are not using an outer namespace +#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# endif +# else +# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# endif +#endif +#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#include +#include +#include + +// Use optional outer namespace +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + const std::string wrappableBeforeChars = "[({<\t"; + const std::string wrappableAfterChars = "])}>-,./|\\"; + const std::string wrappableInsteadOfChars = " \n\r"; + std::string indent = _attr.initialIndent != std::string::npos + ? std::string( _attr.initialIndent, ' ' ) + : std::string( _attr.indent, ' ' ); + + typedef std::string::const_iterator iterator; + iterator it = _str.begin(); + const iterator strEnd = _str.end(); + + while( it != strEnd ) { + + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + + std::string suffix; + std::size_t width = (std::min)( static_cast( strEnd-it ), _attr.width-static_cast( indent.size() ) ); + iterator itEnd = it+width; + iterator itNext = _str.end(); + + iterator itNewLine = std::find( it, itEnd, '\n' ); + if( itNewLine != itEnd ) + itEnd = itNewLine; + + if( itEnd != strEnd ) { + bool foundWrapPoint = false; + iterator findIt = itEnd; + do { + if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { + itEnd = findIt+1; + itNext = findIt+1; + foundWrapPoint = true; + } + else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { + itEnd = findIt; + itNext = findIt; + foundWrapPoint = true; + } + else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { + itNext = findIt+1; + itEnd = findIt; + foundWrapPoint = true; + } + if( findIt == it ) + break; + else + --findIt; + } + while( !foundWrapPoint ); + + if( !foundWrapPoint ) { + // No good wrap char, so we'll break mid word and add a hyphen + --itEnd; + itNext = itEnd; + suffix = "-"; + } + else { + while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) + --itEnd; + } + } + lines.push_back( indent + std::string( it, itEnd ) + suffix ); + + if( indent.size() != _attr.indent ) + indent = std::string( _attr.indent, ' ' ); + it = itNext; + } + } + + typedef std::vector::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector lines; + }; + +} // end namespace Tbc + +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE + +namespace Catch { + using Tbc::Text; + using Tbc::TextAttributes; +} + +// #included from: catch_console_colour.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED + +namespace Catch { + + struct Colour { + enum Code { + None = 0, + + White, + Red, + Green, + Blue, + Cyan, + Yellow, + Grey, + + Bright = 0x10, + + BrightRed = Bright | Red, + BrightGreen = Bright | Green, + LightGrey = Bright | Grey, + BrightWhite = Bright | White, + + // By intention + FileName = LightGrey, + Warning = Yellow, + ResultError = BrightRed, + ResultSuccess = BrightGreen, + ResultExpectedFailure = Warning, + + Error = BrightRed, + Success = Green, + + OriginalExpression = Cyan, + ReconstructedExpression = Yellow, + + SecondaryText = LightGrey, + Headers = White + }; + + // Use constructed object for RAII guard + Colour( Code _colourCode ); + Colour( Colour const& other ); + ~Colour(); + + // Use static method for one-shot changes + static void use( Code _colourCode ); + + private: + bool m_moved; + }; + + inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } + +} // end namespace Catch + +// #included from: catch_interfaces_reporter.h +#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED + +#include +#include +#include + +namespace Catch +{ + struct ReporterConfig { + explicit ReporterConfig( Ptr const& _fullConfig ) + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + + ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + + std::ostream& stream() const { return *m_stream; } + Ptr fullConfig() const { return m_fullConfig; } + + private: + std::ostream* m_stream; + Ptr m_fullConfig; + }; + + struct ReporterPreferences { + ReporterPreferences() + : shouldRedirectStdOut( false ) + {} + + bool shouldRedirectStdOut; + }; + + template + struct LazyStat : Option { + LazyStat() : used( false ) {} + LazyStat& operator=( T const& _value ) { + Option::operator=( _value ); + used = false; + return *this; + } + void reset() { + Option::reset(); + used = false; + } + bool used; + }; + + struct TestRunInfo { + TestRunInfo( std::string const& _name ) : name( _name ) {} + std::string name; + }; + struct GroupInfo { + GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) + {} + + std::string name; + std::size_t groupIndex; + std::size_t groupsCounts; + }; + + struct AssertionStats { + AssertionStats( AssertionResult const& _assertionResult, + std::vector const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) + { + if( assertionResult.hasMessage() ) { + // Copy message into messages list. + // !TBD This should have been done earlier, somewhere + MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); + builder << assertionResult.getMessage(); + builder.m_info.message = builder.m_stream.str(); + + infoMessages.push_back( builder.m_info ); + } + } + virtual ~AssertionStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = default; + AssertionStats& operator = ( AssertionStats && ) = default; +# endif + + AssertionResult assertionResult; + std::vector infoMessages; + Totals totals; + }; + + struct SectionStats { + SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) + {} + virtual ~SectionStats(); +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; +# endif + + SectionInfo sectionInfo; + Counts assertions; + double durationInSeconds; + bool missingAssertions; + }; + + struct TestCaseStats { + TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) + {} + virtual ~TestCaseStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; +# endif + + TestCaseInfo testInfo; + Totals totals; + std::string stdOut; + std::string stdErr; + bool aborting; + }; + + struct TestGroupStats { + TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) + {} + TestGroupStats( GroupInfo const& _groupInfo ) + : groupInfo( _groupInfo ), + aborting( false ) + {} + virtual ~TestGroupStats(); + +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; +# endif + + GroupInfo groupInfo; + Totals totals; + bool aborting; + }; + + struct TestRunStats { + TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) + {} + virtual ~TestRunStats(); + +# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS + TestRunStats( TestRunStats const& _other ) + : runInfo( _other.runInfo ), + totals( _other.totals ), + aborting( _other.aborting ) + {} +# else + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; +# endif + + TestRunInfo runInfo; + Totals totals; + bool aborting; + }; + + class MultipleReporters; + + struct IStreamingReporter : IShared { + virtual ~IStreamingReporter(); + + // Implementing class must also provide the following static method: + // static std::string getDescription(); + + virtual ReporterPreferences getPreferences() const = 0; + + virtual void noMatchingTestCases( std::string const& spec ) = 0; + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; + virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; + virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + + virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } + }; + + struct IReporterFactory : IShared { + virtual ~IReporterFactory(); + virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; + virtual std::string getDescription() const = 0; + }; + + struct IReporterRegistry { + typedef std::map > FactoryMap; + typedef std::vector > Listeners; + + virtual ~IReporterRegistry(); + virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; + virtual FactoryMap const& getFactories() const = 0; + virtual Listeners const& getListeners() const = 0; + }; + + Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); + +} + +#include +#include + +namespace Catch { + + inline std::size_t listTests( Config const& config ) { + + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + Catch::cout() << "Matching test cases:\n"; + else { + Catch::cout() << "All available test cases:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::size_t matchedTests = 0; + TextAttributes nameAttr, descAttr, tagsAttr; + nameAttr.setInitialIndent( 2 ).setIndent( 4 ); + descAttr.setIndent( 4 ); + tagsAttr.setIndent( 6 ); + + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + Colour::Code colour = testCaseInfo.isHidden() + ? Colour::SecondaryText + : Colour::None; + Colour colourGuard( colour ); + + Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; + if( config.listExtraInfo() ) { + Catch::cout() << " " << testCaseInfo.lineInfo << std::endl; + std::string description = testCaseInfo.description; + if( description.empty() ) + description = "(NO DESCRIPTION)"; + Catch::cout() << Text( description, descAttr ) << std::endl; + } + if( !testCaseInfo.tags.empty() ) + Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; + } + + if( !config.testSpec().hasFilters() ) + Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; + else + Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; + return matchedTests; + } + + inline std::size_t listTestsNamesOnly( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( !config.testSpec().hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + std::size_t matchedTests = 0; + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + if( startsWith( testCaseInfo.name, '#' ) ) + Catch::cout() << '"' << testCaseInfo.name << '"'; + else + Catch::cout() << testCaseInfo.name; + if ( config.listExtraInfo() ) + Catch::cout() << "\t@" << testCaseInfo.lineInfo; + Catch::cout() << std::endl; + } + return matchedTests; + } + + struct TagInfo { + TagInfo() : count ( 0 ) {} + void add( std::string const& spelling ) { + ++count; + spellings.insert( spelling ); + } + std::string all() const { + std::string out; + for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); + it != itEnd; + ++it ) + out += "[" + *it + "]"; + return out; + } + std::set spellings; + std::size_t count; + }; + + inline std::size_t listTags( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + Catch::cout() << "Tags for matching test cases:\n"; + else { + Catch::cout() << "All available tags:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::map tagCounts; + + std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), + tagItEnd = it->getTestCaseInfo().tags.end(); + tagIt != tagItEnd; + ++tagIt ) { + std::string tagName = *tagIt; + std::string lcaseTagName = toLower( tagName ); + std::map::iterator countIt = tagCounts.find( lcaseTagName ); + if( countIt == tagCounts.end() ) + countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; + countIt->second.add( tagName ); + } + } + + for( std::map::const_iterator countIt = tagCounts.begin(), + countItEnd = tagCounts.end(); + countIt != countItEnd; + ++countIt ) { + std::ostringstream oss; + oss << " " << std::setw(2) << countIt->second.count << " "; + Text wrapper( countIt->second.all(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( oss.str().size() ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); + Catch::cout() << oss.str() << wrapper << '\n'; + } + Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; + return tagCounts.size(); + } + + inline std::size_t listReporters( Config const& /*config*/ ) { + Catch::cout() << "Available reporters:\n"; + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; + std::size_t maxNameLen = 0; + for(it = itBegin; it != itEnd; ++it ) + maxNameLen = (std::max)( maxNameLen, it->first.size() ); + + for(it = itBegin; it != itEnd; ++it ) { + Text wrapper( it->second->getDescription(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( 7+maxNameLen ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); + Catch::cout() << " " + << it->first + << ':' + << std::string( maxNameLen - it->first.size() + 2, ' ' ) + << wrapper << '\n'; + } + Catch::cout() << std::endl; + return factories.size(); + } + + inline Option list( Config const& config ) { + Option listedCount; + if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) ) + listedCount = listedCount.valueOr(0) + listTests( config ); + if( config.listTestNamesOnly() ) + listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); + if( config.listTags() ) + listedCount = listedCount.valueOr(0) + listTags( config ); + if( config.listReporters() ) + listedCount = listedCount.valueOr(0) + listReporters( config ); + return listedCount; + } + +} // end namespace Catch + +// #included from: internal/catch_run_context.hpp +#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED + +// #included from: catch_test_case_tracker.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED + +#include +#include +#include +#include +#include + +CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS + +namespace Catch { +namespace TestCaseTracking { + + struct NameAndLocation { + std::string name; + SourceLineInfo location; + + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} + }; + + struct ITracker : SharedImpl<> { + virtual ~ITracker(); + + // static queries + virtual NameAndLocation const& nameAndLocation() const = 0; + + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + + virtual ITracker& parent() = 0; + + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; + + virtual void addChild( Ptr const& child ) = 0; + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isIndexTracker() const = 0; + }; + + class TrackerContext { + + enum RunState { + NotStarted, + Executing, + CompletedCycle + }; + + Ptr m_rootTracker; + ITracker* m_currentTracker; + RunState m_runState; + + public: + + static TrackerContext& instance() { + static TrackerContext s_instance; + return s_instance; + } + + TrackerContext() + : m_currentTracker( CATCH_NULL ), + m_runState( NotStarted ) + {} + + ITracker& startRun(); + + void endRun() { + m_rootTracker.reset(); + m_currentTracker = CATCH_NULL; + m_runState = NotStarted; + } + + void startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; + } + void completeCycle() { + m_runState = CompletedCycle; + } + + bool completedCycle() const { + return m_runState == CompletedCycle; + } + ITracker& currentTracker() { + return *m_currentTracker; + } + void setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } + }; + + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; + class TrackerHasName { + NameAndLocation m_nameAndLocation; + public: + TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} + bool operator ()( Ptr const& tracker ) { + return + tracker->nameAndLocation().name == m_nameAndLocation.name && + tracker->nameAndLocation().location == m_nameAndLocation.location; + } + }; + typedef std::vector > Children; + NameAndLocation m_nameAndLocation; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState; + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : m_nameAndLocation( nameAndLocation ), + m_ctx( ctx ), + m_parent( parent ), + m_runState( NotStarted ) + {} + virtual ~TrackerBase(); + + virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { + return m_nameAndLocation; + } + virtual bool isComplete() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully; + } + virtual bool isOpen() const CATCH_OVERRIDE { + return m_runState != NotStarted && !isComplete(); + } + virtual bool hasChildren() const CATCH_OVERRIDE { + return !m_children.empty(); + } + + virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { + m_children.push_back( child ); + } + + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { + Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); + return( it != m_children.end() ) + ? it->get() + : CATCH_NULL; + } + virtual ITracker& parent() CATCH_OVERRIDE { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } + + virtual void openChild() CATCH_OVERRIDE { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } + virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } + + void open() { + m_runState = Executing; + moveToThis(); + if( m_parent ) + m_parent->openChild(); + } + + virtual void close() CATCH_OVERRIDE { + + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); + + switch( m_runState ) { + case NotStarted: + case CompletedSuccessfully: + case Failed: + throw std::logic_error( "Illogical state" ); + + case NeedsAnotherRun: + break;; + + case Executing: + m_runState = CompletedSuccessfully; + break; + case ExecutingChildren: + if( m_children.empty() || m_children.back()->isComplete() ) + m_runState = CompletedSuccessfully; + break; + + default: + throw std::logic_error( "Unexpected state" ); + } + moveToParent(); + m_ctx.completeCycle(); + } + virtual void fail() CATCH_OVERRIDE { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { + m_runState = NeedsAnotherRun; + } + private: + void moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void moveToThis() { + m_ctx.setCurrentTracker( this ); + } + }; + + class SectionTracker : public TrackerBase { + std::vector m_filters; + public: + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); + + SectionTracker& parentSection = static_cast( *parent ); + addNextFilters( parentSection.m_filters ); + } + } + virtual ~SectionTracker(); + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } + + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + SectionTracker* section = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = static_cast( childTracker ); + } + else { + section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; + } + + void tryOpen() { + if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) + open(); + } + + void addInitialFilters( std::vector const& filters ) { + if( !filters.empty() ) { + m_filters.push_back(""); // Root - should never be consulted + m_filters.push_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void addNextFilters( std::vector const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); + } + }; + + class IndexTracker : public TrackerBase { + int m_size; + int m_index; + public: + IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_size( size ), + m_index( -1 ) + {} + virtual ~IndexTracker(); + + virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } + + static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { + IndexTracker* tracker = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isIndexTracker() ); + tracker = static_cast( childTracker ); + } + else { + tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); + currentTracker.addChild( tracker ); + } + + if( !ctx.completedCycle() && !tracker->isComplete() ) { + if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) + tracker->moveNext(); + tracker->open(); + } + + return *tracker; + } + + int index() const { return m_index; } + + void moveNext() { + m_index++; + m_children.clear(); + } + + virtual void close() CATCH_OVERRIDE { + TrackerBase::close(); + if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) + m_runState = Executing; + } + }; + + inline ITracker& TrackerContext::startRun() { + m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); + m_currentTracker = CATCH_NULL; + m_runState = Executing; + return *m_rootTracker; + } + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; +using TestCaseTracking::IndexTracker; + +} // namespace Catch + +CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +// #included from: catch_fatal_condition.hpp +#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED + +namespace Catch { + + // Report the error condition + inline void reportFatal( std::string const& message ) { + IContext& context = Catch::getCurrentContext(); + IResultCapture* resultCapture = context.getResultCapture(); + resultCapture->handleFatalErrorCondition( message ); + } + +} // namespace Catch + +#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// +// #included from: catch_windows_h_proxy.h + +#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED + +#ifdef CATCH_DEFINES_NOMINMAX +# define NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#ifdef __AFXDLL +#include +#else +#include +#endif + +#ifdef CATCH_DEFINES_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + + +# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_WINDOWS_SEH is defined + +namespace Catch { + + struct SignalDefs { DWORD id; const char* name; }; + extern SignalDefs signalDefs[]; + // There is no 1-1 mapping between signals and windows exceptions. + // Windows can easily distinguish between SO and SigSegV, + // but SigInt, SigTerm, etc are handled differently. + SignalDefs signalDefs[] = { + { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, + { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, + { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, + { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, + }; + + struct FatalConditionHandler { + + static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { + for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { + reportFatal(signalDefs[i].name); + } + } + // If its not an exception we care about, pass it along. + // This stops us from eating debugger breaks etc. + return EXCEPTION_CONTINUE_SEARCH; + } + + FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = CATCH_NULL; + // Register as first handler in current chain + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + // Pass in guarantee size to be filled + SetThreadStackGuarantee(&guaranteeSize); + } + + static void reset() { + if (isSet) { + // Unregister handler and restore the old guarantee + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = CATCH_NULL; + isSet = false; + } + } + + ~FatalConditionHandler() { + reset(); + } + private: + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; + }; + + bool FatalConditionHandler::isSet = false; + ULONG FatalConditionHandler::guaranteeSize = 0; + PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; + +} // namespace Catch + +# endif // CATCH_CONFIG_WINDOWS_SEH + +#else // Not Windows - assumed to be POSIX compatible ////////////////////////// + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_POSIX_SIGNALS is defined + +#include + +namespace Catch { + + struct SignalDefs { + int id; + const char* name; + }; + extern SignalDefs signalDefs[]; + SignalDefs signalDefs[] = { + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + }; + + struct FatalConditionHandler { + + static bool isSet; + static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; + static stack_t oldSigStack; + static char altStackMem[SIGSTKSZ]; + + static void handleSignal( int sig ) { + std::string name = ""; + for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + SignalDefs &def = signalDefs[i]; + if (sig == def.id) { + name = def.name; + break; + } + } + reset(); + reportFatal(name); + raise( sig ); + } + + FatalConditionHandler() { + isSet = true; + stack_t sigStack; + sigStack.ss_sp = altStackMem; + sigStack.ss_size = SIGSTKSZ; + sigStack.ss_flags = 0; + sigaltstack(&sigStack, &oldSigStack); + struct sigaction sa = { 0 }; + + sa.sa_handler = handleSignal; + sa.sa_flags = SA_ONSTACK; + for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { + sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); + } + } + + ~FatalConditionHandler() { + reset(); + } + static void reset() { + if( isSet ) { + // Set signals back to previous values -- hopefully nobody overwrote them in the meantime + for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { + sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); + } + // Return the old stack + sigaltstack(&oldSigStack, CATCH_NULL); + isSet = false; + } + } + }; + + bool FatalConditionHandler::isSet = false; + struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; + stack_t FatalConditionHandler::oldSigStack = {}; + char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; + +} // namespace Catch + +# endif // CATCH_CONFIG_POSIX_SIGNALS + +#endif // not Windows + +#include +#include + +namespace Catch { + + class StreamRedirect { + + public: + StreamRedirect( std::ostream& stream, std::string& targetString ) + : m_stream( stream ), + m_prevBuf( stream.rdbuf() ), + m_targetString( targetString ) + { + stream.rdbuf( m_oss.rdbuf() ); + } + + ~StreamRedirect() { + m_targetString += m_oss.str(); + m_stream.rdbuf( m_prevBuf ); + } + + private: + std::ostream& m_stream; + std::streambuf* m_prevBuf; + std::ostringstream m_oss; + std::string& m_targetString; + }; + + /////////////////////////////////////////////////////////////////////////// + + class RunContext : public IResultCapture, public IRunner { + + RunContext( RunContext const& ); + void operator =( RunContext const& ); + + public: + + explicit RunContext( Ptr const& _config, Ptr const& reporter ) + : m_runInfo( _config->name() ), + m_context( getCurrentMutableContext() ), + m_activeTestCase( CATCH_NULL ), + m_config( _config ), + m_reporter( reporter ), + m_shouldReportUnexpected ( true ) + { + m_context.setRunner( this ); + m_context.setConfig( m_config ); + m_context.setResultCapture( this ); + m_reporter->testRunStarting( m_runInfo ); + } + + virtual ~RunContext() { + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); + } + + void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); + } + void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); + } + + Totals runTest( TestCase const& testCase ) { + Totals prevTotals = m_totals; + + std::string redirectedCout; + std::string redirectedCerr; + + TestCaseInfo testInfo = testCase.getTestCaseInfo(); + + m_reporter->testCaseStarting( testInfo ); + + m_activeTestCase = &testCase; + + do { + ITracker& rootTracker = m_trackerContext.startRun(); + assert( rootTracker.isSectionTracker() ); + static_cast( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); + do { + m_trackerContext.startCycle(); + m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); + runCurrentTest( redirectedCout, redirectedCerr ); + } + while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); + } + // !TBD: deprecated - this will be replaced by indexed trackers + while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); + + Totals deltaTotals = m_totals.delta( prevTotals ); + if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } + m_totals.testCases += deltaTotals.testCases; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + redirectedCout, + redirectedCerr, + aborting() ) ); + + m_activeTestCase = CATCH_NULL; + m_testCaseTracker = CATCH_NULL; + + return deltaTotals; + } + + Ptr config() const { + return m_config; + } + + private: // IResultCapture + + virtual void assertionEnded( AssertionResult const& result ) { + if( result.getResultType() == ResultWas::Ok ) { + m_totals.assertions.passed++; + } + else if( !result.isOk() ) { + m_totals.assertions.failed++; + } + + // We have no use for the return value (whether messages should be cleared), because messages were made scoped + // and should be let to clear themselves out. + static_cast(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); + + // Reset working state + m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); + m_lastResult = result; + } + + virtual bool sectionStarted ( + SectionInfo const& sectionInfo, + Counts& assertions + ) + { + ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); + if( !sectionTracker.isOpen() ) + return false; + m_activeSections.push_back( §ionTracker ); + + m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; + + m_reporter->sectionStarting( sectionInfo ); + + assertions = m_totals.assertions; + + return true; + } + bool testForMissingAssertions( Counts& assertions ) { + if( assertions.total() != 0 ) + return false; + if( !m_config->warnAboutMissingAssertions() ) + return false; + if( m_trackerContext.currentTracker().hasChildren() ) + return false; + m_totals.assertions.failed++; + assertions.failed++; + return true; + } + + virtual void sectionEnded( SectionEndInfo const& endInfo ) { + Counts assertions = m_totals.assertions - endInfo.prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + if( !m_activeSections.empty() ) { + m_activeSections.back()->close(); + m_activeSections.pop_back(); + } + + m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); + m_messages.clear(); + } + + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { + if( m_unfinishedSections.empty() ) + m_activeSections.back()->fail(); + else + m_activeSections.back()->close(); + m_activeSections.pop_back(); + + m_unfinishedSections.push_back( endInfo ); + } + + virtual void pushScopedMessage( MessageInfo const& message ) { + m_messages.push_back( message ); + } + + virtual void popScopedMessage( MessageInfo const& message ) { + m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); + } + + virtual std::string getCurrentTestName() const { + return m_activeTestCase + ? m_activeTestCase->getTestCaseInfo().name + : std::string(); + } + + virtual const AssertionResult* getLastResult() const { + return &m_lastResult; + } + + virtual void exceptionEarlyReported() { + m_shouldReportUnexpected = false; + } + + virtual void handleFatalErrorCondition( std::string const& message ) { + // Don't rebuild the result -- the stringification itself can cause more fatal errors + // Instead, fake a result data. + AssertionResultData tempResult; + tempResult.resultType = ResultWas::FatalErrorCondition; + tempResult.message = message; + AssertionResult result(m_lastAssertionInfo, tempResult); + + getResultCapture().assertionEnded(result); + + handleUnfinishedSections(); + + // Recreate section for test case (as we will lose the one that was in scope) + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + + Counts assertions; + assertions.failed = 1; + SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); + m_reporter->sectionEnded( testCaseSectionStats ); + + TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); + + Totals deltaTotals; + deltaTotals.testCases.failed = 1; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + std::string(), + std::string(), + false ) ); + m_totals.testCases.failed++; + testGroupEnded( std::string(), m_totals, 1, 1 ); + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); + } + + public: + // !TBD We need to do this another way! + bool aborting() const { + return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); + } + + private: + + void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + m_reporter->sectionStarting( testCaseSection ); + Counts prevAssertions = m_totals.assertions; + double duration = 0; + m_shouldReportUnexpected = true; + try { + m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); + + seedRng( *m_config ); + + Timer timer; + timer.start(); + if( m_reporter->getPreferences().shouldRedirectStdOut ) { + StreamRedirect coutRedir( Catch::cout(), redirectedCout ); + StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); + invokeActiveTestCase(); + } + else { + invokeActiveTestCase(); + } + duration = timer.getElapsedSeconds(); + } + catch( TestFailureException& ) { + // This just means the test was aborted due to failure + } + catch(...) { + // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions + // are reported without translation at the point of origin. + if (m_shouldReportUnexpected) { + makeUnexpectedResultBuilder().useActiveException(); + } + } + m_testCaseTracker->close(); + handleUnfinishedSections(); + m_messages.clear(); + + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + if( testCaseInfo.okToFail() ) { + std::swap( assertions.failedButOk, assertions.failed ); + m_totals.assertions.failed -= assertions.failedButOk; + m_totals.assertions.failedButOk += assertions.failedButOk; + } + + SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); + m_reporter->sectionEnded( testCaseSectionStats ); + } + + void invokeActiveTestCase() { + FatalConditionHandler fatalConditionHandler; // Handle signals + m_activeTestCase->invoke(); + fatalConditionHandler.reset(); + } + + private: + + ResultBuilder makeUnexpectedResultBuilder() const { + return ResultBuilder( m_lastAssertionInfo.macroName, + m_lastAssertionInfo.lineInfo, + m_lastAssertionInfo.capturedExpression, + m_lastAssertionInfo.resultDisposition ); + } + + void handleUnfinishedSections() { + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it ) + sectionEnded( *it ); + m_unfinishedSections.clear(); + } + + TestRunInfo m_runInfo; + IMutableContext& m_context; + TestCase const* m_activeTestCase; + ITracker* m_testCaseTracker; + ITracker* m_currentSectionTracker; + AssertionResult m_lastResult; + + Ptr m_config; + Totals m_totals; + Ptr m_reporter; + std::vector m_messages; + AssertionInfo m_lastAssertionInfo; + std::vector m_unfinishedSections; + std::vector m_activeSections; + TrackerContext m_trackerContext; + bool m_shouldReportUnexpected; + }; + + IResultCapture& getResultCapture() { + if( IResultCapture* capture = getCurrentContext().getResultCapture() ) + return *capture; + else + throw std::logic_error( "No result capture instance" ); + } + +} // end namespace Catch + +// #included from: internal/catch_version.h +#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED + +namespace Catch { + + // Versioning information + struct Version { + Version( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ); + + unsigned int const majorVersion; + unsigned int const minorVersion; + unsigned int const patchNumber; + + // buildNumber is only used if branchName is not null + char const * const branchName; + unsigned int const buildNumber; + + friend std::ostream& operator << ( std::ostream& os, Version const& version ); + + private: + void operator=( Version const& ); + }; + + inline Version libraryVersion(); +} + +#include +#include +#include + +namespace Catch { + + Ptr createReporter( std::string const& reporterName, Ptr const& config ) { + Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); + if( !reporter ) { + std::ostringstream oss; + oss << "No reporter registered with name: '" << reporterName << "'"; + throw std::domain_error( oss.str() ); + } + return reporter; + } + + Ptr makeReporter( Ptr const& config ) { + std::vector reporters = config->getReporterNames(); + if( reporters.empty() ) + reporters.push_back( "console" ); + + Ptr reporter; + for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); + it != itEnd; + ++it ) + reporter = addReporter( reporter, createReporter( *it, config ) ); + return reporter; + } + Ptr addListeners( Ptr const& config, Ptr reporters ) { + IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); + for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); + it != itEnd; + ++it ) + reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); + return reporters; + } + + Totals runTests( Ptr const& config ) { + + Ptr iconfig = config.get(); + + Ptr reporter = makeReporter( config ); + reporter = addListeners( iconfig, reporter ); + + RunContext context( iconfig, reporter ); + + Totals totals; + + context.testGroupStarting( config->name(), 1, 1 ); + + TestSpec testSpec = config->testSpec(); + if( !testSpec.hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests + + std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); + for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); + it != itEnd; + ++it ) { + if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) + totals += context.runTest( *it ); + else + reporter->skipTest( *it ); + } + + context.testGroupEnded( iconfig->name(), totals, 1, 1 ); + return totals; + } + + void applyFilenamesAsTags( IConfig const& config ) { + std::vector const& tests = getAllTestCasesSorted( config ); + for(std::size_t i = 0; i < tests.size(); ++i ) { + TestCase& test = const_cast( tests[i] ); + std::set tags = test.tags; + + std::string filename = test.lineInfo.file; + std::string::size_type lastSlash = filename.find_last_of( "\\/" ); + if( lastSlash != std::string::npos ) + filename = filename.substr( lastSlash+1 ); + + std::string::size_type lastDot = filename.find_last_of( "." ); + if( lastDot != std::string::npos ) + filename = filename.substr( 0, lastDot ); + + tags.insert( "#" + filename ); + setTags( test, tags ); + } + } + + class Session : NonCopyable { + static bool alreadyInstantiated; + + public: + + struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; + + Session() + : m_cli( makeCommandLineParser() ) { + if( alreadyInstantiated ) { + std::string msg = "Only one instance of Catch::Session can ever be used"; + Catch::cerr() << msg << std::endl; + throw std::logic_error( msg ); + } + alreadyInstantiated = true; + } + ~Session() { + Catch::cleanUp(); + } + + void showHelp( std::string const& processName ) { + Catch::cout() << "\nCatch v" << libraryVersion() << "\n"; + + m_cli.usage( Catch::cout(), processName ); + Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; + } + + int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + try { + m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); + m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); + if( m_configData.showHelp ) + showHelp( m_configData.processName ); + m_config.reset(); + } + catch( std::exception& ex ) { + { + Colour colourGuard( Colour::Red ); + Catch::cerr() + << "\nError(s) in input:\n" + << Text( ex.what(), TextAttributes().setIndent(2) ) + << "\n\n"; + } + m_cli.usage( Catch::cout(), m_configData.processName ); + return (std::numeric_limits::max)(); + } + return 0; + } + + void useConfigData( ConfigData const& _configData ) { + m_configData = _configData; + m_config.reset(); + } + + int run( int argc, char const* const* const argv ) { + + int returnCode = applyCommandLine( argc, argv ); + if( returnCode == 0 ) + returnCode = run(); + return returnCode; + } + + #if defined(WIN32) && defined(UNICODE) + int run( int argc, wchar_t const* const* const argv ) { + + char **utf8Argv = new char *[ argc ]; + + for ( int i = 0; i < argc; ++i ) { + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); + + utf8Argv[ i ] = new char[ bufSize ]; + + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); + } + + int returnCode = applyCommandLine( argc, utf8Argv ); + if( returnCode == 0 ) + returnCode = run(); + + for ( int i = 0; i < argc; ++i ) + delete [] utf8Argv[ i ]; + + delete [] utf8Argv; + + return returnCode; + } + #endif + + int run() { + if( m_configData.showHelp ) + return 0; + + try + { + config(); // Force config to be constructed + + seedRng( *m_config ); + + if( m_configData.filenamesAsTags ) + applyFilenamesAsTags( *m_config ); + + // Handle list request + if( Option listed = list( config() ) ) + return static_cast( *listed ); + + return static_cast( runTests( m_config ).assertions.failed ); + } + catch( std::exception& ex ) { + Catch::cerr() << ex.what() << std::endl; + return (std::numeric_limits::max)(); + } + } + + Clara::CommandLine const& cli() const { + return m_cli; + } + std::vector const& unusedTokens() const { + return m_unusedTokens; + } + ConfigData& configData() { + return m_configData; + } + Config& config() { + if( !m_config ) + m_config = new Config( m_configData ); + return *m_config; + } + private: + Clara::CommandLine m_cli; + std::vector m_unusedTokens; + ConfigData m_configData; + Ptr m_config; + }; + + bool Session::alreadyInstantiated = false; + +} // end namespace Catch + +// #included from: catch_registry_hub.hpp +#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED + +// #included from: catch_test_case_registry_impl.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + struct RandomNumberGenerator { + typedef std::ptrdiff_t result_type; + + result_type operator()( result_type n ) const { return std::rand() % n; } + +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return 1000000; } + result_type operator()() const { return std::rand() % max(); } +#endif + template + static void shuffle( V& vector ) { + RandomNumberGenerator rng; +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + std::shuffle( vector.begin(), vector.end(), rng ); +#else + std::random_shuffle( vector.begin(), vector.end(), rng ); +#endif + } + }; + + inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { + + std::vector sorted = unsortedTestCases; + + switch( config.runOrder() ) { + case RunTests::InLexicographicalOrder: + std::sort( sorted.begin(), sorted.end() ); + break; + case RunTests::InRandomOrder: + { + seedRng( config ); + RandomNumberGenerator::shuffle( sorted ); + } + break; + case RunTests::InDeclarationOrder: + // already in declaration order + break; + } + return sorted; + } + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { + return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); + } + + void enforceNoDuplicateTestCases( std::vector const& functions ) { + std::set seenFunctions; + for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); + it != itEnd; + ++it ) { + std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); + if( !prev.second ) { + std::ostringstream ss; + + ss << Colour( Colour::Red ) + << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' + << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; + + throw std::runtime_error(ss.str()); + } + } + } + + std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { + std::vector filtered; + filtered.reserve( testCases.size() ); + for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); + it != itEnd; + ++it ) + if( matchTest( *it, testSpec, config ) ) + filtered.push_back( *it ); + return filtered; + } + std::vector const& getAllTestCasesSorted( IConfig const& config ) { + return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); + } + + class TestRegistry : public ITestCaseRegistry { + public: + TestRegistry() + : m_currentSortOrder( RunTests::InDeclarationOrder ), + m_unnamedCount( 0 ) + {} + virtual ~TestRegistry(); + + virtual void registerTest( TestCase const& testCase ) { + std::string name = testCase.getTestCaseInfo().name; + if( name.empty() ) { + std::ostringstream oss; + oss << "Anonymous test case " << ++m_unnamedCount; + return registerTest( testCase.withName( oss.str() ) ); + } + m_functions.push_back( testCase ); + } + + virtual std::vector const& getAllTests() const { + return m_functions; + } + virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { + if( m_sortedFunctions.empty() ) + enforceNoDuplicateTestCases( m_functions ); + + if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { + m_sortedFunctions = sortTests( config, m_functions ); + m_currentSortOrder = config.runOrder(); + } + return m_sortedFunctions; + } + + private: + std::vector m_functions; + mutable RunTests::InWhatOrder m_currentSortOrder; + mutable std::vector m_sortedFunctions; + size_t m_unnamedCount; + std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised + }; + + /////////////////////////////////////////////////////////////////////////// + + class FreeFunctionTestCase : public SharedImpl { + public: + + FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} + + virtual void invoke() const { + m_fun(); + } + + private: + virtual ~FreeFunctionTestCase(); + + TestFunction m_fun; + }; + + inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { + std::string className = classOrQualifiedMethodName; + if( startsWith( className, '&' ) ) + { + std::size_t lastColons = className.rfind( "::" ); + std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); + if( penultimateColons == std::string::npos ) + penultimateColons = 1; + className = className.substr( penultimateColons, lastColons-penultimateColons ); + } + return className; + } + + void registerTestCase + ( ITestCase* testCase, + char const* classOrQualifiedMethodName, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + + getMutableRegistryHub().registerTest + ( makeTestCase + ( testCase, + extractClassName( classOrQualifiedMethodName ), + nameAndDesc.name, + nameAndDesc.description, + lineInfo ) ); + } + void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); + } + + /////////////////////////////////////////////////////////////////////////// + + AutoReg::AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCaseFunction( function, lineInfo, nameAndDesc ); + } + + AutoReg::~AutoReg() {} + +} // end namespace Catch + +// #included from: catch_reporter_registry.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED + +#include + +namespace Catch { + + class ReporterRegistry : public IReporterRegistry { + + public: + + virtual ~ReporterRegistry() CATCH_OVERRIDE {} + + virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { + FactoryMap::const_iterator it = m_factories.find( name ); + if( it == m_factories.end() ) + return CATCH_NULL; + return it->second->create( ReporterConfig( config ) ); + } + + void registerReporter( std::string const& name, Ptr const& factory ) { + m_factories.insert( std::make_pair( name, factory ) ); + } + void registerListener( Ptr const& factory ) { + m_listeners.push_back( factory ); + } + + virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { + return m_factories; + } + virtual Listeners const& getListeners() const CATCH_OVERRIDE { + return m_listeners; + } + + private: + FactoryMap m_factories; + Listeners m_listeners; + }; +} + +// #included from: catch_exception_translator_registry.hpp +#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED + +#ifdef __OBJC__ +#import "Foundation/Foundation.h" +#endif + +namespace Catch { + + class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { + public: + ~ExceptionTranslatorRegistry() { + deleteAll( m_translators ); + } + + virtual void registerTranslator( const IExceptionTranslator* translator ) { + m_translators.push_back( translator ); + } + + virtual std::string translateActiveException() const { + try { +#ifdef __OBJC__ + // In Objective-C try objective-c exceptions first + @try { + return tryTranslators(); + } + @catch (NSException *exception) { + return Catch::toString( [exception description] ); + } +#else + return tryTranslators(); +#endif + } + catch( TestFailureException& ) { + throw; + } + catch( std::exception& ex ) { + return ex.what(); + } + catch( std::string& msg ) { + return msg; + } + catch( const char* msg ) { + return msg; + } + catch(...) { + return "Unknown exception"; + } + } + + std::string tryTranslators() const { + if( m_translators.empty() ) + throw; + else + return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); + } + + private: + std::vector m_translators; + }; +} + +// #included from: catch_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED + +#include + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + virtual ~TagAliasRegistry(); + virtual Option find( std::string const& alias ) const; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; + void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); + + private: + std::map m_registry; + }; + +} // end namespace Catch + +namespace Catch { + + namespace { + + class RegistryHub : public IRegistryHub, public IMutableRegistryHub { + + RegistryHub( RegistryHub const& ); + void operator=( RegistryHub const& ); + + public: // IRegistryHub + RegistryHub() { + } + virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { + return m_reporterRegistry; + } + virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { + return m_testCaseRegistry; + } + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { + return m_exceptionTranslatorRegistry; + } + virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE { + return m_tagAliasRegistry; + } + + public: // IMutableRegistryHub + virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { + m_reporterRegistry.registerReporter( name, factory ); + } + virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { + m_reporterRegistry.registerListener( factory ); + } + virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { + m_testCaseRegistry.registerTest( testInfo ); + } + virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { + m_exceptionTranslatorRegistry.registerTranslator( translator ); + } + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE { + m_tagAliasRegistry.add( alias, tag, lineInfo ); + } + + private: + TestRegistry m_testCaseRegistry; + ReporterRegistry m_reporterRegistry; + ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + TagAliasRegistry m_tagAliasRegistry; + }; + + // Single, global, instance + inline RegistryHub*& getTheRegistryHub() { + static RegistryHub* theRegistryHub = CATCH_NULL; + if( !theRegistryHub ) + theRegistryHub = new RegistryHub(); + return theRegistryHub; + } + } + + IRegistryHub& getRegistryHub() { + return *getTheRegistryHub(); + } + IMutableRegistryHub& getMutableRegistryHub() { + return *getTheRegistryHub(); + } + void cleanUp() { + delete getTheRegistryHub(); + getTheRegistryHub() = CATCH_NULL; + cleanUpContext(); + } + std::string translateActiveException() { + return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); + } + +} // end namespace Catch + +// #included from: catch_notimplemented_exception.hpp +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED + +#include + +namespace Catch { + + NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) + : m_lineInfo( lineInfo ) { + std::ostringstream oss; + oss << lineInfo << ": function "; + oss << "not implemented"; + m_what = oss.str(); + } + + const char* NotImplementedException::what() const CATCH_NOEXCEPT { + return m_what.c_str(); + } + +} // end namespace Catch + +// #included from: catch_context_impl.hpp +#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED + +// #included from: catch_stream.hpp +#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + + template + class StreamBufImpl : public StreamBufBase { + char data[bufferSize]; + WriterF m_writer; + + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } + + ~StreamBufImpl() CATCH_NOEXCEPT { + sync(); + } + + private: + int overflow( int c ) { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast( c ) ) ); + else + sputc( static_cast( c ) ); + } + return 0; + } + + int sync() { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + FileStream::FileStream( std::string const& filename ) { + m_ofs.open( filename.c_str() ); + if( m_ofs.fail() ) { + std::ostringstream oss; + oss << "Unable to open file: '" << filename << '\''; + throw std::domain_error( oss.str() ); + } + } + + std::ostream& FileStream::stream() const { + return m_ofs; + } + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + DebugOutStream::DebugOutStream() + : m_streamBuf( new StreamBufImpl() ), + m_os( m_streamBuf.get() ) + {} + + std::ostream& DebugOutStream::stream() const { + return m_os; + } + + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream::CoutStream() + : m_os( Catch::cout().rdbuf() ) + {} + + std::ostream& CoutStream::stream() const { + return m_os; + } + +#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions + std::ostream& cout() { + return std::cout; + } + std::ostream& cerr() { + return std::cerr; + } +#endif +} + +namespace Catch { + + class Context : public IMutableContext { + + Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} + Context( Context const& ); + void operator=( Context const& ); + + public: + virtual ~Context() { + deleteAllValues( m_generatorsByTestName ); + } + + public: // IContext + virtual IResultCapture* getResultCapture() { + return m_resultCapture; + } + virtual IRunner* getRunner() { + return m_runner; + } + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { + return getGeneratorsForCurrentTest() + .getGeneratorInfo( fileInfo, totalSize ) + .getCurrentIndex(); + } + virtual bool advanceGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + return generators && generators->moveNext(); + } + + virtual Ptr getConfig() const { + return m_config; + } + + public: // IMutableContext + virtual void setResultCapture( IResultCapture* resultCapture ) { + m_resultCapture = resultCapture; + } + virtual void setRunner( IRunner* runner ) { + m_runner = runner; + } + virtual void setConfig( Ptr const& config ) { + m_config = config; + } + + friend IMutableContext& getCurrentMutableContext(); + + private: + IGeneratorsForTest* findGeneratorsForCurrentTest() { + std::string testName = getResultCapture()->getCurrentTestName(); + + std::map::const_iterator it = + m_generatorsByTestName.find( testName ); + return it != m_generatorsByTestName.end() + ? it->second + : CATCH_NULL; + } + + IGeneratorsForTest& getGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + if( !generators ) { + std::string testName = getResultCapture()->getCurrentTestName(); + generators = createGeneratorsForTest(); + m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); + } + return *generators; + } + + private: + Ptr m_config; + IRunner* m_runner; + IResultCapture* m_resultCapture; + std::map m_generatorsByTestName; + }; + + namespace { + Context* currentContext = CATCH_NULL; + } + IMutableContext& getCurrentMutableContext() { + if( !currentContext ) + currentContext = new Context(); + return *currentContext; + } + IContext& getCurrentContext() { + return getCurrentMutableContext(); + } + + void cleanUpContext() { + delete currentContext; + currentContext = CATCH_NULL; + } +} + +// #included from: catch_console_colour_impl.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED + +// #included from: catch_errno_guard.hpp +#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED + +#include + +namespace Catch { + + class ErrnoGuard { + public: + ErrnoGuard():m_oldErrno(errno){} + ~ErrnoGuard() { errno = m_oldErrno; } + private: + int m_oldErrno; + }; + +} + +namespace Catch { + namespace { + + struct IColourImpl { + virtual ~IColourImpl() {} + virtual void use( Colour::Code _colourCode ) = 0; + }; + + struct NoColourImpl : IColourImpl { + void use( Colour::Code ) {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + + } // anon namespace +} // namespace Catch + +#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) +# ifdef CATCH_PLATFORM_WINDOWS +# define CATCH_CONFIG_COLOUR_WINDOWS +# else +# define CATCH_CONFIG_COLOUR_ANSI +# endif +#endif + +#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// + +namespace Catch { +namespace { + + class Win32ColourImpl : public IColourImpl { + public: + Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) + { + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); + originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); + originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); + } + + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: return setTextAttribute( originalForegroundAttributes ); + case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::Red: return setTextAttribute( FOREGROUND_RED ); + case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); + case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); + case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); + case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); + case Colour::Grey: return setTextAttribute( 0 ); + + case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); + case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); + case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); + case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + + private: + void setTextAttribute( WORD _textAttribute ) { + SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); + } + HANDLE stdoutHandle; + WORD originalForegroundAttributes; + WORD originalBackgroundAttributes; + }; + + IColourImpl* platformColourInstance() { + static Win32ColourImpl s_instance; + + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = !isDebuggerActive() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// + +#include + +namespace Catch { +namespace { + + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public IColourImpl { + public: + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0;34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; + } + + private: + void setColour( const char* _escapeCode ) { + Catch::cout() << '\033' << _escapeCode; + } + }; + + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#else // not Windows or ANSI /////////////////////////////////////////////// + +namespace Catch { + + static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } + +} // end namespace Catch + +#endif // Windows/ ANSI/ None + +namespace Catch { + + Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } + Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } + Colour::~Colour(){ if( !m_moved ) use( None ); } + + void Colour::use( Code _colourCode ) { + static IColourImpl* impl = platformColourInstance(); + impl->use( _colourCode ); + } + +} // end namespace Catch + +// #included from: catch_generators_impl.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED + +#include +#include +#include + +namespace Catch { + + struct GeneratorInfo : IGeneratorInfo { + + GeneratorInfo( std::size_t size ) + : m_size( size ), + m_currentIndex( 0 ) + {} + + bool moveNext() { + if( ++m_currentIndex == m_size ) { + m_currentIndex = 0; + return false; + } + return true; + } + + std::size_t getCurrentIndex() const { + return m_currentIndex; + } + + std::size_t m_size; + std::size_t m_currentIndex; + }; + + /////////////////////////////////////////////////////////////////////////// + + class GeneratorsForTest : public IGeneratorsForTest { + + public: + ~GeneratorsForTest() { + deleteAll( m_generatorsInOrder ); + } + + IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { + std::map::const_iterator it = m_generatorsByName.find( fileInfo ); + if( it == m_generatorsByName.end() ) { + IGeneratorInfo* info = new GeneratorInfo( size ); + m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); + m_generatorsInOrder.push_back( info ); + return *info; + } + return *it->second; + } + + bool moveNext() { + std::vector::const_iterator it = m_generatorsInOrder.begin(); + std::vector::const_iterator itEnd = m_generatorsInOrder.end(); + for(; it != itEnd; ++it ) { + if( (*it)->moveNext() ) + return true; + } + return false; + } + + private: + std::map m_generatorsByName; + std::vector m_generatorsInOrder; + }; + + IGeneratorsForTest* createGeneratorsForTest() + { + return new GeneratorsForTest(); + } + +} // end namespace Catch + +// #included from: catch_assertionresult.hpp +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED + +namespace Catch { + + AssertionInfo::AssertionInfo( char const * _macroName, + SourceLineInfo const& _lineInfo, + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg) + : macroName( _macroName ), + lineInfo( _lineInfo ), + capturedExpression( _capturedExpression ), + resultDisposition( _resultDisposition ), + secondArg( _secondArg ) + {} + + AssertionResult::AssertionResult() {} + + AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) + : m_info( info ), + m_resultData( data ) + {} + + AssertionResult::~AssertionResult() {} + + // Result was a success + bool AssertionResult::succeeded() const { + return Catch::isOk( m_resultData.resultType ); + } + + // Result was a success, or failure is suppressed + bool AssertionResult::isOk() const { + return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); + } + + ResultWas::OfType AssertionResult::getResultType() const { + return m_resultData.resultType; + } + + bool AssertionResult::hasExpression() const { + return m_info.capturedExpression[0] != 0; + } + + bool AssertionResult::hasMessage() const { + return !m_resultData.message.empty(); + } + + std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) { + return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"') + ? capturedExpression + : std::string(capturedExpression) + ", " + secondArg; + } + + std::string AssertionResult::getExpression() const { + if( isFalseTest( m_info.resultDisposition ) ) + return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + else + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + } + std::string AssertionResult::getExpressionInMacro() const { + if( m_info.macroName[0] == 0 ) + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); + else + return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )"; + } + + bool AssertionResult::hasExpandedExpression() const { + return hasExpression() && getExpandedExpression() != getExpression(); + } + + std::string AssertionResult::getExpandedExpression() const { + return m_resultData.reconstructExpression(); + } + + std::string AssertionResult::getMessage() const { + return m_resultData.message; + } + SourceLineInfo AssertionResult::getSourceInfo() const { + return m_info.lineInfo; + } + + std::string AssertionResult::getTestMacroName() const { + return m_info.macroName; + } + + void AssertionResult::discardDecomposedExpression() const { + m_resultData.decomposedExpression = CATCH_NULL; + } + + void AssertionResult::expandDecomposedExpression() const { + m_resultData.reconstructExpression(); + } + +} // end namespace Catch + +// #included from: catch_test_case_info.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED + +#include + +namespace Catch { + + inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { + if( startsWith( tag, '.' ) || + tag == "hide" || + tag == "!hide" ) + return TestCaseInfo::IsHidden; + else if( tag == "!throws" ) + return TestCaseInfo::Throws; + else if( tag == "!shouldfail" ) + return TestCaseInfo::ShouldFail; + else if( tag == "!mayfail" ) + return TestCaseInfo::MayFail; + else if( tag == "!nonportable" ) + return TestCaseInfo::NonPortable; + else + return TestCaseInfo::None; + } + inline bool isReservedTag( std::string const& tag ) { + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] ); + } + inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { + if( isReservedTag( tag ) ) { + std::ostringstream ss; + ss << Colour(Colour::Red) + << "Tag name [" << tag << "] not allowed.\n" + << "Tag names starting with non alpha-numeric characters are reserved\n" + << Colour(Colour::FileName) + << _lineInfo << '\n'; + throw std::runtime_error(ss.str()); + } + } + + TestCase makeTestCase( ITestCase* _testCase, + std::string const& _className, + std::string const& _name, + std::string const& _descOrTags, + SourceLineInfo const& _lineInfo ) + { + bool isHidden( startsWith( _name, "./" ) ); // Legacy support + + // Parse out tags + std::set tags; + std::string desc, tag; + bool inTag = false; + for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { + char c = _descOrTags[i]; + if( !inTag ) { + if( c == '[' ) + inTag = true; + else + desc += c; + } + else { + if( c == ']' ) { + TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); + if( prop == TestCaseInfo::IsHidden ) + isHidden = true; + else if( prop == TestCaseInfo::None ) + enforceNotReservedTag( tag, _lineInfo ); + + tags.insert( tag ); + tag.clear(); + inTag = false; + } + else + tag += c; + } + } + if( isHidden ) { + tags.insert( "hide" ); + tags.insert( "." ); + } + + TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); + return TestCase( _testCase, info ); + } + + void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) + { + testCaseInfo.tags = tags; + testCaseInfo.lcaseTags.clear(); + + std::ostringstream oss; + for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { + oss << '[' << *it << ']'; + std::string lcaseTag = toLower( *it ); + testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); + testCaseInfo.lcaseTags.insert( lcaseTag ); + } + testCaseInfo.tagsAsString = oss.str(); + } + + TestCaseInfo::TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set const& _tags, + SourceLineInfo const& _lineInfo ) + : name( _name ), + className( _className ), + description( _description ), + lineInfo( _lineInfo ), + properties( None ) + { + setTags( *this, _tags ); + } + + TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) + : name( other.name ), + className( other.className ), + description( other.description ), + tags( other.tags ), + lcaseTags( other.lcaseTags ), + tagsAsString( other.tagsAsString ), + lineInfo( other.lineInfo ), + properties( other.properties ) + {} + + bool TestCaseInfo::isHidden() const { + return ( properties & IsHidden ) != 0; + } + bool TestCaseInfo::throws() const { + return ( properties & Throws ) != 0; + } + bool TestCaseInfo::okToFail() const { + return ( properties & (ShouldFail | MayFail ) ) != 0; + } + bool TestCaseInfo::expectedToFail() const { + return ( properties & (ShouldFail ) ) != 0; + } + + TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} + + TestCase::TestCase( TestCase const& other ) + : TestCaseInfo( other ), + test( other.test ) + {} + + TestCase TestCase::withName( std::string const& _newName ) const { + TestCase other( *this ); + other.name = _newName; + return other; + } + + void TestCase::swap( TestCase& other ) { + test.swap( other.test ); + name.swap( other.name ); + className.swap( other.className ); + description.swap( other.description ); + tags.swap( other.tags ); + lcaseTags.swap( other.lcaseTags ); + tagsAsString.swap( other.tagsAsString ); + std::swap( TestCaseInfo::properties, static_cast( other ).properties ); + std::swap( lineInfo, other.lineInfo ); + } + + void TestCase::invoke() const { + test->invoke(); + } + + bool TestCase::operator == ( TestCase const& other ) const { + return test.get() == other.test.get() && + name == other.name && + className == other.className; + } + + bool TestCase::operator < ( TestCase const& other ) const { + return name < other.name; + } + TestCase& TestCase::operator = ( TestCase const& other ) { + TestCase temp( other ); + swap( temp ); + return *this; + } + + TestCaseInfo const& TestCase::getTestCaseInfo() const + { + return *this; + } + +} // end namespace Catch + +// #included from: catch_version.hpp +#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED + +namespace Catch { + + Version::Version + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) + {} + + std::ostream& operator << ( std::ostream& os, Version const& version ) { + os << version.majorVersion << '.' + << version.minorVersion << '.' + << version.patchNumber; + // branchName is never null -> 0th char is \0 if it is empty + if (version.branchName[0]) { + os << '-' << version.branchName + << '.' << version.buildNumber; + } + return os; + } + + inline Version libraryVersion() { + static Version version( 1, 9, 6, "", 0 ); + return version; + } + +} + +// #included from: catch_message.hpp +#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED + +namespace Catch { + + MessageInfo::MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) + {} + + // This may need protecting if threading support is added + unsigned int MessageInfo::globalCount = 0; + + //////////////////////////////////////////////////////////////////////////// + + ScopedMessage::ScopedMessage( MessageBuilder const& builder ) + : m_info( builder.m_info ) + { + m_info.message = builder.m_stream.str(); + getResultCapture().pushScopedMessage( m_info ); + } + ScopedMessage::ScopedMessage( ScopedMessage const& other ) + : m_info( other.m_info ) + {} + + ScopedMessage::~ScopedMessage() { + if ( !std::uncaught_exception() ){ + getResultCapture().popScopedMessage(m_info); + } + } + +} // end namespace Catch + +// #included from: catch_legacy_reporter_adapter.hpp +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED + +// #included from: catch_legacy_reporter_adapter.h +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED + +namespace Catch +{ + // Deprecated + struct IReporter : IShared { + virtual ~IReporter(); + + virtual bool shouldRedirectStdout() const = 0; + + virtual void StartTesting() = 0; + virtual void EndTesting( Totals const& totals ) = 0; + virtual void StartGroup( std::string const& groupName ) = 0; + virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; + virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; + virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; + virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; + virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; + virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; + virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; + virtual void Aborted() = 0; + virtual void Result( AssertionResult const& result ) = 0; + }; + + class LegacyReporterAdapter : public SharedImpl + { + public: + LegacyReporterAdapter( Ptr const& legacyReporter ); + virtual ~LegacyReporterAdapter(); + + virtual ReporterPreferences getPreferences() const; + virtual void noMatchingTestCases( std::string const& ); + virtual void testRunStarting( TestRunInfo const& ); + virtual void testGroupStarting( GroupInfo const& groupInfo ); + virtual void testCaseStarting( TestCaseInfo const& testInfo ); + virtual void sectionStarting( SectionInfo const& sectionInfo ); + virtual void assertionStarting( AssertionInfo const& ); + virtual bool assertionEnded( AssertionStats const& assertionStats ); + virtual void sectionEnded( SectionStats const& sectionStats ); + virtual void testCaseEnded( TestCaseStats const& testCaseStats ); + virtual void testGroupEnded( TestGroupStats const& testGroupStats ); + virtual void testRunEnded( TestRunStats const& testRunStats ); + virtual void skipTest( TestCaseInfo const& ); + + private: + Ptr m_legacyReporter; + }; +} + +namespace Catch +{ + LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) + : m_legacyReporter( legacyReporter ) + {} + LegacyReporterAdapter::~LegacyReporterAdapter() {} + + ReporterPreferences LegacyReporterAdapter::getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); + return prefs; + } + + void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} + void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { + m_legacyReporter->StartTesting(); + } + void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { + m_legacyReporter->StartGroup( groupInfo.name ); + } + void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { + m_legacyReporter->StartTestCase( testInfo ); + } + void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { + m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); + } + void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { + // Not on legacy interface + } + + bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { + for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info ) { + ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); + rb << it->message; + rb.setResultType( ResultWas::Info ); + AssertionResult result = rb.build(); + m_legacyReporter->Result( result ); + } + } + } + m_legacyReporter->Result( assertionStats.assertionResult ); + return true; + } + void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { + if( sectionStats.missingAssertions ) + m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); + m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); + } + void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { + m_legacyReporter->EndTestCase + ( testCaseStats.testInfo, + testCaseStats.totals, + testCaseStats.stdOut, + testCaseStats.stdErr ); + } + void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { + if( testGroupStats.aborting ) + m_legacyReporter->Aborted(); + m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); + } + void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { + m_legacyReporter->EndTesting( testRunStats.totals ); + } + void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { + } +} + +// #included from: catch_timer.hpp + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#endif + +#ifdef CATCH_PLATFORM_WINDOWS + +#else + +#include + +#endif + +namespace Catch { + + namespace { +#ifdef CATCH_PLATFORM_WINDOWS + UInt64 getCurrentTicks() { + static UInt64 hz=0, hzo=0; + if (!hz) { + QueryPerformanceFrequency( reinterpret_cast( &hz ) ); + QueryPerformanceCounter( reinterpret_cast( &hzo ) ); + } + UInt64 t; + QueryPerformanceCounter( reinterpret_cast( &t ) ); + return ((t-hzo)*1000000)/hz; + } +#else + UInt64 getCurrentTicks() { + timeval t; + gettimeofday(&t,CATCH_NULL); + return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); + } +#endif + } + + void Timer::start() { + m_ticks = getCurrentTicks(); + } + unsigned int Timer::getElapsedMicroseconds() const { + return static_cast(getCurrentTicks() - m_ticks); + } + unsigned int Timer::getElapsedMilliseconds() const { + return static_cast(getElapsedMicroseconds()/1000); + } + double Timer::getElapsedSeconds() const { + return getElapsedMicroseconds()/1000000.0; + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +// #included from: catch_common.hpp +#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED + +#include +#include + +namespace Catch { + + bool startsWith( std::string const& s, std::string const& prefix ) { + return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); + } + bool startsWith( std::string const& s, char prefix ) { + return !s.empty() && s[0] == prefix; + } + bool endsWith( std::string const& s, std::string const& suffix ) { + return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); + } + bool endsWith( std::string const& s, char suffix ) { + return !s.empty() && s[s.size()-1] == suffix; + } + bool contains( std::string const& s, std::string const& infix ) { + return s.find( infix ) != std::string::npos; + } + char toLowerCh(char c) { + return static_cast( std::tolower( c ) ); + } + void toLowerInPlace( std::string& s ) { + std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); + } + std::string toLower( std::string const& s ) { + std::string lc = s; + toLowerInPlace( lc ); + return lc; + } + std::string trim( std::string const& str ) { + static char const* whitespaceChars = "\n\r\t "; + std::string::size_type start = str.find_first_not_of( whitespaceChars ); + std::string::size_type end = str.find_last_not_of( whitespaceChars ); + + return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); + } + + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { + bool replaced = false; + std::size_t i = str.find( replaceThis ); + while( i != std::string::npos ) { + replaced = true; + str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); + if( i < str.size()-withThis.size() ) + i = str.find( replaceThis, i+withThis.size() ); + else + i = std::string::npos; + } + return replaced; + } + + pluralise::pluralise( std::size_t count, std::string const& label ) + : m_count( count ), + m_label( label ) + {} + + std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { + os << pluraliser.m_count << ' ' << pluraliser.m_label; + if( pluraliser.m_count != 1 ) + os << 's'; + return os; + } + + SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} + SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) + : file( _file ), + line( _line ) + {} + bool SourceLineInfo::empty() const { + return file[0] == '\0'; + } + bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { + return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); + } + bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { + return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); + } + + void seedRng( IConfig const& config ) { + if( config.rngSeed() != 0 ) + std::srand( config.rngSeed() ); + } + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); + } + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { +#ifndef __GNUG__ + os << info.file << '(' << info.line << ')'; +#else + os << info.file << ':' << info.line; +#endif + return os; + } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { + std::ostringstream oss; + oss << locationInfo << ": Internal Catch error: '" << message << '\''; + if( alwaysTrue() ) + throw std::logic_error( oss.str() ); + } +} + +// #included from: catch_section.hpp +#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED + +namespace Catch { + + SectionInfo::SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description ) + : name( _name ), + description( _description ), + lineInfo( _lineInfo ) + {} + + Section::Section( SectionInfo const& info ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + { + m_timer.start(); + } + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 +#endif + Section::~Section() { + if( m_sectionIncluded ) { + SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); + if( std::uncaught_exception() ) + getResultCapture().sectionEndedEarly( endInfo ); + else + getResultCapture().sectionEnded( endInfo ); + } + } +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + + // This indicates whether the section should be executed or not + Section::operator bool() const { + return m_sectionIncluded; + } + +} // end namespace Catch + +// #included from: catch_debugger.hpp +#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED + +#ifdef CATCH_PLATFORM_MAC + + #include + #include + #include + #include + #include + + namespace Catch{ + + // The following function is taken directly from the following technical note: + // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html + + // Returns true if the current process is being debugged (either + // running under the debugger or has a debugger attached post facto). + bool isDebuggerActive(){ + + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { + Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + } + } // namespace Catch + +#elif defined(CATCH_PLATFORM_LINUX) + #include + #include + + namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } + } + + return false; + } + } // namespace Catch +#elif defined(_MSC_VER) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#else + namespace Catch { + inline bool isDebuggerActive() { return false; } + } +#endif // Platform + +#ifdef CATCH_PLATFORM_WINDOWS + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + ::OutputDebugStringA( text.c_str() ); + } + } +#else + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + Catch::cout() << text; + } + } +#endif // Platform + +// #included from: catch_tostring.hpp +#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED + +namespace Catch { + +namespace Detail { + + const std::string unprintableString = "{?}"; + + namespace { + const int hexThreshold = 255; + + struct Endianness { + enum Arch { Big, Little }; + + static Arch which() { + union _{ + int asInt; + char asChar[sizeof (int)]; + } u; + + u.asInt = 1; + return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; + } + }; + } + + std::string rawMemoryToString( const void *object, std::size_t size ) + { + // Reverse order for little endian architectures + int i = 0, end = static_cast( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; + } + + unsigned char const *bytes = static_cast(object); + std::ostringstream os; + os << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + os << std::setw(2) << static_cast(bytes[i]); + return os.str(); + } +} + +std::string toString( std::string const& value ) { + std::string s = value; + if( getCurrentContext().getConfig()->showInvisibles() ) { + for(size_t i = 0; i < s.size(); ++i ) { + std::string subs; + switch( s[i] ) { + case '\n': subs = "\\n"; break; + case '\t': subs = "\\t"; break; + default: break; + } + if( !subs.empty() ) { + s = s.substr( 0, i ) + subs + s.substr( i+1 ); + ++i; + } + } + } + return '"' + s + '"'; +} +std::string toString( std::wstring const& value ) { + + std::string s; + s.reserve( value.size() ); + for(size_t i = 0; i < value.size(); ++i ) + s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; + return Catch::toString( s ); +} + +std::string toString( const char* const value ) { + return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); +} + +std::string toString( char* const value ) { + return Catch::toString( static_cast( value ) ); +} + +std::string toString( const wchar_t* const value ) +{ + return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); +} + +std::string toString( wchar_t* const value ) +{ + return Catch::toString( static_cast( value ) ); +} + +std::string toString( int value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} + +std::string toString( unsigned long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} + +std::string toString( unsigned int value ) { + return Catch::toString( static_cast( value ) ); +} + +template +std::string fpToString( T value, int precision ) { + std::ostringstream oss; + oss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = oss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; +} + +std::string toString( const double value ) { + return fpToString( value, 10 ); +} +std::string toString( const float value ) { + return fpToString( value, 5 ) + 'f'; +} + +std::string toString( bool value ) { + return value ? "true" : "false"; +} + +std::string toString( char value ) { + if ( value == '\r' ) + return "'\\r'"; + if ( value == '\f' ) + return "'\\f'"; + if ( value == '\n' ) + return "'\\n'"; + if ( value == '\t' ) + return "'\\t'"; + if ( '\0' <= value && value < ' ' ) + return toString( static_cast( value ) ); + char chstr[] = "' '"; + chstr[1] = value; + return chstr; +} + +std::string toString( signed char value ) { + return toString( static_cast( value ) ); +} + +std::string toString( unsigned char value ) { + return toString( static_cast( value ) ); +} + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +std::string toString( unsigned long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +#endif + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ) { + return "nullptr"; +} +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSObject* const& nsObject ) { + return toString( [nsObject description] ); + } +#endif + +} // end namespace Catch + +// #included from: catch_result_builder.hpp +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED + +namespace Catch { + + ResultBuilder::ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition, + char const* secondArg ) + : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ), + m_shouldDebugBreak( false ), + m_shouldThrow( false ), + m_guardException( false ) + { + m_stream().oss.str(""); + } + + ResultBuilder::~ResultBuilder() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if ( m_guardException ) { + m_stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; + captureResult( ResultWas::ThrewException ); + getCurrentContext().getResultCapture()->exceptionEarlyReported(); + } +#endif + } + + ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { + m_data.resultType = result; + return *this; + } + ResultBuilder& ResultBuilder::setResultType( bool result ) { + m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; + return *this; + } + + void ResultBuilder::endExpression( DecomposedExpression const& expr ) { + AssertionResult result = build( expr ); + handleResult( result ); + } + + void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { + m_assertionInfo.resultDisposition = resultDisposition; + m_stream().oss << Catch::translateActiveException(); + captureResult( ResultWas::ThrewException ); + } + + void ResultBuilder::captureResult( ResultWas::OfType resultType ) { + setResultType( resultType ); + captureExpression(); + } + + void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { + if( expectedMessage.empty() ) + captureExpectedException( Matchers::Impl::MatchAllOf() ); + else + captureExpectedException( Matchers::Equals( expectedMessage ) ); + } + + void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase const& matcher ) { + + assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); + AssertionResultData data = m_data; + data.resultType = ResultWas::Ok; + data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + + std::string actualMessage = Catch::translateActiveException(); + if( !matcher.match( actualMessage ) ) { + data.resultType = ResultWas::ExpressionFailed; + data.reconstructedExpression = actualMessage; + } + AssertionResult result( m_assertionInfo, data ); + handleResult( result ); + } + + void ResultBuilder::captureExpression() { + AssertionResult result = build(); + handleResult( result ); + } + + void ResultBuilder::handleResult( AssertionResult const& result ) + { + getResultCapture().assertionEnded( result ); + + if( !result.isOk() ) { + if( getCurrentContext().getConfig()->shouldDebugBreak() ) + m_shouldDebugBreak = true; + if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) + m_shouldThrow = true; + } + } + + void ResultBuilder::react() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if (m_shouldDebugBreak) { + /////////////////////////////////////////////////////////////////// + // To inspect the state during test, you need to go one level up the callstack + // To go back to the test and change execution, jump over the throw statement + /////////////////////////////////////////////////////////////////// + CATCH_BREAK_INTO_DEBUGGER(); + } +#endif + if( m_shouldThrow ) + throw Catch::TestFailureException(); + } + + bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } + bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } + + AssertionResult ResultBuilder::build() const + { + return build( *this ); + } + + // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, + // a temporary DecomposedExpression, which in turn holds references to + // operands, possibly temporary as well. + // It should immediately be passed to handleResult; if the expression + // needs to be reported, its string expansion must be composed before + // the temporaries are destroyed. + AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const + { + assert( m_data.resultType != ResultWas::Unknown ); + AssertionResultData data = m_data; + + // Flip bool results if FalseTest flag is set + if( isFalseTest( m_assertionInfo.resultDisposition ) ) { + data.negate( expr.isBinaryExpression() ); + } + + data.message = m_stream().oss.str(); + data.decomposedExpression = &expr; // for lazy reconstruction + return AssertionResult( m_assertionInfo, data ); + } + + void ResultBuilder::reconstructExpression( std::string& dest ) const { + dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + } + + void ResultBuilder::setExceptionGuard() { + m_guardException = true; + } + void ResultBuilder::unsetExceptionGuard() { + m_guardException = false; + } + +} // end namespace Catch + +// #included from: catch_tag_alias_registry.hpp +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED + +namespace Catch { + + TagAliasRegistry::~TagAliasRegistry() {} + + Option TagAliasRegistry::find( std::string const& alias ) const { + std::map::const_iterator it = m_registry.find( alias ); + if( it != m_registry.end() ) + return it->second; + else + return Option(); + } + + std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { + std::string expandedTestSpec = unexpandedTestSpec; + for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); + it != itEnd; + ++it ) { + std::size_t pos = expandedTestSpec.find( it->first ); + if( pos != std::string::npos ) { + expandedTestSpec = expandedTestSpec.substr( 0, pos ) + + it->second.tag + + expandedTestSpec.substr( pos + it->first.size() ); + } + } + return expandedTestSpec; + } + + void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { + + if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { + std::ostringstream oss; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" + << Colour( Colour::FileName ) + << lineInfo << '\n'; + throw std::domain_error( oss.str().c_str() ); + } + if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { + std::ostringstream oss; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" already registered.\n" + << "\tFirst seen at " + << Colour( Colour::Red ) << find(alias)->lineInfo << '\n' + << Colour( Colour::Red ) << "\tRedefined at " + << Colour( Colour::FileName) << lineInfo << '\n'; + throw std::domain_error( oss.str().c_str() ); + } + } + + ITagAliasRegistry::~ITagAliasRegistry() {} + + ITagAliasRegistry const& ITagAliasRegistry::get() { + return getRegistryHub().getTagAliasRegistry(); + } + + RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { + getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo ); + } + +} // end namespace Catch + +// #included from: catch_matchers_string.hpp + +namespace Catch { +namespace Matchers { + + namespace StdString { + + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } + + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } + + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } + + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } + + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + } // namespace StdString + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + +} // namespace Matchers +} // namespace Catch +// #included from: ../reporters/catch_reporter_multi.hpp +#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED + +namespace Catch { + +class MultipleReporters : public SharedImpl { + typedef std::vector > Reporters; + Reporters m_reporters; + +public: + void add( Ptr const& reporter ) { + m_reporters.push_back( reporter ); + } + +public: // IStreamingReporter + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporters[0]->getPreferences(); + } + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->noMatchingTestCases( spec ); + } + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunStarting( testRunInfo ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupStarting( groupInfo ); + } + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseStarting( testInfo ); + } + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionStarting( sectionInfo ); + } + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->assertionStarting( assertionInfo ); + } + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + bool clearBuffer = false; + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + clearBuffer |= (*it)->assertionEnded( assertionStats ); + return clearBuffer; + } + + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionEnded( sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupEnded( testGroupStats ); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunEnded( testRunStats ); + } + + virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->skipTest( testInfo ); + } + + virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { + return this; + } + +}; + +Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { + Ptr resultingReporter; + + if( existingReporter ) { + MultipleReporters* multi = existingReporter->tryAsMulti(); + if( !multi ) { + multi = new MultipleReporters; + resultingReporter = Ptr( multi ); + if( existingReporter ) + multi->add( existingReporter ); + } + else + resultingReporter = existingReporter; + multi->add( additionalReporter ); + } + else + resultingReporter = additionalReporter; + + return resultingReporter; +} + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_xml.hpp +#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED + +// #included from: catch_reporter_bases.hpp +#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + namespace { + // Because formatting using c++ streams is stateful, drop down to C is required + // Alternatively we could use stringstream, but its performance is... not good. + std::string getFormattedDuration( double duration ) { + // Max exponent + 1 is required to represent the whole part + // + 1 for decimal point + // + 3 for the 3 decimal places + // + 1 for null terminator + const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; + char buffer[maxDoubleSize]; + + // Save previous errno, to prevent sprintf from overwriting it + ErrnoGuard guard; +#ifdef _MSC_VER + sprintf_s(buffer, "%.3f", duration); +#else + sprintf(buffer, "%.3f", duration); +#endif + return std::string(buffer); + } + } + + struct StreamingReporterBase : SharedImpl { + + StreamingReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + } + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } + + virtual ~StreamingReporterBase() CATCH_OVERRIDE; + + virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} + + virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { + currentTestRunInfo = _testRunInfo; + } + virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { + currentGroupInfo = _groupInfo; + } + + virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { + currentTestCaseInfo = _testInfo; + } + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { + m_sectionStack.push_back( _sectionInfo ); + } + + virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { + currentTestCaseInfo.reset(); + } + virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { + currentGroupInfo.reset(); + } + virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { + currentTestCaseInfo.reset(); + currentGroupInfo.reset(); + currentTestRunInfo.reset(); + } + + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { + // Don't do anything with this by default. + // It can optionally be overridden in the derived class. + } + + Ptr m_config; + std::ostream& stream; + + LazyStat currentTestRunInfo; + LazyStat currentGroupInfo; + LazyStat currentTestCaseInfo; + + std::vector m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + struct CumulativeReporterBase : SharedImpl { + template + struct Node : SharedImpl<> { + explicit Node( T const& _value ) : value( _value ) {} + virtual ~Node() {} + + typedef std::vector > ChildNodes; + T value; + ChildNodes children; + }; + struct SectionNode : SharedImpl<> { + explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} + virtual ~SectionNode(); + + bool operator == ( SectionNode const& other ) const { + return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; + } + bool operator == ( Ptr const& other ) const { + return operator==( *other ); + } + + SectionStats stats; + typedef std::vector > ChildSections; + typedef std::vector Assertions; + ChildSections childSections; + Assertions assertions; + std::string stdOut; + std::string stdErr; + }; + + struct BySectionInfo { + BySectionInfo( SectionInfo const& other ) : m_other( other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + bool operator() ( Ptr const& node ) const { + return node->stats.sectionInfo.lineInfo == m_other.lineInfo; + } + private: + void operator=( BySectionInfo const& ); + SectionInfo const& m_other; + }; + + typedef Node TestCaseNode; + typedef Node TestGroupNode; + typedef Node TestRunNode; + + CumulativeReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + } + ~CumulativeReporterBase(); + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } + + virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} + virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} + + virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); + Ptr node; + if( m_sectionStack.empty() ) { + if( !m_rootSection ) + m_rootSection = new SectionNode( incompleteStats ); + node = m_rootSection; + } + else { + SectionNode& parentNode = *m_sectionStack.back(); + SectionNode::ChildSections::const_iterator it = + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); + if( it == parentNode.childSections.end() ) { + node = new SectionNode( incompleteStats ); + parentNode.childSections.push_back( node ); + } + else + node = *it; + } + m_sectionStack.push_back( node ); + m_deepestSection = node; + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} + + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + assert( !m_sectionStack.empty() ); + SectionNode& sectionNode = *m_sectionStack.back(); + sectionNode.assertions.push_back( assertionStats ); + // AssertionResult holds a pointer to a temporary DecomposedExpression, + // which getExpandedExpression() calls to build the expression string. + // Our section stack copy of the assertionResult will likely outlive the + // temporary, so it must be expanded or discarded now to avoid calling + // a destroyed object later. + prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); + return true; + } + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + assert( !m_sectionStack.empty() ); + SectionNode& node = *m_sectionStack.back(); + node.stats = sectionStats; + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + Ptr node = new TestCaseNode( testCaseStats ); + assert( m_sectionStack.size() == 0 ); + node->children.push_back( m_rootSection ); + m_testCases.push_back( node ); + m_rootSection.reset(); + + assert( m_deepestSection ); + m_deepestSection->stdOut = testCaseStats.stdOut; + m_deepestSection->stdErr = testCaseStats.stdErr; + } + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + Ptr node = new TestGroupNode( testGroupStats ); + node->children.swap( m_testCases ); + m_testGroups.push_back( node ); + } + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + Ptr node = new TestRunNode( testRunStats ); + node->children.swap( m_testGroups ); + m_testRuns.push_back( node ); + testRunEndedCumulative(); + } + virtual void testRunEndedCumulative() = 0; + + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void prepareExpandedExpression( AssertionResult& result ) const { + if( result.isOk() ) + result.discardDecomposedExpression(); + else + result.expandDecomposedExpression(); + } + + Ptr m_config; + std::ostream& stream; + std::vector m_assertions; + std::vector > > m_sections; + std::vector > m_testCases; + std::vector > m_testGroups; + + std::vector > m_testRuns; + + Ptr m_rootSection; + Ptr m_deepestSection; + std::vector > m_sectionStack; + ReporterPreferences m_reporterPrefs; + + }; + + template + char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + struct TestEventListenerBase : StreamingReporterBase { + TestEventListenerBase( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} + virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { + return false; + } + }; + +} // end namespace Catch + +// #included from: ../internal/catch_reporter_registrars.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED + +namespace Catch { + + template + class LegacyReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new LegacyReporterAdapter( new T( config ) ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + LegacyReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; + + template + class ReporterRegistrar { + + class ReporterFactory : public SharedImpl { + + // *** Please Note ***: + // - If you end up here looking at a compiler error because it's trying to register + // your custom reporter class be aware that the native reporter interface has changed + // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via + // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. + // However please consider updating to the new interface as the old one is now + // deprecated and will probably be removed quite soon! + // Please contact me via github if you have any questions at all about this. + // In fact, ideally, please contact me anyway to let me know you've hit this - as I have + // no idea who is actually using custom reporters at all (possibly no-one!). + // The new interface is designed to minimise exposure to interface changes in the future. + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + ReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; + + template + class ListenerRegistrar { + + class ListenerFactory : public SharedImpl { + + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + virtual std::string getDescription() const { + return std::string(); + } + }; + + public: + + ListenerRegistrar() { + getMutableRegistryHub().registerListener( new ListenerFactory() ); + } + }; +} + +#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ + namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } + +#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ + namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } + +// Deprecated - use the form without INTERNAL_ +#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } + +#define CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } + +// #included from: ../internal/catch_xmlwriter.hpp +#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED + +#include +#include +#include +#include + +namespace Catch { + + class XmlEncode { + public: + enum ForWhat { ForTextNodes, ForAttributes }; + + XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) + : m_str( str ), + m_forWhat( forWhat ) + {} + + void encodeTo( std::ostream& os ) const { + + // Apostrophe escaping not necessary if we always use " to write attributes + // (see: http://www.w3.org/TR/xml/#syntax) + + for( std::size_t i = 0; i < m_str.size(); ++ i ) { + char c = m_str[i]; + switch( c ) { + case '<': os << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) + os << ">"; + else + os << c; + break; + + case '\"': + if( m_forWhat == ForAttributes ) + os << """; + else + os << c; + break; + + default: + // Escape control chars - based on contribution by @espenalb in PR #465 and + // by @mrpi PR #588 + if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) { + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast( c ); + } + else + os << c; + } + } + } + + friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { + xmlEncode.encodeTo( os ); + return os; + } + + private: + std::string m_str; + ForWhat m_forWhat; + }; + + class XmlWriter { + public: + + class ScopedElement { + public: + ScopedElement( XmlWriter* writer ) + : m_writer( writer ) + {} + + ScopedElement( ScopedElement const& other ) + : m_writer( other.m_writer ){ + other.m_writer = CATCH_NULL; + } + + ~ScopedElement() { + if( m_writer ) + m_writer->endElement(); + } + + ScopedElement& writeText( std::string const& text, bool indent = true ) { + m_writer->writeText( text, indent ); + return *this; + } + + template + ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { + m_writer->writeAttribute( name, attribute ); + return *this; + } + + private: + mutable XmlWriter* m_writer; + }; + + XmlWriter() + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( Catch::cout() ) + { + writeDeclaration(); + } + + XmlWriter( std::ostream& os ) + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( os ) + { + writeDeclaration(); + } + + ~XmlWriter() { + while( !m_tags.empty() ) + endElement(); + } + + XmlWriter& startElement( std::string const& name ) { + ensureTagClosed(); + newlineIfNecessary(); + m_os << m_indent << '<' << name; + m_tags.push_back( name ); + m_indent += " "; + m_tagIsOpen = true; + return *this; + } + + ScopedElement scopedElement( std::string const& name ) { + ScopedElement scoped( this ); + startElement( name ); + return scoped; + } + + XmlWriter& endElement() { + newlineIfNecessary(); + m_indent = m_indent.substr( 0, m_indent.size()-2 ); + if( m_tagIsOpen ) { + m_os << "/>"; + m_tagIsOpen = false; + } + else { + m_os << m_indent << ""; + } + m_os << std::endl; + m_tags.pop_back(); + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { + if( !name.empty() && !attribute.empty() ) + m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, bool attribute ) { + m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; + return *this; + } + + template + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + std::ostringstream oss; + oss << attribute; + return writeAttribute( name, oss.str() ); + } + + XmlWriter& writeText( std::string const& text, bool indent = true ) { + if( !text.empty() ){ + bool tagWasOpen = m_tagIsOpen; + ensureTagClosed(); + if( tagWasOpen && indent ) + m_os << m_indent; + m_os << XmlEncode( text ); + m_needsNewline = true; + } + return *this; + } + + XmlWriter& writeComment( std::string const& text ) { + ensureTagClosed(); + m_os << m_indent << ""; + m_needsNewline = true; + return *this; + } + + void writeStylesheetRef( std::string const& url ) { + m_os << "\n"; + } + + XmlWriter& writeBlankLine() { + ensureTagClosed(); + m_os << '\n'; + return *this; + } + + void ensureTagClosed() { + if( m_tagIsOpen ) { + m_os << ">" << std::endl; + m_tagIsOpen = false; + } + } + + private: + XmlWriter( XmlWriter const& ); + void operator=( XmlWriter const& ); + + void writeDeclaration() { + m_os << "\n"; + } + + void newlineIfNecessary() { + if( m_needsNewline ) { + m_os << std::endl; + m_needsNewline = false; + } + } + + bool m_tagIsOpen; + bool m_needsNewline; + std::vector m_tags; + std::string m_indent; + std::ostream& m_os; + }; + +} + +namespace Catch { + class XmlReporter : public StreamingReporterBase { + public: + XmlReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_xml(_config.stream()), + m_sectionDepth( 0 ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + virtual ~XmlReporter() CATCH_OVERRIDE; + + static std::string getDescription() { + return "Reports test results as an XML document"; + } + + virtual std::string getStylesheetRef() const { + return std::string(); + } + + void writeSourceInfo( SourceLineInfo const& sourceInfo ) { + m_xml + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); + } + + public: // StreamingReporterBase + + virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { + StreamingReporterBase::noMatchingTestCases( s ); + } + + virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testRunStarting( testInfo ); + std::string stylesheetRef = getStylesheetRef(); + if( !stylesheetRef.empty() ) + m_xml.writeStylesheetRef( stylesheetRef ); + m_xml.startElement( "Catch" ); + if( !m_config->name().empty() ) + m_xml.writeAttribute( "name", m_config->name() ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupStarting( groupInfo ); + m_xml.startElement( "Group" ) + .writeAttribute( "name", groupInfo.name ); + } + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseStarting(testInfo); + m_xml.startElement( "TestCase" ) + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString ); + + writeSourceInfo( testInfo.lineInfo ); + + if ( m_config->showDurations() == ShowDurations::Always ) + m_testCaseTimer.start(); + m_xml.ensureTagClosed(); + } + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + StreamingReporterBase::sectionStarting( sectionInfo ); + if( m_sectionDepth++ > 0 ) { + m_xml.startElement( "Section" ) + .writeAttribute( "name", trim( sectionInfo.name ) ) + .writeAttribute( "description", sectionInfo.description ); + writeSourceInfo( sectionInfo.lineInfo ); + m_xml.ensureTagClosed(); + } + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } + + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + + AssertionResult const& result = assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + if( includeResults ) { + // Print any info messages in tags. + for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info ) { + m_xml.scopedElement( "Info" ) + .writeText( it->message ); + } else if ( it->type == ResultWas::Warning ) { + m_xml.scopedElement( "Warning" ) + .writeText( it->message ); + } + } + } + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return true; + + // Print the expression if there is one. + if( result.hasExpression() ) { + m_xml.startElement( "Expression" ) + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); + + writeSourceInfo( result.getSourceInfo() ); + + m_xml.scopedElement( "Original" ) + .writeText( result.getExpression() ); + m_xml.scopedElement( "Expanded" ) + .writeText( result.getExpandedExpression() ); + } + + // And... Print a result applicable to each result type. + switch( result.getResultType() ) { + case ResultWas::ThrewException: + m_xml.startElement( "Exception" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::FatalErrorCondition: + m_xml.startElement( "FatalErrorCondition" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::Info: + m_xml.scopedElement( "Info" ) + .writeText( result.getMessage() ); + break; + case ResultWas::Warning: + // Warning will already have been written + break; + case ResultWas::ExplicitFailure: + m_xml.startElement( "Failure" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + default: + break; + } + + if( result.hasExpression() ) + m_xml.endElement(); + + return true; + } + + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + StreamingReporterBase::sectionEnded( sectionStats ); + if( --m_sectionDepth > 0 ) { + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); + e.writeAttribute( "successes", sectionStats.assertions.passed ); + e.writeAttribute( "failures", sectionStats.assertions.failed ); + e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); + + m_xml.endElement(); + } + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseEnded( testCaseStats ); + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); + e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); + + m_xml.endElement(); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupEnded( testGroupStats ); + // TODO: Check testGroupStats.aborting and act accordingly. + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + StreamingReporterBase::testRunEnded( testRunStats ); + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + private: + Timer m_testCaseTimer; + XmlWriter m_xml; + int m_sectionDepth; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_junit.hpp +#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED + +#include + +namespace Catch { + + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + } + + class JunitReporter : public CumulativeReporterBase { + public: + JunitReporter( ReporterConfig const& _config ) + : CumulativeReporterBase( _config ), + xml( _config.stream() ), + m_okToFail( false ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + virtual ~JunitReporter() CATCH_OVERRIDE; + + static std::string getDescription() { + return "Reports test results in an XML format that looks like Ant's junitreport target"; + } + + virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} + + virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { + CumulativeReporterBase::testRunStarting( runInfo ); + xml.startElement( "testsuites" ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + suiteTimer.start(); + stdOutForSuite.str(""); + stdErrForSuite.str(""); + unexpectedExceptions = 0; + CumulativeReporterBase::testGroupStarting( groupInfo ); + } + + virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE { + m_okToFail = testCaseInfo.okToFail(); + } + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) + unexpectedExceptions++; + return CumulativeReporterBase::assertionEnded( assertionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + stdOutForSuite << testCaseStats.stdOut; + stdErrForSuite << testCaseStats.stdErr; + CumulativeReporterBase::testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + double suiteTime = suiteTimer.getElapsedSeconds(); + CumulativeReporterBase::testGroupEnded( testGroupStats ); + writeGroup( *m_testGroups.back(), suiteTime ); + } + + virtual void testRunEndedCumulative() CATCH_OVERRIDE { + xml.endElement(); + } + + void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); + TestGroupStats const& stats = groupNode.value; + xml.writeAttribute( "name", stats.groupInfo.name ); + xml.writeAttribute( "errors", unexpectedExceptions ); + xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); + xml.writeAttribute( "tests", stats.totals.assertions.total() ); + xml.writeAttribute( "hostname", "tbd" ); // !TBD + if( m_config->showDurations() == ShowDurations::Never ) + xml.writeAttribute( "time", "" ); + else + xml.writeAttribute( "time", suiteTime ); + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); + + // Write test cases + for( TestGroupNode::ChildNodes::const_iterator + it = groupNode.children.begin(), itEnd = groupNode.children.end(); + it != itEnd; + ++it ) + writeTestCase( **it ); + + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); + } + + void writeTestCase( TestCaseNode const& testCaseNode ) { + TestCaseStats const& stats = testCaseNode.value; + + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert( testCaseNode.children.size() == 1 ); + SectionNode const& rootSection = *testCaseNode.children.front(); + + std::string className = stats.testInfo.className; + + if( className.empty() ) { + if( rootSection.childSections.empty() ) + className = "global"; + } + writeSection( className, "", rootSection ); + } + + void writeSection( std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode ) { + std::string name = trim( sectionNode.stats.sectionInfo.name ); + if( !rootName.empty() ) + name = rootName + '/' + name; + + if( !sectionNode.assertions.empty() || + !sectionNode.stdOut.empty() || + !sectionNode.stdErr.empty() ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); + if( className.empty() ) { + xml.writeAttribute( "classname", name ); + xml.writeAttribute( "name", "root" ); + } + else { + xml.writeAttribute( "classname", className ); + xml.writeAttribute( "name", name ); + } + xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); + + writeAssertions( sectionNode ); + + if( !sectionNode.stdOut.empty() ) + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); + if( !sectionNode.stdErr.empty() ) + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); + } + for( SectionNode::ChildSections::const_iterator + it = sectionNode.childSections.begin(), + itEnd = sectionNode.childSections.end(); + it != itEnd; + ++it ) + if( className.empty() ) + writeSection( name, "", **it ); + else + writeSection( className, name, **it ); + } + + void writeAssertions( SectionNode const& sectionNode ) { + for( SectionNode::Assertions::const_iterator + it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); + it != itEnd; + ++it ) + writeAssertion( *it ); + } + void writeAssertion( AssertionStats const& stats ) { + AssertionResult const& result = stats.assertionResult; + if( !result.isOk() ) { + std::string elementName; + switch( result.getResultType() ) { + case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + elementName = "failure"; + break; + case ResultWas::ExpressionFailed: + elementName = "failure"; + break; + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + + XmlWriter::ScopedElement e = xml.scopedElement( elementName ); + + xml.writeAttribute( "message", result.getExpandedExpression() ); + xml.writeAttribute( "type", result.getTestMacroName() ); + + std::ostringstream oss; + if( !result.getMessage().empty() ) + oss << result.getMessage() << '\n'; + for( std::vector::const_iterator + it = stats.infoMessages.begin(), + itEnd = stats.infoMessages.end(); + it != itEnd; + ++it ) + if( it->type == ResultWas::Info ) + oss << it->message << '\n'; + + oss << "at " << result.getSourceInfo(); + xml.writeText( oss.str(), false ); + } + } + + XmlWriter xml; + Timer suiteTimer; + std::ostringstream stdOutForSuite; + std::ostringstream stdErrForSuite; + unsigned int unexpectedExceptions; + bool m_okToFail; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_console.hpp +#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED + +#include +#include + +namespace Catch { + + struct ConsoleReporter : StreamingReporterBase { + ConsoleReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_headerPrinted( false ) + {} + + virtual ~ConsoleReporter() CATCH_OVERRIDE; + static std::string getDescription() { + return "Reports test results as plain lines of text"; + } + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { + } + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { + AssertionResult const& result = _assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return false; + + lazyPrint(); + + AssertionPrinter printer( stream, _assertionStats, includeResults ); + printer.print(); + stream << std::endl; + return true; + } + + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { + m_headerPrinted = false; + StreamingReporterBase::sectionStarting( _sectionInfo ); + } + virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { + if( _sectionStats.missingAssertions ) { + lazyPrint(); + Colour colour( Colour::ResultError ); + if( m_sectionStack.size() > 1 ) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + if( m_config->showDurations() == ShowDurations::Always ) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + if( m_headerPrinted ) { + m_headerPrinted = false; + } + StreamingReporterBase::sectionEnded( _sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseEnded( _testCaseStats ); + m_headerPrinted = false; + } + virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { + if( currentGroupInfo.used ) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals( _testGroupStats.totals ); + stream << '\n' << std::endl; + } + StreamingReporterBase::testGroupEnded( _testGroupStats ); + } + virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { + printTotalsDivider( _testRunStats.totals ); + printTotals( _testRunStats.totals ); + stream << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ), + stats( _stats ), + result( _stats.assertionResult ), + colour( Colour::None ), + message( result.getMessage() ), + messages( _stats.infoMessages ), + printInfoMessages( _printInfoMessages ) + { + switch( result.getResultType() ) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } + else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if( _stats.infoMessages.size() == 1 ) + messageLabel = "explicitly with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } + + void print() const { + printSourceInfo(); + if( stats.totals.assertions.total() > 0 ) { + if( result.isOk() ) + stream << '\n'; + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } + else { + stream << '\n'; + } + printMessage(); + } + + private: + void printResultType() const { + if( !passOrFail.empty() ) { + Colour colourGuard( colour ); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if( result.hasExpression() ) { + Colour colourGuard( Colour::OriginalExpression ); + stream << " "; + stream << result.getExpressionInMacro(); + stream << '\n'; + } + } + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + stream << "with expansion:\n"; + Colour colourGuard( Colour::ReconstructedExpression ); + stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; + } + } + void printMessage() const { + if( !messageLabel.empty() ) + stream << messageLabel << ':' << '\n'; + for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); + it != itEnd; + ++it ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || it->type != ResultWas::Info ) + stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; + } + } + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ": "; + } + + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector messages; + bool printInfoMessages; + }; + + void lazyPrint() { + + if( !currentTestRunInfo.used ) + lazyPrintRunInfo(); + if( !currentGroupInfo.used ) + lazyPrintGroupInfo(); + + if( !m_headerPrinted ) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } + } + void lazyPrintRunInfo() { + stream << '\n' << getLineOfChars<'~'>() << '\n'; + Colour colour( Colour::SecondaryText ); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion() << " host application.\n" + << "Run with -? for options\n\n"; + + if( m_config->rngSeed() != 0 ) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + + currentTestRunInfo.used = true; + } + void lazyPrintGroupInfo() { + if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { + printClosedHeader( "Group: " + currentGroupInfo->name ); + currentGroupInfo.used = true; + } + } + void printTestCaseAndSectionHeader() { + assert( !m_sectionStack.empty() ); + printOpenHeader( currentTestCaseInfo->name ); + + if( m_sectionStack.size() > 1 ) { + Colour colourGuard( Colour::Headers ); + + std::vector::const_iterator + it = m_sectionStack.begin()+1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for( ; it != itEnd; ++it ) + printHeaderString( it->name, 2 ); + } + + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; + + if( !lineInfo.empty() ){ + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard( Colour::FileName ); + stream << lineInfo << '\n'; + } + stream << getLineOfChars<'.'>() << '\n' << std::endl; + } + + void printClosedHeader( std::string const& _name ) { + printOpenHeader( _name ); + stream << getLineOfChars<'.'>() << '\n'; + } + void printOpenHeader( std::string const& _name ) { + stream << getLineOfChars<'-'>() << '\n'; + { + Colour colourGuard( Colour::Headers ); + printHeaderString( _name ); + } + } + + // if string has a : in first line will set indent to follow it on + // subsequent lines + void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { + std::size_t i = _string.find( ": " ); + if( i != std::string::npos ) + i+=2; + else + i = 0; + stream << Text( _string, TextAttributes() + .setIndent( indent+i) + .setInitialIndent( indent ) ) << '\n'; + } + + struct SummaryColumn { + + SummaryColumn( std::string const& _label, Colour::Code _colour ) + : label( _label ), + colour( _colour ) + {} + SummaryColumn addRow( std::size_t count ) { + std::ostringstream oss; + oss << count; + std::string row = oss.str(); + for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { + while( it->size() < row.size() ) + *it = ' ' + *it; + while( it->size() > row.size() ) + row = ' ' + row; + } + rows.push_back( row ); + return *this; + } + + std::string label; + Colour::Code colour; + std::vector rows; + + }; + + void printTotals( Totals const& totals ) { + if( totals.testCases.total() == 0 ) { + stream << Colour( Colour::Warning ) << "No tests ran\n"; + } + else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { + stream << Colour( Colour::ResultSuccess ) << "All tests passed"; + stream << " (" + << pluralise( totals.assertions.passed, "assertion" ) << " in " + << pluralise( totals.testCases.passed, "test case" ) << ')' + << '\n'; + } + else { + + std::vector columns; + columns.push_back( SummaryColumn( "", Colour::None ) + .addRow( totals.testCases.total() ) + .addRow( totals.assertions.total() ) ); + columns.push_back( SummaryColumn( "passed", Colour::Success ) + .addRow( totals.testCases.passed ) + .addRow( totals.assertions.passed ) ); + columns.push_back( SummaryColumn( "failed", Colour::ResultError ) + .addRow( totals.testCases.failed ) + .addRow( totals.assertions.failed ) ); + columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) + .addRow( totals.testCases.failedButOk ) + .addRow( totals.assertions.failedButOk ) ); + + printSummaryRow( "test cases", columns, 0 ); + printSummaryRow( "assertions", columns, 1 ); + } + } + void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { + for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { + std::string value = it->rows[row]; + if( it->label.empty() ) { + stream << label << ": "; + if( value != "0" ) + stream << value; + else + stream << Colour( Colour::Warning ) << "- none -"; + } + else if( value != "0" ) { + stream << Colour( Colour::LightGrey ) << " | "; + stream << Colour( it->colour ) + << value << ' ' << it->label; + } + } + stream << '\n'; + } + + static std::size_t makeRatio( std::size_t number, std::size_t total ) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; + return ( ratio == 0 && number > 0 ) ? 1 : ratio; + } + static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { + if( i > j && i > k ) + return i; + else if( j > k ) + return j; + else + return k; + } + + void printTotalsDivider( Totals const& totals ) { + if( totals.testCases.total() > 0 ) { + std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); + std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); + std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); + while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )++; + while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )--; + + stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); + stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); + if( totals.testCases.allPassed() ) + stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); + else + stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); + } + else { + stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); + } + stream << '\n'; + } + void printSummaryDivider() { + stream << getLineOfChars<'-'>() << '\n'; + } + + private: + bool m_headerPrinted; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_compact.hpp +#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED + +namespace Catch { + + struct CompactReporter : StreamingReporterBase { + + CompactReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual ~CompactReporter(); + + static std::string getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } + + virtual ReporterPreferences getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = false; + return prefs; + } + + virtual void noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) {} + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + + stream << std::endl; + return true; + } + + virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE { + if (m_config->showDurations() == ShowDurations::Always) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + } + + virtual void testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( _testRunStats.totals ); + stream << '\n' << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ) + , stats( _stats ) + , result( _stats.assertionResult ) + , messages( _stats.infoMessages ) + , itMessage( _stats.infoMessages.begin() ) + , printInfoMessages( _printInfoMessages ) + {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch( result.getResultType() ) { + case ResultWas::Ok: + printResultType( Colour::ResultSuccess, passedString() ); + printOriginalExpression(); + printReconstructedExpression(); + if ( ! result.hasExpression() ) + printRemainingMessages( Colour::None ); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) + printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); + else + printResultType( Colour::Error, failedString() ); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType( Colour::Error, failedString() ); + printIssue( "unexpected exception with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType( Colour::Error, failedString() ); + printIssue( "fatal error condition with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType( Colour::Error, failedString() ); + printIssue( "expected exception, got none" ); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType( Colour::None, "info" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType( Colour::None, "warning" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType( Colour::Error, failedString() ); + printIssue( "explicitly" ); + printRemainingMessages( Colour::None ); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType( Colour::Error, "** internal error **" ); + break; + } + } + + private: + // Colour::LightGrey + + static Colour::Code dimColour() { return Colour::FileName; } + +#ifdef CATCH_PLATFORM_MAC + static const char* failedString() { return "FAILED"; } + static const char* passedString() { return "PASSED"; } +#else + static const char* failedString() { return "failed"; } + static const char* passedString() { return "passed"; } +#endif + + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ':'; + } + + void printResultType( Colour::Code colour, std::string const& passOrFail ) const { + if( !passOrFail.empty() ) { + { + Colour colourGuard( colour ); + stream << ' ' << passOrFail; + } + stream << ':'; + } + } + + void printIssue( std::string const& issue ) const { + stream << ' ' << issue; + } + + void printExpressionWas() { + if( result.hasExpression() ) { + stream << ';'; + { + Colour colour( dimColour() ); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if( result.hasExpression() ) { + stream << ' ' << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + { + Colour colour( dimColour() ); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if ( itMessage != messages.end() ) { + stream << " '" << itMessage->message << '\''; + ++itMessage; + } + } + + void printRemainingMessages( Colour::Code colour = dimColour() ) { + if ( itMessage == messages.end() ) + return; + + // using messages.end() directly yields compilation error: + std::vector::const_iterator itEnd = messages.end(); + const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); + + { + Colour colourGuard( colour ); + stream << " with " << pluralise( N, "message" ) << ':'; + } + + for(; itMessage != itEnd; ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || itMessage->type != ResultWas::Info ) { + stream << " '" << itMessage->message << '\''; + if ( ++itMessage != itEnd ) { + Colour colourGuard( dimColour() ); + stream << " and"; + } + } + } + } + + private: + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + std::vector messages; + std::vector::const_iterator itMessage; + bool printInfoMessages; + }; + + // Colour, message variants: + // - white: No tests ran. + // - red: Failed [both/all] N test cases, failed [both/all] M assertions. + // - white: Passed [both/all] N test cases (no assertions). + // - red: Failed N tests cases, failed M assertions. + // - green: Passed [both/all] N tests cases with M assertions. + + std::string bothOrAll( std::size_t count ) const { + return count == 1 ? std::string() : count == 2 ? "both " : "all " ; + } + + void printTotals( const Totals& totals ) const { + if( totals.testCases.total() == 0 ) { + stream << "No tests ran."; + } + else if( totals.testCases.failed == totals.testCases.total() ) { + Colour colour( Colour::ResultError ); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll( totals.assertions.failed ) : std::string(); + stream << + "Failed " << bothOrAll( totals.testCases.failed ) + << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << qualify_assertions_failed << + pluralise( totals.assertions.failed, "assertion" ) << '.'; + } + else if( totals.assertions.total() == 0 ) { + stream << + "Passed " << bothOrAll( totals.testCases.total() ) + << pluralise( totals.testCases.total(), "test case" ) + << " (no assertions)."; + } + else if( totals.assertions.failed ) { + Colour colour( Colour::ResultError ); + stream << + "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; + } + else { + Colour colour( Colour::ResultSuccess ); + stream << + "Passed " << bothOrAll( totals.testCases.passed ) + << pluralise( totals.testCases.passed, "test case" ) << + " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; + } + } + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) + +} // end namespace Catch + +namespace Catch { + // These are all here to avoid warnings about not having any out of line + // virtual methods + NonCopyable::~NonCopyable() {} + IShared::~IShared() {} + IStream::~IStream() CATCH_NOEXCEPT {} + FileStream::~FileStream() CATCH_NOEXCEPT {} + CoutStream::~CoutStream() CATCH_NOEXCEPT {} + DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} + StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} + IContext::~IContext() {} + IResultCapture::~IResultCapture() {} + ITestCase::~ITestCase() {} + ITestCaseRegistry::~ITestCaseRegistry() {} + IRegistryHub::~IRegistryHub() {} + IMutableRegistryHub::~IMutableRegistryHub() {} + IExceptionTranslator::~IExceptionTranslator() {} + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} + IReporter::~IReporter() {} + IReporterFactory::~IReporterFactory() {} + IReporterRegistry::~IReporterRegistry() {} + IStreamingReporter::~IStreamingReporter() {} + AssertionStats::~AssertionStats() {} + SectionStats::~SectionStats() {} + TestCaseStats::~TestCaseStats() {} + TestGroupStats::~TestGroupStats() {} + TestRunStats::~TestRunStats() {} + CumulativeReporterBase::SectionNode::~SectionNode() {} + CumulativeReporterBase::~CumulativeReporterBase() {} + + StreamingReporterBase::~StreamingReporterBase() {} + ConsoleReporter::~ConsoleReporter() {} + CompactReporter::~CompactReporter() {} + IRunner::~IRunner() {} + IMutableContext::~IMutableContext() {} + IConfig::~IConfig() {} + XmlReporter::~XmlReporter() {} + JunitReporter::~JunitReporter() {} + TestRegistry::~TestRegistry() {} + FreeFunctionTestCase::~FreeFunctionTestCase() {} + IGeneratorInfo::~IGeneratorInfo() {} + IGeneratorsForTest::~IGeneratorsForTest() {} + WildcardPattern::~WildcardPattern() {} + TestSpec::Pattern::~Pattern() {} + TestSpec::NamePattern::~NamePattern() {} + TestSpec::TagPattern::~TagPattern() {} + TestSpec::ExcludedPattern::~ExcludedPattern() {} + Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {} + + void Config::dummy() {} + + namespace TestCaseTracking { + ITracker::~ITracker() {} + TrackerBase::~TrackerBase() {} + SectionTracker::~SectionTracker() {} + IndexTracker::~IndexTracker() {} + } +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#endif + +#ifdef CATCH_CONFIG_MAIN +// #included from: internal/catch_default_main.hpp +#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED + +#ifndef __OBJC__ + +#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +// Standard C/C++ Win32 Unicode wmain entry point +extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +#else +// Standard C/C++ main entry point +int main (int argc, char * argv[]) { +#endif + + int result = Catch::Session().run( argc, argv ); + return ( result < 0xff ? result : 0xff ); +} + +#else // __OBJC__ + +// Objective-C entry point +int main (int argc, char * const argv[]) { +#if !CATCH_ARC_ENABLED + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; +#endif + + Catch::registerTestMethods(); + int result = Catch::Session().run( argc, (char* const*)argv ); + +#if !CATCH_ARC_ENABLED + [pool drain]; +#endif + + return ( result < 0xff ? result : 0xff ); +} + +#endif // __OBJC__ + +#endif + +#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED +# undef CLARA_CONFIG_MAIN +#endif + +////// + +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#else +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif + +#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) + +#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) + +#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) + +#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) +#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) + #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) + #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) + #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) + #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) + #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) + #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#else + #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) + #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) +#endif +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) +#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) +#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) +#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) +#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) +#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) + +#else +#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif + +#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) + +#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) + +#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) + +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) +#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#else +#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) + #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) +#endif +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) +#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) +#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) +#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) +#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) +#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) + +using Catch::Detail::Approx; + +// #included from: internal/catch_reenable_warnings.h + +#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(pop) +# else +# pragma clang diagnostic pop +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic pop +#endif + +#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + diff --git a/wasserstein/include/def_debug_ws.h b/wasserstein/include/def_debug_ws.h new file mode 100644 index 0000000..791ce1d --- /dev/null +++ b/wasserstein/include/def_debug_ws.h @@ -0,0 +1,44 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef DEF_DEBUG_WS_H +#define DEF_DEBUG_WS_H + +//#define DEBUG_BOUND_MATCH +//#define DEBUG_NEIGHBOUR_ORACLE +//#define DEBUG_MATCHING +//#define DEBUG_AUCTION +// This symbol should be defined only in the version +// for R package TDA, to comply with some CRAN rules +// like no usage of cout, cerr, cin, exit, etc. +//#define FOR_R_TDA +// +//#define DEBUG_KDTREE_RESTR_ORACLE +//#define DEBUG_STUPID_SPARSE_RESTR_ORACLE +//#define DEBUG_FR_AUCTION + +#endif diff --git a/wasserstein/include/diagonal_heap.h b/wasserstein/include/diagonal_heap.h new file mode 100644 index 0000000..3b3c8bc --- /dev/null +++ b/wasserstein/include/diagonal_heap.h @@ -0,0 +1,149 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef DIAGONAL_HEAP_H +#define DIAGONAL_HEAP_H + +//#define USE_BOOST_HEAP + +#include +#include +#include +#include + +#ifdef USE_BOOST_HEAP +#include +#endif + +#include "basic_defs_ws.h" + +namespace hera { +namespace ws { + +template +struct CompPairsBySecondLexStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second < b.second or (a.second == b.second and a.first > b.first); + } +}; + + +template +struct CompPairsBySecondGreaterStruct { + bool operator()(const IdxValPair& a, const IdxValPair& b) const + { + return a.second > b.second; + } +}; + +#ifdef USE_BOOST_HEAP +template +using LossesHeapOld = boost::heap::d_ary_heap, boost::heap::arity<2>, boost::heap::mutable_, boost::heap::compare>>; +#else +template +class IdxValHeap { +public: + using InternalKeeper = std::set, ComparisonStruct>; + using handle_type = typename InternalKeeper::iterator; + using const_handle_type = typename InternalKeeper::const_iterator; + // methods + handle_type push(const IdxValPair& val) + { + auto res_pair = _heap.insert(val); + assert(res_pair.second); + assert(res_pair.first != _heap.end()); + return res_pair.first; + } + + void decrease(handle_type& handle, const IdxValPair& new_val) + { + _heap.erase(handle); + handle = push(new_val); + } + + void increase(handle_type& handle, const IdxValPair& new_val) + { + _heap.erase(handle); + handle = push(new_val); + } + + size_t size() const + { + return _heap.size(); + } + + handle_type ordered_begin() + { + return _heap.begin(); + } + + handle_type ordered_end() + { + return _heap.end(); + } + + const_handle_type ordered_begin() const + { + return _heap.cbegin(); + } + + const_handle_type ordered_end() const + { + return _heap.cend(); + } + + +private: + std::set, ComparisonStruct> _heap; +}; + +// if we store losses, the minimal value should come first +template +using LossesHeapOld = IdxValHeap>; +#endif + +template +inline std::string losses_heap_to_string(const LossesHeapOld& h) +{ + std::stringstream result; + result << "["; + for(auto iter = h.ordered_begin(); iter != h.ordered_end(); ++iter) { + result << *iter; + if (std::next(iter) != h.ordered_end()) { + result << ", "; + } + } + result << "]"; + return result.str(); +} + +} // ws +} // hera + +#endif // DIAGONAL_HEAP_H diff --git a/wasserstein/include/diagram_reader.h b/wasserstein/include/diagram_reader.h new file mode 100644 index 0000000..b52fcbd --- /dev/null +++ b/wasserstein/include/diagram_reader.h @@ -0,0 +1,447 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +Copyright (c) 2018, G. Spreemann +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + +*/ + +#ifndef HERA_DIAGRAM_READER_H +#define HERA_DIAGRAM_READER_H + +#ifndef FOR_R_TDA +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "basic_defs_ws.hpp" + +#ifdef WASSERSTEIN_PURE_GEOM +#include "dnn/geometry/euclidean-dynamic.h" +#endif + +namespace hera { + +// cannot choose stod, stof or stold based on RealType, +// lazy solution: partial specialization +template +inline RealType parse_real_from_str(const std::string& s); + +template <> +inline double parse_real_from_str(const std::string& s) +{ + return std::stod(s); +} + + +template <> +inline long double parse_real_from_str(const std::string& s) +{ + return std::stold(s); +} + + +template <> +inline float parse_real_from_str(const std::string& s) +{ + return std::stof(s); +} + + +template +inline RealType parse_real_from_str(const std::string& s) +{ + static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above"); +} + +// fill in result with points from file fname +// return false if file can't be opened +// or error occurred while reading +// decPrecision is the maximal decimal precision in the input, +// it is zero if all coordinates in the input are integers +template>> +inline bool read_diagram_point_set(const char* fname, ContType_& result, int& decPrecision) +{ + size_t lineNumber { 0 }; + result.clear(); + std::ifstream f(fname); + if (!f.good()) { +#ifndef FOR_R_TDA + std::cerr << "Cannot open file " << fname << std::endl; +#endif + return false; + } + std::locale loc; + std::string line; + while(std::getline(f, line)) { + lineNumber++; + // process comments: remove everything after hash + auto hashPos = line.find_first_of("#", 0); + if( std::string::npos != hashPos) { + line = std::string(line.begin(), line.begin() + hashPos); + } + if (line.empty()) { + continue; + } + // trim whitespaces + auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); + auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); + if (whiteSpaceBack <= whiteSpaceFront) { + // line consists of spaces only - move to the next line + continue; + } + line = std::string(whiteSpaceFront,whiteSpaceBack); + + // transform line to lower case + // to parse Infinity + for(auto& c : line) { + c = std::tolower(c, loc); + } + + bool fracPart = false; + int currDecPrecision = 0; + for(auto c : line) { + if (c == '.') { + fracPart = true; + } else if (fracPart) { + if (isdigit(c)) { + currDecPrecision++; + } else { + fracPart = false; + if (currDecPrecision > decPrecision) + decPrecision = currDecPrecision; + currDecPrecision = 0; + } + } + } + + RealType x, y; + std::string str_x, str_y; + std::istringstream iss(line); + try { + iss >> str_x >> str_y; + + x = parse_real_from_str(str_x); + y = parse_real_from_str(str_y); + + if (x != y) { + result.push_back(std::make_pair(x, y)); + } else { +#ifndef FOR_R_TDA + std::cerr << "Warning: point with 0 persistence ignored in " << fname << ":" << lineNumber << "\n"; +#endif + } + } + catch (const std::invalid_argument& e) { +#ifndef FOR_R_TDA + std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; +#endif + return false; + } + catch (const std::out_of_range&) { +#ifndef FOR_R_TDA + std::cerr << "Error while reading file " << fname << ", line number " << lineNumber << ": value too large in \"" << line << "\"" << std::endl; +#endif + return false; + } + } + f.close(); + return true; +} + + +// wrappers +template>> +inline bool read_diagram_point_set(const std::string& fname, ContType_& result, int& decPrecision) +{ + return read_diagram_point_set(fname.c_str(), result, decPrecision); +} + +// these two functions are now just wrappers for the previous ones, +// in case someone needs them; decPrecision is ignored +template>> +inline bool read_diagram_point_set(const char* fname, ContType_& result) +{ + int decPrecision; + return read_diagram_point_set(fname, result, decPrecision); +} + +template>> +inline bool read_diagram_point_set(const std::string& fname, ContType_& result) +{ + int decPrecision; + return read_diagram_point_set(fname.c_str(), result, decPrecision); +} + +template > > +inline bool read_diagram_dipha(const std::string& fname, unsigned int dim, ContType_& result) +{ + std::ifstream file; + file.open(fname, std::ios::in | std::ios::binary); + + if (!file.is_open()) { +#ifndef FOR_R_TDA + std::cerr << "Could not open file " << fname << "." << std::endl; +#endif + return false; + } + + if (read_le(file) != DIPHA_MAGIC) { +#ifndef FOR_R_TDA + std::cerr << "File " << fname << " is not a valid DIPHA file." << std::endl; +#endif + file.close(); + return false; + } + + if (read_le(file) != DIPHA_PERSISTENCE_DIAGRAM) { +#ifndef FOR_R_TDA + std::cerr << "File " << fname << " is not a valid DIPHA persistence diagram file." << std::endl; +#endif + file.close(); + return false; + } + + result.clear(); + + int n = read_le(file); + + for (int i = 0; i < n; ++i) { + int tmp_d = read_le(file); + double birth = read_le(file); + double death = read_le(file); + + if (death < birth) { +#ifndef FOR_R_TDA + std::cerr << "File " << fname << " is malformed." << std::endl; +#endif + file.close(); + return false; + } + + int d = 0; + if (tmp_d < 0) { + d = -tmp_d - 1; + death = std::numeric_limits::infinity(); + } else + d = tmp_d; + + if ((unsigned int)d == dim) { + if (death == birth) { +#ifndef FOR_R_TDA + std::cerr << "Warning: point with 0 persistence ignored in " << fname << "." << std::endl; +#endif + } else { + result.push_back(std::make_pair(birth, death)); + } + } + } + + file.close(); + + return true; +} + + +template +inline void remove_duplicates(ContType& dgm_A, ContType& dgm_B) +{ + std::map, int> map_A, map_B; + // copy points to maps + for(const auto& ptA : dgm_A) { + map_A[ptA]++; + } + for(const auto& ptB : dgm_B) { + map_B[ptB]++; + } + // clear vectors + dgm_A.clear(); + dgm_B.clear(); + // remove duplicates from maps + // loop over the smaller one + if (map_A.size() <= map_B.size()) { + for(auto& point_multiplicity_pair : map_A) { + auto iter_B = map_B.find(point_multiplicity_pair.first); + if (iter_B != map_B.end()) { + int duplicate_multiplicity = std::min(point_multiplicity_pair.second, iter_B->second); + point_multiplicity_pair.second -= duplicate_multiplicity; + iter_B->second -= duplicate_multiplicity; + } + } + } else { + for(auto& point_multiplicity_pair : map_B) { + auto iter_A = map_A.find(point_multiplicity_pair.first); + if (iter_A != map_A.end()) { + int duplicate_multiplicity = std::min(point_multiplicity_pair.second, iter_A->second); + point_multiplicity_pair.second -= duplicate_multiplicity; + iter_A->second -= duplicate_multiplicity; + } + } + } + // copy points back to vectors + for(const auto& pointMultiplicityPairA : map_A) { + assert( pointMultiplicityPairA.second >= 0); + for(int i = 0; i < pointMultiplicityPairA.second; ++i) { + dgm_A.push_back(pointMultiplicityPairA.first); + } + } + + for(const auto& pointMultiplicityPairB : map_B) { + assert( pointMultiplicityPairB.second >= 0); + for(int i = 0; i < pointMultiplicityPairB.second; ++i) { + dgm_B.push_back(pointMultiplicityPairB.first); + } + } +} + + +#ifdef WASSERSTEIN_PURE_GEOM + +template +inline int get_point_dimension(const std::string& line) +{ + Real x; + int dim = 0; + std::istringstream iss(line); + while(iss >> x) { + dim++; + } + return dim; +} + + +template +inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector& result, int& dimension, int& decPrecision) +{ + using DynamicPointTraitsR = typename hera::ws::dnn::DynamicPointTraits; + + size_t lineNumber { 0 }; + result.clear(); + std::ifstream f(fname); + if (!f.good()) { +#ifndef FOR_R_TDA + std::cerr << "Cannot open file " << fname << std::endl; +#endif + return false; + } + std::string line; + DynamicPointTraitsR traits; + bool dim_computed = false; + int point_idx = 0; + while(std::getline(f, line)) { + lineNumber++; + // process comments: remove everything after hash + auto hashPos = line.find_first_of("#", 0); + if( std::string::npos != hashPos) { + line = std::string(line.begin(), line.begin() + hashPos); + } + if (line.empty()) { + continue; + } + // trim whitespaces + auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace); + auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base(); + if (whiteSpaceBack <= whiteSpaceFront) { + // line consists of spaces only - move to the next line + continue; + } + + line = std::string(whiteSpaceFront,whiteSpaceBack); + + if (not dim_computed) { + dimension = get_point_dimension(line); + traits = hera::ws::dnn::DynamicPointTraits(dimension); + result = traits.container(); + result.clear(); + dim_computed = true; + } + + bool fracPart = false; + int currDecPrecision = 0; + for(auto c : line) { + if (c == '.') { + fracPart = true; + } else if (fracPart) { + if (isdigit(c)) { + currDecPrecision++; + } else { + fracPart = false; + if (currDecPrecision > decPrecision) + decPrecision = currDecPrecision; + currDecPrecision = 0; + } + } + } + + result.resize(result.size() + 1); + RealType x; + std::istringstream iss(line); + for(int d = 0; d < dimension; ++d) { + if (not(iss >> x)) { +#ifndef FOR_R_TDA + std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl; +#endif + return false; + } + result[point_idx][d] = x; + } + point_idx++; + } + f.close(); + return true; +} + +// wrappers +template +inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector& result, int& dimension) +{ + int dec_precision; + return read_point_cloud(fname, result, dimension, dec_precision); +} + +template +inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector& result, int& dimension, int& dec_precision) +{ + return read_point_cloud(fname.c_str(), result, dimension, dec_precision); +} + +template +inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector& result, int& dimension) +{ + return read_point_cloud(fname.c_str(), result, dimension); +} + +#endif // WASSERSTEIN_PURE_GEOM + +} // end namespace hera +#endif // HERA_DIAGRAM_READER_H diff --git a/wasserstein/include/dnn/geometry/euclidean-dynamic.h b/wasserstein/include/dnn/geometry/euclidean-dynamic.h new file mode 100644 index 0000000..b003906 --- /dev/null +++ b/wasserstein/include/dnn/geometry/euclidean-dynamic.h @@ -0,0 +1,270 @@ +#ifndef DNN_GEOMETRY_EUCLIDEAN_DYNAMIC_H +#define DNN_GEOMETRY_EUCLIDEAN_DYNAMIC_H + +#include +#include +#include +#include +#include +#include + +#include "hera_infinity.h" + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + +template +class DynamicPointVector +{ + public: + using Real = Real_; + struct PointType + { + void* p; + + Real& operator[](const int i) + { + return (static_cast(p))[i]; + } + + const Real& operator[](const int i) const + { + return (static_cast(p))[i]; + } + + }; + struct iterator; + typedef iterator const_iterator; + + public: + DynamicPointVector(size_t point_capacity = 0): + point_capacity_(point_capacity) {} + + + PointType operator[](size_t i) const { return {(void*) &storage_[i*point_capacity_]}; } + inline void push_back(PointType p); + + inline iterator begin(); + inline iterator end(); + inline const_iterator begin() const; + inline const_iterator end() const; + + size_t size() const { return storage_.size() / point_capacity_; } + + void clear() { storage_.clear(); } + void swap(DynamicPointVector& other) { storage_.swap(other.storage_); std::swap(point_capacity_, other.point_capacity_); } + void reserve(size_t sz) { storage_.reserve(sz * point_capacity_); } + void resize(size_t sz) { storage_.resize(sz * point_capacity_); } + + private: + size_t point_capacity_; + std::vector storage_; + + private: + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) { ar & point_capacity_ & storage_; } +}; + +template +struct DynamicPointTraits +{ + typedef DynamicPointVector PointContainer; + typedef typename PointContainer::PointType PointType; + struct PointHandle + { + void* p; + bool operator==(const PointHandle& other) const { return p == other.p; } + bool operator!=(const PointHandle& other) const { return !(*this == other); } + bool operator<(const PointHandle& other) const { return p < other.p; } + bool operator>(const PointHandle& other) const { return p > other.p; } + }; + + typedef Real Coordinate; + typedef Real DistanceType; + + DynamicPointTraits(unsigned dim = 0): + dim_(dim) {} + + DistanceType distance(PointType p1, PointType p2) const + { + Real result = 0.0; + if (hera::is_infinity(internal_p)) { + // max norm + for (unsigned i = 0; i < dimension(); ++i) + result = std::max(result, fabs(coordinate(p1,i) - coordinate(p2,i))); + } else if (internal_p == Real(1.0)) { + // l1-norm + for (unsigned i = 0; i < dimension(); ++i) + result += fabs(coordinate(p1,i) - coordinate(p2,i)); + } else if (internal_p == Real(2.0)) { + result = sqrt(sq_distance(p1,p2)); + } else { + assert(internal_p > 1.0); + for (unsigned i = 0; i < dimension(); ++i) + result += std::pow(fabs(coordinate(p1,i) - coordinate(p2,i)), internal_p); + result = std::pow(result, Real(1.0) / internal_p); + } + return result; + } + DistanceType distance(PointHandle p1, PointHandle p2) const { return distance(PointType({p1.p}), PointType({p2.p})); } + DistanceType sq_distance(PointType p1, PointType p2) const { Real res = 0; for (unsigned i = 0; i < dimension(); ++i) { Real c1 = coordinate(p1,i), c2 = coordinate(p2,i); res += (c1 - c2)*(c1 - c2); } return res; } + DistanceType sq_distance(PointHandle p1, PointHandle p2) const { return sq_distance(PointType({p1.p}), PointType({p2.p})); } + unsigned dimension() const { return dim_; } + Real& coordinate(PointType p, unsigned i) const { return ((Real*) p.p)[i]; } + Real& coordinate(PointHandle h, unsigned i) const { return ((Real*) h.p)[i]; } + + // it's non-standard to return a reference, but we can rely on it for code that assumes this particular point type + size_t& id(PointType p) const { return *((size_t*) ((Real*) p.p + dimension())); } + size_t& id(PointHandle h) const { return *((size_t*) ((Real*) h.p + dimension())); } + PointHandle handle(PointType p) const { return {p.p}; } + PointType point(PointHandle h) const { return {h.p}; } + + void swap(PointType p1, PointType p2) const { std::swap_ranges((char*) p1.p, ((char*) p1.p) + capacity(), (char*) p2.p); } + bool cmp(PointType p1, PointType p2) const { return std::lexicographical_compare((Real*) p1.p, ((Real*) p1.p) + dimension(), (Real*) p2.p, ((Real*) p2.p) + dimension()); } + bool eq(PointType p1, PointType p2) const { return std::equal((Real*) p1.p, ((Real*) p1.p) + dimension(), (Real*) p2.p); } + + // non-standard, and possibly a weird name + size_t capacity() const { return sizeof(Real)*dimension() + sizeof(size_t); } + + PointContainer container(size_t n = 0) const { PointContainer c(capacity()); c.resize(n); return c; } + PointContainer container(size_t n, const PointType& p) const; + + typename PointContainer::iterator + iterator(PointContainer& c, PointHandle ph) const; + typename PointContainer::const_iterator + iterator(const PointContainer& c, PointHandle ph) const; + + Real internal_p; + + private: + unsigned dim_; + + private: + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) { ar & dim_; } +}; + +} // dnn + +template +struct dnn::DynamicPointVector::iterator: + public boost::iterator_facade +{ + typedef boost::iterator_facade Parent; + + + public: + typedef typename Parent::value_type value_type; + typedef typename Parent::difference_type difference_type; + typedef typename Parent::reference reference; + + iterator(size_t point_capacity = 0): + point_capacity_(point_capacity) {} + + iterator(void* p, size_t point_capacity): + p_(p), point_capacity_(point_capacity) {} + + private: + void increment() { p_ = ((char*) p_) + point_capacity_; } + void decrement() { p_ = ((char*) p_) - point_capacity_; } + void advance(difference_type n) { p_ = ((char*) p_) + n*point_capacity_; } + difference_type + distance_to(iterator other) const { return (((char*) other.p_) - ((char*) p_))/(int) point_capacity_; } + bool equal(const iterator& other) const { return p_ == other.p_; } + reference dereference() const { return {p_}; } + + friend class ::boost::iterator_core_access; + + private: + void* p_; + size_t point_capacity_; +}; + +template +void dnn::DynamicPointVector::push_back(PointType p) +{ + if (storage_.capacity() < storage_.size() + point_capacity_) + storage_.reserve(1.5*storage_.capacity()); + + storage_.resize(storage_.size() + point_capacity_); + + std::copy((char*) p.p, (char*) p.p + point_capacity_, storage_.end() - point_capacity_); +} + +template +typename dnn::DynamicPointVector::iterator dnn::DynamicPointVector::begin() { return iterator((void*) &*storage_.begin(), point_capacity_); } + +template +typename dnn::DynamicPointVector::iterator dnn::DynamicPointVector::end() { return iterator((void*) &*storage_.end(), point_capacity_); } + +template +typename dnn::DynamicPointVector::const_iterator dnn::DynamicPointVector::begin() const { return const_iterator((void*) &*storage_.begin(), point_capacity_); } + +template +typename dnn::DynamicPointVector::const_iterator dnn::DynamicPointVector::end() const { return const_iterator((void*) &*storage_.end(), point_capacity_); } + +template +typename dnn::DynamicPointTraits::PointContainer +dnn::DynamicPointTraits::container(size_t n, const PointType& p) const +{ + PointContainer c = container(n); + for (auto x : c) + std::copy((char*) p.p, (char*) p.p + capacity(), (char*) x.p); + return c; +} + +template +typename dnn::DynamicPointTraits::PointContainer::iterator +dnn::DynamicPointTraits::iterator(PointContainer& c, PointHandle ph) const +{ return typename PointContainer::iterator(ph.p, capacity()); } + +template +typename dnn::DynamicPointTraits::PointContainer::const_iterator +dnn::DynamicPointTraits::iterator(const PointContainer& c, PointHandle ph) const +{ return typename PointContainer::const_iterator(ph.p, capacity()); } + +} // ws +} // hera + +namespace std { + template<> + struct hash::PointHandle> + { + using PointHandle = typename hera::ws::dnn::DynamicPointTraits::PointHandle; + size_t operator()(const PointHandle& ph) const + { + return std::hash()(ph.p); + } + }; + + template<> + struct hash::PointHandle> + { + using PointHandle = typename hera::ws::dnn::DynamicPointTraits::PointHandle; + size_t operator()(const PointHandle& ph) const + { + return std::hash()(ph.p); + } + }; + + +} // std + + +#endif diff --git a/wasserstein/include/dnn/geometry/euclidean-fixed.h b/wasserstein/include/dnn/geometry/euclidean-fixed.h new file mode 100644 index 0000000..3e38baf --- /dev/null +++ b/wasserstein/include/dnn/geometry/euclidean-fixed.h @@ -0,0 +1,196 @@ +#ifndef HERA_WS_DNN_GEOMETRY_EUCLIDEAN_FIXED_H +#define HERA_WS_DNN_GEOMETRY_EUCLIDEAN_FIXED_H + +#include +#include +#include +#include +#include + +//#include +#include +#include +#include +#include + +#include "../parallel/tbb.h" // for dnn::vector<...> + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + // TODO: wrap in another namespace (e.g., euclidean) + + template + struct Point: + boost::addable< Point, + boost::subtractable< Point, + boost::dividable2< Point, Real, + boost::multipliable2< Point, Real > > > >, + public boost::array + { + public: + typedef Real Coordinate; + typedef Real DistanceType; + + + public: + Point(size_t id = 0): id_(id) {} + template + Point(const Point& p, size_t id = 0): + id_(id) { *this = p; } + + static size_t dimension() { return D; } + + // Assign a point of different dimension + template + Point& operator=(const Point& p) { for (size_t i = 0; i < (D < DD ? D : DD); ++i) (*this)[i] = p[i]; if (DD < D) for (size_t i = DD; i < D; ++i) (*this)[i] = 0; return *this; } + + Point& operator+=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] += p[i]; return *this; } + Point& operator-=(const Point& p) { for (size_t i = 0; i < D; ++i) (*this)[i] -= p[i]; return *this; } + Point& operator/=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] /= r; return *this; } + Point& operator*=(Real r) { for (size_t i = 0; i < D; ++i) (*this)[i] *= r; return *this; } + + Real norm2() const { Real n = 0; for (size_t i = 0; i < D; ++i) n += (*this)[i] * (*this)[i]; return n; } + Real max_norm() const + { + Real res = std::fabs((*this)[0]); + for (size_t i = 1; i < D; ++i) + if (std::fabs((*this)[i]) > res) + res = std::fabs((*this)[i]); + return res; + } + + Real l1_norm() const + { + Real res = std::fabs((*this)[0]); + for (size_t i = 1; i < D; ++i) + res += std::fabs((*this)[i]); + return res; + } + + Real lp_norm(const Real p) const + { + assert( !std::isinf(p) ); + if ( p == 1.0 ) + return l1_norm(); + Real res = std::pow(std::fabs((*this)[0]), p); + for (size_t i = 1; i < D; ++i) + res += std::pow(std::fabs((*this)[i]), p); + return std::pow(res, 1.0 / p); + } + + // quick and dirty for now; make generic later + //DistanceType distance(const Point& other) const { return sqrt(sq_distance(other)); } + //DistanceType sq_distance(const Point& other) const { return (other - *this).norm2(); } + + DistanceType distance(const Point& other) const { return (other - *this).max_norm(); } + DistanceType p_distance(const Point& other, const double p) const { return (other - *this).lp_norm(p); } + + size_t id() const { return id_; } + size_t& id() { return id_; } + + private: + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::base_object< boost::array >(*this) & id_; } + + private: + size_t id_; + }; + + template + std::ostream& + operator<<(std::ostream& out, const Point& p) + { out << p[0]; for (size_t i = 1; i < D; ++i) out << " " << p[i]; return out; } + + + template + struct PointTraits; // intentionally undefined; should be specialized for each type + + + template + struct PointTraits< Point > // specialization for dnn::Point + { + typedef Point PointType; + typedef const PointType* PointHandle; + typedef std::vector PointContainer; + + typedef typename PointType::Coordinate Coordinate; + typedef typename PointType::DistanceType DistanceType; + + + static DistanceType + distance(const PointType& p1, const PointType& p2) { if (hera::is_infinity(internal_p)) return p1.distance(p2); else return p1.p_distance(p2, internal_p); } + + static DistanceType + distance(PointHandle p1, PointHandle p2) { return distance(*p1,*p2); } + + static size_t dimension() { return D; } + static Real coordinate(const PointType& p, size_t i) { return p[i]; } + static Real& coordinate(PointType& p, size_t i) { return p[i]; } + static Real coordinate(PointHandle p, size_t i) { return coordinate(*p,i); } + + static size_t id(const PointType& p) { return p.id(); } + static size_t& id(PointType& p) { return p.id(); } + static size_t id(PointHandle p) { return id(*p); } + + static PointHandle + handle(const PointType& p) { return &p; } + static const PointType& + point(PointHandle ph) { return *ph; } + + void swap(PointType& p1, PointType& p2) const { return std::swap(p1, p2); } + + static PointContainer + container(size_t n = 0, const PointType& p = PointType()) { return PointContainer(n, p); } + static typename PointContainer::iterator + iterator(PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } + static typename PointContainer::const_iterator + iterator(const PointContainer& c, PointHandle ph) { return c.begin() + (ph - &c[0]); } + + // Internal_p determines which norm will be used in Wasserstein metric (not to + // be confused with wassersteinPower parameter: + // we raise \| p - q \|_{internal_p} to wassersteinPower. + static Real internal_p; + + private: + + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) {} + + }; + + template + Real PointTraits< Point >::internal_p = hera::get_infinity(); + + + template + void read_points(const std::string& filename, PointContainer& points) + { + typedef typename boost::range_value::type Point; + typedef typename PointTraits::Coordinate Coordinate; + + std::ifstream in(filename.c_str()); + std::string line; + while(std::getline(in, line)) + { + if (line[0] == '#') continue; // comment line in the file + std::stringstream linestream(line); + Coordinate x; + points.push_back(Point()); + size_t i = 0; + while (linestream >> x) + points.back()[i++] = x; + } + } +} // dnn +} // ws +} // hera + +#endif diff --git a/wasserstein/include/dnn/local/kd-tree.h b/wasserstein/include/dnn/local/kd-tree.h new file mode 100644 index 0000000..8e52a5c --- /dev/null +++ b/wasserstein/include/dnn/local/kd-tree.h @@ -0,0 +1,97 @@ +#ifndef HERA_WS_DNN_LOCAL_KD_TREE_H +#define HERA_WS_DNN_LOCAL_KD_TREE_H + +#include "../utils.h" +#include "search-functors.h" + +#include + +#include +#include +#include + +#include +#include + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + // Weighted KDTree + // Traits_ provides Coordinate, DistanceType, PointType, dimension(), distance(p1,p2), coordinate(p,i) + template< class Traits_ > + class KDTree + { + public: + typedef Traits_ Traits; + typedef dnn::HandleDistance HandleDistance; + + typedef typename Traits::PointType Point; + typedef typename Traits::PointHandle PointHandle; + typedef typename Traits::Coordinate Coordinate; + typedef typename Traits::DistanceType DistanceType; + typedef std::vector HandleContainer; + typedef std::vector HDContainer; // TODO: use tbb::scalable_allocator + typedef HDContainer Result; + typedef std::vector DistanceContainer; + typedef std::unordered_map HandleMap; + + BOOST_STATIC_ASSERT_MSG(has_coordinates::value, "KDTree requires coordinates"); + + public: + KDTree(const Traits& traits): + traits_(traits) {} + + KDTree(const Traits& traits, HandleContainer&& handles, double _wassersteinPower = 1.0); + + template + KDTree(const Traits& traits, const Range& range, double _wassersteinPower = 1.0); + + template + void init(const Range& range); + + DistanceType weight(PointHandle p) { return weights_[indices_[p]]; } + void change_weight(PointHandle p, DistanceType w); + void adjust_weights(DistanceType delta); // subtract delta from all weights + + HandleDistance find(PointHandle q) const; + Result findR(PointHandle q, DistanceType r) const; // all neighbors within r + Result findK(PointHandle q, size_t k) const; // k nearest neighbors + + HandleDistance find(const Point& q) const { return find(traits().handle(q)); } + Result findR(const Point& q, DistanceType r) const { return findR(traits().handle(q), r); } + Result findK(const Point& q, size_t k) const { return findK(traits().handle(q), k); } + + template + void search(PointHandle q, ResultsFunctor& rf) const; + + const Traits& traits() const { return traits_; } + + void printWeights(void); + + private: + void init(); + + typedef typename HandleContainer::iterator HCIterator; + typedef std::tuple KDTreeNode; + + struct CoordinateComparison; + struct OrderTree; + + private: + Traits traits_; + HandleContainer tree_; + DistanceContainer weights_; // point weight + DistanceContainer subtree_weights_; // min weight in the subtree + HandleMap indices_; + double wassersteinPower; + }; +} // dnn +} // ws +} // hera + +#include "kd-tree.hpp" + +#endif diff --git a/wasserstein/include/dnn/local/kd-tree.hpp b/wasserstein/include/dnn/local/kd-tree.hpp new file mode 100644 index 0000000..bdeef45 --- /dev/null +++ b/wasserstein/include/dnn/local/kd-tree.hpp @@ -0,0 +1,330 @@ +#include +#include +#include + +#include +#include + +#include "../parallel/tbb.h" +#include "def_debug_ws.h" + +template +hera::ws::dnn::KDTree:: +KDTree(const Traits& traits, HandleContainer&& handles, double _wassersteinPower): + traits_(traits), tree_(std::move(handles)), wassersteinPower(_wassersteinPower) +{ assert(wassersteinPower >= 1.0); init(); } + +template +template +hera::ws::dnn::KDTree:: +KDTree(const Traits& traits, const Range& range, double _wassersteinPower): + traits_(traits), wassersteinPower(_wassersteinPower) +{ + assert( wassersteinPower >= 1.0); + init(range); +} + +template +template +void +hera::ws::dnn::KDTree:: +init(const Range& range) +{ + size_t sz = std::distance(std::begin(range), std::end(range)); + tree_.reserve(sz); + weights_.resize(sz, 0); + subtree_weights_.resize(sz, 0); + for (PointHandle h : range) + tree_.push_back(h); + init(); +} + +template +void +hera::ws::dnn::KDTree:: +init() +{ + if (tree_.empty()) + return; + +#if defined(TBB) + task_group g; + g.run(OrderTree(tree_.begin(), tree_.end(), 0, traits())); + g.wait(); +#else + OrderTree(tree_.begin(), tree_.end(), 0, traits()).serial(); +#endif + + for (size_t i = 0; i < tree_.size(); ++i) + indices_[tree_[i]] = i; +} + +template +struct +hera::ws::dnn::KDTree::OrderTree +{ + OrderTree(HCIterator b_, HCIterator e_, size_t i_, const Traits& traits_): + b(b_), e(e_), i(i_), traits(traits_) {} + + void operator()() const + { + if (e - b < 1000) + { + serial(); + return; + } + + HCIterator m = b + (e - b)/2; + CoordinateComparison cmp(i, traits); + std::nth_element(b,m,e, cmp); + size_t next_i = (i + 1) % traits.dimension(); + + task_group g; + if (b < m - 1) g.run(OrderTree(b, m, next_i, traits)); + if (e > m + 2) g.run(OrderTree(m+1, e, next_i, traits)); + g.wait(); + } + + void serial() const + { + std::queue q; + q.push(KDTreeNode(b,e,i)); + while (!q.empty()) + { + HCIterator b, e; size_t i; + std::tie(b,e,i) = q.front(); + q.pop(); + HCIterator m = b + (e - b)/2; + + CoordinateComparison cmp(i, traits); + std::nth_element(b,m,e, cmp); + size_t next_i = (i + 1) % traits.dimension(); + + // Replace with a size condition instead? + if (m - b > 1) q.push(KDTreeNode(b, m, next_i)); + if (e - m > 2) q.push(KDTreeNode(m+1, e, next_i)); + } + } + + HCIterator b, e; + size_t i; + const Traits& traits; +}; + +template +template +void +hera::ws::dnn::KDTree:: +search(PointHandle q, ResultsFunctor& rf) const +{ + typedef typename HandleContainer::const_iterator HCIterator; + typedef std::tuple KDTreeNode; + + if (tree_.empty()) + return; + + DistanceType D = std::numeric_limits::max(); + + // TODO: use tbb::scalable_allocator for the queue + std::queue nodes; + + nodes.push(KDTreeNode(tree_.begin(), tree_.end(), 0)); + + while (!nodes.empty()) + { + HCIterator b, e; size_t i; + std::tie(b,e,i) = nodes.front(); + nodes.pop(); + + CoordinateComparison cmp(i, traits()); + i = (i + 1) % traits().dimension(); + + HCIterator m = b + (e - b)/2; + + DistanceType dist = (wassersteinPower == 1.0) ? traits().distance(q, *m) + weights_[m - tree_.begin()] : std::pow(traits().distance(q, *m), wassersteinPower) + weights_[m - tree_.begin()]; + + + D = rf(*m, dist); + + // we are really searching w.r.t L_\infty ball; could prune better with an L_2 ball + Coordinate diff = cmp.diff(q, *m); // diff returns signed distance + + DistanceType diffToWasserPower = (wassersteinPower == 1.0) ? diff : ((diff > 0 ? 1.0 : -1.0) * std::pow(fabs(diff), wassersteinPower)); + + size_t lm = m + 1 + (e - (m+1))/2 - tree_.begin(); + if (e > m + 1 && diffToWasserPower - subtree_weights_[lm] >= -D) { + nodes.push(KDTreeNode(m+1, e, i)); + } + + size_t rm = b + (m - b) / 2 - tree_.begin(); + if (b < m && diffToWasserPower + subtree_weights_[rm] <= D) { + nodes.push(KDTreeNode(b, m, i)); + } + } +} + +template +void +hera::ws::dnn::KDTree:: +adjust_weights(DistanceType delta) +{ + for(auto& w : weights_) + w -= delta; + + for(auto& sw : subtree_weights_) + sw -= delta; +} + + +template +void +hera::ws::dnn::KDTree:: +change_weight(PointHandle p, DistanceType w) +{ + size_t idx = indices_[p]; + + if ( weights_[idx] == w ) { + return; + } + + bool weight_increases = ( weights_[idx] < w ); + weights_[idx] = w; + + typedef std::tuple KDTreeNode; + + // find the path down the tree to this node + // not an ideal strategy, but // it's not clear how to move up from the node in general + std::stack s; + s.push(KDTreeNode(tree_.begin(),tree_.end())); + + do + { + HCIterator b,e; + std::tie(b,e) = s.top(); + + size_t im = b + (e - b)/2 - tree_.begin(); + + if (idx == im) + break; + else if (idx < im) + s.push(KDTreeNode(b, tree_.begin() + im)); + else // idx > im + s.push(KDTreeNode(tree_.begin() + im + 1, e)); + } while(1); + + // update subtree_weights_ on the path to the root + DistanceType min_w = w; + while (!s.empty()) + { + HCIterator b,e; + std::tie(b,e) = s.top(); + HCIterator m = b + (e - b)/2; + size_t im = m - tree_.begin(); + s.pop(); + + + // left and right children + if (b < m) + { + size_t lm = b + (m - b)/2 - tree_.begin(); + if (subtree_weights_[lm] < min_w) + min_w = subtree_weights_[lm]; + } + + if (e > m + 1) + { + size_t rm = m + 1 + (e - (m+1))/2 - tree_.begin(); + if (subtree_weights_[rm] < min_w) + min_w = subtree_weights_[rm]; + } + + if (weights_[im] < min_w) { + min_w = weights_[im]; + } + + if (weight_increases) { + + if (subtree_weights_[im] < min_w ) // increase weight + subtree_weights_[im] = min_w; + else + break; + + } else { + + if (subtree_weights_[im] > min_w ) // decrease weight + subtree_weights_[im] = min_w; + else + break; + + } + } +} + +template +typename hera::ws::dnn::KDTree::HandleDistance +hera::ws::dnn::KDTree:: +find(PointHandle q) const +{ + hera::ws::dnn::NNRecord nn; + search(q, nn); + return nn.result; +} + +template +typename hera::ws::dnn::KDTree::Result +hera::ws::dnn::KDTree:: +findR(PointHandle q, DistanceType r) const +{ + hera::ws::dnn::rNNRecord rnn(r); + search(q, rnn); + std::sort(rnn.result.begin(), rnn.result.end()); + return rnn.result; +} + +template +typename hera::ws::dnn::KDTree::Result +hera::ws::dnn::KDTree:: +findK(PointHandle q, size_t k) const +{ + hera::ws::dnn::kNNRecord knn(k); + search(q, knn); + std::sort(knn.result.begin(), knn.result.end()); + return knn.result; +} + + +template +struct hera::ws::dnn::KDTree::CoordinateComparison +{ + CoordinateComparison(size_t i, const Traits& traits): + i_(i), traits_(traits) {} + + bool operator()(PointHandle p1, PointHandle p2) const { return coordinate(p1) < coordinate(p2); } + Coordinate diff(PointHandle p1, PointHandle p2) const { return coordinate(p1) - coordinate(p2); } + + Coordinate coordinate(PointHandle p) const { return traits_.coordinate(p, i_); } + size_t axis() const { return i_; } + + private: + size_t i_; + const Traits& traits_; +}; + +template +void +hera::ws::dnn::KDTree:: +printWeights(void) +{ +#ifndef FOR_R_TDA + std::cout << "weights_:" << std::endl; + for(const auto ph : indices_) { + std::cout << "idx = " << ph.second << ": (" << (ph.first)->at(0) << ", " << (ph.first)->at(1) << ") weight = " << weights_[ph.second] << std::endl; + } + std::cout << "subtree_weights_:" << std::endl; + for(size_t idx = 0; idx < subtree_weights_.size(); ++idx) { + std::cout << idx << " : " << subtree_weights_[idx] << std::endl; + } +#endif +} + + diff --git a/wasserstein/include/dnn/local/search-functors.h b/wasserstein/include/dnn/local/search-functors.h new file mode 100644 index 0000000..1419f22 --- /dev/null +++ b/wasserstein/include/dnn/local/search-functors.h @@ -0,0 +1,95 @@ +#ifndef HERA_WS_DNN_LOCAL_SEARCH_FUNCTORS_H +#define HERA_WS_DNN_LOCAL_SEARCH_FUNCTORS_H + +#include + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + +template +struct HandleDistance +{ + typedef typename NN::PointHandle PointHandle; + typedef typename NN::DistanceType DistanceType; + typedef typename NN::HDContainer HDContainer; + + HandleDistance() {} + HandleDistance(PointHandle pp, DistanceType dd): + p(pp), d(dd) {} + bool operator<(const HandleDistance& other) const { return d < other.d; } + + PointHandle p; + DistanceType d; +}; + +template +struct NNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + + NNRecord() { result.d = std::numeric_limits::max(); } + DistanceType operator()(PointHandle p, DistanceType d) { if (d < result.d) { result.p = p; result.d = d; } return result.d; } + HandleDistance result; +}; + +template +struct rNNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + typedef typename HandleDistance::HDContainer HDContainer; + + rNNRecord(DistanceType r_): r(r_) {} + DistanceType operator()(PointHandle p, DistanceType d) + { + if (d <= r) + result.push_back(HandleDistance(p,d)); + return r; + } + + DistanceType r; + HDContainer result; +}; + +template +struct kNNRecord +{ + typedef typename HandleDistance::PointHandle PointHandle; + typedef typename HandleDistance::DistanceType DistanceType; + typedef typename HandleDistance::HDContainer HDContainer; + + kNNRecord(unsigned k_): k(k_) {} + DistanceType operator()(PointHandle p, DistanceType d) + { + if (result.size() < k) + { + result.push_back(HandleDistance(p,d)); + boost::push_heap(result); + if (result.size() < k) + return std::numeric_limits::max(); + } else if (d < result[0].d) + { + boost::pop_heap(result); + result.back() = HandleDistance(p,d); + boost::push_heap(result); + } + if ( result.size() > 1 ) { + assert( result[0].d >= result[1].d ); + } + return result[0].d; + } + + unsigned k; + HDContainer result; +}; + +} // dnn +} // ws +} // hera + +#endif // DNN_LOCAL_SEARCH_FUNCTORS_H diff --git a/wasserstein/include/dnn/parallel/tbb.h b/wasserstein/include/dnn/parallel/tbb.h new file mode 100644 index 0000000..3f811d6 --- /dev/null +++ b/wasserstein/include/dnn/parallel/tbb.h @@ -0,0 +1,237 @@ +#ifndef HERA_WS_PARALLEL_H +#define HERA_WS_PARALLEL_H + +#include + +#include +#include +#include + +#ifdef TBB + +#include +#include +#include + +#include +#include +#include + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + using tbb::mutex; + using tbb::task_scheduler_init; + using tbb::task_group; + using tbb::task; + + template + struct vector + { + typedef tbb::concurrent_vector type; + }; + + template + struct atomic + { + typedef tbb::atomic type; + static T compare_and_swap(type& v, T n, T o) { return v.compare_and_swap(n,o); } + }; + + template + void do_foreach(Iterator begin, Iterator end, const F& f) { tbb::parallel_do(begin, end, f); } + + template + void for_each_range_(const Range& r, const F& f) + { + for (typename Range::iterator cur = r.begin(); cur != r.end(); ++cur) + f(*cur); + } + + template + void for_each_range(size_t from, size_t to, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(from, to, f); + } + + template + void for_each_range(const Container& c, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); + } + + template + void for_each_range(Container& c, const F& f) + { + //static tbb::affinity_partitioner ap; + //tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f), ap); + tbb::parallel_for(c.range(), boost::bind(&for_each_range_, _1, f)); + } + + template + struct map_traits + { + typedef tbb::concurrent_hash_map type; + typedef typename type::range_type range; + }; + + struct progress_timer + { + progress_timer(): start(tbb::tick_count::now()) {} + ~progress_timer() + { std::cout << (tbb::tick_count::now() - start).seconds() << " s" << std::endl; } + + tbb::tick_count start; + }; +} // dnn +} // ws +} // hera + +// Serialization for tbb::concurrent_vector<...> +namespace boost +{ + namespace serialization + { + template + void save(Archive& ar, const tbb::concurrent_vector& v, const unsigned int file_version) + { stl::save_collection(ar, v); } + + template + void load(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) + { + stl::load_collection, + stl::archive_input_seq< Archive, tbb::concurrent_vector >, + stl::reserve_imp< tbb::concurrent_vector > + >(ar, v); + } + + template + void serialize(Archive& ar, tbb::concurrent_vector& v, const unsigned int file_version) + { split_free(ar, v, file_version); } + + template + void save(Archive& ar, const tbb::atomic& v, const unsigned int file_version) + { T v_ = v; ar << v_; } + + template + void load(Archive& ar, tbb::atomic& v, const unsigned int file_version) + { T v_; ar >> v_; v = v_; } + + template + void serialize(Archive& ar, tbb::atomic& v, const unsigned int file_version) + { split_free(ar, v, file_version); } + } +} + +#else + +#include +#include +#include + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + template + struct vector + { + typedef ::std::vector type; + }; + + template + struct atomic + { + typedef T type; + static T compare_and_swap(type& v, T n, T o) { if (v != o) return v; v = n; return o; } + }; + + template + void do_foreach(Iterator begin, Iterator end, const F& f) { std::for_each(begin, end, f); } + + template + void for_each_range(size_t from, size_t to, const F& f) + { + for (size_t i = from; i < to; ++i) + f(i); + } + + template + void for_each_range(Container& c, const F& f) + { + BOOST_FOREACH(const typename Container::value_type& i, c) + f(i); + } + + template + void for_each_range(const Container& c, const F& f) + { + BOOST_FOREACH(const typename Container::value_type& i, c) + f(i); + } + + struct mutex + { + struct scoped_lock + { + scoped_lock() {} + scoped_lock(mutex& ) {} + void acquire(mutex& ) const {} + void release() const {} + }; + }; + + struct task_scheduler_init + { + task_scheduler_init(unsigned) {} + void initialize(unsigned) {} + static const unsigned automatic = 0; + static const unsigned deferred = 0; + }; + + struct task_group + { + template + void run(const Functor& f) const { f(); } + void wait() const {} + }; + + template + struct map_traits + { + typedef std::map type; + typedef type range; + }; + + using boost::progress_timer; +} // dnn +} // ws +} // hera + +#endif // TBB + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + template + void do_foreach(const Range& range, const F& f) { do_foreach(boost::begin(range), boost::end(range), f); } +} // dnn +} // ws +} // hera + +#endif diff --git a/wasserstein/include/dnn/parallel/utils.h b/wasserstein/include/dnn/parallel/utils.h new file mode 100644 index 0000000..7104ec3 --- /dev/null +++ b/wasserstein/include/dnn/parallel/utils.h @@ -0,0 +1,100 @@ +#ifndef HERA_WS_PARALLEL_UTILS_H +#define HERA_WS_PARALLEL_UTILS_H + +#include "../utils.h" + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + // Assumes rng is synchronized across ranks + template + void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty = DataVector()); + + template + void shuffle(mpi::communicator& world, DataVector& data, RNGType& rng) + { + typedef decltype(data[0]) T; + shuffle(world, data, rng, [](T& x, T& y) { std::swap(x,y); }); + } +} // dnn +} // ws +} // hera + +template +void +hera::ws::dnn::shuffle(mpi::communicator& world, DataVector& data, RNGType& rng, const SwapFunctor& swap, DataVector empty) +{ + // This is not a perfect shuffle: it dishes out data in chunks of 1/size. + // (It can be interpreted as generating a bistochastic matrix by taking the + // sum of size random permutation matrices.) Hopefully, it works for our purposes. + + typedef typename RNGType::result_type RNGResult; + + int size = world.size(); + int rank = world.rank(); + + // Generate local seeds + boost::uniform_int uniform; + RNGResult seed; + for (size_t i = 0; i < size; ++i) + { + RNGResult v = uniform(rng); + if (i == rank) + seed = v; + } + RNGType local_rng(seed); + + // Shuffle local data + hera::ws::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); + + // Decide how much of our data goes to i-th processor + std::vector out_counts(size); + std::vector ranks(boost::counting_iterator(0), + boost::counting_iterator(size)); + for (size_t i = 0; i < size; ++i) + { + hera::ws::dnn::random_shuffle(ranks.begin(), ranks.end(), rng); + ++out_counts[ranks[rank]]; + } + + // Fill the outgoing array + size_t total = 0; + std::vector< DataVector > outgoing(size, empty); + for (size_t i = 0; i < size; ++i) + { + size_t count = data.size()*out_counts[i]/size; + if (total + count > data.size()) + count = data.size() - total; + + outgoing[i].reserve(count); + for (size_t j = total; j < total + count; ++j) + outgoing[i].push_back(data[j]); + + total += count; + } + + boost::uniform_int uniform_outgoing(0,size-1); // in range [0,size-1] + while(total < data.size()) // send leftover to random processes + { + outgoing[uniform_outgoing(local_rng)].push_back(data[total]); + ++total; + } + data.clear(); + + // Exchange the data + std::vector< DataVector > incoming(size, empty); + mpi::all_to_all(world, outgoing, incoming); + outgoing.clear(); + + // Assemble our data + for(const DataVector& vec : incoming) + for (size_t i = 0; i < vec.size(); ++i) + data.push_back(vec[i]); + hera::ws::dnn::random_shuffle(data.begin(), data.end(), local_rng, swap); + // XXX: the final shuffle is irrelevant for our purposes. But it's also cheap. +} + +#endif diff --git a/wasserstein/include/dnn/utils.h b/wasserstein/include/dnn/utils.h new file mode 100644 index 0000000..bbce793 --- /dev/null +++ b/wasserstein/include/dnn/utils.h @@ -0,0 +1,47 @@ +#ifndef HERA_WS_DNN_UTILS_H +#define HERA_WS_DNN_UTILS_H + +#include +#include +#include + +namespace hera +{ +namespace ws +{ +namespace dnn +{ + +template +struct has_coordinates +{ + template ().coordinate(std::declval()...) )> + static std::true_type test(int); + + template + static std::false_type test(...); + + static constexpr bool value = decltype(test(0))::value; +}; + +template +void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g, const SwapFunctor& swap) +{ + size_t n = last - first; + boost::uniform_int uniform(0,n); + for (size_t i = n-1; i > 0; --i) + swap(first[i], first[uniform(g,i+1)]); // picks a random number in [0,i] range +} + +template +void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g) +{ + typedef decltype(*first) T; + random_shuffle(first, last, g, [](T& x, T& y) { std::swap(x,y); }); +} + +} // dnn +} // ws +} // hera + +#endif diff --git a/wasserstein/include/hera_infinity.h b/wasserstein/include/hera_infinity.h new file mode 100644 index 0000000..8d86dbb --- /dev/null +++ b/wasserstein/include/hera_infinity.h @@ -0,0 +1,22 @@ +#ifndef WASSERSTEIN_HERA_INFINITY_H +#define WASSERSTEIN_HERA_INFINITY_H + +// we cannot assume that template parameter Real will always provide infinity() value, +// so value -1.0 is used to encode infinity (l_inf norm is used by default) + +namespace hera { + + template + inline bool is_infinity(const Real& x) + { + return x == Real(-1); + }; + + template + inline constexpr Real get_infinity() + { + return Real(-1); + } +} + +#endif //WASSERSTEIN_HERA_INFINITY_H diff --git a/wasserstein/include/opts/opts.h b/wasserstein/include/opts/opts.h new file mode 100755 index 0000000..74e788b --- /dev/null +++ b/wasserstein/include/opts/opts.h @@ -0,0 +1,353 @@ +/** + * Author: Dmitriy Morozov + * The interface is heavily influenced by GetOptPP (https://code.google.com/p/getoptpp/). + */ + +#ifndef OPTS_OPTS_H +#define OPTS_OPTS_H + +#include +#include +#include +#include +#include + +namespace opts { + +// Converters +template +struct Converter +{ + Converter() {} + static + T convert(const std::string& val) { std::istringstream iss(val); T res; iss >> res; return res; } +}; + +// Type +template +struct Traits +{ + static std::string type_string() { return "UNKNOWN TYPE"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "INT"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "SHORT INT"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "UNSIGNED INT"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "SHORT UNSIGNED INT"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "FLOAT"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "DOUBLE"; } +}; + +template<> +struct Traits +{ + static std::string type_string() { return "STRING"; } +}; + + +struct BasicOption +{ + BasicOption(char s_, + std::string l_, + std::string default_, + std::string type_, + std::string help_): + s(s_), l(l_), d(default_), t(type_), help(help_) {} + + int long_size() const { return l.size() + 1 + t.size(); } + + void output(std::ostream& out, int max_long) const + { + out << " "; + if (s) + out << '-' << s << ", "; + else + out << " "; + + out << "--" << l << ' '; + + if (!t.empty()) + out << t; + + for (int i = long_size(); i < max_long; ++i) + out << ' '; + + out << " " << help; + + if (!d.empty()) + { + out << " [default: " << d << "]"; + } + out << '\n'; + } + + char s; + std::string l; + std::string d; + std::string t; + std::string help; +}; + +// Option +template +struct OptionContainer: public BasicOption +{ + OptionContainer(char s_, + const std::string& l_, + T& var_, + const std::string& help_, + const std::string& type_ = Traits::type_string()): + BasicOption(s_, l_, default_value(var_), type_, help_), + var(&var_) {} + + static + std::string default_value(const T& def) + { + std::ostringstream oss; + oss << def; + return oss.str(); + } + + void parse(std::list& args) const + { + std::string short_opt = "-"; short_opt += s; + std::string long_opt = "--" + l; + for (std::list::iterator cur = args.begin(); cur != args.end(); ++cur) + { + if (*cur == short_opt || *cur == long_opt) + { + cur = args.erase(cur); + if (cur != args.end()) + { + *var = Converter::convert(*cur); + cur = args.erase(cur); + break; // finds first occurrence + } + else + break; // if the last option's value is missing, it remains default + + } + } + } + + T* var; +}; + +template +struct OptionContainer< std::vector >: public BasicOption +{ + OptionContainer(char s_, + const std::string& l_, + std::vector& var_, + const std::string& help_, + const std::string& type_ = "SEQUENCE"): + BasicOption(s_, l_, default_value(var_), type_, help_), + var(&var_) { } + + static + std::string default_value(const std::vector& def) + { + std::ostringstream oss; + oss << "("; + if (def.size()) + oss << def[0]; + for (int i = 1; i < def.size(); ++i) + oss << ", " << def[i]; + oss << ")"; + return oss.str(); + } + + void parse(std::list& args) const + { + std::string short_opt = "-"; short_opt += s; + std::string long_opt = "--" + l; + for (std::list::iterator cur = args.begin(); cur != args.end(); ++cur) + { + if (*cur == short_opt || *cur == long_opt) + { + cur = args.erase(cur); + if (cur != args.end()) + { + var->push_back(Converter::convert(*cur)); + cur = args.erase(cur); + } + --cur; + } + } + } + + std::vector* var; +}; + + +template +OptionContainer +Option(char s, const std::string& l, T& var, const std::string& help) { return OptionContainer(s, l, var, help); } + +template +OptionContainer +Option(char s, const std::string& l, T& var, + const std::string& type, const std::string& help) { return OptionContainer(s, l, var, help, type); } + +template +OptionContainer +Option(const std::string& l, T& var, const std::string& help) { return OptionContainer(0, l, var, help); } + +template +OptionContainer +Option(const std::string& l, T& var, + const std::string& type, const std::string& help) { return OptionContainer(0, l, var, help, type); } + +// Present +struct PresentContainer: public BasicOption +{ + PresentContainer(char s, const std::string& l, const std::string& help): + BasicOption(s,l,"","",help) {} +}; + +inline +PresentContainer +Present(char s, const std::string& l, const std::string& help) { return PresentContainer(s, l, help); } + +inline +PresentContainer +Present(const std::string& l, const std::string& help) { return PresentContainer(0, l, help); } + +// PosOption +template +struct PosOptionContainer +{ + PosOptionContainer(T& var_): + var(&var_) {} + + bool parse(std::list& args) const + { + if (args.empty()) + return false; + + *var = Converter::convert(args.front()); + args.pop_front(); + return true; + } + + T* var; +}; + +template +PosOptionContainer +PosOption(T& var) { return PosOptionContainer(var); } + + +// Options +struct Options +{ + Options(int argc_, char** argv_): + args(argv_ + 1, argv_ + argc_), + failed(false) {} + + template + Options& operator>>(const OptionContainer& oc); + bool operator>>(const PresentContainer& pc); + template + Options& operator>>(const PosOptionContainer& poc); + + operator bool() { return !failed; } + + + friend + std::ostream& + operator<<(std::ostream& out, const Options& ops) + { + int max_long = 0; + for (std::list::const_iterator cur = ops.options.begin(); + cur != ops.options.end(); + ++cur) + { + int cur_long = cur->long_size(); + if (cur_long > max_long) + max_long = cur_long; + } + + out << "Options:\n"; + for (std::list::const_iterator cur = ops.options.begin(); + cur != ops.options.end(); + ++cur) + cur->output(out, max_long); + + return out; + } + + + private: + std::list args; + std::list options; + bool failed; +}; + +template +Options& +Options::operator>>(const OptionContainer& oc) +{ + options.push_back(oc); + oc.parse(args); + return *this; +} + +inline +bool +Options::operator>>(const PresentContainer& pc) +{ + options.push_back(pc); + + for(std::list::iterator cur = args.begin(); cur != args.end(); ++cur) + { + std::string short_opt = "-"; short_opt += pc.s; + std::string long_opt = "--" + pc.l; + if (*cur == short_opt || *cur == long_opt) + { + args.erase(cur); + return true; + } + } + return false; +} + +template +Options& +Options::operator>>(const PosOptionContainer& poc) +{ + failed = !poc.parse(args); + return *this; +} + +} + +#endif diff --git a/wasserstein/include/spdlog/async_logger.h b/wasserstein/include/spdlog/async_logger.h new file mode 100644 index 0000000..9d7e08f --- /dev/null +++ b/wasserstein/include/spdlog/async_logger.h @@ -0,0 +1,82 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Very fast asynchronous logger (millions of logs per second on an average desktop) +// Uses pre allocated lockfree queue for maximum throughput even under large number of threads. +// Creates a single back thread to pop messages from the queue and log them. +// +// Upon each log write the logger: +// 1. Checks if its log level is enough to log the message +// 2. Push a new copy of the message to a queue (or block the caller until space is available in the queue) +// 3. will throw spdlog_ex upon log exceptions +// Upon destruction, logs all remaining messages in the queue before destructing.. + +#include "spdlog/common.h" +#include "spdlog/logger.h" + +#include +#include +#include +#include + +namespace spdlog +{ + +namespace details +{ +class async_log_helper; +} + +class async_logger SPDLOG_FINAL :public logger +{ +public: + template + async_logger(const std::string& name, + const It& begin, + const It& end, + size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function& worker_warmup_cb = nullptr, + const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function& worker_teardown_cb = nullptr); + + async_logger(const std::string& logger_name, + sinks_init_list sinks, + size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function& worker_warmup_cb = nullptr, + const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function& worker_teardown_cb = nullptr); + + async_logger(const std::string& logger_name, + sink_ptr single_sink, + size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function& worker_warmup_cb = nullptr, + const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function& worker_teardown_cb = nullptr); + + //Wait for the queue to be empty, and flush synchronously + //Warning: this can potentially last forever as we wait it to complete + void flush() override; + + // Error handler + virtual void set_error_handler(log_err_handler) override; + virtual log_err_handler error_handler() override; + +protected: + void _sink_it(details::log_msg& msg) override; + void _set_formatter(spdlog::formatter_ptr msg_formatter) override; + void _set_pattern(const std::string& pattern, pattern_time_type pattern_time) override; + +private: + std::unique_ptr _async_log_helper; +}; +} + + +#include "spdlog/details/async_logger_impl.h" diff --git a/wasserstein/include/spdlog/common.h b/wasserstein/include/spdlog/common.h new file mode 100644 index 0000000..7e352fa --- /dev/null +++ b/wasserstein/include/spdlog/common.h @@ -0,0 +1,160 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +#include +#include +#endif + +#include "spdlog/details/null_mutex.h" + +//visual studio upto 2013 does not support noexcept nor constexpr +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define SPDLOG_NOEXCEPT throw() +#define SPDLOG_CONSTEXPR +#else +#define SPDLOG_NOEXCEPT noexcept +#define SPDLOG_CONSTEXPR constexpr +#endif + +// See tweakme.h +#if !defined(SPDLOG_FINAL) +#define SPDLOG_FINAL +#endif + +#if defined(__GNUC__) || defined(__clang__) +#define SPDLOG_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define SPDLOG_DEPRECATED __declspec(deprecated) +#else +#define SPDLOG_DEPRECATED +#endif + + +#include "spdlog/fmt/fmt.h" + +namespace spdlog +{ + +class formatter; + +namespace sinks +{ +class sink; +} + +using log_clock = std::chrono::system_clock; +using sink_ptr = std::shared_ptr < sinks::sink >; +using sinks_init_list = std::initializer_list < sink_ptr >; +using formatter_ptr = std::shared_ptr; +#if defined(SPDLOG_NO_ATOMIC_LEVELS) +using level_t = details::null_atomic_int; +#else +using level_t = std::atomic; +#endif + +using log_err_handler = std::function; + +//Log level enum +namespace level +{ +typedef enum +{ + trace = 0, + debug = 1, + info = 2, + warn = 3, + err = 4, + critical = 5, + off = 6 +} level_enum; + +#if !defined(SPDLOG_LEVEL_NAMES) +#define SPDLOG_LEVEL_NAMES { "trace", "debug", "info", "warning", "error", "critical", "off" }; +#endif +static const char* level_names[] SPDLOG_LEVEL_NAMES + +static const char* short_level_names[] { "T", "D", "I", "W", "E", "C", "O" }; + +inline const char* to_str(spdlog::level::level_enum l) +{ + return level_names[l]; +} + +inline const char* to_short_str(spdlog::level::level_enum l) +{ + return short_level_names[l]; +} +} //level + + +// +// Async overflow policy - block by default. +// +enum class async_overflow_policy +{ + block_retry, // Block / yield / sleep until message can be enqueued + discard_log_msg // Discard the message it enqueue fails +}; + +// +// Pattern time - specific time getting to use for pattern_formatter. +// local time by default +// +enum class pattern_time_type +{ + local, // log localtime + utc // log utc +}; + +// +// Log exception +// +namespace details +{ +namespace os +{ +std::string errno_str(int err_num); +} +} +class spdlog_ex: public std::exception +{ +public: + spdlog_ex(const std::string& msg):_msg(msg) + {} + spdlog_ex(const std::string& msg, int last_errno) + { + _msg = msg + ": " + details::os::errno_str(last_errno); + } + const char* what() const SPDLOG_NOEXCEPT override + { + return _msg.c_str(); + } +private: + std::string _msg; + +}; + +// +// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) +// +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +using filename_t = std::wstring; +#else +using filename_t = std::string; +#endif + + +} //spdlog diff --git a/wasserstein/include/spdlog/details/async_log_helper.h b/wasserstein/include/spdlog/details/async_log_helper.h new file mode 100644 index 0000000..6145dfa --- /dev/null +++ b/wasserstein/include/spdlog/details/async_log_helper.h @@ -0,0 +1,399 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +// async log helper : +// Process logs asynchronously using a back thread. +// +// If the internal queue of log messages reaches its max size, +// then the client call will block until there is more room. +// + +#pragma once + +#include "spdlog/common.h" +#include "spdlog/sinks/sink.h" +#include "spdlog/details/mpmc_bounded_q.h" +#include "spdlog/details/log_msg.h" +#include "spdlog/details/os.h" +#include "spdlog/formatter.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace details +{ + +class async_log_helper +{ + // Async msg to move to/from the queue + // Movable only. should never be copied + enum class async_msg_type + { + log, + flush, + terminate + }; + struct async_msg + { + std::string logger_name; + level::level_enum level; + log_clock::time_point time; + size_t thread_id; + std::string txt; + async_msg_type msg_type; + size_t msg_id; + + async_msg() = default; + ~async_msg() = default; + + +async_msg(async_msg&& other) SPDLOG_NOEXCEPT: + logger_name(std::move(other.logger_name)), + level(std::move(other.level)), + time(std::move(other.time)), + thread_id(other.thread_id), + txt(std::move(other.txt)), + msg_type(std::move(other.msg_type)), + msg_id(other.msg_id) + {} + + async_msg(async_msg_type m_type): + level(level::info), + thread_id(0), + msg_type(m_type), + msg_id(0) + {} + + async_msg& operator=(async_msg&& other) SPDLOG_NOEXCEPT + { + logger_name = std::move(other.logger_name); + level = other.level; + time = std::move(other.time); + thread_id = other.thread_id; + txt = std::move(other.txt); + msg_type = other.msg_type; + msg_id = other.msg_id; + return *this; + } + + // never copy or assign. should only be moved.. + async_msg(const async_msg&) = delete; + async_msg& operator=(const async_msg& other) = delete; + + // construct from log_msg + async_msg(const details::log_msg& m): + level(m.level), + time(m.time), + thread_id(m.thread_id), + txt(m.raw.data(), m.raw.size()), + msg_type(async_msg_type::log), + msg_id(m.msg_id) + { +#ifndef SPDLOG_NO_NAME + logger_name = *m.logger_name; +#endif + } + + + // copy into log_msg + void fill_log_msg(log_msg &msg) + { + msg.logger_name = &logger_name; + msg.level = level; + msg.time = time; + msg.thread_id = thread_id; + msg.raw << txt; + msg.msg_id = msg_id; + } + }; + +public: + + using item_type = async_msg; + using q_type = details::mpmc_bounded_queue; + + using clock = std::chrono::steady_clock; + + + async_log_helper(formatter_ptr formatter, + const std::vector& sinks, + size_t queue_size, + const log_err_handler err_handler, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function& worker_warmup_cb = nullptr, + const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function& worker_teardown_cb = nullptr); + + void log(const details::log_msg& msg); + + // stop logging and join the back thread + ~async_log_helper(); + + void set_formatter(formatter_ptr); + + void flush(bool wait_for_q); + + void set_error_handler(spdlog::log_err_handler err_handler); + +private: + formatter_ptr _formatter; + std::vector> _sinks; + + // queue of messages to log + q_type _q; + + log_err_handler _err_handler; + + bool _flush_requested; + + bool _terminate_requested; + + + // overflow policy + const async_overflow_policy _overflow_policy; + + // worker thread warmup callback - one can set thread priority, affinity, etc + const std::function _worker_warmup_cb; + + // auto periodic sink flush parameter + const std::chrono::milliseconds _flush_interval_ms; + + // worker thread teardown callback + const std::function _worker_teardown_cb; + + // worker thread + std::thread _worker_thread; + + void push_msg(async_msg&& new_msg); + + // worker thread main loop + void worker_loop(); + + // pop next message from the queue and process it. will set the last_pop to the pop time + // return false if termination of the queue is required + bool process_next_msg(log_clock::time_point& last_pop, log_clock::time_point& last_flush); + + void handle_flush_interval(log_clock::time_point& now, log_clock::time_point& last_flush); + + // sleep,yield or return immediately using the time passed since last message as a hint + static void sleep_or_yield(const spdlog::log_clock::time_point& now, const log_clock::time_point& last_op_time); + + // wait until the queue is empty + void wait_empty_q(); + +}; +} +} + +/////////////////////////////////////////////////////////////////////////////// +// async_sink class implementation +/////////////////////////////////////////////////////////////////////////////// +inline spdlog::details::async_log_helper::async_log_helper( + formatter_ptr formatter, + const std::vector& sinks, + size_t queue_size, + log_err_handler err_handler, + const async_overflow_policy overflow_policy, + const std::function& worker_warmup_cb, + const std::chrono::milliseconds& flush_interval_ms, + const std::function& worker_teardown_cb): + _formatter(formatter), + _sinks(sinks), + _q(queue_size), + _err_handler(err_handler), + _flush_requested(false), + _terminate_requested(false), + _overflow_policy(overflow_policy), + _worker_warmup_cb(worker_warmup_cb), + _flush_interval_ms(flush_interval_ms), + _worker_teardown_cb(worker_teardown_cb), + _worker_thread(&async_log_helper::worker_loop, this) +{} + +// Send to the worker thread termination message(level=off) +// and wait for it to finish gracefully +inline spdlog::details::async_log_helper::~async_log_helper() +{ + try + { + push_msg(async_msg(async_msg_type::terminate)); + _worker_thread.join(); + } + catch (...) // don't crash in destructor + { + } +} + + +//Try to push and block until succeeded (if the policy is not to discard when the queue is full) +inline void spdlog::details::async_log_helper::log(const details::log_msg& msg) +{ + push_msg(async_msg(msg)); +} + +inline void spdlog::details::async_log_helper::push_msg(details::async_log_helper::async_msg&& new_msg) +{ + if (!_q.enqueue(std::move(new_msg)) && _overflow_policy != async_overflow_policy::discard_log_msg) + { + auto last_op_time = details::os::now(); + auto now = last_op_time; + do + { + now = details::os::now(); + sleep_or_yield(now, last_op_time); + } + while (!_q.enqueue(std::move(new_msg))); + } +} + +// optionally wait for the queue be empty and request flush from the sinks +inline void spdlog::details::async_log_helper::flush(bool wait_for_q) +{ + push_msg(async_msg(async_msg_type::flush)); + if (wait_for_q) + wait_empty_q(); //return only make after the above flush message was processed +} + +inline void spdlog::details::async_log_helper::worker_loop() +{ + if (_worker_warmup_cb) _worker_warmup_cb(); + auto last_pop = details::os::now(); + auto last_flush = last_pop; + auto active = true; + while (active) + { + try + { + active = process_next_msg(last_pop, last_flush); + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception"); + } + } + if (_worker_teardown_cb) _worker_teardown_cb(); + + +} + +// process next message in the queue +// return true if this thread should still be active (while no terminate msg was received) +inline bool spdlog::details::async_log_helper::process_next_msg(log_clock::time_point& last_pop, log_clock::time_point& last_flush) +{ + async_msg incoming_async_msg; + + if (_q.dequeue(incoming_async_msg)) + { + last_pop = details::os::now(); + switch (incoming_async_msg.msg_type) + { + case async_msg_type::flush: + _flush_requested = true; + break; + + case async_msg_type::terminate: + _flush_requested = true; + _terminate_requested = true; + break; + + default: + log_msg incoming_log_msg; + incoming_async_msg.fill_log_msg(incoming_log_msg); + _formatter->format(incoming_log_msg); + for (auto &s : _sinks) + { + if (s->should_log(incoming_log_msg.level)) + { + s->log(incoming_log_msg); + } + } + } + return true; + } + + // Handle empty queue.. + // This is the only place where the queue can terminate or flush to avoid losing messages already in the queue + else + { + auto now = details::os::now(); + handle_flush_interval(now, last_flush); + sleep_or_yield(now, last_pop); + return !_terminate_requested; + } +} + +// flush all sinks if _flush_interval_ms has expired +inline void spdlog::details::async_log_helper::handle_flush_interval(log_clock::time_point& now, log_clock::time_point& last_flush) +{ + auto should_flush = _flush_requested || (_flush_interval_ms != std::chrono::milliseconds::zero() && now - last_flush >= _flush_interval_ms); + if (should_flush) + { + for (auto &s : _sinks) + s->flush(); + now = last_flush = details::os::now(); + _flush_requested = false; + } +} + +inline void spdlog::details::async_log_helper::set_formatter(formatter_ptr msg_formatter) +{ + _formatter = msg_formatter; +} + + +// spin, yield or sleep. use the time passed since last message as a hint +inline void spdlog::details::async_log_helper::sleep_or_yield(const spdlog::log_clock::time_point& now, const spdlog::log_clock::time_point& last_op_time) +{ + using namespace std::this_thread; + using std::chrono::milliseconds; + using std::chrono::microseconds; + + auto time_since_op = now - last_op_time; + + // spin upto 50 micros + if (time_since_op <= microseconds(50)) + return; + + // yield upto 150 micros + if (time_since_op <= microseconds(100)) + return std::this_thread::yield(); + + // sleep for 20 ms upto 200 ms + if (time_since_op <= milliseconds(200)) + return sleep_for(milliseconds(20)); + + // sleep for 200 ms + return sleep_for(milliseconds(200)); +} + +// wait for the queue to be empty +inline void spdlog::details::async_log_helper::wait_empty_q() +{ + auto last_op = details::os::now(); + while (_q.approx_size() > 0) + { + sleep_or_yield(details::os::now(), last_op); + } +} + +inline void spdlog::details::async_log_helper::set_error_handler(spdlog::log_err_handler err_handler) +{ + _err_handler = err_handler; +} + + + diff --git a/wasserstein/include/spdlog/details/async_logger_impl.h b/wasserstein/include/spdlog/details/async_logger_impl.h new file mode 100644 index 0000000..33486c2 --- /dev/null +++ b/wasserstein/include/spdlog/details/async_logger_impl.h @@ -0,0 +1,105 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Async Logger implementation +// Use an async_sink (queue per logger) to perform the logging in a worker thread + +#include "spdlog/details/async_log_helper.h" +#include "spdlog/async_logger.h" + +#include +#include +#include +#include + +template +inline spdlog::async_logger::async_logger(const std::string& logger_name, + const It& begin, + const It& end, + size_t queue_size, + const async_overflow_policy overflow_policy, + const std::function& worker_warmup_cb, + const std::chrono::milliseconds& flush_interval_ms, + const std::function& worker_teardown_cb) : + logger(logger_name, begin, end), + _async_log_helper(new details::async_log_helper(_formatter, _sinks, queue_size, _err_handler, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb)) +{ +} + +inline spdlog::async_logger::async_logger(const std::string& logger_name, + sinks_init_list sinks_list, + size_t queue_size, + const async_overflow_policy overflow_policy, + const std::function& worker_warmup_cb, + const std::chrono::milliseconds& flush_interval_ms, + const std::function& worker_teardown_cb) : + async_logger(logger_name, sinks_list.begin(), sinks_list.end(), queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {} + +inline spdlog::async_logger::async_logger(const std::string& logger_name, + sink_ptr single_sink, + size_t queue_size, + const async_overflow_policy overflow_policy, + const std::function& worker_warmup_cb, + const std::chrono::milliseconds& flush_interval_ms, + const std::function& worker_teardown_cb) : + async_logger(logger_name, +{ + single_sink +}, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {} + + +inline void spdlog::async_logger::flush() +{ + _async_log_helper->flush(true); +} + +// Error handler +inline void spdlog::async_logger::set_error_handler(spdlog::log_err_handler err_handler) +{ + _err_handler = err_handler; + _async_log_helper->set_error_handler(err_handler); + +} +inline spdlog::log_err_handler spdlog::async_logger::error_handler() +{ + return _err_handler; +} + + +inline void spdlog::async_logger::_set_formatter(spdlog::formatter_ptr msg_formatter) +{ + _formatter = msg_formatter; + _async_log_helper->set_formatter(_formatter); +} + +inline void spdlog::async_logger::_set_pattern(const std::string& pattern, pattern_time_type pattern_time) +{ + _formatter = std::make_shared(pattern, pattern_time); + _async_log_helper->set_formatter(_formatter); +} + + +inline void spdlog::async_logger::_sink_it(details::log_msg& msg) +{ + try + { +#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) + msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); +#endif + _async_log_helper->log(msg); + if (_should_flush_on(msg)) + _async_log_helper->flush(false); // do async flush + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception"); + } +} diff --git a/wasserstein/include/spdlog/details/file_helper.h b/wasserstein/include/spdlog/details/file_helper.h new file mode 100644 index 0000000..d0d730e --- /dev/null +++ b/wasserstein/include/spdlog/details/file_helper.h @@ -0,0 +1,117 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Helper class for file sink +// When failing to open a file, retry several times(5) with small delay between the tries(10 ms) +// Throw spdlog_ex exception on errors + +#include "spdlog/details/os.h" +#include "spdlog/details/log_msg.h" + +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace details +{ + +class file_helper +{ + +public: + const int open_tries = 5; + const int open_interval = 10; + + explicit file_helper() : + _fd(nullptr) + {} + + file_helper(const file_helper&) = delete; + file_helper& operator=(const file_helper&) = delete; + + ~file_helper() + { + close(); + } + + + void open(const filename_t& fname, bool truncate = false) + { + + close(); + auto *mode = truncate ? SPDLOG_FILENAME_T("wb") : SPDLOG_FILENAME_T("ab"); + _filename = fname; + for (int tries = 0; tries < open_tries; ++tries) + { + if (!os::fopen_s(&_fd, fname, mode)) + return; + + std::this_thread::sleep_for(std::chrono::milliseconds(open_interval)); + } + + throw spdlog_ex("Failed opening file " + os::filename_to_str(_filename) + " for writing", errno); + } + + void reopen(bool truncate) + { + if (_filename.empty()) + throw spdlog_ex("Failed re opening file - was not opened before"); + open(_filename, truncate); + + } + + void flush() + { + std::fflush(_fd); + } + + void close() + { + if (_fd) + { + std::fclose(_fd); + _fd = nullptr; + } + } + + void write(const log_msg& msg) + { + + size_t msg_size = msg.formatted.size(); + auto data = msg.formatted.data(); + if (std::fwrite(data, 1, msg_size, _fd) != msg_size) + throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno); + } + + size_t size() + { + if (!_fd) + throw spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(_filename)); + return os::filesize(_fd); + } + + const filename_t& filename() const + { + return _filename; + } + + static bool file_exists(const filename_t& name) + { + + return os::file_exists(name); + } + +private: + FILE* _fd; + filename_t _filename; +}; +} +} diff --git a/wasserstein/include/spdlog/details/log_msg.h b/wasserstein/include/spdlog/details/log_msg.h new file mode 100644 index 0000000..0d7ce4b --- /dev/null +++ b/wasserstein/include/spdlog/details/log_msg.h @@ -0,0 +1,50 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/common.h" +#include "spdlog/details/os.h" + + +#include +#include + +namespace spdlog +{ +namespace details +{ +struct log_msg +{ + log_msg() = default; + log_msg(const std::string *loggers_name, level::level_enum lvl) : + logger_name(loggers_name), + level(lvl), + msg_id(0) + { +#ifndef SPDLOG_NO_DATETIME + time = os::now(); +#endif + +#ifndef SPDLOG_NO_THREAD_ID + thread_id = os::thread_id(); +#endif + } + + log_msg(const log_msg& other) = delete; + log_msg& operator=(log_msg&& other) = delete; + log_msg(log_msg&& other) = delete; + + + const std::string *logger_name; + level::level_enum level; + log_clock::time_point time; + size_t thread_id; + fmt::MemoryWriter raw; + fmt::MemoryWriter formatted; + size_t msg_id; +}; +} +} diff --git a/wasserstein/include/spdlog/details/logger_impl.h b/wasserstein/include/spdlog/details/logger_impl.h new file mode 100644 index 0000000..79c4ef6 --- /dev/null +++ b/wasserstein/include/spdlog/details/logger_impl.h @@ -0,0 +1,563 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/logger.h" +#include "spdlog/sinks/stdout_sinks.h" + +#include +#include + + +// create logger with given name, sinks and the default pattern formatter +// all other ctors will call this one +template +inline spdlog::logger::logger(const std::string& logger_name, const It& begin, const It& end): + _name(logger_name), + _sinks(begin, end), + _formatter(std::make_shared("%+")), + _level(level::info), + _flush_level(level::off), + _last_err_time(0), + _msg_counter(1) // message counter will start from 1. 0-message id will be reserved for controll messages +{ + _err_handler = [this](const std::string &msg) + { + this->_default_err_handler(msg); + }; +} + +// ctor with sinks as init list +inline spdlog::logger::logger(const std::string& logger_name, sinks_init_list sinks_list): + logger(logger_name, sinks_list.begin(), sinks_list.end()) +{} + + +// ctor with single sink +inline spdlog::logger::logger(const std::string& logger_name, spdlog::sink_ptr single_sink): + logger(logger_name, +{ + single_sink +}) +{} + + +inline spdlog::logger::~logger() = default; + + +inline void spdlog::logger::set_formatter(spdlog::formatter_ptr msg_formatter) +{ + _set_formatter(msg_formatter); +} + +inline void spdlog::logger::set_pattern(const std::string& pattern, pattern_time_type pattern_time) +{ + _set_pattern(pattern, pattern_time); +} + + +template +inline void spdlog::logger::log(level::level_enum lvl, const char* fmt, const Args&... args) +{ + if (!should_log(lvl)) return; + + try + { + details::log_msg log_msg(&_name, lvl); + log_msg.raw.write(fmt, args...); + _sink_it(log_msg); + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception"); + } +} + +template +inline void spdlog::logger::log(level::level_enum lvl, const char* msg) +{ + if (!should_log(lvl)) return; + try + { + details::log_msg log_msg(&_name, lvl); + log_msg.raw << msg; + _sink_it(log_msg); + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception"); + } + +} + +template +inline void spdlog::logger::log(level::level_enum lvl, const T& msg) +{ + if (!should_log(lvl)) return; + try + { + details::log_msg log_msg(&_name, lvl); + log_msg.raw << msg; + _sink_it(log_msg); + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception"); + } +} + + +template +inline void spdlog::logger::trace(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::trace, fmt, arg1, args...); +} + +template +inline void spdlog::logger::debug(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::debug, fmt, arg1, args...); +} + +template +inline void spdlog::logger::info(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::info, fmt, arg1, args...); +} + +template +inline void spdlog::logger::warn(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::warn, fmt, arg1, args...); +} + +template +inline void spdlog::logger::error(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::err, fmt, arg1, args...); +} + +template +inline void spdlog::logger::critical(const char* fmt, const Arg1 &arg1, const Args&... args) +{ + log(level::critical, fmt, arg1, args...); +} + +template +inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const char* msg) +{ + if (flag) + { + log(lvl, msg); + } +} + +template +inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const T& msg) +{ + if (flag) + { + log(lvl, msg); + } +} + +template +inline void spdlog::logger::trace_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) +{ + if (flag) + { + log(level::trace, fmt, arg1, args...); + } +} + +template +inline void spdlog::logger::debug_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) +{ + if (flag) + { + log(level::debug, fmt, arg1, args...); + } +} + +template +inline void spdlog::logger::info_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) +{ + if (flag) + { + log(level::info, fmt, arg1, args...); + } +} + +template +inline void spdlog::logger::warn_if(const bool flag, const char* fmt, const Arg1& arg1, const Args&... args) +{ + if (flag) + { + log(level::warn, fmt, arg1, args...); + } +} + +template +inline void spdlog::logger::error_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) +{ + if (flag) + { + log(level::err, fmt, arg1, args...); + } +} + +template +inline void spdlog::logger::critical_if(const bool flag, const char* fmt, const Arg1 &arg1, const Args&... args) +{ + if (flag) + { + log(level::critical, fmt, arg1, args...); + } +} + + +template +inline void spdlog::logger::trace(const T& msg) +{ + log(level::trace, msg); +} + +template +inline void spdlog::logger::debug(const T& msg) +{ + log(level::debug, msg); +} + + +template +inline void spdlog::logger::info(const T& msg) +{ + log(level::info, msg); +} + + +template +inline void spdlog::logger::warn(const T& msg) +{ + log(level::warn, msg); +} + +template +inline void spdlog::logger::error(const T& msg) +{ + log(level::err, msg); +} + +template +inline void spdlog::logger::critical(const T& msg) +{ + log(level::critical, msg); +} + +template +inline void spdlog::logger::trace_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::trace, msg); + } +} + +template +inline void spdlog::logger::debug_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::debug, msg); + } +} + +template +inline void spdlog::logger::info_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::info, msg); + } +} + +template +inline void spdlog::logger::warn_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::warn, msg); + } +} + +template +inline void spdlog::logger::error_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::err, msg); + } +} + +template +inline void spdlog::logger::critical_if(const bool flag, const T& msg) +{ + if (flag) + { + log(level::critical, msg); + } +} + + +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT +#include + +template +inline void spdlog::logger::log(level::level_enum lvl, const wchar_t* msg) +{ + std::wstring_convert > conv; + + log(lvl, conv.to_bytes(msg)); +} + +template +inline void spdlog::logger::log(level::level_enum lvl, const wchar_t* fmt, const Args&... args) +{ + fmt::WMemoryWriter wWriter; + + wWriter.write(fmt, args...); + log(lvl, wWriter.c_str()); +} + +template +inline void spdlog::logger::trace(const wchar_t* fmt, const Args&... args) +{ + log(level::trace, fmt, args...); +} + +template +inline void spdlog::logger::debug(const wchar_t* fmt, const Args&... args) +{ + log(level::debug, fmt, args...); +} + +template +inline void spdlog::logger::info(const wchar_t* fmt, const Args&... args) +{ + log(level::info, fmt, args...); +} + + +template +inline void spdlog::logger::warn(const wchar_t* fmt, const Args&... args) +{ + log(level::warn, fmt, args...); +} + +template +inline void spdlog::logger::error(const wchar_t* fmt, const Args&... args) +{ + log(level::err, fmt, args...); +} + +template +inline void spdlog::logger::critical(const wchar_t* fmt, const Args&... args) +{ + log(level::critical, fmt, args...); +} + +// +// conditional logging +// + +template +inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const wchar_t* msg) +{ + if (flag) + { + log(lvl, msg); + } +} + +template +inline void spdlog::logger::log_if(const bool flag, level::level_enum lvl, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(lvl, fmt, args); + } +} + +template +inline void spdlog::logger::trace_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::trace, fmt, args...); + } +} + +template +inline void spdlog::logger::debug_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::debug, fmt, args...); + } +} + +template +inline void spdlog::logger::info_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::info, fmt, args...); + } +} + + +template +inline void spdlog::logger::warn_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::warn, fmt, args...); + } +} + +template +inline void spdlog::logger::error_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::err, fmt, args...); + } +} + +template +inline void spdlog::logger::critical_if(const bool flag, const wchar_t* fmt, const Args&... args) +{ + if (flag) + { + log(level::critical, fmt, args...); + } +} + +#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT + + + +// +// name and level +// +inline const std::string& spdlog::logger::name() const +{ + return _name; +} + +inline void spdlog::logger::set_level(spdlog::level::level_enum log_level) +{ + _level.store(log_level); +} + +inline void spdlog::logger::set_error_handler(spdlog::log_err_handler err_handler) +{ + _err_handler = err_handler; +} + +inline spdlog::log_err_handler spdlog::logger::error_handler() +{ + return _err_handler; +} + + +inline void spdlog::logger::flush_on(level::level_enum log_level) +{ + _flush_level.store(log_level); +} + +inline spdlog::level::level_enum spdlog::logger::level() const +{ + return static_cast(_level.load(std::memory_order_relaxed)); +} + +inline bool spdlog::logger::should_log(spdlog::level::level_enum msg_level) const +{ + return msg_level >= _level.load(std::memory_order_relaxed); +} + +// +// protected virtual called at end of each user log call (if enabled) by the line_logger +// +inline void spdlog::logger::_sink_it(details::log_msg& msg) +{ +#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) + msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); +#endif + _formatter->format(msg); + for (auto &sink : _sinks) + { + if( sink->should_log( msg.level)) + { + sink->log(msg); + } + } + + if(_should_flush_on(msg)) + flush(); +} + +inline void spdlog::logger::_set_pattern(const std::string& pattern, pattern_time_type pattern_time) +{ + _formatter = std::make_shared(pattern, pattern_time); +} +inline void spdlog::logger::_set_formatter(formatter_ptr msg_formatter) +{ + _formatter = msg_formatter; +} + +inline void spdlog::logger::flush() +{ + for (auto& sink : _sinks) + sink->flush(); +} + +inline void spdlog::logger::_default_err_handler(const std::string &msg) +{ + auto now = time(nullptr); + if (now - _last_err_time < 60) + return; + auto tm_time = details::os::localtime(now); + char date_buf[100]; + std::strftime(date_buf, sizeof(date_buf), "%Y-%m-%d %H:%M:%S", &tm_time); + details::log_msg err_msg; + err_msg.formatted.write("[*** LOG ERROR ***] [{}] [{}] [{}]{}", name(), msg, date_buf, details::os::eol); + sinks::stderr_sink_mt::instance()->log(err_msg); + _last_err_time = now; +} + +inline bool spdlog::logger::_should_flush_on(const details::log_msg &msg) +{ + const auto flush_level = _flush_level.load(std::memory_order_relaxed); + return (msg.level >= flush_level) && (msg.level != level::off); +} + +inline const std::vector& spdlog::logger::sinks() const +{ + return _sinks; +} diff --git a/wasserstein/include/spdlog/details/mpmc_bounded_q.h b/wasserstein/include/spdlog/details/mpmc_bounded_q.h new file mode 100644 index 0000000..afd4c88 --- /dev/null +++ b/wasserstein/include/spdlog/details/mpmc_bounded_q.h @@ -0,0 +1,172 @@ +/* +A modified version of Bounded MPMC queue by Dmitry Vyukov. + +Original code from: +http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue + +licensed by Dmitry Vyukov under the terms below: + +Simplified BSD license + +Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list +of conditions and the following disclaimer in the documentation and/or other materials +provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and +should not be interpreted as representing official policies, either expressed or implied, of Dmitry Vyukov. +*/ + +/* +The code in its current form adds the license below: + +Copyright(c) 2015 Gabi Melman. +Distributed under the MIT License (http://opensource.org/licenses/MIT) + +*/ + +#pragma once + +#include "spdlog/common.h" + +#include +#include + +namespace spdlog +{ +namespace details +{ + +template +class mpmc_bounded_queue +{ +public: + + using item_type = T; + mpmc_bounded_queue(size_t buffer_size) + :max_size_(buffer_size), + buffer_(new cell_t [buffer_size]), + buffer_mask_(buffer_size - 1) + { + //queue size must be power of two + if(!((buffer_size >= 2) && ((buffer_size & (buffer_size - 1)) == 0))) + throw spdlog_ex("async logger queue size must be power of two"); + + for (size_t i = 0; i != buffer_size; i += 1) + buffer_[i].sequence_.store(i, std::memory_order_relaxed); + enqueue_pos_.store(0, std::memory_order_relaxed); + dequeue_pos_.store(0, std::memory_order_relaxed); + } + + ~mpmc_bounded_queue() + { + delete [] buffer_; + } + + + bool enqueue(T&& data) + { + cell_t* cell; + size_t pos = enqueue_pos_.load(std::memory_order_relaxed); + for (;;) + { + cell = &buffer_[pos & buffer_mask_]; + size_t seq = cell->sequence_.load(std::memory_order_acquire); + intptr_t dif = (intptr_t)seq - (intptr_t)pos; + if (dif == 0) + { + if (enqueue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed)) + break; + } + else if (dif < 0) + { + return false; + } + else + { + pos = enqueue_pos_.load(std::memory_order_relaxed); + } + } + cell->data_ = std::move(data); + cell->sequence_.store(pos + 1, std::memory_order_release); + return true; + } + + bool dequeue(T& data) + { + cell_t* cell; + size_t pos = dequeue_pos_.load(std::memory_order_relaxed); + for (;;) + { + cell = &buffer_[pos & buffer_mask_]; + size_t seq = + cell->sequence_.load(std::memory_order_acquire); + intptr_t dif = (intptr_t)seq - (intptr_t)(pos + 1); + if (dif == 0) + { + if (dequeue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed)) + break; + } + else if (dif < 0) + return false; + else + pos = dequeue_pos_.load(std::memory_order_relaxed); + } + data = std::move(cell->data_); + cell->sequence_.store(pos + buffer_mask_ + 1, std::memory_order_release); + return true; + } + + size_t approx_size() + { + size_t first_pos = dequeue_pos_.load(std::memory_order_relaxed); + size_t last_pos = enqueue_pos_.load(std::memory_order_relaxed); + if (last_pos <= first_pos) + return 0; + auto size = last_pos - first_pos; + return size < max_size_ ? size : max_size_; + } + +private: + struct cell_t + { + std::atomic sequence_; + T data_; + }; + + size_t const max_size_; + + static size_t const cacheline_size = 64; + typedef char cacheline_pad_t [cacheline_size]; + + cacheline_pad_t pad0_; + cell_t* const buffer_; + size_t const buffer_mask_; + cacheline_pad_t pad1_; + std::atomic enqueue_pos_; + cacheline_pad_t pad2_; + std::atomic dequeue_pos_; + cacheline_pad_t pad3_; + + mpmc_bounded_queue(mpmc_bounded_queue const&) = delete; + void operator= (mpmc_bounded_queue const&) = delete; +}; + +} // ns details +} // ns spdlog diff --git a/wasserstein/include/spdlog/details/null_mutex.h b/wasserstein/include/spdlog/details/null_mutex.h new file mode 100644 index 0000000..67b0aee --- /dev/null +++ b/wasserstein/include/spdlog/details/null_mutex.h @@ -0,0 +1,45 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include +// null, no cost dummy "mutex" and dummy "atomic" int + +namespace spdlog +{ +namespace details +{ +struct null_mutex +{ + void lock() {} + void unlock() {} + bool try_lock() + { + return true; + } +}; + +struct null_atomic_int +{ + int value; + null_atomic_int() = default; + + null_atomic_int(int val):value(val) + {} + + int load(std::memory_order) const + { + return value; + } + + void store(int val) + { + value = val; + } +}; + +} +} diff --git a/wasserstein/include/spdlog/details/os.h b/wasserstein/include/spdlog/details/os.h new file mode 100644 index 0000000..735f601 --- /dev/null +++ b/wasserstein/include/spdlog/details/os.h @@ -0,0 +1,469 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// +#pragma once + +#include "spdlog/common.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + +#ifndef NOMINMAX +#define NOMINMAX //prevent windows redefining min/max +#endif + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include // _get_pid support +#include // _get_osfhandle and _isatty support + +#ifdef __MINGW32__ +#include +#endif + +#else // unix + +#include +#include + +#ifdef __linux__ +#include //Use gettid() syscall under linux to get thread id + +#elif __FreeBSD__ +#include //Use thr_self() syscall under FreeBSD to get thread id +#endif + +#endif //unix + +#ifndef __has_feature // Clang - feature checking macros. +#define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + + +namespace spdlog +{ +namespace details +{ +namespace os +{ + +inline spdlog::log_clock::time_point now() +{ + +#if defined __linux__ && defined SPDLOG_CLOCK_COARSE + timespec ts; + ::clock_gettime(CLOCK_REALTIME_COARSE, &ts); + return std::chrono::time_point( + std::chrono::duration_cast( + std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec))); + + +#else + return log_clock::now(); +#endif + +} +inline std::tm localtime(const std::time_t &time_tt) +{ + +#ifdef _WIN32 + std::tm tm; + localtime_s(&tm, &time_tt); +#else + std::tm tm; + localtime_r(&time_tt, &tm); +#endif + return tm; +} + +inline std::tm localtime() +{ + std::time_t now_t = time(nullptr); + return localtime(now_t); +} + + +inline std::tm gmtime(const std::time_t &time_tt) +{ + +#ifdef _WIN32 + std::tm tm; + gmtime_s(&tm, &time_tt); +#else + std::tm tm; + gmtime_r(&time_tt, &tm); +#endif + return tm; +} + +inline std::tm gmtime() +{ + std::time_t now_t = time(nullptr); + return gmtime(now_t); +} +inline bool operator==(const std::tm& tm1, const std::tm& tm2) +{ + return (tm1.tm_sec == tm2.tm_sec && + tm1.tm_min == tm2.tm_min && + tm1.tm_hour == tm2.tm_hour && + tm1.tm_mday == tm2.tm_mday && + tm1.tm_mon == tm2.tm_mon && + tm1.tm_year == tm2.tm_year && + tm1.tm_isdst == tm2.tm_isdst); +} + +inline bool operator!=(const std::tm& tm1, const std::tm& tm2) +{ + return !(tm1 == tm2); +} + +// eol definition +#if !defined (SPDLOG_EOL) +#ifdef _WIN32 +#define SPDLOG_EOL "\r\n" +#else +#define SPDLOG_EOL "\n" +#endif +#endif + +SPDLOG_CONSTEXPR static const char* eol = SPDLOG_EOL; +SPDLOG_CONSTEXPR static int eol_size = sizeof(SPDLOG_EOL) - 1; + +inline void prevent_child_fd(FILE *f) +{ +#ifdef _WIN32 + auto file_handle = (HANDLE)_get_osfhandle(_fileno(f)); + if (!::SetHandleInformation(file_handle, HANDLE_FLAG_INHERIT, 0)) + throw spdlog_ex("SetHandleInformation failed", errno); +#else + auto fd = fileno(f); + if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) + throw spdlog_ex("fcntl with FD_CLOEXEC failed", errno); +#endif +} + + +//fopen_s on non windows for writing +inline int fopen_s(FILE** fp, const filename_t& filename, const filename_t& mode) +{ +#ifdef _WIN32 +#ifdef SPDLOG_WCHAR_FILENAMES + *fp = _wfsopen((filename.c_str()), mode.c_str(), _SH_DENYWR); +#else + *fp = _fsopen((filename.c_str()), mode.c_str(), _SH_DENYWR); +#endif +#else //unix + *fp = fopen((filename.c_str()), mode.c_str()); +#endif + +#ifdef SPDLOG_PREVENT_CHILD_FD + if (*fp != nullptr) + prevent_child_fd(*fp); +#endif + return *fp == nullptr; +} + + +inline int remove(const filename_t &filename) +{ +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + return _wremove(filename.c_str()); +#else + return std::remove(filename.c_str()); +#endif +} + +inline int rename(const filename_t& filename1, const filename_t& filename2) +{ +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + return _wrename(filename1.c_str(), filename2.c_str()); +#else + return std::rename(filename1.c_str(), filename2.c_str()); +#endif +} + + +//Return if file exists +inline bool file_exists(const filename_t& filename) +{ +#ifdef _WIN32 +#ifdef SPDLOG_WCHAR_FILENAMES + auto attribs = GetFileAttributesW(filename.c_str()); +#else + auto attribs = GetFileAttributesA(filename.c_str()); +#endif + return (attribs != INVALID_FILE_ATTRIBUTES && !(attribs & FILE_ATTRIBUTE_DIRECTORY)); +#else //common linux/unix all have the stat system call + struct stat buffer; + return (stat(filename.c_str(), &buffer) == 0); +#endif +} + + + + +//Return file size according to open FILE* object +inline size_t filesize(FILE *f) +{ + if (f == nullptr) + throw spdlog_ex("Failed getting file size. fd is null"); +#ifdef _WIN32 + int fd = _fileno(f); +#if _WIN64 //64 bits + struct _stat64 st; + if (_fstat64(fd, &st) == 0) + return st.st_size; + +#else //windows 32 bits + long ret = _filelength(fd); + if (ret >= 0) + return static_cast(ret); +#endif + +#else // unix + int fd = fileno(f); + //64 bits(but not in osx, where fstat64 is deprecated) +#if !defined(__FreeBSD__) && !defined(__APPLE__) && (defined(__x86_64__) || defined(__ppc64__)) + struct stat64 st; + if (fstat64(fd, &st) == 0) + return static_cast(st.st_size); +#else // unix 32 bits or osx + struct stat st; + if (fstat(fd, &st) == 0) + return static_cast(st.st_size); +#endif +#endif + throw spdlog_ex("Failed getting file size from fd", errno); +} + + + + +//Return utc offset in minutes or throw spdlog_ex on failure +inline int utc_minutes_offset(const std::tm& tm = details::os::localtime()) +{ + +#ifdef _WIN32 +#if _WIN32_WINNT < _WIN32_WINNT_WS08 + TIME_ZONE_INFORMATION tzinfo; + auto rv = GetTimeZoneInformation(&tzinfo); +#else + DYNAMIC_TIME_ZONE_INFORMATION tzinfo; + auto rv = GetDynamicTimeZoneInformation(&tzinfo); +#endif + if (rv == TIME_ZONE_ID_INVALID) + throw spdlog::spdlog_ex("Failed getting timezone info. ", errno); + + int offset = -tzinfo.Bias; + if (tm.tm_isdst) + offset -= tzinfo.DaylightBias; + else + offset -= tzinfo.StandardBias; + return offset; +#else + +#if defined(sun) || defined(__sun) + // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris + struct helper + { + static long int calculate_gmt_offset(const std::tm & localtm = details::os::localtime(), const std::tm & gmtm = details::os::gmtime()) + { + int local_year = localtm.tm_year + (1900 - 1); + int gmt_year = gmtm.tm_year + (1900 - 1); + + long int days = ( + // difference in day of year + localtm.tm_yday - gmtm.tm_yday + + // + intervening leap days + + ((local_year >> 2) - (gmt_year >> 2)) + - (local_year / 100 - gmt_year / 100) + + ((local_year / 100 >> 2) - (gmt_year / 100 >> 2)) + + // + difference in years * 365 */ + + (long int)(local_year - gmt_year) * 365 + ); + + long int hours = (24 * days) + (localtm.tm_hour - gmtm.tm_hour); + long int mins = (60 * hours) + (localtm.tm_min - gmtm.tm_min); + long int secs = (60 * mins) + (localtm.tm_sec - gmtm.tm_sec); + + return secs; + } + }; + + long int offset_seconds = helper::calculate_gmt_offset(tm); +#else + long int offset_seconds = tm.tm_gmtoff; +#endif + + return static_cast(offset_seconds / 60); +#endif +} + +//Return current thread id as size_t +//It exists because the std::this_thread::get_id() is much slower(espcially under VS 2013) +inline size_t _thread_id() +{ +#ifdef _WIN32 + return static_cast(::GetCurrentThreadId()); +#elif __linux__ +# if defined(__ANDROID__) && defined(__ANDROID_API__) && (__ANDROID_API__ < 21) +# define SYS_gettid __NR_gettid +# endif + return static_cast(syscall(SYS_gettid)); +#elif __FreeBSD__ + long tid; + thr_self(&tid); + return static_cast(tid); +#elif __APPLE__ + uint64_t tid; + pthread_threadid_np(nullptr, &tid); + return static_cast(tid); +#else //Default to standard C++11 (other Unix) + return static_cast(std::hash()(std::this_thread::get_id())); +#endif +} + +//Return current thread id as size_t (from thread local storage) +inline size_t thread_id() +{ +#if defined(_MSC_VER) && (_MSC_VER < 1900) || defined(__clang__) && !__has_feature(cxx_thread_local) + return _thread_id(); +#else + static thread_local const size_t tid = _thread_id(); + return tid; +#endif +} + + + + +// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +#define SPDLOG_FILENAME_T(s) L ## s +inline std::string filename_to_str(const filename_t& filename) +{ + std::wstring_convert, wchar_t> c; + return c.to_bytes(filename); +} +#else +#define SPDLOG_FILENAME_T(s) s +inline std::string filename_to_str(const filename_t& filename) +{ + return filename; +} +#endif + +inline std::string errno_to_string(char[256], char* res) +{ + return std::string(res); +} + +inline std::string errno_to_string(char buf[256], int res) +{ + if (res == 0) + { + return std::string(buf); + } + else + { + return "Unknown error"; + } +} + +// Return errno string (thread safe) +inline std::string errno_str(int err_num) +{ + char buf[256]; + SPDLOG_CONSTEXPR auto buf_size = sizeof(buf); + +#ifdef _WIN32 + if (strerror_s(buf, buf_size, err_num) == 0) + return std::string(buf); + else + return "Unknown error"; + +#elif defined(__FreeBSD__) || defined(__APPLE__) || defined(ANDROID) || defined(__SUNPRO_CC) || \ + ((_POSIX_C_SOURCE >= 200112L) && ! defined(_GNU_SOURCE)) // posix version + + if (strerror_r(err_num, buf, buf_size) == 0) + return std::string(buf); + else + return "Unknown error"; + +#else // gnu version (might not use the given buf, so its retval pointer must be used) + auto err = strerror_r(err_num, buf, buf_size); // let compiler choose type + return errno_to_string(buf, err); // use overloading to select correct stringify function +#endif +} + +inline int pid() +{ + +#ifdef _WIN32 + return ::_getpid(); +#else + return static_cast(::getpid()); +#endif + +} + + +// Detrmine if the terminal supports colors +// Source: https://github.com/agauniyal/rang/ +inline bool is_color_terminal() +{ +#ifdef _WIN32 + return true; +#else + static constexpr const char* Terms[] = + { + "ansi", "color", "console", "cygwin", "gnome", "konsole", "kterm", + "linux", "msys", "putty", "rxvt", "screen", "vt100", "xterm" + }; + + const char *env_p = std::getenv("TERM"); + if (env_p == nullptr) + { + return false; + } + + static const bool result = std::any_of( + std::begin(Terms), std::end(Terms), [&](const char* term) + { + return std::strstr(env_p, term) != nullptr; + }); + return result; +#endif +} + + +// Detrmine if the terminal attached +// Source: https://github.com/agauniyal/rang/ +inline bool in_terminal(FILE* file) +{ + +#ifdef _WIN32 + return _isatty(_fileno(file)) ? true : false; +#else + return isatty(fileno(file)) ? true : false; +#endif +} +} //os +} //details +} //spdlog diff --git a/wasserstein/include/spdlog/details/pattern_formatter_impl.h b/wasserstein/include/spdlog/details/pattern_formatter_impl.h new file mode 100644 index 0000000..c1ce719 --- /dev/null +++ b/wasserstein/include/spdlog/details/pattern_formatter_impl.h @@ -0,0 +1,690 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/formatter.h" +#include "spdlog/details/log_msg.h" +#include "spdlog/details/os.h" +#include "spdlog/fmt/fmt.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace details +{ +class flag_formatter +{ +public: + virtual ~flag_formatter() + {} + virtual void format(details::log_msg& msg, const std::tm& tm_time) = 0; +}; + +/////////////////////////////////////////////////////////////////////// +// name & level pattern appenders +/////////////////////////////////////////////////////////////////////// +namespace +{ +class name_formatter:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << *msg.logger_name; + } +}; +} + +// log level appender +class level_formatter:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << level::to_str(msg.level); + } +}; + +// short log level appender +class short_level_formatter:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << level::to_short_str(msg.level); + } +}; + +/////////////////////////////////////////////////////////////////////// +// Date time pattern appenders +/////////////////////////////////////////////////////////////////////// + +static const char* ampm(const tm& t) +{ + return t.tm_hour >= 12 ? "PM" : "AM"; +} + +static int to12h(const tm& t) +{ + return t.tm_hour > 12 ? t.tm_hour - 12 : t.tm_hour; +} + +//Abbreviated weekday name +using days_array = std::array; +static const days_array& days() +{ + static const days_array arr{ { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } }; + return arr; +} +class a_formatter:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << days()[tm_time.tm_wday]; + } +}; +// message counter formatter +class i_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << '#' << msg.msg_id; + } +}; +//Full weekday name +static const days_array& full_days() +{ + static const days_array arr{ { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" } }; + return arr; +} +class A_formatter SPDLOG_FINAL :public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << full_days()[tm_time.tm_wday]; + } +}; + +//Abbreviated month +using months_array = std::array; +static const months_array& months() +{ + static const months_array arr{ { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec" } }; + return arr; +} +class b_formatter:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << months()[tm_time.tm_mon]; + } +}; + +//Full month name +static const months_array& full_months() +{ + static const months_array arr{ { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" } }; + return arr; +} +class B_formatter SPDLOG_FINAL :public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << full_months()[tm_time.tm_mon]; + } +}; + + +//write 2 ints seperated by sep with padding of 2 +static fmt::MemoryWriter& pad_n_join(fmt::MemoryWriter& w, int v1, int v2, char sep) +{ + w << fmt::pad(v1, 2, '0') << sep << fmt::pad(v2, 2, '0'); + return w; +} + +//write 3 ints seperated by sep with padding of 2 +static fmt::MemoryWriter& pad_n_join(fmt::MemoryWriter& w, int v1, int v2, int v3, char sep) +{ + w << fmt::pad(v1, 2, '0') << sep << fmt::pad(v2, 2, '0') << sep << fmt::pad(v3, 2, '0'); + return w; +} + + +//Date and time representation (Thu Aug 23 15:35:46 2014) +class c_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << days()[tm_time.tm_wday] << ' ' << months()[tm_time.tm_mon] << ' ' << tm_time.tm_mday << ' '; + pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, ':') << ' ' << tm_time.tm_year + 1900; + } +}; + + +// year - 2 digit +class C_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_year % 100, 2, '0'); + } +}; + + + +// Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01 +class D_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + pad_n_join(msg.formatted, tm_time.tm_mon + 1, tm_time.tm_mday, tm_time.tm_year % 100, '/'); + } +}; + + +// year - 4 digit +class Y_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << tm_time.tm_year + 1900; + } +}; + +// month 1-12 +class m_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_mon + 1, 2, '0'); + } +}; + +// day of month 1-31 +class d_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_mday, 2, '0'); + } +}; + +// hours in 24 format 0-23 +class H_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_hour, 2, '0'); + } +}; + +// hours in 12 format 1-12 +class I_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(to12h(tm_time), 2, '0'); + } +}; + +// minutes 0-59 +class M_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_min, 2, '0'); + } +}; + +// seconds 0-59 +class S_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << fmt::pad(tm_time.tm_sec, 2, '0'); + } +}; + +// milliseconds +class e_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + auto duration = msg.time.time_since_epoch(); + auto millis = std::chrono::duration_cast(duration).count() % 1000; + msg.formatted << fmt::pad(static_cast(millis), 3, '0'); + } +}; + +// microseconds +class f_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + auto duration = msg.time.time_since_epoch(); + auto micros = std::chrono::duration_cast(duration).count() % 1000000; + msg.formatted << fmt::pad(static_cast(micros), 6, '0'); + } +}; + +// nanoseconds +class F_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + auto duration = msg.time.time_since_epoch(); + auto ns = std::chrono::duration_cast(duration).count() % 1000000000; + msg.formatted << fmt::pad(static_cast(ns), 9, '0'); + } +}; + +// AM/PM +class p_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << ampm(tm_time); + } +}; + + +// 12 hour clock 02:55:02 pm +class r_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + pad_n_join(msg.formatted, to12h(tm_time), tm_time.tm_min, tm_time.tm_sec, ':') << ' ' << ampm(tm_time); + } +}; + +// 24-hour HH:MM time, equivalent to %H:%M +class R_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, ':'); + } +}; + +// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S +class T_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, ':'); + } +}; + +// ISO 8601 offset from UTC in timezone (+-HH:MM) +class z_formatter SPDLOG_FINAL:public flag_formatter +{ +public: + const std::chrono::seconds cache_refresh = std::chrono::seconds(5); + + z_formatter():_last_update(std::chrono::seconds(0)), _offset_minutes(0) + {} + z_formatter(const z_formatter&) = delete; + z_formatter& operator=(const z_formatter&) = delete; + + void format(details::log_msg& msg, const std::tm& tm_time) override + { +#ifdef _WIN32 + int total_minutes = get_cached_offset(msg, tm_time); +#else + // No need to chache under gcc, + // it is very fast (already stored in tm.tm_gmtoff) + int total_minutes = os::utc_minutes_offset(tm_time); +#endif + bool is_negative = total_minutes < 0; + char sign; + if (is_negative) + { + total_minutes = -total_minutes; + sign = '-'; + } + else + { + sign = '+'; + } + + int h = total_minutes / 60; + int m = total_minutes % 60; + msg.formatted << sign; + pad_n_join(msg.formatted, h, m, ':'); + } +private: + log_clock::time_point _last_update; + int _offset_minutes; + std::mutex _mutex; + + int get_cached_offset(const log_msg& msg, const std::tm& tm_time) + { + using namespace std::chrono; + std::lock_guard l(_mutex); + if (msg.time - _last_update >= cache_refresh) + { + _offset_minutes = os::utc_minutes_offset(tm_time); + _last_update = msg.time; + } + return _offset_minutes; + } +}; + + + +// Thread id +class t_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << msg.thread_id; + } +}; + +// Current pid +class pid_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << details::os::pid(); + } +}; + + +class v_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << fmt::StringRef(msg.raw.data(), msg.raw.size()); + } +}; + +class ch_formatter SPDLOG_FINAL:public flag_formatter +{ +public: + explicit ch_formatter(char ch): _ch(ch) + {} + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << _ch; + } +private: + char _ch; +}; + + +//aggregate user chars to display as is +class aggregate_formatter SPDLOG_FINAL:public flag_formatter +{ +public: + aggregate_formatter() + {} + void add_ch(char ch) + { + _str += ch; + } + void format(details::log_msg& msg, const std::tm&) override + { + msg.formatted << _str; + } +private: + std::string _str; +}; + +// Full info formatter +// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] %v +class full_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { +#ifndef SPDLOG_NO_DATETIME + auto duration = msg.time.time_since_epoch(); + auto millis = std::chrono::duration_cast(duration).count() % 1000; + + /* Slower version(while still very fast - about 3.2 million lines/sec under 10 threads), + msg.formatted.write("[{:d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}.{:03d}] [{}] [{}] {} ", + tm_time.tm_year + 1900, + tm_time.tm_mon + 1, + tm_time.tm_mday, + tm_time.tm_hour, + tm_time.tm_min, + tm_time.tm_sec, + static_cast(millis), + msg.logger_name, + level::to_str(msg.level), + msg.raw.str());*/ + + + // Faster (albeit uglier) way to format the line (5.6 million lines/sec under 10 threads) + msg.formatted << '[' << static_cast(tm_time.tm_year + 1900) << '-' + << fmt::pad(static_cast(tm_time.tm_mon + 1), 2, '0') << '-' + << fmt::pad(static_cast(tm_time.tm_mday), 2, '0') << ' ' + << fmt::pad(static_cast(tm_time.tm_hour), 2, '0') << ':' + << fmt::pad(static_cast(tm_time.tm_min), 2, '0') << ':' + << fmt::pad(static_cast(tm_time.tm_sec), 2, '0') << '.' + << fmt::pad(static_cast(millis), 3, '0') << "] "; + + //no datetime needed +#else + (void)tm_time; +#endif + +#ifndef SPDLOG_NO_NAME + msg.formatted << '[' << *msg.logger_name << "] "; +#endif + + msg.formatted << '[' << level::to_str(msg.level) << "] "; + msg.formatted << fmt::StringRef(msg.raw.data(), msg.raw.size()); + } +}; + + + +} +} +/////////////////////////////////////////////////////////////////////////////// +// pattern_formatter inline impl +/////////////////////////////////////////////////////////////////////////////// +inline spdlog::pattern_formatter::pattern_formatter(const std::string& pattern, pattern_time_type pattern_time) + : _pattern_time(pattern_time) +{ + compile_pattern(pattern); +} + +inline void spdlog::pattern_formatter::compile_pattern(const std::string& pattern) +{ + auto end = pattern.end(); + std::unique_ptr user_chars; + for (auto it = pattern.begin(); it != end; ++it) + { + if (*it == '%') + { + if (user_chars) //append user chars found so far + _formatters.push_back(std::move(user_chars)); + + if (++it != end) + handle_flag(*it); + else + break; + } + else // chars not following the % sign should be displayed as is + { + if (!user_chars) + user_chars = std::unique_ptr(new details::aggregate_formatter()); + user_chars->add_ch(*it); + } + } + if (user_chars) //append raw chars found so far + { + _formatters.push_back(std::move(user_chars)); + } + +} +inline void spdlog::pattern_formatter::handle_flag(char flag) +{ + switch (flag) + { + // logger name + case 'n': + _formatters.push_back(std::unique_ptr(new details::name_formatter())); + break; + + case 'l': + _formatters.push_back(std::unique_ptr(new details::level_formatter())); + break; + + case 'L': + _formatters.push_back(std::unique_ptr(new details::short_level_formatter())); + break; + + case('t'): + _formatters.push_back(std::unique_ptr(new details::t_formatter())); + break; + + case('v'): + _formatters.push_back(std::unique_ptr(new details::v_formatter())); + break; + + case('a'): + _formatters.push_back(std::unique_ptr(new details::a_formatter())); + break; + + case('A'): + _formatters.push_back(std::unique_ptr(new details::A_formatter())); + break; + + case('b'): + case('h'): + _formatters.push_back(std::unique_ptr(new details::b_formatter())); + break; + + case('B'): + _formatters.push_back(std::unique_ptr(new details::B_formatter())); + break; + case('c'): + _formatters.push_back(std::unique_ptr(new details::c_formatter())); + break; + + case('C'): + _formatters.push_back(std::unique_ptr(new details::C_formatter())); + break; + + case('Y'): + _formatters.push_back(std::unique_ptr(new details::Y_formatter())); + break; + + case('D'): + case('x'): + + _formatters.push_back(std::unique_ptr(new details::D_formatter())); + break; + + case('m'): + _formatters.push_back(std::unique_ptr(new details::m_formatter())); + break; + + case('d'): + _formatters.push_back(std::unique_ptr(new details::d_formatter())); + break; + + case('H'): + _formatters.push_back(std::unique_ptr(new details::H_formatter())); + break; + + case('I'): + _formatters.push_back(std::unique_ptr(new details::I_formatter())); + break; + + case('M'): + _formatters.push_back(std::unique_ptr(new details::M_formatter())); + break; + + case('S'): + _formatters.push_back(std::unique_ptr(new details::S_formatter())); + break; + + case('e'): + _formatters.push_back(std::unique_ptr(new details::e_formatter())); + break; + + case('f'): + _formatters.push_back(std::unique_ptr(new details::f_formatter())); + break; + case('F'): + _formatters.push_back(std::unique_ptr(new details::F_formatter())); + break; + + case('p'): + _formatters.push_back(std::unique_ptr(new details::p_formatter())); + break; + + case('r'): + _formatters.push_back(std::unique_ptr(new details::r_formatter())); + break; + + case('R'): + _formatters.push_back(std::unique_ptr(new details::R_formatter())); + break; + + case('T'): + case('X'): + _formatters.push_back(std::unique_ptr(new details::T_formatter())); + break; + + case('z'): + _formatters.push_back(std::unique_ptr(new details::z_formatter())); + break; + + case ('+'): + _formatters.push_back(std::unique_ptr(new details::full_formatter())); + break; + + case ('P'): + _formatters.push_back(std::unique_ptr(new details::pid_formatter())); + break; + +#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) + case ('i'): + _formatters.push_back(std::unique_ptr(new details::i_formatter())); + break; +#endif + + default: //Unknown flag appears as is + _formatters.push_back(std::unique_ptr(new details::ch_formatter('%'))); + _formatters.push_back(std::unique_ptr(new details::ch_formatter(flag))); + break; + } +} + +inline std::tm spdlog::pattern_formatter::get_time(details::log_msg& msg) +{ + if (_pattern_time == pattern_time_type::local) + return details::os::localtime(log_clock::to_time_t(msg.time)); + else + return details::os::gmtime(log_clock::to_time_t(msg.time)); +} + +inline void spdlog::pattern_formatter::format(details::log_msg& msg) +{ + +#ifndef SPDLOG_NO_DATETIME + auto tm_time = get_time(msg); +#else + std::tm tm_time; +#endif + for (auto &f : _formatters) + { + f->format(msg, tm_time); + } + //write eol + msg.formatted.write(details::os::eol, details::os::eol_size); +} diff --git a/wasserstein/include/spdlog/details/registry.h b/wasserstein/include/spdlog/details/registry.h new file mode 100644 index 0000000..b518990 --- /dev/null +++ b/wasserstein/include/spdlog/details/registry.h @@ -0,0 +1,214 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Loggers registy of unique name->logger pointer +// An attempt to create a logger with an already existing name will be ignored +// If user requests a non existing logger, nullptr will be returned +// This class is thread safe + +#include "spdlog/details/null_mutex.h" +#include "spdlog/logger.h" +#include "spdlog/async_logger.h" +#include "spdlog/common.h" + +#include +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace details +{ +template class registry_t +{ +public: + + void register_logger(std::shared_ptr logger) + { + std::lock_guard lock(_mutex); + auto logger_name = logger->name(); + throw_if_exists(logger_name); + _loggers[logger_name] = logger; + } + + + std::shared_ptr get(const std::string& logger_name) + { + std::lock_guard lock(_mutex); + auto found = _loggers.find(logger_name); + return found == _loggers.end() ? nullptr : found->second; + } + + template + std::shared_ptr create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end) + { + std::lock_guard lock(_mutex); + throw_if_exists(logger_name); + std::shared_ptr new_logger; + if (_async_mode) + new_logger = std::make_shared(logger_name, sinks_begin, sinks_end, _async_q_size, _overflow_policy, _worker_warmup_cb, _flush_interval_ms, _worker_teardown_cb); + else + new_logger = std::make_shared(logger_name, sinks_begin, sinks_end); + + if (_formatter) + new_logger->set_formatter(_formatter); + + if (_err_handler) + new_logger->set_error_handler(_err_handler); + + new_logger->set_level(_level); + + + //Add to registry + _loggers[logger_name] = new_logger; + return new_logger; + } + + template + std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, const It& sinks_begin, const It& sinks_end) + { + std::lock_guard lock(_mutex); + throw_if_exists(logger_name); + auto new_logger = std::make_shared(logger_name, sinks_begin, sinks_end, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb); + + if (_formatter) + new_logger->set_formatter(_formatter); + + if (_err_handler) + new_logger->set_error_handler(_err_handler); + + new_logger->set_level(_level); + + //Add to registry + _loggers[logger_name] = new_logger; + return new_logger; + } + + void apply_all(std::function)> fun) + { + std::lock_guard lock(_mutex); + for (auto &l : _loggers) + fun(l.second); + } + + void drop(const std::string& logger_name) + { + std::lock_guard lock(_mutex); + _loggers.erase(logger_name); + } + + void drop_all() + { + std::lock_guard lock(_mutex); + _loggers.clear(); + } + std::shared_ptr create(const std::string& logger_name, sinks_init_list sinks) + { + return create(logger_name, sinks.begin(), sinks.end()); + } + + std::shared_ptr create(const std::string& logger_name, sink_ptr sink) + { + return create(logger_name, { sink }); + } + + std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, sinks_init_list sinks) + { + return create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks.begin(), sinks.end()); + } + + std::shared_ptr create_async(const std::string& logger_name, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb, sink_ptr sink) + { + return create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, { sink }); + } + + void formatter(formatter_ptr f) + { + std::lock_guard lock(_mutex); + _formatter = f; + for (auto& l : _loggers) + l.second->set_formatter(_formatter); + } + + void set_pattern(const std::string& pattern) + { + std::lock_guard lock(_mutex); + _formatter = std::make_shared(pattern); + for (auto& l : _loggers) + l.second->set_formatter(_formatter); + } + + void set_level(level::level_enum log_level) + { + std::lock_guard lock(_mutex); + for (auto& l : _loggers) + l.second->set_level(log_level); + _level = log_level; + } + + void set_error_handler(log_err_handler handler) + { + for (auto& l : _loggers) + l.second->set_error_handler(handler); + _err_handler = handler; + } + + void set_async_mode(size_t q_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) + { + std::lock_guard lock(_mutex); + _async_mode = true; + _async_q_size = q_size; + _overflow_policy = overflow_policy; + _worker_warmup_cb = worker_warmup_cb; + _flush_interval_ms = flush_interval_ms; + _worker_teardown_cb = worker_teardown_cb; + } + + void set_sync_mode() + { + std::lock_guard lock(_mutex); + _async_mode = false; + } + + static registry_t& instance() + { + static registry_t s_instance; + return s_instance; + } + +private: + registry_t() {} + registry_t(const registry_t&) = delete; + registry_t& operator=(const registry_t&) = delete; + + void throw_if_exists(const std::string &logger_name) + { + if (_loggers.find(logger_name) != _loggers.end()) + throw spdlog_ex("logger with name '" + logger_name + "' already exists"); + } + Mutex _mutex; + std::unordered_map > _loggers; + formatter_ptr _formatter; + level::level_enum _level = level::info; + log_err_handler _err_handler; + bool _async_mode = false; + size_t _async_q_size = 0; + async_overflow_policy _overflow_policy = async_overflow_policy::block_retry; + std::function _worker_warmup_cb = nullptr; + std::chrono::milliseconds _flush_interval_ms; + std::function _worker_teardown_cb = nullptr; +}; +#ifdef SPDLOG_NO_REGISTRY_MUTEX +typedef registry_t registry; +#else +typedef registry_t registry; +#endif +} +} diff --git a/wasserstein/include/spdlog/details/spdlog_impl.h b/wasserstein/include/spdlog/details/spdlog_impl.h new file mode 100644 index 0000000..7fe9ab4 --- /dev/null +++ b/wasserstein/include/spdlog/details/spdlog_impl.h @@ -0,0 +1,263 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// +// Global registry functions +// +#include "spdlog/spdlog.h" +#include "spdlog/details/registry.h" +#include "spdlog/sinks/file_sinks.h" +#include "spdlog/sinks/stdout_sinks.h" +#ifdef SPDLOG_ENABLE_SYSLOG +#include "spdlog/sinks/syslog_sink.h" +#endif + +#ifdef _WIN32 +#include "spdlog/sinks/wincolor_sink.h" +#else +#include "spdlog/sinks/ansicolor_sink.h" +#endif + + +#ifdef __ANDROID__ +#include "spdlog/sinks/android_sink.h" +#endif + +#include +#include +#include +#include + +inline void spdlog::register_logger(std::shared_ptr logger) +{ + return details::registry::instance().register_logger(logger); +} + +inline std::shared_ptr spdlog::get(const std::string& name) +{ + return details::registry::instance().get(name); +} + +inline void spdlog::drop(const std::string &name) +{ + details::registry::instance().drop(name); +} + +// Create multi/single threaded simple file logger +inline std::shared_ptr spdlog::basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate) +{ + return create(logger_name, filename, truncate); +} + +inline std::shared_ptr spdlog::basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate) +{ + return create(logger_name, filename, truncate); +} + +// Create multi/single threaded rotating file logger +inline std::shared_ptr spdlog::rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files) +{ + return create(logger_name, filename, max_file_size, max_files); +} + +inline std::shared_ptr spdlog::rotating_logger_st(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files) +{ + return create(logger_name, filename, max_file_size, max_files); +} + +// Create file logger which creates new file at midnight): +inline std::shared_ptr spdlog::daily_logger_mt(const std::string& logger_name, const filename_t& filename, int hour, int minute) +{ + return create(logger_name, filename, hour, minute); +} + +inline std::shared_ptr spdlog::daily_logger_st(const std::string& logger_name, const filename_t& filename, int hour, int minute) +{ + return create(logger_name, filename, hour, minute); +} + + +// +// stdout/stderr loggers +// +inline std::shared_ptr spdlog::stdout_logger_mt(const std::string& logger_name) +{ + return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stdout_sink_mt::instance()); +} + +inline std::shared_ptr spdlog::stdout_logger_st(const std::string& logger_name) +{ + return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stdout_sink_st::instance()); +} + +inline std::shared_ptr spdlog::stderr_logger_mt(const std::string& logger_name) +{ + return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stderr_sink_mt::instance()); +} + +inline std::shared_ptr spdlog::stderr_logger_st(const std::string& logger_name) +{ + return spdlog::details::registry::instance().create(logger_name, spdlog::sinks::stderr_sink_st::instance()); +} + +// +// stdout/stderr color loggers +// +#ifdef _WIN32 +inline std::shared_ptr spdlog::stdout_color_mt(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr spdlog::stdout_color_st(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr spdlog::stderr_color_mt(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + + +inline std::shared_ptr spdlog::stderr_color_st(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +#else //ansi terminal colors + +inline std::shared_ptr spdlog::stdout_color_mt(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr spdlog::stdout_color_st(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr spdlog::stderr_color_mt(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr spdlog::stderr_color_st(const std::string& logger_name) +{ + auto sink = std::make_shared(); + return spdlog::details::registry::instance().create(logger_name, sink); +} +#endif + +#ifdef SPDLOG_ENABLE_SYSLOG +// Create syslog logger +inline std::shared_ptr spdlog::syslog_logger(const std::string& logger_name, const std::string& syslog_ident, int syslog_option) +{ + return create(logger_name, syslog_ident, syslog_option); +} +#endif + +#ifdef __ANDROID__ +inline std::shared_ptr spdlog::android_logger(const std::string& logger_name, const std::string& tag) +{ + return create(logger_name, tag); +} +#endif + +// Create and register a logger a single sink +inline std::shared_ptr spdlog::create(const std::string& logger_name, const spdlog::sink_ptr& sink) +{ + return details::registry::instance().create(logger_name, sink); +} + +//Create logger with multiple sinks + +inline std::shared_ptr spdlog::create(const std::string& logger_name, spdlog::sinks_init_list sinks) +{ + return details::registry::instance().create(logger_name, sinks); +} + + +template +inline std::shared_ptr spdlog::create(const std::string& logger_name, Args... args) +{ + sink_ptr sink = std::make_shared(args...); + return details::registry::instance().create(logger_name, { sink }); +} + + +template +inline std::shared_ptr spdlog::create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end) +{ + return details::registry::instance().create(logger_name, sinks_begin, sinks_end); +} + +// Create and register an async logger with a single sink +inline std::shared_ptr spdlog::create_async(const std::string& logger_name, const sink_ptr& sink, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) +{ + return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sink); +} + +// Create and register an async logger with multiple sinks +inline std::shared_ptr spdlog::create_async(const std::string& logger_name, sinks_init_list sinks, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb ) +{ + return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks); +} + +template +inline std::shared_ptr spdlog::create_async(const std::string& logger_name, const It& sinks_begin, const It& sinks_end, size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) +{ + return details::registry::instance().create_async(logger_name, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb, sinks_begin, sinks_end); +} + +inline void spdlog::set_formatter(spdlog::formatter_ptr f) +{ + details::registry::instance().formatter(f); +} + +inline void spdlog::set_pattern(const std::string& format_string) +{ + return details::registry::instance().set_pattern(format_string); +} + +inline void spdlog::set_level(level::level_enum log_level) +{ + return details::registry::instance().set_level(log_level); +} + +inline void spdlog::set_error_handler(log_err_handler handler) +{ + return details::registry::instance().set_error_handler(handler); +} + + +inline void spdlog::set_async_mode(size_t queue_size, const async_overflow_policy overflow_policy, const std::function& worker_warmup_cb, const std::chrono::milliseconds& flush_interval_ms, const std::function& worker_teardown_cb) +{ + details::registry::instance().set_async_mode(queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb); +} + +inline void spdlog::set_sync_mode() +{ + details::registry::instance().set_sync_mode(); +} + +inline void spdlog::apply_all(std::function)> fun) +{ + details::registry::instance().apply_all(fun); +} + +inline void spdlog::drop_all() +{ + details::registry::instance().drop_all(); +} diff --git a/wasserstein/include/spdlog/fmt/bundled/format.cc b/wasserstein/include/spdlog/fmt/bundled/format.cc new file mode 100644 index 0000000..2bd774e --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/format.cc @@ -0,0 +1,940 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "format.h" + +#include + +#include +#include +#include +#include +#include +#include // for std::ptrdiff_t + +#if defined(_WIN32) && defined(__MINGW32__) +# include +#endif + +#if FMT_USE_WINDOWS_H +# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) +# include +# else +# define NOMINMAX +# include +# undef NOMINMAX +# endif +#endif + +using fmt::internal::Arg; + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4702) // unreachable code +// Disable deprecation warning for strerror. The latter is not called but +// MSVC fails to detect it. +# pragma warning(disable: 4996) +#endif + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +static inline fmt::internal::Null<> strerror_r(int, char *, ...) { + return fmt::internal::Null<>(); +} +static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { + return fmt::internal::Null<>(); +} + +namespace fmt { + +FMT_FUNC internal::RuntimeError::~RuntimeError() throw() {} +FMT_FUNC FormatError::~FormatError() throw() {} +FMT_FUNC SystemError::~SystemError() throw() {} + +namespace { + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) +# define FMT_SWPRINTF snwprintf +#else +# define FMT_SWPRINTF swprintf +#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) + +// Checks if a value fits in int - used to avoid warnings about comparing +// signed and unsigned integers. +template +struct IntChecker { + template + static bool fits_in_int(T value) { + unsigned max = INT_MAX; + return value <= max; + } + static bool fits_in_int(bool) { return true; } +}; + +template <> +struct IntChecker { + template + static bool fits_in_int(T value) { + return value >= INT_MIN && value <= INT_MAX; + } + static bool fits_in_int(int) { return true; } +}; + +const char RESET_COLOR[] = "\x1b[0m"; + +typedef void (*FormatFunc)(Writer &, int, StringRef); + +// Portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +int safe_strerror( + int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); + + class StrError { + private: + int error_code_; + char *&buffer_; + std::size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const StrError &) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + int handle(char *message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + int handle(internal::Null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? + ERANGE : result; + } + + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(internal::Null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } + + public: + StrError(int err_code, char *&buf, std::size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { + strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. + return handle(strerror_r(error_code_, buffer_, buffer_size_)); + } + }; + return StrError(error_code, buffer, buffer_size).run(); +} + +void format_error_code(Writer &out, int error_code, + StringRef message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential + // bad_alloc. + out.clear(); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + typedef internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(error_code); + if (internal::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += internal::count_digits(abs_value); + if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) + out << message << SEP; + out << ERROR_STR << error_code; + assert(out.size() <= internal::INLINE_BUFFER_SIZE); +} + +void report_error(FormatFunc func, int error_code, + StringRef message) FMT_NOEXCEPT { + MemoryWriter full_message; + func(full_message, error_code, message); + // Use Writer::data instead of Writer::c_str to avoid potential memory + // allocation. + std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// IsZeroInt::visit(arg) returns true iff arg is a zero integer. +class IsZeroInt : public ArgVisitor { + public: + template + bool visit_any_int(T value) { return value == 0; } +}; + +// Checks if an argument is a valid printf width specifier and sets +// left alignment if it is negative. +class WidthHandler : public ArgVisitor { + private: + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); + + public: + explicit WidthHandler(FormatSpec &spec) : spec_(spec) {} + + void report_unhandled_arg() { + FMT_THROW(FormatError("width is not integer")); + } + + template + unsigned visit_any_int(T value) { + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType width = static_cast(value); + if (internal::is_negative(value)) { + spec_.align_ = ALIGN_LEFT; + width = 0 - width; + } + if (width > INT_MAX) + FMT_THROW(FormatError("number is too big")); + return static_cast(width); + } +}; + +class PrecisionHandler : public ArgVisitor { + public: + void report_unhandled_arg() { + FMT_THROW(FormatError("precision is not integer")); + } + + template + int visit_any_int(T value) { + if (!IntChecker::is_signed>::fits_in_int(value)) + FMT_THROW(FormatError("number is too big")); + return static_cast(value); + } +}; + +template +struct is_same { + enum { value = 0 }; +}; + +template +struct is_same { + enum { value = 1 }; +}; + +// An argument visitor that converts an integer argument to T for printf, +// if T is an integral type. If T is void, the argument is converted to +// corresponding signed or unsigned type depending on the type specifier: +// 'd' and 'i' - signed, other - unsigned) +template +class ArgConverter : public ArgVisitor, void> { + private: + internal::Arg &arg_; + wchar_t type_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); + + public: + ArgConverter(internal::Arg &arg, wchar_t type) + : arg_(arg), type_(type) {} + + void visit_bool(bool value) { + if (type_ != 's') + visit_any_int(value); + } + + template + void visit_any_int(U value) { + bool is_signed = type_ == 'd' || type_ == 'i'; + using internal::Arg; + typedef typename internal::Conditional< + is_same::value, U, T>::type TargetType; + if (sizeof(TargetType) <= sizeof(int)) { + // Extra casts are used to silence warnings. + if (is_signed) { + arg_.type = Arg::INT; + arg_.int_value = static_cast(static_cast(value)); + } else { + arg_.type = Arg::UINT; + typedef typename internal::MakeUnsigned::Type Unsigned; + arg_.uint_value = static_cast(static_cast(value)); + } + } else { + if (is_signed) { + arg_.type = Arg::LONG_LONG; + // glibc's printf doesn't sign extend arguments of smaller types: + // std::printf("%lld", -42); // prints "4294967254" + // but we don't have to do the same because it's a UB. + arg_.long_long_value = static_cast(value); + } else { + arg_.type = Arg::ULONG_LONG; + arg_.ulong_long_value = + static_cast::Type>(value); + } + } + } +}; + +// Converts an integer argument to char for printf. +class CharConverter : public ArgVisitor { + private: + internal::Arg &arg_; + + FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); + + public: + explicit CharConverter(internal::Arg &arg) : arg_(arg) {} + + template + void visit_any_int(T value) { + arg_.type = internal::Arg::CHAR; + arg_.int_value = static_cast(value); + } +}; +} // namespace + +namespace internal { + +template +class PrintfArgFormatter : + public ArgFormatterBase, Char> { + + void write_null_pointer() { + this->spec().type_ = 0; + this->write("(nil)"); + } + + typedef ArgFormatterBase, Char> Base; + + public: + PrintfArgFormatter(BasicWriter &w, FormatSpec &s) + : ArgFormatterBase, Char>(w, s) {} + + void visit_bool(bool value) { + FormatSpec &fmt_spec = this->spec(); + if (fmt_spec.type_ != 's') + return this->visit_any_int(value); + fmt_spec.type_ = 0; + this->write(value); + } + + void visit_char(int value) { + const FormatSpec &fmt_spec = this->spec(); + BasicWriter &w = this->writer(); + if (fmt_spec.type_ && fmt_spec.type_ != 'c') + w.write_int(value, fmt_spec); + typedef typename BasicWriter::CharPtr CharPtr; + CharPtr out = CharPtr(); + if (fmt_spec.width_ > 1) { + Char fill = ' '; + out = w.grow_buffer(fmt_spec.width_); + if (fmt_spec.align_ != ALIGN_LEFT) { + std::fill_n(out, fmt_spec.width_ - 1, fill); + out += fmt_spec.width_ - 1; + } else { + std::fill_n(out + 1, fmt_spec.width_ - 1, fill); + } + } else { + out = w.grow_buffer(1); + } + *out = static_cast(value); + } + + void visit_cstring(const char *value) { + if (value) + Base::visit_cstring(value); + else if (this->spec().type_ == 'p') + write_null_pointer(); + else + this->write("(null)"); + } + + void visit_pointer(const void *value) { + if (value) + return Base::visit_pointer(value); + this->spec().type_ = 0; + write_null_pointer(); + } + + void visit_custom(Arg::CustomValue c) { + BasicFormatter formatter(ArgList(), this->writer()); + const Char format_str[] = {'}', 0}; + const Char *format = format_str; + c.format(&formatter, c.value, &format); + } +}; +} // namespace internal +} // namespace fmt + +FMT_FUNC void fmt::SystemError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_system_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +template +int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, value) : + FMT_SNPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, width, value) : + FMT_SNPRINTF(buffer, size, format, width, precision, value); +} + +template +int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, value) : + FMT_SWPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, width, value) : + FMT_SWPRINTF(buffer, size, format, width, precision, value); +} + +template +const char fmt::internal::BasicData::DIGITS[] = + "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, \ + factor * 100, \ + factor * 1000, \ + factor * 10000, \ + factor * 100000, \ + factor * 1000000, \ + factor * 10000000, \ + factor * 100000000, \ + factor * 1000000000 + +template +const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { + 0, FMT_POWERS_OF_10(1) +}; + +template +const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { + 0, + FMT_POWERS_OF_10(1), + FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), + // Multiply several constants instead of using a single long long constant + // to avoid warnings about C++98 not supporting long long. + fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 +}; + +FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { + (void)type; + if (std::isprint(static_cast(code))) { + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '{}' for {}", code, type))); + } + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '\\x{:02x}' for {}", + static_cast(code), type))); +} + +#if FMT_USE_WINDOWS_H + +FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { + static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; + if (s.size() > INT_MAX) + FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); + int s_size = static_cast(s.size()); + int length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_.resize(length + 1); + length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_[length] = 0; +} + +FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { + if (int error_code = convert(s)) { + FMT_THROW(WindowsError(error_code, + "cannot convert string from UTF-16 to UTF-8")); + } +} + +FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { + if (s.size() > INT_MAX) + return ERROR_INVALID_PARAMETER; + int s_size = static_cast(s.size()); + int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); + if (length == 0) + return GetLastError(); + buffer_.resize(length + 1); + length = WideCharToMultiByte( + CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); + if (length == 0) + return GetLastError(); + buffer_[length] = 0; + return 0; +} + +FMT_FUNC void fmt::WindowsError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_windows_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +FMT_FUNC void fmt::internal::format_windows_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + wchar_t *system_message = &buffer[0]; + int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + system_message, static_cast(buffer.size()), 0); + if (result != 0) { + UTF16ToUTF8 utf8_message; + if (utf8_message.convert(system_message) == ERROR_SUCCESS) { + out << message << ": " << utf8_message; + return; + } + break; + } + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +#endif // FMT_USE_WINDOWS_H + +FMT_FUNC void fmt::internal::format_system_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + char *system_message = &buffer[0]; + int result = safe_strerror(error_code, system_message, buffer.size()); + if (result == 0) { + out << message << ": " << system_message; + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +template +void fmt::internal::ArgMap::init(const ArgList &args) { + if (!map_.empty()) + return; + typedef internal::NamedArg NamedArg; + const NamedArg *named_arg = 0; + bool use_values = + args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; + if (use_values) { + for (unsigned i = 0;/*nothing*/; ++i) { + internal::Arg::Type arg_type = args.type(i); + switch (arg_type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.values_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } + return; + } + for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { + internal::Arg::Type arg_type = args.type(i); + if (arg_type == internal::Arg::NAMED_ARG) { + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + } + } + for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { + switch (args.args_[i].type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } +} + +template +void fmt::internal::FixedBuffer::grow(std::size_t) { + FMT_THROW(std::runtime_error("buffer overflow")); +} + +FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( + unsigned arg_index, const char *&error) { + Arg arg = args_[arg_index]; + switch (arg.type) { + case Arg::NONE: + error = "argument index out of range"; + break; + case Arg::NAMED_ARG: + arg = *static_cast(arg.pointer); + break; + default: + /*nothing*/; + } + return arg; +} + +template +void fmt::internal::PrintfFormatter::parse_flags( + FormatSpec &spec, const Char *&s) { + for (;;) { + switch (*s++) { + case '-': + spec.align_ = ALIGN_LEFT; + break; + case '+': + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '0': + spec.fill_ = '0'; + break; + case ' ': + spec.flags_ |= SIGN_FLAG; + break; + case '#': + spec.flags_ |= HASH_FLAG; + break; + default: + --s; + return; + } + } +} + +template +Arg fmt::internal::PrintfFormatter::get_arg( + const Char *s, unsigned arg_index) { + (void)s; + const char *error = 0; + Arg arg = arg_index == UINT_MAX ? + next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); + if (error) + FMT_THROW(FormatError(!*s ? "invalid format string" : error)); + return arg; +} + +template +unsigned fmt::internal::PrintfFormatter::parse_header( + const Char *&s, FormatSpec &spec) { + unsigned arg_index = UINT_MAX; + Char c = *s; + if (c >= '0' && c <= '9') { + // Parse an argument index (if followed by '$') or a width possibly + // preceded with '0' flag(s). + unsigned value = parse_nonnegative_int(s); + if (*s == '$') { // value is an argument index + ++s; + arg_index = value; + } else { + if (c == '0') + spec.fill_ = '0'; + if (value != 0) { + // Nonzero value means that we parsed width and don't need to + // parse it or flags again, so return now. + spec.width_ = value; + return arg_index; + } + } + } + parse_flags(spec, s); + // Parse width. + if (*s >= '0' && *s <= '9') { + spec.width_ = parse_nonnegative_int(s); + } else if (*s == '*') { + ++s; + spec.width_ = WidthHandler(spec).visit(get_arg(s)); + } + return arg_index; +} + +template +void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, BasicCStringRef format_str) { + const Char *start = format_str.c_str(); + const Char *s = start; + while (*s) { + Char c = *s++; + if (c != '%') continue; + if (*s == c) { + write(writer, start, s); + start = ++s; + continue; + } + write(writer, start, s - 1); + + FormatSpec spec; + spec.align_ = ALIGN_RIGHT; + + // Parse argument index, flags and width. + unsigned arg_index = parse_header(s, spec); + + // Parse precision. + if (*s == '.') { + ++s; + if ('0' <= *s && *s <= '9') { + spec.precision_ = static_cast(parse_nonnegative_int(s)); + } else if (*s == '*') { + ++s; + spec.precision_ = PrecisionHandler().visit(get_arg(s)); + } + } + + Arg arg = get_arg(s, arg_index); + if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) + spec.flags_ &= ~to_unsigned(HASH_FLAG); + if (spec.fill_ == '0') { + if (arg.type <= Arg::LAST_NUMERIC_TYPE) + spec.align_ = ALIGN_NUMERIC; + else + spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. + } + + // Parse length and convert the argument to the required type. + switch (*s++) { + case 'h': + if (*s == 'h') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'l': + if (*s == 'l') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'j': + ArgConverter(arg, *s).visit(arg); + break; + case 'z': + ArgConverter(arg, *s).visit(arg); + break; + case 't': + ArgConverter(arg, *s).visit(arg); + break; + case 'L': + // printf produces garbage when 'L' is omitted for long double, no + // need to do the same. + break; + default: + --s; + ArgConverter(arg, *s).visit(arg); + } + + // Parse type. + if (!*s) + FMT_THROW(FormatError("invalid format string")); + spec.type_ = static_cast(*s++); + if (arg.type <= Arg::LAST_INTEGER_TYPE) { + // Normalize type. + switch (spec.type_) { + case 'i': case 'u': + spec.type_ = 'd'; + break; + case 'c': + // TODO: handle wchar_t + CharConverter(arg).visit(arg); + break; + } + } + + start = s; + + // Format argument. + internal::PrintfArgFormatter(writer, spec).visit(arg); + } + write(writer, start, s); +} + +FMT_FUNC void fmt::report_system_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_system_error, error_code, message); +} + +#if FMT_USE_WINDOWS_H +FMT_FUNC void fmt::report_windows_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_windows_error, error_code, message); +} +#endif + +FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + std::fwrite(w.data(), 1, w.size(), f); +} + +FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { + print(stdout, format_str, args); +} + +FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { + char escape[] = "\x1b[30m"; + escape[3] = static_cast('0' + c); + std::fputs(escape, stdout); + print(format, args); + std::fputs(RESET_COLOR, stdout); +} + +FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + std::size_t size = w.size(); + return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); +} + +#ifndef FMT_HEADER_ONLY + +template struct fmt::internal::BasicData; + +// Explicit instantiations for char. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, CStringRef format); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, long double value); + +// Explicit instantiations for wchar_t. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, WCStringRef format); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, long double value); + +#endif // FMT_HEADER_ONLY + +#ifdef _MSC_VER +# pragma warning(pop) +#endif diff --git a/wasserstein/include/spdlog/fmt/bundled/format.h b/wasserstein/include/spdlog/fmt/bundled/format.h new file mode 100644 index 0000000..64c949b --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/format.h @@ -0,0 +1,4501 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _SECURE_SCL +# define FMT_SECURE_SCL _SECURE_SCL +#else +# define FMT_SECURE_SCL 0 +#endif + +#if FMT_SECURE_SCL +# include +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VER _MSC_VER +#else +# define FMT_MSC_VER 0 +#endif + +#if FMT_MSC_VER && FMT_MSC_VER <= 1500 +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 intmax_t; +#else +#include +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# endif +#endif +#ifndef FMT_API +# define FMT_API +#endif + +#ifdef __GNUC__ +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# define FMT_GCC_EXTENSION __extension__ +# if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic push +// Disable the warning about "long long" which is sometimes reported even +// when using __extension__. +# pragma GCC diagnostic ignored "-Wlong-long" +// Disable the warning about declaration shadowing because it affects too +// many valid cases. +# pragma GCC diagnostic ignored "-Wshadow" +// Disable the warning about implicit conversions that may change the sign of +// an integer; silencing it otherwise would require many explicit casts. +# pragma GCC diagnostic ignored "-Wsign-conversion" +# endif +# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ +# define FMT_HAS_GXX_CXX11 1 +# endif +#else +# define FMT_GCC_EXTENSION +#endif + +#if defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#elif defined(__ICL) +# define FMT_ICC_VERSION __ICL +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +# pragma clang diagnostic ignored "-Wpadded" +#endif + +#ifdef __GNUC_LIBSTD__ +# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#ifndef FMT_USE_VARIADIC_TEMPLATES +// Variadic templates are available in GCC since version 4.4 +// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ +// since version 2013. +# define FMT_USE_VARIADIC_TEMPLATES \ + (FMT_HAS_FEATURE(cxx_variadic_templates) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800) +#endif + +#ifndef FMT_USE_RVALUE_REFERENCES +// Don't use rvalue references when compiling with clang and an old libstdc++ +// as the latter doesn't provide std::move. +# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 +# define FMT_USE_RVALUE_REFERENCES 0 +# else +# define FMT_USE_RVALUE_REFERENCES \ + (FMT_HAS_FEATURE(cxx_rvalue_references) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1600) +# endif +#endif + +#if FMT_USE_RVALUE_REFERENCES +# include // for std::move +#endif + +// Check if exceptions are disabled. +#if defined(__GNUC__) && !defined(__EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +#endif +#if FMT_MSC_VER && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +#endif +#ifndef FMT_EXCEPTIONS +# define FMT_EXCEPTIONS 1 +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# define FMT_THROW(x) throw x +# else +# define FMT_THROW(x) assert(false) +# endif +#endif + +// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS +# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + FMT_MSC_VER >= 1900 +# define FMT_NOEXCEPT noexcept +# else +# define FMT_NOEXCEPT throw() +# endif +# else +# define FMT_NOEXCEPT +# endif +#endif + +#ifndef FMT_OVERRIDE +# if FMT_USE_OVERRIDE || FMT_HAS_FEATURE(cxx_override) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + FMT_MSC_VER >= 1900 +# define FMT_OVERRIDE override +# else +# define FMT_OVERRIDE +# endif +#endif + + +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#ifndef FMT_USE_DELETED_FUNCTIONS +# define FMT_USE_DELETED_FUNCTIONS 0 +#endif + +#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800 +# define FMT_DELETED_OR_UNDEFINED = delete +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + TypeName& operator=(const TypeName&) = delete +#else +# define FMT_DELETED_OR_UNDEFINED +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + TypeName& operator=(const TypeName&) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// All compilers which support UDLs also support variadic templates. This +// makes the fmt::literals implementation easier. However, an explicit check +// for variadic templates is added here just in case. +// For Intel's compiler both it and the system gcc/msc must support UDLs. +# define FMT_USE_USER_DEFINED_LITERALS \ + FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ + (FMT_HAS_FEATURE(cxx_user_literals) || \ + (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900) && \ + (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500) +#endif + +#ifndef FMT_ASSERT +# define FMT_ASSERT(condition, message) assert((condition) && message) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or +// otherwise support __builtin_clz and __builtin_clzll, so +// only define FMT_BUILTIN_CLZ using the MSVC intrinsics +// if the clz and clzll builtins are not available. +#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) +# include // _BitScanReverse, _BitScanReverse64 + +namespace fmt +{ +namespace internal +{ +# pragma intrinsic(_BitScanReverse) +inline uint32_t clz(uint32_t x) +{ + unsigned long r = 0; + _BitScanReverse(&r, x); + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) + +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) +{ + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) +} +} +#endif + +namespace fmt +{ +namespace internal +{ +struct DummyInt +{ + int data[2]; + operator int() const + { + return 0; + } +}; +typedef std::numeric_limits FPUtil; + +// Dummy implementations of system functions such as signbit and ecvt called +// if the latter are not available. +inline DummyInt signbit(...) +{ + return DummyInt(); +} +inline DummyInt _ecvt_s(...) +{ + return DummyInt(); +} +inline DummyInt isinf(...) +{ + return DummyInt(); +} +inline DummyInt _finite(...) +{ + return DummyInt(); +} +inline DummyInt isnan(...) +{ + return DummyInt(); +} +inline DummyInt _isnan(...) +{ + return DummyInt(); +} + +// A helper function to suppress bogus "conditional expression is constant" +// warnings. +template +inline T const_check(T value) +{ + return value; +} +} +} // namespace fmt + +namespace std +{ +// Standard permits specialization of std::numeric_limits. This specialization +// is used to resolve ambiguity between isinf and std::isinf in glibc: +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 +// and the same for isnan and signbit. +template <> +class numeric_limits : + public std::numeric_limits +{ +public: + // Portable version of isinf. + template + static bool isinfinity(T x) + { + using namespace fmt::internal; + // The resolution "priority" is: + // isinf macro > std::isinf > ::isinf > fmt::internal::isinf + if (const_check(sizeof(isinf(x)) == sizeof(bool) || + sizeof(isinf(x)) == sizeof(int))) + { + return isinf(x) != 0; + } + return !_finite(static_cast(x)); + } + + // Portable version of isnan. + template + static bool isnotanumber(T x) + { + using namespace fmt::internal; + if (const_check(sizeof(isnan(x)) == sizeof(bool) || + sizeof(isnan(x)) == sizeof(int))) + { + return isnan(x) != 0; + } + return _isnan(static_cast(x)) != 0; + } + + // Portable version of signbit. + static bool isnegative(double x) + { + using namespace fmt::internal; + if (const_check(sizeof(signbit(x)) == sizeof(int))) + return signbit(x) != 0; + if (x < 0) return true; + if (!isnotanumber(x)) return false; + int dec = 0, sign = 0; + char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. + _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); + return sign != 0; + } +}; +} // namespace std + +namespace fmt +{ + +// Fix the warning about long long on older versions of GCC +// that don't support the diagnostic pragma. +FMT_GCC_EXTENSION typedef long long LongLong; +FMT_GCC_EXTENSION typedef unsigned long long ULongLong; + +#if FMT_USE_RVALUE_REFERENCES +using std::move; +#endif + +template +class BasicWriter; + +typedef BasicWriter Writer; +typedef BasicWriter WWriter; + +template +class ArgFormatter; + +template > +class BasicFormatter; + +/** + \rst + A string reference. It can be constructed from a C string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +------------+-------------------------+ + | Type | Definition | + +============+=========================+ + | StringRef | BasicStringRef | + +------------+-------------------------+ + | WStringRef | BasicStringRef | + +------------+-------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(StringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicStringRef +{ +private: + const Char *data_; + std::size_t size_; + +public: + /** Constructs a string reference object from a C string and a size. */ + BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + BasicStringRef(const Char *s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicStringRef(const std::basic_string &s) + : data_(s.c_str()), size_(s.size()) {} + + /** + \rst + Converts a string reference to an ``std::string`` object. + \endrst + */ + std::basic_string to_string() const + { + return std::basic_string(data_, size_); + } + + /** Returns a pointer to the string data. */ + const Char *data() const + { + return data_; + } + + /** Returns the string size. */ + std::size_t size() const + { + return size_; + } + + // Lexicographically compare this string reference to other. + int compare(BasicStringRef other) const + { + std::size_t size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) != 0; + } + friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) + { + return lhs.compare(rhs) >= 0; + } +}; + +typedef BasicStringRef StringRef; +typedef BasicStringRef WStringRef; + +/** + \rst + A reference to a null terminated string. It can be constructed from a C + string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +-------------+--------------------------+ + | Type | Definition | + +=============+==========================+ + | CStringRef | BasicCStringRef | + +-------------+--------------------------+ + | WCStringRef | BasicCStringRef | + +-------------+--------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(CStringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicCStringRef +{ +private: + const Char *data_; + +public: + /** Constructs a string reference object from a C string. */ + BasicCStringRef(const Char *s) : data_(s) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} + + /** Returns the pointer to a C string. */ + const Char *c_str() const + { + return data_; + } +}; + +typedef BasicCStringRef CStringRef; +typedef BasicCStringRef WCStringRef; + +/** A formatting error such as invalid format string. */ +class FormatError : public std::runtime_error +{ +public: + explicit FormatError(CStringRef message) + : std::runtime_error(message.c_str()) {} + ~FormatError() throw(); +}; + +namespace internal +{ + +// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. +template +struct MakeUnsigned +{ + typedef T Type; +}; + +#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ + template <> \ + struct MakeUnsigned { typedef U Type; } + +FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); +FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); +FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); +FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); + +// Casts nonnegative integer to unsigned. +template +inline typename MakeUnsigned::Type to_unsigned(Int value) +{ + FMT_ASSERT(value >= 0, "negative value"); + return static_cast::Type>(value); +} + +// The number of characters to store in the MemoryBuffer object itself +// to avoid dynamic memory allocation. +enum { INLINE_BUFFER_SIZE = 500 }; + +#if FMT_SECURE_SCL +// Use checked iterator to avoid warnings on MSVC. +template +inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) +{ + return stdext::checked_array_iterator(ptr, size); +} +#else +template +inline T *make_ptr(T *ptr, std::size_t) +{ + return ptr; +} +#endif +} // namespace internal + +/** + \rst + A buffer supporting a subset of ``std::vector``'s operations. + \endrst + */ +template +class Buffer +{ +private: + FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); + +protected: + T *ptr_; + std::size_t size_; + std::size_t capacity_; + + Buffer(T *ptr = 0, std::size_t capacity = 0) + : ptr_(ptr), size_(0), capacity_(capacity) {} + + /** + \rst + Increases the buffer capacity to hold at least *size* elements updating + ``ptr_`` and ``capacity_``. + \endrst + */ + virtual void grow(std::size_t size) = 0; + +public: + virtual ~Buffer() {} + + /** Returns the size of this buffer. */ + std::size_t size() const + { + return size_; + } + + /** Returns the capacity of this buffer. */ + std::size_t capacity() const + { + return capacity_; + } + + /** + Resizes the buffer. If T is a POD type new elements may not be initialized. + */ + void resize(std::size_t new_size) + { + if (new_size > capacity_) + grow(new_size); + size_ = new_size; + } + + /** + \rst + Reserves space to store at least *capacity* elements. + \endrst + */ + void reserve(std::size_t capacity) + { + if (capacity > capacity_) + grow(capacity); + } + + void clear() FMT_NOEXCEPT { size_ = 0; } + + void push_back(const T &value) + { + if (size_ == capacity_) + grow(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template + void append(const U *begin, const U *end); + + T &operator[](std::size_t index) + { + return ptr_[index]; + } + const T &operator[](std::size_t index) const + { + return ptr_[index]; + } +}; + +template +template +void Buffer::append(const U *begin, const U *end) +{ + std::size_t new_size = size_ + internal::to_unsigned(end - begin); + if (new_size > capacity_) + grow(new_size); + std::uninitialized_copy(begin, end, + internal::make_ptr(ptr_, capacity_) + size_); + size_ = new_size; +} + +namespace internal +{ + +// A memory buffer for trivially copyable/constructible types with the first +// SIZE elements stored in the object itself. +template > +class MemoryBuffer : private Allocator, public Buffer +{ +private: + T data_[SIZE]; + + // Deallocate memory allocated by the buffer. + void deallocate() + { + if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); + } + +protected: + void grow(std::size_t size) FMT_OVERRIDE; + +public: + explicit MemoryBuffer(const Allocator &alloc = Allocator()) + : Allocator(alloc), Buffer(data_, SIZE) {} + ~MemoryBuffer() + { + deallocate(); + } + +#if FMT_USE_RVALUE_REFERENCES +private: + // Move data from other to this buffer. + void move(MemoryBuffer &other) + { + Allocator &this_alloc = *this, &other_alloc = other; + this_alloc = std::move(other_alloc); + this->size_ = other.size_; + this->capacity_ = other.capacity_; + if (other.ptr_ == other.data_) + { + this->ptr_ = data_; + std::uninitialized_copy(other.data_, other.data_ + this->size_, + make_ptr(data_, this->capacity_)); + } + else + { + this->ptr_ = other.ptr_; + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.ptr_ = other.data_; + } + } + +public: + MemoryBuffer(MemoryBuffer &&other) + { + move(other); + } + + MemoryBuffer &operator=(MemoryBuffer &&other) + { + assert(this != &other); + deallocate(); + move(other); + return *this; + } +#endif + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const + { + return *this; + } +}; + +template +void MemoryBuffer::grow(std::size_t size) +{ + std::size_t new_capacity = this->capacity_ + this->capacity_ / 2; + if (size > new_capacity) + new_capacity = size; + T *new_ptr = this->allocate(new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_, + make_ptr(new_ptr, new_capacity)); + std::size_t old_capacity = this->capacity_; + T *old_ptr = this->ptr_; + this->capacity_ = new_capacity; + this->ptr_ = new_ptr; + // deallocate may throw (at least in principle), but it doesn't matter since + // the buffer already uses the new storage and will deallocate it in case + // of exception. + if (old_ptr != data_) + Allocator::deallocate(old_ptr, old_capacity); +} + +// A fixed-size buffer. +template +class FixedBuffer : public fmt::Buffer +{ +public: + FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} + +protected: + FMT_API void grow(std::size_t size); +}; + +template +class BasicCharTraits +{ +public: +#if FMT_SECURE_SCL + typedef stdext::checked_array_iterator CharPtr; +#else + typedef Char *CharPtr; +#endif + static Char cast(int value) + { + return static_cast(value); + } +}; + +template +class CharTraits; + +template <> +class CharTraits : public BasicCharTraits +{ +private: + // Conversion from wchar_t to char is not allowed. + static char convert(wchar_t); + +public: + static char convert(char value) + { + return value; + } + + // Formats a floating-point number. + template + FMT_API static int format_float(char *buffer, std::size_t size, + const char *format, unsigned width, int precision, T value); +}; + +template <> +class CharTraits : public BasicCharTraits +{ +public: + static wchar_t convert(char value) + { + return value; + } + static wchar_t convert(wchar_t value) + { + return value; + } + + template + FMT_API static int format_float(wchar_t *buffer, std::size_t size, + const wchar_t *format, unsigned width, int precision, T value); +}; + +// Checks if a number is negative - used to avoid warnings. +template +struct SignChecker +{ + template + static bool is_negative(T value) + { + return value < 0; + } +}; + +template <> +struct SignChecker +{ + template + static bool is_negative(T) + { + return false; + } +}; + +// Returns true if value is negative, false otherwise. +// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. +template +inline bool is_negative(T value) +{ + return SignChecker::is_signed>::is_negative(value); +} + +// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. +template +struct TypeSelector +{ + typedef uint32_t Type; +}; + +template <> +struct TypeSelector +{ + typedef uint64_t Type; +}; + +template +struct IntTraits +{ + // Smallest of uint32_t and uint64_t that is large enough to represent + // all values of T. + typedef typename + TypeSelector::digits <= 32>::Type MainType; +}; + +FMT_API void report_unknown_type(char code, const char *type); + +// Static data is placed in this class template to allow header-only +// configuration. +template +struct FMT_API BasicData +{ + static const uint32_t POWERS_OF_10_32[]; + static const uint64_t POWERS_OF_10_64[]; + static const char DIGITS[]; +}; + +#ifndef FMT_USE_EXTERN_TEMPLATES +// Clang doesn't have a feature check for extern templates so we check +// for variadic templates which were introduced in the same version. +# define FMT_USE_EXTERN_TEMPLATES (__clang__ && FMT_USE_VARIADIC_TEMPLATES) +#endif + +#if FMT_USE_EXTERN_TEMPLATES && !defined(FMT_HEADER_ONLY) +extern template struct BasicData; +#endif + +typedef BasicData<> Data; + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline unsigned count_digits(uint64_t n) +{ + // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. + int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline unsigned count_digits(uint64_t n) +{ + unsigned count = 1; + for (;;) + { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline unsigned count_digits(uint32_t n) +{ + int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; +} +#endif + +// A functor that doesn't add a thousands separator. +struct NoThousandsSep +{ + template + void operator()(Char *) {} +}; + +// A functor that adds a thousands separator. +class ThousandsSep +{ +private: + fmt::StringRef sep_; + + // Index of a decimal digit with the least significant digit having index 0. + unsigned digit_index_; + +public: + explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {} + + template + void operator()(Char *&buffer) + { + if (++digit_index_ % 3 != 0) + return; + buffer -= sep_.size(); + std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(), + internal::make_ptr(buffer, sep_.size())); + } +}; + +// Formats a decimal unsigned integer value writing into buffer. +// thousands_sep is a functor that is called after writing each char to +// add a thousands separator if necessary. +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits, + ThousandsSep thousands_sep) +{ + buffer += num_digits; + while (value >= 100) + { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer = Data::DIGITS[index + 1]; + thousands_sep(buffer); + *--buffer = Data::DIGITS[index]; + thousands_sep(buffer); + } + if (value < 10) + { + *--buffer = static_cast('0' + value); + return; + } + unsigned index = static_cast(value * 2); + *--buffer = Data::DIGITS[index + 1]; + thousands_sep(buffer); + *--buffer = Data::DIGITS[index]; +} + +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) +{ + return format_decimal(buffer, value, num_digits, NoThousandsSep()); +} + +#ifndef _WIN32 +# define FMT_USE_WINDOWS_H 0 +#elif !defined(FMT_USE_WINDOWS_H) +# define FMT_USE_WINDOWS_H 1 +#endif + +// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. +// All the functionality that relies on it will be disabled too. +#if FMT_USE_WINDOWS_H +// A converter from UTF-8 to UTF-16. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF8ToUTF16 +{ +private: + MemoryBuffer buffer_; + +public: + FMT_API explicit UTF8ToUTF16(StringRef s); + operator WStringRef() const + { + return WStringRef(&buffer_[0], size()); + } + size_t size() const + { + return buffer_.size() - 1; + } + const wchar_t *c_str() const + { + return &buffer_[0]; + } + std::wstring str() const + { + return std::wstring(&buffer_[0], size()); + } +}; + +// A converter from UTF-16 to UTF-8. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF16ToUTF8 +{ +private: + MemoryBuffer buffer_; + +public: + UTF16ToUTF8() {} + FMT_API explicit UTF16ToUTF8(WStringRef s); + operator StringRef() const + { + return StringRef(&buffer_[0], size()); + } + size_t size() const + { + return buffer_.size() - 1; + } + const char *c_str() const + { + return &buffer_[0]; + } + std::string str() const + { + return std::string(&buffer_[0], size()); + } + + // Performs conversion returning a system error code instead of + // throwing exception on conversion error. This method may still throw + // in case of memory allocation error. + FMT_API int convert(WStringRef s); +}; + +FMT_API void format_windows_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; +#endif + +FMT_API void format_system_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; + +// A formatting argument value. +struct Value +{ + template + struct StringValue + { + const Char *value; + std::size_t size; + }; + + typedef void (*FormatFunc)( + void *formatter, const void *arg, void *format_str_ptr); + + struct CustomValue + { + const void *value; + FormatFunc format; + }; + + union + { + int int_value; + unsigned uint_value; + LongLong long_long_value; + ULongLong ulong_long_value; + double double_value; + long double long_double_value; + const void *pointer; + StringValue string; + StringValue sstring; + StringValue ustring; + StringValue wstring; + CustomValue custom; + }; + + enum Type + { + NONE, NAMED_ARG, + // Integer types should go first, + INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, + // followed by floating-point types. + DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, + CSTRING, STRING, WSTRING, POINTER, CUSTOM + }; +}; + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in internal::MemoryBuffer. +struct Arg : Value +{ + Type type; +}; + +template +struct NamedArg; + +template +struct Null {}; + +// A helper class template to enable or disable overloads taking wide +// characters and strings in MakeValue. +template +struct WCharHelper +{ + typedef Null Supported; + typedef T Unsupported; +}; + +template +struct WCharHelper +{ + typedef T Supported; + typedef Null Unsupported; +}; + +typedef char Yes[1]; +typedef char No[2]; + +template +T &get(); + +// These are non-members to workaround an overload resolution bug in bcc32. +Yes &convert(fmt::ULongLong); +No &convert(...); + +template +struct ConvertToIntImpl +{ + enum { value = ENABLE_CONVERSION }; +}; + +template +struct ConvertToIntImpl2 +{ + enum { value = false }; +}; + +template +struct ConvertToIntImpl2 +{ + enum + { + // Don't convert numeric types. + value = ConvertToIntImpl::is_specialized>::value + }; +}; + +template +struct ConvertToInt +{ + enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; + enum { value = ConvertToIntImpl2::value }; +}; + +#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ + template <> \ + struct ConvertToInt { enum { value = 0 }; } + +// Silence warnings about convering float to int. +FMT_DISABLE_CONVERSION_TO_INT(float); +FMT_DISABLE_CONVERSION_TO_INT(double); +FMT_DISABLE_CONVERSION_TO_INT(long double); + +template +struct EnableIf {}; + +template +struct EnableIf +{ + typedef T type; +}; + +template +struct Conditional +{ + typedef T type; +}; + +template +struct Conditional +{ + typedef F type; +}; + +// For bcc32 which doesn't understand ! in template arguments. +template +struct Not +{ + enum { value = 0 }; +}; + +template<> +struct Not +{ + enum { value = 1 }; +}; + +template struct LConvCheck +{ + LConvCheck(int) {} +}; + +// Returns the thousands separator for the current locale. +// We check if ``lconv`` contains ``thousands_sep`` because on Android +// ``lconv`` is stubbed as an empty struct. +template +inline StringRef thousands_sep( + LConv *lc, LConvCheck = 0) +{ + return lc->thousands_sep; +} + +inline fmt::StringRef thousands_sep(...) +{ + return ""; +} + +// Makes an Arg object from any type. +template +class MakeValue : public Arg +{ +public: + typedef typename Formatter::Char Char; + +private: + // The following two methods are private to disallow formatting of + // arbitrary pointers. If you want to output a pointer cast it to + // "void *" or "const void *". In particular, this forbids formatting + // of "[const] volatile char *" which is printed as bool by iostreams. + // Do not implement! + template + MakeValue(const T *value); + template + MakeValue(T *value); + + // The following methods are private to disallow formatting of wide + // characters and strings into narrow strings as in + // fmt::format("{}", L"test"); + // To fix this, use a wide format string: fmt::format(L"{}", L"test"). +#if !FMT_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Unsupported); +#endif + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + + void set_string(StringRef str) + { + string.value = str.data(); + string.size = str.size(); + } + + void set_string(WStringRef str) + { + wstring.value = str.data(); + wstring.size = str.size(); + } + + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg( + void *formatter, const void *arg, void *format_str_ptr) + { + format(*static_cast(formatter), + *static_cast(format_str_ptr), + *static_cast(arg)); + } + +public: + MakeValue() {} + +#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ + MakeValue(Type value) { field = rhs; } \ + static uint64_t type(Type) { return Arg::TYPE; } + +#define FMT_MAKE_VALUE(Type, field, TYPE) \ + FMT_MAKE_VALUE_(Type, field, TYPE, value) + + FMT_MAKE_VALUE(bool, int_value, BOOL) + FMT_MAKE_VALUE(short, int_value, INT) + FMT_MAKE_VALUE(unsigned short, uint_value, UINT) + FMT_MAKE_VALUE(int, int_value, INT) + FMT_MAKE_VALUE(unsigned, uint_value, UINT) + + MakeValue(long value) + { + // To minimize the number of types we need to deal with, long is + // translated either to int or to long long depending on its size. + if (const_check(sizeof(long) == sizeof(int))) + int_value = static_cast(value); + else + long_long_value = value; + } + static uint64_t type(long) + { + return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; + } + + MakeValue(unsigned long value) + { + if (const_check(sizeof(unsigned long) == sizeof(unsigned))) + uint_value = static_cast(value); + else + ulong_long_value = value; + } + static uint64_t type(unsigned long) + { + return sizeof(unsigned long) == sizeof(unsigned) ? + Arg::UINT : Arg::ULONG_LONG; + } + + FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) + FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) + FMT_MAKE_VALUE(float, double_value, DOUBLE) + FMT_MAKE_VALUE(double, double_value, DOUBLE) + FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) + FMT_MAKE_VALUE(signed char, int_value, INT) + FMT_MAKE_VALUE(unsigned char, uint_value, UINT) + FMT_MAKE_VALUE(char, int_value, CHAR) + +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Supported value) + { + int_value = value; + } + static uint64_t type(wchar_t) + { + return Arg::CHAR; + } +#endif + +#define FMT_MAKE_STR_VALUE(Type, TYPE) \ + MakeValue(Type value) { set_string(value); } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_VALUE(char *, string.value, CSTRING) + FMT_MAKE_VALUE(const char *, string.value, CSTRING) + FMT_MAKE_VALUE(signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(unsigned char *, ustring.value, CSTRING) + FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) + FMT_MAKE_STR_VALUE(const std::string &, STRING) + FMT_MAKE_STR_VALUE(StringRef, STRING) + FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) + +#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ + MakeValue(typename WCharHelper::Supported value) { \ + set_string(value); \ + } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) + FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) + + FMT_MAKE_VALUE(void *, pointer, POINTER) + FMT_MAKE_VALUE(const void *, pointer, POINTER) + + template + MakeValue(const T &value, + typename EnableIf::value>::value, int>::type = 0) + { + custom.value = &value; + custom.format = &format_custom_arg; + } + + template + MakeValue(const T &value, + typename EnableIf::value, int>::type = 0) + { + int_value = value; + } + + template + static uint64_t type(const T &) + { + return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; + } + + // Additional template param `Char_` is needed here because make_type always + // uses char. + template + MakeValue(const NamedArg &value) + { + pointer = &value; + } + + template + static uint64_t type(const NamedArg &) + { + return Arg::NAMED_ARG; + } +}; + +template +class MakeArg : public Arg +{ +public: + MakeArg() + { + type = Arg::NONE; + } + + template + MakeArg(const T &value) + : Arg(MakeValue(value)) + { + type = static_cast(MakeValue::type(value)); + } +}; + +template +struct NamedArg : Arg +{ + BasicStringRef name; + + template + NamedArg(BasicStringRef argname, const T &value) + : Arg(MakeArg< BasicFormatter >(value)), name(argname) {} +}; + +class RuntimeError : public std::runtime_error +{ +protected: + RuntimeError() : std::runtime_error("") {} + ~RuntimeError() throw(); +}; + +template +class PrintfArgFormatter; + +template +class ArgMap; +} // namespace internal + +/** An argument list. */ +class ArgList +{ +private: + // To reduce compiled code size per formatting function call, types of first + // MAX_PACKED_ARGS arguments are passed in the types_ field. + uint64_t types_; + union + { + // If the number of arguments is less than MAX_PACKED_ARGS, the argument + // values are stored in values_, otherwise they are stored in args_. + // This is done to reduce compiled code size as storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const internal::Value *values_; + const internal::Arg *args_; + }; + + internal::Arg::Type type(unsigned index) const + { + unsigned shift = index * 4; + uint64_t mask = 0xf; + return static_cast( + (types_ & (mask << shift)) >> shift); + } + + template + friend class internal::ArgMap; + +public: + // Maximum number of arguments with packed types. + enum { MAX_PACKED_ARGS = 16 }; + + ArgList() : types_(0) {} + + ArgList(ULongLong types, const internal::Value *values) + : types_(types), values_(values) {} + ArgList(ULongLong types, const internal::Arg *args) + : types_(types), args_(args) {} + + /** Returns the argument at specified index. */ + internal::Arg operator[](unsigned index) const + { + using internal::Arg; + Arg arg; + bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; + if (index < MAX_PACKED_ARGS) + { + Arg::Type arg_type = type(index); + internal::Value &val = arg; + if (arg_type != Arg::NONE) + val = use_values ? values_[index] : args_[index]; + arg.type = arg_type; + return arg; + } + if (use_values) + { + // The index is greater than the number of arguments that can be stored + // in values, so return a "none" argument. + arg.type = Arg::NONE; + return arg; + } + for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) + { + if (args_[i].type == Arg::NONE) + return args_[i]; + } + return args_[index]; + } +}; + +#define FMT_DISPATCH(call) static_cast(this)->call + +/** + \rst + An argument visitor based on the `curiously recurring template pattern + `_. + + To use `~fmt::ArgVisitor` define a subclass that implements some or all of the + visit methods with the same signatures as the methods in `~fmt::ArgVisitor`, + for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. Then calling + `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::ArgVisitor` will be called. + + **Example**:: + + class MyArgVisitor : public fmt::ArgVisitor { + public: + void visit_int(int value) { fmt::print("{}", value); } + void visit_double(double value) { fmt::print("{}", value ); } + }; + \endrst + */ +template +class ArgVisitor +{ +private: + typedef internal::Arg Arg; + +public: + void report_unhandled_arg() {} + + Result visit_unhandled_arg() + { + FMT_DISPATCH(report_unhandled_arg()); + return Result(); + } + + /** Visits an ``int`` argument. **/ + Result visit_int(int value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``long long`` argument. **/ + Result visit_long_long(LongLong value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned`` argument. **/ + Result visit_uint(unsigned value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned long long`` argument. **/ + Result visit_ulong_long(ULongLong value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``bool`` argument. **/ + Result visit_bool(bool value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``char`` or ``wchar_t`` argument. **/ + Result visit_char(int value) + { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an argument of any integral type. **/ + template + Result visit_any_int(T) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a ``double`` argument. **/ + Result visit_double(double value) + { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``long double`` argument. **/ + Result visit_long_double(long double value) + { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``double`` or ``long double`` argument. **/ + template + Result visit_any_double(T) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a null-terminated C string (``const char *``) argument. **/ + Result visit_cstring(const char *) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a string argument. **/ + Result visit_string(Arg::StringValue) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a wide string argument. **/ + Result visit_wstring(Arg::StringValue) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a pointer argument. **/ + Result visit_pointer(const void *) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits an argument of a custom (user-defined) type. **/ + Result visit_custom(Arg::CustomValue) + { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be + called. + \endrst + */ + Result visit(const Arg &arg) + { + switch (arg.type) + { + case Arg::NONE: + case Arg::NAMED_ARG: + FMT_ASSERT(false, "invalid argument type"); + break; + case Arg::INT: + return FMT_DISPATCH(visit_int(arg.int_value)); + case Arg::UINT: + return FMT_DISPATCH(visit_uint(arg.uint_value)); + case Arg::LONG_LONG: + return FMT_DISPATCH(visit_long_long(arg.long_long_value)); + case Arg::ULONG_LONG: + return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); + case Arg::BOOL: + return FMT_DISPATCH(visit_bool(arg.int_value != 0)); + case Arg::CHAR: + return FMT_DISPATCH(visit_char(arg.int_value)); + case Arg::DOUBLE: + return FMT_DISPATCH(visit_double(arg.double_value)); + case Arg::LONG_DOUBLE: + return FMT_DISPATCH(visit_long_double(arg.long_double_value)); + case Arg::CSTRING: + return FMT_DISPATCH(visit_cstring(arg.string.value)); + case Arg::STRING: + return FMT_DISPATCH(visit_string(arg.string)); + case Arg::WSTRING: + return FMT_DISPATCH(visit_wstring(arg.wstring)); + case Arg::POINTER: + return FMT_DISPATCH(visit_pointer(arg.pointer)); + case Arg::CUSTOM: + return FMT_DISPATCH(visit_custom(arg.custom)); + } + return Result(); + } +}; + +enum Alignment +{ + ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC +}; + +// Flags. +enum +{ + SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, + CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. +}; + +// An empty format specifier. +struct EmptySpec {}; + +// A type specifier. +template +struct TypeSpec : EmptySpec +{ + Alignment align() const + { + return ALIGN_DEFAULT; + } + unsigned width() const + { + return 0; + } + int precision() const + { + return -1; + } + bool flag(unsigned) const + { + return false; + } + char type() const + { + return TYPE; + } + char fill() const + { + return ' '; + } +}; + +// A width specifier. +struct WidthSpec +{ + unsigned width_; + // Fill is always wchar_t and cast to char if necessary to avoid having + // two specialization of WidthSpec and its subclasses. + wchar_t fill_; + + WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} + + unsigned width() const + { + return width_; + } + wchar_t fill() const + { + return fill_; + } +}; + +// An alignment specifier. +struct AlignSpec : WidthSpec +{ + Alignment align_; + + AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) + : WidthSpec(width, fill), align_(align) {} + + Alignment align() const + { + return align_; + } + + int precision() const + { + return -1; + } +}; + +// An alignment and type specifier. +template +struct AlignTypeSpec : AlignSpec +{ + AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} + + bool flag(unsigned) const + { + return false; + } + char type() const + { + return TYPE; + } +}; + +// A full format specifier. +struct FormatSpec : AlignSpec +{ + unsigned flags_; + int precision_; + char type_; + + FormatSpec( + unsigned width = 0, char type = 0, wchar_t fill = ' ') + : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} + + bool flag(unsigned f) const + { + return (flags_ & f) != 0; + } + int precision() const + { + return precision_; + } + char type() const + { + return type_; + } +}; + +// An integer format specifier. +template , typename Char = char> +class IntFormatSpec : public SpecT +{ +private: + T value_; + +public: + IntFormatSpec(T val, const SpecT &spec = SpecT()) + : SpecT(spec), value_(val) {} + + T value() const + { + return value_; + } +}; + +// A string format specifier. +template +class StrFormatSpec : public AlignSpec +{ +private: + const Char *str_; + +public: + template + StrFormatSpec(const Char *str, unsigned width, FillChar fill) + : AlignSpec(width, fill), str_(str) + { + internal::CharTraits::convert(FillChar()); + } + + const Char *str() const + { + return str_; + } +}; + +/** + Returns an integer format specifier to format the value in base 2. + */ +IntFormatSpec > bin(int value); + +/** + Returns an integer format specifier to format the value in base 8. + */ +IntFormatSpec > oct(int value); + +/** + Returns an integer format specifier to format the value in base 16 using + lower-case letters for the digits above 9. + */ +IntFormatSpec > hex(int value); + +/** + Returns an integer formatter format specifier to format in base 16 using + upper-case letters for the digits above 9. + */ +IntFormatSpec > hexu(int value); + +/** + \rst + Returns an integer format specifier to pad the formatted argument with the + fill character to the specified width using the default (right) numeric + alignment. + + **Example**:: + + MemoryWriter out; + out << pad(hex(0xcafe), 8, '0'); + // out.str() == "0000cafe" + + \endrst + */ +template +IntFormatSpec, Char> pad( + int value, unsigned width, Char fill = ' '); + +#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ +inline IntFormatSpec > bin(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'b'>()); \ +} \ + \ +inline IntFormatSpec > oct(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'o'>()); \ +} \ + \ +inline IntFormatSpec > hex(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'x'>()); \ +} \ + \ +inline IntFormatSpec > hexu(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'X'>()); \ +} \ + \ +template \ +inline IntFormatSpec > pad( \ + IntFormatSpec > f, unsigned width) { \ + return IntFormatSpec >( \ + f.value(), AlignTypeSpec(width, ' ')); \ +} \ + \ +/* For compatibility with older compilers we provide two overloads for pad, */ \ +/* one that takes a fill character and one that doesn't. In the future this */ \ +/* can be replaced with one overload making the template argument Char */ \ +/* default to char (C++11). */ \ +template \ +inline IntFormatSpec, Char> pad( \ + IntFormatSpec, Char> f, \ + unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + f.value(), AlignTypeSpec(width, fill)); \ +} \ + \ +inline IntFormatSpec > pad( \ + TYPE value, unsigned width) { \ + return IntFormatSpec >( \ + value, AlignTypeSpec<0>(width, ' ')); \ +} \ + \ +template \ +inline IntFormatSpec, Char> pad( \ + TYPE value, unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + value, AlignTypeSpec<0>(width, fill)); \ +} + +FMT_DEFINE_INT_FORMATTERS(int) +FMT_DEFINE_INT_FORMATTERS(long) +FMT_DEFINE_INT_FORMATTERS(unsigned) +FMT_DEFINE_INT_FORMATTERS(unsigned long) +FMT_DEFINE_INT_FORMATTERS(LongLong) +FMT_DEFINE_INT_FORMATTERS(ULongLong) + +/** + \rst + Returns a string formatter that pads the formatted argument with the fill + character to the specified width using the default (left) string alignment. + + **Example**:: + + std::string s = str(MemoryWriter() << pad("abc", 8)); + // s == "abc " + + \endrst + */ +template +inline StrFormatSpec pad( + const Char *str, unsigned width, Char fill = ' ') +{ + return StrFormatSpec(str, width, fill); +} + +inline StrFormatSpec pad( + const wchar_t *str, unsigned width, char fill = ' ') +{ + return StrFormatSpec(str, width, fill); +} + +namespace internal +{ + +template +class ArgMap +{ +private: + typedef std::vector< + std::pair, internal::Arg> > MapType; + typedef typename MapType::value_type Pair; + + MapType map_; + +public: + FMT_API void init(const ArgList &args); + + const internal::Arg* find(const fmt::BasicStringRef &name) const + { + // The list is unsorted, so just return the first matching name. + for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); + it != end; ++it) + { + if (it->first == name) + return &it->second; + } + return 0; + } +}; + +template +class ArgFormatterBase : public ArgVisitor +{ +private: + BasicWriter &writer_; + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase); + + void write_pointer(const void *p) + { + spec_.flags_ = HASH_FLAG; + spec_.type_ = 'x'; + writer_.write_int(reinterpret_cast(p), spec_); + } + +protected: + BasicWriter &writer() + { + return writer_; + } + FormatSpec &spec() + { + return spec_; + } + + void write(bool value) + { + const char *str_value = value ? "true" : "false"; + Arg::StringValue str = { str_value, std::strlen(str_value) }; + writer_.write_str(str, spec_); + } + + void write(const char *value) + { + Arg::StringValue str = {value, value != 0 ? std::strlen(value) : 0}; + writer_.write_str(str, spec_); + } + +public: + ArgFormatterBase(BasicWriter &w, FormatSpec &s) + : writer_(w), spec_(s) {} + + template + void visit_any_int(T value) + { + writer_.write_int(value, spec_); + } + + template + void visit_any_double(T value) + { + writer_.write_double(value, spec_); + } + + void visit_bool(bool value) + { + if (spec_.type_) + return visit_any_int(value); + write(value); + } + + void visit_char(int value) + { + if (spec_.type_ && spec_.type_ != 'c') + { + spec_.flags_ |= CHAR_FLAG; + writer_.write_int(value, spec_); + return; + } + if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) + FMT_THROW(FormatError("invalid format specifier for char")); + typedef typename BasicWriter::CharPtr CharPtr; + Char fill = internal::CharTraits::cast(spec_.fill()); + CharPtr out = CharPtr(); + const unsigned CHAR_SIZE = 1; + if (spec_.width_ > CHAR_SIZE) + { + out = writer_.grow_buffer(spec_.width_); + if (spec_.align_ == ALIGN_RIGHT) + { + std::uninitialized_fill_n(out, spec_.width_ - CHAR_SIZE, fill); + out += spec_.width_ - CHAR_SIZE; + } + else if (spec_.align_ == ALIGN_CENTER) + { + out = writer_.fill_padding(out, spec_.width_, + internal::const_check(CHAR_SIZE), fill); + } + else + { + std::uninitialized_fill_n(out + CHAR_SIZE, + spec_.width_ - CHAR_SIZE, fill); + } + } + else + { + out = writer_.grow_buffer(CHAR_SIZE); + } + *out = internal::CharTraits::cast(value); + } + + void visit_cstring(const char *value) + { + if (spec_.type_ == 'p') + return write_pointer(value); + write(value); + } + + void visit_string(Arg::StringValue value) + { + writer_.write_str(value, spec_); + } + + using ArgVisitor::visit_wstring; + + void visit_wstring(Arg::StringValue value) + { + writer_.write_str(value, spec_); + } + + void visit_pointer(const void *value) + { + if (spec_.type_ && spec_.type_ != 'p') + report_unknown_type(spec_.type_, "pointer"); + write_pointer(value); + } +}; + +class FormatterBase +{ +private: + ArgList args_; + int next_arg_index_; + + // Returns the argument with specified index. + FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); + +protected: + const ArgList &args() const + { + return args_; + } + + explicit FormatterBase(const ArgList &args) + { + args_ = args; + next_arg_index_ = 0; + } + + // Returns the next argument. + Arg next_arg(const char *&error) + { + if (next_arg_index_ >= 0) + return do_get_arg(internal::to_unsigned(next_arg_index_++), error); + error = "cannot switch from manual to automatic argument indexing"; + return Arg(); + } + + // Checks if manual indexing is used and returns the argument with + // specified index. + Arg get_arg(unsigned arg_index, const char *&error) + { + return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); + } + + bool check_no_auto_index(const char *&error) + { + if (next_arg_index_ > 0) + { + error = "cannot switch from automatic to manual argument indexing"; + return false; + } + next_arg_index_ = -1; + return true; + } + + template + void write(BasicWriter &w, const Char *start, const Char *end) + { + if (start != end) + w << BasicStringRef(start, internal::to_unsigned(end - start)); + } +}; + +// A printf formatter. +template +class PrintfFormatter : private FormatterBase +{ +private: + void parse_flags(FormatSpec &spec, const Char *&s); + + // Returns the argument with specified index or, if arg_index is equal + // to the maximum unsigned value, the next argument. + Arg get_arg(const Char *s, + unsigned arg_index = (std::numeric_limits::max)()); + + // Parses argument index, flags and width and returns the argument index. + unsigned parse_header(const Char *&s, FormatSpec &spec); + +public: + explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} + FMT_API void format(BasicWriter &writer, + BasicCStringRef format_str); +}; +} // namespace internal + +/** + \rst + An argument formatter based on the `curiously recurring template pattern + `_. + + To use `~fmt::BasicArgFormatter` define a subclass that implements some or + all of the visit methods with the same signatures as the methods in + `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. When a formatting + function processes an argument, it will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::BasicArgFormatter` or its superclass + will be called. + \endrst + */ +template +class BasicArgFormatter : public internal::ArgFormatterBase +{ +private: + BasicFormatter &formatter_; + const Char *format_; + +public: + /** + \rst + Constructs an argument formatter object. + *formatter* is a reference to the main formatter object, *spec* contains + format specifier information for standard argument types, and *fmt* points + to the part of the format string being parsed for custom argument types. + \endrst + */ + BasicArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : internal::ArgFormatterBase(formatter.writer(), spec), + formatter_(formatter), format_(fmt) {} + + /** Formats argument of a custom (user-defined) type. */ + void visit_custom(internal::Arg::CustomValue c) + { + c.format(&formatter_, c.value, &format_); + } +}; + +/** The default argument formatter. */ +template +class ArgFormatter : public BasicArgFormatter, Char> +{ +public: + /** Constructs an argument formatter object. */ + ArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : BasicArgFormatter, Char>(formatter, spec, fmt) {} +}; + +/** This template formats data and writes the output to a writer. */ +template +class BasicFormatter : private internal::FormatterBase +{ +public: + /** The character type for the output. */ + typedef CharType Char; + +private: + BasicWriter &writer_; + internal::ArgMap map_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); + + using internal::FormatterBase::get_arg; + + // Checks if manual indexing is used and returns the argument with + // specified name. + internal::Arg get_arg(BasicStringRef arg_name, const char *&error); + + // Parses argument index and returns corresponding argument. + internal::Arg parse_arg_index(const Char *&s); + + // Parses argument name and returns corresponding argument. + internal::Arg parse_arg_name(const Char *&s); + +public: + /** + \rst + Constructs a ``BasicFormatter`` object. References to the arguments and + the writer are stored in the formatter object so make sure they have + appropriate lifetimes. + \endrst + */ + BasicFormatter(const ArgList &args, BasicWriter &w) + : internal::FormatterBase(args), writer_(w) {} + + /** Returns a reference to the writer associated with this formatter. */ + BasicWriter &writer() + { + return writer_; + } + + /** Formats stored arguments and writes the output to the writer. */ + void format(BasicCStringRef format_str); + + // Formats a single argument and advances format_str, a format string pointer. + const Char *format(const Char *&format_str, const internal::Arg &arg); +}; + +// Generates a comma-separated list with results of applying f to +// numbers 0..n-1. +# define FMT_GEN(n, f) FMT_GEN##n(f) +# define FMT_GEN1(f) f(0) +# define FMT_GEN2(f) FMT_GEN1(f), f(1) +# define FMT_GEN3(f) FMT_GEN2(f), f(2) +# define FMT_GEN4(f) FMT_GEN3(f), f(3) +# define FMT_GEN5(f) FMT_GEN4(f), f(4) +# define FMT_GEN6(f) FMT_GEN5(f), f(5) +# define FMT_GEN7(f) FMT_GEN6(f), f(6) +# define FMT_GEN8(f) FMT_GEN7(f), f(7) +# define FMT_GEN9(f) FMT_GEN8(f), f(8) +# define FMT_GEN10(f) FMT_GEN9(f), f(9) +# define FMT_GEN11(f) FMT_GEN10(f), f(10) +# define FMT_GEN12(f) FMT_GEN11(f), f(11) +# define FMT_GEN13(f) FMT_GEN12(f), f(12) +# define FMT_GEN14(f) FMT_GEN13(f), f(13) +# define FMT_GEN15(f) FMT_GEN14(f), f(14) + +namespace internal +{ +inline uint64_t make_type() +{ + return 0; +} + +template +inline uint64_t make_type(const T &arg) +{ + return MakeValue< BasicFormatter >::type(arg); +} + +template + struct ArgArray; + +template +struct ArgArray +{ + typedef Value Type[N > 0 ? N : 1]; + +template +static Value make(const T &value) +{ +#ifdef __clang__ + Value result = MakeValue(value); + // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: + // https://github.com/fmtlib/fmt/issues/276 + (void)result.custom.format; + return result; +#else + return MakeValue(value); +#endif +} + }; + +template +struct ArgArray +{ + typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE + + template + static Arg make(const T &value) + { + return MakeArg(value); + } +}; + +#if FMT_USE_VARIADIC_TEMPLATES +template +inline uint64_t make_type(const Arg &first, const Args & ... tail) +{ + return make_type(first) | (make_type(tail...) << 4); +} + +#else + +struct ArgType +{ + uint64_t type; + + ArgType() : type(0) {} + + template + ArgType(const T &arg) : type(make_type(arg)) {} +}; + +# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() + +inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) +{ + return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | + (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | + (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | + (t12.type << 48) | (t13.type << 52) | (t14.type << 56); +} +#endif +} // namespace internal + +# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n +# define FMT_MAKE_ARG_TYPE(n) T##n +# define FMT_MAKE_ARG(n) const T##n &v##n +# define FMT_ASSIGN_char(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_ASSIGN_wchar_t(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) + +#if FMT_USE_VARIADIC_TEMPLATES +// Defines a variadic function returning void. +# define FMT_VARIADIC_VOID(func, arg_type) \ + template \ + void func(arg_type arg0, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +// Defines a variadic constructor. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +#else + +# define FMT_MAKE_REF(n) \ + fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_MAKE_REF2(n) v##n + +// Defines a wrapper for a function taking one argument of type arg_type +// and n additional arguments of arbitrary types. +# define FMT_WRAP1(func, arg_type, n) \ + template \ + inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic function returning void on a pre-C++11 compiler. +# define FMT_VARIADIC_VOID(func, arg_type) \ + inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ + FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ + FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ + FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ + FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ + FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) + +# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg0, arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic constructor on a pre-C++11 compiler. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) +#endif + +// Generates a comma-separated list with results of applying f to pairs +// (argument, index). +#define FMT_FOR_EACH1(f, x0) f(x0, 0) +#define FMT_FOR_EACH2(f, x0, x1) \ + FMT_FOR_EACH1(f, x0), f(x1, 1) +#define FMT_FOR_EACH3(f, x0, x1, x2) \ + FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) +#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ + FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) +#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ + FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) +#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ + FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) +#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ + FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) +#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ + FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) +#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ + FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) +#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) + +/** + An error returned by an operating system or a language runtime, + for example a file opening error. +*/ +class SystemError : public internal::RuntimeError +{ +private: + void init(int err_code, CStringRef format_str, ArgList args); + +protected: + int error_code_; + + typedef char Char; // For FMT_VARIADIC_CTOR. + + SystemError() {} + +public: + /** + \rst + Constructs a :class:`fmt::SystemError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is + the system message corresponding to the error code. + *error_code* is a system error code as given by ``errno``. + If *error_code* is not a valid error code such as -1, the system message + may look like "Unknown error -1" and is platform-dependent. + + **Example**:: + + // This throws a SystemError with the description + // cannot open file 'madeup': No such file or directory + // or similar (system message may vary). + const char *filename = "madeup"; + std::FILE *file = std::fopen(filename, "r"); + if (!file) + throw fmt::SystemError(errno, "cannot open file '{}'", filename); + \endrst + */ + SystemError(int error_code, CStringRef message) + { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) + + ~SystemError() throw(); + + int error_code() const + { + return error_code_; + } +}; + +/** + \rst + This template provides operations for formatting and writing data into + a character stream. The output is stored in a buffer provided by a subclass + such as :class:`fmt::BasicMemoryWriter`. + + You can use one of the following typedefs for common character types: + + +---------+----------------------+ + | Type | Definition | + +=========+======================+ + | Writer | BasicWriter | + +---------+----------------------+ + | WWriter | BasicWriter | + +---------+----------------------+ + + \endrst + */ +template +class BasicWriter +{ +private: + // Output buffer. + Buffer &buffer_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); + + typedef typename internal::CharTraits::CharPtr CharPtr; + +#if FMT_SECURE_SCL + // Returns pointer value. + static Char *get(CharPtr p) + { + return p.base(); + } +#else + static Char *get(Char *p) + { + return p; + } +#endif + + // Fills the padding around the content and returns the pointer to the + // content area. + static CharPtr fill_padding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); + + // Grows the buffer by n characters and returns a pointer to the newly + // allocated area. + CharPtr grow_buffer(std::size_t n) + { + std::size_t size = buffer_.size(); + buffer_.resize(size + n); + return internal::make_ptr(&buffer_[size], n); + } + + // Writes an unsigned decimal integer. + template + Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) + { + unsigned num_digits = internal::count_digits(value); + Char *ptr = get(grow_buffer(prefix_size + num_digits)); + internal::format_decimal(ptr + prefix_size, value, num_digits); + return ptr; + } + + // Writes a decimal integer. + template + void write_decimal(Int value) + { + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) + { + abs_value = 0 - abs_value; + *write_unsigned_decimal(abs_value, 1) = '-'; + } + else + { + write_unsigned_decimal(abs_value, 0); + } + } + + // Prepare a buffer for integer formatting. + CharPtr prepare_int_buffer(unsigned num_digits, + const EmptySpec &, const char *prefix, unsigned prefix_size) + { + unsigned size = prefix_size + num_digits; + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + + template + CharPtr prepare_int_buffer(unsigned num_digits, + const Spec &spec, const char *prefix, unsigned prefix_size); + + // Formats an integer. + template + void write_int(T value, Spec spec); + + // Formats a floating-point number (double or long double). + template + void write_double(T value, const FormatSpec &spec); + + // Writes a formatted string. + template + CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec); + + template + void write_str(const internal::Arg::StringValue &str, + const FormatSpec &spec); + + // This following methods are private to disallow writing wide characters + // and strings to a char stream. If you want to print a wide string as a + // pointer as std::ostream does, cast it to const void*. + // Do not implement! + void operator<<(typename internal::WCharHelper::Unsupported); + void operator<<( + typename internal::WCharHelper::Unsupported); + + // Appends floating-point length specifier to the format string. + // The second argument is only used for overload resolution. + void append_float_length(Char *&format_ptr, long double) + { + *format_ptr++ = 'L'; + } + + template + void append_float_length(Char *&, T) {} + + template + friend class internal::ArgFormatterBase; + + friend class internal::PrintfArgFormatter; + +protected: + /** + Constructs a ``BasicWriter`` object. + */ + explicit BasicWriter(Buffer &b) : buffer_(b) {} + +public: + /** + \rst + Destroys a ``BasicWriter`` object. + \endrst + */ + virtual ~BasicWriter() {} + + /** + Returns the total number of characters written. + */ + std::size_t size() const + { + return buffer_.size(); + } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const Char *data() const FMT_NOEXCEPT + { + return &buffer_[0]; + } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const Char *c_str() const + { + std::size_t size = buffer_.size(); + buffer_.reserve(size + 1); + buffer_[size] = '\0'; + return &buffer_[0]; + } + + /** + \rst + Returns the content of the output buffer as an `std::string`. + \endrst + */ + std::basic_string str() const + { + return std::basic_string(&buffer_[0], buffer_.size()); + } + + /** + \rst + Writes formatted data. + + *args* is an argument list representing arbitrary arguments. + + **Example**:: + + MemoryWriter out; + out.write("Current point:\n"); + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + Current point: + (-3.140000, +3.140000) + + The output can be accessed using :func:`data()`, :func:`c_str` or + :func:`str` methods. + + See also :ref:`syntax`. + \endrst + */ + void write(BasicCStringRef format, ArgList args) + { + BasicFormatter(args, *this).format(format); + } + FMT_VARIADIC_VOID(write, BasicCStringRef) + + BasicWriter &operator<<(int value) + { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned value) + { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(long value) + { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned long value) + { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(LongLong value) + { + write_decimal(value); + return *this; + } + + /** + \rst + Formats *value* and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(ULongLong value) + { + return *this << IntFormatSpec(value); + } + + BasicWriter &operator<<(double value) + { + write_double(value, FormatSpec()); + return *this; + } + + /** + \rst + Formats *value* using the general format for floating-point numbers + (``'g'``) and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(long double value) + { + write_double(value, FormatSpec()); + return *this; + } + + /** + Writes a character to the stream. + */ + BasicWriter &operator<<(char value) + { + buffer_.push_back(value); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) + { + buffer_.push_back(value); + return *this; + } + + /** + \rst + Writes *value* to the stream. + \endrst + */ + BasicWriter &operator<<(fmt::BasicStringRef value) + { + const Char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) + { + const char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + template + BasicWriter &operator<<(IntFormatSpec spec) + { + internal::CharTraits::convert(FillChar()); + write_int(spec.value(), spec); + return *this; + } + + template + BasicWriter &operator<<(const StrFormatSpec &spec) + { + const StrChar *s = spec.str(); + write_str(s, std::char_traits::length(s), spec); + return *this; + } + + void clear() FMT_NOEXCEPT { buffer_.clear(); } + + Buffer &buffer() FMT_NOEXCEPT { return buffer_; } +}; + +template +template +typename BasicWriter::CharPtr BasicWriter::write_str( + const StrChar *s, std::size_t size, const AlignSpec &spec) +{ + CharPtr out = CharPtr(); + if (spec.width() > size) + { + out = grow_buffer(spec.width()); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.align() == ALIGN_RIGHT) + { + std::uninitialized_fill_n(out, spec.width() - size, fill); + out += spec.width() - size; + } + else if (spec.align() == ALIGN_CENTER) + { + out = fill_padding(out, spec.width(), size, fill); + } + else + { + std::uninitialized_fill_n(out + size, spec.width() - size, fill); + } + } + else + { + out = grow_buffer(size); + } + std::uninitialized_copy(s, s + size, out); + return out; +} + +template +template +void BasicWriter::write_str( + const internal::Arg::StringValue &s, const FormatSpec &spec) +{ + // Check if StrChar is convertible to Char. + internal::CharTraits::convert(StrChar()); + if (spec.type_ && spec.type_ != 's') + internal::report_unknown_type(spec.type_, "string"); + const StrChar *str_value = s.value; + std::size_t str_size = s.size; + if (str_size == 0) + { + if (!str_value) + { + FMT_THROW(FormatError("string pointer is null")); + } + } + std::size_t precision = static_cast(spec.precision_); + if (spec.precision_ >= 0 && precision < str_size) + str_size = precision; + write_str(str_value, str_size, spec); +} + +template +typename BasicWriter::CharPtr +BasicWriter::fill_padding( + CharPtr buffer, unsigned total_size, + std::size_t content_size, wchar_t fill) +{ + std::size_t padding = total_size - content_size; + std::size_t left_padding = padding / 2; + Char fill_char = internal::CharTraits::cast(fill); + std::uninitialized_fill_n(buffer, left_padding, fill_char); + buffer += left_padding; + CharPtr content = buffer; + std::uninitialized_fill_n(buffer + content_size, + padding - left_padding, fill_char); + return content; +} + +template +template +typename BasicWriter::CharPtr +BasicWriter::prepare_int_buffer( + unsigned num_digits, const Spec &spec, + const char *prefix, unsigned prefix_size) +{ + unsigned width = spec.width(); + Alignment align = spec.align(); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.precision() > static_cast(num_digits)) + { + // Octal prefix '0' is counted as a digit, so ignore it if precision + // is specified. + if (prefix_size > 0 && prefix[prefix_size - 1] == '0') + --prefix_size; + unsigned number_size = + prefix_size + internal::to_unsigned(spec.precision()); + AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); + if (number_size >= width) + return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); + buffer_.reserve(width); + unsigned fill_size = width - number_size; + if (align != ALIGN_LEFT) + { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + CharPtr result = prepare_int_buffer( + num_digits, subspec, prefix, prefix_size); + if (align == ALIGN_LEFT) + { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + return result; + } + unsigned size = prefix_size + num_digits; + if (width <= size) + { + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + CharPtr p = grow_buffer(width); + CharPtr end = p + width; + if (align == ALIGN_LEFT) + { + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + std::uninitialized_fill(p, end, fill); + } + else if (align == ALIGN_CENTER) + { + p = fill_padding(p, width, size, fill); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + } + else + { + if (align == ALIGN_NUMERIC) + { + if (prefix_size != 0) + { + p = std::uninitialized_copy(prefix, prefix + prefix_size, p); + size -= prefix_size; + } + } + else + { + std::uninitialized_copy(prefix, prefix + prefix_size, end - size); + } + std::uninitialized_fill(p, end - size, fill); + p = end; + } + return p - 1; +} + +template +template +void BasicWriter::write_int(T value, Spec spec) +{ + unsigned prefix_size = 0; + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType abs_value = static_cast(value); + char prefix[4] = ""; + if (internal::is_negative(value)) + { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } + else if (spec.flag(SIGN_FLAG)) + { + prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; + ++prefix_size; + } + switch (spec.type()) + { + case 0: + case 'd': + { + unsigned num_digits = internal::count_digits(abs_value); + CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0); + break; + } + case 'x': + case 'X': + { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do + { + ++num_digits; + } + while ((n >>= 4) != 0); + Char *p = get(prepare_int_buffer( + num_digits, spec, prefix, prefix_size)); + n = abs_value; + const char *digits = spec.type() == 'x' ? + "0123456789abcdef" : "0123456789ABCDEF"; + do + { + *p-- = digits[n & 0xf]; + } + while ((n >>= 4) != 0); + break; + } + case 'b': + case 'B': + { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do + { + ++num_digits; + } + while ((n >>= 1) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do + { + *p-- = static_cast('0' + (n & 1)); + } + while ((n >>= 1) != 0); + break; + } + case 'o': + { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + prefix[prefix_size++] = '0'; + unsigned num_digits = 0; + do + { + ++num_digits; + } + while ((n >>= 3) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do + { + *p-- = static_cast('0' + (n & 7)); + } + while ((n >>= 3) != 0); + break; + } + case 'n': + { + unsigned num_digits = internal::count_digits(abs_value); + fmt::StringRef sep = ""; +#ifndef ANDROID + sep = internal::thousands_sep(std::localeconv()); +#endif + unsigned size = static_cast( + num_digits + sep.size() * ((num_digits - 1) / 3)); + CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep)); + break; + } + default: + internal::report_unknown_type( + spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); + break; + } +} + +template +template +void BasicWriter::write_double(T value, const FormatSpec &spec) +{ + // Check type. + char type = spec.type(); + bool upper = false; + switch (type) + { + case 0: + type = 'g'; + break; + case 'e': + case 'f': + case 'g': + case 'a': + break; + case 'F': +#if FMT_MSC_VER + // MSVC's printf doesn't support 'F'. + type = 'f'; +#endif + // Fall through. + case 'E': + case 'G': + case 'A': + upper = true; + break; + default: + internal::report_unknown_type(type, "double"); + break; + } + + char sign = 0; + // Use isnegative instead of value < 0 because the latter is always + // false for NaN. + if (internal::FPUtil::isnegative(static_cast(value))) + { + sign = '-'; + value = -value; + } + else if (spec.flag(SIGN_FLAG)) + { + sign = spec.flag(PLUS_FLAG) ? '+' : ' '; + } + + if (internal::FPUtil::isnotanumber(value)) + { + // Format NaN ourselves because sprintf's output is not consistent + // across platforms. + std::size_t nan_size = 4; + const char *nan = upper ? " NAN" : " nan"; + if (!sign) + { + --nan_size; + ++nan; + } + CharPtr out = write_str(nan, nan_size, spec); + if (sign) + *out = sign; + return; + } + + if (internal::FPUtil::isinfinity(value)) + { + // Format infinity ourselves because sprintf's output is not consistent + // across platforms. + std::size_t inf_size = 4; + const char *inf = upper ? " INF" : " inf"; + if (!sign) + { + --inf_size; + ++inf; + } + CharPtr out = write_str(inf, inf_size, spec); + if (sign) + *out = sign; + return; + } + + std::size_t offset = buffer_.size(); + unsigned width = spec.width(); + if (sign) + { + buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u)); + if (width > 0) + --width; + ++offset; + } + + // Build format string. + enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg + Char format[MAX_FORMAT_SIZE]; + Char *format_ptr = format; + *format_ptr++ = '%'; + unsigned width_for_sprintf = width; + if (spec.flag(HASH_FLAG)) + *format_ptr++ = '#'; + if (spec.align() == ALIGN_CENTER) + { + width_for_sprintf = 0; + } + else + { + if (spec.align() == ALIGN_LEFT) + *format_ptr++ = '-'; + if (width != 0) + *format_ptr++ = '*'; + } + if (spec.precision() >= 0) + { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + + append_float_length(format_ptr, value); + *format_ptr++ = type; + *format_ptr = '\0'; + + // Format using snprintf. + Char fill = internal::CharTraits::cast(spec.fill()); + unsigned n = 0; + Char *start = 0; + for (;;) + { + std::size_t buffer_size = buffer_.capacity() - offset; +#if FMT_MSC_VER + // MSVC's vsnprintf_s doesn't work with zero size, so reserve + // space for at least one extra character to make the size non-zero. + // Note that the buffer's capacity will increase by more than 1. + if (buffer_size == 0) + { + buffer_.reserve(offset + 1); + buffer_size = buffer_.capacity() - offset; + } +#endif + start = &buffer_[offset]; + int result = internal::CharTraits::format_float( + start, buffer_size, format, width_for_sprintf, spec.precision(), value); + if (result >= 0) + { + n = internal::to_unsigned(result); + if (offset + n < buffer_.capacity()) + break; // The buffer is large enough - continue with formatting. + buffer_.reserve(offset + n + 1); + } + else + { + // If result is negative we ask to increase the capacity by at least 1, + // but as std::vector, the buffer grows exponentially. + buffer_.reserve(buffer_.capacity() + 1); + } + } + if (sign) + { + if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || + *start != ' ') + { + *(start - 1) = sign; + sign = 0; + } + else + { + *(start - 1) = fill; + } + ++n; + } + if (spec.align() == ALIGN_CENTER && spec.width() > n) + { + width = spec.width(); + CharPtr p = grow_buffer(width); + std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); + fill_padding(p, spec.width(), n, fill); + return; + } + if (spec.fill() != ' ' || sign) + { + while (*start == ' ') + *start++ = fill; + if (sign) + *(start - 1) = sign; + } + grow_buffer(n); +} + +/** + \rst + This class template provides operations for formatting and writing data + into a character stream. The output is stored in a memory buffer that grows + dynamically. + + You can use one of the following typedefs for common character types + and the standard allocator: + + +---------------+-----------------------------------------------------+ + | Type | Definition | + +===============+=====================================================+ + | MemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + | WMemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + + **Example**:: + + MemoryWriter out; + out << "The answer is " << 42 << "\n"; + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42 + (-3.140000, +3.140000) + + The output can be converted to an ``std::string`` with ``out.str()`` or + accessed as a C string with ``out.c_str()``. + \endrst + */ +template > +class BasicMemoryWriter : public BasicWriter +{ +private: + internal::MemoryBuffer buffer_; + +public: + explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) + : BasicWriter(buffer_), buffer_(alloc) {} + +#if FMT_USE_RVALUE_REFERENCES + /** + \rst + Constructs a :class:`fmt::BasicMemoryWriter` object moving the content + of the other object to it. + \endrst + */ + BasicMemoryWriter(BasicMemoryWriter &&other) + : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) + { + } + + /** + \rst + Moves the content of the other ``BasicMemoryWriter`` object to this one. + \endrst + */ + BasicMemoryWriter &operator=(BasicMemoryWriter &&other) + { + buffer_ = std::move(other.buffer_); + return *this; + } +#endif +}; + +typedef BasicMemoryWriter MemoryWriter; +typedef BasicMemoryWriter WMemoryWriter; + +/** + \rst + This class template provides operations for formatting and writing data + into a fixed-size array. For writing into a dynamically growing buffer + use :class:`fmt::BasicMemoryWriter`. + + Any write method will throw ``std::runtime_error`` if the output doesn't fit + into the array. + + You can use one of the following typedefs for common character types: + + +--------------+---------------------------+ + | Type | Definition | + +==============+===========================+ + | ArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + | WArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + \endrst + */ +template +class BasicArrayWriter : public BasicWriter +{ +private: + internal::FixedBuffer buffer_; + +public: + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + given size. + \endrst + */ + BasicArrayWriter(Char *array, std::size_t size) + : BasicWriter(buffer_), buffer_(array, size) {} + + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + size known at compile time. + \endrst + */ + template + explicit BasicArrayWriter(Char (&array)[SIZE]) + : BasicWriter(buffer_), buffer_(array, SIZE) {} +}; + +typedef BasicArrayWriter ArrayWriter; +typedef BasicArrayWriter WArrayWriter; + +// Reports a system error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_system_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#if FMT_USE_WINDOWS_H + +/** A Windows error. */ +class WindowsError : public SystemError +{ +private: + FMT_API void init(int error_code, CStringRef format_str, ArgList args); + +public: + /** + \rst + Constructs a :class:`fmt::WindowsError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is the + system message corresponding to the error code. + *error_code* is a Windows error code as given by ``GetLastError``. + If *error_code* is not a valid error code such as -1, the system message + will look like "error -1". + + **Example**:: + + // This throws a WindowsError with the description + // cannot open file 'madeup': The system cannot find the file specified. + // or similar (system message may vary). + const char *filename = "madeup"; + LPOFSTRUCT of = LPOFSTRUCT(); + HFILE file = OpenFile(filename, &of, OF_READ); + if (file == HFILE_ERROR) { + throw fmt::WindowsError(GetLastError(), + "cannot open file '{}'", filename); + } + \endrst + */ + WindowsError(int error_code, CStringRef message) + { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) +}; + +// Reports a Windows error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_windows_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#endif + +enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; + +/** + Formats a string and prints it to stdout using ANSI escape sequences + to specify color (experimental). + Example: + print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); + */ +FMT_API void print_colored(Color c, CStringRef format, ArgList args); + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = format("The answer is {}", 42); + \endrst +*/ +inline std::string format(CStringRef format_str, ArgList args) +{ + MemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +inline std::wstring format(WCStringRef format_str, ArgList args) +{ + WMemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + print(stderr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +FMT_API void print(CStringRef format_str, ArgList args); + +template +void printf(BasicWriter &w, BasicCStringRef format, ArgList args) +{ + internal::PrintfFormatter(args).format(w, format); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = fmt::sprintf("The answer is %d", 42); + \endrst +*/ +inline std::string sprintf(CStringRef format, ArgList args) +{ + MemoryWriter w; + printf(w, format, args); + return w.str(); +} + +inline std::wstring sprintf(WCStringRef format, ArgList args) +{ + WMemoryWriter w; + printf(w, format, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + fmt::fprintf(stderr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + fmt::printf("Elapsed time: %.2f seconds", 1.23); + \endrst + */ +inline int printf(CStringRef format, ArgList args) +{ + return fprintf(stdout, format, args); +} + +/** + Fast integer formatter. + */ +class FormatInt +{ +private: + // Buffer should be large enough to hold all digits (digits10 + 1), + // a sign and a null character. + enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; + mutable char buffer_[BUFFER_SIZE]; + char *str_; + + // Formats value in reverse and returns the number of digits. + char *format_decimal(ULongLong value) + { + char *buffer_end = buffer_ + BUFFER_SIZE - 1; + while (value >= 100) + { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + } + if (value < 10) + { + *--buffer_end = static_cast('0' + value); + return buffer_end; + } + unsigned index = static_cast(value * 2); + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + return buffer_end; + } + + void FormatSigned(LongLong value) + { + ULongLong abs_value = static_cast(value); + bool negative = value < 0; + if (negative) + abs_value = 0 - abs_value; + str_ = format_decimal(abs_value); + if (negative) + *--str_ = '-'; + } + +public: + explicit FormatInt(int value) + { + FormatSigned(value); + } + explicit FormatInt(long value) + { + FormatSigned(value); + } + explicit FormatInt(LongLong value) + { + FormatSigned(value); + } + explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} + explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} + explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} + + /** Returns the number of characters written to the output buffer. */ + std::size_t size() const + { + return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); + } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const char *data() const + { + return str_; + } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const char *c_str() const + { + buffer_[BUFFER_SIZE - 1] = '\0'; + return str_; + } + + /** + \rst + Returns the content of the output buffer as an ``std::string``. + \endrst + */ + std::string str() const + { + return std::string(str_, size()); + } +}; + +// Formats a decimal integer value writing into buffer and returns +// a pointer to the end of the formatted string. This function doesn't +// write a terminating null character. +template +inline void format_decimal(char *&buffer, T value) +{ + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) + { + *buffer++ = '-'; + abs_value = 0 - abs_value; + } + if (abs_value < 100) + { + if (abs_value < 10) + { + *buffer++ = static_cast('0' + abs_value); + return; + } + unsigned index = static_cast(abs_value * 2); + *buffer++ = internal::Data::DIGITS[index]; + *buffer++ = internal::Data::DIGITS[index + 1]; + return; + } + unsigned num_digits = internal::count_digits(abs_value); + internal::format_decimal(buffer, abs_value, num_digits); + buffer += num_digits; +} + +/** + \rst + Returns a named argument for formatting functions. + + **Example**:: + + print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); + + \endrst + */ +template +inline internal::NamedArg arg(StringRef name, const T &arg) +{ + return internal::NamedArg(name, arg); +} + +template +inline internal::NamedArg arg(WStringRef name, const T &arg) +{ + return internal::NamedArg(name, arg); +} + +// The following two functions are deleted intentionally to disable +// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. +template +void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +template +void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +} + +#if FMT_GCC_VERSION +// Use the system_header pragma to suppress warnings about variadic macros +// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't +// work. It is used at the end because we want to suppress as little warnings +// as possible. +# pragma GCC system_header +#endif + +// This is used to work around VC++ bugs in handling variadic macros. +#define FMT_EXPAND(args) args + +// Returns the number of arguments. +// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. +#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) +#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) +#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define FMT_CONCAT(a, b) a##b +#define FMT_FOR_EACH_(N, f, ...) \ + FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) +#define FMT_FOR_EACH(f, ...) \ + FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) + +#define FMT_ADD_ARG_NAME(type, index) type arg##index +#define FMT_GET_ARG_NAME(type, index) arg##index + +#if FMT_USE_VARIADIC_TEMPLATES +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + template \ + ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ + fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } +#else +// Defines a wrapper for a function taking __VA_ARGS__ arguments +// and n additional arguments of arbitrary types. +# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ + template \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + FMT_GEN(n, FMT_MAKE_ARG)) { \ + fmt::internal::ArgArray::Type arr; \ + FMT_GEN(n, FMT_ASSIGN_##Char); \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ + } + +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ + } \ + FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) +#endif // FMT_USE_VARIADIC_TEMPLATES + +/** + \rst + Defines a variadic function with the specified return type, function name + and argument types passed as variable arguments to this macro. + + **Example**:: + + void print_error(const char *file, int line, const char *format, + fmt::ArgList args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args); + } + FMT_VARIADIC(void, print_error, const char *, int, const char *) + + ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that + don't implement variadic templates. You don't have to use this macro if + you don't need legacy compiler support and can use variadic templates + directly:: + + template + void print_error(const char *file, int line, const char *format, + const Args & ... args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args...); + } + \endrst + */ +#define FMT_VARIADIC(ReturnType, func, ...) \ + FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_VARIADIC_W(ReturnType, func, ...) \ + FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) + +#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) + +/** + \rst + Convenient macro to capture the arguments' names and values into several + ``fmt::arg(name, value)``. + + **Example**:: + + int x = 1, y = 2; + print("point: ({x}, {y})", FMT_CAPTURE(x, y)); + // same as: + // print("point: ({x}, {y})", arg("x", x), arg("y", y)); + + \endrst + */ +#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) + +#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) + +namespace fmt +{ +FMT_VARIADIC(std::string, format, CStringRef) +FMT_VARIADIC_W(std::wstring, format, WCStringRef) +FMT_VARIADIC(void, print, CStringRef) +FMT_VARIADIC(void, print, std::FILE *, CStringRef) + +FMT_VARIADIC(void, print_colored, Color, CStringRef) +FMT_VARIADIC(std::string, sprintf, CStringRef) +FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) +FMT_VARIADIC(int, printf, CStringRef) +FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) + +namespace internal +{ +template +inline bool is_name_start(Char c) +{ + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +// Parses an unsigned integer advancing s to the end of the parsed input. +// This function assumes that the first character of s is a digit. +template +unsigned parse_nonnegative_int(const Char *&s) +{ + assert('0' <= *s && *s <= '9'); + unsigned value = 0; + do + { + unsigned new_value = value * 10 + (*s++ - '0'); + // Check if value wrapped around. + if (new_value < value) + { + value = (std::numeric_limits::max)(); + break; + } + value = new_value; + } + while ('0' <= *s && *s <= '9'); + // Convert to unsigned to prevent a warning. + unsigned max_int = (std::numeric_limits::max)(); + if (value > max_int) + FMT_THROW(FormatError("number is too big")); + return value; +} + +inline void require_numeric_argument(const Arg &arg, char spec) +{ + if (arg.type > Arg::LAST_NUMERIC_TYPE) + { + std::string message = + fmt::format("format specifier '{}' requires numeric argument", spec); + FMT_THROW(fmt::FormatError(message)); + } +} + +template +void check_sign(const Char *&s, const Arg &arg) +{ + char sign = static_cast(*s); + require_numeric_argument(arg, sign); + if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) + { + FMT_THROW(FormatError(fmt::format( + "format specifier '{}' requires signed argument", sign))); + } + ++s; +} +} // namespace internal + +template +inline internal::Arg BasicFormatter::get_arg( + BasicStringRef arg_name, const char *&error) +{ + if (check_no_auto_index(error)) + { + map_.init(args()); + const internal::Arg *arg = map_.find(arg_name); + if (arg) + return *arg; + error = "argument not found"; + } + return internal::Arg(); +} + +template +inline internal::Arg BasicFormatter::parse_arg_index(const Char *&s) +{ + const char *error = 0; + internal::Arg arg = *s < '0' || *s > '9' ? + next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error); + if (error) + { + FMT_THROW(FormatError( + *s != '}' && *s != ':' ? "invalid format string" : error)); + } + return arg; +} + +template +inline internal::Arg BasicFormatter::parse_arg_name(const Char *&s) +{ + assert(internal::is_name_start(*s)); + const Char *start = s; + Char c; + do + { + c = *++s; + } + while (internal::is_name_start(c) || ('0' <= c && c <= '9')); + const char *error = 0; + internal::Arg arg = get_arg(BasicStringRef(start, s - start), error); + if (error) + FMT_THROW(FormatError(error)); + return arg; +} + +template +const Char *BasicFormatter::format( + const Char *&format_str, const internal::Arg &arg) +{ + using internal::Arg; + const Char *s = format_str; + FormatSpec spec; + if (*s == ':') + { + if (arg.type == Arg::CUSTOM) + { + arg.custom.format(this, arg.custom.value, &s); + return s; + } + ++s; + // Parse fill and alignment. + if (Char c = *s) + { + const Char *p = s + 1; + spec.align_ = ALIGN_DEFAULT; + do + { + switch (*p) + { + case '<': + spec.align_ = ALIGN_LEFT; + break; + case '>': + spec.align_ = ALIGN_RIGHT; + break; + case '=': + spec.align_ = ALIGN_NUMERIC; + break; + case '^': + spec.align_ = ALIGN_CENTER; + break; + } + if (spec.align_ != ALIGN_DEFAULT) + { + if (p != s) + { + if (c == '}') break; + if (c == '{') + FMT_THROW(FormatError("invalid fill character '{'")); + s += 2; + spec.fill_ = c; + } + else ++s; + if (spec.align_ == ALIGN_NUMERIC) + require_numeric_argument(arg, '='); + break; + } + } + while (--p >= s); + } + + // Parse sign. + switch (*s) + { + case '+': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '-': + check_sign(s, arg); + spec.flags_ |= MINUS_FLAG; + break; + case ' ': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG; + break; + } + + if (*s == '#') + { + require_numeric_argument(arg, '#'); + spec.flags_ |= HASH_FLAG; + ++s; + } + + // Parse zero flag. + if (*s == '0') + { + require_numeric_argument(arg, '0'); + spec.align_ = ALIGN_NUMERIC; + spec.fill_ = '0'; + ++s; + } + + // Parse width. + if ('0' <= *s && *s <= '9') + { + spec.width_ = internal::parse_nonnegative_int(s); + } + else if (*s == '{') + { + ++s; + Arg width_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (width_arg.type) + { + case Arg::INT: + if (width_arg.int_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.int_value; + break; + case Arg::UINT: + value = width_arg.uint_value; + break; + case Arg::LONG_LONG: + if (width_arg.long_long_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = width_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("width is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.width_ = static_cast(value); + } + + // Parse precision. + if (*s == '.') + { + ++s; + spec.precision_ = 0; + if ('0' <= *s && *s <= '9') + { + spec.precision_ = internal::parse_nonnegative_int(s); + } + else if (*s == '{') + { + ++s; + Arg precision_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (precision_arg.type) + { + case Arg::INT: + if (precision_arg.int_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.int_value; + break; + case Arg::UINT: + value = precision_arg.uint_value; + break; + case Arg::LONG_LONG: + if (precision_arg.long_long_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = precision_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("precision is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.precision_ = static_cast(value); + } + else + { + FMT_THROW(FormatError("missing precision specifier")); + } + if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) + { + FMT_THROW(FormatError( + fmt::format("precision not allowed in {} format specifier", + arg.type == Arg::POINTER ? "pointer" : "integer"))); + } + } + + // Parse type. + if (*s != '}' && *s) + spec.type_ = static_cast(*s++); + } + + if (*s++ != '}') + FMT_THROW(FormatError("missing '}' in format string")); + + // Format argument. + ArgFormatter(*this, spec, s - 1).visit(arg); + return s; +} + +template +void BasicFormatter::format(BasicCStringRef format_str) +{ + const Char *s = format_str.c_str(); + const Char *start = s; + while (*s) + { + Char c = *s++; + if (c != '{' && c != '}') continue; + if (*s == c) + { + write(writer_, start, s); + start = ++s; + continue; + } + if (c == '}') + FMT_THROW(FormatError("unmatched '}' in format string")); + write(writer_, start, s - 1); + internal::Arg arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + start = s = format(s, arg); + } + write(writer_, start, s); +} +} // namespace fmt + +#if FMT_USE_USER_DEFINED_LITERALS +namespace fmt +{ +namespace internal +{ + +template +struct UdlFormat +{ + const Char *str; + + template + auto operator()(Args && ... args) const + -> decltype(format(str, std::forward(args)...)) + { + return format(str, std::forward(args)...); + } +}; + +template +struct UdlArg +{ + const Char *str; + + template + NamedArg operator=(T &&value) const + { + return {str, std::forward(value)}; + } +}; + +} // namespace internal + +inline namespace literals +{ + +/** + \rst + C++11 literal equivalent of :func:`fmt::format`. + + **Example**:: + + using namespace fmt::literals; + std::string message = "The answer is {}"_format(42); + \endrst + */ +inline internal::UdlFormat +operator"" _format(const char *s, std::size_t) +{ + return {s}; +} +inline internal::UdlFormat +operator"" _format(const wchar_t *s, std::size_t) +{ + return {s}; +} + +/** + \rst + C++11 literal equivalent of :func:`fmt::arg`. + + **Example**:: + + using namespace fmt::literals; + print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); + \endrst + */ +inline internal::UdlArg +operator"" _a(const char *s, std::size_t) +{ + return {s}; +} +inline internal::UdlArg +operator"" _a(const wchar_t *s, std::size_t) +{ + return {s}; +} + +} // inline namespace literals +} // namespace fmt +#endif // FMT_USE_USER_DEFINED_LITERALS + +// Restore warnings. +#if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic pop +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic pop +#endif + +#ifdef FMT_HEADER_ONLY +# define FMT_FUNC inline +# include "format.cc" +#else +# define FMT_FUNC +#endif + +#endif // FMT_FORMAT_H_ diff --git a/wasserstein/include/spdlog/fmt/bundled/ostream.cc b/wasserstein/include/spdlog/fmt/bundled/ostream.cc new file mode 100644 index 0000000..bcb67fe --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/ostream.cc @@ -0,0 +1,43 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#include "ostream.h" + +namespace fmt { + +namespace { +// Write the content of w to os. +void write(std::ostream &os, Writer &w) { + const char *data = w.data(); + typedef internal::MakeUnsigned::Type UnsignedStreamSize; + UnsignedStreamSize size = w.size(); + UnsignedStreamSize max_size = + internal::to_unsigned((std::numeric_limits::max)()); + do { + UnsignedStreamSize n = size <= max_size ? size : max_size; + os.write(data, static_cast(n)); + data += n; + size -= n; + } while (size != 0); +} +} + +FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + write(os, w); +} + +FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + write(os, w); + return static_cast(w.size()); +} +} // namespace fmt diff --git a/wasserstein/include/spdlog/fmt/bundled/ostream.h b/wasserstein/include/spdlog/fmt/bundled/ostream.h new file mode 100644 index 0000000..c52646d --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/ostream.h @@ -0,0 +1,126 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_OSTREAM_H_ +#define FMT_OSTREAM_H_ + +#include "format.h" +#include + +namespace fmt +{ + +namespace internal +{ + +template +class FormatBuf : public std::basic_streambuf +{ +private: + typedef typename std::basic_streambuf::int_type int_type; + typedef typename std::basic_streambuf::traits_type traits_type; + + Buffer &buffer_; + Char *start_; + +public: + FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) + { + this->setp(start_, start_ + buffer_.capacity()); + } + + int_type overflow(int_type ch = traits_type::eof()) + { + if (!traits_type::eq_int_type(ch, traits_type::eof())) + { + size_t buf_size = size(); + buffer_.resize(buf_size); + buffer_.reserve(buf_size * 2); + + start_ = &buffer_[0]; + start_[buf_size] = traits_type::to_char_type(ch); + this->setp(start_+ buf_size + 1, start_ + buf_size * 2); + } + return ch; + } + + size_t size() const + { + return to_unsigned(this->pptr() - start_); + } +}; + +Yes &convert(std::ostream &); + +struct DummyStream : std::ostream +{ + DummyStream(); // Suppress a bogus warning in MSVC. + // Hide all operator<< overloads from std::ostream. + void operator<<(Null<>); +}; + +No &operator<<(std::ostream &, int); + +template +struct ConvertToIntImpl +{ + // Convert to int only if T doesn't have an overloaded operator<<. + enum + { + value = sizeof(convert(get() << get())) == sizeof(No) + }; +}; +} // namespace internal + +// Formats a value. +template +void format(BasicFormatter &f, + const Char *&format_str, const T &value) +{ + internal::MemoryBuffer buffer; + + internal::FormatBuf format_buf(buffer); + std::basic_ostream output(&format_buf); + output << value; + + BasicStringRef str(&buffer[0], format_buf.size()); + typedef internal::MakeArg< BasicFormatter > MakeArg; + format_str = f.format(format_str, MakeArg(str)); +} + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + print(cerr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(void, print, std::ostream &, CStringRef) + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + fprintf(cerr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) +} // namespace fmt + +#ifdef FMT_HEADER_ONLY +# include "ostream.cc" +#endif + +#endif // FMT_OSTREAM_H_ diff --git a/wasserstein/include/spdlog/fmt/bundled/posix.cc b/wasserstein/include/spdlog/fmt/bundled/posix.cc new file mode 100644 index 0000000..76eb7f0 --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/posix.cc @@ -0,0 +1,238 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +// Disable bogus MSVC warnings. +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +#include "posix.h" + +#include +#include +#include + +#ifndef _WIN32 +# include +#else +# include +# include + +# define O_CREAT _O_CREAT +# define O_TRUNC _O_TRUNC + +# ifndef S_IRUSR +# define S_IRUSR _S_IREAD +# endif + +# ifndef S_IWUSR +# define S_IWUSR _S_IWRITE +# endif + +# ifdef __MINGW32__ +# define _SH_DENYNO 0x40 +# endif + +#endif // _WIN32 + +#ifdef fileno +# undef fileno +#endif + +namespace { +#ifdef _WIN32 +// Return type of read and write functions. +typedef int RWResult; + +// On Windows the count argument to read and write is unsigned, so convert +// it from size_t preventing integer overflow. +inline unsigned convert_rwcount(std::size_t count) { + return count <= UINT_MAX ? static_cast(count) : UINT_MAX; +} +#else +// Return type of read and write functions. +typedef ssize_t RWResult; + +inline std::size_t convert_rwcount(std::size_t count) { return count; } +#endif +} + +fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT { + if (file_ && FMT_SYSTEM(fclose(file_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +fmt::BufferedFile::BufferedFile( + fmt::CStringRef filename, fmt::CStringRef mode) { + FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0); + if (!file_) + FMT_THROW(SystemError(errno, "cannot open file {}", filename)); +} + +void fmt::BufferedFile::close() { + if (!file_) + return; + int result = FMT_SYSTEM(fclose(file_)); + file_ = 0; + if (result != 0) + FMT_THROW(SystemError(errno, "cannot close file")); +} + +// A macro used to prevent expansion of fileno on broken versions of MinGW. +#define FMT_ARGS + +int fmt::BufferedFile::fileno() const { + int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_)); + if (fd == -1) + FMT_THROW(SystemError(errno, "cannot get file descriptor")); + return fd; +} + +fmt::File::File(fmt::CStringRef path, int oflag) { + int mode = S_IRUSR | S_IWUSR; +#if defined(_WIN32) && !defined(__MINGW32__) + fd_ = -1; + FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode)); +#else + FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode))); +#endif + if (fd_ == -1) + FMT_THROW(SystemError(errno, "cannot open file {}", path)); +} + +fmt::File::~File() FMT_NOEXCEPT { + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +void fmt::File::close() { + if (fd_ == -1) + return; + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + int result = FMT_POSIX_CALL(close(fd_)); + fd_ = -1; + if (result != 0) + FMT_THROW(SystemError(errno, "cannot close file")); +} + +fmt::LongLong fmt::File::size() const { +#ifdef _WIN32 + // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT + // is less than 0x0500 as is the case with some default MinGW builds. + // Both functions support large file sizes. + DWORD size_upper = 0; + HANDLE handle = reinterpret_cast(_get_osfhandle(fd_)); + DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper)); + if (size_lower == INVALID_FILE_SIZE) { + DWORD error = GetLastError(); + if (error != NO_ERROR) + FMT_THROW(WindowsError(GetLastError(), "cannot get file size")); + } + fmt::ULongLong long_size = size_upper; + return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower; +#else + typedef struct stat Stat; + Stat file_stat = Stat(); + if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1) + FMT_THROW(SystemError(errno, "cannot get file attributes")); + FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size), + "return type of File::size is not large enough"); + return file_stat.st_size; +#endif +} + +std::size_t fmt::File::read(void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + FMT_THROW(SystemError(errno, "cannot read from file")); + return internal::to_unsigned(result); +} + +std::size_t fmt::File::write(const void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + FMT_THROW(SystemError(errno, "cannot write to file")); + return internal::to_unsigned(result); +} + +fmt::File fmt::File::dup(int fd) { + // Don't retry as dup doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html + int new_fd = FMT_POSIX_CALL(dup(fd)); + if (new_fd == -1) + FMT_THROW(SystemError(errno, "cannot duplicate file descriptor {}", fd)); + return File(new_fd); +} + +void fmt::File::dup2(int fd) { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) { + FMT_THROW(SystemError(errno, + "cannot duplicate file descriptor {} to {}", fd_, fd)); + } +} + +void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) + ec = ErrorCode(errno); +} + +void fmt::File::pipe(File &read_end, File &write_end) { + // Close the descriptors first to make sure that assignments don't throw + // and there are no leaks. + read_end.close(); + write_end.close(); + int fds[2] = {}; +#ifdef _WIN32 + // Make the default pipe capacity same as on Linux 2.6.11+. + enum { DEFAULT_CAPACITY = 65536 }; + int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY)); +#else + // Don't retry as the pipe function doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html + int result = FMT_POSIX_CALL(pipe(fds)); +#endif + if (result != 0) + FMT_THROW(SystemError(errno, "cannot create pipe")); + // The following assignments don't throw because read_fd and write_fd + // are closed. + read_end = File(fds[0]); + write_end = File(fds[1]); +} + +fmt::BufferedFile fmt::File::fdopen(const char *mode) { + // Don't retry as fdopen doesn't return EINTR. + FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode)); + if (!f) + FMT_THROW(SystemError(errno, "cannot associate stream with file descriptor")); + BufferedFile file(f); + fd_ = -1; + return file; +} + +long fmt::getpagesize() { +#ifdef _WIN32 + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +#else + long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE)); + if (size < 0) + FMT_THROW(SystemError(errno, "cannot get memory page size")); + return size; +#endif +} diff --git a/wasserstein/include/spdlog/fmt/bundled/posix.h b/wasserstein/include/spdlog/fmt/bundled/posix.h new file mode 100644 index 0000000..859fcaa --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/posix.h @@ -0,0 +1,443 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_POSIX_H_ +#define FMT_POSIX_H_ + +#if defined(__MINGW32__) || defined(__CYGWIN__) +// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/. +# undef __STRICT_ANSI__ +#endif + +#include +#include // for O_RDONLY +#include // for locale_t +#include +#include // for strtod_l + +#include + +#if defined __APPLE__ || defined(__FreeBSD__) +# include // for LC_NUMERIC_MASK on OS X +#endif + +#include "format.h" + +#ifndef FMT_POSIX +# if defined(_WIN32) && !defined(__MINGW32__) +// Fix warnings about deprecated symbols. +# define FMT_POSIX(call) _##call +# else +# define FMT_POSIX(call) call +# endif +#endif + +// Calls to system functions are wrapped in FMT_SYSTEM for testability. +#ifdef FMT_SYSTEM +# define FMT_POSIX_CALL(call) FMT_SYSTEM(call) +#else +# define FMT_SYSTEM(call) call +# ifdef _WIN32 +// Fix warnings about deprecated symbols. +# define FMT_POSIX_CALL(call) ::_##call +# else +# define FMT_POSIX_CALL(call) ::call +# endif +#endif + +#if FMT_GCC_VERSION >= 407 +# define FMT_UNUSED __attribute__((unused)) +#else +# define FMT_UNUSED +#endif + +#ifndef FMT_USE_STATIC_ASSERT +# define FMT_USE_STATIC_ASSERT 0 +#endif + +#if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600 +# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message) +#else +# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b) +# define FMT_STATIC_ASSERT(cond, message) \ + typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED +#endif + +// Retries the expression while it evaluates to error_result and errno +// equals to EINTR. +#ifndef _WIN32 +# define FMT_RETRY_VAL(result, expression, error_result) \ + do { \ + result = (expression); \ + } while (result == error_result && errno == EINTR) +#else +# define FMT_RETRY_VAL(result, expression, error_result) result = (expression) +#endif + +#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1) + +namespace fmt +{ + +// An error code. +class ErrorCode +{ +private: + int value_; + +public: +explicit ErrorCode(int value = 0) FMT_NOEXCEPT : + value_(value) {} + + int get() const FMT_NOEXCEPT + { + return value_; + } +}; + +// A buffered file. +class BufferedFile +{ +private: + FILE *file_; + + friend class File; + + explicit BufferedFile(FILE *f) : file_(f) {} + +public: + // Constructs a BufferedFile object which doesn't represent any file. +BufferedFile() FMT_NOEXCEPT : + file_(0) {} + + // Destroys the object closing the file it represents if any. + ~BufferedFile() FMT_NOEXCEPT; + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + +private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy + { + FILE *file; + }; + +public: + // A "move constructor" for moving from a temporary. +BufferedFile(Proxy p) FMT_NOEXCEPT : + file_(p.file) {} + + // A "move constructor" for moving from an lvalue. +BufferedFile(BufferedFile &f) FMT_NOEXCEPT : + file_(f.file_) + { + f.file_ = 0; + } + + // A "move assignment operator" for moving from a temporary. + BufferedFile &operator=(Proxy p) + { + close(); + file_ = p.file; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + BufferedFile &operator=(BufferedFile &other) + { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // BufferedFile file = BufferedFile(...); + operator Proxy() FMT_NOEXCEPT + { + Proxy p = {file_}; + file_ = 0; + return p; + } + +#else +private: + FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile); + +public: +BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : + file_(other.file_) + { + other.file_ = 0; + } + + BufferedFile& operator=(BufferedFile &&other) + { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } +#endif + + // Opens a file. + BufferedFile(CStringRef filename, CStringRef mode); + + // Closes the file. + void close(); + + // Returns the pointer to a FILE object representing this file. + FILE *get() const FMT_NOEXCEPT + { + return file_; + } + + // We place parentheses around fileno to workaround a bug in some versions + // of MinGW that define fileno as a macro. + int (fileno)() const; + + void print(CStringRef format_str, const ArgList &args) + { + fmt::print(file_, format_str, args); + } + FMT_VARIADIC(void, print, CStringRef) +}; + +// A file. Closed file is represented by a File object with descriptor -1. +// Methods that are not declared with FMT_NOEXCEPT may throw +// fmt::SystemError in case of failure. Note that some errors such as +// closing the file multiple times will cause a crash on Windows rather +// than an exception. You can get standard behavior by overriding the +// invalid parameter handler with _set_invalid_parameter_handler. +class File +{ +private: + int fd_; // File descriptor. + + // Constructs a File object with a given descriptor. + explicit File(int fd) : fd_(fd) {} + +public: + // Possible values for the oflag argument to the constructor. + enum + { + RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only. + WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only. + RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing. + }; + + // Constructs a File object which doesn't represent any file. +File() FMT_NOEXCEPT : + fd_(-1) {} + + // Opens a file and constructs a File object representing this file. + File(CStringRef path, int oflag); + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + +private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy + { + int fd; + }; + +public: + // A "move constructor" for moving from a temporary. +File(Proxy p) FMT_NOEXCEPT : + fd_(p.fd) {} + + // A "move constructor" for moving from an lvalue. +File(File &other) FMT_NOEXCEPT : + fd_(other.fd_) + { + other.fd_ = -1; + } + + // A "move assignment operator" for moving from a temporary. + File &operator=(Proxy p) + { + close(); + fd_ = p.fd; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + File &operator=(File &other) + { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // File file = File(...); + operator Proxy() FMT_NOEXCEPT + { + Proxy p = {fd_}; + fd_ = -1; + return p; + } + +#else +private: + FMT_DISALLOW_COPY_AND_ASSIGN(File); + +public: +File(File &&other) FMT_NOEXCEPT : + fd_(other.fd_) + { + other.fd_ = -1; + } + + File& operator=(File &&other) + { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } +#endif + + // Destroys the object closing the file it represents if any. + ~File() FMT_NOEXCEPT; + + // Returns the file descriptor. + int descriptor() const FMT_NOEXCEPT + { + return fd_; + } + + // Closes the file. + void close(); + + // Returns the file size. The size has signed type for consistency with + // stat::st_size. + LongLong size() const; + + // Attempts to read count bytes from the file into the specified buffer. + std::size_t read(void *buffer, std::size_t count); + + // Attempts to write count bytes from the specified buffer to the file. + std::size_t write(const void *buffer, std::size_t count); + + // Duplicates a file descriptor with the dup function and returns + // the duplicate as a file object. + static File dup(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; + + // Creates a pipe setting up read_end and write_end file objects for reading + // and writing respectively. + static void pipe(File &read_end, File &write_end); + + // Creates a BufferedFile object associated with this file and detaches + // this File object from the file. + BufferedFile fdopen(const char *mode); +}; + +// Returns the memory page size. +long getpagesize(); + +#if (defined(LC_NUMERIC_MASK) || defined(_MSC_VER)) && \ + !defined(__ANDROID__) && !defined(__CYGWIN__) +# define FMT_LOCALE +#endif + +#ifdef FMT_LOCALE +// A "C" numeric locale. +class Locale +{ +private: +# ifdef _MSC_VER + typedef _locale_t locale_t; + + enum { LC_NUMERIC_MASK = LC_NUMERIC }; + + static locale_t newlocale(int category_mask, const char *locale, locale_t) + { + return _create_locale(category_mask, locale); + } + + static void freelocale(locale_t locale) + { + _free_locale(locale); + } + + static double strtod_l(const char *nptr, char **endptr, _locale_t locale) + { + return _strtod_l(nptr, endptr, locale); + } +# endif + + locale_t locale_; + + FMT_DISALLOW_COPY_AND_ASSIGN(Locale); + +public: + typedef locale_t Type; + + Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) + { + if (!locale_) + FMT_THROW(fmt::SystemError(errno, "cannot create locale")); + } + ~Locale() + { + freelocale(locale_); + } + + Type get() const + { + return locale_; + } + + // Converts string to floating-point number and advances str past the end + // of the parsed input. + double strtod(const char *&str) const + { + char *end = 0; + double result = strtod_l(str, &end, locale_); + str = end; + return result; + } +}; +#endif // FMT_LOCALE +} // namespace fmt + +#if !FMT_USE_RVALUE_REFERENCES +namespace std +{ +// For compatibility with C++98. +inline fmt::BufferedFile &move(fmt::BufferedFile &f) +{ + return f; +} +inline fmt::File &move(fmt::File &f) +{ + return f; +} +} +#endif + +#endif // FMT_POSIX_H_ diff --git a/wasserstein/include/spdlog/fmt/bundled/time.h b/wasserstein/include/spdlog/fmt/bundled/time.h new file mode 100644 index 0000000..10c6cfc --- /dev/null +++ b/wasserstein/include/spdlog/fmt/bundled/time.h @@ -0,0 +1,58 @@ +/* + Formatting library for C++ - time formatting + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_TIME_H_ +#define FMT_TIME_H_ + +#include "format.h" +#include + +namespace fmt +{ +template +void format(BasicFormatter &f, + const char *&format_str, const std::tm &tm) +{ + if (*format_str == ':') + ++format_str; + const char *end = format_str; + while (*end && *end != '}') + ++end; + if (*end != '}') + FMT_THROW(FormatError("missing '}' in format string")); + internal::MemoryBuffer format; + format.append(format_str, end + 1); + format[format.size() - 1] = '\0'; + Buffer &buffer = f.writer().buffer(); + std::size_t start = buffer.size(); + for (;;) + { + std::size_t size = buffer.capacity() - start; + std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm); + if (count != 0) + { + buffer.resize(start + count); + break; + } + if (size >= format.size() * 256) + { + // If the buffer is 256 times larger than the format string, assume + // that `strftime` gives an empty result. There doesn't seem to be a + // better way to distinguish the two cases: + // https://github.com/fmtlib/fmt/issues/367 + break; + } + const std::size_t MIN_GROWTH = 10; + buffer.reserve(buffer.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH)); + } + format_str = end + 1; +} +} + +#endif // FMT_TIME_H_ diff --git a/wasserstein/include/spdlog/fmt/fmt.h b/wasserstein/include/spdlog/fmt/fmt.h new file mode 100644 index 0000000..a4ee467 --- /dev/null +++ b/wasserstein/include/spdlog/fmt/fmt.h @@ -0,0 +1,28 @@ +// +// Copyright(c) 2016 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// +// Include a bundled header-only copy of fmtlib or an external one. +// By default spdlog include its own copy. +// + +#if !defined(SPDLOG_FMT_EXTERNAL) + +#ifndef FMT_HEADER_ONLY +#define FMT_HEADER_ONLY +#endif +#ifndef FMT_USE_WINDOWS_H +#define FMT_USE_WINDOWS_H 0 +#endif +#include "spdlog/fmt/bundled/format.h" + +#else //external fmtlib + +#include + +#endif + diff --git a/wasserstein/include/spdlog/fmt/ostr.h b/wasserstein/include/spdlog/fmt/ostr.h new file mode 100644 index 0000000..49b5e98 --- /dev/null +++ b/wasserstein/include/spdlog/fmt/ostr.h @@ -0,0 +1,17 @@ +// +// Copyright(c) 2016 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// include external or bundled copy of fmtlib's ostream support +// +#if !defined(SPDLOG_FMT_EXTERNAL) +#include "spdlog/fmt/fmt.h" +#include "spdlog/fmt/bundled/ostream.h" +#else +#include +#endif + + diff --git a/wasserstein/include/spdlog/formatter.h b/wasserstein/include/spdlog/formatter.h new file mode 100644 index 0000000..6bba902 --- /dev/null +++ b/wasserstein/include/spdlog/formatter.h @@ -0,0 +1,47 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/details/log_msg.h" + +#include +#include +#include + +namespace spdlog +{ +namespace details +{ +class flag_formatter; +} + +class formatter +{ +public: + virtual ~formatter() {} + virtual void format(details::log_msg& msg) = 0; +}; + +class pattern_formatter SPDLOG_FINAL : public formatter +{ + +public: + explicit pattern_formatter(const std::string& pattern, pattern_time_type pattern_time = pattern_time_type::local); + pattern_formatter(const pattern_formatter&) = delete; + pattern_formatter& operator=(const pattern_formatter&) = delete; + void format(details::log_msg& msg) override; +private: + const std::string _pattern; + const pattern_time_type _pattern_time; + std::vector> _formatters; + std::tm get_time(details::log_msg& msg); + void handle_flag(char flag); + void compile_pattern(const std::string& pattern); +}; +} + +#include "spdlog/details/pattern_formatter_impl.h" + diff --git a/wasserstein/include/spdlog/logger.h b/wasserstein/include/spdlog/logger.h new file mode 100644 index 0000000..642208e --- /dev/null +++ b/wasserstein/include/spdlog/logger.h @@ -0,0 +1,132 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Thread safe logger (except for set_pattern(..), set_formatter(..) and set_error_handler()) +// Has name, log level, vector of std::shared sink pointers and formatter +// Upon each log write the logger: +// 1. Checks if its log level is enough to log the message +// 2. Format the message using the formatter function +// 3. Pass the formatted message to its sinks to performa the actual logging + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/common.h" + +#include +#include +#include + +namespace spdlog +{ + +class logger +{ +public: + logger(const std::string& logger_name, sink_ptr single_sink); + logger(const std::string& name, sinks_init_list); + template + logger(const std::string& name, const It& begin, const It& end); + + virtual ~logger(); + logger(const logger&) = delete; + logger& operator=(const logger&) = delete; + + + template void log(level::level_enum lvl, const char* fmt, const Args&... args); + template void log(level::level_enum lvl, const char* msg); + template void trace(const char* fmt, const Arg1&, const Args&... args); + template void debug(const char* fmt, const Arg1&, const Args&... args); + template void info(const char* fmt, const Arg1&, const Args&... args); + template void warn(const char* fmt, const Arg1&, const Args&... args); + template void error(const char* fmt, const Arg1&, const Args&... args); + template void critical(const char* fmt, const Arg1&, const Args&... args); + + template void log_if(const bool flag, level::level_enum lvl, const char* fmt, const Args&... args); + template void log_if(const bool flag, level::level_enum lvl, const char* msg); + template void trace_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + template void debug_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + template void info_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + template void warn_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + template void error_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + template void critical_if(const bool flag, const char* fmt, const Arg1&, const Args&... args); + +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT + template void log(level::level_enum lvl, const wchar_t* msg); + template void log(level::level_enum lvl, const wchar_t* fmt, const Args&... args); + template void trace(const wchar_t* fmt, const Args&... args); + template void debug(const wchar_t* fmt, const Args&... args); + template void info(const wchar_t* fmt, const Args&... args); + template void warn(const wchar_t* fmt, const Args&... args); + template void error(const wchar_t* fmt, const Args&... args); + template void critical(const wchar_t* fmt, const Args&... args); + + template void log_if(const bool flag, level::level_enum lvl, const wchar_t* msg); + template void log_if(const bool flag, level::level_enum lvl, const wchar_t* fmt, const Args&... args); + template void trace_if(const bool flag, const wchar_t* fmt, const Args&... args); + template void debug_if(const bool flag, const wchar_t* fmt, const Args&... args); + template void info_if(const bool flag, const wchar_t* fmt, const Args&... args); + template void warn_if(const bool flag, const wchar_t* fmt, const Args&... args); + template void error_if(const bool flag, const wchar_t* fmt, const Args&... args); + template void critical_if(const bool flag, const wchar_t* fmt, const Args&... args); +#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT + + template void log(level::level_enum lvl, const T&); + template void trace(const T&); + template void debug(const T&); + template void info(const T&); + template void warn(const T&); + template void error(const T&); + template void critical(const T&); + + template void log_if(const bool flag, level::level_enum lvl, const T&); + template void trace_if(const bool flag, const T&); + template void debug_if(const bool flag, const T&); + template void info_if(const bool flag, const T&); + template void warn_if(const bool flag, const T&); + template void error_if(const bool flag, const T&); + template void critical_if(const bool flag, const T&); + + bool should_log(level::level_enum) const; + void set_level(level::level_enum); + level::level_enum level() const; + const std::string& name() const; + void set_pattern(const std::string&, pattern_time_type = pattern_time_type::local); + void set_formatter(formatter_ptr); + + // automatically call flush() if message level >= log_level + void flush_on(level::level_enum log_level); + + virtual void flush(); + + const std::vector& sinks() const; + + // error handler + virtual void set_error_handler(log_err_handler); + virtual log_err_handler error_handler(); + +protected: + virtual void _sink_it(details::log_msg&); + virtual void _set_pattern(const std::string&, pattern_time_type); + virtual void _set_formatter(formatter_ptr); + + // default error handler: print the error to stderr with the max rate of 1 message/minute + virtual void _default_err_handler(const std::string &msg); + + // return true if the given message level should trigger a flush + bool _should_flush_on(const details::log_msg&); + + const std::string _name; + std::vector _sinks; + formatter_ptr _formatter; + spdlog::level_t _level; + spdlog::level_t _flush_level; + log_err_handler _err_handler; + std::atomic _last_err_time; + std::atomic _msg_counter; +}; +} + +#include "spdlog/details/logger_impl.h" diff --git a/wasserstein/include/spdlog/sinks/android_sink.h b/wasserstein/include/spdlog/sinks/android_sink.h new file mode 100644 index 0000000..239f2d2 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/android_sink.h @@ -0,0 +1,90 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#if defined(__ANDROID__) + +#include "spdlog/sinks/sink.h" + +#include +#include +#include +#include +#include + +#if !defined(SPDLOG_ANDROID_RETRIES) +#define SPDLOG_ANDROID_RETRIES 2 +#endif + +namespace spdlog +{ +namespace sinks +{ + +/* +* Android sink (logging using __android_log_write) +* __android_log_write is thread-safe. No lock is needed. +*/ +class android_sink : public sink +{ +public: + explicit android_sink(const std::string& tag = "spdlog", bool use_raw_msg = false): _tag(tag), _use_raw_msg(use_raw_msg) {} + + void log(const details::log_msg& msg) override + { + const android_LogPriority priority = convert_to_android(msg.level); + const char *msg_output = (_use_raw_msg ? msg.raw.c_str() : msg.formatted.c_str()); + + // See system/core/liblog/logger_write.c for explanation of return value + int ret = __android_log_write(priority, _tag.c_str(), msg_output); + int retry_count = 0; + while ((ret == -11/*EAGAIN*/) && (retry_count < SPDLOG_ANDROID_RETRIES)) + { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + ret = __android_log_write(priority, _tag.c_str(), msg_output); + retry_count++; + } + + if (ret < 0) + { + throw spdlog_ex("__android_log_write() failed", ret); + } + } + + void flush() override + { + } + +private: + static android_LogPriority convert_to_android(spdlog::level::level_enum level) + { + switch(level) + { + case spdlog::level::trace: + return ANDROID_LOG_VERBOSE; + case spdlog::level::debug: + return ANDROID_LOG_DEBUG; + case spdlog::level::info: + return ANDROID_LOG_INFO; + case spdlog::level::warn: + return ANDROID_LOG_WARN; + case spdlog::level::err: + return ANDROID_LOG_ERROR; + case spdlog::level::critical: + return ANDROID_LOG_FATAL; + default: + return ANDROID_LOG_DEFAULT; + } + } + + std::string _tag; + bool _use_raw_msg; +}; + +} +} + +#endif diff --git a/wasserstein/include/spdlog/sinks/ansicolor_sink.h b/wasserstein/include/spdlog/sinks/ansicolor_sink.h new file mode 100644 index 0000000..56fd3fd --- /dev/null +++ b/wasserstein/include/spdlog/sinks/ansicolor_sink.h @@ -0,0 +1,133 @@ +// +// Copyright(c) 2017 spdlog authors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/common.h" +#include "spdlog/details/os.h" + +#include +#include + +namespace spdlog +{ +namespace sinks +{ + +/** + * This sink prefixes the output with an ANSI escape sequence color code depending on the severity + * of the message. + * If no color terminal detected, omit the escape codes. + */ +template +class ansicolor_sink: public base_sink +{ +public: + ansicolor_sink(FILE* file): target_file_(file) + { + should_do_colors_ = details::os::in_terminal(file) && details::os::is_color_terminal(); + colors_[level::trace] = cyan; + colors_[level::debug] = cyan; + colors_[level::info] = reset; + colors_[level::warn] = yellow + bold; + colors_[level::err] = red + bold; + colors_[level::critical] = bold + on_red; + colors_[level::off] = reset; + } + virtual ~ansicolor_sink() + { + _flush(); + } + + void set_color(level::level_enum color_level, const std::string& color) + { + std::lock_guard lock(base_sink::_mutex); + colors_[color_level] = color; + } + + /// Formatting codes + const std::string reset = "\033[00m"; + const std::string bold = "\033[1m"; + const std::string dark = "\033[2m"; + const std::string underline = "\033[4m"; + const std::string blink = "\033[5m"; + const std::string reverse = "\033[7m"; + const std::string concealed = "\033[8m"; + + // Foreground colors + const std::string grey = "\033[30m"; + const std::string red = "\033[31m"; + const std::string green = "\033[32m"; + const std::string yellow = "\033[33m"; + const std::string blue = "\033[34m"; + const std::string magenta = "\033[35m"; + const std::string cyan = "\033[36m"; + const std::string white = "\033[37m"; + + /// Background colors + const std::string on_grey = "\033[40m"; + const std::string on_red = "\033[41m"; + const std::string on_green = "\033[42m"; + const std::string on_yellow = "\033[43m"; + const std::string on_blue = "\033[44m"; + const std::string on_magenta = "\033[45m"; + const std::string on_cyan = "\033[46m"; + const std::string on_white = "\033[47m"; + +protected: + virtual void _sink_it(const details::log_msg& msg) override + { + // Wrap the originally formatted message in color codes. + // If color is not supported in the terminal, log as is instead. + if (should_do_colors_) + { + const std::string& prefix = colors_[msg.level]; + fwrite(prefix.data(), sizeof(char), prefix.size(), target_file_); + fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), target_file_); + fwrite(reset.data(), sizeof(char), reset.size(), target_file_); + } + else + { + fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), target_file_); + } + _flush(); + } + + void _flush() override + { + fflush(target_file_); + } + FILE* target_file_; + bool should_do_colors_; + std::map colors_; +}; + + +template +class ansicolor_stdout_sink: public ansicolor_sink +{ +public: + ansicolor_stdout_sink(): ansicolor_sink(stdout) + {} +}; + +template +class ansicolor_stderr_sink: public ansicolor_sink +{ +public: + ansicolor_stderr_sink(): ansicolor_sink(stderr) + {} +}; + +typedef ansicolor_stdout_sink ansicolor_stdout_sink_mt; +typedef ansicolor_stdout_sink ansicolor_stdout_sink_st; + +typedef ansicolor_stderr_sink ansicolor_stderr_sink_mt; +typedef ansicolor_stderr_sink ansicolor_stderr_sink_st; + +} // namespace sinks +} // namespace spdlog + diff --git a/wasserstein/include/spdlog/sinks/base_sink.h b/wasserstein/include/spdlog/sinks/base_sink.h new file mode 100644 index 0000000..926f493 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/base_sink.h @@ -0,0 +1,50 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once +// +// base sink templated over a mutex (either dummy or real) +// concrete implementation should only override the _sink_it method. +// all locking is taken care of here so no locking needed by the implementers.. +// + +#include "spdlog/sinks/sink.h" +#include "spdlog/formatter.h" +#include "spdlog/common.h" +#include "spdlog/details/log_msg.h" + +#include + +namespace spdlog +{ +namespace sinks +{ +template +class base_sink:public sink +{ +public: + base_sink():_mutex() {} + virtual ~base_sink() = default; + + base_sink(const base_sink&) = delete; + base_sink& operator=(const base_sink&) = delete; + + void log(const details::log_msg& msg) SPDLOG_FINAL override + { + std::lock_guard lock(_mutex); + _sink_it(msg); + } + void flush() SPDLOG_FINAL override + { + _flush(); + } + +protected: + virtual void _sink_it(const details::log_msg& msg) = 0; + virtual void _flush() = 0; + Mutex _mutex; +}; +} +} diff --git a/wasserstein/include/spdlog/sinks/dist_sink.h b/wasserstein/include/spdlog/sinks/dist_sink.h new file mode 100644 index 0000000..4d4b6b6 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/dist_sink.h @@ -0,0 +1,73 @@ +// +// Copyright (c) 2015 David Schury, Gabi Melman +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/details/log_msg.h" +#include "spdlog/details/null_mutex.h" +#include "spdlog/sinks/base_sink.h" +#include "spdlog/sinks/sink.h" + +#include +#include +#include +#include + +// Distribution sink (mux). Stores a vector of sinks which get called when log is called + +namespace spdlog +{ +namespace sinks +{ +template +class dist_sink: public base_sink +{ +public: + explicit dist_sink() :_sinks() {} + dist_sink(const dist_sink&) = delete; + dist_sink& operator=(const dist_sink&) = delete; + virtual ~dist_sink() = default; + +protected: + std::vector> _sinks; + + void _sink_it(const details::log_msg& msg) override + { + for (auto &sink : _sinks) + { + if( sink->should_log( msg.level)) + { + sink->log(msg); + } + } + } + + void _flush() override + { + std::lock_guard lock(base_sink::_mutex); + for (auto &sink : _sinks) + sink->flush(); + } + +public: + + + void add_sink(std::shared_ptr sink) + { + std::lock_guard lock(base_sink::_mutex); + _sinks.push_back(sink); + } + + void remove_sink(std::shared_ptr sink) + { + std::lock_guard lock(base_sink::_mutex); + _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end()); + } +}; + +typedef dist_sink dist_sink_mt; +typedef dist_sink dist_sink_st; +} +} diff --git a/wasserstein/include/spdlog/sinks/file_sinks.h b/wasserstein/include/spdlog/sinks/file_sinks.h new file mode 100644 index 0000000..421acc8 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/file_sinks.h @@ -0,0 +1,242 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/details/null_mutex.h" +#include "spdlog/details/file_helper.h" +#include "spdlog/fmt/fmt.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace sinks +{ +/* + * Trivial file sink with single file as target + */ +template +class simple_file_sink SPDLOG_FINAL : public base_sink < Mutex > +{ +public: + explicit simple_file_sink(const filename_t &filename, bool truncate = false):_force_flush(false) + { + _file_helper.open(filename, truncate); + } + + void set_force_flush(bool force_flush) + { + _force_flush = force_flush; + } + +protected: + void _sink_it(const details::log_msg& msg) override + { + _file_helper.write(msg); + if(_force_flush) + _file_helper.flush(); + } + void _flush() override + { + _file_helper.flush(); + } +private: + details::file_helper _file_helper; + bool _force_flush; +}; + +typedef simple_file_sink simple_file_sink_mt; +typedef simple_file_sink simple_file_sink_st; + +/* + * Rotating file sink based on size + */ +template +class rotating_file_sink SPDLOG_FINAL : public base_sink < Mutex > +{ +public: + rotating_file_sink(const filename_t &base_filename, + std::size_t max_size, std::size_t max_files) : + _base_filename(base_filename), + _max_size(max_size), + _max_files(max_files), + _current_size(0), + _file_helper() + { + _file_helper.open(calc_filename(_base_filename, 0)); + _current_size = _file_helper.size(); //expensive. called only once + } + + +protected: + void _sink_it(const details::log_msg& msg) override + { + _current_size += msg.formatted.size(); + if (_current_size > _max_size) + { + _rotate(); + _current_size = msg.formatted.size(); + } + _file_helper.write(msg); + } + + void _flush() override + { + _file_helper.flush(); + } + +private: + static filename_t calc_filename(const filename_t& filename, std::size_t index) + { + std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; + if (index) + w.write(SPDLOG_FILENAME_T("{}.{}"), filename, index); + else + w.write(SPDLOG_FILENAME_T("{}"), filename); + return w.str(); + } + + // Rotate files: + // log.txt -> log.txt.1 + // log.txt.1 -> log.txt.2 + // log.txt.2 -> log.txt.3 + // lo3.txt.3 -> delete + + void _rotate() + { + using details::os::filename_to_str; + _file_helper.close(); + for (auto i = _max_files; i > 0; --i) + { + filename_t src = calc_filename(_base_filename, i - 1); + filename_t target = calc_filename(_base_filename, i); + + if (details::file_helper::file_exists(target)) + { + if (details::os::remove(target) != 0) + { + throw spdlog_ex("rotating_file_sink: failed removing " + filename_to_str(target), errno); + } + } + if (details::file_helper::file_exists(src) && details::os::rename(src, target)) + { + throw spdlog_ex("rotating_file_sink: failed renaming " + filename_to_str(src) + " to " + filename_to_str(target), errno); + } + } + _file_helper.reopen(true); + } + filename_t _base_filename; + std::size_t _max_size; + std::size_t _max_files; + std::size_t _current_size; + details::file_helper _file_helper; +}; + +typedef rotating_file_sink rotating_file_sink_mt; +typedef rotating_file_sinkrotating_file_sink_st; + +/* + * Default generator of daily log file names. + */ +struct default_daily_file_name_calculator +{ + // Create filename for the form basename.YYYY-MM-DD_hh-mm + static filename_t calc_filename(const filename_t& basename) + { + std::tm tm = spdlog::details::os::localtime(); + std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; + w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min); + return w.str(); + } +}; + +/* + * Generator of daily log file names in format basename.YYYY-MM-DD + */ +struct dateonly_daily_file_name_calculator +{ + // Create filename for the form basename.YYYY-MM-DD + static filename_t calc_filename(const filename_t& basename) + { + std::tm tm = spdlog::details::os::localtime(); + std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; + w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); + return w.str(); + } +}; + +/* + * Rotating file sink based on date. rotates at midnight + */ +template +class daily_file_sink SPDLOG_FINAL :public base_sink < Mutex > +{ +public: + //create daily file sink which rotates on given time + daily_file_sink( + const filename_t& base_filename, + int rotation_hour, + int rotation_minute) : _base_filename(base_filename), + _rotation_h(rotation_hour), + _rotation_m(rotation_minute) + { + if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59) + throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); + _rotation_tp = _next_rotation_tp(); + _file_helper.open(FileNameCalc::calc_filename(_base_filename)); + } + + +protected: + void _sink_it(const details::log_msg& msg) override + { + if (std::chrono::system_clock::now() >= _rotation_tp) + { + _file_helper.open(FileNameCalc::calc_filename(_base_filename)); + _rotation_tp = _next_rotation_tp(); + } + _file_helper.write(msg); + } + + void _flush() override + { + _file_helper.flush(); + } + +private: + std::chrono::system_clock::time_point _next_rotation_tp() + { + auto now = std::chrono::system_clock::now(); + time_t tnow = std::chrono::system_clock::to_time_t(now); + tm date = spdlog::details::os::localtime(tnow); + date.tm_hour = _rotation_h; + date.tm_min = _rotation_m; + date.tm_sec = 0; + auto rotation_time = std::chrono::system_clock::from_time_t(std::mktime(&date)); + if (rotation_time > now) + return rotation_time; + else + return std::chrono::system_clock::time_point(rotation_time + std::chrono::hours(24)); + } + + filename_t _base_filename; + int _rotation_h; + int _rotation_m; + std::chrono::system_clock::time_point _rotation_tp; + details::file_helper _file_helper; +}; + +typedef daily_file_sink daily_file_sink_mt; +typedef daily_file_sink daily_file_sink_st; +} +} diff --git a/wasserstein/include/spdlog/sinks/msvc_sink.h b/wasserstein/include/spdlog/sinks/msvc_sink.h new file mode 100644 index 0000000..68b0255 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/msvc_sink.h @@ -0,0 +1,51 @@ +// +// Copyright(c) 2016 Alexander Dalshov. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#if defined(_MSC_VER) + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/details/null_mutex.h" + +#include + +#include +#include + +namespace spdlog +{ +namespace sinks +{ +/* +* MSVC sink (logging using OutputDebugStringA) +*/ +template +class msvc_sink : public base_sink < Mutex > +{ +public: + explicit msvc_sink() + { + } + + + +protected: + void _sink_it(const details::log_msg& msg) override + { + OutputDebugStringA(msg.formatted.c_str()); + } + + void _flush() override + {} +}; + +typedef msvc_sink msvc_sink_mt; +typedef msvc_sink msvc_sink_st; + +} +} + +#endif diff --git a/wasserstein/include/spdlog/sinks/null_sink.h b/wasserstein/include/spdlog/sinks/null_sink.h new file mode 100644 index 0000000..ed4b5e4 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/null_sink.h @@ -0,0 +1,34 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/details/null_mutex.h" + +#include + +namespace spdlog +{ +namespace sinks +{ + +template +class null_sink : public base_sink < Mutex > +{ +protected: + void _sink_it(const details::log_msg&) override + {} + + void _flush() override + {} + +}; +typedef null_sink null_sink_st; +typedef null_sink null_sink_mt; + +} +} + diff --git a/wasserstein/include/spdlog/sinks/ostream_sink.h b/wasserstein/include/spdlog/sinks/ostream_sink.h new file mode 100644 index 0000000..f056107 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/ostream_sink.h @@ -0,0 +1,47 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/details/null_mutex.h" +#include "spdlog/sinks/base_sink.h" + +#include +#include + +namespace spdlog +{ +namespace sinks +{ +template +class ostream_sink: public base_sink +{ +public: + explicit ostream_sink(std::ostream& os, bool force_flush=false) :_ostream(os), _force_flush(force_flush) {} + ostream_sink(const ostream_sink&) = delete; + ostream_sink& operator=(const ostream_sink&) = delete; + virtual ~ostream_sink() = default; + +protected: + void _sink_it(const details::log_msg& msg) override + { + _ostream.write(msg.formatted.data(), msg.formatted.size()); + if (_force_flush) + _ostream.flush(); + } + + void _flush() override + { + _ostream.flush(); + } + + std::ostream& _ostream; + bool _force_flush; +}; + +typedef ostream_sink ostream_sink_mt; +typedef ostream_sink ostream_sink_st; +} +} diff --git a/wasserstein/include/spdlog/sinks/sink.h b/wasserstein/include/spdlog/sinks/sink.h new file mode 100644 index 0000000..0974f33 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/sink.h @@ -0,0 +1,53 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + + +#pragma once + +#include "spdlog/details/log_msg.h" + +namespace spdlog +{ +namespace sinks +{ +class sink +{ +public: + sink() + { + _level = level::trace; + } + + virtual ~sink() {} + virtual void log(const details::log_msg& msg) = 0; + virtual void flush() = 0; + + bool should_log(level::level_enum msg_level) const; + void set_level(level::level_enum log_level); + level::level_enum level() const; + +private: + level_t _level; + +}; + +inline bool sink::should_log(level::level_enum msg_level) const +{ + return msg_level >= _level.load(std::memory_order_relaxed); +} + +inline void sink::set_level(level::level_enum log_level) +{ + _level.store(log_level); +} + +inline level::level_enum sink::level() const +{ + return static_cast(_level.load(std::memory_order_relaxed)); +} + +} +} + diff --git a/wasserstein/include/spdlog/sinks/stdout_sinks.h b/wasserstein/include/spdlog/sinks/stdout_sinks.h new file mode 100644 index 0000000..dcdcc7c --- /dev/null +++ b/wasserstein/include/spdlog/sinks/stdout_sinks.h @@ -0,0 +1,77 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/details/null_mutex.h" +#include "spdlog/sinks/base_sink.h" + +#include +#include +#include + +namespace spdlog +{ +namespace sinks +{ + +template +class stdout_sink SPDLOG_FINAL : public base_sink +{ + using MyType = stdout_sink; +public: + stdout_sink() + {} + static std::shared_ptr instance() + { + static std::shared_ptr instance = std::make_shared(); + return instance; + } +protected: + void _sink_it(const details::log_msg& msg) override + { + fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), stdout); + _flush(); + } + + void _flush() override + { + fflush(stdout); + } +}; + +typedef stdout_sink stdout_sink_st; +typedef stdout_sink stdout_sink_mt; + + +template +class stderr_sink SPDLOG_FINAL : public base_sink +{ + using MyType = stderr_sink; +public: + stderr_sink() + {} + static std::shared_ptr instance() + { + static std::shared_ptr instance = std::make_shared(); + return instance; + } +protected: + void _sink_it(const details::log_msg& msg) override + { + fwrite(msg.formatted.data(), sizeof(char), msg.formatted.size(), stderr); + _flush(); + } + + void _flush() override + { + fflush(stderr); + } +}; + +typedef stderr_sink stderr_sink_mt; +typedef stderr_sink stderr_sink_st; +} +} diff --git a/wasserstein/include/spdlog/sinks/syslog_sink.h b/wasserstein/include/spdlog/sinks/syslog_sink.h new file mode 100644 index 0000000..0b509c4 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/syslog_sink.h @@ -0,0 +1,81 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/common.h" + +#ifdef SPDLOG_ENABLE_SYSLOG + +#include "spdlog/sinks/sink.h" +#include "spdlog/details/log_msg.h" + +#include +#include +#include + + +namespace spdlog +{ +namespace sinks +{ +/** + * Sink that write to syslog using the `syscall()` library call. + * + * Locking is not needed, as `syslog()` itself is thread-safe. + */ +class syslog_sink : public sink +{ +public: + // + syslog_sink(const std::string& ident = "", int syslog_option=0, int syslog_facility=LOG_USER): + _ident(ident) + { + _priorities[static_cast(level::trace)] = LOG_DEBUG; + _priorities[static_cast(level::debug)] = LOG_DEBUG; + _priorities[static_cast(level::info)] = LOG_INFO; + _priorities[static_cast(level::warn)] = LOG_WARNING; + _priorities[static_cast(level::err)] = LOG_ERR; + _priorities[static_cast(level::critical)] = LOG_CRIT; + _priorities[static_cast(level::off)] = LOG_INFO; + + //set ident to be program name if empty + ::openlog(_ident.empty()? nullptr:_ident.c_str(), syslog_option, syslog_facility); + } + ~syslog_sink() + { + ::closelog(); + } + + syslog_sink(const syslog_sink&) = delete; + syslog_sink& operator=(const syslog_sink&) = delete; + + void log(const details::log_msg &msg) override + { + ::syslog(syslog_prio_from_level(msg), "%s", msg.raw.str().c_str()); + } + + void flush() override + { + } + + +private: + std::array _priorities; + //must store the ident because the man says openlog might use the pointer as is and not a string copy + const std::string _ident; + + // + // Simply maps spdlog's log level to syslog priority level. + // + int syslog_prio_from_level(const details::log_msg &msg) const + { + return _priorities[static_cast(msg.level)]; + } +}; +} +} + +#endif diff --git a/wasserstein/include/spdlog/sinks/wincolor_sink.h b/wasserstein/include/spdlog/sinks/wincolor_sink.h new file mode 100644 index 0000000..6611124 --- /dev/null +++ b/wasserstein/include/spdlog/sinks/wincolor_sink.h @@ -0,0 +1,117 @@ +// +// Copyright(c) 2016 spdlog +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/sinks/base_sink.h" +#include "spdlog/details/null_mutex.h" +#include "spdlog/common.h" + +#include +#include +#include +#include + +namespace spdlog +{ +namespace sinks +{ +/* + * Windows color console sink. Uses WriteConsoleA to write to the console with colors + */ +template +class wincolor_sink: public base_sink +{ +public: + const WORD BOLD = FOREGROUND_INTENSITY; + const WORD RED = FOREGROUND_RED; + const WORD CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE; + const WORD WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + const WORD YELLOW = FOREGROUND_RED | FOREGROUND_GREEN; + + wincolor_sink(HANDLE std_handle): out_handle_(std_handle) + { + colors_[level::trace] = CYAN; + colors_[level::debug] = CYAN; + colors_[level::info] = WHITE | BOLD; + colors_[level::warn] = YELLOW | BOLD; + colors_[level::err] = RED | BOLD; // red bold + colors_[level::critical] = BACKGROUND_RED | WHITE | BOLD; // white bold on red background + colors_[level::off] = 0; + } + + virtual ~wincolor_sink() + { + this->flush(); + } + + wincolor_sink(const wincolor_sink& other) = delete; + wincolor_sink& operator=(const wincolor_sink& other) = delete; + +protected: + virtual void _sink_it(const details::log_msg& msg) override + { + auto color = colors_[msg.level]; + auto orig_attribs = set_console_attribs(color); + WriteConsoleA(out_handle_, msg.formatted.data(), static_cast(msg.formatted.size()), nullptr, nullptr); + SetConsoleTextAttribute(out_handle_, orig_attribs); //reset to orig colors + } + + virtual void _flush() override + { + // windows console always flushed? + } + + // change the color for the given level + void set_color(level::level_enum level, WORD color) + { + std::lock_guard lock(base_sink::_mutex); + colors_[level] = color; + } + +private: + HANDLE out_handle_; + std::map colors_; + + // set color and return the orig console attributes (for resetting later) + WORD set_console_attribs(WORD attribs) + { + CONSOLE_SCREEN_BUFFER_INFO orig_buffer_info; + GetConsoleScreenBufferInfo(out_handle_, &orig_buffer_info); + SetConsoleTextAttribute(out_handle_, attribs); + return orig_buffer_info.wAttributes; //return orig attribs + } +}; + +// +// windows color console to stdout +// +template +class wincolor_stdout_sink: public wincolor_sink +{ +public: + wincolor_stdout_sink() : wincolor_sink(GetStdHandle(STD_OUTPUT_HANDLE)) + {} +}; + +typedef wincolor_stdout_sink wincolor_stdout_sink_mt; +typedef wincolor_stdout_sink wincolor_stdout_sink_st; + +// +// windows color console to stderr +// +template +class wincolor_stderr_sink: public wincolor_sink +{ +public: + wincolor_stderr_sink() : wincolor_sink(GetStdHandle(STD_ERROR_HANDLE)) + {} +}; + +typedef wincolor_stderr_sink wincolor_stderr_sink_mt; +typedef wincolor_stderr_sink wincolor_stderr_sink_st; + +} +} diff --git a/wasserstein/include/spdlog/spdlog.h b/wasserstein/include/spdlog/spdlog.h new file mode 100644 index 0000000..fb4ea59 --- /dev/null +++ b/wasserstein/include/spdlog/spdlog.h @@ -0,0 +1,187 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// +// spdlog main header file. +// see example.cpp for usage example + +#pragma once + +#define SPDLOG_VERSION "0.13.0" + +#include "spdlog/tweakme.h" +#include "spdlog/common.h" +#include "spdlog/logger.h" + +#include +#include +#include +#include + +namespace spdlog +{ + +// +// Return an existing logger or nullptr if a logger with such name doesn't exist. +// example: spdlog::get("my_logger")->info("hello {}", "world"); +// +std::shared_ptr get(const std::string& name); + + +// +// Set global formatting +// example: spdlog::set_pattern("%Y-%m-%d %H:%M:%S.%e %l : %v"); +// +void set_pattern(const std::string& format_string); +void set_formatter(formatter_ptr f); + +// +// Set global logging level for +// +void set_level(level::level_enum log_level); + +// +// Set global error handler +// +void set_error_handler(log_err_handler); + +// +// Turn on async mode (off by default) and set the queue size for each async_logger. +// effective only for loggers created after this call. +// queue_size: size of queue (must be power of 2): +// Each logger will pre-allocate a dedicated queue with queue_size entries upon construction. +// +// async_overflow_policy (optional, block_retry by default): +// async_overflow_policy::block_retry - if queue is full, block until queue has room for the new log entry. +// async_overflow_policy::discard_log_msg - never block and discard any new messages when queue overflows. +// +// worker_warmup_cb (optional): +// callback function that will be called in worker thread upon start (can be used to init stuff like thread affinity) +// +// worker_teardown_cb (optional): +// callback function that will be called in worker thread upon exit +// +void set_async_mode(size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); + +// Turn off async mode +void set_sync_mode(); + + +// +// Create and register multi/single threaded basic file logger. +// Basic logger simply writes to given file without any limitatons or rotations. +// +std::shared_ptr basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate = false); +std::shared_ptr basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate = false); + +// +// Create and register multi/single threaded rotating file logger +// +std::shared_ptr rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files); +std::shared_ptr rotating_logger_st(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files); + +// +// Create file logger which creates new file on the given time (default in midnight): +// +std::shared_ptr daily_logger_mt(const std::string& logger_name, const filename_t& filename, int hour=0, int minute=0); +std::shared_ptr daily_logger_st(const std::string& logger_name, const filename_t& filename, int hour=0, int minute=0); + +// +// Create and register stdout/stderr loggers +// +std::shared_ptr stdout_logger_mt(const std::string& logger_name); +std::shared_ptr stdout_logger_st(const std::string& logger_name); +std::shared_ptr stderr_logger_mt(const std::string& logger_name); +std::shared_ptr stderr_logger_st(const std::string& logger_name); +// +// Create and register colored stdout/stderr loggers +// +std::shared_ptr stdout_color_mt(const std::string& logger_name); +std::shared_ptr stdout_color_st(const std::string& logger_name); +std::shared_ptr stderr_color_mt(const std::string& logger_name); +std::shared_ptr stderr_color_st(const std::string& logger_name); + + +// +// Create and register a syslog logger +// +#ifdef SPDLOG_ENABLE_SYSLOG +std::shared_ptr syslog_logger(const std::string& logger_name, const std::string& ident = "", int syslog_option = 0); +#endif + +#if defined(__ANDROID__) +std::shared_ptr android_logger(const std::string& logger_name, const std::string& tag = "spdlog"); +#endif + +// Create and register a logger with a single sink +std::shared_ptr create(const std::string& logger_name, const sink_ptr& sink); + +// Create and register a logger with multiple sinks +std::shared_ptr create(const std::string& logger_name, sinks_init_list sinks); +template +std::shared_ptr create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end); + + +// Create and register a logger with templated sink type +// Example: +// spdlog::create("mylog", "dailylog_filename"); +template +std::shared_ptr create(const std::string& logger_name, Args...); + +// Create and register an async logger with a single sink +std::shared_ptr create_async(const std::string& logger_name, const sink_ptr& sink, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); + +// Create and register an async logger with multiple sinks +std::shared_ptr create_async(const std::string& logger_name, sinks_init_list sinks, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); +template +std::shared_ptr create_async(const std::string& logger_name, const It& sinks_begin, const It& sinks_end, size_t queue_size, const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, const std::function& worker_warmup_cb = nullptr, const std::chrono::milliseconds& flush_interval_ms = std::chrono::milliseconds::zero(), const std::function& worker_teardown_cb = nullptr); + +// Register the given logger with the given name +void register_logger(std::shared_ptr logger); + +// Apply a user defined function on all registered loggers +// Example: +// spdlog::apply_all([&](std::shared_ptr l) {l->flush();}); +void apply_all(std::function)> fun); + +// Drop the reference to the given logger +void drop(const std::string &name); + +// Drop all references from the registry +void drop_all(); + + +/////////////////////////////////////////////////////////////////////////////// +// +// Trace & Debug can be switched on/off at compile time for zero cost debug statements. +// Uncomment SPDLOG_DEBUG_ON/SPDLOG_TRACE_ON in teakme.h to enable. +// SPDLOG_TRACE(..) will also print current file and line. +// +// Example: +// spdlog::set_level(spdlog::level::trace); +// SPDLOG_TRACE(my_logger, "some trace message"); +// SPDLOG_TRACE(my_logger, "another trace message {} {}", 1, 2); +// SPDLOG_DEBUG(my_logger, "some debug message {} {}", 3, 4); +// SPDLOG_DEBUG_IF(my_logger, true, "some debug message {} {}", 3, 4); +/////////////////////////////////////////////////////////////////////////////// + +#ifdef SPDLOG_TRACE_ON +#define SPDLOG_STR_H(x) #x +#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x) +#define SPDLOG_TRACE(logger, ...) logger->trace("[" __FILE__ " line #" SPDLOG_STR_HELPER(__LINE__) "] " __VA_ARGS__) +#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[" __FILE__ " line #" SPDLOG_STR_HELPER(__LINE__) "] " __VA_ARGS__) +#else +#define SPDLOG_TRACE(logger, ...) +#endif + +#ifdef SPDLOG_DEBUG_ON +#define SPDLOG_DEBUG(logger, ...) logger->debug(__VA_ARGS__) +#define SPDLOG_DEBUG_IF(logger, flag, ...) logger->debug_if(flag, __VA_ARGS__) +#else +#define SPDLOG_DEBUG(logger, ...) +#endif + +} + + +#include "spdlog/details/spdlog_impl.h" diff --git a/wasserstein/include/spdlog/tweakme.h b/wasserstein/include/spdlog/tweakme.h new file mode 100644 index 0000000..53f5cf7 --- /dev/null +++ b/wasserstein/include/spdlog/tweakme.h @@ -0,0 +1,141 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +/////////////////////////////////////////////////////////////////////////////// +// +// Edit this file to squeeze more performance, and to customize supported features +// +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Under Linux, the much faster CLOCK_REALTIME_COARSE clock can be used. +// This clock is less accurate - can be off by dozens of millis - depending on the kernel HZ. +// Uncomment to use it instead of the regular clock. +// +// #define SPDLOG_CLOCK_COARSE +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment if date/time logging is not needed and never appear in the log pattern. +// This will prevent spdlog from quering the clock on each log call. +// +// WARNING: If the log pattern contains any date/time while this flag is on, the result is undefined. +// You must set new pattern(spdlog::set_pattern(..") without any date/time in it +// +// #define SPDLOG_NO_DATETIME +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment if thread id logging is not needed (i.e. no %t in the log pattern). +// This will prevent spdlog from quering the thread id on each log call. +// +// WARNING: If the log pattern contains thread id (i.e, %t) while this flag is on, the result is undefined. +// +// #define SPDLOG_NO_THREAD_ID +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment if logger name logging is not needed. +// This will prevent spdlog from copying the logger name on each log call. +// +// #define SPDLOG_NO_NAME +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable the SPDLOG_DEBUG/SPDLOG_TRACE macros. +// +// #define SPDLOG_DEBUG_ON +// #define SPDLOG_TRACE_ON +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to avoid locking in the registry operations (spdlog::get(), spdlog::drop() spdlog::register()). +// Use only if your code never modifes concurrently the registry. +// Note that upon creating a logger the registry is modified by spdlog.. +// +// #define SPDLOG_NO_REGISTRY_MUTEX +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to avoid spdlog's usage of atomic log levels +// Use only if your code never modifies a logger's log levels concurrently by different threads. +// +// #define SPDLOG_NO_ATOMIC_LEVELS +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable usage of wchar_t for file names on Windows. +// +// #define SPDLOG_WCHAR_FILENAMES +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to override default eol ("\n" or "\r\n" under Linux/Windows) +// +// #define SPDLOG_EOL ";-)\n" +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to use your own copy of the fmt library instead of spdlog's copy. +// In this case spdlog will try to include so set your -I flag accordingly. +// +// #define SPDLOG_FMT_EXTERNAL +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable syslog (disabled by default) +// +// #define SPDLOG_ENABLE_SYSLOG +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable wchar_t support (convert to utf8) +// +// #define SPDLOG_WCHAR_TO_UTF8_SUPPORT +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to prevent child processes from inheriting log file descriptors +// +// #define SPDLOG_PREVENT_CHILD_FD +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to mark some types as final, allowing more optimizations in release +// mode with recent compilers. See GCC's documentation for -Wsuggest-final-types +// for instance. +// +// #define SPDLOG_FINAL final +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable message counting feature. Adds %i logger pattern that +// prints log message sequence id. +// +// #define SPDLOG_ENABLE_MESSAGE_COUNTER +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable user defined tag names +// +// #define SPDLOG_LEVEL_NAMES { " TRACE", " DEBUG", " INFO", +// " WARNING", " ERROR", "CRITICAL", "OFF" }; +/////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/wasserstein/include/wasserstein.h b/wasserstein/include/wasserstein.h new file mode 100644 index 0000000..d8d6b2e --- /dev/null +++ b/wasserstein/include/wasserstein.h @@ -0,0 +1,370 @@ +/* + +Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +(Enhancements) to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to copyright holder, +without imposing a separate written license agreement for such Enhancements, +then you hereby grant the following license: a non-exclusive, royalty-free +perpetual license to install, use, modify, prepare derivative works, incorporate +into other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + */ + +#ifndef HERA_WASSERSTEIN_H +#define HERA_WASSERSTEIN_H + +#include +#include +#include + +#include "def_debug_ws.h" +#include "basic_defs_ws.h" +#include "diagram_reader.h" +#include "auction_runner_gs.h" +#include "auction_runner_gs_single_diag.h" +#include "auction_runner_jac.h" +#include "auction_runner_fr.h" + + +namespace hera +{ + +template().begin())>::type > +struct DiagramTraits +{ + using Container = PairContainer_; + using PointType = PointType_; + using RealType = typename std::remove_reference< decltype(std::declval()[0]) >::type; + + static RealType get_x(const PointType& p) { return p[0]; } + static RealType get_y(const PointType& p) { return p[1]; } +}; + +template +struct DiagramTraits> +{ + using PointType = std::pair; + using RealType = long double; + using Container = std::vector; + + static RealType get_x(const PointType& p) { return p.first; } + static RealType get_y(const PointType& p) { return p.second; } +}; + +template +struct DiagramTraits> +{ + using PointType = std::pair; + using RealType = double; + using Container = std::vector; + + static RealType get_x(const PointType& p) { return p.first; } + static RealType get_y(const PointType& p) { return p.second; } +}; + +template +struct DiagramTraits> +{ + using PointType = std::pair; + using RealType = float; + using Container = std::vector; + + static RealType get_x(const PointType& p) { return p.first; } + static RealType get_y(const PointType& p) { return p.second; } +}; + + +namespace ws +{ + + // compare as multisets + template + inline bool are_equal(const PairContainer& dgm1, const PairContainer& dgm2) + { + if (dgm1.size() != dgm2.size()) { + return false; + } + + using Traits = typename hera::DiagramTraits; + using PointType = typename Traits::PointType; + + std::map m1, m2; + + for(const auto& pair1 : dgm1) { + m1[pair1]++; + } + + for(const auto& pair2 : dgm2) { + m2[pair2]++; + } + + return m1 == m2; + } + + // to handle points with one coordinate = infinity + template + inline RealType get_one_dimensional_cost(std::vector& set_A, + std::vector& set_B, + const RealType wasserstein_power) + { + if (set_A.size() != set_B.size()) { + return std::numeric_limits::infinity(); + } + std::sort(set_A.begin(), set_A.end()); + std::sort(set_B.begin(), set_B.end()); + RealType result = 0.0; + for(size_t i = 0; i < set_A.size(); ++i) { + result += std::pow(std::fabs(set_A[i] - set_B[i]), wasserstein_power); + } + return result; + } + + + template + struct SplitProblemInput + { + std::vector> A_1; + std::vector> B_1; + std::vector> A_2; + std::vector> B_2; + + std::unordered_map A_1_indices; + std::unordered_map A_2_indices; + std::unordered_map B_1_indices; + std::unordered_map B_2_indices; + + RealType mid_coord { 0.0 }; + RealType strip_width { 0.0 }; + + void init_vectors(size_t n) + { + + A_1_indices.clear(); + A_2_indices.clear(); + B_1_indices.clear(); + B_2_indices.clear(); + + A_1.clear(); + A_2.clear(); + B_1.clear(); + B_2.clear(); + + A_1.reserve(n / 2); + B_1.reserve(n / 2); + A_2.reserve(n / 2); + B_2.reserve(n / 2); + } + + void init(const std::vector>& A, + const std::vector>& B) + { + using DiagramPointR = DiagramPoint; + + init_vectors(A.size()); + + RealType min_sum = std::numeric_limits::max(); + RealType max_sum = -std::numeric_limits::max(); + for(const auto& p_A : A) { + RealType s = p_A[0] + p_A[1]; + if (s > max_sum) + max_sum = s; + if (s < min_sum) + min_sum = s; + mid_coord += s; + } + + mid_coord /= A.size(); + + strip_width = 0.25 * (max_sum - min_sum); + + auto first_diag_iter = std::upper_bound(A.begin(), A.end(), 0, [](const int& a, const DiagramPointR& p) { return a < (int)(p.is_diagonal()); }); + size_t num_normal_A_points = std::distance(A.begin(), first_diag_iter); + + // process all normal points in A, + // projections follow normal points + for(size_t i = 0; i < A.size(); ++i) { + + assert(i < num_normal_A_points and A.is_normal() or i >= num_normal_A_points and A.is_diagonal()); + assert(i < num_normal_A_points and B.is_diagonal() or i >= num_normal_A_points and B.is_normal()); + + RealType s = i < num_normal_A_points ? A[i][0] + A[i][1] : B[i][0] + B[i][1]; + + if (s < mid_coord + strip_width) { + // add normal point and its projection to the + // left half + A_1.push_back(A[i]); + B_1.push_back(B[i]); + A_1_indices[i] = A_1.size() - 1; + B_1_indices[i] = B_1.size() - 1; + } + + if (s > mid_coord - strip_width) { + // to the right half + A_2.push_back(A[i]); + B_2.push_back(B[i]); + A_2_indices[i] = A_2.size() - 1; + B_2_indices[i] = B_2.size() - 1; + } + + } + } // end init + + }; + + + // CAUTION: + // this function assumes that all coordinates are finite + // points at infinity are processed in wasserstein_cost + template + inline RealType wasserstein_cost_vec(const std::vector>& A, + const std::vector>& B, + AuctionParams& params, + const std::string& _log_filename_prefix) + { + if (params.wasserstein_power < 1.0) { + throw std::runtime_error("Bad q in Wasserstein " + std::to_string(params.wasserstein_power)); + } + if (params.delta < 0.0) { + throw std::runtime_error("Bad delta in Wasserstein " + std::to_string(params.delta)); + } + if (params.initial_epsilon < 0.0) { + throw std::runtime_error("Bad initial epsilon in Wasserstein" + std::to_string(params.initial_epsilon)); + } + if (params.epsilon_common_ratio < 0.0) { + throw std::runtime_error("Bad epsilon factor in Wasserstein " + std::to_string(params.epsilon_common_ratio)); + } + + if (A.empty() and B.empty()) + return 0.0; + + RealType result; + + // just use Gauss-Seidel + AuctionRunnerGS auction(A, B, params, _log_filename_prefix); + auction.run_auction(); + result = auction.get_wasserstein_cost(); + params.final_relative_error = auction.get_relative_error(); + return result; + } + +} // ws + + + +template +inline typename DiagramTraits::RealType +wasserstein_cost(const PairContainer& A, + const PairContainer& B, + AuctionParams< typename DiagramTraits::RealType >& params, + const std::string& _log_filename_prefix = "") +{ + using Traits = DiagramTraits; + + //using PointType = typename Traits::PointType; + using RealType = typename Traits::RealType; + + if (hera::ws::are_equal(A, B)) { + return 0.0; + } + + bool a_empty = true; + bool b_empty = true; + RealType total_cost_A = 0.0; + RealType total_cost_B = 0.0; + + using DgmPoint = hera::ws::DiagramPoint; + + std::vector dgm_A, dgm_B; + // coordinates of points at infinity + std::vector x_plus_A, x_minus_A, y_plus_A, y_minus_A; + std::vector x_plus_B, x_minus_B, y_plus_B, y_minus_B; + // loop over A, add projections of A-points to corresponding positions + // in B-vector + for(auto& pair_A : A) { + a_empty = false; + RealType x = Traits::get_x(pair_A); + RealType y = Traits::get_y(pair_A); + if ( x == std::numeric_limits::infinity()) { + y_plus_A.push_back(y); + } else if (x == -std::numeric_limits::infinity()) { + y_minus_A.push_back(y); + } else if (y == std::numeric_limits::infinity()) { + x_plus_A.push_back(x); + } else if (y == -std::numeric_limits::infinity()) { + x_minus_A.push_back(x); + } else { + dgm_A.emplace_back(x, y, DgmPoint::NORMAL); + dgm_B.emplace_back(x, y, DgmPoint::DIAG); + total_cost_A += std::pow(dgm_A.back().persistence_lp(params.internal_p), params.wasserstein_power); + } + } + // the same for B + for(auto& pair_B : B) { + b_empty = false; + RealType x = Traits::get_x(pair_B); + RealType y = Traits::get_y(pair_B); + if (x == std::numeric_limits::infinity()) { + y_plus_B.push_back(y); + } else if (x == -std::numeric_limits::infinity()) { + y_minus_B.push_back(y); + } else if (y == std::numeric_limits::infinity()) { + x_plus_B.push_back(x); + } else if (y == -std::numeric_limits::infinity()) { + x_minus_B.push_back(x); + } else { + dgm_A.emplace_back(x, y, DgmPoint::DIAG); + dgm_B.emplace_back(x, y, DgmPoint::NORMAL); + total_cost_B += std::pow(dgm_B.back().persistence_lp(params.internal_p), params.wasserstein_power); + } + } + + RealType infinity_cost = ws::get_one_dimensional_cost(x_plus_A, x_plus_B, params.wasserstein_power); + infinity_cost += ws::get_one_dimensional_cost(x_minus_A, x_minus_B, params.wasserstein_power); + infinity_cost += ws::get_one_dimensional_cost(y_plus_A, y_plus_B, params.wasserstein_power); + infinity_cost += ws::get_one_dimensional_cost(y_minus_A, y_minus_B, params.wasserstein_power); + + if (a_empty) + return total_cost_B + infinity_cost; + + if (b_empty) + return total_cost_A + infinity_cost; + + + if (infinity_cost == std::numeric_limits::infinity()) { + return infinity_cost; + } else { + return infinity_cost + wasserstein_cost_vec(dgm_A, dgm_B, params, _log_filename_prefix); + } + +} + +template +inline typename DiagramTraits::RealType +wasserstein_dist(const PairContainer& A, + const PairContainer& B, + AuctionParams::RealType>& params, + const std::string& _log_filename_prefix = "") +{ + using Real = typename DiagramTraits::RealType; + return std::pow(hera::wasserstein_cost(A, B, params, _log_filename_prefix), Real(1.)/params.wasserstein_power); +} + +} // end of namespace hera + +#endif diff --git a/wasserstein/include/wasserstein_pure_geom.hpp b/wasserstein/include/wasserstein_pure_geom.hpp new file mode 100644 index 0000000..096d95d --- /dev/null +++ b/wasserstein/include/wasserstein_pure_geom.hpp @@ -0,0 +1,86 @@ +#ifndef WASSERSTEIN_PURE_GEOM_HPP +#define WASSERSTEIN_PURE_GEOM_HPP + +#define WASSERSTEIN_PURE_GEOM + + +#include "diagram_reader.h" +#include "auction_oracle_kdtree_pure_geom.h" +#include "auction_runner_gs.h" +#include "auction_runner_jac.h" + +namespace hera +{ +namespace ws +{ + + template + using DynamicTraits = typename hera::ws::dnn::DynamicPointTraits; + + template + using DynamicPoint = typename hera::ws::dnn::DynamicPointTraits::PointType; + + template + using DynamicPointVector = typename hera::ws::dnn::DynamicPointVector; + + template + using AuctionRunnerGSR = typename hera::ws::AuctionRunnerGS, hera::ws::dnn::DynamicPointVector>; + + template + using AuctionRunnerJacR = typename hera::ws::AuctionRunnerJac, hera::ws::dnn::DynamicPointVector>; + + +inline double wasserstein_cost(const DynamicPointVector& set_A, const DynamicPointVector& set_B, const AuctionParams& params) +{ + if (params.wasserstein_power < 1.0) { + throw std::runtime_error("Bad q in Wasserstein " + std::to_string(params.wasserstein_power)); + } + + if (params.delta < 0.0) { + throw std::runtime_error("Bad delta in Wasserstein " + std::to_string(params.delta)); + } + + if (params.initial_epsilon < 0.0) { + throw std::runtime_error("Bad initial epsilon in Wasserstein" + std::to_string(params.initial_epsilon)); + } + + if (params.epsilon_common_ratio < 0.0) { + throw std::runtime_error("Bad epsilon factor in Wasserstein " + std::to_string(params.epsilon_common_ratio)); + } + + if (set_A.size() != set_B.size()) { + throw std::runtime_error("Different cardinalities of point clouds: " + std::to_string(set_A.size()) + " != " + std::to_string(set_B.size())); + } + + DynamicTraits traits(params.dim); + + DynamicPointVector set_A_copy(set_A); + DynamicPointVector set_B_copy(set_B); + + // set point id to the index in vector + for(size_t i = 0; i < set_A.size(); ++i) { + traits.id(set_A_copy[i]) = i; + traits.id(set_B_copy[i]) = i; + } + + if (params.max_bids_per_round == 1) { + hera::ws::AuctionRunnerGSR auction(set_A_copy, set_B_copy, params); + auction.run_auction(); + return auction.get_wasserstein_cost(); + } else { + hera::ws::AuctionRunnerJacR auction(set_A_copy, set_B_copy, params); + auction.run_auction(); + return auction.get_wasserstein_cost(); + } +} + +inline double wasserstein_dist(const DynamicPointVector& set_A, const DynamicPointVector& set_B, const AuctionParams& params) +{ + return std::pow(wasserstein_cost(set_A, set_B, params), 1.0 / params.wasserstein_power); +} + +} // ws +} // hera + + +#endif diff --git a/wasserstein/tests/data/test_100_A b/wasserstein/tests/data/test_100_A new file mode 100644 index 0000000..8d126f0 --- /dev/null +++ b/wasserstein/tests/data/test_100_A @@ -0,0 +1,100 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 +3.79915 4.51283 +3.17645 3.75321 +0.61305 0.998622 +0.445643 1.13781 +6.38205 6.53669 +5.96392 6.44093 +7.21047 7.26005 +0.6703 1.26593 +0.529933 1.7027 +7.92495 8.83023 +2.1382 2.71695 +3.79209 4.5197 +5.23354 5.82214 +-0.395097 2.18831 +3.22028 3.88648 +5.56262 5.79949 +8.39623 9.37185 +2.7452 3.84539 +9.5022 10.2414 +1.01374 1.40504 +3.2029 3.89559 +7.61236 8.28485 +6.4371 6.909 +4.45616 5.35067 +1.57802 1.77895 +6.5991 7.76339 +6.66729 6.71714 +6.11898 6.57121 +2.60663 4.36396 +-0.259613 1.17683 +7.72857 9.48862 +4.68398 5.51521 +4.87447 5.4233 +6.86301 6.88244 +4.17814 4.25886 +8.70558 9.72902 +4.40873 4.57389 +6.1824 7.05049 +7.97557 8.79739 +8.52591 8.6985 +5.15336 5.27796 +9.70144 9.77031 +0.561778 1.39045 +9.32553 10.2456 +7.01495 7.74521 +6.83355 7.28255 +1.96721 3.01504 +5.78411 7.59464 +5.64012 6.10721 +3.7249 5.17086 +4.33297 5.91657 +7.11793 7.2545 +5.109 6.76878 +3.02787 3.04077 +0.999365 2.05566 +8.81392 8.9086 +6.20106 6.78943 +6.7987 7.05794 +0.438805 0.449602 +8.71793 9.79853 +-0.150282 0.51997 +5.72257 5.93156 +5.71098 6.09535 +9.0378 9.45942 +0.534987 0.872885 +7.72276 8.57754 +9.26069 9.40289 +4.148 4.80519 +1.04579 3.18109 +0.259767 0.93215 +0.250608 0.511569 +4.88108 5.62239 +4.6731 5.3348 +7.84979 7.93545 +0.912521 1.48142 +4.82553 5.38108 +6.02179 7.61665 +3.85848 6.39418 +5.10754 6.02118 +1.71956 1.86238 +6.47336 6.74034 +-0.0371018 0.212738 +3.97259 4.15465 +2.17413 3.20188 +4.49098 6.09812 +6.62445 7.84196 +6.57541 7.432 +6.81052 9.6653 +3.67502 4.69734 +3.92378 4.14743 +5.93127 6.46154 +0.63424 0.705454 +7.60129 9.23263 +4.23064 4.74575 +0.397705 1.24458 diff --git a/wasserstein/tests/data/test_100_A.pd.dipha b/wasserstein/tests/data/test_100_A.pd.dipha new file mode 100644 index 0000000..e94f5fe Binary files /dev/null and b/wasserstein/tests/data/test_100_A.pd.dipha differ diff --git a/wasserstein/tests/data/test_100_B b/wasserstein/tests/data/test_100_B new file mode 100644 index 0000000..852799d --- /dev/null +++ b/wasserstein/tests/data/test_100_B @@ -0,0 +1,100 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 +3.77337 5.2686 +8.31344 9.05384 +0.734064 1.14844 +7.57606 7.8521 +3.16719 3.86953 +2.55072 2.64932 +9.51707 9.6071 +0.304643 2.41784 +2.79925 3.28234 +5.32901 7.7576 +5.19903 6.30449 +1.87819 2.99454 +8.92272 9.67105 +4.62414 5.05592 +4.0079 4.64148 +2.26369 3.44573 +2.69335 3.13426 +1.90706 2.42652 +2.68113 2.79133 +1.41065 1.56018 +6.55282 7.18725 +5.72986 6.37151 +7.26968 8.22623 +3.32643 3.73606 +3.77325 4.63115 +1.05457 1.83651 +8.6815 8.85251 +3.91285 4.17139 +0.380936 0.842109 +7.33227 7.69334 +8.45635 8.923 +4.1769 5.08373 +0.501374 2.23328 +-0.161782 1.28908 +3.44716 3.4662 +3.15394 4.30243 +8.71416 9.3781 +6.3034 8.62893 +6.53824 7.04611 +0.6386 1.35269 +0.862088 0.960371 +5.12963 5.20203 +1.58695 2.0452 +6.57698 6.63228 +3.87747 4.45669 +1.51273 3.25669 +-0.0992804 0.667302 +4.7489 4.80059 +0.0280559 1.90471 +6.7462 8.27612 +0.915652 1.30007 +2.79556 3.77404 +9.87989 10.0722 +9.39105 9.84229 +7.57235 9.37122 +5.09426 6.44266 +6.3994 6.72037 +5.73441 6.99341 +6.9079 7.88049 +4.2003 4.41933 +-1.72447 2.25877 +9.04907 9.64323 +4.40473 5.3593 +9.31201 9.96079 +7.28343 8.74163 +3.0172 6.23779 +8.08422 8.56069 +6.83038 6.99863 +2.32038 3.1289 +7.42302 8.26286 +6.66905 7.18496 +0.730748 1.61335 +4.00564 5.73993 +2.81231 3.67489 +2.33178 2.37845 +9.03302 9.68681 +0.567816 0.755485 +7.89783 8.7621 +0.177662 0.332833 +-0.181569 1.36821 +6.22158 6.55787 +4.67115 5.16995 +0.806432 0.820738 +7.69636 7.87402 +4.40933 4.54995 +9.1329 9.15037 +8.87416 9.04329 +1.14349 1.8993 +3.29756 4.7172 +6.67873 8.31364 +6.91238 7.1654 +0.483084 1.55006 +2.66058 3.86294 +5.93347 6.06085 +7.40514 9.05071 diff --git a/wasserstein/tests/data/test_100_B.pd.dipha b/wasserstein/tests/data/test_100_B.pd.dipha new file mode 100644 index 0000000..25d6734 Binary files /dev/null and b/wasserstein/tests/data/test_100_B.pd.dipha differ diff --git a/wasserstein/tests/data/test_200_A b/wasserstein/tests/data/test_200_A new file mode 100644 index 0000000..164b71d --- /dev/null +++ b/wasserstein/tests/data/test_200_A @@ -0,0 +1,200 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 diff --git a/wasserstein/tests/data/test_200_B b/wasserstein/tests/data/test_200_B new file mode 100644 index 0000000..761943d --- /dev/null +++ b/wasserstein/tests/data/test_200_B @@ -0,0 +1,200 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 diff --git a/wasserstein/tests/data/test_5000_A b/wasserstein/tests/data/test_5000_A new file mode 100644 index 0000000..094c6e0 --- /dev/null +++ b/wasserstein/tests/data/test_5000_A @@ -0,0 +1,5000 @@ +0.471299 1.89241 +2.82136 3.97846 +8.81923 9.20678 +1.42474 1.65425 +8.36963 9.16097 +-0.236476 0.692489 +7.57182 8.06148 +2.89878 3.21958 +7.1285 7.51707 +5.75496 7.09461 +6.00081 6.10914 +9.60869 9.64676 +7.42889 8.97174 +7.26061 8.55944 +2.41226 2.5146 +8.5616 9.44847 +7.4946 8.86962 +5.42244 6.98028 +9.62386 9.96039 +7.70591 9.92849 +1.34119 3.2048 +3.92169 5.15228 +8.82955 9.60318 +7.94213 9.39997 +2.6716 4.02057 +0.375206 0.497663 +1.94572 3.65599 +1.03366 1.46356 +8.91855 10.1838 +7.11087 8.64425 +2.63266 2.78706 +8.93611 10.2943 +8.51999 9.28356 +1.31436 3.13725 +1.92871 4.00178 +8.30503 8.45555 +2.58739 2.82076 +3.20419 5.29453 +7.4015 8.13225 +9.07991 9.74729 +0.822366 0.938371 +2.90508 4.29367 +4.32385 5.4787 +3.63054 4.6918 +8.52962 9.87004 +1.16994 2.39465 +2.61903 3.33772 +4.15505 4.52942 +8.7068 9.66579 +8.10373 9.31351 +0.7954 1.23001 +7.82253 8.69505 +4.59616 5.91996 +1.02032 1.93931 +6.98421 8.46017 +8.42263 11.3447 +2.63444 3.7158 +7.49059 9.1137 +-0.122109 1.41074 +8.29578 8.81161 +6.24793 6.32368 +4.07212 4.39695 +5.32453 7.457 +8.3892 9.82048 +4.35981 4.78063 +5.49932 6.08321 +1.0107 1.53369 +2.48759 2.94139 +4.24977 5.52034 +1.93104 3.35207 +-0.733247 1.22412 +-0.354283 2.36812 +6.34728 6.44213 +5.98172 7.8753 +5.47963 6.82986 +6.01986 6.6588 +4.62793 5.22134 +7.73923 8.29761 +8.85565 9.51494 +5.55307 6.15804 +6.30963 7.17248 +9.4775 10.2636 +7.45333 7.74006 +1.79317 2.33273 +7.73056 8.44999 +3.94172 5.02778 +8.36177 9.85172 +5.91765 8.12935 +7.95436 8.97583 +5.06238 5.37907 +4.56153 4.97175 +9.47572 9.65038 +9.54745 9.922 +7.82271 8.66299 +4.19056 4.75156 +4.15657 5.72352 +0.213845 0.312444 +2.30944 2.6806 +2.42391 3.41888 +6.00512 6.88274 +6.64546 7.61145 +-0.204229 2.78228 +-0.417104 0.667252 +8.18696 8.67785 +9.27818 9.67924 +-0.0174685 0.21355 +5.91137 6.39606 +9.49268 10.1457 +2.11362 4.36526 +6.51084 7.82167 +6.07066 6.44843 +-0.653518 1.08588 +7.46736 7.87137 +5.26045 7.92188 +6.4171 6.8133 +6.73709 7.70383 +3.46451 4.23679 +0.122365 0.809853 +7.98627 8.0505 +1.71192 2.63047 +1.20624 2.12087 +4.6812 5.51566 +2.62672 2.67648 +4.203 5.1052 +5.26482 6.5186 +3.68166 3.74701 +2.72011 3.98338 +3.41652 3.71477 +2.26211 2.90374 +0.930209 1.43211 +1.98603 3.36662 +4.55838 5.9933 +5.66292 6.59838 +3.12432 3.87457 +6.54384 8.38959 +0.205059 0.331022 +8.70617 9.34121 +7.02182 7.38679 +2.36908 2.84197 +9.13221 9.76563 +7.50113 9.49245 +8.15671 8.45093 +1.9517 2.20923 +3.23368 3.43695 +2.97273 4.10133 +7.36338 8.96733 +4.77525 5.18347 +9.47774 10.3537 +1.75218 1.97051 +5.42544 6.18939 +9.75801 10.0151 +6.31285 6.38327 +8.43389 8.721 +7.6108 7.81113 +8.72029 10.3153 +5.18655 7.1101 +7.96243 8.43151 +0.798103 0.860125 +1.1289 2.77549 +5.91084 6.03085 +4.95884 5.46913 +5.88125 6.49667 +7.9394 8.9545 +5.07492 5.55063 +5.92251 6.08548 +3.88602 5.41487 +1.40122 2.15276 +8.74244 8.83223 +4.75577 6.60338 +0.921272 1.44873 +3.77361 3.90348 +8.8999 9.8518 +3.11077 4.85674 +8.56185 10.6345 +8.76335 9.00169 +6.8734 8.60197 +4.54408 4.93892 +5.57849 6.31727 +7.95161 8.30843 +1.55798 2.4957 +3.86082 3.97131 +6.45433 7.17065 +0.96021 2.32897 +6.84576 6.89531 +8.59095 8.70199 +3.57754 4.26457 +5.27979 5.74385 +2.06602 2.90525 +3.0856 4.18179 +2.76214 3.9982 +2.11943 5.4285 +3.1197 3.24389 +0.495798 1.23632 +3.18253 3.99433 +7.02072 8.37949 +2.77905 3.42643 +1.57093 2.30655 +7.10979 7.14006 +6.20994 6.72092 +8.15136 8.33899 +0.903753 1.57921 +0.380744 1.88053 +1.3164 1.79885 +0.199366 0.576639 +5.53683 6.49433 +8.8705 9.14396 +3.1401 3.98761 +4.82675 6.69396 +7.28593 8.08916 +8.11312 9.92914 +3.25737 3.42109 +2.58413 4.57223 +2.65202 2.77196 +-0.31616 1.51568 +4.1621 5.29563 +4.49155 5.21037 +7.28481 7.31722 +9.70568 10.0406 +2.39057 2.85874 +2.30626 3.16244 +1.15896 2.09616 +5.91343 7.33024 +-0.172181 0.177363 +5.08934 6.10928 +7.15508 7.55315 +4.43036 4.68093 +6.00772 6.49566 +7.9247 8.43809 +1.57028 2.52328 +3.45458 4.43692 +3.18257 4.83824 +1.48243 1.91225 +2.59025 2.99596 +6.93059 8.34359 +4.53752 7.51216 +6.42857 6.51513 +5.5663 6.13877 +7.54367 7.56485 +9.01229 9.19913 +2.84158 3.23347 +0.42959 0.620618 +8.77033 9.33787 +8.06103 8.30989 +6.48425 7.83668 +4.66949 6.00205 +4.46683 4.66247 +8.96738 9.07714 +0.463093 0.514808 +7.72986 9.44537 +6.31391 6.8289 +0.883295 1.70946 +3.73278 3.98015 +6.73453 6.92514 +3.58434 4.43262 +0.236286 1.4601 +2.00505 2.38684 +3.845 4.20708 +1.18852 3.04911 +0.766784 1.00641 +7.38781 8.11216 +8.9396 9.27589 +0.369822 1.53322 +8.76527 9.23987 +0.663408 0.803445 +9.69209 10.1455 +9.73379 10.234 +3.47602 4.89968 +4.12754 5.45249 +7.31984 8.57369 +0.989101 1.47678 +5.57662 5.83292 +4.99092 6.85044 +4.35272 4.3683 +0.0517815 1.92227 +7.2694 7.80634 +1.35565 1.42783 +8.5638 8.91707 +1.74557 2.74123 +2.18226 2.19664 +-0.901334 1.32691 +0.866613 1.03788 +5.30895 6.31774 +7.70178 8.5675 +4.06894 4.16071 +2.59697 3.53162 +4.30201 5.34212 +4.08762 4.19091 +-0.516192 0.848397 +9.85911 10.1066 +0.472991 1.40069 +6.26012 7.0054 +0.707801 2.15445 +1.73825 1.87193 +0.206301 0.831746 +7.77872 7.92715 +4.94477 5.60361 +3.86216 5.16839 +1.35166 1.54482 +2.91721 3.56193 +4.57242 4.75913 +7.09303 8.29678 +8.18431 8.92151 +6.80303 10.87 +1.29208 1.72027 +1.22224 1.31693 +5.26756 6.26459 +2.55221 3.94397 +6.58902 6.78354 +7.85917 8.89791 +6.59279 7.63115 +4.45787 7.26828 +3.48759 5.33991 +2.13838 3.86589 +1.53368 3.57313 +1.41722 3.19336 +3.48388 4.11958 +1.53756 2.98451 +7.29083 8.22109 +1.2713 2.16915 +6.94685 7.31029 +6.2494 7.04676 +3.00376 3.02028 +1.25232 1.43301 +1.50413 2.25 +2.89098 4.77198 +4.50766 5.89294 +5.5403 6.07893 +-0.101858 0.409209 +3.87963 6.1053 +-0.19564 1.46589 +-0.342077 0.694623 +6.63875 7.42223 +7.89982 9.05857 +4.91121 5.48031 +5.90743 8.35815 +7.13881 8.21597 +4.11493 5.08147 +3.59673 3.77176 +8.08236 8.3237 +1.35842 1.48934 +5.42963 5.85906 +4.60778 4.9734 +-0.607198 0.91225 +5.40263 5.7017 +5.08624 5.63236 +7.34529 9.02233 +7.30013 8.12907 +6.56106 6.75585 +6.82576 7.25434 +2.96037 3.56454 +3.60283 4.09137 +6.35408 6.71888 +-0.688103 0.84579 +8.45128 8.69771 +6.31749 7.3294 +5.82223 6.04761 +1.72983 2.38205 +6.94974 7.76985 +9.681 10.0141 +8.65394 9.2456 +2.52904 3.39548 +6.66609 7.35785 +4.18963 4.5473 +3.58643 3.80513 +2.88796 3.82413 +0.992066 1.1477 +4.57942 5.15419 +3.02826 4.32268 +5.91565 6.82087 +4.13694 5.13393 +6.28717 6.53257 +1.3149 2.36944 +0.488974 0.981461 +4.32763 4.98272 +-0.420836 0.63619 +7.13406 7.31362 +0.367782 1.91138 +6.14763 6.16713 +0.837933 1.92794 +9.3781 10.0609 +3.22887 5.44584 +5.91554 6.65974 +5.68608 6.02435 +7.99715 8.55953 +5.37106 5.38574 +0.254544 0.374268 +0.184701 0.917061 +9.38005 9.54042 +6.86741 7.35628 +0.87398 1.69093 +7.75845 8.53773 +0.370425 1.35335 +0.699837 0.810893 +3.73223 4.32089 +3.81804 3.85752 +4.85936 5.10097 +2.70381 3.10519 +3.82523 5.27699 +9.13422 10.3317 +4.62775 4.77988 +7.91139 7.95504 +2.72614 4.79958 +0.863357 1.88643 +4.14155 5.02327 +2.49683 4.11585 +1.06741 1.11516 +6.20979 8.38443 +0.936362 2.46703 +6.58231 7.85063 +1.89469 2.31422 +8.70668 9.14006 +5.76486 6.1122 +3.15778 3.76679 +0.248282 2.19881 +1.25317 1.92694 +7.81837 9.53067 +-0.582906 0.818904 +8.34194 8.37845 +4.4913 5.10164 +3.86376 5.5453 +6.94054 7.68699 +2.07462 2.5811 +0.518698 2.1529 +3.51773 4.60946 +8.39915 8.98446 +1.63685 2.19755 +6.60737 9.05917 +2.06667 3.23994 +3.18822 3.31219 +2.44332 3.22088 +4.755 4.87118 +4.34245 4.91565 +4.64562 4.8104 +2.73282 3.35646 +9.48057 9.86441 +0.640899 1.03356 +0.789475 0.925731 +1.4247 1.58347 +1.47747 2.25408 +8.8612 9.81597 +8.44147 10.6885 +9.07046 10.0877 +0.350125 1.15765 +4.45375 5.73964 +4.06526 4.26457 +7.50776 8.23491 +1.55452 1.63786 +2.8399 4.52559 +1.34319 1.47951 +5.21572 5.65702 +5.85695 6.75574 +8.21826 10.657 +-0.0479956 1.79162 +1.72905 1.78113 +3.35685 4.03797 +3.7123 5.82296 +8.56751 10.2992 +4.07987 4.25273 +5.8347 6.07253 +3.25283 3.99065 +9.31995 10.3647 +0.649025 1.14496 +1.06966 2.04182 +7.59831 7.85826 +3.35263 3.84374 +4.91371 5.10148 +8.0875 9.23421 +3.00484 5.14282 +8.60448 9.09442 +5.61429 6.24037 +3.4729 4.17907 +7.18702 7.26274 +0.729966 0.928899 +2.27264 2.81241 +2.67248 3.91661 +3.98443 4.64406 +5.50463 6.92435 +-0.257961 0.905736 +5.71363 6.67387 +4.12643 4.66467 +3.97623 4.64917 +9.71227 9.8243 +8.66674 8.97634 +7.94673 8.73904 +7.45228 8.14466 +3.78405 4.81189 +4.05505 5.00011 +2.84957 3.15451 +6.93785 7.58172 +1.85006 1.96814 +6.82256 7.00166 +2.42727 2.68161 +8.06129 8.76308 +1.53758 3.67482 +2.5057 4.18495 +7.09618 7.79664 +1.12843 1.46228 +1.61447 2.2668 +5.58639 5.70776 +8.15398 8.34959 +2.49733 2.57643 +5.18817 5.32462 +5.62963 5.86377 +1.95215 2.26641 +7.22129 7.23255 +5.99833 6.18639 +6.20875 7.13868 +6.814 7.6597 +7.41314 9.49798 +5.48819 6.31634 +4.81318 5.08156 +9.15434 9.42787 +4.83201 5.43295 +1.44477 2.6455 +8.8907 10.4727 +3.19487 3.21255 +1.47291 3.13113 +4.14796 5.10058 +5.85016 8.41212 +7.58183 8.53659 +9.5978 10.2877 +1.5954 2.58394 +2.65561 4.0975 +-0.157024 0.16627 +7.04379 7.75368 +2.39896 2.7728 +2.42376 3.58085 +0.158653 0.857045 +7.82101 9.01833 +6.80499 7.35261 +6.62833 6.66255 +4.90229 5.45681 +8.50205 8.69236 +2.01845 2.06924 +8.2503 9.04222 +4.58265 5.52758 +8.6176 9.74887 +1.28468 1.77019 +5.40424 6.20705 +0.943905 1.98023 +4.2702 4.41287 +3.89454 4.4814 +0.585132 1.56351 +9.45354 10.5374 +3.7501 5.07553 +7.53248 8.14004 +4.60026 4.78921 +1.61073 4.22368 +6.22591 7.40966 +0.57866 1.0522 +5.877 6.55882 +3.54573 3.7731 +7.64294 7.66103 +8.2399 9.14032 +0.307808 0.571367 +7.89791 9.25734 +5.2852 5.84332 +0.45713 2.42223 +7.73426 8.48158 +8.0058 9.46405 +8.03189 8.41868 +1.54624 1.98914 +7.24167 7.27699 +8.61226 8.83199 +5.38365 6.52599 +0.827018 1.51428 +7.19285 7.48372 +-0.0969552 2.16007 +4.08084 6.32563 +9.16026 10.2604 +0.206147 0.717435 +4.00643 4.8093 +2.16139 3.14759 +1.73359 3.13485 +9.1103 9.36052 +7.05621 7.43901 +4.83509 6.07581 +5.67164 7.89488 +7.93353 8.18454 +2.59566 3.1842 +3.62521 4.95121 +3.0297 3.18649 +1.08515 2.69289 +3.77063 5.7789 +0.106035 1.27409 +0.601099 2.13481 +6.98837 7.58833 +9.22955 9.79149 +1.6398 1.78726 +2.30423 3.34814 +2.3912 2.81842 +4.71724 6.16966 +5.13553 5.5016 +5.34117 5.45075 +9.32776 10.0676 +4.54244 5.29058 +4.01337 5.73188 +8.17427 8.39652 +1.96122 2.6921 +0.594267 1.00176 +-0.136973 0.977133 +6.41362 6.78056 +1.68388 2.39891 +9.50795 10.2315 +-0.262703 1.15557 +8.72229 9.683 +5.41821 5.67519 +4.93514 7.15867 +4.07046 4.26702 +-0.00866106 0.252353 +8.65877 10.1527 +2.10958 3.40353 +2.94947 3.43201 +6.32014 7.06279 +2.55034 2.89646 +3.87777 5.68044 +2.05325 3.00968 +5.11855 6.55784 +8.99618 9.22608 +3.36303 3.84902 +2.6234 3.70832 +7.35189 8.30856 +6.43777 7.28495 +5.33954 5.48055 +0.15999 0.391114 +3.4492 5.07088 +2.38503 2.42742 +3.88912 4.93246 +2.76303 4.54991 +6.56261 7.60381 +3.64198 3.72471 +1.70542 1.78806 +9.71115 9.88315 +0.471586 1.82377 +9.27611 10.5725 +0.486889 0.851587 +4.39234 5.10637 +9.54209 9.8955 +6.99602 7.42461 +2.98797 3.74623 +5.89424 6.4498 +9.63845 9.86333 +4.39828 5.18646 +2.30118 3.5758 +8.68128 9.56011 +9.00505 10.4304 +-0.22184 0.233296 +6.48492 7.60283 +1.54156 2.60693 +4.06808 6.39369 +5.52361 6.26241 +-0.698727 0.745524 +2.30742 2.41924 +0.655833 1.65752 +6.94733 7.81866 +7.83136 9.10651 +6.45284 7.1931 +6.09683 6.66159 +9.03299 9.4163 +1.86392 3.26189 +0.54863 2.07194 +0.364026 1.38376 +0.706954 1.0736 +-0.111015 0.584367 +1.54265 2.1413 +0.501172 0.57928 +2.09411 2.28902 +1.89894 4.09104 +8.72895 8.87045 +5.27709 5.72545 +0.164581 1.64188 +8.39203 8.73608 +8.21523 8.45002 +9.62006 10.1665 +4.79076 6.26442 +3.44189 3.68669 +8.93789 9.38343 +7.07036 7.64194 +8.34396 9.56445 +8.29992 8.64954 +5.82566 7.83287 +2.43008 3.4476 +1.81121 2.12203 +4.36108 4.3842 +6.28756 6.95939 +3.8698 5.79519 +0.644581 0.699162 +9.71982 10.2422 +4.86545 5.00544 +8.3808 9.29356 +1.34495 1.40972 +1.03641 2.01838 +8.55609 9.99958 +1.40813 3.46097 +3.20928 4.08838 +8.24345 9.11587 +1.27604 2.03462 +8.28298 8.46252 +2.20644 3.19585 +1.91396 2.30108 +4.2553 5.66006 +7.34925 8.38275 +6.28319 7.22199 +8.42171 9.62596 +1.12059 1.18262 +1.37555 1.84196 +4.39663 4.93639 +9.28044 9.58437 +5.47407 6.88593 +8.36529 8.49813 +9.40208 10.5922 +-0.451389 1.92404 +2.89431 3.19453 +6.51433 8.02158 +5.52163 6.06786 +7.63525 9.86457 +4.13898 5.05845 +0.136662 0.503748 +6.13492 6.74997 +8.37416 9.18971 +8.64164 8.82663 +0.941173 1.16158 +6.9073 8.26916 +8.37278 8.44326 +8.8951 9.20427 +8.40149 9.17577 +3.60361 4.57183 +8.67263 10.1127 +5.89716 6.45412 +1.97285 2.35593 +7.22973 8.13467 +9.55645 9.92529 +0.261578 0.836274 +9.04414 9.45485 +6.18043 6.54229 +8.88579 9.54087 +1.82613 2.93849 +5.7599 5.96366 +5.23105 5.5541 +0.425229 1.44436 +0.32065 2.60892 +7.83655 9.48786 +2.3168 3.45972 +2.35466 3.23342 +8.24494 8.27258 +7.32678 7.74264 +8.37275 10.0741 +4.17337 4.98348 +-0.162009 0.724431 +9.49757 9.76377 +8.69435 9.08089 +4.13841 4.7514 +7.26358 7.55514 +6.91912 6.93 +6.7883 7.18296 +-0.614315 1.1857 +6.05907 7.33557 +4.86704 4.87705 +8.50012 9.14836 +1.83683 3.09895 +6.16389 8.39248 +3.03556 4.41004 +4.72416 5.05782 +1.98183 3.19183 +2.77103 5.71501 +4.90002 4.9817 +0.269258 0.725628 +5.59551 7.05038 +2.95416 3.09633 +2.17662 3.18385 +6.67536 7.56762 +7.31678 7.39321 +3.84158 3.85359 +4.38203 5.10149 +0.816784 1.09918 +0.70131 0.739502 +0.276631 2.32633 +9.15839 9.49433 +0.721295 1.97673 +2.63875 2.75437 +5.00344 5.5645 +2.24555 2.81234 +7.74465 9.07646 +2.35244 4.90632 +0.812093 0.954419 +3.97904 5.2071 +4.19177 4.83646 +0.853012 1.331 +2.64112 3.25613 +0.0894716 1.61954 +3.39617 3.40859 +1.56906 2.28518 +2.37258 4.36515 +1.60997 1.7561 +5.15275 5.33281 +6.47824 7.47529 +2.51145 3.29949 +2.71094 2.77785 +8.84653 9.48398 +1.3246 1.66664 +7.43718 7.5546 +3.68985 4.24649 +4.50553 4.51669 +4.15617 4.54887 +8.55319 10.2136 +2.1448 3.55805 +4.64594 4.71505 +1.71763 1.99977 +4.98066 5.46709 +7.7779 8.36497 +-0.0604997 0.301294 +5.11873 7.32867 +4.94567 5.5986 +5.32645 6.26835 +2.5768 3.13511 +3.31604 3.87555 +1.60834 2.68762 +3.30552 3.85211 +4.26741 4.98636 +0.820475 1.18854 +7.91501 10.7203 +5.17391 5.30351 +4.00452 5.75141 +2.37722 3.4602 +2.2373 2.94837 +1.62462 3.48264 +7.98507 9.2566 +5.32504 5.56388 +0.760614 0.7802 +0.855659 1.01522 +3.11231 4.43223 +5.62821 6.21564 +4.96845 5.35921 +8.10559 9.11106 +1.02533 1.13103 +6.99976 7.0788 +1.87628 2.58801 +1.11023 2.24655 +5.23343 5.45086 +0.95875 2.25343 +7.45917 8.23614 +2.72245 3.04663 +8.66816 8.70698 +5.55734 7.12262 +1.01935 1.88271 +0.804417 1.76187 +7.82703 8.78426 +4.77321 6.15199 +2.91503 3.69352 +0.776735 1.08883 +5.19981 5.46442 +9.06483 10.4008 +7.72082 8.26398 +2.9854 3.26573 +0.584028 2.60443 +0.700994 1.10379 +5.47612 5.94502 +-0.318442 0.986786 +5.0704 5.08055 +3.83732 4.4826 +5.60843 6.59005 +8.81432 9.7851 +6.28792 6.65284 +1.16812 2.27701 +7.15234 9.66795 +9.02188 9.15339 +1.76112 2.04839 +7.49419 7.6204 +5.1765 5.497 +1.45855 1.94969 +1.35003 1.55822 +2.50453 2.86815 +7.10451 8.51352 +3.87727 4.1124 +1.84876 2.79351 +3.01661 4.05396 +-0.16814 0.366484 +-0.538895 0.608786 +7.59933 9.00744 +0.938648 2.38471 +5.76934 6.16572 +8.20416 8.62505 +8.64542 8.7264 +2.75784 2.7828 +0.794451 1.97817 +9.21331 10.5156 +8.46671 8.80572 +3.94814 5.16845 +6.73654 6.97397 +4.05301 4.93008 +6.37833 6.77985 +7.21161 8.15994 +3.74993 4.61029 +-0.127938 1.09853 +2.82957 4.28816 +6.50564 6.59445 +8.37926 8.48332 +0.757443 1.74585 +0.232438 0.972293 +6.99187 8.7098 +7.20368 8.44301 +4.4801 6.07501 +4.34015 6.1495 +2.19394 3.22334 +7.29817 8.41021 +1.16627 2.68901 +4.62423 5.08039 +0.955655 2.22882 +1.45862 3.07065 +1.69815 2.56291 +4.01179 4.36587 +7.135 7.75829 +6.6823 7.27765 +5.44745 5.67195 +4.94594 5.42067 +0.267772 0.301939 +0.676432 1.6296 +1.37335 1.91645 +1.89051 2.38631 +4.84386 6.30539 +8.95613 10.944 +2.18119 2.41821 +5.74901 6.16952 +7.5431 7.88071 +9.05278 9.8128 +0.201334 1.65323 +2.82787 3.82083 +3.07073 3.08475 +8.99671 10.1766 +5.43261 6.12137 +4.83693 4.86848 +6.31804 7.21544 +2.34491 3.2562 +6.05941 6.53725 +-0.483381 1.17347 +5.53777 5.72651 +3.28875 3.47472 +3.94609 4.9418 +7.45585 8.6871 +1.50066 2.57215 +8.10112 8.67954 +6.24737 6.42635 +0.64413 1.05759 +7.1741 8.21476 +0.502722 1.77462 +0.783663 1.74174 +9.52704 9.9109 +-0.473873 2.01013 +7.07946 7.11474 +0.857335 1.6501 +4.00225 4.84453 +5.40598 6.30573 +8.18802 8.30067 +9.00412 10.9588 +9.8362 10.1517 +7.62735 8.37572 +3.41477 4.63099 +2.51254 2.81559 +6.36702 6.56061 +5.11842 5.35515 +5.21873 5.73296 +5.73528 7.77276 +3.64993 4.66826 +7.12664 8.46553 +8.7257 9.16851 +1.27615 2.20376 +7.46188 8.20752 +2.64939 2.66373 +4.94147 6.0509 +6.3805 7.48841 +6.25197 7.12327 +0.0885331 1.2682 +4.97356 6.58488 +4.11917 4.27267 +9.08793 9.70385 +0.897277 1.31702 +6.87538 8.25544 +1.55565 1.59492 +2.62483 3.54274 +1.49631 2.92263 +9.45305 9.97728 +6.24087 6.4577 +3.94636 5.13669 +-0.000956745 1.08235 +1.46134 1.83767 +9.18517 10.6601 +-0.740186 1.81269 +5.81977 6.15818 +7.0529 7.99421 +6.17753 7.49749 +8.63091 9.04205 +9.65219 10.1558 +3.12839 4.99211 +2.97262 4.07384 +4.28605 4.33171 +4.15906 5.6805 +1.35165 1.50732 +0.524207 2.12307 +5.32468 7.01472 +3.16982 4.87893 +6.88786 8.34191 +3.81703 5.22335 +3.86772 4.37359 +8.19386 10.0705 +1.73155 3.16695 +4.31685 4.62261 +9.40618 9.89612 +4.41215 5.19659 +2.35595 2.63543 +7.88481 8.14203 +7.17062 10.3534 +9.41379 10.389 +7.99867 9.01239 +3.31382 4.04915 +5.39222 6.07657 +8.5187 8.65976 +9.30132 10.6131 +7.17351 7.93596 +4.80134 6.72724 +3.59756 4.65182 +1.08248 1.17479 +1.03124 1.06871 +6.43154 6.95098 +-0.102199 0.59801 +4.94795 5.18081 +6.39126 7.30258 +1.52738 2.04271 +1.80373 2.33093 +2.72251 3.01677 +0.296722 1.10844 +6.39104 6.51567 +8.70965 8.78714 +2.07858 4.41695 +1.91027 2.9718 +1.42944 2.01864 +1.96347 2.73397 +4.0701 4.22456 +4.02859 4.05107 +7.10977 7.98092 +8.21148 9.54287 +6.59231 7.65109 +0.144191 0.830665 +2.0192 2.23704 +8.03482 8.39591 +8.90473 9.98543 +2.18284 2.70166 +3.05569 3.54238 +8.35319 9.39539 +2.00803 2.42866 +2.35282 3.13763 +2.20155 2.79377 +1.76531 2.94892 +7.52749 7.72567 +3.02266 3.24778 +4.01741 4.22521 +9.75263 9.91571 +6.45502 6.67838 +2.24912 3.47262 +1.84372 2.26517 +4.09559 5.71188 +1.43811 2.33732 +3.89171 4.16905 +3.01506 3.9725 +0.0273168 1.51766 +5.04118 5.80507 +3.08517 4.17316 +8.81637 8.8332 +8.74055 9.50143 +2.36904 2.69008 +6.39733 6.44221 +8.53272 9.51114 +9.48423 9.55002 +8.65645 9.04872 +6.66352 7.48009 +5.64389 7.88656 +5.75301 6.6759 +3.28645 4.22757 +4.99482 5.82988 +3.00004 4.0273 +1.45249 1.56662 +4.96263 5.32195 +7.91351 8.1437 +1.02034 1.56249 +0.71376 1.73319 +0.709968 1.44651 +9.01414 9.54799 +4.02116 4.68005 +7.10903 7.27075 +7.21322 8.71031 +1.6644 2.27186 +3.71304 4.68764 +9.66257 10.1452 +5.34477 5.46136 +9.27722 10.583 +3.82328 4.83316 +4.77019 5.07928 +9.07112 9.23836 +6.99091 7.25634 +2.11871 2.3054 +7.88242 7.98572 +0.570809 0.714073 +8.51532 9.49151 +0.329247 2.48897 +4.78202 5.36476 +1.47969 2.78867 +6.75011 7.36769 +2.31162 2.39533 +3.50434 4.48026 +5.84603 6.28861 +7.5337 7.62538 +1.09955 2.85741 +6.09915 7.20381 +0.933825 2.37925 +0.576363 2.0182 +3.12126 3.22507 +2.85313 3.02656 +3.25724 3.92077 +5.48575 6.58011 +1.02824 1.65415 +8.68703 9.06219 +3.28389 3.86349 +5.80264 6.12775 +7.11846 7.47444 +1.29638 3.38601 +6.37908 7.05986 +-0.592438 0.854361 +0.39233 1.17768 +2.1497 3.94423 +2.42336 2.43441 +6.94806 8.30626 +0.79865 1.4173 +1.41455 1.43684 +0.240074 1.16712 +4.18593 5.9929 +6.161 6.564 +0.726091 1.90706 +0.375606 0.694866 +4.09349 4.26452 +2.01652 2.68038 +8.99301 9.90549 +8.93909 9.17673 +1.10427 2.01247 +9.12668 9.15282 +1.08098 1.55374 +0.377836 0.414809 +7.28611 8.86318 +8.3542 8.53251 +3.86353 4.12875 +6.7631 7.40068 +4.61679 4.78182 +2.12935 3.45492 +3.68233 4.0457 +6.68131 8.22111 +8.79197 8.80474 +1.8915 2.26287 +0.387586 3.073 +6.46798 7.57381 +7.79742 9.34526 +-1.21538 1.67303 +2.07845 2.66028 +3.14148 4.46647 +1.66789 2.73375 +8.49821 10.0574 +8.42537 8.89906 +0.618349 2.72887 +6.8229 7.54501 +6.99343 7.35322 +7.34223 8.68781 +3.18834 3.98274 +8.86908 10.2535 +3.39839 3.76171 +0.188168 0.392276 +1.68187 3.53401 +6.50423 6.71714 +7.61191 8.89715 +1.68463 2.09275 +5.94627 7.6003 +2.15865 3.24126 +7.93639 8.53826 +2.99626 3.43273 +7.71028 8.41172 +3.19472 4.60878 +8.36123 8.92549 +8.92975 9.02783 +2.87187 3.49672 +6.76949 7.71139 +8.09121 9.31151 +6.84199 7.44009 +0.730655 0.800873 +7.5208 7.54109 +6.75992 7.55017 +6.09818 6.17399 +0.639209 1.27283 +3.01917 3.22327 +1.69181 2.60614 +9.49245 9.5842 +-0.418034 1.08035 +5.77705 6.4705 +6.79362 8.51993 +9.73155 9.81609 +3.71503 3.92022 +6.18589 6.77634 +3.94124 4.23942 +7.59911 8.05275 +3.68865 5.10948 +7.63926 8.63019 +-0.049855 0.0844425 +-0.41188 0.807786 +1.35962 1.81039 +5.40579 6.15098 +1.38594 2.0059 +6.93444 8.71958 +7.01229 9.38008 +-0.0974976 0.962679 +4.74131 6.59152 +1.02343 1.59245 +1.55629 1.9128 +6.28353 8.38021 +5.66349 5.79644 +1.72629 2.28563 +1.64539 2.82654 +0.359466 1.05106 +4.37569 4.82703 +5.87657 6.37853 +1.46316 1.65333 +7.44494 7.5985 +1.16846 1.98579 +4.43371 4.93234 +2.31838 2.47777 +7.52687 8.44423 +6.08056 7.42253 +9.16144 9.94783 +4.74382 4.95616 +0.248344 1.05335 +6.12345 7.43941 +9.45647 9.99799 +3.77124 4.75199 +3.31315 3.44873 +-0.0909828 1.51271 +7.03234 8.02546 +8.11403 9.11461 +6.734 7.34799 +1.08903 1.18319 +2.72871 4.31607 +6.53688 7.52754 +1.07868 1.27792 +6.28409 6.56795 +4.89866 5.79458 +9.06994 9.1221 +2.54989 3.14338 +3.69971 5.71717 +3.7113 4.55076 +8.91864 9.64522 +8.75634 8.82359 +9.02242 9.03869 +3.59945 4.20169 +4.98557 5.07401 +4.81526 5.74009 +7.264 8.63749 +2.79579 4.43389 +2.87204 4.66432 +2.32487 3.72127 +3.99704 4.72567 +8.17229 9.0158 +-0.72926 0.823658 +2.52355 3.32725 +5.3446 6.63868 +4.48935 7.37833 +3.08173 3.0968 +2.41585 3.23026 +9.23187 10.5413 +5.50099 5.51888 +1.29634 1.88846 +-0.0113225 1.41526 +6.34508 7.53417 +0.383019 2.25144 +5.0649 5.40222 +3.08221 3.76296 +9.29111 10.6833 +2.19714 2.94735 +8.75711 9.48583 +8.61564 8.69349 +1.9362 3.96191 +3.7962 4.44382 +7.78501 9.03843 +5.79649 7.29675 +6.03048 7.4316 +1.31105 4.36446 +6.5882 7.03622 +4.88148 7.12474 +6.62305 6.90973 +2.27488 2.73731 +8.42703 9.28888 +7.72928 8.53989 +7.27021 8.63879 +0.992908 1.92001 +-0.282737 0.511292 +7.88963 8.03117 +6.93371 8.26148 +-0.0346633 0.403617 +8.7827 8.82558 +5.16876 5.59742 +8.61275 8.73843 +5.70578 6.02783 +9.08706 9.35903 +9.32728 9.83021 +9.20058 10.2497 +6.79824 7.3024 +7.17979 7.51783 +0.918555 2.67878 +7.9662 8.63241 +8.85903 10.3145 +9.34614 10.1964 +9.05027 9.79872 +8.28959 8.45837 +1.32518 2.04557 +8.72848 9.16742 +5.92126 6.77277 +8.31504 8.78631 +1.02487 1.70172 +4.45204 4.72842 +8.20636 10.4724 +5.86211 6.25457 +6.15754 7.71303 +8.37832 8.82577 +4.25233 4.59417 +9.41451 9.95324 +9.372 10.4461 +1.8346 2.7144 +8.00681 8.14717 +7.03997 7.06753 +7.16892 7.70102 +7.01781 7.46799 +1.78526 1.7969 +1.63304 2.2011 +8.59718 8.61083 +9.43498 10.3636 +4.98718 5.32487 +3.65451 4.89601 +8.82368 9.11333 +-0.104862 0.598773 +4.97756 5.62342 +1.99876 3.24686 +2.32242 4.01096 +4.04914 4.77892 +3.81545 4.32583 +3.30153 3.46783 +3.14287 4.04718 +8.65711 8.76768 +9.09385 10.6898 +4.82771 5.64405 +5.98783 6.36785 +7.93397 9.6543 +4.89726 5.65486 +5.08717 5.22314 +6.59377 7.23748 +3.58289 3.98597 +0.177884 0.397629 +5.30856 5.79257 +2.53943 3.98007 +6.51217 6.59644 +0.196888 1.99904 +3.8709 4.1901 +2.37646 2.50997 +7.03837 8.13287 +6.8674 6.89535 +0.576964 2.08851 +0.902928 2.86981 +8.59261 9.20279 +5.96621 7.49899 +0.617602 1.83267 +2.29189 2.6361 +4.34207 4.61026 +6.19963 6.76443 +1.15955 1.44068 +5.25852 6.33905 +6.37306 7.53103 +9.13334 10.039 +8.67743 9.93959 +5.62973 6.04375 +8.32286 8.77042 +3.28772 6.1722 +4.97902 5.47249 +3.37765 5.07238 +4.58025 4.84341 +2.76807 3.18817 +4.27581 4.43023 +6.92572 7.68461 +0.279247 1.0561 +1.10903 2.61106 +6.71708 6.73132 +2.66415 3.75702 +8.0513 9.80334 +4.82466 6.04232 +2.59971 2.85768 +9.04689 9.73945 +3.48338 5.16622 +7.90925 8.92774 +7.30264 8.06247 +7.59087 8.26476 +0.150315 0.423068 +8.62726 9.74636 +9.01983 9.71707 +6.84007 7.40541 +8.87829 9.48342 +2.69214 3.71481 +0.580036 0.77289 +9.474 9.83397 +5.80151 6.08527 +3.63837 5.27137 +8.5848 8.65779 +7.88338 8.13276 +3.27992 4.20963 +6.21244 7.28079 +-0.348924 1.38478 +5.26688 5.93787 +3.78941 5.01009 +6.41929 8.38529 +1.41724 1.67733 +0.212821 1.58246 +0.0697189 0.160497 +9.57839 10.2377 +9.03332 9.70645 +4.94572 5.15163 +3.16999 4.536 +5.77494 6.68359 +5.89258 6.11852 +7.72257 8.21668 +8.42501 8.44905 +8.7196 8.86465 +4.392 5.1076 +1.88249 2.54422 +1.38092 1.60326 +5.04142 6.37374 +4.31795 5.91152 +1.79399 2.09314 +6.65405 8.32262 +1.36356 1.58538 +5.45456 6.55824 +4.95807 6.22848 +8.72077 10.2825 +0.745968 2.01546 +6.85041 7.11076 +4.82028 5.34442 +5.77673 8.01294 +8.58582 9.33714 +8.49884 9.21533 +9.05574 9.4096 +3.19932 3.27024 +9.50227 9.96685 +0.771636 1.0617 +9.00621 9.36397 +-0.097167 1.39463 +7.79622 8.43537 +8.05228 10.1504 +2.21685 4.17072 +1.82476 2.45381 +4.34408 4.56578 +9.27538 9.54701 +6.80153 7.44115 +7.38884 7.84448 +7.17526 8.00165 +5.85812 7.67326 +5.25545 6.30791 +5.68518 5.94055 +3.77685 4.1545 +0.530928 0.737248 +3.9772 4.59563 +8.96322 9.45618 +7.98322 8.44165 +3.42929 4.22329 +3.66445 4.7583 +-0.183652 0.434842 +3.16492 3.95726 +6.87407 7.89944 +5.08921 5.7745 +2.85466 3.04505 +7.12685 7.41248 +0.715419 0.876676 +3.47441 5.21753 +9.13594 9.87799 +5.52459 6.35691 +5.12544 6.12935 +2.44296 2.91543 +2.75148 4.19886 +1.43478 4.3919 +6.6352 7.07768 +4.72283 5.11506 +6.36434 7.69268 +2.32643 2.75289 +5.46566 6.22854 +6.37995 6.76989 +1.52564 3.55871 +1.05807 2.19393 +1.95374 4.08727 +8.11273 8.12767 +2.85955 4.71355 +4.89009 6.88516 +2.06859 2.25512 +7.50556 8.77923 +4.43353 5.11915 +5.16308 5.9695 +1.12072 1.69277 +3.96494 4.38143 +7.06931 7.89524 +0.514522 1.51265 +6.56389 7.01146 +1.51362 1.8541 +4.90339 5.51209 +2.11422 3.15457 +2.50094 3.92557 +8.24319 8.62826 +-0.0843505 0.710377 +6.35956 7.89457 +-0.790954 1.2964 +4.02253 5.19193 +2.7425 3.46763 +9.41469 10.1367 +1.57636 2.25105 +3.18647 3.38738 +8.36644 9.66791 +0.180846 0.461221 +7.07675 7.71881 +0.265366 1.19275 +5.43007 6.4854 +9.13912 9.23294 +9.52905 10.4029 +1.18712 2.66227 +5.22714 5.62601 +1.87413 2.8716 +5.71882 6.16374 +5.38169 6.13948 +-0.196005 0.236738 +5.36803 6.4395 +8.27713 8.71262 +8.82031 8.8598 +-0.53845 0.564783 +1.80716 1.94173 +5.67905 7.47291 +2.37779 3.64893 +0.574727 0.766424 +4.60701 4.86591 +3.17989 4.37738 +1.36777 3.15112 +1.48092 3.06573 +3.37009 4.06028 +4.17179 6.2073 +6.47953 6.88994 +5.74431 6.5253 +4.88827 5.49049 +5.44148 5.59239 +1.66153 2.63132 +7.69387 7.82267 +5.20911 5.48488 +-0.103218 0.497402 +7.18003 7.33324 +6.54305 8.81732 +0.278108 1.27452 +2.38323 2.94772 +1.2461 2.03246 +5.47052 5.75781 +7.31505 7.35895 +2.22248 4.23589 +0.0305319 0.430773 +8.32043 10.1222 +6.11732 7.09764 +5.08797 5.74991 +6.62491 7.34164 +5.55795 5.66083 +3.27549 4.13145 +1.0113 3.24631 +0.0717186 0.519738 +7.82905 9.30839 +9.90251 9.98691 +0.841457 0.952276 +-0.133927 0.510174 +1.14614 2.82218 +2.59767 4.19742 +3.41095 3.95265 +3.38951 3.75838 +8.86766 9.19437 +9.27927 10.261 +2.33249 2.79402 +5.69681 5.93469 +4.02502 5.38732 +0.797157 1.22845 +7.23558 7.8651 +1.1253 1.99184 +8.58296 8.64267 +-0.400141 0.74698 +3.46677 3.50526 +6.03252 6.64842 +5.8493 6.68938 +3.53209 3.84014 +7.22078 8.98106 +6.21943 7.69944 +0.887198 2.07323 +3.36591 4.57442 +4.30143 6.41179 +4.07556 4.54276 +8.77552 10.0615 +6.7247 7.04044 +9.05494 10.1126 +7.46604 7.80632 +3.38601 3.8043 +5.60475 7.02788 +9.09811 9.4654 +9.33447 9.80012 +8.66499 10.1002 +3.87007 3.88281 +2.87624 3.11359 +5.92385 6.80801 +4.49711 5.01863 +8.84524 9.36225 +6.40944 6.82093 +2.90915 3.68288 +3.96801 4.82534 +5.51744 5.84233 +3.2959 3.44409 +0.18526 0.207322 +5.49717 5.72648 +6.9522 7.1952 +0.769572 1.79343 +5.95522 6.03918 +6.54327 7.7475 +2.13516 3.83957 +-0.388892 0.775076 +1.30128 2.29414 +9.76761 10.1604 +7.38731 8.66002 +7.09229 7.43495 +9.1379 9.52432 +6.75942 7.88717 +7.42824 8.82063 +6.93078 8.19884 +2.307 2.93836 +8.38254 8.84691 +3.90159 5.37938 +0.0413204 0.112203 +0.638217 1.53943 +0.88678 2.49435 +1.99104 2.60847 +6.61595 7.65064 +2.37641 4.71719 +7.94945 9.21404 +5.44594 7.13646 +5.45737 6.12335 +7.39207 8.02885 +5.51588 7.39341 +8.1581 10.0632 +0.197869 1.44516 +-0.0161139 0.73487 +4.24155 4.7304 +0.00374564 1.26481 +8.1878 8.20011 +-0.115544 1.74771 +0.912347 2.52922 +2.72234 4.83268 +6.45577 7.07776 +9.74201 10.1772 +7.11008 8.72914 +4.41921 4.8673 +7.97673 8.36658 +0.438659 0.647061 +4.35086 5.44482 +8.22919 9.34379 +3.53242 5.65576 +1.126 2.32177 +5.95118 6.51364 +3.10519 3.9447 +1.28889 2.26267 +7.04255 7.67791 +3.12614 3.17626 +8.09968 8.49162 +6.07924 7.219 +5.99554 6.52549 +9.14378 9.5773 +5.82872 6.53112 +9.3361 10.1704 +4.3751 6.51675 +3.288 3.98328 +4.56342 4.80185 +7.16574 7.43901 +7.7638 8.47758 +7.31514 7.78499 +7.98942 9.50252 +4.31211 4.70724 +2.9094 3.33304 +0.108736 0.668815 +8.08409 9.11098 +-0.0053985 0.589992 +1.31926 2.72153 +2.28664 2.38813 +7.95237 8.26388 +-0.0283047 0.452099 +7.50295 8.71708 +7.72356 8.63468 +3.48953 3.89579 +7.73814 8.73456 +4.54487 5.45817 +6.45109 7.00312 +3.99915 5.41716 +6.81436 8.5682 +6.86726 7.55999 +2.67863 3.7053 +2.6837 3.39567 +2.84347 2.91724 +5.79383 5.80493 +2.41217 3.0619 +8.78163 9.0998 +1.43456 2.50854 +6.73393 8.53005 +3.02563 3.56456 +3.34628 4.2934 +2.44985 2.92819 +1.38262 2.89341 +4.56337 5.75702 +0.275735 1.16604 +1.39763 2.8108 +9.69128 9.90361 +8.54868 9.66756 +3.01838 3.72831 +8.34017 10.5262 +1.82721 3.0476 +5.9732 6.83307 +2.77874 4.25603 +1.71987 3.1227 +6.33773 7.89103 +1.31982 2.82992 +4.21601 4.9627 +6.68166 6.72653 +0.87708 1.06828 +1.03483 1.26625 +2.996 4.03087 +1.54718 1.57452 +2.33087 2.38226 +2.29464 3.36496 +2.03064 3.41867 +5.8456 6.10406 +7.54614 8.2874 +1.42938 2.89154 +2.65935 3.53883 +3.98845 4.42049 +6.85632 7.15487 +8.12038 9.34993 +0.873558 1.32129 +6.61595 8.00766 +9.49147 9.81947 +-0.0225601 0.328769 +-0.481519 1.37204 +6.31457 7.45251 +4.59738 5.81395 +4.83304 5.63008 +1.95746 2.78657 +2.97889 3.74408 +9.08327 10.702 +3.58219 4.93634 +7.87068 9.77851 +0.330978 1.36031 +4.78145 5.36918 +4.94672 5.56644 +7.66806 8.08613 +4.78512 6.35461 +5.17367 5.74386 +8.65884 9.97088 +9.22053 9.60447 +6.15061 6.58817 +0.0875971 0.541643 +6.45597 7.92002 +0.636824 1.05267 +5.31677 6.12838 +6.51127 6.6731 +0.459551 1.69382 +5.75106 6.41377 +3.68438 4.67415 +9.36302 9.78281 +5.46195 7.99215 +2.55471 2.59231 +-0.0640245 1.33755 +9.36027 10.6198 +2.67955 2.77882 +3.51443 4.10619 +6.83904 7.23692 +2.59553 2.81418 +7.74628 8.95169 +3.86464 3.90067 +3.32377 3.992 +1.43737 2.52191 +3.83927 3.99402 +5.24426 5.35179 +0.833857 1.05277 +8.4062 8.51964 +9.62299 9.66254 +3.55427 5.19048 +1.7003 2.62107 +6.8059 7.49246 +-0.761104 0.773528 +1.37137 1.95048 +2.1222 2.59387 +0.633505 2.04796 +0.605156 1.04336 +7.22842 8.3365 +4.28716 5.28921 +8.14286 9.52015 +7.62467 9.18603 +1.11029 1.81278 +5.05654 5.13597 +0.862653 0.97827 +7.24766 7.92167 +8.80103 8.91467 +3.05841 4.82292 +1.28204 1.55969 +1.58886 2.57874 +0.0537678 1.28837 +8.09303 9.71678 +8.37599 8.85705 +3.18107 4.01971 +6.67019 7.75848 +6.29836 8.21603 +0.86271 1.30358 +3.86126 6.49694 +5.84446 6.24913 +0.475025 0.598151 +6.3477 7.08327 +3.60161 4.51824 +7.13317 8.13858 +4.89052 6.23701 +5.69441 5.99027 +7.18735 8.34853 +9.30182 9.34894 +6.06589 6.15141 +8.05917 8.89642 +5.6136 7.14058 +0.838337 0.959487 +0.56421 2.00841 +6.46876 6.63629 +2.4434 3.92184 +7.97216 9.45372 +8.17926 8.66756 +1.86522 2.01888 +0.983342 1.89079 +2.07322 2.09765 +3.52974 4.73717 +3.24973 4.88691 +5.47789 5.95384 +4.11218 4.57076 +6.61174 7.47165 +8.09302 8.36193 +1.67911 1.69022 +4.436 6.17515 +5.6544 5.74951 +1.50354 1.76043 +4.41433 4.83589 +1.82528 3.53979 +3.98749 4.65527 +6.42503 7.5787 +8.69554 10.1767 +8.39215 8.56999 +8.71646 9.66209 +1.59091 3.39622 +6.12574 6.94955 +7.92527 8.25049 +9.19858 9.49137 +2.73382 2.97747 +4.56558 5.94738 +8.33983 8.58548 +9.00798 9.01838 +4.93268 5.28383 +3.15356 3.58606 +8.28171 8.79351 +1.47358 1.9581 +0.891797 2.05345 +1.56032 2.38159 +2.5152 3.80485 +8.0963 9.88138 +1.1262 1.89279 +7.99336 8.2352 +5.25067 5.41251 +4.57532 5.20101 +1.87911 4.59415 +4.25142 4.70467 +8.18782 8.76989 +9.20478 9.3612 +7.70898 9.7752 +0.655865 0.958924 +4.8883 5.77477 +3.03279 3.47456 +1.01979 1.41661 +8.94219 10.6987 +2.49348 4.58195 +2.44003 3.29005 +3.4725 3.55572 +9.3917 9.95851 +7.08658 7.47686 +3.56413 4.44089 +-0.47868 1.11453 +6.82615 8.00596 +3.49451 3.74705 +8.13286 8.47976 +7.01732 8.82556 +1.19064 1.48887 +5.28851 6.88637 +8.83175 9.49879 +0.939903 1.17024 +7.49124 9.01906 +2.9285 4.23224 +5.68296 6.86273 +8.53897 8.77886 +2.9107 5.01232 +0.748655 1.10265 +4.77258 5.12626 +3.995 4.75289 +2.71467 4.26926 +6.21665 7.16233 +4.53883 5.75731 +4.37153 4.76125 +7.47635 8.75777 +4.82013 6.4699 +9.36015 9.58451 +4.43054 5.86752 +2.10934 2.34705 +3.00306 3.06539 +7.81957 8.44081 +1.97221 3.06916 +0.153393 0.503956 +5.05611 5.27536 +5.73277 5.89001 +3.64807 4.85582 +6.13416 6.1528 +3.85511 4.14045 +0.411725 1.36529 +2.26932 2.5447 +3.51164 4.93266 +2.50955 4.34201 +8.74663 9.39268 +6.2229 6.39303 +4.38059 4.91592 +7.29109 8.62318 +6.31801 6.99532 +9.75036 10.0514 +1.69019 2.41527 +4.20462 5.27729 +6.32944 6.94729 +3.5736 5.21496 +4.48316 4.61828 +1.76915 2.43263 +2.42026 4.09159 +2.08762 2.43074 +5.48161 6.02473 +5.51826 7.47042 +2.78026 3.1552 +7.89469 9.49867 +3.09084 4.54697 +7.20417 7.42408 +5.36528 5.74851 +1.86239 2.41988 +1.55994 2.85743 +4.40182 4.6638 +7.91619 9.01242 +3.08119 3.74714 +1.54108 2.08538 +3.61461 3.64631 +8.76851 9.66257 +-0.645571 1.3366 +-0.707083 1.21005 +7.19571 8.23405 +5.42865 5.89329 +2.12897 2.59222 +0.603102 0.930391 +3.75025 4.63181 +6.14867 6.4526 +7.30947 7.51461 +7.83183 8.79802 +6.06658 8.53246 +1.67895 2.50063 +1.14179 2.04478 +8.59583 8.90112 +-0.918885 1.30717 +0.182607 0.613593 +3.3335 3.77196 +0.783053 2.4368 +6.49331 7.60104 +2.85101 3.28637 +7.42273 7.66905 +3.96433 5.02573 +8.26262 8.40749 +9.24451 9.32783 +4.89036 7.07214 +6.45431 6.96815 +5.20701 6.58747 +7.40142 7.98615 +4.19768 4.9831 +3.32546 3.88811 +-0.471996 0.967855 +9.36172 9.63532 +1.96831 3.00632 +7.537 9.72671 +4.67746 4.81135 +3.10782 4.93642 +4.94809 6.54855 +4.16763 5.25628 +9.04992 10.316 +0.668935 0.680886 +4.02935 4.84503 +5.32499 5.76636 +5.32267 7.15457 +5.18886 5.23491 +4.37053 5.36801 +2.39955 2.74657 +8.19764 8.86645 +4.24706 5.69703 +1.87851 2.36988 +0.886553 1.05064 +7.27428 7.90224 +9.08417 9.44879 +3.11534 4.02019 +6.3284 7.39925 +4.96029 5.59076 +2.58248 3.11741 +7.76513 8.13505 +4.93613 6.51523 +0.565355 1.70512 +2.12366 3.0319 +5.32422 6.84146 +-0.135396 1.08591 +3.7901 4.86303 +4.49677 5.41847 +0.615748 0.834712 +0.64784 1.81859 +6.65505 7.13894 +-1.12744 1.61017 +0.550814 1.24316 +6.66639 6.89866 +6.19271 8.17468 +3.09382 3.78684 +4.41221 4.95889 +7.96091 8.48824 +8.32129 10.2917 +2.13168 2.19835 +1.4635 2.38989 +5.78102 6.42215 +1.70153 3.20616 +5.35068 5.71016 +4.27702 4.37203 +5.13888 6.04764 +4.79644 5.37927 +6.75314 7.66368 +6.04484 6.84064 +4.34947 4.45643 +9.08755 10.396 +0.88804 2.17441 +6.86788 7.88301 +7.94296 8.61664 +8.02387 8.79591 +1.79024 2.40559 +5.50404 6.01044 +7.76772 8.1932 +1.174 1.23693 +6.20571 6.9224 +4.20863 4.48702 +4.16743 4.39075 +-0.11965 0.120778 +7.01234 7.52619 +5.91415 6.46151 +5.28713 5.72354 +6.26981 6.31237 +0.643056 1.43864 +1.62562 1.99875 +0.544992 0.721386 +6.92522 7.09165 +-0.107048 1.12273 +0.644674 0.91244 +8.56904 9.01883 +2.23079 2.56598 +9.79034 10.1123 +8.13788 8.4131 +1.86753 1.95236 +2.97577 3.33272 +8.57454 10.0193 +1.20043 1.53408 +3.43515 3.86571 +5.79075 6.41293 +1.71558 2.52845 +2.39907 3.46652 +9.08289 9.91182 +0.859644 1.07475 +5.30144 5.42157 +-0.441497 0.890794 +3.55044 4.14918 +-0.340115 1.19239 +6.5534 6.76908 +0.836514 2.09196 +8.15747 8.96484 +4.80087 5.14227 +7.72071 8.88223 +5.11901 5.65559 +4.44996 4.63562 +-0.328404 1.3002 +0.90759 1.34556 +5.94839 6.35058 +1.76504 1.78344 +1.32585 2.08994 +7.18641 8.20945 +0.62657 1.06025 +6.28086 6.40975 +5.05525 5.16143 +5.82694 8.07685 +6.23677 7.55394 +-0.226265 0.661443 +1.42599 2.36325 +9.04445 9.92971 +-0.169286 0.185741 +8.34636 10.9042 +9.52494 10.0475 +8.39989 10.1377 +3.89956 4.70428 +3.98673 4.97185 +5.43008 5.67936 +7.76475 7.98591 +4.46895 4.73188 +0.584662 1.54474 +2.12622 2.79994 +1.40578 2.2461 +1.45171 2.02105 +2.05665 3.04611 +2.29818 2.68118 +1.77344 2.98698 +4.92092 5.55302 +7.18758 8.37525 +8.83407 10.0565 +2.91182 4.71932 +6.47293 6.74664 +2.49238 3.69749 +0.487234 0.541003 +4.703 4.92744 +9.8867 9.94918 +1.7713 1.9792 +5.68316 6.90242 +5.62485 6.70656 +7.24837 9.60197 +7.71147 7.76519 +5.22324 5.30661 +9.11258 9.28071 +8.2827 8.90115 +8.90865 9.42138 +7.47233 8.72308 +4.89712 5.65153 +4.12392 4.20239 +5.65325 6.55887 +8.65945 9.05845 +7.9165 8.36489 +1.4952 2.43991 +5.49665 5.80793 +1.67206 2.55302 +0.943544 1.58521 +0.47 0.860959 +6.47638 7.43101 +4.38434 5.97278 +8.12782 9.10574 +5.78143 6.6539 +9.23616 9.40513 +1.6845 2.00736 +6.56955 7.37847 +7.42993 9.04718 +-0.179632 0.450904 +8.65819 9.07724 +7.86567 8.80824 +1.85428 2.7755 +2.29222 2.65374 +4.03614 4.51729 +6.9326 7.07635 +5.50807 6.498 +6.17637 7.26432 +8.7688 9.16308 +7.65 8.88604 +3.74495 4.29991 +8.5671 10.5661 +7.41964 8.21083 +8.04302 9.78783 +0.269663 0.317601 +8.29804 9.40991 +3.90673 4.22298 +8.82384 10.9441 +7.27081 8.19548 +1.30184 1.98993 +8.13028 8.92385 +7.21224 7.35137 +5.02122 5.69666 +0.817219 0.974073 +-0.128067 0.589359 +2.12137 2.74019 +5.24657 5.44714 +1.55805 3.10332 +9.91031 10.0748 +7.13941 7.9143 +-0.183908 0.934079 +3.987 4.11053 +3.26678 3.67608 +9.75921 10.1121 +0.755391 1.06346 +7.28479 7.49982 +1.37522 3.80623 +0.944351 1.46531 +9.49278 10.2372 +8.28946 8.67597 +9.43537 9.58003 +7.73357 8.756 +2.64043 2.8687 +4.70448 6.99929 +3.82199 3.89343 +3.43825 4.10908 +4.42362 5.69086 +8.08536 8.60142 +8.43208 9.31272 +7.5889 8.39208 +7.90112 7.9734 +6.10381 6.80568 +8.76283 8.80151 +1.46728 2.53288 +1.68884 2.47102 +7.63343 8.29838 +9.18852 9.5558 +0.977174 1.4792 +4.7577 5.74873 +4.66433 6.37375 +-0.0952277 0.378184 +5.30929 6.07469 +4.98811 5.16146 +3.0744 5.59799 +0.944909 1.25222 +1.38561 2.51277 +3.77811 4.23459 +2.11604 3.32458 +0.920929 1.17187 +5.23496 6.34905 +6.9953 7.65745 +4.81803 4.89553 +4.69301 5.36777 +-0.208926 2.6111 +7.97334 9.83269 +-0.396673 0.779988 +5.91367 6.47682 +6.27249 6.83533 +5.58931 6.89679 +2.03394 2.67025 +-0.197752 0.383167 +4.69751 7.695 +4.5989 6.07875 +3.7285 4.27396 +7.9807 8.27693 +-0.00248985 1.30934 +2.68016 3.916 +0.881558 1.14567 +4.77066 5.05302 +0.552268 0.919467 +2.46862 2.65199 +1.4009 2.51701 +-0.171185 1.28252 +9.27842 9.90243 +3.51778 3.57728 +6.10071 6.92163 +9.05387 10.0894 +5.52995 5.89082 +8.40216 9.0272 +9.02911 10.1602 +4.85818 7.38829 +1.6762 2.32334 +6.45416 8.62337 +5.44592 6.0245 +3.45876 3.94274 +9.07144 9.16725 +6.51885 7.6363 +7.92593 9.01986 +0.270702 1.57395 +6.11245 6.70173 +1.37658 2.19068 +2.42668 3.43827 +7.98226 8.43306 +3.72269 4.74654 +8.16252 8.58873 +8.81456 9.5363 +-0.338386 0.864811 +1.90693 2.25796 +3.5305 4.17475 +6.07997 7.67393 +0.53347 1.68815 +7.31182 8.44458 +7.77462 8.33613 +3.79975 4.15552 +9.08822 9.9771 +-0.101698 1.05442 +8.44869 9.95724 +-0.0318759 0.532673 +8.09238 9.51356 +5.51514 6.60799 +8.66528 10.3297 +8.25556 9.97893 +-0.220428 0.247563 +0.00453913 0.540444 +1.53599 1.61735 +3.77213 5.06896 +2.65332 2.75864 +6.05811 6.43112 +0.302534 0.803651 +0.393766 1.11611 +9.31035 9.62387 +0.568281 1.7765 +-0.721118 1.27387 +1.83573 2.62578 +1.39953 1.91158 +6.51883 8.52813 +2.60154 2.95054 +6.58322 9.37818 +5.61178 5.67661 +9.56511 10.2767 +9.09174 10.0697 +2.55846 3.39943 +8.38146 9.06138 +7.97019 8.18074 +6.1426 6.42787 +1.15876 1.55463 +2.93483 2.96376 +7.23883 7.29158 +9.64606 10.0674 +4.89825 6.70366 +7.35635 7.96328 +2.2702 2.36797 +-0.0464389 0.395244 +1.14883 2.10411 +4.7309 5.10593 +6.07946 7.37741 +5.50202 6.28822 +3.66574 3.96271 +1.9944 2.3862 +7.58159 7.59275 +1.98712 3.30587 +2.10317 2.89161 +9.66889 9.97287 +1.57327 2.15421 +8.14125 8.30983 +3.77185 4.12658 +8.51624 9.51485 +9.25211 9.722 +2.06312 3.0453 +9.34954 9.91254 +7.31475 8.89322 +7.85044 9.20242 +0.226243 1.28465 +0.0260868 0.575177 +9.40743 10.1655 +4.04324 5.05341 +1.02626 1.48332 +3.33074 3.72025 +9.2005 9.61387 +6.68317 7.14109 +6.82083 8.6312 +4.34816 4.50329 +-0.48874 0.975608 +4.26651 5.68526 +4.89731 5.57569 +2.68984 3.5661 +0.499714 1.01055 +9.01902 9.36142 +3.22067 4.59054 +0.65132 0.860512 +1.6791 2.36642 +8.28222 8.7579 +2.84349 3.24134 +5.64949 6.09512 +3.44026 4.43245 +2.60889 2.6248 +-0.00849234 0.984046 +7.5745 8.65675 +2.07464 2.6488 +2.59747 2.65772 +6.36828 7.42208 +3.83342 4.50127 +5.41167 5.7011 +6.53606 7.53796 +8.21975 9.56176 +1.90113 3.08684 +7.74402 7.82057 +4.26515 5.11327 +5.42743 5.59215 +8.69709 10.0912 +2.87019 3.94798 +9.27013 9.54627 +9.30568 10.2136 +9.02985 9.62917 +3.7589 4.59642 +6.59359 6.86939 +3.26574 4.83488 +5.14545 7.70086 +7.43163 8.05103 +5.72972 5.74457 +0.490113 1.31151 +7.018 7.42627 +6.22976 6.27589 +9.07732 9.30419 +4.3917 4.42663 +8.50298 10.3728 +6.18671 7.53619 +3.51053 4.097 +2.17172 3.56595 +6.08046 6.23691 +9.07361 10.9129 +3.95757 4.11333 +-0.136516 0.78995 +1.34923 3.47002 +0.0562579 0.686502 +9.10943 10.2731 +5.80174 6.16971 +7.86011 7.87649 +5.34384 5.51645 +6.32167 6.76387 +7.70566 8.28038 +-0.319903 0.867682 +-0.372564 0.570014 +8.83696 10.8439 +7.78947 9.38211 +9.25815 10.1092 +5.59721 5.67148 +0.234719 2.42489 +1.06314 2.87416 +1.75391 2.69799 +5.4536 6.66068 +1.35696 1.87102 +2.17418 3.1459 +7.61817 7.98287 +2.92194 3.18393 +7.68243 7.83261 +9.33163 10.5531 +1.14227 2.50228 +5.47911 5.70857 +9.88123 10.0758 +8.81249 8.83145 +6.02747 6.43183 +4.81158 5.79178 +6.65666 7.5047 +4.89085 5.56569 +0.935564 1.71547 +-0.0452879 1.16222 +4.03524 4.6206 +5.88518 6.02658 +2.06227 2.9581 +0.207246 2.2404 +2.81757 3.70318 +0.704257 1.98403 +2.38486 3.30039 +3.57073 4.78358 +1.53721 3.00546 +8.37852 8.39527 +1.54619 1.59789 +1.00447 1.40778 +5.31977 6.43861 +3.82175 3.83209 +3.37738 4.44002 +5.46644 5.97254 +3.88191 5.00688 +4.88046 5.39031 +4.15092 4.93679 +1.75182 2.07399 +1.16434 1.76541 +3.37032 4.29676 +3.1685 3.98533 +1.28787 1.59775 +5.86338 6.17993 +3.8645 4.25757 +1.83947 2.48092 +0.184795 0.586724 +3.13752 3.76447 +2.14264 3.03248 +5.78182 5.9029 +2.47969 3.8088 +2.59206 3.08362 +-0.354871 1.03627 +7.94041 8.05947 +9.48014 9.93817 +0.992727 1.48877 +6.1525 7.51387 +5.00071 6.15665 +7.42074 8.27606 +9.6539 9.83042 +1.08984 1.46387 +5.46282 6.95907 +4.74506 5.13968 +0.357565 1.91464 +9.07652 9.65474 +0.201095 0.646211 +7.04306 7.69131 +1.17728 1.2237 +5.92183 6.29165 +-0.41356 0.491524 +8.38339 10.4509 +8.08648 8.11344 +3.32474 3.39522 +5.762 5.83732 +2.26778 2.55548 +4.86127 5.92868 +3.75949 5.16608 +4.83431 5.88632 +2.65122 3.31344 +9.30295 9.38948 +6.03391 6.32749 +5.12035 5.59414 +5.68785 5.979 +7.89553 9.15202 +2.54445 2.74715 +2.36337 2.49709 +4.71661 6.12198 +3.72447 4.68735 +1.0541 1.53187 +3.45178 4.80929 +7.90773 8.26212 +8.1816 9.18627 +0.322569 0.871041 +7.24823 7.32699 +1.7003 2.78087 +9.70927 10.2515 +3.75922 4.01081 +1.06949 1.40253 +1.21774 1.4734 +6.02123 6.32973 +2.76396 3.09484 +2.80358 3.00026 +5.25666 6.31369 +4.71714 5.30669 +4.37906 4.50557 +7.40824 7.44969 +7.89081 9.18263 +8.8136 10.3074 +9.1757 9.37261 +7.1938 8.51137 +0.580081 2.32678 +2.02497 2.95434 +6.01446 6.78851 +8.54365 9.21454 +3.03567 3.27089 +0.650657 1.5716 +5.05518 6.36521 +1.64301 2.76399 +4.15989 4.34183 +3.72791 3.98156 +3.91372 4.06182 +3.04507 3.88871 +3.82596 4.25694 +3.36492 5.00402 +6.50019 8.17974 +3.54621 3.81009 +0.546921 2.09811 +5.1789 5.9826 +4.98983 6.31221 +2.47557 2.63878 +4.64568 4.81101 +9.1462 9.21888 +7.37417 7.5276 +2.21604 2.50113 +8.29804 10.2722 +5.1282 6.06353 +8.58281 10.1589 +6.47084 7.04085 +6.27806 6.72674 +7.11554 7.85687 +6.01085 6.02773 +5.46694 7.52872 +9.51078 9.85387 +3.36627 4.06552 +2.96126 5.12635 +3.09314 3.40691 +5.05456 6.62548 +7.56469 8.97053 +1.33727 2.87482 +5.6572 6.28169 +0.120924 0.296475 +7.09139 7.41322 +2.10076 3.28507 +8.74998 10.1094 +7.45072 9.50796 +7.75294 8.59218 +0.740374 2.44897 +7.63001 8.91562 +4.30743 4.81716 +6.40813 7.29159 +6.30213 7.35987 +6.44392 7.32584 +8.41155 9.4466 +-0.377892 0.689618 +5.88857 6.70983 +6.67779 7.70668 +4.831 5.17464 +2.62342 3.82764 +8.57453 9.29283 +7.32648 7.96725 +9.32937 9.9726 +7.30774 7.65754 +3.97456 4.59876 +5.73092 7.20962 +1.958 2.10551 +3.2115 3.81482 +5.76497 7.42425 +2.77219 3.29692 +4.95297 5.14843 +5.96367 6.3619 +2.49872 4.61736 +8.21817 8.23425 +2.13615 2.61877 +7.84121 9.55011 +8.63416 10.2773 +5.61084 6.32053 +4.86002 5.79944 +9.07858 10.688 +5.95829 6.42504 +3.3289 4.17849 +3.27989 4.91625 +8.28046 9.23021 +2.18691 2.6072 +1.3962 1.75013 +2.13627 3.73117 +2.11128 2.57303 +7.22357 7.50136 +7.43862 8.03136 +2.80578 3.02886 +0.176906 0.761142 +5.99314 6.6075 +1.90398 3.3925 +5.48264 6.73579 +7.18447 7.49811 +3.24434 5.05219 +5.53263 6.04178 +1.71172 2.45682 +0.297266 0.481632 +2.62582 3.36142 +0.243865 1.49321 +8.86142 10.169 +3.93193 4.39404 +4.98182 5.15675 +7.99209 9.73159 +8.18033 9.45596 +4.25235 4.41546 +1.59603 2.15581 +6.47724 8.69649 +5.24138 7.93131 +3.4267 3.49003 +0.0439912 0.316407 +1.99983 3.87206 +-0.103124 0.568771 +4.62451 4.80117 +2.89065 4.16315 +5.82817 7.43232 +6.89255 7.82189 +5.71037 6.81241 +4.34551 5.24905 +7.33931 7.3741 +-0.855192 1.27129 +8.94842 9.10813 +9.19877 9.68412 +6.42658 7.77968 +-0.0669636 0.430107 +6.40366 7.40701 +8.91175 9.24059 +3.21388 4.21676 +3.38557 3.79509 +4.24411 4.97032 +7.259 7.34896 +2.55995 3.18361 +8.77438 10.5503 +8.18685 9.79378 +2.78397 4.4563 +8.6891 9.38337 +6.51749 7.59374 +2.52346 3.46101 +8.40526 9.35647 +5.26942 6.33572 +4.15094 5.00668 +0.471666 1.53842 +7.63441 7.96745 +2.39974 3.7814 +2.71989 3.02994 +8.12085 8.33493 +6.19474 6.84381 +6.6133 8.31417 +5.1758 6.94983 +8.66241 8.79095 +6.10878 8.22083 +8.81883 9.08031 +8.28969 8.45176 +7.19851 8.37836 +1.5722 1.6836 +4.57814 6.95063 +7.66128 8.10631 +0.742483 3.08515 +1.15026 1.98074 +3.90133 4.12003 +7.61145 7.73433 +8.32187 10.2933 +0.407205 1.08089 +1.26545 2.60796 +2.70646 3.92753 +-0.196551 1.83536 +-0.413063 1.23838 +0.264484 0.556192 +6.30158 6.96097 +-0.66246 0.809062 +9.34243 10.3521 +8.70093 8.79679 +0.745195 1.92911 +9.12892 9.68193 +7.98533 8.30538 +6.23671 7.04296 +6.5603 6.95483 +7.08133 7.10563 +2.15769 2.41541 +8.24752 8.73978 +5.27693 5.61904 +0.317419 1.48404 +3.48029 5.46979 +7.38901 8.56554 +1.06587 1.62384 +5.54926 6.04924 +4.46577 6.48749 +5.349 6.15584 +8.04249 8.17359 +3.37651 3.56179 +3.64706 5.57403 +4.49844 5.26404 +3.93361 4.92128 +5.82184 6.29881 +0.984273 1.70318 +1.12773 1.80726 +3.11675 3.17451 +5.07913 5.46291 +0.615591 1.81465 +1.08948 2.77847 +7.97412 8.07365 +5.05207 5.82497 +0.0407709 0.558817 +6.11142 6.48205 +3.4461 3.57315 +8.6547 8.80553 +8.18965 9.64194 +5.55564 7.9703 +4.01776 4.16989 +2.4668 2.82018 +0.911925 2.56662 +4.68814 5.03614 +7.4899 8.49036 +8.40912 9.14001 +2.32725 3.16377 +0.0723972 1.42049 +6.6441 6.6953 +3.65586 4.38222 +6.35844 6.57833 +4.44435 5.73077 +1.81779 2.57257 +4.17692 4.59722 +8.54682 9.38058 +1.61135 1.81629 +3.91926 5.00536 +9.78302 9.85143 +1.25632 3.10345 +5.53191 6.08174 +-0.231868 0.676811 +1.03054 2.58105 +0.0402172 0.690608 +0.974571 1.25234 +5.22227 5.92302 +8.05843 10.1439 +8.48938 8.50755 +0.0965782 1.24008 +6.53821 7.47765 +0.189991 0.475204 +8.48963 8.54995 +9.68363 10.0534 +1.49381 2.71302 +6.75552 7.41283 +7.91075 9.15302 +0.520922 1.40928 +1.17957 2.11221 +4.00122 4.40686 +7.32467 7.9273 +6.39126 7.90248 +6.50534 8.19308 +7.19888 7.22234 +-0.136797 0.731889 +0.870318 1.25614 +2.07126 2.28297 +6.10995 7.60408 +3.02174 3.90102 +-0.657541 1.57517 +0.993121 2.66255 +7.27232 7.50832 +2.16079 3.75428 +9.27397 9.75098 +8.36865 8.5545 +4.56641 4.97607 +3.60746 4.34616 +6.31304 7.70611 +2.91442 3.7602 +4.85814 6.70407 +4.45876 5.67661 +8.06749 8.82229 +2.02826 3.59873 +1.92922 2.50088 +2.63867 3.48117 +2.17665 2.54826 +8.62674 9.10675 +0.96648 1.47671 +8.86336 9.53978 +5.52747 5.80829 +0.77099 3.06106 +2.2307 2.53877 +6.29165 6.63018 +4.44717 5.04651 +3.80894 4.63054 +7.47519 7.87072 +0.933668 1.9949 +-0.712945 1.21558 +7.30206 8.38376 +5.80281 7.00022 +7.96578 8.6558 +0.24063 0.706466 +4.41893 4.58472 +4.0132 4.92768 +5.29626 6.09397 +3.43602 4.00728 +0.780945 1.66499 +8.83861 9.15168 +9.06411 9.75544 +3.45618 3.62529 +9.51413 10.0148 +0.842106 1.75695 +1.06485 1.44192 +6.89987 8.05314 +7.89154 8.73313 +8.71675 9.79526 +2.40574 2.58062 +8.55952 8.78132 +5.61716 6.06282 +3.71059 3.77929 +2.50187 2.99137 +6.92852 7.23184 +7.00442 7.93869 +8.82232 8.8756 +4.10389 4.53702 +7.6907 7.77577 +9.31554 10.2674 +8.51082 8.70339 +4.83332 6.70311 +4.6904 5.42892 +4.71407 5.67695 +4.12047 4.44089 +7.51845 8.26858 +1.31781 1.9397 +6.26854 8.02093 +6.92072 7.77774 +0.438156 2.18909 +0.898035 1.72074 +3.81121 3.8643 +1.01676 1.34308 +9.28445 9.42801 +2.43133 4.43516 +4.33664 5.9904 +2.19178 2.37244 +1.5457 1.79785 +2.23781 2.6481 +6.8365 6.87073 +0.82568 2.74775 +9.59404 9.89262 +8.48394 9.15107 +6.16085 6.42224 +3.5667 5.97689 +4.16931 7.41638 +6.95636 7.0982 +6.87987 7.09233 +3.12619 3.14821 +7.76636 7.98459 +4.60371 5.59136 +3.92189 4.88302 +6.90694 8.19858 +3.85132 5.19015 +8.05045 8.32483 +4.8338 6.05032 +1.93576 3.18873 +2.4182 3.55039 +5.56905 5.8172 +4.18436 6.01283 +3.04944 3.85936 +7.83585 8.95233 +1.76281 3.0558 +3.44143 3.6317 +8.69887 9.40371 +5.67867 5.73236 +0.859809 1.76578 +6.92284 7.13601 +8.27495 9.13414 +5.44385 6.42599 +-0.941603 1.8215 +7.88161 8.79447 +0.965018 1.17732 +5.56442 5.79546 +8.79032 10.9909 +5.28632 5.79175 +4.80998 6.07002 +8.4021 9.81107 +3.16415 5.08682 +-0.212163 1.2052 +5.683 5.83625 +0.738527 1.31842 +2.03835 2.52756 +7.4543 8.91243 +-0.568869 1.44659 +3.58855 4.42371 +6.33058 7.18779 +-0.645579 1.94313 +2.18149 2.24157 +3.80281 4.67323 +5.14628 5.97452 +2.55239 3.45685 +3.56586 6.23355 +6.74752 7.19693 +8.99006 10.5533 +0.259833 0.99882 +8.9005 9.75401 +7.28058 8.41075 +4.57803 5.70104 +9.82823 9.90251 +6.94375 7.42033 +7.8878 8.81951 +5.01137 5.52693 +2.25503 2.28817 +6.65772 7.11107 +0.647512 2.04416 +4.34796 4.5706 +4.5395 4.91529 +2.65423 3.49531 +7.97384 8.78377 +5.53873 5.76806 +9.78641 10.1351 +6.01664 6.44407 +3.47406 3.75187 +4.59421 4.81804 +1.20641 2.00488 +2.48904 2.80768 +5.77372 6.10692 +2.49363 3.24499 +1.8483 2.62965 +2.28556 3.22209 +3.17819 4.51426 +3.5548 4.23276 +3.25239 3.57895 +0.613317 2.44862 +3.82234 4.78976 +4.72809 6.46528 +9.54107 10.4426 +9.20052 10.1921 +8.24152 9.89817 +5.17594 6.19462 +7.83364 8.17082 +5.67992 6.36464 +8.9943 10.1426 +2.20598 3.0081 +3.38199 5.16464 +0.599928 1.35804 +0.841211 1.60761 +5.29338 5.89919 +1.11061 2.29219 +3.41512 3.95907 +7.9375 10.0203 +8.73852 9.66917 +9.95092 10.0162 +4.02544 4.30219 +4.1461 5.37827 +1.08089 1.59196 +7.87513 8.21121 +7.85673 8.0973 +0.96237 1.56519 +2.45532 2.61678 +6.1829 6.23637 +0.135135 0.613518 +3.18324 3.78587 +5.64796 7.20194 +0.861169 1.71661 +9.66005 10.1169 +0.880774 1.12452 +1.29389 1.57658 +5.60299 5.89759 +5.53642 7.07306 +0.540268 1.31836 +6.60244 7.98105 +4.21877 4.57159 +3.15367 4.75356 +7.81055 8.40378 +8.00942 8.10861 +5.78071 6.35646 +3.15993 4.99293 +2.36526 2.78444 +8.1361 8.76071 +1.40066 2.96474 +-0.17906 1.05877 +5.94933 6.6808 +3.43187 4.05553 +3.02912 4.68942 +2.1506 2.29413 +2.3516 2.38305 +2.87496 3.0851 +6.71294 8.99858 +3.76177 5.52545 +1.58417 2.57063 +2.74646 4.27445 +5.48407 6.60696 +-0.133321 0.716559 +3.53886 3.58196 +2.28729 2.40198 +-0.209646 1.21263 +6.62795 7.32318 +0.714781 0.880466 +2.96831 4.05932 +6.00935 6.38896 +5.39798 6.11983 +8.47679 9.70468 +1.4339 1.74845 +2.35223 4.75732 +4.31357 4.9642 +5.26493 7.70538 +7.91888 8.94851 +6.51439 7.69469 +7.69015 7.85411 +3.94274 5.15373 +6.25852 7.32402 +2.73567 3.43236 +7.09564 8.42242 +2.55932 4.29066 +1.79489 1.84559 +8.86427 9.35669 +7.23854 8.27062 +7.8488 7.98307 +0.710888 2.22424 +0.0413624 1.10578 +1.54302 1.97696 +1.64924 3.01081 +8.15535 10.2397 +0.305662 1.63835 +8.20375 9.03123 +1.66617 2.08748 +4.01691 4.88505 +3.32856 4.10709 +5.15342 5.44616 +5.80751 7.38872 +0.485341 1.07648 +3.98267 4.20211 +6.96867 9.37655 +9.48055 9.85181 +8.39277 9.50424 +2.47589 2.79873 +3.48046 5.37417 +4.98279 6.01686 +1.29845 2.31199 +-0.204348 2.50289 +0.23488 1.00378 +6.26899 7.14823 +4.62903 5.49672 +0.199052 0.822066 +6.97297 7.69083 +4.23783 4.65198 +0.530497 0.839143 +6.61355 8.22831 +-0.0103941 2.16307 +0.148601 1.20044 +0.314438 0.67632 +3.43415 4.06208 +1.95498 3.25728 +4.23094 4.84942 +9.5493 10.0057 +2.64964 3.52073 +8.21388 9.1622 +-0.112496 0.47622 +7.97551 8.19546 +2.16155 2.6289 +0.38442 1.46032 +3.85675 3.91557 +1.00605 1.42016 +2.4853 3.53086 +-0.0765625 0.504366 +8.11302 8.46334 +7.18135 7.80218 +6.46466 8.12336 +3.75968 5.33954 +9.08789 9.73677 +6.47459 7.49454 +0.90148 1.47681 +3.44733 3.54163 +7.32968 7.909 +1.30055 2.75407 +8.78735 8.92461 +8.21764 8.59414 +0.888162 1.08404 +5.65195 6.26421 +6.23881 7.33284 +8.69731 9.88088 +3.55695 5.36909 +6.49248 7.02755 +2.31407 3.01952 +5.7803 6.1286 +6.30415 8.01577 +7.73864 8.27496 +0.741078 1.69184 +4.94671 5.68254 +3.28226 5.02894 +1.97446 2.60413 +3.26555 5.54754 +2.56179 3.41897 +3.20058 3.32486 +6.96915 7.69055 +6.89302 7.39856 +1.9659 2.61404 +1.31107 1.36867 +6.23573 6.33677 +0.17616 0.517772 +8.55548 8.79155 +9.61632 10.2651 +2.20331 2.34017 +6.93195 7.42939 +1.25398 2.23119 +1.06577 1.41048 +5.99156 7.09818 +3.34821 4.1271 +4.61618 6.90956 +2.30853 3.52875 +0.0518063 0.113732 +5.38513 6.09734 +1.73468 2.64838 +7.24679 7.63999 +4.18175 5.06728 +7.09602 7.13414 +9.06191 9.11605 +6.2309 7.67675 +3.96576 4.63237 +-0.552645 1.37948 +5.76964 6.89903 +4.9272 7.5832 +4.59003 6.49719 +4.12281 6.9664 +5.12256 5.58387 +1.78859 2.76954 +4.36808 5.05712 +8.41165 9.54483 +8.11513 8.43405 +8.42016 9.52715 +8.50598 9.34564 +1.80028 1.83558 +8.08502 8.43726 +6.96667 8.12021 +5.4726 6.26772 +7.1141 9.29989 +7.83324 8.1744 +8.74368 9.16491 +2.5515 3.01706 +5.92375 6.44495 +7.45628 8.41582 +9.04829 9.71503 +4.58856 4.75356 +7.26064 7.32462 +1.81695 2.40529 +6.88067 7.95052 +1.91408 2.02663 +1.32005 1.45025 +7.47733 8.42004 +4.99403 5.85297 +0.95744 2.28875 +-0.089503 0.536888 +1.09978 2.48865 +1.9959 3.098 +0.376116 0.448329 +3.98908 6.49684 +9.10178 9.51012 +5.41394 7.31529 +6.60708 7.59071 +4.38466 5.76203 +1.84355 2.60304 +0.658705 0.933522 +6.98725 7.05509 +5.60064 6.98804 +1.0603 1.1521 +4.06192 4.46156 +0.351018 1.00807 +9.17113 10.2192 +6.71641 6.74659 +8.85392 10.5272 +4.50816 5.22908 +1.13934 2.43196 +3.3746 3.57576 +7.62137 9.3234 +6.93482 7.16058 +5.66506 6.44324 +5.13364 5.86068 +1.97257 2.03803 +2.69746 2.73067 +0.989591 1.38342 +4.18819 4.69676 +4.31608 5.12265 +2.79556 4.87763 +3.55387 5.34421 +-0.112466 0.585639 +2.43156 2.70221 +5.88314 7.08322 +-0.450332 1.29858 +1.22202 2.46588 +6.74433 7.32925 +5.14596 5.37435 +6.76754 7.41799 +1.48762 2.45958 +4.57241 5.3382 +4.17465 5.02296 +6.48856 7.5576 +0.383566 0.823394 +8.50875 9.08734 +1.79393 2.24548 +5.06812 6.49508 +3.55364 3.61502 +5.58973 6.58885 +0.631097 2.10041 +0.323995 0.941782 +8.8798 10.1036 +6.37114 6.88202 +6.9393 7.83288 +3.09503 3.41759 +3.65269 3.70305 +5.61676 5.8924 +1.90199 2.38446 +4.23683 5.35609 +9.18649 9.88878 +8.28736 8.37734 +3.04805 5.03593 +8.02926 8.38975 +3.58161 4.01331 +3.20923 3.48207 +6.85118 8.78281 +5.06518 7.49843 +1.57456 3.05552 +3.0154 4.23782 +2.83557 3.24854 +1.29358 1.89328 +1.42911 2.72661 +3.17067 3.96651 +0.353554 1.48472 +3.46227 4.25611 +6.17639 7.24657 +5.60878 7.13562 +4.11129 5.52476 +9.17596 9.4123 +3.08339 3.65766 +4.083 4.63013 +0.628465 1.92141 +7.81989 8.39386 +3.35589 3.87531 +5.35974 5.41743 +4.48321 4.64376 +0.888177 1.37343 +8.49061 8.50063 +5.09078 6.01801 +9.65314 9.99342 +1.60502 3.0115 +1.37928 2.77642 +6.60322 8.94046 +6.74573 7.45157 +-0.291156 0.325249 +6.1518 6.66827 +5.38199 6.46959 +3.50128 5.22692 +1.31774 1.70159 +0.550546 1.48845 +7.51187 7.85496 +4.2014 5.23193 +3.88255 3.97209 +2.60555 2.84958 +5.15706 6.00036 +2.99284 3.27867 +0.395077 0.768383 +3.30863 3.60594 +0.0325231 0.379208 +6.55183 7.33346 +1.44554 2.95846 +0.245421 1.29751 +3.98808 5.41226 +5.90242 6.266 +4.11097 5.02597 +0.134753 0.929866 +0.609287 1.16311 +0.231832 1.06825 +6.22093 7.05584 +9.18429 9.80637 +0.544139 1.30185 +1.69143 2.90306 +6.75109 8.67893 +5.49641 6.76104 +8.91712 10.0271 +7.09126 8.12404 +8.82958 10.2847 +0.569249 0.69421 +3.59288 5.8053 +9.25068 9.4226 +8.51607 9.26259 +5.00906 5.17068 +1.83467 2.99102 +7.32006 7.64842 +0.405532 0.603773 +6.41882 6.60495 +0.721592 1.44375 +2.78393 4.46732 +7.14806 7.16117 +5.12868 5.27918 +2.74138 3.1737 +2.95394 4.26547 +7.82827 8.21028 +9.06982 10.7279 +0.108376 0.290131 +6.34574 6.97141 +4.39022 5.50801 +7.98339 8.79674 +3.80026 4.71831 +5.43594 5.66916 +1.6743 2.61476 +4.29763 5.47402 +7.95714 8.69311 +3.4152 3.7387 +8.01715 8.8941 +6.53723 7.44437 +-0.0222108 1.04503 +4.96242 6.01648 +1.70885 1.75511 +7.62434 8.53526 +6.82863 7.39782 +8.19967 9.22283 +1.99719 2.11323 +-0.0124079 0.240201 +4.48577 4.87935 +2.586 4.41666 +6.37848 6.67092 +4.39606 5.67983 +9.39761 10.1095 +7.10866 7.15796 +3.91993 4.52129 +5.10552 5.36997 +7.08963 8.32694 +9.12669 9.58509 +9.26894 10.1974 +0.737413 1.26523 +2.77833 5.28516 +3.19039 4.36857 +4.32954 5.45614 +4.98069 5.49295 +7.54745 8.76142 +5.70425 7.05749 +-0.250513 0.36578 +4.76997 5.89607 +2.03075 2.32111 +6.54141 6.55896 +4.19799 4.45091 +8.7796 9.11915 +5.75014 6.05646 +5.36885 5.42775 +-0.00433056 0.865304 +3.65169 5.4751 +0.23625 0.872926 +0.0386337 0.792214 +4.40245 4.56789 +6.44567 7.42162 +5.51394 5.98005 +3.50146 3.83147 +8.47573 9.85647 +7.91378 8.47044 +9.44297 9.90241 +5.962 6.68782 +4.49034 4.86927 +2.17774 3.47061 +8.80614 9.26595 +7.92096 8.13838 +7.80209 7.93317 +7.78915 8.29735 +6.98111 7.162 +0.491059 1.14901 +8.97965 9.38792 +3.30207 3.53207 +3.17127 4.43581 +3.97564 4.43746 +6.79008 7.17877 +5.61669 7.51263 +4.0853 5.38748 +4.42181 6.32041 +8.08599 8.9095 +2.46938 2.55499 +1.20692 2.06351 +1.98995 2.35216 +8.17116 9.17158 +7.53414 8.37086 +3.7744 4.46197 +3.29464 4.38 +7.33246 7.81959 +4.89572 6.2831 +-0.152496 1.56427 +0.636242 0.938556 +5.62066 6.06096 +9.42994 10.473 +8.95446 9.46311 +0.277891 2.80311 +6.92968 7.29845 +2.75677 3.02975 +2.2859 2.51308 +2.96683 3.03857 +6.44584 6.49518 +8.33607 8.60407 +7.20303 7.7616 +7.07205 7.46849 +2.35677 2.7904 +5.86404 6.12906 +2.42371 4.62735 +3.27237 4.11016 +0.0668578 0.644021 +6.77371 7.45187 +3.66596 5.21874 +0.718034 0.755944 +6.06162 7.05 +6.91473 7.09753 +5.0749 6.08914 +0.759874 1.11978 +8.54591 9.64997 +3.97266 4.70679 +1.51133 3.17164 +7.21772 7.69877 +8.00719 8.37052 +0.284003 0.38001 +4.08842 4.16227 +5.04461 5.79973 +4.60604 5.31979 +2.2461 2.28157 +6.25631 7.69766 +9.12404 9.67586 +7.73134 8.98923 +1.0513 1.46408 +9.17225 9.42567 +3.66795 4.29168 +8.84403 9.28497 +9.93613 9.94729 +3.16615 5.09374 +-0.149675 1.43397 +2.30855 2.48392 +0.843172 0.951801 +8.32945 8.8506 +8.97012 9.94697 +2.8559 2.92359 +-0.321715 0.89173 +7.48565 7.71775 +1.44301 1.47795 +6.6649 6.76187 +9.10721 9.93599 +1.82207 3.03935 +3.61893 4.5306 +2.53746 3.81243 +0.424528 1.29026 +9.51874 9.68841 +7.94954 8.14396 +7.49282 7.52655 +3.04604 3.69656 +9.45461 9.47212 +7.69209 8.16412 +0.607135 1.16564 +0.150291 0.450632 +3.28914 4.01085 +5.45597 6.02921 +8.16157 8.36605 +9.76573 10.2325 +0.151994 1.07074 +1.3748 1.68548 +2.29854 2.63593 +7.92162 8.68895 +1.28795 1.61949 +7.85469 8.26683 +4.32268 6.33174 +6.13964 6.3596 +1.25714 1.88002 +2.05006 2.28294 +8.31864 8.34151 +9.0613 10.0715 +-0.041568 0.25139 +6.79984 6.81686 +5.10674 5.70583 +5.92937 7.01652 +7.57649 8.05834 +0.937157 2.25362 +7.48567 7.59746 +2.33403 2.88942 +7.3805 7.73421 +5.586 5.75327 +0.828854 2.12988 +8.22741 8.59954 +9.69214 10.1207 +6.55359 7.08114 +1.85342 2.634 +6.08756 7.28893 +6.34993 6.93474 +8.93548 10.1463 +5.49445 5.8338 +1.47951 2.14646 +2.62089 2.75888 +2.35352 3.10539 +4.98774 5.28931 +4.92239 5.40697 +7.52674 8.78948 +4.52451 4.83819 +5.45854 5.75838 +5.51553 6.3901 +4.82905 6.44407 +6.20655 6.4483 +5.68116 7.06109 +7.97301 9.15827 +8.8854 9.91623 +9.60198 10.2449 +1.93322 2.67684 +0.441852 1.87646 +5.19981 5.71385 +2.54799 2.5809 +4.34591 5.02655 +7.54678 8.75202 +6.1496 7.19033 +1.13658 1.30756 +1.38724 2.08252 +2.13624 2.30419 +8.49196 9.41369 +-0.21387 0.685093 +2.47875 4.19982 +3.69093 4.00543 +5.70643 6.50331 +7.07443 8.83588 +6.85756 7.68937 +1.69241 1.83242 +0.140565 0.502156 +2.15007 3.23784 +4.97403 5.69757 +5.08315 6.25554 +3.45026 4.01942 +3.37482 4.73009 +7.4154 8.34013 +6.95399 7.59768 +8.07995 9.86199 +8.43993 8.88645 +7.66844 8.12742 +-0.0200687 0.435846 +4.47984 5.9416 +7.66804 10.0801 +4.14578 5.98717 +0.256533 0.89254 +6.43216 7.4474 +3.60295 4.79419 +3.90129 4.29812 +5.30606 5.58674 +9.11552 9.79229 +5.60702 5.85299 +2.39514 2.64865 +4.51164 4.60227 +6.31154 6.77441 +3.12239 3.13505 +7.50962 7.89478 +3.90928 4.88831 +9.64625 10.0629 +5.9465 6.02877 +2.08554 2.10477 +0.087547 0.34748 +2.34295 2.53703 +6.846 7.3043 +1.37869 2.11446 +4.03371 4.26278 +5.38623 6.40917 +4.75848 6.25417 +6.03478 6.15991 +-0.585543 1.2091 +2.52824 3.57712 +3.95687 5.40914 +4.42955 4.71909 +2.9328 3.98848 +5.40471 6.97056 +7.64789 9.30279 +6.19595 7.07492 +8.27328 9.41596 +8.29855 9.13665 +2.54035 3.10488 +8.25038 8.87903 +5.66599 5.88701 +7.40067 8.71195 +6.63762 6.67694 +-0.0163105 1.72666 +4.77743 6.60356 +0.567991 1.14977 +5.96841 6.42987 +3.02266 4.58424 +6.72121 7.35492 +7.51477 8.65223 +8.55055 8.81014 +5.59759 5.82816 +0.218944 1.82542 +1.03197 2.36652 +7.84302 9.1594 +2.11542 4.7332 +6.37618 6.92981 +1.34963 1.59353 +0.516281 1.08859 +-0.0151152 0.0624718 +6.45603 7.23063 +4.76865 5.46588 +7.5893 8.42021 +1.04534 1.99034 +2.62638 3.04997 +5.00254 5.98512 +7.7588 9.44547 +6.82186 7.34321 +8.7629 9.82272 +-0.309554 0.54858 +4.19843 4.92981 +5.62327 6.80846 +6.40599 7.6073 +6.1547 6.53898 +3.93941 4.44985 +3.28342 3.72778 +7.17256 7.23035 +2.31269 3.05437 +7.99132 8.20926 +7.19338 8.08381 +7.29139 7.96441 +4.25818 4.4208 +0.802894 0.81938 +0.990115 1.04066 +0.443898 0.490936 +3.44459 3.95977 +9.07812 10.3145 +7.86709 8.26338 +-0.230114 0.390748 +7.50905 8.49199 +-0.715424 1.97535 +2.92248 3.12903 +5.44209 6.62431 +0.991914 1.99037 +5.92275 6.7724 +9.10818 9.2797 +4.46434 4.83462 +4.21122 5.48353 +1.8721 3.40764 +7.04713 7.60526 +3.76581 4.76317 +7.00667 7.36475 +6.87244 7.39431 +7.6349 8.46695 +-0.0728922 0.351194 +5.02925 5.6834 +1.45779 2.83702 +0.339175 1.46574 +6.40414 6.9165 +6.30401 6.91007 +5.6392 5.78172 +5.63288 6.44639 +7.45285 8.89031 +4.09741 4.57929 +8.76728 9.06448 +1.62324 1.84552 +5.72509 6.54553 +8.65273 10.3652 +7.3362 7.8953 +8.96224 10.3113 +0.217316 1.7827 +1.28523 2.90127 +8.78746 9.11602 +8.6075 9.9606 +-0.647788 0.779976 +4.9702 5.47602 +4.15553 4.57497 +1.08174 2.80993 +4.01011 4.8145 +6.79603 7.2317 +4.3711 4.43566 +9.65087 9.79922 +8.19407 9.21784 +3.04008 4.94094 +6.0883 7.23919 +6.88708 6.97172 +0.438073 2.00665 +8.53083 8.83004 +4.22258 4.65233 +6.72856 7.61085 +3.17591 3.18978 +5.07955 5.6938 +2.09043 2.55351 +3.28085 4.43556 +7.29225 8.03925 +7.78034 7.82608 +6.59677 7.67719 +5.56032 6.38139 +8.72663 8.82535 +2.96505 3.11983 +1.67192 2.11727 +7.85386 8.49025 +6.30965 6.72799 +8.53082 9.3801 +2.8976 3.39972 +8.90427 9.44661 +-0.0665785 0.410254 +4.58099 5.81135 +1.88015 2.21838 +3.38693 4.10149 +7.46378 7.68246 +8.80985 9.72212 +6.54877 7.25642 +7.18249 7.71509 +7.41978 8.64805 +1.00839 1.78626 +0.39421 0.526751 +7.13516 7.28317 +7.28011 7.80573 +1.90158 2.49032 +1.66181 4.17994 +8.81106 9.21133 +9.46151 10.5007 +0.52585 0.575082 +7.66495 8.64072 +7.72794 8.50991 +4.92409 6.23879 +2.28769 3.21774 +3.62671 4.40932 +5.77688 7.31314 +8.94253 10.0664 +0.416618 0.635111 +1.81377 2.41356 +7.91755 8.83363 +1.62715 1.82626 +8.22065 9.51656 +0.020228 0.724724 +8.81119 9.95764 +8.66509 9.61079 +5.28201 5.32152 +3.95724 4.22138 +7.09339 7.77685 +9.63428 10.1514 +3.69117 3.779 +3.82195 4.76757 +5.75824 6.62265 +3.69984 4.75163 +3.58259 4.8788 +8.32635 8.85873 +5.81959 7.32506 +8.11265 9.14304 +2.20118 3.32511 +7.79582 8.52691 +6.5891 7.13584 +0.385393 0.440656 +1.13414 1.9951 +1.76482 2.69977 +4.76194 5.82757 +6.33633 7.5348 +4.7663 5.65083 +1.98298 3.01285 +0.956973 2.38629 +5.60955 7.65827 +9.11064 9.14351 +2.99933 3.37975 +3.36304 4.57437 +3.89886 4.50733 +8.73838 9.3514 +9.11824 9.66042 +1.47961 2.93909 +0.615297 1.13217 +1.70646 2.32478 +4.35168 4.99362 +0.986601 1.18332 +4.01551 4.92342 +7.68944 9.86838 +4.47611 4.85316 +0.051839 0.86288 +3.59624 5.5628 +7.08729 8.90374 +9.53464 9.9196 +4.69871 5.74189 +8.43146 10.6889 +3.23774 3.77777 +9.35399 9.62741 +1.15259 2.69451 +6.6368 7.33773 +5.26395 6.09857 +6.87415 7.21717 +-0.925645 1.06118 +8.49641 8.67659 +2.31486 3.25354 +2.51057 2.58303 +0.921997 1.48762 +6.29777 6.74738 +4.03945 4.27305 +7.1668 7.3471 +8.44572 8.80343 +7.16937 7.84526 +8.89008 9.4332 +7.01815 7.66319 +-0.420804 0.982878 +1.59755 1.64672 +0.700814 0.72579 +6.3138 7.37379 +8.49276 9.93522 +-0.795656 0.819657 +0.772253 1.05926 +0.917593 1.3917 +3.30076 4.12274 +-0.0237176 0.260552 +6.82385 7.49119 +6.98638 7.52012 +8.24915 9.08397 +4.17486 4.25908 +3.08435 4.64404 +8.17114 9.91412 +8.95923 9.3751 +0.596707 1.89462 +0.982917 1.40236 +6.79552 7.36657 +8.2599 9.69551 +8.85126 10.4342 +7.98967 9.14514 +0.766355 1.63286 +7.76211 7.99247 +5.23163 5.89338 +4.4707 5.50457 +9.257 9.27862 +2.11049 2.59654 +1.65501 2.06238 +0.551768 2.10873 +0.0285582 0.194421 +3.66153 3.85615 +5.07097 5.55806 +5.29145 5.80735 +2.03499 3.0863 +0.73171 2.29494 +2.63023 3.6417 +6.17478 6.25997 +5.79646 6.46363 +9.10633 10.5516 +7.23415 7.84823 +6.49951 7.1506 +9.94647 10.0242 +7.91236 8.09097 +7.8127 7.97662 +3.34238 3.42907 +8.50796 9.8311 +8.75792 8.98028 +9.34125 10.4441 +2.84413 3.71602 +1.49884 2.35652 +7.52317 9.18955 +9.5587 10.3525 +4.85436 6.1181 +5.91369 6.12194 +6.88463 8.34471 +1.51952 2.99156 +4.29022 5.12674 +8.0229 8.41246 +2.44841 3.04779 +7.59975 7.91485 +2.74491 3.62575 +0.0169968 0.240919 +5.85351 6.29039 +4.99825 5.93439 +2.153 3.35304 +1.19032 1.41763 +6.13337 7.80615 +7.05013 7.89364 +8.38056 9.92 +6.35525 6.64521 +3.93342 5.15885 +2.87656 3.47116 +3.56176 4.41159 +6.72084 7.9171 +8.03801 9.12442 +1.03329 2.56255 +7.64542 8.61709 +2.85627 2.89437 +8.8303 9.79838 +1.08032 2.34573 +7.51366 8.39169 +9.09685 10.3677 +6.753 7.41904 +-0.217662 1.42059 +6.72492 7.97553 +7.99325 8.8976 +0.765372 1.10894 +4.37958 6.04671 +8.72027 9.58928 +6.00234 7.29277 +8.43912 9.25356 +2.98816 3.17389 +0.4292 0.552167 +1.69827 2.80318 +5.99904 7.09981 +4.68367 5.87791 +-0.203208 1.09587 +2.65367 3.28472 +3.87051 3.88111 +6.36178 7.18853 +-0.0815935 0.200848 +6.82255 7.18488 +4.99295 5.08405 +2.67155 3.08447 +5.82099 6.77145 +8.76434 9.01086 +5.94982 6.18665 +3.23369 3.71743 +0.934129 2.73456 +1.13233 1.24208 +8.21931 9.03906 +6.25425 6.69972 +0.971299 4.21205 +5.68426 6.45281 +2.85786 3.3955 +8.17715 8.88439 +2.72802 5.01235 +6.12811 6.53711 +5.22878 6.45864 +0.453655 0.922032 +0.466162 0.85262 +2.40916 2.64759 +5.63583 6.37476 +2.18434 3.14105 +0.912811 2.08432 +8.9464 10.1515 +6.77323 7.27133 +0.7167 1.60579 +5.89813 6.32997 +7.66593 8.4611 +6.54145 6.88337 +5.95421 6.21188 +1.10383 1.92226 +5.37168 5.65707 +1.51874 1.66339 +4.60748 5.00384 +8.97354 10.5394 +2.05022 3.20373 +8.17316 8.19283 +2.33792 2.72643 +8.81577 9.3704 +5.95738 6.59855 +5.69025 6.17335 +6.91889 7.88142 +2.17529 2.81528 +6.65046 7.19698 +7.10694 8.78046 +2.09613 2.47484 +1.92423 2.25333 +-0.0906039 0.861376 +6.61481 7.70609 +6.7448 6.84276 +3.43655 5.28405 +6.05404 6.48902 +3.24637 3.36149 +5.69528 5.77157 +5.12352 5.31024 +7.65858 8.80828 +3.69209 4.4851 +0.25765 1.29637 +3.1537 4.13191 +3.12328 3.83765 +2.99798 4.8748 +4.49566 4.67827 +3.50822 4.03987 +8.00334 8.34084 +8.61039 9.00704 +0.0332147 0.166124 +4.55193 5.36546 +4.20308 4.31589 +0.955466 1.20095 +-0.382972 1.47625 +0.803913 1.01916 +3.78333 4.0707 +6.58604 6.70173 +3.02066 3.82562 +1.16515 2.2816 +7.87242 8.24214 +4.057 4.60368 +2.84714 3.59726 +2.77804 3.69136 +-0.139996 1.36416 +4.50647 6.37579 +8.86647 10.1549 +9.24372 10.1442 +0.743107 1.84722 +6.18761 7.65841 +0.214887 0.443938 +8.8513 9.55063 +4.04856 5.79916 +6.69671 7.10025 +6.97477 7.79702 +4.82551 5.10538 +0.821772 2.85828 +9.3086 9.74805 +5.45623 6.66668 +7.64296 8.67451 +7.53052 8.31024 +7.45352 7.5063 +1.31412 1.4979 +7.81176 8.48083 +0.228964 1.73207 +5.52579 5.93103 +6.58544 8.48938 +2.75407 4.18746 +3.21396 3.96298 +1.13806 2.34106 +0.899331 2.87945 +5.69016 6.61624 +2.48172 2.58082 +0.676004 1.43405 +3.41766 3.9503 +0.104554 0.298373 +6.50673 8.21831 +6.00349 6.69385 +9.62453 10.3147 +4.09379 6.02911 +-1.12803 1.68823 +1.83324 3.43133 +8.30576 9.09288 +-0.363911 0.405218 +1.91686 3.34928 +6.98331 7.15885 +-0.31591 0.996789 +0.145813 0.35408 +5.32016 6.13679 +6.99664 7.48644 +-0.140875 0.821045 +9.0119 9.19742 +1.69616 1.72453 +4.38064 5.07542 +6.85898 7.55478 +3.9145 4.27935 +5.77592 6.16806 +1.45345 3.01301 +4.13024 5.59662 +8.14557 8.41669 +4.00075 4.829 +-0.283024 1.59436 +5.92468 7.17507 +6.84458 7.18356 +1.06987 1.42839 +8.618 8.66235 +0.432802 1.59512 +3.78058 4.36051 +1.6113 4.21135 +6.73475 7.01057 +6.74819 6.90498 +6.93146 8.54681 +9.02605 9.91613 +3.888 4.00526 +1.07958 2.27915 +4.78456 5.10764 +3.92952 4.89555 +9.09348 9.30304 +6.73107 7.21036 +7.42366 7.73225 +4.04079 4.72919 +1.21726 1.34683 +8.82903 9.73504 +0.577663 1.00786 +1.56822 2.08675 +4.84315 5.44994 +1.01008 1.16524 +5.99782 6.01535 +0.996739 1.75305 +4.76128 6.39012 +8.93563 9.51972 +-0.0698166 0.453543 +5.9084 6.95139 +0.535401 0.692258 +4.80729 5.48335 +3.42581 4.76147 +3.58715 4.43541 +7.50236 7.71227 +5.19742 5.87901 +1.79752 2.43097 +7.29762 7.57608 +5.65169 6.47762 +6.02249 7.93642 +0.840131 2.81176 +6.2646 6.96911 +7.46014 8.17136 +9.79049 9.94054 +4.61094 5.35819 +7.30902 7.41873 +1.21883 1.84621 +6.41743 6.57736 +1.53114 1.62859 +6.73237 7.47083 +6.05618 7.56831 +7.63374 8.16821 +5.20839 6.05382 +0.619043 1.44065 +2.38657 4.88786 +3.88289 5.18788 +4.42283 4.51106 +9.15575 9.22388 +3.18678 3.72243 +3.20638 3.65935 +4.2219 4.97961 +4.63725 6.90959 +2.57123 2.59101 +4.08581 4.37325 +6.53926 6.80412 +1.77475 3.89149 +9.22854 10.426 +2.67375 4.36551 +3.17194 4.0433 +1.10304 2.0348 +3.67233 4.04957 +3.23526 3.5012 +5.17684 6.47301 +4.4 4.67662 +4.15842 5.85903 +5.88496 6.61616 +7.26489 7.51279 +4.17402 6.6997 +-0.540216 0.54573 +4.36063 4.60442 +9.18146 9.96239 +0.977216 2.42032 +9.09143 9.61178 +5.06686 6.23076 +2.04772 2.92048 +1.4154 2.00707 +7.80442 9.54824 +4.55549 4.7148 +7.56964 8.80172 +1.35347 3.21648 +9.12751 10.0605 +1.81735 2.06061 +5.63798 8.0918 +6.79492 7.98002 +9.23053 10.1299 +1.74639 2.02724 +3.71825 4.09879 +2.4995 3.42493 +4.1255 5.66758 +4.75493 6.99687 +8.22481 8.72036 +6.13689 7.53026 +5.41315 5.66358 +4.21425 5.62743 +6.22936 6.44392 +2.02303 2.96414 +-0.0655462 0.130508 +6.1487 6.70994 +4.36674 6.24985 +7.51129 7.63176 +7.9729 8.98613 +3.92117 4.15596 +4.54398 5.43399 +6.34248 6.92305 +-0.550253 1.16167 +9.15142 9.53717 +8.99354 9.65952 +6.28988 7.90053 +3.36505 3.782 +8.80005 9.70553 +1.99947 2.18573 +1.15023 2.07069 +0.253723 1.32958 +2.0392 2.93977 +2.89024 3.00836 +8.16735 8.2049 +1.49508 2.95258 +6.19092 7.44552 +2.33328 3.06758 +6.44166 7.4649 +7.34749 7.79488 +7.5557 8.04141 +2.76812 5.13617 +7.97308 9.25668 +4.73539 5.22234 +7.53377 8.41651 +-0.355405 1.36499 +4.72111 4.73744 +-1.22753 1.84842 +5.5033 5.63808 +3.95421 4.19313 +6.24752 6.98229 +4.49694 5.07277 +3.70871 4.30093 +1.31984 1.50116 +7.16044 8.70868 +2.44587 3.34659 +6.08322 7.20376 +2.75012 2.82555 +0.0394442 0.863634 +3.90896 4.73696 +4.77494 5.04158 +8.41473 8.82932 +1.7049 2.71024 +9.01684 10.1044 +4.57959 5.01066 +3.2484 4.21875 +1.11596 2.88792 +3.53616 4.14001 +5.80672 5.82478 +5.85844 7.70293 +6.18239 6.30124 +2.22913 3.23412 +2.97521 3.08481 +2.2749 3.70611 +2.3457 3.86609 +2.71695 4.04473 +7.22863 7.40115 +1.80428 2.39815 +1.80781 2.33028 +2.78662 3.14936 +9.40717 9.94906 +6.54968 6.80773 +2.76862 3.24492 +1.96034 2.87404 +3.53295 3.54927 +5.36042 5.67073 +8.63339 8.93752 +0.932415 1.70402 +4.32923 4.55594 +9.3491 10.4969 +0.121416 1.15499 +-0.172998 1.36319 +2.02349 2.29887 +1.75352 2.35329 +0.502555 2.01665 +6.71754 6.80014 +3.35175 3.93337 +7.17133 7.9851 +8.51299 9.95771 +5.86103 6.36734 +1.44593 3.46008 +4.49699 4.60855 +2.29261 3.10053 +6.68713 8.19499 +5.43776 6.84387 +8.58591 9.02134 +5.24746 6.15595 +1.3847 2.5074 +6.62143 7.07775 +1.7101 2.077 +9.70898 10.2789 +6.67451 7.92058 +2.56858 3.60374 +1.61917 2.60482 +1.77902 2.16908 +4.76209 6.00461 +3.8894 3.98269 +7.0278 7.276 +5.4866 5.59417 +1.69306 2.92506 +2.45744 3.76592 +2.5689 2.80611 +5.98283 6.06154 +9.5267 9.9626 +9.55652 10.4128 +6.6111 6.64606 +3.38826 4.26111 +3.61887 3.73455 +4.14924 6.13796 +7.15863 7.28212 +5.78984 6.56662 +2.09304 2.2681 +4.39867 4.88557 +6.20907 6.81034 +4.63336 4.91476 +0.939805 2.43621 +1.56774 5.13599 +8.40908 9.82058 +2.06273 2.20306 +2.53524 5.01482 +2.9314 3.23661 +2.48535 3.47368 +0.366389 1.4699 +8.81131 9.01654 +2.05102 2.87972 +1.9699 2.22723 +6.18333 6.98224 +1.3425 2.4443 +0.767883 1.77423 +3.1538 3.43248 +0.891006 0.903458 +5.7136 5.8713 +0.437569 1.37539 +3.98533 5.01646 +8.65764 9.89518 +3.74889 3.98561 +7.74507 8.30657 +8.24671 8.43006 +6.88467 7.42036 +1.99426 2.03522 +1.90486 2.04181 +1.12911 1.71807 +9.25253 10.105 +1.92989 2.0346 +5.60044 6.25585 +9.16848 10.087 +6.67824 6.72257 +1.88522 2.80222 +0.242758 0.852689 +5.09249 7.71484 +5.54974 6.44414 +7.66767 8.72936 +3.48884 3.83156 +3.4697 5.14646 +8.48582 8.7692 +6.76259 7.06897 +7.83856 8.62005 +5.81853 6.76571 +2.04803 2.94439 +6.85396 7.22985 +6.52449 7.39764 +9.26838 9.34809 +4.64449 5.64975 +7.51845 7.80279 +-1.27268 1.65344 +0.686101 4.20373 +7.80552 8.37119 +7.20419 8.35284 +9.33962 9.87975 +4.31238 5.58683 +2.39198 3.84398 +1.29248 2.59269 +4.71612 6.195 +5.27332 6.52174 +7.71492 7.84702 +8.18064 8.72233 +1.55223 2.31294 +6.34374 7.31758 +6.48966 6.92611 +2.62268 3.09895 +4.09064 5.06197 +2.66367 4.12126 +1.53391 2.93092 +8.64516 8.70655 +9.20047 9.28957 +4.00474 4.11716 +8.5418 9.45901 +8.73386 9.73253 +9.22596 9.63179 +1.34204 2.7834 +8.4489 9.21027 +7.75158 8.51085 +5.98856 6.11212 +1.29906 2.08111 +9.24315 9.76291 +6.84345 6.91607 +5.88294 5.90545 +3.03022 3.39941 +3.22222 3.4089 +1.12791 1.65898 +6.70232 7.36336 +8.60042 8.82377 +1.26451 1.30362 +2.76682 2.92693 +1.54763 2.19582 +6.5865 7.24173 +4.15242 4.21742 +8.39615 8.78524 +1.67017 2.08717 +9.03012 9.97041 +2.31463 2.45877 +8.29872 8.51813 +1.66689 2.51919 +-0.807606 1.47794 +1.31452 1.94418 +0.0739222 0.512106 +4.23577 4.25889 +7.45273 7.97505 +3.34234 3.46608 +7.97304 9.14131 +1.9029 2.99946 +8.84087 9.79689 +4.92769 5.68685 +2.74004 3.04513 +0.889257 2.20448 +3.10574 3.9758 +3.91547 4.32303 +7.17475 8.07377 +5.92903 8.03738 +1.57974 1.65527 +3.76339 4.2285 +2.28263 2.7559 +9.53105 9.87477 +2.10154 3.2222 +4.23683 5.34347 +1.38769 2.48482 +5.39838 5.51872 +8.50975 10.1382 +8.04108 9.21474 +8.5252 9.67823 +8.893 10.7726 +7.1294 8.18211 +1.15642 1.73882 +0.436911 0.756698 +3.66142 3.71659 +6.37686 6.7 +8.88506 8.99896 +2.31891 3.79061 +2.61615 2.81909 +1.35216 1.39571 +3.04217 3.52564 +7.8409 9.34099 +0.470596 1.49157 +6.94014 7.18365 +8.05483 8.49979 +8.18511 8.25608 +7.03597 8.45251 +2.47411 2.65172 +0.112716 0.193057 +4.45039 5.10584 +4.53906 5.80013 +5.11702 5.27151 +1.24211 1.90757 +4.64114 4.72912 +1.77254 3.45037 +-0.1275 0.99675 +5.69637 7.67722 +2.21252 2.44032 +3.89623 4.40192 +2.79904 3.15569 +8.37911 9.42424 +5.27199 6.2026 +1.84791 3.75411 +0.522801 0.54806 +3.83644 4.64785 +6.65497 7.55638 +6.75104 6.98564 +2.34979 2.98049 +8.27176 8.60459 +5.07773 5.44064 +1.16934 1.98872 +4.2914 5.37557 +6.83462 7.95408 +3.91405 5.73229 +7.77473 8.53538 +9.23441 9.90185 +4.03659 5.2473 +5.99336 7.8004 +4.2432 5.89276 +6.39847 7.81276 +9.13909 10.4164 +1.12009 2.5649 +2.35157 3.18468 +4.46918 5.55572 +3.82512 5.53666 +7.18238 8.10193 +8.40911 9.23639 +8.99555 10.4192 +6.69547 8.87825 +4.79012 5.34858 +9.23615 10.0986 +-0.590587 1.14603 +2.74289 3.48244 +-0.248403 1.1591 +3.35663 3.7229 +7.37504 7.6481 +6.64796 7.64695 +0.778081 2.41212 +4.49242 4.7772 +8.01419 8.109 +6.6494 7.76619 +8.86331 10.1205 +0.817273 0.937855 +8.00019 8.21556 +6.19405 6.54794 +6.11798 7.30421 +3.40164 4.28921 +5.31927 6.21584 +2.79377 3.40938 +3.59494 3.90321 +7.79218 10.3132 +2.99546 3.86111 +1.71916 3.40283 +6.1768 6.81915 +7.59629 8.68568 +1.59724 2.348 +6.20151 6.5391 +6.30798 6.70478 +0.489786 1.51322 +1.28396 1.86775 +5.18031 5.43007 +6.61276 7.70565 +1.4909 2.11165 +4.56163 5.49277 +1.93598 4.35147 +3.65568 5.00224 +1.68028 2.00363 +7.82874 8.67399 +1.23053 2.87598 +-0.164275 0.194491 +2.58349 4.01302 +1.23279 2.02984 +0.599702 1.09257 +9.50965 9.80164 +2.33108 3.58037 +4.38659 4.62378 +2.65097 2.87349 +0.0537058 0.576502 +4.20415 5.15693 +5.41458 5.98382 +4.37747 5.10347 +2.62536 2.70073 +6.96845 8.15356 +6.91533 8.41638 +9.36431 9.58863 +6.13019 7.25915 +2.7818 3.4951 +9.44641 10.1301 +2.68817 4.19772 +5.65664 5.6814 +8.25308 10.498 +3.50374 3.64458 +1.47063 1.78567 +8.21901 8.98152 +3.99261 4.47339 +2.51395 3.38788 +4.66178 5.24959 +9.08415 10.3467 +5.92351 7.20447 +1.74145 2.35957 +7.62653 8.96797 +6.43542 7.68775 +5.49047 6.56355 +4.9225 6.22555 +0.257967 0.704837 +3.42488 3.52873 +8.67606 9.77824 +5.12981 6.37856 +5.97359 6.32151 +1.58517 2.28129 +0.530687 1.54545 +7.04056 8.15296 +1.8541 3.1902 +9.46286 10.0098 +3.17967 4.02237 +3.49966 3.80271 +6.24894 6.49618 +1.19944 1.59215 +5.30422 6.94823 +7.49137 7.78584 +7.02669 8.16282 +2.21673 3.36471 +7.66183 8.34763 +4.13876 4.87421 +3.0199 4.07124 +8.40439 8.82943 +-0.274649 0.429602 +6.11215 7.65609 +3.34781 5.03006 +1.28231 1.77258 +7.57256 8.59456 +5.36208 5.81735 +7.18511 8.96618 +8.86053 9.49567 +5.39097 5.93211 +6.59094 7.26553 +3.69159 4.01914 +8.73797 8.81611 +1.41144 1.82827 +7.83555 8.07567 +6.13821 8.44907 +5.83432 6.48744 +2.93596 4.66271 +7.03215 7.59658 +1.65252 2.45337 +2.91358 4.90129 +8.94415 9.14642 +5.21005 6.1166 +0.33225 1.17039 +7.40089 8.07586 +9.30427 9.40776 +2.34188 2.81124 +1.02811 3.3344 +6.28117 7.62089 +4.80105 7.10049 +8.90252 10.0057 +2.20932 2.33093 +8.20746 10.6268 +4.31887 5.23945 +9.258 9.8985 +3.80742 4.15057 +1.11313 1.23711 +9.53067 9.70165 +7.95467 8.67187 +9.66031 9.83223 +3.61385 4.09571 +0.623148 0.652817 +7.77809 8.62118 +0.86157 1.98606 +3.12528 3.75815 +1.9363 3.22621 +8.23521 8.99175 +8.95406 10.4487 +3.38526 3.90652 +0.34281 2.0226 +0.739384 0.793829 +3.55637 3.96384 +6.1562 7.28647 +5.30211 7.51385 +1.46275 1.78688 +-0.0144662 0.868488 +0.0740443 0.119828 +9.26206 9.83923 +0.743397 1.40754 +4.68823 6.62985 +8.8291 9.17373 +4.66711 5.09313 +4.023 4.44994 +5.68937 5.79194 +8.04835 8.06763 +6.94662 8.00075 +0.774686 1.13428 +0.381819 2.34757 +2.1235 2.63524 +5.42795 6.89998 +6.07662 6.29083 +6.47821 6.7872 +2.58305 2.6192 +-0.598336 1.23458 +4.29089 5.43332 +8.09914 8.28229 +5.05925 5.35258 +0.181705 0.444466 +3.27849 4.79932 +0.310314 1.43125 +1.13836 2.76825 +1.2529 4.09336 +0.198106 0.608625 +1.77442 2.23777 +6.29823 6.64574 +1.22125 1.37929 +1.77592 3.04011 +1.43999 2.90926 +4.20495 5.32396 +4.98874 5.33211 +8.36483 8.67875 +5.65373 7.14132 +2.8303 3.05037 +3.41509 3.54032 +7.21702 7.85857 +5.79848 5.8913 +4.52711 5.65511 +2.04663 2.66919 +5.76363 6.77903 +-0.153046 0.77878 +4.37474 4.49936 +6.86786 7.81999 +8.92084 9.16368 +7.5975 8.56954 +0.197493 1.07503 +3.99803 4.67019 +9.35123 9.60094 +1.46442 2.4256 +5.21501 5.79612 +8.80879 8.99085 +-0.109252 1.30631 +7.34965 7.87947 +7.08703 8.12723 +0.985946 2.14663 +0.48521 0.856118 +6.57719 6.70623 +8.71165 8.72286 +3.16883 4.8714 +-0.21189 0.412944 +3.6526 4.37121 +0.364649 1.3363 +9.27722 9.35135 +3.47517 3.8793 +5.67149 6.28631 +6.52789 6.61039 +9.36323 10.4189 +4.30743 6.18638 +7.93653 9.4877 +8.24024 8.41475 +2.75692 3.13935 +8.80223 9.1489 +3.42656 3.90557 +8.96598 9.3217 +1.99582 4.84803 +5.1178 5.8688 +4.47901 5.73433 +7.30397 7.85527 +0.18463 0.656832 +7.80806 8.41666 +8.50023 9.42628 +7.67563 8.64756 +9.46783 9.52169 +2.06797 3.3107 +5.08863 5.10167 +0.82146 1.39055 +7.5428 8.04736 +9.09407 10.8208 +9.15219 9.99706 +1.61637 3.46354 +5.3812 5.96247 +9.34115 9.73575 +6.49221 7.30031 +1.56337 3.39704 +8.463 8.60841 +-0.322779 0.658242 +8.50173 8.72125 +0.854851 1.83405 +7.81945 8.12841 +2.60724 3.19985 +5.03714 5.55331 +1.85041 3.36816 +7.26119 7.64364 +5.75223 5.99653 +4.00026 4.43863 +5.00939 6.03009 +6.22879 6.6638 +6.44231 7.18622 +1.66002 1.88587 +2.59781 2.84919 +4.96399 5.40545 +5.70327 6.95018 +6.97141 7.08346 +3.98535 4.6179 +5.96795 7.14997 +5.07581 5.8262 +4.65665 4.98851 +8.65646 8.70986 +3.04175 3.19155 +0.796073 1.0952 +8.24859 8.57828 +5.26952 6.34245 +7.94685 8.78542 +0.193963 0.968524 +6.61159 6.80186 +9.37533 9.79195 +8.94048 9.74959 +5.77272 6.48616 +6.0092 7.86718 +2.52621 2.58938 +8.91347 9.22421 +4.20466 5.45909 +4.82157 5.09167 +7.35464 7.36611 +5.12413 6.45063 +2.12404 2.81187 +8.88875 9.20752 +2.59731 3.20587 +1.54772 2.08968 +6.70449 7.08952 +-0.0967146 0.888521 +3.10207 4.34815 +1.20807 2.35497 +6.00753 6.08492 +3.21837 4.00446 +4.34095 6.0963 +4.24821 4.79576 +4.49523 6.6669 +1.49483 2.52552 +0.0411497 0.641526 +8.3854 9.20954 +8.12419 8.93702 +0.0201515 1.06914 +1.57617 3.44176 +1.4173 1.76847 +5.42261 6.51539 +6.6744 8.46109 +3.05234 3.59179 +6.49059 7.24618 +7.01989 7.69901 +2.34664 2.90601 +9.17324 9.86754 +5.50919 5.70258 +2.40486 4.6009 +3.74368 4.00093 +6.9211 7.33554 +7.41358 8.7413 +8.78284 9.62033 +2.96753 3.01602 +-0.200693 0.535532 +6.4383 6.45049 +8.28835 9.42148 +4.2379 5.35128 +4.68397 5.04593 +5.7185 7.03177 +5.37494 6.43977 +2.99518 4.08138 +7.28064 7.54638 +9.10622 10.4907 +1.23839 1.50915 +6.7823 9.24533 +8.45679 8.62427 +0.106718 0.69304 +2.84119 3.50375 +3.60466 4.51338 +8.04709 8.19023 +3.31632 3.48054 +5.9027 7.46331 +-0.621072 1.13003 +8.57167 8.69262 +0.301047 1.42246 +1.24229 2.44616 +0.962706 1.55754 +8.77327 9.55275 +1.77899 2.44335 +0.368575 1.84726 +9.05918 9.07832 +6.61723 7.68015 +8.59899 8.80383 +-0.133927 0.20271 +5.69266 5.74809 +0.68202 1.52342 +7.17359 7.91482 +5.74049 7.34297 +7.88371 7.9683 +1.58749 2.26543 +3.96728 4.45988 +5.4354 6.88336 +1.68706 1.6976 +6.56907 7.40696 +0.518151 0.724124 +8.99155 9.36995 +6.00506 7.91529 +5.26967 6.11536 +2.37416 2.50887 +8.47983 9.31509 +2.38155 2.54346 +8.08415 9.65214 +1.00693 3.19203 +1.6523 1.73553 +6.85283 6.9958 +4.11425 4.90193 +1.39597 1.58725 +5.05551 5.19458 +5.89969 6.11394 +5.9148 7.26824 +9.32271 9.93989 +1.62911 2.58215 +5.43399 6.14203 +3.11393 3.58792 +8.57619 9.3788 +2.23349 2.7884 +8.09022 8.54326 +9.7114 9.87076 +5.91086 6.10885 +7.35805 7.57276 +0.650002 0.879866 +3.24977 3.75531 +2.73948 3.41051 +3.08006 4.62772 +3.71868 4.31519 +4.13905 5.78577 +1.77297 3.02983 +5.85931 5.89333 +3.68972 3.93193 +1.43922 2.98425 +6.51534 8.33386 +6.6821 7.50874 +1.2541 2.11722 +5.40634 5.54411 +4.55502 4.60346 +4.32484 4.68497 +3.40711 4.31975 +9.20893 10.0853 +6.12594 6.9009 +0.12664 0.347193 +7.53378 8.82258 +7.79572 8.91645 +2.50098 3.39701 +4.17873 4.97732 +1.05822 2.47032 +3.1012 4.97736 +8.42126 8.74568 +7.83301 8.17843 +9.26618 10.584 +3.02667 3.7128 +8.30654 8.69242 +2.87173 3.43275 +6.59917 7.54843 +7.03447 8.20283 +5.75718 6.40637 +2.62899 4.1855 +-0.520148 0.902194 +5.1538 5.61763 +1.25625 2.33142 +4.16336 4.3384 +3.01296 3.41026 +3.16515 3.26305 +2.40944 3.21897 +6.80742 8.57141 +1.15125 1.54824 +8.72251 9.50878 +3.15703 4.04482 +0.470308 0.726093 +0.199979 0.878243 +7.8908 9.17915 +6.91793 7.16038 +4.64783 5.00217 +2.21237 3.03073 +1.5825 1.63362 +3.18806 5.20795 +5.92725 5.95595 +4.65027 5.09868 +6.42204 6.87201 +8.08637 9.40221 +4.95542 6.16185 +7.45987 7.57979 +8.826 9.13961 +4.42078 5.27977 +7.26216 8.97585 +2.26919 3.33512 +9.4077 9.81908 +0.722223 1.03378 +-0.0497795 1.19355 +8.22686 9.31082 +0.0733766 0.93037 +7.47883 7.9062 +5.28731 5.74181 +1.78496 3.61348 +0.690987 0.764344 +2.56442 3.54999 +4.27944 5.43124 +4.04412 5.35376 +0.663756 1.88268 +1.73567 1.78553 +8.07666 9.41842 +7.70138 8.42873 +9.27113 9.55873 +0.982413 2.5565 +0.994807 1.02007 +5.01226 5.31923 +8.87435 10.0597 +1.74836 3.22578 +0.151528 0.191719 +5.82608 6.06438 +1.17239 1.59955 +3.18515 4.11049 +1.92258 3.70604 +1.63692 1.8266 +1.83542 2.66228 +2.21954 3.11425 +3.97546 4.3928 +0.731374 2.05705 +5.44809 5.96359 +9.85934 10.0553 +8.42169 9.63654 +6.68148 8.43446 +2.00014 3.3485 +0.735924 1.73 +1.61833 3.05643 +7.87934 8.67316 +8.67441 10.0032 +0.794573 1.2493 +6.11926 6.41441 +5.2715 5.82597 +9.41854 9.46625 +3.46299 4.06742 +5.6487 5.79053 +1.46503 3.43496 +0.9957 1.53939 +2.4714 3.1301 +0.887049 1.6196 +3.04884 3.19662 +1.24337 2.05758 +7.61142 8.55766 +0.998279 1.64425 +4.74917 5.85236 +2.97632 3.94611 +4.11786 5.62709 +7.40498 7.62083 +1.47854 3.64736 +2.1176 2.64511 +4.55533 5.89436 +7.44618 9.79926 +-0.410242 0.737348 +5.719 6.30861 +8.33692 8.38222 +8.78122 9.98195 +3.75452 4.26866 +2.23771 2.44985 +6.72455 7.61362 +5.9797 6.58846 +6.72885 7.60315 +-0.710302 1.18332 +7.73287 9.383 +6.61213 7.67394 +4.12945 5.68527 +-0.300887 0.341615 +5.77978 6.41534 +8.34001 9.96874 +1.62323 1.8283 +1.71788 2.23905 +7.43484 8.0418 +3.47322 3.8047 +3.47311 3.51261 +7.82093 8.86377 +2.46973 2.99125 +7.91166 8.55065 +3.39807 3.43599 +8.94792 10.0437 +7.70859 8.32487 +5.86852 7.13103 +7.64996 9.19033 +6.66742 7.8092 +7.88241 8.58675 +9.42939 10.3479 diff --git a/wasserstein/tests/data/test_5000_B b/wasserstein/tests/data/test_5000_B new file mode 100644 index 0000000..5f6e43c --- /dev/null +++ b/wasserstein/tests/data/test_5000_B @@ -0,0 +1,5000 @@ +1.17434 1.46837 +2.58198 4.16589 +0.234041 0.968658 +1.52703 1.59579 +6.7103 7.44033 +3.19227 4.41539 +5.42556 5.57369 +3.45417 4.86089 +3.82256 4.1092 +7.82551 7.90784 +3.9384 4.71796 +5.60335 5.9054 +7.96663 9.8987 +6.30305 6.64853 +7.33246 10.5316 +0.623312 1.09008 +2.63041 2.64616 +5.36028 6.28956 +4.64202 5.91858 +7.55219 7.96304 +7.73736 9.18221 +1.67114 1.84851 +5.07514 5.12159 +7.03732 7.05228 +7.5006 7.59212 +0.244947 1.55875 +0.0170454 1.10485 +1.95394 3.53669 +5.66015 6.01949 +5.88211 7.64639 +7.46698 9.27085 +6.37429 7.10154 +4.54535 4.81932 +8.21203 9.35896 +4.89933 6.20802 +3.68683 4.17831 +0.477467 0.828394 +6.17871 6.77834 +9.77523 9.92676 +0.854808 2.38709 +7.93326 8.3553 +2.10917 2.27771 +4.07045 4.72793 +8.2016 8.8011 +2.9205 3.95746 +2.89806 4.39725 +5.5654 5.78669 +9.5219 9.98543 +7.08591 7.19588 +8.35359 9.57893 +9.81348 10.0345 +8.5994 9.71835 +5.43903 7.25234 +1.82768 2.92724 +4.44952 6.79754 +5.66747 7.34386 +5.88153 6.39253 +3.34008 4.22032 +2.46068 2.76051 +0.370778 2.61681 +6.02508 6.26809 +4.32654 4.93262 +7.41536 7.99616 +8.84229 9.87911 +3.8551 5.84353 +1.56832 2.34694 +6.96099 7.42028 +8.15753 8.72014 +9.23141 10.3815 +7.4484 7.80228 +0.473671 0.874895 +3.15689 3.50687 +3.58122 4.09945 +3.55022 3.74767 +4.42708 5.80211 +4.40956 4.68699 +3.80576 4.61856 +7.29965 8.28614 +7.40582 8.15308 +1.69789 1.77669 +1.66419 3.44308 +0.473997 0.872506 +7.83959 8.52898 +6.22416 6.36949 +-0.187159 0.871822 +0.232336 0.585965 +9.29905 9.44357 +1.4459 2.40589 +2.83008 3.19758 +1.15291 2.12112 +2.58686 3.33896 +6.79362 7.88068 +0.228178 1.48318 +5.60001 6.20258 +4.97803 7.10992 +1.70429 1.962 +2.72659 3.13886 +9.22714 9.25889 +3.84694 3.88778 +-0.282077 1.48155 +9.28756 9.58517 +4.34069 5.59751 +8.63909 8.76839 +8.86236 10.7642 +6.77597 8.41888 +7.30621 8.64164 +0.685607 1.22755 +2.91514 3.22638 +2.72098 3.66837 +8.17528 8.32638 +5.19632 5.7506 +7.34177 8.70639 +5.74082 6.35524 +5.95975 6.69284 +9.40187 10.4488 +2.92761 3.36735 +0.399531 3.13082 +4.83399 4.92635 +7.74539 8.56852 +1.76322 3.5086 +6.54479 6.72963 +7.64362 8.12404 +1.35542 1.45313 +0.214385 0.718085 +1.7006 3.21962 +5.91009 6.47862 +2.21093 2.34636 +5.96919 6.79365 +6.59951 8.22203 +1.54571 1.59397 +3.27012 3.79128 +0.32455 0.622995 +1.73926 2.78017 +9.81035 9.84077 +7.38441 7.85171 +8.90372 9.34186 +7.26323 8.41174 +5.7363 5.97348 +8.25473 10.1281 +2.3981 2.52096 +8.53783 9.63442 +8.51755 9.2735 +6.48614 6.773 +3.40182 3.65137 +2.1353 3.04852 +2.95397 3.73285 +6.98063 7.4963 +4.50189 5.26384 +0.21416 1.49363 +0.632196 1.36307 +6.57833 6.60481 +8.0634 9.33903 +2.79759 2.94462 +4.43747 4.58861 +6.48733 6.86569 +2.28008 3.47037 +6.87452 7.77431 +-0.156821 2.71557 +0.72595 1.78862 +1.97586 2.38196 +8.61839 9.1468 +4.55496 5.68986 +0.26923 1.15728 +9.63757 9.7236 +1.39497 1.96698 +4.8643 5.04172 +6.64675 7.66435 +2.56256 2.6015 +-0.381989 0.611211 +0.676336 1.26896 +8.95304 9.03243 +5.62058 6.07997 +3.36522 4.04276 +8.64868 10.5024 +4.75813 5.19834 +1.96608 2.05864 +9.01449 9.10397 +3.72786 4.51921 +5.6938 6.96584 +1.73499 2.9314 +2.73099 3.41409 +8.77171 9.07665 +4.63865 4.67649 +8.6698 9.30782 +-0.168259 2.09581 +9.29672 9.56 +0.372544 2.60567 +0.450487 1.32919 +6.95341 7.6399 +3.4403 5.24993 +5.53469 6.97831 +-0.79664 1.21306 +5.68831 6.14413 +8.85601 8.95444 +3.83309 5.211 +5.51573 6.5114 +3.64009 3.99648 +4.40759 4.99283 +1.85198 2.6457 +2.72645 3.74803 +2.04751 3.00998 +3.19365 3.9383 +8.09529 9.45596 +8.88173 9.5618 +0.609816 2.67806 +1.57288 2.60884 +1.68354 1.80124 +4.92058 5.9959 +1.48728 1.84885 +0.299669 0.413905 +9.02156 9.56731 +7.50854 8.49023 +0.667131 1.89987 +2.22472 2.58793 +5.84395 8.79426 +2.35839 2.66935 +3.43111 3.69982 +6.71023 7.36801 +6.75697 9.0991 +2.35352 2.85316 +6.73054 7.39006 +9.48673 10.1493 +6.71226 6.72805 +9.22083 9.71889 +8.36513 9.33921 +0.0652672 0.319993 +3.26467 4.60881 +7.62269 7.79878 +6.48608 6.69515 +6.21737 6.88645 +6.56094 6.9699 +1.61317 2.7167 +5.08621 6.29754 +2.24676 2.8076 +3.09943 3.93921 +9.74093 10.0968 +0.417699 1.6381 +9.2958 10.2973 +3.6663 4.1369 +0.0229943 0.448065 +9.2928 10.1833 +3.66334 4.22032 +0.812172 2.19952 +7.88025 8.71192 +8.69379 9.34922 +1.70691 2.95352 +8.28737 8.29985 +5.22491 5.354 +4.03526 4.14084 +6.49359 7.05924 +0.24853 1.44718 +7.86936 8.75135 +5.76 6.68919 +5.85437 6.14314 +5.86292 6.0516 +2.35692 2.91295 +0.0990674 1.29386 +2.9911 3.56188 +0.552671 0.638929 +5.80756 6.22761 +1.21067 1.77175 +4.51882 4.72936 +1.99969 2.89732 +3.65968 6.61987 +0.478582 1.33355 +0.259061 0.289813 +3.89264 5.02474 +0.349236 0.438003 +7.70442 8.1729 +7.90389 10.1876 +3.06898 3.15219 +4.77811 5.29095 +9.76561 9.89451 +4.14295 4.2489 +0.540224 2.28623 +9.60749 10.2284 +8.49555 9.00307 +7.89668 9.76886 +4.12631 4.70897 +7.87898 7.91814 +9.29858 9.52908 +9.24009 9.91544 +3.73498 4.70275 +5.44467 5.9274 +2.13453 4.85697 +2.29607 2.88771 +0.807842 1.82319 +0.319005 2.08473 +1.62 1.63649 +2.20431 3.23869 +2.00132 2.77136 +6.64752 6.71706 +8.12249 8.28379 +7.55541 7.7813 +3.51763 3.64484 +9.21075 10.2811 +2.24501 2.54426 +5.64566 6.46452 +6.72307 8.56698 +3.91728 4.60262 +4.02535 4.29548 +3.0499 3.53135 +1.30677 2.32194 +9.36908 9.90669 +3.92387 4.33848 +2.87312 3.08243 +4.49167 5.2749 +5.43143 6.74905 +6.94595 9.16539 +1.9784 2.00429 +9.42478 10.2226 +3.7185 3.96576 +9.37729 9.50574 +5.34283 6.89736 +4.95341 5.84626 +2.91654 4.28413 +8.26544 9.3076 +6.23114 7.20273 +1.02585 2.21446 +1.6718 2.29591 +2.28926 2.73452 +-0.648145 1.105 +1.44194 2.18562 +6.78584 8.37985 +2.00402 2.08248 +1.64076 2.04067 +0.0419044 0.455962 +5.51723 5.72098 +5.42117 6.81165 +5.70331 5.81707 +4.97889 5.60741 +3.38797 4.46846 +7.20995 7.66784 +3.45388 4.23386 +3.11057 4.35995 +3.29476 4.04676 +2.0519 2.94719 +5.37101 5.38271 +5.99383 6.64188 +7.48444 7.6377 +2.15043 3.05399 +1.54093 1.83799 +5.59223 5.87222 +5.8005 6.08042 +6.1208 7.22563 +1.2938 2.17454 +4.92405 5.0402 +6.91336 7.79688 +1.47978 1.99762 +9.00494 10.8315 +5.84805 6.15303 +4.95368 5.49096 +8.21704 8.31192 +0.715222 2.33517 +0.904183 2.54741 +3.42349 3.74906 +0.627978 2.37092 +8.41477 8.72651 +3.55373 5.58652 +4.12685 4.61533 +0.775274 1.41263 +4.78915 5.08639 +6.35791 8.15015 +2.88242 3.63509 +2.78526 3.07834 +0.39129 1.15933 +3.26615 4.74531 +8.78873 9.8888 +7.25612 7.45972 +4.97452 5.30012 +0.757255 1.35518 +1.29516 2.52446 +4.66838 4.96648 +-0.0720209 0.832726 +2.68276 3.21123 +8.44253 10.0311 +3.40809 4.70506 +1.09617 2.35452 +5.19302 6.73599 +1.25316 1.58101 +6.2056 7.10099 +7.7666 8.52777 +0.301239 1.37275 +0.522829 0.731575 +6.73869 6.96826 +2.41703 3.20567 +4.94617 6.22052 +5.41524 7.68272 +6.0408 6.29938 +0.0642067 0.600878 +6.32122 6.63505 +3.25427 4.70611 +5.88704 6.1678 +8.71533 9.08476 +6.25575 6.88392 +1.54462 1.56366 +3.95938 4.03326 +2.54671 3.66798 +8.48603 9.10156 +3.37369 4.65454 +5.25469 5.64636 +7.02624 7.36449 +8.17061 8.44321 +9.23147 10.1149 +1.45589 2.25886 +6.47702 8.25307 +7.69088 7.91753 +0.442832 0.616926 +8.35355 8.83222 +7.65142 9.58906 +4.04877 5.17345 +0.76012 1.8686 +6.54877 7.40058 +7.41774 7.65429 +8.69655 9.3325 +4.8302 6.25306 +1.77203 1.90284 +3.67485 4.94569 +6.60162 6.72031 +3.05924 3.35235 +0.0823162 1.3486 +8.42991 8.86331 +6.81596 6.83527 +-0.0174808 1.6745 +-0.758131 1.08928 +4.14423 5.46342 +9.26253 9.85714 +7.42749 8.58214 +4.88849 5.86936 +8.99339 9.38141 +8.85301 9.18285 +2.64303 3.45658 +7.1133 8.66473 +3.50745 3.8629 +7.81615 7.83244 +2.94991 3.8741 +7.91822 8.8362 +-0.0553088 1.19059 +7.35558 7.77948 +2.11257 2.20563 +8.57533 9.16338 +2.3515 3.13009 +4.13239 5.38696 +2.20763 2.93941 +7.2451 7.3211 +0.834388 1.57413 +4.47024 6.17855 +4.75947 6.80913 +2.99607 3.54732 +8.15998 8.80718 +8.94688 9.27971 +4.46335 4.9522 +5.30725 5.69786 +7.63989 7.86974 +6.69589 7.69565 +5.34018 6.08115 +8.59515 9.62264 +1.80557 3.22507 +8.62429 8.94242 +1.34532 1.95042 +8.60707 8.80741 +8.03275 9.40327 +4.30357 4.39095 +8.97954 10.7076 +2.18143 3.51825 +3.98695 5.62062 +2.48813 2.60622 +5.56957 6.43776 +5.18249 5.55459 +3.45373 3.64101 +-0.00345662 0.570597 +3.61127 4.69761 +9.37858 10.6205 +7.24635 8.19639 +4.70142 4.80735 +3.30055 5.14257 +0.860415 1.31635 +4.72924 5.46893 +7.47391 7.72644 +6.22287 6.57754 +0.181652 1.01366 +2.14494 2.80736 +2.16406 3.19383 +8.52991 9.22722 +8.74411 9.06935 +0.575831 1.02699 +2.47315 3.0331 +4.2872 4.59813 +5.82293 7.03604 +2.08982 2.25319 +7.3626 8.41994 +1.23867 3.10885 +7.397 7.78026 +6.78837 7.32977 +0.829368 1.56617 +9.23075 9.35172 +6.76562 7.23578 +0.42851 0.839401 +4.83626 5.5852 +0.150032 2.45322 +2.16811 2.47439 +5.60245 5.81188 +7.43707 7.46519 +0.167317 1.44642 +4.9732 7.58343 +8.67391 10.2957 +0.318592 0.639284 +3.365 4.25929 +7.83683 8.88895 +5.20557 5.30114 +0.940347 1.74022 +5.39149 7.13464 +1.10826 1.27913 +1.9147 2.31276 +0.935283 2.49181 +3.67898 4.33336 +5.10125 6.07734 +0.348807 0.839242 +0.310986 0.58381 +2.03594 2.43119 +5.49755 5.94215 +1.94885 3.34409 +9.66806 9.97883 +4.79099 5.45155 +4.81158 5.30001 +5.17667 5.90019 +9.64168 9.99177 +1.14899 1.22792 +0.466236 0.952985 +6.93679 7.72282 +2.97285 3.23931 +9.22517 9.24315 +7.25783 7.46414 +4.37304 4.51815 +4.01069 4.02979 +0.843132 1.80443 +4.78572 6.04237 +6.02471 6.38074 +4.99536 7.76852 +4.97442 5.17384 +0.731231 1.49497 +2.2797 2.90845 +9.13211 10.341 +4.19545 5.08597 +6.13127 7.09817 +2.65124 5.02208 +5.40235 7.12912 +6.86258 6.91991 +8.24317 8.55273 +7.6877 7.69875 +3.33922 3.53776 +0.089484 0.40755 +1.34909 1.68726 +8.43113 8.72899 +4.90038 5.55994 +0.308089 0.490555 +5.42628 7.1433 +2.11647 2.56987 +3.56934 4.1619 +8.35794 9.24416 +8.8645 9.69151 +5.10701 6.0036 +7.66385 7.8412 +2.89952 4.55221 +6.01533 6.38269 +-0.945182 1.07304 +1.79537 1.85576 +-0.0313338 0.501067 +8.85689 8.87522 +1.61143 1.7773 +9.53229 9.84943 +3.51669 3.81091 +-0.448016 1.10903 +3.16889 3.439 +4.30534 4.36372 +6.20158 8.09618 +2.20949 5.23616 +3.29459 4.17079 +3.90101 4.05611 +5.89688 6.85702 +0.734474 1.04471 +7.84341 8.02702 +8.69431 10.1086 +9.73194 9.92195 +7.63516 7.70631 +8.51416 9.33072 +-0.0712911 0.361001 +2.76979 3.22708 +5.34404 7.5165 +5.64429 5.79865 +0.0755012 0.363483 +5.05631 7.27153 +-0.60164 1.09659 +0.457228 0.876186 +4.27092 5.38033 +8.63891 9.04134 +6.29608 7.04242 +8.97795 9.93013 +5.00385 5.57737 +8.48068 9.44885 +7.35543 7.78492 +3.55698 4.01035 +-0.268117 0.649128 +0.633184 0.66254 +4.54216 4.81132 +6.15574 6.35276 +4.3663 6.36286 +1.45231 2.07039 +7.37031 7.9157 +5.30961 6.3506 +5.80757 5.81762 +4.91767 4.97519 +3.45667 3.60965 +1.7934 2.3807 +4.33289 5.41047 +1.16021 1.29979 +3.75172 4.53521 +3.10835 3.1275 +2.68167 3.00314 +4.10639 4.24094 +4.90776 5.74069 +7.30861 7.86666 +3.52822 3.70998 +5.22222 5.28033 +0.00866476 0.326377 +7.73247 8.61481 +4.25231 4.77499 +8.41148 8.54604 +2.95389 3.63497 +7.76126 9.69124 +6.41218 6.69682 +4.86285 6.44503 +1.84783 1.9065 +4.08788 4.11706 +9.17473 9.50133 +5.15091 5.78649 +1.27694 3.33579 +2.92648 3.37855 +9.37392 10.5123 +4.81878 6.34991 +8.38702 8.83716 +5.07771 6.33618 +1.47438 1.75588 +6.20935 7.11166 +1.08286 1.38 +1.40048 2.0157 +6.60355 7.26234 +5.28396 5.90003 +8.9525 9.59216 +-0.0305792 0.544664 +-0.571491 0.735471 +6.287 7.03679 +5.35225 5.4104 +0.095812 0.605976 +4.33523 4.4048 +6.13288 6.80949 +4.14654 5.5505 +-0.213214 0.260592 +7.56188 7.83088 +7.8132 8.65963 +8.02469 9.3254 +0.00641711 0.420562 +7.49269 8.15849 +9.26359 9.4366 +5.74008 7.86317 +8.62729 9.78825 +4.28946 6.20553 +3.19174 4.54991 +4.16992 4.25203 +2.46138 4.11583 +1.92971 2.16701 +3.43028 3.80842 +6.98297 7.28388 +7.51884 7.55947 +7.79102 9.44326 +0.416342 1.32311 +9.35398 9.85201 +8.72997 9.10384 +6.23398 6.88888 +7.46984 7.4875 +5.92603 6.66938 +1.77761 2.58697 +0.835966 2.06139 +9.63284 10.3565 +6.13677 6.42768 +0.151375 0.382404 +8.10315 8.13441 +5.52283 6.28113 +1.00873 2.44226 +2.5239 3.89871 +5.40599 6.72653 +3.43407 4.0068 +1.22444 1.26601 +7.04395 7.80599 +3.75987 3.77123 +6.43597 7.06249 +8.34435 8.87418 +8.25853 9.04009 +0.415321 2.32725 +0.639046 1.75525 +7.83226 8.12538 +9.55429 10.2734 +3.658 4.35867 +1.8588 3.93292 +7.38922 8.16823 +8.53626 9.23024 +0.848152 1.13412 +6.31667 7.2348 +3.81584 4.62621 +9.24748 10.7408 +2.75953 2.95288 +5.70188 6.62278 +4.22202 4.45368 +3.24616 3.88779 +1.05053 2.09846 +8.67718 9.52693 +2.14107 2.71959 +1.10518 2.69689 +5.01476 5.54139 +4.69244 5.20358 +8.88285 9.93012 +2.55228 2.77382 +6.72118 7.50057 +7.58999 8.71573 +1.83763 2.13481 +4.86135 5.27995 +4.39794 5.42117 +1.42512 2.98262 +4.80489 5.34701 +2.7993 5.13702 +7.52122 8.41729 +9.08613 9.37543 +1.1555 1.3935 +7.34071 8.0428 +8.33361 8.40349 +2.514 2.54741 +8.25732 8.41758 +1.65337 2.57964 +4.20527 5.06565 +0.723443 1.06987 +5.85836 6.64701 +7.908 8.07591 +5.01839 7.0105 +3.15908 5.10364 +4.3574 6.67192 +2.06662 2.46437 +7.5595 8.9108 +7.94919 9.20231 +4.11889 5.49714 +7.28151 7.51881 +1.30685 2.09479 +3.08479 4.47364 +4.50916 5.91511 +7.31605 7.63868 +3.14469 4.07035 +8.38431 8.87993 +7.42277 7.64967 +4.22472 4.26323 +8.49871 8.90746 +7.44431 8.09014 +8.35213 8.7504 +3.85634 4.37584 +9.12975 9.77042 +-0.326056 1.17374 +3.53802 4.06211 +6.81775 6.8467 +8.19106 8.64489 +4.20526 5.37727 +2.74081 3.72143 +0.49642 1.10775 +7.76606 8.00524 +4.79825 6.38926 +1.99478 3.20484 +4.69853 6.29508 +5.73058 7.18643 +8.11708 8.64257 +9.62375 9.84838 +5.95271 6.38989 +9.0193 9.93848 +3.91188 4.10834 +6.065 6.60546 +2.62354 3.60072 +8.53665 9.06824 +6.40691 7.44693 +1.62959 2.5825 +9.4128 9.87031 +6.24697 6.62684 +3.31136 3.45626 +4.80347 4.9935 +9.21711 9.53416 +-0.491547 1.72886 +4.75174 4.87217 +0.86329 1.53331 +2.4586 4.2578 +5.10301 6.2815 +5.08302 5.86788 +6.12434 6.78948 +9.68323 10.0973 +3.52576 4.40424 +4.9925 6.89084 +0.846638 1.80782 +1.09709 1.7685 +8.38592 9.03312 +9.56243 10.2682 +5.03592 6.6429 +7.8609 8.04599 +1.21404 1.31975 +7.47824 9.2063 +1.47849 2.68795 +1.2909 2.06381 +5.21288 5.54616 +6.27218 6.99345 +4.77622 5.08494 +3.30665 4.14735 +3.38947 3.55545 +7.71197 8.53162 +1.10565 1.50806 +0.7889 0.984689 +2.88598 3.33244 +5.70958 5.81232 +5.16567 6.24511 +6.91255 7.25784 +-0.401084 0.753156 +4.81138 6.20671 +1.67301 3.58501 +7.19478 8.25624 +1.24428 2.2523 +4.31631 5.33357 +0.589196 1.02017 +5.69207 6.97803 +2.3854 3.25501 +4.1362 4.91135 +8.9932 10.3184 +7.95871 8.45158 +4.03213 5.26347 +3.09506 4.06425 +-0.0310321 0.738171 +7.35733 7.61512 +2.48488 2.96253 +4.72098 5.69867 +5.5395 5.96914 +3.17854 4.283 +6.50012 7.33744 +1.93266 3.00941 +1.49319 2.71826 +9.0187 9.13099 +7.15259 7.40691 +8.71939 8.93257 +1.57203 3.11249 +0.933429 2.16903 +2.99663 3.71667 +2.06144 2.81311 +7.9072 8.2103 +0.490069 0.614737 +7.84111 9.70812 +1.15363 1.6421 +1.15475 1.43307 +8.2228 9.92116 +7.76825 8.40724 +6.15122 7.31322 +7.1427 7.49294 +2.30516 2.7019 +2.03336 4.03387 +8.3918 9.85707 +8.57214 9.59345 +3.8057 4.1119 +8.9223 9.38556 +9.32051 9.60504 +7.13349 7.69154 +1.71855 2.00425 +5.10333 6.0605 +-0.149137 0.80973 +0.466224 3.1698 +4.19165 4.29604 +1.64018 2.3161 +9.40397 9.89211 +5.21738 7.06323 +0.525526 1.0331 +8.06992 8.08704 +9.81539 10.0915 +9.33514 9.50521 +5.95494 6.54519 +9.21466 9.35909 +4.96603 5.18164 +3.89238 5.53056 +5.04546 6.32916 +8.63758 8.65805 +7.03226 7.57074 +0.32029 1.10893 +0.194176 0.992252 +8.79061 9.50848 +0.239137 0.300717 +7.7234 8.43747 +3.43679 4.28954 +8.31382 9.18928 +1.39612 1.67253 +6.95733 7.39846 +1.29129 2.12185 +7.93611 10.2305 +3.67764 4.17562 +1.38149 2.42407 +2.2847 2.48412 +9.28655 10.0661 +2.94115 3.21326 +7.04238 7.91536 +5.06012 5.61526 +8.95611 9.91736 +2.18524 3.44007 +1.0692 1.10987 +4.37019 5.18443 +5.82014 6.441 +1.68642 1.70458 +4.93783 4.9535 +9.42003 10.1196 +-0.356795 1.30987 +1.37778 2.80527 +9.54126 10.1758 +8.67413 10.5984 +0.914291 2.0697 +6.08696 7.09832 +2.82202 3.31103 +4.07818 5.50195 +2.85223 3.67449 +6.03006 7.10863 +8.84655 10.528 +5.08031 6.2001 +1.00272 2.74191 +0.169102 0.223253 +0.025089 1.26534 +-0.203339 0.64667 +0.899666 1.48885 +0.74235 1.49976 +6.28212 6.80412 +5.65159 5.93106 +2.1686 2.7445 +5.02936 5.43091 +8.07124 8.80499 +8.65696 8.95802 +7.68394 8.365 +8.65062 8.69146 +0.058248 1.19535 +5.74545 5.84057 +6.05244 6.52152 +9.3878 10.3328 +7.71379 8.88044 +3.32961 4.54105 +8.51987 8.62854 +4.10821 4.16902 +9.47639 9.78723 +4.72417 4.84793 +2.32867 2.94068 +9.52275 9.57815 +5.32867 6.96127 +4.32462 5.1508 +4.46919 6.45961 +8.62661 10.9533 +0.0244049 0.56156 +1.49207 1.73164 +7.03156 7.81168 +5.88587 5.89732 +8.43632 9.65085 +7.52612 8.06726 +4.82464 5.6193 +3.8062 3.90356 +2.42708 2.51646 +2.06458 2.45877 +0.427218 2.24283 +7.42616 8.11513 +0.617708 1.01833 +8.74218 9.03592 +-0.213346 0.599112 +9.05291 9.59124 +5.20365 5.54277 +2.85289 3.99509 +3.08468 4.58456 +0.136826 0.685254 +3.87191 3.99021 +0.970836 1.49673 +2.44355 2.53584 +8.88615 9.94545 +3.90591 4.52798 +1.52518 2.50658 +7.21268 9.07745 +0.767314 1.23833 +8.62975 9.42367 +6.71524 7.67686 +7.61205 8.48292 +5.312 5.65087 +4.75627 5.96261 +7.90674 8.0753 +7.37887 7.71478 +3.74483 5.52984 +2.7187 2.85544 +4.7902 5.62159 +2.89671 5.19815 +7.37268 8.72506 +7.11916 8.28301 +9.19814 9.75279 +1.2085 2.60113 +-0.632009 0.889734 +7.99858 8.39743 +6.48346 7.10822 +6.30616 7.06648 +5.56514 6.51183 +2.41505 3.56224 +6.83749 8.84447 +9.05111 9.46906 +7.77476 8.4091 +6.11378 6.31232 +4.42882 5.69917 +5.88107 8.052 +3.75437 4.08893 +2.70487 2.77664 +7.26028 9.77257 +1.44621 2.73267 +2.0384 2.60397 +2.95402 3.68949 +6.04766 6.4054 +0.716046 1.77698 +1.5084 1.72988 +2.58426 2.80376 +8.05255 8.59793 +6.06336 6.20709 +3.29813 4.31473 +2.53477 4.92554 +8.78711 9.88634 +9.26627 9.82082 +6.70683 6.81257 +8.25978 8.99788 +7.28054 7.64237 +5.14556 5.20711 +4.20431 5.87866 +8.96592 9.97597 +4.06216 4.41519 +8.49174 11.0491 +5.24547 6.03094 +4.65885 5.95835 +5.09606 6.34846 +6.30463 6.65933 +6.48022 9.56168 +1.38088 2.98143 +0.486911 1.16767 +8.16327 9.34821 +0.768885 0.782616 +4.51699 6.08086 +9.55086 9.70242 +2.86802 3.72489 +1.88496 2.18749 +4.31876 4.33726 +8.38871 9.45631 +8.80634 9.36198 +5.232 6.42399 +9.86919 10.0492 +3.61902 4.53086 +3.13118 4.42364 +2.69395 3.1816 +-0.303144 1.32309 +4.28871 4.36739 +3.8631 4.08745 +4.9291 4.98968 +7.14273 7.25505 +2.56623 2.59122 +6.01753 7.72265 +6.76051 7.53954 +6.76933 8.14741 +0.933137 1.83537 +7.9357 8.57904 +5.55847 5.59984 +4.25563 4.3345 +4.28087 5.21348 +8.88534 9.06554 +1.88575 2.94002 +5.26613 6.04562 +0.514249 1.45538 +0.130644 0.501645 +4.30564 4.86337 +1.57246 2.38451 +0.303814 1.77474 +4.22675 5.02783 +6.75381 6.78634 +5.64096 5.9725 +6.76159 6.98142 +2.35569 2.39119 +3.29794 4.95962 +6.55055 7.03366 +5.31474 5.69404 +9.01335 9.16988 +8.58306 9.37831 +7.06522 7.07778 +1.14695 1.74744 +3.15507 3.22865 +5.5925 7.14168 +2.14679 3.68767 +7.54789 9.71878 +1.5667 2.08742 +-0.604726 1.66718 +0.306012 0.54799 +2.61731 5.08257 +0.80957 1.74655 +8.22035 8.81637 +4.401 5.449 +8.89389 9.01988 +4.80574 4.9322 +2.19895 2.88565 +9.06688 10.8095 +1.23727 1.58699 +7.14836 7.92057 +4.65155 6.15149 +0.563061 2.16535 +7.66764 8.0341 +8.32324 8.42774 +4.54541 5.11069 +8.0237 8.09992 +7.26113 8.09404 +2.55196 3.20317 +8.1236 8.60951 +1.90437 3.23006 +0.888133 2.50365 +1.13618 1.69444 +2.60463 3.01696 +7.2311 7.73229 +5.06501 6.01487 +3.9893 4.10116 +1.45278 1.56937 +2.74601 3.80778 +9.40705 10.3843 +3.02533 3.52213 +8.7097 9.2268 +8.73145 10.5552 +2.56059 3.5742 +6.27328 7.57089 +3.23291 3.30811 +6.33804 7.20304 +7.63648 8.34564 +9.82053 9.93597 +3.14924 4.58629 +5.28253 6.33733 +1.99411 2.04104 +0.305593 0.420302 +5.39668 6.64188 +7.99992 9.37823 +5.25169 5.65987 +0.109291 0.875734 +3.08589 5.50296 +6.51358 6.62588 +5.34687 5.58204 +0.043587 0.932787 +-0.0264143 0.28677 +8.09722 8.37087 +5.46612 6.30285 +2.89146 3.49892 +6.73278 7.11762 +5.03068 5.90176 +1.7459 2.87727 +0.207707 0.448933 +7.00453 7.63105 +6.02789 7.87991 +8.1917 8.95854 +7.49014 8.73215 +8.48402 9.22063 +1.0467 2.4687 +0.241901 1.38802 +2.65867 2.81258 +5.46725 6.59448 +3.40578 3.75607 +4.2495 4.26392 +5.6608 6.213 +2.99705 3.88852 +6.17231 6.72018 +-0.17415 0.492739 +4.89596 6.49895 +4.68876 6.60218 +-0.0510568 1.46013 +8.87099 9.28179 +3.98894 4.5838 +-0.20015 1.59214 +8.80756 9.51828 +7.74921 8.53538 +-0.380041 0.440574 +2.69409 3.91466 +2.42747 4.56745 +6.25881 7.75647 +7.2941 7.77193 +2.60806 2.90251 +0.325028 1.22219 +8.29921 9.01416 +3.85524 5.45451 +5.2612 5.71877 +2.92849 3.73937 +8.6242 8.70808 +7.28153 7.35797 +1.65378 2.87917 +3.46034 4.24143 +3.99989 4.3199 +1.15266 3.60328 +4.8464 6.4887 +4.67021 4.68421 +6.96861 7.31554 +0.00723008 0.817047 +7.59589 8.88352 +5.56725 6.08465 +9.02409 9.19527 +5.81681 6.74193 +1.98221 2.98678 +8.76392 10.7646 +4.3903 4.50531 +1.0186 2.01838 +2.66674 2.74505 +2.41105 3.44579 +8.98295 9.18995 +8.14385 8.98779 +2.69613 3.60144 +0.445704 1.51319 +-0.634889 0.860409 +6.32737 7.10112 +7.88824 8.06838 +3.76271 4.43529 +7.66487 9.30221 +8.73974 9.59191 +3.08965 3.43006 +8.9518 9.96154 +0.727194 1.55228 +6.35214 7.12234 +2.71987 3.22996 +7.12786 7.4379 +-0.346107 0.837469 +8.47103 9.05987 +9.15744 10.628 +8.3237 10.093 +1.15052 1.16223 +6.95959 7.35423 +7.69488 8.44145 +4.21694 5.65913 +3.10562 3.37534 +9.73437 9.78252 +5.0458 5.53479 +7.80485 8.5163 +2.0442 3.75748 +-0.459177 0.498702 +7.38032 8.32195 +0.909659 2.11175 +7.08657 7.56877 +1.84997 3.10206 +4.2517 4.53819 +6.71655 7.04117 +1.06604 1.29153 +2.69273 3.31633 +2.19732 2.84826 +-0.723032 0.774865 +-0.289734 1.44645 +5.87194 7.71917 +1.01576 2.83685 +0.981927 0.998558 +3.07172 3.73201 +-0.112577 1.12642 +3.54063 3.67007 +7.21571 8.53815 +0.109957 0.839052 +6.86046 7.17211 +9.40878 9.69478 +0.989391 1.69046 +8.22287 8.8147 +1.48203 2.83308 +5.86418 8.0993 +0.749797 1.09852 +1.82996 2.50847 +0.28178 0.496017 +2.60694 3.00872 +8.6254 10.1698 +6.11641 6.41537 +7.19529 7.21342 +1.8214 2.17517 +0.991201 1.3788 +2.84924 3.12362 +5.75821 7.13843 +6.7106 7.35932 +6.6055 6.6829 +7.97105 8.58613 +1.56087 1.95845 +6.36782 7.10926 +2.43382 2.74699 +7.40509 8.8029 +8.42459 8.63142 +6.26128 7.55043 +4.6465 5.4431 +2.93214 3.29517 +0.157602 0.545214 +6.05931 6.72188 +1.7908 3.11731 +2.39217 3.58736 +7.07421 7.43852 +8.13419 9.74991 +9.53094 9.65319 +2.35726 3.68679 +-0.108561 0.874853 +6.87136 8.84157 +3.40803 4.58835 +7.50448 7.89932 +4.29762 5.53867 +0.863755 2.30032 +7.24847 7.95342 +2.89618 2.98849 +-0.928261 1.61922 +0.974105 2.91262 +6.99271 7.25856 +3.60995 5.01832 +1.26865 1.79704 +9.62217 9.80719 +1.02656 1.35514 +7.16502 7.32934 +3.12092 3.28857 +2.81374 3.84317 +8.73626 10.7585 +3.36982 3.61446 +5.08437 5.78949 +2.90218 3.0862 +9.2309 10.2523 +5.0967 5.48926 +9.73088 9.92708 +1.54013 2.78301 +6.73707 10.0789 +6.41735 6.838 +2.57935 3.04287 +5.719 6.70352 +5.42474 5.62732 +4.23904 4.69787 +4.16528 4.28736 +7.73477 8.84143 +4.90346 5.87324 +5.1969 6.14087 +3.48793 4.14182 +0.648493 1.07987 +6.88101 6.97932 +7.67342 8.74418 +5.16759 6.3871 +9.16292 9.49569 +8.77422 10.4817 +-0.358149 1.04178 +9.54616 10.3424 +3.12027 4.26504 +3.81223 4.73004 +1.2386 3.32247 +8.21963 8.42629 +9.10312 9.51016 +6.96107 7.43045 +2.98587 3.12365 +0.198165 0.211424 +5.19716 6.10856 +6.10553 6.3327 +3.98176 5.11099 +1.02512 1.04242 +4.27949 5.71947 +-0.457956 0.538807 +7.99877 9.48581 +5.88782 7.73303 +1.21496 2.85825 +8.46962 8.7862 +9.50182 10.1527 +5.85223 7.76234 +2.48368 2.52439 +2.35426 2.77405 +0.397056 0.482679 +0.160423 1.15786 +4.47109 4.8633 +4.74523 5.84196 +5.39177 5.75218 +9.00754 10.3249 +3.74813 4.03273 +3.08633 4.08426 +4.62672 5.29012 +1.92055 3.01442 +3.79279 4.5603 +9.52431 9.68334 +2.8126 3.32592 +-0.313688 0.490785 +9.06695 9.36835 +2.60321 4.14185 +4.40231 4.99535 +9.32205 10.1041 +5.3879 5.44349 +0.308728 1.0956 +9.05758 9.08283 +1.90313 2.50914 +7.1391 7.59459 +7.47357 7.95993 +1.25267 2.34827 +3.33222 4.36522 +8.78126 9.38611 +0.635979 1.62283 +8.3492 8.57545 +-0.572557 1.60517 +8.28855 9.03937 +3.47934 3.90271 +4.64498 5.43501 +0.872177 2.62011 +7.3893 7.58876 +2.14063 2.88063 +1.69361 1.75261 +4.19727 4.86483 +0.814676 1.27639 +8.19899 8.58203 +8.3394 8.99896 +9.31768 10.1694 +4.99218 5.19949 +4.2459 4.75266 +9.6314 9.64249 +4.038 4.75708 +7.92398 8.8579 +4.30747 4.54161 +7.51776 7.78258 +3.77611 5.1385 +3.53275 3.90278 +1.78619 2.12474 +3.18736 3.55159 +8.36759 8.52587 +5.52526 5.7843 +7.64174 8.09773 +4.37925 5.85699 +3.94295 5.31298 +-0.464623 0.795523 +7.02408 7.7048 +0.0690458 1.0008 +1.05445 1.32797 +0.126093 0.712612 +-0.809973 1.33869 +3.45568 3.96532 +0.433875 1.78679 +8.94667 9.65034 +1.98575 2.76936 +6.47974 7.67912 +2.74186 3.34153 +7.82655 9.32112 +4.71441 6.14932 +0.741177 1.76987 +8.05021 8.23239 +0.818503 0.882959 +7.13341 7.43399 +8.45939 8.93395 +4.44558 5.70161 +3.05657 3.86962 +8.75469 8.85537 +1.0922 2.23475 +6.00278 7.51598 +0.0530968 0.582206 +4.01788 5.48223 +1.30808 2.81869 +8.18848 8.59771 +2.43691 2.80685 +8.54045 10.6178 +7.58523 7.91634 +6.70183 7.49962 +5.81501 7.29783 +0.661853 1.58021 +6.50997 7.20411 +0.334292 1.40252 +-0.329585 0.742961 +2.38756 2.48935 +2.78114 3.58788 +7.97227 8.55379 +3.36753 4.57472 +5.14486 5.31457 +3.99691 5.47708 +6.36404 6.8741 +3.22519 4.63321 +1.80583 2.21824 +8.20747 9.42947 +5.90819 6.94368 +6.58559 6.85933 +2.99108 4.03832 +7.20963 9.6252 +3.10244 3.87265 +7.23018 7.91389 +7.18084 9.61063 +6.74145 6.86507 +8.40721 9.5751 +7.12352 9.45614 +2.06653 2.51786 +4.9155 5.04183 +1.34304 2.92777 +0.571315 1.17285 +8.05396 8.28214 +5.29142 6.24974 +8.93797 9.23051 +4.6108 5.45568 +6.46124 7.53124 +3.16695 4.37505 +2.76803 2.82764 +4.1531 4.84927 +8.19433 9.00383 +5.12114 6.22952 +2.2542 4.74849 +0.621192 0.871537 +1.37403 2.28895 +0.305704 1.3287 +8.70471 9.53085 +2.29164 3.56607 +2.42106 3.37382 +1.14309 2.03085 +9.17624 10.3281 +1.88864 2.70161 +0.932647 1.2473 +5.72385 6.55694 +5.25496 5.38675 +5.85771 6.69626 +7.37247 7.93094 +7.73499 7.98782 +4.91417 5.27506 +3.51127 3.84403 +6.96198 7.27686 +6.51176 7.74735 +4.19954 5.08222 +1.58115 1.83842 +2.11889 2.3408 +1.94427 2.00422 +5.59977 6.86555 +9.46942 10.3491 +9.18904 10.1988 +1.71938 3.01547 +4.3515 5.4951 +2.53792 5.85188 +0.3884 1.36228 +5.02469 5.62368 +6.82402 7.72203 +-0.320478 0.821539 +0.0885656 0.248783 +3.01725 3.44385 +6.63776 7.74386 +6.57899 7.9332 +4.82656 5.18327 +3.91909 4.43955 +0.0708319 0.101395 +2.59796 4.22775 +-0.433109 1.26978 +-0.434274 0.624336 +3.22018 4.25282 +4.63351 4.776 +8.889 9.56332 +5.35952 5.46531 +8.73832 9.22756 +2.03432 2.34194 +0.477994 1.43353 +1.2029 2.86844 +5.09945 5.76855 +8.89076 9.01771 +5.30284 6.31732 +1.56375 3.17543 +5.4773 6.36897 +5.30934 5.35073 +7.20096 7.7075 +6.51046 7.12888 +9.37127 10.0531 +-0.0484323 0.348687 +1.83241 2.2143 +8.28633 8.60462 +2.51014 3.65817 +3.27798 3.58685 +1.41567 2.23302 +7.50794 8.10378 +-0.0579575 2.10373 +-0.856005 0.96621 +2.96238 3.48434 +1.36304 1.90594 +2.9997 3.41214 +7.2763 8.087 +1.69207 2.74419 +5.41625 5.83917 +9.22139 9.53794 +1.17477 1.51576 +6.74597 7.90871 +0.678913 1.73759 +5.70863 5.7214 +8.88411 8.93377 +3.44409 4.54586 +0.958963 1.53878 +8.29904 9.3867 +2.52433 3.60238 +8.16257 8.21986 +2.11395 4.23455 +6.85451 7.40364 +0.20286 0.639736 +2.05848 2.49034 +0.547013 0.77336 +7.83609 8.11903 +2.16539 2.29286 +3.94232 4.31368 +8.53475 8.54519 +4.77462 6.4158 +4.08395 4.68214 +1.56902 2.23811 +1.61337 3.11768 +1.51181 1.65521 +0.0821202 2.09269 +4.77622 5.16243 +4.62148 5.75837 +0.613158 0.952696 +1.89128 3.04792 +7.57509 8.92834 +2.70465 4.2941 +4.95906 5.12442 +8.0927 8.17277 +0.796512 1.3215 +5.74134 6.45291 +9.68479 9.78978 +5.89261 6.2292 +6.11377 7.9339 +2.20571 2.67129 +3.46228 4.27058 +5.26723 6.2653 +4.04391 4.26562 +0.380382 0.818995 +7.58108 7.7618 +5.02375 6.13042 +4.20178 4.66297 +2.83039 3.0221 +2.36072 2.45545 +6.68854 9.20726 +2.91388 3.42464 +9.33373 9.73449 +7.75844 7.94625 +2.72414 2.89669 +6.65438 7.96623 +1.00647 1.05385 +2.63018 4.9432 +0.152187 1.60259 +8.86332 10.3631 +2.31523 2.6815 +8.00509 8.61794 +1.69711 1.75938 +8.65442 8.73697 +4.23917 4.32001 +9.66851 10.1925 +6.93943 7.49814 +8.51986 9.03561 +2.10317 2.5175 +0.539549 1.75683 +6.29423 7.93236 +8.64345 9.54556 +1.44069 1.6814 +9.10017 9.77088 +6.16731 7.40496 +0.570043 1.93192 +2.65761 3.88544 +1.46895 1.52688 +-0.369067 0.540647 +2.04868 2.72065 +2.1286 2.27858 +5.90157 6.16431 +1.55581 2.51851 +3.29705 3.81635 +3.4137 4.10991 +8.48699 10.1364 +8.43437 9.4642 +-0.037842 1.47589 +0.541735 1.7805 +0.499576 2.36065 +4.1415 4.72435 +4.77598 6.16872 +3.30388 3.61854 +6.43796 7.85966 +5.27157 5.70871 +0.919258 2.18653 +4.00961 4.07902 +3.78201 4.23596 +4.50464 4.791 +3.70253 5.30916 +8.59228 8.70036 +4.31103 5.69049 +5.31775 5.34378 +2.24198 2.64194 +6.66937 7.41675 +7.21753 8.42057 +4.35399 4.52398 +6.90698 7.30084 +3.44296 5.44378 +3.36719 4.89951 +3.38624 5.33856 +3.44877 3.53693 +5.81398 6.3016 +7.24655 7.33127 +3.86142 4.53134 +3.85894 6.88112 +6.45704 6.95699 +6.90997 8.24088 +5.68813 5.7611 +0.699911 0.824323 +6.73758 8.42517 +9.34644 10.07 +0.289929 1.30554 +8.30644 8.49113 +6.47667 7.16073 +4.28093 4.90236 +8.32678 8.57064 +7.09205 7.92316 +5.55599 5.63919 +1.0104 2.22875 +1.72237 3.53668 +2.54699 3.14823 +-0.668582 1.25485 +1.25582 1.37003 +1.35044 1.57807 +6.17083 6.30811 +0.618816 1.20065 +-0.540992 1.21634 +2.06673 4.28857 +9.03398 10.8112 +8.73735 9.22814 +1.30178 2.7599 +6.0221 7.34889 +8.30124 8.52159 +1.92023 3.34545 +2.99331 4.93358 +3.8412 3.93379 +1.455 2.77005 +0.538664 2.1118 +4.16926 4.26053 +0.699746 0.937609 +6.36024 6.6511 +2.34698 4.84463 +8.11109 8.76496 +4.05425 4.67773 +8.2284 9.78568 +1.64423 1.80353 +5.70109 6.93764 +7.2091 9.67224 +4.47015 5.23311 +4.29326 5.36144 +7.93151 8.96494 +4.61889 4.96487 +5.38473 5.43594 +9.35456 9.66489 +1.23737 3.04121 +1.16077 1.19519 +5.91037 7.55679 +6.88344 7.60181 +6.39705 8.65039 +1.61791 2.93041 +9.68285 10.1396 +9.03129 9.05839 +7.0683 8.29875 +7.19624 7.41696 +7.5266 8.38738 +-0.254571 1.01098 +1.30218 2.03222 +7.6432 7.73031 +4.99495 6.04757 +2.79394 3.29394 +0.31505 3.55963 +7.55382 8.18787 +6.00032 6.27664 +1.49355 1.79767 +5.21191 7.19537 +3.47816 3.75801 +2.10272 2.39494 +1.31887 1.93829 +7.14313 7.63055 +7.3141 7.77239 +6.03409 6.17265 +4.24946 4.53165 +0.0569272 2.56109 +8.44766 11.4872 +4.22879 4.28007 +6.92817 6.98775 +8.08859 9.0206 +-0.0748418 1.48605 +6.56698 7.0488 +4.46624 5.4952 +3.66085 4.05778 +6.44711 8.93943 +2.45735 2.49339 +0.0606673 0.416191 +-0.183838 0.750464 +7.08561 7.67275 +6.65423 6.90808 +0.0598735 0.364072 +5.2228 5.41543 +3.14042 3.19043 +2.40069 3.02829 +1.80441 2.1849 +3.47491 3.95775 +5.49162 6.63934 +2.03332 2.32288 +3.17234 5.25109 +2.58274 2.59951 +9.37994 9.97097 +4.71509 6.77966 +5.18915 6.84982 +6.12508 7.04354 +0.811202 1.98808 +1.46825 3.66984 +2.44386 4.15623 +7.60169 7.68242 +-0.43208 1.22222 +5.40569 5.66153 +0.391742 1.79408 +6.77742 8.43115 +9.12828 9.3851 +6.39541 6.80626 +5.17919 6.29326 +6.57263 8.12999 +3.439 4.62236 +8.40525 9.80086 +7.60986 7.70099 +1.32123 1.44213 +0.526574 1.92338 +9.57195 9.79591 +9.52103 9.63159 +3.79775 4.20608 +4.74446 4.89606 +9.00085 9.60025 +1.26279 2.08363 +4.13639 4.49232 +6.59409 7.18315 +1.0637 1.78425 +5.4213 6.87661 +4.24407 4.30987 +9.79732 10.1204 +4.24597 4.83541 +8.47705 8.5145 +4.34095 4.93842 +5.68168 6.96086 +7.48654 7.91072 +8.32005 8.45111 +5.24065 5.3032 +3.25982 3.94442 +5.58106 6.18764 +4.4243 5.58619 +6.36467 7.07082 +2.70051 3.56014 +5.94534 6.87688 +7.33638 7.7645 +4.57067 5.86652 +7.83993 8.36854 +9.03617 9.11629 +7.44672 7.95614 +6.05876 6.3594 +4.02496 4.97119 +3.01438 4.36109 +7.4932 7.92357 +7.51661 7.53354 +7.60692 8.49678 +1.76088 2.59103 +7.08578 7.39566 +4.83605 5.42933 +-0.186592 0.847663 +1.15879 2.33996 +8.11815 9.35472 +6.02584 7.62549 +0.881084 1.00015 +5.39067 6.27026 +0.910755 0.97444 +5.32174 5.65652 +7.69388 8.24928 +3.40521 3.7615 +5.60321 6.92388 +8.25096 8.34324 +0.00108913 2.16897 +0.508035 0.66573 +-0.0517816 0.0876197 +3.26472 4.30955 +1.99494 2.14903 +2.089 4.32368 +5.17378 5.75964 +2.8779 3.54361 +6.56459 6.90645 +1.43196 2.88337 +1.48917 1.94009 +3.40807 4.25784 +8.0334 8.13458 +8.22254 9.6175 +2.96308 3.14349 +5.04768 5.71252 +3.9977 4.72614 +1.44384 1.60782 +7.78147 8.19817 +7.03854 7.50085 +5.90747 7.06091 +2.89169 4.31831 +2.46167 3.16529 +9.13228 9.1504 +2.57975 3.05313 +5.75976 6.52958 +8.10499 8.98982 +8.43162 8.76377 +0.422917 0.668254 +1.69046 2.09962 +5.50386 6.66954 +0.0897183 0.564514 +3.50103 4.1041 +3.91918 4.52559 +4.39297 6.18876 +3.90396 4.90868 +9.69362 9.85528 +6.27994 6.95062 +8.01563 9.09433 +8.25641 9.72944 +8.22072 8.35423 +1.27059 1.61352 +8.53312 8.96235 +3.49185 3.9042 +5.79579 6.046 +0.489013 1.2147 +4.00074 4.177 +2.66625 2.93036 +7.20267 9.34958 +7.44659 8.54707 +8.99915 10.1143 +7.59922 7.82031 +8.38502 9.03222 +0.160075 0.294398 +4.14549 4.3927 +9.35554 10.248 +-0.159435 0.467922 +2.17272 3.72336 +8.63811 8.79976 +4.23215 4.66461 +6.99516 8.2035 +6.45212 7.88791 +6.20141 6.28633 +7.69396 8.82204 +4.50807 5.96315 +8.51725 8.89286 +0.939492 2.12064 +7.4615 7.62666 +8.46681 9.11769 +3.92828 5.40884 +9.05622 9.40015 +0.229625 0.860838 +2.05694 2.52113 +-0.217927 0.574255 +9.55146 10.3256 +8.31497 8.3417 +3.52833 4.47013 +7.7131 8.52058 +2.15462 2.66777 +5.7674 6.17553 +3.3358 4.10589 +2.06642 3.00412 +2.43387 2.85242 +5.09473 5.84276 +7.3287 7.54846 +4.64254 5.11465 +4.05785 4.93614 +4.25413 5.43513 +2.96476 3.15378 +3.53732 4.48239 +2.34137 4.01272 +2.24879 3.40626 +3.43323 4.49055 +0.871415 1.33068 +0.508929 1.65611 +4.92057 4.94743 +7.03376 7.35193 +5.73043 6.47264 +7.82417 9.93642 +5.24102 5.9178 +2.38528 4.1676 +6.27437 7.19631 +9.29267 9.53262 +4.10098 5.24964 +0.383714 0.833317 +5.97628 7.92987 +8.15799 8.96819 +8.1687 8.29862 +8.16289 10.5149 +7.38205 7.89765 +3.81883 4.15607 +9.46915 9.61755 +1.50756 1.51863 +2.34236 2.84689 +0.398473 1.15027 +1.05302 1.49155 +8.71687 9.35232 +1.0502 1.40395 +7.83685 8.76302 +7.7731 8.46899 +5.56618 5.97458 +2.90035 4.12043 +6.40644 6.68706 +3.95201 4.37075 +7.1831 7.67748 +9.42789 10.0914 +5.45198 7.01256 +8.64609 9.45756 +6.01864 6.31515 +7.64621 8.65533 +5.45654 5.76553 +2.04332 2.75476 +5.49454 5.85693 +6.13688 6.21927 +2.66255 2.7385 +4.8326 6.43772 +9.12704 9.45287 +-0.294488 0.318697 +2.26979 2.35516 +4.12949 5.58506 +3.01416 3.62246 +6.64697 7.10221 +6.44307 6.82985 +4.10484 4.73148 +7.42589 7.6029 +5.33055 5.50395 +2.46474 3.05847 +5.43677 5.59206 +2.13807 2.3988 +-0.38424 1.8121 +0.00916704 0.219304 +8.62621 10.2262 +3.33927 4.51169 +5.45656 7.13165 +5.29253 6.57917 +3.51704 3.9421 +8.63729 9.13361 +3.92626 4.3469 +6.83104 7.52695 +1.22258 2.28191 +0.447646 0.789809 +7.96543 8.54328 +2.24269 2.42571 +4.4161 5.40481 +0.813992 2.21792 +0.694664 0.974182 +6.50017 6.88902 +4.00723 4.65882 +9.05784 9.85062 +6.80276 6.98196 +0.105446 0.379881 +0.416982 0.53336 +9.01269 9.55204 +3.27197 4.23315 +6.7017 6.89704 +4.21512 4.42378 +4.86735 6.90949 +4.52235 5.36878 +2.62205 3.55746 +-0.551048 0.555476 +1.63274 2.71251 +4.26739 4.88085 +8.23129 9.77405 +2.49409 3.96851 +6.66387 6.88886 +7.72383 8.90611 +3.18511 3.27281 +0.73722 1.64435 +7.90329 9.02868 +6.94845 7.06773 +0.509461 1.54928 +4.63885 5.51652 +9.24395 9.5121 +1.00007 1.57161 +5.31349 5.45437 +0.929284 1.71034 +7.05985 7.63288 +7.38418 7.45373 +4.14937 6.5167 +7.49989 8.6081 +9.28313 9.57721 +4.41285 5.1497 +2.96148 3.09221 +1.58256 1.66419 +4.45116 5.43488 +5.70927 7.11699 +3.61105 3.93153 +5.92285 6.63773 +3.50065 4.48453 +7.97338 8.96464 +0.541394 0.965435 +4.46469 5.03925 +7.33695 7.6484 +9.64234 9.6938 +4.16378 4.17886 +7.10741 7.31549 +1.51829 2.62477 +2.1892 2.9684 +9.23767 10.0462 +7.87649 7.97087 +7.05385 7.85952 +6.91232 7.50277 +6.60185 7.81572 +2.27112 3.90211 +5.74452 8.2018 +6.25117 6.26911 +0.525893 1.53447 +0.392956 0.959233 +3.51591 4.71055 +3.10449 5.41156 +7.35964 7.65642 +2.89831 3.54334 +3.42338 3.68259 +4.75496 5.51419 +3.8792 4.48395 +2.18007 4.13236 +3.15798 3.16864 +8.91248 9.21598 +8.54636 9.34037 +7.93697 9.79709 +6.40205 8.9653 +9.67332 10.2252 +4.31771 5.25423 +7.27485 7.3725 +6.22971 7.11411 +1.16538 2.16762 +1.40443 1.6876 +3.14915 4.58847 +7.13761 8.72165 +4.38448 5.88699 +7.98309 9.19449 +8.491 9.05597 +5.55043 6.19359 +2.44006 3.36071 +9.56522 9.79903 +1.86129 2.00225 +1.65239 2.11478 +7.59392 8.4655 +2.44709 2.68538 +6.80932 7.04694 +8.8212 9.4182 +0.276845 0.956468 +8.17008 8.5538 +0.77864 2.06897 +6.78458 7.68692 +0.504907 2.67518 +5.56963 6.9058 +3.42691 3.5414 +2.52065 2.71583 +5.09924 6.26696 +0.223724 0.610039 +3.61258 5.29324 +0.388393 3.11131 +2.87763 4.45415 +8.26438 10.1169 +5.89742 8.17506 +1.89686 2.66651 +5.33662 5.68228 +3.37496 5.67291 +2.25713 2.36127 +0.402185 0.716342 +6.4231 6.79227 +3.22707 4.69314 +7.85092 8.77413 +3.31322 3.72455 +5.43021 7.7167 +8.5883 9.00864 +1.21371 1.71836 +6.35584 7.9706 +5.44438 5.50414 +5.31325 6.11217 +6.08888 6.78794 +7.70604 8.13257 +1.29858 2.48753 +5.54083 6.38817 +8.23948 9.82646 +7.5575 9.0224 +8.00415 9.39763 +0.488455 1.55358 +4.48727 5.20741 +6.46648 7.02349 +0.355939 0.611119 +9.4892 10.2189 +2.61893 2.82832 +0.268193 1.24687 +3.01964 5.19554 +6.29954 7.42795 +8.70796 9.48366 +5.39307 6.64597 +2.47001 2.60746 +5.30949 7.46529 +6.07973 6.16835 +0.764507 1.6144 +7.94123 8.52143 +1.88244 1.96592 +6.42103 7.02205 +7.673 7.73208 +6.66891 7.80675 +6.9305 7.5431 +6.62335 6.93873 +4.34846 5.77621 +0.49878 2.82928 +2.65221 2.80109 +7.45348 7.74372 +4.10129 5.26894 +3.87782 4.19855 +4.62113 5.22658 +2.84558 2.88185 +2.53209 2.86065 +8.94932 9.21967 +6.48046 6.89614 +5.81885 6.66829 +6.49129 6.62015 +8.5663 9.58685 +2.43346 3.89849 +9.36561 9.45886 +1.40232 2.65 +6.66 6.74041 +2.87007 3.49668 +4.71138 6.0184 +5.03638 6.08494 +7.77735 8.14253 +1.0301 1.27179 +2.58337 4.04699 +6.95419 7.89775 +7.81164 8.62551 +3.37669 3.96217 +4.68541 5.58692 +4.79697 6.34841 +3.95334 4.81962 +9.44006 10.0941 +4.91098 5.12386 +8.44273 10.1565 +3.6685 3.73156 +5.07599 5.33357 +-0.138235 0.260923 +2.71154 3.45603 +5.75096 6.16127 +4.4775 4.64308 +6.80557 8.97442 +5.49408 5.76652 +8.31937 9.12886 +3.26479 5.51673 +2.57425 3.03145 +2.42465 3.92714 +7.86505 8.50835 +3.29229 3.43549 +4.08537 4.69709 +7.83885 8.60616 +1.61622 2.72716 +9.10228 9.41907 +8.49325 9.46612 +-0.174644 0.351716 +1.95648 2.14825 +8.28844 8.4428 +4.35888 5.59521 +5.1396 5.22537 +0.330835 0.879566 +6.14972 6.82967 +3.14811 4.89049 +-0.231668 1.08277 +3.13526 4.94545 +8.32674 8.91046 +5.22364 5.48006 +9.84318 9.88416 +-1.07813 1.6965 +1.5095 2.0328 +8.03716 8.2792 +-1.01307 1.46703 +8.22096 9.0055 +8.9917 9.0415 +5.60623 6.74537 +3.15991 3.19314 +3.13863 3.26451 +0.739618 0.896958 +0.67599 1.18486 +3.37355 4.06303 +0.38605 0.410067 +3.03297 3.46387 +3.45867 3.79806 +8.67249 9.53278 +-0.213855 0.787363 +1.52316 2.61117 +8.31846 8.59736 +4.84685 4.94042 +7.41901 7.82623 +4.99029 5.09747 +5.3637 5.37612 +3.22123 4.77749 +3.21668 5.74743 +3.48748 4.59962 +8.00016 8.56269 +1.63631 2.42239 +1.05159 3.72319 +7.22643 7.95706 +5.65694 5.99195 +9.4469 9.66915 +0.857984 1.59867 +4.05869 5.69955 +2.65788 3.07259 +1.8038 3.38748 +3.91934 4.89922 +6.18534 6.70342 +2.85076 3.20176 +8.1897 9.9614 +0.685531 2.05322 +3.31097 4.00809 +8.26537 8.63475 +2.90508 4.07797 +1.25213 2.31285 +3.05752 4.03741 +-0.481913 0.605629 +1.87958 2.19386 +7.28689 7.76316 +4.82075 5.20688 +-0.08115 0.31839 +3.50085 5.89363 +1.31184 3.30269 +4.03137 4.81493 +6.11688 6.13923 +7.93584 8.43321 +4.9838 5.3733 +3.8174 4.11979 +8.56196 9.02824 +2.87809 3.89589 +7.95309 8.05432 +3.47469 3.63716 +6.61009 7.12576 +8.87374 9.79588 +7.31513 7.99089 +5.78084 6.68535 +4.96985 5.59877 +2.20236 2.52473 +0.661014 1.11035 +6.36183 6.58403 +6.67947 6.85093 +-0.242005 0.513902 +0.442966 1.72024 +6.4587 6.74016 +6.67958 8.0837 +8.98524 9.56405 +6.91409 7.59877 +3.73596 3.97705 +5.51193 5.96437 +3.72029 4.50126 +3.09896 3.23616 +8.83312 8.91774 +0.32173 0.486199 +4.21092 4.59955 +2.61616 4.07081 +1.89049 2.65559 +4.96401 5.00629 +9.33156 9.70914 +3.72455 4.61054 +8.91265 9.6563 +7.12401 8.04324 +6.65393 7.25572 +1.04032 1.24927 +3.0174 5.56006 +1.47645 2.26867 +3.49833 4.37416 +6.16877 6.34452 +6.47417 6.90595 +4.27056 4.92535 +7.60439 9.35352 +0.426219 0.754405 +8.5291 8.68579 +5.84717 6.64632 +1.99513 2.5284 +5.10669 7.83064 +6.99006 7.37272 +0.871836 1.5934 +3.6572 4.38875 +0.154617 0.290737 +5.91634 6.50415 +5.33982 5.45293 +6.92602 6.94691 +0.349512 1.61427 +8.02048 8.99943 +5.75598 7.34946 +5.86948 6.51327 +5.11707 5.6181 +6.27656 7.10043 +8.48922 9.73833 +8.35863 8.69746 +6.67829 7.07852 +8.51257 9.50383 +3.76636 4.33757 +4.82804 5.57166 +5.17892 5.61254 +1.35188 1.94069 +6.04969 6.06833 +5.34181 5.82455 +5.71714 6.71234 +0.966462 2.56278 +7.95169 8.15951 +6.53583 6.89673 +6.73246 8.34493 +8.71111 9.76467 +7.53215 9.56537 +0.619041 0.736713 +9.24399 9.50151 +8.57184 9.88538 +2.82682 3.77294 +4.2649 4.84602 +8.6621 8.96426 +8.04469 8.3189 +7.81877 8.42944 +2.78031 5.16589 +1.23076 1.43577 +8.35385 8.49632 +3.27901 3.66774 +0.595941 1.41354 +3.37123 5.16685 +9.11003 9.95515 +-0.25959 0.32069 +1.44153 1.70148 +1.61595 1.70799 +7.8201 8.53423 +8.5402 9.36947 +8.39125 9.8221 +6.2909 6.35773 +0.000933745 0.920054 +-0.21358 0.491025 +4.00874 4.03866 +3.43552 3.55874 +7.85942 7.98987 +7.6681 8.06748 +6.19541 7.14765 +8.53891 8.96393 +2.38789 3.26866 +-0.0162847 1.18379 +1.04764 1.52755 +0.400798 0.55475 +6.32001 6.94897 +5.9692 6.2012 +1.20784 2.67873 +3.58247 4.46372 +-0.229647 0.559407 +5.65979 5.73489 +2.32795 2.78462 +0.706144 1.55147 +4.56527 4.6636 +5.98901 7.20908 +9.27329 9.95152 +1.31296 1.70529 +5.82933 6.41329 +4.17452 5.29881 +4.15885 5.25117 +0.35549 1.3511 +1.0591 2.4463 +8.87597 9.55625 +6.66826 8.57255 +0.355945 1.40613 +5.39729 6.10218 +3.78791 4.37501 +9.53885 9.87184 +2.67568 2.82552 +4.44836 4.52939 +5.96764 7.40168 +6.35578 6.98546 +0.636857 1.19517 +3.3986 5.55448 +1.46493 2.66884 +-0.0676901 1.80921 +7.83396 8.53452 +8.3508 9.04561 +4.03407 6.0066 +0.997538 3.30635 +7.83064 8.03466 +4.57652 4.97461 +3.85952 4.15471 +0.960261 2.1069 +0.522458 1.52989 +8.81627 9.00768 +0.172256 1.29455 +5.69294 6.15752 +6.86391 7.75307 +2.32429 2.95415 +1.83191 1.90364 +0.400855 0.705649 +5.23264 5.39972 +5.19047 5.79842 +2.40804 2.89401 +0.462887 1.43874 +6.70213 7.90229 +4.37985 4.95797 +3.73768 4.30645 +0.756797 2.11146 +0.458724 0.472099 +3.93098 6.47147 +5.5294 6.00365 +2.97106 3.42174 +5.75875 5.80235 +7.96799 9.02105 +5.36254 7.22823 +6.56124 7.39973 +9.49234 9.57879 +2.87576 3.59509 +3.49182 4.28124 +8.68021 9.94486 +9.60199 10.1276 +9.70115 9.81776 +3.09609 3.98732 +5.00113 8.15031 +5.21248 5.74835 +9.23337 9.5696 +2.92777 3.56297 +2.52044 3.04905 +4.79908 5.05762 +1.98626 3.69659 +4.78726 6.20637 +7.39711 7.42831 +4.44319 4.78716 +9.28452 10.0832 +8.00774 8.85707 +9.22947 10.0523 +4.38653 4.86012 +5.15285 5.23106 +8.95413 9.75947 +2.90286 3.32407 +0.348694 1.39738 +-0.0660432 0.293424 +4.09079 4.2922 +6.0407 7.23031 +2.83771 3.72237 +8.54697 9.38898 +2.16742 3.45018 +8.83255 9.30343 +3.59112 3.6531 +7.53452 7.81898 +7.11781 7.19773 +8.2892 10.0259 +4.91072 5.06031 +5.8232 7.25924 +7.0641 8.31604 +9.477 9.63892 +5.8003 6.58306 +9.63988 10.2754 +0.654364 1.02398 +5.9488 6.85043 +7.86867 8.99891 +9.202 9.46902 +4.17932 4.20271 +6.50328 6.71085 +7.19848 8.15579 +5.62459 5.75449 +-0.159668 0.791409 +7.55683 8.7315 +1.03278 1.423 +0.751457 0.808785 +6.2203 6.50634 +1.64418 2.98238 +6.87468 7.00652 +6.36966 6.7117 +7.69893 8.89535 +0.419794 1.05032 +2.73928 4.31548 +0.409245 1.55228 +6.03905 6.39323 +0.409695 0.789834 +4.39148 4.40935 +1.14673 3.23607 +5.85562 6.44503 +6.87394 6.88742 +3.761 4.35136 +7.2208 8.01436 +6.49839 6.54002 +4.70791 5.91886 +4.24906 5.96619 +2.53482 3.91496 +-0.369254 0.69193 +4.81351 6.31088 +9.76066 10.0736 +1.4413 1.55942 +7.21917 8.88908 +6.03521 7.56826 +1.25568 1.42024 +5.47575 6.04431 +1.43099 1.99979 +5.1004 6.04088 +6.54798 6.56118 +1.0142 3.1564 +1.75267 2.1453 +1.28133 1.36044 +9.60996 10.0563 +1.14397 1.50247 +6.86688 7.08724 +8.38287 9.18041 +0.132076 1.27657 +6.52553 6.9301 +0.223917 1.41325 +1.18902 1.79753 +1.40084 1.75678 +1.94524 2.51929 +1.98276 2.62875 +0.763281 1.05483 +7.97952 8.51249 +1.059 3.05463 +5.33401 5.85094 +8.37442 8.64374 +6.62865 6.67315 +1.01707 1.64386 +0.113335 2.23523 +6.71906 8.00216 +-0.886574 1.29366 +4.20078 4.85294 +8.43336 9.06988 +3.55413 4.40768 +6.69076 9.01132 +6.18982 7.14109 +7.14381 7.7046 +8.63195 9.47031 +8.88052 9.84886 +3.34443 3.62637 +4.5862 4.72832 +4.95757 5.23571 +2.85993 4.04966 +1.43846 2.27425 +5.43112 6.30496 +-0.452609 1.55525 +7.17706 7.71287 +5.78537 5.79579 +8.51102 8.9466 +-0.472904 0.810489 +3.83688 4.24045 +8.04432 9.04582 +1.57259 3.37136 +1.22231 1.33582 +5.73006 6.26477 +2.90855 4.22125 +9.39717 9.4287 +3.63873 4.16094 +0.442035 2.08889 +0.294491 1.31124 +3.14755 3.86305 +6.57634 9.44898 +2.19051 2.41878 +4.99277 5.12569 +4.10425 4.9423 +4.83547 5.62769 +5.73879 5.78179 +8.90329 9.81905 +5.60168 6.17538 +5.83843 6.66128 +1.84271 2.57406 +3.01047 3.33662 +2.85037 3.79158 +3.49007 4.46877 +8.58942 9.51529 +0.613753 1.12824 +8.23757 9.54707 +9.27134 9.4196 +6.27126 6.56417 +2.17206 2.33018 +3.53588 5.17162 +8.6312 10.0868 +5.76342 6.66164 +9.01501 9.90984 +3.22004 4.18954 +4.37918 4.68595 +2.00928 3.49815 +6.64229 7.06693 +2.85962 4.58794 +8.45587 9.8897 +2.8481 3.65956 +8.65849 8.67336 +6.48486 6.58637 +5.82336 7.45254 +4.02267 4.59696 +2.24997 2.83815 +8.16201 8.55518 +7.40645 9.07085 +1.43137 1.50333 +8.7212 10.9419 +1.50523 2.44124 +1.92455 2.85819 +4.50866 4.53052 +5.75781 5.81275 +1.71013 2.0282 +9.31592 9.9015 +6.14972 8.18798 +1.85705 2.20068 +4.80971 5.10509 +3.31201 3.58168 +8.61824 9.31861 +7.19497 7.86933 +3.25381 4.53472 +5.62799 6.29537 +9.00659 10.021 +9.15156 9.74827 +2.0324 2.80741 +0.714403 1.00476 +1.26522 1.80417 +-0.362995 0.41758 +7.08785 7.71544 +5.55685 5.74045 +0.428866 3.03773 +7.61574 8.94894 +9.07256 9.69772 +4.49537 5.06822 +5.66388 6.48899 +1.69126 2.69607 +9.90539 10.0783 +6.56455 8.27128 +6.61988 7.86616 +7.42012 7.64493 +2.99922 3.35282 +4.69379 5.18947 +0.87894 1.30518 +9.47632 9.61234 +0.665754 0.855958 +-0.422778 2.11197 +3.38786 4.15441 +7.57236 8.75855 +1.89832 3.50224 +-0.185929 1.0777 +3.32911 5.53465 +6.91111 8.69247 +6.97456 7.86905 +4.75518 5.0948 +4.23733 5.83368 +8.52456 8.56086 +0.0978267 0.136564 +7.4668 7.99757 +5.52851 5.80858 +8.5833 8.88589 +5.10603 6.41348 +4.70682 6.59981 +8.60265 9.19477 +5.04514 6.24014 +4.49041 4.88669 +7.40925 9.15624 +0.80364 1.35315 +7.11604 8.01153 +0.267749 0.714089 +0.121521 0.822226 +9.30556 9.81307 +2.11398 2.92567 +5.97722 6.08022 +7.13483 7.22211 +8.00161 9.27274 +4.87681 5.51654 +3.11843 3.84311 +5.17747 5.98482 +3.6077 4.46306 +1.37454 2.2443 +4.93385 5.96357 +2.92184 4.0964 +4.88767 5.56353 +2.87394 3.76336 +0.326521 0.622872 +2.42056 2.45007 +-0.527891 0.827211 +6.73151 7.20155 +1.82048 2.54905 +1.35563 1.88701 +3.64202 4.10669 +5.22846 5.23953 +6.06271 6.46993 +2.71418 3.2081 +6.41179 7.57176 +7.45823 7.79609 +1.01227 1.39137 +9.0872 9.20132 +5.083 5.64038 +5.63236 5.97945 +-0.317645 0.822313 +0.865396 2.65587 +5.71839 5.98983 +1.50978 2.08611 +2.95824 3.70996 +0.264301 1.02233 +8.22351 8.98589 +4.87805 5.24127 +2.31329 3.46752 +6.19539 6.69676 +5.18643 5.40947 +7.15453 7.66643 +1.20694 2.25111 +7.87378 7.89093 +5.16514 5.604 +8.68354 9.01395 +7.33753 9.37499 +2.94627 4.06036 +8.64337 8.85727 +0.0353092 1.0128 +6.98437 7.35718 +6.77073 6.79959 +3.13559 3.70735 +7.40139 8.27017 +4.01174 4.39788 +3.22281 5.11647 +7.79256 8.58737 +0.642233 1.39694 +7.18603 8.69453 +3.37803 3.59355 +0.762287 0.84262 +4.21823 4.52565 +0.894924 1.35434 +0.844327 1.19938 +5.57958 7.05431 +-0.631066 1.55134 +3.78962 4.17935 +9.15329 10.4824 +5.47536 5.52975 +8.81243 9.16088 +4.45989 4.94123 +8.68235 9.45112 +8.04719 10.3938 +8.87349 9.40483 +0.502543 0.570283 +2.08512 2.47652 +-0.654512 0.804355 +3.68569 5.21711 +5.33017 5.80226 +3.44991 5.31415 +-0.00417763 2.95077 +7.17784 7.9318 +1.2721 1.31642 +5.24415 5.64173 +2.79434 3.28746 +4.54991 6.49276 +4.74707 5.12555 +7.36365 8.15777 +0.913049 1.79828 +1.47498 1.83425 +2.64271 3.38567 +4.78159 5.44718 +7.6087 7.66442 +-0.484393 0.909893 +3.16824 3.23757 +4.43021 5.90284 +4.25954 4.74995 +6.58742 7.24125 +1.86151 2.27069 +3.16459 4.5945 +1.06471 2.08965 +3.31028 3.83029 +1.52593 2.47521 +0.703789 1.42451 +1.47969 1.68923 +2.92352 4.24089 +9.84088 9.93485 +3.18205 4.27817 +7.39345 7.78945 +3.78808 5.41572 +4.38624 6.75693 +6.93065 7.16977 +1.01289 2.19807 +3.37006 3.54196 +5.50238 5.58285 +-0.225113 1.99347 +1.67796 1.86943 +6.1999 6.35102 +3.80494 4.74814 +1.13294 2.02639 +1.1965 2.6548 +-0.284453 0.856092 +4.26565 5.02196 +9.66948 9.88874 +6.20287 6.25528 +4.38154 6.65806 +3.77411 4.3075 +5.77177 6.78486 +9.16311 9.816 +3.22861 3.42009 +3.36573 4.34724 +6.76951 7.58025 +4.83813 5.23042 +3.87192 4.37372 +5.56859 5.90066 +-0.368163 1.4593 +5.44031 7.81671 +2.66342 2.99253 +6.11846 7.69499 +4.98811 5.17531 +4.45078 4.67513 +4.88206 4.94128 +2.51813 3.0268 +0.461292 1.15264 +2.34766 4.48652 +0.198819 2.23425 +6.85634 6.98248 +0.912438 1.81872 +4.84933 6.34912 +5.15613 5.82891 +0.172772 0.994083 +3.37381 3.64549 +1.98836 3.2697 +1.64344 2.06049 +0.766585 3.09305 +7.8979 8.28046 +4.34856 5.01341 +6.69809 7.24239 +5.19034 7.04959 +5.3747 6.92123 +7.8893 10.1251 +6.11207 6.99125 +5.37115 6.84111 +9.04786 9.11002 +6.45326 6.64415 +-0.76294 0.92832 +0.980411 1.8166 +3.05536 3.50031 +6.10827 7.55786 +6.57848 9.06264 +7.66855 8.861 +4.80276 4.82283 +1.99932 3.2877 +9.45229 9.80653 +0.457474 0.778684 +5.44444 5.95239 +5.60974 8.05169 +7.64656 7.79632 +6.78372 7.65134 +6.93878 7.82023 +9.08292 9.55308 +9.16329 9.25802 +1.4909 2.38688 +4.31881 5.3564 +5.12535 5.60119 +2.44591 2.54637 +7.36929 7.80452 +2.13707 2.97655 +9.73557 9.94588 +1.96637 3.36097 +0.857068 2.29643 +5.58224 5.91142 +8.90714 9.0255 +9.77988 10.0711 +0.41121 0.970955 +-0.518356 0.91447 +7.58725 7.71255 +8.1435 8.78712 +6.5487 7.17991 +4.94961 5.50283 +8.14086 9.03281 +3.51281 5.24806 +3.5786 3.84066 +6.27435 8.37735 +8.65263 9.5555 +2.87484 3.56117 +5.57707 6.55879 +-0.111276 0.264178 +3.60894 4.15477 +2.82322 3.64397 +8.40669 9.1127 +8.43089 10.5298 +1.38472 2.2453 +1.74464 2.00472 +4.01588 4.67572 +0.408869 0.938602 +2.06155 3.46067 +4.4871 5.08963 +2.4435 3.87355 +1.32864 2.55801 +4.78579 5.26122 +7.43027 7.57749 +6.90971 7.32716 +8.01095 9.46872 +9.41627 10.524 +8.83143 10.4474 +0.631816 1.75513 +1.72965 2.17123 +-0.513239 1.1886 +6.75616 6.7984 +2.49278 4.26493 +0.230011 0.966298 +3.78506 4.95013 +2.03886 3.14808 +7.87309 10.5637 +3.54564 3.58055 +1.91974 2.9194 +4.8503 4.98668 +4.66494 4.83558 +7.57916 8.24358 +4.78743 5.38547 +2.81034 3.34534 +1.00297 2.0138 +6.87593 7.17736 +3.93157 5.0655 +3.10361 4.05519 +8.22876 8.38326 +7.48377 8.31026 +2.23106 3.4905 +0.130934 0.606709 +1.22344 2.55898 +7.55829 7.92597 +4.10977 4.86263 +0.122756 0.264176 +3.8357 4.15854 +1.28414 2.13031 +0.280029 0.805504 +2.88245 4.1704 +5.57936 6.94781 +6.22719 6.33201 +-0.761013 1.16475 +6.16636 7.12566 +2.98935 3.192 +2.23263 2.34362 +3.9082 4.11692 +2.66865 3.5275 +1.87676 2.43966 +4.60035 5.39332 +2.74287 3.73097 +2.81953 3.96666 +5.73644 6.04042 +4.02179 4.52419 +3.26438 4.07346 +1.22509 2.13719 +7.91885 9.71846 +1.28152 1.48079 +7.97918 9.26344 +8.75682 9.8677 +7.25678 7.45362 +8.16161 8.87066 +1.21873 2.37224 +7.76739 9.06346 +3.89932 5.03406 +3.53901 4.37006 +2.93795 4.04333 +6.36543 6.72985 +4.72622 4.98804 +1.86205 1.99008 +0.784581 2.05264 +0.978519 2.91723 +3.9067 6.47195 +0.735425 2.38151 +8.37394 8.41609 +6.91804 7.23374 +9.39259 10.1026 +7.28732 7.43466 +4.75982 5.44264 +6.71504 7.53933 +2.17125 2.54358 +0.703562 1.39087 +-0.221711 0.541965 +9.22839 9.39159 +9.53465 9.97585 +1.44304 2.53666 +7.886 8.85051 +9.33174 10.1632 +2.60898 3.42889 +1.73658 2.02589 +6.31651 6.77762 +7.26755 8.34499 +9.01312 10.9837 +7.47361 8.96251 +7.98365 8.02586 +1.40065 3.44891 +9.44617 9.55391 +8.24265 9.34849 +9.366 10.4216 +0.375354 1.17522 +3.37114 3.38278 +-0.742469 1.07634 +4.29988 4.81879 +4.18605 7.21928 +7.41047 8.29198 +6.68173 7.60225 +3.24292 3.30695 +1.8951 3.42167 +3.97359 4.2857 +4.72621 5.80575 +4.75014 5.02239 +6.43454 6.94568 +7.16601 8.10355 +2.16685 2.23666 +6.70852 8.63284 +8.16988 8.95848 +0.277002 1.30648 +1.5803 2.28632 +2.22634 2.34679 +0.200623 0.814959 +5.27457 6.51651 +2.49533 2.90705 +6.48922 6.69528 +8.18879 8.63551 +2.75159 3.633 +0.884853 1.56434 +1.87488 3.98951 +4.24783 5.17713 +6.22499 6.56095 +5.68238 5.99272 +3.75553 3.85012 +4.87543 5.39966 +6.62671 8.72493 +3.50262 4.05131 +5.38952 5.4974 +7.84971 7.94051 +5.39123 6.66564 +5.43986 6.17256 +7.48968 7.7677 +4.2685 4.57296 +1.75169 4.11058 +5.03634 5.16102 +4.68003 4.84715 +8.36249 9.98761 +8.94297 10.6969 +6.21572 6.24305 +7.90303 8.0672 +7.90426 8.41244 +5.98512 7.93187 +5.13297 5.27136 +6.58367 7.4971 +4.72663 5.22956 +7.99667 8.59246 +4.3303 5.92188 +1.3132 1.80875 +7.70104 9.20947 +1.78862 2.00473 +9.63678 9.65571 +-0.264416 0.318054 +2.70004 3.40777 +2.74642 3.73608 +3.6494 3.6743 +8.03113 9.22851 +1.07526 1.3116 +4.05436 5.33291 +4.60907 6.03605 +7.83426 9.10358 +2.27997 2.77309 +5.63139 6.92616 +4.40717 5.25214 +1.98986 3.5062 +2.42393 2.9584 +1.94336 3.08456 +1.20185 3.01827 +0.641733 2.10095 +7.25046 8.29391 +0.640392 1.26451 +3.9588 4.85492 +6.83036 7.41101 +6.48581 7.08757 +6.48734 8.47856 +9.55084 10.3774 +-0.173137 1.26574 +2.32702 2.58775 +2.7463 3.13914 +7.86951 8.62807 +5.96916 7.92759 +0.217046 1.70373 +1.04207 1.05755 +4.79058 5.07902 +4.19024 5.35395 +9.00175 9.83715 +8.37554 9.275 +4.5204 4.82999 +3.49936 4.75519 +7.07916 7.74619 +6.66726 7.35282 +7.39513 8.55523 +7.50381 9.60708 +1.39304 2.26927 +2.84101 4.76376 +1.21779 1.59353 +4.7893 5.70143 +9.12195 9.57131 +5.40461 6.15443 +2.86445 4.26837 +8.01324 10.9082 +2.96659 3.8042 +2.4897 4.59323 +6.37887 7.15878 +7.00143 7.6419 +3.22491 3.41843 +1.22852 3.31783 +2.09881 2.56121 +4.43205 4.67051 +4.39328 4.66715 +2.38355 3.39058 +0.638802 1.59399 +5.32717 5.81376 +8.00353 9.72007 +8.77281 9.81649 +8.95552 9.86609 +2.90915 3.96556 +3.88176 4.93124 +6.45945 7.69942 +-0.108577 1.57424 +0.304992 0.320561 +6.47789 6.5515 +1.98211 2.05312 +6.2741 7.35626 +9.45057 9.67918 +5.2916 5.48037 +0.158802 0.712187 +6.42002 6.84323 +9.11085 9.13063 +9.42446 9.95882 +6.03624 6.96469 +9.2473 9.6286 +7.10342 8.71163 +3.34072 3.35187 +7.4602 8.58506 +8.7963 8.81873 +0.323615 2.22687 +0.326746 1.76681 +2.20062 2.76862 +7.55181 7.85006 +0.941035 1.28117 +8.76643 9.60019 +9.19731 9.33092 +6.0479 6.57293 +6.12725 6.24356 +7.53078 8.92488 +3.1841 3.48283 +1.85544 2.01888 +7.3849 9.29183 +5.03915 5.27721 +4.77142 5.46282 +-0.291696 1.14641 +1.61367 2.20867 +5.31853 6.69431 +2.52731 3.13139 +4.86677 5.18106 +4.50183 4.60969 +5.95881 6.09964 +2.41939 4.42026 +6.92003 7.17891 +4.29584 5.48557 +8.02803 9.06315 +2.82326 3.49599 +5.8647 5.87561 +2.38814 3.62688 +6.32418 7.17662 +5.99907 6.5059 +3.84698 4.14446 +9.80728 9.82132 +5.2366 6.30871 +9.81878 9.91004 +1.53024 1.83525 +2.98035 3.68531 +4.5418 6.98786 +5.19561 5.9846 +0.946068 1.46672 +3.26948 4.71928 +6.13476 7.68682 +8.36934 9.65072 +6.40074 7.14762 +1.01349 1.80493 +8.4514 10.25 +-0.180382 0.682704 +1.03041 1.63565 +5.64642 6.96069 +2.73598 3.67485 +5.8705 6.66157 +4.68343 4.7176 +5.83787 7.6818 +1.42529 2.234 +3.73726 4.19241 +5.38341 5.81884 +1.13088 1.69073 +0.968034 1.98828 +1.06007 1.11039 +3.50129 4.51807 +5.83133 6.77904 +-0.334945 1.29129 +0.326706 1.16015 +9.15028 10.4391 +5.13047 6.79712 +1.06952 1.38997 +5.79345 6.49898 +7.88149 8.5143 +8.00404 8.09794 +8.22725 8.28904 +6.38406 6.61356 +6.32166 6.73458 +7.17066 7.32049 +1.64338 3.79327 +7.92135 8.55568 +7.15578 7.42231 +6.70701 7.65427 +5.76608 7.63064 +3.54163 4.08662 +3.81402 6.76906 +4.5998 4.61865 +9.01471 9.18718 +5.21234 5.73335 +0.946018 1.39917 +6.99714 8.29739 +5.64458 6.93965 +3.39809 5.70907 +6.32284 6.83604 +8.50347 8.53097 +3.90118 4.85721 +9.41198 9.62076 +4.41514 5.55152 +7.69979 7.81249 +5.34434 5.37105 +7.25274 7.76114 +7.67383 7.92718 +5.82851 6.29417 +0.935651 1.2842 +0.639586 0.786771 +6.39823 8.31226 +3.67546 4.89035 +9.20323 9.57287 +2.33896 2.99576 +8.51933 8.80243 +0.983098 1.11084 +8.48215 9.42998 +7.29586 7.3914 +2.00695 2.89046 +2.60909 2.62433 +2.04118 2.92033 +7.60386 9.01419 +7.32896 7.73342 +9.51693 9.54891 +5.1323 5.24962 +6.35326 7.18302 +2.50952 3.51872 +3.4149 3.57431 +9.18412 10.4976 +5.68123 6.42697 +5.87758 6.0124 +6.3202 6.64588 +8.2547 9.98176 +5.50949 5.7854 +0.0824268 0.128178 +2.17292 3.76233 +7.22786 7.68214 +5.09326 6.4151 +4.30171 4.86688 +2.39206 3.47399 +7.95152 8.35556 +2.40133 2.936 +2.77819 3.87516 +3.252 4.33376 +9.54269 9.7513 +6.6747 6.73043 +0.611474 1.97158 +7.65864 8.53689 +1.58345 1.8017 +2.56917 2.8152 +8.5424 8.8301 +4.98159 5.44499 +5.82482 6.03578 +3.55509 4.90785 +5.77028 5.94747 +0.163965 1.1379 +2.85039 2.94261 +4.24343 4.67273 +3.22636 4.06084 +6.03662 6.21018 +4.55495 5.07697 +1.91173 2.51739 +6.54894 7.24036 +5.55502 6.92676 +0.245707 0.586188 +2.28044 3.29563 +4.71378 5.25198 +8.28953 8.44891 +9.42282 10.179 +5.0548 5.73614 +6.3203 6.43659 +6.54178 8.82077 +3.67181 4.17365 +8.51445 8.96445 +1.69648 2.84524 +0.194222 0.920147 +2.48533 2.59803 +1.66002 1.6739 +4.79833 4.95404 +1.09801 1.11009 +6.62529 7.4066 +8.0099 8.37262 +3.55429 4.11824 +6.2666 7.12137 +7.83222 8.01342 +9.37156 9.72961 +1.1647 4.04434 +4.50719 5.09068 +3.25175 3.75482 +8.28659 9.30848 +7.30009 8.60755 +-1.12073 1.21016 +0.310087 0.725712 +8.3746 9.13511 +9.11925 10.2234 +9.68703 9.7137 +0.603098 0.844291 +5.88373 6.99327 +0.852802 1.43297 +3.7463 5.82283 +7.69639 8.25446 +-0.337322 0.977113 +8.76606 9.16618 +3.43527 3.6616 +3.93587 5.39471 +5.66569 7.20462 +5.34999 5.7193 +3.25589 3.706 +1.52012 2.55985 +4.74228 5.43725 +5.15323 5.51652 +7.77237 8.33717 +-0.0514419 0.914127 +9.27182 9.59476 +8.14192 9.74859 +6.42702 7.20331 +7.51351 7.68358 +7.0947 7.46059 +7.97635 8.59449 +2.39931 2.66008 +5.79481 5.94673 +4.41054 4.81613 +2.72202 3.61239 +2.86039 3.44719 +1.81115 3.28151 +-0.566995 0.734214 +9.61998 9.72024 +7.4163 7.61821 +0.42522 0.552659 +3.17617 4.36942 +0.740294 1.36953 +7.13755 8.39966 +0.219186 0.892588 +3.78307 5.2905 +0.783026 1.76155 +3.01893 3.33055 +3.12143 3.5713 +-0.792679 0.92539 +0.668572 1.12961 +3.88619 4.30545 +7.59276 8.1776 +4.71509 5.05622 +6.53406 7.04242 +1.581 2.21984 +4.7144 5.51372 +2.76338 3.50211 +0.16364 0.293599 +5.92365 6.10636 +3.11174 4.29165 +5.49295 6.48717 +-0.503239 0.795707 +7.30558 8.12408 +2.10674 4.13456 +7.11985 8.01932 +1.34672 1.48739 +4.05778 5.69084 +2.83686 2.9115 +6.4471 6.53909 +0.467374 1.84371 +2.76467 2.94177 +4.87867 5.33932 +0.892878 1.96273 +1.13934 2.27205 +7.76918 8.39409 +6.72181 7.43901 +7.0836 8.68472 +7.12924 7.56332 +0.689172 1.62922 +9.41146 9.91043 +0.398265 1.27579 +6.29966 7.4874 +5.09438 5.65334 +6.04623 6.4687 +5.75305 6.89731 +0.308118 0.459501 +3.63692 4.30501 +3.1755 3.71009 +7.32787 7.52785 +2.23235 4.09978 +2.71191 2.91513 +0.209457 0.840713 +7.31489 7.38296 +6.21245 6.91111 +5.75983 5.96049 +5.92056 8.24518 +-0.354452 0.489638 +4.05894 5.34828 +1.56299 1.57414 +2.85083 3.27455 +8.78323 10.0012 +0.208502 1.26471 +6.10824 6.79285 +5.55114 8.03968 +6.13077 6.32342 +7.34865 7.82592 +3.94835 4.75016 +7.8268 8.72249 +4.85131 5.07903 +5.40398 6.0134 +2.85971 3.85293 +0.126379 1.45545 +3.15768 4.28388 +9.64566 9.70016 +4.47514 6.31064 +6.44995 7.2894 +4.70992 6.13777 +3.91128 4.22263 +7.35627 8.07739 +2.49215 2.68749 +8.09946 9.16929 +0.925679 1.92784 +8.48437 8.63892 +7.2255 9.18109 +-0.00840282 0.0168954 +5.91933 6.6274 +4.16086 4.64302 +8.27009 8.47868 +1.73372 2.93094 +8.17421 9.17705 +9.19136 9.43222 +0.0653594 0.648416 +8.69 8.96184 +8.99355 9.40832 +6.25088 6.26945 +6.72391 7.38424 +9.59708 10.3496 +6.00971 6.18818 +4.64468 5.75797 +3.64832 5.30079 +5.99378 7.8792 +6.5388 6.99379 +7.31694 8.43802 +3.66227 4.92638 +9.55964 10.3796 +-0.14433 0.29095 +3.56716 3.71252 +3.82062 4.27788 +8.10405 9.35275 +7.17891 7.46539 +1.17698 1.29602 +4.48829 5.03134 +7.18025 8.13852 +9.42388 10.3634 +5.2158 6.17469 +5.22926 6.52397 +5.16731 6.40625 +6.53348 7.269 +2.07834 2.39172 +9.65044 10.1519 +8.64551 10.1294 +9.29006 10.5993 +1.50639 2.83173 +5.71675 5.99216 +3.0783 3.35571 +0.115401 1.31431 +8.03988 8.11942 +3.11917 4.53956 +1.14552 1.1646 +5.34782 6.43017 +0.0701702 1.0368 +0.183335 0.440704 +6.33438 7.71607 +2.11533 2.64323 +7.12104 7.13366 +7.21548 8.26968 +3.13445 4.13568 +4.57452 4.74602 +2.60889 3.69846 +7.21184 7.47573 +6.87651 7.03405 +2.65431 3.94352 +1.50006 1.70087 +6.16344 7.54429 +7.02057 7.73067 +8.27833 9.01489 +0.500833 0.597845 +8.34751 9.88925 +2.80242 2.91837 +5.29424 6.079 +8.36276 9.10074 +0.216887 0.268335 +1.30798 3.16393 +3.93851 4.22658 +2.58028 3.14744 +9.31131 10.3451 +7.37262 8.84852 +4.45306 5.6723 +3.74535 4.0721 +4.90174 5.63875 +3.41847 4.65199 +3.10265 3.82548 +6.56126 6.97557 +2.57449 2.95098 +7.97418 9.06301 +9.2203 9.66829 +4.64922 4.96305 +8.83034 10.115 +6.6685 6.89847 +7.36585 7.48669 +8.66761 9.39287 +0.562216 0.961875 +7.56292 7.81006 +8.50715 8.95572 +0.572825 2.24755 +5.9367 6.06766 +-0.769578 0.776163 +4.48224 4.9553 +8.21069 9.29643 +8.57206 9.47175 +1.10032 1.21371 +3.76306 3.87152 +6.46197 8.18457 +6.96501 9.70727 +3.42357 3.93484 +0.818601 2.42743 +-0.119739 0.397938 +-0.378761 0.523892 +8.03394 9.35409 +3.60283 3.98864 +2.21789 2.70607 +-0.255329 0.319063 +6.20806 6.22609 +7.1283 8.04391 +3.73565 4.03638 +8.5374 9.10987 +5.22675 5.35072 +7.51777 7.58439 +9.12636 10.4159 +9.15003 9.40672 +0.217863 1.19883 +9.42416 9.9178 +2.55337 3.8088 +7.03655 7.98242 +9.17171 9.8047 +0.110162 0.722738 +3.16467 3.58897 +6.47244 7.12961 +1.0456 1.65614 +1.58456 1.62844 +1.79039 1.84035 +6.24286 7.07838 +9.08631 9.11684 +3.05068 3.40838 +2.81212 4.03665 +2.52011 3.09841 +8.06001 8.16356 +7.07649 7.52685 +2.47666 2.86548 +8.66241 8.95103 +-0.298116 0.662697 +0.822443 2.46125 +2.07619 2.33674 +4.84135 6.21034 +7.49625 8.13026 +7.85854 8.29618 +3.01722 3.37062 +6.54393 7.30306 +2.21113 2.30166 +8.32138 8.57349 +6.2995 6.33514 +3.0018 3.56886 +4.63378 5.52214 +6.71908 8.96715 +2.29809 2.95581 +8.34947 8.71096 +4.96902 5.32075 +9.51051 9.72733 +3.311 4.77789 +3.50233 3.66309 +4.95177 5.76002 +6.12876 7.22391 +6.27743 6.79393 +3.60638 3.6833 +5.20305 5.50848 +7.16065 8.88358 +9.45049 10.2539 +6.16892 7.0314 +8.08479 9.74516 +0.0717867 0.669987 +2.17569 3.34098 +4.81716 5.7509 +7.63999 8.01157 +5.87228 6.60363 +3.39621 4.35575 +4.96079 5.07901 +7.57639 8.82003 +8.27285 8.52609 +0.665858 1.64782 +1.74256 2.07126 +6.19512 6.4258 +0.664592 1.30896 +0.180682 1.43746 +6.46752 6.81303 +2.55562 3.08708 +9.33695 9.63312 +6.33821 6.77092 +7.88252 8.55026 +8.17937 8.45385 +-0.415294 0.793096 +5.22077 5.54553 +8.67808 9.10041 +1.72096 1.92024 +0.492778 1.48076 +2.29514 2.88531 +0.0934389 1.37614 +8.40297 9.11121 +3.66605 3.91717 +-0.274468 0.867811 +9.41428 9.56659 +1.22657 2.12792 +8.71336 9.85384 +5.09347 5.42905 +2.02877 2.36652 +5.99112 7.40703 +0.911618 3.48138 +4.84352 5.11131 +1.16309 2.08613 +5.58561 5.84805 +0.663543 1.08921 +1.83189 3.93269 +4.07731 4.38879 +4.04789 4.9989 +2.09457 3.61279 +2.00982 2.94396 +7.37537 7.66574 +5.08648 5.80122 +9.19959 10.2263 +4.26136 4.86194 +6.67875 7.61134 +1.27462 2.48399 +7.2237 7.82324 +-0.0141009 0.0441377 +8.32069 8.36192 +2.82562 3.0717 +-0.528918 1.25301 +1.90486 3.04714 +1.34489 1.75301 +3.14332 4.03322 +8.55351 10.8681 +9.09824 10.3828 +0.496868 0.622499 +7.11112 7.62765 +0.335233 0.528962 +6.71335 7.13937 +6.78574 7.71172 +9.13568 9.22251 +7.10299 7.64765 +3.64747 4.06685 +8.64041 9.40111 +2.43515 2.93081 +2.95476 3.68588 +0.0863751 0.777976 +6.5891 8.18165 +8.80986 10.0735 +0.568868 1.63785 +4.41677 5.42049 +8.72857 9.88426 +3.67467 4.25442 +8.98168 10.1087 +5.08611 5.50098 +1.28982 2.34422 +-0.914176 0.969847 +4.35042 4.42735 +4.02282 5.08164 +9.00566 9.4791 +2.71821 3.24065 +3.20252 3.24988 +8.61559 9.6733 +3.15157 4.7685 +3.59348 4.67872 +0.286864 0.36279 +8.40374 10.528 +7.53647 8.13523 +6.81591 6.90226 +7.68111 9.10704 +8.37958 8.73818 +3.25808 4.40893 +1.50348 3.00641 +0.20803 1.40949 +3.93771 4.84177 +2.79232 3.35329 +4.2666 4.63588 +0.341784 1.46241 +1.53063 2.06724 +8.58212 8.86194 +8.95411 9.70651 +8.71591 9.26292 +6.66088 6.7009 +3.95881 5.93917 +8.5823 8.76007 +-0.308958 0.34174 +1.03188 1.37677 +7.52675 9.84031 +4.27952 4.32984 +1.83465 2.27607 +8.12096 8.64922 +2.22605 4.40067 +0.00929139 0.871342 +0.376531 1.29354 +3.5257 4.30165 +1.95846 4.09589 +-0.200922 0.799272 +0.24432 1.76673 +4.73477 5.06514 +8.97059 9.2276 +2.89618 2.93969 +0.168256 1.03325 +3.44522 3.83622 +2.74889 2.76042 +6.07155 6.7979 +9.06484 9.09804 +7.56658 9.29215 +4.3084 5.45621 +-0.0786996 1.12809 +8.48249 9.74107 +6.4196 6.61469 +1.57119 1.87612 +3.15463 3.86251 +2.0089 2.57741 +6.53618 7.12035 +7.07901 7.29396 +0.114756 0.887413 +8.90806 9.65731 +4.0921 5.23407 +2.63441 2.92344 +4.31769 4.98832 +8.90336 9.26837 +8.25313 8.91204 +2.87758 4.00212 +-0.708243 0.789072 +3.28656 4.55872 +5.73177 5.80293 +5.40596 5.5844 +4.09318 4.57774 +6.16178 7.00613 +8.5514 10.5495 +6.83987 7.3056 +1.06341 1.97923 +7.82153 9.00722 +0.923069 1.42337 +1.83408 2.82331 +5.75305 7.23576 +0.241909 0.96721 +1.16645 2.10491 +5.41819 6.09839 +7.49242 7.69495 +0.347233 0.383681 +2.33245 2.53467 +4.91249 5.27759 +8.11182 9.2758 +0.0955456 0.548659 +-0.359909 0.48055 +1.64759 3.47097 +6.37855 7.40015 +0.423283 2.08857 +4.10068 4.46856 +2.58389 2.69626 +0.848483 2.72258 +8.67321 8.88903 +2.07607 3.42398 +3.11033 3.80741 +2.24735 3.48626 +8.11883 8.7687 +0.29959 1.41603 +4.84924 5.13641 +1.44102 1.74592 +1.13437 2.50296 +1.75876 3.09859 +4.75363 5.90838 +7.36423 8.20074 +5.51578 6.42652 +0.915633 1.86015 +9.44679 10.3479 +2.61691 3.60215 +6.26524 7.2538 +2.74326 3.12649 +5.83934 6.98592 +9.1111 10.4891 +2.27066 2.82709 +8.19359 8.67233 +0.834236 1.7066 +6.19288 7.21392 +-0.249843 0.891821 +2.5652 3.25132 +5.25356 5.88905 +3.99545 4.18918 +1.93186 2.51527 +4.44621 4.82421 +5.89181 7.36963 +2.77321 3.60627 +2.76444 3.88016 +2.50062 2.66105 +1.14846 1.66146 +2.951 4.81656 +3.81976 4.01061 +4.75674 5.59916 +6.74092 7.08289 +2.09989 2.32514 +0.220723 0.865303 +5.48107 5.71875 +1.48372 2.88941 +0.484577 1.12051 +8.93618 9.7185 +1.89769 3.65655 +2.0129 3.55214 +9.23173 10.3694 +0.286189 1.22753 +0.453785 1.55541 +2.24068 2.6541 +8.80917 10.4969 +7.12801 7.15222 +9.25745 9.9103 +5.73429 6.76901 +7.54454 8.47157 +1.96008 3.74997 +8.00837 9.25665 +1.66384 2.07613 +5.53014 5.97461 +-1.32495 1.33319 +4.58479 5.2263 +7.92048 8.75668 +6.87595 7.02522 +0.157713 0.389585 +7.48277 7.51261 +8.10714 8.38399 +0.0802723 0.587088 +1.13024 1.71135 +5.71769 6.84757 +3.08261 4.31054 +2.95952 5.09762 +6.62815 7.44256 +5.0805 5.8499 +3.38489 3.73265 +1.10644 2.18331 +4.70493 7.31686 +2.2253 2.6338 +0.778359 1.6265 +6.94211 7.2149 +4.20976 4.99342 +7.47792 7.67881 +7.06219 8.76137 +4.97677 6.12206 +6.30829 6.69361 +6.19977 6.76781 +9.67636 10.2172 +3.41958 3.69137 +0.374486 0.943711 +4.00837 4.80107 +8.85401 10.1325 +6.0938 7.8919 +1.51055 3.08998 +8.94594 10.3139 +1.06714 2.65511 +0.703202 0.850595 +4.87735 6.00659 +8.3067 8.39924 +7.78071 8.3155 +1.98737 2.81116 +6.86323 8.07974 +1.03479 1.34584 +0.490512 0.670211 +5.82122 6.1901 +5.50836 6.63385 +7.9192 8.9606 +0.913719 2.18983 +4.97151 5.70909 +4.19907 4.37712 +2.01188 2.63318 +7.84813 9.3771 +5.32667 7.48502 +8.50951 10.1006 +-0.551637 0.930509 +1.06511 2.23353 +1.91111 3.42663 +9.37528 9.55327 +7.27975 7.38741 +3.46676 4.83165 +7.36137 8.70333 +-0.295762 0.623228 +8.48558 8.81076 +2.71689 3.41873 +6.49265 8.11042 +5.25516 5.57336 +6.10462 7.05991 +8.76997 9.15164 +7.86196 8.30651 +7.82765 9.24604 +5.98573 6.34182 +6.45367 7.47857 +3.27018 5.10835 +1.3079 2.37423 +-0.261387 0.338113 +7.60683 8.81791 +4.7346 7.41988 +5.25597 5.28517 +3.76704 4.52226 +3.91774 6.66976 +5.69618 8.92667 +1.86148 3.07531 +5.57404 6.51438 +9.39049 9.77921 +2.38692 4.21416 +6.84909 7.23633 +7.2379 7.58761 +4.73485 6.11606 +7.80013 8.08105 +1.72701 3.40244 +2.44475 4.4072 +9.72565 9.77726 +3.35288 4.06493 +8.91215 9.92325 +8.67991 9.65865 +0.253195 0.764339 +4.23564 5.59497 +1.84752 2.14986 +-0.502957 0.528737 +1.32656 2.11347 +9.81563 10.0213 +7.60114 8.05035 +8.51797 8.83342 +-0.394604 1.41267 +7.71614 8.63514 +0.530249 0.968898 +2.90463 3.01675 +7.58098 8.71658 +-0.253747 1.28827 +1.832 2.39006 +7.2268 7.27225 +3.84076 4.66703 +2.2564 2.73185 +7.31508 8.46008 +4.99387 5.64948 +7.21239 7.79983 +7.60231 7.8473 +0.555482 1.41892 +1.25539 1.73665 +8.41561 8.96404 +5.06771 5.17664 +0.0655744 2.10718 +8.00222 8.65909 +7.48841 7.83609 +6.30909 6.89448 +9.1697 9.55942 +1.36259 2.22582 +-0.923854 0.994771 +3.43724 4.64053 +8.09411 8.19574 +4.84869 5.52805 +2.69802 3.4119 +9.0613 9.29405 +0.565216 0.687165 +5.93495 6.57426 +1.86925 2.75493 +1.41068 2.00824 +1.60612 1.62471 +3.11499 5.89909 +2.69806 3.90538 +3.76301 4.22135 +3.30065 4.70725 +5.56461 7.02137 +8.35335 8.99287 +4.79259 4.88508 +6.7911 7.52912 +8.14843 8.28583 +3.67629 5.06406 +5.71462 7.04747 +9.06721 9.99733 +4.87932 6.8586 +8.00814 9.57664 +7.03069 7.51623 +9.0989 9.57644 +2.70873 3.91296 +1.64425 1.7007 +6.53716 6.99033 +8.29874 8.74509 +1.88941 2.57626 +4.65337 5.23247 +9.04723 9.06665 +3.52258 3.61496 +1.1207 1.80143 +0.680601 1.98384 +2.94593 5.38692 +2.65685 2.67932 +9.00469 10.2054 +6.44318 7.2657 +4.66656 5.33893 +3.41719 4.72453 +3.12403 4.21748 +6.67973 6.81775 +3.54347 4.14978 +3.02554 3.50812 +3.91883 3.93657 +7.31721 7.89895 +1.86275 2.85473 +6.23266 6.4449 +7.59855 9.38013 +9.07084 9.49309 +0.557656 2.6851 +6.899 7.37693 +4.23162 5.84314 +8.54108 9.37672 +3.9513 4.79746 +7.299 8.29678 +5.58879 5.88551 +9.14992 9.22385 +9.1914 9.31788 +4.95663 5.56316 +2.16516 2.39538 +0.722262 1.89664 +7.76447 7.80026 +2.77772 3.39136 +9.59513 9.78635 +1.02728 1.2181 +7.32631 7.56611 +7.37389 7.46163 +6.87949 8.18689 +8.95602 9.81169 +5.85364 6.63434 +0.129136 2.13484 +7.09608 7.71167 +7.1487 8.34258 +7.48738 8.3172 +8.77247 9.95985 +7.6706 9.56828 +8.14268 8.61726 +6.5455 7.90871 +4.57866 4.78453 +3.63937 4.42349 +5.18905 5.36516 +4.68884 5.62995 +5.88338 7.83824 +-0.002979 0.145818 +4.42981 4.77141 +0.558593 1.07999 +6.91713 7.36159 +5.13948 6.20805 +3.34368 4.07112 +7.27365 7.8383 +9.6898 9.9514 +6.14332 6.75102 +2.16534 2.78843 +2.8007 4.37952 +7.67047 7.72955 +8.77377 9.85092 +1.26087 1.55193 +6.29788 6.58511 +7.68178 9.05777 +0.383336 1.21247 +2.55185 4.30874 +8.91971 9.21836 +3.67638 4.68596 +8.13843 9.13684 +-0.424353 1.97502 +2.71499 2.93977 +0.104447 0.387901 +4.09592 4.67009 +0.808593 0.920798 +5.01258 6.30662 +4.97668 6.57412 +8.44135 9.03816 +2.78932 3.72809 +6.71337 7.15128 +4.27234 4.50127 +6.78266 9.70351 +6.48026 7.51491 +7.36296 8.42283 +4.80339 7.3704 +6.24735 7.3132 +0.134626 0.364187 +2.73854 4.09422 +0.809997 1.19657 +6.41154 6.50244 +7.16847 8.56485 +1.53582 3.33985 +1.92874 2.86427 +6.95941 7.01378 +5.8592 6.54917 +2.51802 2.75622 +3.3894 3.6957 +2.2547 2.64693 +8.62054 9.1951 +8.86378 10.0003 +1.87892 2.28732 +3.83146 4.21484 +1.53262 1.99692 +7.86048 7.93125 +1.79437 2.68269 +3.92781 4.24119 +5.43044 5.47935 +0.322904 0.618854 +3.42383 5.18531 +4.00989 5.83612 +7.06304 8.76582 +5.88039 6.77654 +8.638 8.9479 +1.73391 2.09002 +1.04861 2.84779 +-0.313019 0.557659 +3.35245 4.1308 +9.05373 9.57205 +5.85684 6.49193 +6.00719 6.86421 +4.25244 4.65772 +5.15865 5.61529 +8.78498 9.77544 +8.33803 9.26452 +3.42915 4.92279 +8.29884 8.94035 +5.10232 5.35924 +4.33571 4.86695 +7.86184 7.90029 +7.34345 7.36214 +0.201624 0.800371 +9.05882 10.5503 +4.32188 5.03154 +-0.0456982 1.22298 +2.90921 3.60013 +1.69306 2.36564 +7.79029 9.15059 +4.65205 5.06538 +6.34552 8.32176 +7.92695 9.32585 +7.17903 8.09903 +9.53561 9.60287 +0.365723 1.23929 +0.542889 0.849053 +8.15061 8.93512 +6.40042 6.41053 +5.82666 6.5488 +1.00893 1.83717 +1.76021 2.11893 +7.61076 8.6242 +2.32513 3.4856 +4.39023 6.01094 +-0.11754 0.421848 +6.76371 6.94513 +4.67607 5.58732 +-0.201992 0.765553 +7.42926 7.44429 +2.57485 2.85339 +2.74138 4.13421 +8.21645 9.18107 +6.28184 6.4996 +7.129 7.74678 +7.76842 8.74924 +3.5359 4.35892 +3.04103 3.24376 +2.29389 2.92164 +6.96306 7.64415 +8.82053 9.04584 +1.19911 2.06167 +5.91357 7.6773 +0.150241 1.23291 +4.48681 5.41762 +6.89156 8.13443 +5.37828 5.79944 +2.13694 2.91102 +1.35932 2.08272 +6.14309 6.23278 +4.03202 5.88521 +7.23417 7.43704 +1.2501 2.60793 +2.12334 3.65727 +7.05722 8.77078 +0.437873 0.585933 +6.33338 9.16643 +2.44724 4.40234 +2.92012 3.64047 +1.2039 3.25195 +8.6611 10.0398 +8.0088 9.13622 +5.96562 7.08515 +5.45181 6.65246 +0.742546 2.38958 +4.12919 4.93571 +0.428823 0.84483 +1.45226 2.5869 +9.50727 10.0211 +7.69194 8.66273 +1.25706 2.44554 +5.23247 5.47762 +0.499178 1.70722 +7.26569 8.72467 +3.59815 5.50022 +1.03601 2.43445 +0.092414 0.927635 +3.7917 3.995 +6.21977 8.40398 +3.1513 3.81188 +9.80482 10.0951 +8.65564 9.33687 +2.06164 3.49152 +2.09754 2.34929 +0.66126 2.31888 +5.34832 6.82603 +7.91038 8.59105 +0.695523 0.800961 +2.33406 2.71629 +8.37774 10.9253 +9.7682 10.106 +9.44382 9.5743 +8.78009 9.47645 +1.87309 3.04127 +1.86724 2.13913 +3.30049 3.52416 +7.18508 7.6648 +1.3736 2.12153 +2.41879 5.06716 +1.87815 2.29743 +1.76646 2.06335 +9.73034 9.95475 +0.497489 0.686102 +6.96908 7.17338 +9.23111 10.0148 +3.30981 4.21787 +9.53311 10.3734 +-0.067709 0.147251 +8.44557 8.82047 +7.10407 7.47639 +0.834352 1.36908 +9.1598 10.6508 +4.22018 4.38279 +3.8295 3.95462 +3.97302 4.97247 +1.55856 2.31013 +0.0217962 0.486978 +1.69845 2.65786 +-0.489562 0.582187 +5.10621 5.6055 +9.8478 9.85919 +6.15389 6.92324 +7.11469 8.0418 +3.20625 3.78209 +5.93389 7.66892 +1.15134 1.18023 +6.84797 7.4239 +2.9483 3.22279 +-0.43205 0.764755 +7.17846 7.33313 +5.4729 8.26894 +6.19512 7.32132 +0.591934 0.767568 +0.49266 1.80691 +9.08272 9.72242 +5.85683 6.36905 +5.27625 7.13913 +3.60853 3.98155 +0.642811 1.10253 +1.27117 1.5329 +8.76096 9.61776 +4.9498 5.12847 +7.53282 7.80438 +1.40487 1.65657 +3.45329 3.84307 +3.25698 3.49614 +2.38651 2.89802 +8.23114 8.99016 +9.58516 10.4145 +5.5185 6.27733 +0.583068 0.892249 +1.93142 2.35084 +7.94845 9.22667 +2.47963 3.9005 +3.46106 3.86301 +7.77744 8.43735 +1.41072 1.73969 +9.12904 10.4307 +3.52227 3.66861 +5.4743 5.86487 +-0.51727 1.63657 +5.09861 7.03162 +5.14763 5.93411 +3.23526 3.47376 +0.9702 1.74063 +9.28366 10.3322 +1.80257 1.92265 +8.63597 9.08467 +4.16006 4.97753 +6.37418 6.39374 +5.82376 6.62429 +7.74751 8.68962 +1.63821 2.53399 +4.9864 6.40969 +0.680772 0.995608 +3.74344 3.83319 +0.898055 1.8593 +2.36839 2.39307 +7.21046 7.51006 +0.60893 2.91523 +3.15017 4.30412 +5.02219 6.28886 +4.60541 4.73379 +8.41196 8.58978 +8.84706 10.8198 +6.95807 7.54952 +5.54729 6.9315 +4.62574 4.73423 +3.35252 3.59865 +1.02207 1.71791 +3.16408 3.73993 +0.639222 1.69519 +7.57978 8.05813 +2.41371 2.77174 +8.65544 10.093 +6.31988 6.70758 +6.5301 8.39328 +0.578825 1.20331 +1.1243 2.07824 +5.86555 6.72397 +6.37103 6.81736 +1.12086 3.46541 +2.59503 3.44073 +5.27128 5.3616 +2.87331 3.4352 +5.48408 6.67916 +3.36016 4.09125 +0.813671 0.9811 +0.812162 3.22209 +6.85104 6.86306 +0.671311 0.979685 +2.75962 2.82659 +2.42186 2.49827 +7.82974 9.59669 +3.48851 3.60085 +8.47775 10.9574 +8.6863 10.6155 +0.196484 1.07469 +1.19293 1.45012 +5.79166 6.18466 +6.51597 6.6793 +9.78341 10.1992 +8.17879 9.59257 +6.96178 8.73165 +4.09161 4.31908 +3.19514 3.4072 +5.5101 6.32978 +0.188435 1.84481 +9.41738 10.0379 +1.46994 1.6294 +4.21915 5.39529 +5.46567 5.86638 +8.19414 9.201 +4.38616 4.55193 +2.31105 2.73345 +6.05897 6.12297 +8.84135 9.74232 +9.44943 10.2225 +3.27501 3.66059 +0.524904 1.74374 +7.7228 8.43799 +5.13274 5.82863 +8.2787 8.94491 +1.61463 2.03499 +7.04346 8.69977 +0.938308 2.38676 +0.00208037 0.0186158 +1.98744 2.05864 +7.05787 8.16211 +1.68383 2.04684 +2.24812 2.28257 +0.685061 1.2947 +2.25379 2.92827 +6.0052 6.24797 +7.06213 7.86344 +0.751849 2.96376 +0.0977921 0.513746 +8.43792 9.10545 +2.80769 3.09276 +9.19308 9.59741 +4.74365 4.99708 +8.41385 8.58422 +4.28093 5.9281 +4.26205 4.75417 +1.48035 1.61363 +1.4264 1.80922 +3.48365 4.52935 +1.78396 2.96351 +8.4134 8.96536 +8.65646 9.34781 +1.88027 2.97804 +8.92531 9.02743 +6.91815 7.88895 +5.68023 7.37521 +3.93105 4.6123 +0.385874 1.30785 +1.80151 2.24385 +8.43781 9.33927 +6.69643 8.001 +6.12062 6.673 +4.8316 6.63067 +9.00443 9.08204 +1.5651 2.65023 +3.57517 4.40231 +5.85127 8.02219 +8.02586 10.018 +2.00514 2.75138 +6.32104 7.84285 +8.90914 9.78319 +4.91325 6.27817 +3.87406 4.80327 +8.57887 9.30685 +1.40351 1.71079 +-0.217977 0.224497 +8.37711 9.56393 +5.54644 5.77714 +8.18206 8.36015 +0.774967 1.97899 +9.10434 10.1721 +9.39621 10.1135 +4.80108 4.90605 +9.45978 9.96227 +2.85412 4.05215 +5.71985 7.16735 +2.35081 2.82214 +9.34881 10.5899 +7.13014 7.82872 +4.54931 4.89725 +9.41397 9.9131 +8.90226 9.55276 +8.27995 9.83651 +9.2767 9.6053 +0.388751 1.40317 +5.01478 5.88869 +6.41521 7.21754 +1.22552 1.39067 +3.75771 3.81571 +4.39362 6.04592 +8.82639 8.84544 +4.59289 4.89208 +1.52235 1.64285 +1.85893 4.52056 +1.91781 2.78253 +3.34677 4.54987 +9.26905 10.6019 +7.10958 8.02083 +0.765257 1.66957 +2.17169 2.70214 +4.2293 6.38089 +1.41111 2.45992 +5.76864 6.85715 +2.19944 2.93182 +9.03727 9.6454 +3.82652 4.35225 +2.52642 3.09725 +7.77868 9.35844 +0.337665 1.00787 +1.92021 2.04418 +4.41862 5.95486 +9.47606 9.62386 +1.12113 1.55658 +5.26701 7.09712 +8.81478 9.34863 +6.29447 7.43847 +2.82379 3.57268 +7.9735 8.79936 +3.30176 5.50666 +6.36009 6.8864 +4.13583 5.00627 +0.510514 0.882245 +6.93864 7.78543 +2.04039 2.4298 +3.18337 3.19424 +4.20059 4.67088 +0.316687 0.707377 +0.169106 1.68194 +8.26665 10.2362 +1.1124 1.78306 +2.84603 3.33142 +9.48756 9.96651 +9.4301 9.7316 +0.234674 1.23981 +0.493232 0.522565 +1.342 1.41739 +2.57196 4.08221 +1.54201 2.52284 +5.32049 6.00052 +8.54218 8.59452 +-0.030524 1.64476 +2.31645 2.72528 +4.71898 4.92827 +0.0872997 1.74969 +0.994278 1.76964 +1.34411 2.77952 +0.156817 2.10245 +5.78094 6.34389 +3.09336 3.10563 +8.14245 9.0928 +9.34202 9.75484 +9.78415 10.0211 +4.68383 5.19384 +6.09441 7.90512 +6.74941 6.76118 +1.78693 1.91697 +2.34369 2.62141 +-0.20756 0.829082 +3.57681 5.11448 +2.44234 4.45153 +4.84521 5.31902 +1.80487 3.64498 +2.46125 3.02549 +-0.334514 0.64288 +8.06406 8.49886 +1.74559 2.54474 +6.05883 6.46529 +9.00014 10.2271 +8.00064 8.5061 +0.909467 0.980765 +8.65862 8.69736 +8.11457 8.77049 +3.93237 5.02485 +4.64507 5.34852 +3.92405 4.19449 +5.02381 5.21722 +3.76203 3.78396 +6.74925 7.34781 +8.2556 8.63585 +3.92521 3.99739 +1.44641 2.31509 +0.23516 0.917239 +4.4614 6.35489 +3.33221 3.95247 +1.73289 2.07919 +6.92385 7.55052 +8.74351 9.41125 +9.41451 10.1785 +7.4001 8.81081 +2.97038 3.12524 +7.26043 7.77569 +5.56625 5.59344 +5.70977 6.33362 +7.61443 8.43218 +1.05308 1.82947 +0.377602 1.57633 +6.42483 7.51505 +4.73011 5.43693 +7.72 8.09098 +9.20063 9.82287 +6.88273 7.35327 +6.88423 7.68356 +3.55293 3.6227 +0.947096 1.76021 +3.66411 5.67117 +9.31422 10.1035 +6.84847 6.98956 +2.16221 4.45806 +0.853284 3.15932 +2.48673 2.89793 +3.37633 3.90938 +1.6141 1.66363 +1.6658 3.01723 +0.419408 1.01736 +0.712239 0.791538 +2.25249 3.62425 +8.09772 10.2367 +1.46651 1.48148 +1.73233 2.0489 +7.42679 9.23232 +7.97446 9.53281 +2.74677 4.03955 +-0.169412 0.872795 +4.90663 5.40277 +7.62122 9.49334 +6.55971 7.34259 +3.71957 5.03775 +3.33226 4.06459 +0.634912 1.52603 +3.65506 4.09318 +4.31463 4.60534 +8.58287 9.85385 +0.334759 0.7232 +2.14027 2.866 +6.06611 6.3625 +2.53013 3.18764 +4.30913 4.89247 +6.53234 6.92328 +7.66419 8.61762 +1.37598 2.26754 +8.06279 8.80692 +5.28688 5.70608 +0.509396 1.34606 +8.80589 9.29765 +9.3801 10.3988 +0.402662 0.597735 +5.87213 6.63371 +2.79136 3.763 +6.20615 7.25189 +7.54065 9.62156 +4.12107 5.04454 +5.60294 6.69246 +1.20845 1.49272 +1.75679 2.56397 +2.83939 3.85147 +6.21362 6.71341 +9.01824 9.2388 +4.66617 5.04944 +1.48766 2.55674 +8.89442 9.42175 +5.29411 5.39531 +6.66271 8.68733 +0.730461 1.42466 +6.22927 6.55086 +0.566776 1.17299 +3.06104 4.17775 +5.28026 5.73966 +5.76071 7.61585 +7.83786 9.58106 +6.32199 6.46961 +8.89555 9.17429 +3.85772 4.97805 +6.63352 8.79211 +7.87234 7.94131 +6.53479 7.87979 +3.90293 4.50376 +6.21371 7.31788 +1.00497 1.75003 +6.90351 8.02435 +2.29142 3.9809 +6.26632 6.45283 +-0.0354471 1.31727 +8.80046 9.20169 +7.86905 8.36819 +0.848737 1.82393 +7.98136 9.40712 +3.97765 4.95399 +8.70252 9.26275 +3.13412 4.29389 +2.06446 3.55839 +7.67918 8.44509 +5.96082 6.40336 +1.20461 2.36924 +4.76741 5.74978 +9.41217 9.94305 +7.36736 8.07119 +3.44102 3.56957 +3.59893 4.52751 +4.2613 6.41628 +1.65321 3.02235 +3.70067 3.86657 +0.0176327 1.1215 +4.13592 4.88595 +8.73668 9.0834 +1.80944 2.95584 +6.05721 6.93009 +5.08206 5.38626 +1.86749 1.89392 +3.58284 4.10506 +0.0885586 1.47709 +5.46502 5.93066 +8.45338 8.47878 +3.46789 4.02317 +0.975506 1.15814 +7.12758 7.60073 +7.99582 8.56746 +3.11435 3.83805 +4.51166 4.52472 +8.39096 8.75934 +8.42208 9.66019 +2.48498 4.73703 +3.50301 4.81264 +6.40196 7.0733 +8.52138 8.82265 +1.49822 1.74634 +7.08547 7.93508 +3.47832 4.42948 +6.08646 6.20865 +4.46334 4.65278 +3.80008 4.08214 +3.4853 5.44308 +5.48109 6.18681 +6.59161 8.04307 +7.36554 7.38201 +5.2144 5.31725 +4.62607 7.25804 +1.24345 1.81263 +5.49248 8.16867 +6.4056 8.26316 +7.67828 8.56923 +2.46187 2.56974 +2.22942 3.27248 +7.14933 8.06682 +2.3236 2.95462 +4.18028 4.80535 +4.981 5.54215 +7.23261 7.34863 +4.96309 6.06396 +4.24402 4.44364 +0.917707 1.32687 +1.19806 1.65106 +3.7725 5.31412 +9.70021 9.84203 +5.99824 7.77474 +3.32636 3.84266 +8.59841 9.07653 +7.9916 9.14415 +0.786519 1.84655 +0.166394 1.47834 +2.87633 3.52808 +7.53804 9.56807 +6.14406 6.16189 +1.63428 3.96845 +1.10307 1.58897 +1.30032 2.85313 +7.89803 8.32723 +8.77593 8.90136 +1.68804 2.69447 +4.5956 4.6743 +7.39643 8.29839 +6.93629 7.82243 +6.10289 7.677 +1.83835 2.34295 +1.04506 1.91684 +8.95277 9.43817 +0.36153 0.643665 +1.02408 3.18963 +4.02972 4.40301 +2.80428 2.82552 +6.51718 6.64956 +0.185341 1.56607 +6.1658 7.59364 +4.09288 4.11687 +6.90205 7.16338 +5.0755 5.39478 +4.5614 4.83286 +5.8489 8.76295 +9.70079 10.0431 +8.44334 8.54714 +3.00139 3.66327 +5.34458 6.38895 +7.11481 7.96865 +4.66776 5.15678 +0.390138 0.53352 +2.01116 3.32839 +6.78761 6.97068 +4.57477 5.0724 +1.14098 1.36134 +7.4559 8.30327 +0.700932 2.40437 +1.90469 1.99046 +4.30064 5.11485 +7.84433 8.48543 +5.96212 7.49882 +3.93055 3.96317 +0.546327 1.04814 +8.96011 9.0404 +7.89255 8.06149 +0.669924 2.6944 +-0.00972314 0.837474 +6.07199 6.37467 +2.73659 3.19833 +5.9576 7.10966 +9.1316 9.14737 +5.26101 6.59184 +5.77697 8.08876 +0.68623 0.782805 +0.842619 1.39893 +5.82075 6.15957 +4.36394 4.88479 +7.1828 7.90107 +3.3331 4.39923 +6.54243 7.24966 +2.809 2.96491 +4.18514 4.61948 +4.95453 5.33929 +8.33288 9.52867 +9.05785 10.4276 +2.58917 4.74403 +1.34279 1.89014 +4.93626 5.75424 +7.75031 7.92788 +9.00904 9.02402 +3.91286 5.15124 +6.98486 7.34688 +-0.173169 0.415019 +0.652242 1.51556 +3.50184 5.30486 +3.72563 4.09022 +4.60463 6.58985 +3.34219 4.31833 +2.55445 2.58651 +6.14573 6.3669 +4.52336 6.37342 +9.37606 9.76836 +2.4198 3.36929 +2.89109 3.66974 +5.62463 6.05989 +0.674219 1.84165 +0.590017 1.71153 +1.54622 2.10277 +6.48003 6.55663 +3.56355 3.98573 +0.743671 1.87049 +3.27833 6.0722 +4.76267 6.9967 +2.80188 4.03037 +0.372694 0.482111 +5.73987 5.9529 +8.84732 9.49033 +0.833944 1.8157 +4.06126 4.36615 +0.884619 2.34622 +6.86723 6.99141 +8.07737 9.05193 +8.35903 9.00761 +8.84777 9.74001 +8.58058 9.05479 +8.28076 8.44566 +4.55155 5.65475 +2.44314 3.38966 +3.22172 4.50395 +7.1808 7.90376 +0.639636 1.72606 +5.46807 5.94322 +9.02146 9.87864 +-0.628472 0.655557 +4.29775 5.9553 +6.77525 7.38152 +6.51827 6.93542 +8.95252 9.52939 +0.755406 1.19973 +7.69455 7.86912 +0.170143 1.12949 +7.69254 8.08221 +2.08238 3.27051 +1.28662 1.78628 +1.21208 2.79391 +-0.155739 1.7071 +8.28833 9.10011 +5.77789 6.6954 +1.98395 2.35216 +5.77469 6.05177 +2.77565 5.81092 +-1.53416 2.30576 +6.93529 8.04506 +3.91553 4.55593 +5.57201 6.29071 +1.54149 1.86613 +4.09163 4.31234 +8.47834 11.1229 +5.70376 7.02981 +2.24683 3.79925 +5.4793 6.41036 +5.27644 6.81729 +0.13273 0.371437 +1.22959 1.41618 +0.551957 1.03276 +2.01269 2.4018 +8.77113 9.09395 +8.11753 8.46262 +0.39406 0.783705 +5.35964 5.48227 +7.24727 8.23233 +7.74525 8.85748 +0.0115736 0.882607 +1.78575 2.19684 +8.32514 9.0503 +3.11074 3.34975 +0.847464 2.13237 +0.310898 0.393528 +8.68841 10.518 +1.10032 1.83755 +2.42286 3.02554 +1.16364 2.80986 +1.46419 2.11421 +7.46021 7.90273 +6.86556 7.62542 +1.91466 3.79843 +3.1056 3.83969 +3.41591 4.26565 +0.285122 1.21372 +3.75441 5.52385 +1.07643 2.63403 +6.17341 7.67244 +9.13122 9.5132 +4.39696 6.15885 +3.7207 4.07729 +6.80782 7.1958 +6.65933 6.67105 +8.51535 8.7263 +5.98305 7.17759 +2.19609 2.46108 +8.21186 8.96908 +2.94729 3.60562 +3.31907 3.9297 +0.463492 0.626603 +2.62143 3.55089 +5.76898 6.79002 +1.45502 1.56525 +4.80797 5.62389 +5.87337 6.70588 +2.92765 3.50929 +0.412987 0.951057 +3.64594 4.40269 +-0.043401 0.502176 +4.54802 5.44613 +1.20218 1.8732 +2.75547 2.96745 +7.10348 7.7945 +9.74845 9.98835 +4.83718 6.4836 +2.30563 2.5903 +4.74016 6.30789 +6.42192 6.93329 +5.37294 6.73938 +2.4365 3.05787 +1.08283 3.79193 +4.90426 5.93563 +3.8874 4.83301 +0.13909 0.983027 +4.07407 5.61421 +8.62875 10.6851 +8.10233 8.29952 +2.23047 2.4691 +7.34617 7.39475 +1.66309 2.3032 +7.11207 10.0686 +4.52412 6.38666 +2.48323 2.96878 +7.47877 8.86547 +2.67607 4.33436 +6.83659 8.21075 +2.87313 3.39011 +2.81911 4.07729 +0.227877 0.657898 +6.57843 7.14311 +-0.591405 1.56925 +7.08018 7.59 +9.09558 9.3923 +9.48544 9.79474 +0.740233 2.33129 +8.51111 11.134 +7.79219 8.0281 +1.73821 1.89316 +9.21077 9.29488 +5.38354 6.46025 +4.30403 4.5472 +0.0893758 0.919238 +7.94464 8.51053 +5.27119 6.3741 +5.22476 6.00588 diff --git a/wasserstein/tests/data/test_5_A b/wasserstein/tests/data/test_5_A new file mode 100644 index 0000000..51cff1c --- /dev/null +++ b/wasserstein/tests/data/test_5_A @@ -0,0 +1,5 @@ +7.50638 7.78005 +0.991758 2.12178 +5.18481 6.61702 +6.14703 7.08581 +4.09936 4.83024 diff --git a/wasserstein/tests/data/test_5_A.pd.dipha b/wasserstein/tests/data/test_5_A.pd.dipha new file mode 100644 index 0000000..be84441 Binary files /dev/null and b/wasserstein/tests/data/test_5_A.pd.dipha differ diff --git a/wasserstein/tests/data/test_5_B b/wasserstein/tests/data/test_5_B new file mode 100644 index 0000000..be62ed3 --- /dev/null +++ b/wasserstein/tests/data/test_5_B @@ -0,0 +1,5 @@ +5.8232 6.36308 +2.16066 2.48668 +2.38754 4.91418 +4.77403 5.43982 +0.291412 1.11147 diff --git a/wasserstein/tests/data/test_5_B.pd.dipha b/wasserstein/tests/data/test_5_B.pd.dipha new file mode 100644 index 0000000..14ca67c Binary files /dev/null and b/wasserstein/tests/data/test_5_B.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag1_A b/wasserstein/tests/data/test_diag1_A new file mode 100644 index 0000000..f7f90ff --- /dev/null +++ b/wasserstein/tests/data/test_diag1_A @@ -0,0 +1 @@ +1.0 1.0 diff --git a/wasserstein/tests/data/test_diag1_A.pd.dipha b/wasserstein/tests/data/test_diag1_A.pd.dipha new file mode 100644 index 0000000..fa4a4d9 Binary files /dev/null and b/wasserstein/tests/data/test_diag1_A.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag1_B b/wasserstein/tests/data/test_diag1_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/wasserstein/tests/data/test_diag1_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/wasserstein/tests/data/test_diag1_B.pd.dipha b/wasserstein/tests/data/test_diag1_B.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/wasserstein/tests/data/test_diag1_B.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag2_A b/wasserstein/tests/data/test_diag2_A new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/wasserstein/tests/data/test_diag2_A @@ -0,0 +1 @@ +5.0 5.0 diff --git a/wasserstein/tests/data/test_diag2_A.pd.dipha b/wasserstein/tests/data/test_diag2_A.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/wasserstein/tests/data/test_diag2_A.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag2_B b/wasserstein/tests/data/test_diag2_B new file mode 100644 index 0000000..a167a4f --- /dev/null +++ b/wasserstein/tests/data/test_diag2_B @@ -0,0 +1 @@ +5.0 5.0 diff --git a/wasserstein/tests/data/test_diag2_B.pd.dipha b/wasserstein/tests/data/test_diag2_B.pd.dipha new file mode 100644 index 0000000..621a55f Binary files /dev/null and b/wasserstein/tests/data/test_diag2_B.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag3_A b/wasserstein/tests/data/test_diag3_A new file mode 100644 index 0000000..151d4b1 --- /dev/null +++ b/wasserstein/tests/data/test_diag3_A @@ -0,0 +1,220 @@ +1.391781911475341 1.391781911475341 +1.395142124726278 1.395142124726278 +1.514181227875788 1.514181227875788 +1.528291566797427 1.528291566797427 +1.585389310674157 1.585389310674157 +1.629232116709072 1.629232116709072 +1.641428662445941 1.641428662445941 +1.646998748860116 1.646998748860116 +1.652915988616469 1.652915988616469 +1.69199679556404 1.69199679556404 +1.705727462482595 1.705727462482595 +1.706819293048617 1.706819293048617 +1.720175733750729 1.720175733750729 +1.728031840308488 1.728031840308488 +1.73797421040929 1.73797421040929 +1.739519744204842 1.739519744204842 +1.76132425248022 1.76132425248022 +1.767766952966369 1.767766952966369 +1.792444271021371 1.792444271021371 +1.831487552809192 1.831487552809192 +1.837086616049901 1.837086616049901 +1.851186504948943 1.851186504948943 +1.860502132730509 1.860502132730509 +1.8619433117852 1.8619433117852 +1.878229072834972 1.878229072834972 +1.880655074837347 1.880655074837347 +1.883647832802556 1.883647832802556 +1.884127769927503 1.884127769927503 +1.892969784466709 1.892969784466709 +1.916936460787894 1.916936460787894 +1.931545068229315 1.931545068229315 +1.937626522143119 1.937626522143119 +1.942267721488891 1.942267721488891 +1.963295334827521 1.963295334827521 +1.975655395743736 1.975655395743736 +1.981448090925679 1.981448090925679 +1.986220565173897 1.986220565173897 +1.98709020812351 1.98709020812351 +1.989420269013254 1.989420269013254 +2.007874648480185 2.007874648480185 +2.012179388983059 2.012179388983059 +2.019051972834053 2.019051972834053 +2.023278848058142 2.023278848058142 +2.026190677562545 2.026190677562545 +2.041594763633561 2.041594763633561 +2.042508934597344 2.042508934597344 +2.04305394648524 2.04305394648524 +2.052514683218775 2.052514683218775 +2.059038785694094 2.059038785694094 +2.062577320792516 2.062577320792516 +2.063488177732052 2.063488177732052 +2.067806664626417 2.067806664626417 +2.073013782498534 2.073013782498534 +2.08646120854976 2.08646120854976 +2.098476357223667 2.098476357223667 +2.101378199886176 2.101378199886176 +2.101927506425904 2.101927506425904 +2.12671744783454 2.12671744783454 +2.143966150630584 2.143966150630584 +2.145312642688415 2.145312642688415 +2.148704396208969 2.148704396208969 +2.153092682531471 2.153092682531471 +2.157553654759374 2.157553654759374 +2.176659075756566 2.176659075756566 +2.177260578806816 2.177260578806816 +2.179141269427014 2.179141269427014 +2.201895416482074 2.201895416482074 +2.202563945779844 2.202563945779844 +2.205113735193028 2.205113735193028 +2.207345865351049 2.207345865351049 +2.208922099676958 2.208922099676958 +2.218057898922937 2.218057898922937 +2.228610453267036 2.228610453267036 +2.241314066596301 2.241314066596301 +2.242145210071643 2.242145210071643 +2.253976266568437 2.253976266568437 +2.255324860119305 2.255324860119305 +2.271300972641221 2.271300972641221 +2.279438361991067 2.279438361991067 +2.286592331830957 2.286592331830957 +2.287159411646074 2.287159411646074 +2.296653147995115 2.296653147995115 +2.301754785182811 2.301754785182811 +2.30409930499031 2.30409930499031 +2.32141477565108 2.32141477565108 +2.347789281926012 2.347789281926012 +2.347827987256373 2.347827987256373 +2.349391321950732 2.349391321950732 +2.350129292983257 2.350129292983257 +2.358679083392328 2.358679083392328 +2.372845273125388 2.372845273125388 +2.385040766846267 2.385040766846267 +2.42114588843816 2.42114588843816 +2.425116524931602 2.425116524931602 +2.426518521893022 2.426518521893022 +2.43211651886311 2.43211651886311 +2.441302771998711 2.441302771998711 +2.446429340510857 2.446429340510857 +2.446547553904861 2.446547553904861 +2.45764765793376 2.45764765793376 +2.461222149682938 2.461222149682938 +2.467900747394114 2.467900747394114 +2.473214152160872 2.473214152160872 +2.5 2.5 +2.503557913626332 2.503557913626332 +2.504315621146863 2.504315621146863 +2.515634290122204 2.515634290122204 +2.516231935083851 2.516231935083851 +2.517558892374071 2.517558892374071 +2.526325773757754 2.526325773757754 +2.531164001388939 2.531164001388939 +2.53128061055404 2.53128061055404 +2.539387277827314 2.539387277827314 +2.540864599180268 2.540864599180268 +2.548084457784768 2.548084457784768 +2.548923292215475 2.548923292215475 +2.551730202825644 2.551730202825644 +2.553178578801818 2.553178578801818 +2.560295747947446 2.560295747947446 +2.566321603108612 2.566321603108612 +2.568932286976676 2.568932286976676 +2.574887688783916 2.574887688783916 +2.581809142325336 2.581809142325336 +2.584541960262555 2.584541960262555 +2.585511915815223 2.585511915815223 +2.592970592044868 2.592970592044868 +2.596055336381078 2.596055336381078 +2.598560573626668 2.598560573626668 +2.614019084614256 2.614019084614256 +2.618463725327216 2.618463725327216 +2.622883674481145 2.622883674481145 +2.627791161528314 2.627791161528314 +2.63535653879261 2.63535653879261 +2.654825898255443 2.654825898255443 +2.660423271276714 2.660423271276714 +2.667148030102869 2.667148030102869 +2.67012591760915 2.67012591760915 +2.698712599567882 2.698712599567882 +2.72180967799905 2.72180967799905 +2.732466204434637 2.732466204434637 +2.734187392905275 2.734187392905275 +2.737296308103857 2.737296308103857 +2.745724923243991 2.745724923243991 +2.749541709159369 2.749541709159369 +2.752925621447035 2.752925621447035 +2.754183973113479 2.754183973113479 +2.763972022430258 2.763972022430258 +2.766941997926879 2.766941997926879 +2.773850925522978 2.773850925522978 +2.777506755238121 2.777506755238121 +2.780333194223143 2.780333194223143 +2.783060349483276 2.783060349483276 +2.78679029681548 2.78679029681548 +2.786792895521339 2.786792895521339 +2.795170825459034 2.795170825459034 +2.801104989227437 2.801104989227437 +2.80525433080833 2.80525433080833 +2.805376738133109 2.805376738133109 +2.806844454092663 2.806844454092663 +2.811611818684648 2.811611818684648 +2.811994908451803 2.811994908451803 +2.816002798930236 2.816002798930236 +2.816814002472584 2.816814002472584 +2.818569391261086 2.818569391261086 +2.821660827076439 2.821660827076439 +2.822317588351085 2.822317588351085 +2.824910409962511 2.824910409962511 +2.829322097471409 2.829322097471409 +2.833852169620359 2.833852169620359 +2.839287537694811 2.839287537694811 +2.841714730677953 2.841714730677953 +2.841715058318205 2.841715058318205 +2.851653306950001 2.851653306950001 +2.853639002902003 2.853639002902003 +2.85515962291442 2.85515962291442 +2.855333736885793 2.855333736885793 +2.872540314564304 2.872540314564304 +2.879449214478037 2.879449214478037 +2.881003856158217 2.881003856158217 +2.881074731438092 2.881074731438092 +2.893589165559115 2.893589165559115 +2.898664743213686 2.898664743213686 +2.90387832180792 2.90387832180792 +2.919095859678745 2.919095859678745 +2.924945175440496 2.924945175440496 +2.931795145696962 2.931795145696962 +2.932285006979528 2.932285006979528 +2.934606807227626 2.934606807227626 +2.936392671567475 2.936392671567475 +2.953794710898493 2.953794710898493 +2.958055395706548 2.958055395706548 +2.960407744013656 2.960407744013656 +2.960759715914242 2.960759715914242 +2.969702548922556 2.969702548922556 +2.970149844982665 2.970149844982665 +2.978953970679893 2.978953970679893 +2.979075864664287 2.979075864664287 +2.984665519558418 2.984665519558418 +3.04548240149063 3.04548240149063 +3.050688336416719 3.050688336416719 +3.05773927378742 3.05773927378742 +3.059596740753369 3.059596740753369 +3.059762479996741 3.059762479996741 +3.088543279751235 3.088543279751235 +3.093580813520995 3.093580813520995 +3.104787362108069 3.104787362108069 +3.173380191779681 3.173380191779681 +3.583124637167399 3.583124637167399 +3.630658112409034 3.630658112409034 +3.631421639368965 3.631421639368965 +3.751087101339956 3.751087101339956 +3.800845709568037 3.800845709568037 +3.846558940956666 3.846558940956666 +4 4 +4 4 +4.076238038291317 4.076238038291317 +4.455547086147983 4.455547086147983 +5.356087357608394 5.356087357608394 +5.54364842773721 5.54364842773721 +7.587654388717225 7.587654388717225 diff --git a/wasserstein/tests/data/test_diag3_A.pd.dipha b/wasserstein/tests/data/test_diag3_A.pd.dipha new file mode 100644 index 0000000..0dbfb89 Binary files /dev/null and b/wasserstein/tests/data/test_diag3_A.pd.dipha differ diff --git a/wasserstein/tests/data/test_diag3_B b/wasserstein/tests/data/test_diag3_B new file mode 100644 index 0000000..bb8655a --- /dev/null +++ b/wasserstein/tests/data/test_diag3_B @@ -0,0 +1,193 @@ +1.167089173446239 1.167089173446239 +1.256234452640111 1.256234452640111 +1.303693422257498 1.303693422257498 +1.413255970488646 1.413255970488646 +1.697910382446573 1.697910382446573 +1.718844728805093 1.718844728805093 +1.734124820632724 1.734124820632724 +1.749572938304276 1.749572938304276 +1.770320424526358 1.770320424526358 +1.786344763036807 1.786344763036807 +1.810054737907635 1.810054737907635 +1.815127306170105 1.815127306170105 +1.837806648681218 1.837806648681218 +1.870552189043019 1.870552189043019 +1.897240351979503 1.897240351979503 +1.935562152643027 1.935562152643027 +1.952562418976663 1.952562418976663 +1.959552126104175 1.959552126104175 +1.979899732318601 1.979899732318601 +2.00044500769347 2.00044500769347 +2.028951227523087 2.028951227523087 +2.037678749316724 2.037678749316724 +2.047911420446857 2.047911420446857 +2.075181804515723 2.075181804515723 +2.077245386452578 2.077245386452578 +2.084751316684838 2.084751316684838 +2.084860886126203 2.084860886126203 +2.103286477421968 2.103286477421968 +2.106856827309345 2.106856827309345 +2.113139266068691 2.113139266068691 +2.114594962503455 2.114594962503455 +2.115917727493158 2.115917727493158 +2.122335878797089 2.122335878797089 +2.127359082726206 2.127359082726206 +2.131673381033273 2.131673381033273 +2.155015793320908 2.155015793320908 +2.162480684365264 2.162480684365264 +2.195207236194009 2.195207236194009 +2.203279931784429 2.203279931784429 +2.205567995563669 2.205567995563669 +2.212933962936773 2.212933962936773 +2.215081271089993 2.215081271089993 +2.225989037578865 2.225989037578865 +2.24218929203347 2.24218929203347 +2.246321319993257 2.246321319993257 +2.280059407166517 2.280059407166517 +2.284117669032543 2.284117669032543 +2.293233992770926 2.293233992770926 +2.298815356955373 2.298815356955373 +2.300542634724628 2.300542634724628 +2.326408290042679 2.326408290042679 +2.328797162040625 2.328797162040625 +2.36025798094028 2.36025798094028 +2.365031313604634 2.365031313604634 +2.372266311053883 2.372266311053883 +2.400053902049271 2.400053902049271 +2.409134054334209 2.409134054334209 +2.411368235895246 2.411368235895246 +2.415934766378347 2.415934766378347 +2.420989857074179 2.420989857074179 +2.422520269961376 2.422520269961376 +2.43377629944218 2.43377629944218 +2.449308615746858 2.449308615746858 +2.452936540056068 2.452936540056068 +2.453698388060092 2.453698388060092 +2.454711357943602 2.454711357943602 +2.459202673400056 2.459202673400056 +2.493778305287384 2.493778305287384 +2.537394117473177 2.537394117473177 +2.544674753106669 2.544674753106669 +2.558904304820755 2.558904304820755 +2.563089994365716 2.563089994365716 +2.565476194422898 2.565476194422898 +2.599756049189921 2.599756049189921 +2.603619661709009 2.603619661709009 +2.609775379385211 2.609775379385211 +2.622552038976658 2.622552038976658 +2.623798471910885 2.623798471910885 +2.635711198661633 2.635711198661633 +2.644229304223612 2.644229304223612 +2.661919064427223 2.661919064427223 +2.666783921498494 2.666783921498494 +2.675503310152301 2.675503310152301 +2.684228699964661 2.684228699964661 +2.696854617267681 2.696854617267681 +2.700538654666735 2.700538654666735 +2.744886611436907 2.744886611436907 +2.748618547996708 2.748618547996708 +2.757981496641135 2.757981496641135 +2.774766825791652 2.774766825791652 +2.784491736143893 2.784491736143893 +2.796482184304273 2.796482184304273 +2.800849254751463 2.800849254751463 +2.816963410000067 2.816963410000067 +2.825207379914743 2.825207379914743 +2.831286409028398 2.831286409028398 +2.844827082550712 2.844827082550712 +2.853558438121966 2.853558438121966 +2.859806035663089 2.859806035663089 +2.878956033959891 2.878956033959891 +2.886422825109222 2.886422825109222 +2.891566924618832 2.891566924618832 +2.892028419188578 2.892028419188578 +2.893138900330932 2.893138900330932 +2.894250936382814 2.894250936382814 +2.90112201577666 2.90112201577666 +2.902172795370005 2.902172795370005 +2.90967533504119 2.90967533504119 +2.919687125962211 2.919687125962211 +2.923711238894001 2.923711238894001 +2.929041907338841 2.929041907338841 +2.938734873084349 2.938734873084349 +2.939642428979572 2.939642428979572 +2.943010909640486 2.943010909640486 +2.944210926048103 2.944210926048103 +2.951091358234723 2.951091358234723 +2.953950275008233 2.953950275008233 +2.966943157369611 2.966943157369611 +2.982522008227535 2.982522008227535 +2.992174049247434 2.992174049247434 +2.993098995839607 2.993098995839607 +2.995311055519335 2.995311055519335 +2.996708164866609 2.996708164866609 +2.999922110096644 2.999922110096644 +3 3 +3.000364533251431 3.000364533251431 +3.003840990677832 3.003840990677832 +3.006672301312824 3.006672301312824 +3.016489409140306 3.016489409140306 +3.021123787004333 3.021123787004333 +3.039117818612596 3.039117818612596 +3.039555193616473 3.039555193616473 +3.049952247267922 3.049952247267922 +3.057673482371216 3.057673482371216 +3.06920083507411 3.06920083507411 +3.075505231082782 3.075505231082782 +3.079038628197304 3.079038628197304 +3.084265889701239 3.084265889701239 +3.086837468106297 3.086837468106297 +3.103873984398081 3.103873984398081 +3.11528125482979 3.11528125482979 +3.119720021802376 3.119720021802376 +3.132543753577128 3.132543753577128 +3.141822873359038 3.141822873359038 +3.143502053175705 3.143502053175705 +3.153232877003746 3.153232877003746 +3.157586960809866 3.157586960809866 +3.157966892275408 3.157966892275408 +3.163583225161638 3.163583225161638 +3.178188125342772 3.178188125342772 +3.178475867931057 3.178475867931057 +3.179372297765929 3.179372297765929 +3.186437137237586 3.186437137237586 +3.188053957464282 3.188053957464282 +3.199351610026191 3.199351610026191 +3.204566427513051 3.204566427513051 +3.22885278850648 3.22885278850648 +3.229088648916556 3.229088648916556 +3.236685523936269 3.236685523936269 +3.239854786600373 3.239854786600373 +3.255809161351669 3.255809161351669 +3.287718056143732 3.287718056143732 +3.294038308299402 3.294038308299402 +3.313688277153076 3.313688277153076 +3.325783245946608 3.325783245946608 +3.331072954808429 3.331072954808429 +3.354962852285211 3.354962852285211 +3.357502741262644 3.357502741262644 +3.373668509804576 3.373668509804576 +3.408653045775418 3.408653045775418 +3.416281541503763 3.416281541503763 +3.443144279972986 3.443144279972986 +3.492970564191033 3.492970564191033 +3.493767805580122 3.493767805580122 +3.559084134799019 3.559084134799019 +3.559898699300211 3.559898699300211 +3.833585501974904 3.833585501974904 +4.099502076836052 4.099502076836052 +4.484082147277348 4.484082147277348 +4.505718324707756 4.505718324707756 +4.891723119528026 4.891723119528026 +5.065300494905414 5.065300494905414 +5.188599238535201 5.188599238535201 +5.36134479630535 5.36134479630535 +5.609786508140671 5.609786508140671 +7.08640314680382 7.08640314680382 +7.113765883549079 7.113765883549079 +7.328944131981744 7.328944131981744 +7.63625182217108 7.63625182217108 +7.716743341311718 7.716743341311718 +7.938093404092351 7.938093404092351 +8.112783377863046 8.112783377863046 +8.131485096731454 8.131485096731454 diff --git a/wasserstein/tests/data/test_diag3_B.pd.dipha b/wasserstein/tests/data/test_diag3_B.pd.dipha new file mode 100644 index 0000000..3fbfd90 Binary files /dev/null and b/wasserstein/tests/data/test_diag3_B.pd.dipha differ diff --git a/wasserstein/tests/data/test_list.txt b/wasserstein/tests/data/test_list.txt new file mode 100644 index 0000000..27340d8 --- /dev/null +++ b/wasserstein/tests/data/test_list.txt @@ -0,0 +1,21 @@ +test_5_A test_5_B 1.0 -1.0 4.320655 +test_5_A test_5_B 2.0 -1.0 1.7323016335246 +test_5_A test_5_B 3.0 -1.0 1.396199948 +test_5_A test_5_B 1.0 1.0 6.603006 +test_5_A test_5_B 2.0 1.0 2.73426775794691 +test_5_A test_5_B 3.0 1.0 2.13072755216204 +test_5_A test_5_B 1.0 2.0 5.1888795679967 +test_5_A test_5_B 2.0 2.0 2.26649677575857 +test_5_A test_5_B 3.0 2.0 1.86434961396614 +test_100_A test_100_B 1.0 -1.0 27.5573259 +test_100_A test_100_B 2.0 -1.0 3.38004972483238 +test_100_A test_100_B 3.0 -1.0 1.9045814702967 +test_100_A test_100_B 1.0 1.0 40.4375855 +test_100_A test_100_B 2.0 1.0 4.75252460986668 +test_100_A test_100_B 3.0 1.0 2.556594741819 +test_100_A test_100_B 1.0 2.0 31.7187555735287 +test_100_A test_100_B 2.0 2.0 3.81132239777023 +test_100_A test_100_B 3.0 2.0 2.09695346034248 +test_diag1_A test_diag1_B 1.0 -1.0 0.0 +test_diag2_A test_diag2_B 1.0 -1.0 0.0 +test_diag3_A test_diag3_B 1.0 -1.0 0.0 diff --git a/wasserstein/tests/test_hera_wasserstein.cpp b/wasserstein/tests/test_hera_wasserstein.cpp new file mode 100644 index 0000000..0a80d2f --- /dev/null +++ b/wasserstein/tests/test_hera_wasserstein.cpp @@ -0,0 +1,532 @@ +#define LOG_AUCTION +#include "catch/catch.hpp" + +#include +#include + + +#undef LOG_AUCTION + +#include "wasserstein.h" +#include "tests_reader.h" + +using namespace hera_test; + +using PairVector = std::vector>; + + +TEST_CASE("simple cases", "wasserstein_dist") +{ + PairVector diagram_A, diagram_B; + hera::AuctionParams params; + params.wasserstein_power = 1.0; + params.delta = 0.01; + params.internal_p = hera::get_infinity(); + params.initial_epsilon = 0.0; + params.epsilon_common_ratio = 0.0; + params.max_num_phases = 30; + params.gamma_threshold = 0.0; + params.max_bids_per_round = 0; // use Jacobi + + SECTION("trivial: two empty diagrams") { + REQUIRE( 0.0 == hera::wasserstein_dist<>(diagram_A, diagram_B, params)); + } + + SECTION("trivial: one empty diagram, one single-point diagram") { + + diagram_A.emplace_back(1.0, 2.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + REQUIRE( fabs(d1 - 0.5) <= 0.00000000001 ); + + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d2 - 0.5) <= 0.00000000001 ); + + params.internal_p = 2.0; + double corr_answer = 1.0 / std::sqrt(2.0); + double d3 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d3 - corr_answer) <= 0.00000000001 ); + + } + + SECTION("trivial: two single-point diagrams-1") { + + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d1 - d2) <= 0.00000000001 ); + REQUIRE( fabs(d1 - 3.0) <= 0.00000000001 ); + + params.wasserstein_power = 2.0; + double d3 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d4 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d3 - d4) <= 0.00000000001 ); + REQUIRE( fabs(d4 - 9.0) <= 0.00000000001 ); + + params.wasserstein_power = 1.0; + params.internal_p = 1.0; + double d5 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d6 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d5 - d6) <= 0.00000000001 ); + REQUIRE( fabs(d5 - 4.0) <= 0.00000000001 ); + + params.internal_p = 2.0; + double d7 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d8 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d7 - d8) <= 0.00000000001 ); + REQUIRE( fabs(d7 - std::sqrt(10.0)) <= 0.00000000001 ); + + } + + SECTION("trivial: two single-point diagrams-2") { + + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(130.0, 138.0); // (4, 4) + + double d1 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d1 - d2) <= 0.00000000001 ); + REQUIRE( fabs(d1 - 9.0) <= 0.00000000001 ); + + params.wasserstein_power = 2.0; + double d3 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d4 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d3 - d4) <= 0.00000000001 ); + REQUIRE( fabs(d4 - 41.0) <= 0.00000000001 ); // 5^2 + 4^2 + + params.wasserstein_power = 1.0; + params.internal_p = 1.0; + double d5 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d6 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d5 - d6) <= 0.00000000001 ); + REQUIRE( fabs(d5 - 18.0) <= 0.00000000001 ); // 5 + 5 + 4 + 4 + + params.internal_p = 2.0; + double d7 = hera::wasserstein_cost<>(diagram_A, diagram_B, params); + double d8 = hera::wasserstein_cost<>(diagram_B, diagram_A, params); + REQUIRE( fabs(d7 - d8) <= 0.00000000001 ); + REQUIRE( fabs(d7 - 9 * std::sqrt(2.0)) <= 0.00000000001 ); // sqrt(5^2 + 5^2) + sqrt(4^2 + 4^2) = 9 sqrt(2) + + } + +} + + + +TEST_CASE("file cases", "wasserstein_dist") +{ + PairVector diagram_A, diagram_B; + hera::AuctionParams params; + params.wasserstein_power = 1.0; + params.delta = 0.01; + params.internal_p = hera::get_infinity(); + params.initial_epsilon = 0.0; + params.epsilon_common_ratio = 0.0; + params.max_num_phases = 30; + params.gamma_threshold = 0.0; + params.max_bids_per_round = 1; // use Jacobi + + + SECTION("from file:") { + const char* file_name = "../tests/data/test_list.txt"; + std::ifstream f; + f.open(file_name); + std::vector test_params; + std::string s; + while (std::getline(f, s)) { + test_params.emplace_back(s); + } + + for(const auto& ts : test_params) { + params.wasserstein_power = ts.q; + params.internal_p = ts.internal_p; + bool read_file_A = hera::read_diagram_point_set(ts.file_1, diagram_A); + bool read_file_B = hera::read_diagram_point_set(ts.file_2, diagram_B); + REQUIRE( read_file_A ); + REQUIRE( read_file_B ); + double hera_answer = hera::wasserstein_dist(diagram_A, diagram_B, params); + REQUIRE( fabs(hera_answer - ts.answer) <= 0.01 * hera_answer ); + std::cout << ts << " PASSED " << std::endl; + } + } + + SECTION("from DIPHA file:") { + const char* file_name = "../tests/data/test_list.txt"; + std::ifstream f; + f.open(file_name); + std::vector test_params; + std::string s; + while (std::getline(f, s)) { + test_params.emplace_back(s); + } + + for(const auto& ts : test_params) { + params.wasserstein_power = ts.q; + params.internal_p = ts.internal_p; + bool read_file_A = hera::read_diagram_dipha(ts.file_1 + std::string(".pd.dipha"), 1, diagram_A); + bool read_file_B = hera::read_diagram_dipha(ts.file_2 + std::string(".pd.dipha"), 1, diagram_B); + REQUIRE( read_file_A ); + REQUIRE( read_file_B ); + double hera_answer = hera::wasserstein_dist(diagram_A, diagram_B, params); + REQUIRE( fabs(hera_answer - ts.answer) <= 0.01 * hera_answer ); + std::cout << ts << " PASSED " << std::endl; + } + } +} + + + +TEST_CASE("infinity points", "wasserstein_dist") +{ + PairVector diagram_A, diagram_B; + hera::AuctionParams params; + params.wasserstein_power = 1.0; + params.delta = 0.01; + params.internal_p = hera::get_infinity(); + params.initial_epsilon = 0.0; + params.epsilon_common_ratio = 0.0; + params.max_num_phases = 30; + params.gamma_threshold = 0.0; + params.max_bids_per_round = 0; // use Jacobi + + // do not use Hera's infinity! it is -1 + double inf = std::numeric_limits::infinity(); + + SECTION("two points at infinity, no finite points") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double corr_answer = 1.0; + REQUIRE( fabs(d - corr_answer) <= 0.00000000001 ); + } + + SECTION("two points at infinity") { + + // edge cost 3.0 + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double corr_answer = 1.0 + 3.0; + REQUIRE( fabs(d - corr_answer) <= 0.00000000001 ); + } + + SECTION("three points at infinity, no finite points") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double corr_answer = inf; + REQUIRE( d == corr_answer ); + } + + SECTION("three points at infinity") { + + // edge cost 3.0 + diagram_A.emplace_back(10.0, 20.0); // (5, 5) + diagram_B.emplace_back(13.0, 19.0); // (3, 3) + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double corr_answer = inf; + REQUIRE( d == corr_answer ); + } + + + SECTION("all four corners at infinity, no finite points, finite answer") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double corr_answer = 4.0; + + REQUIRE( d == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-1") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-2") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-3") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-4") { + + // edge cost 1.0 + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + // edge cost 1.0 + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + // edge cost 1.0 + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + // edge cost 1.0 + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + diagram_B.emplace_back(-inf, 2.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-1") { + + diagram_A.emplace_back(1.0, inf); + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-2") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, with finite points, infinite answer-3") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + SECTION("all four corners at infinity, no finite points, infinite answer-4") { + + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.0, -inf); + diagram_B.emplace_back(2.0, -inf); + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(-inf, 1.0); + diagram_B.emplace_back(-inf, 2.0); + diagram_B.emplace_back(-inf, 2.0); + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = inf; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + } + + + SECTION("simple small example with finite answer") { + diagram_A.emplace_back(1.0, inf); + diagram_B.emplace_back(2.0, inf); + + diagram_A.emplace_back(1.9, inf); + diagram_B.emplace_back(1.1, inf); + + // 1.1 - 1.0 + 2.0 - 1.9 = 0.2 + + diagram_A.emplace_back(inf, 1.0); + diagram_B.emplace_back(inf, 2.0); + + diagram_A.emplace_back(inf, 1.9); + diagram_B.emplace_back(inf, 1.1); + + + // finite edge + diagram_A.emplace_back(10.0, 20.0); + diagram_B.emplace_back(13.0, 19.0); + + double d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + double d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + double corr_answer = 3.0 + 0.2 + 0.2; + + REQUIRE( d1 == corr_answer ); + REQUIRE( d2 == corr_answer ); + + params.wasserstein_power = 2.0; + + d1 = hera::wasserstein_dist<>(diagram_A, diagram_B, params); + d2 = hera::wasserstein_dist<>(diagram_B, diagram_A, params); + corr_answer = std::sqrt(3.0 * 3.0 + 4 * 0.1 * 0.1); + + REQUIRE( fabs(d1 - corr_answer) < 0.000000000001 ); + REQUIRE( fabs(d2 - corr_answer) < 0.000000000001 ); + + } + +} + diff --git a/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp b/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp new file mode 100644 index 0000000..9603ceb --- /dev/null +++ b/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp @@ -0,0 +1,111 @@ +#include "catch/catch.hpp" + +#include +#include + + +#undef LOG_AUCTION + +#include "wasserstein_pure_geom.hpp" +#include "tests_reader.h" + +using namespace hera_test; + +TEST_CASE("simple point clouds", "wasserstein_dist_pure_geom") +{ +// int n_points = 3; +// int dim = 3; +// using Traits = hera::ws::dnn::DynamicPointTraits; +// hera::ws::dnn::DynamicPointTraits traits(dim); +// hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); +// hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); +// +// dgm_a[0][0] = 0.0; +// dgm_a[0][1] = 0.0; +// dgm_a[0][2] = 0.0; +// +// dgm_a[1][0] = 1.0; +// dgm_a[1][1] = 0.0; +// dgm_a[1][2] = 0.0; +// +// dgm_a[2][0] = 0.0; +// dgm_a[2][1] = 1.0; +// dgm_a[2][2] = 1.0; +// +// dgm_b[0][0] = 0.0; +// dgm_b[0][1] = 0.1; +// dgm_b[0][2] = 0.1; +// +// dgm_b[1][0] = 1.1; +// dgm_b[1][1] = 0.0; +// dgm_b[1][2] = 0.0; +// +// dgm_b[2][0] = 0.0; +// dgm_b[2][1] = 1.1; +// dgm_b[2][2] = 0.9; + + const int dim = 3; + using Traits = hera::ws::dnn::DynamicPointTraits; + hera::ws::dnn::DynamicPointTraits traits(dim); + hera::AuctionParams params; + params.dim = dim; + params.wasserstein_power = 1.0; + params.delta = 0.01; + params.internal_p = hera::get_infinity(); + params.initial_epsilon = 0.0; + params.epsilon_common_ratio = 0.0; + params.max_num_phases = 30; + params.gamma_threshold = 0.0; + params.max_bids_per_round = 0; // use Jacobi + + + SECTION("trivial: two single-point diagrams-1") { + + int n_points = 1; + hera::ws::dnn::DynamicPointVector dgm_a = traits.container(n_points); + hera::ws::dnn::DynamicPointVector dgm_b = traits.container(n_points); + + dgm_a[0][0] = 0.0; + dgm_a[0][1] = 0.0; + dgm_a[0][2] = 0.0; + + dgm_b[0][0] = 1.0; + dgm_b[0][1] = 1.0; + dgm_b[0][2] = 1.0; + + std::vector max_bids { 1, 10, 0 }; + std::vector internal_ps{ 1, 2, static_cast(hera::get_infinity()) }; + std::vector wasserstein_powers { 1, 2, 3 }; + + for(auto internal_p : internal_ps) { + // there is only one point, so the answer does not depend wasserstein power + double correct_answer; + switch (internal_p) { + case 1 : + correct_answer = 3.0; + break; + case 2 : + correct_answer = sqrt(3.0); + break; + case static_cast(hera::get_infinity()) : + correct_answer = 1.0; + break; + default : + throw std::runtime_error("Correct answer not specified in test case"); + } + + for (auto max_bid : max_bids) { + for (auto wasserstein_power : wasserstein_powers) { + params.max_bids_per_round = max_bid; + params.internal_p = internal_p; + params.wasserstein_power = wasserstein_power; + double d1 = hera::ws::wasserstein_dist(dgm_a, dgm_b, params); + double d2 = hera::ws::wasserstein_dist(dgm_b, dgm_a, params); + REQUIRE(fabs(d1 - d2) <= 0.00000000001); + REQUIRE(fabs(d1 - correct_answer) <= 0.00000000001); + } + } + } + } +} + diff --git a/wasserstein/tests/tests_main.cpp b/wasserstein/tests/tests_main.cpp new file mode 100644 index 0000000..d24407e --- /dev/null +++ b/wasserstein/tests/tests_main.cpp @@ -0,0 +1,3 @@ +#define LOG_AUCTION +#define CATCH_CONFIG_MAIN +#include "catch/catch.hpp" diff --git a/wasserstein/tests/tests_reader.h b/wasserstein/tests/tests_reader.h new file mode 100644 index 0000000..f2d5735 --- /dev/null +++ b/wasserstein/tests/tests_reader.h @@ -0,0 +1,67 @@ +#ifndef WASSERSTEIN_TESTS_READER_H +#define WASSERSTEIN_TESTS_READER_H + +#include +#include +#include +#include +#include +#include +#include + +#include "hera_infinity.h" + +namespace hera_test { + inline std::vector split_on_delim(const std::string& s, char delim) + { + std::stringstream ss(s); + std::string token; + std::vector tokens; + while (std::getline(ss, token, delim)) { + tokens.push_back(token); + } + return tokens; + } + + + // single row in a file with test cases + struct TestFromFileCase + { + + std::string file_1; + std::string file_2; + double q; + double internal_p; + double answer; + + TestFromFileCase(std::string s) + { + auto tokens = split_on_delim(s, ' '); + assert(tokens.size() == 5); + + file_1 = tokens.at(0); + file_2 = tokens.at(1); + q = std::stod(tokens.at(2)); + internal_p = std::stod(tokens.at(3)); + answer = std::stod(tokens.at(4)); + + if (q < 1.0 or std::isinf(q) or + (internal_p != hera::get_infinity() and internal_p < 1.0)) { + throw std::runtime_error("Bad line in test_list.txt"); + } + } + }; + + inline std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s) + { + out << "[" << s.file_1 << ", " << s.file_2 << ", q = " << s.q << ", norm = "; + if (s.internal_p != hera::get_infinity()) { + out << s.internal_p; + } else { + out << "infinity"; + } + out << ", answer = " << s.answer << "]"; + return out; + } +} // namespace hera_test +#endif //WASSERSTEIN_TESTS_READER_H -- cgit v1.2.3