int main(){ // In production code, of course, we won't hardcode this struct Link * link = load("data.txt"); printf("Print as ordered by genome A\n"); recursive_print(link, 0); printf("\nPrint as ordered by genome B\n"); recursive_print(link, 1); printf("\nLowest position on genome A\n"); print_link(get_minimum(link, 0)); printf("\nLowest position on genome B\n"); print_link(get_minimum(link, 1)); printf("\nAll links with scores above 50\n"); recursive_print(winnow(link, 50), 0); return EXIT_SUCCESS; }
static void cb_hop(void* args, usb_pkt_rx *rx, int bank) { char syms[BANK_LEN * NUM_BANKS]; int i, j, k; access_code r; uint8_t channel; uint32_t time; /* in 100 nanosecond units */ uint8_t clkn_high; packet pkt; piconet* pn = (piconet *)args; uint8_t uap = pn->UAP; channel = rx->channel; time = letoh32(rx->clk100ns); /* wire format is le32 */ clkn_high = rx->clkn_high; unpack_symbols(rx->data, symbols[bank]); /* fprintf(stderr, "rx block timestamp %u * 100 nanoseconds\n", time); */ /* awfully repetitious */ k = 0; for (i = 0; i < 2; i++) for (j = 0; j < BANK_LEN; j++) syms[k++] = symbols[(i + 1 + bank) % NUM_BANKS][j]; r = find_ac(syms, BANK_LEN, pn->LAP); if (r.offset > -1) { for (i = 2; i < NUM_BANKS; i++) for (j = 0; j < BANK_LEN; j++) syms[k++] = symbols[(i + 1 + bank) % NUM_BANKS][j]; init_packet(&pkt, &syms[r.offset], BANK_LEN * NUM_BANKS - r.offset); pkt.LAP = r.LAP; pkt.clkn = (clkn_high << 19) | ((time + r.offset * 10) / 6250); pkt.channel = channel; if ((pkt.LAP == pn->LAP) && header_present(&pkt)) { printf("\nGOT PACKET on channel %d, LAP = %06x at time stamp %u, clkn %u\n", channel, pkt.LAP, time + r.offset * 10, pkt.clkn); if (pn->have_clk6) { UAP_from_header(&pkt, pn); if (!pn->have_clk6) { printf("CLK1-27 discovery failed\n"); exit(1); /* FIXME */ winnow(pn); } if (pn->have_clk27) { printf("got CLK1-27\n"); exit(0); } } else { if (UAP_from_header(&pkt, pn)) { if (uap == pn->UAP) { printf("got CLK1-6\n"); init_hop_reversal(0, pn); winnow(pn); } else { printf("failed to confirm UAP\n"); exit(1); } } } } } }
int main( int argc, /* arg count */ char * argv[] /* arg vector */ ){ static char * context = "main(chain)"; char * stem = NULL; /* dump filename stem */ char * suffix = NULL; /* dump filename suffix */ char * suff2 = NULL; /* last half of suffix */ int nr, nc; /* integer matrix sizes */ int n; /* square matrix/vector size */ real base_x, base_y; /* base of Mandelbrot */ real ext_x, ext_y; /* extent of Mandelbrot */ int limit, seed; /* randmat controls */ real fraction; /* invperc/thresh filling */ int itersLife; /* life iterations */ int itersElastic, relax; /* elastic controls */ int2D i2D; /* integer matrix */ bool2D b2D; /* boolean matrix */ pt1D cities; /* cities point vector */ int n_cities; /* number of cities */ pt1D net; /* net point vector */ int n_net; /* number of net points */ real2D r2D_gauss; /* real matrix for Gaussian */ real2D r2D_sor; /* real matrix for SOR */ real1D r1D_gauss_v; /* real vector input for Gaussian */ real1D r1D_sor_v; /* real vector input for SOR */ real1D r1D_gauss_a; /* real vector answer for Gaussian */ real1D r1D_sor_a; /* real vector answer for SOR */ real1D r1D_gauss_c; /* real vector check for Gaussian */ real1D r1D_sor_c; /* real vector check for SOR */ real tol; /* SOR tolerance */ real realDiff; /* vector difference */ bool choicesSet = FALSE; /* path choices set? */ bool doMandel = TRUE; /* mandel vs. randmat */ bool doInvperc = TRUE; /* invperc vs. thresholding */ bool doDump = FALSE; /* dump intermediate results? */ int argd = 1; /* argument index */ /* arguments */ #if NUMA MAIN_INITENV(,32000000) #endif while (argd < argc){ CHECK(argv[argd][0] == '-', fail(context, "bad argument", "index", "%d", argd, NULL)); switch(argv[argd][1]){ case 'E' : /* elastic */ itersElastic = arg_int(context, argc, argv, argd+1, argv[argd]); relax = arg_int(context, argc, argv, argd+2, argv[argd]); argd += 3; break; case 'F' : /* fraction (invperc/thresh) */ fraction = arg_real(context, argc, argv, argd+1, argv[argd]); argd += 2; break; case 'L' : /* life */ itersLife = arg_int(context, argc, argv, argd+1, argv[argd]); argd += 2; break; case 'M' : /* mandel */ base_x = arg_real(context, argc, argv, argd+1, argv[argd]); base_y = arg_real(context, argc, argv, argd+2, argv[argd]); ext_x = arg_real(context, argc, argv, argd+3, argv[argd]); ext_y = arg_real(context, argc, argv, argd+4, argv[argd]); argd += 5; break; case 'N' : /* winnow */ n_cities = arg_int(context, argc, argv, argd+1, argv[argd]); argd += 2; break; case 'R' : /* randmat */ limit = arg_int(context, argc, argv, argd+1, argv[argd]); seed = arg_int(context, argc, argv, argd+2, argv[argd]); argd += 3; break; case 'S' : /* matrix size */ nr = arg_int(context, argc, argv, argd+1, argv[argd]); nc = arg_int(context, argc, argv, argd+2, argv[argd]); argd += 3; break; case 'T' : /* SOR tolerance */ tol = arg_real(context, argc, argv, argd+1, argv[argd]); argd += 2; break; case 'c' : /* choice */ CHECK(!choicesSet, fail(context, "choices already set", NULL)); suffix = arg_str(context, argc, argv, argd+1, argv[argd]); argd += 2; switch(suffix[0]){ case 'i' : doInvperc = TRUE; break; case 't' : doInvperc = FALSE; break; default : fail(context, "unknown choice(s)", "choice", "%s", suffix, NULL); } switch(suffix[1]){ case 'm' : doMandel = TRUE; break; case 'r' : doMandel = FALSE; break; default : fail(context, "unknown choice(s)", "choice", "%s", suffix, NULL); } suff2 = suffix+1; choicesSet = TRUE; break; case 'd' : /* dump */ doDump = TRUE; argd += 1; if ((argd < argc) && (argv[argd][0] != '-')){ stem = arg_str(context, argc, argv, argd, argv[argd-1]); argd += 1; } break; #if GRAPHICS case 'g' : gfx_open(app_chain, arg_gfxCtrl(context, argc, argv, argd+1, argv[argd])); argd += 2; break; #endif #if MIMD case 'p' : DataDist = arg_dataDist(context, argc, argv, argd+1, argv[argd]); ParWidth = arg_int(context, argc, argv, argd+2, argv[argd]); argd += 3; break; #endif case 'u' : io_init(FALSE); argd += 1; break; default : fail(context, "unknown flag", "flag", "%s", argv[argd], NULL); break; } } CHECK(choicesSet, fail("context", "choices not set using -c flag", NULL)); /* initialize */ #if MIMD sch_init(DataDist); #endif /* mandel vs. randmat */ if (doMandel){ mandel(i2D, nr, nc, base_x, base_y, ext_x, ext_y); if (doDump) io_wrInt2D(context, mkfname(stem, NULL, suff2, "i2"), i2D, nr, nc); } else { randmat(i2D, nr, nc, limit, seed); if (doDump) io_wrInt2D(context, mkfname(stem, NULL, suff2, "i2"), i2D, nr, nc); } /* half */ half(i2D, nr, nc); if (doDump) io_wrInt2D(context, mkfname(stem, "h", suff2, "i2"), i2D, nr, nc); /* invperc vs. thresh */ if (doInvperc){ invperc(i2D, b2D, nr, nc, fraction); if (doDump) io_wrBool2D(context, mkfname(stem, NULL, suffix, "b2"), b2D, nr, nc); } else { thresh(i2D, b2D, nr, nc, fraction); if (doDump) io_wrBool2D(context, mkfname(stem, NULL, suffix, "b2"), b2D, nr, nc); } /* life */ life(b2D, nr, nc, itersLife); if (doDump) io_wrBool2D(context, mkfname(stem, "l", suffix, "b2"), b2D, nr, nc); /* winnow */ winnow(i2D, b2D, nr, nc, cities, n_cities); if (doDump) io_wrPt1D(context, mkfname(stem, "w", suffix, "p1"), cities, n_cities); /* norm */ norm(cities, n_cities); if (doDump) io_wrPt1D(context, mkfname(stem, "n", suffix, "p1"), cities, n_cities); /* elastic */ n_net = (int)(ELASTIC_RATIO * n_cities); CHECK(n_net <= MAXEXT, fail(context, "too many net points required", "number of net points", "%d", n_net, NULL)); elastic(cities, n_cities, net, n_net, itersElastic, relax); if (doDump) io_wrPt1D(context, mkfname(stem, "e", suffix, "p1"), net, n_net); /* outer */ n = n_net; outer(net, r2D_gauss, r1D_gauss_v, n); if (doDump){ io_wrReal2D(context, mkfname(stem, "o", suffix, "r2"), r2D_gauss, n, n); io_wrReal1D(context, mkfname(stem, "o", suffix, "r1"), r1D_gauss_v, n); } cpReal2D(r2D_gauss, r2D_sor, n, n); cpReal1D(r1D_gauss_v, r1D_sor_v, n); /* gauss */ gauss(r2D_gauss, r1D_gauss_v, r1D_gauss_a, n); if (doDump) io_wrReal1D(context, mkfname(stem, "g", suffix, "r1"), r1D_gauss_a, n); /* product (gauss) */ product(r2D_gauss, r1D_gauss_a, r1D_gauss_c, n, n); if (doDump) io_wrReal1D(context, mkfname(stem, "pg", suffix, "r1"), r1D_gauss_c, n); /* sor */ sor(r2D_sor, r1D_sor_v, r1D_sor_a, n, tol); if (doDump) io_wrReal1D(context, mkfname(stem, "s", suffix, "r1"), r1D_gauss_a, n); /* product (sor) */ product(r2D_sor, r1D_sor_a, r1D_sor_c, n, n); if (doDump) io_wrReal1D(context, mkfname(stem, "ps", suffix, "r1"), r1D_gauss_c, n); /* difference */ vecdiff(r1D_gauss_a, r1D_sor_a, n, &realDiff); if (doDump) io_wrReal0D(context, mkfname(stem, "v", suffix, "r0"), realDiff); #if IEEE ieee_retrospective(stderr); #endif #if NUMA MAIN_END; #endif return 0; }
MAIN_ENV #endif #include "specific.h" int main( int argc, /* arg count */ char * argv[] /* arg vector */ ){ static char * context = "main(winnow)"; int2D matrix; /* matrix of values */ bool2D mask; /* mask on values */ int nr, nc, nrM, ncM; /* sizes */ pt1D pt; /* resulting point vector */ int npt; /* number of points to keep */ char * infnMat = NULL; /* input matrix file name */ char * infnMask = NULL; /* input mask file name */ char * outfn = NULL; /* output file name */ int argd = 1; /* argument index */ /* arguments */ #if NUMA MAIN_INITENV(,32000000) #endif while (argd < argc){ CHECK(argv[argd][0] == '-', fail(context, "bad argument", "index", "%d", argd, NULL)); switch(argv[argd][1]){ case 'N' : npt = arg_int(context, argc, argv, argd+1, argv[argd]); argd += 2; break; #if GRAPHICS case 'g' : gfx_open(app_winnow, arg_gfxCtrl(context, argc, argv, argd+1, argv[argd])); argd += 2; break; #endif #if MIMD case 'p' : DataDist = arg_dataDist(context, argc, argv, argd+1, argv[argd]); ParWidth = arg_int(context, argc, argv, argd+2, argv[argd]); argd += 3; break; #endif case 'i' : infnMat = arg_str(context, argc, argv, argd+1, argv[argd]); infnMask = arg_str(context, argc, argv, argd+2, argv[argd]); argd += 3; break; case 'o' : outfn = arg_str(context, argc, argv, argd+1, argv[argd]); argd += 2; break; case 'u' : io_init(FALSE); argd += 1; break; default : fail(context, "unknown flag", "flag", "%s", argv[argd], NULL); break; } } /* setup */ #if MIMD sch_init(DataDist); #endif CHECK(npt > 0, fail(context, "non-positive number of points requested", "number of points", "%d", npt, NULL)); io_rdInt2D(context, infnMat, matrix, &nr, &nc); io_rdBool2D(context, infnMask, mask, &nrM, &ncM); CHECK((nr == nrM) && (nc == ncM), fail(context, "matrix/mask size mismatch", "matrix file", "%s", infnMat, "mask file", "%s", infnMask, NULL)); /* run */ winnow(matrix, mask, nr, nc, pt, npt); /* takedown */ io_wrPt1D(context, outfn, pt, npt); #if GRAPHICS gfx_close(); #endif #if IEEE ieee_retrospective(stderr); #endif #if NUMA MAIN_END; #endif return 0; }