/// <summary> /// Evaluate a cast to multivector value operation /// </summary> /// <param name="expr"></param> /// <returns></returns> private ILanguageValue EvaluateBasicUnaryCastToMultivector(BasicUnary expr) { var value1 = expr.Operand.AcceptVisitor(this); var mvType = (GMacFrameMultivector)expr.Operator; if (value1.ExpressionType.IsNumber()) { var scalarValue = ((ValuePrimitive <MathematicaScalar>)value1).Value; return(GMacValueMultivector.Create( mvType, GaMultivector.CreateScalar( mvType.ParentFrame.GaSpaceDimension, scalarValue ) )); } if (value1.ExpressionType.IsFrameMultivector() && value1.ExpressionType.GetFrame().VSpaceDimension == mvType.ParentFrame.VSpaceDimension) { var mvValue = (GMacValueMultivector)value1; return(GMacValueMultivector.Create( mvType, GaMultivector.CreateCopy(mvValue.MultivectorCoefficients) )); } throw new InvalidOperationException("Invalid cast operation"); }
public static GaOuterMorphismFull Create(ISymbolicMatrix vectorTransformMatrix) { var domainGaSpaceDim = FrameUtils.GaSpaceDimension(vectorTransformMatrix.Columns); var codomainGaSpaceDim = FrameUtils.GaSpaceDimension(vectorTransformMatrix.Rows); var transformedBasisBlades = new GaMultivector[domainGaSpaceDim]; transformedBasisBlades[0] = GaMultivector.CreateScalar(codomainGaSpaceDim, MathematicaScalar.Create(vectorTransformMatrix.CasInterface, 1)); for (var id = 1; id <= domainGaSpaceDim - 1; id++) { if (id.IsValidBasisVectorId()) { transformedBasisBlades[id] = CreateFromMatrixColumn(vectorTransformMatrix, id.BasisBladeIndex()); } else { int id1, id2; id.SplitBySmallestBasicPattern(out id1, out id2); transformedBasisBlades[id] = transformedBasisBlades[id1].OuterProduct(transformedBasisBlades[id2]); } } return(new GaOuterMorphismFull(transformedBasisBlades)); }
public override GaMultivector BasisBladeSignature(int id) { if (id >= 0 && id < GaSpaceDimension) { return(GaMultivector.CreateScalar(GaSpaceDimension, CasConstants.One)); } throw new IndexOutOfRangeException(); }
public override GaMultivector BasisBladeSignature(int id) { if (id < 0 || id >= GaSpaceDimension) { throw new IndexOutOfRangeException(); } var s = _basisBladesSignatures[id] == 1 ? CasConstants.One : CasConstants.MinusOne; GaMultivector.CreateScalar(GaSpaceDimension, s); throw new IndexOutOfRangeException(); }
public override GaMultivector BasisBladeSignature(int id) { return(GaMultivector.CreateScalar(GaSpaceDimension, _basisBladesSignatures[id])); }
internal static GMacValueMultivector CreateScalar(GMacFrameMultivector mvType, MathematicaScalar coef) { var mvCoefs = GaMultivector.CreateScalar(mvType.ParentFrame.GaSpaceDimension, coef); return(new GMacValueMultivector(mvType, mvCoefs)); }