void compare_functionals(const Functional &f1, const Functional &f2,
                         double kT, const Grid &n, double fraccuracy = 1e-15,
                         double x = 0.001, double fraccuracydoub = 1e-15) {
  printf("\n************");
  for (unsigned i=0;i<f1.get_name().size();i++) printf("*");
  printf("\n* Testing %s *\n", f1.get_name().c_str());
  for (unsigned i=0;i<f1.get_name().size();i++) printf("*");
  printf("************\n\n");

  printf("First energy:\n");
  double f1n = f1.integral(kT, n);
  print_double("first energy is:               ", f1n);
  printf("\n");
  f1.print_summary("", f1n, f1.get_name().c_str());
  printf("Second energy:\n");
  double f2n = f2.integral(kT, n);
  print_double("second energy is:              ", f2n);
  printf("\n");
  f2.print_summary("", f2n, f2.get_name().c_str());
  if (fabs(f1n/f2n - 1) > fraccuracy) {
    printf("E1 = %g\n", f1n);
    printf("E2 = %g\n", f2n);
    printf("FAIL: Error in f(n) is %g\n", f1n/f2n - 1);
    errors++;
  }
  Grid gr1(gd), gr2(gd);
  gr1.setZero();
  gr2.setZero();
  f1.integralgrad(kT, n, &gr1);
  f2.integralgrad(kT, n, &gr2);
  double err = (gr1-gr2).cwise().abs().maxCoeff();
  double mag = gr1.cwise().abs().maxCoeff();
  if (err/mag > fraccuracy) {
    printf("FAIL: Error in grad %s is %g as a fraction of %g\n", f1.get_name().c_str(), err/mag, mag);
    errors++;
  }
  errors += f1.run_finite_difference_test(f1.get_name().c_str(), kT, n);

  double f1x = f1(kT, x);
  double f2x = f2(kT, x);
  if (1 - fabs(f1x/f2x) > fraccuracydoub) {
    printf("FAIL: Error in double %s is %g as a fraction of %g\n", f1.get_name().c_str(),
           1 - fabs(f1x/f2x), f2x);
    errors++;
  }
  
  double f1p = f1.derive(kT, x);
  double f2p = f2.derive(kT, x);
  if (1 - fabs(f1p/f2p) > fraccuracydoub) {
    printf("FAIL: Error in derive double %s is %g as a fraction of %g\n", f1.get_name().c_str(),
           1 - fabs(f1p/f2p), f2p);
    errors++;
  }
  
  //errors += f2.run_finite_difference_test("other version", n);
}
void HeatControl2Delta::main()
{
    HeatControl2Delta hc(100, 100, 100);

    hc.O.resize(2*hc.L);
    hc.O[0] = 0.50;
    hc.O[1] = 0.80;
    hc.O[2] = 0.70;
    hc.O[3] = 0.20;
    hc.O[4] = 0.20;
    hc.O[5] = 0.30;

    hc.initialize();

    DoubleVector x(2*hc.L + (hc.M+1)*hc.L);
    x[0] = 0.60; x[1] = 0.70; x[2] = 0.65; x[3] = 0.25; x[4] = 0.25; x[5] = 0.35;

    for (unsigned int k=0; k<=hc.M; k++)
    {
        x[2*hc.L + 0*(hc.M+1) + k] = 1.0;//hc.v1(k*hc.ht);
        x[2*hc.L + 1*(hc.M+1) + k] = 1.0;//hc.v2(k*hc.ht);
        x[2*hc.L + 2*(hc.M+1) + k] = 1.0;//hc.v3(k*hc.ht);
    }

    /* Minimization */
    ConjugateGradient g2;
    g2.setFunction(&hc);
    g2.setGradient(&hc);
    g2.setEpsilon1(0.0001);
    g2.setEpsilon2(0.0001);
    g2.setEpsilon3(0.0001);
    g2.setR1MinimizeEpsilon(1.0, 0.0001);
    g2.setPrinter(&hc);
    g2.setProjection(&hc);
    g2.setNormalize(true);
    g2.calculate(x);

    DoubleVector gr1(x.length());
    IGradient::Gradient(&hc, 0.00001, x, gr1);
    gr1.L2Normalize();

    DoubleVector gr2(x.length());
    hc.gradient(x, gr2);
    gr2.L2Normalize();

    printf("J[%d]: %.16f\n", 0, hc.fx(x));
    printf("eo: [%12.8f, %12.8f] [%12.8f, %12.8f] [%12.8f, %12.8f]\n", hc.O[0], hc.O[1], hc.O[2], hc.O[3], hc.O[4], hc.O[5]);
    printf("e1: [%12.8f, %12.8f] [%12.8f, %12.8f] [%12.8f, %12.8f]\n", x[0], x[1], x[2], x[3], x[4], x[5]);
    printf("gr1: [%12.8f, %12.8f] [%12.8f, %12.8f] [%12.8f, %12.8f]\n", gr1[0], gr1[1], gr1[2], gr1[3], gr1[4], gr1[5]);
    printf("gr2: [%12.8f, %12.8f] [%12.8f, %12.8f] [%12.8f, %12.8f]\n", gr2[0], gr2[1], gr2[2], gr2[3], gr2[4], gr2[5]);
}
Exemple #3
0
void FitSignals(TTree * treeB, TCut cut, Int_t max){
  AliSignalProcesor proc;
  TF1 * f1 = proc.GetAsymGauss();
  TTreeSRedirector cstream("FitSignal.root");
  TFile *f = cstream.GetFile();

  char lname[100];
  sprintf(lname,"Fit%s", cut.GetTitle());
  TEventList *list = new TEventList(lname,lname);
  sprintf(lname,">>Fit%s", cut.GetTitle());
  treeB->Draw(lname,cut);
  treeB->SetEventList(list);
  Int_t nFits=0;
  for (Int_t ievent=0; ievent<list->GetN(); ievent++){
    if (nFits>max) break;
    if (nFits%50==0) printf("%d\n",nFits);
    char ename[100];
    sprintf(ename,"Fit%d", ievent);
    Double_t nsample = treeB->Draw("Graph.fY-Mean09:Graph.fX","","",1,ievent);
    Double_t * signal  = treeB->GetV1();
    Double_t * time  = treeB->GetV2();
    Double_t maxpos =0;
    Double_t max = 0;
    for (Int_t ipos = 0; ipos<nsample; ipos++){
      if (signal[ipos]>max){
	max    = signal[ipos];
	maxpos = ipos;
      }
    }

    Int_t first = TMath::Max(maxpos-10,0.);
    Int_t last  = TMath::Min(maxpos+60, nsample);
    //
    f->cd();
    TH1F his(ename,ename,last-first,first,last);
    for (Int_t ipos=0; ipos<last-first; ipos++){
      his.SetBinContent(ipos+1,signal[ipos+first]);
    }
    treeB->Draw("Sector:Row:Pad","","",1,ievent);
    Double_t sector = treeB->GetV1()[0];
    Double_t row    = treeB->GetV2()[0];
    Double_t pad    = treeB->GetV3()[0];
    //    TGraph  graph(last-first,&time[first],&signal[first]);
    f1->SetParameters(0.75*max,maxpos,1.1,0.8,0.25,0.2);
    //    TH1F * his = (TH1F*)graph.GetHistogram();
    his.Fit(f1,"q");
    his.Write(ename);
    gPad->Clear();
    his.Draw();
    gPad->Update();
    Double_t params[6];
    for (Int_t ipar=0; ipar<6; ipar++) params[ipar] = f1->GetParameters()[ipar];
    Double_t chi2 = TFitter::GetFitter()->Chisquare(6,params);
    TMatrixD cov(6,6);
    cov.SetMatrixArray(TFitter::GetFitter()->GetCovarianceMatrix());
    //
    // tail cancellation
    //
    Double_t x0[1000];
    Double_t x1[1000];
    Double_t x2[1000];
    for (Int_t ipos=0; ipos<last-first; ipos++){
      x0[ipos] = signal[ipos+first];
    }
    proc.TailCancelationALTRO1(x0,x1,0.85*0.339,0.09,last-first);
    proc.TailCancelationALTRO1(x1,x2,0.85,0.789,last-first);
    //
    sprintf(ename,"Cancel1_%d", ievent);
    TH1F his1(ename,ename,last-first,first,last);
    for (Int_t ipos=0; ipos<last-first; ipos++){
      his1.SetBinContent(ipos+1,x1[ipos]);
    }
    his1.Write(ename);
    sprintf(ename,"Cancel2_%d", ievent);
    TH1F his2(ename,ename,last-first,first,last);
    for (Int_t ipos=0; ipos<last-first; ipos++){
      his2.SetBinContent(ipos+1,x1[ipos]);
    }
    f1->SetParameters(0.75*max,maxpos,1.1,0.8,0.25,0.2);
    his2.Fit(f1,"q");
    his2.Write(ename);
    Double_t params2[6];
    for (Int_t ipar=0; ipar<6; ipar++) params2[ipar] = f1->GetParameters()[ipar];
    Double_t chi22 = TFitter::GetFitter()->Chisquare(6,params2);    
    TMatrixD cov2(6,6);
    cov2.SetMatrixArray(TFitter::GetFitter()->GetCovarianceMatrix());

    TGraph gr0(last-first, &time[first],x0);
    TGraph gr1(last-first, &time[first],x1);
    TGraph gr2(last-first, &time[first],x2);
    //
    cstream<<"Fit"<<
      "Sector="<<sector<<
      "Row="<<row<<
      "Pad="<<pad<<
      "First="<<first<<
      "Max="<<max<<
      "MaxPos="<<maxpos<<
      "chi2="<<chi2<<
      "chi22="<<chi22<<
      "Cov="<<&cov<<
      "Cov2="<<&cov2<<
      "gr0.="<<&gr0<<
      "gr1.="<<&gr1<<
      "gr2.="<<&gr2<<
      "p0="<<params[0]<<
      "p1="<<params[1]<<
      "p2="<<params[2]<<
      "p3="<<params[3]<<
      "p4="<<params[4]<<
      "p5="<<params[5]<<
      "p02="<<params2[0]<<
      "p12="<<params2[1]<<
      "p22="<<params2[2]<<
      "p32="<<params2[3]<<
      "p42="<<params2[4]<<
      "p52="<<params2[5]<<
      "\n";
    //    delete his;
    nFits++;
  }

}
Exemple #4
0
void function_minimizer::shmc_mcmc_routine(int nmcmc,int iseed0,double dscale,
					  int restart_flag) {

  if (nmcmc<=0)
    {
      cerr << endl << "Error: Negative iterations for MCMC not meaningful" << endl;
      ad_exit(1);
    }

  uostream * pofs_psave=NULL;
  if (mcmc2_flag==1)
    {
      initial_params::restore_start_phase();
    }
  initial_params::set_inactive_random_effects();
  initial_params::set_active_random_effects();
  int nvar_re=initial_params::nvarcalc();
  int nvar=initial_params::nvarcalc(); // get the number of active parameters
  if (mcmc2_flag==0)
    {
      initial_params::set_inactive_random_effects();
      nvar=initial_params::nvarcalc(); // get the number of active parameters
    }
  initial_params::restore_start_phase();

  independent_variables parsave(1,nvar_re);
  // dvector x(1,nvar);
  // initial_params::xinit(x);
  // dvector pen_vector(1,nvar);
  // {
  //   initial_params::reset(dvar_vector(x),pen_vector);
  // }
  initial_params::mc_phase=1;

  int old_Hybrid_bounded_flag=-1;
  int on,nopt = 0;

  //// ------------------------------ Parse input options
  // Step size. If not specified, will be adapted. If specified must be >0
  // and will not be adapted.
  double eps=0.1;
  double _eps=-1.0;
  int useDA=1; 			// whether to adapt step size
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-hyeps",nopt))>-1)
    {
      if (!nopt) // not specified means to adapt, using function below to find reasonable one
	{
	  cerr << "Warning: No step size given after -hyeps, ignoring" << endl;
	  useDA=1;
	}
      else			// read in specified value and do not adapt
	{
	  istringstream ist(ad_comm::argv[on+1]);
	  ist >> _eps;
	  if (_eps<=0)
	    {
	      cerr << "Error: step size (-hyeps argument) needs positive number";
	      ad_exit(1);
	    }
	  else
	    {
	      eps=_eps;
	      useDA=0;
	    }
	}
    }
  // Chain number -- for console display purposes only
  int chain=1;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-chain",nopt))>-1) {
    if (nopt) {
      int iii=atoi(ad_comm::argv[on+1]);
      if (iii <1) {
	cerr << "Error: chain must be >= 1" << endl;
	ad_exit(1);
      } else {
	chain=iii;
      }
    }
  }
  // Number of leapfrog steps. Defaults to 10.
  int L=10;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-hynstep",nopt))>-1)
    {
      if (nopt)
	{
	  int _L=atoi(ad_comm::argv[on+1]);
	  if (_L < 1 )
	    {
	      cerr << "Error: hynstep argument must be integer > 0 " << endl;
	      ad_exit(1);
	    }
	  else
	    {
	      L=_L;
	    }
	}
    }

  // Number of warmup samples if using adaptation of step size. Defaults to
  // half of iterations.
  int nwarmup= (int)nmcmc/2;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-nwarmup",nopt))>-1)
    {
      if (nopt)
        {
          int iii=atoi(ad_comm::argv[on+1]);
          if (iii <=0 || iii > nmcmc)
	    {
	      cerr << "Error: nwarmup must be 0 < nwarmup < nmcmc" << endl;
	      ad_exit(1);
	    }
          else
	    {
	      nwarmup=iii;
	    }
        }
    }

  // Target acceptance rate for step size adaptation. Must be
  // 0<adapt_delta<1. Defaults to 0.8.
  double adapt_delta=0.8; // target acceptance rate specified by the user
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-adapt_delta",nopt))>-1)
    {
      if (nopt)
	{
	  istringstream ist(ad_comm::argv[on+1]);
	  double _adapt_delta;
	  ist >> _adapt_delta;
	  if (_adapt_delta < 0 || _adapt_delta > 1 )
	    {
	      cerr << "Error: adapt_delta must be between 0 and 1"
		" using default of 0.8" << endl;
	    }
	  else
	    {
	      adapt_delta=_adapt_delta;
	    }
	}
    }
  // Use diagnoal covariance (identity mass matrix)
  int diag_option=0;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcdiag"))>-1)
    {
      diag_option=1;
      cout << " Setting covariance matrix to diagonal with entries " << dscale
	   << endl;
    }
  // Restart chain from previous run?
  int mcrestart_flag=option_match(ad_comm::argc,ad_comm::argv,"-mcr");
  if(mcrestart_flag > -1){
    cerr << endl << "Error: -mcr option not implemented for HMC" << endl;
    ad_exit(1);
  }

  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcec"))>-1)
    {
      cerr << endl << "Error: -mcec option not yet implemented with HMC" << endl;
      ad_exit(1);
      // use_empirical_flag=1;
      // read_empirical_covariance_matrix(nvar,S,ad_comm::adprogram_name);
    }

  // Prepare the mass matrix for use. Depends on many factors below.
  dmatrix S(1,nvar,1,nvar);
  dvector old_scale(1,nvar);
  int old_nvar;
  // Need to grab old_scale values still, since it is scaled below
  read_covariance_matrix(S,nvar,old_Hybrid_bounded_flag,old_scale);
  if (diag_option)		// set covariance to be diagonal
    {
      S.initialize();
      for (int i=1;i<=nvar;i++)
	{
	  S(i,i)=dscale;
	}
    }

  // How much to thin, for now fixed at 1.
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcsave"))>-1)
    {
      cerr << "Option -mcsave does not currently work with HMC -- every iteration is saved" << endl;
      ad_exit(1);
    }
  //// ------------------------------ End of input processing


  //// Setup more inputs and outputs
  pofs_psave=
    new uostream((char*)(ad_comm::adprogram_name + adstring(".psv")));
  if (!pofs_psave|| !(*pofs_psave))
    {
      cerr << "Error trying to open file" <<
	ad_comm::adprogram_name + adstring(".psv") << endl;
      ad_exit(1);
    }
  if (mcrestart_flag == -1 )
    {
      (*pofs_psave) << nvar;
    }
  // need to rescale the hessian
  // get the current scale
  dvector x0(1,nvar);
  dvector current_scale(1,nvar);
  initial_params::xinit(x0);
  int mctmp=initial_params::mc_phase;
  initial_params::mc_phase=0;
  initial_params::stddev_scale(current_scale,x0);
  initial_params::mc_phase=mctmp;
  // cout << "old scale=" <<  old_scale << endl;
  // cout << "current scale=" << current_scale << endl;
  // cout << "S before=" << S << endl;
  // I think this is only needed if mcmc2 is used??
  // for (int i=1;i<=nvar;i++)
  //   {
  //     for (int j=1;j<=nvar;j++)
  // 	{
  // 	  S(i,j)*=old_scale(i)*old_scale(j);
  // 	}
  //   }
  if(diag_option){
    for (int i=1;i<=nvar;i++)
      {
	for (int j=1;j<=nvar;j++)
	  {
	    S(i,j)*=current_scale(i)*current_scale(j);
	  }
      }
  }
  //  cout << "S after=" << S << endl;
  gradient_structure::set_NO_DERIVATIVES();
  if (mcmc2_flag==0)
    {
      initial_params::set_inactive_random_effects();
    }
  // Setup random number generator, based on seed passed
  int iseed=2197;
  if (iseed0) iseed=iseed0;
  random_number_generator rng(iseed);
  gradient_structure::set_YES_DERIVATIVES();
  initial_params::xinit(x0);

  // Dual averaging components
  dvector epsvec(1,nmcmc+1), epsbar(1,nmcmc+1), Hbar(1,nmcmc+1);
  epsvec.initialize(); epsbar.initialize(); Hbar.initialize();
  double time_warmup=0;
  double time_total=0;
  std::clock_t start = clock();
  time_t now = time(0);
  tm* localtm = localtime(&now);
  cout << endl << "Starting static HMC for model '" << ad_comm::adprogram_name <<
    "' at " << asctime(localtm);
  // write sampler parameters
  ofstream adaptation("adaptation.csv", ios::trunc);
  adaptation << "accept_stat__,stepsize__,int_time__,energy__,lp__" << endl;

  // Declare and initialize the variables needed for the algorithm
  dmatrix chd = choleski_decomp(S); // cholesky decomp of mass matrix
  dvector y(1,nvar); // unbounded parameters
  y.initialize();
  // transformed params
  independent_variables z(1,nvar); z=chd*y;
  dvector gr(1,nvar);		// gradients in unbounded space
  // Need to run this to fill gr with current gradients and initial NLL.
  double nllbegin=get_hybrid_monte_carlo_value(nvar,z,gr);
  if(std::isnan(nllbegin)){
    cerr << "Starting MCMC trajectory at NaN -- something is wrong!" << endl;
    ad_exit(1);
  }
  // initial rotated gradient
  dvector gr2(1,nvar); gr2=gr*chd;
  dvector p(1,nvar);		// momentum vector
  p.fill_randn(rng);
  // Copy initial value to parsave in case first trajectory rejected
  initial_params::copy_all_values(parsave,1.0);
  double iaccept=0.0;
  // The gradient and params at beginning of trajectory, in case rejected.
  dvector gr2begin(1,nvar); gr2begin=gr2;
  dvector ybegin(1,nvar); ybegin=y;
  double nll=nllbegin;
  // if(useDA){
  //   eps=find_reasonable_stepsize(nvar,y,p,chd);
  //   epsvec(1)=eps; epsbar(1)=eps; Hbar(1)=0;
  // }
  double mu=log(10*eps);

  // Start of MCMC chain
  for (int is=1;is<=nmcmc;is++) {
    // Random momentum for next iteration, only affects Ham values
    p.fill_randn(rng);
    double H0=nll+0.5*norm2(p);

    // Generate trajectory
    int divergence=0;
    for (int i=1;i<=L;i++) {
      // leapfrog updates gr, p, y, and gr2 by reference
      nll=leapfrog(nvar, gr, chd, eps, p, y, gr2);
      // Break trajectory early if a divergence occurs to save computation
      if(std::isnan(nll)){
	divergence=1; break;
      }
    } // end of trajectory

    // Test whether to accept the proposed state
    double Ham=nll+0.5*norm2(p); // Update Hamiltonian for proposed set
    double alpha=min(1.0, exp(H0-Ham)); // acceptance ratio
    double rr=randu(rng);	   // Runif(1)
    if (rr<alpha && !divergence){ // accept
      iaccept++;
      // Update for next iteration: params, Hamiltonian and gr2
      ybegin=y;
      gr2begin=gr2;
      nllbegin=nll;
      initial_params::copy_all_values(parsave,1.0);
    } else {
      // Reject and don't update anything to reuse initials for next trajectory
      y=ybegin;
      gr2=gr2begin;
      nll=nllbegin;
    }
    // Save parameters to psv file, duplicated if rejected
    (*pofs_psave) << parsave;

    // Adaptation of step size (eps).
    if(useDA && is <= nwarmup){
      eps=adapt_eps(is, eps,  alpha, adapt_delta, mu, epsvec, epsbar, Hbar);
    }
    adaptation << alpha << "," <<  eps << "," << eps*L << "," << H0 << "," << -nll << endl;
    if(is ==nwarmup) time_warmup = ( std::clock()-start)/(double) CLOCKS_PER_SEC;
    print_mcmc_progress(is, nmcmc, nwarmup, chain);
  } // end of MCMC chain

  // This final ratio should closely match adapt_delta
  if(useDA){
    cout << "Final acceptance ratio=" << iaccept/nmcmc << " and target is " << adapt_delta<<endl;
    cout << "Final step size=" << eps << "; after " << nwarmup << " warmup iterations"<< endl;
  } else {
    cout << "Final acceptance ratio=" << iaccept/nmcmc << endl;
  }

  time_total = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
  print_mcmc_timing(time_warmup, time_total);

  // I assume this closes the connection to the file??
  if (pofs_psave)
    {
      delete pofs_psave;
      pofs_psave=NULL;
    }
} // end of HMC function
bool testFloatNbhoodReprBooleanOperations()
{

    /* Testovani booleovskych operaci, tj. sjednoceni, pruniku a rozdilu (doplnek je v jinych testech) */
    
    cout << "------------------------- ";
    cout << "testFloatNbhoodReprBooleanOperations:" << endl;

    vector<string> fileSet;
    string file1, file2;
    string datafile, spacefile;

    /* Kazda sada mnohostenu (kazda sada objahuje mnohosteny se stejnym Space) bude testovana tak, ze
    pro kazdou dvojici teto sady spocitame prunik (resp. sjednoceni, rozdil) ve vertex reprezentaci a otestujeme,
    zda je tento prunik (resp. sjednoceni, rozdil) stejny jako prunik (resp. sjednoceni, rozdil)
    v grid reprezentaci (tu povazujeme za referencni). */

    /* Sada pro 2D prostor o rozmerech 4 x 4 */

    cout << "test 2D polyhedra" << endl;

    fileSet.clear();
    fileSet.push_back("06");
    fileSet.push_back("07");
    fileSet.push_back("08");
    fileSet.push_back("09");
    fileSet.push_back("10");
    fileSet.push_back("11");
    fileSet.push_back("12");

    for (size_t i = 0; i < fileSet.size(); i ++) {
        for (size_t j = 0; j < fileSet.size(); j ++) {


            datafile = "src/test/data/uint/grid_repr/" + fileSet[i] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[i] + "_space.txt";
            GridRepr gr1(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
            datafile = "src/test/data/uint/grid_repr/" + fileSet[j] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[j] + "_space.txt";
            GridRepr gr2(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);

            NbhoodRepr nr1(gr1);
            NbhoodRepr nr2(gr2);
            
            NbhoodRepr intersc = nr1.intersection(nr2);
            assert(gr1.intersection(gr2) == GridRepr(intersc));

            NbhoodRepr unif = nr1.unification(nr2);
            assert(gr1.unification(gr2) == GridRepr(unif));

            NbhoodRepr diff = nr1.difference(nr2);
            assert(gr1.difference(gr2) == GridRepr(diff));

        }
    }

    /* Sada pro 3D prostor o rozmerech 6 x 6 x 6 */

    cout << "test 3D polyhedra" << endl;

    fileSet.clear();
    fileSet.push_back("13");
    fileSet.push_back("14");
    fileSet.push_back("15");
    fileSet.push_back("16");
    fileSet.push_back("17");

    for (size_t i = 0; i < fileSet.size(); i ++) {
        for (size_t j = 0; j < fileSet.size(); j ++) {

            datafile = "src/test/data/uint/grid_repr/" + fileSet[i] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[i] + "_space.txt";
            GridRepr gr1(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
            datafile = "src/test/data/uint/grid_repr/" + fileSet[j] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[j] + "_space.txt";
            GridRepr gr2(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
        
            NbhoodRepr nr1(gr1);
                        NbhoodRepr nr2(gr2);
            
            NbhoodRepr intersc = nr1.intersection(nr2);
            assert(gr1.intersection(gr2) == GridRepr(intersc));

            NbhoodRepr unif = nr1.unification(nr2);
            assert(gr1.unification(gr2) == GridRepr(unif));

            NbhoodRepr diff = nr1.difference(nr2);
            assert(gr1.difference(gr2) == GridRepr(diff));
        }
    }

    /* Sada pro 1D prostor o rozmerech 20 */

    cout << "test 1D polyhedra" << endl;

    fileSet.clear();
    fileSet.push_back("18");
    fileSet.push_back("19");
    fileSet.push_back("20");
    fileSet.push_back("21");

    for (size_t i = 0; i < fileSet.size(); i ++) {
        for (size_t j = 0; j < fileSet.size(); j ++) {

            datafile = "src/test/data/uint/grid_repr/" + fileSet[i] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[i] + "_space.txt";
            GridRepr gr1(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
            datafile = "src/test/data/uint/grid_repr/" + fileSet[j] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[j] + "_space.txt";
            GridRepr gr2(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
        
            NbhoodRepr nr1(gr1);
            NbhoodRepr nr2(gr2);
            
            NbhoodRepr intersc = nr1.intersection(nr2);
            assert(gr1.intersection(gr2) == GridRepr(intersc));

            NbhoodRepr unif = nr1.unification(nr2);
            assert(gr1.unification(gr2) == GridRepr(unif));

            NbhoodRepr diff = nr1.difference(nr2);
            assert(gr1.difference(gr2) == GridRepr(diff));
        }
    }

#if 1
    /* Sada pro 4D prostor o rozmerech 6 x 6 x 6 x 6 */

    cout << "test 4D polyhedra" << endl;

    fileSet.clear();
    fileSet.push_back("22");
    fileSet.push_back("23");
    fileSet.push_back("24");

    for (size_t i = 0; i < fileSet.size(); i ++) {
        for (size_t j = 0; j < fileSet.size(); j ++) {

            datafile = "src/test/data/uint/grid_repr/" + fileSet[i] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[i] + "_space.txt";
            GridRepr gr1(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
            datafile = "src/test/data/uint/grid_repr/" + fileSet[j] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[j] + "_space.txt";
            GridRepr gr2(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
        
            NbhoodRepr nr1(gr1);
                        NbhoodRepr nr2(gr2);
            
            NbhoodRepr intersc = nr1.intersection(nr2);
            assert(gr1.intersection(gr2) == GridRepr(intersc));

            NbhoodRepr unif = nr1.unification(nr2);
            assert(gr1.unification(gr2) == GridRepr(unif));

            NbhoodRepr diff = nr1.difference(nr2);
            assert(gr1.difference(gr2) == GridRepr(diff));
        }
    }
#endif

#if 1
    /* Sada pro 5D prostor o rozmerech 5 x 5 x 5 x 4 x 3 */

    cout << "test 5D polyhedra" << endl;

    fileSet.clear();
    fileSet.push_back("25");
    fileSet.push_back("26");

    for (size_t i = 0; i < fileSet.size(); i ++) {
        for (size_t j = 0; j < fileSet.size(); j ++) {

            datafile = "src/test/data/uint/grid_repr/" + fileSet[i] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[i] + "_space.txt";
            GridRepr gr1(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
            datafile = "src/test/data/uint/grid_repr/" + fileSet[j] + ".txt";
            spacefile = "src/test/data/uint/grid_repr/" + fileSet[j] + "_space.txt";
            GridRepr gr2(createSpaceFromSpacefile(spacefile, true), datafile.c_str(), true);
        
            NbhoodRepr nr1(gr1);
                        NbhoodRepr nr2(gr2);
            
            NbhoodRepr intersc = nr1.intersection(nr2);
            assert(gr1.intersection(gr2) == GridRepr(intersc));

            NbhoodRepr unif = nr1.unification(nr2);
            assert(gr1.unification(gr2) == GridRepr(unif));

            NbhoodRepr diff = nr1.difference(nr2);
            assert(gr1.difference(gr2) == GridRepr(diff));
        }
    }
#endif

    return true;
}
Exemple #6
0
void ColorRing::paintEvent(QPaintEvent *event)
{
	Q_UNUSED(event);
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing, true);
	QRect r = contentsRect();
	r.moveTo(-r.width()/2, -r.height()/2);
	painter.translate(r.width()/2, r.height()/2);
	//painter.fillRect(r, QApplication::palette().window().color());
	QConicalGradient gr(0, 0, 360);
	for(int i = 0; i< 12; i++) {
		gr.setColorAt(float(i)/12, QColor::fromHsvF(float(i)/12, 1.f, 1.f));
	}
	painter.setBrush(QBrush(gr));
	painter.setPen(Qt::NoPen);
	painter.drawPie(r, 0, 5760);
	
	painter.scale(RING, RING);
	painter.setBrush(QApplication::palette().window().color());
	painter.drawPie(r, 0, 5760);
	painter.rotate(-col.hueF() * 360);
	painter.scale(r.width()*.5f, r.height()*.5f);

	painter.setPen(Qt::SolidLine);
	painter.setPen(QPen(QColor("white")));
	painter.setBrush(QBrush(QColor(0,0,0,0)));
	painter.drawEllipse(QPointF(1.12f, .0f), 0.1f, 0.1f);
	painter.setPen(Qt::NoPen);

	if(triangleMode) {
		QConicalGradient gr2(points[2], 270.f);
		gr2.setColorAt(.0f, QColor::fromHsvF(col.hueF(), .0f, 1.f));
		gr2.setColorAt(1.f/6.f, QColor::fromHsvF(col.hueF(), 1.f, 1.f));
		painter.setBrush(QBrush(gr2));
		painter.drawPolygon(points, 3);
		//painter.setCompositionMode(QPainter::CompositionMode_Multiply);
		QLinearGradient gr3(points[2], (points[0]+points[1])*.5f);
		gr3.setColorAt(.0f, QColor::fromRgbF(.0f, .0f, .0f, 1.f));
		gr3.setColorAt(1.f, QColor::fromRgbF(.0f, .0f, .0f, 0.f));
		painter.setBrush(QBrush(gr3));
		painter.drawPolygon(points, 3);
		//painter.setCompositionMode(QPainter::CompositionMode_SourceOver);

		QPointF p1 = points[0] * col.saturationF() + points[1] * (1.f - col.saturationF());
		QPointF p2 = p1 * col.valueF() + points[2] * (1.f - col.valueF());
		painter.setPen(Qt::SolidLine);
		painter.setPen(QPen(QColor("white")));
		painter.setBrush(QBrush(QColor(0,0,0,0)));
		painter.drawEllipse(p2, 0.1f, 0.1f);
	} else { // box mode
		QLinearGradient gr2(points2[0], points2[1]);
		gr2.setColorAt(.0f, QColor::fromHsvF(col.hueF(), 1.f, 1.f));
		gr2.setColorAt(1.f, QColor::fromHsvF(col.hueF(), .0f, 1.f));
		painter.setBrush(QBrush(gr2));
		painter.drawPolygon(points2, 4);
		QLinearGradient gr3(points2[1], points2[2]);
		gr3.setColorAt(.0f, QColor::fromRgbF(.0f, .0f, .0f, 1.f));
		gr3.setColorAt(1.f, QColor::fromRgbF(.0f, .0f, .0f, 0.f));
		painter.setBrush(QBrush(gr3));
		painter.drawPolygon(points2, 4);

		QPointF p1 = points2[0] * col.saturationF() + points2[1] * (1.f - col.saturationF());
		QPointF p2 = p1 + (points2[2] - points2[1]) * col.valueF();
		painter.setPen(Qt::SolidLine);
		painter.setPen(QPen(QColor("white")));
		painter.setBrush(QBrush(QColor(0,0,0,0)));
		painter.drawEllipse(p2, 0.1f, 0.1f);
	}
}