HMMExperiment::HMMExperiment(std::string dataset, std::string logfile_, std::string logprogressfile_, int hs_, int nfolds_, bool shuffle_, int EMiterations_, int nworkers_, PredictionType prediction_type_, TestingStrategy testing_strat_) : logfile(logfile_, std::ofstream::app), logprogressfile(logprogressfile_, std::ofstream::out) { assert(logfile.good()); assert(logprogressfile.good()); nworkers = nworkers_; for(int iworkers=0; iworkers<nworkers; iworkers++) workers.push_back(HMMWorkerThread()); hs = hs_; nfolds = nfolds_; shuffle = shuffle_; EMiterations = EMiterations_; prediction_type = prediction_type_; testing_strat = testing_strat_; set_dataset(dataset); }
/* Return NULL if failed */ static SpglibDataset * get_dataset(SPGCONST double lattice[3][3], SPGCONST double position[][3], const int types[], const int num_atom, const int hall_number, const double symprec) { Spacegroup spacegroup; SpacegroupType spacegroup_type; SpglibDataset *dataset; Cell *cell; Primitive *primitive; spacegroup.number = 0; dataset = NULL; cell = NULL; primitive = NULL; if ((dataset = (SpglibDataset*) malloc(sizeof(SpglibDataset))) == NULL) { warning_print("spglib: Memory could not be allocated."); return NULL; } dataset->spacegroup_number = 0; strcpy(dataset->international_symbol, ""); strcpy(dataset->hall_symbol, ""); strcpy(dataset->setting, ""); dataset->origin_shift[0] = 0; dataset->origin_shift[1] = 0; dataset->origin_shift[2] = 0; dataset->n_atoms = 0; dataset->wyckoffs = NULL; dataset->equivalent_atoms = NULL; dataset->n_operations = 0; dataset->rotations = NULL; dataset->translations = NULL; dataset->n_brv_atoms = 0; dataset->brv_positions = NULL; dataset->brv_types = NULL; if ((cell = cel_alloc_cell(num_atom)) == NULL) { free(dataset); dataset = NULL; return NULL; } cel_set_cell(cell, lattice, position, types); primitive = spa_get_spacegroup(&spacegroup, cell, symprec); if ((spacegroup.number > 0) && (primitive != NULL)) { /* With hall_number > 0, specific choice is searched. */ if (hall_number > 0) { spacegroup_type = spgdb_get_spacegroup_type(hall_number); if (spacegroup.number == spacegroup_type.number) { spacegroup = spa_get_spacegroup_with_hall_number(primitive, hall_number); } else { goto err; } if (spacegroup.number == 0) { goto err; } } if (spacegroup.number > 0) { if ((set_dataset(dataset, cell, primitive->cell, &spacegroup, primitive->mapping_table, primitive->tolerance)) == 0) { goto err; } } } cel_free_cell(cell); prm_free_primitive(primitive); return dataset; err: cel_free_cell(cell); prm_free_primitive(primitive); free(dataset); dataset = NULL; return NULL; }
/*---------*/ static SpglibDataset * get_dataset(SPGCONST double lattice[3][3], SPGCONST double position[][3], const int types[], const int num_atom, const double symprec) { int attempt; int *mapping_table; double tolerance, tolerance_from_prim; Spacegroup spacegroup; SpglibDataset *dataset; Cell *cell, *primitive; dataset = (SpglibDataset*) malloc(sizeof(SpglibDataset)); dataset->spacegroup_number = 0; strcpy(dataset->international_symbol, ""); strcpy(dataset->hall_symbol, ""); strcpy(dataset->setting, ""); dataset->origin_shift[0] = 0; dataset->origin_shift[1] = 0; dataset->origin_shift[2] = 0; dataset->n_atoms = 0; dataset->wyckoffs = NULL; dataset->equivalent_atoms = NULL; dataset->n_operations = 0; dataset->rotations = NULL; dataset->translations = NULL; mapping_table = (int*) malloc(sizeof(int) * num_atom); cell = cel_alloc_cell(num_atom); cel_set_cell(cell, lattice, position, types); tolerance = symprec; for (attempt = 0; attempt < 100; attempt++) { primitive = prm_get_primitive_and_mapping_table(mapping_table, cell, tolerance); if (primitive->size > 0) { tolerance_from_prim = prm_get_current_tolerance(); spacegroup = spa_get_spacegroup_with_primitive(primitive, tolerance_from_prim); if (spacegroup.number > 0) { set_dataset(dataset, cell, primitive, &spacegroup, mapping_table, tolerance_from_prim); cel_free_cell(primitive); break; } } tolerance *= REDUCE_RATE; cel_free_cell(primitive); warning_print(" Attempt %d tolerance = %f failed.", attempt, tolerance); warning_print(" (line %d, %s).\n", __LINE__, __FILE__); } free(mapping_table); mapping_table = NULL; cel_free_cell(cell); return dataset; }