view amn.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.                                   */
/*                                                                         */
/* Adverbs: a ind}z where z is sparse and ind is <"1 integers              */

/*  amne    a is the sparse element                                        */
/*  amna    a is an arbitrary dense array                                  */
/*  amnsp   a an arbitrary sparse array                                    */

#include "j.h"


static I jtcsize(J jt,A z,A ind){B*b;I h,j,m,r,*s;P*zp;
 r=AR(z); s=AS(z); zp=PAV(z);
 RZ(b=bfi(r,SPA(zp,a),0));
 m=1; j=h=*(AR(ind)+AS(ind)-1); DO(r-h, if(b[j])m*=s[j]; ++j;);
 R m;
}    /* data cell size in z for each element of index array ind */

static B jtiaddr(J jt,A z,A ind,A*i1,A*i2){A a,ai,as,ii,jj,q,t,x,y;I c,d,e,h,i,*iv,*jv,m,n,p,*qv,*s,*u,*v,*yv;P*zp;
 zp=PAV(z); a=SPA(zp,a); x=SPA(zp,x); s=1+AS(x); 
 h=*(AS(ind)+AR(ind)-1);                               /* # axes indexed              */
 RZ(q=gt(sc(h),a)); 
 y=SPA(zp,i); if(!all1(q))RZ(y=repeatr(q,y));          /* indexed cols of index mat   */
 m=*AS(y); yv=AV(y);      
 RZ(ai=IX(h));
 RZ(as=less(IX(AR(z)),a)); u=AV(as); n=AN(as);         /* dense axes                  */
 GA(t,INT,n,1,0); v=AV(t);                             /* shape of indexed dense axes */
 e=0; d=1; DO(n, if(h>u[i])v[e++]=s[i]; else d*=s[i];);
 RZ(*i2=jj=tymes(sc(d),base2(vec(INT,e,v),repeatr(eps(ai,as),ind))));
 c=*(1+AS(y));
 if(!c){
  n=AN(jj);
  RZ(*i1=repeat(sc(n),IX(m)));
  RZ(*i2=reshape(sc(m*n),jj));
  R 1;
 }
 RZ(*i1=ii=indexof(y,repeatr(eps(ai,a),ind)));         /* group indices in index mat  */
 if(c==AN(a))R 1;
 n=AN(ii); iv=AV(ii); jv=AV(jj);                       /* do progressive iota         */
 GA(q,INT,n,1,0); qv=AV(q);                            /* group sizes                 */
 for(i=h=0;i<n;++i){
  e=1; d=iv[i]; v=yv+c*d;
  DO(m-d-1, if(ICMP(v,v+c,c))break; ++e; v+=c;);
  qv[i]=e; h+=e;                                       /* # elements in group i       */
 }
 GA(t,INT,h,1,0); u=AV(t); *i1=t;
 GA(t,INT,h,1,0); v=AV(t); *i2=t;
 DO(n, e=qv[i]; d=iv[i]; p=jv[i]; DO(e, *u++=d++; *v++=p;););
 R 1;
}    /* index i1 (in index matrix) and address i2 (in data array) from index array */

static A jtzpadn(J jt,A z,A ind,B ip){A a,ai,i1,p,p1,q,t,x,x0,y,y0,y1;B*b;I c,d,h,m,n;P*zp;
 zp=PAV(z); a=SPA(zp,a); x=x0=SPA(zp,x); y=y0=SPA(zp,i);
 n=1; h=*(AS(ind)+AR(ind)-1);
 RZ(ai=IX(h));
 RZ(t=eps(ai,a)); b=BAV(t); d=0; DO(h, if(b[i])++d;);
 RZ(i1=d<h?repeatr(t,ind):ind); if(2!=AR(ind))RZ(i1=d?reshape(v2(AN(i1)/d,d),i1):mtm);
 RZ(t=gt(sc(h),a)); RZ(y1=all1(t)?y:repeatr(t,y));
 RZ(p=nub(less(i1,y1)));
 if(c=AN(a)-d){
  RZ(t=from(less(a,ai),shape(z))); RZ(p1=odom(2L,c,AV(t))); n=*AS(p1);
  if(m=*AS(p))RZ(p=stitch(repeat(sc(n),p),reshape(v2(n*m,c),p1)));
  RZ(t=nub(repeat(eps(y1,i1),y1)));
  RZ(t=stitch(repeat(sc(n),t),reshape(v2(n**AS(t),c),p1)));
  RZ(t=less(t,y));
  if(AN(t))RZ(p=over(p,t));
 }
 if(m=*AS(p)){  /* new cells being added */
  RZ(y=over(y,p)); RZ(q=grade1(y)); RZ(y=from(q,y));
  RZ(t=shape(x)); *AV(t)=m; RZ(x=from(q,over(x,reshape(t,SPA(zp,e))))); 
  if(ip){ra(y); ra(x); fa(y0); fa(x0);}
  SPB(zp,i,y); SPB(zp,x,x);
 }
 R z;
}    /* create new indexed cells in z as necessary */

static A jtastdn(J jt,A a,A z,A ind){A a1,q,r,s;B*b;I ar,*as,*av,d,ir,n,n1,*v,zr,*zs;P*zp;
 ar=AR(a); as=AS(a);
 zr=AR(z); zs=AS(z); 
 if(!ar)R a;
 ir=AR(ind); n=*(AS(ind)+ir-1); d=(ir-1)+(zr-n); ASSERT(ar<=d,EVRANK);
 GA(s,INT,d,1,0); v=AV(s); ICPY(v,AS(ind),ir-1); ICPY(v+ir-1,zs+n,zr-n);
 ASSERT(!ICMP(as,AV(s)+d-ar,ar),EVLENGTH);
 if(ar<d)RZ(a=reshape(s,a));
 zp=PAV(z); a1=SPA(zp,a); av=AV(a1); n1=n-1;
 GA(s,B01,zr,1,0); b=BAV(s); 
 memset(b,C0,zr); DO(AN(a1), b[av[i]]=1;); memset(b,!memchr(b,C1,n)?C0:C1,n);
 GA(r,INT,zr-n1,1,0); v=AV(r); *v++=ar-(zr-n); DO(zr-n, *v++=1;);
 RZ(q=dgrade1(repeat(r,vec(B01,zr-n1,b+n1))));
 R equ(q,IX(ar))?a:cant2(q,a);
}    /* convert replacement array a into standard form relative to index array ind */

A jtamne(J jt,A a,A z,A ind,B ip){A i1,i2,x,y;C*u,*v;I*iv,*jv,k,m,n,vk,xk;P*zp;
 RZ(a&&z&&ind);
 RZ(iaddr(z,ind,&i1,&i2));
 zp=PAV(z); x=SPA(zp,x); y=SPA(zp,i);
 m=*AS(y); n=AN(i1);
 k=bp(AT(x)); xk=k*aii(x); vk=k*csize(z,ind);
 u=CAV(a); v=CAV(x); iv=AV(i1); jv=AV(i2);
 DO(n, if(m>iv[i])mvc(vk,v+xk*iv[i]+k*jv[i],k,u););
 R z;
}    /* a (<"1 ind)}z, sparse z, integer array ind, sparse element a replacement */

A jtamna(J jt,A a,A z,A ind,B ip){A i1,i2,x;C*u,*v;I*iv,*jv,k,n,vk,xk;P*zp;
 RZ(a&&z&&ind);
 RZ(z=zpadn(z,ind,ip));
 RZ(a=astdn(a,z,ind));
 RZ(iaddr(z,ind,&i1,&i2));
 zp=PAV(z); x=SPA(zp,x); n=AN(i1);
 k=bp(AT(x)); xk=k*aii(x); vk=k*csize(z,ind);
 u=CAV(a); v=CAV(x); iv=AV(i1); jv=AV(i2); 
 if(AR(a))DO(n, mvc(vk,v+xk*iv[i]+k*jv[i],vk,u); u+=vk;)
 else     DO(n, mvc(vk,v+xk*iv[i]+k*jv[i],k,u););
 R z;
}    /* a (<"1 ind)}z, dense a,integer array ind, sparse z */

A jtamnsp(J jt,A a,A z,A ind,B ip){A i1,i2,t;C*ev,*u,*v,*vv;I c,*dv,i,*iv,j,*jv,k,m,n,p,q,r,*s,*yv,zk;P*ap,*zp;
 RZ(a&&z&&ind);
 r=AR(a); ap=PAV(a); t=SPA(ap,a); if(r>AN(t))RZ(a=reaxis(IX(r),a));
 RZ(a=astdn(a,z,ind));  ap=PAV(a);
 RZ(z=zpadn(z,ind,ip)); zp=PAV(z);
 RZ(iaddr(z,ind,&i1,&i2));
 s=AS(a); n=AN(i1); c=csize(z,ind); iv=AV(i1); jv=AV(i2);
 t=SPA(ap,i); yv= AV(t); m=*AS(t); p=0;
 t=SPA(ap,e); ev=CAV(t);
 t=SPA(ap,x); u =CAV(t);
 t=SPA(zp,x); v =CAV(t); k=bp(AT(t)); zk=k*aii(t);
 GA(t,INT,r,1,0); dv=AV(t); memset(dv,C0,SZI*r); dv[r-1]=-1;
 for(i=0;i<n;++i){
  vv=v+zk*iv[i]+k*jv[i];
  for(j=0;j<c;++j){
   q=r; DO(r, --q; ++dv[q]; if(dv[q]<s[q])break; dv[q]=0;);
   q=1; while(p<m){DO(r, if(q=yv[i]-dv[i])break;); if(0<=q)break; ++p; yv+=r;}
   MC(vv,q?ev:u+k*p,k); 
   vv+=k;
 }}
 R z;
}    /* a (<"1 ind)}z, sparse a, integer array ind, sparse z */