Exemple #1
0
        public void MultivectorCopy()
        {
            var A = new Multivector(R3)
            {
                [E1] = 3.5,
                [E2] = 0.14,
                [E3] = -1 / 12d
            };

            Assert.AreEqual(A, M["Vector3B"]);
            Assert.IsTrue(A == M["Vector3B"]);
            Assert.IsFalse(A != M["Vector3B"]);
            Assert.IsTrue(A.Equals(M["Vector3B"]));


            A.Copy(M["Vector3A"]);

            Assert.AreEqual(A, M["Vector3A"]);
            Assert.IsTrue(A == M["Vector3A"]);
            Assert.IsFalse(A != M["Vector3A"]);
            Assert.IsTrue(A.Equals(M["Vector3A"]));

            Assert.AreNotEqual(A, M["Vector3B"]);
            Assert.IsFalse(A == M["Vector3B"]);
            Assert.IsTrue(A != M["Vector3B"]);
            Assert.IsTrue(A.Equals(M["Vector3A"]));

            Assert.AreEqual(A.GetHashCode(), M["Vector3A"].GetHashCode());
        }
Exemple #2
0
 public MainPage()
 {
     InitializeComponent();
     var S = new Space(4);
     var A = new Multivector(S)
     {
         [EScalar]  = 42,
         ScalarPart = 43
     };
 }
Exemple #3
0
        public UnaryScalarOp Round(double epsilon)
        {
            Multivector V = m_value.Round(epsilon);

            if (V != m_value)
            {
                return(new UnaryScalarOp(m_opName, V));
            }
            else
            {
                return(this);
            }
        }
Exemple #4
0
        public BinaryScalarOp Round(double epsilon)
        {
            Multivector A = m_value1.Round(epsilon);
            Multivector B = m_value2.Round(epsilon);

            if ((A != m_value1) || (B != m_value2))
            {
                return(new BinaryScalarOp(m_opName, A, B));
            }
            else
            {
                return(this);
            }
        }
Exemple #5
0
        /// <summary>
        /// Evaluates a Multivector to a summary of its expected value (-1, 0, 1).
        /// The function uses a Symbolic.RandomSymbolicEvaluator to randomly evaluate
        /// <paramref name="A"/>. If the results are consistently negative, zero or
        /// positive then -1, 0 or 1 is returned. Otherwise an exception is thrown.
        /// </summary>
        /// <param name="A">The multivector to evaluate</param>
        /// <returns>-1, 0 or 1</returns>
        /// <remarks>
        /// Used by Multivector.Exp(), Multivector.Cos() and Multivector.Sin() to see
        /// if the input bivector has a scalar square.
        /// </remarks>
        public static double EvaluateRandomSymbolicToScalar(Multivector A)
        {
            double EPS     = 1e-4;
            int    NB_ITER = 100;
            int    REQ     = 98;

            Symbolic.RandomSymbolicEvaluator RSE = new Symbolic.RandomSymbolicEvaluator(-100.0, 100.0);
            int pos = 0, neg = 0, zero = 0;

            for (int i = 0; i < NB_ITER; i++)
            {
                Multivector E          = A.SymbolicEval(RSE);
                double      scalarPart = E.RealScalarPart();
                Multivector theRest    = Multivector.Subtract(E, scalarPart);
                if (Math.Abs(theRest.Norm_e().RealScalarPart()) > Math.Abs(scalarPart) * EPS)
                {
                    throw new Exception("Multivector did not evaluate to scalar");
                }

                if (scalarPart > EPS)
                {
                    pos++;
                }
                else if (scalarPart < -EPS)
                {
                    neg++;
                }
                else
                {
                    zero++;
                }
            }

            if (pos >= REQ)
            {
                return(1.0);
            }
            else if (zero >= REQ)
            {
                return(0.0);
            }
            else if (neg >= REQ)
            {
                return(-1.0);
            }
            else
            {
                throw new Exception("Multivector did not evaluate to a consistent value");
            }
        }
Exemple #6
0
        /// <summary>
        /// Substitutes all symbolic scalars for doubles (as evaluated by <paramref name="E"/>)
        /// and evaluates the symbolic ScalarOps. E.g. sqrt(2.0) would evaluate to 1.4142...
        /// </summary>
        /// <param name="E">SymbolicEvaluator used to evaluate the symbolic scalars</param>
        /// <returns></returns>
        public double SymbolicEval(RefGA.Symbolic.SymbolicEvaluator E)
        {
            Multivector A = m_value1.SymbolicEval(E);
            Multivector B = m_value2.SymbolicEval(E);

            if (!(A.IsScalar() && B.IsScalar()))
            {
                throw new ArgumentException("BinaryScalarOp.SymbolicEval: argument is not scalar");
            }
            double a = A.RealScalarPart();
            double b = B.RealScalarPart();

            if (m_opName == ATAN2)
            {
                return(Math.Atan2(a, b));
            }
            else
            {
                throw new ArgumentException("BinaryScalarOp.SymbolicEval: unknown opname " + m_opName);
            }
        }
Exemple #7
0
        public void MultivectorConstructor()
        {
            var A = new Multivector(R3)
            {
                [E1] = 3.5,
                [E2] = 0.14,
                [E3] = -1 / 12d
            };

            Assert.AreEqual(3.5, A[1]);
            Assert.AreEqual(0.14, A[2]);
            Assert.AreEqual(-1 / 12d, A[4]);

#pragma warning disable CS1718 // Comparison made to same variable

            Assert.IsTrue(A == A);
            Assert.IsTrue(A.Equals(A));
            Assert.IsFalse(A != A);

#pragma warning restore CS1718 // Comparison made to same variable
        }
Exemple #8
0
        /// <summary>
        /// Compares scalar multivectors
        /// </summary>
        /// <param name="A">Scalar Multivector</param>
        /// <param name="B">Scalar Multivector</param>
        /// <returns>-1 (A < B), 0 (A = B), or 1 (A>B)</returns>
        public static int CompareScalarMultivector(Multivector A, Multivector B)
        {
            int thisLength = A.BasisBlades.Length;
            int ILength    = B.BasisBlades.Length;

            // first get rid of inverse(0) (how can those exist anyway?)
            if ((thisLength == 0) && (ILength == 0))
            {
                return(0);
            }
            else if ((thisLength == 0) && (ILength > 0))
            {
                return(-1);
            }
            else if ((thisLength > 0) && (ILength == 0))
            {
                return(1);
            }
            else
            {
                return(A.BasisBlades[0].SymbolicCompareTo(B.BasisBlades[0]));
            }
        }
Exemple #9
0
        static void Main(string[] args)
        {
            System.Console.WriteLine("Hello world");


            {
                ArrayList AL = new ArrayList();
                AL.Add(new BasisBlade(1, 1.0, "a1"));
                AL.Add(new BasisBlade(2, 1.0, "a2"));
                Multivector A = new Multivector(AL);
                System.Console.WriteLine("A = " + A.ToString());

                ArrayList BL = new ArrayList();
                BL.Add(new BasisBlade(2, 1.0, "b1"));
                BL.Add(new BasisBlade(3, 1.0, "b2"));
                Multivector B = new Multivector(BL);
                System.Console.WriteLine("B = " + B.ToString());

                Multivector AB = Multivector.gp(A, B);
                System.Console.WriteLine("AB = " + AB.ToString());

                Symbolic.HashtableSymbolicEvaluator HSE = new Symbolic.HashtableSymbolicEvaluator();
                HSE.Add("a1", 3.0);
                HSE.Add("a2", -2.0);
                HSE.Add("b1", 4.0);
                HSE.Add("b2", 1.0);
                Multivector ABeval = AB.SymbolicEval(HSE);
                System.Console.WriteLine("ABeval = " + ABeval.ToString());

                return;
            }

            Metric M;

            try
            {
                // Conformal metric (no, e1, e2, e3, ni)

                /*                int N = 5;
                 *              double[] EVM = new double[]{
                 *                  -0.707107, -0.707107, 0, 0, 0,
                 *                   0, 0, 0, 0, 1,
                 *                   0, 0, 1, 0, 0,
                 *                   0, 0, 0, -1, 0,
                 *                  -0.707107, 0.707107, 0, 0, 0};
                 *
                 *              double[] EV = new double[] { -1.0, 1.0, 1.0, 1.0, 1.0 };*/

                /*// Euclidean metric (e1, e2, e3)
                 * double[] m = new double[]{
                 * 1.0, 0.0, 0.0,
                 * 0.0, 1.0, 0.0,
                 * 0.0, 0.0, 1.0};*/

                // Conformal metric (no, e1, e2, e3, ni)
                double[] m = new double[] {
                    0.0, 0.0, 0.0, 0.0, -1.0,
                    0.0, 1.0, 0.0, 0.0, 0.0,
                    0.0, 0.0, 1.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 1.0, 0.0,
                    -1.0, 0.0, 0.0, 0.0, 0.0
                };
                M = new Metric(m);
            }
            catch (Exception E)
            {
                System.Console.WriteLine(E.ToString());
                return;
            }

            /*{
             *  ArrayList AL = new ArrayList();
             *  AL.Add(new BasisBlade(1 << 3)); // e1
             *  Multivector A = new Multivector(AL);
             *
             *  ArrayList BL = new ArrayList();
             *  BL.Add(new BasisBlade(1 << 3)); // e1
             *  Multivector B = new Multivector(BL);
             *
             *  Multivector V = Multivector.InnerProduct(A, B, M, BasisBlade.InnerProductType.LEFT_CONTRACTION);
             *
             *  System.Console.WriteLine("A = " + A.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *  System.Console.WriteLine("B = " + B.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *  System.Console.WriteLine("A . B = " + V.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * }*/

            /*       ArrayList AL = new ArrayList();
             *     //            AL.Add(new BasisBlade(2 + 16, 1.0, "a_e1ni"));
             *     //          AL.Add(new BasisBlade(4 + 16, 1.0, "a_e2ni"));
             *     //        AL.Add(new BasisBlade(8 + 16, 1.0, "a_e3ni"));
             *     //            AL.Add(new BasisBlade(2 + 4, 1.0, "a_e1e2"));
             *     //          AL.Add(new BasisBlade(4 + 8, 1.0, "a_e2e3"));
             *     //        AL.Add(new BasisBlade(8 + 2, 1.0, "a_e1e3"));
             *     //            AL.Add(new BasisBlade(1 + 16, 1.0, "a_noni"));
             *     AL.Add(new BasisBlade(2 + 16, 1.0));
             *     AL.Add(new BasisBlade(4 + 16, 2.0));
             *     AL.Add(new BasisBlade(8 + 16, 3.0));
             *     AL.Add(new BasisBlade(2 + 4, 4.0));
             *     AL.Add(new BasisBlade(4 + 8, 5.0));
             *     AL.Add(new BasisBlade(8 + 2, 6.0));
             *     Multivector A = new Multivector(AL);
             *
             *     Multivector Aexp = A.Exp(M, false, 0.0);
             *
             *     System.Console.WriteLine("A = " + A.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }) + ",");
             *     System.Console.WriteLine("expA = " + Aexp.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }) + ",");*/


            //            Symbolic.HashtableSymbolicEvaluator HSE = new Symbolic.HashtableSymbolicEvaluator();
            //            HSE.Add("a_e1ni", 1.0);
            //          HSE.Add("a_e2ni", 2.0);
            //        HSE.Add("a_e3ni", 3.0);
            //            HSE.Add("a_e1e2", 4.0);
            //          HSE.Add("a_e2e3", 5.0);
            //        HSE.Add("a_e1e3", 6.0);
            //            HSE.Add("a_noni", 6.0);
            //          System.Console.WriteLine("A = " + A.SymbolicEval(HSE).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }) + ",");
            //        System.Console.WriteLine("expA = " + Aexp.SymbolicEval(HSE).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }) + ",");



            /*            // compute square
             *          Multivector A2 = Multivector.gp(A, A, M);
             *          System.Console.WriteLine("A2 = " + A2.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *
             *
             *          // evaluate with random coords
             *          Symbolic.RandomSymbolicEvaluator RSE = new Symbolic.RandomSymbolicEvaluator(-100.0, 100.0);
             *          int pos = 0, neg = 0, zero = 0;
             *          for (int i = 0; i < 1; i++)
             *          {
             *              Multivector MV = A2.SymbolicEval(RSE);
             *              double val = MV.RealScalarPart();
             *              System.Console.WriteLine("MV = " + MV);
             *              System.Console.WriteLine("val = " + val);
             *              if (val > 1e-7) pos++;
             *              else if (val < -1e-7) neg++;
             *              else zero++;
             *              RSE.reset();
             *          }
             *          System.Console.WriteLine("pos = " + pos);
             *          System.Console.WriteLine("neg = " + neg);
             *          System.Console.WriteLine("zero = " + zero);*/



            /*
             * ArrayList AL = new ArrayList();
             * AL.Add(new BasisBlade(1 << 0, 1.0, "a_e1"));
             * AL.Add(new BasisBlade(1 << 1, 1.0, "a_e2"));
             * AL.Add(new BasisBlade(1 << 2, 1.0, "a_e3"));
             * Multivector A = new Multivector(AL);
             *
             * ArrayList BL = new ArrayList();
             * BL.Add(new BasisBlade(1 << 0, 1.0, "b_e1"));
             * BL.Add(new BasisBlade(1 << 1, 1.0, "b_e2"));
             * BL.Add(new BasisBlade(1 << 2, 1.0, "b_e3"));
             * Multivector B = new Multivector(BL);
             *
             * System.Console.WriteLine("A = " + A.ToString());
             * System.Console.WriteLine("B = " + B.ToString());
             * System.Console.WriteLine("A B = " + Multivector.gp(A, B).ToString());
             */


            /*
             * BasisBlade Z = new BasisBlade(1 << 0, 1.0, new Object[][] {
             *  new Object[] { "blah", "aaaarg", 3.0,  2.0, 1 },
             *  new Object[] { "bloooey", 'x', "crap", true, false},
             *  new Object[] { "blah", "aaaarg", -10.0, 1 }
             * });
             *
             * System.Console.WriteLine("Z = " + Z.ToString());
             * return;*/

            // OK: now check for harder objects . . .

            /*
             * Symbolic.HashtableSymbolicEvaluator HSE = new Symbolic.HashtableSymbolicEvaluator();
             * HSE.Add("a_e1", 1.0);
             * HSE.Add("a_e2", 2.0);
             * HSE.Add("a_e3", 3.0);
             * //Symbolic.RandomSymbolicEvaluator HSE = new Symbolic.RandomSymbolicEvaluator(-100.0, 100.0);
             *
             *
             * ArrayList AL = new ArrayList();
             * //AL.Add(new BasisBlade(1 << 0, 1.0, "a_no"));
             * AL.Add(new BasisBlade(1 << 1, 1.0, "a_e1"));
             * AL.Add(new BasisBlade(1 << 2, 1.0, "a_e2"));
             * AL.Add(new BasisBlade(1 << 3, 1.0, "a_e3"));
             * AL.Add(new BasisBlade(1 << 4, 1.0, "a_e1"));
             * Multivector A = new Multivector(AL);
             * A = Multivector.gp(A, Symbolic.ScalarOp.Exp(new Multivector(new BasisBlade(0, 1.0, "a_e2"))));
             * System.Console.WriteLine("A = " + A.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * // todo: check if exp, etc is working, then check why not collapse (by Multivector simplify, basis blade simplify) to single scalar value . .
             * Multivector Ae = A.SymbolicEval(HSE);
             * System.Console.WriteLine("Ae = " + Ae.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * return;
             *
             * ArrayList BL = new ArrayList();
             * //            BL.Add(new BasisBlade(1 << 0, 1.0));//, "b_no"));
             * BL.Add(new BasisBlade(1 << 1, -2.0));//, "b_e1"));
             * BL.Add(new BasisBlade(1 << 2, 3.0));//, "b_e2"));
             * BL.Add(new BasisBlade(1 << 3, -4.0));//, "b_e3"));
             * //         BL.Add(new BasisBlade(1 << 4, 1.0));//, "b_ni"));
             * Multivector B = new Multivector(BL);
             *
             *
             * A = Multivector.op(A, B);
             *
             * B = Multivector.gp(A, A);
             *
             * System.Console.WriteLine("A = " + A.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * System.Console.WriteLine("B = " + B.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *
             * // how to know whether outcome of symbolic computation is positive, negative or zero???
             * // simply fill in values for random variables?
             *
             *
             * //Multivector unitA = A.Unit_r(M);
             * //System.Console.WriteLine("unitA = " + unitA.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             */

            /*            Multivector ApAgB = Multivector.Add(Multivector.Add(A, Multivector.gp(A, B, M)), Multivector.gp(Multivector.GetPseudoscalar(4), 0.01));
             *
             *          // still testing . . .
             *          System.Console.WriteLine("ApAgB = " + ApAgB.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *          int g = ApAgB.LargestGradePartIndex();
             *
             *          System.Console.WriteLine("Largest grade part = " + g);
             *          System.Console.WriteLine("Largest grade part = " + ApAgB.ExtractGrade(g).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *
             *          System.Console.WriteLine("Top grade part = " + ApAgB.TopGradePartIndex(0.02));*/

            /*
             * BasisBlade se1 = new BasisBlade(1 << 1, 1.0, "ae1");
             * BasisBlade se2 = new BasisBlade(1 << 2, 1.0, "ae2");
             * BasisBlade X = BasisBlade.op(se1, se2);
             * System.Console.WriteLine("se1 = " + se1);
             * System.Console.WriteLine("se2 = " + se2);
             * System.Console.WriteLine("X = " + X);
             */


            /*
             * Multivector no = new Multivector(new BasisBlade(1, 1.0));
             * Multivector ni = new Multivector(new BasisBlade(1 << 4, 1.0));
             * Multivector noni = Multivector.GeometricProduct(no, ni, M);
             *
             * System.Console.WriteLine("no = " + no.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * System.Console.WriteLine("ni = " + ni.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * System.Console.WriteLine("noni = " + noni.ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * System.Console.WriteLine("noni2 = " + noni.ExtractGrade(2).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             * System.Console.WriteLine("dual(noni) = " + noni.Dual(M).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             *
             * System.Console.WriteLine("dual(I) = " + Multivector.GetPseudoscalar(5).Dual(M).ToString(new string[] { "no", "e1", "e2", "e3", "ni" }));
             */

            /*BasisBlade no = new BasisBlade(1);
             * BasisBlade ni = new BasisBlade(1 << 4);
             *
             * System.Console.WriteLine("no = " + no);
             * System.Console.WriteLine("ni = " + ni);
             *
             * System.Collections.ArrayList L = BasisBlade.GeometricProduct(ni, no, M);
             * System.Console.WriteLine("L = " + BasisBlade.ToString(L, new string[] {"no", "e1", "e2", "e3", "ni"}));
             */
            /*
             * BasisBlade A = new BasisBlade(1 | 4, 2.0);
             * BasisBlade B = new BasisBlade(2, 2.0);
             * BasisBlade C = new BasisBlade(1 | 4, 3.0);
             * BasisBlade D =new BasisBlade(1, 1.0);
             * System.Collections.ArrayList L = new System.Collections.ArrayList();
             * L.Add(A); L.Add(B); L.Add(C); L.Add(D); L.Add(new BasisBlade(2 | 4, 2.0));
             *
             * System.Console.WriteLine("Before: ");
             * foreach (BasisBlade BB in L)
             * {
             *  System.Console.WriteLine(BB.ToString());
             * }
             * L = BasisBlade.Simplify(L);
             * System.Console.WriteLine("After: ");
             * foreach (BasisBlade BB in L)
             * {
             *  System.Console.WriteLine(BB.ToString());
             * }
             */


            //            System.Console.WriteLine("A = " + A);
            //          System.Console.WriteLine("B = " + B); // .ToString(new string[] { "no", "e1", "ni" })

            //        System.Console.WriteLine("A ^ B = " + (A ^ B));



            /*            try
             *          {
             *              double[][] MA = new double[][]{
             *                  new double[]{0.0, 0.0, 0.0, 0.0, -1.0},
             *                  new double[]{0.0, 1.0, 0.0, 0.0, 0.0},
             *                  new double[]{0.0, 0.0, 1.0, 0.0, 0.0},
             *                  new double[]{0.0, 0.0, 0.0, 1.0, 0.0},
             *                  new double[]{-1.0, 0.0, 0.0, 0.0, 0.0}};
             *              new Metric(MA);
             *          }
             *          catch (Exception E)
             *          {
             *              System.Console.WriteLine(E.ToString());
             *          }*/
            /*
             *
             *          double[] A = new double[]{
             *              1.0, 0.0, 0.0,
             *              0.0, 1.0, 0.0,
             *              0.0, 0.0, 1.0};
             *          int nbRows = 3;
             *          int nbColumns = 3;
             *          bool columnWise = false;
             *          dnAnalytics.LinearAlgebra.Matrix M = dnAnalytics.LinearAlgebra.MatrixBuilder.CreateMatrix(A, nbRows, nbColumns, columnWise);
             *
             *          System.Console.WriteLine("Hi hoi!" + M);
             *
             */
        }
Exemple #10
0
        /// <summary>
        /// Substitutes all symbolic scalars for doubles (as evaluated by <paramref name="E"/>)
        /// and evaluates the symbolic ScalarOps. E.g. sqrt(2.0) would evaluate to 1.4142...
        /// </summary>
        /// <param name="E">SymbolicEvaluator used to evaluate the symbolic scalars</param>
        /// <returns></returns>
        public double SymbolicEval(RefGA.Symbolic.SymbolicEvaluator E)
        {
            Multivector V = m_value.SymbolicEval(E);

            if (!V.IsScalar())
            {
                throw new ArgumentException("UnaryScalarOp.SymbolicEval: argument is not scalar");
            }
            double v = V.RealScalarPart();

            if (m_opName == INVERSE)
            {
                if (v == 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: divide by zero");
                }
                return(1.0 / v);
            }
            else if (m_opName == SQRT)
            {
                if (v < 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: square root of negative value");
                }
                else
                {
                    return(Math.Sqrt(v));
                }
            }
            else if (m_opName == EXP)
            {
                return(Math.Exp(v));
            }
            else if (m_opName == LOG)
            {
                if (v <= 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: logarithm of value <= 0");
                }
                else
                {
                    return(Math.Log(v));
                }
            }
            else if (m_opName == SIN)
            {
                return(Math.Sin(v));
            }
            else if (m_opName == COS)
            {
                return(Math.Cos(v));
            }
            else if (m_opName == TAN)
            {
                // how to detect bad input (1/2 pi, etc)?
                return(Math.Tan(v));
            }
            else if (m_opName == SINH)
            {
                return(Math.Sinh(v));
            }
            else if (m_opName == COSH)
            {
                return(Math.Cosh(v));
            }
            else if (m_opName == TANH)
            {
                return(Math.Tanh(v));
            }
            else if (m_opName == ABS)
            {
                return(Math.Abs(v));
            }
            else
            {
                throw new ArgumentException("UnaryScalarOp.SymbolicEval: unknown opname " + m_opName);
            }
        }
Exemple #11
0
        /// <summary>
        /// Evaluates a Multivector to a summary of its expected value (-1, 0, 1).
        /// The function uses a Symbolic.RandomSymbolicEvaluator to randomly evaluate
        /// <paramref name="A"/>. If the results are consistently negative, zero or 
        /// positive then -1, 0 or 1 is returned. Otherwise an exception is thrown.
        /// </summary>
        /// <param name="A">The multivector to evaluate</param>
        /// <returns>-1, 0 or 1</returns>
        /// <remarks>
        /// Used by Multivector.Exp(), Multivector.Cos() and Multivector.Sin() to see
        /// if the input bivector has a scalar square.
        /// </remarks>
        public static double EvaluateRandomSymbolicToScalar(Multivector A)
        {
            double EPS = 1e-4;
            int NB_ITER = 100;
            int REQ = 98;

            Symbolic.RandomSymbolicEvaluator RSE = new Symbolic.RandomSymbolicEvaluator(-100.0, 100.0);
            int pos = 0, neg = 0, zero = 0;
            for (int i = 0; i < NB_ITER; i++)
            {
                Multivector E = A.SymbolicEval(RSE);
                double scalarPart = E.RealScalarPart();
                Multivector theRest = Multivector.Subtract(E, scalarPart);
                if (Math.Abs(theRest.Norm_e().RealScalarPart()) > Math.Abs(scalarPart) * EPS)
                    throw new Exception("Multivector did not evaluate to scalar");

                if (scalarPart > EPS) pos++;
                else if (scalarPart < -EPS) neg++;
                else zero++;
            }

            if (pos >= REQ) return 1.0;
            else if (zero >= REQ) return 0.0;
            else if (neg >= REQ) return -1.0;
            else throw new Exception("Multivector did not evaluate to a consistent value");
        }
Exemple #12
0
 /// <summary>Used to construct a scalar operations</summary>
 /// <param name="operationName">The name of the operation (e.g. "inverse", "sqrt", "log"; use one of the supplied constants like INVERSE, SQRT or LOG.)</param>
 /// <param name="A">The value upon which the ScalarOp will operate.
 /// Only the scalarpart is used of A is used.</param>
 public UnaryScalarOp(string operationName, Multivector A)
 {
     m_opName = operationName;
     m_value  = A.ScalarPart();
 }
Exemple #13
0
 /// <returns>Multivector(inverse(A))</returns>
 public static Multivector Inverse(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(INVERSE, A))));
 }
Exemple #14
0
 /// <returns>Multivector(sqrt(A))</returns>
 public static Multivector Sqrt(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(SQRT, A))));
 }
Exemple #15
0
 /// <summary>Used to construct a scalar operations</summary>
 /// <param name="operationName">The name of the operation (e.g. "atan2"; use one of the supplied constants like ATAN2.)</param>
 /// <param name="A">The first operand. Only the scalarpart is used.</param>
 /// <param name="B">The second operand. Only the scalarpart is used.</param>
 public BinaryScalarOp(string operationName, Multivector A, Multivector B)
 {
     m_opName = operationName;
     m_value1 = A.ScalarPart();
     m_value2 = B.ScalarPart();
 }
Exemple #16
0
 /// <summary>Used to construct a scalar operations</summary>
 /// <param name="operationName">The name of the operation (e.g. "inverse", "sqrt", "log"; use one of the supplied constants like INVERSE, SQRT or LOG.)</param>
 /// <param name="A">The value upon which the ScalarOp will operate. 
 /// Only the scalarpart is used of A is used.</param>
 public UnaryScalarOp(string operationName, Multivector A)
 {
     m_opName = operationName;
     m_value = A.ScalarPart();
 }
Exemple #17
0
 /// <returns>Multivector(sqrt(A))</returns>
 public static Multivector Sqrt(Multivector A)
 {
     return new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(SQRT, A)));
 }
Exemple #18
0
 /// <returns>Multivector(cosh(A))</returns>
 public static Multivector Cosh(Multivector A)
 {
     return new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(COSH, A)));
 }
Exemple #19
0
 /// <returns>Multivector(tan(A))</returns>
 public static Multivector Tan(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(TAN, A))));
 }
Exemple #20
0
 /// <returns>Multivector(cos(A))</returns>
 public static Multivector Cos(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(COS, A))));
 }
Exemple #21
0
 /// <returns>Multivector(log(A))</returns>
 public static Multivector Log(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(LOG, A))));
 }
Exemple #22
0
 /// <returns>Multivector(exp(A))</returns>
 public static Multivector Exp(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(EXP, A))));
 }
Exemple #23
0
 /// <returns>Multivector(inverse(A))</returns>
 public static Multivector Inverse(Multivector A)
 {
     return new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(INVERSE, A)));
 }
Exemple #24
0
        public void SetUp()
        {
            M["GeneralMultivector3"] = new Multivector(R3)
            {
                [EScalar] = 2 / 13d,
                [E1]      = 5,
                [E2]      = -3,
                [E13]     = 2 * PI,
                [E123]    = 42
            };

            M["Vector3A"] = new Multivector(R3)
            {
                [E1] = 4,
                [E2] = 3,
                [E3] = 5
            };

            M["Vector3B"] = new Multivector(R3)
            {
                [E1] = 3.5,
                [E2] = 0.14,
                [E3] = -1 / 12d
            };

            M["Vector3C"] = new Multivector(R3)
            {
                [E2] = 8,
                [E3] = -7
            };

            M["GeneralMultivector4"] = new Multivector(R4)
            {
                [EScalar] = 5 / 3d,
                [E1]      = 12,
                [E3]      = -45,
                [E14]     = 3 / 5d,
                [E23]     = -6.2832,
                [E34]     = 1,
                [E124]    = -3,
                [E134]    = 86,
                [E1234]   = -5
            };

            M["Vector4A"] = new Multivector(R4)
            {
                [E1] = 5,
                [E2] = -3,
                [E3] = 9,
                [E4] = -14
            };

            M["Vector4B"] = new Multivector(R4)
            {
                [E1] = 21,
                [E3] = 3
            };

            M["Vector4C"] = new Multivector(R4)
            {
                [E2] = -6,
                [E3] = -5,
                [E4] = 4
            };

            /*
             * M["Big"] = new Multivector(R7)
             * {
             *  [E()] = 8,
             *  [E(7)] = 4,
             *  [E(1, 5)] = 42,
             *  [E(5, 3, 7)] = -99,
             *  [E(1, 2, 3, 4, 5, 7)] = 222
             * };
             *
             * M["BigSparse"] = new SparseMultivector(R7)
             * {
             *  [E()] = -8,
             *  [E(7)] = -4,
             *  [E(1, 6)] = 2,
             *  [E(5, 3, 7)] = -1,
             *  [E(1, 2, 3, 4, 5, 6, 7)] = -0.2
             * };
             *
             * M["GiantSparse"] = new SparseMultivector(R30)
             * {
             *  [E()] = 1,
             *  [E(1, 29)] = 2,
             *  [E(8, 13, 15, 30)] = -3,
             *  [E(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)] = 4.2,
             *  [E(1,2,3,4,5,6,7,8,9,10,11,12,13,4)] = 640
             * };
             */
        }
Exemple #25
0
 /// <returns>Multivector(tanh(A))</returns>
 public static Multivector Tanh(Multivector A)
 {
     return new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(TANH, A)));
 }
Exemple #26
0
 /// <summary>Used to construct a scalar operations</summary>
 /// <param name="operationName">The name of the operation (e.g. "atan2"; use one of the supplied constants like ATAN2.)</param>
 /// <param name="A">The first operand. Only the scalarpart is used.</param>
 /// <param name="B">The second operand. Only the scalarpart is used.</param>
 public BinaryScalarOp(string operationName, Multivector A, Multivector B)
 {
     m_opName = operationName;
     m_value1 = A.ScalarPart();
     m_value2 = B.ScalarPart();
 }
Exemple #27
0
 /// <returns>Multivector(abs(A))</returns>
 public static Multivector Abs(Multivector A)
 {
     return new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(ABS, A)));
 }
Exemple #28
0
 /// <returns>Multivector(inverse(A))</returns>
 public static Multivector Atan2(Multivector A, Multivector B)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new BinaryScalarOp(ATAN2, A, B))));
 }
Exemple #29
0
 /// <returns>Multivector(inverse(A))</returns>
 public static Multivector Atan2(Multivector A, Multivector B)
 {
     return new Multivector(new BasisBlade(0, 1.0, new BinaryScalarOp(ATAN2, A, B)));
 }
Exemple #30
0
 /// <returns>Multivector(sinh(A))</returns>
 public static Multivector Sinh(Multivector A)
 {
     return(new Multivector(new BasisBlade(0, 1.0, new UnaryScalarOp(SINH, A))));
 }