Ejemplo n.º 1
0
    public static Complex CalcAmpFlat(CircuitOp[] remaining_circuit, int circuitpos, int inital_state, int target_state)
    {
        int curridx = -1; // number of active elements in the queue.

        WorkUnit[] worklist = new WorkUnit[16];

        CircuitOp current_gate = remaining_circuit[circuitpos - 1];

        // wuDefault(ref worklist[0]); // ref types don't work in Kiwi, fine
        // WorkUnit firstelement = wuDefault();
        worklist[0].target = target_state;
        worklist[0].depth  = circuitpos;
        // add_preds(ref worklist[0], current_gate);


        curridx = 0; // if -1, return.
        WorkUnit current;
        Complex  lasteval;

        // while (curridx > 0) { // valid indices for the work list
        //   Kiwi.Pause();
        //   current = worklist[curridx-1];
        //   current_gate = remaining_circuit[curridx-1];
        //   if (can_evaluate(current)) {
        //     lasteval = evaluate(current, current_gate);
        //     curridx -= 1; // pop off the stack.
        //   } else {
        //     Console.WriteLine("need to addd to the worklist, cant do that yet!");
        //     curridx -= 1;
        //   }
        // }

        Console.WriteLine("RAN OFF THE END OF THE WORKLIST!");
        return(new Complex(0.0, 0.0));
    }
Ejemplo n.º 2
0
    public static WorkUnit add_preds(ref WorkUnit current, CircuitOp gate)
    {
        int[] predecessors = state_ball(current.target, gate.qubits);
        switch (gate.op)
        {
        case Op.H:
            current.dep_done_0 = false; current.dep_done_1 = false;
            current.dep_done_2 = true; current.dep_done_3 = true;

            current.dep_target_0 = predecessors[0]; current.dep_target_1 = predecessors[1];
            current.dep_target_2 = 0; current.dep_target_3 = 0;
            break;

        case Op.CNOT:
            current.dep_done_0 = false; current.dep_done_1 = false;
            current.dep_done_2 = false; current.dep_done_3 = false;

            current.dep_target_0 = predecessors[0]; current.dep_target_1 = predecessors[1];
            current.dep_target_2 = predecessors[0]; current.dep_target_3 = predecessors[1];
            break;

        default:
            Console.WriteLine("UNKNOWN OPERATION!");
            break;
        }
        return(current);
    }
Ejemplo n.º 3
0
    //static int debuglevel = 0;

    public static Complex CalcAmp(CircuitOp[] remaining_circuit, int circuitpos, int inital_state, int target_state)
    {
        // class-based dynamic dispatch errors out if the return value from this wunction is created with operator new inside a branch that is conditional on remaining_circuit.Length.
        // so
        double realpart, imagpart;

        if (circuitpos == 0)
        {
            //Console.WriteLine("{0}Base case for target {1}", new string (' ', debuglevel), target_state);
            realpart = (target_state == inital_state) ? 1.0 : 0.0;
            imagpart = 0.0;
        }
        else
        {
            //Console.WriteLine("{0}evaluating for lvl {1} target {2}", new string (' ', debuglevel), circuitpos, target_state);
            CircuitOp current_gate = remaining_circuit[circuitpos - 1];
            int[]     predecessors = state_ball(target_state, current_gate.qubits);

            Complex[] predecessor_amp = new Complex[predecessors.Length];
            for (int i = 0; i < predecessors.Length; i++)
            {
                Kiwi.Pause();
                //debuglevel += 1;
                predecessor_amp[i] = CalcAmp(remaining_circuit, circuitpos - 1, inital_state, predecessors[i]);
                //debuglevel -= 1;
            }

            Complex resamp = zero;
            for (int i = 0; i < predecessors.Length; i++)
            {
                switch (current_gate.op)
                {
                case Op.H:
                    resamp = resamp + H_select(
                        partial_trace(predecessors[i], current_gate.qubits),
                        predecessor_amp[i],
                        partial_trace(target_state, current_gate.qubits)
                        );
                    break;

                case Op.CNOT:
                    resamp = resamp + CNOT_select(
                        partial_trace(predecessors[i], current_gate.qubits),
                        predecessor_amp[i],
                        partial_trace(target_state, current_gate.qubits)
                        );
                    break;

                default:
                    Console.WriteLine("UNKNOWN OPERATION!");
                    break;
                }
            }

            realpart = resamp.real; //(target_state == inital_state) ? 1.0 : 0.0;
            imagpart = resamp.imag;
        }

        return(new Complex(realpart, imagpart));
    }
Ejemplo n.º 4
0
    public static Complex evaluate(WorkUnit current, CircuitOp current_gate)
    {
        Complex resamp = zero;

        switch (current_gate.op)
        {
        case Op.H:
            resamp = resamp + H_select(
                partial_trace(current.dep_target_0, current_gate.qubits),
                current.dep_amp_0,
                partial_trace(current.target, current_gate.qubits));

            resamp = resamp + H_select(
                partial_trace(current.dep_target_1, current_gate.qubits),
                current.dep_amp_1,
                partial_trace(current.target, current_gate.qubits));
            break;

        case Op.CNOT:
            resamp = resamp + CNOT_select(
                partial_trace(current.dep_target_0, current_gate.qubits),
                current.dep_amp_0,
                partial_trace(current.target, current_gate.qubits));

            resamp = resamp + CNOT_select(
                partial_trace(current.dep_target_1, current_gate.qubits),
                current.dep_amp_1,
                partial_trace(current.target, current_gate.qubits));

            resamp = resamp + CNOT_select(
                partial_trace(current.dep_target_2, current_gate.qubits),
                current.dep_amp_2,
                partial_trace(current.target, current_gate.qubits));

            resamp = resamp + CNOT_select(
                partial_trace(current.dep_target_3, current_gate.qubits),
                current.dep_amp_3,
                partial_trace(current.target, current_gate.qubits));

            break;

        default:
            Console.WriteLine("UNKNOWN OPERATION!");
            break;
        }
        return(resamp);
    }
Ejemplo n.º 5
0
    static void Main()
    {
        CircuitOp[] circuit = new CircuitOp[2];
        circuit[0] = new CircuitOp(Op.H, new int[] { 0 });
        circuit[1] = new CircuitOp(Op.H, new int[] { 1 });

        // circuit[2] = new CircuitOp(Op.CNOT, new int[] { 1, 0 });
        //
        //
        // circuit[3] = new CircuitOp(Op.H, new int[] { 0 });
        // circuit[4] = new CircuitOp(Op.H, new int[] { 1 });

        int     tgt = 0;
        Complex res = CalcAmpFlat(circuit, circuit.Length, 0, tgt);

        Console.WriteLine("HH|{0}> on |0> is {1}", tgt, res.real);



        // Complex res = H_select(0, new Complex(1.0, 0.0), 0);
        // for (int tgt=0; tgt<4; tgt++) {
        //   Complex res = CalcAmp(circuit, circuit.Length, 2, tgt);
        //   Console.WriteLine("H|{0}> on |2> is {1}", tgt, res.real);
        // }

        // Console.WriteLine("0 with bit set at idx 1 is {0}", insert_bit(0, true, 1)  ); // true
        //
        // Console.WriteLine("0 with bit set at idx 1 is {0}", insert_bit(0, false, 1)  ); // false, does not clear the bit.
        //
        // Console.WriteLine("trace of 1 out of |010> is {0}", partial_trace(2, new int[] {1}));
        //
        //
        // Console.WriteLine("stateball for |000> on pos 1 is");
        // int[] stateball = state_ball(0, new int[] {1});
        // for (int i=0; i<stateball.Length; i++) {
        //   Console.WriteLine("|{0}>", stateball[i]);
        // }
        done = true;
    }