public string GetQiskitString(bool includeAllMeasures = false) { //todo use correct number StringBuilder builder = new StringBuilder(); //string translation = ""; string allnumbers = getAllNumbersString(NumberOfQubits); if (NumberOfOutputs == 0) { //translation += "qc = QuantumCircuit(" + NumberOfQubits + ")\n"; builder.Append("qc = QuantumCircuit("); builder.Append(NumberOfQubits); builder.Append(")\n"); } else { //translation += "qc = QuantumCircuit(" + NumberOfQubits + "," + NumberOfOutputs + ")\n"; builder.Append("qc = QuantumCircuit("); builder.Append(NumberOfQubits); builder.Append(","); builder.Append(NumberOfOutputs); builder.Append(")\n"); } //Should only be used when the amplitudes were set, since this will be quite slow on a real quantum computer if (Amplitudes != null && Amplitudes.Length > 0 && OriginalSum > 0) { //hack only possible because the Amplitudes.ToString() only gives the Real values. //This makes this quite a bit faster though. string amplitudes = string.Join(",", Amplitudes); //string state = "[" + amplitudes + "]"; //translation += "qc.initialize(" + state + ", " + allnumbers + ")\n"; builder.Append("qc.initialize(["); builder.Append(amplitudes); builder.Append("],"); builder.Append(allnumbers); builder.Append(")\n"); /* * state += Amplitudes[0].Real; * * for (int i = 1; i < AmplitudeLength; i++) { * state += "," + Amplitudes[i].Real; * } * state += "]"; */ } for (int i = 0; i < Gates.Count; i++) { Gate gate = Gates[i]; switch (gate.CircuitType) { case CircuitType.X: //translation += "qc.x(" + gate.First + ")\n"; builder.Append("qc.x("); builder.Append(gate.First); builder.Append(")\n"); break; case CircuitType.RX: //translation += "qc.rx(" + gate.Theta + "," + gate.First + ")\n"; builder.Append("qc.rx("); builder.Append(gate.Theta); builder.Append(", "); builder.Append(gate.First); builder.Append(")\n"); break; case CircuitType.H: //translation += "qc.h(" + gate.First + ")\n"; builder.Append("qc.h("); builder.Append(gate.First); builder.Append(", "); builder.Append(gate.Second); builder.Append(")\n"); break; case CircuitType.CX: //translation += "qc.cx(" + gate.First + "," + gate.Second + ")\n"; builder.Append("qc.cx("); builder.Append(gate.First); builder.Append(", "); builder.Append(gate.Second); builder.Append(")\n"); break; case CircuitType.CRX: //TODO using uniform /* * U = np.array([ * [1, 0, 0, 0], * [0, 0, 1, 0], * [0, 1, 0, 0], * [0, 0, 0, 1] * ]) * U = fractional_matrix_power(U,fraction) * combined_qc.unitary(U, [q0,q1],\ * label='partial_swap') */ /* * builder.Append("qc.crx("); * builder.Append(gate.Theta); * builder.Append(", "); * builder.Append(gate.First); * builder.Append(", "); * builder.Append(gate.Second); * builder.Append(")\n"); */ break; case CircuitType.M: //translation += "qc.measure(" + gate.First + "," + gate.Second + ")\n"; builder.Append("qc.measure("); builder.Append(gate.First); builder.Append(", "); builder.Append(gate.Second); builder.Append(")\n"); break; default: break; } } if (includeAllMeasures) { /* * string allQubits = "0"; * for (int i = 1; i < NumberOfQubits && i<NumberOfOutputs; i++) { * allQubits += "," + i; * } * translation += "qc.measure([" + allQubits + "], [" + allQubits + "])\n"; */ //translation += "qc.measure(" + allnumbers + ", " + allnumbers + ")\n"; builder.Append("qc.measure("); builder.Append(allnumbers); builder.Append(", "); builder.Append(allnumbers); builder.Append(")\n"); } return(builder.ToString()); //return translation; }
void handleM(ComplexNumber[] amplitudes, Gate gate, int numberOfQubits) { //Todo }