Hi, I’m getting an error when increasing the number of Qubits in this QML demo:
Quantum detection of time series anomalies | PennyLane Demos
It’s supposed to perform signal anomaly detection, but it appears it only works with “n_qubits”: 1. Although the code treats “n_qubits” as a variable that can be trivially changed.
When changing to “n_qubits”: 2, it returns the error: TypeError: Object ‘NoneType’ is not subscripted.
Does anyone know what I should adapt in the code?
“n_qubits” can be changed in “general_options”.
My opinion: I’ve run this a few times and noticed that this type of error is related to missing input values in some function, as the “Covalent” module creates a workflow, and when it doesn’t match, it results in “none”. Therefore, the value is none in the returned variable. Therefore, some function is only suitable for 1 qubit.
Hey @Victor_Meneguitte! Welcome to the forum 
If I’m understanding correctly, there are two places where n_qubits
is “hardcoded”:
- the second codeblock in the section Building the loss function has
n_qubits = 1
dev = qml.device("default.qubit", wires=n_qubits, shots=None)
D_one_qubit = qml.qnode(dev)(D)
_ = qml.draw_mpl(D_one_qubit, decimals=2)(torch.tensor([1, 0]), 1, 1, True)
- In
general_options
:
general_options = {
...
"n_qubits": 1,
...
}
When I change the value in general_options
, I get the error you’re seeing. Is this exactly what’s going on for you?
1 Like
Yes @isaacdevlugt , the error occurs precisely when changing the value in “general_options”.
Glad I understand
. I reached out to one of the authors and I will get back to you as soon as I hear back 
Hey @Victor_Meneguitte, just heard back from one of the authors:
So it seems that this demo was indeed hardcoded for one qubit despite having an input option for n_qubits
. The reason is that it is hard to generalize the correct input dimensions for the PL templates. An example with n_qubits
is available in the papers with code demo of this paper (which is on the PL community demos). Github repo is here: GitHub - AgnostiqHQ/QuantumVariationalRewinding: Covalent demonstration of the QVR algorithm using a cryptocurrency time series use case
Let me know if this helps!
Hi @isaacdevlugt it seems like this other GitHub you mentioned is hardcoded for n_qubits=2 this time, as in line 5 has the comment as follows:
“Work explicitly with 2 qubits. This corresponds to the ‘bivariate model’ in the article”
n_qubits = 2
Is this the case or did i misunderstand the code?
Hi @Victor_Meneguitte,
Did you try the code in the GitHub shared by Isaac for n_qubits>2?
From Isaac’s answer I understand that it should work. However if this isn’t working at the moment please let us know and we can seek further clarification with one of the authors.
Hey @Victor_Meneguitte! Sorry about this. The person I spoke with will take a look at what’s going on and get back to me soon. I’ll get back to you early next week at the latest!
Yes, @CatalinaAlbornoz , it doesn’t work by simply changing the n_qubits variable, but the rest of the code does indeed seem to be generalized to n_qubits. Maybe there is some other variable in the training options that needs to be changed to match 3 qubits or n qubits.
Ok, @isaacdevlugt .Thank you both!
1 Like
Hey @Victor_Meneguitte! Apologies for the delay here. We haven’t forgotten about this post and will do our best to get back to you before the end of the week
.
@Victor_Meneguitte thanks for your patience!
Using the notebook on the GitHub repository, a simple way to use a general n_qubits
is to:
- In code cell 5, set the variable
n_qubits
to whatever you wish.
- In code cell 16, set
n_qubits
to the same value you set in code cell 5 and set num_distributions
to 2**n_qubits - 1
. The code should now run for any 1<=k<=n_qubits
.
The logic behind step 2 is that in code cell 6, we are creating a parameterized diagonal unitary with a number of parameters equal to num_distributions
. In the case of a fully connected Hamiltonian (k==n_qubits
), in the existing code, we require 2^n_qubits -1
parameters. If you set k
lower, you can get away with setting num_distributions
lower too. If you set num_distributions=2^n_qubits - 1
and set 1<=k<n_qubits
, the code will still work using only a subset of the 2^n_qubits -1
parameters to build the diagonal unitary.
It’s also worth noting that Barren Plateaus are going to start appearing when qubit numbers are ramped up (as is the case for many QML algos dealing with classical data). The circuit ansatze used don’t have inductive bias for this problem.
Let us know if that helps!
1 Like
Hi @isaacdevlugt , it seems like you nailed the problem, the code on the GitHub QuantumVariationalRewinding/QVR_example.ipynb at main · AgnostiqHQ/QuantumVariationalRewinding · GitHub is fully generalized for n_qubits
now.
In fact, I observed that even the previously mentioned code from the demos tutorial Quantum detection of time series anomalies | PennyLane Demos can be run with n_qubits too. In that case, the variable gamma_length
must be settled equals to 2^n_qubits - 1
. while 1<=k<=n_qubits
still.
It was very helpful, thank you very much! 
1 Like
Awesome! Glad we could help 