示例#1
0
 private ComputationResult EvaluateAddIsMatrix(ComputationResult lhs, ComputationResult rhs, ComputationResult add)
 {
     if (lhs.IsVectorResult && lhs.Direction == ComputationResult.VectorDirection.Unassigned)
     {
         return(new ComputationResult("Unable to multiply vector without directionality starting at position " + MulLhs.Start + "!"));
     }
     if (rhs.IsVectorResult && rhs.Direction == ComputationResult.VectorDirection.Unassigned)
     {
         return(new ComputationResult("Unable to multiply vector without directionality starting at position " + MulRhs.Start + "!"));
     }
     // Ensure that the LHS is a higher or equal order to the RHS (Matrix > Vector > Scalar)
     if (!lhs.IsOdResult)
     {
         Swap(ref lhs, ref rhs);
     }
     if (lhs.IsValue)
     {
         Swap(ref lhs, ref rhs);
     }
     // LHS is now a higher or equal to the order of RHS
     if (lhs.IsOdResult)
     {
         if (rhs.IsOdResult)
         {
             var retMatrix = add.Accumulator ? add.OdData :
                             (lhs.Accumulator ? lhs.OdData :
                              (rhs.Accumulator ? rhs.OdData : add.OdData.CreateSimilarArray <float>()));
             VectorHelper.FusedMultiplyAdd(retMatrix.GetFlatData(), lhs.OdData.GetFlatData(), rhs.OdData.GetFlatData(), add.OdData.GetFlatData());
             return(new ComputationResult(retMatrix, true));
         }
         else if (rhs.IsVectorResult)
         {
             var retMatrix = add.Accumulator ? add.OdData :
                             (lhs.Accumulator ? lhs.OdData : add.OdData.CreateSimilarArray <float>());
             if (rhs.Direction == ComputationResult.VectorDirection.Vertical)
             {
                 VectorHelper.FusedMultiplyAddVerticalRhs(retMatrix.GetFlatData(), lhs.OdData.GetFlatData(), rhs.VectorData.GetFlatData(), add.OdData.GetFlatData());
             }
             else
             {
                 VectorHelper.FusedMultiplyAddHorizontalRhs(retMatrix.GetFlatData(), lhs.OdData.GetFlatData(), rhs.VectorData.GetFlatData(), add.OdData.GetFlatData());
             }
             return(new ComputationResult(retMatrix, true));
         }
         else
         {
             //RHS is scalar
             var retMatrix = add.Accumulator ? add.OdData :
                             (lhs.Accumulator ? lhs.OdData : add.OdData.CreateSimilarArray <float>());
             VectorHelper.FusedMultiplyAdd(retMatrix.GetFlatData(), lhs.OdData.GetFlatData(), rhs.LiteralValue, add.OdData.GetFlatData());
             return(new ComputationResult(retMatrix, true));
         }
     }
     else if (lhs.IsVectorResult)
     {
         var retMatrix  = add.Accumulator ? add.OdData : add.OdData.CreateSimilarArray <float>();
         var tempVector = lhs.Accumulator ? lhs.VectorData : (rhs.IsVectorResult && rhs.Accumulator ? rhs.VectorData : lhs.VectorData.CreateSimilarArray <float>());
         // compute the multiplication separately in this case for better performance (n multiplies instead of n^2)
         if (rhs.IsVectorResult)
         {
             if (lhs.Direction != rhs.Direction)
             {
                 // if the directions don't add up then the sum operation would be undefined!
                 return(new ComputationResult("Unable to add vector without directionality starting at position " + MulLhs.Start + "!"));
             }
             VectorHelper.Multiply(tempVector.GetFlatData(), 0, lhs.VectorData.GetFlatData(), 0, rhs.VectorData.GetFlatData(), 0, tempVector.GetFlatData().Length);
         }
         else
         {
             VectorHelper.Multiply(tempVector.GetFlatData(), lhs.VectorData.GetFlatData(), rhs.LiteralValue);
         }
         if (lhs.Direction == ComputationResult.VectorDirection.Vertical)
         {
             VectorHelper.AddVertical(retMatrix.GetFlatData(), add.OdData.GetFlatData(), tempVector.GetFlatData());
         }
         else
         {
             VectorHelper.AddHorizontal(retMatrix.GetFlatData(), add.OdData.GetFlatData(), tempVector.GetFlatData());
         }
         return(new ComputationResult(retMatrix, true));
     }
     else
     {
         // in this case LHS is a scalar, and therefore RHS is also a scalar
         var retMatrix = add.Accumulator ? add.OdData : add.OdData.CreateSimilarArray <float>();
         VectorHelper.Add(retMatrix.GetFlatData(), add.OdData.GetFlatData(), lhs.LiteralValue * rhs.LiteralValue);
         return(new ComputationResult(retMatrix, true));
     }
 }