示例#1
0
        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
 }