19 void altra(
double *x,
double *v,
int n,
double *ind,
int nodes,
double mult)
22 double lambda,twoNorm, ratio;
27 if ((
int) ind[0]==-1){
32 if ((
int) ind[1]!=-1){
33 printf(
"\n Error! \n Check ind");
52 memcpy(x, v,
sizeof(
double) * n);
65 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i+1];j++)
66 twoNorm += x[j] * x[j];
67 twoNorm=sqrt(twoNorm);
69 lambda=mult*ind[3*i+2];
71 ratio=(twoNorm-lambda)/twoNorm;
76 for(j=(
int) ind[3*i]-1;j<(int) ind[3*i+1];j++)
83 for(j=(
int) ind[3*i]-1;j<(int) ind[3*i+1];j++)
89 void altra_mt(
double *X,
double *V,
int n,
int k,
double *ind,
int nodes,
double mult)
93 double *x=(
double *)malloc(
sizeof(
double)*k);
94 double *v=(
double *)malloc(
sizeof(
double)*k);
104 altra(x, v, k, ind, nodes, mult);
124 for(i=0;i < nodes; i++){
129 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i+1];j++)
130 twoNorm += x[j] * x[j];
131 twoNorm=sqrt(twoNorm);
133 twoNorm=twoNorm/ind[3*i+2];
135 if (twoNorm >*lambda2_max )
136 *lambda2_max=twoNorm;
140 double treeNorm(
double *x,
int ldx,
int n,
double *ind,
int nodes){
143 double twoNorm, lambda;
145 double tree_norm = 0;
150 if ((
int) ind[0]==-1){
155 if ((
int) ind[1]!=-1){
156 printf(
"\n Error! \n Check ind");
162 for(j=0;j<n*ldx;j+=ldx){
163 tree_norm+=fabs(x[j]);
166 tree_norm = tree_norm * lambda;
178 for(;i < nodes; i++){
184 int n_in_node = (int) ind[3*i+1] - (
int) ind[3*i]-1;
185 for(j=(
int) ind[3*i]-1;j< (int) ind[3*i]-1 + n_in_node*ldx;j+=ldx)
186 twoNorm += x[j] * x[j];
187 twoNorm=sqrt(twoNorm);
191 tree_norm = tree_norm + lambda*twoNorm;
200 double lambda=0,squaredWeight=0, lambda1,lambda2;
201 double *x=(
double *)malloc(
sizeof(
double)*n);
202 double *ind2=(
double *)malloc(
sizeof(
double)*nodes*3);
209 if ( (
int)ind[0]==-1 )
210 squaredWeight=n*ind[2]*ind[2];
212 squaredWeight=ind[2]*ind[2];
214 for (i=1;i<nodes;i++){
215 squaredWeight+=ind[3*i+2]*ind[3*i+2];
220 lambda=sqrt(lambda/squaredWeight);
230 for(i=0;i<nodes;i++){
232 ind2[3*i+1]=ind[3*i+1];
233 ind2[3*i+2]=ind[3*i+2]*lambda;
238 altra(x, v, n, ind2, nodes);
258 for(i=0;i<nodes;i++){
259 ind2[3*i+2]=ind[3*i+2]*lambda1;
264 altra(x, v, n, ind2, nodes);
292 for(i=0;i<nodes;i++){
293 ind2[3*i+2]=ind[3*i+2]*lambda2;
298 altra(x, v, n, ind2, nodes);
317 while ( fabs(lambda2-lambda1) > lambda2 * 1e-10 ){
321 lambda=(lambda1+lambda2)/2;
325 for(i=0;i<nodes;i++){
326 ind2[3*i+2]=ind[3*i+2]*lambda;
331 altra(x, v, n, ind2, nodes);
366 double *v=(
double *)malloc(
sizeof(
double)*k);
385 if (lambda>lambdaMax)