static void process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) { int32 ctloffset, ctlcount, ctlincr; int32 i; char *line; size_t len; FILE *hypfh = NULL, *hypsegfh = NULL, *ctmfh = NULL; FILE *mllrfh = NULL, *lmfh = NULL, *fsgfh = NULL; double n_speech, n_cpu, n_wall; char const *outlatdir; char const *nbestdir; char const *str; int frate; ctloffset = cmd_ln_int32_r(config, "-ctloffset"); ctlcount = cmd_ln_int32_r(config, "-ctlcount"); ctlincr = cmd_ln_int32_r(config, "-ctlincr"); outlatdir = cmd_ln_str_r(config, "-outlatdir"); nbestdir = cmd_ln_str_r(config, "-nbestdir"); frate = cmd_ln_int32_r(config, "-frate"); if ((str = cmd_ln_str_r(config, "-mllrctl"))) { mllrfh = fopen(str, "r"); if (mllrfh == NULL) { E_ERROR_SYSTEM("Failed to open MLLR control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-fsgctl"))) { fsgfh = fopen(str, "r"); if (fsgfh == NULL) { E_ERROR_SYSTEM("Failed to open FSG control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-lmnamectl"))) { lmfh = fopen(str, "r"); if (lmfh == NULL) { E_ERROR_SYSTEM("Failed to open LM name control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-hyp"))) { hypfh = fopen(str, "w"); if (hypfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(hypfh, NULL); } if ((str = cmd_ln_str_r(config, "-hypseg"))) { hypsegfh = fopen(str, "w"); if (hypsegfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(hypsegfh, NULL); } if ((str = cmd_ln_str_r(config, "-ctm"))) { ctmfh = fopen(str, "w"); if (ctmfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(ctmfh, NULL); } i = 0; while ((line = fread_line(ctlfh, &len))) { char *wptr[4]; int32 nf, sf, ef; char *mllrline = NULL, *lmline = NULL, *fsgline = NULL; char *fsgfile = NULL, *lmname = NULL, *mllrfile = NULL; if (mllrfh) { mllrline = fread_line(mllrfh, &len); if (mllrline == NULL) { E_ERROR("File size mismatch between control and MLLR control\n"); ckd_free(line); ckd_free(mllrline); goto done; } mllrfile = string_trim(mllrline, STRING_BOTH); } if (lmfh) { lmline = fread_line(lmfh, &len); if (lmline == NULL) { E_ERROR("File size mismatch between control and LM control\n"); ckd_free(line); ckd_free(lmline); goto done; } lmname = string_trim(lmline, STRING_BOTH); } if (fsgfh) { fsgline = fread_line(fsgfh, &len); if (fsgline == NULL) { E_ERROR("File size mismatch between control and FSG control\n"); ckd_free(line); ckd_free(fsgline); goto done; } fsgfile = string_trim(fsgline, STRING_BOTH); } if (i < ctloffset) { i += ctlincr; goto nextline; } if (ctlcount != -1 && i >= ctloffset + ctlcount) { goto nextline; } sf = 0; ef = -1; nf = str2words(line, wptr, 4); if (nf == 0) { /* Do nothing. */ } else if (nf < 0) { E_ERROR("Unexpected extra data in control file at line %d\n", i); } else { char const *hyp, *file, *uttid; int32 score; file = wptr[0]; uttid = NULL; if (nf > 1) sf = atoi(wptr[1]); if (nf > 2) ef = atoi(wptr[2]); if (nf > 3) uttid = wptr[3]; E_INFO("Decoding '%s'\n", uttid ? uttid : file); /* Do actual decoding. */ if(process_mllrctl_line(ps, config, mllrfile) < 0) continue; if(process_lmnamectl_line(ps, config, lmname) < 0) continue; if(process_fsgctl_line(ps, config, fsgfile) < 0) continue; if(process_ctl_line(ps, config, file, uttid, sf, ef) < 0) continue; hyp = ps_get_hyp(ps, &score, &uttid); /* Write out results and such. */ if (hypfh) { fprintf(hypfh, "%s (%s %d)\n", hyp ? hyp : "", uttid, score); } if (hypsegfh) { write_hypseg(hypsegfh, ps, uttid); } if (ctmfh) { ps_seg_t *itor = ps_seg_iter(ps, &score); write_ctm(ctmfh, ps, itor, uttid, frate); } if (outlatdir) { write_lattice(ps, outlatdir, uttid); } if (nbestdir) { write_nbest(ps, nbestdir, uttid); } ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); E_INFO("%s: %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", uttid, n_speech, n_cpu, n_wall); E_INFO("%s: %.2f xRT (CPU), %.2f xRT (elapsed)\n", uttid, n_cpu / n_speech, n_wall / n_speech); E_INFO_NOFN("%s (%s %d)\n", hyp ? hyp : "", uttid, score); } i += ctlincr; nextline: ckd_free(mllrline); ckd_free(fsgline); ckd_free(lmline); ckd_free(line); } ps_get_all_time(ps, &n_speech, &n_cpu, &n_wall); E_INFO("TOTAL %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); E_INFO("AVERAGE %.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); done: if (hypfh) fclose(hypfh); if (hypsegfh) fclose(hypsegfh); if (ctmfh) fclose(ctmfh); }
int main(int argc, char ** argv) { if(argc<11) { cout << "Usage:" << endl<<" qrun QCDOC.x -[r|w] <conf.dat> <x sites> <y sites> <z sites> <t sites> <Xbc> <Ybc> <Zbc> <Tbc>"<< endl; cout << "(use letter \'P\' or \'A\' for arguments of gauge BC's)" << endl; cout << "Eg, qrun QCDOC.x -r conf8x8x8x16.file 8 8 8 16 P P P P"<< endl; cout << " qrun QCDOC.x -w conf4x4x4x32.file 4 4 4 32 P P A A"<< endl; exit(1); } Start(&argc,&argv); // init GJP DoArg do_arg; do_arg.x_nodes = SizeX(); do_arg.y_nodes = SizeY(); do_arg.z_nodes = SizeZ(); do_arg.t_nodes = SizeT(); do_arg.s_nodes = SizeS(); int nx = atoi(argv[3]); int ny = atoi(argv[4]); int nz = atoi(argv[5]); int nt = atoi(argv[6]); do_arg.x_node_sites = nx/do_arg.x_nodes; do_arg.y_node_sites = ny/do_arg.y_nodes; do_arg.z_node_sites = nz/do_arg.z_nodes; do_arg.t_node_sites = nt/do_arg.t_nodes; do_arg.s_node_sites = 1; do_arg.x_bc = (argv[7][0]=='A' ? BND_CND_APRD : BND_CND_PRD); do_arg.y_bc = (argv[8][0]=='A' ? BND_CND_APRD : BND_CND_PRD); do_arg.z_bc = (argv[9][0]=='A' ? BND_CND_APRD : BND_CND_PRD); do_arg.t_bc = (argv[10][0]=='A' ? BND_CND_APRD : BND_CND_PRD); do_arg.start_seed_kind = START_SEED_FIXED; do_arg.beta = 5.3; do_arg.dwf_height = 0.9; // start testing if(!strcmp(argv[1],"-w")) { do_arg.start_conf_kind = START_CONF_DISORD; GJP.Initialize(do_arg); cout << "Initialized ok" << endl; write_lattice(argc,argv); } else { do_arg.start_conf_load_addr = (unsigned long)smalloc(do_arg.x_node_sites * do_arg.y_node_sites * do_arg.z_node_sites * do_arg.t_node_sites * 4 * sizeof(Matrix)); #if 1 do_arg.start_conf_kind = START_CONF_LOAD; GJP.Initialize(do_arg); cout << "Initialized ok" << endl; #if TARGET == QCDOC // *Shift() functions test QioArg qarg("NoFile"); SerialIO serio(qarg); if(serio.backForthTest()) cout << "Back-Forth test done!" << endl; else cout << "Back-Forth test failed!!" << endl; if(serio.rotateTest()) { cout << "Rotation test done!" << endl; } else { cout << "Rotation test failed!!" << endl; } cout << "========================================================================"<<endl; #endif read_lattice(argc,argv); #else // An equivalent way to load the lattice. ReadLatticePar is called // inside Lattice::Lattice() do_arg.start_conf_kind = START_CONF_FILE; do_arg.start_conf_filename = argv[2]; GJP.Initialize(do_arg); cout << "Initialized ok" << endl; GwilsonFnone lat; cout << "lattice loaded ok" << endl; const char *write_file_name = "test_out.lat"; // Should dupilcate the NERSC format lattice except header WriteLatticeParallel(lat,write_file_name,FP_IEEE32BIG,1); #endif sfree((Matrix *)do_arg.start_conf_load_addr); } exit(0); }