Skip to content

Commit

Permalink
Buffered Enumerator (#271)
Browse files Browse the repository at this point in the history
* #228 - Parallel Matrix Multiplication

* #236 - Buffered Token Enumerator

* #228 - Improve operator token lexer

* Tests
  • Loading branch information
sys27 committed Aug 16, 2020
1 parent e5456f6 commit 8203fcc
Show file tree
Hide file tree
Showing 16 changed files with 1,831 additions and 1,070 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ xFunc is released under [Apache 2.0 License](http://www.apache.org/licenses/LICE
[@RonnyCSHARP](https://github.com/ronnycsharp)

[Fluent.Ribbon](https://github.com/fluentribbon/Fluent.Ribbon)
[AppVeyor](https://www.appveyor.com/)
[OpenCover](https://github.com/OpenCover/opencover)
[Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines/)
[Coverlet](https://github.com/coverlet-coverage/coverlet)
[ReportGenerator](https://github.com/danielpalme/ReportGenerator)

## More:
Expand Down
1 change: 0 additions & 1 deletion xFunc.Benchmark/xFunc.Benchmark.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>latest</LangVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>

Expand Down
45 changes: 30 additions & 15 deletions xFunc.Maths/Expressions/Matrices/MatrixExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

using System;
using System.Linq;
using System.Threading.Tasks;
using xFunc.Maths.Resources;

namespace xFunc.Maths.Expressions.Matrices
Expand Down Expand Up @@ -216,31 +217,45 @@ public static Matrix Mul(this Matrix left, Matrix right, ExpressionParameters pa
throw new ArgumentException(Resource.MatrixArgException);

var rows = left.Rows;
var columns = right.Columns;
var vectors = new Vector[rows];

for (var i = 0; i < rows; i++)
if (rows <= 10)
{
for (var row = 0; row < rows; row++)
vectors[row] = MulMatrixRow(left, right, parameters, row);
}
else
{
var vector = new IExpression[columns];
Parallel.For(0, rows, row => vectors[row] = MulMatrixRow(left, right, parameters, row));
}

for (var j = 0; j < columns; j++)
{
var element = 0.0;
for (var k = 0; k < left.Columns; k++)
{
var leftNumber = (double)left[i][k].Execute(parameters);
var rightNumber = (double)right[k][j].Execute(parameters);
return new Matrix(vectors);
}

element += leftNumber * rightNumber;
}
private static Vector MulMatrixRow(
Matrix left,
Matrix right,
ExpressionParameters parameters,
int i)
{
var columns = right.Columns;
var vector = new IExpression[columns];

for (var j = 0; j < columns; j++)
{
var element = 0.0;
for (var k = 0; k < left.Columns; k++)
{
var leftNumber = (double)left[i][k].Execute(parameters);
var rightNumber = (double)right[k][j].Execute(parameters);

vector[j] = new Number(element);
element += leftNumber * rightNumber;
}

vectors[i] = new Vector(vector);
vector[j] = new Number(element);
}

return new Matrix(vectors);
return new Vector(vector);
}

/// <summary>
Expand Down
29 changes: 15 additions & 14 deletions xFunc.Maths/Parser.ExpressionFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,17 +257,18 @@ private IExpression CreateFromKeyword(KeywordToken keywordToken, params IExpress
throw new ArgumentOutOfRangeException(nameof(keywordToken));
}

private IExpression CreateNumber(NumberToken numberToken) =>
new Number(numberToken.Number);
// TODO: positional cache
private IExpression CreateNumber(NumberToken numberToken)
=> new Number(numberToken.Number);

private IExpression CreateComplexNumber(
OperatorToken magnitudeSign,
NumberToken magnitude,
OperatorToken phaseSign,
NumberToken phase)
{
static int GetSign(OperatorToken token) =>
token == OperatorToken.Minus ? -1 : 1;
static int GetSign(OperatorToken token)
=> token == OperatorToken.Minus ? -1 : 1;

var magnitudeNumber = magnitude.Number * GetSign(magnitudeSign);
var phaseNumber = phase.Number * GetSign(phaseSign);
Expand All @@ -276,19 +277,19 @@ private IExpression CreateFromKeyword(KeywordToken keywordToken, params IExpress
return new ComplexNumber(complex);
}

private IExpression CreateVariable(IdToken variableToken) =>
new Variable(variableToken.Id);
private IExpression CreateVariable(IdToken variableToken)
=> new Variable(variableToken.Id);

private Vector CreateVector(IList<IExpression> arguments) =>
new Vector(arguments);
private Vector CreateVector(IList<IExpression> arguments)
=> new Vector(arguments);

private Matrix CreateMatrix(IList<Vector> arguments) =>
new Matrix(arguments);
private Matrix CreateMatrix(IList<Vector> arguments)
=> new Matrix(arguments);

private IExpression CreateUnaryMinus(IExpression operand) =>
new UnaryMinus(operand);
private IExpression CreateUnaryMinus(IExpression operand)
=> new UnaryMinus(operand);

private IExpression CreateMultiplication(params IExpression[] arguments) =>
new Mul(arguments);
private IExpression CreateMultiplication(params IExpression[] arguments)
=> new Mul(arguments);
}
}
124 changes: 0 additions & 124 deletions xFunc.Maths/Parser.TokenEnumerator.cs

This file was deleted.

0 comments on commit 8203fcc

Please sign in to comment.