⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdataviewx.c

📁 数据挖掘经典的hierarchial clustering algorithm
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif
    _pstorage.Clear();
    _queryProc->BatchQuery(_map, _queryFilter, this, 0, _timestamp);
  } else {
#ifdef DEBUG
    printf("View has no mappings; reporting query as done\n");
#endif
    ReportQueryDone(0);
    DoneMappingIterator(_index);
    _map = 0;
    _index = -1;
  }
}

void TDataViewX::DerivedAbortQuery()
{
#ifdef DEBUG
    printf("TDataViewX::Abort query, index = %d\n", _index);
#endif

  if (_map) {
    _queryProc->AbortQuery(_map, this);
    DOASSERT(_index >= 0, "Invalid iterator index");
    DoneMappingIterator(_index);
    _map = 0;
    _index = -1;
  }

  // Abort record links whose master this view is
  int index = _masterLink.InitIterator();
  while(_masterLink.More(index)) {
    RecordLink *link = _masterLink.Next(index);
    link->Abort();
  }
  _masterLink.DoneIterator(index);

  _dataBin->Final();
}

Boolean TDataViewX::DisplaySymbols(Boolean state)
{
#if defined(DEBUG)
  printf("TDataViewX::DisplaySymbols(%d)\n", state);
#endif

  if (state == _dispSymbols)
    return state;

  Boolean oldState = _dispSymbols;
  _dispSymbols = state;

#ifdef DEBUG
  printf("DisplaySymbols now %s\n", (_dispSymbols ? "on" : "off"));
#endif

  InvalidatePixmaps();
  Refresh();

  return oldState;
}

Boolean TDataViewX::DisplayConnectors(Boolean state)
{
#if defined(DEBUG)
  printf("TDataViewX::DisplayConnectors(%d)\n", state);
#endif

#if !USE_CONNECTORS
  return false;
#endif

  if (state == _dispConnectors)
    return state;

  if (!state) {
    DOASSERT(_cMap, "No connector mapping");
    delete _cMap;
    _cMap = NULL;
  } else {
    DOASSERT(!_cMap, "Unexpected connector mapping");
    _cMap = new TDataCMap;
    DOASSERT(_cMap, "Could not create connector mapping");
    _cMap->SetDefaultColor(GetFgColor());
  }

  Boolean oldState = _dispConnectors;
  _dispConnectors = state;

#ifdef DEBUG
  printf("DisplayConnectors now %s\n", (_dispConnectors ? "on" : "off"));
#endif

  InvalidatePixmaps();
  Refresh();

  return oldState;
}

/* Query data ready to be returned. Do initialization here. */

void TDataViewX::QueryInit(void *userData)
{
  _dataBin->Init(_map, &_queryFilter, GetWindowRep()->TopTransform(),
                 _dispSymbols, _dispConnectors, _cMap, this);
}

void TDataViewX::ReturnGData(TDataMap *mapping, RecId recId,
                             void *gdata, int numGData)
{
#if defined(DEBUG)
  printf("TDataViewX::ReturnGData()\n");
#endif
  DOASSERT(_index >= 0, "Invalid iterator index");

  mapping->UpdateMaxSymSize(gdata, numGData);
  int gRecSize = mapping->GDataRecordSize();

  _totalGData += numGData;
  _numBatches++;

  char *tp = (char *)gdata;
  GDataAttrOffset *offset = mapping->GetGDataOffset();

  // Can do record elimination only for constant bar shape
  Boolean canElimRecords = false;
  if (offset->shapeOffset < 0 && mapping->GetDefaultShape() == 2)
      canElimRecords = true;

  // Collect statistics and update record links only for last mapping
  if (!MoreMapping(_index)) {

    int firstRec = 0;

    for(int i = 0; i < numGData; i++) {
      // Extract X, Y, shape, and color information from gdata record
      Coord x = GetX(tp, mapping, offset);
      Coord y = GetY(tp, mapping, offset);
      ShapeID shape = GetShape(tp, mapping, offset);
      GlobalColor color = mapping->GetDefaultColor();
      if (offset->colorOffset >= 0)
        color = *(GlobalColor *)(tp + offset->colorOffset);
      Boolean complexShape = mapping->IsComplexShape(shape);
      complexShape |= (GetNumDimensions() == 3);

      // Compute statistics only for records that match the filter''s
      // X range, regardless of the Y boundary
      if (x >= _queryFilter.xLow && x <= _queryFilter.xHigh) {
          if (color < MAXCOLOR)
            _stats[color].Sample(x, y);
          _allStats.Sample(x, y);
          _allStats.Histogram(y);
          if(_glist.Size() <= MAX_GSTAT) {
              int X = (int) x;
              BasicStats *bs;
              if(_gstat.Lookup(X, bs)) {
                  bs->Sample(x,y);
              } else {
                  bs = new BasicStats();
                  DOASSERT(bs, "Out of memory");
                  bs->Init(0);
                  _glist.InsertOrderly(X, 1);
                  bs->Sample(x, y);
                  _gstat.Insert(X, bs);
                  _blist.Insert(bs);
              }
          }
      }

      // Contiguous ranges which match the filter''s X *and* Y range
      // are stored in the record link
      if (!complexShape &&
          (x < _queryFilter.xLow || x > _queryFilter.xHigh
           || y < _queryFilter.yLow || y > _queryFilter.yHigh)) {
        if (i > firstRec)
          WriteMasterLink(recId + firstRec, i - firstRec);

        // Next contiguous batch of record id''s starts at i+1
        firstRec = i + 1;
      }

      tp += gRecSize;
    }

    if (numGData > firstRec)
      WriteMasterLink(recId + firstRec, numGData - firstRec);
  }

  // Draw data only if window is not iconified
  if (!Iconified()) {
    if (_batchRecs) {
      _dataBin->InsertSymbol(recId, gdata, numGData, 0, 1, canElimRecords);
#ifdef DEBUG
      _dataBin->PrintStat();
#endif
    } else {
      char *ptr = (char *)gdata;
      for(int i = 0; i < numGData; i++) {
        _dataBin->InsertSymbol(recId, ptr, 1, 0, 1, canElimRecords);
        recId++;
        ptr += gRecSize;
      }
    }
  }
}

/* Done with query */

void TDataViewX::QueryDone(int bytes, void *userData)
{
#ifdef DEBUG
    printf("TDataViewX::Query done, index = %d, bytes = %d\n", _index, bytes);
#endif

  _pstorage.Clear();

  DOASSERT(_index >= 0, "Invalid iterator index");

  if (MoreMapping(_index)) {
    _map = NextMapping(_index)->map;
#ifdef DEBUG
    printf("Submitting next query 0x%p\n", _map);
#endif
    _queryProc->BatchQuery(_map, _queryFilter, this, 0, _timestamp);
    return;
  }

  DoneMappingIterator(_index);
  _map = 0;
  _index = -1;

  _allStats.Done();
  _allStats.Report();

  for(int i = 0; i < MAXCOLOR; i++)
    _stats[i].Done();

  PrepareStatsBuffer();

  _dataBin->Final();

  DrawLegend();

  // Finish record links whose master this view is
  int index = _masterLink.InitIterator();
  while(_masterLink.More(index)) {
    RecordLink *link = _masterLink.Next(index);
    link->Done();
  }
  _masterLink.DoneIterator(index);

  ReportQueryDone(bytes);
}

void TDataViewX::ReturnGDataBinRecs(TDataMap *map, void **recs, int numRecs)
{
#ifdef DEBUG
  printf("TDataViewX %d recs buf start 0x%p\n", numRecs, recs);
#endif

  WindowRep *win = GetWindowRep();

  if (IsInPileMode()) {
    ViewWin *parent = GetParent();
    DOASSERT(parent, "View has no parent");
    int index = parent->InitIterator();
    DOASSERT(parent->More(index), "Parent view has no children");
    ViewWin *vw = parent->Next(index);
    win = vw->GetWindowRep();
    parent->DoneIterator(index);
#ifdef DEBUG
    printf("Drawing view %s in view %s, window 0x%p\n",
           GetName(), vw->GetName(), win);
#endif
  }

  map->DrawGDataArray(this, win, recs, numRecs);
}

void TDataViewX::ReturnGDataBinConnectors(TDataCMap *cmap,
                                          Connector **connectors, int num)
{
#ifdef DEBUG
  printf("TDataViewX drawing %d connectors\n", num);
#endif

  for(int i = 0; i < num; i++)
    ConnectorShapeRegistrar::DrawConnection(GetWindowRep(), connectors[i]);
}

void TDataViewX::PrintStat()
{
  if (Init::PrintViewStat()) {
    View::PrintStat();
    printf("%d GData records, %d batches, %.2f per batch\n",
           _totalGData, _numBatches, 1.0 * _totalGData / _numBatches);
    _dataBin->PrintStat();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -