double read_double(char *prompt, char *unit, double def, double min, double max) { if (min > max) { double tmp = min; min = max; max = tmp; } if (def < min) def = min; if (def > max) def = max; double doppio; short esito; short failed = 0; for (int timeout = 0; timeout <= 5; timeout++) { fprintf(FPTR, "%s ", prompt); if (failed) fprintf(FPTR, "(%.4f::%.4f) ", min, max); fprintf(FPTR, "[%.4f%s] > ", def, unit); esito = scandouble(&doppio); switch (esito) { case EASYIO_DEFAULT : return (def); case EASYIO_OKAY : if ((doppio >= min) && (doppio <= max)) return (doppio); case EASYIO_ERROR : beep(); failed = 1; break; } } fprintf(FPTR, "\n FATAL ERROR: too many wrong attempts "); fprintf(FPTR, "in read_double() \n"); exit(-1); return (false); // not used: just to be nice with the compiler }
void ProblemReader::parse_parameters(int argc,char *argv[]){ int i,tmp; assignmentManager->M_MPE = false; assignmentManager->optimalLogMPEValue = DOUBLE_BIG; network_filename[0] = '\0'; sls_filename[0] = '\0'; for (i=1;i < argc;i++){ if (strcmp(argv[i],"-i") == 0 || strcmp(argv[i],"--input") == 0){ i++; strncpy( network_filename, argv[i], strlen( argv[i] ) ); } else if (strcmp(argv[i],"-o") == 0 || strcmp(argv[i],"--output") == 0){ i++; strncpy( sls_filename, argv[i], strlen( argv[i] ) ); } else if (strcmp(argv[i],"--inputType") == 0) scanone(argc,argv,++i,&inputType); else if (strcmp(argv[i],"-x") == 0 || strcmp(argv[i],"--maxRuns") == 0) scanone(argc,argv,++i,&maxRuns); else if (strcmp(argv[i],"-s") == 0 || strcmp(argv[i],"--seed")==0) scanlongint(argc,argv,++i,&seed); else if (strcmp(argv[i],"-t") == 0 || strcmp(argv[i],"--maxTime") == 0) scandouble(argc,argv,++i,&maxTime); else if (strcmp(argv[i],"-z") == 0 || strcmp(argv[i],"--maxSteps") == 0) scanlongint(argc,argv,++i,&maxSteps); else if (strcmp(argv[i],"-it") == 0 || strcmp(argv[i],"--maxIterations") == 0) scanone(argc,argv,++i,&maxIterations); else if (strcmp(argv[i],"-a") == 0 || strcmp(argv[i],"--algo") == 0) scanone(argc,argv,++i,&algo); else if (strcmp(argv[i],"-c") == 0 || strcmp(argv[i],"--caching") == 0) scanone(argc,argv,++i,&caching); else if (strcmp(argv[i],"-b") == 0 || strcmp(argv[i],"--init") == 0) scanone(argc,argv,++i,&init_algo); else if (strcmp(argv[i],"-pert") == 0) scanone(argc,argv,++i,&pertubationType); else if (strcmp(argv[i],"-tmult") == 0) scandouble(argc,argv,++i,&tmult); else if (strcmp(argv[i],"-tdiv") == 0) scandouble(argc,argv,++i,&tdiv); else if (strcmp(argv[i],"-tmin") == 0) scandouble(argc,argv,++i,&tmin); else if (strcmp(argv[i],"-tbase") == 0) scandouble(argc,argv,++i,&tbase); else if (strcmp(argv[i],"-T") == 0) scandouble(argc,argv,++i,&T); else if (strcmp(argv[i],"-mmpe") == 0){ assignmentManager->M_MPE = true; scanone(argc,argv,++i,&assignmentManager->M); } else if (strcmp(argv[i],"-onlyConvertToBNT") == 0){ onlyConvertToBNT = true; sscanf(argv[++i],"%s", bntFileAndFunctionName); } else if (strcmp(argv[i],"-nvns") == 0) scanone(argc,argv,++i,&num_vns_pertubation_strength); else if (strcmp(argv[i],"-mbp") == 0){ scanone(argc,argv,++i,&mbPertubation ); } else if (strcmp(argv[i],"-vns") == 0){ scanone(argc,argv,++i,&tmp); vns = (tmp!=0); } else if (strcmp(argv[i],"-rf") == 0) scanone(argc,argv,++i,&restartNumFactor); else if (strcmp(argv[i],"-pfix") == 0){ scanone(argc,argv,++i,&tmp); pertubationFixVars = (tmp!=0); } else if (strcmp(argv[i],"-pspb") == 0) scandouble(argc,argv,++i,&psp_base); else if (strcmp(argv[i],"-psab") == 0) scandouble(argc,argv,++i,&psa_base); else if (strcmp(argv[i],"-p") == 0 || strcmp(argv[i],"--pertubationStrength") == 0) { scanone(argc,argv,++i,&pertubation_strength); } else if (strcmp(argv[i],"-tl") == 0) scanone(argc,argv,++i,&tl); else if (strcmp(argv[i],"-prel") == 0 || strcmp(argv[i],"--pertubationStrengthRelative") == 0){ scanone(argc,argv,++i,&tmp); pertubation_rel = (tmp!=0); } //=== Acceptance criterion. else if (strcmp(argv[i],"-acc") == 0 || strcmp(argv[i],"--acceptCrit") == 0) scanone(argc,argv,++i,&accCriterion); // else if (strcmp(argv[i],"-rint") == 0 || strcmp(argv[i],"--restartInterval") == 0) // scanone(argc,argv,++i,&restartInterval); else if (strcmp(argv[i],"-wint") == 0 || strcmp(argv[i],"--worseningInterval") == 0) scandouble(argc,argv,++i,&worseningInterval); else if (strcmp(argv[i],"-an") == 0 || strcmp(argv[i],"--acceptNoise") == 0) scandouble(argc,argv,++i,&accNoise); else if (strcmp(argv[i],"-pB") == 0 || strcmp(argv[i],"--prepBound") == 0) scandouble(argc,argv,++i,&preprocessingSizeBound); else if (strcmp(argv[i],"-mw") == 0 || strcmp(argv[i],"--maxMBWeight") == 0) scandouble(argc,argv,++i,&maxMBWeight); else if (strcmp(argv[i],"-glsInc") == 0) scandouble(argc,argv,++i,&glsPenaltyIncrement); else if (strcmp(argv[i],"-glsSmooth") == 0) scandouble(argc,argv,++i,&glsSmooth); else if (strcmp(argv[i],"-glsInterval") == 0) scanone(argc,argv,++i,&glsInterval); else if (strcmp(argv[i],"-glsPenMult") == 0) scandouble(argc,argv,++i,&glsPenaltyMultFactor); else if (strcmp(argv[i],"-glsReal") == 0) scanone(argc,argv,++i,&glsReal); else if (strcmp(argv[i],"-glsAspiration") == 0) scanone(argc,argv,++i,&glsAspiration); else if (strcmp(argv[i],"-noout") == 0) noout = 1; else if (strcmp(argv[i],"-res") == 0){ output_res = TRUE; i++; strncpy( res_filename, argv[i], strlen( argv[i] ) ); } else if (strcmp(argv[i],"-opt") == 0 || strcmp(argv[i],"--optimalLogMPE") == 0) scandouble(argc,argv,++i,&assignmentManager->optimalLogMPEValue); else if (strcmp(argv[i],"-n") == 0 || strcmp(argv[i],"--noise") == 0) scanone(argc,argv,++i,&noise); else if (strcmp(argv[i],"-cf") == 0 || strcmp(argv[i],"--cutoff") == 0) scandouble(argc,argv,++i,&cutoff); else if (strcmp(argv[i],"-stdout") == 0) output_to_stdout=1; else if (strcmp(argv[i],"-lm") == 0){ output_lm = TRUE; maxRuns = 20; } else if (strcmp(argv[i],"-stats") == 0) justStats = true; else if (strcmp(argv[i],"-traj") == 0){ output_trajectory = 1; // maxRuns = 1; } else if (strcmp(argv[i],"-runstats") == 0){ output_runstats = 1; maxIterations = 100; } else if (strcmp(argv[i],"-params") == 0){ print_tunable_parameters(); exit(0); } else if (strcmp(argv[i],"--help")==0 || strcmp(argv[i],"-h")==0 ){ print_help(); exit(0); } else{ if(i==argc-1 && strcmp(argv[i],"&") == 0) continue; fprintf(stderr, "=========================\nBad argument %s\n", argv[i]); fprintf(stderr, "USAGE:\n\n"); print_help(); exit(-1); } } if(argc <= 1){ fprintf(stderr, "USAGE:\n\n"); print_help(); exit(-1); } if(network_filename[0] == '\0') { fprintf(stderr, "You must specifiy a BN input file in .simple format using -i <network_filename>\n"); exit(-1); } int j,k; for(j=strlen( network_filename )-1; network_filename[j] != '.'; j--); // find last . in network_filename if(sls_filename[0] == '\0') { for(i=0; i<=j; i++){ sls_filename[i] = network_filename[i]; } k=j; sls_filename[++k] = 's'; sls_filename[++k] = 'l'; sls_filename[++k] = 's'; sls_filename[++k] = '\0'; outfile = stdout; } else { outfile = fopen(sls_filename, "w"); } for(j=strlen( sls_filename )-1; sls_filename[j] != '.'; j--); // find last . in network_filename for(i=0; i<=j; i++){ traj_it_filename[i] = sls_filename[i]; traj_fl_filename[i] = sls_filename[i]; } k=j; traj_it_filename[++k] = 't'; traj_it_filename[++k] = 'r'; traj_it_filename[++k] = 'a'; traj_it_filename[++k] = 'j'; traj_it_filename[++k] = 'i'; traj_it_filename[++k] = 't'; traj_it_filename[++k] = '\0'; k=j; traj_fl_filename[++k] = 't'; traj_fl_filename[++k] = 'r'; traj_fl_filename[++k] = 'a'; traj_fl_filename[++k] = 'j'; traj_fl_filename[++k] = 'f'; traj_fl_filename[++k] = 'l'; traj_fl_filename[++k] = '\0'; if( output_trajectory ) traj_it_file = fopen(traj_it_filename, "w"); if( output_trajectory ) traj_fl_file = fopen(traj_fl_filename, "w"); if( output_res ) resfile = fopen(res_filename, "w"); /* if(algo == ALGO_GLS && (caching == CACHING_GOOD_VARS || caching == CACHING_SCORE)){ printf("caching scheme %d not supported for GLS. Too complicated. Using scheme 2\n", caching); //exit(-1); caching = CACHING_INDICES; }*/ if(algo == ALGO_TABU && caching == CACHING_GOOD_VARS){ printf("Cannot use caching scheme CACHING_GOOD_VARS with tabu search.\n"); printf("There, we also need to take worsening steps.\n"); exit(-1); } }