Quantum Machine Learning Constructors
Besides the arbitrary Hamiltonian constructors , Qadence also provides a complete set of program constructors useful for digital-analog quantum machine learning programs.
Feature Maps
A few feature maps are directly available for feature loading,
from qadence import feature_map
n_qubits = 3
fm = feature_map ( n_qubits , fm_type = "fourier" )
fm = feature_map ( n_qubits , fm_type = "chebyshev" )
fm = feature_map ( n_qubits , fm_type = "tower" )
Fourier = Kro n Block( 0 , 1 , 2 ) [ ta g : FM ]
├── RX( 0 ) [ params : [ 'phi' ]]
├── RX( 1 ) [ params : [ 'phi' ]]
└── RX( 2 ) [ params : [ 'phi' ]]
Chebyshev Kro n Block( 0 , 1 , 2 ) [ ta g : FM ]
├── RX( 0 ) [ params : [ ' 2 *acos(phi)' ]]
├── RX( 1 ) [ params : [ ' 2 *acos(phi)' ]]
└── RX( 2 ) [ params : [ ' 2 *acos(phi)' ]]
Tower Kro n Block( 0 , 1 , 2 ) [ ta g : FM ]
├── RX( 0 ) [ params : [ ' 2 *acos(phi)' ]]
├── RX( 1 ) [ params : [ ' 4 *acos(phi)' ]]
└── RX( 2 ) [ params : [ ' 6 *acos(phi)' ]]
Hardware-Efficient Ansatz
Ansatze blocks for quantum machine-learning are typically built following the Hardware-Efficient Ansatz formalism (HEA). Both fully digital and digital-analog HEAs can easily be built with the hea
function. By default, the digital version is returned:
from qadence import hea
from qadence.draw import display
n_qubits = 3
depth = 2
ansatz = hea ( n_qubits , depth )
%3
11f0663d19b6471c9fb77d5d84fb4471
0
98441540942d4319a93462736c537233
RX(theta₀)
11f0663d19b6471c9fb77d5d84fb4471--98441540942d4319a93462736c537233
3c183c56aeb34c98b8217475cb7a73ff
1
f59aec44209b44018d2c92eb031e63c6
RY(theta₃)
98441540942d4319a93462736c537233--f59aec44209b44018d2c92eb031e63c6
6abcb1c2d9844dfca62dfba4de1809e4
RX(theta₆)
f59aec44209b44018d2c92eb031e63c6--6abcb1c2d9844dfca62dfba4de1809e4
3dc65f416c144f328fb9c0a5d8b4d698
6abcb1c2d9844dfca62dfba4de1809e4--3dc65f416c144f328fb9c0a5d8b4d698
3e6f507c28444b1ca4f5202c4a30d607
3dc65f416c144f328fb9c0a5d8b4d698--3e6f507c28444b1ca4f5202c4a30d607
5328dc434bb4469091871e4009bed4d3
RX(theta₉)
3e6f507c28444b1ca4f5202c4a30d607--5328dc434bb4469091871e4009bed4d3
32f87769899842bc893be1b2d7848acb
RY(theta₁₂)
5328dc434bb4469091871e4009bed4d3--32f87769899842bc893be1b2d7848acb
f417fde3c30841a7842519e2379ac207
RX(theta₁₅)
32f87769899842bc893be1b2d7848acb--f417fde3c30841a7842519e2379ac207
a0aa51e274b848719cb8174f22f059bc
f417fde3c30841a7842519e2379ac207--a0aa51e274b848719cb8174f22f059bc
9e5ba65ea935431c88e8746c10c72890
a0aa51e274b848719cb8174f22f059bc--9e5ba65ea935431c88e8746c10c72890
5dfa9202258f4a839a37ff4004f5a5d8
9e5ba65ea935431c88e8746c10c72890--5dfa9202258f4a839a37ff4004f5a5d8
06fbd84c85554665a62c73a4072f2e1e
50d7b183143b4d8c9a7f8a8e3bc8baea
RX(theta₁)
3c183c56aeb34c98b8217475cb7a73ff--50d7b183143b4d8c9a7f8a8e3bc8baea
8e45e357116b4fbdb0cc3295c37c429f
2
25b340d31dc64ff09f70fd47675890e5
RY(theta₄)
50d7b183143b4d8c9a7f8a8e3bc8baea--25b340d31dc64ff09f70fd47675890e5
3f3438b4e5c446bdb08810820e035c68
RX(theta₇)
25b340d31dc64ff09f70fd47675890e5--3f3438b4e5c446bdb08810820e035c68
95e0aaadb01943e5b5aa842fdfe7d3ae
X
3f3438b4e5c446bdb08810820e035c68--95e0aaadb01943e5b5aa842fdfe7d3ae
95e0aaadb01943e5b5aa842fdfe7d3ae--3dc65f416c144f328fb9c0a5d8b4d698
71ecfc1355294367bfe2e5f7ad04d154
95e0aaadb01943e5b5aa842fdfe7d3ae--71ecfc1355294367bfe2e5f7ad04d154
159bfbe5d56346f886b27d3f660d4199
RX(theta₁₀)
71ecfc1355294367bfe2e5f7ad04d154--159bfbe5d56346f886b27d3f660d4199
4124e4f59c3f4f42a1443a9d959db814
RY(theta₁₃)
159bfbe5d56346f886b27d3f660d4199--4124e4f59c3f4f42a1443a9d959db814
2decf678f3bf47a8a7f76823c78ce9e4
RX(theta₁₆)
4124e4f59c3f4f42a1443a9d959db814--2decf678f3bf47a8a7f76823c78ce9e4
6922d5d00f3f4955952c76d4329532f5
X
2decf678f3bf47a8a7f76823c78ce9e4--6922d5d00f3f4955952c76d4329532f5
6922d5d00f3f4955952c76d4329532f5--a0aa51e274b848719cb8174f22f059bc
167e5af1572b44e2ac3cd1d8b2b720d8
6922d5d00f3f4955952c76d4329532f5--167e5af1572b44e2ac3cd1d8b2b720d8
167e5af1572b44e2ac3cd1d8b2b720d8--06fbd84c85554665a62c73a4072f2e1e
ae918bfb099346e5a13a42871536efc1
707410e69fb446389679c0d677bbba70
RX(theta₂)
8e45e357116b4fbdb0cc3295c37c429f--707410e69fb446389679c0d677bbba70
ce5ba182da584ec3be3bf5e60df05b1e
RY(theta₅)
707410e69fb446389679c0d677bbba70--ce5ba182da584ec3be3bf5e60df05b1e
34293be03d424401918cd71681e4ce5c
RX(theta₈)
ce5ba182da584ec3be3bf5e60df05b1e--34293be03d424401918cd71681e4ce5c
4e898d7b7fee428b8a10c605988c3e15
34293be03d424401918cd71681e4ce5c--4e898d7b7fee428b8a10c605988c3e15
d66200b665af4c84820aca4950633688
X
4e898d7b7fee428b8a10c605988c3e15--d66200b665af4c84820aca4950633688
d66200b665af4c84820aca4950633688--71ecfc1355294367bfe2e5f7ad04d154
acbbe78f6f034d9e91514f67bf323caf
RX(theta₁₁)
d66200b665af4c84820aca4950633688--acbbe78f6f034d9e91514f67bf323caf
bc64c4c79e3245ebaebd1be34909dd87
RY(theta₁₄)
acbbe78f6f034d9e91514f67bf323caf--bc64c4c79e3245ebaebd1be34909dd87
09f6cce9bcea43dfb191e17f7a7d8067
RX(theta₁₇)
bc64c4c79e3245ebaebd1be34909dd87--09f6cce9bcea43dfb191e17f7a7d8067
0464fb6b3d5849f394d34bb3fcf9c733
09f6cce9bcea43dfb191e17f7a7d8067--0464fb6b3d5849f394d34bb3fcf9c733
12447a5eadc64736a718545612568fb0
X
0464fb6b3d5849f394d34bb3fcf9c733--12447a5eadc64736a718545612568fb0
12447a5eadc64736a718545612568fb0--167e5af1572b44e2ac3cd1d8b2b720d8
12447a5eadc64736a718545612568fb0--ae918bfb099346e5a13a42871536efc1
As seen above, the rotation layers are automatically parameterized, and the prefix "theta"
can be changed with the param_prefix
argument.
Furthermore, both the single-qubit rotations and the two-qubit entangler can be customized with the operations
and entangler
argument. The operations can be passed as a list of single-qubit rotations, while the entangler should be either CNOT
, CZ
, CRX
, CRY
, CRZ
or CPHASE
.
from qadence import RX , RY , CPHASE
ansatz = hea (
n_qubits = n_qubits ,
depth = depth ,
param_prefix = "phi" ,
operations = [ RX , RY , RX ],
entangler = CPHASE
)
%3
85162bbc45584a56bbe50378b758dfc9
0
d2f5129c2d1e4d2a83f1d166cc94c122
RX(phi₀)
85162bbc45584a56bbe50378b758dfc9--d2f5129c2d1e4d2a83f1d166cc94c122
8e3724f8e9d144b8b1759c5585fa2320
1
94d51bbff1694241ad5ba1f6d056a22c
RY(phi₃)
d2f5129c2d1e4d2a83f1d166cc94c122--94d51bbff1694241ad5ba1f6d056a22c
452bcf99eb984065b6f05490d09c3f63
RX(phi₆)
94d51bbff1694241ad5ba1f6d056a22c--452bcf99eb984065b6f05490d09c3f63
a659be2eb0fa42c7a5e30403cced4283
452bcf99eb984065b6f05490d09c3f63--a659be2eb0fa42c7a5e30403cced4283
189a88f7cb94468b900ed67dd58ca5f0
a659be2eb0fa42c7a5e30403cced4283--189a88f7cb94468b900ed67dd58ca5f0
0d29ca6da1d54baab5faa949eff11d7e
RX(phi₉)
189a88f7cb94468b900ed67dd58ca5f0--0d29ca6da1d54baab5faa949eff11d7e
867fa1fe36bf4e8ba89d1ae888810ad6
RY(phi₁₂)
0d29ca6da1d54baab5faa949eff11d7e--867fa1fe36bf4e8ba89d1ae888810ad6
c92f292ca3f64a6a859d48856c84f73b
RX(phi₁₅)
867fa1fe36bf4e8ba89d1ae888810ad6--c92f292ca3f64a6a859d48856c84f73b
e2b735a48c3f43c9aaeebf168ac4c9c4
c92f292ca3f64a6a859d48856c84f73b--e2b735a48c3f43c9aaeebf168ac4c9c4
0ae0df5af4b9453fbd0333e5829f9f55
e2b735a48c3f43c9aaeebf168ac4c9c4--0ae0df5af4b9453fbd0333e5829f9f55
78238345188f4097b73aa90e5da480a3
0ae0df5af4b9453fbd0333e5829f9f55--78238345188f4097b73aa90e5da480a3
f81d45e45da742e98abc21c2d6b3daa1
3197580b870d44cb846e8ff73d6ad73f
RX(phi₁)
8e3724f8e9d144b8b1759c5585fa2320--3197580b870d44cb846e8ff73d6ad73f
6f460e832e5c4d85a52b5ff04c9c368a
2
bd72b29a49de4683bcd45eb8b4cb192d
RY(phi₄)
3197580b870d44cb846e8ff73d6ad73f--bd72b29a49de4683bcd45eb8b4cb192d
694402cc6cd94ee08f75674d5af0c6fd
RX(phi₇)
bd72b29a49de4683bcd45eb8b4cb192d--694402cc6cd94ee08f75674d5af0c6fd
3fb3e72c8f614d2ca7461661eb8be639
PHASE(phi_ent₀)
694402cc6cd94ee08f75674d5af0c6fd--3fb3e72c8f614d2ca7461661eb8be639
3fb3e72c8f614d2ca7461661eb8be639--a659be2eb0fa42c7a5e30403cced4283
cef166efe55347ed9b578537161deb3b
3fb3e72c8f614d2ca7461661eb8be639--cef166efe55347ed9b578537161deb3b
12da0cd420a54f4e8ade93ef9f3db98a
RX(phi₁₀)
cef166efe55347ed9b578537161deb3b--12da0cd420a54f4e8ade93ef9f3db98a
186de9dcb7984aeea518bcc6817e9f2f
RY(phi₁₃)
12da0cd420a54f4e8ade93ef9f3db98a--186de9dcb7984aeea518bcc6817e9f2f
2b406562873b434ca050d3a98fb039e1
RX(phi₁₆)
186de9dcb7984aeea518bcc6817e9f2f--2b406562873b434ca050d3a98fb039e1
2f3890894de84a54aabc236166749469
PHASE(phi_ent₂)
2b406562873b434ca050d3a98fb039e1--2f3890894de84a54aabc236166749469
2f3890894de84a54aabc236166749469--e2b735a48c3f43c9aaeebf168ac4c9c4
7fc64e27a2044e909819f6e77255ccfd
2f3890894de84a54aabc236166749469--7fc64e27a2044e909819f6e77255ccfd
7fc64e27a2044e909819f6e77255ccfd--f81d45e45da742e98abc21c2d6b3daa1
6c85f86fddb6453c88a450d42d817cb9
03685e933968479fb1d07461e09a14f4
RX(phi₂)
6f460e832e5c4d85a52b5ff04c9c368a--03685e933968479fb1d07461e09a14f4
40dd0569982446948ab741d8aa47c058
RY(phi₅)
03685e933968479fb1d07461e09a14f4--40dd0569982446948ab741d8aa47c058
755fda1715154917ab68f72af96c1fad
RX(phi₈)
40dd0569982446948ab741d8aa47c058--755fda1715154917ab68f72af96c1fad
b8a39805d2fe4b2ca9a3a209298a3081
755fda1715154917ab68f72af96c1fad--b8a39805d2fe4b2ca9a3a209298a3081
c738260b190840d0a2f11fc11779c055
PHASE(phi_ent₁)
b8a39805d2fe4b2ca9a3a209298a3081--c738260b190840d0a2f11fc11779c055
c738260b190840d0a2f11fc11779c055--cef166efe55347ed9b578537161deb3b
0cf3ff3b7dc04486803172f1ff5a8155
RX(phi₁₁)
c738260b190840d0a2f11fc11779c055--0cf3ff3b7dc04486803172f1ff5a8155
df4fe6aead0c40e89446f2b044cc7e88
RY(phi₁₄)
0cf3ff3b7dc04486803172f1ff5a8155--df4fe6aead0c40e89446f2b044cc7e88
a65a97869bb642ed91955561c19d9323
RX(phi₁₇)
df4fe6aead0c40e89446f2b044cc7e88--a65a97869bb642ed91955561c19d9323
c82b2115f78042088b92169b1f3258dc
a65a97869bb642ed91955561c19d9323--c82b2115f78042088b92169b1f3258dc
ce6b70ced9c34774b2f7d0868a93bb6a
PHASE(phi_ent₃)
c82b2115f78042088b92169b1f3258dc--ce6b70ced9c34774b2f7d0868a93bb6a
ce6b70ced9c34774b2f7d0868a93bb6a--7fc64e27a2044e909819f6e77255ccfd
ce6b70ced9c34774b2f7d0868a93bb6a--6c85f86fddb6453c88a450d42d817cb9
Having a truly hardware-efficient ansatz means that the entangling operation can be chosen according to each device's native interactions. Besides digital operations, in Qadence it is also possible to build digital-analog HEAs with the entanglement produced by the natural evolution of a set of interacting qubits, as is natural in neutral atom devices. As with other digital-analog functions, this can be controlled with the strategy
argument which can be chosen from the Strategy
enum type. Currently, only Strategy.DIGITAL
and Strategy.SDAQC
are available. By default, calling strategy = Strategy.SDAQC
will use a global entangling Hamiltonian with Ising-like NN interactions and constant interaction strength inside a HamEvo
operation,
from qadence import Strategy
ansatz = hea (
n_qubits ,
depth = depth ,
strategy = Strategy . SDAQC
)
%3
cluster_19edd8da2df0494d951b1198b26070fa
cluster_2808bcf21f9f45848bb53bb09c1050fd
8d2dbed2d4c44f56888ab631d87392de
0
bd65751c8ca44b55b74522eee8b65409
RX(theta₀)
8d2dbed2d4c44f56888ab631d87392de--bd65751c8ca44b55b74522eee8b65409
4bcae4867caf4af2b14f24d59d552935
1
79fbfc96e0e042cf8479562f5a0df741
RY(theta₃)
bd65751c8ca44b55b74522eee8b65409--79fbfc96e0e042cf8479562f5a0df741
9f03819d1c7f493eab58a88c919ba8bb
RX(theta₆)
79fbfc96e0e042cf8479562f5a0df741--9f03819d1c7f493eab58a88c919ba8bb
8f1ae458556641e5b7d1dfe8ad5d5967
HamEvo
9f03819d1c7f493eab58a88c919ba8bb--8f1ae458556641e5b7d1dfe8ad5d5967
07997c067ffb44f194c6b4f2b0ba0714
RX(theta₉)
8f1ae458556641e5b7d1dfe8ad5d5967--07997c067ffb44f194c6b4f2b0ba0714
f347f7739a8b4590a88fa9272da9a84a
RY(theta₁₂)
07997c067ffb44f194c6b4f2b0ba0714--f347f7739a8b4590a88fa9272da9a84a
bc955ff1cb5241499c666865e29d6d11
RX(theta₁₅)
f347f7739a8b4590a88fa9272da9a84a--bc955ff1cb5241499c666865e29d6d11
831e72e443a34bfaa8d8f9a9715a676b
HamEvo
bc955ff1cb5241499c666865e29d6d11--831e72e443a34bfaa8d8f9a9715a676b
badc14d969f04829846332816e761b67
831e72e443a34bfaa8d8f9a9715a676b--badc14d969f04829846332816e761b67
9bf5a4df9a8c4840bcb04b2940d15320
e246ff143fd64146839bc35698f00d93
RX(theta₁)
4bcae4867caf4af2b14f24d59d552935--e246ff143fd64146839bc35698f00d93
cc91a1167d1e49658be970508b13e7eb
2
e94350db19c742ed89fc0f76ecb7bee0
RY(theta₄)
e246ff143fd64146839bc35698f00d93--e94350db19c742ed89fc0f76ecb7bee0
534c4d4e3fe141f99ca226bb17bdbfdd
RX(theta₇)
e94350db19c742ed89fc0f76ecb7bee0--534c4d4e3fe141f99ca226bb17bdbfdd
48cfc8abde5c4b8ca9af1044aa9a99b6
t = theta_t₀
534c4d4e3fe141f99ca226bb17bdbfdd--48cfc8abde5c4b8ca9af1044aa9a99b6
22b85c90ace7483691c6af7e24db5925
RX(theta₁₀)
48cfc8abde5c4b8ca9af1044aa9a99b6--22b85c90ace7483691c6af7e24db5925
8a4989c5a053474a8b4a017d1c398644
RY(theta₁₃)
22b85c90ace7483691c6af7e24db5925--8a4989c5a053474a8b4a017d1c398644
027aa78166b849c897625fa95965533a
RX(theta₁₆)
8a4989c5a053474a8b4a017d1c398644--027aa78166b849c897625fa95965533a
877c63505d74465a911e0f05239c80cc
t = theta_t₁
027aa78166b849c897625fa95965533a--877c63505d74465a911e0f05239c80cc
877c63505d74465a911e0f05239c80cc--9bf5a4df9a8c4840bcb04b2940d15320
ee7ed2807d6348e385ad88b603fa8dce
f04c6da8ab0a4bf6bd299794626e4082
RX(theta₂)
cc91a1167d1e49658be970508b13e7eb--f04c6da8ab0a4bf6bd299794626e4082
9b17b258029a44e492c279aef3577b6f
RY(theta₅)
f04c6da8ab0a4bf6bd299794626e4082--9b17b258029a44e492c279aef3577b6f
311d6031fbad465e9026424d23fb8cbe
RX(theta₈)
9b17b258029a44e492c279aef3577b6f--311d6031fbad465e9026424d23fb8cbe
12c761b2e5f94a2bb97faa1583de2e05
311d6031fbad465e9026424d23fb8cbe--12c761b2e5f94a2bb97faa1583de2e05
c9ac03cb9339422ca7f3147a2585b591
RX(theta₁₁)
12c761b2e5f94a2bb97faa1583de2e05--c9ac03cb9339422ca7f3147a2585b591
1d66b33453874873b5349cba24087569
RY(theta₁₄)
c9ac03cb9339422ca7f3147a2585b591--1d66b33453874873b5349cba24087569
2179f44618884138bafddffbe505a234
RX(theta₁₇)
1d66b33453874873b5349cba24087569--2179f44618884138bafddffbe505a234
d1fa1f7184404a9397cea25128e4f0ef
2179f44618884138bafddffbe505a234--d1fa1f7184404a9397cea25128e4f0ef
d1fa1f7184404a9397cea25128e4f0ef--ee7ed2807d6348e385ad88b603fa8dce
Note that, by default, only the time-parameter is automatically parameterized when building a digital-analog HEA. However, as described in the Hamiltonians tutorial , arbitrary interaction Hamiltonians can be easily built with the hamiltonian_factory
function, with both customized or fully parameterized interactions, and these can be directly passed as the entangler
for a customizable digital-analog HEA.
from qadence import hamiltonian_factory , Interaction , N , Register , hea
# Build a parameterized neutral-atom Hamiltonian following a honeycomb_lattice:
register = Register . honeycomb_lattice ( 1 , 1 )
entangler = hamiltonian_factory (
register ,
interaction = Interaction . NN ,
detuning = N ,
interaction_strength = "e" ,
detuning_strength = "n"
)
# Build a fully parameterized Digital-Analog HEA:
n_qubits = register . n_qubits
depth = 2
ansatz = hea (
n_qubits = register . n_qubits ,
depth = depth ,
operations = [ RX , RY , RX ],
entangler = entangler ,
strategy = Strategy . SDAQC
)
%3
cluster_61425953959b447cb7c3145974dd2fe4
cluster_ad806daa582347719ba44cf1228bd289
d4b973bb6a404d10b01d213037a1af36
0
fb194e6d108a4ad4a90d7ff42ced7cf2
RX(theta₀)
d4b973bb6a404d10b01d213037a1af36--fb194e6d108a4ad4a90d7ff42ced7cf2
b28a21886c3c4dcdbbe3e0ad169d38db
1
844b75817c664809b470ad1c5218949d
RY(theta₆)
fb194e6d108a4ad4a90d7ff42ced7cf2--844b75817c664809b470ad1c5218949d
b2127ce4ce5045098ef0d9b7ba83cf53
RX(theta₁₂)
844b75817c664809b470ad1c5218949d--b2127ce4ce5045098ef0d9b7ba83cf53
2d58dbfc67264a6e86729c0f92d651ba
b2127ce4ce5045098ef0d9b7ba83cf53--2d58dbfc67264a6e86729c0f92d651ba
25e0c0bade54442e9316fac9d97db709
RX(theta₁₈)
2d58dbfc67264a6e86729c0f92d651ba--25e0c0bade54442e9316fac9d97db709
1f72b72853154a579d6bf8a5b50d140a
RY(theta₂₄)
25e0c0bade54442e9316fac9d97db709--1f72b72853154a579d6bf8a5b50d140a
822cc376f9164244838fc82e0866db34
RX(theta₃₀)
1f72b72853154a579d6bf8a5b50d140a--822cc376f9164244838fc82e0866db34
8b85e7aaa4404beaba162742e5821871
822cc376f9164244838fc82e0866db34--8b85e7aaa4404beaba162742e5821871
cc90a34317bb412ba2c9162978a296c1
8b85e7aaa4404beaba162742e5821871--cc90a34317bb412ba2c9162978a296c1
271b5517893d447cba34ff4e5e08f60a
420f1cf5a2ce41d089b708fece50eeed
RX(theta₁)
b28a21886c3c4dcdbbe3e0ad169d38db--420f1cf5a2ce41d089b708fece50eeed
992bf3b0cbee4e868904475eb92f567c
2
37f3b135fd0c4f13a3de3ed8bf7de78a
RY(theta₇)
420f1cf5a2ce41d089b708fece50eeed--37f3b135fd0c4f13a3de3ed8bf7de78a
d46a60c2e2814335a02c6ecedaf1ad6e
RX(theta₁₃)
37f3b135fd0c4f13a3de3ed8bf7de78a--d46a60c2e2814335a02c6ecedaf1ad6e
0a695a09dd2146319912d11872ebad9d
d46a60c2e2814335a02c6ecedaf1ad6e--0a695a09dd2146319912d11872ebad9d
9354ad22f0c64e369d6d571610e571e1
RX(theta₁₉)
0a695a09dd2146319912d11872ebad9d--9354ad22f0c64e369d6d571610e571e1
318a1b6fb0ab46fea7c25b00c7c37146
RY(theta₂₅)
9354ad22f0c64e369d6d571610e571e1--318a1b6fb0ab46fea7c25b00c7c37146
0043538e9c9c485391f80b7e04fd457e
RX(theta₃₁)
318a1b6fb0ab46fea7c25b00c7c37146--0043538e9c9c485391f80b7e04fd457e
48e4ded5652746bbb2f55df70c29e875
0043538e9c9c485391f80b7e04fd457e--48e4ded5652746bbb2f55df70c29e875
48e4ded5652746bbb2f55df70c29e875--271b5517893d447cba34ff4e5e08f60a
5c0fe756360e41189d010a5496379f3b
5c2a6f6df89744c682b29bb663fcf17b
RX(theta₂)
992bf3b0cbee4e868904475eb92f567c--5c2a6f6df89744c682b29bb663fcf17b
e1006349c1b441de9c5ee02716e07568
3
d22460c236e9456ca05eb37da0d6f81e
RY(theta₈)
5c2a6f6df89744c682b29bb663fcf17b--d22460c236e9456ca05eb37da0d6f81e
b219d33d438a4ff88da52b6471613414
RX(theta₁₄)
d22460c236e9456ca05eb37da0d6f81e--b219d33d438a4ff88da52b6471613414
9023343a34564235b30044775ad1e03f
HamEvo
b219d33d438a4ff88da52b6471613414--9023343a34564235b30044775ad1e03f
979af5292c1646bc98a23cd05194305b
RX(theta₂₀)
9023343a34564235b30044775ad1e03f--979af5292c1646bc98a23cd05194305b
111441a9356443f6a1f1803cf61395da
RY(theta₂₆)
979af5292c1646bc98a23cd05194305b--111441a9356443f6a1f1803cf61395da
0c75b6a7b5704a879a801ebb81e1b09c
RX(theta₃₂)
111441a9356443f6a1f1803cf61395da--0c75b6a7b5704a879a801ebb81e1b09c
b33d8cb360aa4093b92acd73b9629493
HamEvo
0c75b6a7b5704a879a801ebb81e1b09c--b33d8cb360aa4093b92acd73b9629493
b33d8cb360aa4093b92acd73b9629493--5c0fe756360e41189d010a5496379f3b
585fbfbacaf14cbbb0a49e560a7b0383
e4b3737b00f64fafa34354285717f4bd
RX(theta₃)
e1006349c1b441de9c5ee02716e07568--e4b3737b00f64fafa34354285717f4bd
9becc7533f02436fb406f5b8aa8e6a7a
4
57761921522f4be19cd5569687b22311
RY(theta₉)
e4b3737b00f64fafa34354285717f4bd--57761921522f4be19cd5569687b22311
d09480580a484e53b0009da608f6df4c
RX(theta₁₅)
57761921522f4be19cd5569687b22311--d09480580a484e53b0009da608f6df4c
9c4f6dcb0c064b99b74e524769c0e183
t = theta_t₀
d09480580a484e53b0009da608f6df4c--9c4f6dcb0c064b99b74e524769c0e183
251485eb4f33421d960c2da10ad1fcd3
RX(theta₂₁)
9c4f6dcb0c064b99b74e524769c0e183--251485eb4f33421d960c2da10ad1fcd3
9c015523296f4214b00bb156d85f5a47
RY(theta₂₇)
251485eb4f33421d960c2da10ad1fcd3--9c015523296f4214b00bb156d85f5a47
dddde1a5671549ce9487dbfcf7ccbb7e
RX(theta₃₃)
9c015523296f4214b00bb156d85f5a47--dddde1a5671549ce9487dbfcf7ccbb7e
25c8cae953494f228849fd36e6e4c62d
t = theta_t₁
dddde1a5671549ce9487dbfcf7ccbb7e--25c8cae953494f228849fd36e6e4c62d
25c8cae953494f228849fd36e6e4c62d--585fbfbacaf14cbbb0a49e560a7b0383
a151ac2342614addaafc726dbb7024f6
61620cced5b34c2185e13b0e9656c4e9
RX(theta₄)
9becc7533f02436fb406f5b8aa8e6a7a--61620cced5b34c2185e13b0e9656c4e9
be825d22604d4ccfb9e2bcc0e1923f6e
5
93a05487ab424e52a08cc58275a35881
RY(theta₁₀)
61620cced5b34c2185e13b0e9656c4e9--93a05487ab424e52a08cc58275a35881
fda6dcac659046e3922887485bf9a3e3
RX(theta₁₆)
93a05487ab424e52a08cc58275a35881--fda6dcac659046e3922887485bf9a3e3
b17de94f215e480d849c4ec356b3b3d8
fda6dcac659046e3922887485bf9a3e3--b17de94f215e480d849c4ec356b3b3d8
cc7e9f3ebcab4395bc79fc26d83bcbe8
RX(theta₂₂)
b17de94f215e480d849c4ec356b3b3d8--cc7e9f3ebcab4395bc79fc26d83bcbe8
9f1307ea8b43481fad67b83cdb48e90b
RY(theta₂₈)
cc7e9f3ebcab4395bc79fc26d83bcbe8--9f1307ea8b43481fad67b83cdb48e90b
2582cf18b06f4ad58b15262f6f103d53
RX(theta₃₄)
9f1307ea8b43481fad67b83cdb48e90b--2582cf18b06f4ad58b15262f6f103d53
a96877724c9749a294f96345b986b53c
2582cf18b06f4ad58b15262f6f103d53--a96877724c9749a294f96345b986b53c
a96877724c9749a294f96345b986b53c--a151ac2342614addaafc726dbb7024f6
0538a5ac3e1c4a6c866691d88b2d312e
1bd0939339a44516936d361680469544
RX(theta₅)
be825d22604d4ccfb9e2bcc0e1923f6e--1bd0939339a44516936d361680469544
3121bfd5e2f74d45a8326e8d698664a3
RY(theta₁₁)
1bd0939339a44516936d361680469544--3121bfd5e2f74d45a8326e8d698664a3
8690b391f56e4838a65ec8a9d8ecfc51
RX(theta₁₇)
3121bfd5e2f74d45a8326e8d698664a3--8690b391f56e4838a65ec8a9d8ecfc51
6b8d45b637cb4a0e842561a8b847635e
8690b391f56e4838a65ec8a9d8ecfc51--6b8d45b637cb4a0e842561a8b847635e
218632e25e7f4dfc9f6eae37614d23c0
RX(theta₂₃)
6b8d45b637cb4a0e842561a8b847635e--218632e25e7f4dfc9f6eae37614d23c0
fc6bae226607473b9c7b7d0f5eb24ed9
RY(theta₂₉)
218632e25e7f4dfc9f6eae37614d23c0--fc6bae226607473b9c7b7d0f5eb24ed9
687d5353b0324cd5b260acf7c6ef1d0c
RX(theta₃₅)
fc6bae226607473b9c7b7d0f5eb24ed9--687d5353b0324cd5b260acf7c6ef1d0c
30db378315724cfbaf6ed35d7e5e023e
687d5353b0324cd5b260acf7c6ef1d0c--30db378315724cfbaf6ed35d7e5e023e
30db378315724cfbaf6ed35d7e5e023e--0538a5ac3e1c4a6c866691d88b2d312e
Qadence also offers a out-of-the-box training routine called train_with_grad
for optimizing fully-differentiable models like QNN
s and QuantumModel
s containing either trainable and/or non-trainable parameters (i.e., inputs). Feel free to refresh your memory about different parameter types .
train_with_grad
performs training, logging/printing loss metrics and storing intermediate checkpoints of models.
As every other training routine commonly used in Machine Learning, it requires
model
, data
and an optimizer
as input arguments.
However, in addition, it requires a loss_fn
and a TrainConfig
.
A loss_fn
is required to be a function which expects both a model and data and returns a tuple of (loss, metrics: <dict>
), where metrics
is a dict of scalars which can be customized too.
import torch
from itertools import count
cnt = count ()
criterion = torch . nn . MSELoss ()
def loss_fn ( model : torch . nn . Module , data : torch . Tensor ) -> tuple [ torch . Tensor , dict ]:
next ( cnt )
x , y = data [ 0 ], data [ 1 ]
out = model ( x )
loss = criterion ( out , y )
return loss , {}
The TrainConfig
[qadence.ml_tools.config] tells train_with_grad
what batch_size should be used, how many epochs to train, in which intervals to print/log metrics and how often to store intermediate checkpoints.
from qadence.ml_tools import TrainConfig
batch_size = 5
n_epochs = 100
config = TrainConfig (
folder = "some_path/" ,
max_iter = n_epochs ,
checkpoint_every = 100 ,
write_every = 100 ,
batch_size = batch_size ,
)
Let's look at a complete example of how to use train_with_grad
now.
from pathlib import Path
import torch
from itertools import count
from qadence.constructors import hamiltonian_factory , hea , feature_map
from qadence import chain , Parameter , QuantumCircuit , Z
from qadence.models import QNN
from qadence.ml_tools import train_with_grad , TrainConfig
import matplotlib.pyplot as plt
n_qubits = 2
fm = feature_map ( n_qubits )
ansatz = hea ( n_qubits = n_qubits , depth = 3 )
observable = hamiltonian_factory ( n_qubits , detuning = Z )
circuit = QuantumCircuit ( n_qubits , fm , ansatz )
model = QNN ( circuit , observable , backend = "pyqtorch" , diff_mode = "ad" )
batch_size = 1
input_values = { "phi" : torch . rand ( batch_size , requires_grad = True )}
pred = model ( input_values )
cnt = count ()
criterion = torch . nn . MSELoss ()
optimizer = torch . optim . Adam ( model . parameters (), lr = 0.1 )
def loss_fn ( model : torch . nn . Module , data : torch . Tensor ) -> tuple [ torch . Tensor , dict ]:
next ( cnt )
x , y = data [ 0 ], data [ 1 ]
out = model ( x )
loss = criterion ( out , y )
return loss , {}
tmp_path = Path ( "/tmp" )
n_epochs = 5
config = TrainConfig (
folder = tmp_path ,
max_iter = n_epochs ,
checkpoint_every = 100 ,
write_every = 100 ,
batch_size = batch_size ,
)
batch_size = 25
x = torch . linspace ( 0 , 1 , batch_size ) . reshape ( - 1 , 1 )
y = torch . sin ( x )
train_with_grad ( model , ( x , y ), optimizer , config , loss_fn = loss_fn )
plt . plot ( y . numpy ())
plt . plot ( model ( input_values ) . detach () . numpy ())
For users who want to use the low-level API of qadence
, here is the example from above
written without train_with_grad
.
Fitting a function - Low-level API
from pathlib import Path
import torch
from itertools import count
from qadence.constructors import hamiltonian_factory , hea , feature_map
from qadence import chain , Parameter , QuantumCircuit , Z
from qadence.models import QNN
from qadence.ml_tools import train_with_grad , TrainConfig
n_qubits = 2
fm = feature_map ( n_qubits )
ansatz = hea ( n_qubits = n_qubits , depth = 3 )
observable = hamiltonian_factory ( n_qubits , detuning = Z )
circuit = QuantumCircuit ( n_qubits , fm , ansatz )
model = QNN ( circuit , observable , backend = "pyqtorch" , diff_mode = "ad" )
batch_size = 1
input_values = { "phi" : torch . rand ( batch_size , requires_grad = True )}
pred = model ( input_values )
criterion = torch . nn . MSELoss ()
optimizer = torch . optim . Adam ( model . parameters (), lr = 0.1 )
n_epochs = 50
cnt = count ()
tmp_path = Path ( "/tmp" )
config = TrainConfig (
folder = tmp_path ,
max_iter = n_epochs ,
checkpoint_every = 100 ,
write_every = 100 ,
batch_size = batch_size ,
)
x = torch . linspace ( 0 , 1 , batch_size ) . reshape ( - 1 , 1 )
y = torch . sin ( x )
for i in range ( n_epochs ):
out = model ( x )
loss = criterion ( out , y )
loss . backward ()
optimizer . step ()