From 90670802ec144092535fbb9a0a4a67dd10169805 Mon Sep 17 00:00:00 2001 From: searchivarius Date: Wed, 29 May 2019 20:37:49 -0400 Subject: [PATCH] Towards resolving #356 --- similarity_search/CMakeLists.txt | 39 ++++---- similarity_search/include/space.h | 17 +++- similarity_search/src/space.cc | 47 +++++++++ similarity_search/test/test_space_serial.cc | 100 ++++++++++++++------ 4 files changed, 154 insertions(+), 49 deletions(-) diff --git a/similarity_search/CMakeLists.txt b/similarity_search/CMakeLists.txt index 2ad020f..47c7068 100644 --- a/similarity_search/CMakeLists.txt +++ b/similarity_search/CMakeLists.txt @@ -35,41 +35,39 @@ if(NOT WIN32) endif() #message(FATAL_ERROR "stopping... compiler version is: ${CMAKE_CXX_COMPILER_ID} ${CXX_COMPILER_VERSION}") +set(SIMD_FLAGS " -march=native") +#set(SIMD_FLAGS "-march=x86-64") +#set(SIMD_FLAGS "-march=core2") +#set(SIMD_FLAGS "-fpic -msse4.2") + +set(WARN_FLAGS "-Wall -Wunreachable-code -Wcast-align") if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") # require at least gcc 4.7 if (CXX_COMPILER_VERSION VERSION_LESS 4.7) message(FATAL_ERROR "GCC version must be at least 4.7!") endif() - # Uncomment the following lines to see how the code compiles without AVX,SSE4.2 and/or SSE2 - #set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Ofast -lm -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic -march=x86-64") - #set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Ofast -lm -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic -march=core2") - #set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Ofast -lm -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic -msse4.2") - set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Wcast-align -Ofast -lm -DNDEBUG -std=c++11 -pthread -DHAVE_CXX0X -march=native -Wl,--no-as-needed -fpic") - set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wunreachable-code -Wcast-align -ggdb -lm -DNDEBUG -std=c++11 -pthread -DHAVE_CXX0X -march=native -Wl,--no-as-needed -fpic") + set (CMAKE_CXX_FLAGS_RELEASE "${WARN_FLAGS} -Ofast -lm -DNDEBUG -std=c++11 -pthread -DHAVE_CXX0X ${SIMD_FLAGS} -Wl,--no-as-needed -fpic") + set (CMAKE_CXX_FLAGS_DEBUG "${WARN_FLAGS} -ggdb -lm -DNDEBUG -std=c++11 -pthread -DHAVE_CXX0X ${SIMD_FLAGS} -Wl,--no-as-needed -fpic") elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel") if (CXX_COMPILER_VERSION VERSION_LESS 14.0.1) message(FATAL_ERROR "Intel version must be at least 14.0.1!") endif() - set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Ofast -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -march=native -fpic") - set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wunreachable-code -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -march=native -fpic") + set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Ofast -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread ${SIMD_FLAGS} -fpic") + set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wunreachable-code -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread ${SIMD_FLAGS} -fpic") elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - if (CXX_COMPILER_VERSION VERSION_LESS 4.2.1) - message(FATAL_ERROR "Clang version must be at least 3.4 (GCC >= 4.2.1 equivalent)!") - endif() if (CMAKE_SYSTEM_NAME MATCHES Darwin) # MACOSX - set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Wcast-align -O3 -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic -march=native") - set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wunreachable-code -Wcast-align -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic -march=native") + set (CMAKE_CXX_FLAGS_RELEASE "${WARN_FLAGS} -O3 -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic ${SIMD_FLAGS}") + set (CMAKE_CXX_FLAGS_DEBUG "${WARN_FLAGS} -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -fpic ${SIMD_FLAGS}") else() - set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wunreachable-code -Wcast-align -O3 -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -march=native -fpic") - set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wunreachable-code -Wcast-align -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread -march=native -fpic") + set (CMAKE_CXX_FLAGS_RELEASE "${WARN_FLAGS} -O3 -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread ${SIMD_FLAGS} -Wl,--no-as-needed -fpic") + set (CMAKE_CXX_FLAGS_DEBUG "${WARN_FLAGS} -ggdb -DNDEBUG -std=c++11 -DHAVE_CXX0X -pthread ${SIMD_FLAGS} -Wl,--no-as-needed -fpic") endif() - #message(FATAL_ERROR "CLANG ${CMAKE_SYSTEM_NAME}") elseif(WIN32) # TODO how can we add support for later versions? There seems to be no flag with the semantics "version x or higher" - if(NOT MSVC12 AND NOT MSVC14) - message(FATAL_ERROR "On Windows, only MSVC version 12 and 14 are supported!") + if(MSVC_VERSION LESS 1800) + message(FATAL_ERROR "On Windows, only MSVC version should be >= 12, code 1800, current version ${MSVC_VERSION}!") endif() else () message(FATAL_ERROR "Unrecognized compiler (use GCC, Clang, Intel compiler, or MSVC (on Windows)!") @@ -147,4 +145,7 @@ if (NOT WITHOUT_TESTS) add_subdirectory (test) endif() -message (STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CXX_COMPILER_VERSION}") +message(STATUS "OS: ${CMAKE_SYSTEM_NAME}") +message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CXX_COMPILER_VERSION}") +message(STATUS "CXX flags release: ${CMAKE_CXX_FLAGS_RELEASE}") +message(STATUS "CXX flags debug: ${CMAKE_CXX_FLAGS_DEBUG}") diff --git a/similarity_search/include/space.h b/similarity_search/include/space.h index 0c4867f..b00c646 100644 --- a/similarity_search/include/space.h +++ b/similarity_search/include/space.h @@ -212,9 +212,24 @@ class Space { const IdTypeUnsign MaxNumObjects = MAX_DATASET_QTY) const; void WriteDataset(const ObjectVector& dataset, const vector& vExternIds, - const string& inputFile, + const string& outputFile, const IdTypeUnsign MaxNumObjects = MAX_DATASET_QTY) const; + /* + * if the space stores some useful information in the input state, + * it needs to override ReadObjectVectorFromBinData, and WriteObjectVectorBinData. + * PS: Here an assumption is that data is empty + */ + virtual unique_ptr ReadObjectVectorFromBinData(ObjectVector& dataset, + vector& vExternIds, + const std::string& inputFile, + const IdTypeUnsign maxQty=MAX_DATASET_QTY) const; + + virtual void WriteObjectVectorBinData(const ObjectVector& dataset, + const vector& vExternIds, + const std::string& outputFile, + const IdTypeUnsign MaxNumObjects = MAX_DATASET_QTY) const; + /* * For some real-valued or integer-valued *DENSE* vector spaces this function * returns the number of vector elements. For all other spaces, it returns diff --git a/similarity_search/src/space.cc b/similarity_search/src/space.cc index 3fb404f..af77ca4 100644 --- a/similarity_search/src/space.cc +++ b/similarity_search/src/space.cc @@ -56,6 +56,53 @@ void Space::WriteDataset(const ObjectVector& dataset, outState->Close(); } +// Doesn't support external IDs, just makes them all empty +template +unique_ptr +Space::ReadObjectVectorFromBinData(ObjectVector& data, + vector& vExternIds, + const std::string& fileName, + const IdTypeUnsign maxQty) const { + CHECK_MSG(data.empty(), "this function expects data to be empty on call"); + size_t qty; + size_t objSize; + std::ifstream input(fileName, std::ios::binary); + CHECK_MSG(input, "Cannot open file '" + fileName + "' for writing"); + input.exceptions(std::ios::badbit | std::ios::failbit); + vExternIds.clear(); + + readBinaryPOD(input, qty); + + for (unsigned i = 0; i < std::min(qty, size_t(maxQty)); ++i) { + readBinaryPOD(input, objSize); + unique_ptr buf(new char[objSize]); + input.read(&buf[0], objSize); + data.push_back(new Object(buf.release())); + } + vExternIds.resize(data.size()); + return unique_ptr(new DataFileInputState()); +} + +// Doesn't support external IDs +template +void Space::WriteObjectVectorBinData(const ObjectVector& data, + const vector& vExternIds, + const std::string& fileName, + const IdTypeUnsign maxQty) const { + std::ofstream output(fileName, std::ios::binary); + CHECK_MSG(output, "Cannot open file '" + fileName + "' for writing"); + output.exceptions(std::ios::badbit | std::ios::failbit); + + writeBinaryPOD(output, size_t(data.size())); + for (unsigned i = 0; i < std::min(data.size(), size_t(maxQty)); ++i) { + const Object* o = data[i]; + writeBinaryPOD(output, o->bufferlength()); + output.write(o->buffer(), o->bufferlength()); + } + output.close(); +} + + template class Space; template class Space; template class Space; diff --git a/similarity_search/test/test_space_serial.cc b/similarity_search/test/test_space_serial.cc index 00ec2f9..8da38e2 100644 --- a/similarity_search/test/test_space_serial.cc +++ b/similarity_search/test/test_space_serial.cc @@ -43,13 +43,24 @@ namespace similarity { using namespace std; template -bool fullTestCommon(Space* pSpace, const ObjectVector& dataSet1, const vector& vExternIds1, size_t maxNumRec, const string& tmpFileName,bool bTestExternId) { - pSpace->WriteDataset(dataSet1, vExternIds1, tmpFileName); - +bool fullTestCommon(bool binTest, Space* pSpace, + const ObjectVector& dataSet1, + const vector& vExternIds1, + size_t maxNumRec, + const string& tmpFileName, + bool bTestExternId) { ObjectVector dataSet2; vector vExternIds2; + unique_ptr inpState; + + if (binTest) { + pSpace->WriteDataset(dataSet1, vExternIds1, tmpFileName); + inpState = pSpace->ReadDataset(dataSet2, vExternIds2, tmpFileName); + } else { + pSpace->WriteObjectVectorBinData(dataSet1, vExternIds1, tmpFileName); + inpState = pSpace->ReadObjectVectorFromBinData(dataSet2, vExternIds2, tmpFileName); + } - unique_ptr inpState(pSpace->ReadDataset(dataSet2, vExternIds2, tmpFileName)); pSpace->UpdateParamsFromFile(*inpState); if (maxNumRec != dataSet2.size()) { @@ -64,6 +75,10 @@ bool fullTestCommon(Space* pSpace, const ObjectVector& dataSet1, const v } for (size_t i = 0; i < maxNumRec; ++i) { + // Because saving binary data doesn't support saving external IDs just don't test + // correctness of saving/restoring external IDs in this case, but internal IDs + // still need to be checked! + if (bTestExternId) { if (vExternIds1[i] != vExternIds2[i]) { LOG(LIB_ERROR) << "External IDs are different, i = " << i << " id1 = '" << vExternIds1[i] << "' id2 = '" << vExternIds2[i] << "'" ; @@ -78,13 +93,23 @@ bool fullTestCommon(Space* pSpace, const ObjectVector& dataSet1, const v pSpace->CreateStrFromObj(dataSet2[i], vExternIds2[i]); return false; } + if (dataSet1[i]->id() != dataSet2[i]->id()) { + LOG(LIB_ERROR) << "Objects IDs are different, i = " << i; + LOG(LIB_ERROR) << "Object 1 id: "<< dataSet1[i]->id() << " Object 2 id: " << dataSet2[i]->id(); + } } return true; } template -bool fullTest(const string& dataSetFileName, size_t maxNumRec, const string& tmpFileName, const string& spaceName, const char* pSpaceParams[], bool bTestExternId) { +bool fullTest(bool binTest, + const string& dataSetFileName, + size_t maxNumRec, + const string& tmpFileName, + const string& spaceName, + const char* pSpaceParams[], + bool bTestExternId) { vector spaceParams; LOG(LIB_INFO) << "Space name: " << spaceName << " distance type: " << DistTypeName() << " data file: " << dataSetFileName << " maxNumRec=" << maxNumRec; @@ -108,11 +133,11 @@ bool fullTest(const string& dataSetFileName, size_t maxNumRec, const string& tmp return false; } - return fullTestCommon(space.get(), dataSet1, vExternIds1, maxNumRec, tmpFileName, bTestExternId); + return fullTestCommon(binTest, space.get(), dataSet1, vExternIds1, maxNumRec, tmpFileName, bTestExternId); } template -bool fullTest(const vector& dataSetStr, size_t maxNumRec, const string& tmpFileName, const string& spaceName, const char* pSpaceParams[], bool bTestExternId) { +bool fullTest(bool binTest, const vector& dataSetStr, size_t maxNumRec, const string& tmpFileName, const string& spaceName, const char* pSpaceParams[], bool bTestExternId) { vector spaceParams; LOG(LIB_INFO) << "Space name: " << spaceName << " maxNumRec=" << maxNumRec; @@ -142,7 +167,7 @@ bool fullTest(const vector& dataSetStr, size_t maxNumRec, const string& return false; } - return fullTestCommon(space.get(), dataSet1, vExternIds1, maxNumRec, tmpFileName, bTestExternId); + return fullTestCommon(binTest, space.get(), dataSet1, vExternIds1, maxNumRec, tmpFileName, bTestExternId); } const char *emptyParams[] = {NULL}; @@ -151,49 +176,60 @@ const char *paramsDistCosine[] = {"dist=" SPACE_WORD_EMBED_DIST_COSINE, NULL}; TEST(Test_WordEmbedSpace) { for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt", SPACE_WORD_EMBED, paramsDistL2, true)); - EXPECT_EQ(true, fullTest("glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt",SPACE_WORD_EMBED, paramsDistCosine, true)); - EXPECT_EQ(true, fullTest("glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt", SPACE_WORD_EMBED, paramsDistL2, true)); - EXPECT_EQ(true, fullTest("glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt",SPACE_WORD_EMBED, paramsDistCosine, true)); + bool binTest = false; // saving of external IDs isn't implemented for binary data writing/reading + EXPECT_EQ(true, fullTest(binTest, "glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt", SPACE_WORD_EMBED, paramsDistL2, true)); + EXPECT_EQ(true, fullTest(binTest, "glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt",SPACE_WORD_EMBED, paramsDistCosine, true)); + EXPECT_EQ(true, fullTest(binTest, "glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt", SPACE_WORD_EMBED, paramsDistL2, true)); + EXPECT_EQ(true, fullTest(binTest, "glove.6B.100d_100.txt", maxNumRec, "tmp_out_file.txt",SPACE_WORD_EMBED, paramsDistCosine, true)); } } TEST(Test_DenseVectorSpace) { for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "l2", emptyParams, false)); - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "l2", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "l2", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "l2", emptyParams, false)); + } } } TEST(Test_DenseVectorKLDiv) { // Test KL-diverg. with and without precomputation of logarithms for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenfast", emptyParams, false)); - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenfast", emptyParams, false)); - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenslow", emptyParams, false)); - EXPECT_EQ(true, fullTest("final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenslow", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenfast", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenfast", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenslow", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "final128_10K.txt", maxNumRec, "tmp_out_file.txt", "kldivgenslow", emptyParams, false)); + } } } TEST(Test_SparseVectorSpace) { for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse", emptyParams, false)); - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse", emptyParams, false)); - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse", emptyParams, false)); - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse", emptyParams, false)); + } } } TEST(Test_SparseVectorSpaceFast) { for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse_fast", emptyParams, false)); - EXPECT_EQ(true, fullTest("sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse_fast", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "cosinesimil_sparse_fast", emptyParams, false)); + EXPECT_EQ(true, fullTest(binTest, "sparse_5K.txt", maxNumRec, "tmp_out_file.txt", "angulardist_sparse_fast", emptyParams, false)); + } } } TEST(Test_StringSpace) { for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("dna32_4_5K.txt", maxNumRec, "tmp_out_file.txt", "leven", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "dna32_4_5K.txt", maxNumRec, "tmp_out_file.txt", "leven", emptyParams, false)); + } } } @@ -210,7 +246,9 @@ TEST(Test_BitHamming) { testVect.push_back(ss.str()); } for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest(testVect, maxNumRec, "tmp_out_file.txt", "bit_hamming", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, testVect, maxNumRec, "tmp_out_file.txt", "bit_hamming", emptyParams, false)); + } } } @@ -227,7 +265,9 @@ TEST(Test_BitJaccard) { testVect.push_back(ss.str()); } for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest(testVect, maxNumRec, "tmp_out_file.txt", "bit_jaccard", emptyParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, testVect, maxNumRec, "tmp_out_file.txt", "bit_jaccard", emptyParams, false)); + } } } @@ -235,8 +275,10 @@ TEST(Test_BitJaccard) { TEST(Test_SQFD) { const char* sqfdParams[] = {"alpha=1", NULL} ; for (size_t maxNumRec = 1; maxNumRec < MAX_NUM_REC; ++maxNumRec) { - EXPECT_EQ(true, fullTest("sqfd20_10k_10k.txt", maxNumRec, "tmp_out_file.txt", "sqfd_heuristic_func", sqfdParams, false)); - EXPECT_EQ(true, fullTest("sqfd20_10k_10k.txt", maxNumRec, "tmp_out_file.txt", "sqfd_heuristic_func", sqfdParams, false)); + for (unsigned binTest = 0; binTest < 2; ++binTest) { + EXPECT_EQ(true, fullTest(binTest, "sqfd20_10k_10k.txt", maxNumRec, "tmp_out_file.txt", "sqfd_heuristic_func", sqfdParams, false)); + EXPECT_EQ(true, fullTest(binTest, "sqfd20_10k_10k.txt", maxNumRec, "tmp_out_file.txt", "sqfd_heuristic_func", sqfdParams, false)); + } } } #endif