using System;
using System.Collections.Generic;
using System.Text;
using CategoryTheory;
using DataPerformer.Interfaces;
using FormulaEditor.Interfaces;
using FormulaEditor;
namespace DataPerformer
{
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;
}
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
public override void Reset()
{
base.Reset();
derivation.Reset();
}
public override void Update()
{
base.Update();
derivation.Update();
}
internal override void Set(FormulaEditor.Interfaces.ITreeCollectionProxy proxy)
{
base.Set(proxy);
derivation.Set(proxy);
}
#endregion
#region Members
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
}
}