| 1 | /* Output from p2c, the Pascal-to-C translator */ |
|---|
| 2 | /* From input file "protml.pas" */ |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | #include "p2c.h" |
|---|
| 6 | /* p2c: protml.pas, line 2: |
|---|
| 7 | * Note: Unexpected name "seqfile" in program header [262] */ |
|---|
| 8 | /* p2c: protml.pas, line 2: |
|---|
| 9 | * Note: Unexpected name "lklfile" in program header [262] */ |
|---|
| 10 | /* p2c: protml.pas, line 2: |
|---|
| 11 | * Note: Unexpected name "tpmfile" in program header [262] */ |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | /* Maximum Likelihood Inference of Protein Phylogeny */ |
|---|
| 15 | /* (seqfile, output); */ |
|---|
| 16 | |
|---|
| 17 | /* PROTML Ver 1.01 January 6, 1993 */ |
|---|
| 18 | /* J.Adachi and M.Hasegawa */ |
|---|
| 19 | /* The Institute of Statistical Mathematics */ |
|---|
| 20 | /* 4-6-7 Minami-Azabu, Minato-ku, Tokyo 106, Japan */ |
|---|
| 21 | |
|---|
| 22 | #define maxsp 20 /* maximum number of species */ |
|---|
| 23 | #define maxnode 37 /* maxsp * 2 - 3 */ |
|---|
| 24 | #define maxpair 190 /* maxsp * (maxsp-1) / 2 */ |
|---|
| 25 | #define maxsite 500 /* maximum number of sites */ |
|---|
| 26 | #define maxptrn 500 /* maximum number of different site patterns */ |
|---|
| 27 | #define maxtree 15 /* maximum number of user trees */ |
|---|
| 28 | #define maxsmooth 30 /* number of smoothing algorithm */ |
|---|
| 29 | #define maxiterat 10 /* number of iterates of Newton method */ |
|---|
| 30 | |
|---|
| 31 | #define epsilon 1.0e-5 |
|---|
| 32 | /* stopping value of error */ |
|---|
| 33 | #define minarc 1.0e-3 |
|---|
| 34 | /* lower limit on number of subsutitutions */ |
|---|
| 35 | #define maxarc 3.0e+2 |
|---|
| 36 | /* upper limit on number of subsutitutions */ |
|---|
| 37 | |
|---|
| 38 | #define prprtn 1 /* proportion of branch length */ |
|---|
| 39 | #define maxboot 10000 |
|---|
| 40 | /* number of bootstrap resamplings */ |
|---|
| 41 | #define maxexe 1 /* number of jobs */ |
|---|
| 42 | #define maxline 60 /* length of sequence output per line */ |
|---|
| 43 | #define maxname 10 /* max. number of characters in species name */ |
|---|
| 44 | #define maxami 20 /* number of amino acids */ |
|---|
| 45 | |
|---|
| 46 | #define minreal 1.0e-55 |
|---|
| 47 | /* if job is in underflow error, |
|---|
| 48 | then increase this value */ |
|---|
| 49 | |
|---|
| 50 | #define seqfname "seqfile" /* input file of sequences data */ |
|---|
| 51 | #define tpmfname "default_not_use" |
|---|
| 52 | /* input file of trans probability */ |
|---|
| 53 | #define lklfname "default_not_use" |
|---|
| 54 | /* output file of ln likelihood */ |
|---|
| 55 | |
|---|
| 56 | |
|---|
| 57 | /* maxnode = maxsp*2 -3; */ |
|---|
| 58 | /* maxpair = maxsp*(maxsp-1) DIV 2; */ |
|---|
| 59 | |
|---|
| 60 | typedef enum { |
|---|
| 61 | ami |
|---|
| 62 | } nacidty; |
|---|
| 63 | typedef enum { |
|---|
| 64 | AA, RR, NN, DD, CC, QQ, EE, GG, HH, II, LL, KK, MM, FF, PP_, SS, TT, WW, YY, |
|---|
| 65 | VV |
|---|
| 66 | } amity; |
|---|
| 67 | typedef double aryamity[(long)VV - (long)AA + 1]; |
|---|
| 68 | typedef long iaryamity[(long)VV - (long)AA + 1]; |
|---|
| 69 | typedef aryamity daryamity[(long)VV - (long)AA + 1]; |
|---|
| 70 | typedef daryamity taryamity[(long)VV - (long)AA + 1]; |
|---|
| 71 | typedef long niaryamity[maxami]; |
|---|
| 72 | typedef double naryamity[maxami]; |
|---|
| 73 | typedef naryamity ndaryamity[maxami]; |
|---|
| 74 | typedef aryamity probamity[maxptrn]; |
|---|
| 75 | typedef Char charseqty[maxsp + 1][maxsite]; |
|---|
| 76 | typedef Char namety[maxname]; |
|---|
| 77 | typedef struct node *arynodepty[maxnode + 1]; |
|---|
| 78 | typedef double lengthty[maxnode]; |
|---|
| 79 | typedef long ilengthty[maxnode]; |
|---|
| 80 | typedef lengthty dlengthty[maxnode]; |
|---|
| 81 | typedef long sitety[maxsite]; |
|---|
| 82 | typedef long itreety[maxtree + 1]; |
|---|
| 83 | typedef double rtreety[maxtree + 1]; |
|---|
| 84 | typedef double lptrnty[maxptrn]; |
|---|
| 85 | typedef lptrnty ltrptty[maxtree + 1]; |
|---|
| 86 | typedef long spity[maxsp]; |
|---|
| 87 | typedef double rpairty[maxpair]; |
|---|
| 88 | typedef double rnodety[maxnode]; |
|---|
| 89 | typedef rnodety dpanoty[maxpair]; |
|---|
| 90 | typedef rpairty dnopaty[maxnode]; |
|---|
| 91 | typedef rnodety dnonoty[maxnode]; |
|---|
| 92 | typedef boolean umbty[maxsp + 1]; |
|---|
| 93 | typedef long lspty[maxsp + 1]; |
|---|
| 94 | typedef long longintty[6]; |
|---|
| 95 | |
|---|
| 96 | typedef struct tree { |
|---|
| 97 | /* tree topology data */ |
|---|
| 98 | arynodepty brnchp; /* point to node */ |
|---|
| 99 | double lklhd; /* ln likelihood of this tree */ |
|---|
| 100 | double vrilkl; /* variance of likelihood */ |
|---|
| 101 | lengthty vrilnga; /* variance of length(branch) */ |
|---|
| 102 | lengthty vrilnga2; /* variance2 of length(branch) */ |
|---|
| 103 | lengthty blklhd; /* ln likelihood(branch) */ |
|---|
| 104 | struct node *startp; /* point to a basal node */ |
|---|
| 105 | double aic; /* Akaike Information Criterion */ |
|---|
| 106 | /* convergence of branch length */ |
|---|
| 107 | boolean cnvrgnc; |
|---|
| 108 | } tree; |
|---|
| 109 | |
|---|
| 110 | typedef struct node { |
|---|
| 111 | /* a node of tree */ |
|---|
| 112 | struct node *isop; /* pointer to next subnode */ |
|---|
| 113 | struct node *kinp; /* pointer to an ascendant node */ |
|---|
| 114 | long diverg; /* number of divergences */ |
|---|
| 115 | long number; /* node number */ |
|---|
| 116 | namety namesp; /* species name. if this node is tip */ |
|---|
| 117 | spity descen; /* number of descenant nodes */ |
|---|
| 118 | nacidty nadata; |
|---|
| 119 | union { |
|---|
| 120 | struct { |
|---|
| 121 | probamity prba; /* a partial likelihood */ |
|---|
| 122 | double lnga; /* branch length */ |
|---|
| 123 | } U0; |
|---|
| 124 | } UU; |
|---|
| 125 | } node; |
|---|
| 126 | |
|---|
| 127 | |
|---|
| 128 | Static FILE *seqfile; /* data file of amino acid sequences */ |
|---|
| 129 | Static FILE *lklfile; /* output file of ln likelihood of site */ |
|---|
| 130 | /* transition probability matrix data */ |
|---|
| 131 | Static FILE *tpmfile; |
|---|
| 132 | Static long numsp; /* number of species */ |
|---|
| 133 | Static long ibrnch1; /* first numbering of internal branch */ |
|---|
| 134 | Static long ibrnch2; /* last numbering of internal branch */ |
|---|
| 135 | Static long numpair; /* number of species pairs */ |
|---|
| 136 | Static long endsite; /* number of sites */ |
|---|
| 137 | Static long endptrn; /* max number of site patterns */ |
|---|
| 138 | Static long numnw; /* curent numbering of Newton method */ |
|---|
| 139 | Static long numsm; /* curent numbering of smoothing */ |
|---|
| 140 | Static long numexe; /* curent numbering of executes */ |
|---|
| 141 | Static long numtrees; /* total number of tree topologies */ |
|---|
| 142 | Static long notree; /* current numbering of tree */ |
|---|
| 143 | Static long maxltr; /* numbering of max ln likelihood tree */ |
|---|
| 144 | Static long minatr; /* numbering of min AIC tree */ |
|---|
| 145 | /* numbering of decomposable stage */ |
|---|
| 146 | Static long stage; |
|---|
| 147 | Static double maxlkl; /* max ln likelihood of trees */ |
|---|
| 148 | /* min AIC of trees */ |
|---|
| 149 | Static double minaic; |
|---|
| 150 | /* current character of seqfile */ |
|---|
| 151 | Static Char chs; |
|---|
| 152 | Static boolean normal; /* break out error */ |
|---|
| 153 | Static boolean usertree; /* U option designate user trees */ |
|---|
| 154 | Static boolean semiaoptn; /* S option semi-auto decomposition */ |
|---|
| 155 | Static boolean bootsoptn; /* B option bootstrap probability */ |
|---|
| 156 | Static boolean writeoptn; /* W option print output data */ |
|---|
| 157 | Static boolean debugoptn; /* D option print debug data */ |
|---|
| 158 | Static boolean putlkoptn; /* P option */ |
|---|
| 159 | Static boolean firstoptn; /* F option */ |
|---|
| 160 | Static boolean lastoptn; /* L option */ |
|---|
| 161 | Static boolean readtoptn; /* R option */ |
|---|
| 162 | /* */ |
|---|
| 163 | Static boolean smoothed; |
|---|
| 164 | |
|---|
| 165 | Static tree ctree; /* current tree */ |
|---|
| 166 | Static aryamity freqa; /* amino acid frequency(acid type) */ |
|---|
| 167 | Static charseqty chsequen; /* acid sequence data(species,site) */ |
|---|
| 168 | Static sitety weight; /* total number of a new site(new site) */ |
|---|
| 169 | Static sitety alias; /* number of old site(new site) */ |
|---|
| 170 | Static sitety weightw; /* work area of weight */ |
|---|
| 171 | Static aryamity freqdyhf, eval, eval2; |
|---|
| 172 | Static daryamity ev, iev; |
|---|
| 173 | Static taryamity coefp; |
|---|
| 174 | Static node *freenode; |
|---|
| 175 | Static itreety paratree; /* number of parameters */ |
|---|
| 176 | Static rtreety lklhdtree; /* ln likelihood */ |
|---|
| 177 | Static rtreety lklboottree; /* ln likelihood (bootstrap) */ |
|---|
| 178 | Static rtreety aictree; /* Akaike Information Criterion */ |
|---|
| 179 | Static rtreety boottree; /* bootstrap probability */ |
|---|
| 180 | Static ltrptty lklhdtrpt; /* ln likelihood */ |
|---|
| 181 | |
|---|
| 182 | |
|---|
| 183 | /*** print line ***/ |
|---|
| 184 | Static Void printline(num) |
|---|
| 185 | long num; |
|---|
| 186 | { |
|---|
| 187 | /* print '-' line to standard output */ |
|---|
| 188 | long i; |
|---|
| 189 | |
|---|
| 190 | putchar(' '); |
|---|
| 191 | for (i = 1; i <= num; i++) |
|---|
| 192 | putchar('-'); |
|---|
| 193 | putchar('\n'); |
|---|
| 194 | } /* printline */ |
|---|
| 195 | |
|---|
| 196 | |
|---|
| 197 | /*******************************************************/ |
|---|
| 198 | /***** READ DATA, INITIALIZATION AND SET UP *****/ |
|---|
| 199 | /*******************************************************/ |
|---|
| 200 | |
|---|
| 201 | /*** GET NUMBERS OF SPECIES AND SITES ***/ |
|---|
| 202 | Static Void getnums() |
|---|
| 203 | { |
|---|
| 204 | /* get species-number,sites-number from file*/ |
|---|
| 205 | /* input number of species, number of sites */ |
|---|
| 206 | fscanf(seqfile, "%ld%ld", &numsp, &endsite); |
|---|
| 207 | if (usertree) { |
|---|
| 208 | ibrnch1 = numsp + 1; |
|---|
| 209 | ibrnch2 = numsp * 2 - 3; |
|---|
| 210 | } else { |
|---|
| 211 | ibrnch1 = numsp + 1; |
|---|
| 212 | ibrnch2 = numsp; |
|---|
| 213 | } |
|---|
| 214 | /* numpair := numsp*(numsp-1) DIV 2; */ |
|---|
| 215 | numpair = (long)((numsp * numsp - numsp) / 2.0); |
|---|
| 216 | if (numsp > maxsp) |
|---|
| 217 | printf("TOO MANY SPECIES: adjust CONSTants\n"); |
|---|
| 218 | if (endsite > maxsite) |
|---|
| 219 | printf("TOO MANY SITES: adjust CONSTants\n"); |
|---|
| 220 | normal = (numsp <= maxsp && endsite <= maxsite); |
|---|
| 221 | } /* getnums */ |
|---|
| 222 | |
|---|
| 223 | |
|---|
| 224 | Local boolean letter(chru) |
|---|
| 225 | Char chru; |
|---|
| 226 | { |
|---|
| 227 | /* tests whether chru is a letter, (ASCII and EBCDIC) */ |
|---|
| 228 | return (chru >= 'A' && chru <= 'I' || chru >= 'J' && chru <= 'R' || |
|---|
| 229 | chru >= 'S' && chru <= 'Z' || chru >= 'a' && chru <= 'i' || |
|---|
| 230 | chru >= 'j' && chru <= 'r' || chru >= 's' && chru <= 'z'); |
|---|
| 231 | } /* letter */ |
|---|
| 232 | |
|---|
| 233 | |
|---|
| 234 | /*** CONVERT CHARACTER TO UPPER CASE ***/ |
|---|
| 235 | Static Void uppercase(chru) |
|---|
| 236 | Char *chru; |
|---|
| 237 | { |
|---|
| 238 | /* convert character to upper case */ |
|---|
| 239 | /* convert chru to upper case -- either ASCII or EBCDIC */ |
|---|
| 240 | if (letter(*chru) && |
|---|
| 241 | (strcmp("a", "A") > 0 && *chru >= 'a' || |
|---|
| 242 | strcmp("a", "A") < 0 && *chru < 'A')) |
|---|
| 243 | *chru = _toupper(*chru); |
|---|
| 244 | } /* uppercase */ |
|---|
| 245 | |
|---|
| 246 | |
|---|
| 247 | /*** GET OPERATIONAL OPTIONS ***/ |
|---|
| 248 | Static Void getoptions() |
|---|
| 249 | { |
|---|
| 250 | /* get option from sequences file */ |
|---|
| 251 | Char chrop; |
|---|
| 252 | |
|---|
| 253 | usertree = false; |
|---|
| 254 | semiaoptn = false; |
|---|
| 255 | firstoptn = false; |
|---|
| 256 | lastoptn = false; |
|---|
| 257 | putlkoptn = false; |
|---|
| 258 | bootsoptn = false; |
|---|
| 259 | writeoptn = false; |
|---|
| 260 | debugoptn = false; |
|---|
| 261 | readtoptn = false; |
|---|
| 262 | while (!P_eoln(seqfile)) { |
|---|
| 263 | chrop = getc(seqfile); |
|---|
| 264 | if (chrop == '\n') |
|---|
| 265 | chrop = ' '; |
|---|
| 266 | uppercase(&chrop); |
|---|
| 267 | if (chrop != 'U' && chrop != 'S' && chrop != 'F' && chrop != 'L' && |
|---|
| 268 | chrop != 'B' && chrop != 'P' && chrop != 'W' && chrop != 'D' && |
|---|
| 269 | chrop != 'R') { |
|---|
| 270 | if (chrop != ' ') { |
|---|
| 271 | printf(" BAD OPTION CHARACTER: %c\n", chrop); |
|---|
| 272 | normal = false; |
|---|
| 273 | } |
|---|
| 274 | continue; |
|---|
| 275 | } |
|---|
| 276 | switch (chrop) { |
|---|
| 277 | |
|---|
| 278 | case 'U': |
|---|
| 279 | usertree = true; |
|---|
| 280 | break; |
|---|
| 281 | |
|---|
| 282 | case 'S': |
|---|
| 283 | semiaoptn = true; |
|---|
| 284 | break; |
|---|
| 285 | |
|---|
| 286 | case 'F': |
|---|
| 287 | firstoptn = true; |
|---|
| 288 | break; |
|---|
| 289 | |
|---|
| 290 | case 'L': |
|---|
| 291 | lastoptn = true; |
|---|
| 292 | break; |
|---|
| 293 | |
|---|
| 294 | case 'P': |
|---|
| 295 | putlkoptn = true; |
|---|
| 296 | break; |
|---|
| 297 | |
|---|
| 298 | case 'B': |
|---|
| 299 | bootsoptn = true; |
|---|
| 300 | break; |
|---|
| 301 | |
|---|
| 302 | case 'W': |
|---|
| 303 | writeoptn = true; |
|---|
| 304 | break; |
|---|
| 305 | |
|---|
| 306 | case 'D': |
|---|
| 307 | debugoptn = true; |
|---|
| 308 | break; |
|---|
| 309 | |
|---|
| 310 | case 'R': |
|---|
| 311 | readtoptn = true; |
|---|
| 312 | break; |
|---|
| 313 | } |
|---|
| 314 | } |
|---|
| 315 | if (!(numexe == 1 && writeoptn)) |
|---|
| 316 | return; |
|---|
| 317 | printf("\n%15s", "Users Option"); |
|---|
| 318 | printf("%14s%5s", "Usertree : ", usertree ? "TRUE" : "FALSE"); |
|---|
| 319 | printf("%14s%5s", "Semiaoptn : ", semiaoptn ? "TRUE" : "FALSE"); |
|---|
| 320 | printf("%14s%5s\n", "Bootsoptn : ", bootsoptn ? "TRUE" : "FALSE"); |
|---|
| 321 | printf("%15c", ' '); |
|---|
| 322 | printf("%14s%5s", "Putlkoptn : ", putlkoptn ? "TRUE" : "FALSE"); |
|---|
| 323 | printf("%14s%5s", "Writeoptn : ", writeoptn ? "TRUE" : "FALSE"); |
|---|
| 324 | printf("%14s%5s\n", "Debugoptn : ", debugoptn ? "TRUE" : "FALSE"); |
|---|
| 325 | printf("%15c", ' '); |
|---|
| 326 | printf("%14s%5s", "Firstoptn : ", firstoptn ? "TRUE" : "FALSE"); |
|---|
| 327 | printf("%14s%5s\n\n", "Lastoptn : ", lastoptn ? "TRUE" : "FALSE"); |
|---|
| 328 | } /* getoptions */ |
|---|
| 329 | |
|---|
| 330 | |
|---|
| 331 | /*** GET AMINO ACID FREQENCY FROM DATASET ***/ |
|---|
| 332 | Static Void readbasefreqs() |
|---|
| 333 | { |
|---|
| 334 | /* get freqency from sequences file */ |
|---|
| 335 | amity ba; |
|---|
| 336 | |
|---|
| 337 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 338 | getc(seqfile); |
|---|
| 339 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 340 | fscanf(seqfile, "%lg", &freqa[(long)ba - (long)AA]); |
|---|
| 341 | } /* readbasefreqs */ |
|---|
| 342 | |
|---|
| 343 | |
|---|
| 344 | /*** SETUP DATASTRUCTURE OF TREE ***/ |
|---|
| 345 | Static Void setuptree(tr) |
|---|
| 346 | tree *tr; |
|---|
| 347 | { |
|---|
| 348 | /* setup datastructure of tree */ |
|---|
| 349 | long i, k; |
|---|
| 350 | node *p; |
|---|
| 351 | long FORLIM, FORLIM1; |
|---|
| 352 | |
|---|
| 353 | FORLIM = numsp; |
|---|
| 354 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 355 | p = (node *)Malloc(sizeof(node)); |
|---|
| 356 | p->number = i; |
|---|
| 357 | p->UU.U0.lnga = 0.0; |
|---|
| 358 | p->isop = NULL; |
|---|
| 359 | p->diverg = 0; |
|---|
| 360 | FORLIM1 = numsp; |
|---|
| 361 | for (k = 0; k < FORLIM1; k++) |
|---|
| 362 | p->descen[k] = 0; |
|---|
| 363 | p->descen[i - 1] = 1; |
|---|
| 364 | tr->brnchp[i] = p; |
|---|
| 365 | p->nadata = ami; |
|---|
| 366 | } |
|---|
| 367 | tr->lklhd = -999999.0; |
|---|
| 368 | tr->aic = 0.0; |
|---|
| 369 | tr->startp = tr->brnchp[1]; |
|---|
| 370 | tr->cnvrgnc = false; |
|---|
| 371 | } /* setuptree */ |
|---|
| 372 | |
|---|
| 373 | |
|---|
| 374 | /*** GET SEQUENCES AND PRINTOUT SEQUENCES ***/ |
|---|
| 375 | Static Void getsequence() |
|---|
| 376 | { |
|---|
| 377 | /* get and print sequences from file */ |
|---|
| 378 | long is, js, ks, ls, ms, ns, ichr, numchr, maxchr; |
|---|
| 379 | Char chrs; |
|---|
| 380 | Char chrcnt[30]; |
|---|
| 381 | long ichrcnt[30]; |
|---|
| 382 | boolean namechar, existenced; |
|---|
| 383 | long FORLIM, FORLIM1; |
|---|
| 384 | |
|---|
| 385 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 386 | getc(seqfile); |
|---|
| 387 | if (debugoptn) |
|---|
| 388 | putchar('\n'); |
|---|
| 389 | FORLIM = numsp; |
|---|
| 390 | for (is = 1; is <= FORLIM; is++) { |
|---|
| 391 | /* readln(seqfile); */ |
|---|
| 392 | do { |
|---|
| 393 | if (P_eoln(seqfile)) { |
|---|
| 394 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 395 | getc(seqfile); |
|---|
| 396 | } |
|---|
| 397 | chrs = getc(seqfile); |
|---|
| 398 | if (chrs == '\n') |
|---|
| 399 | chrs = ' '; |
|---|
| 400 | if (debugoptn) { |
|---|
| 401 | if (chrs == ' ') |
|---|
| 402 | putchar(chrs); |
|---|
| 403 | } |
|---|
| 404 | } while (chrs == ' '); |
|---|
| 405 | if (debugoptn) { |
|---|
| 406 | printf("<SPACE>\n"); |
|---|
| 407 | putchar(chrs); |
|---|
| 408 | } |
|---|
| 409 | namechar = true; |
|---|
| 410 | ns = 0; |
|---|
| 411 | do { |
|---|
| 412 | ns++; |
|---|
| 413 | if (ns <= maxname) |
|---|
| 414 | ctree.brnchp[is]->namesp[ns - 1] = chrs; |
|---|
| 415 | if (P_eoln(seqfile)) |
|---|
| 416 | namechar = false; |
|---|
| 417 | else { |
|---|
| 418 | chrs = getc(seqfile); |
|---|
| 419 | if (chrs == '\n') |
|---|
| 420 | chrs = ' '; |
|---|
| 421 | if (chrs == ' ') |
|---|
| 422 | namechar = false; |
|---|
| 423 | } |
|---|
| 424 | if (debugoptn) { |
|---|
| 425 | if (namechar) |
|---|
| 426 | putchar(chrs); |
|---|
| 427 | } |
|---|
| 428 | } while (namechar); |
|---|
| 429 | if (ns < maxname) { |
|---|
| 430 | for (js = ns; js < maxname; js++) |
|---|
| 431 | ctree.brnchp[is]->namesp[js] = ' '; |
|---|
| 432 | } |
|---|
| 433 | /* FOR js := 1 TO maxname DO |
|---|
| 434 | BEGIN |
|---|
| 435 | read(seqfile, chrs); |
|---|
| 436 | ctree.brnchp[is]^.namesp[js] := chrs; |
|---|
| 437 | END; */ |
|---|
| 438 | if (debugoptn) { |
|---|
| 439 | printf("<NAME>\n"); |
|---|
| 440 | putchar(chrs); |
|---|
| 441 | } |
|---|
| 442 | FORLIM1 = endsite; |
|---|
| 443 | for (js = 1; js <= FORLIM1; js++) { |
|---|
| 444 | if (normal) { |
|---|
| 445 | do { |
|---|
| 446 | if (P_eoln(seqfile)) { |
|---|
| 447 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 448 | getc(seqfile); |
|---|
| 449 | } |
|---|
| 450 | chrs = getc(seqfile); |
|---|
| 451 | if (chrs == '\n') |
|---|
| 452 | chrs = ' '; |
|---|
| 453 | } while (chrs == ' ' || chrs >= '0' && chrs <= '9'); |
|---|
| 454 | uppercase(&chrs); |
|---|
| 455 | if (debugoptn) |
|---|
| 456 | putchar(chrs); |
|---|
| 457 | if (chrs != 'A' && chrs != 'C' && chrs != 'D' && chrs != 'E' && |
|---|
| 458 | chrs != 'F' && chrs != 'G' && chrs != 'H' && chrs != 'I' && |
|---|
| 459 | chrs != 'K' && chrs != 'L' && chrs != 'M' && chrs != 'N' && |
|---|
| 460 | chrs != 'P' && chrs != 'Q' && chrs != 'R' && chrs != 'S' && |
|---|
| 461 | chrs != 'T' && chrs != 'V' && chrs != 'W' && chrs != 'Y' && |
|---|
| 462 | chrs != 'B' && chrs != 'Z' && chrs != 'V' && chrs != 'X' && |
|---|
| 463 | chrs != '*' && chrs != '-') { |
|---|
| 464 | printf( |
|---|
| 465 | "\n WARNING -- BAD AMINO ACID \"%c\" AT POSITION%5ld OF SPECIES%3ld\n", |
|---|
| 466 | chrs, js, is); |
|---|
| 467 | normal = false; |
|---|
| 468 | } |
|---|
| 469 | chsequen[is][js - 1] = chrs; |
|---|
| 470 | } |
|---|
| 471 | } |
|---|
| 472 | if (debugoptn) |
|---|
| 473 | putchar('\n'); |
|---|
| 474 | } |
|---|
| 475 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 476 | getc(seqfile); |
|---|
| 477 | |
|---|
| 478 | FORLIM = endsite; |
|---|
| 479 | for (ks = 0; ks < FORLIM; ks++) { |
|---|
| 480 | ichr = 0; |
|---|
| 481 | FORLIM1 = numsp; |
|---|
| 482 | for (js = 0; js < FORLIM1; js++) |
|---|
| 483 | ichrcnt[js] = 0; |
|---|
| 484 | FORLIM1 = numsp; |
|---|
| 485 | for (js = 0; js < FORLIM1; js++) |
|---|
| 486 | chrcnt[js] = ' '; |
|---|
| 487 | FORLIM1 = numsp; |
|---|
| 488 | for (js = 1; js <= FORLIM1; js++) { |
|---|
| 489 | chrs = chsequen[js][ks]; |
|---|
| 490 | existenced = false; |
|---|
| 491 | for (ms = 0; ms < ichr; ms++) { |
|---|
| 492 | if (chrs == chrcnt[ms]) { |
|---|
| 493 | ichrcnt[ms]++; |
|---|
| 494 | existenced = true; |
|---|
| 495 | } |
|---|
| 496 | } |
|---|
| 497 | if (!existenced) { |
|---|
| 498 | ichr++; |
|---|
| 499 | chrcnt[ichr - 1] = chrs; |
|---|
| 500 | ichrcnt[ichr - 1] = 1; |
|---|
| 501 | } |
|---|
| 502 | } |
|---|
| 503 | maxchr = 0; |
|---|
| 504 | numchr = 0; |
|---|
| 505 | for (ms = 1; ms <= ichr; ms++) { |
|---|
| 506 | if (ichrcnt[ms - 1] > maxchr) { |
|---|
| 507 | maxchr = ichrcnt[ms - 1]; |
|---|
| 508 | numchr = ms; |
|---|
| 509 | } |
|---|
| 510 | } |
|---|
| 511 | if (numchr != 0) |
|---|
| 512 | chsequen[0][ks] = chrcnt[numchr - 1]; |
|---|
| 513 | else |
|---|
| 514 | chsequen[0][ks] = '?'; |
|---|
| 515 | } |
|---|
| 516 | |
|---|
| 517 | if (numexe != 1) |
|---|
| 518 | return; |
|---|
| 519 | printf("\n%15s", "Sequences Data"); |
|---|
| 520 | printf("%5ld%9s%5ld%6s\n\n", numsp, "Species,", endsite, "Sites"); |
|---|
| 521 | printf(" Species%5cAmino Acid Sequences\n", ' '); |
|---|
| 522 | printf(" -------%5c--------------------\n\n", ' '); |
|---|
| 523 | FORLIM = (endsite - 1) / maxline + 1; |
|---|
| 524 | for (is = 1; is <= FORLIM; is++) { |
|---|
| 525 | FORLIM1 = numsp; |
|---|
| 526 | for (js = 0; js <= FORLIM1; js++) { |
|---|
| 527 | if (js == 0) { |
|---|
| 528 | printf(" Consensus"); /* Consensus Consent */ |
|---|
| 529 | for (ks = 1; ks <= maxname - 7; ks++) |
|---|
| 530 | putchar(' '); |
|---|
| 531 | |
|---|
| 532 | } else { |
|---|
| 533 | putchar(' '); |
|---|
| 534 | for (ks = 0; ks < maxname; ks++) |
|---|
| 535 | putchar(ctree.brnchp[js]->namesp[ks]); |
|---|
| 536 | printf(" "); |
|---|
| 537 | } |
|---|
| 538 | ls = maxline * is; |
|---|
| 539 | if (ls > endsite) |
|---|
| 540 | ls = endsite; |
|---|
| 541 | for (ks = maxline * (is - 1) + 1; ks <= ls; ks++) { |
|---|
| 542 | if (normal) { |
|---|
| 543 | if (js > 0 && chsequen[js][ks - 1] == chsequen[0][ks - 1]) |
|---|
| 544 | putchar('.'); |
|---|
| 545 | else |
|---|
| 546 | putchar(chsequen[js][ks - 1]); |
|---|
| 547 | if (ks % 10 == 0 && ks % maxline != 0) |
|---|
| 548 | putchar(' '); |
|---|
| 549 | /* p2c: protml.pas, line 466: |
|---|
| 550 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 551 | /* p2c: protml.pas, line 466: |
|---|
| 552 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 553 | } |
|---|
| 554 | } |
|---|
| 555 | putchar('\n'); |
|---|
| 556 | } |
|---|
| 557 | putchar('\n'); |
|---|
| 558 | } |
|---|
| 559 | } /* getsequence */ |
|---|
| 560 | |
|---|
| 561 | |
|---|
| 562 | /*************************************/ |
|---|
| 563 | /*** READ SEQUENCES DATA ***/ |
|---|
| 564 | /*************************************/ |
|---|
| 565 | |
|---|
| 566 | Static Void getdata() |
|---|
| 567 | { |
|---|
| 568 | /* read data from sequences file */ |
|---|
| 569 | if (numexe == 1) { |
|---|
| 570 | printline(57L); |
|---|
| 571 | printf(" PROTML Ver.1.00b in MOLPHY\n"); |
|---|
| 572 | printf(" Maximum Likelihood Inference of Protein Phylogeny\n"); |
|---|
| 573 | printf(" based on Dayhoff model\n"); |
|---|
| 574 | printline(57L); |
|---|
| 575 | } |
|---|
| 576 | getnums(); |
|---|
| 577 | if (normal) |
|---|
| 578 | getoptions(); |
|---|
| 579 | /* IF NOT freqsfrom THEN readbasefreqs; */ |
|---|
| 580 | if (numexe == 1) { |
|---|
| 581 | if (normal) |
|---|
| 582 | setuptree(&ctree); |
|---|
| 583 | } |
|---|
| 584 | if (normal) |
|---|
| 585 | getsequence(); |
|---|
| 586 | } /* getdata */ |
|---|
| 587 | |
|---|
| 588 | |
|---|
| 589 | /*** SORT OF SEQUENCES ***/ |
|---|
| 590 | Static Void sitesort() |
|---|
| 591 | { |
|---|
| 592 | /* sort sequences */ |
|---|
| 593 | /* Shell sort keeping sites, weights in same order */ |
|---|
| 594 | long gap, i, j, jj, jg, k, itemp; |
|---|
| 595 | boolean flip, tied; |
|---|
| 596 | long FORLIM; |
|---|
| 597 | |
|---|
| 598 | FORLIM = endsite; |
|---|
| 599 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 600 | alias[i - 1] = i; |
|---|
| 601 | weightw[i - 1] = 1; |
|---|
| 602 | } |
|---|
| 603 | gap = endsite / 2; |
|---|
| 604 | while (gap > 0) { |
|---|
| 605 | FORLIM = endsite; |
|---|
| 606 | for (i = gap + 1; i <= FORLIM; i++) { |
|---|
| 607 | j = i - gap; |
|---|
| 608 | flip = true; |
|---|
| 609 | while (j > 0 && flip) { |
|---|
| 610 | jj = alias[j - 1]; |
|---|
| 611 | jg = alias[j + gap - 1]; |
|---|
| 612 | flip = false; /* fel */ |
|---|
| 613 | tied = true; /* fel */ |
|---|
| 614 | k = 1; |
|---|
| 615 | while (k <= numsp && tied) { |
|---|
| 616 | flip = (chsequen[k][jj - 1] > chsequen[k][jg - 1]); |
|---|
| 617 | tied = (tied && chsequen[k][jj - 1] == chsequen[k][jg - 1]); |
|---|
| 618 | k++; |
|---|
| 619 | } |
|---|
| 620 | if (!flip) |
|---|
| 621 | break; |
|---|
| 622 | itemp = alias[j - 1]; |
|---|
| 623 | alias[j - 1] = alias[j + gap - 1]; |
|---|
| 624 | alias[j + gap - 1] = itemp; |
|---|
| 625 | itemp = weightw[j - 1]; |
|---|
| 626 | weightw[j - 1] = weightw[j + gap - 1]; |
|---|
| 627 | weightw[j + gap - 1] = itemp; |
|---|
| 628 | j -= gap; |
|---|
| 629 | } |
|---|
| 630 | } |
|---|
| 631 | gap /= 2; |
|---|
| 632 | } |
|---|
| 633 | } /* sitesort */ |
|---|
| 634 | |
|---|
| 635 | |
|---|
| 636 | /*** COMBINATION OF SITE ***/ |
|---|
| 637 | Static Void sitecombine() |
|---|
| 638 | { |
|---|
| 639 | /* combine sites */ |
|---|
| 640 | /* combine sites that have identical patterns */ |
|---|
| 641 | long i, j, k; |
|---|
| 642 | boolean tied; |
|---|
| 643 | |
|---|
| 644 | i = 1; |
|---|
| 645 | while (i < endsite) { |
|---|
| 646 | j = i + 1; |
|---|
| 647 | tied = true; |
|---|
| 648 | while (j <= endsite && tied) { |
|---|
| 649 | k = 1; /* fel */ |
|---|
| 650 | while (k <= numsp && tied) { |
|---|
| 651 | tied = (tied && chsequen[k][alias[i - 1] - 1] == chsequen[k] |
|---|
| 652 | [alias[j - 1] - 1]); |
|---|
| 653 | k++; |
|---|
| 654 | } |
|---|
| 655 | if (tied && weightw[j - 1] > 0) { |
|---|
| 656 | weightw[i - 1] += weightw[j - 1]; |
|---|
| 657 | weightw[j - 1] = 0; |
|---|
| 658 | alias[j - 1] = alias[i - 1]; |
|---|
| 659 | } |
|---|
| 660 | j++; |
|---|
| 661 | } |
|---|
| 662 | i = j - 1; |
|---|
| 663 | } |
|---|
| 664 | } /* sitecombine */ |
|---|
| 665 | |
|---|
| 666 | |
|---|
| 667 | /*** SCRUNCH OF SITE ***/ |
|---|
| 668 | Static Void sitescrunch() |
|---|
| 669 | { |
|---|
| 670 | /* move so positively weighted sites come first */ |
|---|
| 671 | long i, j, itemp; |
|---|
| 672 | boolean done, found; |
|---|
| 673 | |
|---|
| 674 | done = false; |
|---|
| 675 | i = 1; |
|---|
| 676 | j = 2; |
|---|
| 677 | while (!done) { |
|---|
| 678 | found = false; |
|---|
| 679 | if (weightw[i - 1] > 0) |
|---|
| 680 | i++; |
|---|
| 681 | else { |
|---|
| 682 | if (j <= i) |
|---|
| 683 | j = i + 1; |
|---|
| 684 | if (j <= endsite) { |
|---|
| 685 | found = false; |
|---|
| 686 | do { |
|---|
| 687 | found = (weightw[j - 1] > 0); |
|---|
| 688 | j++; |
|---|
| 689 | } while (!(found || j > endsite)); |
|---|
| 690 | if (found) { |
|---|
| 691 | j--; |
|---|
| 692 | itemp = alias[i - 1]; |
|---|
| 693 | alias[i - 1] = alias[j - 1]; |
|---|
| 694 | alias[j - 1] = itemp; |
|---|
| 695 | itemp = weightw[i - 1]; |
|---|
| 696 | weightw[i - 1] = weightw[j - 1]; |
|---|
| 697 | weightw[j - 1] = itemp; |
|---|
| 698 | } else |
|---|
| 699 | done = true; |
|---|
| 700 | } else |
|---|
| 701 | done = true; |
|---|
| 702 | } |
|---|
| 703 | done = (done || i >= endsite); |
|---|
| 704 | } |
|---|
| 705 | } /* sitescrunch */ |
|---|
| 706 | |
|---|
| 707 | |
|---|
| 708 | /*** PRINT PATTERN ***/ |
|---|
| 709 | Static Void printpattern(maxorder) |
|---|
| 710 | long maxorder; |
|---|
| 711 | { |
|---|
| 712 | /* print patterned sequences */ |
|---|
| 713 | /* print pattern */ |
|---|
| 714 | long i, j, k, l, n, m, big, sml, kweight, FORLIM, FORLIM1; |
|---|
| 715 | |
|---|
| 716 | /* */ |
|---|
| 717 | if (debugoptn) { |
|---|
| 718 | printf("\nalias :\n"); |
|---|
| 719 | FORLIM = endptrn; |
|---|
| 720 | for (i = 0; i < FORLIM; i++) |
|---|
| 721 | printf("%4ld", alias[i]); |
|---|
| 722 | printf("\n\nweight :\n"); |
|---|
| 723 | FORLIM = endptrn; |
|---|
| 724 | for (i = 0; i < FORLIM; i++) |
|---|
| 725 | printf("%4ld", weight[i]); |
|---|
| 726 | printf("\n\nendptrn =%5ld\n\n\n", endptrn); |
|---|
| 727 | } |
|---|
| 728 | if (debugoptn) { |
|---|
| 729 | printf(" num alias weight pattern\n"); |
|---|
| 730 | FORLIM = endptrn; |
|---|
| 731 | for (i = 0; i < FORLIM; i++) { |
|---|
| 732 | printf("%4ld%6ld%7ld ", i + 1, alias[i], weight[i]); |
|---|
| 733 | FORLIM1 = numsp; |
|---|
| 734 | for (j = 1; j <= FORLIM1; j++) |
|---|
| 735 | printf("%2c", chsequen[j][alias[i] - 1]); |
|---|
| 736 | putchar('\n'); |
|---|
| 737 | } |
|---|
| 738 | putchar('\n'); |
|---|
| 739 | } |
|---|
| 740 | /* */ |
|---|
| 741 | if (!writeoptn) |
|---|
| 742 | return; |
|---|
| 743 | |
|---|
| 744 | printf("\n Species%5cPatternized Sequences\n", ' '); |
|---|
| 745 | printf(" -------%5c---------------------\n\n", ' '); |
|---|
| 746 | FORLIM = (endptrn - 1) / maxline; |
|---|
| 747 | for (i = 0; i <= FORLIM; i++) { |
|---|
| 748 | l = maxline * (i + 1); |
|---|
| 749 | if (l > endptrn) |
|---|
| 750 | l = endptrn; |
|---|
| 751 | FORLIM1 = numsp; |
|---|
| 752 | for (j = 1; j <= FORLIM1; j++) { |
|---|
| 753 | putchar(' '); |
|---|
| 754 | for (k = 0; k < maxname; k++) |
|---|
| 755 | putchar(ctree.brnchp[j]->namesp[k]); |
|---|
| 756 | printf(" "); |
|---|
| 757 | for (k = maxline * i + 1; k <= l; k++) { |
|---|
| 758 | if (normal) { |
|---|
| 759 | if (j > 1 && |
|---|
| 760 | chsequen[j][alias[k - 1] - 1] == chsequen[1][alias[k - 1] - 1]) |
|---|
| 761 | putchar('.'); |
|---|
| 762 | else |
|---|
| 763 | putchar(chsequen[j][alias[k - 1] - 1]); |
|---|
| 764 | if (k % 10 == 0 && k % maxline != 0) |
|---|
| 765 | putchar(' '); |
|---|
| 766 | /* p2c: protml.pas, line 685: |
|---|
| 767 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 768 | /* p2c: protml.pas, line 685: |
|---|
| 769 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 770 | } |
|---|
| 771 | } |
|---|
| 772 | putchar('\n'); |
|---|
| 773 | } |
|---|
| 774 | putchar('\n'); |
|---|
| 775 | |
|---|
| 776 | for (n = maxorder; n >= 1; n--) { |
|---|
| 777 | printf("%3c", ' '); |
|---|
| 778 | for (k = 1; k <= maxname; k++) |
|---|
| 779 | putchar(' '); |
|---|
| 780 | big = 1; |
|---|
| 781 | for (m = 1; m <= n; m++) |
|---|
| 782 | big *= 10; |
|---|
| 783 | sml = big / 10; |
|---|
| 784 | for (k = maxline * i + 1; k <= l; k++) { |
|---|
| 785 | if (normal) { |
|---|
| 786 | kweight = weight[k - 1] % big / sml; |
|---|
| 787 | /* p2c: protml.pas, line 700: |
|---|
| 788 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 789 | if (kweight > 0 && kweight < 10) |
|---|
| 790 | printf("%ld", kweight); |
|---|
| 791 | else if (kweight == 0) { |
|---|
| 792 | if (weight[k - 1] % big == weight[k - 1]) |
|---|
| 793 | putchar(' '); |
|---|
| 794 | else if (weight[k - 1] % big < weight[k - 1]) |
|---|
| 795 | putchar('0'); |
|---|
| 796 | else |
|---|
| 797 | putchar('*'); |
|---|
| 798 | /* p2c: protml.pas, line 705: |
|---|
| 799 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 800 | } else |
|---|
| 801 | putchar('?'); |
|---|
| 802 | if (k % 10 == 0 && k % maxline != 0) |
|---|
| 803 | putchar(' '); |
|---|
| 804 | /* p2c: protml.pas, line 714: |
|---|
| 805 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 806 | /* p2c: protml.pas, line 714: |
|---|
| 807 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 808 | } |
|---|
| 809 | } |
|---|
| 810 | putchar('\n'); |
|---|
| 811 | } |
|---|
| 812 | putchar('\n'); |
|---|
| 813 | } |
|---|
| 814 | |
|---|
| 815 | /* p2c: protml.pas, line 707: |
|---|
| 816 | * Note: Using % for possibly-negative arguments [317] */ |
|---|
| 817 | } /* printpattern */ |
|---|
| 818 | |
|---|
| 819 | |
|---|
| 820 | /***********************************/ |
|---|
| 821 | /*** ARRANGE SITES OF SEQUENCES ***/ |
|---|
| 822 | /***********************************/ |
|---|
| 823 | |
|---|
| 824 | Static Void makeweights() |
|---|
| 825 | { |
|---|
| 826 | /* condense same site-pattern */ |
|---|
| 827 | /* make up weights vector to avoid duplicate computations */ |
|---|
| 828 | long iw, jw, kw, maxorder, maxweight, nweight, nw, FORLIM, FORLIM1; |
|---|
| 829 | |
|---|
| 830 | sitesort(); |
|---|
| 831 | sitecombine(); |
|---|
| 832 | sitescrunch(); |
|---|
| 833 | maxorder = 0; |
|---|
| 834 | maxweight = 0; |
|---|
| 835 | FORLIM = endsite; |
|---|
| 836 | for (iw = 0; iw < FORLIM; iw++) { |
|---|
| 837 | weight[iw] = weightw[iw]; |
|---|
| 838 | if (weight[iw] > 0) |
|---|
| 839 | endptrn = iw + 1; |
|---|
| 840 | if (weight[iw] > maxweight) { |
|---|
| 841 | maxweight = weight[iw]; |
|---|
| 842 | nweight = weight[iw]; |
|---|
| 843 | nw = 0; |
|---|
| 844 | do { |
|---|
| 845 | nweight /= 10; |
|---|
| 846 | nw++; |
|---|
| 847 | } while (nweight != 0); |
|---|
| 848 | if (nw > maxorder) |
|---|
| 849 | maxorder = nw; |
|---|
| 850 | } |
|---|
| 851 | } |
|---|
| 852 | if (endptrn > maxptrn) { |
|---|
| 853 | printf(" TOO MANY PATTERNS: increase CONSTant maxptrn to at least %5ld\n", |
|---|
| 854 | endptrn); |
|---|
| 855 | normal = false; |
|---|
| 856 | } |
|---|
| 857 | |
|---|
| 858 | kw = 0; |
|---|
| 859 | FORLIM = endptrn; |
|---|
| 860 | for (iw = 1; iw <= FORLIM; iw++) { |
|---|
| 861 | FORLIM1 = weight[iw - 1]; |
|---|
| 862 | for (jw = 1; jw <= FORLIM1; jw++) { |
|---|
| 863 | kw++; |
|---|
| 864 | weightw[kw - 1] = iw; |
|---|
| 865 | } |
|---|
| 866 | } |
|---|
| 867 | |
|---|
| 868 | printpattern(maxorder); |
|---|
| 869 | |
|---|
| 870 | } /* makeweights */ |
|---|
| 871 | |
|---|
| 872 | |
|---|
| 873 | /*****************************************/ |
|---|
| 874 | /*** SET PARTIAL LIKELIHOODS AT TIPS ***/ |
|---|
| 875 | /*****************************************/ |
|---|
| 876 | |
|---|
| 877 | Static Void makevalues() |
|---|
| 878 | { |
|---|
| 879 | /* set up fractional likelihoods */ |
|---|
| 880 | /* set up fractional likelihoods at tips */ |
|---|
| 881 | long i, j, k; |
|---|
| 882 | amity ba; |
|---|
| 883 | long FORLIM, FORLIM1; |
|---|
| 884 | |
|---|
| 885 | FORLIM = endptrn; |
|---|
| 886 | for (k = 0; k < FORLIM; k++) { |
|---|
| 887 | j = alias[k]; |
|---|
| 888 | FORLIM1 = numsp; |
|---|
| 889 | for (i = 1; i <= FORLIM1; i++) { |
|---|
| 890 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 891 | ctree.brnchp[i]->UU.U0.prba[k][(long)ba - (long)AA] = 0.0; |
|---|
| 892 | switch (chsequen[i][j - 1]) { |
|---|
| 893 | |
|---|
| 894 | case 'A': |
|---|
| 895 | ctree.brnchp[i]->UU.U0.prba[k][0] = 1.0; |
|---|
| 896 | break; |
|---|
| 897 | |
|---|
| 898 | case 'R': |
|---|
| 899 | ctree.brnchp[i]->UU.U0.prba[k][(long)RR - (long)AA] = 1.0; |
|---|
| 900 | break; |
|---|
| 901 | |
|---|
| 902 | case 'N': |
|---|
| 903 | ctree.brnchp[i]->UU.U0.prba[k][(long)NN - (long)AA] = 1.0; |
|---|
| 904 | break; |
|---|
| 905 | |
|---|
| 906 | case 'D': |
|---|
| 907 | ctree.brnchp[i]->UU.U0.prba[k][(long)DD - (long)AA] = 1.0; |
|---|
| 908 | break; |
|---|
| 909 | |
|---|
| 910 | case 'C': |
|---|
| 911 | ctree.brnchp[i]->UU.U0.prba[k][(long)CC - (long)AA] = 1.0; |
|---|
| 912 | break; |
|---|
| 913 | |
|---|
| 914 | case 'Q': |
|---|
| 915 | ctree.brnchp[i]->UU.U0.prba[k][(long)QQ - (long)AA] = 1.0; |
|---|
| 916 | break; |
|---|
| 917 | |
|---|
| 918 | case 'E': |
|---|
| 919 | ctree.brnchp[i]->UU.U0.prba[k][(long)EE - (long)AA] = 1.0; |
|---|
| 920 | break; |
|---|
| 921 | |
|---|
| 922 | case 'G': |
|---|
| 923 | ctree.brnchp[i]->UU.U0.prba[k][(long)GG - (long)AA] = 1.0; |
|---|
| 924 | break; |
|---|
| 925 | |
|---|
| 926 | case 'H': |
|---|
| 927 | ctree.brnchp[i]->UU.U0.prba[k][(long)HH - (long)AA] = 1.0; |
|---|
| 928 | break; |
|---|
| 929 | |
|---|
| 930 | case 'I': |
|---|
| 931 | ctree.brnchp[i]->UU.U0.prba[k][(long)II - (long)AA] = 1.0; |
|---|
| 932 | break; |
|---|
| 933 | |
|---|
| 934 | case 'L': |
|---|
| 935 | ctree.brnchp[i]->UU.U0.prba[k][(long)LL - (long)AA] = 1.0; |
|---|
| 936 | break; |
|---|
| 937 | |
|---|
| 938 | case 'K': |
|---|
| 939 | ctree.brnchp[i]->UU.U0.prba[k][(long)KK - (long)AA] = 1.0; |
|---|
| 940 | break; |
|---|
| 941 | |
|---|
| 942 | case 'M': |
|---|
| 943 | ctree.brnchp[i]->UU.U0.prba[k][(long)MM - (long)AA] = 1.0; |
|---|
| 944 | break; |
|---|
| 945 | |
|---|
| 946 | case 'F': |
|---|
| 947 | ctree.brnchp[i]->UU.U0.prba[k][(long)FF - (long)AA] = 1.0; |
|---|
| 948 | break; |
|---|
| 949 | |
|---|
| 950 | case 'P': |
|---|
| 951 | ctree.brnchp[i]->UU.U0.prba[k][(long)PP_ - (long)AA] = 1.0; |
|---|
| 952 | break; |
|---|
| 953 | |
|---|
| 954 | case 'S': |
|---|
| 955 | ctree.brnchp[i]->UU.U0.prba[k][(long)SS - (long)AA] = 1.0; |
|---|
| 956 | break; |
|---|
| 957 | |
|---|
| 958 | case 'T': |
|---|
| 959 | ctree.brnchp[i]->UU.U0.prba[k][(long)TT - (long)AA] = 1.0; |
|---|
| 960 | break; |
|---|
| 961 | |
|---|
| 962 | case 'W': |
|---|
| 963 | ctree.brnchp[i]->UU.U0.prba[k][(long)WW - (long)AA] = 1.0; |
|---|
| 964 | break; |
|---|
| 965 | |
|---|
| 966 | case 'Y': |
|---|
| 967 | ctree.brnchp[i]->UU.U0.prba[k][(long)YY - (long)AA] = 1.0; |
|---|
| 968 | break; |
|---|
| 969 | |
|---|
| 970 | case 'V': |
|---|
| 971 | ctree.brnchp[i]->UU.U0.prba[k][(long)VV - (long)AA] = 1.0; |
|---|
| 972 | break; |
|---|
| 973 | |
|---|
| 974 | case 'B': |
|---|
| 975 | ctree.brnchp[i]->UU.U0.prba[k][(long)DD - (long)AA] = 0.5; |
|---|
| 976 | ctree.brnchp[i]->UU.U0.prba[k][(long)NN - (long)AA] = 0.5; |
|---|
| 977 | break; |
|---|
| 978 | |
|---|
| 979 | case 'Z': |
|---|
| 980 | ctree.brnchp[i]->UU.U0.prba[k][(long)EE - (long)AA] = 0.5; |
|---|
| 981 | ctree.brnchp[i]->UU.U0.prba[k][(long)QQ - (long)AA] = 0.5; |
|---|
| 982 | break; |
|---|
| 983 | |
|---|
| 984 | case 'X': |
|---|
| 985 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 986 | ctree.brnchp[i]->UU.U0.prba[k][(long)ba - (long)AA] = 1.0; |
|---|
| 987 | break; |
|---|
| 988 | |
|---|
| 989 | case '?': |
|---|
| 990 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 991 | ctree.brnchp[i]->UU.U0.prba[k][(long)ba - (long)AA] = 1.0; |
|---|
| 992 | break; |
|---|
| 993 | |
|---|
| 994 | case '-': |
|---|
| 995 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 996 | ctree.brnchp[i]->UU.U0.prba[k][(long)ba - (long)AA] = 1.0; |
|---|
| 997 | break; |
|---|
| 998 | } |
|---|
| 999 | } |
|---|
| 1000 | } |
|---|
| 1001 | } /* makevalues */ |
|---|
| 1002 | |
|---|
| 1003 | |
|---|
| 1004 | /*** EMPIRICAL FREQENCIES OF AMINO ACIDS ***/ |
|---|
| 1005 | Static Void empirifreqsA() |
|---|
| 1006 | { |
|---|
| 1007 | /* calculate empirical frequencies */ |
|---|
| 1008 | /* Get empirical frequencies of amino acids from the data */ |
|---|
| 1009 | long ia, ja; |
|---|
| 1010 | amity ba; |
|---|
| 1011 | aryamity sfreqa; |
|---|
| 1012 | double sum; |
|---|
| 1013 | long FORLIM, FORLIM1; |
|---|
| 1014 | |
|---|
| 1015 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1016 | sfreqa[(long)ba - (long)AA] = 0.0; |
|---|
| 1017 | sum = 0.0; |
|---|
| 1018 | FORLIM = numsp; |
|---|
| 1019 | for (ia = 1; ia <= FORLIM; ia++) { |
|---|
| 1020 | FORLIM1 = endptrn; |
|---|
| 1021 | for (ja = 0; ja < FORLIM1; ja++) { |
|---|
| 1022 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1023 | sfreqa[(long)ba - (long)AA] += |
|---|
| 1024 | weight[ja] * ctree.brnchp[ia]->UU.U0.prba[ja][(long)ba - (long)AA]; |
|---|
| 1025 | } |
|---|
| 1026 | } |
|---|
| 1027 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1028 | sum += sfreqa[(long)ba - (long)AA]; |
|---|
| 1029 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1030 | freqa[(long)ba - (long)AA] = sfreqa[(long)ba - (long)AA] / sum; |
|---|
| 1031 | if (!(numexe == 1 && writeoptn)) |
|---|
| 1032 | return; |
|---|
| 1033 | printf("\n%13s%7.1f\n", " Total acid :", sum); |
|---|
| 1034 | printf("%13s", " A,R,N,D,C :"); |
|---|
| 1035 | for (ba = AA; (long)ba <= (long)CC; ba = (amity)((long)ba + 1)) |
|---|
| 1036 | printf("%7.1f", sfreqa[(long)ba - (long)AA]); |
|---|
| 1037 | printf("\n%13s", " Q,E,G,H,I :"); |
|---|
| 1038 | for (ba = QQ; (long)ba <= (long)II; ba = (amity)((long)ba + 1)) |
|---|
| 1039 | printf("%7.1f", sfreqa[(long)ba - (long)AA]); |
|---|
| 1040 | printf("\n%13s", " L,K,M,F,P :"); |
|---|
| 1041 | for (ba = LL; (long)ba <= (long)PP_; ba = (amity)((long)ba + 1)) |
|---|
| 1042 | printf("%7.1f", sfreqa[(long)ba - (long)AA]); |
|---|
| 1043 | printf("\n%13s", " S,T,W,Y,V :"); |
|---|
| 1044 | for (ba = SS; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1045 | printf("%7.1f", sfreqa[(long)ba - (long)AA]); |
|---|
| 1046 | putchar('\n'); |
|---|
| 1047 | } /* empirifreqsA */ |
|---|
| 1048 | |
|---|
| 1049 | |
|---|
| 1050 | /*************************************/ |
|---|
| 1051 | /*** GET FREQUENCY ***/ |
|---|
| 1052 | /*************************************/ |
|---|
| 1053 | |
|---|
| 1054 | Static Void getbasefreqs() |
|---|
| 1055 | { |
|---|
| 1056 | /* print frequencies */ |
|---|
| 1057 | amity ba; |
|---|
| 1058 | |
|---|
| 1059 | empirifreqsA(); |
|---|
| 1060 | if (!(numexe == 1 && writeoptn)) |
|---|
| 1061 | return; |
|---|
| 1062 | printf("\n Empirical"); |
|---|
| 1063 | /* IF freqsfrom THEN */ |
|---|
| 1064 | printf(" Amino Acid Frequencies:\n"); |
|---|
| 1065 | printf("%13s", "A,R,N,D,C :"); |
|---|
| 1066 | for (ba = AA; (long)ba <= (long)CC; ba = (amity)((long)ba + 1)) |
|---|
| 1067 | printf("%7.3f", freqa[(long)ba - (long)AA]); |
|---|
| 1068 | printf("\n%13s", "Q,E,G,H,I :"); |
|---|
| 1069 | for (ba = QQ; (long)ba <= (long)II; ba = (amity)((long)ba + 1)) |
|---|
| 1070 | printf("%7.3f", freqa[(long)ba - (long)AA]); |
|---|
| 1071 | printf("\n%13s", "L,K,M,F,P :"); |
|---|
| 1072 | for (ba = LL; (long)ba <= (long)PP_; ba = (amity)((long)ba + 1)) |
|---|
| 1073 | printf("%7.3f", freqa[(long)ba - (long)AA]); |
|---|
| 1074 | printf("\n%13s", "S,T,W,Y,V :"); |
|---|
| 1075 | for (ba = SS; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1076 | printf("%7.3f", freqa[(long)ba - (long)AA]); |
|---|
| 1077 | putchar('\n'); |
|---|
| 1078 | } /* getbasefreqs */ |
|---|
| 1079 | |
|---|
| 1080 | |
|---|
| 1081 | Static Void getinput() |
|---|
| 1082 | { |
|---|
| 1083 | /* read data and set up data */ |
|---|
| 1084 | /* read input file */ |
|---|
| 1085 | normal = true; |
|---|
| 1086 | if (normal) |
|---|
| 1087 | getdata(); |
|---|
| 1088 | if (normal) |
|---|
| 1089 | makeweights(); |
|---|
| 1090 | if (normal) |
|---|
| 1091 | makevalues(); |
|---|
| 1092 | if (normal) |
|---|
| 1093 | getbasefreqs(); |
|---|
| 1094 | } /* getinput */ |
|---|
| 1095 | |
|---|
| 1096 | |
|---|
| 1097 | Static Void printnmtrx(nmtrx) |
|---|
| 1098 | naryamity *nmtrx; |
|---|
| 1099 | { |
|---|
| 1100 | long i, j; |
|---|
| 1101 | |
|---|
| 1102 | printf(" MATRIX(numtype)\n"); |
|---|
| 1103 | for (i = 0; i <= 19; i++) { |
|---|
| 1104 | for (j = 1; j <= 20; j++) { |
|---|
| 1105 | printf("%7.3f", nmtrx[i][j - 1]); |
|---|
| 1106 | if (j == 10 || j == 20) |
|---|
| 1107 | putchar('\n'); |
|---|
| 1108 | } |
|---|
| 1109 | putchar('\n'); |
|---|
| 1110 | } |
|---|
| 1111 | } /* printnmtrx */ |
|---|
| 1112 | |
|---|
| 1113 | |
|---|
| 1114 | #define eps 1.0e-20 |
|---|
| 1115 | |
|---|
| 1116 | |
|---|
| 1117 | Static Void luinverse(omtrx, imtrx, nmtrx) |
|---|
| 1118 | naryamity *omtrx, *imtrx; |
|---|
| 1119 | long nmtrx; |
|---|
| 1120 | { |
|---|
| 1121 | /* INVERSION OF MATRIX ON LU DECOMPOSITION */ |
|---|
| 1122 | long i, j, k, l, maxi, idx, ix, jx; |
|---|
| 1123 | double sum, tmp, maxb, aw; |
|---|
| 1124 | niaryamity index; |
|---|
| 1125 | double *wk; |
|---|
| 1126 | |
|---|
| 1127 | wk = (double *)Malloc(sizeof(naryamity)); |
|---|
| 1128 | aw = 1.0; |
|---|
| 1129 | for (i = 0; i < nmtrx; i++) { |
|---|
| 1130 | maxb = 0.0; |
|---|
| 1131 | for (j = 0; j < nmtrx; j++) { |
|---|
| 1132 | if (fabs(omtrx[i][j]) > maxb) |
|---|
| 1133 | maxb = fabs(omtrx[i][j]); |
|---|
| 1134 | } |
|---|
| 1135 | if (maxb == 0.0) |
|---|
| 1136 | printf("PROC. LUINVERSE: singular\n"); |
|---|
| 1137 | wk[i] = 1.0 / maxb; |
|---|
| 1138 | } |
|---|
| 1139 | for (j = 1; j <= nmtrx; j++) { |
|---|
| 1140 | for (i = 1; i < j; i++) { |
|---|
| 1141 | sum = omtrx[i - 1][j - 1]; |
|---|
| 1142 | for (k = 0; k <= i - 2; k++) |
|---|
| 1143 | sum -= omtrx[i - 1][k] * omtrx[k][j - 1]; |
|---|
| 1144 | omtrx[i - 1][j - 1] = sum; |
|---|
| 1145 | } |
|---|
| 1146 | maxb = 0.0; |
|---|
| 1147 | for (i = j; i <= nmtrx; i++) { |
|---|
| 1148 | sum = omtrx[i - 1][j - 1]; |
|---|
| 1149 | for (k = 0; k <= j - 2; k++) |
|---|
| 1150 | sum -= omtrx[i - 1][k] * omtrx[k][j - 1]; |
|---|
| 1151 | omtrx[i - 1][j - 1] = sum; |
|---|
| 1152 | tmp = wk[i - 1] * fabs(sum); |
|---|
| 1153 | if (tmp >= maxb) { |
|---|
| 1154 | maxb = tmp; |
|---|
| 1155 | maxi = i; |
|---|
| 1156 | } |
|---|
| 1157 | } |
|---|
| 1158 | if (j != maxi) { |
|---|
| 1159 | for (k = 0; k < nmtrx; k++) { |
|---|
| 1160 | tmp = omtrx[maxi - 1][k]; |
|---|
| 1161 | omtrx[maxi - 1][k] = omtrx[j - 1][k]; |
|---|
| 1162 | omtrx[j - 1][k] = tmp; |
|---|
| 1163 | } |
|---|
| 1164 | aw = -aw; |
|---|
| 1165 | wk[maxi - 1] = wk[j - 1]; |
|---|
| 1166 | } |
|---|
| 1167 | index[j - 1] = maxi; |
|---|
| 1168 | if (omtrx[j - 1][j - 1] == 0.0) |
|---|
| 1169 | omtrx[j - 1][j - 1] = eps; |
|---|
| 1170 | if (j != nmtrx) { |
|---|
| 1171 | tmp = 1.0 / omtrx[j - 1][j - 1]; |
|---|
| 1172 | for (i = j; i < nmtrx; i++) |
|---|
| 1173 | omtrx[i][j - 1] *= tmp; |
|---|
| 1174 | } |
|---|
| 1175 | } |
|---|
| 1176 | for (jx = 0; jx < nmtrx; jx++) { |
|---|
| 1177 | for (ix = 0; ix < nmtrx; ix++) |
|---|
| 1178 | wk[ix] = 0.0; |
|---|
| 1179 | wk[jx] = 1.0; |
|---|
| 1180 | l = 0; |
|---|
| 1181 | for (i = 1; i <= nmtrx; i++) { |
|---|
| 1182 | idx = index[i - 1]; |
|---|
| 1183 | sum = wk[idx - 1]; |
|---|
| 1184 | wk[idx - 1] = wk[i - 1]; |
|---|
| 1185 | if (l != 0) { |
|---|
| 1186 | for (j = l - 1; j <= i - 2; j++) |
|---|
| 1187 | sum -= omtrx[i - 1][j] * wk[j]; |
|---|
| 1188 | } else if (sum != 0.0) |
|---|
| 1189 | l = i; |
|---|
| 1190 | wk[i - 1] = sum; |
|---|
| 1191 | } |
|---|
| 1192 | for (i = nmtrx - 1; i >= 0; i--) { |
|---|
| 1193 | sum = wk[i]; |
|---|
| 1194 | for (j = i + 1; j < nmtrx; j++) |
|---|
| 1195 | sum -= omtrx[i][j] * wk[j]; |
|---|
| 1196 | wk[i] = sum / omtrx[i][i]; |
|---|
| 1197 | } |
|---|
| 1198 | for (ix = 0; ix < nmtrx; ix++) |
|---|
| 1199 | imtrx[ix][jx] = wk[ix]; |
|---|
| 1200 | } |
|---|
| 1201 | Free(wk); |
|---|
| 1202 | } /* luinverse */ |
|---|
| 1203 | |
|---|
| 1204 | #undef eps |
|---|
| 1205 | |
|---|
| 1206 | |
|---|
| 1207 | Static Void mproduct(am, bm, cm, na, nb, nc) |
|---|
| 1208 | naryamity *am, *bm, *cm; |
|---|
| 1209 | long na, nb, nc; |
|---|
| 1210 | { |
|---|
| 1211 | long ia, ib, ic; |
|---|
| 1212 | double sum; |
|---|
| 1213 | |
|---|
| 1214 | for (ia = 0; ia < na; ia++) { |
|---|
| 1215 | for (ic = 0; ic < nc; ic++) { |
|---|
| 1216 | sum = 0.0; |
|---|
| 1217 | for (ib = 0; ib < nb; ib++) |
|---|
| 1218 | sum += am[ia][ib] * bm[ib][ic]; |
|---|
| 1219 | cm[ia][ic] = sum; |
|---|
| 1220 | } |
|---|
| 1221 | } |
|---|
| 1222 | } /* mproduct */ |
|---|
| 1223 | |
|---|
| 1224 | |
|---|
| 1225 | Static Void convermtrx(amtrx, nmtrx) |
|---|
| 1226 | aryamity *amtrx; |
|---|
| 1227 | naryamity *nmtrx; |
|---|
| 1228 | { |
|---|
| 1229 | amity ba1, ba2; |
|---|
| 1230 | |
|---|
| 1231 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1232 | for (ba2 = AA; (long)ba2 <= (long)VV; ba2 = (amity)((long)ba2 + 1)) |
|---|
| 1233 | nmtrx[(int)ba1][(int)ba2] = amtrx[(long)ba1 - (long)AA] |
|---|
| 1234 | [(long)ba2 - (long)AA]; |
|---|
| 1235 | } |
|---|
| 1236 | } /* convermtrx */ |
|---|
| 1237 | |
|---|
| 1238 | |
|---|
| 1239 | Static Void reconvermtrx(nmtrx, amtrx) |
|---|
| 1240 | naryamity *nmtrx; |
|---|
| 1241 | aryamity *amtrx; |
|---|
| 1242 | { |
|---|
| 1243 | amity ba1, ba2; |
|---|
| 1244 | |
|---|
| 1245 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1246 | for (ba2 = AA; (long)ba2 <= (long)VV; ba2 = (amity)((long)ba2 + 1)) |
|---|
| 1247 | amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA] = nmtrx[(int)ba1] |
|---|
| 1248 | [(int)ba2]; |
|---|
| 1249 | } |
|---|
| 1250 | } /* reconvermtrx */ |
|---|
| 1251 | |
|---|
| 1252 | |
|---|
| 1253 | Static Void printeigen() |
|---|
| 1254 | { |
|---|
| 1255 | amity ba1, ba2; |
|---|
| 1256 | |
|---|
| 1257 | printf(" EIGEN VECTOR\n"); |
|---|
| 1258 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1259 | for (ba2 = AA; (long)ba2 <= (long)VV; ba2 = (amity)((long)ba2 + 1)) { |
|---|
| 1260 | printf("%7.3f", ev[(long)ba1 - (long)AA][(long)ba2 - (long)AA]); |
|---|
| 1261 | if (ba2 == II || ba2 == VV) |
|---|
| 1262 | putchar('\n'); |
|---|
| 1263 | } |
|---|
| 1264 | putchar('\n'); |
|---|
| 1265 | } |
|---|
| 1266 | printf(" EIGEN VALUE\n"); |
|---|
| 1267 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1268 | printf("%7.3f", eval[(long)ba1 - (long)AA]); |
|---|
| 1269 | if (ba1 == II || ba1 == VV) |
|---|
| 1270 | putchar('\n'); |
|---|
| 1271 | } |
|---|
| 1272 | } /* printeigen */ |
|---|
| 1273 | |
|---|
| 1274 | |
|---|
| 1275 | Static Void checkevector(imtrx, nn) |
|---|
| 1276 | naryamity *imtrx; |
|---|
| 1277 | long nn; |
|---|
| 1278 | { |
|---|
| 1279 | long i, j; |
|---|
| 1280 | |
|---|
| 1281 | for (i = 1; i <= nn; i++) { |
|---|
| 1282 | for (j = 1; j <= nn; j++) { |
|---|
| 1283 | if (i == j) { |
|---|
| 1284 | if (fabs(imtrx[i - 1][j - 1] - 1.0) > 1.0e-5) |
|---|
| 1285 | printf(" error1 eigen vector (checkevector)\n"); |
|---|
| 1286 | } else { |
|---|
| 1287 | if (fabs(imtrx[i - 1][j - 1]) > 1.0e-5) |
|---|
| 1288 | printf(" error2 eigen vector (checkevector)\n"); |
|---|
| 1289 | } |
|---|
| 1290 | } |
|---|
| 1291 | } |
|---|
| 1292 | } /* checkevector */ |
|---|
| 1293 | |
|---|
| 1294 | |
|---|
| 1295 | Static Void printamtrx(amtrx) |
|---|
| 1296 | aryamity *amtrx; |
|---|
| 1297 | { |
|---|
| 1298 | amity ba1, ba2; |
|---|
| 1299 | |
|---|
| 1300 | printf(" MATRIX(amitype)\n"); |
|---|
| 1301 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1302 | for (ba2 = AA; (long)ba2 <= (long)VV; ba2 = (amity)((long)ba2 + 1)) { |
|---|
| 1303 | if (amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA] > 0.1e-5) |
|---|
| 1304 | printf("%14.8f", amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA]); |
|---|
| 1305 | else if (amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA] <= 0.0) |
|---|
| 1306 | printf("%6c% .1E", |
|---|
| 1307 | ' ', amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA]); |
|---|
| 1308 | else |
|---|
| 1309 | printf("%3c% .4E", |
|---|
| 1310 | ' ', amtrx[(long)ba1 - (long)AA][(long)ba2 - (long)AA]); |
|---|
| 1311 | if (ba2 == II || ba2 == VV || ba2 == CC || ba2 == PP_) |
|---|
| 1312 | putchar('\n'); |
|---|
| 1313 | } |
|---|
| 1314 | putchar('\n'); |
|---|
| 1315 | } |
|---|
| 1316 | } /* printamtrx */ |
|---|
| 1317 | |
|---|
| 1318 | |
|---|
| 1319 | Static Void printfreqdyhf() |
|---|
| 1320 | { |
|---|
| 1321 | amity ba; |
|---|
| 1322 | |
|---|
| 1323 | printf("\n Dayhoff's Amino Acid Frequencies:\n"); |
|---|
| 1324 | printf("%13s", "A,R,N,D,C :"); |
|---|
| 1325 | for (ba = AA; (long)ba <= (long)CC; ba = (amity)((long)ba + 1)) |
|---|
| 1326 | printf("%7.3f", freqdyhf[(long)ba - (long)AA]); |
|---|
| 1327 | printf("\n%13s", "Q,E,G,H,I :"); |
|---|
| 1328 | for (ba = QQ; (long)ba <= (long)II; ba = (amity)((long)ba + 1)) |
|---|
| 1329 | printf("%7.3f", freqdyhf[(long)ba - (long)AA]); |
|---|
| 1330 | printf("\n%13s", "L,K,M,F,P :"); |
|---|
| 1331 | for (ba = LL; (long)ba <= (long)PP_; ba = (amity)((long)ba + 1)) |
|---|
| 1332 | printf("%7.3f", freqdyhf[(long)ba - (long)AA]); |
|---|
| 1333 | printf("\n%13s", "S,T,W,Y,V :"); |
|---|
| 1334 | for (ba = SS; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) |
|---|
| 1335 | printf("%7.3f", freqdyhf[(long)ba - (long)AA]); |
|---|
| 1336 | putchar('\n'); |
|---|
| 1337 | } /* printfreqdyhf */ |
|---|
| 1338 | |
|---|
| 1339 | |
|---|
| 1340 | /*************************************/ |
|---|
| 1341 | /*** TRANSITION PROBABILITY MATRIX ***/ |
|---|
| 1342 | /*************************************/ |
|---|
| 1343 | /*** READ MATRIX ( EIGEN VALUE,VECTOR AND FREQUENCY ) ***/ |
|---|
| 1344 | Static Void readeigenv() |
|---|
| 1345 | { |
|---|
| 1346 | amity ba1, ba2; |
|---|
| 1347 | |
|---|
| 1348 | for (ba2 = AA; (long)ba2 <= (long)VV; ba2 = (amity)((long)ba2 + 1)) { |
|---|
| 1349 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1350 | if (P_eoln(tpmfile)) { |
|---|
| 1351 | fscanf(tpmfile, "%*[^\n]"); |
|---|
| 1352 | getc(tpmfile); |
|---|
| 1353 | } |
|---|
| 1354 | fscanf(tpmfile, "%lg", &ev[(long)ba1 - (long)AA][(long)ba2 - (long)AA]); |
|---|
| 1355 | } |
|---|
| 1356 | } |
|---|
| 1357 | fscanf(tpmfile, "%*[^\n]"); |
|---|
| 1358 | getc(tpmfile); |
|---|
| 1359 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1360 | if (P_eoln(tpmfile)) { |
|---|
| 1361 | fscanf(tpmfile, "%*[^\n]"); |
|---|
| 1362 | getc(tpmfile); |
|---|
| 1363 | } |
|---|
| 1364 | fscanf(tpmfile, "%lg", &eval[(long)ba1 - (long)AA]); |
|---|
| 1365 | } |
|---|
| 1366 | fscanf(tpmfile, "%*[^\n]"); |
|---|
| 1367 | getc(tpmfile); |
|---|
| 1368 | for (ba1 = AA; (long)ba1 <= (long)VV; ba1 = (amity)((long)ba1 + 1)) { |
|---|
| 1369 | if (P_eoln(tpmfile)) { |
|---|
| 1370 | fscanf(tpmfile, "%*[^\n]"); |
|---|
| 1371 | getc(tpmfile); |
|---|
| 1372 | } |
|---|
| 1373 | fscanf(tpmfile, "%lg%*[^\n]", &freqdyhf[(long)ba1 - (long)AA]); |
|---|
| 1374 | getc(tpmfile); |
|---|
| 1375 | } |
|---|
| 1376 | } /* readeigenv */ |
|---|
| 1377 | |
|---|
| 1378 | |
|---|
| 1379 | /*** DATA MATRIX ( EIGEN VALUE,VECTOR AND FREQUENCY ) ***/ |
|---|
| 1380 | Static Void dataeigenv() |
|---|
| 1381 | { |
|---|
| 1382 | ev[0][0] = -2.18920e-01; |
|---|
| 1383 | ev[(long)RR - (long)AA][0] = -4.01968e-02; |
|---|
| 1384 | ev[(long)NN - (long)AA][0] = -2.27758e-01; |
|---|
| 1385 | ev[(long)DD - (long)AA][0] = -4.04699e-01; |
|---|
| 1386 | ev[(long)CC - (long)AA][0] = -3.49083e-02; |
|---|
| 1387 | ev[(long)QQ - (long)AA][0] = -2.38091e-01; |
|---|
| 1388 | ev[(long)EE - (long)AA][0] = 5.24114e-01; |
|---|
| 1389 | ev[(long)GG - (long)AA][0] = -2.34117e-02; |
|---|
| 1390 | ev[(long)HH - (long)AA][0] = 9.97954e-02; |
|---|
| 1391 | ev[(long)II - (long)AA][0] = -8.45249e-03; |
|---|
| 1392 | ev[(long)LL - (long)AA][0] = 5.28066e-03; |
|---|
| 1393 | ev[(long)KK - (long)AA][0] = 2.05284e-02; |
|---|
| 1394 | ev[(long)MM - (long)AA][0] = -1.23853e-02; |
|---|
| 1395 | ev[(long)FF - (long)AA][0] = -9.50275e-03; |
|---|
| 1396 | ev[(long)PP_ - (long)AA][0] = -3.24017e-02; |
|---|
| 1397 | ev[(long)SS - (long)AA][0] = 5.89404e-01; |
|---|
| 1398 | ev[(long)TT - (long)AA][0] = -1.99416e-01; |
|---|
| 1399 | ev[(long)WW - (long)AA][0] = -1.52404e-02; |
|---|
| 1400 | ev[(long)YY - (long)AA][0] = -1.81586e-03; |
|---|
| 1401 | ev[(long)VV - (long)AA][0] = 4.98109e-02; |
|---|
| 1402 | |
|---|
| 1403 | ev[0][(long)RR - (long)AA] = 4.00877e-02; |
|---|
| 1404 | ev[(long)RR - (long)AA][(long)RR - (long)AA] = 3.76303e-02; |
|---|
| 1405 | ev[(long)NN - (long)AA][(long)RR - (long)AA] = 7.25090e-01; |
|---|
| 1406 | ev[(long)DD - (long)AA][(long)RR - (long)AA] = -5.28042e-01; |
|---|
| 1407 | ev[(long)CC - (long)AA][(long)RR - (long)AA] = 1.46525e-02; |
|---|
| 1408 | ev[(long)QQ - (long)AA][(long)RR - (long)AA] = -8.66164e-02; |
|---|
| 1409 | ev[(long)EE - (long)AA][(long)RR - (long)AA] = 3.20299e-01; |
|---|
| 1410 | ev[(long)GG - (long)AA][(long)RR - (long)AA] = 7.74478e-03; |
|---|
| 1411 | ev[(long)HH - (long)AA][(long)RR - (long)AA] = -8.90059e-02; |
|---|
| 1412 | ev[(long)II - (long)AA][(long)RR - (long)AA] = -2.94900e-02; |
|---|
| 1413 | ev[(long)LL - (long)AA][(long)RR - (long)AA] = -3.50400e-03; |
|---|
| 1414 | ev[(long)KK - (long)AA][(long)RR - (long)AA] = -5.22374e-02; |
|---|
| 1415 | ev[(long)MM - (long)AA][(long)RR - (long)AA] = 1.94473e-02; |
|---|
| 1416 | ev[(long)FF - (long)AA][(long)RR - (long)AA] = 5.80870e-03; |
|---|
| 1417 | ev[(long)PP_ - (long)AA][(long)RR - (long)AA] = 1.62922e-02; |
|---|
| 1418 | ev[(long)SS - (long)AA][(long)RR - (long)AA] = -2.60397e-01; |
|---|
| 1419 | ev[(long)TT - (long)AA][(long)RR - (long)AA] = 4.22891e-02; |
|---|
| 1420 | ev[(long)WW - (long)AA][(long)RR - (long)AA] = 2.42879e-03; |
|---|
| 1421 | ev[(long)YY - (long)AA][(long)RR - (long)AA] = -1.46244e-02; |
|---|
| 1422 | ev[(long)VV - (long)AA][(long)RR - (long)AA] = -5.05405e-04; |
|---|
| 1423 | |
|---|
| 1424 | ev[0][(long)NN - (long)AA] = -4.62992e-01; |
|---|
| 1425 | ev[(long)RR - (long)AA][(long)NN - (long)AA] = 2.14018e-02; |
|---|
| 1426 | ev[(long)NN - (long)AA][(long)NN - (long)AA] = 1.71750e-01; |
|---|
| 1427 | ev[(long)DD - (long)AA][(long)NN - (long)AA] = 1.02440e-01; |
|---|
| 1428 | ev[(long)CC - (long)AA][(long)NN - (long)AA] = 3.17009e-03; |
|---|
| 1429 | ev[(long)QQ - (long)AA][(long)NN - (long)AA] = 1.50618e-01; |
|---|
| 1430 | ev[(long)EE - (long)AA][(long)NN - (long)AA] = -1.07848e-01; |
|---|
| 1431 | ev[(long)GG - (long)AA][(long)NN - (long)AA] = 5.62329e-02; |
|---|
| 1432 | ev[(long)HH - (long)AA][(long)NN - (long)AA] = -1.09388e-01; |
|---|
| 1433 | ev[(long)II - (long)AA][(long)NN - (long)AA] = -6.52572e-01; |
|---|
| 1434 | ev[(long)LL - (long)AA][(long)NN - (long)AA] = 1.46263e-02; |
|---|
| 1435 | ev[(long)KK - (long)AA][(long)NN - (long)AA] = -5.22977e-02; |
|---|
| 1436 | ev[(long)MM - (long)AA][(long)NN - (long)AA] = 4.61043e-02; |
|---|
| 1437 | ev[(long)FF - (long)AA][(long)NN - (long)AA] = 4.16223e-02; |
|---|
| 1438 | ev[(long)PP_ - (long)AA][(long)NN - (long)AA] = 6.60296e-02; |
|---|
| 1439 | ev[(long)SS - (long)AA][(long)NN - (long)AA] = 4.86194e-02; |
|---|
| 1440 | ev[(long)TT - (long)AA][(long)NN - (long)AA] = 3.28837e-01; |
|---|
| 1441 | ev[(long)WW - (long)AA][(long)NN - (long)AA] = -4.61826e-03; |
|---|
| 1442 | ev[(long)YY - (long)AA][(long)NN - (long)AA] = -8.60905e-03; |
|---|
| 1443 | ev[(long)VV - (long)AA][(long)NN - (long)AA] = 3.84867e-01; |
|---|
| 1444 | |
|---|
| 1445 | ev[0][(long)DD - (long)AA] = 2.47117e-02; |
|---|
| 1446 | ev[(long)RR - (long)AA][(long)DD - (long)AA] = -3.76030e-02; |
|---|
| 1447 | ev[(long)NN - (long)AA][(long)DD - (long)AA] = 5.56820e-01; |
|---|
| 1448 | ev[(long)DD - (long)AA][(long)DD - (long)AA] = 5.60598e-02; |
|---|
| 1449 | ev[(long)CC - (long)AA][(long)DD - (long)AA] = -2.51572e-02; |
|---|
| 1450 | ev[(long)QQ - (long)AA][(long)DD - (long)AA] = 3.40304e-01; |
|---|
| 1451 | ev[(long)EE - (long)AA][(long)DD - (long)AA] = -4.10919e-01; |
|---|
| 1452 | ev[(long)GG - (long)AA][(long)DD - (long)AA] = -7.16450e-02; |
|---|
| 1453 | ev[(long)HH - (long)AA][(long)DD - (long)AA] = -2.14248e-01; |
|---|
| 1454 | ev[(long)II - (long)AA][(long)DD - (long)AA] = 5.25788e-02; |
|---|
| 1455 | ev[(long)LL - (long)AA][(long)DD - (long)AA] = -1.22652e-02; |
|---|
| 1456 | ev[(long)KK - (long)AA][(long)DD - (long)AA] = -5.68214e-02; |
|---|
| 1457 | ev[(long)MM - (long)AA][(long)DD - (long)AA] = 1.75995e-02; |
|---|
| 1458 | ev[(long)FF - (long)AA][(long)DD - (long)AA] = -7.65321e-03; |
|---|
| 1459 | ev[(long)PP_ - (long)AA][(long)DD - (long)AA] = -5.79082e-02; |
|---|
| 1460 | ev[(long)SS - (long)AA][(long)DD - (long)AA] = 3.84128e-01; |
|---|
| 1461 | ev[(long)TT - (long)AA][(long)DD - (long)AA] = -4.36123e-01; |
|---|
| 1462 | ev[(long)WW - (long)AA][(long)DD - (long)AA] = -1.26346e-02; |
|---|
| 1463 | ev[(long)YY - (long)AA][(long)DD - (long)AA] = -3.19921e-03; |
|---|
| 1464 | ev[(long)VV - (long)AA][(long)DD - (long)AA] = 2.57284e-02; |
|---|
| 1465 | |
|---|
| 1466 | ev[0][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1467 | ev[(long)RR - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1468 | ev[(long)NN - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1469 | ev[(long)DD - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1470 | ev[(long)CC - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1471 | ev[(long)QQ - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1472 | ev[(long)EE - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1473 | ev[(long)GG - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1474 | ev[(long)HH - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1475 | ev[(long)II - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1476 | ev[(long)LL - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1477 | ev[(long)KK - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1478 | ev[(long)MM - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1479 | ev[(long)FF - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1480 | ev[(long)PP_ - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1481 | ev[(long)SS - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1482 | ev[(long)TT - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1483 | ev[(long)WW - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1484 | ev[(long)YY - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1485 | ev[(long)VV - (long)AA][(long)CC - (long)AA] = -2.23607e-01; |
|---|
| 1486 | |
|---|
| 1487 | ev[0][(long)QQ - (long)AA] = 4.04873e-01; |
|---|
| 1488 | ev[(long)RR - (long)AA][(long)QQ - (long)AA] = 6.49103e-03; |
|---|
| 1489 | ev[(long)NN - (long)AA][(long)QQ - (long)AA] = -1.19891e-01; |
|---|
| 1490 | ev[(long)DD - (long)AA][(long)QQ - (long)AA] = -3.67766e-03; |
|---|
| 1491 | ev[(long)CC - (long)AA][(long)QQ - (long)AA] = -9.46397e-04; |
|---|
| 1492 | ev[(long)QQ - (long)AA][(long)QQ - (long)AA] = -1.89655e-01; |
|---|
| 1493 | ev[(long)EE - (long)AA][(long)QQ - (long)AA] = 5.91497e-02; |
|---|
| 1494 | ev[(long)GG - (long)AA][(long)QQ - (long)AA] = -8.40994e-02; |
|---|
| 1495 | ev[(long)HH - (long)AA][(long)QQ - (long)AA] = 8.85589e-02; |
|---|
| 1496 | ev[(long)II - (long)AA][(long)QQ - (long)AA] = -7.24798e-01; |
|---|
| 1497 | ev[(long)LL - (long)AA][(long)QQ - (long)AA] = 2.13078e-02; |
|---|
| 1498 | ev[(long)KK - (long)AA][(long)QQ - (long)AA] = 6.70215e-02; |
|---|
| 1499 | ev[(long)MM - (long)AA][(long)QQ - (long)AA] = 4.33730e-02; |
|---|
| 1500 | ev[(long)FF - (long)AA][(long)QQ - (long)AA] = 4.68020e-02; |
|---|
| 1501 | ev[(long)PP_ - (long)AA][(long)QQ - (long)AA] = -7.75734e-02; |
|---|
| 1502 | ev[(long)SS - (long)AA][(long)QQ - (long)AA] = -6.04936e-02; |
|---|
| 1503 | ev[(long)TT - (long)AA][(long)QQ - (long)AA] = -3.20011e-01; |
|---|
| 1504 | ev[(long)WW - (long)AA][(long)QQ - (long)AA] = 6.03313e-04; |
|---|
| 1505 | ev[(long)YY - (long)AA][(long)QQ - (long)AA] = -9.61127e-03; |
|---|
| 1506 | ev[(long)VV - (long)AA][(long)QQ - (long)AA] = 3.47473e-01; |
|---|
| 1507 | |
|---|
| 1508 | ev[0][(long)EE - (long)AA] = -4.99671e-02; |
|---|
| 1509 | ev[(long)RR - (long)AA][(long)EE - (long)AA] = 4.11185e-02; |
|---|
| 1510 | ev[(long)NN - (long)AA][(long)EE - (long)AA] = 1.47778e-01; |
|---|
| 1511 | ev[(long)DD - (long)AA][(long)EE - (long)AA] = 1.64073e-01; |
|---|
| 1512 | ev[(long)CC - (long)AA][(long)EE - (long)AA] = -1.66608e-03; |
|---|
| 1513 | ev[(long)QQ - (long)AA][(long)EE - (long)AA] = -3.40600e-01; |
|---|
| 1514 | ev[(long)EE - (long)AA][(long)EE - (long)AA] = -2.75784e-02; |
|---|
| 1515 | ev[(long)GG - (long)AA][(long)EE - (long)AA] = -6.14738e-03; |
|---|
| 1516 | ev[(long)HH - (long)AA][(long)EE - (long)AA] = 7.45280e-02; |
|---|
| 1517 | ev[(long)II - (long)AA][(long)EE - (long)AA] = 6.19257e-02; |
|---|
| 1518 | ev[(long)LL - (long)AA][(long)EE - (long)AA] = 8.66441e-02; |
|---|
| 1519 | ev[(long)KK - (long)AA][(long)EE - (long)AA] = 3.88639e-02; |
|---|
| 1520 | ev[(long)MM - (long)AA][(long)EE - (long)AA] = -8.97628e-01; |
|---|
| 1521 | ev[(long)FF - (long)AA][(long)EE - (long)AA] = -3.67076e-03; |
|---|
| 1522 | ev[(long)PP_ - (long)AA][(long)EE - (long)AA] = 4.14761e-02; |
|---|
| 1523 | ev[(long)SS - (long)AA][(long)EE - (long)AA] = 1.90444e-03; |
|---|
| 1524 | ev[(long)TT - (long)AA][(long)EE - (long)AA] = -4.52208e-02; |
|---|
| 1525 | ev[(long)WW - (long)AA][(long)EE - (long)AA] = -8.08550e-03; |
|---|
| 1526 | ev[(long)YY - (long)AA][(long)EE - (long)AA] = -1.28114e-02; |
|---|
| 1527 | ev[(long)VV - (long)AA][(long)EE - (long)AA] = 4.57149e-02; |
|---|
| 1528 | |
|---|
| 1529 | ev[0][(long)GG - (long)AA] = -6.76985e-02; |
|---|
| 1530 | ev[(long)RR - (long)AA][(long)GG - (long)AA] = 1.07693e-01; |
|---|
| 1531 | ev[(long)NN - (long)AA][(long)GG - (long)AA] = 1.83827e-01; |
|---|
| 1532 | ev[(long)DD - (long)AA][(long)GG - (long)AA] = 2.57799e-01; |
|---|
| 1533 | ev[(long)CC - (long)AA][(long)GG - (long)AA] = -8.80400e-04; |
|---|
| 1534 | ev[(long)QQ - (long)AA][(long)GG - (long)AA] = -5.07282e-01; |
|---|
| 1535 | ev[(long)EE - (long)AA][(long)GG - (long)AA] = -2.08116e-02; |
|---|
| 1536 | ev[(long)GG - (long)AA][(long)GG - (long)AA] = -9.91077e-03; |
|---|
| 1537 | ev[(long)HH - (long)AA][(long)GG - (long)AA] = 1.32778e-01; |
|---|
| 1538 | ev[(long)II - (long)AA][(long)GG - (long)AA] = 3.30619e-02; |
|---|
| 1539 | ev[(long)LL - (long)AA][(long)GG - (long)AA] = -5.54361e-02; |
|---|
| 1540 | ev[(long)KK - (long)AA][(long)GG - (long)AA] = -7.58113e-02; |
|---|
| 1541 | ev[(long)MM - (long)AA][(long)GG - (long)AA] = 7.67118e-01; |
|---|
| 1542 | ev[(long)FF - (long)AA][(long)GG - (long)AA] = -8.15430e-03; |
|---|
| 1543 | ev[(long)PP_ - (long)AA][(long)GG - (long)AA] = 5.85005e-02; |
|---|
| 1544 | ev[(long)SS - (long)AA][(long)GG - (long)AA] = 1.59381e-02; |
|---|
| 1545 | ev[(long)TT - (long)AA][(long)GG - (long)AA] = -6.67189e-02; |
|---|
| 1546 | ev[(long)WW - (long)AA][(long)GG - (long)AA] = -9.06354e-03; |
|---|
| 1547 | ev[(long)YY - (long)AA][(long)GG - (long)AA] = -6.80482e-03; |
|---|
| 1548 | ev[(long)VV - (long)AA][(long)GG - (long)AA] = -3.69299e-02; |
|---|
| 1549 | |
|---|
| 1550 | ev[0][(long)HH - (long)AA] = 2.37414e-02; |
|---|
| 1551 | ev[(long)RR - (long)AA][(long)HH - (long)AA] = -1.31704e-02; |
|---|
| 1552 | ev[(long)NN - (long)AA][(long)HH - (long)AA] = 1.93358e-02; |
|---|
| 1553 | ev[(long)DD - (long)AA][(long)HH - (long)AA] = 2.78387e-02; |
|---|
| 1554 | ev[(long)CC - (long)AA][(long)HH - (long)AA] = 6.35183e-02; |
|---|
| 1555 | ev[(long)QQ - (long)AA][(long)HH - (long)AA] = 1.94232e-02; |
|---|
| 1556 | ev[(long)EE - (long)AA][(long)HH - (long)AA] = 2.72120e-02; |
|---|
| 1557 | ev[(long)GG - (long)AA][(long)HH - (long)AA] = 3.14653e-02; |
|---|
| 1558 | ev[(long)HH - (long)AA][(long)HH - (long)AA] = 8.67994e-03; |
|---|
| 1559 | ev[(long)II - (long)AA][(long)HH - (long)AA] = 3.64294e-03; |
|---|
| 1560 | ev[(long)LL - (long)AA][(long)HH - (long)AA] = -1.65127e-02; |
|---|
| 1561 | ev[(long)KK - (long)AA][(long)HH - (long)AA] = 1.45011e-02; |
|---|
| 1562 | ev[(long)MM - (long)AA][(long)HH - (long)AA] = 1.53344e-04; |
|---|
| 1563 | ev[(long)FF - (long)AA][(long)HH - (long)AA] = -7.14500e-02; |
|---|
| 1564 | ev[(long)PP_ - (long)AA][(long)HH - (long)AA] = 2.47183e-02; |
|---|
| 1565 | ev[(long)SS - (long)AA][(long)HH - (long)AA] = 1.83958e-02; |
|---|
| 1566 | ev[(long)TT - (long)AA][(long)HH - (long)AA] = 2.03333e-02; |
|---|
| 1567 | ev[(long)WW - (long)AA][(long)HH - (long)AA] = -9.90001e-01; |
|---|
| 1568 | ev[(long)YY - (long)AA][(long)HH - (long)AA] = -6.85327e-02; |
|---|
| 1569 | ev[(long)VV - (long)AA][(long)HH - (long)AA] = 1.15883e-02; |
|---|
| 1570 | |
|---|
| 1571 | ev[0][(long)II - (long)AA] = 3.86884e-02; |
|---|
| 1572 | ev[(long)RR - (long)AA][(long)II - (long)AA] = 6.83612e-02; |
|---|
| 1573 | ev[(long)NN - (long)AA][(long)II - (long)AA] = 5.94583e-02; |
|---|
| 1574 | ev[(long)DD - (long)AA][(long)II - (long)AA] = 7.89097e-02; |
|---|
| 1575 | ev[(long)CC - (long)AA][(long)II - (long)AA] = -9.49564e-01; |
|---|
| 1576 | ev[(long)QQ - (long)AA][(long)II - (long)AA] = 7.75597e-02; |
|---|
| 1577 | ev[(long)EE - (long)AA][(long)II - (long)AA] = 7.93973e-02; |
|---|
| 1578 | ev[(long)GG - (long)AA][(long)II - (long)AA] = 5.96830e-02; |
|---|
| 1579 | ev[(long)HH - (long)AA][(long)II - (long)AA] = 5.15293e-02; |
|---|
| 1580 | ev[(long)II - (long)AA][(long)II - (long)AA] = 7.67383e-03; |
|---|
| 1581 | ev[(long)LL - (long)AA][(long)II - (long)AA] = 2.21331e-02; |
|---|
| 1582 | ev[(long)KK - (long)AA][(long)II - (long)AA] = 8.30887e-02; |
|---|
| 1583 | ev[(long)MM - (long)AA][(long)II - (long)AA] = 3.95955e-02; |
|---|
| 1584 | ev[(long)FF - (long)AA][(long)II - (long)AA] = -1.11612e-01; |
|---|
| 1585 | ev[(long)PP_ - (long)AA][(long)II - (long)AA] = 5.03976e-02; |
|---|
| 1586 | ev[(long)SS - (long)AA][(long)II - (long)AA] = 1.59569e-02; |
|---|
| 1587 | ev[(long)TT - (long)AA][(long)II - (long)AA] = 3.72414e-02; |
|---|
| 1588 | ev[(long)WW - (long)AA][(long)II - (long)AA] = -5.52876e-02; |
|---|
| 1589 | ev[(long)YY - (long)AA][(long)II - (long)AA] = -1.86929e-01; |
|---|
| 1590 | ev[(long)VV - (long)AA][(long)II - (long)AA] = 1.41872e-02; |
|---|
| 1591 | |
|---|
| 1592 | ev[0][(long)LL - (long)AA] = 5.80295e-02; |
|---|
| 1593 | ev[(long)RR - (long)AA][(long)LL - (long)AA] = 1.02103e-01; |
|---|
| 1594 | ev[(long)NN - (long)AA][(long)LL - (long)AA] = 7.00404e-02; |
|---|
| 1595 | ev[(long)DD - (long)AA][(long)LL - (long)AA] = 9.76903e-02; |
|---|
| 1596 | ev[(long)CC - (long)AA][(long)LL - (long)AA] = 2.47574e-01; |
|---|
| 1597 | ev[(long)QQ - (long)AA][(long)LL - (long)AA] = 7.38092e-02; |
|---|
| 1598 | ev[(long)EE - (long)AA][(long)LL - (long)AA] = 9.10580e-02; |
|---|
| 1599 | ev[(long)GG - (long)AA][(long)LL - (long)AA] = 1.00958e-01; |
|---|
| 1600 | ev[(long)HH - (long)AA][(long)LL - (long)AA] = 3.49872e-02; |
|---|
| 1601 | ev[(long)II - (long)AA][(long)LL - (long)AA] = -1.13481e-01; |
|---|
| 1602 | ev[(long)LL - (long)AA][(long)LL - (long)AA] = -2.12223e-01; |
|---|
| 1603 | ev[(long)KK - (long)AA][(long)LL - (long)AA] = 9.20232e-02; |
|---|
| 1604 | ev[(long)MM - (long)AA][(long)LL - (long)AA] = -1.06117e-01; |
|---|
| 1605 | ev[(long)FF - (long)AA][(long)LL - (long)AA] = -5.51278e-01; |
|---|
| 1606 | ev[(long)PP_ - (long)AA][(long)LL - (long)AA] = 8.17221e-02; |
|---|
| 1607 | ev[(long)SS - (long)AA][(long)LL - (long)AA] = 7.48437e-02; |
|---|
| 1608 | ev[(long)TT - (long)AA][(long)LL - (long)AA] = 4.59234e-02; |
|---|
| 1609 | ev[(long)WW - (long)AA][(long)LL - (long)AA] = 4.34903e-01; |
|---|
| 1610 | ev[(long)YY - (long)AA][(long)LL - (long)AA] = -5.43823e-01; |
|---|
| 1611 | ev[(long)VV - (long)AA][(long)LL - (long)AA] = -6.69564e-02; |
|---|
| 1612 | |
|---|
| 1613 | ev[0][(long)KK - (long)AA] = 1.68796e-01; |
|---|
| 1614 | ev[(long)RR - (long)AA][(long)KK - (long)AA] = 6.98733e-01; |
|---|
| 1615 | ev[(long)NN - (long)AA][(long)KK - (long)AA] = -3.64477e-02; |
|---|
| 1616 | ev[(long)DD - (long)AA][(long)KK - (long)AA] = 4.79840e-02; |
|---|
| 1617 | ev[(long)CC - (long)AA][(long)KK - (long)AA] = -2.83352e-02; |
|---|
| 1618 | ev[(long)QQ - (long)AA][(long)KK - (long)AA] = 2.07546e-03; |
|---|
| 1619 | ev[(long)EE - (long)AA][(long)KK - (long)AA] = 6.44875e-02; |
|---|
| 1620 | ev[(long)GG - (long)AA][(long)KK - (long)AA] = -1.24957e-01; |
|---|
| 1621 | ev[(long)HH - (long)AA][(long)KK - (long)AA] = -2.31511e-01; |
|---|
| 1622 | ev[(long)II - (long)AA][(long)KK - (long)AA] = -1.08720e-01; |
|---|
| 1623 | ev[(long)LL - (long)AA][(long)KK - (long)AA] = 6.27788e-02; |
|---|
| 1624 | ev[(long)KK - (long)AA][(long)KK - (long)AA] = -4.17790e-01; |
|---|
| 1625 | ev[(long)MM - (long)AA][(long)KK - (long)AA] = -1.98195e-01; |
|---|
| 1626 | ev[(long)FF - (long)AA][(long)KK - (long)AA] = -1.01464e-02; |
|---|
| 1627 | ev[(long)PP_ - (long)AA][(long)KK - (long)AA] = -2.34527e-01; |
|---|
| 1628 | ev[(long)SS - (long)AA][(long)KK - (long)AA] = 1.80480e-01; |
|---|
| 1629 | ev[(long)TT - (long)AA][(long)KK - (long)AA] = 2.62775e-01; |
|---|
| 1630 | ev[(long)WW - (long)AA][(long)KK - (long)AA] = -7.67023e-02; |
|---|
| 1631 | ev[(long)YY - (long)AA][(long)KK - (long)AA] = 8.53465e-03; |
|---|
| 1632 | ev[(long)VV - (long)AA][(long)KK - (long)AA] = -1.14869e-01; |
|---|
| 1633 | |
|---|
| 1634 | ev[0][(long)MM - (long)AA] = 1.14030e-02; |
|---|
| 1635 | ev[(long)RR - (long)AA][(long)MM - (long)AA] = 1.03453e-01; |
|---|
| 1636 | ev[(long)NN - (long)AA][(long)MM - (long)AA] = 1.03058e-01; |
|---|
| 1637 | ev[(long)DD - (long)AA][(long)MM - (long)AA] = 1.25170e-01; |
|---|
| 1638 | ev[(long)CC - (long)AA][(long)MM - (long)AA] = -7.83690e-02; |
|---|
| 1639 | ev[(long)QQ - (long)AA][(long)MM - (long)AA] = 8.15278e-02; |
|---|
| 1640 | ev[(long)EE - (long)AA][(long)MM - (long)AA] = 1.09160e-01; |
|---|
| 1641 | ev[(long)GG - (long)AA][(long)MM - (long)AA] = 9.53752e-02; |
|---|
| 1642 | ev[(long)HH - (long)AA][(long)MM - (long)AA] = 1.40899e-01; |
|---|
| 1643 | ev[(long)II - (long)AA][(long)MM - (long)AA] = -2.81849e-01; |
|---|
| 1644 | ev[(long)LL - (long)AA][(long)MM - (long)AA] = -4.92274e-01; |
|---|
| 1645 | ev[(long)KK - (long)AA][(long)MM - (long)AA] = 9.83942e-02; |
|---|
| 1646 | ev[(long)MM - (long)AA][(long)MM - (long)AA] = -3.14326e-01; |
|---|
| 1647 | ev[(long)FF - (long)AA][(long)MM - (long)AA] = 2.70954e-01; |
|---|
| 1648 | ev[(long)PP_ - (long)AA][(long)MM - (long)AA] = 4.05413e-02; |
|---|
| 1649 | ev[(long)SS - (long)AA][(long)MM - (long)AA] = 5.49397e-02; |
|---|
| 1650 | ev[(long)TT - (long)AA][(long)MM - (long)AA] = -2.30001e-04; |
|---|
| 1651 | ev[(long)WW - (long)AA][(long)MM - (long)AA] = -6.60170e-02; |
|---|
| 1652 | ev[(long)YY - (long)AA][(long)MM - (long)AA] = 5.64557e-01; |
|---|
| 1653 | ev[(long)VV - (long)AA][(long)MM - (long)AA] = -2.78943e-01; |
|---|
| 1654 | |
|---|
| 1655 | ev[0][(long)FF - (long)AA] = 1.68903e-01; |
|---|
| 1656 | ev[(long)RR - (long)AA][(long)FF - (long)AA] = -4.16455e-01; |
|---|
| 1657 | ev[(long)NN - (long)AA][(long)FF - (long)AA] = 1.75235e-01; |
|---|
| 1658 | ev[(long)DD - (long)AA][(long)FF - (long)AA] = -1.57281e-01; |
|---|
| 1659 | ev[(long)CC - (long)AA][(long)FF - (long)AA] = -3.02415e-02; |
|---|
| 1660 | ev[(long)QQ - (long)AA][(long)FF - (long)AA] = -1.99945e-01; |
|---|
| 1661 | ev[(long)EE - (long)AA][(long)FF - (long)AA] = -2.80839e-01; |
|---|
| 1662 | ev[(long)GG - (long)AA][(long)FF - (long)AA] = -1.65168e-01; |
|---|
| 1663 | ev[(long)HH - (long)AA][(long)FF - (long)AA] = 3.84179e-01; |
|---|
| 1664 | ev[(long)II - (long)AA][(long)FF - (long)AA] = -1.72794e-01; |
|---|
| 1665 | ev[(long)LL - (long)AA][(long)FF - (long)AA] = 4.08470e-02; |
|---|
| 1666 | ev[(long)KK - (long)AA][(long)FF - (long)AA] = 1.09632e-01; |
|---|
| 1667 | ev[(long)MM - (long)AA][(long)FF - (long)AA] = 3.10366e-02; |
|---|
| 1668 | ev[(long)FF - (long)AA][(long)FF - (long)AA] = 1.78854e-02; |
|---|
| 1669 | ev[(long)PP_ - (long)AA][(long)FF - (long)AA] = -2.43651e-01; |
|---|
| 1670 | ev[(long)SS - (long)AA][(long)FF - (long)AA] = 2.58272e-01; |
|---|
| 1671 | ev[(long)TT - (long)AA][(long)FF - (long)AA] = 4.85439e-01; |
|---|
| 1672 | ev[(long)WW - (long)AA][(long)FF - (long)AA] = 1.87008e-02; |
|---|
| 1673 | ev[(long)YY - (long)AA][(long)FF - (long)AA] = -8.19317e-02; |
|---|
| 1674 | ev[(long)VV - (long)AA][(long)FF - (long)AA] = -1.85319e-01; |
|---|
| 1675 | |
|---|
| 1676 | ev[0][(long)PP_ - (long)AA] = 1.89407e-01; |
|---|
| 1677 | ev[(long)RR - (long)AA][(long)PP_ - (long)AA] = -5.67638e-01; |
|---|
| 1678 | ev[(long)NN - (long)AA][(long)PP_ - (long)AA] = -2.92067e-02; |
|---|
| 1679 | ev[(long)DD - (long)AA][(long)PP_ - (long)AA] = 4.63283e-02; |
|---|
| 1680 | ev[(long)CC - (long)AA][(long)PP_ - (long)AA] = -7.50547e-02; |
|---|
| 1681 | ev[(long)QQ - (long)AA][(long)PP_ - (long)AA] = -1.77709e-01; |
|---|
| 1682 | ev[(long)EE - (long)AA][(long)PP_ - (long)AA] = 2.11012e-02; |
|---|
| 1683 | ev[(long)GG - (long)AA][(long)PP_ - (long)AA] = 4.57586e-01; |
|---|
| 1684 | ev[(long)HH - (long)AA][(long)PP_ - (long)AA] = -2.73917e-01; |
|---|
| 1685 | ev[(long)II - (long)AA][(long)PP_ - (long)AA] = 3.02761e-02; |
|---|
| 1686 | ev[(long)LL - (long)AA][(long)PP_ - (long)AA] = -8.55620e-02; |
|---|
| 1687 | ev[(long)KK - (long)AA][(long)PP_ - (long)AA] = -4.68228e-01; |
|---|
| 1688 | ev[(long)MM - (long)AA][(long)PP_ - (long)AA] = -1.49034e-01; |
|---|
| 1689 | ev[(long)FF - (long)AA][(long)PP_ - (long)AA] = 4.32709e-02; |
|---|
| 1690 | ev[(long)PP_ - (long)AA][(long)PP_ - (long)AA] = 1.13488e-01; |
|---|
| 1691 | ev[(long)SS - (long)AA][(long)PP_ - (long)AA] = 1.12224e-01; |
|---|
| 1692 | ev[(long)TT - (long)AA][(long)PP_ - (long)AA] = 8.54433e-02; |
|---|
| 1693 | ev[(long)WW - (long)AA][(long)PP_ - (long)AA] = 1.49702e-01; |
|---|
| 1694 | ev[(long)YY - (long)AA][(long)PP_ - (long)AA] = 1.44889e-02; |
|---|
| 1695 | ev[(long)VV - (long)AA][(long)PP_ - (long)AA] = 9.94179e-02; |
|---|
| 1696 | |
|---|
| 1697 | ev[0][(long)SS - (long)AA] = -4.51742e-02; |
|---|
| 1698 | ev[(long)RR - (long)AA][(long)SS - (long)AA] = 2.72843e-01; |
|---|
| 1699 | ev[(long)NN - (long)AA][(long)SS - (long)AA] = -6.34739e-02; |
|---|
| 1700 | ev[(long)DD - (long)AA][(long)SS - (long)AA] = -2.99613e-01; |
|---|
| 1701 | ev[(long)CC - (long)AA][(long)SS - (long)AA] = -1.26065e-02; |
|---|
| 1702 | ev[(long)QQ - (long)AA][(long)SS - (long)AA] = 6.62398e-02; |
|---|
| 1703 | ev[(long)EE - (long)AA][(long)SS - (long)AA] = -2.93927e-01; |
|---|
| 1704 | ev[(long)GG - (long)AA][(long)SS - (long)AA] = 2.07444e-01; |
|---|
| 1705 | ev[(long)HH - (long)AA][(long)SS - (long)AA] = 7.61271e-01; |
|---|
| 1706 | ev[(long)II - (long)AA][(long)SS - (long)AA] = 1.22763e-01; |
|---|
| 1707 | ev[(long)LL - (long)AA][(long)SS - (long)AA] = -9.12377e-02; |
|---|
| 1708 | ev[(long)KK - (long)AA][(long)SS - (long)AA] = -1.67370e-01; |
|---|
| 1709 | ev[(long)MM - (long)AA][(long)SS - (long)AA] = -7.69871e-02; |
|---|
| 1710 | ev[(long)FF - (long)AA][(long)SS - (long)AA] = 3.25168e-02; |
|---|
| 1711 | ev[(long)PP_ - (long)AA][(long)SS - (long)AA] = -8.69178e-02; |
|---|
| 1712 | ev[(long)SS - (long)AA][(long)SS - (long)AA] = -4.91352e-02; |
|---|
| 1713 | ev[(long)TT - (long)AA][(long)SS - (long)AA] = -9.28875e-02; |
|---|
| 1714 | ev[(long)WW - (long)AA][(long)SS - (long)AA] = -3.40158e-02; |
|---|
| 1715 | ev[(long)YY - (long)AA][(long)SS - (long)AA] = -9.70949e-02; |
|---|
| 1716 | ev[(long)VV - (long)AA][(long)SS - (long)AA] = 1.69233e-01; |
|---|
| 1717 | |
|---|
| 1718 | ev[0][(long)TT - (long)AA] = -6.57152e-02; |
|---|
| 1719 | ev[(long)RR - (long)AA][(long)TT - (long)AA] = -2.96127e-01; |
|---|
| 1720 | ev[(long)NN - (long)AA][(long)TT - (long)AA] = 1.40073e-01; |
|---|
| 1721 | ev[(long)DD - (long)AA][(long)TT - (long)AA] = 3.67827e-01; |
|---|
| 1722 | ev[(long)CC - (long)AA][(long)TT - (long)AA] = 3.88665e-02; |
|---|
| 1723 | ev[(long)QQ - (long)AA][(long)TT - (long)AA] = 3.54579e-01; |
|---|
| 1724 | ev[(long)EE - (long)AA][(long)TT - (long)AA] = 3.95304e-01; |
|---|
| 1725 | ev[(long)GG - (long)AA][(long)TT - (long)AA] = -1.30872e-01; |
|---|
| 1726 | ev[(long)HH - (long)AA][(long)TT - (long)AA] = 5.22294e-01; |
|---|
| 1727 | ev[(long)II - (long)AA][(long)TT - (long)AA] = -9.20181e-02; |
|---|
| 1728 | ev[(long)LL - (long)AA][(long)TT - (long)AA] = 1.35098e-01; |
|---|
| 1729 | ev[(long)KK - (long)AA][(long)TT - (long)AA] = -2.61406e-01; |
|---|
| 1730 | ev[(long)MM - (long)AA][(long)TT - (long)AA] = -5.72654e-02; |
|---|
| 1731 | ev[(long)FF - (long)AA][(long)TT - (long)AA] = -1.06748e-01; |
|---|
| 1732 | ev[(long)PP_ - (long)AA][(long)TT - (long)AA] = -1.86932e-01; |
|---|
| 1733 | ev[(long)SS - (long)AA][(long)TT - (long)AA] = -8.60432e-02; |
|---|
| 1734 | ev[(long)TT - (long)AA][(long)TT - (long)AA] = -1.17435e-01; |
|---|
| 1735 | ev[(long)WW - (long)AA][(long)TT - (long)AA] = 4.21809e-02; |
|---|
| 1736 | ev[(long)YY - (long)AA][(long)TT - (long)AA] = 3.66170e-02; |
|---|
| 1737 | ev[(long)VV - (long)AA][(long)TT - (long)AA] = -1.03287e-01; |
|---|
| 1738 | |
|---|
| 1739 | ev[0][(long)WW - (long)AA] = 8.12248e-02; |
|---|
| 1740 | ev[(long)RR - (long)AA][(long)WW - (long)AA] = -5.52327e-02; |
|---|
| 1741 | ev[(long)NN - (long)AA][(long)WW - (long)AA] = -5.60451e-02; |
|---|
| 1742 | ev[(long)DD - (long)AA][(long)WW - (long)AA] = -1.10967e-01; |
|---|
| 1743 | ev[(long)CC - (long)AA][(long)WW - (long)AA] = -4.36007e-02; |
|---|
| 1744 | ev[(long)QQ - (long)AA][(long)WW - (long)AA] = 7.49285e-02; |
|---|
| 1745 | ev[(long)EE - (long)AA][(long)WW - (long)AA] = -6.08685e-02; |
|---|
| 1746 | ev[(long)GG - (long)AA][(long)WW - (long)AA] = -3.69332e-01; |
|---|
| 1747 | ev[(long)HH - (long)AA][(long)WW - (long)AA] = 1.94411e-01; |
|---|
| 1748 | ev[(long)II - (long)AA][(long)WW - (long)AA] = 3.55141e-02; |
|---|
| 1749 | ev[(long)LL - (long)AA][(long)WW - (long)AA] = -8.63681e-02; |
|---|
| 1750 | ev[(long)KK - (long)AA][(long)WW - (long)AA] = -2.09830e-01; |
|---|
| 1751 | ev[(long)MM - (long)AA][(long)WW - (long)AA] = -9.78879e-02; |
|---|
| 1752 | ev[(long)FF - (long)AA][(long)WW - (long)AA] = -7.98604e-02; |
|---|
| 1753 | ev[(long)PP_ - (long)AA][(long)WW - (long)AA] = 8.35838e-01; |
|---|
| 1754 | ev[(long)SS - (long)AA][(long)WW - (long)AA] = 4.95931e-02; |
|---|
| 1755 | ev[(long)TT - (long)AA][(long)WW - (long)AA] = 7.86337e-02; |
|---|
| 1756 | ev[(long)WW - (long)AA][(long)WW - (long)AA] = 1.01576e-02; |
|---|
| 1757 | ev[(long)YY - (long)AA][(long)WW - (long)AA] = 8.79878e-02; |
|---|
| 1758 | ev[(long)VV - (long)AA][(long)WW - (long)AA] = 7.51898e-02; |
|---|
| 1759 | |
|---|
| 1760 | ev[0][(long)YY - (long)AA] = -3.45102e-02; |
|---|
| 1761 | ev[(long)RR - (long)AA][(long)YY - (long)AA] = 6.45521e-02; |
|---|
| 1762 | ev[(long)NN - (long)AA][(long)YY - (long)AA] = -2.22780e-02; |
|---|
| 1763 | ev[(long)DD - (long)AA][(long)YY - (long)AA] = -3.19792e-02; |
|---|
| 1764 | ev[(long)CC - (long)AA][(long)YY - (long)AA] = 5.97900e-02; |
|---|
| 1765 | ev[(long)QQ - (long)AA][(long)YY - (long)AA] = 4.40846e-02; |
|---|
| 1766 | ev[(long)EE - (long)AA][(long)YY - (long)AA] = -2.90400e-02; |
|---|
| 1767 | ev[(long)GG - (long)AA][(long)YY - (long)AA] = 1.32178e-01; |
|---|
| 1768 | ev[(long)HH - (long)AA][(long)YY - (long)AA] = 4.83456e-02; |
|---|
| 1769 | ev[(long)II - (long)AA][(long)YY - (long)AA] = -3.33680e-01; |
|---|
| 1770 | ev[(long)LL - (long)AA][(long)YY - (long)AA] = 1.96787e-01; |
|---|
| 1771 | ev[(long)KK - (long)AA][(long)YY - (long)AA] = -1.27120e-02; |
|---|
| 1772 | ev[(long)MM - (long)AA][(long)YY - (long)AA] = -1.01360e-02; |
|---|
| 1773 | ev[(long)FF - (long)AA][(long)YY - (long)AA] = 5.00463e-01; |
|---|
| 1774 | ev[(long)PP_ - (long)AA][(long)YY - (long)AA] = 2.65762e-01; |
|---|
| 1775 | ev[(long)SS - (long)AA][(long)YY - (long)AA] = 8.18628e-03; |
|---|
| 1776 | ev[(long)TT - (long)AA][(long)YY - (long)AA] = -1.15726e-01; |
|---|
| 1777 | ev[(long)WW - (long)AA][(long)YY - (long)AA] = -3.46187e-02; |
|---|
| 1778 | ev[(long)YY - (long)AA][(long)YY - (long)AA] = -5.64673e-01; |
|---|
| 1779 | ev[(long)VV - (long)AA][(long)YY - (long)AA] = -4.02511e-01; |
|---|
| 1780 | |
|---|
| 1781 | ev[0][(long)VV - (long)AA] = -2.37427e-02; |
|---|
| 1782 | ev[(long)RR - (long)AA][(long)VV - (long)AA] = 6.64165e-02; |
|---|
| 1783 | ev[(long)NN - (long)AA][(long)VV - (long)AA] = -3.07931e-02; |
|---|
| 1784 | ev[(long)DD - (long)AA][(long)VV - (long)AA] = -1.35114e-01; |
|---|
| 1785 | ev[(long)CC - (long)AA][(long)VV - (long)AA] = -1.26575e-02; |
|---|
| 1786 | ev[(long)QQ - (long)AA][(long)VV - (long)AA] = -4.34887e-02; |
|---|
| 1787 | ev[(long)EE - (long)AA][(long)VV - (long)AA] = -1.42949e-01; |
|---|
| 1788 | ev[(long)GG - (long)AA][(long)VV - (long)AA] = 1.85463e-01; |
|---|
| 1789 | ev[(long)HH - (long)AA][(long)VV - (long)AA] = 4.82054e-02; |
|---|
| 1790 | ev[(long)II - (long)AA][(long)VV - (long)AA] = -2.88402e-01; |
|---|
| 1791 | ev[(long)LL - (long)AA][(long)VV - (long)AA] = 2.93123e-01; |
|---|
| 1792 | ev[(long)KK - (long)AA][(long)VV - (long)AA] = 1.32034e-02; |
|---|
| 1793 | ev[(long)MM - (long)AA][(long)VV - (long)AA] = 6.77690e-02; |
|---|
| 1794 | ev[(long)FF - (long)AA][(long)VV - (long)AA] = -5.43584e-01; |
|---|
| 1795 | ev[(long)PP_ - (long)AA][(long)VV - (long)AA] = 1.46520e-01; |
|---|
| 1796 | ev[(long)SS - (long)AA][(long)VV - (long)AA] = 3.28990e-03; |
|---|
| 1797 | ev[(long)TT - (long)AA][(long)VV - (long)AA] = -7.67072e-02; |
|---|
| 1798 | ev[(long)WW - (long)AA][(long)VV - (long)AA] = -2.03106e-02; |
|---|
| 1799 | ev[(long)YY - (long)AA][(long)VV - (long)AA] = 5.89467e-01; |
|---|
| 1800 | ev[(long)VV - (long)AA][(long)VV - (long)AA] = -2.68367e-01; |
|---|
| 1801 | |
|---|
| 1802 | |
|---|
| 1803 | eval[0] = -2.03036e-02; |
|---|
| 1804 | eval[(long)RR - (long)AA] = -2.33761e-02; |
|---|
| 1805 | eval[(long)NN - (long)AA] = -1.71812e-02; |
|---|
| 1806 | eval[(long)DD - (long)AA] = -1.82705e-02; |
|---|
| 1807 | eval[(long)CC - (long)AA] = -1.55431e-15; |
|---|
| 1808 | eval[(long)QQ - (long)AA] = -1.60581e-02; |
|---|
| 1809 | eval[(long)EE - (long)AA] = -1.34008e-02; |
|---|
| 1810 | eval[(long)GG - (long)AA] = -1.38363e-02; |
|---|
| 1811 | eval[(long)HH - (long)AA] = -2.36636e-03; |
|---|
| 1812 | eval[(long)II - (long)AA] = -2.68394e-03; |
|---|
| 1813 | eval[(long)LL - (long)AA] = -2.91392e-03; |
|---|
| 1814 | eval[(long)KK - (long)AA] = -1.13524e-02; |
|---|
| 1815 | eval[(long)MM - (long)AA] = -4.34547e-03; |
|---|
| 1816 | eval[(long)FF - (long)AA] = -1.06999e-02; |
|---|
| 1817 | eval[(long)PP_ - (long)AA] = -5.48466e-03; |
|---|
| 1818 | eval[(long)SS - (long)AA] = -8.98371e-03; |
|---|
| 1819 | eval[(long)TT - (long)AA] = -7.23244e-03; |
|---|
| 1820 | eval[(long)WW - (long)AA] = -7.37540e-03; |
|---|
| 1821 | eval[(long)YY - (long)AA] = -7.91291e-03; |
|---|
| 1822 | eval[(long)VV - (long)AA] = -8.24441e-03; |
|---|
| 1823 | |
|---|
| 1824 | |
|---|
| 1825 | freqdyhf[0] = 0.8712669e-01; |
|---|
| 1826 | freqdyhf[(long)RR - (long)AA] = 0.4090396e-01; |
|---|
| 1827 | freqdyhf[(long)NN - (long)AA] = 0.4043229e-01; |
|---|
| 1828 | freqdyhf[(long)DD - (long)AA] = 0.4687196e-01; |
|---|
| 1829 | freqdyhf[(long)CC - (long)AA] = 0.3347348e-01; |
|---|
| 1830 | freqdyhf[(long)QQ - (long)AA] = 0.3825543e-01; |
|---|
| 1831 | freqdyhf[(long)EE - (long)AA] = 0.4953036e-01; |
|---|
| 1832 | freqdyhf[(long)GG - (long)AA] = 0.8861207e-01; |
|---|
| 1833 | freqdyhf[(long)HH - (long)AA] = 0.3361838e-01; |
|---|
| 1834 | freqdyhf[(long)II - (long)AA] = 0.3688570e-01; |
|---|
| 1835 | freqdyhf[(long)LL - (long)AA] = 0.8535736e-01; |
|---|
| 1836 | freqdyhf[(long)KK - (long)AA] = 0.8048168e-01; |
|---|
| 1837 | freqdyhf[(long)MM - (long)AA] = 0.1475275e-01; |
|---|
| 1838 | freqdyhf[(long)FF - (long)AA] = 0.3977166e-01; |
|---|
| 1839 | freqdyhf[(long)PP_ - (long)AA] = 0.5067984e-01; |
|---|
| 1840 | freqdyhf[(long)SS - (long)AA] = 0.6957710e-01; |
|---|
| 1841 | freqdyhf[(long)TT - (long)AA] = 0.5854172e-01; |
|---|
| 1842 | freqdyhf[(long)WW - (long)AA] = 0.1049367e-01; |
|---|
| 1843 | freqdyhf[(long)YY - (long)AA] = 0.2991627e-01; |
|---|
| 1844 | freqdyhf[(long)VV - (long)AA] = 0.6471762e-01; |
|---|
| 1845 | } /* dataeigenv */ |
|---|
| 1846 | |
|---|
| 1847 | |
|---|
| 1848 | /*** TRANSITION PROBABILITY MATRIX ***/ |
|---|
| 1849 | Static Void tprobmtrx(arc, tpr) |
|---|
| 1850 | double arc; |
|---|
| 1851 | aryamity *tpr; |
|---|
| 1852 | { |
|---|
| 1853 | /* transition probability matrix */ |
|---|
| 1854 | double sum; |
|---|
| 1855 | amity iba, jba, kba; |
|---|
| 1856 | aryamity exparc; |
|---|
| 1857 | |
|---|
| 1858 | /* negative : BOOLEAN; */ |
|---|
| 1859 | /* negative := FALSE; */ |
|---|
| 1860 | for (kba = AA; (long)kba <= (long)VV; kba = (amity)((long)kba + 1)) |
|---|
| 1861 | exparc[(long)kba - (long)AA] = exp(arc * eval[(long)kba - (long)AA]); |
|---|
| 1862 | for (iba = AA; (long)iba <= (long)VV; iba = (amity)((long)iba + 1)) { |
|---|
| 1863 | for (jba = AA; (long)jba <= (long)VV; jba = (amity)((long)jba + 1)) { |
|---|
| 1864 | sum = coefp[(long)iba - (long)AA][(long)jba - (long)AA][0] * exparc[0] + |
|---|
| 1865 | coefp[(long)iba - (long)AA][(long)jba - (long)AA][(long)RR - (long) |
|---|
| 1866 | AA] * exparc[(long)RR - (long)AA] + coefp[(long)iba - (long) |
|---|
| 1867 | AA][(long)jba - (long)AA][(long)NN - (long)AA] * |
|---|
| 1868 | exparc[(long)NN - (long)AA] + coefp[(long)iba - (long)AA][(long) |
|---|
| 1869 | jba - (long)AA][(long)DD - (long)AA] * exparc[(long)DD - |
|---|
| 1870 | (long)AA] + coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1871 | [(long)CC - (long)AA] * exparc[(long)CC - (long)AA] + coefp[(long) |
|---|
| 1872 | iba - (long)AA][(long)jba - (long)AA][(long)QQ - (long)AA] * |
|---|
| 1873 | exparc[(long)QQ - (long)AA] + coefp[(long)iba - (long)AA][(long) |
|---|
| 1874 | jba - (long)AA][(long)EE - (long)AA] * exparc[(long)EE - |
|---|
| 1875 | (long)AA] + coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1876 | [(long)GG - (long)AA] * exparc[(long)GG - (long)AA] + coefp[(long) |
|---|
| 1877 | iba - (long)AA][(long)jba - (long)AA][(long)HH - (long)AA] * |
|---|
| 1878 | exparc[(long)HH - (long)AA] + coefp[(long)iba - (long)AA][(long) |
|---|
| 1879 | jba - (long)AA][(long)II - (long)AA] * exparc[(long)II - |
|---|
| 1880 | (long)AA] + coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1881 | [(long)LL - (long)AA] * exparc[(long)LL - (long)AA] + coefp[(long) |
|---|
| 1882 | iba - (long)AA][(long)jba - (long)AA][(long)KK - (long)AA] * |
|---|
| 1883 | exparc[(long)KK - (long)AA] + coefp[(long)iba - (long)AA][(long) |
|---|
| 1884 | jba - (long)AA][(long)MM - (long)AA] * exparc[(long)MM - |
|---|
| 1885 | (long)AA] + coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1886 | [(long)FF - (long)AA] * exparc[(long)FF - (long)AA] + coefp[(long) |
|---|
| 1887 | iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1888 | [(long)PP_ - (long)AA] * exparc[(long)PP_ - (long)AA] + |
|---|
| 1889 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1890 | [(long)SS - (long)AA] * exparc[(long)SS - (long)AA] + |
|---|
| 1891 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1892 | [(long)TT - (long)AA] * exparc[(long)TT - (long)AA] + |
|---|
| 1893 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1894 | [(long)WW - (long)AA] * exparc[(long)WW - (long)AA] + |
|---|
| 1895 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1896 | [(long)YY - (long)AA] * exparc[(long)YY - (long)AA] + |
|---|
| 1897 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1898 | [(long)VV - (long)AA] * exparc[(long)VV - (long)AA]; |
|---|
| 1899 | /* p2c: protml.pas, line 1462: Note: |
|---|
| 1900 | * Line breaker spent 0.0+1.00 seconds, 5000 tries on line 1898 [251] */ |
|---|
| 1901 | if (sum < minreal) /* negative := TRUE; */ |
|---|
| 1902 | tpr[(long)iba - (long)AA][(long)jba - (long)AA] = 0.0; |
|---|
| 1903 | /* attention */ |
|---|
| 1904 | else |
|---|
| 1905 | tpr[(long)iba - (long)AA][(long)jba - (long)AA] = sum; |
|---|
| 1906 | } |
|---|
| 1907 | } |
|---|
| 1908 | /* IF negative THEN |
|---|
| 1909 | IF debugoptn THEN |
|---|
| 1910 | BEGIN |
|---|
| 1911 | write(output,' Trans. prob. 1 is negative !'); |
|---|
| 1912 | writeln(output,' arc =',arc:10:5); |
|---|
| 1913 | END; */ |
|---|
| 1914 | } /* tprobmtrx */ |
|---|
| 1915 | |
|---|
| 1916 | |
|---|
| 1917 | /*** TRANSITION PROBABILITY AND DIFFRENCE MATRIX ***/ |
|---|
| 1918 | Static Void tdiffmtrx(arc, tpr, td1, td2) |
|---|
| 1919 | double arc; |
|---|
| 1920 | aryamity *tpr, *td1, *td2; |
|---|
| 1921 | { |
|---|
| 1922 | /* transition probability matrix */ |
|---|
| 1923 | double sum, sumd1, sumd2, aaa, rrr, nnn, ddd, ccc, qqq, eee, ggg, hhh, iii, |
|---|
| 1924 | lll, kkk, mmm, fff, ppp, sss, ttt, www, yyy, vvv; |
|---|
| 1925 | amity iba, jba, kba; |
|---|
| 1926 | aryamity exparc; |
|---|
| 1927 | |
|---|
| 1928 | for (kba = AA; (long)kba <= (long)VV; kba = (amity)((long)kba + 1)) |
|---|
| 1929 | exparc[(long)kba - (long)AA] = exp(arc * eval[(long)kba - (long)AA]); |
|---|
| 1930 | for (iba = AA; (long)iba <= (long)VV; iba = (amity)((long)iba + 1)) { |
|---|
| 1931 | for (jba = AA; (long)jba <= (long)VV; jba = (amity)((long)jba + 1)) { |
|---|
| 1932 | aaa = coefp[(long)iba - (long)AA][(long)jba - (long)AA][0] * exparc[0]; |
|---|
| 1933 | rrr = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1934 | [(long)RR - (long)AA] * exparc[(long)RR - (long)AA]; |
|---|
| 1935 | nnn = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1936 | [(long)NN - (long)AA] * exparc[(long)NN - (long)AA]; |
|---|
| 1937 | ddd = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1938 | [(long)DD - (long)AA] * exparc[(long)DD - (long)AA]; |
|---|
| 1939 | ccc = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1940 | [(long)CC - (long)AA] * exparc[(long)CC - (long)AA]; |
|---|
| 1941 | qqq = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1942 | [(long)QQ - (long)AA] * exparc[(long)QQ - (long)AA]; |
|---|
| 1943 | eee = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1944 | [(long)EE - (long)AA] * exparc[(long)EE - (long)AA]; |
|---|
| 1945 | ggg = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1946 | [(long)GG - (long)AA] * exparc[(long)GG - (long)AA]; |
|---|
| 1947 | hhh = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1948 | [(long)HH - (long)AA] * exparc[(long)HH - (long)AA]; |
|---|
| 1949 | iii = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1950 | [(long)II - (long)AA] * exparc[(long)II - (long)AA]; |
|---|
| 1951 | lll = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1952 | [(long)LL - (long)AA] * exparc[(long)LL - (long)AA]; |
|---|
| 1953 | kkk = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1954 | [(long)KK - (long)AA] * exparc[(long)KK - (long)AA]; |
|---|
| 1955 | mmm = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1956 | [(long)MM - (long)AA] * exparc[(long)MM - (long)AA]; |
|---|
| 1957 | fff = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1958 | [(long)FF - (long)AA] * exparc[(long)FF - (long)AA]; |
|---|
| 1959 | ppp = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1960 | [(long)PP_ - (long)AA] * exparc[(long)PP_ - (long)AA]; |
|---|
| 1961 | sss = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1962 | [(long)SS - (long)AA] * exparc[(long)SS - (long)AA]; |
|---|
| 1963 | ttt = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1964 | [(long)TT - (long)AA] * exparc[(long)TT - (long)AA]; |
|---|
| 1965 | www = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1966 | [(long)WW - (long)AA] * exparc[(long)WW - (long)AA]; |
|---|
| 1967 | yyy = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1968 | [(long)YY - (long)AA] * exparc[(long)YY - (long)AA]; |
|---|
| 1969 | vvv = coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 1970 | [(long)VV - (long)AA] * exparc[(long)VV - (long)AA]; |
|---|
| 1971 | |
|---|
| 1972 | sum = aaa + rrr + nnn + ddd + ccc + qqq + eee + ggg + hhh + iii + lll + |
|---|
| 1973 | kkk + mmm + fff + ppp + sss + ttt + www + yyy + vvv; |
|---|
| 1974 | sumd1 = aaa * eval[0] + rrr * eval[(long)RR - (long)AA] + |
|---|
| 1975 | nnn * eval[(long)NN - (long)AA] + ddd * eval[(long)DD - (long)AA] + |
|---|
| 1976 | ccc * eval[(long)CC - (long)AA] + qqq * eval[(long)QQ - (long)AA] + |
|---|
| 1977 | eee * eval[(long)EE - (long)AA] + ggg * eval[(long)GG - (long)AA] + |
|---|
| 1978 | hhh * eval[(long)HH - (long)AA] + iii * eval[(long)II - (long)AA] + |
|---|
| 1979 | lll * eval[(long)LL - (long)AA] + kkk * eval[(long)KK - (long)AA] + |
|---|
| 1980 | mmm * eval[(long)MM - (long)AA] + fff * eval[(long)FF - (long)AA] + |
|---|
| 1981 | ppp * eval[(long)PP_ - (long)AA] + sss * eval[(long)SS - (long)AA] + |
|---|
| 1982 | ttt * eval[(long)TT - (long)AA] + www * eval[(long)WW - (long)AA] + |
|---|
| 1983 | yyy * eval[(long)YY - (long)AA] + vvv * eval[(long)VV - (long)AA]; |
|---|
| 1984 | /* p2c: protml.pas, line 1542: Note: |
|---|
| 1985 | * Line breaker spent 0.0+1.00 seconds, 5000 tries on line 1983 [251] */ |
|---|
| 1986 | sumd2 = aaa * eval2[0] + rrr * eval2[(long)RR - (long)AA] + |
|---|
| 1987 | nnn * eval2[(long)NN - (long)AA] + |
|---|
| 1988 | ddd * eval2[(long)DD - (long)AA] + |
|---|
| 1989 | ccc * eval2[(long)CC - (long)AA] + |
|---|
| 1990 | qqq * eval2[(long)QQ - (long)AA] + |
|---|
| 1991 | eee * eval2[(long)EE - (long)AA] + |
|---|
| 1992 | ggg * eval2[(long)GG - (long)AA] + |
|---|
| 1993 | hhh * eval2[(long)HH - (long)AA] + |
|---|
| 1994 | iii * eval2[(long)II - (long)AA] + |
|---|
| 1995 | lll * eval2[(long)LL - (long)AA] + |
|---|
| 1996 | kkk * eval2[(long)KK - (long)AA] + |
|---|
| 1997 | mmm * eval2[(long)MM - (long)AA] + |
|---|
| 1998 | fff * eval2[(long)FF - (long)AA] + |
|---|
| 1999 | ppp * eval2[(long)PP_ - (long)AA] + |
|---|
| 2000 | sss * eval2[(long)SS - (long)AA] + |
|---|
| 2001 | ttt * eval2[(long)TT - (long)AA] + |
|---|
| 2002 | www * eval2[(long)WW - (long)AA] + |
|---|
| 2003 | yyy * eval2[(long)YY - (long)AA] + vvv * eval2[(long)VV - (long)AA]; |
|---|
| 2004 | /* p2c: protml.pas, line 1542: |
|---|
| 2005 | * Note: Line breaker spent 0.0 seconds, 5000 tries on line 2003 [251] */ |
|---|
| 2006 | if (sum < minreal) { /* attention */ |
|---|
| 2007 | tpr[(long)iba - (long)AA][(long)jba - (long)AA] = 0.0; |
|---|
| 2008 | td1[(long)iba - (long)AA][(long)jba - (long)AA] = 0.0; |
|---|
| 2009 | td2[(long)iba - (long)AA][(long)jba - (long)AA] = 0.0; |
|---|
| 2010 | } else { |
|---|
| 2011 | tpr[(long)iba - (long)AA][(long)jba - (long)AA] = sum; |
|---|
| 2012 | td1[(long)iba - (long)AA][(long)jba - (long)AA] = sumd1; |
|---|
| 2013 | td2[(long)iba - (long)AA][(long)jba - (long)AA] = sumd2; |
|---|
| 2014 | } |
|---|
| 2015 | } |
|---|
| 2016 | } |
|---|
| 2017 | /* IF negative THEN |
|---|
| 2018 | IF debugoptn THEN |
|---|
| 2019 | BEGIN |
|---|
| 2020 | write(output,' Trans. prob. 2 is negative !'); |
|---|
| 2021 | writeln(output,' arc =',arc:10:5); |
|---|
| 2022 | END; */ |
|---|
| 2023 | } /* tdiffmtrx */ |
|---|
| 2024 | |
|---|
| 2025 | |
|---|
| 2026 | /*** MAKE TRANSITION PROBABILITY MATRIX ***/ |
|---|
| 2027 | Static Void maketransprob() |
|---|
| 2028 | { |
|---|
| 2029 | /* make transition probability matrix */ |
|---|
| 2030 | ndaryamity amatrix, bmatrix, cmatrix; |
|---|
| 2031 | amity iba, jba, kba; |
|---|
| 2032 | |
|---|
| 2033 | if (readtoptn) |
|---|
| 2034 | readeigenv(); |
|---|
| 2035 | else |
|---|
| 2036 | dataeigenv(); |
|---|
| 2037 | if (writeoptn) |
|---|
| 2038 | printfreqdyhf(); |
|---|
| 2039 | |
|---|
| 2040 | if (readtoptn) |
|---|
| 2041 | printf("read trans. matrix\n"); |
|---|
| 2042 | if (debugoptn) |
|---|
| 2043 | printeigen(); |
|---|
| 2044 | |
|---|
| 2045 | convermtrx(ev, amatrix); |
|---|
| 2046 | memcpy(cmatrix, amatrix, sizeof(ndaryamity)); |
|---|
| 2047 | luinverse(cmatrix, bmatrix, 20L); |
|---|
| 2048 | /* IF debugoptn printnmtrx (bmatrix); */ |
|---|
| 2049 | mproduct(amatrix, bmatrix, cmatrix, 20L, 20L, 20L); |
|---|
| 2050 | checkevector(cmatrix, 20L); |
|---|
| 2051 | /* IF debugoptn printnmtrx (cmatrix); */ |
|---|
| 2052 | reconvermtrx(bmatrix, iev); |
|---|
| 2053 | for (iba = AA; (long)iba <= (long)VV; iba = (amity)((long)iba + 1)) { |
|---|
| 2054 | for (jba = AA; (long)jba <= (long)VV; jba = (amity)((long)jba + 1)) { |
|---|
| 2055 | for (kba = AA; (long)kba <= (long)VV; kba = (amity)((long)kba + 1)) |
|---|
| 2056 | coefp[(long)iba - (long)AA][(long)jba - (long)AA] |
|---|
| 2057 | [(long)kba - (long)AA] = ev[(long)iba - (long)AA] |
|---|
| 2058 | [(long)kba - (long)AA] * iev[(long)kba - (long)AA] |
|---|
| 2059 | [(long)jba - (long)AA]; |
|---|
| 2060 | } |
|---|
| 2061 | } |
|---|
| 2062 | for (kba = AA; (long)kba <= (long)VV; kba = (amity)((long)kba + 1)) |
|---|
| 2063 | eval2[(long)kba - (long)AA] = eval[(long)kba - (long)AA] * |
|---|
| 2064 | eval[(long)kba - (long)AA]; |
|---|
| 2065 | /* |
|---|
| 2066 | tprobmtrx ( 100.0, tprobt ); |
|---|
| 2067 | printamtrx ( tprobt ); |
|---|
| 2068 | */ |
|---|
| 2069 | } /* maketransprob */ |
|---|
| 2070 | |
|---|
| 2071 | |
|---|
| 2072 | Static double randum(seed) |
|---|
| 2073 | long *seed; |
|---|
| 2074 | { |
|---|
| 2075 | /* random number generator -- slow but machine independent */ |
|---|
| 2076 | long i, j, k, sum; |
|---|
| 2077 | longintty mult, newseed; |
|---|
| 2078 | double x; |
|---|
| 2079 | |
|---|
| 2080 | mult[0] = 13; |
|---|
| 2081 | mult[1] = 24; |
|---|
| 2082 | mult[2] = 22; |
|---|
| 2083 | mult[3] = 6; |
|---|
| 2084 | for (i = 0; i <= 5; i++) |
|---|
| 2085 | newseed[i] = 0; |
|---|
| 2086 | for (i = 0; i <= 5; i++) { |
|---|
| 2087 | sum = newseed[i]; |
|---|
| 2088 | k = i; |
|---|
| 2089 | if (i > 3) |
|---|
| 2090 | k = 3; |
|---|
| 2091 | for (j = 0; j <= k; j++) |
|---|
| 2092 | sum += mult[j] * seed[i - j]; |
|---|
| 2093 | newseed[i] = sum; |
|---|
| 2094 | for (j = i; j <= 4; j++) { |
|---|
| 2095 | newseed[j + 1] += newseed[j] / 64; |
|---|
| 2096 | newseed[j] &= 63; |
|---|
| 2097 | } |
|---|
| 2098 | } |
|---|
| 2099 | memcpy(seed, newseed, sizeof(longintty)); |
|---|
| 2100 | seed[5] &= 3; |
|---|
| 2101 | x = 0.0; |
|---|
| 2102 | for (i = 0; i <= 5; i++) |
|---|
| 2103 | x = x / 64.0 + seed[i]; |
|---|
| 2104 | x /= 4.0; |
|---|
| 2105 | return x; |
|---|
| 2106 | } /* randum */ |
|---|
| 2107 | |
|---|
| 2108 | |
|---|
| 2109 | /*******************************************************/ |
|---|
| 2110 | /***** ESTIMATE TREE TOPOLOGY *****/ |
|---|
| 2111 | /*******************************************************/ |
|---|
| 2112 | |
|---|
| 2113 | /**************************************/ |
|---|
| 2114 | /*** READ TREE STRUCTURE ***/ |
|---|
| 2115 | /**************************************/ |
|---|
| 2116 | |
|---|
| 2117 | /*** SERCH OF END CHARACTER ***/ |
|---|
| 2118 | Static Void serchchend() |
|---|
| 2119 | { |
|---|
| 2120 | if (chs == ',' || chs == ')') |
|---|
| 2121 | return; |
|---|
| 2122 | do { |
|---|
| 2123 | if (P_eoln(seqfile)) { |
|---|
| 2124 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 2125 | getc(seqfile); |
|---|
| 2126 | } |
|---|
| 2127 | chs = getc(seqfile); |
|---|
| 2128 | if (chs == '\n') |
|---|
| 2129 | chs = ' '; |
|---|
| 2130 | } while (chs != ',' && chs != ')'); |
|---|
| 2131 | } /* serchchend */ |
|---|
| 2132 | |
|---|
| 2133 | |
|---|
| 2134 | /*** NEXT CHARACTER ***/ |
|---|
| 2135 | Static Void nextchar(ch) |
|---|
| 2136 | Char *ch; |
|---|
| 2137 | { |
|---|
| 2138 | do { |
|---|
| 2139 | if (P_eoln(seqfile)) { |
|---|
| 2140 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 2141 | getc(seqfile); |
|---|
| 2142 | } |
|---|
| 2143 | *ch = getc(seqfile); |
|---|
| 2144 | if (*ch == '\n') |
|---|
| 2145 | *ch = ' '; |
|---|
| 2146 | } while (*ch == ' '); |
|---|
| 2147 | } /* nextchar */ |
|---|
| 2148 | |
|---|
| 2149 | |
|---|
| 2150 | /*** CREATE DATASTRUCTURE OF NODE ***/ |
|---|
| 2151 | Static Void clearnode(p) |
|---|
| 2152 | node *p; |
|---|
| 2153 | { |
|---|
| 2154 | long i, FORLIM; |
|---|
| 2155 | |
|---|
| 2156 | p->isop = NULL; |
|---|
| 2157 | p->kinp = NULL; |
|---|
| 2158 | p->diverg = 1; |
|---|
| 2159 | p->number = 0; |
|---|
| 2160 | for (i = 0; i < maxname; i++) |
|---|
| 2161 | p->namesp[i] = ' '; |
|---|
| 2162 | FORLIM = numsp; |
|---|
| 2163 | for (i = 0; i < FORLIM; i++) |
|---|
| 2164 | p->descen[i] = 0; |
|---|
| 2165 | p->nadata = ami; |
|---|
| 2166 | p->UU.U0.lnga = 0.0; |
|---|
| 2167 | } /* clearnode */ |
|---|
| 2168 | |
|---|
| 2169 | |
|---|
| 2170 | /*** JUDGMENT SPEICIES NAME ***/ |
|---|
| 2171 | Static Void judgspname(tr, num) |
|---|
| 2172 | tree *tr; |
|---|
| 2173 | long *num; |
|---|
| 2174 | { |
|---|
| 2175 | long ie; /* number of name strings */ |
|---|
| 2176 | namety namestr; /* current species name of seqfile */ |
|---|
| 2177 | boolean found; |
|---|
| 2178 | |
|---|
| 2179 | for (ie = 0; ie < maxname; ie++) |
|---|
| 2180 | namestr[ie] = ' '; |
|---|
| 2181 | ie = 1; |
|---|
| 2182 | do { |
|---|
| 2183 | if (chs == '_') |
|---|
| 2184 | chs = ' '; |
|---|
| 2185 | namestr[ie - 1] = chs; |
|---|
| 2186 | if (P_eoln(seqfile)) { |
|---|
| 2187 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 2188 | getc(seqfile); |
|---|
| 2189 | } |
|---|
| 2190 | chs = getc(seqfile); |
|---|
| 2191 | if (chs == '\n') |
|---|
| 2192 | chs = ' '; |
|---|
| 2193 | ie++; |
|---|
| 2194 | } while (chs != ':' && chs != ',' && chs != ')' && ie <= maxname); |
|---|
| 2195 | *num = 1; |
|---|
| 2196 | do { |
|---|
| 2197 | found = true; |
|---|
| 2198 | for (ie = 0; ie < maxname; ie++) |
|---|
| 2199 | found = (found && namestr[ie] == tr->brnchp[*num]->namesp[ie]); |
|---|
| 2200 | if (!found) |
|---|
| 2201 | (*num)++; |
|---|
| 2202 | } while (!(*num > numsp || found)); |
|---|
| 2203 | if (*num <= numsp) |
|---|
| 2204 | return; |
|---|
| 2205 | printf(" Cannot find species: "); |
|---|
| 2206 | for (ie = 0; ie < maxname; ie++) |
|---|
| 2207 | putchar(namestr[ie]); |
|---|
| 2208 | putchar('\n'); |
|---|
| 2209 | } /* judgspname */ |
|---|
| 2210 | |
|---|
| 2211 | |
|---|
| 2212 | /*** ADD EXTERNAL NODE ***/ |
|---|
| 2213 | Static Void externalnode(tr, up) |
|---|
| 2214 | tree *tr; |
|---|
| 2215 | node *up; |
|---|
| 2216 | { |
|---|
| 2217 | long num; /* number of external nodes */ |
|---|
| 2218 | |
|---|
| 2219 | judgspname(tr, &num); |
|---|
| 2220 | tr->brnchp[num]->kinp = up; |
|---|
| 2221 | up->kinp = tr->brnchp[num]; |
|---|
| 2222 | if (tr->startp->number > num) |
|---|
| 2223 | tr->startp = tr->brnchp[num]; |
|---|
| 2224 | tr->brnchp[num]->UU.U0.lnga = 0.0; |
|---|
| 2225 | up->UU.U0.lnga = 0.0; |
|---|
| 2226 | } /* externalnode */ |
|---|
| 2227 | |
|---|
| 2228 | |
|---|
| 2229 | /*** ADD INTERNAL NODE ***/ |
|---|
| 2230 | Static Void internalnode(tr, up, ninode) |
|---|
| 2231 | tree *tr; |
|---|
| 2232 | node *up; |
|---|
| 2233 | long *ninode; |
|---|
| 2234 | { |
|---|
| 2235 | node *np; /* new pointer to internal node */ |
|---|
| 2236 | node *cp; /* current pointer to internal node */ |
|---|
| 2237 | long i, nd, dvg; |
|---|
| 2238 | |
|---|
| 2239 | nextchar(&chs); |
|---|
| 2240 | if (chs != '(') { |
|---|
| 2241 | externalnode(tr, up); |
|---|
| 2242 | return; |
|---|
| 2243 | } |
|---|
| 2244 | (*ninode)++; |
|---|
| 2245 | nd = *ninode; |
|---|
| 2246 | if (freenode == NULL) |
|---|
| 2247 | np = (node *)Malloc(sizeof(node)); |
|---|
| 2248 | else { |
|---|
| 2249 | np = freenode; |
|---|
| 2250 | freenode = np->isop; |
|---|
| 2251 | np->isop = NULL; |
|---|
| 2252 | } |
|---|
| 2253 | clearnode(np); |
|---|
| 2254 | np->isop = np; |
|---|
| 2255 | cp = np; |
|---|
| 2256 | np = NULL; |
|---|
| 2257 | cp->number = nd; |
|---|
| 2258 | tr->brnchp[*ninode] = cp; |
|---|
| 2259 | up->kinp = cp; |
|---|
| 2260 | cp->kinp = up; |
|---|
| 2261 | dvg = 0; |
|---|
| 2262 | while (chs != ')') { |
|---|
| 2263 | dvg++; |
|---|
| 2264 | if (freenode == NULL) |
|---|
| 2265 | np = (node *)Malloc(sizeof(node)); |
|---|
| 2266 | else { |
|---|
| 2267 | np = freenode; |
|---|
| 2268 | freenode = np->isop; |
|---|
| 2269 | np->isop = NULL; |
|---|
| 2270 | } |
|---|
| 2271 | clearnode(np); |
|---|
| 2272 | np->isop = cp->isop; |
|---|
| 2273 | cp->isop = np; |
|---|
| 2274 | cp = np; |
|---|
| 2275 | np = NULL; |
|---|
| 2276 | cp->number = nd; |
|---|
| 2277 | internalnode(tr, cp, ninode); |
|---|
| 2278 | serchchend(); |
|---|
| 2279 | } |
|---|
| 2280 | for (i = 0; i <= dvg; i++) { |
|---|
| 2281 | cp->diverg = dvg; |
|---|
| 2282 | cp = cp->isop; |
|---|
| 2283 | } |
|---|
| 2284 | nextchar(&chs); /* */ |
|---|
| 2285 | } /* internalnode */ |
|---|
| 2286 | |
|---|
| 2287 | |
|---|
| 2288 | /*** MAKE STRUCTURE OF TREE ***/ |
|---|
| 2289 | Static Void treestructure(tr) |
|---|
| 2290 | tree *tr; |
|---|
| 2291 | { |
|---|
| 2292 | long i, dvg, ninode; /* number of internal nodes */ |
|---|
| 2293 | node *np; /* new pointer */ |
|---|
| 2294 | node *cp; /* current pointer to zero node(root) */ |
|---|
| 2295 | |
|---|
| 2296 | ninode = numsp; |
|---|
| 2297 | nextchar(&chs); |
|---|
| 2298 | if (chs == '(') { |
|---|
| 2299 | dvg = -1; |
|---|
| 2300 | while (chs != ')') { |
|---|
| 2301 | if (freenode == NULL) |
|---|
| 2302 | np = (node *)Malloc(sizeof(node)); |
|---|
| 2303 | else { |
|---|
| 2304 | np = freenode; |
|---|
| 2305 | freenode = np->isop; |
|---|
| 2306 | np->isop = NULL; |
|---|
| 2307 | } |
|---|
| 2308 | clearnode(np); |
|---|
| 2309 | internalnode(tr, np, &ninode); |
|---|
| 2310 | dvg++; |
|---|
| 2311 | if (dvg == 0) |
|---|
| 2312 | np->isop = np; |
|---|
| 2313 | else { |
|---|
| 2314 | np->isop = cp->isop; |
|---|
| 2315 | cp->isop = np; |
|---|
| 2316 | } |
|---|
| 2317 | cp = np; |
|---|
| 2318 | np = NULL; |
|---|
| 2319 | serchchend(); |
|---|
| 2320 | } |
|---|
| 2321 | tr->brnchp[0] = cp->isop; |
|---|
| 2322 | tr->startp = tr->brnchp[numsp]; |
|---|
| 2323 | for (i = 0; i <= dvg; i++) { |
|---|
| 2324 | cp->diverg = dvg; |
|---|
| 2325 | cp = cp->isop; |
|---|
| 2326 | } |
|---|
| 2327 | } |
|---|
| 2328 | fscanf(seqfile, "%*[^\n]"); |
|---|
| 2329 | getc(seqfile); |
|---|
| 2330 | ibrnch2 = ninode; |
|---|
| 2331 | } /* treestructure */ |
|---|
| 2332 | |
|---|
| 2333 | |
|---|
| 2334 | /*** MAKE STAR STRUCTURE OF TREE ***/ |
|---|
| 2335 | Static Void starstructure(tr) |
|---|
| 2336 | tree *tr; |
|---|
| 2337 | { |
|---|
| 2338 | long i; |
|---|
| 2339 | /* */ |
|---|
| 2340 | long dvg; |
|---|
| 2341 | node *np; /* new pointer */ |
|---|
| 2342 | node *cp; /* current pointer to zero node(root) */ |
|---|
| 2343 | long FORLIM; |
|---|
| 2344 | |
|---|
| 2345 | dvg = -1; |
|---|
| 2346 | FORLIM = numsp; |
|---|
| 2347 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 2348 | if (freenode == NULL) |
|---|
| 2349 | np = (node *)Malloc(sizeof(node)); |
|---|
| 2350 | else { |
|---|
| 2351 | np = freenode; |
|---|
| 2352 | freenode = np->isop; |
|---|
| 2353 | np->isop = NULL; |
|---|
| 2354 | } |
|---|
| 2355 | clearnode(np); |
|---|
| 2356 | |
|---|
| 2357 | tr->brnchp[i]->kinp = np; |
|---|
| 2358 | np->kinp = tr->brnchp[i]; |
|---|
| 2359 | |
|---|
| 2360 | dvg++; |
|---|
| 2361 | if (dvg == 0) |
|---|
| 2362 | np->isop = np; |
|---|
| 2363 | else { |
|---|
| 2364 | np->isop = cp->isop; |
|---|
| 2365 | cp->isop = np; |
|---|
| 2366 | } |
|---|
| 2367 | cp = np; |
|---|
| 2368 | np = NULL; |
|---|
| 2369 | } |
|---|
| 2370 | tr->brnchp[0] = cp->isop; |
|---|
| 2371 | tr->startp = tr->brnchp[numsp]; |
|---|
| 2372 | for (i = 0; i <= dvg; i++) { |
|---|
| 2373 | cp->diverg = dvg; |
|---|
| 2374 | cp = cp->isop; |
|---|
| 2375 | } |
|---|
| 2376 | ibrnch2 = numsp; |
|---|
| 2377 | } /* starstructure */ |
|---|
| 2378 | |
|---|
| 2379 | |
|---|
| 2380 | /* INSERT BRANCH IN TREE */ |
|---|
| 2381 | Static Void insertbranch(tr, cp1, cp2, bp1, bp2, np1, np2) |
|---|
| 2382 | tree *tr; |
|---|
| 2383 | node *cp1, *cp2, *bp1, *bp2, *np1, *np2; |
|---|
| 2384 | { |
|---|
| 2385 | long i, num, dvg; |
|---|
| 2386 | node *ap; |
|---|
| 2387 | |
|---|
| 2388 | i = cp1->number; |
|---|
| 2389 | if (cp1 == tr->brnchp[i]) { |
|---|
| 2390 | if (i != 0) { |
|---|
| 2391 | ap = np1; |
|---|
| 2392 | np1 = np2; |
|---|
| 2393 | np2 = ap; |
|---|
| 2394 | } else |
|---|
| 2395 | tr->brnchp[i] = np2; |
|---|
| 2396 | } |
|---|
| 2397 | /* np2^.number := bp1^.number; |
|---|
| 2398 | cp1^.number := np1^.number; |
|---|
| 2399 | cp2^.number := np1^.number; */ |
|---|
| 2400 | bp1->isop = np2; |
|---|
| 2401 | if (cp1 == bp2) |
|---|
| 2402 | np2->isop = cp2->isop; |
|---|
| 2403 | else |
|---|
| 2404 | np2->isop = cp1->isop; |
|---|
| 2405 | if (cp1 != bp2) |
|---|
| 2406 | bp2->isop = cp2->isop; |
|---|
| 2407 | np1->isop = cp1; |
|---|
| 2408 | if (cp1 != bp2) |
|---|
| 2409 | cp1->isop = cp2; |
|---|
| 2410 | cp2->isop = np1; |
|---|
| 2411 | tr->brnchp[ibrnch2]->kinp->number = tr->brnchp[ibrnch2]->kinp->isop->number; |
|---|
| 2412 | ap = tr->brnchp[ibrnch2]; |
|---|
| 2413 | num = tr->brnchp[ibrnch2]->number; |
|---|
| 2414 | do { |
|---|
| 2415 | ap = ap->isop; |
|---|
| 2416 | ap->number = num; |
|---|
| 2417 | } while (ap->isop != tr->brnchp[ibrnch2]); |
|---|
| 2418 | dvg = 0; |
|---|
| 2419 | ap = np1; |
|---|
| 2420 | do { |
|---|
| 2421 | ap = ap->isop; |
|---|
| 2422 | dvg++; |
|---|
| 2423 | } while (ap->isop != np1); |
|---|
| 2424 | ap = np1; |
|---|
| 2425 | do { |
|---|
| 2426 | ap = ap->isop; |
|---|
| 2427 | ap->diverg = dvg; |
|---|
| 2428 | } while (ap != np1); |
|---|
| 2429 | dvg = 0; |
|---|
| 2430 | ap = np2; |
|---|
| 2431 | do { |
|---|
| 2432 | ap = ap->isop; |
|---|
| 2433 | dvg++; |
|---|
| 2434 | } while (ap->isop != np2); |
|---|
| 2435 | ap = np2; |
|---|
| 2436 | do { |
|---|
| 2437 | ap = ap->isop; |
|---|
| 2438 | ap->diverg = dvg; |
|---|
| 2439 | } while (ap != np2); |
|---|
| 2440 | } /* insertbranch */ |
|---|
| 2441 | |
|---|
| 2442 | |
|---|
| 2443 | /* DELETE BRANCH IN TREE */ |
|---|
| 2444 | Static Void deletebranch(tr, cnode, cp1, cp2, bp1, bp2, np1, np2) |
|---|
| 2445 | tree *tr; |
|---|
| 2446 | long cnode; |
|---|
| 2447 | node *cp1, *cp2, *bp1, *bp2, *np1, *np2; |
|---|
| 2448 | { |
|---|
| 2449 | /* i, */ |
|---|
| 2450 | long dvg; |
|---|
| 2451 | node *ap; |
|---|
| 2452 | |
|---|
| 2453 | if (cnode != 0) { |
|---|
| 2454 | if (tr->brnchp[cnode] == cp1) { |
|---|
| 2455 | ap = np1; |
|---|
| 2456 | np1 = np2; |
|---|
| 2457 | np2 = ap; |
|---|
| 2458 | } |
|---|
| 2459 | } else { |
|---|
| 2460 | if (tr->brnchp[cnode] == np2) |
|---|
| 2461 | tr->brnchp[cnode] = cp1; |
|---|
| 2462 | } |
|---|
| 2463 | /* i := np2^.number; |
|---|
| 2464 | IF i = 0 THEN |
|---|
| 2465 | IF np2 = tr.brnchp[i] THEN tr.brnchp[i] := cp1 |
|---|
| 2466 | ELSE |
|---|
| 2467 | IF cp1 = tr.brnchp[i] THEN |
|---|
| 2468 | BEGIN |
|---|
| 2469 | ap := np1; |
|---|
| 2470 | np1 := np2; |
|---|
| 2471 | np2 := ap; |
|---|
| 2472 | END; */ |
|---|
| 2473 | /* cp1^.number := np2^.number; |
|---|
| 2474 | cp2^.number := np2^.number; */ |
|---|
| 2475 | if (cp1 == bp2) |
|---|
| 2476 | cp2->isop = np2->isop; |
|---|
| 2477 | else |
|---|
| 2478 | cp2->isop = bp2->isop; |
|---|
| 2479 | if (cp1 != bp2) |
|---|
| 2480 | cp1->isop = np2->isop; |
|---|
| 2481 | np1->isop = NULL; |
|---|
| 2482 | if (cp1 != bp2) |
|---|
| 2483 | bp2->isop = cp2; |
|---|
| 2484 | np2->isop = NULL; |
|---|
| 2485 | bp1->isop = cp1; |
|---|
| 2486 | dvg = 0; |
|---|
| 2487 | ap = cp1; |
|---|
| 2488 | do { |
|---|
| 2489 | ap = ap->isop; |
|---|
| 2490 | dvg++; |
|---|
| 2491 | } while (ap->isop != cp1); |
|---|
| 2492 | ap = cp1; |
|---|
| 2493 | do { |
|---|
| 2494 | ap = ap->isop; |
|---|
| 2495 | ap->diverg = dvg; |
|---|
| 2496 | ap->number = cnode; |
|---|
| 2497 | } while (ap != cp1); |
|---|
| 2498 | np1->diverg = 0; |
|---|
| 2499 | np2->diverg = 0; |
|---|
| 2500 | } /* deletebranch */ |
|---|
| 2501 | |
|---|
| 2502 | |
|---|
| 2503 | /*** PRINT STRUCTURE OF TREE ***/ |
|---|
| 2504 | Static Void printcurtree(tr) |
|---|
| 2505 | tree *tr; |
|---|
| 2506 | { |
|---|
| 2507 | node *ap; |
|---|
| 2508 | long i, j, k, num, FORLIM, FORLIM1; |
|---|
| 2509 | |
|---|
| 2510 | printf("\nStructure of Tree\n"); |
|---|
| 2511 | printf("%7s%5s%5s%8s%9s%11s%13s\n", |
|---|
| 2512 | "number", "kinp", "isop", "diverg", "namesp", "length", |
|---|
| 2513 | "descendant"); |
|---|
| 2514 | FORLIM = numsp; |
|---|
| 2515 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 2516 | ap = tr->brnchp[i]; |
|---|
| 2517 | printf("%5ld", ap->number); |
|---|
| 2518 | printf("%6ld", ap->kinp->number); |
|---|
| 2519 | if (ap->isop == NULL) |
|---|
| 2520 | printf("%6s", "nil"); |
|---|
| 2521 | else |
|---|
| 2522 | printf("%6ld", ap->isop->number); |
|---|
| 2523 | printf("%7ld", ap->diverg); |
|---|
| 2524 | printf("%3c", ' '); |
|---|
| 2525 | for (j = 0; j < maxname; j++) |
|---|
| 2526 | putchar(ap->namesp[j]); |
|---|
| 2527 | printf("%8.3f", ap->UU.U0.lnga); |
|---|
| 2528 | printf("%3c", ' '); |
|---|
| 2529 | FORLIM1 = numsp; |
|---|
| 2530 | for (j = 0; j < FORLIM1; j++) |
|---|
| 2531 | printf("%2ld", ap->descen[j]); |
|---|
| 2532 | putchar('\n'); |
|---|
| 2533 | } |
|---|
| 2534 | FORLIM = ibrnch2 + 1; |
|---|
| 2535 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 2536 | if (i == ibrnch2 + 1) |
|---|
| 2537 | num = 0; |
|---|
| 2538 | else |
|---|
| 2539 | num = i; |
|---|
| 2540 | k = 0; |
|---|
| 2541 | ap = tr->brnchp[num]; |
|---|
| 2542 | do { |
|---|
| 2543 | k++; |
|---|
| 2544 | if (ap->number == tr->brnchp[num]->number && k > 1) |
|---|
| 2545 | printf("%5c", '.'); |
|---|
| 2546 | else |
|---|
| 2547 | printf("%5ld", ap->number); |
|---|
| 2548 | printf("%6ld", ap->kinp->number); |
|---|
| 2549 | if (ap->isop->number == tr->brnchp[num]->number && k > 0) /* 1 */ |
|---|
| 2550 | printf("%6c", '.'); |
|---|
| 2551 | else |
|---|
| 2552 | printf("%6ld", ap->isop->number); |
|---|
| 2553 | printf("%7ld", ap->diverg); |
|---|
| 2554 | printf("%3c", ' '); |
|---|
| 2555 | for (j = 1; j <= maxname; j++) |
|---|
| 2556 | putchar(' '); |
|---|
| 2557 | printf("%8.3f", ap->UU.U0.lnga); |
|---|
| 2558 | printf("%3c", ' '); |
|---|
| 2559 | FORLIM1 = numsp; |
|---|
| 2560 | for (j = 0; j < FORLIM1; j++) |
|---|
| 2561 | printf("%2ld", ap->descen[j]); |
|---|
| 2562 | putchar('\n'); |
|---|
| 2563 | ap = ap->isop; |
|---|
| 2564 | } while (ap != tr->brnchp[num]); |
|---|
| 2565 | } |
|---|
| 2566 | } /* printcurtree */ |
|---|
| 2567 | |
|---|
| 2568 | |
|---|
| 2569 | /**************************************/ |
|---|
| 2570 | /*** ESTIMATE LIKELIHOOD OF TREE ***/ |
|---|
| 2571 | /**************************************/ |
|---|
| 2572 | |
|---|
| 2573 | Static Void initdescen(tr) |
|---|
| 2574 | tree *tr; |
|---|
| 2575 | { |
|---|
| 2576 | node *ap; |
|---|
| 2577 | long i, j, k, num, FORLIM, FORLIM1, FORLIM2; |
|---|
| 2578 | |
|---|
| 2579 | FORLIM = numsp; |
|---|
| 2580 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 2581 | ap = tr->brnchp[i]; |
|---|
| 2582 | FORLIM1 = numsp; |
|---|
| 2583 | for (j = 0; j < FORLIM1; j++) |
|---|
| 2584 | ap->descen[j] = 0; |
|---|
| 2585 | ap->descen[i - 1] = 1; |
|---|
| 2586 | } |
|---|
| 2587 | FORLIM = ibrnch2 + 1; |
|---|
| 2588 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 2589 | if (i == ibrnch2 + 1) |
|---|
| 2590 | num = 0; |
|---|
| 2591 | else |
|---|
| 2592 | num = i; |
|---|
| 2593 | ap = tr->brnchp[num]; |
|---|
| 2594 | FORLIM1 = tr->brnchp[num]->diverg + 1; |
|---|
| 2595 | for (k = 1; k <= FORLIM1; k++) { |
|---|
| 2596 | FORLIM2 = numsp; |
|---|
| 2597 | for (j = 0; j < FORLIM2; j++) |
|---|
| 2598 | ap->descen[j] = 0; |
|---|
| 2599 | ap = ap->isop; |
|---|
| 2600 | } |
|---|
| 2601 | } |
|---|
| 2602 | } /* initdescen */ |
|---|
| 2603 | |
|---|
| 2604 | |
|---|
| 2605 | Static Void initnodeA(p) |
|---|
| 2606 | node *p; |
|---|
| 2607 | { |
|---|
| 2608 | node *cp; |
|---|
| 2609 | long i, n; |
|---|
| 2610 | double sumprb; |
|---|
| 2611 | amity ba; |
|---|
| 2612 | long FORLIM, FORLIM2; |
|---|
| 2613 | |
|---|
| 2614 | if (p->isop == NULL) /* TIP */ |
|---|
| 2615 | return; |
|---|
| 2616 | cp = p->isop; |
|---|
| 2617 | FORLIM = p->diverg; |
|---|
| 2618 | for (n = 1; n <= FORLIM; n++) { |
|---|
| 2619 | initnodeA(cp->kinp); |
|---|
| 2620 | cp = cp->isop; |
|---|
| 2621 | } |
|---|
| 2622 | FORLIM = endptrn; |
|---|
| 2623 | for (i = 0; i < FORLIM; i++) { |
|---|
| 2624 | for (ba = AA; (long)ba <= (long)VV; ba = (amity)((long)ba + 1)) { |
|---|
| 2625 | sumprb = 0.0; |
|---|
| 2626 | cp = p->isop; |
|---|
| 2627 | FORLIM2 = p->diverg; |
|---|
| 2628 | for (n = 1; n <= FORLIM2; n++) { |
|---|
| 2629 | sumprb += cp->kinp->UU.U0.prba[i][(long)ba - (long)AA]; |
|---|
| 2630 | cp = cp->isop; |
|---|
| 2631 | } |
|---|
| 2632 | if (sumprb != 0.0) |
|---|
| 2633 | p->UU.U0.prba[i][(long)ba - (long)AA] = sumprb / p->diverg; |
|---|
| 2634 | else |
|---|
| 2635 | p->UU.U0.prba[i][(long)ba - (long)AA] = 0.0; |
|---|
| 2636 | } |
|---|
| 2637 | } |
|---|
| 2638 | p->UU.U0.lnga = 10.0; /* attention */ |
|---|
| 2639 | p->kinp->UU.U0.lnga = 10.0; /* attention */ |
|---|
| 2640 | FORLIM = numsp; |
|---|
| 2641 | for (i = 0; i < FORLIM; i++) { |
|---|
| 2642 | cp = p->isop; |
|---|
| 2643 | FORLIM2 = p->diverg; |
|---|
| 2644 | for (n = 1; n <= FORLIM2; n++) { |
|---|
| 2645 | if (cp->kinp->descen[i] > 0) |
|---|
| 2646 | p->descen[i] = 1; |
|---|
| 2647 | cp = cp->isop; |
|---|
| 2648 | } |
|---|
| 2649 | } |
|---|
| 2650 | /* IF debugoptn THEN |
|---|
| 2651 | BEGIN |
|---|
| 2652 | write(output,p^.kinp^.number:5,'-':2,p^.number:3,' ':3); |
|---|
| 2653 | '(':2,q^.number:3,r^.number:3,')':2, |
|---|
| 2654 | FOR i := 1 TO numsp DO write(output,p^.descen[i]:2); |
|---|
| 2655 | writeln(output); |
|---|
| 2656 | END; */ |
|---|
| 2657 | } /* initnodeA */ |
|---|
| 2658 | |
|---|
| 2659 | |
|---|
| 2660 | Static Void initbranch(p) |
|---|
| 2661 | node *p; |
|---|
| 2662 | { |
|---|
| 2663 | long n; |
|---|
| 2664 | node *cp; |
|---|
| 2665 | long FORLIM; |
|---|
| 2666 | |
|---|
| 2667 | if (p->isop == NULL) { /* TIP */ |
|---|
| 2668 | initnodeA(p->kinp); |
|---|
| 2669 | return; |
|---|
| 2670 | } |
|---|
| 2671 | cp = p->isop; |
|---|
| 2672 | FORLIM = p->diverg; |
|---|
| 2673 | for (n = 1; n <= FORLIM; n++) { |
|---|
| 2674 | initbranch(cp->kinp); |
|---|
| 2675 | cp = cp->isop; |
|---|
| 2676 | } |
|---|
| 2677 | } /* initbranch */ |
|---|
| 2678 | |
|---|
| 2679 | |
|---|
| 2680 | Static Void evaluateA(tr) |
|---|
| 2681 | tree *tr; |
|---|
| 2682 | { |
|---|
| 2683 | double arc, lkl, sum, prod, lnlkl; |
|---|
| 2684 | long i; |
|---|
| 2685 | node *p, *q; |
|---|
| 2686 | aryamity xa1, xa2; |
|---|
| 2687 | amity ai, aj; |
|---|
| 2688 | daryamity tprobe; |
|---|
| 2689 | long FORLIM; |
|---|
| 2690 | |
|---|
| 2691 | p = tr->startp; |
|---|
| 2692 | q = p->kinp; |
|---|
| 2693 | arc = p->UU.U0.lnga; |
|---|
| 2694 | if (arc < minarc) |
|---|
| 2695 | arc = minarc; |
|---|
| 2696 | tprobmtrx(arc, tprobe); |
|---|
| 2697 | lkl = 0.0; |
|---|
| 2698 | FORLIM = endptrn; |
|---|
| 2699 | for (i = 0; i < FORLIM; i++) { |
|---|
| 2700 | memcpy(xa1, p->UU.U0.prba[i], sizeof(aryamity)); |
|---|
| 2701 | memcpy(xa2, q->UU.U0.prba[i], sizeof(aryamity)); |
|---|
| 2702 | sum = 0.0; |
|---|
| 2703 | for (ai = AA; (long)ai <= (long)VV; ai = (amity)((long)ai + 1)) { |
|---|
| 2704 | prod = freqdyhf[(long)ai - (long)AA] * xa1[(long)ai - (long)AA]; |
|---|
| 2705 | for (aj = AA; (long)aj <= (long)VV; aj = (amity)((long)aj + 1)) |
|---|
| 2706 | sum += prod * tprobe[(long)ai - (long)AA] |
|---|
| 2707 | [(long)aj - (long)AA] * xa2[(long)aj - (long)AA]; |
|---|
| 2708 | } |
|---|
| 2709 | if (sum > 0.0) |
|---|
| 2710 | lnlkl = log(sum); |
|---|
| 2711 | else |
|---|
| 2712 | lnlkl = 0.0; |
|---|
| 2713 | lkl += lnlkl * weight[i]; |
|---|
| 2714 | lklhdtrpt[notree][i] = lnlkl; |
|---|
| 2715 | } |
|---|
| 2716 | tr->lklhd = lkl; |
|---|
| 2717 | tr->aic = ibrnch2 * 2 - 2.0 * lkl; |
|---|
| 2718 | } /* evaluateA */ |
|---|
| 2719 | |
|---|
| 2720 | |
|---|
| 2721 | Static Void sublklhdA(p) |
|---|
| 2722 | node *p; |
|---|
| 2723 | { |
|---|
| 2724 | long i, n; |
|---|
| 2725 | double arc; |
|---|
| 2726 | node *cp, *sp; |
|---|
| 2727 | amity ai; |
|---|
| 2728 | daryamity tprob; |
|---|
| 2729 | long FORLIM, FORLIM1; |
|---|
| 2730 | |
|---|
| 2731 | cp = p->isop; |
|---|
| 2732 | FORLIM = p->diverg; |
|---|
| 2733 | for (n = 1; n <= FORLIM; n++) { |
|---|
| 2734 | sp = cp->kinp; |
|---|
| 2735 | arc = sp->UU.U0.lnga; |
|---|
| 2736 | tprobmtrx(arc, tprob); |
|---|
| 2737 | FORLIM1 = endptrn; |
|---|
| 2738 | for (i = 0; i < FORLIM1; i++) { |
|---|
| 2739 | for (ai = AA; (long)ai <= (long)VV; ai = (amity)((long)ai + 1)) { |
|---|
| 2740 | if (n == 1) |
|---|
| 2741 | p->UU.U0.prba[i][(long)ai - (long)AA] = 1.0; |
|---|
| 2742 | if (p->UU.U0.prba[i][(long)ai - (long)AA] < minreal) |
|---|
| 2743 | p->UU.U0.prba[i][(long)ai - (long)AA] = 0.0; |
|---|
| 2744 | else /* attention */ |
|---|
| 2745 | p->UU.U0.prba[i][(long)ai - (long)AA] *= tprob[(long)ai - (long)AA] |
|---|
| 2746 | [0] * sp->UU.U0.prba[i][0] + tprob[(long)ai - (long)AA][(long) |
|---|
| 2747 | RR - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2748 | [(long)RR - (long)AA] + tprob[(long)ai - (long)AA][(long)NN - |
|---|
| 2749 | (long)AA] * sp->UU.U0.prba[i][(long)NN - (long)AA] + |
|---|
| 2750 | tprob[(long)ai - (long)AA][(long)DD - (long)AA] * |
|---|
| 2751 | sp->UU.U0.prba[i][(long)DD - (long)AA] + tprob[(long)ai - |
|---|
| 2752 | (long)AA][(long)CC - (long)AA] * sp->UU.U0.prba[i][(long) |
|---|
| 2753 | CC - (long)AA] + tprob[(long)ai - (long)AA][(long)QQ - |
|---|
| 2754 | (long)AA] * sp->UU.U0.prba[i][(long)QQ - (long)AA] + |
|---|
| 2755 | tprob[(long)ai - (long)AA][(long)EE - (long)AA] * |
|---|
| 2756 | sp->UU.U0.prba[i][(long)EE - (long)AA] + tprob[(long)ai - |
|---|
| 2757 | (long)AA][(long)GG - (long)AA] * sp->UU.U0.prba[i][(long) |
|---|
| 2758 | GG - (long)AA] + tprob[(long)ai - (long)AA][(long)HH - |
|---|
| 2759 | (long)AA] * sp->UU.U0.prba[i][(long)HH - (long)AA] + |
|---|
| 2760 | tprob[(long)ai - (long)AA][(long)II - (long)AA] * |
|---|
| 2761 | sp->UU.U0.prba[i][(long)II - (long)AA] + tprob[(long)ai - |
|---|
| 2762 | (long)AA][(long)LL - (long)AA] * sp->UU.U0.prba[i][(long) |
|---|
| 2763 | LL - (long)AA] + tprob[(long)ai - (long)AA][(long)KK - |
|---|
| 2764 | (long)AA] * sp->UU.U0.prba[i][(long)KK - (long)AA] + |
|---|
| 2765 | tprob[(long)ai - (long)AA][(long)MM - (long)AA] * |
|---|
| 2766 | sp->UU.U0.prba[i][(long)MM - (long)AA] + |
|---|
| 2767 | tprob[(long)ai - (long)AA][(long)FF - (long)AA] * |
|---|
| 2768 | sp->UU.U0.prba[i] |
|---|
| 2769 | [(long)FF - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2770 | [(long)PP_ - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2771 | [(long)PP_ - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2772 | [(long)SS - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2773 | [(long)SS - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2774 | [(long)TT - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2775 | [(long)TT - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2776 | [(long)WW - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2777 | [(long)WW - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2778 | [(long)YY - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2779 | [(long)YY - (long)AA] + tprob[(long)ai - (long)AA] |
|---|
| 2780 | [(long)VV - (long)AA] * sp->UU.U0.prba[i] |
|---|
| 2781 | [(long)VV - (long)AA]; |
|---|
| 2782 | /* p2c: protml.pas, line 2226: Note: |
|---|
| 2783 | * Line breaker spent 0.0+1.00 seconds, 5000 tries on line 2781 [251] */ |
|---|
| 2784 | } |
|---|
| 2785 | } |
|---|
| 2786 | cp = cp->isop; |
|---|
| 2787 | } |
|---|
| 2788 | } /* sublklhdA */ |
|---|
| 2789 | |
|---|
| 2790 | |
|---|
| 2791 | Static Void branchlengthA(p, it) |
|---|
| 2792 | node *p; |
|---|
| 2793 | long *it; |
|---|
| 2794 | { |
|---|
| 2795 | long i, numloop; |
|---|
| 2796 | double arc, arcold, sum, sumd1, sumd2, lkl, lkld1, lkld2, prod1, prod2; |
|---|
| 2797 | boolean done; |
|---|
| 2798 | node *q; |
|---|
| 2799 | amity ai, aj; |
|---|
| 2800 | daryamity tprobl, tdiff1, tdiff2; |
|---|
| 2801 | long FORLIM; |
|---|
| 2802 | |
|---|
| 2803 | q = p->kinp; |
|---|
| 2804 | arc = p->UU.U0.lnga; |
|---|
| 2805 | done = false; |
|---|
| 2806 | *it = 0; |
|---|
| 2807 | if (numsm < 3) |
|---|
| 2808 | numloop = 3; |
|---|
| 2809 | else |
|---|
| 2810 | numloop = maxiterat; |
|---|
| 2811 | |
|---|
| 2812 | while (*it < numloop && !done) { |
|---|
| 2813 | (*it)++; |
|---|
| 2814 | if (arc < minarc) |
|---|
| 2815 | arc = minarc; |
|---|
| 2816 | if (arc > maxarc) /* attention */ |
|---|
| 2817 | arc = minarc; |
|---|
| 2818 | tdiffmtrx(arc, tprobl, tdiff1, tdiff2); |
|---|
| 2819 | lkl = 0.0; |
|---|
| 2820 | lkld1 = 0.0; |
|---|
| 2821 | lkld2 = 0.0; |
|---|
| 2822 | FORLIM = endptrn; |
|---|
| 2823 | for (i = 0; i < FORLIM; i++) { |
|---|
| 2824 | sum = 0.0; |
|---|
| 2825 | sumd1 = 0.0; |
|---|
| 2826 | sumd2 = 0.0; |
|---|
| 2827 | for (ai = AA; (long)ai <= (long)VV; ai = (amity)((long)ai + 1)) { |
|---|
| 2828 | prod1 = freqdyhf[(long)ai - (long)AA] * p->UU.U0.prba[i] |
|---|
| 2829 | [(long)ai - (long)AA]; |
|---|
| 2830 | if (prod1 < minreal) /* attention */ |
|---|
| 2831 | prod1 = 0.0; |
|---|
| 2832 | for (aj = AA; (long)aj <= (long)VV; aj = (amity)((long)aj + 1)) { |
|---|
| 2833 | prod2 = prod1 * q->UU.U0.prba[i][(long)aj - (long)AA]; |
|---|
| 2834 | if (prod2 < minreal) /* attention */ |
|---|
| 2835 | prod2 = 0.0; |
|---|
| 2836 | sum += prod2 * tprobl[(long)ai - (long)AA][(long)aj - (long)AA]; |
|---|
| 2837 | sumd1 += prod2 * tdiff1[(long)ai - (long)AA][(long)aj - (long)AA]; |
|---|
| 2838 | sumd2 += prod2 * tdiff2[(long)ai - (long)AA][(long)aj - (long)AA]; |
|---|
| 2839 | } |
|---|
| 2840 | } |
|---|
| 2841 | if (sum > minreal) { /* attention */ |
|---|
| 2842 | lkl += log(sum) * weight[i]; |
|---|
| 2843 | lkld1 += sumd1 / sum * weight[i]; |
|---|
| 2844 | if (sum * sum > minreal) |
|---|
| 2845 | lkld2 += (sumd2 * sum - sumd1 * sumd1) / sum / sum * weight[i]; |
|---|
| 2846 | } else { |
|---|
| 2847 | if (debugoptn) |
|---|
| 2848 | printf(" *check branchlength1*%4ld%4ld\n", p->number, i + 1); |
|---|
| 2849 | } /* attention */ |
|---|
| 2850 | } |
|---|
| 2851 | arcold = arc; |
|---|
| 2852 | if (lkld1 != lkld2) |
|---|
| 2853 | arc -= lkld1 / lkld2; |
|---|
| 2854 | else { |
|---|
| 2855 | arcold = arc + epsilon * 0.1; |
|---|
| 2856 | if (debugoptn) |
|---|
| 2857 | printf(" *check branchlength2*"); |
|---|
| 2858 | } |
|---|
| 2859 | if (arc > maxarc) /* attention */ |
|---|
| 2860 | arc = minarc; |
|---|
| 2861 | done = (fabs(arcold - arc) < epsilon); |
|---|
| 2862 | /* IF debugoptn THEN writeln(output,' ':10,arc:10:5, |
|---|
| 2863 | arcold:10:5, -(lkld1/lkld2):10:5); */ |
|---|
| 2864 | } |
|---|
| 2865 | smoothed = (smoothed && done); |
|---|
| 2866 | if (arc < minarc) |
|---|
| 2867 | arc = minarc; |
|---|
| 2868 | if (arc > maxarc) /* attention */ |
|---|
| 2869 | arc = minarc; |
|---|
| 2870 | p->UU.U0.lnga = arc; |
|---|
| 2871 | q->UU.U0.lnga = arc; |
|---|
| 2872 | } /* branchlengthA */ |
|---|
| 2873 | |
|---|
| 2874 | |
|---|
| 2875 | Static Void printupdate(tr, p, vold, it) |
|---|
| 2876 | tree *tr; |
|---|
| 2877 | node *p; |
|---|
| 2878 | double vold; |
|---|
| 2879 | long it; |
|---|
| 2880 | { |
|---|
| 2881 | if (p == tr->startp->kinp) |
|---|
| 2882 | printf("%4ld", numsm); |
|---|
| 2883 | else |
|---|
| 2884 | printf("%4c", ' '); |
|---|
| 2885 | if (p->isop == NULL) /* TIP */ |
|---|
| 2886 | printf("%12c", ' '); |
|---|
| 2887 | else { |
|---|
| 2888 | printf("%4c%3ld", '(', p->isop->kinp->number); |
|---|
| 2889 | printf("%3ld )", p->isop->isop->kinp->number); |
|---|
| 2890 | } |
|---|
| 2891 | printf("%3ld -%3ld", p->number, p->kinp->number); |
|---|
| 2892 | if (p->kinp->isop == NULL) /* TIP */ |
|---|
| 2893 | printf("%10c", ' '); |
|---|
| 2894 | else { |
|---|
| 2895 | printf(" (%3ld", p->kinp->isop->kinp->number); |
|---|
| 2896 | printf("%3ld )", p->kinp->isop->isop->kinp->number); |
|---|
| 2897 | } |
|---|
| 2898 | printf("%2c%10.5f", ' ', p->UU.U0.lnga); |
|---|
| 2899 | printf(" (%10.5f )", p->UU.U0.lnga - vold); |
|---|
| 2900 | printf("%4ld\n", it); |
|---|
| 2901 | } /* printupdate */ |
|---|
| 2902 | |
|---|
| 2903 | |
|---|
| 2904 | Static Void updateA(tr, p, it) |
|---|
| 2905 | tree *tr; |
|---|
| 2906 | node *p; |
|---|
| 2907 | long *it; |
|---|
| 2908 | { |
|---|
| 2909 | double vold; |
|---|
| 2910 | |
|---|
| 2911 | vold = p->UU.U0.lnga; |
|---|
| 2912 | if (p->isop != NULL) /* TIP */ |
|---|
| 2913 | sublklhdA(p); |
|---|
| 2914 | if (p->kinp->isop != NULL) /* TIP */ |
|---|
| 2915 | sublklhdA(p->kinp); |
|---|
| 2916 | branchlengthA(p, it); |
|---|
| 2917 | /* IF debugoptn AND ((numsm = 1) OR (numsm = maxsmooth)) THEN */ |
|---|
| 2918 | if (debugoptn && numsm == 1) |
|---|
| 2919 | printupdate(tr, p, vold, *it); |
|---|
| 2920 | } /* updateA */ |
|---|
| 2921 | |
|---|
| 2922 | |
|---|
| 2923 | Static Void smooth2(tr, numit) |
|---|
| 2924 | tree *tr; |
|---|
| 2925 | long *numit; |
|---|
| 2926 | { |
|---|
| 2927 | long n, it, FORLIM; |
|---|
| 2928 | |
|---|
| 2929 | FORLIM = numsp; |
|---|
| 2930 | for (n = 1; n <= FORLIM; n++) { |
|---|
| 2931 | updateA(tr, tr->brnchp[n], &it); |
|---|
| 2932 | *numit += it; |
|---|
| 2933 | } |
|---|
| 2934 | FORLIM = ibrnch1; |
|---|
| 2935 | for (n = ibrnch2; n >= FORLIM; n--) { |
|---|
| 2936 | updateA(tr, tr->brnchp[n], &it); |
|---|
| 2937 | *numit += it; |
|---|
| 2938 | } |
|---|
| 2939 | } /* smooth */ |
|---|
| 2940 | |
|---|
| 2941 | |
|---|
| 2942 | Static Void smooth(tr, p, numit) |
|---|
| 2943 | tree *tr; |
|---|
| 2944 | node *p; |
|---|
| 2945 | long *numit; |
|---|
| 2946 | { |
|---|
| 2947 | long n, it; |
|---|
| 2948 | double vold; |
|---|
| 2949 | node *cp; |
|---|
| 2950 | long FORLIM; |
|---|
| 2951 | |
|---|
| 2952 | vold = p->UU.U0.lnga; |
|---|
| 2953 | if (p->isop != NULL) /* TIP */ |
|---|
| 2954 | sublklhdA(p); |
|---|
| 2955 | if (p->kinp->isop != NULL) /* TIP */ |
|---|
| 2956 | sublklhdA(p->kinp); |
|---|
| 2957 | branchlengthA(p, &it); |
|---|
| 2958 | *numit += it; |
|---|
| 2959 | if (debugoptn && (numsm == 1 || numsm == maxsmooth)) |
|---|
| 2960 | printupdate(tr, p, vold, it); |
|---|
| 2961 | if (p->isop == NULL) /* TIP */ |
|---|
| 2962 | return; |
|---|
| 2963 | /* smooth ( tr,p^.isop^.kinp,numit ); |
|---|
| 2964 | smooth ( tr,p^.isop^.isop^.kinp,numit ); */ |
|---|
| 2965 | cp = p->isop; |
|---|
| 2966 | FORLIM = p->diverg; |
|---|
| 2967 | for (n = 1; n <= FORLIM; n++) { |
|---|
| 2968 | smooth(tr, cp->kinp, numit); |
|---|
| 2969 | cp = cp->isop; |
|---|
| 2970 | } |
|---|
| 2971 | } /* smooth */ |
|---|
| 2972 | |
|---|
| 2973 | |
|---|
| 2974 | Static Void printsmooth(tr, numit) |
|---|
| 2975 | tree *tr; |
|---|
| 2976 | long numit; |
|---|
| 2977 | { |
|---|
| 2978 | long i, FORLIM; |
|---|
| 2979 | |
|---|
| 2980 | if (debugoptn) |
|---|
| 2981 | return; |
|---|
| 2982 | printf(" %3ld", numsm); |
|---|
| 2983 | printf("%4ld", numit); |
|---|
| 2984 | FORLIM = ibrnch2; |
|---|
| 2985 | for (i = 1; i <= FORLIM; i++) |
|---|
| 2986 | printf("%5.1f", tr->brnchp[i]->UU.U0.lnga); |
|---|
| 2987 | putchar('\n'); |
|---|
| 2988 | } /* printsmooth */ |
|---|
| 2989 | |
|---|
| 2990 | |
|---|
| 2991 | Static Void leastsquares(am_, ym) |
|---|
| 2992 | rnodety *am_; |
|---|
| 2993 | double *ym; |
|---|
| 2994 | { |
|---|
| 2995 | dnonoty am; |
|---|
| 2996 | long i, j, k; |
|---|
| 2997 | double pivot, element; |
|---|
| 2998 | dnonoty im; |
|---|
| 2999 | long FORLIM, FORLIM1, FORLIM2; |
|---|
| 3000 | |
|---|
| 3001 | memcpy(am, am_, sizeof(dnonoty)); |
|---|
| 3002 | FORLIM = ibrnch2; |
|---|
| 3003 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 3004 | FORLIM1 = ibrnch2; |
|---|
| 3005 | for (j = 1; j <= FORLIM1; j++) { |
|---|
| 3006 | if (i == j) |
|---|
| 3007 | im[i - 1][j - 1] = 1.0; |
|---|
| 3008 | else |
|---|
| 3009 | im[i - 1][j - 1] = 0.0; |
|---|
| 3010 | } |
|---|
| 3011 | } |
|---|
| 3012 | FORLIM = ibrnch2; |
|---|
| 3013 | for (k = 0; k < FORLIM; k++) { |
|---|
| 3014 | pivot = am[k][k]; |
|---|
| 3015 | ym[k] /= pivot; |
|---|
| 3016 | FORLIM1 = ibrnch2; |
|---|
| 3017 | for (j = 0; j < FORLIM1; j++) { |
|---|
| 3018 | am[k][j] /= pivot; |
|---|
| 3019 | im[k][j] /= pivot; |
|---|
| 3020 | } |
|---|
| 3021 | FORLIM1 = ibrnch2; |
|---|
| 3022 | for (i = 0; i < FORLIM1; i++) { |
|---|
| 3023 | if (k + 1 != i + 1) { |
|---|
| 3024 | element = am[i][k]; |
|---|
| 3025 | ym[i] -= element * ym[k]; |
|---|
| 3026 | FORLIM2 = ibrnch2; |
|---|
| 3027 | for (j = 0; j < FORLIM2; j++) { |
|---|
| 3028 | am[i][j] -= element * am[k][j]; |
|---|
| 3029 | im[i][j] -= element * im[k][j]; |
|---|
| 3030 | } |
|---|
| 3031 | } |
|---|
| 3032 | } |
|---|
| 3033 | } |
|---|
| 3034 | } /* leastsquares */ |
|---|
| 3035 | |
|---|
| 3036 | |
|---|
| 3037 | Static Void initlength(tr) |
|---|
| 3038 | tree *tr; |
|---|
| 3039 | { |
|---|
| 3040 | long ia, j1, j2, k, na, n1, n2; |
|---|
| 3041 | double suma, sumy; |
|---|
| 3042 | spity des; |
|---|
| 3043 | rpairty dfpair, ymt; |
|---|
| 3044 | rnodety atymt; |
|---|
| 3045 | dpanoty amt; |
|---|
| 3046 | dnopaty atmt; |
|---|
| 3047 | dnonoty atamt; |
|---|
| 3048 | long FORLIM, FORLIM1, FORLIM2, FORLIM3; |
|---|
| 3049 | |
|---|
| 3050 | FORLIM = ibrnch2; |
|---|
| 3051 | for (ia = 1; ia <= FORLIM; ia++) { |
|---|
| 3052 | memcpy(des, tr->brnchp[ia]->descen, sizeof(spity)); |
|---|
| 3053 | na = 0; |
|---|
| 3054 | FORLIM1 = numsp; |
|---|
| 3055 | for (j1 = 1; j1 < FORLIM1; j1++) { |
|---|
| 3056 | FORLIM2 = numsp; |
|---|
| 3057 | for (j2 = j1 + 1; j2 <= FORLIM2; j2++) { |
|---|
| 3058 | na++; |
|---|
| 3059 | /* writeln(output,' ',ia:3,j1:3,j2:3,na:3); */ |
|---|
| 3060 | if (des[j1 - 1] != des[j2 - 1]) |
|---|
| 3061 | amt[na - 1][ia - 1] = 1.0; |
|---|
| 3062 | else |
|---|
| 3063 | amt[na - 1][ia - 1] = 0.0; |
|---|
| 3064 | if (ia == 1) { |
|---|
| 3065 | dfpair[na - 1] = 0.0; |
|---|
| 3066 | FORLIM3 = endsite; |
|---|
| 3067 | for (k = 0; k < FORLIM3; k++) { |
|---|
| 3068 | if (chsequen[j1][k] != chsequen[j2][k]) |
|---|
| 3069 | dfpair[na - 1] += 1.0; |
|---|
| 3070 | } |
|---|
| 3071 | } |
|---|
| 3072 | if (dfpair[na - 1] > 0.0) |
|---|
| 3073 | ymt[na - 1] = -log(1.0 - dfpair[na - 1] / endsite); |
|---|
| 3074 | else |
|---|
| 3075 | ymt[na - 1] = -log(1.0); |
|---|
| 3076 | } |
|---|
| 3077 | } |
|---|
| 3078 | } |
|---|
| 3079 | |
|---|
| 3080 | if (debugoptn) { |
|---|
| 3081 | putchar('\n'); |
|---|
| 3082 | FORLIM = numpair; |
|---|
| 3083 | for (na = 0; na < FORLIM; na++) { |
|---|
| 3084 | printf(" %3ld ", na + 1); |
|---|
| 3085 | FORLIM1 = ibrnch2; |
|---|
| 3086 | for (ia = 0; ia < FORLIM1; ia++) |
|---|
| 3087 | printf("%3ld", (long)amt[na][ia]); |
|---|
| 3088 | printf("%8.3f%5ld\n", ymt[na], (long)dfpair[na]); |
|---|
| 3089 | } |
|---|
| 3090 | } |
|---|
| 3091 | |
|---|
| 3092 | FORLIM = numpair; |
|---|
| 3093 | for (ia = 0; ia < FORLIM; ia++) { |
|---|
| 3094 | FORLIM1 = ibrnch2; |
|---|
| 3095 | for (na = 0; na < FORLIM1; na++) |
|---|
| 3096 | atmt[na][ia] = amt[ia][na]; |
|---|
| 3097 | } |
|---|
| 3098 | FORLIM = ibrnch2; |
|---|
| 3099 | for (n1 = 0; n1 < FORLIM; n1++) { |
|---|
| 3100 | FORLIM1 = ibrnch2; |
|---|
| 3101 | for (n2 = 0; n2 < FORLIM1; n2++) { |
|---|
| 3102 | suma = 0.0; |
|---|
| 3103 | FORLIM2 = numpair; |
|---|
| 3104 | for (ia = 0; ia < FORLIM2; ia++) |
|---|
| 3105 | suma += atmt[n1][ia] * amt[ia][n2]; |
|---|
| 3106 | atamt[n1][n2] = suma; |
|---|
| 3107 | } |
|---|
| 3108 | } |
|---|
| 3109 | FORLIM = ibrnch2; |
|---|
| 3110 | for (n1 = 0; n1 < FORLIM; n1++) { |
|---|
| 3111 | sumy = 0.0; |
|---|
| 3112 | FORLIM1 = numpair; |
|---|
| 3113 | for (ia = 0; ia < FORLIM1; ia++) |
|---|
| 3114 | sumy += atmt[n1][ia] * ymt[ia]; |
|---|
| 3115 | atymt[n1] = sumy; |
|---|
| 3116 | } |
|---|
| 3117 | |
|---|
| 3118 | if (debugoptn) { |
|---|
| 3119 | putchar('\n'); |
|---|
| 3120 | FORLIM = ibrnch2; |
|---|
| 3121 | for (n1 = 1; n1 <= FORLIM; n1++) { |
|---|
| 3122 | printf(" %3ld ", n1); |
|---|
| 3123 | FORLIM1 = ibrnch2; |
|---|
| 3124 | for (n2 = 0; n2 < FORLIM1; n2++) |
|---|
| 3125 | printf("%3ld", (long)atamt[n1 - 1][n2]); |
|---|
| 3126 | printf("%8.3f\n", atymt[n1 - 1]); |
|---|
| 3127 | } |
|---|
| 3128 | } |
|---|
| 3129 | |
|---|
| 3130 | leastsquares(atamt, atymt); |
|---|
| 3131 | FORLIM = ibrnch2; |
|---|
| 3132 | for (na = 0; na < FORLIM; na++) |
|---|
| 3133 | atymt[na] = 100.0 * atymt[na]; |
|---|
| 3134 | |
|---|
| 3135 | if (!debugoptn) { |
|---|
| 3136 | if (writeoptn) { |
|---|
| 3137 | printf("\n%5s", " arc"); |
|---|
| 3138 | printf("%4s", " it"); |
|---|
| 3139 | FORLIM = ibrnch2; |
|---|
| 3140 | for (na = 1; na <= FORLIM; na++) |
|---|
| 3141 | printf("%3ld%2c", na, ' '); |
|---|
| 3142 | printf("\n%4c", '0'); |
|---|
| 3143 | printf("%4c", '0'); |
|---|
| 3144 | FORLIM = ibrnch2; |
|---|
| 3145 | for (na = 0; na < FORLIM; na++) |
|---|
| 3146 | printf("%5.1f", atymt[na]); |
|---|
| 3147 | putchar('\n'); |
|---|
| 3148 | } |
|---|
| 3149 | } |
|---|
| 3150 | |
|---|
| 3151 | FORLIM = ibrnch2; |
|---|
| 3152 | for (na = 1; na <= FORLIM; na++) { |
|---|
| 3153 | tr->brnchp[na]->UU.U0.lnga = atymt[na - 1]; |
|---|
| 3154 | tr->brnchp[na]->kinp->UU.U0.lnga = atymt[na - 1]; |
|---|
| 3155 | } |
|---|
| 3156 | |
|---|
| 3157 | } /* initlength */ |
|---|
| 3158 | |
|---|
| 3159 | |
|---|
| 3160 | Static Void judgconverg(oldarcs, newarcs, cnvrg) |
|---|
| 3161 | double *oldarcs, *newarcs; |
|---|
| 3162 | boolean *cnvrg; |
|---|
| 3163 | { |
|---|
| 3164 | /* judgment of convergence */ |
|---|
| 3165 | long i; |
|---|
| 3166 | boolean same; |
|---|
| 3167 | long FORLIM; |
|---|
| 3168 | |
|---|
| 3169 | same = true; |
|---|
| 3170 | FORLIM = ibrnch2; |
|---|
| 3171 | for (i = 0; i < FORLIM; i++) { |
|---|
| 3172 | if (fabs(newarcs[i] - oldarcs[i]) > epsilon) |
|---|
| 3173 | same = false; |
|---|
| 3174 | } |
|---|
| 3175 | *cnvrg = same; |
|---|
| 3176 | } /* judgconverg */ |
|---|
| 3177 | |
|---|
| 3178 | |
|---|
| 3179 | Static Void variance(tr) |
|---|
| 3180 | tree *tr; |
|---|
| 3181 | { |
|---|
| 3182 | long k, m; |
|---|
| 3183 | aryamity xa1, xa2; |
|---|
| 3184 | amity ai, aj; |
|---|
| 3185 | double arcm, alkl, lkl, lkl2, sarc, sarc2, sblklhd, ld1, ld2, prod, vlkl; |
|---|
| 3186 | lengthty varc, varc2, blklhdm; |
|---|
| 3187 | daryamity tprobm, tdifm1, tdifm2; |
|---|
| 3188 | long FORLIM; |
|---|
| 3189 | double TEMP; |
|---|
| 3190 | long FORLIM1; |
|---|
| 3191 | |
|---|
| 3192 | alkl = tr->lklhd / endsite; |
|---|
| 3193 | vlkl = 0.0; |
|---|
| 3194 | FORLIM = endptrn; |
|---|
| 3195 | for (k = 0; k < FORLIM; k++) { |
|---|
| 3196 | TEMP = lklhdtrpt[notree][k] - alkl; |
|---|
| 3197 | vlkl += TEMP * TEMP * weight[k]; |
|---|
| 3198 | } |
|---|
| 3199 | tr->vrilkl = vlkl; |
|---|
| 3200 | |
|---|
| 3201 | FORLIM = ibrnch2; |
|---|
| 3202 | for (m = 1; m <= FORLIM; m++) { |
|---|
| 3203 | arcm = tr->brnchp[m]->UU.U0.lnga; |
|---|
| 3204 | tdiffmtrx(arcm, tprobm, tdifm1, tdifm2); |
|---|
| 3205 | sarc = 0.0; |
|---|
| 3206 | sarc2 = 0.0; |
|---|
| 3207 | sblklhd = 0.0; |
|---|
| 3208 | FORLIM1 = endptrn; |
|---|
| 3209 | for (k = 0; k < FORLIM1; k++) { |
|---|
| 3210 | memcpy(xa1, tr->brnchp[m]->UU.U0.prba[k], sizeof(aryamity)); |
|---|
| 3211 | memcpy(xa2, tr->brnchp[m]->kinp->UU.U0.prba[k], sizeof(aryamity)); |
|---|
| 3212 | lkl2 = 0.0; |
|---|
| 3213 | ld1 = 0.0; |
|---|
| 3214 | ld2 = 0.0; |
|---|
| 3215 | for (ai = AA; (long)ai <= (long)VV; ai = (amity)((long)ai + 1)) { |
|---|
| 3216 | prod = freqdyhf[(long)ai - (long)AA] * xa1[(long)ai - (long)AA]; |
|---|
| 3217 | if (prod < minreal) /* attention */ |
|---|
| 3218 | prod = 0.0; |
|---|
| 3219 | for (aj = AA; (long)aj <= (long)VV; aj = (amity)((long)aj + 1)) { |
|---|
| 3220 | if (xa2[(long)aj - (long)AA] < minreal) /* attention */ |
|---|
| 3221 | xa2[(long)aj - (long)AA] = 0.0; |
|---|
| 3222 | lkl2 += prod * tprobm[(long)ai - (long)AA] |
|---|
| 3223 | [(long)aj - (long)AA] * xa2[(long)aj - (long)AA]; |
|---|
| 3224 | ld1 += prod * tdifm1[(long)ai - (long)AA] |
|---|
| 3225 | [(long)aj - (long)AA] * xa2[(long)aj - (long)AA]; |
|---|
| 3226 | ld2 += prod * tdifm2[(long)ai - (long)AA] |
|---|
| 3227 | [(long)aj - (long)AA] * xa2[(long)aj - (long)AA]; |
|---|
| 3228 | } |
|---|
| 3229 | } |
|---|
| 3230 | lkl = exp(lklhdtrpt[notree][k]); |
|---|
| 3231 | if (lkl * lkl > minreal) /* attention */ |
|---|
| 3232 | sarc += (ld2 * lkl - ld1 * ld1) / lkl / lkl * weight[k]; |
|---|
| 3233 | if (lkl2 * lkl2 > minreal) /* attention */ |
|---|
| 3234 | sarc2 += (ld2 * lkl2 - ld1 * ld1) / lkl2 / lkl2 * weight[k]; |
|---|
| 3235 | if (lkl2 > minreal) /* attention */ |
|---|
| 3236 | sblklhd += log(lkl2) * weight[k]; |
|---|
| 3237 | } |
|---|
| 3238 | varc[m - 1] = sarc; |
|---|
| 3239 | varc2[m - 1] = sarc2; |
|---|
| 3240 | blklhdm[m - 1] = sblklhd; |
|---|
| 3241 | |
|---|
| 3242 | /* IF debugoptn THEN BEGIN |
|---|
| 3243 | write (output,m:4); |
|---|
| 3244 | FOR m := 1 TO ibrnch2 DO write(output,sarc[m]:9:6); |
|---|
| 3245 | writeln(output); |
|---|
| 3246 | END; */ |
|---|
| 3247 | |
|---|
| 3248 | } |
|---|
| 3249 | FORLIM = ibrnch2; |
|---|
| 3250 | for (m = 0; m < FORLIM; m++) |
|---|
| 3251 | varc[m] = 1.0 / varc[m]; |
|---|
| 3252 | FORLIM = ibrnch2; |
|---|
| 3253 | for (m = 0; m < FORLIM; m++) |
|---|
| 3254 | varc2[m] = 1.0 / varc2[m]; |
|---|
| 3255 | memcpy(tr->vrilnga, varc, sizeof(lengthty)); |
|---|
| 3256 | memcpy(tr->vrilnga2, varc2, sizeof(lengthty)); |
|---|
| 3257 | memcpy(tr->blklhd, blklhdm, sizeof(lengthty)); |
|---|
| 3258 | } /* variance */ |
|---|
| 3259 | |
|---|
| 3260 | |
|---|
| 3261 | Static Void manuvaluate(tr) |
|---|
| 3262 | tree *tr; |
|---|
| 3263 | { |
|---|
| 3264 | long n, it; |
|---|
| 3265 | lengthty newarcs, oldarcs; |
|---|
| 3266 | boolean cnvrg; |
|---|
| 3267 | long FORLIM; |
|---|
| 3268 | |
|---|
| 3269 | if (writeoptn) |
|---|
| 3270 | putchar('\n'); |
|---|
| 3271 | if (debugoptn) |
|---|
| 3272 | printf(" MANUALVALUATE\n"); |
|---|
| 3273 | /* IF debugoptn THEN printcurtree ( tr ); */ |
|---|
| 3274 | if (debugoptn) |
|---|
| 3275 | putchar('\n'); |
|---|
| 3276 | initdescen(tr); |
|---|
| 3277 | initbranch(tr->startp); |
|---|
| 3278 | initbranch(tr->startp->kinp); |
|---|
| 3279 | /* IF debugoptn THEN printcurtree ( tr ); */ |
|---|
| 3280 | initlength(tr); |
|---|
| 3281 | if (debugoptn) |
|---|
| 3282 | printcurtree(tr); |
|---|
| 3283 | |
|---|
| 3284 | if (debugoptn) |
|---|
| 3285 | printf(" SMOOTH\n"); |
|---|
| 3286 | cnvrg = false; |
|---|
| 3287 | FORLIM = ibrnch2; |
|---|
| 3288 | for (n = 1; n <= FORLIM; n++) |
|---|
| 3289 | newarcs[n - 1] = tr->brnchp[n]->UU.U0.lnga; |
|---|
| 3290 | numnw = 0; |
|---|
| 3291 | numsm = 0; |
|---|
| 3292 | do { |
|---|
| 3293 | numsm++; |
|---|
| 3294 | it = 0; |
|---|
| 3295 | smooth(tr, tr->startp->kinp, &it); |
|---|
| 3296 | memcpy(oldarcs, newarcs, sizeof(lengthty)); |
|---|
| 3297 | FORLIM = ibrnch2; |
|---|
| 3298 | for (n = 1; n <= FORLIM; n++) |
|---|
| 3299 | newarcs[n - 1] = tr->brnchp[n]->UU.U0.lnga; |
|---|
| 3300 | judgconverg(oldarcs, newarcs, &cnvrg); |
|---|
| 3301 | numnw += it; |
|---|
| 3302 | if (writeoptn) |
|---|
| 3303 | printsmooth(tr, it); |
|---|
| 3304 | } while (!(numsm >= maxsmooth || cnvrg)); |
|---|
| 3305 | tr->cnvrgnc = cnvrg; |
|---|
| 3306 | |
|---|
| 3307 | /* IF debugoptn THEN printcurtree ( tr ); */ |
|---|
| 3308 | evaluateA(tr); |
|---|
| 3309 | variance(tr); |
|---|
| 3310 | if (!usertree) |
|---|
| 3311 | return; |
|---|
| 3312 | lklhdtree[notree] = tr->lklhd; |
|---|
| 3313 | aictree[notree] = tr->aic; |
|---|
| 3314 | paratree[notree] = ibrnch2; |
|---|
| 3315 | if (notree == 1) { |
|---|
| 3316 | maxltr = 1; |
|---|
| 3317 | maxlkl = tr->lklhd; |
|---|
| 3318 | minatr = 1; |
|---|
| 3319 | minaic = tr->aic; |
|---|
| 3320 | return; |
|---|
| 3321 | } |
|---|
| 3322 | if (tr->lklhd > maxlkl) { |
|---|
| 3323 | maxltr = notree; |
|---|
| 3324 | maxlkl = tr->lklhd; |
|---|
| 3325 | } |
|---|
| 3326 | if (tr->aic < minaic) { |
|---|
| 3327 | minatr = notree; |
|---|
| 3328 | minaic = tr->aic; |
|---|
| 3329 | } |
|---|
| 3330 | } /* manuvaluate */ |
|---|
| 3331 | |
|---|
| 3332 | |
|---|
| 3333 | Static Void autovaluate(tr) |
|---|
| 3334 | tree *tr; |
|---|
| 3335 | { |
|---|
| 3336 | long n, it; |
|---|
| 3337 | lengthty newarcs, oldarcs; |
|---|
| 3338 | boolean cnvrg; |
|---|
| 3339 | long FORLIM; |
|---|
| 3340 | |
|---|
| 3341 | if (writeoptn) |
|---|
| 3342 | putchar('\n'); |
|---|
| 3343 | if (debugoptn) |
|---|
| 3344 | printf(" AUTOVALUATE\n"); |
|---|
| 3345 | /* |
|---|
| 3346 | IF debugoptn THEN printcurtree( tr ); |
|---|
| 3347 | IF debugoptn THEN writeln(output); |
|---|
| 3348 | initdescen( tr ); |
|---|
| 3349 | initbranch (tr.startp); |
|---|
| 3350 | initbranch (tr.startp^.kinp); |
|---|
| 3351 | IF debugoptn THEN printcurtree ( tr ); |
|---|
| 3352 | initlength ( tr ); |
|---|
| 3353 | IF debugoptn THEN printcurtree ( tr ); |
|---|
| 3354 | */ |
|---|
| 3355 | it = 0; |
|---|
| 3356 | for (n = 1; n <= 3; n++) { |
|---|
| 3357 | sublklhdA(tr->brnchp[ibrnch2]); |
|---|
| 3358 | sublklhdA(tr->brnchp[ibrnch2]->kinp); |
|---|
| 3359 | branchlengthA(tr->brnchp[ibrnch2], &it); |
|---|
| 3360 | } |
|---|
| 3361 | if (debugoptn) |
|---|
| 3362 | printcurtree(tr); |
|---|
| 3363 | |
|---|
| 3364 | if (debugoptn) |
|---|
| 3365 | printf(" SMOOTH\n"); |
|---|
| 3366 | cnvrg = false; |
|---|
| 3367 | FORLIM = ibrnch2; |
|---|
| 3368 | for (n = 1; n <= FORLIM; n++) |
|---|
| 3369 | newarcs[n - 1] = tr->brnchp[n]->UU.U0.lnga; |
|---|
| 3370 | numnw = 0; |
|---|
| 3371 | numsm = 0; |
|---|
| 3372 | do { |
|---|
| 3373 | numsm++; |
|---|
| 3374 | it = 0; |
|---|
| 3375 | smooth(tr, tr->startp->kinp, &it); |
|---|
| 3376 | memcpy(oldarcs, newarcs, sizeof(lengthty)); |
|---|
| 3377 | FORLIM = ibrnch2; |
|---|
| 3378 | for (n = 1; n <= FORLIM; n++) |
|---|
| 3379 | newarcs[n - 1] = tr->brnchp[n]->UU.U0.lnga; |
|---|
| 3380 | judgconverg(oldarcs, newarcs, &cnvrg); |
|---|
| 3381 | numnw += it; |
|---|
| 3382 | if (writeoptn) |
|---|
| 3383 | printsmooth(tr, it); |
|---|
| 3384 | } while (!(numsm >= maxsmooth || cnvrg)); |
|---|
| 3385 | tr->cnvrgnc = cnvrg; |
|---|
| 3386 | |
|---|
| 3387 | /* IF debugoptn THEN printcurtree ( tr ); */ |
|---|
| 3388 | evaluateA(tr); |
|---|
| 3389 | variance(tr); |
|---|
| 3390 | if (usertree) |
|---|
| 3391 | return; |
|---|
| 3392 | lklhdtree[notree] = tr->lklhd; |
|---|
| 3393 | aictree[notree] = tr->aic; |
|---|
| 3394 | paratree[notree] = ibrnch2; |
|---|
| 3395 | if (notree == 1) { |
|---|
| 3396 | maxltr = 1; |
|---|
| 3397 | maxlkl = tr->lklhd; |
|---|
| 3398 | minatr = 1; |
|---|
| 3399 | minaic = tr->aic; |
|---|
| 3400 | return; |
|---|
| 3401 | } |
|---|
| 3402 | if (tr->lklhd > maxlkl) { |
|---|
| 3403 | maxltr = notree; |
|---|
| 3404 | maxlkl = tr->lklhd; |
|---|
| 3405 | } |
|---|
| 3406 | if (tr->aic < minaic) { |
|---|
| 3407 | minatr = notree; |
|---|
| 3408 | minaic = tr->aic; |
|---|
| 3409 | } |
|---|
| 3410 | } /* autovaluate */ |
|---|
| 3411 | |
|---|
| 3412 | |
|---|
| 3413 | #define maxover 50 |
|---|
| 3414 | #define maxleng 30 |
|---|
| 3415 | |
|---|
| 3416 | |
|---|
| 3417 | /**************************************/ |
|---|
| 3418 | /*** OUTPUT OF TREE TOPOLOGY ***/ |
|---|
| 3419 | /**************************************/ |
|---|
| 3420 | |
|---|
| 3421 | Static Void prbranch(up, depth, m, maxm, umbrella, length) |
|---|
| 3422 | node *up; |
|---|
| 3423 | long depth, m, maxm; |
|---|
| 3424 | boolean *umbrella; |
|---|
| 3425 | long *length; |
|---|
| 3426 | { |
|---|
| 3427 | long i, j, n, d, maxn; |
|---|
| 3428 | node *cp; |
|---|
| 3429 | boolean over; |
|---|
| 3430 | long FORLIM, FORLIM1; |
|---|
| 3431 | |
|---|
| 3432 | over = false; |
|---|
| 3433 | d = depth + 1; |
|---|
| 3434 | if ((long)up->UU.U0.lnga >= maxover) { /* +4 */ |
|---|
| 3435 | over = true; |
|---|
| 3436 | length[d] = maxleng; |
|---|
| 3437 | } else |
|---|
| 3438 | length[d] = (long)up->UU.U0.lnga + 3; |
|---|
| 3439 | if (up->isop == NULL) { /* TIP */ |
|---|
| 3440 | if (m == 1) |
|---|
| 3441 | umbrella[d - 1] = true; |
|---|
| 3442 | for (j = 0; j < d; j++) { |
|---|
| 3443 | if (umbrella[j]) |
|---|
| 3444 | printf("%*c", (int)length[j], ':'); |
|---|
| 3445 | else |
|---|
| 3446 | printf("%*c", (int)length[j], ' '); |
|---|
| 3447 | } |
|---|
| 3448 | if (m == maxm) |
|---|
| 3449 | umbrella[d - 1] = false; |
|---|
| 3450 | if (over) { |
|---|
| 3451 | FORLIM = length[d] - 3; |
|---|
| 3452 | for (i = 1; i <= FORLIM; i++) |
|---|
| 3453 | putchar('+'); |
|---|
| 3454 | } else { |
|---|
| 3455 | FORLIM = length[d] - 3; |
|---|
| 3456 | for (i = 1; i <= FORLIM; i++) |
|---|
| 3457 | putchar('-'); |
|---|
| 3458 | } |
|---|
| 3459 | if (up->number < 10) |
|---|
| 3460 | printf("--%ld.", up->number); |
|---|
| 3461 | else if (up->number < 100) |
|---|
| 3462 | printf("-%2ld.", up->number); |
|---|
| 3463 | else |
|---|
| 3464 | printf("%3ld.", up->number); |
|---|
| 3465 | for (i = 0; i < maxname; i++) |
|---|
| 3466 | putchar(up->namesp[i]); |
|---|
| 3467 | /* write(output,d:36); */ |
|---|
| 3468 | putchar('\n'); |
|---|
| 3469 | return; |
|---|
| 3470 | } |
|---|
| 3471 | cp = up->isop; |
|---|
| 3472 | maxn = up->diverg; |
|---|
| 3473 | for (n = 1; n <= maxn; n++) { |
|---|
| 3474 | prbranch(cp->kinp, d, n, maxn, umbrella, length); |
|---|
| 3475 | cp = cp->isop; |
|---|
| 3476 | if (n == maxn / 2) { |
|---|
| 3477 | if (m == 1) |
|---|
| 3478 | umbrella[d - 1] = true; |
|---|
| 3479 | if (n == 1) |
|---|
| 3480 | umbrella[d - 1] = true; |
|---|
| 3481 | for (j = 0; j < d; j++) { |
|---|
| 3482 | if (umbrella[j]) |
|---|
| 3483 | printf("%*c", (int)length[j], ':'); |
|---|
| 3484 | else |
|---|
| 3485 | printf("%*c", (int)length[j], ' '); |
|---|
| 3486 | } |
|---|
| 3487 | if (n == maxn) |
|---|
| 3488 | umbrella[d - 1] = false; |
|---|
| 3489 | if (m == maxm) |
|---|
| 3490 | umbrella[d - 1] = false; |
|---|
| 3491 | if (over) { |
|---|
| 3492 | FORLIM1 = length[d] - 3; |
|---|
| 3493 | for (i = 1; i <= FORLIM1; i++) |
|---|
| 3494 | putchar('+'); |
|---|
| 3495 | } else { |
|---|
| 3496 | FORLIM1 = length[d] - 3; |
|---|
| 3497 | for (i = 1; i <= FORLIM1; i++) |
|---|
| 3498 | putchar('-'); |
|---|
| 3499 | } |
|---|
| 3500 | if (up->number < 10) /* ,':' */ |
|---|
| 3501 | printf("--%ld", up->number); |
|---|
| 3502 | else if (up->number < 100) |
|---|
| 3503 | printf("-%2ld", up->number); |
|---|
| 3504 | else |
|---|
| 3505 | printf("%3ld", up->number); |
|---|
| 3506 | /* write(output,d:50); */ |
|---|
| 3507 | putchar('\n'); |
|---|
| 3508 | } else if (n != maxn) { |
|---|
| 3509 | for (j = 0; j <= d; j++) { |
|---|
| 3510 | if (umbrella[j]) |
|---|
| 3511 | printf("%*c", (int)length[j], ':'); |
|---|
| 3512 | else |
|---|
| 3513 | printf("%*c", (int)length[j], ' '); |
|---|
| 3514 | } |
|---|
| 3515 | putchar('\n'); |
|---|
| 3516 | } |
|---|
| 3517 | } |
|---|
| 3518 | |
|---|
| 3519 | /* ,':' */ |
|---|
| 3520 | /* ,':' */ |
|---|
| 3521 | } /* prbranch */ |
|---|
| 3522 | |
|---|
| 3523 | #undef maxover |
|---|
| 3524 | #undef maxleng |
|---|
| 3525 | |
|---|
| 3526 | |
|---|
| 3527 | Static Void prtopology(tr) |
|---|
| 3528 | tree *tr; |
|---|
| 3529 | { |
|---|
| 3530 | long n, maxn, depth; |
|---|
| 3531 | node *cp; |
|---|
| 3532 | umbty umbrella; |
|---|
| 3533 | lspty length; |
|---|
| 3534 | |
|---|
| 3535 | for (n = 0; n <= maxsp; n++) { |
|---|
| 3536 | umbrella[n] = false; |
|---|
| 3537 | if (n == 0) |
|---|
| 3538 | length[n] = 3; |
|---|
| 3539 | else |
|---|
| 3540 | length[n] = 6; |
|---|
| 3541 | } |
|---|
| 3542 | cp = tr->brnchp[0]; |
|---|
| 3543 | maxn = cp->diverg + 1; |
|---|
| 3544 | putchar('\n'); |
|---|
| 3545 | for (n = 1; n <= maxn; n++) { |
|---|
| 3546 | depth = 0; |
|---|
| 3547 | prbranch(cp->kinp, depth, n, maxn, umbrella, length); |
|---|
| 3548 | cp = cp->isop; |
|---|
| 3549 | if (n == maxn / 2) |
|---|
| 3550 | printf("%*s\n", (int)length[0], "0:"); |
|---|
| 3551 | else if (n != maxn) |
|---|
| 3552 | printf("%*c\n", (int)length[0], ':'); |
|---|
| 3553 | } |
|---|
| 3554 | } /* prtopology */ |
|---|
| 3555 | |
|---|
| 3556 | |
|---|
| 3557 | /*********************************/ |
|---|
| 3558 | /*** OUTPUT OF TREE TOPOLOGY ***/ |
|---|
| 3559 | /*********************************/ |
|---|
| 3560 | |
|---|
| 3561 | Static Void charasubtoporogy(up, nsp, nch) |
|---|
| 3562 | node *up; |
|---|
| 3563 | long *nsp, *nch; |
|---|
| 3564 | { |
|---|
| 3565 | long n, maxn; |
|---|
| 3566 | node *cp; |
|---|
| 3567 | |
|---|
| 3568 | if (up->isop == NULL) { /* TIP */ |
|---|
| 3569 | for (n = 0; n < maxname; n++) { |
|---|
| 3570 | if (up->namesp[n] != ' ') { |
|---|
| 3571 | putchar(up->namesp[n]); |
|---|
| 3572 | (*nch)++; |
|---|
| 3573 | } |
|---|
| 3574 | } |
|---|
| 3575 | (*nsp)++; |
|---|
| 3576 | return; |
|---|
| 3577 | } |
|---|
| 3578 | cp = up->isop; |
|---|
| 3579 | maxn = up->diverg; |
|---|
| 3580 | putchar('('); |
|---|
| 3581 | (*nch)++; |
|---|
| 3582 | for (n = 1; n <= maxn; n++) { |
|---|
| 3583 | charasubtoporogy(cp->kinp, nsp, nch); |
|---|
| 3584 | cp = cp->isop; |
|---|
| 3585 | if (n != maxn) { |
|---|
| 3586 | putchar(','); |
|---|
| 3587 | (*nch)++; |
|---|
| 3588 | if (*nch > maxline - 10) { |
|---|
| 3589 | printf("\n%3c", ' '); |
|---|
| 3590 | *nch = 3; |
|---|
| 3591 | } |
|---|
| 3592 | } |
|---|
| 3593 | } |
|---|
| 3594 | putchar(')'); |
|---|
| 3595 | (*nch)++; |
|---|
| 3596 | } /* charasubtoporogy */ |
|---|
| 3597 | |
|---|
| 3598 | |
|---|
| 3599 | Static Void charatopology(tr) |
|---|
| 3600 | tree *tr; |
|---|
| 3601 | { |
|---|
| 3602 | long n, maxn, nsp, nch; |
|---|
| 3603 | node *cp; |
|---|
| 3604 | |
|---|
| 3605 | nsp = 0; |
|---|
| 3606 | nch = 3; |
|---|
| 3607 | cp = tr->brnchp[0]; |
|---|
| 3608 | maxn = cp->diverg + 1; |
|---|
| 3609 | printf("\n%3s", " ( "); |
|---|
| 3610 | for (n = 1; n <= maxn; n++) { |
|---|
| 3611 | charasubtoporogy(cp->kinp, &nsp, &nch); |
|---|
| 3612 | cp = cp->isop; |
|---|
| 3613 | if (n != maxn) { |
|---|
| 3614 | printf("%2s", ", "); |
|---|
| 3615 | nch += 2; |
|---|
| 3616 | if (nch > maxline - 15) { |
|---|
| 3617 | printf("\n%3c", ' '); |
|---|
| 3618 | nch = 3; |
|---|
| 3619 | } |
|---|
| 3620 | } |
|---|
| 3621 | } |
|---|
| 3622 | printf(" )\n"); |
|---|
| 3623 | } /* charatopology */ |
|---|
| 3624 | |
|---|
| 3625 | |
|---|
| 3626 | /**************************************/ |
|---|
| 3627 | /*** OUTPUT OF THE FINAL RESULT ***/ |
|---|
| 3628 | /**************************************/ |
|---|
| 3629 | |
|---|
| 3630 | Static Void printbranch(tr) |
|---|
| 3631 | tree *tr; |
|---|
| 3632 | { |
|---|
| 3633 | long i, j; |
|---|
| 3634 | node *p, *q; |
|---|
| 3635 | long FORLIM; |
|---|
| 3636 | |
|---|
| 3637 | FORLIM = ibrnch2; |
|---|
| 3638 | for (i = 0; i < FORLIM; i++) { |
|---|
| 3639 | p = tr->brnchp[i + 1]; |
|---|
| 3640 | q = p->kinp; |
|---|
| 3641 | printf("%5c", ' '); |
|---|
| 3642 | if (p->isop == NULL) { /* TIP */ |
|---|
| 3643 | for (j = 0; j < maxname; j++) |
|---|
| 3644 | putchar(p->namesp[j]); |
|---|
| 3645 | } else { |
|---|
| 3646 | for (j = 1; j <= maxname; j++) |
|---|
| 3647 | putchar(' '); |
|---|
| 3648 | } |
|---|
| 3649 | printf("%5ld", p->number); |
|---|
| 3650 | if (p->UU.U0.lnga >= maxarc) |
|---|
| 3651 | printf("%12s", " infinity"); |
|---|
| 3652 | else if (p->UU.U0.lnga <= minarc) |
|---|
| 3653 | printf("%12s", " zero "); |
|---|
| 3654 | else |
|---|
| 3655 | printf("%12.5f", p->UU.U0.lnga); |
|---|
| 3656 | printf("%3s%9.5f%2s", " (", sqrt(fabs(tr->vrilnga[i])), " )"); |
|---|
| 3657 | if (debugoptn) { |
|---|
| 3658 | printf("%12.5f", sqrt(fabs(tr->vrilnga2[i]))); |
|---|
| 3659 | printf("%13.5f", tr->blklhd[i]); |
|---|
| 3660 | } |
|---|
| 3661 | putchar('\n'); |
|---|
| 3662 | } |
|---|
| 3663 | |
|---|
| 3664 | } /* printbranch */ |
|---|
| 3665 | |
|---|
| 3666 | |
|---|
| 3667 | Static Void summarize(tr) |
|---|
| 3668 | tree *tr; |
|---|
| 3669 | { |
|---|
| 3670 | putchar('\n'); |
|---|
| 3671 | /* printline( 46 ); */ |
|---|
| 3672 | if (usertree) |
|---|
| 3673 | printf("%4s%3ld%8c", " No.", notree, ' '); |
|---|
| 3674 | else |
|---|
| 3675 | printf("%4s%3ld%2s%3ld%3c", " No.", stage, " -", notree, ' '); |
|---|
| 3676 | printf("%7s%9s%11s", "number", "Length", "S.E."); |
|---|
| 3677 | if (!tr->cnvrgnc) |
|---|
| 3678 | printf("%21s", "non convergence"); |
|---|
| 3679 | /* write (output, 'convergence ':21) */ |
|---|
| 3680 | if (writeoptn) |
|---|
| 3681 | printf("%2c%3ld%2c%4ld", ':', numsm, ',', numnw); |
|---|
| 3682 | putchar('\n'); |
|---|
| 3683 | printline(46L); |
|---|
| 3684 | printbranch(tr); |
|---|
| 3685 | printline(46L); |
|---|
| 3686 | printf("%8s", "ln L :"); |
|---|
| 3687 | printf("%10.3f", tr->lklhd); |
|---|
| 3688 | printf("%2c%8.3f%2s", '(', sqrt(fabs(tr->vrilkl)), " )"); |
|---|
| 3689 | printf("%7s%9.3f\n", "AIC :", tr->aic); |
|---|
| 3690 | printline(46L); |
|---|
| 3691 | /* writeln(output); */ |
|---|
| 3692 | } /* summarize */ |
|---|
| 3693 | |
|---|
| 3694 | |
|---|
| 3695 | Static Void cleartree(tr) |
|---|
| 3696 | tree *tr; |
|---|
| 3697 | { |
|---|
| 3698 | long i, n; |
|---|
| 3699 | node *cp, *sp, *dp; |
|---|
| 3700 | long FORLIM; |
|---|
| 3701 | |
|---|
| 3702 | FORLIM = ibrnch2; |
|---|
| 3703 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 3704 | tr->brnchp[i]->kinp->kinp = NULL; |
|---|
| 3705 | tr->brnchp[i]->kinp = NULL; |
|---|
| 3706 | } |
|---|
| 3707 | FORLIM = ibrnch2 + 1; |
|---|
| 3708 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 3709 | if (i == ibrnch2 + 1) |
|---|
| 3710 | n = 0; |
|---|
| 3711 | else |
|---|
| 3712 | n = i; |
|---|
| 3713 | sp = tr->brnchp[n]; |
|---|
| 3714 | cp = sp->isop; |
|---|
| 3715 | sp->isop = NULL; |
|---|
| 3716 | while (cp != sp) { |
|---|
| 3717 | dp = cp; |
|---|
| 3718 | cp = cp->isop; |
|---|
| 3719 | dp->isop = freenode; |
|---|
| 3720 | freenode = dp; |
|---|
| 3721 | dp = NULL; |
|---|
| 3722 | /* dp^.isop := NIL; |
|---|
| 3723 | DISPOSE( dp ); */ |
|---|
| 3724 | } |
|---|
| 3725 | sp = NULL; |
|---|
| 3726 | tr->brnchp[n] = NULL; |
|---|
| 3727 | cp->isop = freenode; |
|---|
| 3728 | freenode = cp; |
|---|
| 3729 | cp = NULL; |
|---|
| 3730 | /* DISPOSE( cp ); */ |
|---|
| 3731 | } |
|---|
| 3732 | } /* cleartree */ |
|---|
| 3733 | |
|---|
| 3734 | |
|---|
| 3735 | Static Void bootstrap() |
|---|
| 3736 | { |
|---|
| 3737 | long ib, jb, nb, bsite, maxboottree, inseed; |
|---|
| 3738 | double maxlklboot; |
|---|
| 3739 | longintty seed; |
|---|
| 3740 | long FORLIM, FORLIM1, FORLIM2; |
|---|
| 3741 | |
|---|
| 3742 | inseed = 12345; |
|---|
| 3743 | for (ib = 0; ib <= 5; ib++) |
|---|
| 3744 | seed[ib] = 0; |
|---|
| 3745 | ib = 0; |
|---|
| 3746 | do { |
|---|
| 3747 | seed[ib] = inseed & 63; |
|---|
| 3748 | inseed /= 64; |
|---|
| 3749 | ib++; |
|---|
| 3750 | } while (inseed != 0); |
|---|
| 3751 | |
|---|
| 3752 | FORLIM = numtrees; |
|---|
| 3753 | for (jb = 1; jb <= FORLIM; jb++) |
|---|
| 3754 | boottree[jb] = 0.0; |
|---|
| 3755 | for (nb = 1; nb <= maxboot; nb++) { |
|---|
| 3756 | FORLIM1 = numtrees; |
|---|
| 3757 | for (jb = 1; jb <= FORLIM1; jb++) |
|---|
| 3758 | lklboottree[jb] = 0.0; |
|---|
| 3759 | FORLIM1 = endsite; |
|---|
| 3760 | for (ib = 1; ib <= FORLIM1; ib++) { |
|---|
| 3761 | bsite = weightw[(int)((long)(randum(seed) * endsite + 1)) - 1]; |
|---|
| 3762 | FORLIM2 = numtrees; |
|---|
| 3763 | for (jb = 1; jb <= FORLIM2; jb++) |
|---|
| 3764 | lklboottree[jb] += lklhdtrpt[jb][bsite - 1]; |
|---|
| 3765 | } |
|---|
| 3766 | |
|---|
| 3767 | maxlklboot = lklboottree[1]; |
|---|
| 3768 | maxboottree = 1; |
|---|
| 3769 | if (debugoptn) |
|---|
| 3770 | printf("%5ld", nb); |
|---|
| 3771 | FORLIM1 = numtrees; |
|---|
| 3772 | for (jb = 1; jb <= FORLIM1; jb++) { |
|---|
| 3773 | if (lklboottree[jb] > maxlklboot) { |
|---|
| 3774 | maxlklboot = lklboottree[jb]; |
|---|
| 3775 | maxboottree = jb; |
|---|
| 3776 | } |
|---|
| 3777 | if (debugoptn) |
|---|
| 3778 | printf("%8.1f", lklboottree[jb]); |
|---|
| 3779 | } |
|---|
| 3780 | if (debugoptn) |
|---|
| 3781 | printf("%4ld\n", maxboottree); |
|---|
| 3782 | boottree[maxboottree] += 1.0; |
|---|
| 3783 | } |
|---|
| 3784 | if (maxboot == 0) { |
|---|
| 3785 | FORLIM = numtrees; |
|---|
| 3786 | for (jb = 1; jb <= FORLIM; jb++) |
|---|
| 3787 | boottree[jb] /= maxboot; |
|---|
| 3788 | } |
|---|
| 3789 | } /* bootstrap */ |
|---|
| 3790 | |
|---|
| 3791 | |
|---|
| 3792 | Static Void printlklhd() |
|---|
| 3793 | { |
|---|
| 3794 | long i, j, cul; |
|---|
| 3795 | double suml; /* difference of ln lklhd */ |
|---|
| 3796 | double suml2; /* absolute value of difference */ |
|---|
| 3797 | double suma; /* difference of AIC */ |
|---|
| 3798 | double suma2; /* absolute value of AIC */ |
|---|
| 3799 | double lklsite; /* likelihood of site */ |
|---|
| 3800 | double aicsite; /* AIC of site */ |
|---|
| 3801 | double sdl; /* standard error ln lklhd */ |
|---|
| 3802 | double sda; /* standard error of AIC */ |
|---|
| 3803 | long FORLIM, FORLIM1; |
|---|
| 3804 | double TEMP; |
|---|
| 3805 | |
|---|
| 3806 | cul = 71; |
|---|
| 3807 | putchar('\n'); |
|---|
| 3808 | if (usertree) |
|---|
| 3809 | printf("%10c%4ld user trees\n", ' ', numtrees); |
|---|
| 3810 | else |
|---|
| 3811 | printf("%10s%3ld%6s%5ld%6s\n", " NO.", stage, "stage", notree, "trees"); |
|---|
| 3812 | if (numtrees <= 0 || endsite <= 1) |
|---|
| 3813 | return; |
|---|
| 3814 | printline(cul); |
|---|
| 3815 | printf("%6s%6s%12s%12s%6s%12s%17s\n", |
|---|
| 3816 | " Tree", "ln L", "Diff ln L", "#Para", "AIC", "Diff AIC", "Boot P"); |
|---|
| 3817 | printline(cul); |
|---|
| 3818 | FORLIM = numtrees; |
|---|
| 3819 | for (i = 1; i <= FORLIM; i++) { |
|---|
| 3820 | printf("%4ld%9.2f", i, lklhdtree[i]); |
|---|
| 3821 | if (maxltr == i) |
|---|
| 3822 | printf(" <-- best%9c", ' '); |
|---|
| 3823 | else { |
|---|
| 3824 | suml = 0.0; |
|---|
| 3825 | suml2 = 0.0; |
|---|
| 3826 | FORLIM1 = endptrn; |
|---|
| 3827 | for (j = 0; j < FORLIM1; j++) { |
|---|
| 3828 | lklsite = lklhdtrpt[maxltr][j] - lklhdtrpt[i][j]; |
|---|
| 3829 | suml += weight[j] * lklsite; |
|---|
| 3830 | suml2 += weight[j] * lklsite * lklsite; |
|---|
| 3831 | } |
|---|
| 3832 | TEMP = suml / endsite; |
|---|
| 3833 | sdl = sqrt(endsite / (endsite - 1.0) * (suml2 - TEMP * TEMP)); |
|---|
| 3834 | printf("%9.2f", lklhdtree[i] - maxlkl); |
|---|
| 3835 | printf("%3s%6.2f", "+-", sdl); |
|---|
| 3836 | } |
|---|
| 3837 | printf("%4ld", paratree[i]); |
|---|
| 3838 | printf("%9.2f", aictree[i]); |
|---|
| 3839 | if (minatr == i) |
|---|
| 3840 | printf(" <-- best%9c", ' '); |
|---|
| 3841 | else { |
|---|
| 3842 | suma = 0.0; |
|---|
| 3843 | suma2 = 0.0; |
|---|
| 3844 | FORLIM1 = endptrn; |
|---|
| 3845 | for (j = 0; j < FORLIM1; j++) { |
|---|
| 3846 | aicsite = -2.0 * (lklhdtrpt[maxltr][j] - lklhdtrpt[i][j]); |
|---|
| 3847 | suma += weight[j] * aicsite; |
|---|
| 3848 | suma2 += weight[j] * aicsite * aicsite; |
|---|
| 3849 | } |
|---|
| 3850 | TEMP = suma / endsite; |
|---|
| 3851 | sda = sqrt(endsite / (endsite - 1.0) * (suma2 - TEMP * TEMP)); |
|---|
| 3852 | printf("%9.2f", aictree[i] - minaic); |
|---|
| 3853 | printf("%3s%6.2f", "+-", sda); |
|---|
| 3854 | } |
|---|
| 3855 | if (usertree) |
|---|
| 3856 | printf("%9.4f", boottree[i]); |
|---|
| 3857 | putchar('\n'); |
|---|
| 3858 | } |
|---|
| 3859 | printline(cul); |
|---|
| 3860 | } /* printlklhd */ |
|---|
| 3861 | |
|---|
| 3862 | |
|---|
| 3863 | Static Void outlklhd() |
|---|
| 3864 | { |
|---|
| 3865 | long i, j, k, nt, FORLIM, FORLIM1, FORLIM2; |
|---|
| 3866 | |
|---|
| 3867 | fprintf(lklfile, "%5ld%5ld\n", numsp, endsite); |
|---|
| 3868 | i = 0; |
|---|
| 3869 | FORLIM = numtrees; |
|---|
| 3870 | for (nt = 1; nt <= FORLIM; nt++) { |
|---|
| 3871 | fprintf(lklfile, "%5ld\n", nt); |
|---|
| 3872 | FORLIM1 = endptrn; |
|---|
| 3873 | for (j = 0; j < FORLIM1; j++) { |
|---|
| 3874 | FORLIM2 = weight[j]; |
|---|
| 3875 | for (k = 1; k <= FORLIM2; k++) { |
|---|
| 3876 | fprintf(lklfile, "% .5E", lklhdtrpt[nt][j]); |
|---|
| 3877 | i++; |
|---|
| 3878 | if (i == 6) { |
|---|
| 3879 | putc('\n', lklfile); |
|---|
| 3880 | i = 0; |
|---|
| 3881 | } |
|---|
| 3882 | } |
|---|
| 3883 | } |
|---|
| 3884 | if (i != 0) |
|---|
| 3885 | putc('\n', lklfile); |
|---|
| 3886 | i = 0; |
|---|
| 3887 | } |
|---|
| 3888 | } /* outlklhd */ |
|---|
| 3889 | |
|---|
| 3890 | |
|---|
| 3891 | Static Void manutree() |
|---|
| 3892 | { |
|---|
| 3893 | long ntree, FORLIM; |
|---|
| 3894 | |
|---|
| 3895 | /*PAGE(output);*/ |
|---|
| 3896 | fscanf(seqfile, "%ld%*[^\n]", &numtrees); |
|---|
| 3897 | getc(seqfile); |
|---|
| 3898 | printf("\n %5ld user trees\n\n", numtrees); |
|---|
| 3899 | FORLIM = numtrees; |
|---|
| 3900 | for (ntree = 1; ntree <= FORLIM; ntree++) { |
|---|
| 3901 | notree = ntree; |
|---|
| 3902 | treestructure(&ctree); |
|---|
| 3903 | manuvaluate(&ctree); |
|---|
| 3904 | prtopology(&ctree); |
|---|
| 3905 | summarize(&ctree); |
|---|
| 3906 | cleartree(&ctree); |
|---|
| 3907 | /*PAGE(output);*/ |
|---|
| 3908 | } |
|---|
| 3909 | if (bootsoptn) |
|---|
| 3910 | bootstrap(); |
|---|
| 3911 | printlklhd(); |
|---|
| 3912 | if (putlkoptn) |
|---|
| 3913 | outlklhd(); |
|---|
| 3914 | } /* manutree */ |
|---|
| 3915 | |
|---|
| 3916 | |
|---|
| 3917 | Static Void newbranch(nbranch, np1, np2) |
|---|
| 3918 | long nbranch; |
|---|
| 3919 | node **np1, **np2; |
|---|
| 3920 | { |
|---|
| 3921 | long j; |
|---|
| 3922 | node *np; |
|---|
| 3923 | |
|---|
| 3924 | for (j = 1; j <= 2; j++) { |
|---|
| 3925 | if (freenode == NULL) |
|---|
| 3926 | np = (node *)Malloc(sizeof(node)); |
|---|
| 3927 | else { |
|---|
| 3928 | np = freenode; |
|---|
| 3929 | freenode = np->isop; |
|---|
| 3930 | np->isop = NULL; |
|---|
| 3931 | } |
|---|
| 3932 | clearnode(np); |
|---|
| 3933 | if (j == 1) |
|---|
| 3934 | *np1 = np; |
|---|
| 3935 | else |
|---|
| 3936 | *np2 = np; |
|---|
| 3937 | np = NULL; |
|---|
| 3938 | } |
|---|
| 3939 | (*np1)->kinp = *np2; |
|---|
| 3940 | (*np2)->kinp = *np1; |
|---|
| 3941 | ctree.brnchp[nbranch] = *np1; |
|---|
| 3942 | ctree.brnchp[nbranch]->number = ibrnch2; |
|---|
| 3943 | } /* newbranch */ |
|---|
| 3944 | |
|---|
| 3945 | |
|---|
| 3946 | Static Void decomposition(cnode) |
|---|
| 3947 | long cnode; |
|---|
| 3948 | { |
|---|
| 3949 | long i1, i2, maxdvg; |
|---|
| 3950 | node *cp1, *cp2, *bp1, *bp2, *lp1, *lp2, *np1, *np2; |
|---|
| 3951 | double maxlkls; |
|---|
| 3952 | |
|---|
| 3953 | if (ctree.brnchp[cnode]->diverg <= 2) { |
|---|
| 3954 | return; |
|---|
| 3955 | } /* IF */ |
|---|
| 3956 | /* |
|---|
| 3957 | PAGE(output); |
|---|
| 3958 | */ |
|---|
| 3959 | stage++; |
|---|
| 3960 | notree = 0; |
|---|
| 3961 | ibrnch2++; |
|---|
| 3962 | newbranch(ibrnch2, &np1, &np2); |
|---|
| 3963 | cp1 = ctree.brnchp[cnode]; |
|---|
| 3964 | cp2 = cp1; |
|---|
| 3965 | bp1 = cp1; |
|---|
| 3966 | do { |
|---|
| 3967 | bp1 = bp1->isop; |
|---|
| 3968 | } while (bp1->isop != cp1); |
|---|
| 3969 | bp2 = bp1; |
|---|
| 3970 | maxlkls = -999999.0; |
|---|
| 3971 | maxdvg = ctree.brnchp[cnode]->diverg; |
|---|
| 3972 | if (maxdvg == 3) { |
|---|
| 3973 | maxdvg--; |
|---|
| 3974 | cp1 = cp1->isop; |
|---|
| 3975 | cp2 = cp1; |
|---|
| 3976 | bp1 = bp1->isop; |
|---|
| 3977 | bp2 = bp1; |
|---|
| 3978 | } |
|---|
| 3979 | for (i1 = 1; i1 <= maxdvg; i1++) { |
|---|
| 3980 | for (i2 = i1 + 1; i2 <= maxdvg + 1; i2++) { |
|---|
| 3981 | if (debugoptn) { |
|---|
| 3982 | ibrnch2--; |
|---|
| 3983 | printcurtree(&ctree); |
|---|
| 3984 | ibrnch2++; |
|---|
| 3985 | } |
|---|
| 3986 | notree++; |
|---|
| 3987 | bp2 = cp2; |
|---|
| 3988 | cp2 = cp2->isop; |
|---|
| 3989 | if (debugoptn) |
|---|
| 3990 | printf(" AUTO-INS%3ld%3ld%4c%3ld%3ld%4c%3ld%3ld%4c%3ld%3ld\n", |
|---|
| 3991 | i1, i2, 'c', cp1->kinp->number, cp2->kinp->number, 'b', |
|---|
| 3992 | bp1->kinp->number, bp2->kinp->number, 'n', np1->number, |
|---|
| 3993 | np2->number); |
|---|
| 3994 | insertbranch(&ctree, cp1, cp2, bp1, bp2, np1, np2); |
|---|
| 3995 | autovaluate(&ctree); |
|---|
| 3996 | prtopology(&ctree); |
|---|
| 3997 | charatopology(&ctree); |
|---|
| 3998 | summarize(&ctree); |
|---|
| 3999 | if (ctree.lklhd > maxlkls) { |
|---|
| 4000 | maxlkls = ctree.lklhd; |
|---|
| 4001 | lp1 = bp1; |
|---|
| 4002 | lp2 = bp2; |
|---|
| 4003 | } |
|---|
| 4004 | if (debugoptn) |
|---|
| 4005 | printf(" AUTO-DEL%3ld%3ld%4c%3ld%3ld%4c%3ld%3ld%4c%3ld%3ld\n", |
|---|
| 4006 | i1, i2, 'c', cp1->kinp->number, cp2->kinp->number, 'b', |
|---|
| 4007 | bp1->kinp->number, bp2->kinp->number, 'n', np1->number, |
|---|
| 4008 | np2->number); |
|---|
| 4009 | deletebranch(&ctree, cnode, cp1, cp2, bp1, bp2, np1, np2); |
|---|
| 4010 | } |
|---|
| 4011 | bp1 = cp1; |
|---|
| 4012 | cp1 = bp1->isop; |
|---|
| 4013 | bp2 = bp1; |
|---|
| 4014 | cp2 = bp1->isop; |
|---|
| 4015 | } /* FOR */ |
|---|
| 4016 | /* |
|---|
| 4017 | PAGE(output); |
|---|
| 4018 | */ |
|---|
| 4019 | numtrees = notree; |
|---|
| 4020 | printlklhd(); |
|---|
| 4021 | notree = 0; |
|---|
| 4022 | cp1 = lp1->isop; |
|---|
| 4023 | cp2 = lp2->isop; |
|---|
| 4024 | bp1 = lp1; |
|---|
| 4025 | bp2 = lp2; |
|---|
| 4026 | if (debugoptn) |
|---|
| 4027 | printf(" AUTO-MAX%4c%3ld%3ld%4c%3ld%3ld%4c%3ld%3ld\n", |
|---|
| 4028 | 'c', cp1->kinp->number, cp2->kinp->number, 'b', bp1->kinp->number, |
|---|
| 4029 | bp2->kinp->number, 'n', np1->number, np2->number); |
|---|
| 4030 | insertbranch(&ctree, cp1, cp2, bp1, bp2, np1, np2); |
|---|
| 4031 | autovaluate(&ctree); |
|---|
| 4032 | prtopology(&ctree); |
|---|
| 4033 | summarize(&ctree); |
|---|
| 4034 | } /* decomposition */ |
|---|
| 4035 | |
|---|
| 4036 | |
|---|
| 4037 | Static Void autotree() |
|---|
| 4038 | { |
|---|
| 4039 | long i, j, dvg, cnode, FORLIM; |
|---|
| 4040 | |
|---|
| 4041 | stage = 0; |
|---|
| 4042 | notree = 1; |
|---|
| 4043 | if (semiaoptn) |
|---|
| 4044 | treestructure(&ctree); |
|---|
| 4045 | else |
|---|
| 4046 | starstructure(&ctree); |
|---|
| 4047 | manuvaluate(&ctree); |
|---|
| 4048 | prtopology(&ctree); |
|---|
| 4049 | summarize(&ctree); |
|---|
| 4050 | |
|---|
| 4051 | if (!semiaoptn) { |
|---|
| 4052 | do { |
|---|
| 4053 | decomposition(0L); |
|---|
| 4054 | } while (ctree.brnchp[0]->diverg >= 3); |
|---|
| 4055 | return; |
|---|
| 4056 | } |
|---|
| 4057 | |
|---|
| 4058 | /* printlklhd; */ |
|---|
| 4059 | /* IF putlkoptn THEN outlklhd; */ |
|---|
| 4060 | if (firstoptn) { |
|---|
| 4061 | do { |
|---|
| 4062 | decomposition(0L); |
|---|
| 4063 | } while (ctree.brnchp[0]->diverg >= 3); |
|---|
| 4064 | do { |
|---|
| 4065 | dvg = 2; /* ctree.brnchp[0]^.diverg */ |
|---|
| 4066 | cnode = 0; |
|---|
| 4067 | FORLIM = ibrnch2; |
|---|
| 4068 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 4069 | if (ctree.brnchp[i]->diverg > dvg) { |
|---|
| 4070 | dvg = ctree.brnchp[i]->diverg; |
|---|
| 4071 | cnode = i; |
|---|
| 4072 | } |
|---|
| 4073 | } |
|---|
| 4074 | decomposition(cnode); |
|---|
| 4075 | } while (dvg >= 3); |
|---|
| 4076 | return; |
|---|
| 4077 | } |
|---|
| 4078 | if (lastoptn) { |
|---|
| 4079 | do { |
|---|
| 4080 | dvg = 2; /* ctree.brnchp[0]^.diverg */ |
|---|
| 4081 | cnode = 0; |
|---|
| 4082 | FORLIM = ibrnch2; |
|---|
| 4083 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 4084 | if (ctree.brnchp[i]->diverg > dvg) { |
|---|
| 4085 | dvg = ctree.brnchp[i]->diverg; |
|---|
| 4086 | cnode = i; |
|---|
| 4087 | } |
|---|
| 4088 | } |
|---|
| 4089 | decomposition(cnode); |
|---|
| 4090 | } while (dvg >= 3); |
|---|
| 4091 | do { |
|---|
| 4092 | decomposition(0L); |
|---|
| 4093 | } while (ctree.brnchp[0]->diverg >= 3); |
|---|
| 4094 | return; |
|---|
| 4095 | } |
|---|
| 4096 | do { |
|---|
| 4097 | dvg = 2; /* ctree.brnchp[0]^.diverg */ |
|---|
| 4098 | cnode = 0; |
|---|
| 4099 | FORLIM = ibrnch2 + 1; |
|---|
| 4100 | for (i = ibrnch1; i <= FORLIM; i++) { |
|---|
| 4101 | if (i == ibrnch2 + 1) |
|---|
| 4102 | j = 0; |
|---|
| 4103 | else |
|---|
| 4104 | j = i; |
|---|
| 4105 | if (ctree.brnchp[j]->diverg > dvg) { |
|---|
| 4106 | dvg = ctree.brnchp[j]->diverg; |
|---|
| 4107 | cnode = j; |
|---|
| 4108 | } |
|---|
| 4109 | } |
|---|
| 4110 | decomposition(cnode); |
|---|
| 4111 | } while (dvg >= 3); |
|---|
| 4112 | |
|---|
| 4113 | /* auto mode */ |
|---|
| 4114 | } /* autotree */ |
|---|
| 4115 | |
|---|
| 4116 | |
|---|
| 4117 | Static Void mainio() |
|---|
| 4118 | { |
|---|
| 4119 | long nexe; |
|---|
| 4120 | |
|---|
| 4121 | freenode = NULL; |
|---|
| 4122 | for (nexe = 1; nexe <= maxexe; nexe++) { |
|---|
| 4123 | numexe = nexe; |
|---|
| 4124 | if (maxexe > 1) |
|---|
| 4125 | printf(" * JOB :%4ld *\n", numexe); |
|---|
| 4126 | getinput(); |
|---|
| 4127 | if (normal && numexe == 1) |
|---|
| 4128 | maketransprob(); |
|---|
| 4129 | if (normal) { |
|---|
| 4130 | if (usertree) |
|---|
| 4131 | manutree(); |
|---|
| 4132 | else |
|---|
| 4133 | autotree(); |
|---|
| 4134 | } |
|---|
| 4135 | /* IF maxexe > 1 THEN PAGE(output); */ |
|---|
| 4136 | } |
|---|
| 4137 | } /* mainio */ |
|---|
| 4138 | |
|---|
| 4139 | |
|---|
| 4140 | main(argc, argv) |
|---|
| 4141 | int argc; |
|---|
| 4142 | Char *argv[]; |
|---|
| 4143 | { |
|---|
| 4144 | /* ASSIGN(seqfile,seqfname); If TURBO Pascal, use */ |
|---|
| 4145 | /* ASSIGN(tpmfile,tpmfname); */ |
|---|
| 4146 | /* IF putlkoptn THEN |
|---|
| 4147 | ASSIGN (lklfile,lklfname); */ |
|---|
| 4148 | |
|---|
| 4149 | PASCAL_MAIN(argc, argv); |
|---|
| 4150 | tpmfile = NULL; |
|---|
| 4151 | lklfile = NULL; |
|---|
| 4152 | seqfile = NULL; |
|---|
| 4153 | rewind(seqfile); |
|---|
| 4154 | /* If SUN Pascal, don't use */ |
|---|
| 4155 | /* RESET (tpmfile); */ |
|---|
| 4156 | /* IF putlkoptn THEN |
|---|
| 4157 | REWRITE(lklfile); */ |
|---|
| 4158 | |
|---|
| 4159 | /* RESET (seqfile,seqfname); If SUN Pascal, use */ |
|---|
| 4160 | /* RESET (tpmfile,tpmfname); */ |
|---|
| 4161 | /* IF putlkoptn THEN |
|---|
| 4162 | REWRITE(lklfile,lklfname); */ |
|---|
| 4163 | |
|---|
| 4164 | mainio(); |
|---|
| 4165 | |
|---|
| 4166 | /* CLOSE (seqfile); If TURBO Pascal, use */ |
|---|
| 4167 | /* CLOSE (tpmfile); */ |
|---|
| 4168 | /* IF putlkoptn THEN |
|---|
| 4169 | CLOSE (lklfile); */ |
|---|
| 4170 | |
|---|
| 4171 | if (seqfile != NULL) |
|---|
| 4172 | fclose(seqfile); |
|---|
| 4173 | if (lklfile != NULL) |
|---|
| 4174 | fclose(lklfile); |
|---|
| 4175 | if (tpmfile != NULL) |
|---|
| 4176 | fclose(tpmfile); |
|---|
| 4177 | exit(EXIT_SUCCESS); |
|---|
| 4178 | } /* PROTML */ |
|---|
| 4179 | |
|---|
| 4180 | |
|---|
| 4181 | |
|---|
| 4182 | |
|---|
| 4183 | /* End. */ |
|---|