Example #1
0
 auto dag_leaves_impl(TAList al)
 {
     return list::remove_matching(all_nodes(al), [=](auto zn)
         {
             return has_start_node(al, zn);
         });
 }
Example #2
0
void BrowserView::update(const Q3PtrList<BrowserView> & lv)
{
  Q3Dict<Use> all_nodes(DICT_SIZE);
  Q3PtrListIterator<BrowserView> itv(lv);
  
  all_nodes.setAutoDelete(TRUE);
  
  // look at the revision in each view
  
  for (; itv.current(); ++itv) {
    Q3DictIterator<BrowserNode> itd(itv.current()->nodes);

    for (; itd.current(); ++itd) {
      BrowserNode * bn = itd.current();
      int rev = bn->get_rev();
      Use * use = all_nodes.find(itd.currentKey());
      
      if (use == 0)
	all_nodes.insert(itd.currentKey(), new Use(rev));
      else {
	if (rev < use->rev_min)
	  use->rev_min = rev;
	if (rev > use->rev_max)
	  use->rev_max = rev;
	use->count += 1;
      }
    }
  }
  
  // first solve step
  // only the package existing in all the view are solved
  
  int nviews = lv.count();
  QStringList deleted_or_new;
  
  Q3DictIterator<Use> itu(all_nodes);
  
  for (; itu.current(); ++itu) {
    QString who = itu.currentKey();
    Use * use = itu.current();
	    
    if (use->count == nviews) {
      // exist in all views : solve the state
      if (use->rev_min == use->rev_max) {
	// up to date in all views
	for (itv.toFirst(); itv.current(); ++itv)
	  itv.current()->nodes.find(who)->set_state(UpToDate);
      }
      else {
	int max = use->rev_max;
	
	for (itv.toFirst(); itv.current(); ++itv) {
	  BrowserNode * pack = itv.current()->nodes.find(who);
	  
	  pack->set_state((pack->get_rev() == max) ? Young : Old);
	}
      }
    }
    else {
      // deleted or new, mark it unknown for this step
      deleted_or_new.append(who);
      
      for (itv.toFirst(); itv.current(); ++itv) {
	BrowserNode * pack = itv.current()->nodes.find(who);
	
	if (pack != 0)
	  pack->set_state(Unknown);
      }
    }
  }
  
  all_nodes.clear();
  
  // solve packages marked unknown
  // a package is deleted if its parent is never 'Young'
  
  QStringList::Iterator it;
  
  for (it = deleted_or_new.begin(); it != deleted_or_new.end(); ++it) {
    QString who = *it;
    Q3PtrList<BrowserNode> images;
    bool young = FALSE;
    
    // set the state in each view without looking at the others
    for (itv.toFirst(); itv.current(); ++itv) {
      BrowserNode * pack = itv.current()->nodes.find(who);
      
      if (pack != 0) {
	images.append(pack);
	if (pack->solve())
	  young = TRUE;
      }
    }
    
    // set the final state if young, else all already marked deleted
    if (young) {
      BrowserNode * pack;
      
      for (pack = images.first(); pack != 0; pack = images.next())
	pack->set_state(Young);
    }
  }
  
  // force update on views
  for (itv.toFirst(); itv.current(); ++itv)
    itv.current()->update_it();
}
int _tmain(int argc, _TCHAR* argv[])
{


	vector<vector<ClassifiedSample*>*> performance_lists(0);
	MNIST_Generate_Validation_Performance_Lists_Vector(performance_lists);



	vector<vector<ClassifiedSample*>*> test_performance_lists(0);
	MNIST_Generate_Test_Performance_Lists_Vector(test_performance_lists);



	vector<CascadeNode*> all_nodes(0);
	MNIST_Generate_CascadeNodes_Vector(all_nodes);


	for(int i=0; i<all_nodes.size(); i++)
	{
		all_nodes[i]->performance_list= performance_lists[i];
		all_nodes[i]->test_performance_list= test_performance_lists[i];
	}

	vector<CascadeNode*> best_cascade(0);
	float best_cascade_theoretical_complexity;
	Build_Cascade_ModelBased(
		/*vector<CascadeNode*>&*/ all_nodes, //from which we build the best cascade
		/*vector<CascadeNode*>&*/ best_cascade,
		/*float&*/ best_cascade_theoretical_complexity
		);
	


	cout<<endl<<endl<<"Best Cascade:"<<endl;
	cout<<"Thresholds: ";
	for(int i=0; i<best_cascade.size(); i++)
		cout<<best_cascade[i]->ID<<": "<<best_cascade[i]->thresh<<", "<<endl;

	cout<<endl<<"Theoretical Complexity: "<<best_cascade_theoretical_complexity<<endl;


	ofstream fout("Model_Based_All_Stages_Results.txt");

	float complexity(0);
	float error(0);
	float final_stage_complexity(0);
	float final_stage_error(0);
	float rej(0);
	//Calculating actual complexity and error on validation set
    Evaluate_Cascade_Performance_OnValidation(
								  best_cascade,
								  complexity,
								  error,
								  final_stage_complexity,
								  final_stage_error,
								  rej
								  );



	cout<<"On Validation:"<<endl;
	cout<<"Error of most complex classifier: "<<final_stage_error<<endl;
	cout<<"Complexity of most complex classifier: "<<final_stage_complexity<<endl;
	cout<<"Actual Error= "<<error<<endl;
	cout<<"Actual Complexity= "<<complexity<<endl;
	cout<<endl<<endl;

	fout<<"On Validation:"<<endl;
	fout<<"Error of most complex classifier: "<<final_stage_error<<endl;
	fout<<"Complexity of most complex classifier: "<<final_stage_complexity<<endl;
	fout<<"Actual Error= "<<error<<endl;
	fout<<"Actual Complexity= "<<complexity<<endl;
	fout<<endl<<endl;



	//Calculating actual complexity and error on test set
    Evaluate_Cascade_Performance_OnTest(
								  best_cascade,
								  complexity,
								  error,
								  final_stage_complexity,
								  final_stage_error,
								  rej
								  );
	cout<<"On Test:"<<endl;
	cout<<"Error of most complex classifier: "<<final_stage_error<<endl;
	cout<<"Complexity of most complex classifier: "<<final_stage_complexity<<endl;
	cout<<"Actual Error= "<<error<<endl;
	cout<<"Actual Complexity= "<<complexity<<endl;
	cout<<endl<<endl;
	
	fout<<"On Test:"<<endl;
	fout<<"Error of most complex classifier: "<<final_stage_error<<endl;
	fout<<"Complexity of most complex classifier: "<<final_stage_complexity<<endl;
	fout<<"Actual Error= "<<error<<endl;
	fout<<"Actual Complexity= "<<complexity<<endl;
	fout<<endl<<endl;



	cout<<"Done."<<endl;
	getch();

	return 0;
}
Example #4
0
int FMM_Init(MPI_Comm& comm, FMMData *fmm_data){
  int myrank, np;
  MPI_Comm_rank(comm, &myrank);
  MPI_Comm_size(comm,&np);

  FMM_Mat_t *fmm_mat=new FMM_Mat_t;
  FMM_Tree_t* tree=new FMM_Tree_t(comm);

  //Kernel function
  const pvfmm::Kernel<double>* kernel;
  if(INPUT_DOF==1) kernel=pvfmm::LaplaceKernel<double>::potn_ker;
  else if(INPUT_DOF==2) kernel=&pvfmm::ker_helmholtz;
  else if(INPUT_DOF==3) kernel=&pvfmm::ker_stokes_vel;

  //Setup FMM data structure.
  int mult_order=MUL_ORDER;
  int cheb_deg=CHEB_DEG;
  bool adap=true;
  double tol=TOL;
  pvfmm::BoundaryType bndry=pvfmm::FreeSpace;
  if(PERIODIC==PETSC_TRUE) bndry=pvfmm::Periodic;

  typename FMMNode_t::NodeData tree_data;
  { // Tree Construction (eta).
    FMM_Tree_t* tree=new FMM_Tree_t(comm);
    //Various parameters.
    tree_data.dim=COORD_DIM;
    tree_data.max_depth=MAXDEPTH;
    tree_data.cheb_deg=cheb_deg;

    //Set input function pointer
    tree_data.input_fn=eta;
    tree_data.data_dof=1;
    tree_data.tol=tol*fabs(eta_);

    std::vector<double> pt_coord;
    { //Set source coordinates.
      size_t NN=ceil(pow((double)np,1.0/3.0));
      NN=std::max<size_t>(NN,pow(2.0,MINDEPTH));
      size_t N_total=NN*NN*NN;
      size_t start= myrank   *N_total/np;
      size_t end  =(myrank+1)*N_total/np;
      for(size_t i=start;i<end;i++){
	pt_coord.push_back(((double)((i/  1    )%NN)+0.5)/NN);
	pt_coord.push_back(((double)((i/ NN    )%NN)+0.5)/NN);
	pt_coord.push_back(((double)((i/(NN*NN))%NN)+0.5)/NN);
      }
      tree_data.pt_coord=pt_coord;
    }
    tree_data.max_pts=1; // Points per octant.

    //Create Tree and initialize with input data.
    tree->Initialize(&tree_data);
    tree->InitFMM_Tree(adap,bndry);

    // this is getting the center coordinates of each of the nodes of the octree?
    pt_coord.clear();
    std::vector<FMMNode_t*> nlist=tree->GetNodeList();
    for(size_t i=0;i<nlist.size();i++){
      if(nlist[i]->IsLeaf() && !nlist[i]->IsGhost()){
	double s=pow(0.5,nlist[i]->Depth()+1);
	double* c=nlist[i]->Coord();
	pt_coord.push_back(c[0]+s);
	pt_coord.push_back(c[1]+s);
	pt_coord.push_back(c[2]+s);
      }
    }
    tree_data.pt_coord=pt_coord;

    tree->Write2File("results/eta",VTK_ORDER);
    FMM_Tree_t* eta_tree = tree;
    fmm_data->eta_tree = eta_tree;
    //delete tree;
  }

  //new

  //  typename FMMNode_t::NodeData tree_data;
  //Various parameters.
  //  tree_data.dim=COORD_DIM;
  //  tree_data.max_depth=MAXDEPTH;
  //  tree_data.cheb_deg=cheb_deg;

  { // Tree Construction.
    bool adap=true;

    // Manually setting the coordinates where we evaluate the function?
    std::vector<double> pt_coord;
    { //Set source coordinates.
      size_t NN=ceil(pow((double)np,1.0/3.0));
      NN=std::max<size_t>(NN,pow(2.0,MINDEPTH));
      size_t N_total=NN*NN*NN;
      size_t start= myrank   *N_total/np;
      size_t end  =(myrank+1)*N_total/np;
      for(size_t i=start;i<end;i++){
	pt_coord.push_back(((double)((i/  1    )%NN)+0.5)/NN);
	pt_coord.push_back(((double)((i/ NN    )%NN)+0.5)/NN);
	pt_coord.push_back(((double)((i/(NN*NN))%NN)+0.5)/NN);
      }
      tree_data.pt_coord=pt_coord;
    }
    tree_data.max_pts=1; // Points per octant.

    //old
    //
    //Set input function pointer
    tree_data.input_fn=fn_input;
    tree_data.data_dof=kernel->ker_dim[0];
    tree_data.tol=tol*f_max;

    //Create Tree and initialize with input data.
    tree->Initialize(&tree_data);
    tree->InitFMM_Tree(adap,bndry);

    //std::vector<double> pt_coord; Again getting the point coordinates of the centers of the nodes of the octree?
    pt_coord.clear();
    std::vector<FMMNode_t*> nlist=tree->GetNodeList();
    for(size_t i=0;i<nlist.size();i++){
      if(nlist[i]->IsLeaf() && !nlist[i]->IsGhost()){
	double s=pow(0.5,nlist[i]->Depth()+1);
	double* c=nlist[i]->Coord();
	pt_coord.push_back(c[0]+s);
	pt_coord.push_back(c[1]+s);
	pt_coord.push_back(c[2]+s);
      }
    }
    tree_data.pt_coord=pt_coord;

    { //Output max tree depth.
      std::vector<size_t> all_nodes(MAXDEPTH+1,0);
      std::vector<size_t> leaf_nodes(MAXDEPTH+1,0);
      std::vector<FMMNode_t*>& nodes=tree->GetNodeList();
      for(size_t i=0;i<nodes.size();i++){
	FMMNode_t* n=nodes[i];
	if(!n->IsGhost()) all_nodes[n->Depth()]++;
	if(!n->IsGhost() && n->IsLeaf()) leaf_nodes[n->Depth()]++;
      }

      if(!myrank) std::cout<<"All  Nodes: ";
      for(int i=0;i<MAXDEPTH;i++){
	int local_size=all_nodes[i];
	int global_size;
	MPI_Allreduce(&local_size, &global_size, 1, MPI_INT, MPI_SUM, comm);
	if(global_size==0) MAXDEPTH=i;
	if(!myrank) std::cout<<global_size<<' ';
      }
      if(!myrank) std::cout<<'\n';

      if(!myrank) std::cout<<"Leaf Nodes: ";
      for(int i=0;i<MAXDEPTH;i++){
	int local_size=leaf_nodes[i];
	int global_size;
	MPI_Allreduce(&local_size, &global_size, 1, MPI_INT, MPI_SUM, comm);
	if(!myrank) std::cout<<global_size<<' ';
      }
      if(!myrank) std::cout<<'\n';
    }
  }

  size_t n_coeff3=(cheb_deg+1)*(cheb_deg+2)*(cheb_deg+3)/6;
  size_t n_nodes3=(cheb_deg+1)*(cheb_deg+1)*(cheb_deg+1);
  PetscInt m=0,n=0,M=0,N=0,l=0,L=0;
  { // Get local and global size
    long long loc_size=0, glb_size=0;
    long long loc_nodes=0, glb_nodes=0;
    std::vector<FMMNode_t*> nlist=tree->GetNodeList();
    for(size_t i=0;i<nlist.size();i++){
      if(nlist[i]->IsLeaf() && !nlist[i]->IsGhost()){
	loc_size+=n_coeff3; //nlist[i]->ChebData().Dim();
	loc_nodes+=n_nodes3;
      }
    }
    MPI_Allreduce(&loc_size, &glb_size, 1, MPI_LONG_LONG , MPI_SUM, comm);
    MPI_Allreduce(&loc_nodes, &glb_nodes, 1, MPI_LONG_LONG, MPI_SUM, comm);
    n=loc_size*kernel->ker_dim[0];
    N=glb_size*kernel->ker_dim[0];
    m=loc_size*kernel->ker_dim[1];
    M=glb_size*kernel->ker_dim[1];
    l=loc_nodes*kernel->ker_dim[0];
    L=glb_nodes*kernel->ker_dim[0];
    std::cout << L << std::endl;
    num_oct=glb_size/n_coeff3;
  }
  if(TREE_ONLY) return 0;

  //Initialize FMM_Mat.
  fmm_mat->Initialize(mult_order,cheb_deg,comm,kernel);

  fmm_data->kernel =kernel ;
  fmm_data->fmm_mat=fmm_mat;
  fmm_data->tree   =tree   ;
  fmm_data->bndry  =bndry  ;
  fmm_data->m=m;
  fmm_data->n=n;
  fmm_data->M=M;
  fmm_data->N=N;
  fmm_data->l=l;
  fmm_data->L=L;

  return 0;
}