load("@rules_cc//cc:defs.bzl", "cc_proto_library")

package(default_visibility = ["//visibility:public"])

cc_library(
    name = "graph",
    hdrs = ["graph.h"],
    deps = [
        ":iterators",
        "//ortools/base",
        "@com_google_absl//absl/debugging:leak_check",
    ],
)

cc_library(
    name = "graphs",
    hdrs = ["graphs.h"],
    deps = [
        ":ebert_graph",
        ":graph",
    ],
)

cc_library(
    name = "util",
    srcs = ["util.cc"],
    hdrs = ["util.h"],
    deps = [
        ":connected_components",
        ":graph",
        "//ortools/base:hash",
        "//ortools/base:map_util",
        "@com_google_absl//absl/container:inlined_vector",
    ],
)

cc_library(
    name = "iterators",
    hdrs = ["iterators.h"],
)

cc_library(
    name = "io",
    hdrs = ["io.h"],
    deps = [
        ":graph",
        "//ortools/base:filelineiter",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
    ],
)

#cc_library(
#    name = "digraph",
#    srcs = ["digraph.cc"],
#    hdrs = ["digraph.h"],
#    deps = [
#        "//ortools/base",
#        "//ortools/base:int_type",
#        "//ortools/base:strong_vector",
#    ],
#)

#proto_library(
#    name = "paths_proto",
#    srcs = ["paths.proto"],
#)

#cc_proto_library(
#    name = "paths_cc_proto",
#    deps = [":paths_proto"],
#)

cc_library(
    name = "shortestpaths",
    srcs = [
        "bellman_ford.cc",
        "dijkstra.cc",
        "shortestpaths.cc",
    ],
    hdrs = ["shortestpaths.h"],
    deps = [
        ":graph",
        #        ":paths_cc_proto",
        "//ortools/base",
        "//ortools/base:adjustable_priority_queue",
        "//ortools/base:file",
        "//ortools/base:hash",
        "//ortools/base:int_type",
        #        "//ortools/base:strong_bitmap",
        "//ortools/base:strong_vector",
        "//ortools/base:recordio",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/container:flat_hash_set",
        "@com_google_absl//absl/strings",
        #        "//ortools/thread",
        #        "//ortools/util/coding:prefixvarint",
    ],
)

#cc_library(
#    name = "arc_dijkstra",
#    hdrs = ["arc_dijkstra.h"],
#    deps = [
#        "//ortools/base",
#        "//ortools/base:iterator_adaptors",
#    ],
#)

#cc_library(
#    name = "bounded_dijkstra",
#    hdrs = ["bounded_dijkstra.h"],
#    deps = [
#        "//ortools/base",
#        "//ortools/base:iterator_adaptors",
#        "//ortools/thread",
#    ],
#)

#cc_library(
#    name = "bidirectional_dijkstra",
#    hdrs = ["bidirectional_dijkstra.h"],
#    deps = [
#        "//ortools/base",
#        "//ortools/base:iterator_adaptors",
#        "@com_google_absl//absl/strings",
#        "//ortools/thread",
#    ],
#)

cc_library(
    name = "cliques",
    srcs = ["cliques.cc"],
    hdrs = ["cliques.h"],
    deps = [
        "//ortools/base",
        "//ortools/base:hash",
        "//ortools/base:int_type",
        "//ortools/base:strong_vector",
        "//ortools/util:time_limit",
        "@com_google_absl//absl/container:flat_hash_set",
        "@com_google_absl//absl/strings",
    ],
)

cc_library(
    name = "hamiltonian_path",
    hdrs = ["hamiltonian_path.h"],
    deps = [
        "//ortools/base",
        "//ortools/util:bitset",
        "//ortools/util:saturated_arithmetic",
        "//ortools/util:vector_or_function",
    ],
)

cc_library(
    name = "christofides",
    hdrs = ["christofides.h"],
    deps = [
        ":eulerian_path",
        ":minimum_spanning_tree",
        ":perfect_matching",
        "//ortools/base",
        "//ortools/linear_solver",
        "//ortools/linear_solver:linear_solver_cc_proto",
    ],
)

cc_library(
    name = "eulerian_path",
    hdrs = ["eulerian_path.h"],
    deps = [
        "//ortools/base",
    ],
)

cc_library(
    name = "minimum_spanning_tree",
    hdrs = ["minimum_spanning_tree.h"],
    deps = [
        ":connected_components",
        ":graph",
        "//ortools/base",
        "//ortools/base:adjustable_priority_queue",
        "//ortools/util:vector_or_function",
    ],
)

cc_library(
    name = "one_tree_lower_bound",
    hdrs = ["one_tree_lower_bound.h"],
    deps = [
        ":christofides",
        ":minimum_spanning_tree",
        "//ortools/base",
        "@com_google_absl//absl/strings",
    ],
)

cc_library(
    name = "ebert_graph",
    hdrs = ["ebert_graph.h"],
    deps = [
        "//ortools/base",
        #        "//ortools/testing/production_stub/public:gunit_prod",
        "//ortools/util:permutation",
        "//ortools/util:zvector",
    ],
)

#cc_library(
#    name = "shortest_paths",
#    srcs = ["shortest_paths.cc"],
#    hdrs = ["shortest_paths.h"],
#    deps = [
#        ":ebert_graph",
#        ":graph",
#        "//ortools/base",
#        "//ortools/base:adjustable_priority_queue",
#        "//ortools/base:file",
#        "//ortools/base:map_util",
#        "//ortools/base:stl_util",
#        "//ortools/thread",
#        "//ortools/util:zvector",
#    ],
#)

cc_library(
    name = "perfect_matching",
    srcs = ["perfect_matching.cc"],
    hdrs = ["perfect_matching.h"],
    visibility = ["//visibility:public"],
    deps = [
        "//ortools/base",
        "//ortools/base:adjustable_priority_queue",
        "//ortools/base:int_type",
        "//ortools/base:strong_vector",
        "//ortools/util:saturated_arithmetic",
        "@com_google_absl//absl/base",
        "@com_google_absl//absl/strings",
    ],
)

proto_library(
    name = "flow_problem_proto",
    srcs = ["flow_problem.proto"],
)

cc_proto_library(
    name = "flow_problem_cc_proto",
    deps = [":flow_problem_proto"],
)

cc_library(
    name = "max_flow",
    srcs = ["max_flow.cc"],
    hdrs = ["max_flow.h"],
    deps = [
        ":ebert_graph",
        ":flow_problem_cc_proto",
        ":graph",
        ":graphs",
        "//ortools/base",
        "//ortools/util:stats",
        "//ortools/util:zvector",
        "@com_google_absl//absl/memory",
    ],
)

cc_library(
    name = "min_cost_flow",
    srcs = ["min_cost_flow.cc"],
    hdrs = ["min_cost_flow.h"],
    deps = [
        ":connected_components",
        ":ebert_graph",
        ":graph",
        ":graphs",
        ":max_flow",
        "//ortools/base",
        "//ortools/base:mathutil",
        "//ortools/util:stats",
        "//ortools/util:zvector",
    ],
)

cc_library(
    name = "assignment",
    srcs = ["assignment.cc"],
    hdrs = ["assignment.h"],
    deps = [
        ":ebert_graph",
        ":linear_assignment",
        "//ortools/base",
    ],
)

cc_library(
    name = "linear_assignment",
    srcs = ["linear_assignment.cc"],
    hdrs = ["linear_assignment.h"],
    deps = [
        ":ebert_graph",
        "//ortools/base",
        "//ortools/util:permutation",
        "//ortools/util:zvector",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/strings:str_format",
    ],
)

cc_library(
    name = "connected_components",
    srcs = [
        "connected_components.cc",
    ],
    hdrs = [
        "connected_components.h",
    ],
    deps = [
        "//ortools/base",
        "//ortools/base:map_util",
        "//ortools/base:ptr_util",
        "//ortools/base:stl_util",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/container:flat_hash_set",
    ],
)

cc_library(
    name = "strongly_connected_components",
    hdrs = [
        "strongly_connected_components.h",
    ],
    deps = [
        "//ortools/base",
    ],
)

cc_library(
    name = "topologicalsorter",
    srcs = ["topologicalsorter.cc"],
    hdrs = ["topologicalsorter.h"],
    deps = [
        "//ortools/base",
        "//ortools/base:container_logging",
        "//ortools/base:map_util",
        "//ortools/base:stl_util",
        "@com_google_absl//absl/base:core_headers",
        "@com_google_absl//absl/container:flat_hash_map",
    ],
)

#cc_library(
#    name = "biconnected",
#    srcs = ["biconnected.cc"],
#    hdrs = ["biconnected.h"],
#    deps = [
#        ":ebert_graph",
#        "//ortools/base",
#        "//ortools/util:packed_array",
#    ],
#)

#cc_library(
#    name = "hopcroft_karp",
#    srcs = ["hopcroft_karp.c"],
#    hdrs = ["hopcroft_karp.h"],
#)
