//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); } }
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); } }
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); } }
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); } }
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); } }
private void VerifyOperation_UnaryNorm() { if (Operand1Type.IsNumber() || Operand1Type.IsFrameMultivector()) { ForceAtomicOperands(ScalarType); } else { Context.CreateTypeMismatch(@"Cannot apply multivector norm to expression of type " + Operand1TypeSignature); } }
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); } }
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); } }