view vb.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line source

/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Verbs: Boolean-Valued                                                   */

#include "j.h"
#include "ve.h"


BPFX( andBB, AND ,BAND, AND, BAND )    
BPFX(  orBB, OR  ,BOR,  OR,  BOR  )    
BPFX(nandBB, NAND,BNAND,NAND,BNAND)
BPFX( norBB, NOR ,BNOR, NOR, BNOR )


F1(jtrazein){R df2(w,box(raze(w)),amp(swap(ds(CEPS)),ds(COPE)));}


static F2(jtebarmat){A ya,yw,z;B b,*zv;C*au,*av,*u,*v,*v0,*wu,*wv;I*as,c,i,k,m,n,r,s,si,sj,t,*ws;
 RZ(a&&w);
 as=AS(a);      av=CAV(a);
 ws=AS(w); v=v0=wv=CAV(w);
 si=as[0]; m=1+ws[0]-si;
 sj=as[1]; n=1+ws[1]-sj;
 t=AT(w); k=bp(t); c=ws[1]; r=k*c; s=k*sj;
 GA(z,B01,AN(w),2,ws); zv=BAV(z); memset(zv,C0,AN(z));
 if(t&B01+LIT+INT||0==jt->ct&&t&FL+CMPX)
  for(i=0;i<m;++i){
   DO(n, u=av; b=0; DO(si,                         if(b=memcmp(u,v,s))break; u+=s; v+=r;); v=v0+=k; zv[i]=!b;);
   zv+=c; v=v0=wv+=r;
 }else{
  GA(ya,t,sj,1,0); au=CAV(ya);
  GA(yw,t,sj,1,0); wu=CAV(yw);
  for(i=0;i<m;++i){
   DO(n, u=av; b=0; DO(si, MC(au,u,s); MC(wu,v,s); if(b=!equ(ya,yw)  )break; u+=s; v+=r;); v=v0+=k; zv[i]=!b;);
   zv+=c; v=v0=wv+=r;
 }}
 R z;
}    /* E. on matrix arguments */

static F2(jtebarvec){A y,z;B*zv;C*av,*wv,*yv;I an,k,n,s,t,wn;
 RZ(a&&w);
 an=AN(a); av=CAV(a); 
 wn=AN(w); wv=CAV(w); n=1+wn-an; 
 t=AT(w); k=bp(t); s=k*an;
 GA(z,B01,wn,1,0); zv=BAV(z); 
 if(an&&wn>an)memset(zv+n,C0,wn-n); else memset(zv,C0,wn);
 if(t&INT||0==jt->ct&&t&FL+CMPX)DO(n, zv[i]=!memcmp(av,wv,s); wv+=k;)
 else{GA(y,t,an,AR(a),0); yv=CAV(y); DO(n, MC(yv,wv,s); zv[i]=equ(a,y); wv+=k;);}
 R z;
}    /* E. on vector arguments */

/* preparations for ebar                    */
/* return code meaning:                     */
/* >0 is cardinality of range               */
/* <0:                                      */
/* -1: not homogeneous                      */
/* -2: rank is 2                            */
/* -3: rank > 2                             */
/* -4: not discrete type or range too large */

static I jtebarprep(J jt,A a,A w,A*za,A*zw,I*zc){I ar,at,c=0,ca,cw,d=IMAX,da,dw,m,n,t,wr,wt;
 ar=AR(a); at=AT(a); m=AN(a);
 wr=AR(w); wt=AT(w); n=AN(w);
 ASSERT(ar==wr||!ar&&1==wr,EVRANK);
 if(m&&n&&!HOMO(at,wt))R -1;
 if(m&&n)RE(t=maxtype(at,wt)) else t=m?at:n?wt:B01;
 if(t!=at)RZ(a=cvt(t,a));
 if(t!=wt)RZ(w=cvt(t,w));
 *za=a; *zw=w; *zc=c;
 if(1<wr)R 2==wr?-2:-3;
 switch(t){
  case INT: irange(m,AV(a),&ca,&da); if(da)irange(n,AV(w),&cw,&dw); 
            if(da&&dw){c=MIN(ca,cw); d=MAX(ca+da,cw+dw)-c;} 
            if(0<c&&c+d<=4*n){d+=c; c=0;} break;
  case C2T: d=65536; break;
  case LIT: d=256;   break;
  case B01: d=2;     break;
 }
 R t&B01+LIT+C2T||t&INT&&0<d&&d<=4*n ? d : -4;
}

#define EBLOOP(T,SUB0,SUB1,ZFUNC)  \
   {T*u=(T*)av,*v=(T*)wv;                                            \
    DO(m, yv[SUB0]=m-i;);                                            \
    while(k< p){for(i=0;i<m&&u[i]==v[k+i];++i); ZFUNC; k+=yv[SUB1];} \
    if   (k==p){for(i=0;i<m&&u[i]==v[k+i];++i); ZFUNC;             } \
   }

F2(jtebar){PROLOG;A y,z;B*zv;C*av,*wv;I c,d,i,k=0,m,n,p,*yv;
 RZ(a&&w);
 RE(d=ebarprep(a,w,&a,&w,&c));
 av=CAV(a); m=AN(a);
 wv=CAV(w); n=AN(w); p=n-m;
 switch(d){
  case -1: R reshape(shape(w),zero);
  case -2: R ebarmat(a,w);
  case -3: R df2(shape(a),w,cut(amp(a,ds(CMATCH)),num[3]));
  case -4: R ebarvec(a,w);
 }
 GA(z,B01,n,AR(w),0); zv=BAV(z); memset(zv,C0,n);
 GA(y,INT,d,1,    0); yv= AV(y); DO(d, yv[i]=1+m;); 
 switch(AT(w)){
  case INT: if(c)EBLOOP(I, u[i]-c,v[k+m]-c, zv[k]=i==m) 
            else EBLOOP(I, u[i],  v[k+m],   zv[k]=i==m); break;
  case C2T:      EBLOOP(US,u[i],  v[k+m],   zv[k]=i==m); break;
  default:       EBLOOP(UC,u[i],  v[k+m],   zv[k]=i==m);
 }
 EPILOG(z);
}    /* Daniel M. Sunday, CACM 1990 8, 132-142 */


F2(jti1ebar){A y;C*av,*wv;I c,d,i,k=0,m,n,p,*yv;
 RZ(a&&w);
 RE(d=ebarprep(a,w,&a,&w,&c));
 av=CAV(a); m=AN(a);
 wv=CAV(w); n=AN(w); p=n-m;
 switch(d){
  case -1: R sc(n);
  case -4: R indexof(ebarvec(a,w),one);
 }
 GA(y,INT,d,1,0); yv=AV(y); DO(d, yv[i]=1+m;); 
 switch(AT(w)){
  case INT: if(c)EBLOOP(I, u[i]-c,v[k+m]-c, if(i==m)R sc(k)) 
            else EBLOOP(I, u[i],  v[k+m],   if(i==m)R sc(k)); break;
  case C2T:      EBLOOP(US,u[i],  v[k+m],   if(i==m)R sc(k)); break;
  default:       EBLOOP(UC,u[i],  v[k+m],   if(i==m)R sc(k));
 }
 R sc(n);
}    /* a (E. i. 1:) w where a and w are atoms or lists */

F2(jtsumebar){A y;C*av,*wv;I c,d,i,k=0,m,n,p,*yv,z=0;
 RZ(a&&w);
 RE(d=ebarprep(a,w,&a,&w,&c));
 av=CAV(a); m=AN(a);
 wv=CAV(w); n=AN(w); p=n-m;
 switch(d){
  case -1: R zero;
  case -4: R aslash(CPLUS,ebarvec(a,w));
 }
 GA(y,INT,d,1,0); yv=AV(y); DO(d, yv[i]=1+m;); 
 switch(AT(w)){
  case INT: if(c)EBLOOP(I, u[i]-c,v[k+m]-c, if(i==m)++z) 
            else EBLOOP(I, u[i],  v[k+m],   if(i==m)++z); break;
  case C2T:      EBLOOP(US,u[i],  v[k+m],   if(i==m)++z); break;
  default:       EBLOOP(UC,u[i],  v[k+m],   if(i==m)++z);
 }
 R sc(z);
}    /* a ([: +/ E.) w where a and w are atoms or lists */

F2(jtanyebar){A y;C*av,*wv;I c,d,i,k=0,m,n,p,*yv;
 RZ(a&&w);
 RE(d=ebarprep(a,w,&a,&w,&c));
 av=CAV(a); m=AN(a);
 wv=CAV(w); n=AN(w); p=n-m;
 switch(d){
  case -1: R zero;
  case -4: R aslash(CPLUSDOT,ebarvec(a,w));
 }
 GA(y,INT,d,1,0); yv=AV(y); DO(d, yv[i]=1+m;); 
 switch(AT(w)){
  case INT: if(c)EBLOOP(I, u[i]-c,v[k+m]-c, if(i==m)R one) 
            else EBLOOP(I, u[i],  v[k+m],   if(i==m)R one); break;
  case C2T:      EBLOOP(US,u[i],  v[k+m],   if(i==m)R one); break;
  default:       EBLOOP(UC,u[i],  v[k+m],   if(i==m)R one);
 }
 R zero;
}    /* a ([: +./ E.) w where a and w are atoms or lists */

#define IFB1  \
 {if(zu==zv){I m=zu-AV(z); RZ(z=ext(0,z)); zv=m+AV(z); zu=AN(z)+AV(z);} *zv++=k;}

F2(jtifbebar){A y,z;C*av,*wv;I c,d,i,k=0,m,n,p,*yv,*zu,*zv;
 RZ(a&&w);
 RE(d=ebarprep(a,w,&a,&w,&c));
 av=CAV(a); m=AN(a);
 wv=CAV(w); n=AN(w); p=n-m;
 switch(d){
  case -1: R mtv;
  case -4: R icap(ebarvec(a,w));
 }
 GA(z,INT,MAX(22,n/128),1,0); zv=AV(z); zu=zv+AN(z);
 GA(y,INT,d,1,0); yv=AV(y); DO(d, yv[i]=1+m;); 
 switch(AT(w)){
  case INT: if(c)EBLOOP(I, u[i]-c,v[k+m]-c, if(i==m)IFB1)
            else EBLOOP(I, u[i],  v[k+m],   if(i==m)IFB1); break;
  case C2T:      EBLOOP(US,u[i],  v[k+m],   if(i==m)IFB1); break;
  default:       EBLOOP(UC,u[i],  v[k+m],   if(i==m)IFB1);
 }
 AN(z)=*AS(z)=zv-AV(z);
 R z;
}    /* a ([: I. E.) w where a and w are atoms or lists */