19 void general_altra(
double *x,
double *v,
int n,
double *G,
double *ind,
int nodes,
double mult)
23 double lambda,twoNorm, ratio;
28 if ((
int) ind[0]==-1){
33 if ((
int) ind[1]!=-1){
34 printf(
"\n Error! \n Check ind");
53 memcpy(x, v,
sizeof(
double) * n);
66 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i+1];j++)
67 twoNorm += x[(
int) G[j]-1 ] * x[(int) G[j]-1 ];
68 twoNorm=sqrt(twoNorm);
70 lambda=mult*ind[3*i+2];
72 ratio=(twoNorm-lambda)/twoNorm;
77 for(j=(
int) ind[3*i]-1;j<(int) ind[3*i+1];j++)
78 x[(
int) G[j]-1 ]*=ratio;
84 for(j=(
int) ind[3*i]-1;j<(int) ind[3*i+1];j++)
90 void general_altra_mt(
double *X,
double *V,
int n,
int k,
double *G,
double *ind,
int nodes,
double mult)
94 double *x=(
double *)malloc(
sizeof(
double)*k);
95 double *v=(
double *)malloc(
sizeof(
double)*k);
127 for(i=0;i < nodes; i++){
132 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i+1];j++)
133 twoNorm += x[(
int) G[j]-1 ] * x[(int) G[j]-1 ];
134 twoNorm=sqrt(twoNorm);
136 twoNorm=twoNorm/ind[3*i+2];
138 if (twoNorm >*lambda2_max )
139 *lambda2_max=twoNorm;
147 double twoNorm, lambda;
154 if ((
int) ind[0]==-1){
159 if ((
int) ind[1]!=-1){
160 printf(
"\n Error! \n Check ind");
167 tree_norm+=fabs(x[j]);
170 tree_norm=tree_norm * lambda;
182 for(;i < nodes; i++){
188 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i+1];j++)
189 twoNorm += x[(
int) G[j]-1 ] * x[(int) G[j]-1 ];
190 twoNorm=sqrt(twoNorm);
194 tree_norm=tree_norm + lambda*twoNorm;
203 double lambda=0,squaredWeight=0, lambda1,lambda2;
204 double *x=(
double *)malloc(
sizeof(
double)*n);
205 double *ind2=(
double *)malloc(
sizeof(
double)*nodes*3);
212 if ( (
int)ind[0]==-1 )
213 squaredWeight=n*ind[2]*ind[2];
215 squaredWeight=ind[2]*ind[2];
217 for (i=1;i<nodes;i++){
218 squaredWeight+=ind[3*i+2]*ind[3*i+2];
223 lambda=sqrt(lambda/squaredWeight);
233 for(i=0;i<nodes;i++){
235 ind2[3*i+1]=ind[3*i+1];
236 ind2[3*i+2]=ind[3*i+2]*lambda;
261 for(i=0;i<nodes;i++){
262 ind2[3*i+2]=ind[3*i+2]*lambda1;
295 for(i=0;i<nodes;i++){
296 ind2[3*i+2]=ind[3*i+2]*lambda2;
320 while ( fabs(lambda2-lambda1) > lambda2 * 1e-10 ){
324 lambda=(lambda1+lambda2)/2;
328 for(i=0;i<nodes;i++){
329 ind2[3*i+2]=ind[3*i+2]*lambda;
368 double *v=(
double *)malloc(
sizeof(
double)*k);
388 if (lambda>lambdaMax)