-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.cpp
71 lines (68 loc) · 1.79 KB
/
registry.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "registry.hpp"
#include "../json.hpp"
#include "bosons/1d/bose_hubbard_1d.hpp"
#include "spin_half/1d/calabrese_2020.hpp"
#include "spin_half/1d/heisenberg_1d.hpp"
#include "spin_half/1d/ising_lr_1d.hpp"
#include "spin_half/1d/transverse_ising_1d.hpp"
#include "spin_half/1d/vitagliano_2010.hpp"
#include "spin_half/1d/xy_inhom.hpp"
#include "spin_half/1d/xy_spin_glass_1d.hpp"
#include "spin_half/2d/ising_lr_square.hpp"
#include "spin_half/2d/transverse_ising_square.hpp"
#include <fmt/core.h>
#include <map>
#include <nlohmann/json.hpp>
#include <stdexcept>
#include <string>
auto createModel(const json &js) -> std::shared_ptr<Model>
{
const auto name = js["name"].get<std::string>();
Model *model = nullptr;
// FIXME: implement a nicer way to register models.
if (name == "BoseHubbard1D")
{
model = new BoseHubbard1D(js);
}
else if (name == "TransverseIsing1D")
{
model = new TransverseIsing1D(js);
}
else if (name == "Heisenberg1D")
{
model = new Heisenberg1D(js);
}
else if (name == "XYSpinGlass1D")
{
model = new XYSpinGlass1D(js);
}
else if (name == "XYInhom1D")
{
model = new XYInhom::XYInhom(js);
}
else if (name == "TransverseIsingSquare")
{
model = new TransverseIsingSquare(js);
}
else if (name == "IsingLR1D")
{
model = new IsingLR1D(js);
}
else if (name == "IsingLRSquare")
{
model = new IsingLRSquare(js);
}
else if (name == "Vitagliano2010")
{
model = new Vitagliano2010::XXModel(js);
}
else if (name == "Calabrese2020")
{
model = new Calabrese2020(js);
}
else
{
throw std::runtime_error(fmt::format("Unknown model: {}", name));
}
return std::shared_ptr<Model>(model);
}