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 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); }
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); }