Skip to content

Commit

Permalink
graph: fix some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Mizux committed Sep 20, 2024
1 parent 6a79334 commit c24ea27
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 114 deletions.
11 changes: 8 additions & 3 deletions .bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,15 @@ build --apple_platform_type=macos
# platform.
build --enable_platform_specific_config

build:linux --cxxopt="-std=c++17" --cxxopt=-Wno-sign-compare --host_cxxopt="-std=c++17" --host_cxxopt=-Wno-sign-compare
build:macos --cxxopt="-std=c++17" --cxxopt=-Wno-sign-compare --cxxopt=-mmacos-version-min=10.15 --cxxopt=-Wno-dangling-field --features=-supports_dynamic_linker
build:linux --cxxopt="-std=c++17" --cxxopt=-Wno-sign-compare
build:linux --host_cxxopt="-std=c++17" --host_cxxopt=-Wno-sign-compare

build:macos --features=-supports_dynamic_linker
build:macos --cxxopt="-std=c++17" --cxxopt=-Wno-sign-compare --cxxopt=-mmacos-version-min=10.15 --cxxopt=-Wno-dangling-field
build:macos --host_cxxopt="-std=c++17" --host_cxxopt=-Wno-sign-compare --host_cxxopt=-mmacos-version-min=10.15 --host_cxxopt=-Wno-dangling-field
build:windows --cxxopt="/std:c++20" --host_cxxopt="/std:c++20"

build:windows --cxxopt="/std:c++20"
build:windows --host_cxxopt="/std:c++20"

# Enable the runfiles symlink tree on Windows. This makes it possible to build
# the pip package on Windows without an intermediate data-file archive, as the
Expand Down
16 changes: 16 additions & 0 deletions ortools/base/top_n.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ class TopN {
}
// Peeks the bottom result without calling Extract()
const T& peek_bottom();
// Destructively extract the elements as a vector, sorted in descending order.
// Leaves TopN in an empty state.
std::vector<T> Take();
// Extract the elements as a vector sorted in descending order. The caller
// assumes ownership of the vector and must delete it when done. This is a
// destructive operation. The only method that can be called immediately
Expand Down Expand Up @@ -250,6 +253,19 @@ const T& TopN<T, Cmp>::peek_bottom() {
}
return elements_.front();
}
template <class T, class Cmp>
std::vector<T> TopN<T, Cmp>::Take() {
std::vector<T> out = std::move(elements_);
if (state_ != State::HEAP_SORTED) {
std::sort(out.begin(), out.end(), cmp_);
} else {
out.pop_back();
std::sort_heap(out.begin(), out.end(), cmp_);
}
Reset();
return out;
}

template <class T, class Cmp>
std::vector<T>* TopN<T, Cmp>::Extract() {
auto out = new std::vector<T>;
Expand Down
135 changes: 37 additions & 98 deletions ortools/graph/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -68,32 +68,14 @@ cc_library(
":graph",
"//ortools/base:iterator_adaptors",
"//ortools/base:threadpool",
"//ortools/base:top_n",
"@com_google_absl//absl/algorithm:container",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/types:span",
],
)

cc_test(
name = "bounded_dijkstra_test",
size = "small",
srcs = ["bounded_dijkstra_test.cc"],
deps = [
":bounded_dijkstra",
":graph",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//ortools/util:flat_matrix",
"//ortools/util:saturated_arithmetic",
"//util/graph:io",
"//util/graph:test_util",
"//util/tuple:dump_vars",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/random",
],
)

cc_library(
name = "multi_dijkstra",
hdrs = ["multi_dijkstra.h"],
Expand All @@ -112,14 +94,14 @@ cc_test(
":connected_components",
":graph",
":multi_dijkstra",
":random_graph",
":util",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//ortools/base:map_util",
"//ortools/base:types",
"//util/graph:random_graph",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/container:flat_hash_set",
"@com_google_absl//absl/random:distributions",
],
)

Expand All @@ -145,9 +127,10 @@ cc_test(
":bidirectional_dijkstra",
":bounded_dijkstra",
":graph",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//ortools/base:iterator_adaptors",
"@com_google_absl//absl/base:log_severity",
"@com_google_absl//absl/random:distributions",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/types:span",
],
Expand All @@ -167,24 +150,6 @@ cc_library(
],
)

cc_test(
name = "cliques_test",
size = "medium",
srcs = ["cliques_test.cc"],
deps = [
":cliques",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//ortools/base:mathutil",
"//ortools/util:time_limit",
"//util/functional:to_callback",
"@com_google_absl//absl/container:flat_hash_set",
"@com_google_absl//absl/functional:bind_front",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/types:span",
],
)

cc_library(
name = "hamiltonian_path",
hdrs = ["hamiltonian_path.h"],
Expand All @@ -205,9 +170,9 @@ cc_test(
srcs = ["hamiltonian_path_test.cc"],
deps = [
":hamiltonian_path",
"//absl/random:distributions",
"//ortools/base",
"//ortools/base:gmock_main",
"@com_google_absl//absl/random:distributions",
"@com_google_absl//absl/strings:str_format",
"@com_google_absl//absl/types:span",
],
Expand Down Expand Up @@ -241,6 +206,7 @@ cc_test(
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
"@com_google_absl//absl/types:span",
"@com_google_benchmark//:benchmark",
],
)

Expand All @@ -260,6 +226,7 @@ cc_test(
":graph",
"//ortools/base",
"//ortools/base:gmock_main",
"@com_google_benchmark//:benchmark",
],
)

Expand All @@ -281,11 +248,12 @@ cc_test(
deps = [
":graph",
":minimum_spanning_tree",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//ortools/base:types",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/random:distributions",
"@com_google_absl//absl/types:span",
"@com_google_benchmark//:benchmark",
],
)

Expand All @@ -301,24 +269,6 @@ cc_library(
],
)

cc_test(
name = "one_tree_lower_bound_test",
size = "medium",
srcs = ["one_tree_lower_bound_test.cc"],
data = [
"//operations_research_data/operations_research_data/TSPLIB95:ALL_tsp.tar.gz",
],
deps = [
":one_tree_lower_bound",
"//file/tarfs",
"//ortools/base:gmock_main",
"//ortools/base:path",
"//ortools/base:types",
"//ortools/routing/parsers:tsplib_parser",
"@com_google_absl//absl/types:span",
],
)

cc_library(
name = "ebert_graph",
hdrs = ["ebert_graph.h"],
Expand All @@ -328,6 +278,7 @@ cc_library(
"//ortools/util:permutation",
"//ortools/util:zvector",
"@com_google_absl//absl/strings",
"@com_google_googletest//:gtest_prod",
],
)

Expand All @@ -337,12 +288,13 @@ cc_test(
srcs = ["ebert_graph_test.cc"],
deps = [
":ebert_graph",
"//absl/random:distributions",
"//ortools/base",
"//ortools/base:gmock_main",
"//ortools/util:permutation",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/random:distributions",
"@com_google_absl//absl/strings",
"@com_google_benchmark//:benchmark",
],
)

Expand Down Expand Up @@ -401,21 +353,23 @@ cc_library(
],
)

cc_test(
name = "k_shortest_paths_test",
srcs = ["k_shortest_paths_test.cc"],
deps = [
":graph",
":k_shortest_paths",
":shortest_paths",
"//absl/random:distributions",
"//ortools/base:gmock_main",
"//util/graph:io",
"@com_google_absl//absl/algorithm:container",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/strings",
],
)
# need C++20
#cc_test(
# name = "k_shortest_paths_test",
# srcs = ["k_shortest_paths_test.cc"],
# deps = [
# ":graph",
# ":io",
# ":k_shortest_paths",
# ":shortest_paths",
# "//ortools/base:gmock_main",
# "@com_google_absl//absl/algorithm:container",
# "@com_google_absl//absl/log:check",
# "@com_google_absl//absl/random:distributions",
# "@com_google_absl//absl/strings",
# "@com_google_benchmark//:benchmark",
# ],
#)

# Flow problem protobuf representation
proto_library(
Expand Down Expand Up @@ -499,25 +453,6 @@ cc_library(
],
)

cc_test(
name = "min_cost_flow_test",
size = "medium",
srcs = ["min_cost_flow_test.cc"],
deps = [
":graphs",
":min_cost_flow",
"//ortools/base:gmock_main",
"//absl/random:distributions",
"@com_google_absl//absl/strings:str_format",
"@com_google_absl//absl/types:span",
":graph",
# Using CLP because GLOP is too slow in non-opt mode.
"//ortools/algorithms:binary_search",
"//ortools/linear_solver:linear_solver_clp",
"//ortools/linear_solver",
],
)

# Flow-problem solver
cc_binary(
name = "solve_flow_model",
Expand Down Expand Up @@ -577,6 +512,7 @@ cc_library(
"//ortools/util:zvector",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/strings:str_format",
"@com_google_googletest//:gtest_prod",
],
)

Expand All @@ -588,10 +524,11 @@ cc_test(
":ebert_graph",
":graph",
":linear_assignment",
"//absl/random:distributions",
"//ortools/base",
"//ortools/base:gmock_main",
"@com_google_absl//absl/random:distributions",
"@com_google_absl//absl/types:span",
"@com_google_benchmark//:benchmark",
],
)

Expand Down Expand Up @@ -674,6 +611,7 @@ cc_test(
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/random",
"@com_google_absl//absl/status",
"@com_google_benchmark//:benchmark",
],
)

Expand All @@ -698,15 +636,16 @@ cc_test(
deps = [
":dag_shortest_path",
":graph",
":io",
"//ortools/base:dump_vars",
"//ortools/base:gmock_main",
"//ortools/util:flat_matrix",
"//util/graph:io",
"@com_google_absl//absl/algorithm:container",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/random",
"@com_google_absl//absl/status",
"@com_google_absl//absl/types:span",
"@com_google_benchmark//:benchmark",
],
)

Expand All @@ -717,11 +656,11 @@ cc_test(
":dag_constrained_shortest_path",
":dag_shortest_path",
":graph",
":io",
"//ortools/base:dump_vars",
"//ortools/base:gmock_main",
"//ortools/math_opt/cpp:math_opt",
"//ortools/math_opt/solvers:cp_sat_solver",
"//util/graph:io",
"@com_google_absl//absl/algorithm:container",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/random",
Expand Down
3 changes: 2 additions & 1 deletion ortools/graph/bidirectional_dijkstra_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "absl/types/span.h"
#include "gtest/gtest.h"
#include "ortools/base/gmock.h"
#include "ortools/base/iterator_adaptors.h"
#include "ortools/graph/bounded_dijkstra.h"
#include "ortools/graph/graph.h"

Expand Down Expand Up @@ -202,7 +203,7 @@ TEST(BidirectionalDijkstraTest, RandomizedCorrectnessTest) {
ref_dijkstra.ArcPathToNode(ref_dests[0]);
const auto path = tested_dijkstra.SetToSetShortestPath(srcs, dsts);
std::vector<int> arc_path = path.forward_arc_path;
for (const int arc : gtl::reversed_view(path.backward_arc_path)) {
for (const int arc : ::gtl::reversed_view(path.backward_arc_path)) {
arc_path.push_back(forward_arc_of_backward_arc[arc]);
}
ASSERT_THAT(arc_path, ElementsAreArray(ref_arc_path))
Expand Down
15 changes: 13 additions & 2 deletions ortools/graph/christofides.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

#include <cstdint>
#include <functional>
#include <string>
#include <utility>
#include <vector>

Expand Down Expand Up @@ -84,7 +83,19 @@ class ChristofidesPathSolver {
bool Solve();

private:
int64_t SafeAdd(int64_t a, int64_t b) { return CapAdd(a, b); }
// Safe addition operator to avoid overflows when possible.
template <typename T, typename DUMMY = void>
struct Add {
static T apply(T a, T b) { return a + b; }
};
template <typename DUMMY>
struct Add<int64_t, DUMMY> {
static int64_t apply(int64_t a, int64_t b) { return CapAdd(a, b); }
};
template <typename T>
T SafeAdd(T a, T b) {
return Add<T>::apply(a, b);
}

// Matching algorithm to use.
MatchingAlgorithm matching_;
Expand Down
Loading

0 comments on commit c24ea27

Please sign in to comment.