예제 #1
0
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);
	}
}
예제 #2
0
void WalksatAlgorithm::parse_parameters(int argc,char *argv[])
{
    int i;
    int temp;

    for (i=1;i < argc;i++)
    {
	if (strcmp(argv[i],"-seed") == 0){
	    scanone(argc,argv,++i,&temp);
            seed = (unsigned int)temp;
        }
	else if (strcmp(argv[i],"-out") == 0 && i<argc-1)
	    strcpy(outfile, argv[++i]);
	else if (strcmp(argv[i],"-hist") == 0)
	    printhist = TRUE;
	else if (strcmp(argv[i],"-status") == 0)
	    status_flag = 1;
	else if (strcmp(argv[i],"-cutoff") == 0)
	    scanonell(argc,argv,++i,&cutoff);
	else if (strcmp(argv[i],"-random") == 0)
	    heuristic = RANDOM;
       	else if (strcmp(argv[i],"-novelty") == 0){
	    heuristic = NOVELTY;
	    makeflag = TRUE;
	}
	else if (strcmp(argv[i],"-rnovelty") == 0){
	    heuristic = RNOVELTY;
	    makeflag = TRUE;
	}
      else if (strcmp(argv[i],"-novelty+") == 0){
	heuristic = NOVELTY_PLUS;
	makeflag = TRUE;
      }
      else if (strcmp(argv[i],"-rnovelty+") == 0){
	heuristic = RNOVELTY_PLUS;
	makeflag = TRUE;
      }
	else if (strcmp(argv[i],"-best") == 0)
	    heuristic = BEST;
	else if (strcmp(argv[i],"-noise") == 0){
	    scanone(argc,argv,++i,&numerator);
	    if (i < argc-1 && sscanf(argv[i+1],"%i",&temp)==1){
		denominator = temp;
		i++;
	    }
	}
        else if (strcmp(argv[i],"-wp") == 0){
            scanone(argc,argv,++i,&wp_numerator);
            if (i < argc-1 && sscanf(argv[i+1],"%i",&temp)==1){
                wp_denominator = temp;
                i++;
            }
        }
	else if (strcmp(argv[i],"-init") == 0  && i < argc-1)
	    sscanf(argv[++i], " %s", initfile);
	else if (strcmp(argv[i],"-hamming") == 0  && i < argc-3){
	    sscanf(argv[++i], " %s", hamming_target_file);
	    sscanf(argv[++i], " %s", hamming_data_file);
	    sscanf(argv[++i], " %i", &hamming_sample_freq);
	    hamming_flag = TRUE;
	    numrun = 1;
	}
	else if (strcmp(argv[i],"-partial") == 0)
	    initoptions = INIT_PARTIAL;
	else if (strcmp(argv[i],"-super") == 0)
	    superlinear = TRUE;
	else if (strcmp(argv[i],"-tries") == 0 || strcmp(argv[i],"-restart") == 0)
	    scanone(argc,argv,++i,&numrun);
	else if (strcmp(argv[i],"-target") == 0)
	    scanone(argc,argv,++i,&target);
	else if (strcmp(argv[i],"-tail") == 0)
	    scanone(argc,argv,++i,&tail);
	else if (strcmp(argv[i],"-sample") == 0)
	    scanone(argc,argv,++i,&samplefreq);
	else if (strcmp(argv[i],"-tabu") == 0)
	{
	    scanone(argc,argv,++i,&tabu_length);
	    heuristic = TABU;
	}
	else if (strcmp(argv[i],"-low") == 0)
	    printlow = TRUE;
	else if (strcmp(argv[i],"-sol") == 0)
	{
	    printonlysol = TRUE;
	    printlow = TRUE;
	}
	else if (strcmp(argv[i],"-solcnf") == 0)
	{
	    printsolcnf = TRUE;
	    if (numsol == NOVALUE) numsol = 1;
	}
	else if (strcmp(argv[i],"-bad") == 0)
	    printfalse = TRUE;
	else if (strcmp(argv[i],"-numsol") == 0)
	    scanone(argc,argv,++i,&numsol);
	else if (strcmp(argv[i],"-trace") == 0)
	    scanone(argc,argv,++i,&printtrace);
	else if (strcmp(argv[i],"-assign") == 0){
	    scanone(argc,argv,++i,&printtrace);
	    trace_assign = TRUE;
	}
	else 
	{
	    fprintf(stderr, "General parameters:\n");
	    fprintf(stderr, "  -seed N -cutoff N -restart N\n");
	    fprintf(stderr, "  -numsol N = stop after finding N solutions\n");
	    fprintf(stderr, "  -super = use the Luby series for the cutoff values\n");
	    fprintf(stderr, "  -init FILE = set vars not included in FILE to false\n");
	    fprintf(stderr, "  -partial FILE = set vars not included in FILE randomly\n");
	    fprintf(stderr, "  -status = return fail status if solution not found\n");
	    fprintf(stderr, "  -target N = succeed if N or fewer clauses unsatisfied\n");
	    fprintf(stderr, "Heuristics:\n");
	    fprintf(stderr, "  -random -best -tabu N -novelty -rnovelty\n");
	    fprintf(stderr, "  -noise N or -noise N M (default M = 100)\n");
            fprintf(stderr, "  -novelty+ -rnovelty+\n");
            fprintf(stderr, "  -wp N or -wp N M (default M = 100) = cycle breaking for (r)novelty+\n");
	    fprintf(stderr, "Printing:\n");
	    fprintf(stderr, "  -out FILE = print solution as a list of literals to FILE\n");
	    fprintf(stderr, "  -trace N = print statistics every N flips\n");
	    fprintf(stderr, "  -assign N = print assignments at flip N, 2N, ...\n");
	    fprintf(stderr, "  -sol = print satisfying assignments to stdout\n");
	    fprintf(stderr, "  -solcnf = print sat assign to stdout in DIMACS format, and exit\n");
	    fprintf(stderr, "  -low = print lowest assignment each try\n");
	    fprintf(stderr, "  -bad = print unsat clauses each try\n");
	    fprintf(stderr, "  -hist = print histogram of tail\n");
	    fprintf(stderr, "  -tail N = assume tail begins at nvars*N\n");
	    fprintf(stderr, "  -sample N = sample noise level every N flips\n");
	    fprintf(stderr, "  -hamming TARGET_FILE DATA_FILE SAMPLE_FREQUENCY\n");
	    exit(-1);
	}
    }
    base_cutoff = cutoff;
    if (numsol==NOVALUE || numsol>numrun) numsol = numrun;
    if (numerator==NOVALUE){
	switch(heuristic) {
	case BEST:
	case NOVELTY:
	case RNOVELTY:
        case NOVELTY_PLUS:
        case RNOVELTY_PLUS:
	    numerator = 50;
	    break;
	default:
	    numerator = 0;
	    break;
	}
    }
  if (wp_numerator==NOVALUE){
    switch(heuristic) {
    case NOVELTY_PLUS:
    case RNOVELTY_PLUS:
      wp_numerator = 1;
      break;
    default:
      wp_numerator = 0;
      break;
    }
  }
}
예제 #3
0
int main(int argc,char *argv[])
{
    int i;			/* loop counter */
    int j;			/* another loop counter */
    int k;			/* yet another loop counter */
    char initfile[100] = { 0 };
    int numrun = 10;
    int cutoff = 100000;
    int base_cutoff = 100000;
    int printonlysol = FALSE;
    int printsolcnf = FALSE;
    int printfalse = FALSE;
    int printlow = FALSE;
    int initoptions = FALSE;
    int superlinear = FALSE;
    int printtrace = FALSE;
    long int totalflip = 0;	/* total number of flips in all tries so far */
    long int totalsuccessflip = 0; /* total number of flips in all tries which succeeded so far */
    int numtry = 0;		/* total attempts at solutions */
    int numsuccesstry = 0;	/* total found solutions */
    int numsol = 1;	        /* stop after this many tries succeeds */
    int tochange;
    int seed;			/* seed for random */
    struct timeval tv;
    struct timezone tzp;
    double expertime;
    long flips_this_solution;
    long int lowbad;		/* lowest number of bad clauses during try */
    long int lowcost;		/* lowest cost of bad clauses during try */
    int targetcost = 0;		/* the cost at which the program terminates*/
    long x;
    long integer_sum_x = 0;
    double sum_x = 0.0;
    double sum_x_squared = 0.0;
    double mean_x;
    double second_moment_x;
    double variance_x;
    double std_dev_x;
    double std_error_mean_x;
    double seconds_per_flip;
    int r;
    int sum_r = 0;
    double sum_r_squared = 0.0;
    double mean_r;
    double variance_r;
    double std_dev_r;
    double std_error_mean_r;
    int worst_cost, computed_cost;

    gettimeofday(&tv,&tzp);
    seed = (( tv.tv_sec & 0177 ) * 1000000) + tv.tv_usec;
    heuristic = BEST;
    numerator = NOVALUE;
    denominator = 100;

    for (i=1;i < argc;i++)
      {
 	  if (strcmp(argv[i],"-withcost") == 0)
	    costexpected = TRUE;
	  else if (strcmp(argv[i],"-seed") == 0)
	    scanone(argc,argv,++i,&seed);
	  else if (strcmp(argv[i],"-targetcost") == 0)
	    scanone(argc,argv,++i,&targetcost);
	  else if (strcmp(argv[i],"-cutoff") == 0)
	    scanone(argc,argv,++i,&cutoff);
	  else if (strcmp(argv[i],"-random") == 0)
	    heuristic = RANDOM;
	  else if (strcmp(argv[i],"-productsum") == 0)
	    heuristic = PRODUCTSUM;
	  else if (strcmp(argv[i],"-reciprocal") == 0)
	    heuristic = RECIPROCAL;
	  else if (strcmp(argv[i],"-additive") == 0)
	    heuristic = ADDITIVE;
	  else if (strcmp(argv[i],"-exponential") == 0)
	    heuristic = EXPONENTIAL;
	  else if (strcmp(argv[i],"-best") == 0)
	    heuristic = BEST;
	  else if (strcmp(argv[i],"-noise") == 0)
	    {
		scanone(argc,argv,++i,&numerator);
		scanone(argc,argv,++i,&denominator);
	    }
	  else if (strcmp(argv[i],"-init") == 0  && i < argc-1)
	    sscanf(argv[++i], " %s", initfile);
	  else if (strcmp(argv[i],"-partial") == 0)
	    initoptions = INIT_PARTIAL;
	  else if (strcmp(argv[i],"-super") == 0)
	    superlinear = TRUE;
	  else if (strcmp(argv[i],"-tries") == 0)
	    scanone(argc,argv,++i,&numrun);
	  else if (strcmp(argv[i],"-tabu") == 0)
	    {
		scanone(argc,argv,++i,&tabu_length);
		heuristic = TABU;
	    }
	  else if (strcmp(argv[i],"-low") == 0)
	    printlow = TRUE;
	  else if (strcmp(argv[i],"-sol") == 0)
	    {
		printonlysol = TRUE;
		printlow = TRUE;
	    }
	  else if (strcmp(argv[i],"-bad") == 0)
	    printfalse = TRUE;
	  else if (strcmp(argv[i],"-hard") == 0)
	    hard = TRUE;
	  else if (strcmp(argv[i],"-numsol") == 0)
	    scanone(argc,argv,++i,&numsol);
	  else if (strcmp(argv[i],"-trace") == 0)
	    scanone(argc,argv,++i,&printtrace);
	  else 
	    {
		fprintf(stderr, "Bad argument %s\n", argv[i]);
		fprintf(stderr, "General parameters:\n");
		fprintf(stderr, "  -seed N -cutoff N -tries N\n");
		fprintf(stderr, "  -numsol N = stop after finding N solutions\n");
		fprintf(stderr, "  -init FILE = set vars not included in FILE to false\n");
		fprintf(stderr, "  -partial FILE = set vars not included in FILE randomly\n");
		fprintf(stderr, "  -withcost = input is a set of weighted clauses\n");
		fprintf(stderr, "  -targetcost N = find assignments of cost <= N (MAXSAT)\n");
		fprintf(stderr, "  -hard = never break a highest-cost clause\n");
		fprintf(stderr, "Heuristics:\n");
		fprintf(stderr, "  -noise N M -best -super -tabu N\n");
		fprintf(stderr, "  -productsum -reciprocal -additive -exponential\n");
		fprintf(stderr, "Printing:\n");
		fprintf(stderr, "  -trace N = print statistics every N flips\n");
		fprintf(stderr, "  -sol = print assignments where cost < target\n");
		fprintf(stderr, "  -low = print lowest assignment each try\n");
		fprintf(stderr, "  -bad = print unsat clauses each try\n");
		fprintf(stderr, "  -solcnf = print sat assign in cnf format, and exit\n");
		exit(-1);
	    }
      }
    base_cutoff = cutoff;
    if (numerator==NOVALUE){
	if (heuristic==BEST)
	  numerator = 50;
	else
	  numerator = 0;
    }

    srandom(seed);
#ifdef Huge
    printf("maxwalksat version 20 (Huge)\n");
#else
    printf("maxwalksat version 20\n");
#endif
    printf("seed = %i\n",seed);
    printf("cutoff = %i\n",cutoff);
    printf("tries = %i\n",numrun);
    printf("numsol = %i\n",numsol);
    printf("targetcost = %i\n",targetcost);

    printf("heuristic = ");

    switch(heuristic)
      {
	case RANDOM:
	  printf("random");
	  break;
	case PRODUCTSUM:
	  printf("productsum");
	  break;
	case RECIPROCAL:
	  printf("reciprocal");
	  break;
	case ADDITIVE:
	  printf("additive");
	  break;
	case BEST:
	  printf("best");
	  break;
	case EXPONENTIAL:
	  printf("exponential");
	  break;
	case TABU:
	  printf("tabu %d", tabu_length);
	  break;
      }
    if (numerator>0){
	printf(", noise %d / %d", numerator, denominator);
    }
    if (superlinear)
      printf(", super");
    if (printtrace)
      printf(", trace %d", printtrace);
    if (initfile[0]){
	printf(", init %s", initfile);
	if (initoptions == INIT_PARTIAL)
	  printf(", partial");
    }
    printf("\n");
    
    initprob();

    if (costexpected) printf("clauses contain explicit costs\n");
    else printf("clauses all assigned default cost of 1\n");

    printf("numatom = %i, numclause = %i, numliterals = %i\n",numatom,numclause,numliterals);
    printf("wff read in\n");
    printf("                                           average             average       mean              standard\n");
    printf("    lowest     worst    number                when                over      flips                 error\n");
    printf("      cost    clause    #unsat    #flips     model   success       all      until        std         of\n");
    printf("  this try  this try  this try  this try     found      rate     tries     assign        dev       mean\n");

    signal(SIGINT, (void *) handle_interrupt);
    abort_flag = FALSE;
    numnullflip = 0;
    (void) elapsed_seconds();
    x = 0; r = 0;
    lowcost = BIG;
    for(k = 0;k < numrun;k++)
      {
	  init(initfile, initoptions);
	  lowbad = numfalse; 
	  lowcost = costofnumfalse;
	  save_low_assign();
	  numflip = 0;

	  if (superlinear) cutoff = base_cutoff * super(r+1);

	  while((numflip < cutoff) && (costofnumfalse > targetcost))
	    {
		if (printtrace && (numflip % printtrace == 0)){
		    printf("%10i          %10i%10li\n", costofnumfalse,numfalse,numflip);
		    fflush(stdout);
		}
		numflip++;
                if ((eqhighest) && (highestcost!=1))
                {/* fprintf(stderr, "number of highest %i\n", numhighest);*/ 	
			fix(selecthigh(1+random()%numhighest));
                }
		else fix(false[random()%numfalse]);
	        if (costofnumfalse < lowcost)
	        {
		    lowcost = costofnumfalse;
		    lowbad = numfalse;
		    save_low_assign();
		}
	    }
	  numtry++;
	  totalflip += numflip;
	  x += numflip;
	  r ++;
	  if(costofnumfalse<=targetcost)
	    {
		numsuccesstry++;
		totalsuccessflip += numflip;
		integer_sum_x += x;
		sum_x = (double) integer_sum_x;
		sum_x_squared += ((double)x)*((double)x);
		mean_x = sum_x / numsuccesstry;
		if (numsuccesstry > 1){
		    second_moment_x = sum_x_squared / numsuccesstry;
		    variance_x = second_moment_x - (mean_x * mean_x);
		    /* Adjustment for small small sample size */
		    variance_x = (variance_x * numsuccesstry)/(numsuccesstry - 1);
		    std_dev_x = sqrt(variance_x);
		    std_error_mean_x = std_dev_x / sqrt((double)numsuccesstry);
		}
		sum_r += r;
		mean_r = ((double)sum_r)/numsuccesstry;
		sum_r_squared += ((double)r)*((double)r);
		x = 0;
		r = 0;
	    }

	  countlowunsatcost(&computed_cost, &worst_cost);
	  if(lowcost != computed_cost)
	    {
		fprintf(stderr, "Program error, verification of assignment cost fails!\n");
		exit(-1);
	    }

	  if(numsuccesstry == 0)
	    printf("%10i%10i%10i%10li         *         0         *          *          *          *\n",
		   lowcost,worst_cost,lowbad,numflip);
	  else if (numsuccesstry == 1)
	    printf("%10i%10i%10i%10li%10li%10i%10li %10.1f          *          *\n",
		   lowcost,worst_cost,lowbad,numflip,totalsuccessflip/numsuccesstry,
		   (numsuccesstry*100)/numtry,totalflip/numsuccesstry,
		   mean_x);
	  else
	    printf("%10i%10i%10i%10li%10li%10i%10li %10.1f %10.1f %10.1f\n",
		   lowcost,worst_cost,lowbad,numflip,totalsuccessflip/numsuccesstry,
		   (numsuccesstry*100)/numtry,totalflip/numsuccesstry,
		   mean_x, std_dev_x, std_error_mean_x);
	  if (numfalse>0 && printfalse)
	    print_false_clauses_cost(lowbad);
	  if (printlow && (!printonlysol || costofnumfalse<=targetcost))
	    print_low_assign(lowcost);

	  if (numsuccesstry >= numsol) break;
	  if (abort_flag) break;
	  fflush(stdout);
      }
    expertime = elapsed_seconds();
    seconds_per_flip = expertime / totalflip;
    printf("\ntotal elapsed seconds = %f\n", expertime);
    printf("average flips per second = %d\n", (long)(totalflip/expertime));
    if (heuristic == TABU)
      printf("proportion null flips = %f\n", ((double)numnullflip)/totalflip);
    printf("number of solutions found = %d\n", numsuccesstry);
    if (numsuccesstry > 0)
      {
	  printf("mean flips until assign = %f\n", mean_x);
	  if (numsuccesstry>1){
	      printf("  variance = %f\n", variance_x);
	      printf("  standard deviation = %f\n", std_dev_x);
	      printf("  standard error of mean = %f\n", std_error_mean_x);
	  }
	  printf("mean seconds until assign = %f\n", mean_x * seconds_per_flip);
	  if (numsuccesstry>1){
	      printf("  variance = %f\n", variance_x * seconds_per_flip * seconds_per_flip);
	      printf("  standard deviation = %f\n", std_dev_x * seconds_per_flip);
	      printf("  standard error of mean = %f\n", std_error_mean_x * seconds_per_flip);
	  }
	  printf("mean restarts until assign = %f\n", mean_r);
	  if (numsuccesstry>1){
	      variance_r = (sum_r_squared / numsuccesstry) - (mean_r * mean_r);
	      variance_r = (variance_r * numsuccesstry)/(numsuccesstry - 1);	   
	      std_dev_r = sqrt(variance_r);
	      std_error_mean_r = std_dev_r / sqrt((double)numsuccesstry);
	      printf("  variance = %f\n", variance_r);
	      printf("  standard deviation = %f\n", std_dev_r);
	      printf("  standard error of mean = %f\n", std_error_mean_r);
	  }
      }

    if (numsuccesstry > 0)
      {
	  printf("ASSIGNMENT ACHIEVING TARGET %i FOUND\n", targetcost);
	  if(printsolcnf == TRUE)
	    for(i = 1;i < numatom+1;i++)
	      printf("v %i\n", atom[i] == 1 ? i : -i);
      }
    else
      printf("ASSIGNMENT NOT FOUND\n");
    return 0;
}