Newer
Older
MaZiFAU
committed
using System;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using static SOMDocManager;
using System.Linq.Expressions;
using System.Linq;
MaZiFAU
committed
public class FunctionCallFact : FactWrappedCRTP<FunctionCallFact>
MaZiFAU
committed
{
MaZiFAU
committed
public string arg_func_id;
public (float t_0, float t_n) Domain;
public FunctionFact Function_in
=> (FunctionFact)FactOrganizer.AllFacts[func_id];
public FunctionFact Function_args
=> (FunctionFact)FactOrganizer.AllFacts[arg_func_id];
public FunctionCallFact() : base() { }
public FunctionCallFact(string func_id, string arg_func_id, (float t_0, float t_n) Domain, FactOrganizer organizer) : base(organizer)
{
this.func_id = func_id;
this.arg_func_id = arg_func_id;
this.Domain = Domain;
_URI = func_id.ToString() + arg_func_id.ToString() + Domain.ToString();
}
public object[] Call(float t)
{
if (t < Domain.t_0 || t > Domain.t_n)
return null;
return Function_in.Function(Function_args.Function(new object[] { t }));
}
public override bool HasDependentFacts
=> true;
protected override string[] GetGetDependentFactIds()
=> new[] { func_id, arg_func_id };
protected override bool EquivalentWrapped(FunctionCallFact f1, FunctionCallFact f2)
=> Mathf.Approximately(f1.Domain.t_0, f2.Domain.t_0)
&& Mathf.Approximately(f1.Domain.t_n, f2.Domain.t_n)
&& (DependentFactsEquivalent(f1, f2)
|| (f1.Function_in.Equivalent(f2.Function_in)
&& f1.Function_args.Equivalent(f2.Function_args)
));
public override MMTDeclaration MakeMMTDeclaration()
{
throw new NotImplementedException();
}
protected override void RecalculateTransform()
{
Position = Function_in.Position;
Rotation = Function_in.Rotation;
LocalScale = Function_in.LocalScale;
}
protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactOrganizer organizer)
=> new FunctionCallFact(old_to_new[this.func_id], old_to_new[this.arg_func_id], this.Domain, organizer);
}
public class FunctionFact : FactWrappedCRTP<FunctionFact>
{
MaZiFAU
committed
public SOMDoc Function_SOMDoc;
//TODO: doc
[JsonIgnore]
public LambdaExpression Function_expression;
[JsonIgnore]
MaZiFAU
committed
[JsonIgnore]
public Func<object[], object[]> Function;
MaZiFAU
committed
/// <summary> \copydoc Fact.Fact </summary>
public FunctionFact() : base() { }
/// <summary>
/// Standard Constructor:
/// Initiates members and creates MMT %Fact Server-Side
MaZiFAU
committed
/// </summary>
/// <param name="Function_SOMDoc">sets <see cref="Function_SOMDoc"/> and contains the Abstract Syntax Tree</param>
MaZiFAU
committed
/// <param name="organizer">sets <see cref="Fact._Facts"/></param>
public FunctionFact(SOMDoc Function_SOMDoc, FactOrganizer organizer) : base(organizer)
MaZiFAU
committed
{
this.Function_SOMDoc = Function_SOMDoc;
this.Function_expression = this.Function_SOMDoc.PartialInvokeCastingLambdaExpression(out Signature);
////TODO: catch
//string debug_tostring = Function_expression.ToString();
//Delegate debug_function = Function_expression.Compile();
this.Function = this.Function_expression.Compile() as Func<object[], object[]>;
MaZiFAU
committed
////TODO: Function_SOMDoc+domain
//MMTTerm tp = new OMS(JSONManager.MMTURIs.Point);
//MMTTerm df = new OMA(new OMS(JSONManager.MMTURIs.Tuple), arguments);
//AddFactResponse.sendAdd(new MMTSymbolDeclaration(Label, tp, df), out _URI);
//ParsingDictionary.parseTermsToId[df.ToString()] = _URI;
MaZiFAU
committed
}
/// <summary>
/// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
MaZiFAU
committed
/// </summary>
/// <param name="function_expression">sets <see cref="Function_expression"/> and contains the Abstract Syntax Tree</param>
/// <param name="uri">MMT URI</param>
/// <param name="organizer">sets <see cref="Fact._Facts"/></param>
public FunctionFact(SOMDoc Function_SOMDoc, string uri, FactOrganizer organizer) : base(organizer)
MaZiFAU
committed
{
this.Function_SOMDoc = Function_SOMDoc;
this.Function_expression = Function_SOMDoc.PartialInvokeCastingLambdaExpression(out Signature);
MaZiFAU
committed
////TODO: catch
//string debug_tostring = Function_expression.ToString();
//dynamic debug_function = Function_expression.Compile();
this.Function = this.Function_expression.Compile() as Func<object[], object[]>;
MaZiFAU
committed
this._URI = uri;
_ = this.Label;
MaZiFAU
committed
}
/// \copydoc Fact.parseFact(ScrollFact)
public new static FunctionFact parseFact(MMTDeclaration fact)
MaZiFAU
committed
{// TODO Correctness
if (((MMTSymbolDeclaration)fact).defines is not OMA defines)
MaZiFAU
committed
return null;
ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
MaZiFAU
committed
return new FunctionFact(defines, fact.@ref.uri, StageStatic.stage.factState);
MaZiFAU
committed
}
/// \copydoc Fact.hasDependentFacts
public override bool HasDependentFacts
=> false;
MaZiFAU
committed
/// \copydoc Fact.getDependentFactIds
MaZiFAU
committed
protected override string[] GetGetDependentFactIds()
MaZiFAU
committed
/// \copydoc Fact.GetHashCode
public override int GetHashCode()
=> Function_expression.GetHashCode();
/// \copydoc Fact.EquivalentWrapped
protected override bool EquivalentWrapped(FunctionFact f1, FunctionFact f2)
=> f1.Function_SOMDoc.Equivalent(f2.Function_SOMDoc);
protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactOrganizer organizer)
=> new FunctionFact(this.Function_SOMDoc.MapURIs(old_to_new), organizer);
public override MMTDeclaration MakeMMTDeclaration()
{
throw new NotImplementedException();
}
MaZiFAU
committed
}
public class AttachedPositionFunction : FactWrappedCRTP<AttachedPositionFunction>
{
public string fid;
[JsonIgnore]
[JsonIgnore]
public FunctionCallFact[] FunctionCallFacts
=> func_call_ids.Select(f => FactOrganizer.AllFacts[f] as FunctionCallFact).ToArray();
/// <summary>\copydoc Fact.Fact()</summary>
public AttachedPositionFunction() : base() { }
/// <summary>\copydoc Fact.Fact(FactOrganizer)</summary>
public AttachedPositionFunction(string fid, string[] funcids, FactOrganizer organizer) : base(organizer)
{
init(fid, funcids);
//TODO: call MMT, set URI
_URI = Fact.Id + "{" + string.Join(", ", FunctionCallFacts.Select(f => f.Id)) + "}";
private void init(string fid, string[] funcids)
{
this.fid = fid;
}
protected AttachedPositionFunction(string fid, string[] funcids, string uri, FactOrganizer organizer) : base(organizer)
{
_URI = uri;
}
public new static AttachedPositionFunction parseFact(MMTDeclaration fact)
{// TODO Correctness
if (((MMTSymbolDeclaration)fact).defines is not OMA defines)
return null;
ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
return new AttachedPositionFunction(default, default, fact.@ref.uri, StageStatic.stage.factState);
}
public override bool HasDependentFacts
=> true;
protected override string[] GetGetDependentFactIds()
=> new string[] { fid }.ShallowCloneAppend(func_call_ids);
public override int GetHashCode()
=> Fact.GetHashCode() ^ FunctionCallFacts.GetHashCode();
protected override bool EquivalentWrapped(AttachedPositionFunction f1, AttachedPositionFunction f2)
{
Position = Fact.Position;
Rotation = Fact.Rotation;
LocalScale = Fact.LocalScale;
}
protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactOrganizer organizer)
=> new AttachedPositionFunction(old_to_new[this.fid], this.func_call_ids.Select(id => old_to_new[id]).ToArray(), organizer);
public override MMTDeclaration MakeMMTDeclaration()
{
throw new NotImplementedException();
}