/// <summary>
        /// Checks if all filters are compatible with the function and also supported.
        /// </summary>
        /// <param name="function"></param>
        /// <param name="filters"></param>
        private static void ValidateFilters(IFunction function, IVariableFilter[] filters)
        {
            //TODO: get some use for it..does little or nothing now.. and move up to function
            var argumentFiltered  = new bool[function.Arguments.Count];
            var componentFiltered = new bool[function.Components.Count];

            for (int i = 0; i < filters.Length; i++)
            {
                IVariableFilter filter         = filters[i];
                int             argumentIndex  = function.Arguments.IndexOf(filter.Variable);
                int             componentIndex = function.Components.IndexOf(filter.Variable);

                if (argumentIndex >= 0 && argumentFiltered[argumentIndex])
                {
                    // throw new NotSupportedException("Only one filter per argument can be specified for now");
                }
                if (componentIndex >= 0 && componentFiltered[componentIndex])
                {
                    //  throw new NotSupportedException("Only one filter per component can be specified for now");
                }

                if (argumentIndex >= 0)
                {
                    argumentFiltered[argumentIndex] = true;
                }
                if (componentIndex >= 0)
                {
                    componentFiltered[componentIndex] = true;
                }
            }
        }
Exemple #2
0
        public virtual IVariableFilter Intersect(IVariableFilter filter)
        {
            if (filter == null)
            {
                return((IVariableFilter)Clone());
            }

            if (filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("filter", "Filters are incompatible");
            }

            if (!(filter is VariableValueFilter <T>))
            {
                throw new NotImplementedException("Currently only filter of the same type can be intersected");
            }

            var       f         = (VariableValueFilter <T>)filter;
            IList <T> newValues = new List <T>();

            foreach (var value in values)
            {
                if (f.Values.Contains(value))
                {
                    newValues.Add(value);
                }
            }

            return(new VariableValueFilter <T>(variable, newValues));
        }
 public IVariableFilter Intersect(IVariableFilter filter)
 {
     if (filter == null)
     {
         return((IVariableFilter)Clone());
     }
     throw new NotImplementedException();
 }
 public IVariableFilter Intersect(IVariableFilter filter)
 {
     if (filter == null)
     {
         return (IVariableFilter) Clone();
     }
     throw new NotImplementedException();
 }
Exemple #5
0
        public IVariableFilter Intersect(IVariableFilter filter)
        {
            if (filter != null && filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("Filters are incompatible");
            }

            return(new ComponentFilter(variable));
        }
Exemple #6
0
        public IVariableFilter Intersect(IVariableFilter filter)
        {
            if (filter != null && filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("Filters are incompatible");
            }

            return new ComponentFilter(variable);
        }
Exemple #7
0
        public static IVariableFilter Intersect(this IEnumerable <IVariableFilter> filters)
        {
            IVariableFilter intersectedFilter = null;

            foreach (var filter in filters)
            {
                intersectedFilter = filter.Intersect(intersectedFilter);
            }

            return(intersectedFilter);
        }
Exemple #8
0
        public VariableFiltersBuilder <T> WithFilter(IVariableFilter <T> filter)
        {
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            _filters.Add(filter);

            return(this);
        }
Exemple #9
0
        public VariableInfo WithFilter(IVariableFilter filter)
        {
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            (_filters ?? (_filters = new List <IVariableFilter>())).Add(filter);

            return(this);
        }
Exemple #10
0
        protected virtual IVariableFilter[] CreateArgumentFilters(object[] argumentValues)
        {
            if (argumentValues.Length > Arguments.Count)
            {
                throw new ArgumentOutOfRangeException("argumentValues",
                                                      "Number of argument values is greater than number of arguments");
            }

            var filters = new IVariableFilter[argumentValues.Length];

            for (int i = 0; i < argumentValues.Length; i++)
            {
                filters[i] = Arguments[i].CreateValueFilter(argumentValues[i]);
            }

            return(filters);
        }
        public static IVariableFilter Intersect(this IEnumerable <IVariableFilter> filters)
        {
            var filterList = filters.ToList();

            if (filterList.Count == 1)
            {
                return(filterList[0]);
            }

            IVariableFilter intersectedFilter = null;

            foreach (var filter in filterList)
            {
                intersectedFilter = filter.Intersect(intersectedFilter);
            }
            return(intersectedFilter);
        }
 private int[] GetArgumentIndexes(IVariableFilter variableFilter)
 {
     int[] indexes;
     if (variableFilter is IVariableValueFilter)
     {
         indexes = GetVariableValueFilterIndexes((IVariableValueFilter)variableFilter).ToArray();
     }
     else if (variableFilter is VariableIndexRangeFilter)
     {
         indexes = GetVariableIndexRangesFilterIndexes((VariableIndexRangeFilter)variableFilter);
     }
     else
     {
         indexes = GetVariableIndexRangesFilterIndexes((VariableIndexRangesFilter)variableFilter);
     }
     return(indexes);
 }
Exemple #13
0
        /// <summary>
        /// Combines compatible filters.
        /// </summary>
        /// <param name="allFilters"></param>
        /// <returns></returns>
        private List <IVariableFilter> CombineCompatibleFilters(IEnumerable <IVariableFilter> allFilters)
        {
            var uniqueFilters = new List <IVariableFilter>();

            foreach (var filter in allFilters)
            {
                IVariableFilter f2 = filter;
                if (!uniqueFilters.Any(f => f.GetType() == f2.GetType() && f.Variable == f2.Variable))
                // check if it is not added already
                {
                    //for every type of filter and for every variable we only need one filter.
                    var compatibleFilters =
                        allFilters.Where(f => f.GetType() == f2.GetType() && f.Variable == f2.Variable);
                    uniqueFilters.Add(compatibleFilters.Intersect());
                }
            }
            return(uniqueFilters);
        }
        public IVariableFilter Intersect(IVariableFilter filter)
        {
            if (filter == null)
            {
                return(this);
            }

            if (filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("Filters are incompatible");
            }

            if (!(filter is VariableReduceFilter))
            {
                throw new NotImplementedException("Currently only filter of the same type can be intersected");
            }
            //two reduce filters are equal to one. No need to reduce double
            return(this);
        }
        public IVariableFilter Intersect(IVariableFilter filter)
        {

            if (filter == null)
            {
                return this;
            }

            if (filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("Filters are incompatible");
            }

            if (!(filter is VariableReduceFilter))
            {
                throw new NotImplementedException("Currently only filter of the same type can be intersected");
            } 
            //two reduce filters are equal to one. No need to reduce double
            return this;
        }
        public IVariableFilter Intersect(IVariableFilter filter)
        {
            if (filter == null)
            {
                return((IVariableFilter)Clone());
            }

            if (filter.Variable != variable)
            {
                throw new ArgumentOutOfRangeException("filter", "Filters are incompatible");
            }

            if (!(filter is VariableIndexRangeFilter))
            {
                throw new NotImplementedException("Currently only filter of the same type can be intersected");
            }

            VariableIndexRangeFilter f = (VariableIndexRangeFilter)filter;

            //Create that a range that both filters cover. Could result in minIndex > maxIndex
            return(new VariableIndexRangeFilter(variable, Math.Max(f.minIndex, minIndex), Math.Min(f.maxIndex, maxIndex)));
        }
 public static VariableFiltersBuilder <T> WithInvertedFilter <T>(this VariableFiltersBuilder <T> @this, IVariableFilter <T> filter)
 {
     return(@this.WithFilter(new InvertFilter <T>(filter)));
 }
 public InvertFilter(IVariableFilter filter)
 {
     _filter = filter ?? throw new ArgumentNullException(nameof(filter));
 }
 public static VariableInfo WithInvertedFilter(this VariableInfo @this, IVariableFilter filter)
 {
     return(@this.WithFilter(new InvertFilter(filter)));
 }