up

A priority search queue and LRU cache.
git clone git://git.jtobin.io/up.git
Log | Files | Refs

up_qat_dew.c (2095B)


      1 #include "all.h"
      2 
      3 static u3_noun
      4 _omit(u3_noun b, u3_noun k)
      5 {
      6   if (u3_nul == b) {
      7     return u3nc(u3_nul, u3_nul);
      8   }
      9 
     10   u3_noun hob = u3h(b);
     11 
     12   if (c3n == u3ud(hob)) {
     13     return u3m_bail(c3__exit);
     14   }
     15   else switch ( hob ) {
     16     default:
     17       return u3m_bail(c3__exit);
     18 
     19     case c3__tip: {
     20       u3_noun kb, pb, vb;
     21       u3x_trel(u3t(b), &kb, &pb, &vb);
     22 
     23       u3_noun mk  = u3r_mug(k);
     24       u3_noun mkb = u3r_mug(kb);
     25 
     26       return (c3n == u3r_sing(mk, mkb))
     27            ? u3nc(u3_nul, u3k(b))
     28            : u3nc(u3nq(u3_nul, u3k(kb), u3k(pb), u3k(vb)), u3_nul);
     29     }
     30 
     31     case c3__bin: {
     32       u3_noun kb, pb, vb;
     33       u3_noun tb, mb, lb, rb;
     34       u3x_qual(u3t(b), &kb, &pb, &vb, &tb);
     35       u3x_trel(tb, &mb, &lb, &rb);
     36 
     37       if (c3y == u3qdu_feud(mb, k, kb)) {
     38         return u3nc(u3_nul, u3k(b));
     39       }
     40 
     41       u3_atom mk  = u3r_mug(k);
     42       u3_atom mkb = u3r_mug(kb);
     43 
     44       if (c3y == u3r_sing(mk, mkb)) {
     45         return u3nc(u3nq(u3_nul, u3k(kb), u3k(pb), u3k(vb)),
     46                  u3qdu_fuse(mb, lb, rb));
     47       }
     48       else if (c3y == u3qdu_zero(mb, k)) {
     49         u3_noun med = _omit(lb, k);
     50         u3_noun pro = u3nc(u3k(u3h(med)),
     51                         u3qdu_funk(kb, pb, vb, mb, u3t(med), rb));
     52 
     53         u3z(med);
     54         return pro;
     55       }
     56       else {
     57           u3_noun med = _omit(rb, k);
     58           u3_noun pro = u3nc(u3k(u3h(med)),
     59                           u3qdu_wane(kb, pb, vb, mb, lb, u3t(med)));
     60 
     61           u3z(med);
     62           return pro;
     63       }
     64     }
     65   }
     66 }
     67 
     68 u3_noun
     69 u3qdu_qat_dew(u3_noun a, u3_noun k)
     70 {
     71   u3_noun med = _omit(a, k);
     72 
     73   u3_noun pm, qm;
     74   u3x_cell(med, &pm, &qm);
     75 
     76   if (u3_nul == pm) {
     77     u3z(med);
     78     return u3_nul;
     79   }
     80   else {
     81     u3_noun vel = u3t(pm);
     82 
     83     u3_noun pv, qv, rv;
     84     u3x_trel(vel, &pv, &qv, &rv);
     85 
     86     u3_noun pro = u3nc(u3_nul, u3nq(u3k(pv), u3k(qv), u3k(rv), u3k(qm)));
     87 
     88     u3z(med);
     89     return pro;
     90   }
     91 }
     92 
     93 u3_noun
     94 u3wdu_qat_dew(u3_noun cor)
     95 {
     96   u3_noun a, k;
     97 
     98   if ( (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &k, 0)) )
     99   {
    100     return u3m_bail(c3__exit);
    101   } else {
    102     return u3qdu_qat_dew(a, k);
    103   }
    104 }
    105