Index: tools/smaz.adb ================================================================== --- tools/smaz.adb +++ tools/smaz.adb @@ -123,19 +123,10 @@ (Handler : in out Callback; Argument : in String) is null; - procedure Evaluate_Dictionary - (Job_Count : in Natural; - Dict : in Natools.Smaz_256.Dictionary; - Corpus : in Natools.Smaz_Tools.String_Lists.List; - Compressed_Size : out Ada.Streams.Stream_Element_Count; - Counts : out Tools_256.Dictionary_Counts); - -- Dispatch to parallel or non-parallel version of Evaluate_Dictionary - -- depending on Job_Count. - function Getopt_Config return Getopt.Configuration; -- Build the configuration object procedure Optimization_Round (Dict : in out Holders.Holder; @@ -184,10 +175,14 @@ (Handler : in Callback'Class; Input : in Natools.Smaz_Tools.String_Lists.List) return Natools.Smaz_256.Dictionary; -- Convert the input into a dictionary given the option in Handler + procedure Use_Dictionary (Dict : in out Natools.Smaz_256.Dictionary); + -- Update Dictionary.Hash so that it can be actually used + + generic type Dictionary (<>) is private; type Dictionary_Entry is (<>); type String_Count is range <>; @@ -195,18 +190,35 @@ type Dictionary_Counts is array (Dictionary_Entry) of String_Count; with package String_Lists is new Ada.Containers.Indefinite_Doubly_Linked_Lists (String); + with procedure Evaluate_Dictionary + (Dict : in Dictionary; + Corpus : in String_Lists.List; + Compressed_Size : out Ada.Streams.Stream_Element_Count; + Counts : out Dictionary_Counts); + with procedure Evaluate_Dictionary_Partial (Dict : in Dictionary; Corpus_Entry : in String; Compressed_Size : in out Ada.Streams.Stream_Element_Count; Counts : in out Dictionary_Counts); + with procedure Use_Dictionary (Dict : in out Dictionary) is <>; + package Dictionary_Subprograms is + procedure Evaluate_Dictionary + (Job_Count : in Natural; + Dict : in Dictionary; + Corpus : in String_Lists.List; + Compressed_Size : out Ada.Streams.Stream_Element_Count; + Counts : out Dictionary_Counts); + -- Dispatch to parallel or non-parallel version of + -- Evaluate_Dictionary depending on Job_Count. + procedure Parallel_Evaluate_Dictionary (Job_Count : in Positive; Dict : in Dictionary; Corpus : in String_Lists.List; Compressed_Size : out Ada.Streams.Stream_Element_Count; @@ -214,12 +226,34 @@ -- Return the same results as Natools.Smaz.Tools.Evaluate_Dictionary, -- but hopefully more quickly, using Job_Count tasks. end Dictionary_Subprograms; + package body Dictionary_Subprograms is + + procedure Evaluate_Dictionary + (Job_Count : in Natural; + Dict : in Dictionary; + Corpus : in String_Lists.List; + Compressed_Size : out Ada.Streams.Stream_Element_Count; + Counts : out Dictionary_Counts) + is + Actual_Dict : Dictionary := Dict; + begin + Use_Dictionary (Actual_Dict); + + if Job_Count > 0 then + Parallel_Evaluate_Dictionary (Job_Count, + Actual_Dict, Corpus, Compressed_Size, Counts); + else + Evaluate_Dictionary + (Actual_Dict, Corpus, Compressed_Size, Counts); + end if; + end Evaluate_Dictionary; + procedure Parallel_Evaluate_Dictionary (Job_Count : in Positive; Dict : in Dictionary; Corpus : in String_Lists.List; @@ -306,18 +340,21 @@ Parallel_Run (Cursor, Job_Count); end Parallel_Evaluate_Dictionary; end Dictionary_Subprograms; + package Dict_256 is new Dictionary_Subprograms (Dictionary => Natools.Smaz_256.Dictionary, Dictionary_Entry => Ada.Streams.Stream_Element, String_Count => Natools.Smaz_Tools.String_Count, Dictionary_Counts => Tools_256.Dictionary_Counts, String_Lists => Natools.Smaz_Tools.String_Lists, + Evaluate_Dictionary => Tools_256.Evaluate_Dictionary, Evaluate_Dictionary_Partial => Tools_256.Evaluate_Dictionary_Partial); + overriding procedure Option (Handler : in out Callback; Id : in Options.Id; @@ -411,47 +448,10 @@ when Options.No_Vlen_Verbatim => Handler.Vlen_Verbatim := False; end case; end Option; - - procedure Evaluate_Dictionary - (Job_Count : in Natural; - Dict : in Natools.Smaz_256.Dictionary; - Corpus : in Natools.Smaz_Tools.String_Lists.List; - Compressed_Size : out Ada.Streams.Stream_Element_Count; - Counts : out Tools_256.Dictionary_Counts) - is - Actual_Dict : Natools.Smaz_256.Dictionary := Dict; - begin - Natools.Smaz_Tools.Set_Dictionary_For_Trie_Search - (Tools_256.To_String_List (Actual_Dict)); - Actual_Dict.Hash := Natools.Smaz_Tools.Trie_Search'Access; - - for I in Actual_Dict.Offsets'Range loop - if Natools.Smaz_Tools.Trie_Search (Natools.Smaz_256.Dict_Entry - (Actual_Dict, I)) /= Natural (I) - then - Ada.Text_IO.Put_Line - (Ada.Text_IO.Current_Error, - "Fail at" & Ada.Streams.Stream_Element'Image (I) - & " -> " & Natools.String_Escapes.C_Escape_Hex - (Natools.Smaz_256.Dict_Entry (Actual_Dict, I), True) - & " ->" & Natural'Image (Natools.Smaz_Tools.Trie_Search - (Natools.Smaz_256.Dict_Entry (Actual_Dict, I)))); - end if; - end loop; - - if Job_Count > 0 then - Dict_256.Parallel_Evaluate_Dictionary (Job_Count, - Actual_Dict, Corpus, Compressed_Size, Counts); - else - Tools_256.Evaluate_Dictionary - (Actual_Dict, Corpus, Compressed_Size, Counts); - end if; - end Evaluate_Dictionary; - function Getopt_Config return Getopt.Configuration is use Getopt; use Options; R : Getopt.Configuration; @@ -518,11 +518,11 @@ New_Dict : constant Natools.Smaz_256.Dictionary := Tools_256.Append_String (Base, Word); New_Score : Ada.Streams.Stream_Element_Count; New_Counts : Tools_256.Dictionary_Counts; begin - Evaluate_Dictionary + Dict_256.Evaluate_Dictionary (Job_Count, New_Dict, Input_Texts, New_Score, New_Counts); if New_Score < Score then Dict := Holders.To_Holder (New_Dict); Score := New_Score; @@ -568,11 +568,12 @@ Pending : Natools.Smaz_Tools.String_Lists.List := Pending_Words; Score : Ada.Streams.Stream_Element_Count; Counts : Tools_256.Dictionary_Counts; Running : Boolean := True; begin - Evaluate_Dictionary (Job_Count, Base, Input_Texts, Score, Counts); + Dict_256.Evaluate_Dictionary + (Job_Count, Base, Input_Texts, Score, Counts); while Running loop Optimization_Round (Holder, Score, @@ -913,11 +914,11 @@ when Actions.Evaluate => declare Total_Size : Ada.Streams.Stream_Element_Count; Counts : Tools_256.Dictionary_Counts; begin - Evaluate_Dictionary (Handler.Job_Count, + Dict_256.Evaluate_Dictionary (Handler.Job_Count, Dictionary, Data_List, Total_Size, Counts); if Handler.Sx_Output then Sx_Output.Open_List; Sx_Output.Append_String (Ada.Strings.Fixed.Trim @@ -1116,10 +1117,32 @@ end if; end; end case; end To_Dictionary; + + procedure Use_Dictionary (Dict : in out Natools.Smaz_256.Dictionary) is + begin + Natools.Smaz_Tools.Set_Dictionary_For_Trie_Search + (Tools_256.To_String_List (Dict)); + Dict.Hash := Natools.Smaz_Tools.Trie_Search'Access; + + for I in Dict.Offsets'Range loop + if Natools.Smaz_Tools.Trie_Search (Natools.Smaz_256.Dict_Entry + (Dict, I)) /= Natural (I) + then + Ada.Text_IO.Put_Line + (Ada.Text_IO.Current_Error, + "Fail at" & Ada.Streams.Stream_Element'Image (I) + & " -> " & Natools.String_Escapes.C_Escape_Hex + (Natools.Smaz_256.Dict_Entry (Dict, I), True) + & " ->" & Natural'Image (Natools.Smaz_Tools.Trie_Search + (Natools.Smaz_256.Dict_Entry (Dict, I)))); + end if; + end loop; + end Use_Dictionary; + Opt_Config : constant Getopt.Configuration := Getopt_Config; Handler : Callback; Input_List, Input_Data : Natools.Smaz_Tools.String_Lists.List; begin