12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879(**************************************************************************)(* This file is part of BINSEC. *)(* *)(* Copyright (C) 2016-2024 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It 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. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)openTypesmoduleDfs:WORKLIST=structtype'at='alistletempty=[]letis_empty=function[]->true|_->falseletpushew=e::wletsingletone=[e]letpop=functione::w->(e,w)|[]->raiseNot_foundletlength=List.lengthendmoduleBfs:WORKLIST=structtype'at='aSequence.tletlength=Sequence.lengthletis_emptyq=Sequence.lengthq=0letempty=Sequence.emptyletpushpq=Sequence.push_backpqletpopq=matchSequence.peek_frontqwith|None->raiseNot_found|Somev->(matchSequence.pop_frontqwith|None->assertfalse|Someseq->(v,seq))letsingletonp=pushpemptyendmoduleNurs:WORKLIST=struct(* This is actually a fairly classical heap.
The priority added to the date is just generated at random.
*)moduleI=Basic_types.Int.Maptype'at='aI.tletrecgen_priorityt=letp=Utils.random_max_int()inifI.memptthengen_prioritytelsepletlength=I.cardinalletis_empty=I.is_emptyletempty=I.emptyletpushet=letp=gen_prioritytinI.addpetletpopt=let(_,e),t'=I.poptin(e,t')letsingletonp=pushpemptyend