예제 #1
0
파일: Pairwise.cs 프로젝트: tekcor/vvvv-sdk
        public void Evaluate(int SpreadMax)
        {
            Output1.SliceCount = Input.SliceCount;
            Output2.SliceCount = Input.SliceCount;

            for (var spread = 0; spread < Input.SliceCount; spread++)
            {
                var pairs = SeqModule.Pairwise(Input[spread]).ToArray();

                Output1[spread].SliceCount = pairs.Length;
                Output2[spread].SliceCount = pairs.Length;

                for (var i = 0; i < pairs.Length; i++)
                {
                    var pair = pairs[i];
                    Output1[spread][i] = pair.Item1;
                    Output2[spread][i] = pair.Item2;
                }
            }
        }
예제 #2
0
        Tuple <IIndex <TNewKey>, IVector <R> > IIndexBuilder.Resample <K, TNewKey, R>(IIndexBuilder chunkBuilder, IIndex <K> index, IEnumerable <K> keys, Deedle.Direction dir, VectorConstruction vector, Func <Tuple <K, Tuple <IIndex <K>, VectorConstruction> >, Tuple <TNewKey, R> > selector)
        {
            if (!index.IsOrdered)
            {
                throw new InvalidOperationException("Resampling is only supported on ordered indices");
            }
            IIndexBuilder    indexBuilder = (IIndexBuilder)this;
            IEnumerable <M1> m1s;

            if (dir == Deedle.Direction.Forward)
            {
                IEnumerable <Tuple <K, long> > tuples = (IEnumerable <Tuple <K, long> >)SeqModule.Map <K, Tuple <K, long> >((Func <M0, M1>) new LinearIndex.keyLocations <K>(index), keys);
                m1s = SeqModule.MapIndexed <Tuple <Tuple <K, long>, Tuple <K, long> >, Tuple <K, Tuple <long, long> > >((Func <int, Func <M0, M1> >) new LinearIndex.locations <K>(index), (IEnumerable <M0>)SeqModule.Pairwise <Tuple <K, long> >(SeqModule.Append <Tuple <K, long> >((IEnumerable <M0>)tuples, (IEnumerable <M0>)FSharpList <Tuple <K, long> > .Cons(new Tuple <K, long>(default(K), Addressing.LinearAddress.invalid), FSharpList <Tuple <K, long> > .get_Empty()))));
            }
            else
            {
                int keyLen = SeqModule.Length <K>(keys);
                IEnumerable <Tuple <K, long> > tuples = (IEnumerable <Tuple <K, long> >)SeqModule.Map <K, Tuple <K, long> >((Func <M0, M1>) new LinearIndex.keyLocations <K>(index), keys);
                m1s = SeqModule.MapIndexed <Tuple <Tuple <K, long>, Tuple <K, long> >, Tuple <K, Tuple <long, long> > >((Func <int, Func <M0, M1> >) new LinearIndex.locations <K>(index, keyLen), (IEnumerable <M0>)SeqModule.Pairwise <Tuple <K, long> >(SeqModule.Append <Tuple <K, long> >((IEnumerable <M0>)FSharpList <Tuple <K, long> > .Cons(new Tuple <K, long>(default(K), Addressing.LinearAddress.invalid), FSharpList <Tuple <K, long> > .get_Empty()), (IEnumerable <M0>)tuples)));
            }
            Tuple <K, Tuple <long, long> >[] tupleArray1 = (Tuple <K, Tuple <long, long> >[])ArrayModule.OfSeq <Tuple <K, Tuple <long, long> > >((IEnumerable <M0>)m1s);
            Func <Tuple <K, Tuple <long, long> >, Tuple <K, Tuple <IIndex <K>, VectorConstruction> > > Func1 = (Func <Tuple <K, Tuple <long, long> >, Tuple <K, Tuple <IIndex <K>, VectorConstruction> > >) new LinearIndex.vectorConstructions <K>(chunkBuilder, index);

            Tuple <K, Tuple <long, long> >[] tupleArray2 = tupleArray1;
            if ((object)tupleArray2 == null)
            {
                throw new ArgumentNullException("array");
            }
            Tuple <K, Tuple <IIndex <K>, VectorConstruction> >[] tupleArray3 = new Tuple <K, Tuple <IIndex <K>, VectorConstruction> > [tupleArray2.Length];
            for (int index1 = 0; index1 < tupleArray3.Length; ++index1)
            {
                tupleArray3[index1] = Func1.Invoke(tupleArray2[index1]);
            }
            Tuple <K, Tuple <IIndex <K>, VectorConstruction> >[] tupleArray4 = tupleArray3;
            Func <Tuple <K, Tuple <IIndex <K>, VectorConstruction> >, Tuple <TNewKey, R> > Func2 = selector;

            Tuple <K, Tuple <IIndex <K>, VectorConstruction> >[] tupleArray5 = tupleArray4;
            if ((object)tupleArray5 == null)
            {
                throw new ArgumentNullException("array");
            }
            Tuple <TNewKey, R>[] tupleArray6 = new Tuple <TNewKey, R> [tupleArray5.Length];
            for (int index1 = 0; index1 < tupleArray6.Length; ++index1)
            {
                tupleArray6[index1] = Func2.Invoke(tupleArray5[index1]);
            }
            Tuple <TNewKey, R>[]         tupleArray7    = tupleArray6;
            IIndex <TNewKey>             index2         = indexBuilder.Create <TNewKey>(SeqModule.Map <Tuple <TNewKey, R>, TNewKey>((Func <M0, M1>) new LinearIndex.newIndex <TNewKey, R>(), (IEnumerable <M0>)tupleArray7), (FSharpOption <bool>)null);
            IVectorBuilder               vectorBuilder1 = this.vectorBuilder;
            Func <Tuple <TNewKey, R>, R> Func3          = (Func <Tuple <TNewKey, R>, R>) new LinearIndex.vect <TNewKey, R>();

            Tuple <TNewKey, R>[] tupleArray8 = tupleArray7;
            if ((object)tupleArray8 == null)
            {
                throw new ArgumentNullException("array");
            }
            R[]            optionalValueArray = new R[tupleArray8.Length];
            IVectorBuilder vectorBuilder2     = vectorBuilder1;

            for (int index1 = 0; index1 < optionalValueArray.Length; ++index1)
            {
                optionalValueArray[index1] = Func3.Invoke(tupleArray8[index1]);
            }
            IVector <R> missing = vectorBuilder2.CreateMissing <R>(optionalValueArray);

            return(new Tuple <IIndex <TNewKey>, IVector <R> >(index2, missing));
        }
        public Filter ThingsShareItemsEfficiently(int numberOfThings)
        {
            return(testVariableIndexToLevelNumberAndItemIndexMap =>
            {
                const int numberOfTestVariablesDefiningAThing = 3;
                const int offsetOfTestVariableIndexForAnItemIndexLevel = 0;
                var itemIndexAndPositionPairsFromHistories =
                    (from testVariableIndexToLevelNumberAndLevelValuePair in
                     testVariableIndexToLevelNumberAndItemIndexMap
                     let testVariableLevelIndex = testVariableIndexToLevelNumberAndLevelValuePair.Key
                                                  where
                                                  offsetOfTestVariableIndexForAnItemIndexLevel ==
                                                  testVariableLevelIndex % numberOfTestVariablesDefiningAThing
                                                  select
                                                  new
                {
                    ItemIndex = (int)testVariableIndexToLevelNumberAndLevelValuePair.Value.Item2,
                    PositionOfItemIndex = testVariableLevelIndex / numberOfTestVariablesDefiningAThing
                })
                    .ToList();

                var itemIndicesFromHistories =
                    (from itemIndexAndPosition in itemIndexAndPositionPairsFromHistories
                     select itemIndexAndPosition.ItemIndex).ToList();

                var itemIndexPositionsFromHistories =
                    (from itemIndexAndPosition in itemIndexAndPositionPairsFromHistories
                     select itemIndexAndPosition.PositionOfItemIndex).ToList();

                if (!itemIndicesFromHistories.Any())
                {
                    return true;
                }

                if (!BargainBasement.IsSorted(itemIndicesFromHistories))
                {
                    return false;
                }

                var minimumItemIndex = itemIndicesFromHistories.Min();
                var maximumItemIndex = itemIndicesFromHistories.Max();

                var minimumItemIndexPosition = itemIndexPositionsFromHistories.Min();
                var maximumItemIndexPosition = itemIndexPositionsFromHistories.Max();

                var itemIndicesCanBeAligned =
                    itemIndicesFromHistories.Zip(itemIndexPositionsFromHistories, (index, position) => index <= position)
                    .All(outcome => outcome);

                if (!itemIndicesCanBeAligned)
                {
                    return false;
                }

                var itemIndicesAreEitherContiguousOrCanMadeSoWithInsertions =
                    SeqModule.Pairwise(itemIndicesFromHistories)
                    .Select(pairOfAdjacentIndices => pairOfAdjacentIndices.Item2 - pairOfAdjacentIndices.Item1)
                    .Zip(
                        SeqModule.Pairwise(itemIndexPositionsFromHistories)
                        .Select(
                            pairOfAdjacentPositions =>
                            pairOfAdjacentPositions.Item2 - pairOfAdjacentPositions.Item1),
                        (indexDelta, indexPositionDelta) => indexDelta <= indexPositionDelta)
                    .All(outcome => outcome);

                if (!itemIndicesAreEitherContiguousOrCanMadeSoWithInsertions)
                {
                    return false;
                }

                var numberOfItemIndexPositions = itemIndexPositionsFromHistories.Count();
                var noPositionGapsToPlaceExtraItemIndices = numberOfItemIndexPositions ==
                                                            1 + maximumItemIndexPosition - minimumItemIndexPosition;

                var itemIndicesAreContiguous = itemIndicesFromHistories.Distinct().Count() ==
                                               1 + maximumItemIndex - minimumItemIndex;

                if (!itemIndicesAreContiguous && noPositionGapsToPlaceExtraItemIndices)
                {
                    return false;
                }

                if (itemIndicesAreContiguous && noPositionGapsToPlaceExtraItemIndices)
                {
                    if (numberOfItemIndexPositions == numberOfThings)
                    {
                        return
                        BargainBasement.IsSorted(
                            itemIndicesFromHistories.GroupBy(itemIndex => itemIndex).Select(group => group.Count()));
                    }

                    if (numberOfItemIndexPositions > 2)
                    {
                        return
                        BargainBasement.IsSorted(
                            itemIndicesFromHistories.Skip(1)
                            .Take(numberOfItemIndexPositions - 2)
                            .GroupBy(itemIndex => itemIndex)
                            .Select(group => group.Count()));
                    }
                }

                return true;
            });
        }