コード例 #1
0
        public static void DrawGrid(CBScenario scenario)
        {
            var strBldr    = new StringBuilder();
            var maxCellStr = "-" + scenario.j1.ToString() + ",-" + scenario.j2.ToString() + "; Y";
            var cellLen    = maxCellStr.Length;
            var rowLen     = (int)((cellLen + 3) * (2 * scenario.j + 1));

            Console.WriteLine(strBldr.Clear().Append(char.Parse("-"), rowLen));
            for (Rational m2 = scenario.j2; m2 >= -scenario.j2; m2 -= 1)
            {
                for (int rowPass = 0; rowPass < 2; rowPass++)
                {
                    for (Rational m1 = -scenario.j1; m1 <= scenario.j1; m1 += 1)
                    {
                        var coord = new Tuple <Rational, Rational>(m1, m2);
                        if (scenario.grid.ContainsKey(coord))
                        {
                            if (rowPass == 0)
                            {
                                var str = m1.ToString() + "," + m2.ToString();
                                if (scenario.grid[coord].IsSet)
                                {
                                    str += "; Y";
                                }
                                Console.Write(str);
                                var diff = maxCellStr.Length - str.Length;
                                Console.Write(strBldr.Clear().Append(char.Parse(" "), diff));
                                Console.Write(" | ");
                            }
                            else
                            {
                                var coefStr = scenario.grid[coord].ToString();
                                Console.Write(coefStr);
                                var diff = maxCellStr.Length - coefStr.Length;
                                Console.Write(strBldr.Clear().Append(char.Parse(" "), diff));
                                Console.Write(" | ");
                            }
                        }
                        else
                        {
                            Console.Write(strBldr.Clear().Append(char.Parse(" "), cellLen));
                            Console.Write(" | ");
                        }
                    }
                    Console.Write(Environment.NewLine);
                }
                Console.WriteLine(strBldr.Clear().Append(char.Parse("-"), rowLen));
            }
        }
コード例 #2
0
        // j1
        // j2
        // m1
        // m2
        // j
        // m
        // m1 + m2 = m +- 1
        // abs(m1) <= j1
        // abs(m2) <= j2
        // -j <= m1 + m2 <= j
        // sqrt[(j -+ m)(j +- m + 1)]<m1, m2; j, m +- 1>
        //      = sqrt[(j1 -+ m1 + 1)(j1 +- m1)]<m1 -+ 1, m2; j, m>
        //      + sqrt[(j2 -+ m2 + 1)(j2 +- m2)]<m1, m2 -+ 1; j, m>

        // Fix j1, j2, j

        // J+:
        // sqrt[(j - m)(j + m + 1)]<m1, m2; j, m + 1>
        //      = sqrt[(j1 - m1 + 1)(j1 + m1)]<m1 - 1, m2; j, m>
        //      + sqrt[(j2 - m2 + 1)(j2 + m2)]<m1, m2 - 1; j, m>
        //  ; m1 + m2 = m + 1

        // J-:
        // sqrt[(j + m)(j - m + 1)]<m1, m2; j, m - 1>
        //      = sqrt[(j1 + m1 + 1)(j1 - m1)]<m1 + 1, m2; j, m>
        //      + sqrt[(j2 + m2 + 1)(j2 - m2)]<m1, m2 + 1; j, m>
        //  ; m1 + m2 = m - 1

        // J+:
        // <m1, m2; j, m + 1> = {sqrt[(j1 - m1 + 1)(j1 + m1)]<m1 - 1, m2; j, m> + sqrt[(j2 - m2 + 1)(j2 + m2)]<m1, m2 - 1; j, m>} / sqrt[(j - m)(j + m + 1)]
        // <m1 - 1, m2; j, m> = {sqrt[(j - m)(j + m + 1)]<m1, m2; j, m + 1> - sqrt[(j2 - m2 + 1)(j2 + m2)]<m1, m2 - 1; j, m>} / sqrt[(j1 - m1 + 1)(j1 + m1)]
        // <m1, m2 - 1; j, m> = {sqrt[(j - m)(j + m + 1)]<m1, m2; j, m + 1> - sqrt[(j1 - m1 + 1)(j1 + m1)]<m1 - 1, m2; j, m>} / sqrt[(j2 - m2 + 1)(j2 + m2)]

        // J-:
        // <m1, m2; j, m - 1> = {sqrt[(j1 + m1 + 1)(j1 - m1)]<m1 + 1, m2; j, m> + sqrt[(j2 + m2 + 1)(j2 - m2)]<m1, m2 + 1; j, m>} / sqrt[(j + m)(j - m + 1)]
        // <m1 + 1, m2; j, m> = {sqrt[(j + m)(j - m + 1)]<m1, m2; j, m - 1> - sqrt[(j2 + m2 + 1)(j2 - m2)]<m1, m2 + 1; j, m>} / sqrt[(j1 + m1 + 1)(j1 - m1)]
        // <m1, m2 + 1; j, m> = {sqrt[(j + m)(j - m + 1)]<m1, m2; j, m - 1> - sqrt[(j1 + m1 + 1)(j1 - m1)]<m1 + 1, m2; j, m>} / sqrt[(j2 + m2 + 1)(j2 - m2)]

        static void Main(string[] args)
        {
            bool continueProgram = true;

            while (continueProgram)
            {
                bool isValidInput = false;

                Rational j1 = 0;
                Rational j2 = 0;
                Rational j  = 0;
                Rational m1 = 0;
                Rational m2 = 0;
                Rational m  = 0;

                while (!isValidInput)
                {
                    Console.Write("j1: ");
                    j1 = Rational.Parse(Console.ReadLine());
                    Console.Write("j2: ");
                    j2 = Rational.Parse(Console.ReadLine());
                    Console.Write("m: ");
                    m = Rational.Parse(Console.ReadLine());
                    Console.Write("j: ");
                    j = Rational.Parse(Console.ReadLine());
                    Console.Write("m1: ");
                    m1 = Rational.Parse(Console.ReadLine());
                    Console.Write("m2: ");
                    m2 = Rational.Parse(Console.ReadLine());

                    if (Rational.Abs(j1 - j2) > j ||
                        j > j1 + j2)
                    {
                        Console.WriteLine("Parameters violate |j1 - j2| <= j <= j1 + j2");
                    }
                    else if (m1 + m2 != m)
                    {
                        Console.WriteLine("Parameters violate m1 + m2 = m");
                    }
                    else if (Rational.Abs(m1) > j1)
                    {
                        Console.WriteLine("Parameters violate |m1| <= j1");
                    }
                    else if (Rational.Abs(m2) > j2)
                    {
                        Console.WriteLine("Parameters violate |m2| <= j2");
                    }
                    else if (Rational.Abs(m1 + m2) > j)
                    {
                        Console.WriteLine("Parameters violate -j <= m1 + m2 <= j");
                    }
                    else if (j1.Denominator != m1.Denominator)
                    {
                        Console.WriteLine("Parameters violate j1 and m1 must both simultaneously be integers or half integers");
                    }
                    else if (j2.Denominator != m2.Denominator)
                    {
                        Console.WriteLine("Parameters violate j2 and m2 must both simultaneously be integers or half integers");
                    }
                    else
                    {
                        isValidInput = true;
                    }
                }

                // Run the scenario
                CBScenario scenario = new CBScenario(j1: j1, j2: j2, j: j, m: m);
                scenario.InitializeGrid();
                if (scenario.seedNode == null)
                {
                    Console.Write("-----SEED NODE NOT SET-----");
                }
                scenario.CalculateRawCoefficients();
                scenario.NormalizeCoefficients();
                //Utilities.DrawGrid(scenario);

                var node = scenario.grid[new Tuple <Rational, Rational>(m1, m2)];
                Console.WriteLine("Requested coefficient: " + node.ToString());

                Console.WriteLine("Run another scenario? (y/n)");
                var input = Console.ReadLine();
                if ("y".Equals(input, StringComparison.InvariantCultureIgnoreCase) ||
                    "yes".Equals(input, StringComparison.InvariantCultureIgnoreCase))
                {
                    continue;
                }
                else
                {
                    continueProgram = false;
                }
            }
        }