Skip to content

Commit

Permalink
Merge pull request #426 from avdgrinten/fix-nkbg-weight-detection
Browse files Browse the repository at this point in the history
NetworKit binary graphs: Fix weight auto detection for unweighted graphs
  • Loading branch information
fabratu committed May 25, 2020
2 parents 2251e87 + 3ddc01d commit 53a6932
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 21 deletions.
36 changes: 17 additions & 19 deletions networkit/cpp/io/NetworkitBinaryWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,31 @@ void NetworkitBinaryWriter::write(const Graph &G, const std::string &path) {
Aux::enforceOpened(outfile);
nkbg::WEIGHT_FORMAT weightFormat;

auto detectWeightsType = [&] () {
weightFormat = nkbg::WEIGHT_FORMAT::VARINT;
auto detectWeightsType = [&] () -> nkbg::WEIGHT_FORMAT {
if(!G.isWeighted())
return nkbg::WEIGHT_FORMAT::NONE;

bool isUnsigned = true;
bool fitsIntoInt64 = true;
bool fitsIntoFloat = true;
G.forNodes([&](node n) {
G.forNeighborsOf(n,[&](node, edgeweight w) {
if(w < 0)
isUnsigned = false;
if(w != static_cast<int64_t>(w))
fitsIntoInt64 = false;
if(w != static_cast<float>(w))
fitsIntoFloat = false;
});
G.forEdges([&](node, node, edgeweight w) {
if(w < 0)
isUnsigned = false;
if(w != static_cast<int64_t>(w))
fitsIntoInt64 = false;
if(w != static_cast<float>(w))
fitsIntoFloat = false;
});
if(fitsIntoInt64) {
if(isUnsigned) {
weightFormat = nkbg::WEIGHT_FORMAT::VARINT;
return nkbg::WEIGHT_FORMAT::VARINT;
} else {
weightFormat = nkbg::WEIGHT_FORMAT::SIGNED_VARINT;
return nkbg::WEIGHT_FORMAT::SIGNED_VARINT;
}
} else if(fitsIntoFloat) {
return nkbg::WEIGHT_FORMAT::FLOAT;
} else {
if(fitsIntoFloat) {
weightFormat = nkbg::WEIGHT_FORMAT::FLOAT;
} else {
weightFormat = nkbg::WEIGHT_FORMAT::DOUBLE;
}
return nkbg::WEIGHT_FORMAT::DOUBLE;
}
};

Expand All @@ -59,7 +57,7 @@ void NetworkitBinaryWriter::write(const Graph &G, const std::string &path) {
weightFormat = nkbg::WEIGHT_FORMAT::NONE;
break;
case NetworkitBinaryWeights::autoDetect:
detectWeightsType();
weightFormat = detectWeightsType();
break;
case NetworkitBinaryWeights::unsignedFormat:
weightFormat = nkbg::WEIGHT_FORMAT::VARINT;
Expand Down
20 changes: 18 additions & 2 deletions networkit/cpp/io/test/IOGTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,8 @@ TEST_F(IOGTest, testNetworkitBinaryTiny01) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binary_tiny01");
EXPECT_EQ(G2.isDirected(), false);
EXPECT_EQ(G2.isWeighted(), false);
ASSERT_EQ(G2.numberOfNodes(), G.numberOfNodes());
ASSERT_EQ(G2.numberOfEdges(), G.numberOfEdges());
G.forNodes([&](node u){
Expand All @@ -826,11 +828,14 @@ TEST_F(IOGTest, testNetworkitBinaryKonect) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binary_konect");
EXPECT_EQ(G2.isDirected(), true);
EXPECT_EQ(G2.isWeighted(), true);
ASSERT_EQ(G2.numberOfEdges(), G.numberOfEdges());
ASSERT_EQ(G2.numberOfNodes(), G.numberOfNodes());
G.forNodes([&](node u){
G.forEdgesOf(u, [&](node v) {
ASSERT_TRUE(G2.hasEdge(u,v));
ASSERT_EQ(G.weight(u,v), G2.weight(u,v));
});
});
}
Expand All @@ -845,6 +850,8 @@ TEST_F(IOGTest, testNetworkitBinaryJazz) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binary_jazz");
EXPECT_EQ(G2.isDirected(), false);
EXPECT_EQ(G2.isWeighted(), false);
ASSERT_EQ(G2.numberOfEdges(), G.numberOfEdges());
ASSERT_EQ(G2.numberOfNodes(), G.numberOfNodes());
G.forNodes([&](node u){
Expand All @@ -855,8 +862,7 @@ TEST_F(IOGTest, testNetworkitBinaryJazz) {
}

TEST_F(IOGTest, testNetworkitBinaryWiki) {
bool directed = true;
SNAPGraphReader reader2(directed);
SNAPGraphReader reader2(true);
Graph G = reader2.read("input/wiki-Vote.txt");
NetworkitBinaryWriter writer;

Expand All @@ -865,6 +871,8 @@ TEST_F(IOGTest, testNetworkitBinaryWiki) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binary_wiki");
EXPECT_EQ(G2.isDirected(), true);
EXPECT_EQ(G2.isWeighted(), false);
ASSERT_EQ(G2.numberOfEdges(), G.numberOfEdges());
ASSERT_EQ(G2.numberOfNodes(), G.numberOfNodes());
G.forNodes([&](node u){
Expand All @@ -887,6 +895,8 @@ TEST_F(IOGTest, testNetworkitBinarySignedWeights) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binarySigned");
EXPECT_EQ(G2.isDirected(), false);
EXPECT_EQ(G2.isWeighted(), true);
G.forNodes([&](node u){
G.forEdgesOf(u, [&](node v) {
ASSERT_TRUE(G2.hasEdge(u,v));
Expand All @@ -908,6 +918,8 @@ TEST_F(IOGTest, testNetworkitBinaryFloatWeights) {

NetworkitBinaryReader reader;
Graph G2 = reader.read("output/binaryFloats");
EXPECT_EQ(G2.isDirected(), false);
EXPECT_EQ(G2.isWeighted(), true);
G.forNodes([&](node u){
G.forEdgesOf(u, [&](node v) {
ASSERT_TRUE(G2.hasEdge(u,v));
Expand All @@ -928,6 +940,8 @@ TEST_F(IOGTest, testNetworkitBinaryUndirectedSelfLoops) {
writer.write(G, "output/loops");
NetworkitBinaryReader reader;
Graph G2 = reader.read("output/loops");
EXPECT_EQ(G2.isDirected(), false);
EXPECT_EQ(G2.isWeighted(), false);
ASSERT_EQ(G.numberOfSelfLoops(), G2.numberOfSelfLoops());
}

Expand All @@ -943,6 +957,8 @@ TEST_F(IOGTest, testNetworkitBinaryDirectedSelfLoops) {
writer.write(G, "output/loops");
NetworkitBinaryReader reader;
Graph G2 = reader.read("output/loops");
EXPECT_EQ(G2.isDirected(), true);
EXPECT_EQ(G2.isWeighted(), false);
ASSERT_EQ(G.numberOfSelfLoops(), G2.numberOfSelfLoops());
}

Expand Down

0 comments on commit 53a6932

Please sign in to comment.