Пример #1
0
core::RigidBody setup_as_rigid_body(Hierarchy h) {
  IMP_USAGE_CHECK(h.get_is_valid(true),
                  "Invalid hierarchy passed to setup_as_rigid_body");
  IMP_WARN("create_rigid_body should be used instead of setup_as_rigid_body"
           << " as the former allows one to get volumes correct at coarser"
           << " levels of detail.");
  core::RigidBody rbd = core::RigidBody::setup_particle(h, get_leaves(h));
  rbd.set_coordinates_are_optimized(true);
  kernel::ParticlesTemp internal = core::get_internal(h);
  for (unsigned int i = 0; i < internal.size(); ++i) {
    if (internal[i] != h) {
      core::RigidMembers leaves(get_leaves(Hierarchy(internal[i])));
      if (!leaves.empty()) {
        algebra::ReferenceFrame3D rf = core::get_initial_reference_frame(
            get_as<kernel::ParticlesTemp>(leaves));
        core::RigidBody::setup_particle(internal[i], rf);
      }
    }
  }
  IMP_INTERNAL_CHECK(h.get_is_valid(true), "Invalid hierarchy produced");
  return rbd;
}
// react to keys
void keyboard(unsigned char k, int x, int y)
{
    switch(k)
    {
    case 27: { 
      hier.destroy();
      subRefCP(scene);
      delete all;
      Profiler::the().dump(SLOG);
      exit(0);
    }
    }
}
Пример #3
0
IMP::core::RigidBody create_compatible_rigid_body(Hierarchy h,
                                               Hierarchy reference) {
  ParticlesTemp hl= get_leaves(h);
  ParticlesTemp rl= get_leaves(reference);
  algebra::Transformation3D tr
    = algebra::get_transformation_aligning_first_to_second(rl, hl);
  algebra::Transformation3D rtr
    = core::RigidMember(reference).get_rigid_body().\
    get_reference_frame().get_transformation_to();
  algebra::Transformation3D rbtr= tr*rtr;

  Particle *rbp= new Particle(h->get_model());
  rbp->set_name(h->get_name()+" rigid body");
  ParticlesTemp all = rb_process(h);
  core::RigidBody rbd
    = core::RigidBody::setup_particle(rbp, algebra::ReferenceFrame3D(rbtr));
  for (unsigned int i=0; i< all.size(); ++i) {
    rbd.add_member(all[i]);
  }
  rbd.set_coordinates_are_optimized(true);
  IMP_INTERNAL_CHECK(h.get_is_valid(true), "Invalid hierarchy produced");
  return rbd;
}
IMPATOM_BEGIN_NAMESPACE

CHARMMStereochemistryRestraint::CHARMMStereochemistryRestraint(Hierarchy h,
                                             CHARMMTopology *topology):
  Restraint(h->get_model(), "CHARMMStereochemistryRestraint%1%")
{
  bonds_ = topology->add_bonds(h);
  angles_ = topology->get_parameters()->create_angles(bonds_);
  dihedrals_ = topology->get_parameters()->create_dihedrals(bonds_);
  impropers_ = topology->add_impropers(h);

  bond_score_ = new BondSingletonScore(new core::Harmonic(0., 1.));
  angle_score_ = new AngleSingletonScore(new core::Harmonic(0., 1.));
  dihedral_score_ = new DihedralSingletonScore();
  improper_score_ = new ImproperSingletonScore(new core::Harmonic(0., 1.));
}
Пример #5
0
Hierarchy create_fragment(const Hierarchies &ps) {
  IMP_USAGE_CHECK(!ps.empty(), "Need some particles");
  Hierarchy parent = ps[0].get_parent();
  unsigned int index = ps[0].get_child_index();
  IMP_IF_CHECK(USAGE) {
    for (unsigned int i = 0; i < ps.size(); ++i) {
      IMP_USAGE_CHECK(ps[i].get_parent() == parent, "Parents don't match");
    }
  }

  kernel::Particle *fp =
      new kernel::Particle(parent.get_particle()->get_model());
  Hierarchy fd = Fragment::setup_particle(fp);

  for (unsigned int i = 0; i < ps.size(); ++i) {
    parent.remove_child(ps[i]);
    fd.add_child(ps[i]);
  }

  parent.add_child_at(fd, index);
  return fd;
}
Пример #6
0
    //! 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");
      SetupMatrix(*Op);
      SetupExtra(H);

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

      // TODO: coarsestLevelManager

      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++;
      }

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

    } //SetupHierarchy
Пример #7
0
int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int argc, char *argv[]) {
#include <MueLu_UseShortNames.hpp>

  using Teuchos::RCP;
  using Teuchos::rcp;

  //
  // MPI initialization
  //

  Teuchos::oblackholestream blackhole;

  bool success = false;
  bool verbose = true;
  try {
    RCP< const Teuchos::Comm<int> > comm = Teuchos::DefaultComm<int>::getComm();

    //
    // Process command line arguments
    //
    Galeri::Xpetra::Parameters<GO> matrixParameters(clp, 81); // manage parameters of the test case
    Xpetra::Parameters             xpetraParameters(clp);     // manage parameters of xpetra

    switch (clp.parse(argc,argv)) {
      case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED:        return EXIT_SUCCESS;
      case Teuchos::CommandLineProcessor::PARSE_ERROR:
      case Teuchos::CommandLineProcessor::PARSE_UNRECOGNIZED_OPTION: return EXIT_FAILURE;
      case Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL:          break;
      default:;
    }

    if (comm->getRank() == 0) std::cout << xpetraParameters << matrixParameters;

    //
    // Setup test case (Ax = b)
    //

    // Distribution
    RCP<const Map> map = MapFactory::Build(lib, matrixParameters.GetNumGlobalElements(), 0, comm);

    // Matrix
    RCP<Galeri::Xpetra::Problem<Map,CrsMatrixWrap,MultiVector> > Pr =
      Galeri::Xpetra::BuildProblem<SC, LO, GO, Map, CrsMatrixWrap, MultiVector>(matrixParameters.GetMatrixType(), map, matrixParameters.GetParameterList());
    RCP<Matrix> A = Pr->BuildMatrix();

    // User defined nullspace
    RCP<MultiVector> nullSpace = VectorFactory::Build(map,1); nullSpace->putScalar((SC) 1.0);

    // Define B
    RCP<Vector> X = VectorFactory::Build(map,1);
    RCP<Vector> B = VectorFactory::Build(map,1);
    X->setSeed(846930886);
    X->randomize();
    A->apply(*X, *B, Teuchos::NO_TRANS, (SC)1.0, (SC)0.0);

    // X = 0
    X->putScalar((SC) 0.0);

    //
    // Create a multigrid configuration
    //

    // Transfer operators
    RCP<TentativePFactory> TentativePFact = rcp( new TentativePFactory() );
    RCP<SaPFactory>        SaPFact        = rcp( new SaPFactory() );
    RCP<TransPFactory>     RFact          = rcp( new TransPFactory());

    FactoryManager M;
    M.SetFactory("Ptent", TentativePFact);
    M.SetFactory("P",     SaPFact);
    M.SetFactory("R",     RFact);

    M.SetFactory("Smoother", Teuchos::null);      //skips smoother setup
    M.SetFactory("CoarseSolver", Teuchos::null);  //skips coarsest solve setup

    //
    // Multigrid setup phase
    //

    int startLevel = 0;
    int maxLevels = 10;

    std::cout << "=============== Setup transfers only ====================" << std::endl;

    Hierarchy H;
    H.SetDefaultVerbLevel(MueLu::Medium);

    RCP<Level> finestLevel = H.GetLevel();
    finestLevel->Set("A", A);
    finestLevel->Set("Nullspace", nullSpace);

    // Indicate which Hierarchy operators we want to keep
    H.Keep("P", SaPFact.get());  //SaPFact is the generating factory for P.
    H.Keep("R", RFact.get());    //RFact is the generating factory for R.
    H.Keep("Ptent", TentativePFact.get());  //SaPFact is the generating factory for P.

    H.Setup(M,startLevel,maxLevels);

    std::cout << "=============== Setup smoothers only ====================" << std::endl;

    // Create a new A.
    RCP<Matrix> newA = Pr->BuildMatrix();
    finestLevel->Set("A", newA);

    // Create Gauss-Seidel smoother.
    std::string ifpackType = "RELAXATION";
    Teuchos::ParameterList ifpackList;
    ifpackList.set("relaxation: sweeps", (LO) 3);
    ifpackList.set("relaxation: damping factor", (SC) 1.0);
    RCP<SmootherPrototype> smootherPrototype = rcp(new TrilinosSmoother(ifpackType, ifpackList));

    M.SetFactory("Smoother", rcp(new SmootherFactory(smootherPrototype)));

    // Create coarsest solver.
    RCP<SmootherPrototype> coarseSolverPrototype = rcp( new DirectSolver() );
    RCP<SmootherFactory>   coarseSolverFact      = rcp( new SmootherFactory(coarseSolverPrototype, Teuchos::null) );
    M.SetFactory("CoarseSolver", coarseSolverFact);

    // Note that we pass the number of levels back in.
    H.Setup(M,startLevel, H.GetNumLevels());

    std::cout << "=============== Solve ====================" << std::endl;

    //
    // Solve Ax = B
    //

    LO nIts = 9;
    H.Iterate(*B, *X, nIts);

    //
    // Print relative residual norm
    //

    typename Teuchos::ScalarTraits<SC>::magnitudeType residualNorms = Utilities::ResidualNorm(*A, *X, *B)[0];
    if (comm->getRank() == 0) {
      std::ios::fmtflags f(std::cout.flags());
      std::cout << "||Residual|| = " << std::setiosflags(std::ios::fixed) << std::setprecision(20) << residualNorms << std::endl;
       std::cout.flags(f);
    }

    success = true;
  }
  TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);

  return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
}
  void AdaptiveSaMLParameterListInterpreter<Scalar, LocalOrdinal, GlobalOrdinal, Node>::SetupHierarchy(Hierarchy & H) const {

    // set fine level null space
    // usually this null space is provided from outside (by the user) using
    // the ML parameter lists.
    if (this->nullspace_ != NULL) {
      RCP<Level> fineLevel = H.GetLevel(0);
      const RCP<const Map> rowMap = fineLevel->Get< RCP<Matrix> >("A")->getRowMap();
      RCP<MultiVector> nullspace = MultiVectorFactory::Build(rowMap, nullspaceDim_, true);

      for ( size_t i=0; i < Teuchos::as<size_t>(nullspaceDim_); i++) {
        Teuchos::ArrayRCP<Scalar> nullspacei = nullspace->getDataNonConst(i);
        const size_t              myLength   = nullspace->getLocalLength();

        for (size_t j = 0; j < myLength; j++) {
          nullspacei[j] = nullspace_[i*myLength + j];
        }
      }

      fineLevel->Set("Nullspace", nullspace);
    }

    // keep aggregates
    H.Keep("Aggregates", HierarchyManager::GetFactoryManager(0)->GetFactory("Aggregates").get());

    ///////////////////////////////

    // build hierarchy for initialization
    SetupInitHierarchy(H);

    {
      // do some iterations with the built hierarchy to improve the null space
      Teuchos::RCP<MueLu::Level> Finest = H.GetLevel(0);  // get finest level,MueLu::NoFactory::get()
      Teuchos::RCP<MultiVector> nspVector2 = Finest->Get<Teuchos::RCP<MultiVector> >("Nullspace");

      Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write("orig_nsp.vec", *nspVector2);

      RCP<Matrix> Op = Finest->Get<RCP<Matrix> >("A");
      Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write("A.mat", *Op);


      Teuchos::RCP<MultiVector> homogRhsVec = MultiVectorFactory::Build(nspVector2->getMap(),nspVector2->getNumVectors(),true);
      homogRhsVec->putScalar(0.0);

      // do 1 multigrid cycle for improving the null space by "solving"
      //     A B_f = 0
      // where A is the system matrix and B_f the fine level null space vectors
      H.Iterate(*homogRhsVec, *nspVector2, 1, false);

      // store improved fine level null space
      Finest->Set("Nullspace",nspVector2);

      Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write("new_nsp.vec", *nspVector2);

      //H.Delete("CoarseSolver", init_levelManagers_[0]->GetFactory("CoarseSolver").get());
    }

    {
      // do some clean up.
      // remove all old default factories. Build new ones for the second build.
      // this is a little bit tricky to understand
      for(size_t k=0; k < HierarchyManager::getNumFactoryManagers(); k++) {
        HierarchyManager::GetFactoryManager(k)->Clean();
        //Teuchos::rcp_dynamic_cast<const SingleLevelFactoryBase>(HierarchyManager::GetFactoryManager(k)->GetFactory("Smoother"))->DisableMultipleCallCheck(); // after changing to MLParamterListInterpreter functions
      }
      // not sure about this. i only need it if Smoother is defined explicitely (not using default smoother)
      // need this: otherwise RAPFactory::Build is complaining on level 0
      //            and TentativePFactory::Build is complaining on level 1
      Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(HierarchyManager::GetFactoryManager(0)->GetFactory("A"))->DisableMultipleCallCheck();
      Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(HierarchyManager::GetFactoryManager(1)->GetFactory("P"))->DisableMultipleCallCheck();
      Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(HierarchyManager::GetFactoryManager(1)->GetFactory("Ptent"))->DisableMultipleCallCheck();

      HierarchyManager::SetupHierarchy(H);
    }

  }
Пример #9
0
int main() {
   int num_l;
   int num_f;
   int dim;
   int i, j, n;
   int size_base[3];
   double bbox[6];
   double *sigma1_n, *sigma2_n, *sigma1_np1, *sigma2_np1;
   double* x, dx; 

   num_l = 11;
   num_f = 4;
   dim = 1;
   size_base[0] = 3;
   size_base[1] = 3;
   size_base[2] = 3;
   bbox[0] = -1;
   bbox[1] = 1;
   bbox[2] = -1;
   bbox[3] = 1;
   bbox[4] = -1;
   bbox[5] = 1;

   Hierarchy* hierarchy = new Hierarchy(num_l, num_f, dim, size_base, bbox);

   n = hierarchy->fields[num_l - 1][0]->n;
   sigma1_n = hierarchy->fields[num_l - 1][0]->f1d;
   sigma2_n = hierarchy->fields[num_l - 1][1]->f1d;
   sigma1_np1 = hierarchy->fields[num_l - 1][2]->f1d;
   sigma2_np1 = hierarchy->fields[num_l - 1][3]->f1d;
   x = hierarchy->coords[num_l - 1]->mesh[0]->f1d;
   dx = x[1] - x[0];
   for (i = 0; i < n; i++) {
      sigma1_n[i] = -sin(x[i]*M_PI/2.0-M_PI/2.0);
      sigma2_n[i] = 0;
      sigma1_np1[i] = -sin(x[i]*M_PI/2.0-M_PI/2.0);
      sigma2_np1[i] = 0;
   }


   double begin, end;
   double time_spent;

   //omp_set_num_threads(2);
   //printf("begin\n");
   //begin = omp_get_wtime();
   
   //hierarchy->relaxLevel(4, 1, num_l-1, f_schrodinger_opp_1d, f_schrodinger_res_1d, f_schrodinger_jac_1d);

   double t = 0.1;
   for (j = 0; j < t/(0.1*dx); j++)
   {
      printf("step:\n\n");
      for (i = 0; i < 20; i++) {
         hierarchy->vCycle(4, dx*0.1, f_schrodinger_opp_1d, 
                 f_schrodinger_jac_1d);
         printf("change %e, residual %e\n", hierarchy->change[num_l - 1], 
                 hierarchy->resid[num_l - 1]);
      }
      hierarchy->switchFields(0,2);
      hierarchy->switchFields(1,3);
   }

   hierarchy->switchFields(0,2);
   hierarchy->switchFields(1,3);
   
   //printf("after:\n");
   //end = omp_get_wtime();
   //time_spent = (end - begin);
   //printf("time spent: %lf\n", time_spent);
   
   //hierarchy->print(num_l-1);
   f_schrodinger_indep_resid_1d(dx*0.1, hierarchy->coords[num_l-1], hierarchy->fields[num_l-1]);

   delete hierarchy;

   return 0;
}
Пример #10
0
Hierarchy create_simplified_along_backbone(Chain in,
                                           const IntRanges &residue_segments,
                                           bool keep_detailed) {
  IMP_USAGE_CHECK(in.get_is_valid(true), "Chain " << in << " is not valid.");
  if (in.get_number_of_children() == 0 || residue_segments.empty()) {
    IMP_LOG_TERSE("Nothing to simplify in "
                  << (in ? in->get_name() : "nullptr") << " with "
                  << residue_segments.size() << " segments.\n");
    return Hierarchy();
  }
  for (unsigned int i = 0; i < residue_segments.size(); ++i) {
    IMP_USAGE_CHECK(residue_segments[i].first < residue_segments[i].second,
                    "Residue intervals must be non-empty");
  }
  IMP_IF_LOG(VERBOSE) {
    for (unsigned int i = 0; i < residue_segments.size(); ++i) {
      IMP_LOG_VERBOSE("[" << residue_segments[i].first << "..."
                          << residue_segments[i].second << ") ");
    }
    IMP_LOG_VERBOSE(std::endl);
  }
  unsigned int cur_segment = 0;
  Hierarchies cur;
  Hierarchy root = create_clone_one(in);
  for (unsigned int i = 0; i < in.get_number_of_children(); ++i) {
    Hierarchy child = in.get_child(i);
    int index = Residue(child).get_index();
    IMP_LOG_VERBOSE("Processing residue "
                    << index << " with range "
                    << residue_segments[cur_segment].first << " "
                    << residue_segments[cur_segment].second << std::endl);
    if (index >= residue_segments[cur_segment].first &&
        index < residue_segments[cur_segment].second) {
    } else if (!cur.empty()) {
      IMP_LOG_VERBOSE("Added particle for "
                      << residue_segments[cur_segment].first << "..."
                      << residue_segments[cur_segment].second << std::endl);
      Hierarchy cur_approx = create_approximation_of_residues(cur);
      root.add_child(cur_approx);
      if (keep_detailed) {
        for (unsigned int j = 0; j < cur.size(); ++j) {
          cur[j].get_parent().remove_child(cur[j]);
          cur_approx.add_child(cur[j]);
        }
      }
      cur.clear();
      ++cur_segment;
    }
    cur.push_back(child);
  }
  if (!cur.empty()) {
    root.add_child(create_approximation_of_residues(cur));
  }
  /*#ifdef IMP_ATOM_USE_IMP_CGAL
  double ov= get_volume(in);
  double cv= get_volume(root);
  double scale=1;
  ParticlesTemp rt= get_by_type(root, XYZR_TYPE);
  Floats radii(rt.size());
  for (unsigned int i=0; i< rt.size(); ++i) {
    core::XYZR d(rt[i]);
    radii[i]=d.get_radius();
  }
  do {
    show(root);
    double f= ov/cv*scale;
    scale*=.95;
    IMP_LOG_TERSE( "Bumping radius by " << f << std::endl);
    for (unsigned int i=0; i< rt.size(); ++i) {
      core::XYZR d(rt[i]);
      d.set_radius(radii[i]*f);
    }
    double nv=get_volume(root);
    IMP_LOG_TERSE( "Got volume " << nv << " " << ov << std::endl);
    if (nv < ov) {
      break;
    }
  } while (true);
#else
#endif*/
  IMP_INTERNAL_CHECK(root.get_is_valid(true), "Invalid hierarchy produced "
                                                  << root);
  return root;
}
Пример #11
0
Selection::Selection(Hierarchy h) : radius_(-1) {
  set_hierarchies(h.get_model(),
                  kernel::ParticleIndexes(1, h.get_particle_index()));
}
Пример #12
0
void keyStateChanged(int key, int mods)
{
    switch (key) {
        case GLFW_KEY_A:
            g_armature.AdjBase(true);
            break;
        case GLFW_KEY_D:
            g_armature.AdjBase(false);
            break;
        case GLFW_KEY_W:
            g_armature.AdjUpperArm(false);
            break;
        case GLFW_KEY_S:
            g_armature.AdjUpperArm(true);
            break;
        case GLFW_KEY_R:
            g_armature.AdjLowerArm(false);
            break;
        case GLFW_KEY_F:
            g_armature.AdjLowerArm(true);
            break;
        case GLFW_KEY_T:
            g_armature.AdjWristPitch(false);
            break;
        case GLFW_KEY_G:
            g_armature.AdjWristPitch(true);
            break;
        case GLFW_KEY_Z:
            g_armature.AdjWristRoll(true);
            break;
        case GLFW_KEY_C:
            g_armature.AdjWristRoll(false);
            break;
        case GLFW_KEY_Q:
            g_armature.AdjFingerOpen(true);
            break;
        case GLFW_KEY_E:
            g_armature.AdjFingerOpen(false);
            break;
        case GLFW_KEY_ENTER:
            g_armature.WritePose();
            break;
    }
}
Пример #13
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;
}
Пример #14
0
int main(int argc, char *argv[]) {
#include "MueLu_UseShortNames.hpp"

  using Teuchos::RCP; using Teuchos::rcp;
  using Teuchos::TimeMonitor;

  Teuchos::oblackholestream blackhole;
  Teuchos::GlobalMPISession mpiSession(&argc,&argv,&blackhole);

  bool success = false;
  bool verbose = true;
  try {
    RCP<const Teuchos::Comm<int> > comm = Teuchos::DefaultComm<int>::getComm();
    RCP<Teuchos::FancyOStream> out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
    out->setOutputToRootOnly(0);
    *out << MueLu::MemUtils::PrintMemoryUsage() << std::endl;

    //#ifndef HAVE_XPETRA_INT_LONG_LONG
    *out << "Warning: scaling test was not compiled with long long int support" << std::endl;
    //#endif

    /**********************************************************************************/
    /* SET TEST PARAMETERS                                                            */
    /**********************************************************************************/
    // Note: use --help to list available options.
    Teuchos::CommandLineProcessor clp(false);

    Xpetra::Parameters xpetraParameters(clp);             // manage parameters of xpetra

    switch (clp.parse(argc,argv)) {
      case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED:        return EXIT_SUCCESS; break;
      case Teuchos::CommandLineProcessor::PARSE_ERROR:
      case Teuchos::CommandLineProcessor::PARSE_UNRECOGNIZED_OPTION: return EXIT_FAILURE; break;
      case Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL:                               break;
    }

    //RCP<TimeMonitor> globalTimeMonitor = rcp (new TimeMonitor(*TimeMonitor::getNewTimer("ScalingTest: S - Global Time")));

    xpetraParameters.check();

    Xpetra::UnderlyingLib lib = xpetraParameters.GetLib();

    if (comm->getRank() == 0) {
      std::cout << xpetraParameters;
      // TODO: print custom parameters // Or use paramList::print()!
    }

    /**********************************************************************************/
    /* CREATE INITIAL MATRIX                                                          */
    /**********************************************************************************/
    RCP<const Map> bigMap;
    RCP<const Map> map1;
    RCP<const Map> map2;
    GO numElements = 500;
    GO numElements1 = 400;
    GO numElements2 = 100;

    //bigMap = MapFactory::Build(Xpetra::UseEpetra, numElements,  0, comm); // ok this is the problem :-)
    std::vector<size_t> stridingInfo;
    stridingInfo.push_back(1);
    map1   = StridedMapFactory::Build(lib, numElements1, 0, stridingInfo, comm, -1);
    map2   = StridedMapFactory::Build(lib, numElements2, numElements1, stridingInfo, comm, -1);

    std::vector<GlobalOrdinal> localGids; // vector with all local GIDs on cur proc
    Teuchos::ArrayView< const GlobalOrdinal > map1eleList = map1->getNodeElementList(); // append all local gids from map1 and map2
    localGids.insert(localGids.end(), map1eleList.begin(), map1eleList.end());
    Teuchos::ArrayView< const GlobalOrdinal > map2eleList = map2->getNodeElementList();
    localGids.insert(localGids.end(), map2eleList.begin(), map2eleList.end());
    Teuchos::ArrayView<GlobalOrdinal> eleList(&localGids[0],localGids.size());
    bigMap = StridedMapFactory::Build(lib, numElements, eleList, 0, stridingInfo, comm); // create full big map (concatenation of map1 and map2)

    std::vector<Teuchos::RCP<const Map> > maps;
    maps.push_back(map1); maps.push_back(map2);

    Teuchos::RCP<const Xpetra::MapExtractor<Scalar, LO, GO, Node> > mapExtractor = Xpetra::MapExtractorFactory<Scalar,LO,GO,Node>::Build(bigMap, maps);

    RCP<CrsMatrixWrap> Op11 = MueLuTests::GenerateProblemMatrix(map1,2,-1,-1);
    RCP<CrsMatrixWrap> Op22 = MueLuTests::GenerateProblemMatrix(map2,3,-2,-1);

    /*Op11->describe(*out,Teuchos::VERB_EXTREME);
      Op22->describe(*out,Teuchos::VERB_EXTREME);*/

    // build blocked operator
    Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar,LO,GO,Node> > bOp = Teuchos::rcp(new Xpetra::BlockedCrsMatrix<Scalar,LO,GO>(mapExtractor,mapExtractor,10));

    Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > crsMat11 = Op11->getCrsMatrix();
    Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > crsMat22 = Op22->getCrsMatrix();
    bOp->setMatrix(0,0,crsMat11);
    bOp->setMatrix(1,1,crsMat22);

    bOp->fillComplete();

    // build hierarchy
    Hierarchy H;
    H.SetMaxCoarseSize(50);
    RCP<Level> levelOne = H.GetLevel();
    levelOne->Set("A", Teuchos::rcp_dynamic_cast<Matrix>(bOp)); // set blocked operator

    RCP<SubBlockAFactory> A11Fact = Teuchos::rcp(new SubBlockAFactory());
    A11Fact->SetFactory("A",MueLu::NoFactory::getRCP());
    A11Fact->SetParameter("block row",Teuchos::ParameterEntry(0));
    A11Fact->SetParameter("block col",Teuchos::ParameterEntry(0));
    RCP<SubBlockAFactory> A22Fact = Teuchos::rcp(new SubBlockAFactory());
    A22Fact->SetFactory("A",MueLu::NoFactory::getRCP());
    A22Fact->SetParameter("block row",Teuchos::ParameterEntry(1));
    A22Fact->SetParameter("block col",Teuchos::ParameterEntry(1));

    RCP<TentativePFactory> P11Fact = rcp(new TentativePFactory());
    RCP<TransPFactory> R11Fact = rcp(new TransPFactory());

    RCP<TentativePFactory> P22TentFact = rcp(new TentativePFactory());
    RCP<PgPFactory> P22Fact = rcp(new PgPFactory());
    RCP<GenericRFactory> R22Fact = rcp(new GenericRFactory());

    std::string ifpackType;
    Teuchos::ParameterList ifpackList;
    ifpackList.set("relaxation: sweeps", (LO) 5);
    ifpackList.set("relaxation: damping factor", (SC) 1.0);
    ifpackType = "RELAXATION";
    ifpackList.set("relaxation: type", "Symmetric Gauss-Seidel");
    RCP<SmootherPrototype> smoProto11     = rcp( new TrilinosSmoother(ifpackType, ifpackList, 0) );
    smoProto11->SetFactory("A", A11Fact);
    RCP<SmootherPrototype> smoProto22     = rcp( new TrilinosSmoother(ifpackType, ifpackList, 0) );
    smoProto22->SetFactory("A", A22Fact);

    //RCP<SmootherPrototype> smoProto11     = rcp( new DirectSolver("", Teuchos::ParameterList(), A11Fact) );
    //RCP<SmootherPrototype> smoProto22     = rcp( new DirectSolver("", Teuchos::ParameterList(), A22Fact) );

    RCP<SmootherFactory> Smoo11Fact = rcp( new SmootherFactory(smoProto11) );
    RCP<SmootherFactory> Smoo22Fact = rcp( new SmootherFactory(smoProto22) );

    RCP<FactoryManager> M11 = rcp(new FactoryManager());
    M11->SetFactory("A", A11Fact);
    M11->SetFactory("P", P11Fact);
    M11->SetFactory("Ptent", P11Fact); //for Nullspace
    M11->SetFactory("R", R11Fact);
    M11->SetFactory("Smoother", Smoo11Fact);
    M11->SetIgnoreUserData(true);

    RCP<FactoryManager> M22 = rcp(new FactoryManager());
    M22->SetFactory("A", A22Fact);
    M22->SetFactory("P", P22Fact);
    M22->SetFactory("R", R22Fact);
    M22->SetFactory("Ptent", P22TentFact); //for both P22 and Nullspace
    M22->SetFactory("Smoother", Smoo22Fact);
    M22->SetIgnoreUserData(true);

    RCP<BlockedPFactory> PFact = rcp(new BlockedPFactory());
    PFact->AddFactoryManager(M11);
    PFact->AddFactoryManager(M22);

    RCP<GenericRFactory> RFact = rcp(new GenericRFactory());

    RCP<Factory> AcFact = rcp(new BlockedRAPFactory());

    // Smoothers
    RCP<BlockedGaussSeidelSmoother> smootherPrototype     = rcp( new BlockedGaussSeidelSmoother() );
    smootherPrototype->SetParameter("Sweeps", Teuchos::ParameterEntry(2));
    smootherPrototype->SetParameter("Damping factor", Teuchos::ParameterEntry(1.0));
    smootherPrototype->AddFactoryManager(M11,0);
    smootherPrototype->AddFactoryManager(M22,1);
    RCP<SmootherFactory>   smootherFact          = rcp( new SmootherFactory(smootherPrototype) );

    // Coarse grid correction
    RCP<BlockedGaussSeidelSmoother> coarseSolverPrototype = rcp( new BlockedGaussSeidelSmoother() );
    coarseSolverPrototype->AddFactoryManager(M11,0);
    coarseSolverPrototype->AddFactoryManager(M22,1);
    RCP<SmootherFactory>   coarseSolverFact      = rcp( new SmootherFactory(coarseSolverPrototype, Teuchos::null) );

    // main factory manager
    FactoryManager M;
    M.SetFactory("A",            AcFact);
    M.SetFactory("P",            PFact);
    M.SetFactory("R",            RFact);
    M.SetFactory("Smoother",     smootherFact); // TODO fix me
    M.SetFactory("CoarseSolver", coarseSolverFact);

    H.SetVerbLevel(MueLu::Test);
    H.Setup(M);

    std::cout << "main AcFact = " << AcFact.get() << std::endl;
    RCP<Level> l0 = H.GetLevel(0);
    RCP<Level> l1 = H.GetLevel(1);
    RCP<Level> l2 = H.GetLevel(2);

    l0->print(*out,Teuchos::VERB_EXTREME);
    l1->print(*out,Teuchos::VERB_EXTREME);
    l2->print(*out,Teuchos::VERB_EXTREME);

    // Define B
    RCP<Vector> X = VectorFactory::Build(bigMap,1);
    RCP<Vector> B = VectorFactory::Build(bigMap,1);
    X->setSeed(846930886);
    X->randomize();
    bOp->apply(*X, *B, Teuchos::NO_TRANS, (SC)1.0, (SC)0.0);

    // X = 0
    X->putScalar((SC) 0.0);

    LO nIts = 9;
    H.Iterate(*B, *X, nIts);

    success = true;
  }
  TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);

  return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
}
Пример #15
0
    //! Setup Hierarchy object
    virtual void SetupHierarchy(Hierarchy& H) const {
      TEUCHOS_TEST_FOR_EXCEPTION(!H.GetLevel(0)->IsAvailable("A"), Exceptions::RuntimeError, "No fine level operator");

#ifdef HAVE_MUELU_DEBUG
      // Reset factories' data used for debugging
      for (int i = 0; i < levelManagers_.size(); i++)
        levelManagers_[i]->ResetDebugData();

#endif

      // 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_);

      H.SetPRrebalance(doPRrebalance_);
      H.SetImplicitTranspose(implicitTranspose_);

      // 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
Пример #16
0
/*************************************************************
 * another kind of function that return a set
 ************************************************************/
std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, 
										            std::string& _cubeName, 
									                SetTypesec _typesec, 
									                std::vector<std::string>& theVector)
{
    int size = theVector.size();
    XCube* pCube = _pSch->getCube(_cubeName);
	vector<QueryMember*> QmemVector;
	vector<QueryTuple*> QtupleVector;
	
	switch(_typesec)
	{
		//函数Members的处理对象
		//对于[Time].[Time].[1995].[Q1].[Month].Members
		//theVector中应依次存有string:Time, Time, 1995, Q1, Month
	case Members:
		if (size == 0 )
		{
			cout<<"error! please input query information..."<<endl;
		}
		else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的
		{   
			if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures"))
			{
				//元数据现在还没有支持默认度量,先以第一个度量为默认的
				vector<Measure*> vecMea = pCube->getMeasures();
				vector<Measure*>::iterator meaIterator;
				if (!vecMea.empty())
				{
					for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++)
					{
						std::auto_ptr<QueryMember>pMem(new QueryMember);
	                    
						pMem->setHierarchyName("Measures");
						pMem->setLevelName("Measures");
					    pMem->setVal((*meaIterator)->getName());

						QmemVector.push_back(pMem.release());
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
					}
				}
 				
 				return QtupleVector;
			} 
			else
			{
				Dimension* pDim = pCube->getDimension(theVector.at(0));
				if (!pDim)
				{
					cout<<"error! wrong dimension name...."<<endl;
				} 
				else
				{
					//是取默认Hierarchy
					//获得的QueryMember应该是最细粒度的所有的QueryMember
					//所以在这里要作笛卡儿积(并不算纯粹的笛卡儿积),见for循环
					vector< Hierarchy* > hieVector = pDim->getHierarchies();
					Hierarchy* pHie = hieVector.at(0);//取第一个为默认Hierarchy
								//首先把Member从数据库中load出来
					pHie->LoadMembers();
					string hierarcyName = pHie->getName();
					vector<string> vecLevelName;
					vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
					vector<Level*> vecLevel = pHie->getLeveles();
					int levelSize = vecLevel.size();
					Level* pLevel = vecLevel.at(levelSize-1);
					string levelName = pLevel->getName();
					vector<Member*> vecMem = pLevel->getMembers();
					vector<Member*>::iterator memIterator;
					for (memIterator = vecMem.begin(); memIterator < vecMem.end(); memIterator++)
					{
						string memberVal = (*memIterator)->getKey();
						vector<string> vecAncestorVal;
						vector<string> vecAncestorLevel;
						vector<Member*> vecParentMems;
						vector<Member*>::iterator pMemIterator;
						vecParentMems = (*memIterator)->getAllParents();
						for (pMemIterator = vecParentMems.begin(); pMemIterator < vecParentMems.end(); pMemIterator++)
						{
							string parentVal = (*pMemIterator)->getKey();
							Level* pLevel = (*pMemIterator)->getLevel();
							string parentLevel = pLevel->getName();
							vecAncestorVal.push_back(parentVal);
							vecAncestorLevel.push_back(parentLevel);
						}
						std::auto_ptr<QueryMember>p(new QueryMember);
						p->setHierarchyName(hierarcyName);
						p->setAncestorVals(vecAncestorVal);
						p->setAncestorLevels(vecAncestorLevel);
						p->setVal(memberVal);
						p->setLevelName(levelName);
						QmemVector.push_back(p.release());
					    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					    QmemVector.pop_back();
					    QtupleVector.push_back(pTuple.release());
					}
				
				    pHie->CleanMembers();

 				    return QtupleVector;
				}
			}
		}
		else if (size == 2)
		{   
			string dimName = theVector.at(0);

			Dimension* pDim = pCube->getDimension(dimName);
			if (pDim == NULL)
			{
				cout<<"null point to dimension"<<endl;
			}
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			if (pHie == NULL)
			{
				cout<<"null point to Hierarchy"<<endl;
			}
			//首先把Member从数据库中load出来
			pHie->LoadMembers();
			string hierarcyName = pHie->getName();
			vector<string> vecLevelName;
			vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
			vector<Level*> vecLevel = pHie->getLeveles();
			int levelSize = vecLevel.size();
			Level* pLevel = vecLevel.at(levelSize-1);
			string levelName = pLevel->getName();
			vector<Member*> vecMem = pLevel->getMembers();
			vector<Member*>::iterator memIterator;
			for (memIterator = vecMem.begin(); memIterator < vecMem.end(); memIterator++)
			{
				string memberVal = (*memIterator)->getKey();
				vector<string> vecAncestorVal;
				vector<string> vecAncestorLevel;
				vector<Member*> vecParentMems;
				vector<Member*>::iterator pMemIterator;
				vecParentMems = (*memIterator)->getAllParents();
                for (pMemIterator = vecParentMems.begin(); pMemIterator < vecParentMems.end(); pMemIterator++)
                {
					string parentVal = (*pMemIterator)->getKey();
					Level* pLevel = (*pMemIterator)->getLevel();
					string parentLevel = pLevel->getName();
					vecAncestorVal.push_back(parentVal);
					vecAncestorLevel.push_back(parentLevel);
                }
				std::auto_ptr<QueryMember>p(new QueryMember);
				p->setHierarchyName(hierarcyName);
				p->setAncestorVals(vecAncestorVal);
				p->setAncestorLevels(vecAncestorLevel);
				p->setVal(memberVal);
				p->setLevelName(levelName);
				QmemVector.push_back(p.release());
			    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			pHie->CleanMembers();

 			return QtupleVector;
		} 
		else if(size == 3)
		{
			Dimension* pDim = pCube->getDimension(theVector.at(0));
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			//首先把Member从数据库中load出来
			pHie->LoadMembers();
			Level* pLevel = pHie->getLevel(theVector.at(2));

			vector<Member*> memVector1;
			memVector1 = pLevel->getMembers();
			if (memVector1.empty())
			{
				cout<<"empty member vector,do not get the members from database"<<endl;
			} 
			else{
				vector<Member*>::iterator theIterator;
				for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++)
				{
					if (*theIterator == NULL)
					{
						cout<<"do not get the members from the database!"<<endl;
					}
					string QueryMemberVal = (*theIterator)->getKey();
					std::auto_ptr<QueryMember>pMem(new QueryMember);
					pMem->setVal(QueryMemberVal);
					pMem->setLevelName(theVector.at(2));
					pMem->setHierarchyName(theVector.at(1));
					QmemVector.push_back(pMem.release());
			        std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				
			    pHie->CleanMembers();

 			    return QtupleVector;
			}	
		}
		else//出现成员等于或多于一个的情况 eg. [Time].[Time].[1995].[Q1].[Month].Members
		{
             Dimension* pDim = pCube->getDimension(theVector.at(0));
			 Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			 //首先把Member从数据库中load出来
			 pHie->LoadMembers();
			 Level* pLevel = pHie->getLevel(theVector.at(size-1));
			 vector<Member*> memVector = pLevel->getMembers();
			 vector<Member*>::iterator theIterator;
			 for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
			{
				string QueryMemberVal = (*theIterator)->getKey();
                std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal(QueryMemberVal);
				pMem->setLevelName(theVector.at(size));
				pMem->setHierarchyName(theVector.at(1));
				vector<string> ancestorVals;				
                vector<string> ancestorLevles;
				for (int i = 2; i < size-1; i++)
				{
					vector<Level*> levelVec;
					levelVec = pHie->getLeveles();
					ancestorVals.push_back(theVector.at(i));
					Level* p = levelVec.at(i);
					ancestorLevles.push_back(p->getName());
				}
				pMem->setAncestorVals(ancestorVals);
				pMem->setAncestorLevels(ancestorLevles);
				QmemVector.push_back(pMem.release());
                std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			pHie->CleanMembers();

 			return QtupleVector;
		}
	break;
 
	//函数AllMembers,参考SQL Server联机丛书
	//返回包含指定维度或级别的所有成员的集合,包括计算成员。
	//注:暂时不考虑计算成员的处理,此时功能和Members功能差不多
	case AllMembers:
		if (size == 0 )
		{
			cout<<"error! please input the query information!"<<endl;
		}
		else if (size == 1)
		{
			//取得默认Hierarchy
			//暂时只支持一个Hierarchy,即和维度名相同
			string dimensionName = theVector.at(0);
			
            string hierarchyName = dimensionName;
			std::auto_ptr<QueryMember>pMem(new QueryMember);
			pMem->setVal("All");
			pMem->setHierarchyName(hierarchyName);
			pMem->setLevelName("All");
			QmemVector.push_back(pMem.release());
            std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
		    QmemVector.pop_back();
			QtupleVector.push_back(pTuple.release());
				
 			return QtupleVector;
		} 	
		else if(size == 2)//[Time].[Time].AllMembers
		{
			string dimensionName = theVector.at(0);
            Dimension* pDim = pCube->getDimension(dimensionName);
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			std::auto_ptr<QueryMember>pMem(new QueryMember);
			pMem->setHierarchyName(pHie->getName());
			pMem->setLevelName("All");
			pMem->setVal("All");
			QmemVector.push_back(pMem.release());
			std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
			QmemVector.pop_back();
			QtupleVector.push_back(pTuple.release());

 			return QtupleVector;
		}
		else //[Time].[Time].[Year].AllMembers
		{
            Dimension* pDim = pCube->getDimension(theVector.at(0));
			 Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			 Level* pLevel = pHie->getLevel(theVector.at(size-1));
			 vector<Member*> memVector = pLevel->getMembers();
			 vector<Member*>::iterator theIterator;
			 for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
			 {
				string QueryMemberVal = (*theIterator)->getKey();
                std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal(QueryMemberVal);
				pMem->setLevelName(theVector.at(size));
				pMem->setHierarchyName(theVector.at(1));
				vector<string> ancestorVals;				
                vector<string> ancestorLevles;
				for (int i = 2; i < size-1; i++)
				{
					vector<Level*> levelVec;
					levelVec = pHie->getLeveles();
					ancestorVals.push_back(theVector.at(i));
					Level* p = levelVec.at(i);
					ancestorLevles.push_back(p->getName());
				}
				pMem->setAncestorVals(ancestorVals);
				pMem->setAncestorLevels(ancestorLevles);
				QmemVector.push_back(pMem.release());
			    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			//pHie->CleanMembers();没有加载过member

 			return QtupleVector;
		}
	break;
	case Children:
		
		//注:JPivot里面是不可能出现这种情况的
		//因为一旦出现,JPivot会自动转化成加一个CurrentMember函数
		//如:[Time].Children会自动转变成[Time].CurrentMember.Children
		string dimName = "";
		string hieName = "";
		bool isall = false;
		if (size == 1)
		{
			cout<<"error! invalid using of Children"<<endl;

		} 
		else if(size == 2)
		{
			Dimension* pDim =NULL;
            Hierarchy* pHie = NULL;
			
			if (isDimHie(theVector.at(0)))
			{
				vector<string> temp = distinct(theVector.at(0));
				dimName = temp.at(0);
				pDim = pCube->getDimension(dimName);
				assert(pDim);
				hieName = temp.at(1);
				Hierarchy* pHie = pDim->getHierarchy(hieName);
				assert(pHie);
			}
			else
			{
				dimName = theVector.at(0);
 				pDim = pCube->getDimension(theVector.at(0));
				assert(pDim);
				pHie = pDim->getDefaultHierarchy();
				hieName = pHie->getName();
				assert(pHie);
			}
			assert(pHie);
			pHie->LoadMembers();
			
			
               		
			vector<Level*> levelVec = pHie->getLeveles();
			Level* pLevel1 = levelVec.at(0);//父member所在的level
			assert(pLevel1);
			string ancestorVal = theVector.at(1);
			string ancestorLevel = pLevel1->getName();
            vector<string> valVec;
			vector<string> theVec;
			valVec.push_back(ancestorVal);
            theVec.push_back(ancestorLevel);

			Level* pLevel2 = levelVec.at(1);//查询的member所在的level
			string QueryMemberLevel = pLevel2->getName();
//  		cout<<"value:"<<theVector.at(1)<<endl;
  		Member* pm = pLevel1->getMember(theVector.at(1),NULL);////////////////////////////////
			vector<Member*> memVec = pm->getChildrenMember();
		//cout<<QueryMemberLevel<<"  "<<memVec.size()<<endl;
			vector<Member*>::iterator memIterator;
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				string QueryMemberVal = (*memIterator)->getKey();
				
                std::auto_ptr<QueryMember>p(new QueryMember(dimName,hieName,QueryMemberLevel,QueryMemberVal,valVec,theVec,isall));
                QmemVector.push_back(p.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
			pHie->CleanMembers();
 			
 			return QtupleVector;               
		}

		else if (size >= 2)
		{
			Dimension* pDim = NULL;
			Hierarchy* pHie = NULL;
            if (isDimHie(theVector.at(0)))
			{
				vector<string> temp = distinct(theVector.at(0));
				dimName = temp.at(0);
			    pDim = pCube->getDimension(temp.at(0));
				assert(pDim);
				hieName = temp.at(1);
				pHie = pDim->getHierarchy(temp.at(1));
				assert(pHie);
			}
            else
			{
				dimName = theVector.at(0);

				pDim = pCube->getDimension(theVector.at(0));
				assert(pDim);
				
				pHie = pDim->getDefaultHierarchy();
			}
            assert(pHie);
			string hieName = pHie->getName();
			pHie->LoadMembers();
			
			vector<Level*> levelVec = pHie->getLeveles();
			//children members'level
			Level* pLevel = levelVec.at(size-1);
		
			vector<Level*> parentLevels;
            vector<Level*>::iterator levelIterator;

            parentLevels.assign(levelVec.begin(),levelVec.begin()+size-1);

			vector<string> ancestorVal;
			vector<string> ancestorLevel;
			for (int i = 1; i < size; i++)
			{

				ancestorVal.push_back(theVector.at(i));
			}

			for (levelIterator = parentLevels.begin(); levelIterator < parentLevels.end(); levelIterator++)
			{
				string ancestorLevelName = (*levelIterator)->getName();
				ancestorLevel.push_back(ancestorLevelName);
			} 
		
            string firstparentMemVal = theVector.at(1);

			Member* firstparentMem = parentLevels.at(0)->getMember(firstparentMemVal, NULL);

            Member* lastParentMem = NULL; 
			if (size == 2)
			{
				assert(firstparentMem);
                lastParentMem = firstparentMem; 
			}
		
			else
			{
				for(int n = 2; n < size; n++)
				{
					//cout<<"theVector.at(n)"<<theVector.at(n)<<endl;
					firstparentMem = parentLevels.at(n-1)->getMember(theVector.at(n), firstparentMem);
					assert(firstparentMem);
				}
			}				
			lastParentMem = firstparentMem;						 
	        assert(lastParentMem);
			vector<Member*> memVec = lastParentMem->getChildrenMember();

			vector<Member*>::iterator memIterator;
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				string QueryMemberVal = (*memIterator)->getKey();
				std::auto_ptr<QueryMember>ptr(new QueryMember);
				ptr->setVal(QueryMemberVal);
				ptr->setLevelName(pLevel->getName());
				ptr->setHierarchyName(hieName);
				ptr->setDimensionName(dimName);
				ptr->setAncestorVals(ancestorVal);
				ptr->setAncestorLevels(ancestorLevel);
				ptr->setIsAll(isall);
				QmemVector.push_back(ptr.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
		
			pHie->CleanMembers();

 			return QtupleVector;
 		}
		break;
	    //下一个函数起点
	}
}
Пример #17
0
void Process::setHierarchy(Hierarchy hierarchy) throw() {
    Id id_copy = Id(getId()->getString());
    hierarchy_.setHierarchy(hierarchy.getHierarchy());
    hierarchy_.lowerLevel(id_copy);
}
Пример #18
0
/*************************************************************
 * another kind of function that return a set
 ************************************************************/
std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, 
										            std::string& _cubeName, 
									                SetTypesec _typesec, 
									                std::vector<std::string>& theVector,
													FunParam *param)
{
    int size = theVector.size();
    XCube* pCube = _pSch->getCube(_cubeName);
	vector<QueryMember*> QmemVector;
	vector<QueryTuple*> QtupleVector;

	string dimName = "";
	string hieName = "";			
	Dimension* pDim = NULL;
	Hierarchy* pHie = NULL;
				
	if (isDimHie(theVector.at(0)))
	{
		vector<string> temp = distinct(theVector.at(0));
		dimName = temp.at(0);
		pDim = pCube->getDimension(temp.at(0));
		assert(pDim);
		hieName = temp.at(1);
		pHie = pDim->getHierarchy(temp.at(1));
		assert(pHie);
	}
			  
	else
	{
		dimName = theVector.at(0);
		pDim = pCube->getDimension(theVector.at(0));
		assert(pDim);
		pHie = pDim->getDefaultHierarchy();
	}
	assert(pHie);
	hieName = pHie->getName();
	
	//首先把Member从数据库中load出来
	pHie->LoadMembers();
	
	switch(_typesec)
	{
		//函数Members的处理对象
		//对于[Time].[Time].[1995].[Q1].[Month].Members
		//theVector中应依次存有string:Time, Time, 1995, Q1, Month
	case Members:
		if (size == 0 )
		{
			cout<<"error! please input query information..."<<endl;
		}
		else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的
		{   
			if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures"))
			{
				//元数据现在还没有支持默认度量,先以第一个度量为默认的
				vector<Measure*> vecMea = pCube->getMeasures();
				vector<Measure*>::iterator meaIterator;
				if (!vecMea.empty())
				{
					for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++)
					{
						std::auto_ptr<QueryMember>pMem(new QueryMember);
	                    
						pMem->setHierarchyName("Measures");
						pMem->setLevelName("Measures");
					    pMem->setVal((*meaIterator)->getName());

						QmemVector.push_back(pMem.release());
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
					}
				}
 				
 				return QtupleVector;
			} 
			else
			{
				string hierarcyName = pHie->getName();
				vector<string> vecLevelName;
	//			vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
				
				vector<Level*> vecLevel = pHie->getLeveles();

				Member* temp = (vecLevel.at(0)->getMembers()).at(0);//获取第一个级别第一个成员
				
				getDescendants(temp,dimName,hieName,QtupleVector); // 获取该成员的所有后代
				
				pHie->CleanMembers();
				return QtupleVector;
				
			}
		}

		else if (size == 2)
		{   
			
			Level* pLevel = pHie->getLevel(theVector.at(1));
			
			vector<Member *> memVector1 = pLevel->getMembers();
			if (memVector1.empty())
			{
				cout<<"empty member vector,do not get the members from database"<<endl;
			} 
			else
			{
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++)
				{
					
				    pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				
				pHie->CleanMembers();
				
				return QtupleVector;
			}	

		} 

		else if(size >= 3)  // [Time.Time].[Month].[Day].Members
		{
			cout<<"Members funtion error,too much member"<<endl;
			return 0;
		}

	break;
 
	//函数AllMembers,参考SQL Server联机丛书
	//返回包含指定维度或级别的所有成员的集合,包括计算成员。
	//注:暂时不考虑计算成员的处理,此时功能和Members功能差不多
	case AllMembers:
		if (size == 0 )
		{
			cout<<"error! please input the query information!"<<endl;
		}

		else
		{
			if (size == 1)
			{
				std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal("All");
				pMem->setDimensionName(dimName);    // add by eason
				pMem->setHierarchyName(hieName);
				pMem->setLevelName("All");
				QmemVector.push_back(pMem.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
				return QtupleVector;
			} 	
		
			else if(size == 2)//[Time].[Quarter].AllMembers
			{
				pHie->LoadMembers();             //首先把Member从数据库中load出来 add by eason
				
				Level* pLevel = pHie->getLevel(theVector.at(size-1));
				vector<Member*> memVector = pLevel->getMembers();
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
				{
					pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();  
				
				return QtupleVector;
			}
		
			else //[Time].[Year].[Month].AllMembers
			{
				cout<<"AllMembers funtion error,too much member"<<endl;
				return 0;
			}
		}
	break;

	case Children:
		{
		//注:JPivot里面是不可能出现这种情况的
		//因为一旦出现,JPivot会自动转化成加一个CurrentMember函数
		//如:[Time].Children会自动转变成[Time].CurrentMember.Children
		
		bool isall = false;
		if (size == 1)
		{
			cout<<"error! invalid using of Children"<<endl;

		} 

		else
		{			
			vector<Level*> levelVec = pHie->getLeveles();
			
			Member* mem = levelVec.at(0)->getMember(theVector.at(1), 0);
			
			for (int i = 1; i < size-1; i++)
			{
				mem = levelVec.at(i)->getMember(theVector.at(i+1), mem); 
			}
		
			vector<Member*> memVec = mem->getChildrenMember();

			vector<Member*>::iterator memIterator;
			QueryMember * ptr;
				
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				ptr = DwMemToQryMem(*memIterator,dimName,hieName);
				QmemVector.push_back(ptr);
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
		
			pHie->CleanMembers();

 			return QtupleVector;
 		}
		
		break;
		
}
	    //下一个函数起点
		case Siblings:

			if(size >= 2){
				
				vector<Level*> levelVec = pHie->getLeveles();
				Level *pLevel = levelVec.at(0);
				
				Member* temp = levelVec.at(0)->getMember(theVector.at(1), 0);
								
				for (int i = 1; i < size-1; i++)
				{
					temp = levelVec.at(i)->getMember(theVector.at(i+1), temp); 
				    pLevel = levelVec.at(i);	//兄弟成员所在的level				
				}
								
				Member* pMem = temp->getParent();
								
				vector<Member *> memVec;
							
				if(!pMem)   //不存在父成员,如Time.1998
				{	
					memVec = pLevel->getMembers();
				}
								
				else
				{
					memVec = pMem->getChildrenMember();
				}
				
				vector<Member *>::iterator memIterator;
				QueryMember *ptr;
				
				for(memIterator = memVec.begin();memIterator != memVec.end();memIterator++)
				{
					ptr = DwMemToQryMem(*memIterator,dimName,hieName);
					QmemVector.push_back(ptr);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();
				
				return QtupleVector;
			}
			else 
			{
				cout<<"Siblings funtion error,too less member"<<endl;
				return 0;
			}
			
			break;	
	
			
	case Descendants:
		{	
			   

				Level *ancLevel;  //先代成员所在的level
				Level *decLevel;  //后代成员所在的level
				vector<Level*> levelVec = pHie->getLeveles();
				Member* ancMember = levelVec.at(0)->getMember(theVector.at(1), 0);
				
				//定位目标成员
				for (int i = 1; i < size-1; i++)
				{
					ancMember = levelVec.at(i)->getMember(theVector.at(i+1), ancMember); 
                    ancLevel = levelVec.at(i);
				}
				
				if(param->getHasIntParam() || param->getHasStrParam())
				{ 
					if(param->getHasIntParam())   //如果包含数字型参数
					{
						int num = param->getIntParam();
						decLevel = ancLevel;

						if(num>0)
						{
							// 定位目标级别
							for(int j=0;j<num;j++)
							{
								decLevel = decLevel ->getChildLevel();
								assert(decLevel);   //不存在该级别
							}
						}
					}
				
					if(param->getHasStrParam())  //如果包含字符型参数
					{
						char *str = param->getStrParam();
						// 定位目标级别
						decLevel = pHie->getLevel(str); 
						assert(decLevel);   //不存在该级别
					}

					vector<Member *> _mem = decLevel->getMembers();
					vector<QueryMember*> QmemVector;
					QueryMember* ancMem = DwMemToQryMem(ancMember,dimName,hieName);
					QueryMember* decMem;
				
					for(int i = 0; i< _mem.size(); i++)
					{
						decMem = DwMemToQryMem(_mem.at(i),dimName,hieName);
					
						//此处仍可改进,没必要遍历级别上的所有成员
						if(isAncestor(ancMem, decMem))
						{
							QmemVector.push_back(decMem);
							std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
							QmemVector.pop_back();
							QtupleVector.push_back(pTuple.release());
						}
					}
				}

				else         //如果不含参数
				{
					getDescendants(ancMember,dimName,hieName,QtupleVector);
				}

				pHie->CleanMembers();
				return QtupleVector;
		}
				break;

		case Ascendants:
		{			
					vector<Level*> levelVec = pHie->getLeveles();
					Member* decMember = levelVec.at(0)->getMember(theVector.at(1), 0);
					
					//定位目标成员
					for (int i = 1; i < size-1; i++)
					{
						decMember = levelVec.at(i)->getMember(theVector.at(i+1), decMember); 
						assert(decMember);
					}

					vector<QueryMember*> QmemVector;
					QueryMember * ancQryMem;
					Member* ancMember = decMember ;

					while(ancMember)
					{
						ancQryMem = DwMemToQryMem(ancMember,dimName,hieName);
						QmemVector.push_back(ancQryMem);
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
						ancMember = ancMember->getParent();
					}

					pHie->CleanMembers();
					return QtupleVector;
		}
					break;
	}

}
  void HierarchyUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::AddNonSerializableDataToHierarchy(HierarchyManager& HM, Hierarchy& H, const ParameterList& paramList) {
    for (ParameterList::ConstIterator it = paramList.begin(); it != paramList.end(); it++) {
      const std::string& levelName = it->first;

      // Check for mach of the form "level X" where X is a positive integer
      if (paramList.isSublist(levelName) && levelName.find("level ") == 0 && levelName.size() > 6) {
        int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
        if (levelID > 0)
        {
          // Do enough level adding so we can be sure to add the data to the right place
          for (int i = H.GetNumLevels(); i <= levelID; i++)
            H.AddNewLevel();
        }
        RCP<Level> level = H.GetLevel(levelID);

        RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.GetFactoryManager(levelID));
        TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(), Exceptions::InvalidArgument, "MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");

        // Grab the level sublist & loop over parameters
        const ParameterList& levelList = paramList.sublist(levelName);
        for (ParameterList::ConstIterator it2 = levelList.begin(); it2 != levelList.end(); it2++) {
          const std::string& name = it2->first;
          TEUCHOS_TEST_FOR_EXCEPTION(name != "A" && name != "P" && name != "R" &&
                                     name != "Nullspace" && name != "Coordinates" &&
                                     !IsParamMuemexVariable(name), Exceptions::InvalidArgument,
                                     "MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type");

          if (name == "A") {
            level->Set(name, Teuchos::getValue<RCP<Matrix > > (it2->second),NoFactory::get());
            M->SetFactory(name, NoFactory::getRCP()); // TAW: not sure about this: be aware that this affects all levels
                                                      //      However, A is accessible through NoFactory anyway, so it should
                                                      //      be fine here.
          }
          else if( name == "P" || name == "R") {
            level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData);
            level->Set(name, Teuchos::getValue<RCP<Matrix > >     (it2->second), M->GetFactory(name).get());
          }
          else if (name == "Nullspace")
          {
            level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData);
            level->Set(name, Teuchos::getValue<RCP<MultiVector > >(it2->second), NoFactory::get());
            //M->SetFactory(name, NoFactory::getRCP()); // TAW: generally it is a bad idea to overwrite the factory manager data here
                                                        // One should do this only in very special cases
          }
          else if(name == "Coordinates") //Scalar of Coordinates MV is always double
          {
            level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData);
            level->Set(name, Teuchos::getValue<RCP<Xpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> > >(it2->second), NoFactory::get());
            //M->SetFactory(name, NoFactory::getRCP()); // TAW: generally it is a bad idea to overwrite the factory manager data here
          }
          #ifdef HAVE_MUELU_MATLAB
          else
          {
            //Custom variable for Muemex
            size_t typeNameStart = name.find_first_not_of(' ');
            size_t typeNameEnd = name.find(' ', typeNameStart);
            std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
            std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::tolower);
            level->AddKeepFlag(name, NoFactory::get(), MueLu::UserData);
            if(typeName == "matrix")
              level->Set(name, Teuchos::getValue<RCP<Matrix> >(it2->second), NoFactory::get());
            else if(typeName == "multivector")
              level->Set(name, Teuchos::getValue<RCP<MultiVector> >(it2->second), NoFactory::get());
            else if(typeName == "map")
              level->Set(name, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(it2->second), NoFactory::get());
            else if(typeName == "ordinalvector")
              level->Set(name, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(it2->second), NoFactory::get());
            else if(typeName == "scalar")
              level->Set(name, Teuchos::getValue<Scalar>(it2->second), NoFactory::get());
            else if(typeName == "double")
              level->Set(name, Teuchos::getValue<double>(it2->second), NoFactory::get());
            else if(typeName == "complex")
              level->Set(name, Teuchos::getValue<std::complex<double> >(it2->second), NoFactory::get());
            else if(typeName == "int")
              level->Set(name, Teuchos::getValue<int>(it2->second), NoFactory::get());
            else if(typeName == "string")
              level->Set(name, Teuchos::getValue<std::string>(it2->second), NoFactory::get());
          }
          #endif
        }
      }
    }
  }
Пример #20
0
core::RigidBody create_rigid_body(Hierarchy h) {
  return create_rigid_body(Hierarchies(1,h), h->get_name()+" rigid body");
}
Пример #21
0
//---------------------------------------------------------
// Compute x-coordinates (LP-based approach) (for graphs)
//---------------------------------------------------------
void OptimalHierarchyLayout::computeXCoordinates(
	const Hierarchy& H,
	GraphCopyAttributes &AGC)
{
	const GraphCopy &GC = H;
	const int k = H.size();

	//
	// preprocessing: determine nodes that are considered as virtual
	//
	NodeArray<bool> isVirtual(GC);

	int i;
	for(i = 0; i < k; ++i)
	{
		const Level &L = H[i];
		int last = -1;
		for(int j = 0; j < L.size(); ++j)
		{
			node v = L[j];

			if(H.isLongEdgeDummy(v) == true) {
				isVirtual[v] = true;

				node u = v->firstAdj()->theEdge()->target();
				if(u == v) u = v->lastAdj()->theEdge()->target();

				if(H.isLongEdgeDummy(u) == true) {
					int down = H.pos(u);
					if(last != -1 && last > down) {
						isVirtual[v] = false;
					} else {
						last = down;
					}
				}
			} else
				isVirtual[v] = false;
		}
	}

	//
	// determine variables of LP
	//
	int nSegments     = 0; // number of vertical segments
	int nRealVertices = 0; // number of real vertices
	int nEdges        = 0; // number of edges not in vertical segments
	int nBalanced     = 0; // number of real vertices with deg > 1 for which
	                       // balancing constraints may be applied

	NodeArray<int> vIndex(GC,-1); // for real node: index of x[v]
	                              // for dummy: index of corresponding segment
	NodeArray<int> bIndex(GC,-1); // (relative) index of b[v]
	EdgeArray<int> eIndex(GC,-1); // for edge not in vertical segment:
	                              //   its index
	Array<int> count(GC.numberOfEdges());  // counts the number of dummy vertices
	                              // in corresponding segment that are not at
	                              // position 0

	for(i = 0; i < k; ++i)
	{
		const Level &L = H[i];
		for(int j = 0; j < L.size(); ++j) {
			node v = L[j];
			if(isVirtual[v] == true)
				continue;

			// we've found a real vertex
			vIndex[v] = nRealVertices++;
			if(v->degree() > 1)
				bIndex[v] = nBalanced++;

			// consider all outgoing edges
			edge e;
			forall_adj_edges(e,v) {
				node w = e->target();
				if(w == v)
					continue;

				// we've found an edge not belonging to a vetical segment
				eIndex[e] = nEdges++;

				if(isVirtual[w] == false)
					continue;

				// we've found a vertical segment
				count[nSegments] = 0;
				do {
					vIndex[w] = nSegments;
					const int high = H[H.rank(w)].high();
					if(high > 0) {
						if (H.pos(w) == 0 || H.pos(w) == high)
							++count[nSegments];
						else
							count[nSegments] += 2;
					}

					// next edge / dummy in segment
					e = e->adjTarget()->cyclicSucc()->theEdge();
					w = e->target();
				} while(isVirtual[w]);

				// edge following vertical segment
                eIndex[e] = nEdges++;

				++nSegments;
			}
		}
	}
//Called whenever a key on the keyboard was pressed.
//The key is given by the ''key'' parameter, which is in ASCII.
//It's often a good idea to have the escape key (ASCII value 27) call glutLeaveMainLoop() to 
//exit the program.
void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 27:
		glutLeaveMainLoop();
		return;
	case 'a': g_armature.AdjBase(true); break;
	case 'd': g_armature.AdjBase(false); break;
	case 'w': g_armature.AdjUpperArm(false); break;
	case 's': g_armature.AdjUpperArm(true); break;
	case 'r': g_armature.AdjLowerArm(false); break;
	case 'f': g_armature.AdjLowerArm(true); break;
	case 't': g_armature.AdjWristPitch(false); break;
	case 'g': g_armature.AdjWristPitch(true); break;
	case 'z': g_armature.AdjWristRoll(true); break;
	case 'c': g_armature.AdjWristRoll(false); break;
	case 'q': g_armature.AdjFingerOpen(true); break;
	case 'e': g_armature.AdjFingerOpen(false); break;
	case 32: g_armature.WritePose(); break;
	}
}