//! Setup Hierarchy object
    virtual void SetupHierarchy(Hierarchy& H) const {
      TEUCHOS_TEST_FOR_EXCEPTION(!H.GetLevel(0)->IsAvailable("A"), Exceptions::RuntimeError, "No fine level operator");

      // Setup Matrix
      // TODO: I should certainly undo this somewhere...
      RCP<Level>  l  = H.GetLevel(0);
      RCP<Matrix> Op = l->Get<RCP<Matrix> >("A");

      Xpetra::UnderlyingLib lib = Op->getRowMap()->lib();
      H.setlib(lib);

      SetupMatrix(*Op);
      SetupExtra(H);

      // Setup Hierarchy
      H.SetMaxCoarseSize(maxCoarseSize_);
      H.SetDefaultVerbLevel(verbosity_);
      if (graphOutputLevel_ >= 0)
        H.EnableGraphDumping("dep_graph.dot", graphOutputLevel_);

      // TODO: coarsestLevelManager

      H.Clear();

      int  levelID     = 0;
      int  lastLevelID = numDesiredLevel_ - 1;
      bool isLastLevel = false;

      while (!isLastLevel) {
        bool r = H.Setup(levelID,
                         LvlMngr(levelID-1, lastLevelID),
                         LvlMngr(levelID,   lastLevelID),
                         LvlMngr(levelID+1, lastLevelID));

        isLastLevel = r || (levelID == lastLevelID);
        levelID++;
      }
      RCP<Teuchos::FancyOStream> fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
      fos->setOutputToRootOnly(0);
      H.print(*fos,verbosity_);

      // When we reuse hierarchy, it is necessary that we don't
      // change the number of levels. We also cannot make requests
      // for coarser levels, because we don't construct all the
      // data on previous levels. For instance, let's say our first
      // run constructed three levels. If we try to do requests during
      // next setup for the fourth level, it would need Aggregates
      // which we didn't construct for level 3 because we reused P.
      // To fix this situation, we change the number of desired levels
      // here.
      numDesiredLevel_ = levelID;

      WriteData<Matrix>(H, matricesToPrint_,     "A");
      WriteData<Matrix>(H, prolongatorsToPrint_, "P");
      WriteData<Matrix>(H, restrictorsToPrint_,  "R");

    } //SetupHierarchy
示例#2
0
int main(int argc, char** argv) {
  // Initialize Google's logging library.
  google::InitGoogleLogging(argv[0]);
  google::ParseCommandLineFlags(&argc, &argv, true);

  if (FLAGS_logging) {
    FLAGS_logtostderr = 1;
  }

  if (FLAGS_input.empty()) {
    std::cerr << "Input file not specified. Specify via -input.\n";
    return 1;
  }

  // Determine conversion mode.
  enum ConvMode { CONV_TEXT, CONV_BINARY, CONV_BITMAP_ID, CONV_BITMAP_COLOR, STRIP };
  ConvMode mode = CONV_TEXT;
  float hier_level = 0;
  std::string dest_filename;

  if (FLAGS_text_format) {
    mode = CONV_TEXT;
    std::cout << "Converting to text.";
  } else if (FLAGS_binary_format) {
    mode = CONV_BINARY;
    std::cout << "Converting to binary format.";
  } else if (FLAGS_bitmap_ids >= 0) {
    mode = CONV_BITMAP_ID;
    hier_level = FLAGS_bitmap_ids;
    std::cout << "Converting to id bitmaps for hierarchy level: " << hier_level << "\n";
  } else if (FLAGS_bitmap_color >= 0) {
    mode = CONV_BITMAP_COLOR;
    hier_level = FLAGS_bitmap_color;
    std::cout << "Converting to color bitmaps for hierarchy level: "
              << hier_level << "\n";
  } else if (!FLAGS_strip.empty()) {
    mode = STRIP;
    dest_filename = FLAGS_strip;
  } else {
    std::cout << "Unknown mode specified.\n";
    return 1;
  }
  std::string filename = FLAGS_input;

  // Read segmentation file.
  // Don't need rasterization when we are stripping file.
  const bool valid_rasterization = !FLAGS_strip.empty();
  SegmentationReader segment_reader(filename, valid_rasterization);
  segment_reader.OpenFileAndReadHeaders();
  std::vector<int> segment_headers = segment_reader.GetHeaderFlags();

  std::cout << "Segmentation file " << filename << " contains "
            << segment_reader.NumFrames() << " frames.\n";

  SegmentationWriter* writer = nullptr;
  bool use_vectorization = false;
  if (mode == STRIP) {
    writer = new SegmentationWriter(dest_filename);
    std::vector<int> header_entries;
    if (!FLAGS_use_rasterization && segment_headers.size() > 0) {
      header_entries.push_back(use_vectorization = segment_headers[0]);
    } else {
      header_entries.push_back(0);
    }

    header_entries.push_back(0);   // No shape moments.

    if (!writer->OpenFile(header_entries)) {
      std::cout << "Could not open destination file.\n";
      delete writer;
      return 1;
    }

    LOG(INFO) << "Stripping files with " << (use_vectorization ? "vectorization"
                                                               : "rasterization"); 
  }

  Hierarchy hierarchy;
  const int chunk_size = 100;    // By default use chunks of 100 frames.
  int absolute_level = -1;
  // Use absolute level if supplied.
  if (hier_level == 0 || hier_level >= 1) {
    absolute_level = hier_level;
  }

  for (int f = 0; f < segment_reader.NumFrames(); ++f) {
    segment_reader.SeekToFrame(f);

    // Read from file.
    SegmentationDesc segmentation;
    segment_reader.ReadNextFrame(&segmentation);

    if (segmentation.hierarchy_size() > 0) {
      hierarchy.Clear();
      hierarchy.MergeFrom(segmentation.hierarchy());
      // Convert fractional to constant absolute level.
      if (absolute_level < 0) {
        absolute_level = hier_level * (float)hierarchy.size();
        LOG(INFO) << "Selecting level " << absolute_level << " of " << hierarchy.size()
                  << std::endl;
      }
    }

    std::string curr_file = FLAGS_output_dir + "/";
    if (mode == CONV_TEXT) {
      curr_file += base::StringPrintf("frame%05d.pbtxt", f);
    } else if (mode == CONV_BINARY) {
      curr_file += base::StringPrintf("frame%05d.pb", f);
    } else {
      curr_file += base::StringPrintf("frame%05d.png", f);
    }

    if (f % 5 == 0) {
      std::cout << "Writing frame " << f << " of "
                << segment_reader.NumFrames() << "\n";
    }

    int frame_width = segmentation.frame_width();
    int frame_height = segmentation.frame_height();

    if (mode == CONV_BINARY) {
      std::ofstream ofs(curr_file, std::ios_base::out | std::ios_base::binary);
      segmentation.SerializeToOstream(&ofs);
    } else if (mode == CONV_TEXT) {
      std::ofstream ofs(curr_file, std::ios_base::out);
      ofs << segmentation.DebugString();
    } else if (mode == CONV_BITMAP_ID) {
      cv::Mat id_image(frame_height, frame_width, CV_32S);
      SegmentationDescToIdImage(absolute_level,
                                segmentation,
                                &hierarchy,
                                &id_image);

      // Get 4 channel view via evil casting.
      cv::Mat id_image_view(frame_height, frame_width, CV_8UC4, id_image.ptr<uint8_t>(0));

      // Discard most significant 8bit (little endian).
      vector<cv::Mat> id_channels;
      cv::split(id_image_view, id_channels);
      cv::Mat frame_buffer(frame_height, frame_width, CV_8UC3);
      cv::merge(&id_channels[0], 3, frame_buffer);
      cv::imwrite(curr_file, frame_buffer);
    } else if (mode == CONV_BITMAP_COLOR) {
      cv::Mat frame_buffer(frame_height, frame_width, CV_8UC3);
      RenderRegionsRandomColor(absolute_level,
                               true,
                               false,
                               segmentation,
                               &hierarchy,
                               &frame_buffer);
      cv::imwrite(curr_file, frame_buffer);
    } else if (mode == STRIP) {
      std::string stripped_data;
      StripToEssentials(segmentation,
                        use_vectorization,
                        false,   // no shape moments.
                        &stripped_data);
      writer->AddSegmentationDataToChunk(stripped_data, f);
      if (f > 0 && f % chunk_size == 0) {
        writer->WriteChunk();
      }
    }
  }

  if (mode == STRIP) {
    writer->WriteTermHeaderAndClose();
    delete writer;
  }

  segment_reader.CloseFile();
  return 0;
}