1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)moduleMake(G:sigincludeGraph.Sig.Gvalcreate:?size:int->unit->tvaladd_edge_e:t->E.t->unitend)(D:Datatype.Swithtypet=G.t)(Info:sigvalself:State.tvalname:stringvalget:unit->G.tvalvertex:Kernel_function.t->G.V.tend)=structmoduleS=State_builder.Option_ref(Datatype.Option(D))(* none if no root is specified *)(structletname="Subgraph of "^Info.nameletdependencies=[Info.self;Options.Roots.self]end)letself=S.selfletcompute=letmoduleHNodes=Hashtbl.Make(G.V)infun()->letg=Info.get()inletroots=Options.Roots.get()inifKernel_function.Set.is_emptyrootsthenNoneelseletsubg=G.create()inletvisited=HNodes.create17inletrecadd_componentv=(* iter over the connected component of [v] for adding every edge to
the subgraph *)ifnot(HNodes.memvisitedv)thenbeginHNodes.addvisitedv();G.iter_succ_e(fune->G.add_edge_esubge;add_component(G.E.dste))gvendinKernel_function.Set.iter(funkf->add_component(Info.vertexkf))roots;Somesubgletget()=matchS.memocomputewith|None->Info.get()(* when no root is specified, use the whole graph *)|Someg->gend