Example #1
0
        //TODO: Review the types in this function
        public void VerifyOperation_Diff()
        {
            if (Operand1Type.IsScalar() && Operand2Type.IsScalar())
            {
                ForceAtomicOperands(ScalarType);
            }

            else if (Operand1Type.IsFrameMultivector() && Operand2Type.IsScalar())
            {
                ForceAtomicOperands(Operand1Type);
            }

            else if (Operand2Type.IsFrameMultivector() && Operand1Type.IsScalar())
            {
                ForceAtomicOperands(Operand2Type);
            }

            else if (Operand1Type.HasSameFrame(Operand2Type))
            {
                ForceAtomicOperands(Operand1Type);
            }

            else
            {
                Context.CreateTypeMismatch("Cannot apply Diff to expressions of type " + Operand1TypeSignature + " and " + Operand2TypeSignature);
            }
        }
Example #2
0
        private void VerifyOperation_Times()
        {
            if (Operand1Type.IsNumber() && Operand2Type.IsNumber())
            {
                ForceAtomicScalarOperands(ScalarType);
            }

            else if (Operand1Type.IsFrameMultivector() && Operand2Type.IsNumber())
            {
                _resultType = Operand1Type;

                _atomicOperand1 = Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand1);

                _atomicOperand2 = Context.ActiveParentCommandBlock.ExpressionToScalarAtomicExpression(_operand2);
            }

            else if (Operand1Type.IsNumber() && Operand2Type.IsFrameMultivector())
            {
                _resultType = Operand2Type;

                _atomicOperand1 = Context.ActiveParentCommandBlock.ExpressionToScalarAtomicExpression(_operand1);

                _atomicOperand2 = Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand2);
            }

            else
            {
                Context.CreateTypeMismatch("cannot apply Times to expressions of type " + Operand1TypeSignature + " and " + Operand2TypeSignature);
            }
        }
Example #3
0
        private void VerifyOperation_MultivectorProduct()
        {
            if (Operand1Type.IsNumber() && Operand2Type.IsNumber())
            {
                ForceAtomicScalarOperands(ScalarType);
            }

            else if (Operand1Type.IsFrameMultivector() && Operand2Type.IsNumber())
            {
                ForceAtomicMultivectorOperands(Operand1Type);
            }

            else if (Operand2Type.IsFrameMultivector() && Operand1Type.IsNumber())
            {
                ForceAtomicMultivectorOperands(Operand2Type);
            }

            else if (Operand1Type.HasSameFrame(Operand2Type))
            {
                ForceAtomicMultivectorOperands(Operand1Type);
            }

            else
            {
                Context.CreateTypeMismatch("cannot apply a multivector product to expressions of type " + Operand1TypeSignature + " and " + Operand2TypeSignature);
            }
        }
Example #4
0
        private void VerifyOperation_BinaryPlusMinus()
        {
            if (Operand1Type.IsInteger() && Operand2Type.IsInteger())
            {
                ForceAtomicOperands(IntegerType);
            }

            else if (Operand1Type.IsNumber() && Operand2Type.IsNumber())
            {
                ForceAtomicScalarOperands(ScalarType);
            }

            else if (Operand1Type.IsFrameMultivector() && Operand2Type.IsNumber())
            {
                ForceAtomicMultivectorOperands(Operand1Type);
            }

            else if (Operand2Type.IsFrameMultivector() && Operand1Type.IsNumber())
            {
                ForceAtomicMultivectorOperands(Operand2Type);
            }

            else if (Operand1Type.HasSameFrame(Operand2Type))
            {
                ForceAtomicMultivectorOperands(Operand1Type);
            }

            else
            {
                Context.CreateTypeMismatch(@"Cannot apply +\- to expressions of type " + Operand1TypeSignature + " and " + Operand2TypeSignature);
            }
        }
Example #5
0
        public void VerifyOperation_TypeCast(ILanguageType targetType)
        {
            //Cast an integer to a scalar
            if (targetType.IsScalar() && Operand1Type.IsInteger())
            {
                ForceAtomicOperands(targetType);
            }

            //Cast a number to a multivector
            else if (targetType.IsFrameMultivector() && Operand1Type.IsNumber())
            {
                ForceAtomicOperands(targetType);
            }

            //Cast multivector to a multivector with the same frame dimension (by diectly copying coeffecients)
            //useful for example when transforming a computation to Euclidean space with the same dimensions
            else if (targetType.IsFrameMultivector() && Operand1Type.IsFrameMultivector() && targetType.GetFrame().VSpaceDimension == Operand1Type.GetFrame().VSpaceDimension)
            {
                ForceAtomicOperands(targetType);
            }

            else
            {
                Context.CreateTypeMismatch("Cannot apply type cast " + targetType.TypeSignature + " to expression of type " + Operand1TypeSignature);
            }
        }
Example #6
0
        private void VerifyOperation_UnaryNorm()
        {
            if (Operand1Type.IsNumber() || Operand1Type.IsFrameMultivector())
            {
                ForceAtomicOperands(ScalarType);
            }

            else
            {
                Context.CreateTypeMismatch(@"Cannot apply multivector norm to expression of type " + Operand1TypeSignature);
            }
        }
Example #7
0
        private void VerifyOperation_TransformApplication(GMacMultivectorTransform transform)
        {
            if (Operand1Type.IsNumber())
            {
                ForceAtomicScalarOperands(transform.TargetFrame.MultivectorType);
            }

            else if (Operand1Type.IsFrameMultivector() && ((GMacFrameMultivector)Operand1Type).ParentFrame.ObjectId == transform.SourceFrame.ObjectId)
            {
                ForceAtomicMultivectorOperands(transform.TargetFrame.MultivectorType);
            }

            else
            {
                Context.CreateTypeMismatch("Cannot apply transform " + transform.SymbolQualifiedName + " to expression of type " + Operand1TypeSignature);
            }
        }
Example #8
0
        private void VerifyOperation_PolyadicOperandAssignment(ILanguageType lhsType)
        {
            if (lhsType.IsSameType(Operand1Type))
            {
                ForceAtomicOperands(null);
            }

            else if (lhsType.IsScalar() && Operand1Type.IsNumber())
            {
                ForceAtomicScalarOperands(null);
            }

            else if (lhsType.IsFrameMultivector() && Operand1Type.IsNumber())
            {
                ForceAtomicMultivectorOperands(null);
            }

            else
            {
                Context.CreateTypeMismatch("Cannot assign expression of type " + Operand1TypeSignature + " to parameter of type " + lhsType);
            }
        }