/*6:*/
#line 141 "gb_lisa.w"
#include "gb_io.h"
#include "gb_graph.h"
#define plane_lisa p_lisa \
#define MAX_M 360
#define MAX_N 250
#define MAX_D 255 \
#define panic(c) {panic_code= c;gb_trouble_code= 0;return NULL;} \
#define el_gordo 0x7fffffff \
#define pixel_value x.I
#define first_pixel y.I
#define last_pixel z.I
#define matrix_rows uu.I
#define matrix_cols vv.I \
#line 144 "gb_lisa.w"
/*4:*/
#line 126 "gb_lisa.w"
char lisa_id[]=
"lisa(360,250,9999999999,359,360,249,250,9999999999,9999999999)";
/*:4*/
#line 145 "gb_lisa.w"
/*16:*/
#line 305 "gb_lisa.w"
static long bit[30];
/*:16*//*22:*/
#line 358 "gb_lisa.w"
static long in_row[MAX_N];
/*:22*/
#line 146 "gb_lisa.w"
/*15:*/
#line 285 "gb_lisa.w"
#line 45 "gb_lisa.ch"
static long na_over_b(long n,long a,long b)
#line 288 "gb_lisa.w"
{long nmax= el_gordo/a;
register long r,k,q,br;
long a_thresh,b_thresh;
if(n<=nmax)return(n*a)/b;
a_thresh= b-a;
b_thresh= (b+1)>>1;
k= 0;
do{bit[k]= n&1;
n>>= 1;
k++;
}while(n> nmax);
r= n*a;q= r/b;r= r-q*b;
/*17:*/
#line 308 "gb_lisa.w"
do{k--;q<<= 1;
if(r<b_thresh)r<<= 1;
else q++,br= (b-r)<<1,r= b-br;
if(bit[k]){
if(r<a_thresh)r+= a;
else q++,r-= a_thresh;
}
}while(k);
/*:17*/
#line 301 "gb_lisa.w"
;
return q;
}
/*:15*//*32:*/
#line 561 "gb_lisa.w"
#line 73 "gb_lisa.ch"
static void adjac(Vertex*u,Vertex*v)
#line 564 "gb_lisa.w"
{Arc*a;
for(a= u->arcs;a;a= a->next)
if(a->tip==v)return;
gb_new_edge(u,v,1L);
}
/*:32*/
#line 147 "gb_lisa.w"
#line 26 "gb_lisa.ch"
long*lisa(
unsigned long m,unsigned long n,
unsigned long d,
unsigned long m0,unsigned long m1,
unsigned long n0,unsigned long n1,
unsigned long d0,unsigned long d1,
Area area)
#line 156 "gb_lisa.w"
{/*7:*/
#line 163 "gb_lisa.w"
long*matx= NULL;
register long k,l;
register long i,j;
long cap_M,cap_N;
long cap_D;
/*:7*//*11:*/
#line 221 "gb_lisa.w"
long*cur_pix;
long lambda;
long lam;
long next_lam;
/*:11*//*14:*/
#line 268 "gb_lisa.w"
long kappa;
long kap;
long next_kap;
long f;
long*out_row;
/*:14*/
#line 156 "gb_lisa.w"
/*8:*/
#line 170 "gb_lisa.w"
if(m1==0||m1> MAX_M)m1= MAX_M;
if(m1<=m0)panic(bad_specs+1);
if(n1==0||n1> MAX_N)n1= MAX_N;
if(n1<=n0)panic(bad_specs+2);
cap_M= m1-m0;cap_N= n1-n0;
if(m==0)m= cap_M;
if(n==0)n= cap_N;
if(d==0)d= MAX_D;
if(d1==0)d1= MAX_D*cap_M*cap_N;
if(d1<=d0)panic(bad_specs+3);
if(d1>=0x80000000)panic(bad_specs+4);
cap_D= d1-d0;
sprintf(lisa_id,"lisa(%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu)",
m,n,d,m0,m1,n0,n1,d0,d1);
/*:8*/
#line 157 "gb_lisa.w"
;
/*9:*/
#line 186 "gb_lisa.w"
matx= gb_typed_alloc(m*n,long,area);
if(gb_trouble_code)panic(no_room+1);
/*:9*/
#line 158 "gb_lisa.w"
;
/*10:*/
#line 190 "gb_lisa.w"
/*19:*/
#line 331 "gb_lisa.w"
if(gb_open("lisa.dat")!=0)
panic(early_data_fault);
for(i= 0;i<m0;i++)
for(j= 0;j<5;j++)gb_newline();
/*:19*/
#line 191 "gb_lisa.w"
;
/*13:*/
#line 247 "gb_lisa.w"
kappa= 0;
out_row= matx;
for(k= kap= 0;k<m;k++){
for(l= 0;l<n;l++)*(out_row+l)= 0;
next_kap= kap+cap_M;
do{register long nk;
if(kap>=kappa){
/*21:*/
#line 344 "gb_lisa.w"
{register long dd;
for(j= 15,cur_pix= &in_row[0];;cur_pix+= 4){
dd= gb_digit(85);dd= dd*85+gb_digit(85);dd= dd*85+gb_digit(85);
if(cur_pix==&in_row[MAX_N-2])break;
dd= dd*85+gb_digit(85);dd= dd*85+gb_digit(85);
*(cur_pix+3)= dd&0xff;dd= (dd>>8)&0xffffff;
*(cur_pix+2)= dd&0xff;dd>>= 8;
*(cur_pix+1)= dd&0xff;*cur_pix= dd>>8;
if(--j==0)gb_newline(),j= 15;
}
*(cur_pix+1)= dd&0xff;*cur_pix= dd>>8;gb_newline();
}
/*:21*/
#line 255 "gb_lisa.w"
;
kappa+= m;
}
if(kappa<next_kap)nk= kappa;
else nk= next_kap;
f= nk-kap;
/*12:*/
#line 227 "gb_lisa.w"
lambda= n;cur_pix= in_row+n0;
for(l= lam= 0;l<n;l++){register long sum= 0;
next_lam= lam+cap_N;
do{register long nl;
if(lam>=lambda)cur_pix++,lambda+= n;
if(lambda<next_lam)nl= lambda;
else nl= next_lam;
sum+= (nl-lam)*(*cur_pix);
lam= nl;
}while(lam<next_lam);
*(out_row+l)+= f*sum;
}
/*:12*/
#line 261 "gb_lisa.w"
;
kap= nk;
}while(kap<next_kap);
for(l= 0;l<n;l++,out_row++)
/*18:*/
#line 318 "gb_lisa.w"
if(*out_row<=d0)*out_row= 0;
else if(*out_row>=d1)*out_row= d;
else*out_row= na_over_b(d,*out_row-d0,cap_D);
/*:18*/
#line 265 "gb_lisa.w"
;
}
/*:13*/
#line 192 "gb_lisa.w"
;
/*20:*/
#line 337 "gb_lisa.w"
for(i= m1;i<MAX_M;i++)
for(j= 0;j<5;j++)gb_newline();
if(gb_close()!=0)
panic(late_data_fault);
/*:20*/
#line 193 "gb_lisa.w"
;
/*:10*/
#line 159 "gb_lisa.w"
;
return matx;
}
/*:6*//*23:*/
#line 56 "gb_lisa.ch"
Graph*plane_lisa(
unsigned long m,unsigned long n,
unsigned long d,
unsigned long m0,unsigned long m1,
unsigned long n0,unsigned long n1,
unsigned long d0,unsigned long d1)
#line 411 "gb_lisa.w"
{/*24:*/
#line 424 "gb_lisa.w"
Graph*new_graph;
register long j,k,l;
Area working_storage;
long*a;
long regs= 0;
/*:24*//*27:*/
#line 480 "gb_lisa.w"
unsigned long*f;
long*apos;
/*:27*//*31:*/
#line 552 "gb_lisa.w"
Vertex**u;
Vertex*v;
Vertex*w;
long aloc;
/*:31*/
#line 411 "gb_lisa.w"
init_area(working_storage);
/*26:*/
#line 468 "gb_lisa.w"
a= lisa(m,n,d,m0,m1,n0,n1,d0,d1,working_storage);
if(a==NULL)return NULL;
sscanf(lisa_id,"lisa(%lu,%lu,",&m,&n);
f= gb_typed_alloc(n,unsigned long,working_storage);
if(f==NULL){
gb_free(working_storage);
panic(no_room+2);
}
/*28:*/
#line 493 "gb_lisa.w"
for(k= m,apos= a+n*(m+1)-1;k>=0;k--)
for(l= n-1;l>=0;l--,apos--){
if(k<m){
if(k> 0&&*(apos-n)==*apos){
for(j= l;f[j]!=j;j= f[j]);
f[j]= l;
*apos= l;
}else if(f[l]==l)*apos= -1-*apos,regs++;
else*apos= f[l];
}
if(k> 0&&l<n-1&&*(apos-n)==*(apos-n+1))f[l+1]= l;
f[l]= l;
}
/*:28*/
#line 478 "gb_lisa.w"
;
/*:26*/
#line 413 "gb_lisa.w"
;
/*29:*/
#line 508 "gb_lisa.w"
new_graph= gb_new_graph(regs);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"plane_%s",lisa_id);
strcpy(new_graph->util_types,"ZZZIIIZZIIZZZZ");
new_graph->matrix_rows= m;
new_graph->matrix_cols= n;
/*:29*/
#line 414 "gb_lisa.w"
;
/*30:*/
#line 530 "gb_lisa.w"
regs= 0;
u= (Vertex**)f;
for(l= 0;l<n;l++)u[l]= NULL;
for(k= 0,apos= a,aloc= 0;k<m;k++)
for(l= 0;l<n;l++,apos++,aloc++){
w= u[l];
if(*apos<0){
sprintf(str_buf,"%ld",regs);
v= new_graph->vertices+regs;
v->name= gb_save_string(str_buf);
v->pixel_value= -*apos-1;
v->first_pixel= aloc;
regs++;
}else v= u[*apos];
u[l]= v;
v->last_pixel= aloc;
if(gb_trouble_code)goto trouble;
if(k> 0&&v!=w)adjac(v,w);
if(l> 0&&v!=u[l-1])adjac(v,u[l-1]);
}
/*:30*/
#line 415 "gb_lisa.w"
;
trouble:gb_free(working_storage);
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:23*//*33:*/
#line 84 "gb_lisa.ch"
Graph*bi_lisa(
unsigned long m,unsigned long n,
unsigned long m0,unsigned long m1,
unsigned long n0,unsigned long n1,
unsigned long thresh,
long c)
#line 597 "gb_lisa.w"
{/*34:*/
#line 609 "gb_lisa.w"
Graph*new_graph;
register long k,l;
Area working_storage;
long*a;
long*apos;
register Vertex*u,*v;
/*:34*/
#line 597 "gb_lisa.w"
init_area(working_storage);
/*35:*/
#line 617 "gb_lisa.w"
a= lisa(m,n,65535L,m0,m1,n0,n1,0L,0L,working_storage);
if(a==NULL)return NULL;
sscanf(lisa_id,"lisa(%lu,%lu,65535,%lu,%lu,%lu,%lu",&m,&n,&m0,&m1,&n0,&n1);
new_graph= gb_new_graph(m+n);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"bi_lisa(%lu,%lu,%lu,%lu,%lu,%lu,%lu,%c)",
m,n,m0,m1,n0,n1,thresh,c?'1':'0');
new_graph->util_types[7]= 'I';
mark_bipartite(new_graph,m);
for(k= 0,v= new_graph->vertices;k<m;k++,v++){
sprintf(str_buf,"r%ld",k);
v->name= gb_save_string(str_buf);
}
for(l= 0;l<n;l++,v++){
sprintf(str_buf,"c%ld",l);
v->name= gb_save_string(str_buf);
}
/*:35*/
#line 599 "gb_lisa.w"
;
/*36:*/
#line 641 "gb_lisa.w"
for(u= new_graph->vertices,apos= a;u<new_graph->vertices+m;u++)
for(v= new_graph->vertices+m;v<new_graph->vertices+m+n;apos++,v++){
if(c?*apos<thresh:*apos>=thresh){
gb_new_edge(u,v,1L);
u->arcs->b.I= v->arcs->b.I= *apos;
}
}
/*:36*/
#line 600 "gb_lisa.w"
;
gb_free(working_storage);
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:33*/
syntax highlighted by Code2HTML, v. 0.9.1