Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file pds_reachability_structure.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520(**
This module defines a data structure used in a PDS reachability analysis.
*)openBatteries;;openJhupllib;;openPds_reachability_utils;;(**
The type of the module which defines the data structure used within the
analysis.
*)moduletypeStructure=sig(** The decorated stack element type used by the PDS. *)moduleStack_element:Decorated_type(** The decorated node type in the reachability structure. *)moduleNode:Decorated_type(** The decorated edge type in the reachability structure. *)moduleEdge:Decorated_type(** The decorated type of targeted dynamic pop actions in this structure. *)moduleTargeted_dynamic_pop_action:Decorated_type(** The decorated type of untargeted dynamic pop actions in this structure. *)moduleUntargeted_dynamic_pop_action:Decorated_type(** The type of the PDS reachability data structure. *)includeDecorated_type(**
Produces a Yojson structure representing the contents of a latter analysis
which do not appear in the former.
*)valto_yojson_delta:t->t->Yojson.Safe.t(** The empty PDS reachability structure. *)valempty:t(** Adds an edge to a reachability structure. *)valadd_edge:Edge.t->t->t(** Determines if a structure has a particular edge. *)valhas_edge:Edge.t->t->bool(** Adds an untargeted dynamic pop action to a reachability structure. *)valadd_untargeted_dynamic_pop_action:Node.t->Untargeted_dynamic_pop_action.t->t->t(** Determines if a given untargeted dynamic pop action is present in a
reachability structure. *)valhas_untargeted_dynamic_pop_action:Node.t->Untargeted_dynamic_pop_action.t->t->bool(** {6 Query functions.} *)valfind_push_edges_by_source:Node.t->t->(Node.t*Stack_element.t)Enum.tvalfind_pop_edges_by_source:Node.t->t->(Node.t*Stack_element.t)Enum.tvalfind_nop_edges_by_source:Node.t->t->Node.tEnum.tvalfind_targeted_dynamic_pop_edges_by_source:Node.t->t->(Node.t*Targeted_dynamic_pop_action.t)Enum.tvalfind_untargeted_dynamic_pop_actions_by_source:Node.t->t->Untargeted_dynamic_pop_action.tEnum.tvalfind_push_edges_by_target:Node.t->t->(Node.t*Stack_element.t)Enum.tvalfind_pop_edges_by_target:Node.t->t->(Node.t*Stack_element.t)Enum.tvalfind_nop_edges_by_target:Node.t->t->Node.tEnum.tvalenumerate_nodes:t->Node.tEnum.tvalenumerate_edges:t->Edge.tEnum.t(** {6 Submodules.} *)moduleNode_set:Set.Swithtypeelt=Node.tend;;moduleMake(Basis:Pds_reachability_basis.Basis)(Dph:Pds_reachability_types_stack.Dynamic_pop_handlerwithmoduleStack_element=Basis.Stack_elementandmoduleState=Basis.State)(Types:Pds_reachability_types.TypeswithmoduleState=Basis.StateandmoduleStack_element=Basis.Stack_elementandmoduleTargeted_dynamic_pop_action=Dph.Targeted_dynamic_pop_actionandmoduleUntargeted_dynamic_pop_action=Dph.Untargeted_dynamic_pop_action):StructurewithmoduleStack_element=Basis.Stack_elementandmoduleEdge=Types.EdgeandmoduleNode=Types.NodeandmoduleTargeted_dynamic_pop_action=Types.Targeted_dynamic_pop_actionandmoduleUntargeted_dynamic_pop_action=Types.Untargeted_dynamic_pop_action=structmoduleState=Basis.State;;moduleStack_element=Basis.Stack_element;;moduleEdge=Types.Edge;;moduleNode=Types.Node;;moduleTargeted_dynamic_pop_action=Types.Targeted_dynamic_pop_actionmoduleUntargeted_dynamic_pop_action=Types.Untargeted_dynamic_pop_action;;openTypes;;openTypes.Stack_action.T;;(********** Simple internal data structures. **********)typenode_and_stack_element=Node.t*Stack_element.t[@@derivingeq,ord,show,to_yojson];;typenode_and_targeted_dynamic_pop_action=Node.t*Targeted_dynamic_pop_action.t[@@derivingeq,ord,show,to_yojson];;(********** Substructure definitions. **********)moduleNode_set=Set.Make(Node);;moduleNode_and_stack_element=structtypet=node_and_stack_element;;letequal=equal_node_and_stack_element;;letcompare=compare_node_and_stack_element;;letpp=pp_node_and_stack_element;;letshow=show_node_and_stack_element;;letto_yojson=node_and_stack_element_to_yojson;;end;;moduleNode_and_targeted_dynamic_pop_action=structtypet=node_and_targeted_dynamic_pop_action;;letequal=equal_node_and_targeted_dynamic_pop_action;;letcompare=compare_node_and_targeted_dynamic_pop_action;;letpp=pp_node_and_targeted_dynamic_pop_action;;letshow=show_node_and_targeted_dynamic_pop_action;;letto_yojson=node_and_targeted_dynamic_pop_action_to_yojson;;end;;moduleMake_nice_multimap(K:Decorated_type)(V:Decorated_type)=structmoduleImpl=Multimap.Make(K)(V);;includeImpl;;includeMultimap_pp.Make(Impl)(K)(V);;includeMultimap_to_yojson.Make(Impl)(K)(V);;end;;moduleNode_to_node_and_stack_element_multimap=Make_nice_multimap(Node)(Node_and_stack_element);;moduleNode_and_stack_element_to_node_multimap=Make_nice_multimap(Node_and_stack_element)(Node);;moduleNode_to_node_and_targeted_dynamic_pop_action_multimap=Make_nice_multimap(Node)(Node_and_targeted_dynamic_pop_action);;moduleNode_to_untargeted_dynamic_pop_action_multimap=Make_nice_multimap(Node)(Untargeted_dynamic_pop_action);;moduleNode_and_targeted_dynamic_pop_action_to_node_multimap=Make_nice_multimap(Node_and_targeted_dynamic_pop_action)(Node);;moduleNode_to_node_multimap=Make_nice_multimap(Node)(Node);;(********** The data structure itself. **********)(** The type of the PDS reachability graph data structure. *)typet={push_edges_by_source:Node_to_node_and_stack_element_multimap.t;pop_edges_by_source:Node_to_node_and_stack_element_multimap.t;nop_edges_by_source:Node_to_node_multimap.t;targeted_dynamic_pop_edges_by_source:Node_to_node_and_targeted_dynamic_pop_action_multimap.t;untargeted_dynamic_pop_actions_by_source:Node_to_untargeted_dynamic_pop_action_multimap.t;push_edges_by_target:Node_to_node_and_stack_element_multimap.t;pop_edges_by_target:Node_to_node_and_stack_element_multimap.t;nop_edges_by_target:Node_to_node_multimap.t;push_edges_by_source_and_element:Node_and_stack_element_to_node_multimap.t;pop_edges_by_source_and_element:Node_and_stack_element_to_node_multimap.t}[@@derivingshow];;letcomparexy=letc1=Node_to_node_and_stack_element_multimap.comparex.push_edges_by_sourcey.push_edges_by_sourceinifc1<>0thenc1elseletc2=Node_to_node_and_stack_element_multimap.comparex.pop_edges_by_sourcey.pop_edges_by_sourceinifc2<>0thenc2elseletc3=Node_to_node_multimap.comparex.nop_edges_by_sourcey.nop_edges_by_sourceinifc3<>0thenc3elseletc4=Node_to_node_and_targeted_dynamic_pop_action_multimap.comparex.targeted_dynamic_pop_edges_by_sourcey.targeted_dynamic_pop_edges_by_sourceinifc4<>0thenc4elseletc5=Node_to_untargeted_dynamic_pop_action_multimap.comparex.untargeted_dynamic_pop_actions_by_sourcey.untargeted_dynamic_pop_actions_by_sourceinifc5<>0thenc5else0;;letequalxy=comparexy==0;;letto_yojsonx=`Assoc[("push_edges_by_source",Node_to_node_and_stack_element_multimap.to_yojsonx.push_edges_by_source);("pop_edges_by_source",Node_to_node_and_stack_element_multimap.to_yojsonx.pop_edges_by_source);("nop_edges_by_source",Node_to_node_multimap.to_yojsonx.nop_edges_by_source);("targeted_dynamic_pop_edges_by_source",Node_to_node_and_targeted_dynamic_pop_action_multimap.to_yojsonx.targeted_dynamic_pop_edges_by_source);("untargeted_dynamic_pop_actions_by_source",Node_to_untargeted_dynamic_pop_action_multimap.to_yojsonx.untargeted_dynamic_pop_actions_by_source)];;letto_yojson_deltaxy=letmultimap_deltaenumof_enummemxy=y|>enum|>Enum.filter(fun(k,v)->not@@memkvx)|>of_enumin`Assoc(List.filter(fun(_,v)->matchvwith|`Listn->not@@List.is_emptyn|_->true)[("push_edges_by_source",Node_to_node_and_stack_element_multimap.to_yojson@@multimap_deltaNode_to_node_and_stack_element_multimap.enumNode_to_node_and_stack_element_multimap.of_enumNode_to_node_and_stack_element_multimap.memx.push_edges_by_sourcey.push_edges_by_source);("pop_edges_by_source",Node_to_node_and_stack_element_multimap.to_yojson@@multimap_deltaNode_to_node_and_stack_element_multimap.enumNode_to_node_and_stack_element_multimap.of_enumNode_to_node_and_stack_element_multimap.memx.pop_edges_by_sourcey.pop_edges_by_source);("nop_edges_by_source",Node_to_node_multimap.to_yojson@@multimap_deltaNode_to_node_multimap.enumNode_to_node_multimap.of_enumNode_to_node_multimap.memx.nop_edges_by_sourcey.nop_edges_by_source);("targeted_dynamic_pop_edges_by_source",Node_to_node_and_targeted_dynamic_pop_action_multimap.to_yojson@@multimap_deltaNode_to_node_and_targeted_dynamic_pop_action_multimap.enumNode_to_node_and_targeted_dynamic_pop_action_multimap.of_enumNode_to_node_and_targeted_dynamic_pop_action_multimap.memx.targeted_dynamic_pop_edges_by_sourcey.targeted_dynamic_pop_edges_by_source);("untargeted_dynamic_pop_actions_by_source",Node_to_untargeted_dynamic_pop_action_multimap.to_yojson@@multimap_deltaNode_to_untargeted_dynamic_pop_action_multimap.enumNode_to_untargeted_dynamic_pop_action_multimap.of_enumNode_to_untargeted_dynamic_pop_action_multimap.memx.untargeted_dynamic_pop_actions_by_sourcey.untargeted_dynamic_pop_actions_by_source)]);;letempty={push_edges_by_source=Node_to_node_and_stack_element_multimap.empty;pop_edges_by_source=Node_to_node_and_stack_element_multimap.empty;nop_edges_by_source=Node_to_node_multimap.empty;targeted_dynamic_pop_edges_by_source=Node_to_node_and_targeted_dynamic_pop_action_multimap.empty;untargeted_dynamic_pop_actions_by_source=Node_to_untargeted_dynamic_pop_action_multimap.empty;push_edges_by_target=Node_to_node_and_stack_element_multimap.empty;pop_edges_by_target=Node_to_node_and_stack_element_multimap.empty;nop_edges_by_target=Node_to_node_multimap.empty;push_edges_by_source_and_element=Node_and_stack_element_to_node_multimap.empty;pop_edges_by_source_and_element=Node_and_stack_element_to_node_multimap.empty};;lethas_edgeedgeanalysis=matchedge.edge_actionwith|Nop->analysis.nop_edges_by_source|>Node_to_node_multimap.memedge.sourceedge.target|Pushelement->analysis.push_edges_by_source_and_element|>Node_and_stack_element_to_node_multimap.mem(edge.source,element)edge.target|Popelement->analysis.pop_edges_by_source_and_element|>Node_and_stack_element_to_node_multimap.mem(edge.source,element)edge.target|Pop_dynamic_targetedaction->analysis.targeted_dynamic_pop_edges_by_source|>Node_to_node_and_targeted_dynamic_pop_action_multimap.memedge.source(edge.target,action);;letadd_edgeedgestructure=matchedge.edge_actionwith|Nop->{structurewithnop_edges_by_source=structure.nop_edges_by_source|>Node_to_node_multimap.addedge.sourceedge.target;nop_edges_by_target=structure.nop_edges_by_target|>Node_to_node_multimap.addedge.targetedge.source}|Pushelement->{structurewithpush_edges_by_source=structure.push_edges_by_source|>Node_to_node_and_stack_element_multimap.addedge.source(edge.target,element);push_edges_by_target=structure.push_edges_by_target|>Node_to_node_and_stack_element_multimap.addedge.target(edge.source,element);push_edges_by_source_and_element=structure.push_edges_by_source_and_element|>Node_and_stack_element_to_node_multimap.add(edge.source,element)edge.target}|Popelement->{structurewithpop_edges_by_source=structure.pop_edges_by_source|>Node_to_node_and_stack_element_multimap.addedge.source(edge.target,element);pop_edges_by_target=structure.pop_edges_by_target|>Node_to_node_and_stack_element_multimap.addedge.target(edge.source,element);pop_edges_by_source_and_element=structure.pop_edges_by_source_and_element|>Node_and_stack_element_to_node_multimap.add(edge.source,element)edge.target}|Pop_dynamic_targetedaction->{structurewithtargeted_dynamic_pop_edges_by_source=structure.targeted_dynamic_pop_edges_by_source|>Node_to_node_and_targeted_dynamic_pop_action_multimap.addedge.source(edge.target,action)};;letadd_untargeted_dynamic_pop_actionsourceactionstructure={structurewithuntargeted_dynamic_pop_actions_by_source=structure.untargeted_dynamic_pop_actions_by_source|>Node_to_untargeted_dynamic_pop_action_multimap.addsourceaction};;lethas_untargeted_dynamic_pop_actionsourceactionstructure=structure.untargeted_dynamic_pop_actions_by_source|>Node_to_untargeted_dynamic_pop_action_multimap.memsourceaction;;letfind_push_edges_by_sourcesourcestructure=Node_to_node_and_stack_element_multimap.findsourcestructure.push_edges_by_source;;letfind_pop_edges_by_sourcesourcestructure=Node_to_node_and_stack_element_multimap.findsourcestructure.pop_edges_by_source;;letfind_nop_edges_by_sourcesourcestructure=Node_to_node_multimap.findsourcestructure.nop_edges_by_source;;letfind_targeted_dynamic_pop_edges_by_sourcesourcestructure=Node_to_node_and_targeted_dynamic_pop_action_multimap.findsourcestructure.targeted_dynamic_pop_edges_by_source;;letfind_untargeted_dynamic_pop_actions_by_sourcesourcestructure=Node_to_untargeted_dynamic_pop_action_multimap.findsourcestructure.untargeted_dynamic_pop_actions_by_source;;letfind_push_edges_by_targettargetstructure=Node_to_node_and_stack_element_multimap.findtargetstructure.push_edges_by_target;;letfind_pop_edges_by_targettargetstructure=Node_to_node_and_stack_element_multimap.findtargetstructure.pop_edges_by_target;;letfind_nop_edges_by_targettargetstructure=Node_to_node_multimap.findtargetstructure.nop_edges_by_target;;letenumerate_nodesstructure=Node_set.enum@@Node_set.of_enum@@Enum.concat@@List.enum[Node_to_node_and_stack_element_multimap.keysstructure.push_edges_by_source;Node_to_node_and_stack_element_multimap.keysstructure.pop_edges_by_source;Node_to_node_multimap.keysstructure.nop_edges_by_source;Node_to_node_and_targeted_dynamic_pop_action_multimap.keysstructure.targeted_dynamic_pop_edges_by_source;Node_to_untargeted_dynamic_pop_action_multimap.keysstructure.untargeted_dynamic_pop_actions_by_source;Node_to_node_and_stack_element_multimap.keysstructure.push_edges_by_target;Node_to_node_and_stack_element_multimap.keysstructure.pop_edges_by_target;Node_to_node_multimap.keysstructure.nop_edges_by_target;Enum.map(fst%snd)(Node_to_node_and_targeted_dynamic_pop_action_multimap.enumstructure.targeted_dynamic_pop_edges_by_source)];;letenumerate_edgesstructure=Enum.concat@@List.enum[Node_to_node_and_stack_element_multimap.enumstructure.push_edges_by_source|>Enum.map(fun(source,(target,element))->{source=source;target=target;edge_action=Pushelement});Node_to_node_and_stack_element_multimap.enumstructure.pop_edges_by_source|>Enum.map(fun(source,(target,element))->{source=source;target=target;edge_action=Popelement});Node_to_node_multimap.enumstructure.nop_edges_by_source|>Enum.map(fun(source,target)->{source=source;target=target;edge_action=Nop});Node_to_node_and_targeted_dynamic_pop_action_multimap.enumstructure.targeted_dynamic_pop_edges_by_source|>Enum.map(fun(source,(target,dynamic_pop))->{source=source;target=target;edge_action=Pop_dynamic_targeteddynamic_pop})];;end;;