//***************************************************************************** // put line to ring buffer static void hist_save_line (ring_history_t * pThis, char * line, int len) { if (len > _RING_HISTORY_LEN - 2) return; while (!hist_is_space_for_new (pThis, len)) { hist_erase_older (pThis); } // if it's first line if (pThis->ring_buf [pThis->begin] == 0) pThis->ring_buf [pThis->begin] = len; // store line if (len < _RING_HISTORY_LEN-pThis->end-1) memcpy (pThis->ring_buf + pThis->end + 1, line, len); else { int part_len = _RING_HISTORY_LEN-pThis->end-1; memcpy (pThis->ring_buf + pThis->end + 1, line, part_len); memcpy (pThis->ring_buf, line + part_len, len - part_len); } pThis->ring_buf [pThis->end] = len; pThis->end = pThis->end + len + 1; if (pThis->end >= _RING_HISTORY_LEN) pThis->end -= _RING_HISTORY_LEN; pThis->ring_buf [pThis->end] = 0; pThis->cur = 0; #ifdef _HISTORY_DEBUG print_hist (pThis); #endif }
/* * 計測ルーチン */ void perf_eval(uint_t n) { uint_t i, j; init_hist(1, MAX_TIME, histarea1); for (i = 0; i < NO_MEASURE; i++) { ini_flg(FLG1); for (j = 0; j < n; j++) { act_tsk(task_list[j]); } chg_pri(TSK_SELF, MAIN_PRIORITY_LOW); /* タスクが待ち状態に入るのを待つ */ chg_pri(TSK_SELF, TPRI_INI); begin_measure(1); set_flg(FLG1, 0x01U); end_measure(1); chg_pri(TSK_SELF, MAIN_PRIORITY_LOW); /* タスクが終了するのを待つ */ chg_pri(TSK_SELF, TPRI_INI); } syslog_1(LOG_NOTICE, "Execution times of set_flg" " when %d tasks are released from waiting.", n); print_hist(1); syslog_flush(); }
/* * メインタスク(低優先度) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (1)"); init_hist(1, MAX_TIME, histarea1); init_hist(2, MAX_TIME, histarea2); logtask_flush(0U); sus_tsk(LOGTASK); /* システムログタスクの動作を止める */ act_tsk(TASK1); act_tsk(TASK2); rsm_tsk(LOGTASK); /* システムログタスクの動作を再開する */ syslog_0(LOG_NOTICE, "Execution times of wup_tsk -> slp_tsk"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of slp_tsk -> wup_tsk"); print_hist(2); ext_ker(); }
int main(int ac, char **argv) { struct rlimit r = {1024*1024, RLIM_INFINITY}; char filename[256]; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (setrlimit(RLIMIT_MEMLOCK, &r)) { perror("setrlimit(RLIMIT_MEMLOCK)"); return 1; } if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 1; i < ac; i++) { if (strcmp(argv[i], "-a") == 0) { full_range = true; } else if (strcmp(argv[i], "-t") == 0) { text_only = true; } else if (strcmp(argv[i], "-h") == 0) { printf("Usage:\n" " -a display wider latency range\n" " -t text only\n"); return 1; } } printf(" heatmap of IO latency\n"); if (text_only) printf(" %s", sym[num_colors - 1]); else printf(" %s %s", color[num_colors - 1], nocolor); printf(" - many events with this latency\n"); if (text_only) printf(" %s", sym[0]); else printf(" %s %s", color[0], nocolor); printf(" - few events\n"); for (i = 0; ; i++) { if (i % 20 == 0) print_banner(); print_hist(map_fd[1]); sleep(2); } return 0; }
/** print statistics out of memory structures */ static void do_stats_shm(struct config_file* cfg, struct ub_stats_info* stats, struct ub_shm_stat_info* shm_stat) { int i; char nm[32]; for(i=0; i<cfg->num_threads; i++) { snprintf(nm, sizeof(nm), "thread%d", i); pr_stats(nm, &stats[i+1]); } pr_stats("total", &stats[0]); print_uptime(shm_stat); if(cfg->stat_extended) { print_mem(shm_stat); print_hist(stats); print_extended(stats); } }
/* * main task */ void main_task(intptr_t exinf) { uint_t i; syslog_0(LOG_NOTICE, "Performance evaluation program (0)"); init_hist(1, MAX_TIME, histarea1); syslog_flush(); for (i = 0; i < NO_MEASURE; i++) { begin_measure(1); end_measure(1); } syslog_0(LOG_NOTICE, "Measurement overhead"); print_hist(1); test_finish(); }
int main(int ac, char **argv) { char filename[256]; long key, next_key, value; FILE *f; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); signal(SIGINT, int_exit); /* start 'ping' in the background to have some kfree_skb events */ f = popen("ping -c5 localhost", "r"); (void) f; /* start 'dd' in the background to have plenty of 'write' syscalls */ f = popen("dd if=/dev/zero of=/dev/null count=5000000", "r"); (void) f; if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 0; i < 5; i++) { key = 0; while (bpf_get_next_key(map_fd[0], &key, &next_key) == 0) { bpf_lookup_elem(map_fd[0], &next_key, &value); printf("location 0x%lx count %ld\n", next_key, value); key = next_key; } if (key) printf("\n"); sleep(1); } print_hist(map_fd[1]); return 0; }
int my_print_history(t_env *env, t_env *history, char **tab, int fd) { if (!env || env->next == env) { fprintf(stderr, "env: history: No such file or directory\n"); return (-1); } if (!history || history->next == env) { fprintf(stderr, "history: Empty history\n"); return (-1); } if (!tab[1]) return (print_hist(history, history->next, fd, 0)); else if (tab[2]) { fprintf(stderr, "history: Too many arguments\n"); return (-1); } else return (hist_arg(history, tab[1], fd)); return (0); }
//reduce redistributes, updates 07/02/15 rnc int main(int argc, char **argv) { //// Initializations --------------------------------------------- srand48(1234); // Make sure we have reproducability check_args(argc); Time t, time; // t for global, time for local init_time(t); Feat F; MTL M; // Read parameters file // F.readInputFile(argv[1]); printFile(argv[1]); // Read Secretfile // Secret contains the identity of each target: QSO-Ly-a, QSO-tracers, LRG, ELG, fake QSO, fake LRG, SS, SF Gals Secret; printf("before read secretfile \n"); init_time_at(time,"# read Secret file",t); Secret=read_Secretfile(F.Secretfile,F); printf("# Read %d galaxies from %s \n",Secret.size(),F.Secretfile.c_str()); print_time(time,"# ... took :"); std::vector<int> count(10); count=count_galaxies(Secret); printf(" Number of galaxies by type, QSO-Ly-a, QSO-tracers, LRG, ELG, fake QSO, fake LRG, SS, SF\n"); for(int i=0;i<8;i++){if(count[i]>0)printf (" type %d number %d \n",i, count[i]);} //read the three input files init_time_at(time,"# read target, SS, SF files",t); MTL Targ=read_MTLfile(F.Targfile,F,0,0); MTL SStars=read_MTLfile(F.SStarsfile,F,1,0); MTL SkyF=read_MTLfile(F.SkyFfile,F,0,1); print_time(time,"# ... took :"); //combine the three input files M=Targ; printf(" M size %d \n",M.size()); M.insert(M.end(),SStars.begin(),SStars.end()); printf(" M size %d \n",M.size()); M.insert(M.end(),SkyF.begin(),SkyF.end()); printf(" M size %d \n",M.size()); F.Ngal=M.size(); //establish priority classes init_time_at(time,"# establish priority clasess",t); assign_priority_class(M); std::vector <int> count_class(M.priority_list.size(),0); for(int i;i<M.size();++i){ if(!M[i].SS&&!M[i].SF){ count_class[M[i].priority_class]+=1; } } for(int i;i<M.priority_list.size();++i){ printf(" class %d number %d\n",i,count_class[i]); } print_time(time,"# ... took :"); // fiber positioners PP pp; pp.read_fiber_positions(F); F.Nfiber = pp.fp.size()/2; F.Npetal = max(pp.spectrom)+1; F.Nfbp = (int) (F.Nfiber/F.Npetal);// fibers per petal = 500 pp.get_neighbors(F); pp.compute_fibsofsp(F); //P is original list of plates Plates P = read_plate_centers(F); F.Nplate=P.size(); printf(" full number of plates %d\n",F.Nplate); printf("# Read %d plates from %s and %d fibers from %s\n",F.Nplate,F.tileFile.c_str(),F.Nfiber,F.fibFile.c_str()); // Computes geometries of cb and fh: pieces of positioner - used to determine possible collisions F.cb = create_cb(); // cb=central body F.fh = create_fh(); // fh=fiber holder //// Collect available galaxies <-> tilefibers -------------------- // HTM Tree of galaxies const double MinTreeSize = 0.01; init_time_at(time,"# Start building HTM tree",t); htmTree<struct target> T(M,MinTreeSize); print_time(time,"# ... took :");//T.stats(); init_time_at(time,"# collect galaxies at ",t); // For plates/fibers, collect available galaxies; done in parallel collect_galaxies_for_all(M,T,P,pp,F); print_time(time,"# ... took :");//T.stats(); init_time_at(time,"# collect available tile-fibers at",t); // For each galaxy, computes available tilefibers G[i].av_tfs = [(j1,k1),(j2,k2),..] collect_available_tilefibers(M,P,F); //results_on_inputs("doc/figs/",G,P,F,true); //// Assignment ||||||||||||||||||||||||||||||||||||||||||||||||||| printf(" Nplate %d Ngal %d Nfiber %d \n", F.Nplate, F.Ngal, F.Nfiber); Assignment A(M,F); print_time(t,"# Start assignment at : "); std::cout.flush(); // Make a plan ---------------------------------------------------- // Plans whole survey without sky fibers, standard stars // assumes maximum number of observations needed for QSOs, LRGs simple_assign(M,P,pp,F,A); //check to see if there are tiles with no galaxies //need to keep mapping of old tile list to new tile list //and inverse map A.inv_order=initList(F.Nplate,-1); int inv_count=0; for (int j=0;j<F.Nplate ;++j){ bool not_done=true; for(int k=0;k<F.Nfiber && not_done;++k){ if(A.TF[j][k]!=-1){ A.suborder.push_back(j);//suborder[jused] is jused-th used plate not_done=false; A.inv_order[j]=inv_count;//inv_order[j] is -1 unless used inv_count++; //and otherwise the position of plate j in list of used plates } } } F.NUsedplate=A.suborder.size(); printf(" Plates actually used %d \n",F.NUsedplate); if(F.diagnose)diagnostic(M,Secret,F,A); print_hist("Unused fibers",5,histogram(A.unused_fbp(pp,F),5),false); // Hist of unused fibs // Smooth out distribution of free fibers, and increase the number of assignments for (int i=0; i<1; i++) redistribute_tf(M,P,pp,F,A,0);// more iterations will improve performance slightly for (int i=0; i<3; i++) { improve(M,P,pp,F,A,0); redistribute_tf(M,P,pp,F,A,0); } print_hist("Unused fibers",5,histogram(A.unused_fbp(pp,F),5),false); //try assigning SF and SS before real time assignment for (int jused=0;jused<F.NUsedplate;++jused){ int j=A.suborder[jused]; assign_sf_ss(j,M,P,pp,F,A); // Assign SS and SF for each tile assign_unused(j,M,P,pp,F,A); } if(F.diagnose)diagnostic(M,Secret,F,A); init_time_at(time,"# Begin real time assignment",t); //Execute plan, updating targets at intervals for(int i=0;i<F.pass_intervals.size();i++){ printf(" i=%d interval %d \n",i,F.pass_intervals[i]); std::cout.flush(); } std::vector <int> update_intervals=F.pass_intervals; update_intervals.push_back(F.NUsedplate);//to end intervals at last plate for(int i=0;i<update_intervals.size();++i){ printf("i %d update_interval %d\n",i, update_intervals[i]); } for(int i=0;i<update_intervals.size()-1;++i){//go plate by used plate int starter=update_intervals[i]; //printf(" beginning at %d\n",starter); //std::cout.flush(); for (int jused=starter; jused<update_intervals[i+1]; jused++) { //printf(" jused %d\n",jused); //std::cout.flush(); if (0<=jused-F.Analysis) { update_plan_from_one_obs(jused,Secret,M,P,pp,F,A); //printf(" 2 jused %d\n",jused); //std::cout.flush(); } else printf("\n no update\n"); // Update corrects all future occurrences of wrong QSOs etc and tries to observe something else } redistribute_tf(M,P,pp,F,A,starter); improve(M,P,pp,F,A,starter); redistribute_tf(M,P,pp,F,A,starter); if(F.diagnose)diagnostic(M,Secret,F,A); } // check on SS and SF List SS_hist=initList(11,0); List SF_hist=initList(41,0); for(int jused=0;jused<F.NUsedplate;++jused){ int j=A.suborder[jused]; for (int p=0;p<F.Npetal;++p){ int count_SS=0; int count_SF=0; for (int k=0;k<F.Nfbp;++k){ int kk=pp.fibers_of_sp[p][k]; int g=A.TF[j][kk]; if(g!=-1 && M[g].SS)count_SS++; if(g!=-1 && M[g].SF)count_SF++; } SS_hist[count_SS]++; SF_hist[count_SF]++; } } printf(" SS distribution \n"); for(int i=0;i<10;i++)printf("%8d",SS_hist[i]); printf("\n %8d \n",SS_hist[10]); printf(" SF distribution \n"); for(int i=0;i<10;i++)printf("%8d",SF_hist[i]); printf("\n"); for(int i=10;i<20;i++)printf("%8d",SF_hist[i]); printf("\n"); for(int i=20;i<30;i++)printf("%8d",SF_hist[i]); printf("\n"); for(int i=30;i<40;i++)printf("%8d",SF_hist[i]); printf("\n %8d \n",SF_hist[40]); // Results ------------------------------------------------------- if (F.PrintAscii) for (int jused=0; jused<F.NUsedplate; jused++){ write_FAtile_ascii(A.suborder[jused],F.outDir,M,P,pp,F,A); } if (F.PrintFits) for (int jused=0; jused<F.NUsedplate; jused++){ fa_write(A.suborder[jused],F.outDir,M,P,pp,F,A); // Write output } display_results("doc/figs/",Secret,M,P,pp,F,A,true); if (F.Verif) A.verif(P,M,pp,F); // Verification that the assignment is sane print_time(t,"# Finished !... in"); return(0); }
int main(void) { int retval; timer_t t = 0; struct itimerspec ispec; struct itimerspec ospec; struct sigaction sa; struct sched_param sched; retval = mlockall(MCL_CURRENT|MCL_FUTURE); if (retval) { perror("mlockall(MCL_CURRENT|MCL_FUTURE) failed"); } assert(retval == 0); sched.sched_priority = 2; retval = sched_setscheduler(0, SCHED_FIFO, &sched); if (retval) { perror("sched_setscheduler(SCHED_FIFO)"); } assert(retval == 0); sa.sa_sigaction = alrm_handler; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); if (sigaction(SIGALRM, &sa, NULL)) { perror("sigaction failed"); exit(1); } if (sigaction(SIGRTMIN, &sa, NULL)) { perror("sigaction failed"); exit(1); } retval = timer_create(CLOCK_REALTIME, NULL, &t); if (retval) { perror("timer_create(CLOCK_REALTIME) failed"); } assert(retval == 0); retval = clock_gettime(CLOCK_REALTIME, &ispec.it_value); if (retval) { perror("clock_gettime(CLOCK_REALTIME) failed"); } ispec.it_value.tv_sec += 1; ispec.it_value.tv_nsec = 0; ispec.it_interval.tv_sec = 0; ispec.it_interval.tv_nsec = 10*1000*1000; /* 100 Hz */ retval = timer_settime(t, TIMER_ABSTIME, &ispec, &ospec); if (retval) { perror("timer_settime(TIMER_ABSTIME) failed"); } do { pause(); } while (ijit < NOF_JITTER); retval = timer_delete(t); if (retval) { perror("timer_delete(existing timer) failed"); } assert(retval == 0); print_hist(); print_avg(); return 0; }
/*parseinput: Shell Input Parser, gets instructions Returns: 0 if exiting the shell, 1 if returning to shell */ int parseinput(char *buf) { if (strcmp(buf, "\n") == 0) { return 1; } else if (strcmp(buf, "exit\n") == 0) { return 0; } else { push_hist(buf); char *cmd; char *arguments[22]; //Creates the argv array arguments[21] = NULL; //Initializes the 21st argument to be NULL for error checking char *pch; int i = 1; cmd = strtok (buf," \n"); arguments[0] = cmd; /*Build the arguments array*/ do { pch = strtok (NULL, " \n "); arguments[i] = pch; i++; } while ((pch != NULL) && (i < 22)); /*If there are over 20 arguments, then 21st argument is not NULL, throw error and return to shell*/ if (arguments[21] != NULL) { printf("error: Too many arguments.\n"); return 1; } /*Determine which instruction was called and call appropriate function*/ if (strcmp(cmd, "path") == 0) { // When there isn't any arguments then print the PATH if (arguments[1] == NULL) { printPath(); } else if (arguments[2] == NULL) // To handle case of null argument after path + { printf("error: No path input.\n"); } else if (strcmp(arguments[1], "+") == 0) { addPath(arguments[2]); } else if (strcmp(arguments[1], "-") == 0) { removePath(arguments[2]); } // When there's any arguments other than + and -, print the PATH else { printPath(); } } else if (strcmp(cmd, "cd") == 0) { cd(arguments); } else if (strcmp(cmd, "history") == 0) { print_hist(); } else if (strncmp(cmd, "!", 1) == 0) { if ((strlen(cmd) > 4)|(strlen(cmd) < 1)) { printf("Command not found.\n"); } else { int n = n_convert(cmd); if (n != 0) { call_hist(n); } else { printf("Command not found.\n"); } } } else { open (cmd, arguments); } } return 1; }
/* * メインタスク */ void main_task(intptr_t exinf) { uint_t i, j; syslog_0(LOG_NOTICE, "Performance evaluation program (5)"); init_hist(1); init_hist(2); init_hist(3); init_hist(4); init_hist(5); init_hist(6); /* * 繰り返し計測 */ for (j = 0; j < NO_MEASURE / 10; j++) { /* * アラームハンドラ0短い時間で動作開始 * * 性能評価中に高分解能タイマが再設定されるのを避けるため. */ sta_alm(ALM0, ALM_RELTIM0); /* * 30個のアラームハンドラを長い時間で動作開始 */ begin_measure(1); for (i = 0; i < 30; i++) { sta_alm(alarm1_list[i], ALM_RELTIM1); } end_measure(1); /* * 30個のアラームハンドラを中間の時間で動作開始 */ begin_measure(2); for (i = 0; i < 30; i++) { sta_alm(alarm2_list[i], ALM_RELTIM2); } end_measure(2); /* * 30個のアラームハンドラを短い時間で動作開始 */ begin_measure(3); for (i = 0; i < 30; i++) { sta_alm(alarm3_list[i], ALM_RELTIM3); } end_measure(3); /* * 短い時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(6); for (i = 0; i < 30; i++) { stp_alm(alarm3_list[i]); } end_measure(6); /* * 中間の時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(5); for (i = 0; i < 30; i++) { stp_alm(alarm2_list[29 - i]); /* 逆順で動作停止 */ } end_measure(5); /* * 長い時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(4); for (i = 0; i < 30; i++) { stp_alm(alarm1_list[29 - i]); /* 逆順で動作停止 */ } end_measure(4); } /* * 測定結果の出力 */ syslog_0(LOG_NOTICE, "Execution times of 30 short sta_alm"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of 30 medium sta_alm"); print_hist(2); syslog_0(LOG_NOTICE, "Execution times of 30 long sta_alm"); print_hist(3); syslog_0(LOG_NOTICE, "Execution times of 30 short stp_alm"); print_hist(4); syslog_0(LOG_NOTICE, "Execution times of 30 medium stp_alm"); print_hist(5); syslog_0(LOG_NOTICE, "Execution times of 30 long stp_alm"); print_hist(6); check_finish(0); }
static void int_exit(int sig) { print_hist(map_fd[1]); exit(0); }
//reduce redistributes, updates 07/02/15 rnc int main(int argc, char **argv) { //// Initializations --------------------------------------------- srand48(1234); // Make sure we have reproducability check_args(argc); Time t, time; // t for global, time for local init_time(t); Feat F; MTL M; // Read parameters file // F.readInputFile(argv[1]); printFile(argv[1]); init_time_at(time,"# read target, SS, SF files",t); MTL Targ=read_MTLfile(F.Targfile,F,0,0); MTL SStars=read_MTLfile(F.SStarsfile,F,1,0); MTL SkyF=read_MTLfile(F.SkyFfile,F,0,1); print_time(time,"# ... took :"); //combine the three input files M=Targ; printf(" Target size %d \n",M.size()); M.insert(M.end(),SStars.begin(),SStars.end()); printf(" Standard Star size %d \n",M.size()); M.insert(M.end(),SkyF.begin(),SkyF.end()); printf(" Sky Fiber size %d \n",M.size()); F.Ngal = M.size(); assign_priority_class(M); std::vector <int> count_class(M.priority_list.size(),0); for(int i;i<M.size();++i){ if(!M[i].SS&&!M[i].SF){ count_class[M[i].priority_class]+=1; } } for(int i;i<M.priority_list.size();++i){ printf(" class %d number %d\n",i,count_class[i]); } print_time(time,"# ... took :"); // fiber positioners PP pp; pp.read_fiber_positions(F); F.Nfiber = pp.fp.size()/2; F.Npetal = max(pp.spectrom)+1; F.Nfbp = (int) (F.Nfiber/F.Npetal);// fibers per petal = 500 pp.get_neighbors(F); pp.compute_fibsofsp(F); //P is original list of plates Plates P = read_plate_centers(F); F.Nplate=P.size(); printf("# Read %s plate centers from %s and %d fibers from %s\n",f(F.Nplate).c_str(),F.tileFile.c_str(),F.Nfiber,F.fibFile.c_str()); // Computes geometries of cb and fh: pieces of positioner - used to determine possible collisions F.cb = create_cb(); // cb=central body F.fh = create_fh(); // fh=fiber holder //// Collect available galaxies <-> tilefibers -------------------- // HTM Tree of galaxies const double MinTreeSize = 0.01; init_time_at(time,"# Start building HTM tree",t); htmTree<struct target> T(M,MinTreeSize); print_time(time,"# ... took :");//T.stats(); init_time_at(time,"# collect galaxies at ",t); // For plates/fibers, collect available galaxies; done in parallel P[plate j].av_gal[k]=[g1,g2,..] collect_galaxies_for_all(M,T,P,pp,F); print_time(time,"# ... took :");//T.stats(); init_time_at(time,"# collect available tile-fibers at",t); // For each galaxy, computes available tilefibers G[i].av_tfs = [(j1,k1),(j2,k2),..] collect_available_tilefibers(M,P,F); //results_on_inputs("doc/figs/",G,P,F,true); //// Assignment ||||||||||||||||||||||||||||||||||||||||||||||||||| printf(" Nplate %d Ngal %d Nfiber %d \n", F.Nplate, F.Ngal, F.Nfiber); Assignment A(M,F); // Make a plan ---------------------------------------------------- print_time(t,"# Start assignment at : "); simple_assign(M,P,pp,F,A); //check to see if there are tiles with no galaxies //need to keep mapping of old tile list to new tile list //and inverse map A.inv_order=initList(F.Nplate,-1); int inv_count=0; for (int j=0;j<F.Nplate ;++j){ bool not_done=true; for(int k=0;k<F.Nfiber && not_done;++k){ if(A.TF[j][k]!=-1){ A.suborder.push_back(j);//suborder[jused] is jused-th used plate not_done=false; A.inv_order[j]=inv_count;//inv_order[j] is -1 unless used inv_count++; } } } F.NUsedplate=A.suborder.size(); printf(" Plates actually used %d \n",F.NUsedplate); //for(int i=0;i<F.NUsedplate;i++)printf(" jused %d j %d\n",i,A.suborder[i]); print_hist("Unused fibers",5,histogram(A.unused_fbp(pp,F),5),false); // Hist of unused fibs // Smooth out distribution of free fibers, and increase the number of assignments for (int i=0; i<1; i++) redistribute_tf(M,P,pp,F,A,0);// more iterations will improve performance slightly for (int i=0; i<3; i++) { improve(M,P,pp,F,A,0); redistribute_tf(M,P,pp,F,A,0); } init_time_at(time,"# assign SS and SF ",t); print_hist("Unused fibers",5,histogram(A.unused_fbp(pp,F),5),false); //try assigning SF and SS before real time assignment for (int jused=0;jused<F.NUsedplate;++jused){ int j=A.suborder[jused]; assign_sf_ss(j,M,P,pp,F,A); // Assign SS and SF for each tile assign_unused(j,M,P,pp,F,A); } // Results -------------------------------------------------------*/ std::vector <int> total_used_by_class(M.priority_list.size(),0); int total_used_SS=0; int total_used_SF=0; for (int jused=0;jused<F.NUsedplate;++jused){ std::vector <int> used_by_class(M.priority_list.size(),0); int used_SS=0; int used_SF=0; int j=A.suborder[jused]; for(int k=0;k<F.Nfiber;++k){ int g=A.TF[j][k]; if(g!=-1){ if(M[g].SS){ total_used_SS++; used_SS++; } else if(M[g].SF){ used_SF++; total_used_SF++; } else{ used_by_class[M[g].priority_class]++; total_used_by_class[M[g].priority_class]++; } } } /* printf(" plate jused %5d j %5d SS %4d SF %4d",jused,j,used_SS,used_SF); for (int pr=0;pr<M.priority_list.size();++pr){ printf(" class %2d %5d",pr,used_by_class[pr]); } printf("\n"); */ } init_time_at(time,"# count SS and SF ",t); printf(" Totals SS %4d SF %4d",total_used_SS,total_used_SF); std::cout.flush(); for (int pr=0;pr<M.priority_list.size();++pr){ printf(" class %2d %5d",pr,total_used_by_class[pr]); std::cout.flush(); } printf("\n"); init_time_at(time,"# print txt files ",t); if (F.PrintAscii) for (int jused=0; jused<F.NUsedplate; jused++){ int j=A.suborder[jused]; write_FAtile_ascii(j,F.outDir,M,P,pp,F,A); } init_time_at(time,"# print fits files ",t); if (F.PrintFits) for (int jused=0; jused<F.NUsedplate; jused++){ int j=A.suborder[jused]; fa_write(j,F.outDir,M,P,pp,F,A); // Write output } /* display_results("doc/figs/",G,M,P,pp,F,A,true); if (F.Verif) A.verif(P,M,pp,F); // Verification that the assignment is sane */ print_time(t,"# Finished !... in"); return(0); }