Exemplo n.º 1
0
 protected RegisterPartModel incRegPart(RegisterPartModel regRef, RegisterModel register, int afterOffset, int delta = 1)
 {
     if (regRef.Register == register)
     {
         if (regRef.Width + delta == register.Qubits.Count)
         {
             return new RegisterPartModel()
             {
                 Register = regRef.Register,
                 Offset = regRef.Offset,
                 Width = regRef.Width + delta
             };
         }
         else if (regRef.Offset > afterOffset)
         {
             return new RegisterPartModel()
             {
                 Register = regRef.Register,
                 Offset = regRef.Offset + delta,
                 Width = regRef.Width
             };
         }
         else if (regRef.Offset + regRef.Width - 1 > afterOffset)
         {
             return new RegisterPartModel()
             {
                 Register = regRef.Register,
                 Offset = regRef.Offset,
                 Width = regRef.Width + delta
             };
         }
     }
     return regRef;
 }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
 protected RegisterPartModel copyRegPart(RegisterPartModel regRef, int referenceBeginRow)
 {
     return new RegisterPartModel()
     {
         Register = null,
         Offset = regRef.OffsetToRoot - referenceBeginRow,
         Width = regRef.Width
     };
 }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
        private string GenerateCompositeGateCode(CompositeGate cg, string defaultRegName = null)
        {
            StringBuilder     sb = new StringBuilder("comp.").Append(cg.FunctionName).Append("(");
            RegisterPartModel rm = cg.TargetRegister;

            sb.Append(GetRegName(rm.Register, defaultRegName));
            if (rm.Register == null || (rm.Width != rm.Register.Qubits.Count))
            {
                sb.Append("[").Append(rm.Offset).Append(", ");
                sb.Append(rm.Width).Append("]");
            }
            sb.Append(");");

            return(sb.ToString());
        }
Exemplo n.º 6
0
 internal Quantum.Register ModelToSource(RegisterPartModel model)
 {
     Quantum.Register toReturn = _parserRoot.SourceRegister;
     if (model.Register != null)
     {
         toReturn = _modelRefs[model.Register].SourceRegister;
     }
     if (model.Width == toReturn.Width)
     {
         return(toReturn);
     }
     else
     {
         return(toReturn[model.Offset, model.Width]);
     }
 }
Exemplo n.º 7
0
        internal Register ModelToRef(RegisterPartModel model)
        {
            Register toReturn = _parserRoot;

            if (model.Register != null)
            {
                toReturn = _modelRefs[model.Register];
            }
            if (model.Width == toReturn.Width)
            {
                return(toReturn);
            }
            else
            {
                return(toReturn[model.Offset, model.Width]);
            }
        }
Exemplo n.º 8
0
        public void ChangeCompositeTarget(RegisterPartModel target)
        {
            Gate oldGate = _model.Steps[_column].Gates[_row.OffsetToRoot];
            CompositeGate cg = oldGate as CompositeGate;
            CompositeGate newCg = new CompositeGate(cg.FunctionName, target);

            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 (_model.Steps[_column].HasPlace(newCg.Begin, newCg.End))
            {
                _model.Steps[_column].SetGate(newCg);
                _model.AddStepAfter(_column);
            }
            else
            {
                _model.InsertStepRight(_column);
                _model.Steps[_column + 1].SetGate(newCg);
                _model.AddStepAfter(_column + 1);
            }
        }
Exemplo n.º 9
0
        public void Update(Register rootRegister, RegisterPartModel? regModel = null)
        {
            Register register = rootRegister;

            if (regModel.HasValue)
            {
                _selectedRegister = regModel.Value;
            }

            if (_selectedRegister.HasValue && _selectedRegister.Value.Width < rootRegister.Width)
            {
                register = rootRegister[_selectedRegister.Value.OffsetToRoot, _selectedRegister.Value.Width];
            }

            _states.Clear();

            IReadOnlyDictionary<ulong, Complex> amplitudes = register.GetAmplitudes();
            if (amplitudes != null)
            {
                foreach (ulong state in amplitudes.Keys)
                {
                    OutputState newState = new OutputState(state, amplitudes[state], register.Width);
                    _states.Add(newState);
                }
            }
            else
            {
                IReadOnlyDictionary<ulong, double> probabilities = register.GetProbabilities();
                foreach (ulong state in probabilities.Keys)
                {
                    OutputState newState = new OutputState(state, probabilities[state], register.Width);
                    _states.Add(newState);
                }
            }
            OnOutputChanged();
        }
Exemplo n.º 10
0
        private Gate PasteGate(Gate gate, int referenceBeginRow)
        {
            RegisterRefModel targetRef = GetRefFromOffset(gate.Target.OffsetToRoot + referenceBeginRow);
            RegisterRefModel? controlRef = null;
            if (gate.Control.HasValue)
            {
                controlRef = GetRefFromOffset(gate.Control.Value.OffsetToRoot + referenceBeginRow);
            }

            switch (gate.Name)
            {
                case GateName.CNot:
                    return new CNotGate(targetRef, controlRef.Value);
                case GateName.Parametric:
                    return PasteParametricGate(gate as ParametricGate, referenceBeginRow);
                case GateName.Composite:
                    CompositeGate cg = gate as CompositeGate;
                    RegisterRefModel partEndRef = GetRefFromOffset(cg.TargetRegister.EndOffsetToRoot + referenceBeginRow);
                    if (partEndRef.Register.OffsetToRoot == targetRef.Register.OffsetToRoot)
                    {
                        RegisterPartModel target = new RegisterPartModel()
                        {
                            Register = targetRef.Register,
                            Offset = targetRef.Offset,
                            Width = cg.TargetRegister.Width
                        };
                        return new CompositeGate(cg.FunctionName, target);
                    }
                    else
                    {
                        RegisterPartModel target = new RegisterPartModel()
                        {
                            Register = null,
                            Offset = cg.TargetRegister.Offset + referenceBeginRow,
                            Width = cg.TargetRegister.Width
                        };
                        return new CompositeGate(cg.FunctionName, target);
                    }
                case GateName.CPhaseShift:
                    CPhaseShiftGate cps = gate as CPhaseShiftGate;
                    RegisterRefModel[] controls = cps.Controls.Select<RegisterRefModel, RegisterRefModel>(x =>
                        GetRefFromOffset(x.OffsetToRoot + referenceBeginRow)).ToArray<RegisterRefModel>();
                    return new CPhaseShiftGate(cps.Dist, targetRef, controls);
                case GateName.Empty:
                    return new EmptyGate(targetRef);
                case GateName.Hadamard:
                    return new HadamardGate(targetRef, controlRef);
                case GateName.InvCPhaseShift:
                    InvCPhaseShiftGate icps = gate as InvCPhaseShiftGate;
                    RegisterRefModel[] icontrols = icps.Controls.Select<RegisterRefModel, RegisterRefModel>(x =>
                        GetRefFromOffset(x.OffsetToRoot + referenceBeginRow)).ToArray<RegisterRefModel>();
                    return new InvCPhaseShiftGate(icps.Dist, targetRef, icontrols);
                case GateName.Measure:
                    MeasureGate mg = gate as MeasureGate;
                    RegisterRefModel beginRef = GetRefFromOffset(mg.Begin + referenceBeginRow);
                    RegisterRefModel endRef = GetRefFromOffset(mg.End + referenceBeginRow);
                    return new MeasureGate(beginRef, endRef);
                case GateName.PhaseKick:
                    PhaseKickGate pk = gate as PhaseKickGate;
                    RegisterRefModel[] controls1 = pk.Controls.Select<RegisterRefModel, RegisterRefModel>(x =>
                        GetRefFromOffset(x.OffsetToRoot + referenceBeginRow)).ToArray<RegisterRefModel>();
                    return new PhaseKickGate(pk.Gamma, targetRef, controls1);
                case GateName.PhaseScale:
                    PhaseScaleGate ps = gate as PhaseScaleGate;
                    return new PhaseScaleGate(ps.Gamma, targetRef, controlRef);
                case GateName.RotateX:
                    RotateXGate rx = gate as RotateXGate;
                    return new RotateXGate(rx.Gamma, targetRef, controlRef);
                case GateName.RotateY:
                    RotateYGate ry = gate as RotateYGate;
                    return new RotateYGate(ry.Gamma, targetRef, controlRef);
                case GateName.RotateZ:
                    RotateZGate rz = gate as RotateZGate;
                    return new RotateZGate(rz.Gamma, targetRef, controlRef);
                case GateName.SigmaX:
                    return new SigmaXGate(targetRef);
                case GateName.SigmaY:
                    return new SigmaYGate(targetRef, controlRef);
                case GateName.SigmaZ:
                    return new SigmaZGate(targetRef, controlRef);
                case GateName.SqrtX:
                    return new SqrtXGate(targetRef, controlRef);
                case GateName.Toffoli:
                    ToffoliGate t = gate as ToffoliGate;
                    RegisterRefModel[] tcontrols = t.Controls.Select<RegisterRefModel, RegisterRefModel>(x =>
                        GetRefFromOffset(x.OffsetToRoot + referenceBeginRow)).ToArray<RegisterRefModel>();
                    return new ToffoliGate(targetRef, tcontrols);
                case GateName.Unitary:
                    UnitaryGate u = gate as UnitaryGate;
                    return new UnitaryGate(u.Matrix, targetRef, controlRef);
                default:
                    return null;
            }
        }
Exemplo n.º 11
0
        public void MakeComposite(string name, List<Gate> toGroup)
        {
            Delete();

            RegisterPartModel target = new RegisterPartModel()
            {
                Register = null,
                Offset = 0,
                Width = toGroup.Select<Gate, int>(x => x.End).Max() + 1
            };
            CompositeGate cg = new CompositeGate(name, target);

            foreach (StepModel step in _steps)
            {
                for (int j = 0; j < step.Gates.Count; j++)
                {
                    Gate oldGate = step.Gates[j];
                    CustomGate custom = oldGate as CustomGate;
                    if (custom != null && custom.FunctionName.Equals(name))
                    {
                        for (int k = oldGate.Begin; k <= oldGate.End; k++)
                        {
                            RegisterRefModel gateRef = GetRefFromOffset(k);
                            Gate newGate = new EmptyGate(gateRef);
                            step.SetGate(newGate);
                        }
                        Gate replacement = PasteGate(cg, oldGate.Begin);
                        if (step.HasPlace(replacement.Begin, replacement.End))
                        {
                            step.SetGate(replacement);
                        }
                    }
                    j = oldGate.End;
                }
            }

            _compositeGates[name] = toGroup;

            //CompositeGate cg = new CompositeGate(name, toGroup, target);

            Gate toPaste = PasteGate(cg, _selectedItems.Value.BeginRow);

            bool notPasted = true;
            int i = _selectedItems.Value.BeginColumn;
            while (notPasted && i <= _selectedItems.Value.EndColumn)
            {
                if (_steps[i].HasPlace(toPaste.Begin, toPaste.End))
                {
                    _steps[i].SetGate(toPaste);
                    notPasted = false;
                }
                i++;
            }
            if (notPasted)
            {
                InsertStepLeft(_selectedItems.Value.BeginColumn);
                _steps[_selectedItems.Value.BeginColumn].SetGate(toPaste);
            }
        }
Exemplo n.º 12
0
 //public CompositeGate(string name, List<Gate> gates, RegisterPartModel target)
 //{
 //    _name = name;
 //    _gates = gates;
 //    _targetRegister = target;
 //}
 public CompositeGate(string name, RegisterPartModel target)
 {
     _name = name;
     _targetRegister = target;
 }
Exemplo n.º 13
0
 public override void IncrementRow(RegisterModel register, int afterOffset, int delta = 1)
 {
     _targetRegister = incRegPart(_targetRegister, register, afterOffset, delta);
 }