1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889(**************************************************************************)(* This file is part of BINSEC. *)(* *)(* Copyright (C) 2016-2022 *)(* 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