Example #1
0
        private ParametricGate PasteParametricGate(ParametricGate gate, int referenceBeginRow)
        {
            Func <RegisterRefModel, RegisterRefModel> pasteRegRef = rrm =>
            {
                return(GetRefFromOffset(rrm.OffsetToRoot + referenceBeginRow));
            };

            Func <RegisterPartModel, RegisterPartModel> pasteRegPart = rpm =>
            {
                RegisterRefModel beginRef = GetRefFromOffset(rpm.OffsetToRoot + referenceBeginRow);
                int width = Math.Min(beginRef.Register.Qubits.Count - beginRef.Offset, rpm.Width);

                return(new RegisterPartModel()
                {
                    Register = beginRef.Register,
                    Offset = beginRef.Offset,
                    Width = width
                });
            };

            object[] parameters = gate.Parameters;
            object[] newPars    = new object[parameters.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                if (parameters[i].GetType() == typeof(RegisterRefModel))
                {
                    newPars[i] = pasteRegRef((RegisterRefModel)parameters[i]);
                }
                else if (parameters[i].GetType() == typeof(RegisterPartModel))
                {
                    newPars[i] = pasteRegPart((RegisterPartModel)parameters[i]);
                }
                else if (parameters[i].GetType() == typeof(RegisterRefModel[]))
                {
                    newPars[i] = (parameters[i] as RegisterRefModel[])
                                 .Select <RegisterRefModel, RegisterRefModel>(x => pasteRegRef(x)).ToArray();
                }
                else if (parameters[i].GetType() == typeof(RegisterPartModel[]))
                {
                    newPars[i] = (parameters[i] as RegisterPartModel[])
                                 .Select <RegisterPartModel, RegisterPartModel>(x => pasteRegPart(x)).ToArray();
                }
                else
                {
                    newPars[i] = parameters[i];
                }
            }
            ParametricGate cg = new ParametricGate(gate.Method, gate.ComputationMethod,
                                                   gate.InverseMethod, gate.MethodCode, newPars);

            return(cg);
        }
Example #2
0
        public override Gate Copy(int referenceBeginRow)
        {
            Func <RegisterRefModel, RegisterRefModel> copyRegRef = rrm =>
            {
                return(new RegisterRefModel()
                {
                    Register = null,
                    Offset = rrm.OffsetToRoot - referenceBeginRow
                });
            };

            object[] newPars = new object[_parameters.Length];
            for (int i = 0; i < _parameters.Length; i++)
            {
                if (_parameters[i].GetType() == typeof(RegisterRefModel))
                {
                    newPars[i] = copyRegRef((RegisterRefModel)_parameters[i]);
                }
                else if (_parameters[i].GetType() == typeof(RegisterPartModel))
                {
                    newPars[i] = copyRegPart((RegisterPartModel)_parameters[i], referenceBeginRow);
                }
                else if (_parameters[i].GetType() == typeof(RegisterRefModel[]))
                {
                    newPars[i] = (_parameters[i] as RegisterRefModel[])
                                 .Select <RegisterRefModel, RegisterRefModel>(x => copyRegRef(x)).ToArray();
                }
                else if (_parameters[i].GetType() == typeof(RegisterPartModel[]))
                {
                    newPars[i] = (_parameters[i] as RegisterPartModel[])
                                 .Select <RegisterPartModel, RegisterPartModel>(x => copyRegPart(x, referenceBeginRow)).ToArray();
                }
                else
                {
                    newPars[i] = _parameters[i];
                }
            }
            ParametricGate cg = new ParametricGate(_method, _computationMethod, _inverseMethod, _methodCode, newPars);

            return(cg);
        }
Example #3
0
        public bool CanStepBack(int column)
        {
            StepModel step = _steps[column];

            foreach (Gate g in step.Gates)
            {
                if (g.Name == GateName.Measure)
                {
                    return(false);
                }
                if (g.Name == GateName.Parametric)
                {
                    ParametricGate cg = g as ParametricGate;
                    if (cg.InverseMethod == null)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
        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();
        }
        public override Gate Copy(int referenceBeginRow)
        {
            Func<RegisterRefModel, RegisterRefModel> copyRegRef = rrm =>
                {
                    return new RegisterRefModel()
                    {
                        Register = null,
                        Offset = rrm.OffsetToRoot - referenceBeginRow
                    };
                };

            object[] newPars = new object[_parameters.Length];
            for (int i = 0; i < _parameters.Length; i++)
            {
                if (_parameters[i].GetType() == typeof(RegisterRefModel))
                {
                    newPars[i] = copyRegRef((RegisterRefModel)_parameters[i]);
                }
                else if (_parameters[i].GetType() == typeof(RegisterPartModel))
                {
                    newPars[i] = copyRegPart((RegisterPartModel)_parameters[i], referenceBeginRow);
                }
                else if (_parameters[i].GetType() == typeof(RegisterRefModel[]))
                {
                    newPars[i] = (_parameters[i] as RegisterRefModel[])
                        .Select<RegisterRefModel, RegisterRefModel>(x => copyRegRef(x)).ToArray();
                }
                else if (_parameters[i].GetType() == typeof(RegisterPartModel[]))
                {
                    newPars[i] = (_parameters[i] as RegisterPartModel[])
                        .Select<RegisterPartModel, RegisterPartModel>(x => copyRegPart(x, referenceBeginRow)).ToArray();
                }
                else
                {
                    newPars[i] = _parameters[i];
                }
            }
            ParametricGate cg = new ParametricGate(_method, _computationMethod, _inverseMethod, _methodCode, newPars);
            return cg;
        }
        private ParametricGate PasteParametricGate(ParametricGate gate, int referenceBeginRow)
        {
            Func<RegisterRefModel, RegisterRefModel> pasteRegRef = rrm =>
            {
                return GetRefFromOffset(rrm.OffsetToRoot + referenceBeginRow);
            };

            Func<RegisterPartModel, RegisterPartModel> pasteRegPart = rpm =>
            {
                RegisterRefModel beginRef = GetRefFromOffset(rpm.OffsetToRoot + referenceBeginRow);
                int width = Math.Min(beginRef.Register.Qubits.Count - beginRef.Offset, rpm.Width);

                return new RegisterPartModel()
                {
                    Register = beginRef.Register,
                    Offset = beginRef.Offset,
                    Width = width
                };

            };

            object[] parameters = gate.Parameters;
            object[] newPars = new object[parameters.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                if (parameters[i].GetType() == typeof(RegisterRefModel))
                {
                    newPars[i] = pasteRegRef((RegisterRefModel)parameters[i]);
                }
                else if (parameters[i].GetType() == typeof(RegisterPartModel))
                {
                    newPars[i] = pasteRegPart((RegisterPartModel)parameters[i]);
                }
                else if (parameters[i].GetType() == typeof(RegisterRefModel[]))
                {
                    newPars[i] = (parameters[i] as RegisterRefModel[])
                        .Select<RegisterRefModel, RegisterRefModel>(x => pasteRegRef(x)).ToArray();
                }
                else if (parameters[i].GetType() == typeof(RegisterPartModel[]))
                {
                    newPars[i] = (parameters[i] as RegisterPartModel[])
                        .Select<RegisterPartModel, RegisterPartModel>(x => pasteRegPart(x)).ToArray();
                }
                else
                {
                    newPars[i] = parameters[i];
                }
            }
            ParametricGate cg = new ParametricGate(gate.Method, gate.ComputationMethod,
                gate.InverseMethod, gate.MethodCode, newPars);
            return cg;
        }
 public void Decompose(ParametricGate cg)
 {
     _comp.Decompose(cg);
 }