コード例 #1
0
ファイル: StepVM.cs プロジェクト: Wowand/quantum
        private void Gates_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            Gate gate;

            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                int addIndex = e.NewStartingIndex;
                foreach (object item in e.NewItems)
                {
                    gate = item as Gate;
                    if (gate != null)
                    {
                        RegisterRefModel gateRow = _model.GetRefFromOffset(addIndex);
                        Gates.Insert(addIndex, new GateVM(_model, gateRow, _column));
                        for (int i = addIndex + 1; i < _gates.Count; i++)
                        {
                            _gates[i].UpdateRow(i);
                        }
                        if (_gates.Count == 2)
                        {
                            _gates[0].UpdateDeleteRowCommand(true);
                            _gates[1].UpdateDeleteRowCommand(true);
                        }
                    }
                }
                break;

            case NotifyCollectionChangedAction.Replace:
                foreach (object item in e.NewItems)
                {
                    gate = item as Gate;
                    for (int i = gate.Begin; i <= gate.End; i++)
                    {
                        Gates[i].Refresh();
                    }
                }
                break;

            case NotifyCollectionChangedAction.Remove:
                int oldRow = e.OldStartingIndex;
                foreach (object item in e.OldItems)
                {
                    if (item is Gate)
                    {
                        Gates.RemoveAt(oldRow);
                        for (int i = oldRow; i < _gates.Count; i++)
                        {
                            _gates[i].UpdateRow(i);
                        }
                        if (_gates.Count == 1)
                        {
                            _gates[0].UpdateDeleteRowCommand(false);
                        }
                    }
                }
                break;
            }
            OnPropertyChanged("ScaleCenterY");
        }
コード例 #2
0
ファイル: GateVM.cs プロジェクト: wupeng78/QuIDE-source-code
 public GateVM(ComputerModel model, RegisterRefModel row, int column)
 {
     _model = model;
     _row = row;
     _column = column;
     _model.StepChanged += _model_CurrentStepChanged;
 }
コード例 #3
0
 public MultiControlledGate(RegisterRefModel target, RegisterRefModel control, params RegisterRefModel[] restControls)
 {
     _controls = new RegisterRefModel[restControls.Length + 1];
     _controls[0] = control;
     Array.Copy(restControls, 0, _controls, 1, restControls.Length);
     _target = target;
 }
コード例 #4
0
        public ulong Measure()
        {
            RegisterRefModel beginRef, endRef;

            if (_model == null)
            {
                beginRef = _compModel.GetRefFromOffset(0);
                endRef   = _compModel.GetRefFromOffset(_register.Width - 1);
            }
            else
            {
                beginRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel
                };
                endRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + _register.Width - 1
                };
            }
            MeasureGate gate = new MeasureGate(beginRef, endRef);

            AddGate(gate);

            return(_register.Measure());
        }
コード例 #5
0
        public void InverseCPhaseShift(int dist, int target, params int[] controls)
        {
            Validate(target, "InverseCPhaseShift", "target");
            for (int i = 0; i < controls.Length; i++)
            {
                Validate(controls[i], "InverseCPhaseShift", "controls[" + i + "]");
            }

            RegisterRefModel targetRef;

            RegisterRefModel[] controlsRefs;
            if (_model == null)
            {
                targetRef    = _compModel.GetRefFromOffset(target);
                controlsRefs = controls
                               .Select <int, RegisterRefModel>(x => _compModel.GetRefFromOffset(x))
                               .ToArray <RegisterRefModel>();
            }
            else
            {
                targetRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + target
                };
                controlsRefs = controls
                               .Select <int, RegisterRefModel>(x => new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + x
                })
                               .ToArray <RegisterRefModel>();
            }
            InvCPhaseShiftGate gate = new InvCPhaseShiftGate(dist, targetRef, controlsRefs);

            AddGate(gate);
        }
コード例 #6
0
        public void Toffoli(int target, params int[] controls)
        {
            ValidateToffoli(controls);
            Validate(target, "Toffoli", "target");
            for (int i = 0; i < controls.Length; i++)
            {
                Validate(controls[i], "Toffoli", "controls[" + i + "]");
            }

            if (_model == null)
            {
                RegisterRefModel[] toffoliParams = controls
                                                   .Select <int, RegisterRefModel>(x => _compModel.GetRefFromOffset(x))
                                                   .ToArray <RegisterRefModel>();
                ToffoliGate gate = new ToffoliGate(_compModel.GetRefFromOffset(target), toffoliParams);
                AddGate(gate);
            }
            else
            {
                RegisterRefModel[] toffoliParams = controls
                                                   .Select <int, RegisterRefModel>(x => new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + x
                })
                                                   .ToArray <RegisterRefModel>();
                RegisterRefModel targetRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + target
                };
                ToffoliGate gate = new ToffoliGate(targetRef, toffoliParams);
                AddGate(gate);
            }
        }
コード例 #7
0
        public void CNot(int target, int control)
        {
            Validate(target, "CNot", "target");
            Validate(control, "CNot", "control");

            RegisterRefModel controlRef, targetRef;

            if (_model == null)
            {
                controlRef = _compModel.GetRefFromOffset(control);
                targetRef  = _compModel.GetRefFromOffset(target);
            }
            else
            {
                controlRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + control
                };
                targetRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + target
                };
            }
            CNotGate gate = new CNotGate(targetRef, controlRef);

            AddGate(gate);
        }
コード例 #8
0
ファイル: CodeGenerator.cs プロジェクト: Wowand/quantum
        private string GenerateParametricGateCode(ParametricGate cg, string defaultRegName = null)
        {
            Func <object, string> appendPar = x =>
            {
                StringBuilder builder = new StringBuilder();

                if (x.GetType() == typeof(RegisterPartModel))
                {
                    RegisterPartModel rm = (RegisterPartModel)x;
                    builder.Append(GetRegName(rm.Register, defaultRegName));
                    if (rm.Register == null || rm.Width != rm.Register.Qubits.Count)
                    {
                        builder.Append("[").Append(rm.Offset).Append(", ");
                        builder.Append(rm.Width).Append("]");
                    }
                }
                else if (x.GetType() == typeof(RegisterRefModel))
                {
                    RegisterRefModel rrm = (RegisterRefModel)x;
                    builder.Append(GetRegName(rrm.Register, defaultRegName)).Append("[").Append(rrm.Offset).Append("]");
                }
                else
                {
                    builder.Append(x.ToString());
                }
                return(builder.ToString());
            };

            StringBuilder sb = new StringBuilder("comp.").Append(cg.FunctionName).Append("(");

            ParameterInfo[] infos = cg.Method.GetParameters();

            for (int i = 1; i < cg.Parameters.Length; i++)
            {
                object par = cg.Parameters[i];
                if (infos[i].GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0)
                {
                    IEnumerable pars = par as IEnumerable;
                    foreach (var item in pars)
                    {
                        sb.Append(", ");
                        sb.Append(appendPar(item));
                    }
                }
                else
                {
                    if (i > 1)
                    {
                        sb.Append(", ");
                    }
                    sb.Append(appendPar(par));
                }
            }
            sb.Append(");");

            return(sb.ToString());
        }
コード例 #9
0
ファイル: ParameterVM.cs プロジェクト: Wowand/quantum
        private string ValueToString(object value)
        {
            Type type = value.GetType();

            if (type == typeof(RegisterRefModel))
            {
                RegisterRefModel rrm = (RegisterRefModel)value;
                StringBuilder    sb  = new StringBuilder();
                if (rrm.Register != null)
                {
                    sb.Append(rrm.Register.Name);
                }
                else
                {
                    sb.Append("root");
                }
                sb.Append("[").Append(rrm.Offset).Append("]");
                return(sb.ToString());
            }
            if (type == typeof(RegisterPartModel))
            {
                RegisterPartModel rm = (RegisterPartModel)value;
                if (rm.Register != null)
                {
                    if (rm.Width == rm.Register.Qubits.Count)
                    {
                        return(rm.Register.Name);
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append(rm.Register.Name);
                        sb.Append("[").Append(rm.Offset).Append(", ").Append(rm.Width).Append("]");
                        return(sb.ToString());
                    }
                }
                else
                {
                    CircuitEvaluator eval = CircuitEvaluator.GetInstance();
                    int rootWidth         = eval.RootRegister.Width;
                    if (rm.Width == rootWidth)
                    {
                        return("root");
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("root");
                        sb.Append("[").Append(rm.Offset).Append(", ").Append(rm.Width).Append("]");
                        return(sb.ToString());
                    }
                }
            }
            return(value.ToString());
        }
コード例 #10
0
ファイル: StepVM.cs プロジェクト: Wowand/quantum
        private ObservableCollection <GateVM> CreateGatesFromModel()
        {
            ObservableCollection <GateVM> gates = new ObservableCollection <GateVM>();

            for (int i = 0; i < _model.Steps[_column].Gates.Count; i++)
            {
                Gate             gate    = _model.Steps[_column].Gates[i];
                RegisterRefModel gateRow = _model.GetRefFromOffset(i);
                gates.Add(new GateVM(_model, gateRow, _column));
            }
            return(gates);
        }
コード例 #11
0
 public MeasureGate(RegisterRefModel beginRow, RegisterRefModel endRow)
 {
     if (beginRow.OffsetToRoot > endRow.OffsetToRoot)
     {
         _beginRow = endRow;
         _endRow = beginRow;
     }
     else
     {
         _beginRow = beginRow;
         _endRow = endRow;
     }
 }
コード例 #12
0
        public void Gate1(Complex[,] matrix, int target, int?control = null)
        {
            Validate(target, "Gate1", "target");
            if (control.HasValue)
            {
                Validate(control.Value, "Gate1", "control");
            }
            ValidateMatrix(matrix, "Gate1", "matrix");

            RegisterRefModel targetRef;
            RegisterRefModel?controlRef;

            if (control == null)
            {
                controlRef = null;
                if (_model == null)
                {
                    targetRef = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
            }
            else
            {
                if (_model == null)
                {
                    controlRef = _compModel.GetRefFromOffset(control.Value);
                    targetRef  = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    controlRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + control.Value
                    };
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
            }
            UnitaryGate gate = new UnitaryGate(matrix, targetRef, controlRef);

            AddGate(gate);
        }
コード例 #13
0
        public void SigmaX(int target, int?control = null)
        {
            Validate(target, "SigmaX", "target");
            if (control.HasValue)
            {
                Validate(control.Value, "SigmaX", "control");
            }

            RegisterRefModel targetRef;
            RegisterRefModel?controlRef;

            if (control == null)
            {
                controlRef = null;
                if (_model == null)
                {
                    targetRef = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
                SigmaXGate gate = new SigmaXGate(targetRef);
                AddGate(gate);
            }
            else
            {
                if (_model == null)
                {
                    controlRef = _compModel.GetRefFromOffset(control.Value);
                    targetRef  = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    controlRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + control.Value
                    };
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
                CNotGate gate = new CNotGate(targetRef, controlRef.Value);
                AddGate(gate);
            }
        }
コード例 #14
0
        public void RotateZ(double gamma, int target, int?control = null)
        {
            Validate(target, "RotateZ", "target");
            if (control.HasValue)
            {
                Validate(control.Value, "RotateZ", "control");
            }

            RegisterRefModel targetRef;
            RegisterRefModel?controlRef;

            if (control == null)
            {
                controlRef = null;
                if (_model == null)
                {
                    targetRef = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
            }
            else
            {
                if (_model == null)
                {
                    controlRef = _compModel.GetRefFromOffset(control.Value);
                    targetRef  = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    controlRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + control.Value
                    };
                    targetRef = new RegisterRefModel()
                    {
                        Register = _model, Offset = _offsetToModel + target
                    };
                }
            }
            RotateZGate gate = new RotateZGate(gamma, targetRef, controlRef);

            AddGate(gate);
        }
コード例 #15
0
ファイル: QuantumComputer.cs プロジェクト: Wowand/quantum
        //internal List<Gate> ChangeGatesContainer(List<Gate> newContainer)
        //{
        //    List<Gate> prev = _gatesContainer;
        //    _gatesContainer = newContainer;
        //    return prev;
        //}

        internal RegisterRef ModelToRef(RegisterRefModel model)
        {
            if (model.Register != null)
            {
                return(new RegisterRef()
                {
                    Register = _modelRefs[model.Register],
                    Offset = model.Offset
                });
            }
            else
            {
                return(new RegisterRef()
                {
                    Register = _parserRoot,
                    Offset = model.Offset
                });
            }
        }
コード例 #16
0
ファイル: QuantumComputer.cs プロジェクト: Wowand/quantum
 internal Quantum.RegisterRef ModelToSource(RegisterRefModel model)
 {
     if (model.Register != null)
     {
         return(new Quantum.RegisterRef()
         {
             Register = _modelRefs[model.Register].SourceRegister,
             Offset = model.Offset
         });
     }
     else
     {
         return(new Quantum.RegisterRef()
         {
             Register = _parserRoot.SourceRegister,
             Offset = model.Offset
         });
     }
 }
コード例 #17
0
        public byte Measure(int position)
        {
            Validate(position, "Measure", "position");

            RegisterRefModel targetRef;

            if (_model == null)
            {
                targetRef = _compModel.GetRefFromOffset(position);
            }
            else
            {
                targetRef = new RegisterRefModel()
                {
                    Register = _model, Offset = _offsetToModel + position
                };
            }
            MeasureGate gate = new MeasureGate(targetRef);

            AddGate(gate);

            return(_register.Measure(position));
        }
コード例 #18
0
 public MultiControlledGate(RegisterRefModel target, params RegisterRefModel[] controls)
 {
     _controls = controls;
     _target = target;
 }
コード例 #19
0
        protected Tuple<RegisterRefModel, RegisterRefModel[]> CopyRefs(int referenceBeginRow)
        {
            RegisterRefModel targetRef = new RegisterRefModel()
            {
                Register = null,
                Offset = _target.OffsetToRoot - referenceBeginRow
            };
            RegisterRefModel[] controls = _controls.Select<RegisterRefModel, RegisterRefModel>(x =>
                new RegisterRefModel() { Register = null, Offset = x.OffsetToRoot - referenceBeginRow })
                .ToArray<RegisterRefModel>();

            return new Tuple<RegisterRefModel, RegisterRefModel[]>(targetRef, controls);
        }
コード例 #20
0
        public void SqrtX(int target, int? control = null)
        {
            Validate(target, "SqrtX", "target");
            if (control.HasValue)
            {
                Validate(control.Value, "SqrtX", "control");
            }

            RegisterRefModel targetRef;
            RegisterRefModel? controlRef;

            if (control == null)
            {
                controlRef = null;
                if (_model == null)
                {
                    targetRef = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    targetRef = new RegisterRefModel() { Register = _model, Offset = _offsetToModel + target };
                }
            }
            else
            {
                if (_model == null)
                {
                    controlRef = _compModel.GetRefFromOffset(control.Value);
                    targetRef = _compModel.GetRefFromOffset(target);
                }
                else
                {
                    controlRef = new RegisterRefModel() { Register = _model, Offset = _offsetToModel + control.Value };
                    targetRef = new RegisterRefModel() { Register = _model, Offset = _offsetToModel + target };
                }
            }
            SqrtXGate gate = new SqrtXGate(targetRef, controlRef);
            AddGate(gate);
        }
コード例 #21
0
 public CNotGate(RegisterRefModel target, RegisterRefModel control)
 {
     _control = control;
     _target = target;
 }
コード例 #22
0
        public void PhaseKick(double gamma, int target, params int[] controls)
        {
            Validate(target, "PhaseKick", "target");
            for (int i = 0; i < controls.Length; i++)
            {
                Validate(controls[i], "PhaseKick", "controls[" + i + "]");
            }

            RegisterRefModel targetRef;
            RegisterRefModel[] controlsRefs;
            if (_model == null)
            {
                targetRef = _compModel.GetRefFromOffset(target);
                controlsRefs = controls
                    .Select<int, RegisterRefModel>(x => _compModel.GetRefFromOffset(x))
                    .ToArray<RegisterRefModel>();
            }
            else
            {
                targetRef = new RegisterRefModel() { Register = _model, Offset = _offsetToModel + target };
                controlsRefs = controls
                    .Select<int, RegisterRefModel>(x => new RegisterRefModel() { Register = _model, Offset = _offsetToModel + x })
                    .ToArray<RegisterRefModel>();
            }
            PhaseKickGate gate = new PhaseKickGate(gamma, targetRef, controlsRefs);
            AddGate(gate);
        }
コード例 #23
0
ファイル: GateVM.cs プロジェクト: wupeng78/QuIDE-source-code
 public void UpdateRow(int offsetToRoot)
 {
     _row = _model.GetRefFromOffset(offsetToRoot);
     Refresh();
 }
コード例 #24
0
 public SigmaXGate(RegisterRefModel target)
     : base(target)
 {
 }
コード例 #25
0
 protected Tuple<RegisterRefModel, RegisterRefModel?> CopyRefs(int referenceBeginRow)
 {
     RegisterRefModel targetRef = new RegisterRefModel() {
         Register = null,
         Offset = _target.OffsetToRoot - referenceBeginRow
     };
     RegisterRefModel? controlRef = null;
     if (_control.HasValue)
     {
         controlRef = new RegisterRefModel()
         {
             Register = null,
             Offset = _control.Value.OffsetToRoot - referenceBeginRow
         };
     }
     return new Tuple<RegisterRefModel, RegisterRefModel?>(targetRef, controlRef);
 }
コード例 #26
0
 public MeasureGate(RegisterRefModel row)
 {
     _beginRow = row;
     _endRow = row;
 }
コード例 #27
0
ファイル: CodeGenerator.cs プロジェクト: Wowand/quantum
        private string GenerateGateCode(ComputerModel model, Gate gate, int column, string indent, string defaultRegName = null)
        {
            Func <string, Gate, string> appendControlTarget = (string begin, Gate g) =>
            {
                if (g.Control.HasValue)
                {
                    string namedC = "control: ";
                    string namedT = "target: ";
                    if (g.Name != GateName.CNot)
                    {
                        namedC = "";
                        namedT = "";
                    }

                    if (g.Control.Value.Register == g.Target.Register)
                    {
                        return(String.Format("{0}.{1}{4}{2}, {5}{3});",
                                             GetRegName(g.Target.Register, defaultRegName),
                                             begin,
                                             g.Target.Offset,
                                             g.Control.Value.Offset,
                                             namedT,
                                             namedC));
                    }
                    else
                    {
                        return(String.Format("comp.{0}{5}{1}[{2}], {6}{3}[{4}]);",
                                             begin,
                                             GetRegName(g.Target.Register, defaultRegName),
                                             g.Target.Offset,
                                             GetRegName(g.Control.Value.Register, defaultRegName),
                                             g.Control.Value.Offset,
                                             namedT,
                                             namedC));
                    }
                }
                else
                {
                    return(String.Format("{0}.{1}{2});", GetRegName(g.Target.Register, defaultRegName), begin, g.Target.Offset));
                }
            };

            Func <string, string, Gate, RegisterRefModel[], string> appendMoreControls =
                (string begin, string beginComment, Gate g, RegisterRefModel[] controls) =>
            {
                if (controls.All <RegisterRefModel>(x => x.Register == g.Target.Register) &&
                    (g.Control == null || g.Control.Value.Register == g.Target.Register))
                {
                    StringBuilder format = new StringBuilder(GetRegName(g.Target.Register, defaultRegName)).Append(".").Append(begin);
                    format.Append(g.Target.Offset);

                    if (g.Control.HasValue)
                    {
                        format.Append(", ").Append(g.Control.Value.Offset);
                    }

                    for (int i = 0; i < controls.Length; i++)
                    {
                        format.Append(", ").Append(controls[i].Offset);
                    }
                    format.Append(");");
                    format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
                    return(format.ToString());
                }
                else
                {
                    StringBuilder format = new StringBuilder("comp.").Append(begin);
                    format.Append(GetRegName(g.Target.Register, defaultRegName))
                    .Append("[").Append(g.Target.Offset).Append("]");

                    if (g.Control.HasValue)
                    {
                        format.Append(", ")
                        .Append(GetRegName(g.Control.Value.Register, defaultRegName)).Append("[")
                        .Append(g.Control.Value.Offset).Append("]");
                    }

                    for (int i = 0; i < controls.Length; i++)
                    {
                        format.Append(", ")
                        .Append(GetRegName(controls[i].Register, defaultRegName)).Append("[")
                        .Append(controls[i].Offset).Append("]");
                    }
                    format.Append(");");
                    format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
                    return(format.ToString());
                }
            };

            switch (gate.Name)
            {
            case GateName.Hadamard:
                return(appendControlTarget("Hadamard(", gate));

            case GateName.SigmaX:
                return(appendControlTarget("SigmaX(", gate));

            case GateName.SigmaY:
                return(appendControlTarget("SigmaY(", gate));

            case GateName.SigmaZ:
                return(appendControlTarget("SigmaZ(", gate));

            case GateName.SqrtX:
                return(appendControlTarget("SqrtX(", gate));

            case GateName.RotateX:
                RotateXGate rx = gate as RotateXGate;
                return(appendControlTarget(String.Format("RotateX({0}, ", rx.Gamma), gate));

            case GateName.RotateY:
                RotateYGate ry = gate as RotateYGate;
                return(appendControlTarget(String.Format("RotateY({0}, ", ry.Gamma), gate));

            case GateName.RotateZ:
                RotateZGate rz = gate as RotateZGate;
                return(appendControlTarget(String.Format("RotateZ({0}, ", rz.Gamma), gate));

            case GateName.PhaseKick:
                PhaseKickGate pk = gate as PhaseKickGate;
                if (pk.Controls.Length > 0)
                {
                    return(appendMoreControls(
                               String.Format("PhaseKick({0}, ", pk.Gamma),
                               "PhaseKick(<gamma_value>, ",
                               gate,
                               pk.Controls));
                }
                else
                {
                    return(appendControlTarget(String.Format("PhaseKick({0}, ", pk.Gamma), gate));
                }

            case GateName.PhaseScale:
                PhaseScaleGate ps = gate as PhaseScaleGate;
                return(appendControlTarget(String.Format("PhaseScale({0}, ", ps.Gamma), gate));

            case GateName.CNot:
                return(appendControlTarget("CNot(", gate));

            case GateName.CPhaseShift:
                CPhaseShiftGate cps = gate as CPhaseShiftGate;
                if (cps.Controls.Length > 0)
                {
                    return(appendMoreControls(
                               String.Format("CPhaseShift({0}, ", cps.Dist),
                               "CPhaseShift(<phase_distance_value>, ",
                               gate,
                               cps.Controls));
                }
                else
                {
                    return(appendControlTarget(String.Format("CPhaseShift({0}, ", cps.Dist), gate));
                }

            case GateName.InvCPhaseShift:
                InvCPhaseShiftGate icps = gate as InvCPhaseShiftGate;
                if (icps.Controls.Length > 0)
                {
                    return(appendMoreControls(
                               String.Format("InverseCPhaseShift({0}, ", icps.Dist),
                               "InverseCPhaseShift(<phase_distance_value>, ",
                               gate,
                               icps.Controls));
                }
                else
                {
                    return(appendControlTarget(String.Format("InverseCPhaseShift({0}, ", icps.Dist), gate));
                }

            case GateName.Toffoli:
                ToffoliGate t = gate as ToffoliGate;
                return(appendMoreControls(
                           "Toffoli(",
                           "Toffoli(",
                           gate,
                           t.Controls));

            case GateName.Measure:
                MeasureGate m = gate as MeasureGate;
                if (m.Begin == m.End)
                {
                    return(String.Format("{0}.Measure({1});", GetRegName(m.Target.Register, defaultRegName), m.Target.Offset));
                }
                else if (m.BeginRow.Register == m.EndRow.Register)
                {
                    string regName = GetRegName(m.BeginRow.Register, defaultRegName);
                    if (m.BeginRow.Register != null)
                    {
                        if (m.End - m.Begin + 1 == m.BeginRow.Register.Qubits.Count)
                        {
                            return(String.Format("{0}.Measure();", regName));
                        }
                        else
                        {
                            StringBuilder builder = new StringBuilder();
                            for (int i = m.BeginRow.Offset; i <= m.EndRow.Offset; i++)
                            {
                                builder.AppendFormat("{0}.Measure({1});\n", regName, i);
                            }
                            return(builder.ToString());
                        }
                    }
                    else
                    {
                        if (m.End - m.Begin + 1 == model.TotalWidth)
                        {
                            return(String.Format("{0}.Measure();", regName));
                        }
                        else
                        {
                            StringBuilder builder = new StringBuilder();
                            for (int i = m.BeginRow.Offset; i <= m.EndRow.Offset; i++)
                            {
                                builder.AppendFormat("{0}.Measure({1});\n", regName, i);
                            }
                            return(builder.ToString());
                        }
                    }
                }
                else
                {
                    StringBuilder builder = new StringBuilder();
                    int           i       = m.Begin;
                    while (i <= m.End)
                    {
                        RegisterRefModel regRef = model.GetRefFromOffset(i);
                        if (i + regRef.Register.Qubits.Count < m.End + 2)
                        {
                            builder.AppendFormat("{0}.Measure();\n", regRef.Register.Name);
                            i += regRef.Register.Qubits.Count;
                        }
                        else
                        {
                            builder.AppendFormat("{0}.Measure({1});\n", regRef.Register.Name, regRef.Offset);
                            i++;
                        }
                    }
                    return(builder.ToString());
                }

            case GateName.Unitary:
                UnitaryGate u           = gate as UnitaryGate;
                string      uMatrixName = "unitary_" + column + "_" + u.Target.OffsetToRoot;
                string      matrixDef   = GenerateMatrixDefinition(uMatrixName, u.Matrix, indent);
                string      gateDef     = appendControlTarget(String.Format("Gate1({0}, ", uMatrixName), gate);
                return(String.Format("{0}\n{1}{2}", matrixDef, indent, gateDef));

            case GateName.Parametric:
                return(GenerateParametricGateCode(gate as ParametricGate, defaultRegName));

            case GateName.Composite:
                return(GenerateCompositeGateCode(gate as CompositeGate, defaultRegName));

            case GateName.Empty:
            default:
                return(String.Empty);
            }
        }
コード例 #28
0
 public override Gate Copy(int referenceBeginRow)
 {
     RegisterRefModel targetRef = new RegisterRefModel()
     {
         Register = null,
         Offset = _target.OffsetToRoot - referenceBeginRow
     };
     RegisterRefModel controlRef = new RegisterRefModel()
     {
         Register = null,
         Offset = _control.OffsetToRoot - referenceBeginRow
     };
     return new CNotGate(targetRef, controlRef);
 }
コード例 #29
0
 public HadamardGate(RegisterRefModel target, RegisterRefModel? control = null)
     : base(target, control)
 {
 }
コード例 #30
0
 public CPhaseShiftGate(int dist, RegisterRefModel target, params RegisterRefModel[] controls)
     : base(target, controls)
 {
     _dist = dist;
 }
コード例 #31
0
 public override Gate Copy(int referenceBeginRow)
 {
     RegisterRefModel beginRef = new RegisterRefModel()
     {
         Register = null,
         Offset = _beginRow.OffsetToRoot - referenceBeginRow
     };
     RegisterRefModel endRef = new RegisterRefModel()
     {
         Register = null,
         Offset = _endRow.OffsetToRoot - referenceBeginRow
     };
     return new MeasureGate(beginRef, endRef);
 }
コード例 #32
0
 public PhaseKickGate(double gamma, RegisterRefModel target, params RegisterRefModel[] controls)
     : base(target, controls)
 {
     _gamma = gamma;
 }
コード例 #33
0
 public UnitaryGate(Complex[,] matrix, RegisterRefModel target, RegisterRefModel? control = null)
     : base(target, control)
 {
     _matrix = matrix;
 }
コード例 #34
0
 public override Gate Copy(int referenceBeginRow)
 {
     RegisterRefModel targetRef = new RegisterRefModel()
     {
         Register = null,
         Offset = _row.OffsetToRoot - referenceBeginRow
     };
     return new EmptyGate(targetRef);
 }
コード例 #35
0
        public void Toffoli(int target, params int[] controls)
        {
            ValidateToffoli(controls);
            Validate(target, "Toffoli", "target");
            for (int i = 0; i < controls.Length; i++)
            {
                Validate(controls[i], "Toffoli", "controls[" + i + "]");
            }

            if (_model == null)
            {
                RegisterRefModel[] toffoliParams = controls
                    .Select<int, RegisterRefModel>(x => _compModel.GetRefFromOffset(x))
                    .ToArray<RegisterRefModel>();
                ToffoliGate gate = new ToffoliGate(_compModel.GetRefFromOffset(target), toffoliParams);
                AddGate(gate);
            }
            else
            {
                RegisterRefModel[] toffoliParams = controls
                    .Select<int, RegisterRefModel>(x => new RegisterRefModel() { Register = _model, Offset = _offsetToModel + x })
                    .ToArray<RegisterRefModel>();
                RegisterRefModel targetRef = new RegisterRefModel() { Register = _model, Offset = _offsetToModel + target };
                ToffoliGate gate = new ToffoliGate(targetRef, toffoliParams);
                AddGate(gate);
            }
        }
コード例 #36
0
 public PhaseScaleGate(double gamma, RegisterRefModel target, RegisterRefModel? control = null)
     : base(gamma, target, control)
 {
 }
コード例 #37
0
        public void Delete()
        {
            if (_selectedItems.HasValue)
            {
                if (_selectedItems.Value.RowSpan == 1 && _selectedItems.Value.ColumnSpan == 1)
                {
                    int column = _selectedItems.Value.BeginColumn;
                    int row = _selectedItems.Value.BeginRow;
                    Gate oldGate = _steps[column].Gates[row];
                    if (oldGate.Name != GateName.Empty)
                    {
                        for (int i = oldGate.Begin; i <= oldGate.End; i++)
                        {
                            RegisterRefModel gateRef = GetRefFromOffset(i);
                            Gate newGate = new EmptyGate(gateRef);
                            _steps[column].SetGate(newGate);
                        }

                        if (oldGate is MultiControlledGate)
                        {
                            MultiControlledGate mcg = oldGate as MultiControlledGate;
                            RegisterRefModel rowRef = GetRefFromOffset(row);
                            if (mcg.Controls.Contains<RegisterRefModel>(rowRef))
                            {
                                RegisterRefModel[] toRemove = new RegisterRefModel[] { rowRef };
                                RegisterRefModel[] newControls = mcg.Controls.Except<RegisterRefModel>(toRemove).ToArray();
                                Gate toAdd = null;
                                if (oldGate.Name == GateName.PhaseKick)
                                {
                                    PhaseKickGate pk = oldGate as PhaseKickGate;
                                    toAdd = new PhaseKickGate(pk.Gamma, pk.Target, newControls);
                                }
                                else if (oldGate.Name == GateName.CPhaseShift)
                                {
                                    CPhaseShiftGate cps = oldGate as CPhaseShiftGate;
                                    toAdd = new CPhaseShiftGate(cps.Dist, cps.Target, newControls);
                                }
                                else if (oldGate.Name == GateName.InvCPhaseShift)
                                {
                                    InvCPhaseShiftGate icps = oldGate as InvCPhaseShiftGate;
                                    toAdd = new InvCPhaseShiftGate(icps.Dist, icps.Target, newControls);
                                }
                                else // Toffoli
                                {
                                    if (newControls.Length > 1)
                                    {
                                        toAdd = new ToffoliGate(oldGate.Target, newControls);
                                    }
                                    else
                                    {
                                        toAdd = new CNotGate(oldGate.Target, newControls[0]);
                                    }
                                }
                                _steps[column].SetGate(toAdd);
                            }
                        }
                        else if (oldGate.Name == GateName.CNot)
                        {
                            if (oldGate.Control.Value.OffsetToRoot == row)
                            {
                                Gate toAdd = new SigmaXGate(oldGate.Target);
                                _steps[column].SetGate(toAdd);
                            }
                        }
                        else if (oldGate is SingleGate)
                        {
                            SingleGate sg = oldGate as SingleGate;
                            if (sg.Control.HasValue)
                            {
                                if (sg.Control.Value.OffsetToRoot == row)
                                {
                                    Gate toAdd = null;
                                    switch (sg.Name)
                                    {
                                        case GateName.Hadamard:
                                            toAdd = new HadamardGate(sg.Target);
                                            break;
                                        case GateName.PhaseScale:
                                            toAdd = new PhaseScaleGate((sg as PhaseScaleGate).Gamma, sg.Target);
                                            break;
                                        case GateName.RotateX:
                                            toAdd = new RotateXGate((sg as RotateXGate).Gamma, sg.Target);
                                            break;
                                        case GateName.RotateY:
                                            toAdd = new RotateYGate((sg as RotateYGate).Gamma, sg.Target);
                                            break;
                                        case GateName.RotateZ:
                                            toAdd = new RotateZGate((sg as RotateZGate).Gamma, sg.Target);
                                            break;
                                        case GateName.SigmaX:
                                            toAdd = new SigmaXGate(sg.Target);
                                            break;
                                        case GateName.SigmaY:
                                            toAdd = new SigmaYGate(sg.Target);
                                            break;
                                        case GateName.SigmaZ:
                                            toAdd = new SigmaZGate(sg.Target);
                                            break;
                                        case GateName.SqrtX:
                                            toAdd = new SqrtXGate(sg.Target);
                                            break;
                                        case GateName.Unitary:
                                            toAdd = new UnitaryGate((sg as UnitaryGate).Matrix, sg.Target);
                                            break;
                                        default:
                                            break;
                                    }
                                    _steps[column].SetGate(toAdd);
                                }
                            }
                        }
                    }
                }
                else
                {
                    for (int i = _selectedItems.Value.BeginColumn; i <= _selectedItems.Value.EndColumn; i++)
                    {
                        for (int j = _selectedItems.Value.BeginRow; j <= _selectedItems.Value.EndRow; j++)
                        {
                            Gate oldGate = _steps[i].Gates[j];

                            for (int k = oldGate.Begin; k <= oldGate.End; k++)
                            {
                                RegisterRefModel gateRef = GetRefFromOffset(k);
                                Gate newGate = new EmptyGate(gateRef);
                                _steps[i].SetGate(newGate);
                            }
                            j = oldGate.End;
                        }
                    }
                }

            }
        }
コード例 #38
0
 public SingleGate(RegisterRefModel target, RegisterRefModel? control = null)
 {
     _control = control;
     _target = target;
 }
コード例 #39
0
 public SigmaZGate(RegisterRefModel target, RegisterRefModel? control = null)
     : base(target, control)
 {
 }
コード例 #40
0
 public AngleGate(double gamma, RegisterRefModel target, RegisterRefModel? control = null)
     : base(target, control)
 {
     _gamma = gamma;
 }
コード例 #41
0
 public ToffoliGate(RegisterRefModel target, params RegisterRefModel[] controls)
     : base(target, controls)
 {
 }
コード例 #42
0
ファイル: GateVM.cs プロジェクト: wupeng78/QuIDE-source-code
        public void SetGate(int pressedColumn, RegisterRefModel pressedRow, DragDropKeyStates keyStates)
        {
            ActionName action = HomeVM.SelectedAction;
            Gate oldGate;

            // make selection
            if (keyStates.HasFlag(DragDropKeyStates.ShiftKey))
            {
                // move selection
                if (keyStates.HasFlag(DragDropKeyStates.ControlKey))
                {
                    if (_model.IsSelected(pressedRow.OffsetToRoot, pressedColumn))
                    {
                        _model.Cut();
                        _model.Select(_row.OffsetToRoot, _row.OffsetToRoot, _column, _column);
                        _model.Paste();
                    }
                }
                else
                {
                    _model.Select(pressedRow.OffsetToRoot, _row.OffsetToRoot, pressedColumn, _column);
                }
            }
            else
            {
                switch (action)
                {
                    case ActionName.Empty:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name != GateName.Empty)
                        {
                            for (int i = oldGate.Begin; i <= oldGate.End; i++)
                            {
                                RegisterRefModel gateRef = _model.GetRefFromOffset(i);
                                Gate newGate = new EmptyGate(gateRef);
                                _model.Steps[_column].SetGate(newGate);
                            }

                            if (oldGate is MultiControlledGate)
                            {
                                MultiControlledGate mcg = oldGate as MultiControlledGate;
                                if (mcg.Controls.Contains<RegisterRefModel>(_row))
                                {
                                    RegisterRefModel[] toRemove = new RegisterRefModel[] { _row };
                                    RegisterRefModel[] newControls = mcg.Controls.Except<RegisterRefModel>(toRemove).ToArray();
                                    Gate toAdd = null;
                                    if (oldGate.Name == GateName.PhaseKick)
                                    {
                                        PhaseKickGate pk = oldGate as PhaseKickGate;
                                        toAdd = new PhaseKickGate(pk.Gamma, pk.Target, newControls);
                                    }
                                    else if (oldGate.Name == GateName.CPhaseShift)
                                    {
                                        CPhaseShiftGate cps = oldGate as CPhaseShiftGate;
                                        toAdd = new CPhaseShiftGate(cps.Dist, cps.Target, newControls);
                                    }
                                    else if (oldGate.Name == GateName.InvCPhaseShift)
                                    {
                                        InvCPhaseShiftGate icps = oldGate as InvCPhaseShiftGate;
                                        toAdd = new InvCPhaseShiftGate(icps.Dist, icps.Target, newControls);
                                    }
                                    else // Toffoli
                                    {
                                        if (newControls.Length > 1)
                                        {
                                            toAdd = new ToffoliGate(oldGate.Target, newControls);
                                        }
                                        else
                                        {
                                            toAdd = new CNotGate(oldGate.Target, newControls[0]);
                                        }
                                    }
                                    _model.Steps[_column].SetGate(toAdd);
                                }
                            }
                            else if (oldGate.Name == GateName.CNot)
                            {
                                if (oldGate.Control.Value.OffsetToRoot == _row.OffsetToRoot)
                                {
                                    Gate toAdd = new SigmaXGate(oldGate.Target);
                                    _model.Steps[_column].SetGate(toAdd);
                                }
                            }
                            else if (oldGate is SingleGate)
                            {
                                SingleGate sg = oldGate as SingleGate;
                                if (sg.Control.HasValue)
                                {
                                    if (sg.Control.Value.OffsetToRoot == _row.OffsetToRoot)
                                    {
                                        Gate toAdd = null;
                                        switch (sg.Name)
                                        {
                                            case GateName.Hadamard:
                                                toAdd = new HadamardGate(sg.Target);
                                                break;
                                            case GateName.PhaseScale:
                                                toAdd = new PhaseScaleGate((sg as PhaseScaleGate).Gamma, sg.Target);
                                                break;
                                            case GateName.RotateX:
                                                toAdd = new RotateXGate((sg as RotateXGate).Gamma, sg.Target);
                                                break;
                                            case GateName.RotateY:
                                                toAdd = new RotateYGate((sg as RotateYGate).Gamma, sg.Target);
                                                break;
                                            case GateName.RotateZ:
                                                toAdd = new RotateZGate((sg as RotateZGate).Gamma, sg.Target);
                                                break;
                                            case GateName.SigmaX:
                                                toAdd = new SigmaXGate(sg.Target);
                                                break;
                                            case GateName.SigmaY:
                                                toAdd = new SigmaYGate(sg.Target);
                                                break;
                                            case GateName.SigmaZ:
                                                toAdd = new SigmaZGate(sg.Target);
                                                break;
                                            case GateName.SqrtX:
                                                toAdd = new SqrtXGate(sg.Target);
                                                break;
                                            case GateName.Unitary:
                                                toAdd = new UnitaryGate((sg as UnitaryGate).Matrix, sg.Target);
                                                break;
                                            default:
                                                break;
                                        }
                                        _model.Steps[_column].SetGate(toAdd);
                                    }
                                }
                            }
                        }
                        break;
                    case ActionName.Hadamard:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            _model.Steps[_column].SetGate(new HadamardGate(_row));
                            _model.AddStepAfter(_column);
                        }
                        break;
                    case ActionName.SigmaX:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            _model.Steps[_column].SetGate(new SigmaXGate(_row));
                            _model.AddStepAfter(_column);
                        }
                        break;
                    case ActionName.SigmaY:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            _model.Steps[_column].SetGate(new SigmaYGate(_row));
                            _model.AddStepAfter(_column);
                        }
                        break;
                    case ActionName.SigmaZ:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            _model.Steps[_column].SetGate(new SigmaZGate(_row));
                            _model.AddStepAfter(_column);
                        }
                        break;
                    case ActionName.SqrtX:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            _model.Steps[_column].SetGate(new SqrtXGate(_row));
                            _model.AddStepAfter(_column);
                        }
                        break;
                    case ActionName.RotateX:
                    case ActionName.RotateY:
                    case ActionName.RotateZ:
                    case ActionName.PhaseKick:
                    case ActionName.PhaseScale:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            MainWindow window = App.Current.MainWindow as MainWindow;
                            GammaInputVM gammmaVM = new GammaInputVM();
                            ICustomContentDialog dialog = window.DialogManager.CreateCustomContentDialog(new GammaInput(gammmaVM), DialogMode.OkCancel);
                            dialog.Ok = () =>
                            {
                                double gamma = gammmaVM.Gamma;
                                if (action == ActionName.RotateX)
                                {
                                    _model.Steps[_column].SetGate(new RotateXGate(gamma, _row));
                                    _model.AddStepAfter(_column);
                                }
                                else if (action == ActionName.RotateY)
                                {
                                    _model.Steps[_column].SetGate(new RotateYGate(gamma, _row));
                                    _model.AddStepAfter(_column);
                                }
                                else if (action == ActionName.RotateZ)
                                {
                                    _model.Steps[_column].SetGate(new RotateZGate(gamma, _row));
                                    _model.AddStepAfter(_column);
                                }
                                else if (action == ActionName.PhaseKick)
                                {
                                    _model.Steps[_column].SetGate(new PhaseKickGate(gamma, _row));
                                    _model.AddStepAfter(_column);
                                }
                                else
                                {
                                    _model.Steps[_column].SetGate(new PhaseScaleGate(gamma, _row));
                                    _model.AddStepAfter(_column);
                                }
                            };
                            dialog.Show();
                        }
                        break;
                    case ActionName.Unitary:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            MainWindow window1 = App.Current.MainWindow as MainWindow;
                            MatrixInputVM matrixVM = new MatrixInputVM();
                            ICustomContentDialog dialog1 = window1.DialogManager.CreateCustomContentDialog(new MatrixInput(matrixVM), DialogMode.OkCancel);
                            dialog1.Ok = () =>
                            {
                                Complex[,] matrix = matrixVM.Matrix;
                                if (matrix != null)
                                {
                                    _model.Steps[_column].SetGate(new UnitaryGate(matrix, _row));
                                    _model.AddStepAfter(_column);
                                }
                            };
                            dialog1.Show();
                        }
                        break;
                    case ActionName.Control:
                        if (pressedColumn == _column)
                        {
                            oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                            if (!_row.Equals(pressedRow))
                            {
                                if (oldGate.Name == GateName.CNot)
                                {
                                    CNotGate oldCnot = oldGate as CNotGate;
                                    if (pressedRow.OffsetToRoot < oldGate.Begin)
                                    {
                                        if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, oldGate.Begin - 1))
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldCnot.Target, oldCnot.Control.Value, pressedRow));
                                        }
                                    }
                                    else if (pressedRow.OffsetToRoot > oldGate.End)
                                    {
                                        if (_model.Steps[_column].HasPlace(oldGate.End + 1, pressedRow.OffsetToRoot))
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldCnot.Target, oldCnot.Control.Value, pressedRow));
                                        }
                                    }
                                    else // new Control inside
                                    {
                                        //check if not doubled
                                        if (_row.OffsetToRoot != oldCnot.Target.OffsetToRoot &&
                                            _row.OffsetToRoot != oldCnot.Control.Value.OffsetToRoot)
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldCnot.Target, oldCnot.Control.Value, _row));
                                        }
                                    }
                                }
                                else if (oldGate.Name == GateName.Toffoli)
                                {
                                    ToffoliGate oldT = oldGate as ToffoliGate;
                                    if (pressedRow.OffsetToRoot < oldGate.Begin)
                                    {
                                        if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, oldGate.Begin - 1))
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldT.Target, pressedRow, oldT.Controls));
                                        }
                                    }
                                    else if (pressedRow.OffsetToRoot > oldGate.End)
                                    {
                                        if (_model.Steps[_column].HasPlace(oldGate.End + 1, pressedRow.OffsetToRoot))
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldT.Target, pressedRow, oldT.Controls));
                                        }
                                    }
                                    else // new Control inside
                                    {
                                        //check if not doubled
                                        if (_row.OffsetToRoot != oldT.Target.OffsetToRoot &&
                                            !oldT.Controls.Contains<RegisterRefModel>(_row))
                                        {
                                            _model.Steps[_column].SetGate(new ToffoliGate(oldT.Target, _row, oldT.Controls));
                                        }
                                    }
                                }
                                else if (oldGate.Name == GateName.CPhaseShift)
                                {
                                    CPhaseShiftGate oldT = oldGate as CPhaseShiftGate;
                                    if (pressedRow.OffsetToRoot < oldGate.Begin)
                                    {
                                        if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, oldGate.Begin - 1))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new CPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                        }
                                    }
                                    else if (pressedRow.OffsetToRoot > oldGate.End)
                                    {
                                        if (_model.Steps[_column].HasPlace(oldGate.End + 1, pressedRow.OffsetToRoot))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new CPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                        }
                                    }
                                    else // new Control inside
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new CPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                    }
                                }
                                else if (oldGate.Name == GateName.InvCPhaseShift)
                                {
                                    InvCPhaseShiftGate oldT = oldGate as InvCPhaseShiftGate;
                                    if (pressedRow.OffsetToRoot < oldGate.Begin)
                                    {
                                        if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, oldGate.Begin - 1))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new InvCPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                        }
                                    }
                                    else if (pressedRow.OffsetToRoot > oldGate.End)
                                    {
                                        if (_model.Steps[_column].HasPlace(oldGate.End + 1, pressedRow.OffsetToRoot))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new InvCPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                        }
                                    }
                                    else // new Control inside
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new InvCPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                    }
                                }
                                else if (oldGate.Name == GateName.PhaseKick)
                                {
                                    PhaseKickGate oldT = oldGate as PhaseKickGate;
                                    if (pressedRow.OffsetToRoot < oldGate.Begin)
                                    {
                                        if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, oldGate.Begin - 1))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new PhaseKickGate(oldT.Gamma, oldT.Target, cParams));
                                        }
                                    }
                                    else if (pressedRow.OffsetToRoot > oldGate.End)
                                    {
                                        if (_model.Steps[_column].HasPlace(oldGate.End + 1, pressedRow.OffsetToRoot))
                                        {
                                            List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                            cList.Add(pressedRow);
                                            RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                            _model.Steps[_column].SetGate(new PhaseKickGate(oldT.Gamma, oldT.Target, cParams));
                                        }
                                    }
                                    else // new Control inside
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new PhaseKickGate(oldT.Gamma, oldT.Target, cParams));
                                    }
                                }
                                else if (oldGate.Control == null)
                                {
                                    int lastEmptyRow = _row.OffsetToRoot - 1;
                                    if (pressedRow.OffsetToRoot > _row.OffsetToRoot)
                                    {
                                        lastEmptyRow = lastEmptyRow + 2;
                                    }
                                    if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, lastEmptyRow))
                                    {
                                        switch (oldGate.Name)
                                        {
                                            case GateName.Hadamard:
                                                _model.Steps[_column].SetGate(new HadamardGate(_row, pressedRow));
                                                break;
                                            case GateName.PhaseScale:
                                                PhaseScaleGate oldPs = oldGate as PhaseScaleGate;
                                                _model.Steps[_column].SetGate(new PhaseScaleGate(oldPs.Gamma, _row, pressedRow));
                                                break;
                                            case GateName.RotateX:
                                                RotateXGate oldRx = oldGate as RotateXGate;
                                                _model.Steps[_column].SetGate(new RotateXGate(oldRx.Gamma, _row, pressedRow));
                                                break;
                                            case GateName.RotateY:
                                                RotateYGate oldRy = oldGate as RotateYGate;
                                                _model.Steps[_column].SetGate(new RotateYGate(oldRy.Gamma, _row, pressedRow));
                                                break;
                                            case GateName.RotateZ:
                                                RotateZGate oldRz = oldGate as RotateZGate;
                                                _model.Steps[_column].SetGate(new RotateZGate(oldRz.Gamma, _row, pressedRow));
                                                break;
                                            case GateName.SigmaX:
                                                _model.Steps[_column].SetGate(new CNotGate(_row, pressedRow));
                                                break;
                                            case GateName.SigmaY:
                                                _model.Steps[_column].SetGate(new SigmaYGate(_row, pressedRow));
                                                break;
                                            case GateName.SigmaZ:
                                                _model.Steps[_column].SetGate(new SigmaZGate(_row, pressedRow));
                                                break;
                                            case GateName.SqrtX:
                                                _model.Steps[_column].SetGate(new SqrtXGate(_row, pressedRow));
                                                break;
                                            case GateName.Unitary:
                                                UnitaryGate oldU = oldGate as UnitaryGate;
                                                _model.Steps[_column].SetGate(new UnitaryGate(oldU.Matrix, _row, pressedRow));
                                                break;
                                            case GateName.Empty:
                                                _model.Steps[_column].SetGate(new CNotGate(_row, pressedRow));
                                                _model.AddStepAfter(_column);
                                                break;
                                            default:
                                                break;
                                        }
                                    }
                                }
                            }
                            else // add control inside (only CNot or Toffoli)
                            {
                                if (oldGate.Name == GateName.CNot)
                                {
                                    CNotGate oldCnot = oldGate as CNotGate;
                                    //check if not doubled
                                    if (_row.OffsetToRoot != oldCnot.Target.OffsetToRoot &&
                                        _row.OffsetToRoot != oldCnot.Control.Value.OffsetToRoot)
                                    {
                                        _model.Steps[_column].SetGate(new ToffoliGate(oldCnot.Target, _row, oldCnot.Control.Value));
                                    }
                                }
                                else if (oldGate.Name == GateName.Toffoli)
                                {
                                    ToffoliGate oldT = oldGate as ToffoliGate;
                                    //check if not doubled
                                    if (_row.OffsetToRoot != oldT.Target.OffsetToRoot &&
                                        !oldT.Controls.Contains<RegisterRefModel>(_row))
                                    {
                                        _model.Steps[_column].SetGate(new ToffoliGate(oldT.Target, _row, oldT.Controls));
                                    }
                                }
                                else if (oldGate.Name == GateName.CPhaseShift)
                                {
                                    CPhaseShiftGate oldT = oldGate as CPhaseShiftGate;
                                    //check if not doubled
                                    if (_row.OffsetToRoot != oldT.Target.OffsetToRoot &&
                                        !oldT.Controls.Contains<RegisterRefModel>(_row))
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new CPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                    }
                                }
                                else if (oldGate.Name == GateName.InvCPhaseShift)
                                {
                                    InvCPhaseShiftGate oldT = oldGate as InvCPhaseShiftGate;
                                    //check if not doubled
                                    if (_row.OffsetToRoot != oldT.Target.OffsetToRoot &&
                                        !oldT.Controls.Contains<RegisterRefModel>(_row))
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new InvCPhaseShiftGate(oldT.Dist, oldT.Target, cParams));
                                    }
                                }
                                else if (oldGate.Name == GateName.PhaseKick)
                                {
                                    PhaseKickGate oldT = oldGate as PhaseKickGate;
                                    //check if not doubled
                                    if (_row.OffsetToRoot != oldT.Target.OffsetToRoot &&
                                        !oldT.Controls.Contains<RegisterRefModel>(_row))
                                    {
                                        List<RegisterRefModel> cList = oldT.Controls.ToList<RegisterRefModel>();
                                        cList.Add(_row);
                                        RegisterRefModel[] cParams = cList.ToArray<RegisterRefModel>();
                                        _model.Steps[_column].SetGate(new PhaseKickGate(oldT.Gamma, oldT.Target, cParams));
                                    }
                                }
                            }
                        }
                        break;
                    case ActionName.CPhaseShift:
                        if (pressedColumn == _column)
                        {
                            if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, _row.OffsetToRoot))
                            {
                                MainWindow window1 = App.Current.MainWindow as MainWindow;
                                PhaseDistInputVM vm = new PhaseDistInputVM();
                                vm.DistText = Math.Abs(pressedRow.OffsetToRoot - _row.OffsetToRoot).ToString();

                                ICustomContentDialog dialog1 = window1.DialogManager.CreateCustomContentDialog(
                                    new PhaseDistInput(vm), DialogMode.OkCancel);
                                dialog1.Ok = () =>
                                {
                                    int? dist = vm.Dist;
                                    if (dist.HasValue)
                                    {
                                        if (_row.Equals(pressedRow))
                                        {
                                            _model.Steps[_column].SetGate(new CPhaseShiftGate(dist.Value, _row));
                                        }
                                        else
                                        {
                                            _model.Steps[_column].SetGate(new CPhaseShiftGate(dist.Value, _row, pressedRow));
                                        }
                                        _model.AddStepAfter(_column);
                                    }
                                };
                                dialog1.Show();
                            }
                        }
                        break;
                    case ActionName.InvCPhaseShift:
                        if (pressedColumn == _column)
                        {
                            if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, _row.OffsetToRoot))
                            {
                                MainWindow window1 = App.Current.MainWindow as MainWindow;
                                PhaseDistInputVM vm = new PhaseDistInputVM();
                                vm.DistText = Math.Abs(pressedRow.OffsetToRoot - _row.OffsetToRoot).ToString();

                                ICustomContentDialog dialog1 = window1.DialogManager.CreateCustomContentDialog(
                                    new PhaseDistInput(vm), DialogMode.OkCancel);
                                dialog1.Ok = () =>
                                {
                                    int? dist = vm.Dist;
                                    if (dist.HasValue)
                                    {
                                        if (_row.Equals(pressedRow))
                                        {
                                            _model.Steps[_column].SetGate(new InvCPhaseShiftGate(dist.Value, _row));
                                        }
                                        else
                                        {
                                            _model.Steps[_column].SetGate(new InvCPhaseShiftGate(dist.Value, _row, pressedRow));
                                        }
                                        _model.AddStepAfter(_column);
                                    }
                                };
                                dialog1.Show();
                            }
                        }
                        break;
                    case ActionName.Measure:
                        if (pressedColumn == _column)
                        {
                            if (_model.Steps[_column].HasPlace(pressedRow.OffsetToRoot, _row.OffsetToRoot))
                            {
                                _model.Steps[_column].SetGate(new MeasureGate(pressedRow, _row));
                                _model.AddStepAfter(_column);
                            }
                        }
                        break;
                    case ActionName.Ungroup:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Parametric)
                        {
                            CircuitEvaluator eval = CircuitEvaluator.GetInstance();
                            //eval.InitFromModel(_model);

                            try
                            {
                                _model.SetStepForGates(_column);

                                int oldColumns = _model.Steps.Count;
                                int oldBegin = oldGate.Begin;
                                int oldEnd = oldGate.End;

                                eval.Decompose(oldGate as ParametricGate);
                                int columnsAdded = _model.Steps.Count - oldColumns;

                                _model.ResetStepForGates();

                                //remove old composite gate
                                for (int i = oldGate.Begin; i <= oldGate.End; i++)
                                {
                                    RegisterRefModel gateRef = _model.GetRefFromOffset(i);
                                    Gate newGate = new EmptyGate(gateRef);
                                    _model.Steps[_column].SetGate(newGate);
                                }

                                //delete step on _column (if it is empty)
                                bool isEmpty = true;
                                int j = 0;
                                while (isEmpty && j < _model.Steps[_column].Gates.Count)
                                {
                                    if (_model.Steps[_column].Gates[j].Name != GateName.Empty)
                                    {
                                        isEmpty = false;
                                    }
                                    j++;
                                }
                                if (isEmpty)
                                {
                                    _model.DeleteStep(_column);
                                    _model.Select(oldBegin, oldEnd, _column, _column + columnsAdded - 1);
                                }
                                else
                                {
                                    _model.Select(oldBegin, oldEnd, _column + 1, _column + columnsAdded);
                                }
                            }
                            catch (Exception ex)
                            {
                                string msg = "Unable to ungroup gate. Its parameters are invalid.\n" +
                                                "Inner exception:\n" +
                                                (ex.InnerException == null ? ex.Message : ex.InnerException.Message);
                                MessageBox.Show(
                                    msg,
                                    "Unable to ungroup gate",
                                    MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                            }
                        }
                        else if (oldGate.Name == GateName.Composite)
                        {
                            CompositeGate cg = oldGate as CompositeGate;
                            List<Gate> toAdd = _model.GetActualGates(cg);
                            int column = _column;
                            foreach (Gate g in toAdd)
                            {
                                if (g.Name != GateName.Empty)
                                {
                                    _model.InsertStepRight(column);
                                    column++;
                                    _model.Steps[column].SetGate(g);
                                }
                            }

                            //remove old composite gate
                            for (int i = oldGate.Begin; i <= oldGate.End; i++)
                            {
                                RegisterRefModel gateRef = _model.GetRefFromOffset(i);
                                Gate newGate = new EmptyGate(gateRef);
                                _model.Steps[_column].SetGate(newGate);
                            }

                            //delete step on _column (if it is empty)
                            bool isEmpty = true;
                            int j = 0;
                            while (isEmpty && j < _model.Steps[_column].Gates.Count)
                            {
                                if (_model.Steps[_column].Gates[j].Name != GateName.Empty)
                                {
                                    isEmpty = false;
                                }
                                j++;
                            }
                            if (isEmpty)
                            {
                                _model.DeleteStep(_column);
                            }
                        }
                        break;
                    case ActionName.Composite:
                        oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
                        if (oldGate.Name == GateName.Empty)
                        {
                            MainWindow window1 = App.Current.MainWindow as MainWindow;

                            CircuitEvaluator eval = CircuitEvaluator.GetInstance();
                            //eval.InitFromModel(_model);
                            Dictionary<string, List<MethodInfo>> dict = eval.GetExtensionGates();
                            if (!string.IsNullOrWhiteSpace(HomeVM.SelectedComposite))
                            {
                                ParametricInputVM vm = new ParametricInputVM(HomeVM.SelectedComposite, dict, _model.CompositeGates);
                                ParametricInput ci = new ParametricInput(vm);
                                ICustomContentDialog dialog1 = window1.DialogManager
                                    .CreateCustomContentDialog(ci, DialogMode.OkCancel);
                                dialog1.Ok = () =>
                                    {
                                        try
                                        {
                                            if (vm.IsValid)
                                            {
                                                if (vm.Method != null)
                                                {
                                                    ParametricGate cg = eval.CreateParametricGate(vm.Method, vm.ParamValues);
                                                    _model.Steps[_column].SetGate(cg);
                                                    _model.AddStepAfter(_column);
                                                }
                                                else if (vm.CopositeGateTarget != null)
                                                {
                                                    int minWidth = _model.MinWidthForComposite(vm.FunctionName);
                                                    if (vm.CopositeGateTarget.Value.Width < minWidth)
                                                    {
                                                        StringBuilder sb = new StringBuilder("Entered parameter has too small width.\n");
                                                        sb.Append("Entered width: ");
                                                        sb.Append(vm.CopositeGateTarget.Value.Width).AppendLine();
                                                        sb.Append("Minimum width: ");
                                                        sb.Append(minWidth).AppendLine();
                                                        throw new Exception(sb.ToString());
                                                    }
                                                    else
                                                    {
                                                        CompositeGate cg = new CompositeGate(vm.FunctionName, vm.CopositeGateTarget.Value);
                                                        _model.Steps[_column].SetGate(cg);
                                                        _model.AddStepAfter(_column);
                                                    }
                                                }
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            string msg = "Unable to add gate. The parameters are invalid.\n" +
                                                "Inner exception:\n" +
                                                (ex.InnerException != null ? ex.InnerException.Message : ex.Message);
                                            MessageBox.Show(
                                                 msg,
                                                "Unable to add gate",
                                                MessageBoxButton.OK,
                                                MessageBoxImage.Error);
                                        }
                                    };
                                dialog1.Show();
                            }
                        }
                        break;
                    case ActionName.Selection:
                        _model.Select(pressedRow.OffsetToRoot, _row.OffsetToRoot, pressedColumn, _column);
                        break;
                    case ActionName.Pointer:
                    default:
                        break;
                }
            }
        }
コード例 #43
0
 public ToffoliGate(RegisterRefModel target, RegisterRefModel control, params RegisterRefModel[] restControls)
     : base(target, control, restControls)
 {
 }
コード例 #44
0
 public RotateYGate(double gamma, RegisterRefModel target, RegisterRefModel? control = null)
     : base(gamma, target, control)
 {
 }
コード例 #45
0
 public EmptyGate(RegisterRefModel row)
 {
     _row = row;
 }