Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file persistent.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331(**************************************************************************)(* *)(* Ocamlgraph: a generic graph library for OCaml *)(* Copyright (C) 2004-2010 *)(* Sylvain Conchon, Jean-Christophe Filliatre and Julien Signoles *)(* *)(* This software is free software; you can redistribute it and/or *)(* modify it under the terms of the GNU Library General Public *)(* License version 2.1, with the special exception on linking *)(* described in file LICENSE. *)(* *)(* This software is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *)(* *)(**************************************************************************)openSigopenBlocksmoduletypeS=sig(** Persistent Unlabeled Graphs *)moduleConcrete(V:COMPARABLE):Sig.PwithtypeV.t=V.tandtypeV.label=V.tandtypeE.t=V.t*V.tandtypeE.label=unit(** Abstract Persistent Unlabeled Graphs *)moduleAbstract(V:sigtypetend):Sig.PwithtypeV.label=V.tandtypeE.label=unit(** Persistent Labeled Graphs *)moduleConcreteLabeled(V:COMPARABLE)(E:ORDERED_TYPE_DFT):Sig.PwithtypeV.t=V.tandtypeV.label=V.tandtypeE.t=V.t*E.t*V.tandtypeE.label=E.t(** Abstract Persistent Labeled Graphs *)moduleAbstractLabeled(V:sigtypetend)(E:ORDERED_TYPE_DFT):Sig.PwithtypeV.label=V.tandtypeE.label=E.tendmoduleP=Make(Make_Map)type'aabstract_vertex={tag:int;label:'a}(* Vertex for the abstract persistent graphs. *)moduleAbstractVertex(V:sigtypetend)=structtypelabel=V.ttypet=labelabstract_vertexletcomparexy=Stdlib.comparex.tagy.taglethashx=x.tagletequalxy=x.tag=y.tagletlabelx=x.labelletcreatel=if!cpt_vertex=first_value_for_cpt_vertex-1theninvalid_arg"Too much vertices";incrcpt_vertex;{tag=!cpt_vertex;label=l}endmoduleDigraph=structmoduleConcrete(V:COMPARABLE)=structincludeP.Digraph.Concrete(V)letremove_vertexgv=ifHM.memvgthenletg=HM.removevginHM.fold(funks->HM.addk(S.removevs))gemptyelsegendmoduleConcreteLabeled(V:COMPARABLE)(E:ORDERED_TYPE_DFT)=structincludeP.Digraph.ConcreteLabeled(V)(E)letremove_vertexgv=ifHM.memvgthenletg=HM.removevginletremovev=S.filter(fun(v2,_)->not(V.equalvv2))inHM.fold(funks->HM.addk(removevs))gemptyelsegendmoduleConcreteBidirectional(V:COMPARABLE)=structincludeP.Digraph.ConcreteBidirectional(V)letremove_vertexgv=ifHM.memvgthenletremovev=S.filter(funv'->not(V.equalvv'))inletg=fold_pred(funv'acc->letin_set,out_set=HM.findv'accinHM.addv'(in_set,removevout_set)acc)gvginletg=fold_succ(funv'acc->letin_set,out_set=HM.findv'accinHM.addv'(removevin_set,out_set)acc)gvginHM.removevgelsegendmoduleConcreteBidirectionalLabeled(V:COMPARABLE)(E:ORDERED_TYPE_DFT)=structincludeP.Digraph.ConcreteBidirectionalLabeled(V)(E)letremove_vertex(g:t)(v:vertex)=ifHM.memvgthenletremovev=S.filter(fun(v',_)->not(V.equalvv'))inletg=fold_pred(funv'acc->letin_set,out_set=HM.findv'accinHM.addv'(in_set,removevout_set)acc)gvginletg=fold_succ(funv'acc->letin_set,out_set=HM.findv'accinHM.addv'(removevin_set,out_set)acc)gvginHM.removevgelsegendmoduleAbstract(V:sigtypetend)=structincludeP.Digraph.Abstract(AbstractVertex(V))letempty={edges=G.empty;size=0}letadd_vertexgv=ifmem_vertexgvthengelse{edges=G.unsafe_add_vertexg.edgesv;size=Stdlib.succg.size}letadd_edgegv1v2=letg=add_vertexgv1inletg=add_vertexgv2in{gwithedges=G.unsafe_add_edgeg.edgesv1v2}letadd_edge_eg(v1,v2)=add_edgegv1v2letremove_vertexgv=ifHM.memvg.edgesthenlete=HM.removevg.edgesinlete=HM.fold(funksg->HM.addk(S.removevs)g)eHM.emptyin{edges=e;size=Stdlib.predg.size}elsegletremove_edgegv1v2={gwithedges=remove_edgegv1v2}letremove_edge_ege={gwithedges=remove_edge_ege}endmoduleAbstractLabeled(V:sigtypetend)(Edge:ORDERED_TYPE_DFT)=structincludeP.Digraph.AbstractLabeled(AbstractVertex(V))(Edge)letempty={edges=G.empty;size=0}letadd_vertexgv=ifmem_vertexgvthengelse{edges=G.unsafe_add_vertexg.edgesv;size=Stdlib.succg.size}letadd_edge_eg(v1,l,v2)=letg=add_vertexgv1inletg=add_vertexgv2in{gwithedges=G.unsafe_add_edgeg.edgesv1(v2,l)}letadd_edgegv1v2=add_edge_eg(v1,Edge.default,v2)letremove_vertexgv=ifHM.memvg.edgesthenletremovevs=S.fold(fun(v2,_ase)s->ifnot(V.equalvv2)thenS.addeselses)sS.emptyinletedges=HM.removevg.edgesin{edges=HM.fold(funksg->HM.addk(removevs)g)edgesHM.empty;size=Stdlib.predg.size}elsegletremove_edgegv1v2={gwithedges=remove_edgegv1v2}letremove_edge_ege={gwithedges=remove_edge_ege}endendmoduleGraph=structmoduleConcrete(V:COMPARABLE)=structmoduleG=structincludeDigraph.Concrete(V)typereturn=tendincludeBlocks.Graph(G)(* Export some definitions of [G] *)letempty=G.empty(* Redefine the [add_edge] and [remove_edge] operations *)letadd_edgegv1v2=letg=G.add_edgegv1v2inassert(G.HM.memv1g&&G.HM.memv2g);G.unsafe_add_edgegv2v1letadd_edge_eg(v1,v2)=add_edgegv1v2letremove_edgegv1v2=letg=G.remove_edgegv1v2inassert(G.HM.memv1g&&G.HM.memv2g);G.unsafe_remove_edgegv2v1letremove_edge_eg(v1,v2)=remove_edgegv1v2endmoduleConcreteLabeled(V:COMPARABLE)(Edge:ORDERED_TYPE_DFT)=structmoduleG=structincludeDigraph.ConcreteLabeled(V)(Edge)typereturn=tendincludeBlocks.Graph(G)(* Export some definitions of [G] *)letempty=G.empty(* Redefine the [add_edge] and [remove_edge] operations *)letadd_edge_eg(v1,l,v2ase)=letg=G.add_edge_egeinassert(G.HM.memv1g&&G.HM.memv2g);G.unsafe_add_edgegv2(v1,l)letadd_edgegv1v2=add_edge_eg(v1,Edge.default,v2)letremove_edgegv1v2=letg=G.remove_edgegv1v2inassert(G.HM.memv1g&&G.HM.memv2g);G.unsafe_remove_edgegv2v1letremove_edge_eg(v1,l,v2ase)=letg=G.remove_edge_egeinassert(G.HM.memv1g&&G.HM.memv2g);G.unsafe_remove_edge_eg(v2,l,v1)endmoduleAbstract(V:sigtypetend)=structmoduleG=structincludeDigraph.Abstract(V)typereturn=tendincludeBlocks.Graph(G)(* Export some definitions of [G] *)letempty=G.empty(* Redefine the [add_edge] and [remove_edge] operations *)letadd_edgegv1v2=letg=G.add_edgegv1v2inassert(G.HM.memv1g.G.edges&&G.HM.memv2g.G.edges);{gwithG.edges=G.unsafe_add_edgeg.G.edgesv2v1}letadd_edge_eg(v1,v2)=add_edgegv1v2letremove_edgegv1v2=letg=G.remove_edgegv1v2inassert(G.HM.memv1g.G.edges&&G.HM.memv2g.G.edges);{gwithG.edges=G.unsafe_remove_edgeg.G.edgesv2v1}letremove_edge_eg(v1,v2)=remove_edgegv1v2endmoduleAbstractLabeled(V:sigtypetend)(Edge:ORDERED_TYPE_DFT)=structmoduleG=structincludeDigraph.AbstractLabeled(V)(Edge)typereturn=tendincludeBlocks.Graph(G)(* Export some definitions of [G] *)letempty=G.empty(* Redefine the [add_edge] and [remove_edge] operations *)letadd_edge_eg(v1,l,v2ase)=letg=G.add_edge_egeinassert(G.HM.memv1g.G.edges&&G.HM.memv2g.G.edges);{gwithG.edges=G.unsafe_add_edgeg.G.edgesv2(v1,l)}letadd_edgegv1v2=add_edge_eg(v1,Edge.default,v2)letremove_edgegv1v2=letg=G.remove_edgegv1v2inassert(G.HM.memv1g.G.edges&&G.HM.memv2g.G.edges);{gwithG.edges=G.unsafe_remove_edgeg.G.edgesv2v1}letremove_edge_eg(v1,l,v2ase)=letg=G.remove_edge_egeinassert(G.HM.memv1g.G.edges&&G.HM.memv2g.G.edges);{gwithG.edges=G.unsafe_remove_edge_eg.G.edges(v2,l,v1)}endend(*
Local Variables:
compile-command: "make -C .."
End:
*)