using System;
using System.Collections.Generic;
using System.Text;
using CategoryTheory;
namespace DataPerformer
{
/// <summary>
/// Vector operations
/// </summary>
static public class VectorOperations
{
/// <summary>
/// Sum of vector transformations
/// </summary>
/// <param name="transformations">Transformations</param>
/// <returns>Sum of transformations</returns>
static public TransformVector Sum(TransformVector[] transformations)
{
List<TransformVector> l = new List<TransformVector>();
foreach (TransformVector t in transformations)
{
if (t != null)
{
l.Add(t);
}
}
if (l.Count == 0)
{
return null;
}
if (l.Count == 1)
{
return l[0];
}
TransformVector tr = l[0] + l[1];
for (int i = 2; i < l.Count; i++)
{
tr += l[i];
}
return tr;
}
/// <summary>
/// Creates transformer of associated object
/// </summary>
/// <param name="tr">Initial transformer</param>
/// <param name="obj">The object</param>
/// <returns>The transformer</returns>
static public TransformVector CreateTransformer(TransformVector tr, IAssociatedObject obj)
{
if (!(obj is IChildrenObject))
{
return tr;
}
IChildrenObject ch = obj as IChildrenObject;
IAssociatedObject[] ao = ch.Children;
List<TransformVector> l = new List<TransformVector>();
foreach (IAssociatedObject ob in ao)
{
if (!(ob is IVectorTransformer))
{
continue;
}
IVectorTransformer t = ob as IVectorTransformer;
TransformVector tv = t.Transformer;
if (tv != null)
{
l.Add(tv);
}
}
if (l.Count == 0)
{
return tr;
}
TransformVector trv = Sum(l.ToArray());
TransformVector tvr = tr + trv;
return tvr;
}
}
/// <summary>
/// Transformer of vector
/// </summary>
public interface IVectorTransformer
{
/// <summary>
/// Vector transformer
/// </summary>
TransformVector Transformer
{
get;
}
}
/// <summary>
/// Vector provider
/// </summary>
public interface IVectorProvider
{
GetVector Provider
{
get;
}
}
/// <summary>
/// Gets vector
/// </summary>
/// <returns>The vector</returns>
public delegate double[] GetVector();
/// <summary>
/// Transforms vector
/// </summary>
/// <param name="x">The transformed vector</param>
public delegate void TransformVector(double[] x);
}