From a6ef0b91a9c69c4069511bd827c360e1a3f9daa6 Mon Sep 17 00:00:00 2001 From: "Bart Jablonski (yabwon)" Date: Fri, 30 Sep 2022 18:42:29 +0200 Subject: [PATCH] The DFA package [ver. 0.5] Initial commit of the package --- dfa.md | 1597 ++++++++++++++++++++++++++++++++++++++++++++++ dfa.zip | Bin 0 -> 47034 bytes hist/0.5/dfa.zip | Bin 0 -> 47034 bytes 3 files changed, 1597 insertions(+) create mode 100644 dfa.md create mode 100644 dfa.zip create mode 100644 hist/0.5/dfa.zip diff --git a/dfa.md b/dfa.md new file mode 100644 index 0000000..7858ae7 --- /dev/null +++ b/dfa.md @@ -0,0 +1,1597 @@ +- [The DFA package](#dfa-package) +- [Content description](#content-description) + * [`%createDFArray()` macro](#createdfarray-macro) + * [`%createDHArray()` macro](#createdharray-macro) + * [`%createDHFifo()` macro](#createdhfifo-macro) + * [`%createDHOrdStack()` macro](#createdhordstack-macro) + * [`%createDHPrtQueue()` macro](#createdhprtqueue-macro) + * [`%createDHStack()` macro](#createdhstack-macro) + * [`bit64orPROTOdfa()` proto function](#bit64orprotodfa-proto-function) + * [`bit64andPROTOdfa()` proto function](#bit64andprotodfa-proto-function) + * [`bit64orDFA()` subroutine](#bit64ordfa-function) + * [`bit64andDFA()` subroutine](#bit64anddfa-function) + * [`%createDFBitmap()` macro](#createdfbitmap-macro) + * [`generateArrays` exec](#createdhprtqueue-exec) + * [`generateArrays` clean](#createdhprtqueue-clean) + + * [License](#license) + +--- + +# The DFA package [ver. 0.5] ############################################### + +The **DFA** (a.k.a. *Dynamic Function Array*) package implements: + - dynamic numeric and character arrays, + - dynamic stacks (filo), + - dynamic queues (fifo), + - dynamic ordered stacks, + - priority queues, + - bitmap. + +The package provides a set of *macros*, +which allows to *generate* `call routines` +simulating data structures mentioned above. + +Few exemplary functions are also generated. +See particular macro help for further details. + +--- + +Package contains: +1. macro createdfarray +2. macro createdharray +3. macro createdhfifo +4. macro createdhordstack +5. macro createdhprtqueue +6. macro createdhstack +7. proto bit64andprotodfa +8. proto bit64orprotodfa +9. functions bit64anddfa +10. functions bit64ordfa +11. macro createdfbitmap +12. exec generatearrays +13. clean generatearrays + +*SAS package generated by generatePackage, version 20220830* + +The SHA256 hash digest for package BasePlus: +`5BFFCE78439E1CDDCBB15C95CD287AA4195BF64BB17DDB8FE374EC3535B4F491` + +--- +# Content description ############################################################################################ + +## >>> `%createDFArray()` macro: <<< ####################### + +The `%createDFArray()` macro allows to generate +a `dynamic function array` which is a FCMP based +approach to create *dynamically* allocated **numeric** +array with possible values searching and `WHICHN()` +function emulation. + +*Note:* Arrays provided by the macro are *one dimensional* arrays. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDFArray( + arrayName + <,debug=0> + <,simple=0> + <,resizeFactor=0> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `arrayName` - *Required*, creates a FCMP call subroutine which is also + an array name. In the data step it is used in form of + a call subroutine, e.g. `call arrayName("Allocate", -3, 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `simple=` - *Optional*, the default value is `0`. A *simple* dynamic + function array is one which is not searchable and does not + allows to use `which()` functionality. + If set to `1` then it disables `SEARCH` and `WHICH` functionality. + See examples below for details. + +* `resizeFactor=` - *Optional*, the default value is `0`. If set to `0` then + the dynamic array size is not changeable(mutable) after initial + size allocation. + If set not to `0` then arrays dimensions are mutable after allocation, + i.e. even if an array is allocated for ten elements (like `A[1:10]`) + you can do `A[17] = 42` and it will resize itself dynamically. + *Hint!* Set to, e.g. 4999, for faster allocation process. + See examples below for details. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &arrayName.(IO, position, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `R`, `Return` - to get the data from an array, + - `I`, `Input` - to insert the data into an array, + - `+`, `Add` - to increment given position by a value, + - `C`, `Clear` - to reduce an array to a single empty cell, + - `A`, `Allocate` - to reserve space for array width and set starting values, + - `D`, `Dimension` - to return minimal and maximal index of an array, + - `F`, `Find`, `Exist` - to find out if a given value exist in an array, + - `W`, `Which` - to search the first position of data in array, `WHICHN()` function emulator, + - `Sum` - to return the sum of non-missing elements of an array, + - `Nonmiss` - to return the number of non-missing elements of an array, + - `Avg`, `Mean`, `Average` - to return the average of non-missing elements of an array, + - `Min`, `Minimum` - to return the minimum of non-missing elements of an array, + - `Max`, `Maximum` - to return the maximum of non-missing elements of an array. + +2. `position` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `O`, `Output`, `R`, `Return`/ `I`, `Input`/ `+`, `Add` it takes + an arrays index from (into) which data is get (put), + - for `C`, `Clear` is ignored, + - for `A`, `Allocate` sets the value of the minposition, i.e. the minimal position of the array index, + - for `D`, `Dimension` it returns value of the minposition, + - for `Sum`, `Nonmiss`, `Avg`, `Mean`, `Average`, `Min`, `Minimum`, `Max`, and `Maximum` is ignored, + - for `F`, `Find`, `Exist` it returns number of occurrences of a given value in an array, + - for `W`, `Which` it returns position the first occurrence of a given value in an array. + +.3 `value` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `O`, `Output`, `R`, `Return` it holds value retrieved from an array on a given position, + - for `I`, `Input` it holds the value inserted into an array on a given position, + - for `+`, `Add` it holds the value that is used to increment an array value at a given position, + - for `C`, `Clear` is ignored, + - for `A`, `Allocate` it sets the value of the maxposition, i.e. maximal position of the array index, + - for `D`, `Dimension` it returns value of the maxposition + - for `Sum`, `Nonmiss`, `Avg`, `Mean`, `Average`, `Min`, `Minimum`, `Max`, and `Maximum` it returns + the calculated summary value, + - for `F`, `Find`, `Exist`, `W`, `Which` is the value to be searched in an array. + +The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Searchable, and Immutable array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFArray(ArrDSI); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example1; + call ArrDSI("Allocate", 1, 10); + L = 0; H = 0; + call ArrDSI("Dim", L, H); + put L= H=; + + * populate array with data ; + do i = L to H; + call ArrDSI("Input", i, i**2); + end; + + * searchability allows to find number of occurrences of value in the array ; + F = .; + call ArrDSI("Find", F, 16); + put "Value 16 occurs " F "times"; + call ArrDSI("Find", F, 17); + put "Value 17 occurs " F "times"; + + * increase value of cell 4 by 1, and verify at WHICH position is 17 (by searchability); + call ArrDSI("+", 4, 1); + call ArrDSI("Which", F, 17); + put "Value 17 occurred for the first time at position " F; + + * get values from the array ; + Value = .; + do i = L to H; + call ArrDSI("Output", i, Value); + put i= Value=; + end; + + * some basic statistics ; + call ArrDSI("Sum", ., STAT); put "sum = " STAT; + call ArrDSI("Avg", ., STAT); put "avg = " STAT; + call ArrDSI("Min", ., STAT); put "min = " STAT; + call ArrDSI("Max", ., STAT); put "max = " STAT; + call ArrDSI("Cnt", ., STAT); put "cnt = " STAT; + + * immutability does _not_ allow to increase dimensions automatically; + * this line returns an error ; + call ArrDSI("Input", 42, -1); + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Searchable, and Mutable array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFArray(ArrDSM, resizefactor=17); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + call ArrDSM("Allocate", -2, 2); + + do i = -2 to 2; + call ArrDSM("Input", i, 2**i); + end; + + L = .; H = .; + call ArrDSM("Dim", L, H); + put L= H=; + + * mutability allows to increase dimensions automatically + * create index 3 and -3; + call ArrDSM("+", 3, 8); + call ArrDSM("+",-3, 0.125); + call ArrDSM("Dim", L, H); + put L= H=; + + Value = .; + do i = L to H; + call ArrDSM("O", i, Value); + put i= Value=; + end; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Dynamic, non-searchable (a.k.a. SiMPle), and Immutable array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFArray(ArrDSMPLI, simple=1); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example3; + call ArrDSMPLI("Allocate", -2, 2); + + do i = -2 to 2; + call ArrDSMPLI("Input", i, 2**i); + end; + + * non-searchable array (a.k.a. simple) does not allow ; + * to find number of occurrences of value in the array ; + * and verify what is the first position of a value ; + * this lines return a warning ; + call ArrDSMPLI("Exist", i, 1); + call ArrDSMPLI("Which", i, 1); + run; + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Dynamic, non-searchable (a.k.a. SiMPle), and Mutable array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFArray(ArrDSMPLM, simple=1, resizefactor=42); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example4; + call ArrDSMPLM("Allocate", 1, 1); + + * mutability allows to increase dimensions automatically ; + do i = -12 to 12; + call ArrDSMPLM("Input", i, i*2); + end; + + * non-searchable array (a.k.a. simple) does not allow ; + * to find number of occurrences of value in the array ; + * and verify what is the first position of a value ; + * this lines return a warning ; + i = .; + call ArrDSMPLM("Exist", i, -24); + put "Exist " i=; + call ArrDSMPLM("Which", i, 24); + put "Which " i=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- +## >>> `%createDHArray()` macro: <<< ####################### + +The `%createDHArray()` macro allows to generate +a `dynamic hash array` which is a FCMP based approach +to create *dynamically* allocated **numeric** +or **character** array + +*Note:* Arrays provided by the macro are *one dimensional* arrays. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDHArray( + arrayName + <,debug=0> + <,type=8> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `arrayName` - *Required*, creates a FCMP call subroutine which is also + an array name. In the data step it is used in form of + a call subroutine, e.g. `call arrayName("Allocate", -3, 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `type=` - *Optional*, the default value is `8`. + Indicates what *type* (numeric/character) and *length* + are data portion of generated array. Should be in line + with the LENGTH statement, e.g. `8`, `$ 30`, etc. + Determines if the `value` argument is numeric or character. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &arrayName.(IO, position, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `R`, `Return` - to get the data from an array, + - `I`, `Input` - to insert the data into an array, + - `C`, `Clear` - to reduce an array to a single empty cell, + - `L`, `Low`, `Lower`, `Lbound` - to return minimal position of index, + - `H`, `High`, `Higher`, `Hbound` - to return maximal position of index. + +2. `position` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `O`, `Output`, `R`, `Return`/ `I`, and `Input` it is an array + index from (into) which data is get (put), + - for `C` it is ignored, + - for `L`, `Low`, `Lower`, and `Lbound` it returns the first position of an index, + - for `H`, `High`, `Higher`, and `Hbound` it returns the last position of an index, + - otherwise is not modified. + +3. `value` - is a *numeric* or *character* argument (determined by the `type=`) + and depends on the `IO` value. Behaves in the following way: + - for `O`, `Output`, `R`, and `Return` it holds value retrieved from an array from a given position, + - for `I`, `Input` it holds the value inserted into an array into a given position, + - for `C` is ignored, + - for `L`, `Low`, `Lower`, and `Lbound` returns first value of index, + - for `H`, `High`, `Higher`, and `Hbound` returns last value of index, + - otherwise is not modified. + +The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Hash-based, and Character array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHArray(ArrDHC, type = $ 12); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + %let zeros = 6; *[to test bigger sizes]; + data Example1; + + t = time(); + do _I_ = -1e&zeros. to 1e&zeros.; + _X_ = put(_I_*10, z12.); + call ArrDHC("Input", _I_, _X_); + end; + t = time() - t; + put t= / _X_= /; + + * get the size info ; + LB = 0; HB = 0; + drop LB HB; + call ArrDHC('Lbound', LB, _X_); + call ArrDHC('Hbound', HB, _X_); + put LB= HB= /; + + t = time(); + do _I_ = HB + 1 to LB - 1 by -1; + call ArrDHC('Output', _I_, _X_); + output; + end; + t = time() - t; + put t= / _X_= /; + + * clear for further reuse ; + call ArrDHC('C', ., ''); + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Hash-based, and Numeric array: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHArray(ArrDHN); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + + do i = -2 to 2; + call ArrDHN("Input", i, 2**i); + end; + + do i = -2 to 2; + call ArrDHN("+", i, -10); + end; + + v = .; + do i = -2 to 2; + call ArrDHN("Output", i, v); + put i= v=; + end; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- +## >>> `%createDHFifo()` macro: <<< ####################### + +The `%createDHFifo()` macro allows to generate +a `dynamic hash fifo` which is a FCMP based approach +to create dynamically allocated numeric or character +"first in first out" [queue](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)) + +Interesting reading about implementing a fifo via hash table +can be found in *chapter 10.4* of the: +*"Data Management Solutions Using SAS Hash Table Operations: + A Business Intelligence Case Study"* book +by Paul Dorfman and Don Henderson. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDHFifo( + fifoName + <,debug=0> + <,type=8> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `fifoName` - *Required*, creates a FCMP call subroutine which is also + a fifo name. In the data step it is used in form of + a call subroutine, e.g. `call fifoName("Enqueue", 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `type=` - *Optional*, the default value is `8`. + Indicates what *type* (numeric/character) and *length* + are data portion of generated array. Should be in line + with the LENGTH statement, e.g. `8`, `$ 30`, etc. + Determines if the `value` argument is numeric or character. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &fifoName.(IO, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `D`, `Dequeue`, `R`, `Return` - to get the data from a fifo (and remove it from the fifo) + - `I`, `Input`, `E`, `Enqueue`, and `Insert` - to insert the data into a fifo + - `C`, `Clear` - to reduce a fifo to an empty one + - `P`, `Peek`, `T`, and `Tail` - to peek the data from a fifo (and NOT remove it from the fifo) + - `H`, `Head` - to peek the data from a fifo head (and NOT remove it from the fifo) + - `Sum` - returns sum of nonmissing numeric elements of a stack + - `Avg`, `Mean`, `Average` - returns average of nonmissing numeric elements of a stack + - `Nonmiss`, `Cnt` - returns number of nonmissing elements of a stack + - `Height` - returns height a stack + +2. `value` - is a *numeric* or *character* argument (determined by the `type=`) + and depends on the `IO` value. Behaves in the following way: + - for `O`, `Output`, `D`, `Dequeue`, `R`, `Return` it holds the value popped from the fifo, + - for `I`, `Input`, `E`, `Enqueue`, `Insert` it holds the value to be pushed into the fifo, + - for `C`, `Clear` it is ignored, + - for `P`, `Peek` holds the value peeked from the fifo, + - for `Sum`, `Nonmiss`, `Cnt`, `Avg`, `Mean`, `Average`, and `Height` it returns calculated summary value. + +The `value` argument is **outarg**, i.e. can be changed by the function. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Hash-based, and Character fifo: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHFifo(FifoDHC, type = $ 12); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + + %let zeros = 6; *[to test bigger sizes]; + data Example1; + + t = time(); drop t; + do _I_ = 1 to 1e&zeros.; + _X_ = put(_I_*10, z12.); + call FifoDHC("Enqueue", _X_); + end; + t = time() - t; + + call FifoDHC("Height", _X_); + put t= / _X_=; + + t = time(); + do _I_ = 1 to 1e&zeros. + 3; + call FifoDHC('Dequeue', _X_); + output; + end; + t = time() - t; + + call FifoDHC("Height", _X_); + put t= / _X_=; + + %* clear for further reuse *; + call FifoDHC('Clear', ''); + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Hash-based, and Numeric fifo: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHFifo(FifoDHN); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + + do _I_ = 1,.,2,.,3,.,4,.,5,.,6; + call FifoDHN("E", _I_); + end; + + call FifoDHN("Sum", _I_); + put "Sum " _I_=; + + call FifoDHN("Avg", _I_); + put "Avg " _I_=; + + call FifoDHN("Cnt", _I_); + put "Cnt " _I_=; + + call FifoDHN("Height", _I_); + put "Height " _I_=; + + call FifoDHN("Tail", _I_); + put "Tail of fifo is " _I_=; + + call FifoDHN("Height", _I_); + put "Height after Tail " _I_=; + + call FifoDHN("Head", _I_); + put "Head of fifo is " _I_=; + + call FifoDHN("Height", _I_); + put "Height after Head" _I_=; + + _X_ = 0; + do _I_ = 1 to _I_; + call FifoDHN('D', _X_); + output; + end; + + call FifoDHN("Height", _I_); + put "Height " _I_=; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- +## >>> `%createDHOrdStack()` macro: <<< ####################### + +The `%createDHOrdStack()` macro allows to generate +a `dynamic ORDERED hash stack` which is a FCMP based approach +to create dynamically allocated numeric or character +*ordered* [stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) + +Interesting reading about implementing a stack via hash table +can be found in *chapter 10.4* of the: +*"Data Management Solutions Using SAS Hash Table Operations: + A Business Intelligence Case Study"* book +by Paul Dorfman and Don Henderson. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDHOrdStack( + fifoName + <,debug=0> + <,type=8> + <,order=A> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `stackName` - *Required*, creates a FCMP call subroutine which is also + a stack name. In the data step it is used in form of + a call subroutine, e.g. `call stackName("Push", 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `type=` - *Optional*, the default value is `8`. + Indicates what *type* (numeric/character) and *length* + are data portion of generated array. Should be in line + with the LENGTH statement, e.g. `8`, `$ 30`, etc. + Determines if the `value` argument is numeric or character. + +* `order=` - *Optional*, the default value is `A`. + Indicates a method of ordering of the stack, + allowed values are: `A` for ascending and `D` for descending. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &stackName.(IO, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `Pop`, `G`, `Get`, `R`, `Return` - to get the data from a stack (and remove it from the top), + - `I`, `Input`, `Push`, `Put`, `Insert` - to insert the data into a stack, + - `C`, `Clear` - to reduce a stack to an empty one, + - `P`, `Peek` - to peek the data from a stack (and NOT remove it from the top), + - `Sum` - returns sum of non-missing numeric elements of a stack, + - `Avg`, `Mean`, `Average` - returns average of non-missing numeric elements of a stack, + - `Nonmiss`, `Cnt`, `Nnm` - returns number of non-missing elements of a stack, + - `Height` - returns height a stack, + - `Min`, `Minimum` - returns minimum of non-missing elements of a stack, + - `Max`, `Maximum` - returns maximum of non-missing elements of a stack. + +2. `value` - is a *numeric* or *character* argument (determined by the `type=`) + and depends on the `IO` value. Behaves in the following way: + - for `O`, `Output`, `Pop`, `G`, `Get`, `R`, `Return` it holds a value popped from a stack, + - for `I`, `Input`, `Push`, `Put`, `Insert` it holds a value to be pushed into a stack, + - for `C`, `Clear` it is ignored, + - for `P`, `Peek` it holds a value peeked from a stack, + - for `Sum`, `Nonmiss`, `Cnt`, `Avg`, `Mean`, `Average`, `Height`, `Min`, `Minimum`, `Max`, and `Maximum` + it returns calculated summary value, + +The `value` argument is **outarg**, i.e. can be changed by the function. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Hash-based, and Character Descending Ordered stack: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHOrdStack(DescStackC, type = $ 12, order=D); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example1; + + do _X_ = "A","B"," ","C","A"," ","B","C"; + call DescStackC("Push", _X_); + end; + + length S $ 12; + call DescStackC('Height', S); + put 'Height ' S; + + do until(strip(S) = "0"); + call DescStackC('Get', _X_); + call DescStackC('Height', S); + put S= _X_=; + output; + end; + + %* clear for further reuse *; + call DescStackC('Clear',''); + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Hash-based, and Numeric Ascending Ordered stack: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHOrdStack(DescStackN, order=A); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + + call missing(Sum, Avg, Min, Max, Cnt, Hgt, Peek); + do _X_ = 1,6,2,.,5,3,4; + call DescStackN("Put", _X_); + call DescStackN('Sum', Sum); + call DescStackN('Avg', Avg); + call DescStackN('Min', Min); + call DescStackN('Max', Max); + call DescStackN('Cnt', Cnt); + call DescStackN('Height', Hgt); + put (_ALL_) (=); + end; + + call DescStackN('Peek', Peek); + put Peek=; + + do _I_ = 1 to Hgt; + call DescStackN('Output', _X_); + keep _X_; + if _X_ > .z then output; + end; + + call DescStackN('Peek', Peek); + put Peek=; + + %* clear for further reuse *; + call DescStackN('Clear',.); + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- +## >>> `%createDHPrtQueue()` macro: <<< ####################### + + +The `%createDHPrtQueue()` macro allows to generate +a `dynamic PRIORITY hash queue` which is a FCMP based approach +to create dynamically allocated numeric or character +[priority queue](https://en.wikipedia.org/wiki/Priority_queue) + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDHPrtQueue( + fifoName + <,debug=0> + <,type=8> + <,newOnTop=+> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `queueName` - *Required*, creates a FCMP call subroutine which is also + a queue name. In the data step it is used in form of + a call subroutine, e.g. `call queueName("Bottom", 1, 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `type=` - *Optional*, the default value is `8`. + Indicates what *type* (numeric/character) and *length* + are data portion of generated array. Should be in line + with the LENGTH statement, e.g. `8`, `$ 30`, etc. + Determines if the `value` argument is numeric or character. + +* `newOnTop=` - *Optional*, the default value is `+`. + Indicates how to keep order in the same priority group, + allowed values are `+` or `-`. Plus(`+`) sets new elements + at the top of the group, minus(`-`) at the bottom. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &queueName.(IO, position, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `D`, `Dequeue`, `R`, `Return` - it pops/gets/outputs the data from the queue head (high priority), + - `B`, `Bottom` - it pops/gets/outputs the data from the queue tail (low priority), + - `I`, `Input`, `E`, `Enqueue`, `Insert` - it push/puts/inserts the data into the queue, + - `C`, `Clear` - it reduces a queue to an empty one, + - `H`, `Head` - it peeks the data from the queue head and NOT removes it, + - `T`, `Tail` - it peeks the data from the queue tail and NOT removes it, + - `Sum` - it returns sum of non-missing *numeric* elements of the queue, + - `Avg`, `Mean`, `Average` - it returns average of non-missing *numeric* elements of the queue, + - `Nonmiss`, `Cnt` - it returns number of non-missing elements of the queue, + - `Height` - it returns height of the queue. + +2. `position` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `O`, `Output`, `D`, `Dequeue`, `R`, `Return` and `B`, `Bottom`, or `H`, `Head`, `T`, `Tail` + it holds a priority level of value popped from the queue, + - for `I`, `Input`, `E`, `Enqueue`, `Insert` it holds a priority level of value to be pushed into the queue, + - for `C` ignored, + - for *numeric* queue and `Sum`, `Nonmiss`, `Cnt`, `Avg`, `Mean`, `Average`, `Height` returns calculated summary value. + +3. `value` - is a *numeric* or *character* argument (determined by the `type=`) + and depends on the `IO` value. Behaves in the following way: + - for `O`, `Output`, `D`, `Dequeue`, `R`, `Return` and `B`, `Bottom` or `H`, `Head`, `T`, `Tail` + it holds a value popped from the queue, + - for `I`, `Input`, `E`, `Enqueue`, `Insert` it holds a value to be pushed into the queue, + - for `C` ignored, + - for *numeric* queue and `Sum`, `Nonmiss`, `Cnt`, `Avg`, `Mean`, `Average`, `Height` returns calculated summary value, + - otherwise does not modify value. + +The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Hash-based, and Character Priority queue: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHPrtQueue(PriorityQueuePC, type = $ 12, newOnTop=+); + %createDHPrtQueue(PriorityQueueNC, type = $ 12, newOnTop=-); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example1; + + _I_ = .; + length _X_ _Y_ $ 3; + do _X_ = "AAA","BBB","CCC","AA","BB","CC","A","B","C"; + _I_ + 1; + call PriorityQueuePC("I", mod(_I_, 3), _X_); + call PriorityQueueNC("I", mod(_I_, 3), _X_); + end; + + Height = .; + call PriorityQueuePC('Height', Height, ''); + put Height=; + + do until(Height = 0); + call PriorityQueuePC('Dequeue', _I_, _X_); + call PriorityQueueNC("Dequeue", _I_, _Y_); + call PriorityQueueNC('Height', Height, ''); + put (_ALL_) (=); + output; + end; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Hash-based, and Numeric Priority queue: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHPrtQueue(PriorityQueueN); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + + do _X_ = -5 to 5; + call PriorityQueueN("Enqueue", abs(_X_), _X_); + end; + + call missing(Sum, Avg, Cnt, Hgt); + call PriorityQueueN('Sum', ., Sum); + call PriorityQueueN('Avg', ., Avg); + call PriorityQueueN('Cnt', ., Cnt); + call PriorityQueueN('Height', ., Hgt); + put (_ALL_) (=); + + do _N_ = 1 to Hgt; + call PriorityQueueN("Dequeue", _X_, _Y_); + put _X_= _Y_=; + end; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- +## >>> `%createDHStack()` macro: <<< ####################### + +The `%createDHStack()` macro allows to generate +a `dynamic hash stack` which is a FCMP based approach +to create dynamically allocated numeric or character +[stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) + +Interesting reading about implementing a stack via hash table +can be found in *chapter 10.4* of the: +*"Data Management Solutions Using SAS Hash Table Operations: + A Business Intelligence Case Study"* book +by Paul Dorfman and Don Henderson. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDHStack( + fifoName + <,debug=0> + <,type=8> + <,outlib=work.DFAfcmp.package> + <,hashexp=13> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `stackName` - *Required*, creates a FCMP call subroutine which is also + a stack name. In the data step it is used in form of + a call subroutine, e.g. `call stackName("Push", 3)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `type=` - *Optional*, the default value is `8`. + Indicates what *type* (numeric/character) and *length* + are data portion of generated array. Should be in line + with the LENGTH statement, e.g. `8`, `$ 30`, etc. + Determines if the `value` argument is numeric or character. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `hashexp=` - *Optional*, the default value is `13`. It is the default `hashexp=` + value for internal hash table used by the function. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &stackName.(IO, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `O`, `Output`, `Pop`, `G`, `Get`, `R`, `Return` - to get the data from a stack (and remove it from the top), + - `I`, `Input`, `Push`, `Put`, `Insert` - to insert the data into a stack, + - `C`, `Clear` - to reduce a stack to an empty one, + - `P`, `Peek` - to peek the data from a stack (and NOT remove it from the top), + - `Sum` - returns sum of non-missing numeric elements of a stack, + - `Avg`, `Mean`, `Average` - returns average of non-missing numeric elements of a stack, + - `Nonmiss`, `Cnt`, `Nnm` - returns number of non-missing elements of a stack, + - `Height` - returns height a stack, + +2. `value` - is a *numeric* or *character* argument (determined by the `type=`) + and depends on the `IO` value. Behaves in the following way: + - for `O`, `Output`, `Pop`, `G`, `Get`, `R`, `Return` it holds a value popped from a stack, + - for `I`, `Input`, `Push`, `Put`, `Insert` it holds a value to be pushed into a stack, + - for `C`, `Clear` it is ignored, + - for `P`, `Peek` it holds a value peeked from a stack, + - for `Sum`, `Nonmiss`, `Cnt`, `Avg`, `Mean`, `Average`, `Height` it returns calculated summary value, + +The `value` argument is **outarg**, i.e. can be changed by the function. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Dynamic, Hash-based, and Character stack: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHStack(StackDHC, type = $ 12); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + + %let zeros = 6; *[to test bigger sizes]; + data Example1; + + t = time(); drop t; + do _I_ = 1 to 1e&zeros.; + _X_ = put(_I_*10, z12.); + call StackDHC("Put", _X_); + end; + t = time() - t; + + call StackDHC("Height", _X_); + put t= / _X_=; + + t = time(); + do _I_ = 1 to 1e&zeros. + 3; + call StackDHC('Pop', _X_); + output; + end; + t = time() - t; + + call StackDHC("Height", _X_); + put t= / _X_=; + + %* clear for further reuse *; + call StackDHC('Clear', ''); + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Dynamic, Hash-based, and Numeric stack: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDHStack(StackDHN); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + + do _I_ = 1,.,2,.,3,.,4,.,5,.,6; + call StackDHN("Put", _I_); + end; + + call StackDHN("Sum", _I_); + put "Sum " _I_=; + + call StackDHN("Avg", _I_); + put "Avg " _I_=; + + call StackDHN("Cnt", _I_); + put "Cnt " _I_=; + + call StackDHN("Height", _I_); + put "Height " _I_=; + + _X_ = 0; + do _I_ = 1 to _I_; + call StackDHN('Pop', _X_); + output; + end; + + call StackDHN("Height", _I_); + put "Height " _I_=; + + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `bit64orPROTOdfa()` proto function: <<< ####################### + +The **bit64orPROTOdfa()** is external *C* function, +this is the implementation of the *bitwise OR* operation +on doubles. A double is returned. + +**Caution!** For SAS numeric values *only* operations on first 53 bits are valid! + +The function is used **internally** by functions in the *DFA* package. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +bit64orPROTOdfa(i, j) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `i` - A double numeric argument. + +2. `j` - A double numeric argument. + +--- + +## >>> `bit64andPROTOdfa()` proto function: <<< ####################### + +The **bit64andPROTOdfa()** is external *C* function, +this is the implementation of the *bitwise AND* operation +on doubles. A double is returned. + +**Caution!** For SAS numeric values *only* operations on first 53 bits are valid! + +The function is used **internally** by functions in the *DFA* package. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +bit64andPROTOdfa(i, j) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `i` - A double numeric argument. + +2. `j` - A double numeric argument. + +--- + +## >>> `bit64orDFA()` subroutine: <<< ####################### + +The **bit64orDFA()** function is an alternative to +the 32 bit bitwise `BOR()` function working on SAS numerics. +Allows to work on *up to* 53 bits of SAS numeric value. + +The `bit64orDFA()` is an *internal* function of the `DFA` package. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +bit64orDFA(a, b) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `a` - Argument is a SAS numeric values. + +2. `B` - Argument is a SAS numeric values. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic test of `bit64orDFA()` and `bit64andDFA()` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options ls = max ps = max; + %let M = 53 ; %* 53 is maximum valid value; + data _null_; + array bitmask [ 0: &M] _temporary_ ; + do P = 1 to &M ; + bitmask[P] = 2**(P-1) ; + put bitmask[P] = binary54. @; + put bitmask[P] = best32.; + end ; + bitmask[0] = bitmask[&M.] ; + put bitmask[0] = best32. /; + + a=0; + put a = binary54.; + do P = 1 to &M ; + a = BIT64ORDFA (a, bitmask[P]) ; + put a = binary54.; + end; + put; + + b = 0; + put b = binary54./; + do P = 1 to &M ; + b + (BIT64ANDDFA (a, bitmask[P]) ne .) ; + put b = best32.; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `bit64andDFA()` subroutine: <<< ####################### + +The **bit64andDFA()** function is an alternative to +the 32 bit bitwise `BAND()` function working on SAS numerics. +Allows to work on *up to* 53 bits of SAS numeric value. + +The `bit64andDFA()` is an *internal* function of the `DFA` package. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +bit64andDFA(a, b) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `a` - Argument is a SAS numeric values. + +2. `B` - Argument is a SAS numeric values. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic test of `bit64orDFA()` and `bit64andDFA()` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options ls = max ps = max; + %let M = 53 ; %* 53 is maximum valid value; + data _null_; + array bitmask [ 0: &M] _temporary_ ; + do P = 1 to &M ; + bitmask[P] = 2**(P-1) ; + put bitmask[P] = binary54. @; + put bitmask[P] = best32.; + end ; + bitmask[0] = bitmask[&M.] ; + put bitmask[0] = best32. /; + + a=0; + put a = binary54.; + do P = 1 to &M ; + a = BIT64ORDFA (a, bitmask[P]) ; + put a = binary54.; + end; + put; + + b = 0; + put b = binary54./; + do P = 1 to &M ; + b + (BIT64ANDDFA (a, bitmask[P]) ne .) ; + put b = best32.; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%createDFBitmap()` macro: <<< ####################### + +The `%createDFBitmap()` macro allows to generate +a `dynamic function bitmap` which is a FCMP based +approach to create *dynamically* allocated **numeric** +bitmnap. + +*Note:* Arrays provided by the macro are *one dimensional* arrays. + +The idea of a SAS bitmap is based on: +1. SGF Paper 3101-2019 + titeled **Re-Mapping A Bitmap** by *Paul M. Dorfman* and *Lessia S. Shajenko* + [https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2019/3101-2019.pdf](https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2019/3101-2019.pdf) +2. SUGI Paper 8-26 + titeled **Table Look-Up by Direct Addressing: Key-Indexing -- Bitmapping -- Hashing** by *Paul M. Dorfman* + [https://support.sas.com/resources/papers/proceedings/proceedings/sugi26/p008-26.pdf](https://support.sas.com/resources/papers/proceedings/proceedings/sugi26/p008-26.pdf) + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%createDFBitmap( + bitmapName + <,debug=0> + <,outlib=work.DFAfcmp.package> + <,type=32> + <,header=1> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `bitmapName` - *Required*, creates a FCMP call subroutine which is also + a bitmap name. In the data step it is used in form of + a call subroutine, e.g. `call bitmapName("Allocate", 3000)`. + Has to satisfy FCMP function naming requirements, but with + maximum of 24 characters. + +* `debug=` - *Optional*, the default value is `0`. + If set to `1` then it turns on a debugging mode. + +* `outlib=` - *Optional*, the default value is `work.DFAfcmp.package`. + It points the default location for new generated dynamic + function arrays compiled by FCMP. + *Hint!* Keep it as it is. + +* `type=` - *Optional*, the default value is `32`. Sets the type of + bitwise operations executed internaly on the bitmap. + The only valid values are `32` or `52`, + With 32 the `BOR()` and `BAND()` SAS functions are used + and with 52 the `bit64orDFA()` and `bit64and DFA()` FCMP + functions are used. + +* `header=` - *Optional*, the default value is `1`. Indicates if + the `proc fcmp outlib = &outlib.;` header is added to + the executed code. If not 1 then no header is added. + +**Created function arguments description**: + +A function generated by the macro is: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call &bitmapName.(IO, position, value) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +and accepts the following list of arguments and values: + +1. `IO` - is a *character* steering argument, possible + values and behaviour they call are the following: + - `Check`, `Test`, `T` - to get information if a bit is set to 1 (on) or not, + - `On`, `1` - to set a selected bit to 1, + - `Off`, `0` - to set a selected bit to 0, + - `C`, `Clear` - to reduce a bitmat to a single empty cell, + - `A`, `Allocate` - to reserve space for a bitmap and set all bits to 0, + - `A0`, `Allocate0` - to reserve space for a bitmap and set all bits to 0, + - `A1`, `Allocate1` - to reserve space for a bitmap and set all bits to 1, + - `D`, `Dim`, `Dimension` - to returns minimal and maximal index of the bitmap. + +2. `position` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `On`, `Off`, `1`, `0`/ `Check`, `Test`, `T` it is a bitmap index, + - for `C`, `Clear` is ignored, + - for `A`, `Allocate` sets the value of the minposition, i.e. the minimal position of the bitmap index, + - for `D`, `Dimension` it returns value of the minposition, + +.3 `value` - is a *numeric* argument and depends on the `IO` value. + Behaves in the following way: + - for `Check`, `Test`, `T` it holds value retrieved from a bitmap on a given position, + - for `On`, `Off`, `1`, `0`, `C`, `Clear` is ignored, + - for `A`, `Allocate` it sets the value of the maxposition, i.e. maximal position of the array index, + - for `D`, `Dimension` it returns value of the maxposition + +The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Bitmap of type 32: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFBitmap(MyBitmap32,type=32,debug=1); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example1; + call MyBitmap32("Allocate", -10, 100); + L = 0; H = 0; + call MyBitmap32("Dim", L, H); + put L= H=; + + * populate array with data ; + do i = L to H by 2; + put i @; + call MyBitmap32("1", i, .); + end; + put; + + * get values from the array ; + Value = .; + do i = L to H; + call MyBitmap32("T", i, Value); + put i= Value=; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Bitmap of type 52: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFBitmap(MyBitmap52,type=52,debug=1); + options APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example2; + call MyBitmap52("Allocate", -10, 100); + L = 0; H = 0; + call MyBitmap52("Dim", L, H); + put L= H=; + + * populate array with data ; + do i = L to H by 2; + put i @; + call MyBitmap52("1", i, .); + end; + put; + + * get values from the array ; + Value = .; + do i = L to H; + call MyBitmap52("T", i, Value); + put i= Value=; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Execution time test for type 52: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFBitmap(MyBigBitmap52,type=52,debug=0); + options FULLSTIMER APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example3; + call MyBigBitmap52("Allocate", -10, 2000000001); + L = 0; H = 0; + call MyBigBitmap52("Dim", L, H); + put L= H=; + + * populate bitmap with data ; + t = time(); + do i = L to H by 17; + call MyBigBitmap52("1", i, .); + x + 1; + end; + t = time() - t; + put "populate:" t= x=; + + * get values from the bitmap ; + t = time(); + Value = .; + do i = L to H; + call MyBigBitmap52("T", i, Value); + x + (-Value); + end; + t = time() - t; + put "search:" t= x=; + run; + +%* +L=-10 H=2000000001 +populate:t=55.902999878 x=117647060 +search:t=654.12900019 x=0 +NOTE: The data set WORK.EXAMPLE3 has 1 observations and 6 variables. +NOTE: DATA statement used (Total process time): + real time 11:50.42 + user cpu time 11:46.40 + system cpu time 0.45 seconds + memory 301791.12k + OS Memory 326332.00k +; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 4.** Execution time test for type 32: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %createDFBitmap(MyBigBitmap32,type=32,debug=0); + options FULLSTIMER APPEND=(cmplib = WORK.DFAfcmp) ; + + data Example4; + call MyBigBitmap32("Allocate", -10, 2000000001); + L = 0; H = 0; + call MyBigBitmap32("Dim", L, H); + put L= H=; + + * populate bitmap with data ; + t = time(); + do i = L to H by 17; + call MyBigBitmap32("1", i, .); + x + 1; + end; + t = time() - t; + put "populate:" t= x=; + + * get values from the bitmap ; + t = time(); + Value = .; + do i = L to H; + call MyBigBitmap32("T", i, Value); + x + (-Value); + end; + t = time() - t; + put "populate:" t= x=; + run; + +%* +L=-10 H=2000000001 +populate:t=50.417999983 x=117647060 +populate:t=611.13600016 x=0 +NOTE: The data set WORK.EXAMPLE4 has 1 observations and 6 variables. +NOTE: DATA statement used (Total process time): + real time 11:02.07 + user cpu time 10:59.07 + system cpu time 1.46 seconds + memory 489583.90k + OS Memory 513876.00k +; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `generateArrays` exec: <<< ####################### + +The generateArrays exec file provides a **list of automatically generated examples** of functions +emulating data structures. + +The list of provided examples is the following: +- `SmpArray` - Simple Immutable Dynamic Function Array +- `SmpMtbArray` - Simple Mutable Dynamic Function Array +- `SrchArray` - Searchable Immutable Dynamic Function Array +- `SrchMtbArray` - Searchable Mutable Dynamic Function Array +- `DynArrayC` - Dynamic Hash-based Character Function Array (length 256 bytes) +- `StackC` - Dynamic Hash-based Character Stack (length 256 bytes) +- `StackN` - Dynamic Hash-based Numeric Stack +- `FifoC` - Dynamic Hash-based Character Fifo (length 256 bytes) +- `FifoN` - Dynamic Hash-based Character Fifo +- `DescStackC` - Dynamic Hash-based Character Descending Ordered Stack (length 256 bytes) +- `AscStackC` - Dynamic Hash-based Character Ascending Ordered Stack (length 256 bytes) +- `DescStackN` - Dynamic Hash-based Numeric Descending Ordered Stack +- `AscStackN` - Dynamic Hash-based Numeric Ascending Ordered Stack +- `PrtQueueNTC` - Dynamic Hash-based Character Priority Queue with *New on Top* (length 256 bytes) +- `PrtQueueNBC` - Dynamic Hash-based Character Priority Queue with *New on Bottom* (length 256 bytes) +- `PrtQueueNTN` - Dynamic Hash-based Numeric Priority Queue with *New on Top* +- `PrtQueueNBN` - Dynamic Hash-based Numeric Priority Queue with *New on Bottom* +- `Bitmap32` - Dynamic Function Bitmap on 32 bit +- `Bitmap52` - Dynamic Function Bitmap on 52 bit + +The `outlib=` option is set to `work.DFAfcmp.package`. The `cmplib=` option is updated automatically. + +--- +## >>> `generateArrays` clean: <<< ####################### + +The generateArrays clean file clears the list of automatically generated examples of functions +emulating data structures provided in the `generatearrays.sas` exec file. + +The `cmplib=` option is updated automatically. + +--- + +## License #################################################################### + +Copyright (c) 2019 Bartosz Jablonski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- diff --git a/dfa.zip b/dfa.zip new file mode 100644 index 0000000000000000000000000000000000000000..5a654fd8f76241a3a287f0989ff0693e26e23b0e GIT binary patch literal 47034 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%0DuY^DoqQ+S^%t(JMuX3H# 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%0DuY^DoqQ+S^%t(JMuX3H# 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