diff --git a/Esiur.Analysis.Test/FGraph.Designer.cs b/Esiur.Analysis.Test/FGraph.Designer.cs
new file mode 100644
index 0000000..a0184dc
--- /dev/null
+++ b/Esiur.Analysis.Test/FGraph.Designer.cs
@@ -0,0 +1,46 @@
+namespace Esiur.Analysis.Test
+{
+ partial class FGraph
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // FGraph
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(838, 494);
+ this.Name = "FGraph";
+ this.Text = "FGraph";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Esiur.Analysis.Test/FGraph.cs b/Esiur.Analysis.Test/FGraph.cs
new file mode 100644
index 0000000..fd3b6e6
--- /dev/null
+++ b/Esiur.Analysis.Test/FGraph.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Esiur.Analysis.Test
+{
+ public partial class FGraph : Form
+ {
+ public FGraph()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Esiur.Analysis.Test/FGraph.resx b/Esiur.Analysis.Test/FGraph.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Esiur.Analysis.Test/FGraph.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Esiur.Analysis/Esiur.Analysis.csproj b/Esiur.Analysis/Esiur.Analysis.csproj
index ad627d7..f5b19ec 100644
--- a/Esiur.Analysis/Esiur.Analysis.csproj
+++ b/Esiur.Analysis/Esiur.Analysis.csproj
@@ -1,4 +1,4 @@
-
+
netstandard2.1
diff --git a/Esiur.Analysis/Graph/DirectedGraph.cs b/Esiur.Analysis/Graph/DirectedGraph.cs
new file mode 100644
index 0000000..f793edd
--- /dev/null
+++ b/Esiur.Analysis/Graph/DirectedGraph.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Esiur.Analysis.Graph
+{
+ public class DirectedGraph : IGraph
+ {
+ public Node[] Nodes { get; set; }
+ public Edge[] Edges { get; set; }
+
+
+
+ }
+}
diff --git a/Esiur.Analysis/Graph/Edge.cs b/Esiur.Analysis/Graph/Edge.cs
new file mode 100644
index 0000000..eefbb7c
--- /dev/null
+++ b/Esiur.Analysis/Graph/Edge.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Esiur.Analysis.Graph
+{
+ public class Edge
+ {
+ public T SourceNode { get; set; }
+ public T DestinationNode { get; set; }
+ }
+}
diff --git a/Esiur.Analysis/Graph/IGraph.cs b/Esiur.Analysis/Graph/IGraph.cs
new file mode 100644
index 0000000..ac6ff78
--- /dev/null
+++ b/Esiur.Analysis/Graph/IGraph.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Esiur.Analysis.Graph
+{
+ public interface IGraph
+ {
+ }
+}
diff --git a/Esiur.Analysis/Graph/Node.cs b/Esiur.Analysis/Graph/Node.cs
new file mode 100644
index 0000000..7740e4e
--- /dev/null
+++ b/Esiur.Analysis/Graph/Node.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Esiur.Analysis.Graph
+{
+ public class Node
+ {
+ public T Value { get; set; }
+
+ public int X { get; set; }
+ public int Y { get; set; }
+ }
+}
diff --git a/Esiur.Analysis/Graph/TransitionMatrix.cs b/Esiur.Analysis/Graph/TransitionMatrix.cs
new file mode 100644
index 0000000..12bbb82
--- /dev/null
+++ b/Esiur.Analysis/Graph/TransitionMatrix.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection.Metadata.Ecma335;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+
+namespace Esiur.Analysis.Graph
+{
+ public class Matrix where T : struct
+ {
+ internal T[,] value;
+
+ public int Rows => value.GetLength(0);
+ public int Columns => value.GetLength(1);
+
+ public T this[int x, int y] => value[x, y];
+
+ public Matrix(T[,] value)
+ {
+ this.value = value;
+ }
+
+ public static Matrix Multiply(Matrix a, Matrix b) where T:struct
+ {
+
+
+ if (a.Columns != b.Rows)
+ throw new ArgumentException("`a` rows do not match `b` columns.");
+
+
+ T[,] rt = new T[a.Rows, b.Columns];
+
+ for (int i = 0; i < a.Rows; i++)
+ { // aRow
+ for (int j = 0; j < b.Columns; j++)
+ { // bColumn
+ for (int k = 0; k < a.Columns; k++)
+ { // aColumn
+ rt[i, j] += a[i, k] * b[k, j];
+ }
+ }
+ }
+
+ return new Matrix(rt);
+ }
+ }
+}