Conditional entropy optimisation

Code commentary on the implementation of Tractable and Practicable Inducers/Python Implementation/Conditional entropy optimisation

Sections

Conditional entropy tuple set builder

Conditional entropy tuple set builder

Define the limited-dimension conditional entropy tuple set list minimiser \[ Z_{P,A,\mathrm{L}} = \mathrm{maximiseLister}(X_{P,A,\mathrm{L}},P_{P,A,\mathrm{L}},\mathrm{top}(\mathrm{omax}),R_{P,A,\mathrm{L}}) \] where (i) the optimiser function is \[ \begin{eqnarray} X_{P,A,\mathrm{L}} &=& \{(K,-(\mathrm{entropy}(A~\%~(K \cup L))-\mathrm{entropy}(A~\%~K))) : K \subseteq V \setminus L\} \end{eqnarray} \] and (ii) the neighbourhood function is \[ \begin{eqnarray} &&P_{P,A,\mathrm{L}}(M) = \{(J,X_{P,A,\mathrm{L}}(J)) : \\ &&\hspace{2em}(K,\cdot) \in M,~w \in V \setminus L \setminus K,~J = K \cup \{w\},~|J| \leq \mathrm{kmax}\} \end{eqnarray} \] and (iii) the initial subset is \[ \begin{eqnarray} R_{P,A,\mathrm{L}} &=& \{(\{w\},X_{P,A,\mathrm{L}}(\{w\})) : w \in V \setminus L\} \end{eqnarray} \] Then the conditional entropy optimised limited-dimension conditional entropy tuple set list, $M$, is (Text) \[ \begin{eqnarray} M &=& \mathrm{topd}(\mathrm{qmax})(\mathrm{elements}(Z_{P,A,\mathrm{L}})) \subset \mathrm{P}(V \setminus L) \end{eqnarray} \] The conditional entropy tuple set builder parametersBuilderConditionalVars is defined in module AlignmentPracticable.

parametersBuilderConditionalVars :: 
  Integer -> Integer -> Integer -> Set.Set Variable -> Histogram -> 
  Maybe (Map.Map (Set.Set Variable) Double)
def parametersBuilderConditionalVars(kmax,omax,qmax,ll,aa):
    ...
    def buildc(qq,nn):
        pp = sset([kk|sgl(w) for (kk,e) in qq.items() if e > 0 for w in vvk-kk])
        mm = bot(omax,sdict([(jj,ent(red(aa,ll|jj))-ent(red(aa,jj))) for jj in pp if len(jj) <= kmax]))
        if len(mm) > 0:
            nn1 = nn.copy()
            nn1.update(mm)
            return buildc(mm,nn1)
        return nn
    if kmax < 0 or omax < 0 or qmax < 0:
        return None
    vvk = vars(aa) - ll
    rr = bot(omax,sdict([(sgl(w),ent(red(aa,ll|sgl(w)))-ent(red(aa,sgl(w)))) for w in vvk]))
    return bot(qmax,buildc(rr,rr))

top