Return to dp-supp.c CVS log | Up to [local] / OpenXM_contrib2 / asir2000 / builtin |
version 1.26, 2003/11/27 07:53:53 | version 1.28, 2004/02/05 08:28:53 | ||
---|---|---|---|
|
|
||
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | ||
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | ||
* | * | ||
* $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.25 2003/01/18 02:38:56 noro Exp $ | * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.27 2004/02/03 23:31:57 noro Exp $ | ||
*/ | */ | ||
#include "ca.h" | #include "ca.h" | ||
#include "base.h" | #include "base.h" | ||
|
|
||
* | * | ||
*/ | */ | ||
int create_order_spec(Obj obj,struct order_spec *spec) | int create_order_spec(VL vl,Obj obj,struct order_spec **specp) | ||
{ | { | ||
int i,j,n,s,row,col; | int i,j,n,s,row,col; | ||
struct order_spec *spec; | |||
struct order_pair *l; | struct order_pair *l; | ||
NODE node,t,tn; | NODE node,t,tn; | ||
MAT m; | MAT m; | ||
pointer **b; | pointer **b; | ||
int **w; | int **w; | ||
if ( vl && obj && OID(obj) == O_LIST ) | |||
return create_composite_order_spec(vl,(LIST)obj,specp); | |||
*specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec)); | |||
if ( !obj || NUM(obj) ) { | if ( !obj || NUM(obj) ) { | ||
spec->id = 0; spec->obj = obj; | spec->id = 0; spec->obj = obj; | ||
spec->ord.simple = QTOS((Q)obj); | spec->ord.simple = QTOS((Q)obj); | ||
|
|
||
return 0; | return 0; | ||
} | } | ||
void print_composite_order_spec(struct order_spec *spec) | |||
{ | |||
int nv,n,len,i,j,k,start; | |||
struct weight_or_block *worb; | |||
nv = spec->nv; | |||
n = spec->ord.composite.length; | |||
worb = spec->ord.composite.w_or_b; | |||
for ( i = 0; i < n; i++, worb++ ) { | |||
len = worb->length; | |||
printf("[ "); | |||
switch ( worb->type ) { | |||
case IS_DENSE_WEIGHT: | |||
for ( j = 0; j < len; j++ ) | |||
printf("%d ",worb->body.dense_weight[j]); | |||
for ( ; j < nv; j++ ) | |||
printf("0 "); | |||
break; | |||
case IS_SPARSE_WEIGHT: | |||
for ( j = 0, k = 0; j < nv; j++ ) | |||
if ( j == worb->body.sparse_weight[k].pos ) | |||
printf("%d ",worb->body.sparse_weight[k++].value); | |||
else | |||
printf("0 "); | |||
break; | |||
case IS_BLOCK: | |||
start = worb->body.block.start; | |||
for ( j = 0; j < start; j++ ) printf("0 "); | |||
switch ( worb->body.block.order ) { | |||
case 0: | |||
for ( k = 0; k < len; k++, j++ ) printf("R "); | |||
break; | |||
case 1: | |||
for ( k = 0; k < len; k++, j++ ) printf("G "); | |||
break; | |||
case 2: | |||
for ( k = 0; k < len; k++, j++ ) printf("L "); | |||
break; | |||
} | |||
for ( ; j < nv; j++ ) printf("0 "); | |||
break; | |||
} | |||
printf("]\n"); | |||
} | |||
} | |||
/* order = [w_or_b, w_or_b, ... ] */ | |||
/* w_or_b = w or b */ | |||
/* w = [1,2,...] or [x,1,y,2,...] */ | |||
/* b = [@lex,x,y,...,z] etc */ | |||
int create_composite_order_spec(VL vl,LIST order,struct order_spec **specp) | |||
{ | |||
NODE wb,t,p; | |||
struct order_spec *spec; | |||
VL tvl; | |||
int n,i,j,k,l,len; | |||
int *dw; | |||
struct sparse_weight *sw; | |||
struct weight_or_block *w_or_b; | |||
Obj a0; | |||
NODE a; | |||
V v; | |||
Symbol sym; | |||
int start; | |||
/* l = number of vars in vl */ | |||
for ( l = 0, tvl = vl; tvl; tvl = NEXT(tvl), l++ ); | |||
/* n = number of primitives in order */ | |||
wb = BDY(order); | |||
n = length(wb); | |||
*specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec)); | |||
spec->id = 3; | |||
spec->obj = (Obj)order; | |||
spec->nv = l; | |||
spec->ord.composite.length = n; | |||
w_or_b = spec->ord.composite.w_or_b = (struct weight_or_block *) | |||
MALLOC(sizeof(struct weight_or_block)*n); | |||
for ( t = wb, i = 0; t; t = NEXT(t), i++ ) { | |||
a = BDY((LIST)BDY(t)); | |||
len = length(a); | |||
a0 = (Obj)BDY(a); | |||
if ( !a0 || OID(a0) == O_N ) { | |||
/* a is a dense weight vector */ | |||
dw = (int *)MALLOC(sizeof(int)*len); | |||
for ( j = 0, p = a; j < len; p = NEXT(p), j++ ) | |||
dw[j] = QTOS((Q)BDY(p)); | |||
w_or_b[i].type = IS_DENSE_WEIGHT; | |||
w_or_b[i].length = len; | |||
w_or_b[i].body.dense_weight = dw; | |||
} else if ( OID(a0) == O_P ) { | |||
/* a is a sparse weight vector */ | |||
len >>= 1; | |||
sw = (struct sparse_weight *) | |||
MALLOC(sizeof(struct sparse_weight)*len); | |||
for ( j = 0, p = a; j < len; j++ ) { | |||
v = VR((P)BDY(p)); p = NEXT(p); | |||
for ( tvl = vl, k = 0; tvl && tvl->v != v; | |||
k++, tvl = NEXT(tvl) ); | |||
if ( !tvl ) | |||
error("invalid variable name"); | |||
sw[j].pos = k; | |||
sw[j].value = QTOS((Q)BDY(p)); p = NEXT(p); | |||
} | |||
w_or_b[i].type = IS_SPARSE_WEIGHT; | |||
w_or_b[i].length = len; | |||
w_or_b[i].body.sparse_weight = sw; | |||
} else if ( OID(a0) == O_SYMBOL ) { | |||
/* a is a block */ | |||
sym = (Symbol)a0; a = NEXT(a); len--; | |||
for ( start = 0, tvl = vl; tvl->v != VR((P)BDY(a)); | |||
tvl = NEXT(tvl), start++ ); | |||
for ( p = NEXT(a), tvl = NEXT(tvl); p; | |||
p = NEXT(p), tvl = NEXT(tvl) ) | |||
if ( tvl->v != VR((P)BDY(p)) ) break; | |||
if ( p ) | |||
error("a block must be contiguous"); | |||
w_or_b[i].type = IS_BLOCK; | |||
w_or_b[i].length = len; | |||
w_or_b[i].body.block.start = start; | |||
if ( !strcmp(sym->name,"@grlex") ) | |||
w_or_b[i].body.block.order = 0; | |||
else if ( !strcmp(sym->name,"@glex") ) | |||
w_or_b[i].body.block.order = 1; | |||
else if ( !strcmp(sym->name,"@lex") ) | |||
w_or_b[i].body.block.order = 2; | |||
else | |||
error("invalid ordernam"); | |||
} | |||
} | |||
if ( 1 ) print_composite_order_spec(spec); | |||
} | |||
/* | /* | ||
* converters | * converters | ||
* | * | ||
|
|
||
} | } | ||
void homogenize_order(struct order_spec *old,int n,struct order_spec *new) | void homogenize_order(struct order_spec *old,int n,struct order_spec **newp) | ||
{ | { | ||
struct order_pair *l; | struct order_pair *l; | ||
int length,nv,row,i,j; | int length,nv,row,i,j; | ||
int **newm,**oldm; | int **newm,**oldm; | ||
struct order_spec *new; | |||
*newp = new = (struct order_spec *)MALLOC(sizeof(struct order_spec)); | |||
switch ( old->id ) { | switch ( old->id ) { | ||
case 0: | case 0: | ||
switch ( old->ord.simple ) { | switch ( old->ord.simple ) { |