mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
add CCGraph.is_dag
This commit is contained in:
parent
3190278d86
commit
e08fc88e13
2 changed files with 24 additions and 0 deletions
|
|
@ -43,6 +43,10 @@ module Seq = struct
|
|||
a (fun x -> acc := f !acc x);
|
||||
!acc
|
||||
let to_list seq = fold (fun acc x->x::acc) [] seq |> List.rev
|
||||
exception Exit_
|
||||
let exists_ f seq =
|
||||
try seq (fun x -> if f x then raise Exit_); false
|
||||
with Exit_ -> true
|
||||
end
|
||||
|
||||
(** {2 Interfaces for graphs} *)
|
||||
|
|
@ -315,6 +319,15 @@ module Traverse = struct
|
|||
end
|
||||
end
|
||||
|
||||
(** {2 Cycles} *)
|
||||
|
||||
let is_dag ?(tbl=mk_table 128) ~graph vs =
|
||||
Traverse.Event.dfs ~tbl ~graph vs
|
||||
|> Seq.exists_
|
||||
(function
|
||||
| `Edge (_, `Back) -> true
|
||||
| _ -> false)
|
||||
|
||||
(** {2 Topological Sort} *)
|
||||
|
||||
exception Has_cycle
|
||||
|
|
|
|||
|
|
@ -224,6 +224,17 @@ module Traverse : sig
|
|||
end
|
||||
end
|
||||
|
||||
(** {2 Cycles} *)
|
||||
|
||||
val is_dag :
|
||||
?tbl:'v set ->
|
||||
graph:('v, _) t ->
|
||||
'v sequence ->
|
||||
bool
|
||||
(** [is_dag ~graph vs] returns [true] if the subset of [graph] reachable
|
||||
from [vs] is acyclic.
|
||||
@since NEXT_RELEASE *)
|
||||
|
||||
(** {2 Topological Sort} *)
|
||||
|
||||
exception Has_cycle
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue