コード例 #1
0
ファイル: main.c プロジェクト: browny/cpractice
int maxLevel(mynode *node)
{
	if(node != NULL)
		return max(maxLevel(node->left),maxLevel(node->right)) + 1;
	else
		return 0;
}
コード例 #2
0
ファイル: AmrAdv.cpp プロジェクト: BoxLib-Codes/BoxLib
AmrAdv::AmrAdv ()
{
    ReadParameters();

    // Geometry on all levels has been defined already.

    // No valid BoxArray and DistributionMapping have been defined.
    // But the arrays for them have been resized.

    int nlevs_max = maxLevel() + 1;

    istep.resize(nlevs_max, 0);
    nsubsteps.resize(nlevs_max, 1);
    for (int lev = 1; lev <= maxLevel(); ++lev) {
	nsubsteps[lev] = MaxRefRatio(lev-1);
    }
    last_regrid_step.resize(nlevs_max, 0);

    t_new.resize(nlevs_max, 0.0);
    t_old.resize(nlevs_max, -1.e100);
    dt.resize(nlevs_max, 1.e100);

    phi_new.resize(nlevs_max);
    phi_old.resize(nlevs_max);

    flux_reg.resize(nlevs_max+1);
}
コード例 #3
0
int diameter(Node* root) {
  if(!root) {
    return -1;
  }
  return std::max(
		  std::max(diameter(root->child[0]), diameter(root->child[1])),
		  1 + maxLevel(root->child[0]) + 1 + maxLevel(root->child[1])  + 1
		  ); 
}
コード例 #4
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
void SchreyerFrame::computeSyzygies(int slanted_degree, int maxlevel)
{
  // Compute everything up to this point
  int toplevel = (maxlevel < maxLevel() ? maxlevel : maxLevel());
  for (int deg = mLoSlantedDegree; deg <= slanted_degree; deg++)
    for (int lev=2; lev<=toplevel; lev++)
      {
        fillinSyzygies(deg,lev);
      }
}
コード例 #5
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
void SchreyerFrame::computeRanks(int slanted_degree, int maxlevel)
{
  // Compute all needed ranks to get the minimal Betti numbers in the range
  // deg <= slanted_degree, lev <=maxlevel.
  // This means: we need to compute ranks to level maxlevel+1 (or largest that exists)
  // in degrees <= slanted_degree, EXCEPT we don't need to compute at (slanted_degree,maxlevel+1).
  int toplevel = (maxlevel < maxLevel() ? maxlevel-1 : mMaxLength);
  for (int deg=mLoSlantedDegree; deg <=slanted_degree; deg++)
    for (int lev=1; lev<=toplevel; lev++)
      computeRank(deg, lev);
}
コード例 #6
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
bool SchreyerFrame::debugCheckOrderAll() const
{
  std::cout << "checking that all input and constructed polynomials are in order...";
  bool result = true;
  for (auto i = 1; i<maxLevel(); ++i)
    if (!debugCheckOrder(i))
      result = false;
  if (result)
    std::cout << "ok" << std::endl;
  return result;
}
コード例 #7
0
ファイル: main.c プロジェクト: browny/cpractice
int main(int argc,char **argv)
{
	int i = 0;
	mynode *root = NULL;

	srand(time(NULL));
	for(i=0;i<MAX_NODE;i++)
		root = Insert(rand()%50+1,root);

	Dump(root);
	printf("\nmaxLevel = %d\n",maxLevel(root));
	return 0;
}
コード例 #8
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
M2_arrayint SchreyerFrame::getBetti(int type)
{
  if (type == 4)
    {
      computeFrame();
      decltype(timer()) timeA, timeB;
      timeA = timer();
      computeRanks(mHiSlantedDegree, maxLevel());
      timeB = timer();
      timeComputeRanks += seconds(timeB-timeA);
      
      return mBettiMinimal.getBetti();
    }
  if (type == 0 or type == 1)
    return getBettiFrame();
  if (type == 5)
    return mComputationStatus.getBetti();
  
  ERROR("betti display not implemenented yet");
  return 0;
}
コード例 #9
0
plRenderLevel plMaxNodeBase::ICalcRenderLevel(hsBool forBlend)
{
    if( GetBlendToFB() )
        return plRenderLevel::kFBMajorLevel;

    if( GetAvatarSO() )
        return plRenderLevel(plRenderLevel::kOpaqueMajorLevel, plRenderLevel::kAvatarRendMinorLevel);

    if( GetNoDeferDraw() )
        forBlend = false;

    int numDep = NumRenderDependencies();
    if( !numDep )
        return forBlend 
            ? plRenderLevel(plRenderLevel::kBlendRendMajorLevel, plRenderLevel::kDefRendMinorLevel)
            : plRenderLevel(plRenderLevel::kDefRendMajorLevel, plRenderLevel::kDefRendMinorLevel);

    plRenderLevel maxLevel(plRenderLevel::kFBMajorLevel, plRenderLevel::kDefRendMinorLevel);

    const char* dbgNodeName = GetName();

    int i;
    for( i = 0; i < numDep; i++ )
    {
        plMaxNodeBase* dep = GetRenderDependency(i);
        if( dep )
        {
            const char* depNodeName = dep->GetName();

            plRenderLevel depLev = GetRenderDependency(i)->GetRenderLevel(forBlend);
            if( depLev > maxLevel )
                maxLevel = depLev;
        }
    }
    maxLevel.Set(maxLevel.Level() + 4);

    return maxLevel;
}
コード例 #10
0
int maxLevel(Node* root) {
  if(!root) {
    return -1;
  }
  return std::max(maxLevel(root->child[0]), maxLevel(root->child[1])) + 1;
}
コード例 #11
0
int SchreyerFrame::rank(int slanted_degree, int lev)
{
  // As above, get the size of the matrix, and 'newcols'
  // Now we loop through the elements of degree 'slanted_degree + lev' at level 'lev'
  if (not (lev > 0 and lev <= maxLevel())
      and not (slanted_degree >= mLoSlantedDegree and slanted_degree < mHiSlantedDegree))
    {
      std::cerr << "ERROR: called rank(" << slanted_degree << "," << lev << ")" << std::endl;
      return 0;
    }
  assert(lev > 0 and lev <= maxLevel());
  assert(slanted_degree >= mLoSlantedDegree and slanted_degree < mHiSlantedDegree);
  int degree = slanted_degree + lev;
  auto& thislevel = level(lev);
  int ncols = 0;
  for (auto p=thislevel.begin(); p != thislevel.end(); ++p)
    {
      if (p->mDegree == degree) ncols++;
    }

  auto& prevlevel = level(lev-1);
  int* newcomps = new int[prevlevel.size()];
  int nrows = 0;
  for (int i=0; i<prevlevel.size(); i++)
    if (prevlevel[i].mDegree == degree)
      newcomps[i] = nrows++;
    else
      newcomps[i] = -1;

  // Create the ARing
  // Create a DMat
  //  M2::ARingZZpFlint R(gausser().get_ring()->characteristic());
  //  DMat<M2::ARingZZpFlint> M(R, nrows, ncols);

#if 0
  // TODO: Change this
  M2::ARingZZpFFPACK R(gausser().get_ring()->characteristic());
  DMat<M2::ARingZZpFFPACK> M(R, nrows, ncols);
#endif
  
  // Fill in DMat
  // loop through the elements at thislevel,
  // and for each, loop through the terms of mSyzygy.
  // if the component x satisfies newcomps[x] >= 0, then place
  // this coeff into the mutable matrix.
  int col = 0;
  long nnonzeros = 0;
  for (auto p=thislevel.begin(); p != thislevel.end(); ++p)
    {
      if (p->mDegree != degree) continue;
      auto& f = p->mSyzygy;
      auto end = poly_iter(ring(), f, 1);
      auto i = poly_iter(ring(), f);
      for ( ; i != end; ++i)
        {
          long comp = monoid().get_component(i.monomial());
          if (newcomps[comp] >= 0)
            {
              #if 0
              // TODO: change this line:
              M.entry(newcomps[comp], col) = gausser().coeff_to_int(i.coefficient());
              #endif
              nnonzeros++;
            }
        }
      ++col;
    }
  double frac_nonzero = (nrows*ncols);
  frac_nonzero = nnonzeros / frac_nonzero;

  //  buffer o;
  //  displayMat(o, M);
  //  std::cout << o.str() << std::endl;
  
  // call rank
  //  auto a = DMatLinAlg<M2::ARingZZpFlint>(M);
#if 0
  // TODO: change this line
  auto a = DMatLinAlg<M2::ARingZZpFFPACK>(M);
  long numrows = M.numRows();
  long numcols = M.numColumns();
#endif
  long numrows = 0;
  long numcols = 0;
  clock_t begin_time0 = clock();
  int rk = 0; // TODO: static_cast<int>(a.rank());
  clock_t end_time0 = clock();
  double nsecs0 = (double)(end_time0 - begin_time0)/CLOCKS_PER_SEC;
  if (M2_gbTrace >= 2)
    {
      std::cout << "rank (" << slanted_degree << "," << lev << ") = " << rk
                << " time " << nsecs0 << " size= " << numrows
                << " x " << numcols << " nonzero " << nnonzeros << std::endl;
    }
  
  return rk;
}
コード例 #12
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
void SchreyerFrame::setBettiDisplays()
{
  int lo, hi, len;
  getBounds(lo, hi, len);
  //std::cout << "bounds: lo=" << lo << " hi=" << hi << " len=" << len << std::endl;
  mBettiNonminimal = BettiDisplay(lo,hi,len);
  mBettiMinimal = BettiDisplay(lo,hi,len);
  mComputationStatus = BettiDisplay(lo,hi,maxLevel());
  
  for (int lev=0; lev<=len; lev++)
    {
      auto& myframe = level(lev);
      for (auto p=myframe.begin(); p != myframe.end(); ++p)
        {
          int deg = p->mDegree; // this is actual degree, not slanted degree
          mBettiNonminimal.entry(deg-lev,lev) ++ ;
          mBettiMinimal.entry(deg-lev,lev) ++ ;
        }
    }

#if 0  
  // Now set the todo list of pairs (degree, level) for minimalization.
  for (int slanted_degree = lo; slanted_degree < hi; slanted_degree++)
    {
      for (int lev = 1; lev <= maxLevel()-1; lev++)
        {
          if (mBettiNonminimal.entry(slanted_degree, lev) > 0 and mBettiNonminimal.entry(slanted_degree+1, lev-1) > 0)
            {
              mMinimalizeTODO.push_back(std::make_pair(slanted_degree, lev));
            }
          
        }
    }
#endif
  // Meaning: 0: no syzygies in that (degree,lev)
  //          1:  there are some, but syzygies have not been constructed yet
  //          2:  syzygies have been constructed
  //          3:  syzygies have been constructed AND rank from (deg,lev) to (deg+1,lev-1) has been
  //              computed, and the ranks taken into account in mMinimalBetti.
  for (int slanted_degree = lo; slanted_degree <= hi; slanted_degree++)
    {
      if (len >= 0)
        {
          if (mBettiNonminimal.entry(slanted_degree, 0) == 0)
            mComputationStatus.entry(slanted_degree, 0) = 0;
          else
            mComputationStatus.entry(slanted_degree, 0) = 3;
        }

      if (len >= 1)
        {
          if (mBettiNonminimal.entry(slanted_degree, 1) == 0)
            mComputationStatus.entry(slanted_degree, 1) = 0;
          else
            mComputationStatus.entry(slanted_degree, 1) = 2;
        }
      
      for (int lev = 2; lev <= maxLevel(); lev++)
        {
          if ((lev > len) or mBettiNonminimal.entry(slanted_degree, lev) == 0)
              mComputationStatus.entry(slanted_degree, lev) = 0;
          else
              mComputationStatus.entry(slanted_degree, lev) = 1;
        }
    }
}
コード例 #13
0
ファイル: res-schreyer-frame.cpp プロジェクト: pzinn/M2
BettiDisplay SchreyerFrame::minimalBettiNumbers(
                                              bool stop_after_degree,
                                              int top_slanted_degree,
                                              int length_limit
                                              )
{
  // The lo degree will be: mLoSlantedDegree.
  // The highest slanted degree will either be mHiSlantedDegree, or top_slanted_degree (minimum of these two).
  // The length we need to compute to is either maxLevel(), or length_limit+1.
  // We set maxlevel to length_limit.  We insist that length_limit <= maxLevel() - 2.
  // Here is what needs to be computed:
  //  lo: . . . . . . .
  //      . . . . . . .
  /// hi: . . . . . .
  // Each dot in all rows other than 'hi' needs to have syzygies computed for it.
  // if hi == mHiSlantedDegree, then we do NOT need to compute syzygies in this last row.
  //   else we need to compute syzygies in these rows, EXCEPT not at level maxlevel+1

  computeFrame();

  int top_degree; // slanted degree
  if (stop_after_degree)
    {
      top_degree = std::min(top_slanted_degree, mHiSlantedDegree);
      top_degree = std::max(mLoSlantedDegree, top_degree);
    }
  else
    {
      top_degree = mHiSlantedDegree;
    }
  // First: if length_limit is too low, extend the Frame
  if (length_limit >= maxLevel())
    {
      std::cout << "WARNING: cannot extend resolution length" << std::endl;
      length_limit = maxLevel()-1;
      // Extend the length of the Frame, change mMaxLength, possibly mHiSlantedDegree
      // increase mComputationStatus if needed, mMinimalBetti, ...
      // computeFrame()
    }

  // What needs to be computed?
  // lodeg..hideg, level: 0..maxlevel.  Note: need to compute at level maxlevel+1 in order to get min betti numbers at
  //   level maxlevel.
  // Also note: if hideg is the highest degree that occurs in the frame, we do not need to compute any matrices for these.

  for (int deg=mLoSlantedDegree; deg <= top_degree-1; deg++)
    for (int lev=1; lev<=length_limit+1; lev++)
      computeRank(deg, lev);

  for (int lev=1; lev<=length_limit; lev++)
    computeRank(top_degree, lev);

  if (M2_gbTrace >= 1)
    {
      showMemoryUsage();
      std::cout << "total setPoly: " << poly_constructor::ncalls << std::endl;
      std::cout << "total setPolyFromArray: " << poly_constructor::ncalls_fromarray << std::endl;
      std::cout << "total ~poly: " << poly::npoly_destructor << std::endl;
      
      std::cout << "total time for make matrix: " << timeMakeMatrix << std::endl;
      std::cout << "total time for sort matrix: " << timeSortMatrix << std::endl;
      std::cout << "total time for reorder matrix: " << timeReorderMatrix << std::endl;
      std::cout << "total time for gauss matrix: " << timeGaussMatrix << std::endl;
      std::cout << "total time for clear matrix: " << timeClearMatrix << std::endl;
      std::cout << "total time for reset hash table: " << timeResetHashTable << std::endl; 
      std::cout << "total time for computing ranks: " << timeComputeRanks << std::endl;
    }
  
  BettiDisplay B(mBettiMinimal); // copy
  B.resize(mLoSlantedDegree,
           top_degree,
           length_limit);

  return B;
}