コード例 #1
0
        public TypeMatch TemplateMatchesInput(ComputationContext ctx, EntityInstance input,
                                              VarianceMode variance, TypeMatching matching)
        {
            // todo: this is correct but it is just a hack really, because we should check constraints
            // and if they are compatible we should return match
            if (input.TargetsTemplateParameter && this.TargetsTemplateParameter &&
                !input.TargetTemplate.Constraints.Any() && !this.TargetTemplate.Constraints.Any())
            {
                return(TypeMatch.Same);
            }

            matching.Position = matching.Position.Flipped(variance);
            switch (matching.Position)
            {
            case VarianceMode.None:
                return(this.IsExactlySame(input, jokerMatchesAll: true) ? TypeMatch.Same : TypeMatch.No);

            case VarianceMode.In:
                return(TypeMatcher.Matches(ctx, this, input, matching));

            case VarianceMode.Out:
                return(TypeMatcher.Matches(ctx, input, this, matching));
            }

            throw new NotImplementedException();
        }
コード例 #2
0
ファイル: StdDev.cs プロジェクト: squaredinfinity/Foundation
        public static StdDevInfo Calculate(IReadOnlyList<double> samples, VarianceMode varianceMode, VarianceAlgorithm varianceAlgorithm)
        {
            var std_dev = new StdDevInfo();
            std_dev.Variance = Variance.Calculate(samples, varianceMode, varianceAlgorithm);

            return std_dev;
        }
コード例 #3
0
        /// <summary>
        /// Calculates a Variance of a sample (set of numbers).
        /// </summary>
        /// <remarks>
        /// https://en.wikipedia.org/wiki/Variance
        /// Variance measures how far the set of numbers are spread out.
        /// Variance == 0 indicates that all numbers are identical.
        /// Variance is always non-negative.
        /// Variance close to 0 indicates that the numbers tend to be very close to the mean (and hence to each other).
        /// </remarks>
        /// <param name="samples">array of samples</param>
        /// <param name="mode">calculation mode (biased or unbiased)</param>
        /// <param name="algorithm">algorithm to use for calculations</param>
        public static VarianceInfo Calculate(IReadOnlyList<double> samples, VarianceMode mode, VarianceAlgorithm algorithm)
        {
            if (mode == VarianceMode.Biased && samples.Count <= 0)
                return VarianceInfo.NaN;
            else if (mode == VarianceMode.Unbiased && samples.Count <= 1)
                return VarianceInfo.NaN;

            //# https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

            var partial_variance_info = new VarianceInfo();

            if (algorithm == VarianceAlgorithm.Online)
                partial_variance_info = M1M2_OnlineAlgorithm(samples);
            else if (algorithm == VarianceAlgorithm.SumsAndSumSquares)
                partial_variance_info = M1M2_SumsAndSquares(samples);
            else if (algorithm == VarianceAlgorithm.SumsAndSumSquaresWithShift)
                partial_variance_info = M1M2_SumsAndSumSquaresWithShift(samples);
            else
                throw new NotSupportedException($"{algorithm} is not supported");

            if (mode == VarianceMode.Biased)
                partial_variance_info.M2Denominator = samples.Count;
            else
                partial_variance_info.M2Denominator = (samples.Count - 1);

            return partial_variance_info;
        }
コード例 #4
0
 private TemplateParametersBuffer(VarianceMode mode, IEnumerable <string> names)
 {
     this.values = new List <TemplateParameter>();
     if (names != null)
     {
         names.ForEach(s => Add(s, mode));
     }
 }
コード例 #5
0
 public static FunctionBuilder Create(
     string name,
     string nameParameter,
     VarianceMode variance,
     INameReference result,
     Block body)
 {
     return(Create(name, TemplateParametersBuffer.Create(variance, nameParameter).Values, result, body));
 }
コード例 #6
0
        public TemplateParametersBuffer Add(string name, VarianceMode mode = VarianceMode.None)
        {
            if (this.closed)
            {
                throw new InvalidOperationException();
            }

            this.values.Add(new TemplateParameter(this.values.Count, name, mode));
            return(this);
        }
コード例 #7
0
ファイル: VarianceMode.cs プロジェクト: macias/Skila
 public static bool PositionCollides(this VarianceMode position, VarianceMode paramMode)
 {
     if (position == VarianceMode.None)
     {
         return(paramMode != VarianceMode.None);
     }
     else
     {
         return(paramMode != VarianceMode.None && position != paramMode);
     }
 }
コード例 #8
0
 public static FunctionBuilder CreateDeclaration(
     string name,
     string nameParameter,
     VarianceMode variance,
     ExpressionReadMode callMode,
     INameReference result)
 {
     return(new FunctionBuilder(name, TemplateParametersBuffer.Create(variance, nameParameter).Values,
                                null, callMode,
                                result,
                                (Block)null));
 }
コード例 #9
0
ファイル: VarianceMode.cs プロジェクト: macias/Skila
        public static VarianceMode Flipped(this VarianceMode position, VarianceMode paramMode)
        {
            switch (paramMode)
            {
            case VarianceMode.None: return(VarianceMode.None);

            case VarianceMode.In: return(position.Inversed());

            case VarianceMode.Out: return(position);

            default: throw new NotImplementedException();
            }
        }
コード例 #10
0
ファイル: VarianceMode.cs プロジェクト: macias/Skila
        public static VarianceMode Inversed(this VarianceMode @this)
        {
            switch (@this)
            {
            case VarianceMode.In: return(VarianceMode.Out);

            case VarianceMode.Out: return(VarianceMode.In);

            case VarianceMode.None: return(VarianceMode.None);

            default: throw new InvalidOperationException();
            }
        }
コード例 #11
0
ファイル: VarianceMode.cs プロジェクト: macias/Skila
        public static string ToString(VarianceMode @this)
        {
            switch (@this)
            {
            case VarianceMode.In: return("in");

            case VarianceMode.Out: return("out");

            case VarianceMode.None: return("");

            default: throw new InvalidOperationException();
            }
        }
コード例 #12
0
ファイル: TemplateParameter.cs プロジェクト: macias/Skila
        public TemplateParameter(int index,
                                 string name,
                                 VarianceMode variance)
            : base()
        {
            if (name == null)
            {
                throw new ArgumentNullException();
            }

            this.Index    = index;
            this.Name     = name;
            this.Variance = variance;
        }
コード例 #13
0
        public override TypeMatch TemplateMatchesTarget(ComputationContext ctx,
                                                        IEntityInstance target, VarianceMode variance, TypeMatching matching)
        {
            IEnumerable <TypeMatch> matches = this.elements.Select(it => it.TemplateMatchesTarget(ctx, target, variance, matching));

            if (matches.Any(it => it == TypeMatch.Same))
            {
                return(TypeMatch.Same);
            }

            IEnumerable <TypeMatch> substitutions = matches.Where(it => it == TypeMatch.Substitute).OrderBy(it => it.Distance);

            if (substitutions.Any())
            {
                return(substitutions.First());
            }
            else
            {
                return(TypeMatch.No);
            }
        }
コード例 #14
0
        public override TypeMatch TemplateMatchesInput(ComputationContext ctx,
                                                       EntityInstance input, VarianceMode variance, TypeMatching matching)
        {
            TypeMatch match = TypeMatch.No;

            foreach (IEntityInstance target in this.elements)
            {
                TypeMatch m = target.TemplateMatchesInput(ctx, input, variance, matching);
                if (m.IsMismatch())
                {
                    return(m);
                }
                else if (match.IsMismatch())
                {
                    match = m;
                }
                else if (match != m)
                {
                    return(TypeMatch.No);
                }
            }

            return(match);
        }
コード例 #15
0
 public TypeMatch TemplateMatchesTarget(ComputationContext ctx, IEntityInstance target, VarianceMode variance, TypeMatching matching)
 {
     return(target.TemplateMatchesInput(ctx, this, variance, matching));
 }
コード例 #16
0
        public bool ValidateTypeVariance(ComputationContext ctx, IOwnedNode placement, VarianceMode typeNamePosition)
        {
            // Programming in Scala, 2nd ed, p. 399 (all errors are mine)

            TypeDefinition typedef = this.TargetType;

            if (typedef.IsTemplateParameter)
            {
                TemplateParameter  param    = typedef.TemplateParameter;
                TemplateDefinition template = param.EnclosingScope <TemplateDefinition>();
                if (placement.EnclosingScopesToRoot().Contains(template))
                {
                    bool covariant_in_immutable = param.Variance == VarianceMode.Out &&
                                                  (template.IsFunction() || template.CastType().InstanceOf.MutabilityOfType(ctx) == TypeMutability.ConstAsSource);

                    // don't report errors for covariant types which are used in immutable template types
                    if (!covariant_in_immutable &&
                        typeNamePosition.PositionCollides(param.Variance))
                    {
                        return(false);
                    }
                }
            }
            else
            {
                for (int i = 0; i < typedef.Name.Parameters.Count; ++i)
                {
                    if (!this.TemplateArguments[i].ValidateTypeVariance(ctx,
                                                                        placement,
                                                                        typeNamePosition.Flipped(typedef.Name.Parameters[i].Variance)))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #17
0
 public abstract TypeMatch TemplateMatchesInput(ComputationContext ctx, EntityInstance input,
                                                VarianceMode variance, TypeMatching matching);
コード例 #18
0
 public bool ValidateTypeVariance(ComputationContext ctx, IOwnedNode placement, VarianceMode typeNamePosition)
 {
     return(this.EnumerateAll().All(it => it.ValidateTypeVariance(ctx,
                                                                  placement,
                                                                  typeNamePosition)));
 }
コード例 #19
0
 public abstract TypeMatch TemplateMatchesTarget(ComputationContext ctx, IEntityInstance target,
                                                 VarianceMode variance, TypeMatching matching);
コード例 #20
0
 public static void ValidateTypeNameVariance(this INameReference @this, ComputationContext ctx, VarianceMode typeNamePosition)
 {
     if ([email protected](ctx, @this, typeNamePosition))
     {
         ctx.AddError(ErrorCode.VarianceForbiddenPosition, @this);
     }
 }
コード例 #21
0
ファイル: StdDev.cs プロジェクト: squaredinfinity/Foundation
 public static StdDevInfo Calculate(IReadOnlyList<double> samples, VarianceMode varianceMode)
 {
     return Calculate(samples, varianceMode, VarianceAlgorithm.Online);
 }
コード例 #22
0
        /// <summary>
        /// Calculates a Variance of a sample (set of numbers).
        /// </summary>
        /// <remarks>
        /// https://en.wikipedia.org/wiki/Variance
        /// Variance measures how far the set of numbers are spread out.
        /// Variance == 0 indicates that all numbers are identical.
        /// Variance is always non-negative.
        /// Variance close to 0 indicates that the numbers tend to be very close to the mean (and hence to each other).
        /// </remarks>
        /// <param name="samples">observable samples</param>
        /// <param name="mode">calculation mode (biased or unbiased)</param>
        /// <param name="algorithm">algorithm to use for calculations</param>
        public static IObservable<VarianceInfo> Calculate(IObservable<double> samples, VarianceMode mode, VarianceAlgorithm algorithm)
        {
            return Observable.Create<VarianceInfo>(o =>
            {
                var count = 0;
                VarianceInfo m1m2 = new VarianceInfo();

                var M2_Observable = (IObservable<VarianceInfo>)null;

                if (algorithm == VarianceAlgorithm.Online)
                    M2_Observable = M1M2_OnlineAlgorithm(samples);
                else
                    throw new NotSupportedException($"{algorithm} is not supported");

                M2_Observable.Subscribe(M2 =>
                {
                    count++;

                    if (mode == VarianceMode.Biased && count <= 0)
                    {
                        m1m2 = VarianceInfo.NaN;
                        o.OnNext(m1m2);
                        return;
                    }
                    else if (mode == VarianceMode.Unbiased && count <= 1)
                    {
                        m1m2 = VarianceInfo.NaN;
                        o.OnNext(m1m2);
                        return;
                    }

                    if (mode == VarianceMode.Biased)
                        m1m2.M2Denominator = count;
                    else
                        m1m2.M2Denominator = (count - 1);

                    o.OnNext(m1m2);
                });

                return Disposable.Empty;
            });
        }
コード例 #23
0
        /// <summary>
        /// Calculates a Variance of a sample (set of numbers).
        /// </summary>
        /// <remarks>
        /// https://en.wikipedia.org/wiki/Variance
        /// Variance measures how far the set of numbers are spread out.
        /// Variance == 0 indicates that all numbers are identical.
        /// Variance is always non-negative.
        /// Variance close to 0 indicates that the numbers tend to be very close to the mean (and hence to each other).
        /// </remarks>
        /// <param name="samples">observable samples</param>
        /// <param name="mode">calculation mode (biased or unbiased)</param>
        public static IObservable<VarianceInfo> Calculate(IObservable<double> samples, VarianceMode mode)
        {
            var count = 0;

            return M1M2_OnlineAlgorithm(samples).Select(M1M2 =>
            {
                count++;

                if (mode == VarianceMode.Biased && count <= 0)
                {
                    return VarianceInfo.NaN;
                }
                else if (mode == VarianceMode.Unbiased && count <= 1)
                {
                    return VarianceInfo.NaN;
                }

                if (mode == VarianceMode.Biased)
                    M1M2.M2Denominator = count;
                else
                    M1M2.M2Denominator = (count - 1);

                return M1M2;
            });
        }
コード例 #24
0
ファイル: NameDefinition.cs プロジェクト: macias/Skila
 public static NameDefinition Create(string name, string paramName, VarianceMode variance)
 {
     return(new NameDefinition(name, TemplateParametersBuffer.Create().Add(paramName, variance).Values));
 }
コード例 #25
0
        public override TypeMatch TemplateMatchesInput(ComputationContext ctx, EntityInstance input, VarianceMode variance,
                                                       TypeMatching matching)
        {
            TypeMatch match = TypeMatch.No;

            foreach (IEntityInstance target in this.elements)
            {
                TypeMatch m = target.TemplateMatchesInput(ctx, input, variance, matching);
                if (m == TypeMatch.Same || m == TypeMatch.Substitute)
                {
                    return(m);
                }
                else if (m == TypeMatch.AutoDereference ||
                         m == TypeMatch.InConversion ||
                         m == TypeMatch.ImplicitReference ||
                         m == TypeMatch.OutConversion)
                {
                    match = m;
                }
                else if (!m.IsMismatch())
                {
                    throw new NotImplementedException();
                }
            }

            return(match);
        }
コード例 #26
0
 public static TemplateParametersBuffer Create(VarianceMode mode, params string[] names)
 {
     return(new TemplateParametersBuffer(mode, names));
 }