Skip to content
Snippets Groups Projects
FunctionFact.cs 8.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System;
    using System.Collections.Generic;
    using UnityEngine;
    using Newtonsoft.Json;
    using static SOMDocManager;
    using System.Linq.Expressions;
    
    MaZiFAU's avatar
    MaZiFAU committed
    public class FunctionCallFact : FactWrappedCRTP<FunctionCallFact>
    
    MaZiFAU's avatar
    MaZiFAU committed
        public string func_id;
    
    MaZiFAU's avatar
    MaZiFAU committed
        public string arg_func_id;
    
        public (float t_0, float t_n) Domain;
    
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
    MaZiFAU's avatar
    MaZiFAU committed
        [JsonIgnore]
    
    MaZiFAU's avatar
    MaZiFAU committed
        public FunctionFact Function_in 
            => (FunctionFact)FactOrganizer.AllFacts[func_id];
    
    
    MaZiFAU's avatar
    MaZiFAU committed
        [JsonIgnore]
    
    MaZiFAU's avatar
    MaZiFAU committed
        public FunctionFact Function_args 
            => (FunctionFact)FactOrganizer.AllFacts[arg_func_id];
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
        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
    
    MaZiFAU's avatar
    MaZiFAU committed
            => true;
    
        protected override string[] GetGetDependentFactIds()
            => new[] { func_id, arg_func_id };
    
        protected override bool EquivalentWrapped(FunctionCallFact f1, FunctionCallFact f2)
    
    MaZiFAU's avatar
    MaZiFAU committed
            => Mathf.Approximately(f1.Domain.t_0, f2.Domain.t_0)
            && Mathf.Approximately(f1.Domain.t_n, f2.Domain.t_n)
    
    MaZiFAU's avatar
    MaZiFAU committed
            && (DependentFactsEquivalent(f1, f2)
                || (f1.Function_in.Equivalent(f2.Function_in)
                    && f1.Function_args.Equivalent(f2.Function_args)
            ));
    
    
    MaZiFAU's avatar
    MaZiFAU committed
        public override MMTDeclaration MakeMMTDeclaration()
    
    MaZiFAU's avatar
    MaZiFAU committed
        {
            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>
    {
    
        public SOMDoc Function_SOMDoc;
    
        //TODO: doc
        [JsonIgnore]
        public LambdaExpression Function_expression;
    
        [JsonIgnore]
    
    MaZiFAU's avatar
    MaZiFAU committed
        public Type[] Signature;
    
    MaZiFAU's avatar
    MaZiFAU committed
        [JsonIgnore]
        public Func<object[], object[]> Function;
    
    
        /// <summary> \copydoc Fact.Fact </summary>
        public FunctionFact() : base() { }
    
        /// <summary>
    
        /// Standard Constructor:
        /// Initiates members and creates MMT %Fact Server-Side
    
        /// <param name="Function_SOMDoc">sets <see cref="Function_SOMDoc"/> and contains the Abstract Syntax Tree</param>
    
        /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
    
    MaZiFAU's avatar
    MaZiFAU committed
        public FunctionFact(SOMDoc Function_SOMDoc, FactOrganizer organizer) : base(organizer)
    
    MaZiFAU's avatar
    MaZiFAU committed
            this.Function_expression = this.Function_SOMDoc.PartialInvokeCastingLambdaExpression(out Signature);
    
            ////TODO: catch
            //string debug_tostring = Function_expression.ToString();
    
    MaZiFAU's avatar
    MaZiFAU committed
            //Delegate debug_function = Function_expression.Compile();
            this.Function = this.Function_expression.Compile() as Func<object[], object[]>;
    
    MaZiFAU's avatar
    MaZiFAU committed
            _URI = this.Function_expression.ToString();
    
    
            ////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;
    
        /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
    
        /// <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>
    
    MaZiFAU's avatar
    MaZiFAU committed
        public FunctionFact(SOMDoc Function_SOMDoc, string uri, FactOrganizer organizer) : base(organizer)
    
    MaZiFAU's avatar
    MaZiFAU committed
            this.Function_expression = Function_SOMDoc.PartialInvokeCastingLambdaExpression(out Signature);
    
            ////TODO: catch
            //string debug_tostring = Function_expression.ToString();
            //dynamic debug_function = Function_expression.Compile();
    
    MaZiFAU's avatar
    MaZiFAU committed
            this.Function = this.Function_expression.Compile() as Func<object[], object[]>;
    
            this._URI = uri;
            _ = this.Label;
    
    MaZiFAU's avatar
    MaZiFAU committed
        protected override void RecalculateTransform() { }
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
        /// \copydoc Fact.parseFact(ScrollFact)
        public new static FunctionFact parseFact(MMTDeclaration fact)
    
            if (((MMTSymbolDeclaration)fact).defines is not OMA defines)
    
            ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
    
            return new FunctionFact(defines, fact.@ref.uri, StageStatic.stage.factState);
    
    MaZiFAU's avatar
    MaZiFAU committed
        public override bool HasDependentFacts
            => false;
    
        protected override string[] GetGetDependentFactIds()
    
    MaZiFAU's avatar
    MaZiFAU committed
            => new string[] { };
    
    
        /// \copydoc Fact.GetHashCode
        public override int GetHashCode()
            => Function_expression.GetHashCode();
    
        /// \copydoc Fact.EquivalentWrapped
    
    MaZiFAU's avatar
    MaZiFAU committed
        protected override bool EquivalentWrapped(FunctionFact f1, FunctionFact f2)
            => f1.Function_SOMDoc.Equivalent(f2.Function_SOMDoc);
    
    MaZiFAU's avatar
    MaZiFAU committed
    
        protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactOrganizer organizer)
    
    MaZiFAU's avatar
    MaZiFAU committed
            => new FunctionFact(this.Function_SOMDoc.MapURIs(old_to_new), organizer);
    
    MaZiFAU's avatar
    MaZiFAU committed
        public override MMTDeclaration MakeMMTDeclaration()
    
        {
            throw new NotImplementedException();
        }
    
    public class AttachedPositionFunction : FactWrappedCRTP<AttachedPositionFunction>
    {
        public string fid;
    
    
    MaZiFAU's avatar
    MaZiFAU committed
        public string[] func_call_ids;
    
    MaZiFAU's avatar
    MaZiFAU committed
        public Fact Fact => FactOrganizer.AllFacts[fid];
    
    
        public FunctionCallFact[] FunctionCallFacts
    
    MaZiFAU's avatar
    MaZiFAU committed
            => 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)
    
    MaZiFAU's avatar
    MaZiFAU committed
        {
            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;
    
    MaZiFAU's avatar
    MaZiFAU committed
            this.func_call_ids = funcids;
    
        }
    
        protected AttachedPositionFunction(string fid, string[] funcids, string uri, FactOrganizer organizer) : base(organizer)
        {
    
    MaZiFAU's avatar
    MaZiFAU committed
            init(fid, funcids);
    
        public new static AttachedPositionFunction parseFact(MMTDeclaration fact)
    
            if (((MMTSymbolDeclaration)fact).defines is not OMA defines)
    
            ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
    
            return new AttachedPositionFunction(default, default, fact.@ref.uri, StageStatic.stage.factState);
    
    MaZiFAU's avatar
    MaZiFAU committed
        public override bool HasDependentFacts
            => true;
    
    MaZiFAU's avatar
    MaZiFAU committed
        protected override string[] GetGetDependentFactIds()
            => new string[] { fid }.ShallowCloneAppend(func_call_ids);
    
            => Fact.GetHashCode() ^ FunctionCallFacts.GetHashCode();
    
    
        protected override bool EquivalentWrapped(AttachedPositionFunction f1, AttachedPositionFunction f2)
    
    MaZiFAU's avatar
    MaZiFAU committed
            => DependentFactsEquivalent(f1, f2);
    
    MaZiFAU's avatar
    MaZiFAU committed
        protected override void RecalculateTransform()
    
        {
            Position = Fact.Position;
            Rotation = Fact.Rotation;
            LocalScale = Fact.LocalScale;
        }
    
    MaZiFAU's avatar
    MaZiFAU committed
    
        protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactOrganizer organizer)
    
    MaZiFAU's avatar
    MaZiFAU committed
            => new AttachedPositionFunction(old_to_new[this.fid], this.func_call_ids.Select(id => old_to_new[id]).ToArray(), organizer);
    
    MaZiFAU's avatar
    MaZiFAU committed
        public override MMTDeclaration MakeMMTDeclaration()
    
        {
            throw new NotImplementedException();
        }