-
Notifications
You must be signed in to change notification settings - Fork 201
Expand file tree
/
Copy pathunitaryspace.h
More file actions
65 lines (51 loc) · 1.77 KB
/
unitaryspace.h
File metadata and controls
65 lines (51 loc) · 1.77 KB
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
// Copyright 2019 Google LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef UNITARYSPACE_H_
#define UNITARYSPACE_H_
#include <cstdint>
namespace qsim {
namespace unitary {
/**
* Abstract class containing routines for general unitary matrix manipulations.
* "AVX", "AVX512", "Basic", and "SSE" implementations are provided.
*/
template <typename Impl,
template<typename...> class VectorSpace, typename... VSTypeParams>
class UnitarySpace : public VectorSpace<Impl, VSTypeParams...> {
private:
using Base = VectorSpace<Impl, VSTypeParams...>;
public:
using fp_type = typename Base::fp_type;
using Unitary = typename Base::Vector;
template <typename... ForArgs>
UnitarySpace(ForArgs&&... args) : Base(args...) {}
static Unitary CreateUnitary(unsigned num_qubits) {
return Base::Create(num_qubits);
}
static Unitary CreateUnitary(fp_type* p, unsigned num_qubits) {
return Base::Create(p, num_qubits);
}
static Unitary NullUnitary() {
return Base::Null();
}
static uint64_t Size(unsigned num_qubits) {
return uint64_t{1} << num_qubits;
};
void CopyUnitary(const Unitary& src, Unitary& dest) const {
Base::Copy(src, dest);
}
};
} // namespace unitary
} // namespace qsim
#endif // UNITARYSPACE_H_