Пример #1
0
        private void CoefficientsCreate_Click(object sender, RoutedEventArgs e)
        {
            ErrorMessage.Visibility = Visibility.Collapsed;
            Complex[,] coefs        = new Complex[2, 1];
            double phase;

            try
            {
                coefs[0, 0] = ComplexParser.FromString(Alpha.Text);
                coefs[1, 0] = ComplexParser.FromString(Beta.Text);
                phase       = double.Parse(Phase.Text);
            } catch (FormatException)
            {
                ErrorMessage.Content    = "Inserted value(s) could not be parsed";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            if (coefs[0, 0] == Complex.Zero && coefs[1, 0] == Complex.Zero)
            {
                ErrorMessage.Content    = "At least one of alpha/beta must be nonzero";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            Transformation transformation = Transformation.FromCoefficients(coefs[0, 0], coefs[1, 0], phase);

            _circuit.DefineUnitaryGateModel(1, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
        }
        private void CalculateSubsystemState(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(DiscardedQubitsBox.Text))
            {
                return;
            }
            StateOperator state           = StateOperator.FromQuantumState(Layer.GetSystemState());
            List <int>    discardedQubits = new List <int>();
            string        qubits          = DiscardedQubitsBox.Text.Replace(",", "");

            for (int i = 0; i < qubits.Length; i++)
            {
                discardedQubits.Add(Convert.ToInt32(qubits[i] - 48));
            }
            SubState = state.PartialTrace(discardedQubits);
            SubsystemState.ResizeGrid(SubState.RowDimension, SubState.ColumnDimension);
            for (int i = 0; i < SubState.RowDimension; i++)
            {
                for (int j = 0; j < SubState.ColumnDimension; j++)
                {
                    SubsystemState[i, j] = ComplexParser.ToString(SubState[i, j], 4);
                }
            }
            SubsystemStateGrid.Visibility = Visibility.Visible;
            if (SubState.Size == 1)
            {
                ExamineSubsystemButton.IsEnabled = false;
            }
        }
Пример #3
0
        private void Matrix_Click(object sender, RoutedEventArgs e)
        {
            /*
             * Complex[] values = new Complex[MatrixDefinition.Rows*MatrixDefinition.Columns];
             * for(int i = 0; i < MatrixDefinition.Columns; i++ )
             *  for(int j = 0; j < MatrixDefinition.Rows; j++)
             *      values[i * MatrixDefinition.Rows + j] = ComplexParser.FromString(MatrixDefinition[j, i]);
             * Transformation transformation = Transformation.FromValuesColumnMajor(values, MatrixDefinition.Columns);
             * _circuit.DefineUnitaryGateModel((int)QubitsBox.SelectedItem, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
             */
            ErrorMessage.Visibility = Visibility.Collapsed;
            Complex[, ] values      = new Complex[MatrixDefinition.Rows, MatrixDefinition.Columns];
            for (int i = 0; i < MatrixDefinition.Columns; i++)
            {
                for (int j = 0; j < MatrixDefinition.Rows; j++)
                {
                    try { values[i, j] = ComplexParser.FromString(MatrixDefinition[i, j]); }
                    catch (FormatException)
                    {
                        ErrorMessage.Content    = string.Format($"Value at [{0}, {1}] could not be parsed", i, j);
                        ErrorMessage.Visibility = Visibility.Visible;
                        return;
                    }
                }
            }
            if (!Transformation.IsUnitary(values))
            {
                ErrorMessage.Content    = "Defined matrix is not unitary";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            Transformation transformation = Transformation.FromValues(values);

            _circuit.DefineUnitaryGateModel((int)QubitsBox.SelectedItem, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
        }
Пример #4
0
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            Complex number;

            // Is a number?
            if (!ComplexParser.TryParse((string)value, out number))
            {
                return(new ValidationResult(false, "Not a complex number."));
            }

            // Number is valid
            return(new ValidationResult(true, null));
        }
        protected override void OnInitialized(EventArgs e)
        {
            BlochSphere bloch = new BlochSphere(CircuitCell.CellSize);

            bloch.Recalculate(Qubit.BlochVector());
            bloch.HorizontalAlignment = HorizontalAlignment.Left;
            Sphere.Children.Add(bloch);
            X.Content      = ComplexParser.ToString(bloch.X, 4); Y.Content = ComplexParser.ToString(bloch.Y, 4); Z.Content = ComplexParser.ToString(bloch.Z, 4);
            Radius.Content = ComplexParser.ToString(bloch.Radius, 4); Longtitude.Content = ComplexParser.ToString(bloch.Longtitude, 4); Colatitude.Content = ComplexParser.ToString(bloch.Colatitude, 4);
            DensityMatrix.ResizeGrid(2, 2);
            DensityMatrix.HorizontalAlignment = HorizontalAlignment.Center;
            for (int i = 0; i < Qubit.StateOperator.RowDimension; i++)
            {
                for (int j = 0; j < Qubit.StateOperator.RowDimension; j++)
                {
                    DensityMatrix[i, j] = ComplexParser.ToString(Qubit.StateOperator[i, j], 4);
                }
            }
            base.OnInitialized(e);
        }
Пример #6
0
        private Complex[, ] ReadTextMatrix()
        {
            int rows = MatrixDefinition.Rows, cols = MatrixDefinition.Columns;

            Complex[, ] values = new Complex[rows, cols];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    try { values[i, j] = ComplexParser.FromString(MatrixDefinition[i, j]); }
                    catch (FormatException)
                    {
                        ErrorMessage.Content    = string.Format($"Value at [{0}, {1}] could not be parsed", i, j);
                        ErrorMessage.Visibility = Visibility.Visible;
                        return(null);
                    }
                }
            }
            return(values);
        }
Пример #7
0
        private void InitializeWithStateOperator()
        {
            Qubits.Items.Add(StateOperator.Size);
            Qubits.SelectedIndex    = 0;
            CCNR.IsChecked          = true;
            Schmidt.IsEnabled       = false;
            DensityMatrix.IsChecked = true;
            DensityMatrix.IsEnabled = StateMatrix.IsEnabled = false;
            Qubits.IsEnabled        = false;
            //ResizeDefinitionMatrix();
            int size = (int)Math.Pow(2, Bipartition.SystemSize);

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    MatrixDefinition[i, j] = ComplexParser.ToString(StateOperator[i, j], 2);
                }
            }
            MatrixDefinition.IsEnabled = false;
        }
Пример #8
0
        private void InitializeWithStateVector()
        {
            Qubits.Items.Add(State.Size);
            Qubits.SelectedIndex    = 0;
            Schmidt.IsChecked       = true;
            StateMatrix.IsChecked   = true;
            DensityMatrix.IsEnabled = StateMatrix.IsEnabled = false;
            Qubits.IsEnabled        = false;
            //ResizeDefinitionMatrix();

            /*
             * for (int i = 0; i < Bipartition.DimensionA; i++)
             *  for (int j = 0; j < Bipartition.DimensionB; j++)
             *      MatrixDefinition[i, j] = ComplexParser.ToString(State[i * Bipartition.DimensionB + j], 2);
             */
            for (int i = 0; i < MatrixDefinition.Rows; i++)
            {
                for (int j = 0; j < MatrixDefinition.Columns; j++)
                {
                    MatrixDefinition[i, j] = ComplexParser.ToString(State[i * MatrixDefinition.Columns + j], 2);
                }
            }
            MatrixDefinition.IsEnabled = false;
        }
Пример #9
0
        protected override void OnInitialized(EventArgs e)
        {
            if (Reg.Size == 1)
            {
                Qubits.Content = "Qubits: " + FirstQubitIndex.ToString();
            }
            else
            {
                Qubits.Content = "Qubits: " + FirstQubitIndex.ToString() + "-" + (FirstQubitIndex + Reg.Size - 1).ToString();
            }
            int matrixRows, matrixCols;

            if (Reg.Size % 2 == 0)
            {
                matrixRows = matrixCols = (int)Math.Pow(2, Reg.Size / 2);
            }
            else
            {
                matrixRows = (int)Math.Pow(2, (Reg.Size - 1) / 2);
                matrixCols = (int)Math.Pow(2, (Reg.Size + 1) / 2);
            }
            StateMatrix.ResizeGrid(matrixRows, matrixCols);
            for (int i = 0; i < matrixRows; i++)
            {
                for (int j = 0; j < matrixCols; j++)
                {
                    StateMatrix[i, j] = ComplexParser.ToString(Reg.Amplitude(i * matrixCols + j), 4).ToString();
                }
            }

            if (Reg.Size == 1)
            {
                Examine.IsEnabled = false;
            }
            base.OnInitialized(e);
        }
Пример #10
0
        /// <summary>Parse a string into a <c>Complex</c>.</summary>
        public static Complex Parse(string complex, NumberFormatInfo numberFormat)
        {
            ComplexParser parser = new ComplexParser(complex, numberFormat);

            return(parser.Complex);
        }
Пример #11
0
        /// <summary>Parse a string into a <c>Complex</c>.</summary>
        /// <remarks>
        /// The adopted string representation for the complex numbers is
        /// <i>UVW+I*XYZ</i> where <i>UVW</i> and <i>XYZ</i> are <c>double</c>
        /// strings. Some alternative representations are <i>UVW+XYZi</i>,
        /// <i>UVW+iXYZ</i>, <i>UVW</i> and <i>iXYZ</i>.
        /// Additionally the string <c>"NaN"</c> is mapped to
        /// <c>Complex.NaN</c>, the string <c>"Infinity"</c> to
        /// <c>Complex.ComplexInfinity</c>, <c>"PositiveInfinity"</c>
        /// to <c>Complex.DirectedInfinity(Complex.One)</c>,
        /// <c>"NegativeInfinity"</c> to <c>Complex.DirectedInfinity(-Complex.One)</c>
        /// and finally <c>"DirectedInfinity(WVW+I*XYZ)"</c> to <c>Complex.DirectedInfinity(WVW+I*XYZ)</c>.
        /// <code>
        /// Complex z = Complex.Parse("12.5+I*7");
        /// Complex nan = Complex.Parse("NaN");
        /// Complex infinity = Complex.Parse("Infinity");
        /// </code>
        /// This method is symetric to <see cref="ToString"/>.
        /// </remarks>
        public static Complex Parse(string complex)
        {
            ComplexParser parser = new ComplexParser(complex);

            return(parser.Complex);
        }