29 #include <initializer_list> 56 class Fock:
private std::vector<int>
58 using Base = std::vector<int>;
64 using value_type = Value;
65 using Reference = Value&;
66 using reference = Reference;
69 using Base::operator=;
71 using Iterator = Base::iterator;
72 using ConstIterator = Base::const_iterator;
73 using ReverseIterator = Base::reverse_iterator;
74 using ConstReverseIterator = Base::const_reverse_iterator;
87 using Base::operator[];
92 int size()
const {
return static_cast<int>(Base::size()); }
95 void pushBack(Value n) { Base::push_back(n); }
96 void popBack() { Base::pop_back(); }
120 std::equal(f.begin(), f.end(), g.begin());
131 return std::lexicographical_compare(f.begin(), f.end(),
183 using Base = std::set<Fock>;
187 using Set = std::set<Fock>;
193 using Iterator = Base::iterator;
194 using ConstIterator = Base::const_iterator;
195 using ReverseIterator = Base::reverse_iterator;
196 using ConstReverseIterator = Base::const_reverse_iterator;
209 int size()
const {
return static_cast<int>(Base::size()); }
215 using Base::operator=;
218 Basis(std::initializer_list<Fock> il): Base(il) {}
219 explicit Basis(
int nphot,
int modes);
225 Basis &generateBasis(
const int nphot,
const int modes,
const Fock &head =
Fock());
226 Basis postselect(
const Fock &ancilla)
const;
227 template<
typename ExecPolicy = execution::Seq>
236 class State:
private std::map<Fock, Complex>
238 using Base = std::map<Fock, Complex>;
241 using Element = std::pair<Fock, Complex>;
242 using Map = std::map<Fock, Complex>;
243 using Value = Complex;
244 using value_type = Value;
245 using Reference = Value&;
246 using reference = Reference;
248 using Iterator = Base::iterator;
249 using ConstIterator = Base::const_iterator;
250 using ReverseIterator = Base::reverse_iterator;
251 using ConstReverseIterator = Base::const_reverse_iterator;
263 int size()
const {
return static_cast<int>(Base::size()); }
264 using Base::operator[];
270 using Base::operator=;
273 State(
const Map &m): Base(m) {}
276 State(
const Basis &b): Base() { setBasis(b); }
285 State operator-()
const;
288 State operator/(Complex x)
const;
289 State &operator/=(Complex x);
293 State postselect(
const Fock &ancilla)
const;
294 std::map<Fock, State> postselect(
int modes)
const;
295 std::map<Fock, State> postselect(
const Basis &b)
const;
296 Basis getBasis()
const;
297 void setBasis(
const Basis &b);
298 std::vector<State::Value> getAmplitudes()
const;
299 template<
typename ExecPolicy = execution::Seq>
300 void setAmplitudes(
const std::vector<Complex> &s);
301 template<
typename ExecPolicy = execution::Seq>
310 std::ostream &operator<<(std::ostream &stream,
const linopt::Fock &f);
311 std::ostream &operator<<(std::ostream &stream,
const linopt::Basis &b);
312 std::ostream &operator<<(std::ostream &stream,
const linopt::State::Element &e);
313 std::ostream &operator<<(std::ostream &stream,
const linopt::State &s);
bool operator<=(const Fock &f, const Fock &g)
Compares two Fock states in lexicographic order.
Definition: states.h:160
State()
Default constructor.
Definition: states.h:272
The class representing a linear optical state.
Definition: states.h:236
The main namespace containing all library classes, functions, etc.
Definition: circuit.h:28
Fock operator*(const Fock &f) const
Returns a tensor product of *this and f.
Definition: states.cpp:71
Fock & operator+=(const Fock &f)
Effectively equivalent to *this = (*this) + f.
Definition: states.cpp:102
Fock operator+(const Fock &f) const
Returns a sum of two Fock states (elementwise addition of corresponding occupation numbers)...
Definition: states.cpp:93
Real prodFact() const
Returns a product of factorials of occupation numbers.
Definition: states.cpp:60
Complex dot(const State &a, const State &b)
Calculates a dot (scalar) product.
Definition: states.cpp:434
bool operator!=(const Fock &f, const Fock &g)
Tests whether two Fock states differ.
Definition: states.h:138
Fock & operator*=(const Fock &f)
Effectively equivalent to *this = (*this) * f.
Definition: states.cpp:80
The class representing a Fock state.
Definition: states.h:56
std::vector< int > Vector
Convenience typedef to std::vector.
Definition: states.h:62
State(const Fock &f)
Constructs a state from fock with unit amplitude.
Definition: states.h:275
bool operator<(const Fock &f, const Fock &g)
Compares two Fock states in lexicographic order.
Definition: states.h:129
The class representing a collection of Fock states.
Definition: states.h:181
bool operator>(const Fock &f, const Fock &g)
Compares two Fock states in lexicographic order.
Definition: states.h:149
int size() const
Returns the number of modes in a Fock state.
Definition: states.h:92
bool operator>=(const Fock &f, const Fock &g)
Compares two Fock states in lexicographic order.
Definition: states.h:171
Fock(const Vector &v)
Construct a Fock state from a fock::vector_class.
Definition: states.h:105
bool operator==(const Fock &f, const Fock &g)
Tests whether two Fock states are equal.
Definition: states.h:117
std::function< Complex(const Fock &)> FockAmpFunction
A typedef of a function taking a Fock state as an argument and returning a corresponding complex_type...
Definition: states.h:44
State operator-(const State &s) const
Subtracts two states.
Definition: states.h:281
int size() const
Returns the number of Fock states in the basis.
Definition: states.h:209
Fock()=default
Default constructor.
int total() const
Returns the total number of photons in all modes.
Definition: states.cpp:41
std::set< Fock > Set
Convenience typedef to std::set.
Definition: states.h:187