inline
    std::vector<int>
    buildAllCells(const int nc)
    {
        std::vector<int> all_cells(nc);

        for (int c = 0; c < nc; ++c) { all_cells[c] = c; }

        return all_cells;
    }
  void PCAFeature::train_pca()
  {
    // prepare the PCA.
    // (1) collect training examples
    cout << "PCAFeature: collecting" << endl;
    vector<shared_ptr<MetaData> > all_data; // unsupervised so we can do this
    auto load_insert_examples = [&all_data](string direct)
    {
      vector<shared_ptr<MetaData> > some_data = metadata_build_all(direct);
      all_data.insert(all_data.end(),some_data.begin(),some_data.end());
    };
    for(string&test_dir : default_test_dirs())
      load_insert_examples(test_dir);
    //load_insert_examples(default_train_dir());    
    
    // (2) collect the cells for the PCA
    shared_ptr<const ImRGBZ> im0 = cropToCells(*all_data[0]->load_im());
    int winX = im0->cols();
    int winY = im0->rows();
    unique_ptr<SubComputer> hog_for_scale(
      new SubComputer(Size(winX,winY),block_size,block_stride,cell_size));
    int nbins = hog_for_scale->getNBins();
    Mat all_cells(0,nbins,DataType<float>::type);
    for(shared_ptr<MetaData> & metadata : all_data)
    {      
      // compute all cells in the image
      shared_ptr<const ImRGBZ> im = cropToCells(*metadata->load_im());
      vector<float> feats; hog_for_scale->compute(*im,feats);
      assert(feats.size()%nbins == 0);
      for(int cell_iter = 0; cell_iter < feats.size()/nbins; cell_iter++)
      {
	// extract each cell in the image
	auto begin = feats.begin() + nbins*cell_iter;
	auto end = begin + nbins;
	vector<float> cell(begin,end);
	Mat cell_mat(cell); cell_mat = cell_mat.t();
	assert(cell_mat.rows == 1 && cell_mat.cols == nbins);
	all_cells.push_back<float>(cell_mat);
      }
    }
    
    // (3) run the PCA
    cout << "PCAFeature: computing" << endl;
    g_pca_reducer.reset(new cv::PCA(all_cells,noArray(),CV_PCA_DATA_AS_ROW,FEAT_DIM));
    cout << "PCAFeature: ready" << endl;
    
    // (4) save the PCA?
    FileStorage cache_storage("cache/PCA.yml",FileStorage::WRITE);
    cache_storage << "pca_eig_values" << g_pca_reducer->eigenvalues;
    cache_storage << "pca_eig_vectors" << g_pca_reducer->eigenvectors;
    cache_storage << "pca_mean" << g_pca_reducer->mean;
    cache_storage.release();
  }
Exemple #3
0
    void initStateBasic(const UnstructuredGrid& grid,
                        const BlackoilPropertiesInterface& props,
                        const parameter::ParameterGroup& param,
                        const double gravity,
                        State& state)
    {
        // TODO: Refactor to exploit similarity with IncompProp* case.
        const int num_phases = props.numPhases();
        if (num_phases != 2) {
            THROW("initStateTwophaseBasic(): currently handling only two-phase scenarios.");
        }
        state.init(grid, num_phases);
        const int num_cells = props.numCells();
        // By default: initialise water saturation to minimum everywhere.
        std::vector<int> all_cells(num_cells);
        for (int i = 0; i < num_cells; ++i) {
            all_cells[i] = i;
        }
        state.setFirstSat(all_cells, props, State::MinSat);
        const bool convection_testcase = param.getDefault("convection_testcase", false);
        if (convection_testcase) {
            // Initialise water saturation to max in the 'left' part.
            std::vector<int> left_cells;
            left_cells.reserve(num_cells/2);
            const int *glob_cell = grid.global_cell;
            const int* cd = grid.cartdims;
            for (int cell = 0; cell < num_cells; ++cell) {
                const int gc = glob_cell == 0 ? cell : glob_cell[cell];
                bool left = (gc % cd[0]) < cd[0]/2;
                if (left) {
                    left_cells.push_back(cell);
                }
            }
            state.setFirstSat(left_cells, props, State::MaxSat);
            const double init_p = param.getDefault("ref_pressure", 100.0)*unit::barsa;
            std::fill(state.pressure().begin(), state.pressure().end(), init_p);
        } else if (param.has("water_oil_contact")) {
            // Warn against error-prone usage.
            if (gravity == 0.0) {
                std::cout << "**** Warning: running gravity convection scenario, but gravity is zero." << std::endl;
            }
            if (grid.cartdims[2] <= 1) {
                std::cout << "**** Warning: running gravity convection scenario, which expects nz > 1." << std::endl;
            }
            // Initialise water saturation to max below water-oil contact.
            const double woc = param.get<double>("water_oil_contact");
            initWaterOilContact(grid, props, woc, WaterBelow, state);
            // Initialise pressure to hydrostatic state.
            const double ref_p = param.getDefault("ref_pressure", 100.0)*unit::barsa;
            initHydrostaticPressure(grid, props, woc, gravity, woc, ref_p, state);
        } else {
            // Use default: water saturation is minimum everywhere.
            // Initialise pressure to hydrostatic state.
            const double ref_p = param.getDefault("ref_pressure", 100.0)*unit::barsa;
            const double ref_z = grid.cell_centroids[0 + grid.dimensions - 1];
            const double woc = -1e100;
            initHydrostaticPressure(grid, props, woc, gravity, ref_z, ref_p, state);
        }

        // Finally, init face pressures.
        initFacePressure(grid, state);
    }