CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
TestEnum.cc
Go to the documentation of this file.
1 #include "TestEnum.hh"
2 #include "casm/casm_io/Log.hh"
3 #include "casm/clex/Supercell.hh"
4 #include "casm/clex/PrimClex.hh"
6 #include "casm/clex/ScelEnum.hh"
11 
12 extern "C" {
15  }
16 }
17 
18 namespace CASM {
19 
20  const std::string TestEnum::enumerator_name = "TestEnum";
21 
22  const std::string TestEnum::interface_help =
23  "TestEnum: \n\n"
24 
25  " supercells: ScelEnum JSON settings (default='{\"existing_only\"=true}')\n"
26  " Indicate supercells to enumerate all occupational configurations in. May \n"
27  " be a JSON array of supercell names, or a JSON object specifying \n"
28  " supercells in terms of size and unit cell. By default, all existing \n"
29  " supercells are used. See 'ScelEnum' description for details. \n\n"
30 
31  " filter: string (optional, default=None)\n"
32  " A query command to use to filter which Configurations are kept. \n"
33  "\n"
34  " Examples:\n"
35  " To enumerate all occupations in supercells up to and including size 4:\n"
36  " casm enum --method TestEnum -i '{\"supercells\": {\"max\": 4}}' \n"
37  "\n"
38  " To enumerate all occupations in all existing supercells:\n"
39  " casm enum --method TestEnum\n"
40  "\n"
41  " To enumerate all occupations in all particular supercells:\n"
42  " casm enum --method TestEnum -i \n"
43  " '{ \n"
44  " \"supercells\": { \n"
45  " \"name\": [\n"
46  " \"SCEL1_1_1_1_0_0_0\",\n"
47  " \"SCEL2_1_2_1_0_0_0\",\n"
48  " \"SCEL4_1_4_1_0_0_0\"\n"
49  " ]\n"
50  " } \n"
51  " }' \n\n";
52 
55  const jsonParser &_kwargs,
56  const Completer::EnumOption &enum_opt) {
57 
58  std::unique_ptr<ScelEnum> scel_enum = make_enumerator_scel_enum(primclex, _kwargs, enum_opt);
59  std::vector<std::string> filter_expr = make_enumerator_filter_expr(_kwargs, enum_opt);
60 
61  auto lambda = [&](Supercell & scel) {
62  return notstd::make_unique<TestEnum>(scel);
63  };
64 
65  int returncode = insert_unique_canon_configs(
67  primclex,
68  scel_enum->begin(),
69  scel_enum->end(),
70  lambda,
71  filter_expr);
72 
73  return returncode;
74  }
75 
76 
79  m_counter(
80  Array<int>(_scel.num_sites(), 0),
81  _scel.max_allowed_occupation(),
82  Array<int>(_scel.num_sites(), 1)) {
83 
84  m_current = notstd::make_cloneable<Configuration>(_scel, this->source(0), m_counter());
86  this->_initialize(&(*m_current));
87 
88  // Make sure that current() is a primitive canonical config
89  if(!_check_current()) {
90  increment();
91  }
92 
93  // set step to 0
94  if(valid()) {
95  _set_step(0);
96  }
97  _current().set_source(this->source(step()));
98  }
99 
102 
103  bool is_valid_config {false};
104 
105  while(!is_valid_config && ++m_counter) {
106 
108  is_valid_config = _check_current();
109  }
110 
111  if(m_counter.valid()) {
112  this->_increment_step();
113  }
114  else {
115  this->_invalidate();
116  }
117  _current().set_source(this->source(step()));
118  }
119 
122  return current().is_primitive() && current().is_canonical();
123  }
124 
125 }
CASM::EnumInterfaceBase * make_TestEnum_interface()
Definition: TestEnum.cc:13
bool _check_current() const
Returns true if current() is primitive and canonical.
Definition: TestEnum.cc:121
void reset_properties(ConfigDoF &_dof)
Definition: ConfigDoF.hh:202
std::vector< std::string > make_enumerator_filter_expr(const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum filter expressions.
Definition: Enumerator.cc:91
PrimClex * primclex
Definition: settings.cc:101
static const std::string enumerator_name
Definition: TestEnum.hh:37
Base class for generic use of enumerators that may be accessed through the API.
Definition: Enumerator.hh:418
virtual jsonParser source(step_type step) const
Definition: Enumerator.hh:131
Main CASM namespace.
Definition: complete.cpp:8
Represents a supercell of the primitive parent crystal structure.
Definition: Supercell.hh:37
notstd::cloneable_ptr< Configuration > m_current
Definition: TestEnum.hh:54
Template class to be specialized for each enumerator that may be accessed via the API...
Definition: Enumerator.hh:521
value_type & _current()
Access the current ObjectType by reference.
Definition: Enumerator.hh:244
void _invalidate()
Call if enumeration complete.
Definition: Enumerator.hh:169
void set_occupation(const Array< int > &newoccupation)
Set occupant variables.
step_type step() const
Increments with each enumerated object.
Definition: Enumerator.hh:113
static const std::string interface_help
Definition: TestEnum.hh:38
void increment() override
Implements increment.
Definition: TestEnum.cc:101
PrimClex is the top-level data structure for a CASM project.
Definition: PrimClex.hh:52
bool valid() const
Returns false if enumeration is complete.
Definition: Enumerator.hh:118
Counter< Array< int > > m_counter
Definition: TestEnum.hh:53
void _set_step(step_type val)
Set current step value.
Definition: Enumerator.hh:154
void set_source(const jsonParser &source)
reference current() const
Access the current ObjectType by reference.
Definition: Enumerator.hh:232
std::unique_ptr< ScelEnum > make_enumerator_scel_enum(PrimClex &primclex, const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum input options to make an ScelEnum.
Definition: Enumerator.cc:78
int insert_unique_canon_configs(std::string method, PrimClex &primclex, ScelIterator begin, ScelIterator end, ConfigEnumConstructor f, std::vector< std::string > filter_expr)
Standardizes insertion from enumerators that construct unique primitive canonical configurations...
static int run(PrimClex &primclex, const jsonParser &kwargs, const Completer::EnumOption &enum_opt)
Definition: TestEnum.cc:53
void _increment_step()
Increment current step value.
Definition: Enumerator.hh:159
TestEnum(Supercell &_scel)
Construct with a Supercell, using all permutations.
Definition: TestEnum.cc:78
Basic std::vector like container (deprecated)