On Thu, 11 Oct 2018, Sven Schreiber wrote:

> Am 11.10.2018 um 15:04 schrieb Riccardo (Jack) Lucchetti:
>> On Thu, 11 Oct 2018, Sven Schreiber wrote:
>> 
>>> Am 23.02.2016 um 14:02 schrieb Henrique Andrade:
>>>> Dear Jack and Allin,
>>>> 
>>>> Thanks a lot for your invaluable advices! I really couldn't figure out
>>>> these solutions and code improvements by myself.
>>>> 
>>>> 
>>> 
>>> Let me pick up this old thread: Would it make sense to integrate such a 
>>> reasonably optimized powerset function into the extra.gfn package? (which 
>>> is now an addon)
>> 
>> Sonds good to me.
>> 
>
> OK, which one is the final optimized version?

If I'm not mistaken, this is more or less what we came up with in the end

<hansl>
function strings powerset(strings S)
     matrix P = {}
     scalar l = nelem(S)
     scalar N = 2^l
     matrix s = seq(0, N-1)'

     loop l --quiet
         matrix a = s % 2
         matrix P ~= a
         matrix s = (s-a)/2
     endloop

     strings PS = array(N)

     loop i = 1..N --quiet
         string c = ""
         loop j = 1..l --quiet
             if P[i, j]
                 c = c ~ " " ~ S[j]
             endif
         endloop
         PS[i] = c
     endloop

     return PS
end function

# example

strings S = defarray("wage", "lwage", "belavg", "abvavg", "exper",\
   "looks", "union", "goodhlth", "black", "female", "married", "south",\
   "bigcity", "smllcity", "service","expersq","educ")

set stopwatch
strings PwrSet = powerset(S)
printf "Elapsed time = %g\n", $stopwatch
</hansl>

-------------------------------------------------------
   Riccardo (Jack) Lucchetti
   Dipartimento di Scienze Economiche e Sociali (DiSES)

   Università Politecnica delle Marche
   (formerly known as Università di Ancona)

   r.lucchetti(a)univpm.it
   http://www2.econ.univpm.it/servizi/hpp/lucchetti
-------------------------------------------------------

Reply via email to