using System;
using System.Collections.Generic;
using System.Text;
using CategoryTheory;
using BaseTypes.Interfaces;
using DataPerformer.Interfaces;
using FormulaEditor;
namespace DataPerformer
{
/// <summary>
/// Mesure derivation from formula
/// </summary>
public class FormulaMeasureDerivation : FormulaMeasure, IDerivation
{
#region Fields
private FormulaMeasure derivation;
#endregion
#region Ctor
internal FormulaMeasureDerivation(ObjectFormulaTree tree,
FormulaMeasure derivation, string name, AssociatedAddition associated)
: base(tree, name, associated)
{
this.derivation = derivation;
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="tree">Tree</param>
/// <param name="name">Measure name</param>
/// <param name="associated">Associated addition</param>
protected FormulaMeasureDerivation(ObjectFormulaTree tree,
string name, AssociatedAddition associated)
: base(tree, name, associated)
{
}
#endregion
#region IDerivation Members
IMeasure IDerivation.Derivation
{
get { return derivation; }
}
#endregion
#region Overridens
/// <summary>
/// Resets itself
/// </summary>
public override void Reset()
{
base.Reset();
derivation.Reset();
}
/// <summary>
/// Updates itself
/// </summary>
public override void Update()
{
base.Update();
derivation.Update();
}
/// <summary>
/// Sets proxy to itself
/// </summary>
/// <param name="proxy">Proxy</param>
internal override void Set(FormulaEditor.Interfaces.ITreeCollectionProxy proxy)
{
base.Set(proxy);
derivation.Set(proxy);
}
#endregion
#region Members
/// <summary>
/// Iterates calculation of derivation
/// </summary>
/// <param name="next">The "next" msign</param>
/// <param name="addition">Associated addition</param>
/// <returns>Next derivation iteration</returns>
public FormulaMeasureDerivation Iterate(bool next, AssociatedAddition addition)
{
string dn = "D" + name;
ObjectFormulaTree t = FormulaEditor.DerivationPerformer.Derivation(tree, "d/dt");
IDistribution d = DeltaFunction.GetDistribution(t);
AssociatedAddition aa = FormulaMeasureDerivation.Create(associated);
if (next)
{
FormulaMeasureDerivation der = null;
if (d != null)
{
der = new FormulaMeasureDerivationDistribution(t, dn, aa);
}
else
{
der = new FormulaMeasureDerivation(t, dn, aa);
}
derivation = der;
return der;
}
if (d != null)
{
derivation = new FormulaMeasureDistribution(t, dn, aa);
}
else
{
derivation = new FormulaMeasure(t, dn, aa);
}
return null;
}
internal static AssociatedAddition Create(AssociatedAddition associated)
{
object o = associated.Additional;
object[] ot = null;
if (o is object[])
{
object[] oa = o as object[];
int k = (int)oa[1] + 1;
ot = new object[] { oa[0], k };
}
else
{
ot = new object[] { o, 0 };
}
return new AssociatedAddition(associated.AssociatedObject, ot);
}
#endregion
}
}