private IEnumerable<ICommand> GenerateDiff(IDataIterator sourceIterator, IDataIterator targetIterator)
        {
            var commands = new List<ICommand>();
            var sourceDataItem = sourceIterator.Next();
            var targetDataItem = targetIterator.Next();

            while (sourceDataItem != null || targetDataItem != null)
            {
                var compareResult = Compare(sourceDataItem, targetDataItem);
                commands.AddRange((sourceDataItem ?? targetDataItem).GenerateDiff(sourceDataItem, targetDataItem, compareResult));
                if (compareResult < 0)
                {
                    sourceDataItem = sourceIterator.Next();
                }
                else
                {
                    if (compareResult > 0)
                    {
                        targetDataItem = targetIterator.Next();
                    }
                    else
                    {
                        if (compareResult == 0)
                        {
                            targetDataItem = targetIterator.Next();
                            sourceDataItem = sourceIterator.Next();
                        }
                    }
                }
            }

            return commands;
        }
コード例 #2
0
        /// <summary>
        /// Generates the diff.
        /// </summary>
        /// <param name="sourceIterator">The source iterator.</param>
        /// <param name="targetIterator">The target iterator.</param>
        /// <returns>
        /// The diff.
        /// </returns>
        protected static IList<ICommand> GenerateDiff(IDataIterator sourceIterator, IDataIterator targetIterator)
        {
            List<ICommand> commands = new List<ICommand>();
              IDataItem sourceDataItem = sourceIterator.Next();
              IDataItem targetDataItem = targetIterator.Next();

              while (sourceDataItem != null || targetDataItem != null)
              {
            int compareResult = Compare(sourceDataItem, targetDataItem);
            commands.AddRange((sourceDataItem ?? targetDataItem).GenerateDiff(sourceDataItem, targetDataItem, compareResult));
            if (compareResult < 0)
            {
              sourceDataItem = sourceIterator.Next();
            }
            else
            {
              if (compareResult > 0)
              {
            targetDataItem = targetIterator.Next();
              }
              else
              {
            if (compareResult == 0)
            {
              targetDataItem = targetIterator.Next();
              sourceDataItem = sourceIterator.Next();
            }
              }
            }
              }

              return commands;
        }
コード例 #3
0
        public static List <ICommand> GetDiffCommands(HashSet <string> targetItemIDs, CollisionBehavior collisionBehavior,
                                                      IDataIterator sourceDataIterator, IDataIterator targetDataIterator, DataEngine engine)
        {
            var commands = new List <ICommand>();

            commands.AddRange(GenerateDiff(sourceDataIterator, targetDataIterator));

            //if an item is found to be deleted AND added, we can be sure it's a move
            var deleteCommands         = commands.OfType <DeleteItemCommand>();
            var shouldBeUpdateCommands =
                commands.OfType <AddItemCommand>()
                .Select(a => new
            {
                Added   = a,
                Deleted = deleteCommands.FirstOrDefault(d => d.ItemID == a.ItemID)
            }).Where(u => u.Deleted != null).ToList();

            foreach (var command in shouldBeUpdateCommands)
            {
                commands.AddRange(command.Deleted.GenerateUpdateCommand(command.Added));
                commands.Remove(command.Added);
                commands.Remove(command.Deleted);

                //now, this one is an assumption, but would go wrong without the assumption anyway: this assumption is in fact safer
                //if the itempath of a delete command starts with this delete command, it will be moved along to the new node, not deleted, just leave it alone
                //but we will skip items which are not in the target folder
                commands.RemoveAll(c =>
                                   c is DeleteItemCommand &&
                                   ((DeleteItemCommand)c).ItemPath.StartsWith(command.Deleted.ItemPath) &&
                                   targetItemIDs.Contains(((DeleteItemCommand)c).ItemID));
            }

            commands.ForEach(_ => _.CollisionBehavior = collisionBehavior);
            return(commands);
        }
        protected static IList <ICommand> GenerateDiff(IDataIterator sourceIterator, IDataIterator targetIterator)
        {
            var commands       = new List <ICommand>();
            var sourceDataItem = sourceIterator.Next();
            var targetDataItem = targetIterator.Next();

            while (sourceDataItem != null || targetDataItem != null)
            {
                var compareResult = Compare(sourceDataItem, targetDataItem);
                commands.AddRange((sourceDataItem ?? targetDataItem).GenerateDiff(sourceDataItem, targetDataItem,
                                                                                  compareResult));
                if (compareResult < 0)
                {
                    sourceDataItem = sourceIterator.Next();
                }
                else
                {
                    if (compareResult > 0)
                    {
                        targetDataItem = targetIterator.Next();
                    }
                    else
                    {
                        if (compareResult == 0)
                        {
                            targetDataItem = targetIterator.Next();
                            sourceDataItem = sourceIterator.Next();
                        }
                    }
                }
            }
            return(commands);
        }
コード例 #5
0
        /// <summary>
        /// Maps an iterator into a Dictionary with unique keys for each item.
        /// </summary>
        /// <param name="iterator"></param>
        /// <returns></returns>
        protected static Dictionary <string, IDataItem> Map(IDataIterator iterator)
        {
            var dict = new Dictionary <string, IDataItem>();

            while (true)
            {
                var item = iterator.Next();
                if (item != null)
                {
                    var key = CreateUniqueKey(item);
                    try
                    {
                        dict.Add(key, item);
                    }
                    catch (ArgumentException)
                    {
                        //This should not happen unless the dataset is corrupted, which would mean it would not give a proper result
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine($"Two items got the same unique key. This suggests invalid data. Check {GetItemPath(item)} vs {GetItemPath(dict[key])}");
                        Console.ResetColor();
                    }
                }
                else
                {
                    return(dict);
                }
            }
        }
コード例 #6
0
        public static List <ICommand> GetCommands(IDataIterator sourceDataIterator, IDataIterator targetDataIterator)
        {
            var source = Map(sourceDataIterator);
            var target = Map(targetDataIterator);

            var commands = GetCommands(source, target);

            return(commands);
        }
コード例 #7
0
ファイル: Trainer.cs プロジェクト: xiaoxiongnpu/Sigma
        /// <inheritdoc />
        public void AddNamedDataIterator(string name, IDataIterator iterator)
        {
            if (_additionalNameDataIterators.ContainsKey(name))
            {
                throw new ArgumentException($"Named data iterator with name {name} already registered in this trainer ({Name}).");
            }

            _additionalNameDataIterators.Add(name, iterator);
        }
コード例 #8
0
        public static void TimingRandom <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
        {
            string name = "TimingRand " + arr.GetType().Name + "-" + iter.GetType().Name;

            var s1 = Stopwatch.StartNew();

            WriteRandom(arr, iter);
            Debug.WriteLine(name + "\tw=" + s1.ElapsedMilliseconds);
            ReadAndTestRandom(arr, iter);
            Debug.WriteLine(name + "\tt=" + s1.ElapsedMilliseconds);
        }
コード例 #9
0
        static void WriteRandom <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
        {
            long len = arr.Length;
            var  seq = LinearFeedbackShiftRegister.SequenceLength(lfsrStart, (ulong)len).GetEnumerator();

            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                seq.MoveNext();
                long x    = (long)seq.Current;
                T    next = iter.GetNext();
                arr[x] = next;
            }
        }
コード例 #10
0
        static void ReadAndTestRandom <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
        {
            long len = arr.Length;
            var  seq = LinearFeedbackShiftRegister.SequenceLength(lfsrStart, (ulong)len).GetEnumerator();

            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                seq.MoveNext();
                long x    = (long)seq.Current;
                T    next = iter.GetNext();
                Assert.IsTrue(iter.AreEqual(arr[x], next));
            }
        }
コード例 #11
0
        public static void ReadWriteTest <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
        {
            long len = arr.Length;

            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                arr[i] = iter.GetNext();
            }
            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                Assert.IsTrue(iter.AreEqual(arr[i], iter.GetNext()));
            }
        }
コード例 #12
0
        /// <summary>
        /// Invoke this hook with a certain parameter registry.
        /// </summary>
        /// <param name="registry">The registry containing the required values for this hook's execution.</param>
        /// <param name="resolver">A helper resolver for complex registry entries (automatically cached).</param>
        public override void SubInvoke(IRegistry registry, IRegistryResolver resolver)
        {
            INetwork network = resolver.ResolveGetSingle <INetwork>("network.self");
            ITrainer trainer = resolver.ResolveGetSingle <ITrainer>("trainer.self");
            string   validationIteratorName   = ParameterRegistry.Get <string>("validation_iterator_name");
            string   finalExternalOutputAlias = ParameterRegistry.Get <string>("final_external_output_alias");
            string   activationsAlias         = ParameterRegistry.Get <string>("output_activations_alias");
            string   targetsAlias             = ParameterRegistry.Get <string>("targets_alias");

            if (!trainer.AdditionalNameDataIterators.ContainsKey(validationIteratorName))
            {
                throw new InvalidOperationException($"Additional named data iterator for validation with name \"{validationIteratorName}\" does not exist in referenced trainer {trainer} but is required.");
            }

            IDataIterator validationIterator = trainer.AdditionalNameDataIterators[validationIteratorName];

            ScoreBegin(registry, resolver);

            foreach (var block in validationIterator.Yield(Operator.Handler, Operator.Sigma))
            {
                trainer.ProvideExternalInputData(network, block);
                network.Run(Operator.Handler, trainingPass: false);

                INDArray finalOutputPredictions = null;

                foreach (ILayerBuffer layerBuffer in network.YieldExternalOutputsLayerBuffers())
                {
                    foreach (string outputAlias in layerBuffer.ExternalOutputs)
                    {
                        if (outputAlias.Equals(finalExternalOutputAlias))
                        {
                            finalOutputPredictions = Operator.Handler.ClearTrace(layerBuffer.Outputs[outputAlias].Get <INDArray>(activationsAlias));

                            goto FoundOutput;
                        }
                    }
                    ;
                }

                throw new InvalidOperationException($"Cannot find final output with alias \"{finalExternalOutputAlias}\" in the current network (but is required to score validation).");

FoundOutput:
                ScoreIntermediate(finalOutputPredictions, block[targetsAlias], Operator.Handler);
            }

            ScoreEnd(registry, resolver);
        }
コード例 #13
0
        /// <returns></returns>
        public static List <ICommand> GetDiffCommands(string sourcePath, string targetPath, CollisionBehavior collisionBehavior = CollisionBehavior.Undefined)
        {
            var sourceManager = Factory.Instance.GetSourceDataManager();
            var targetManager = Factory.Instance.GetTargetDataManager();

            sourceManager.SerializationPath = sourcePath;
            targetManager.SerializationPath = targetPath;

            IDataIterator sourceDataIterator = sourceManager.ItemIterator ?? new EmptyIterator();
            IDataIterator targetDataIterator = targetManager.ItemIterator;

            var commands = GetCommands(sourceDataIterator, targetDataIterator);
            var engine   = new DataEngine();

            engine.ProcessCommands(ref commands);
            return(commands);
        }
コード例 #14
0
        public static void TimingTest <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
        {
            string name = "TimingTest " + arr.GetType().Name + "-" + iter.GetType().Name;

            var  s1  = Stopwatch.StartNew();
            long len = arr.Length;

            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                arr[i] = iter.GetNext();
            }
            Debug.WriteLine(name + "\tw=" + s1.ElapsedMilliseconds);
            iter.Reset();
            for (long i = 0; i < len; i++)
            {
                Assert.IsTrue(iter.AreEqual(arr[i], iter.GetNext()));
            }
            Debug.WriteLine(name + "\tt=" + s1.ElapsedMilliseconds);
        }
コード例 #15
0
        public static List <ICommand> GetDiffCommands(string sourcePath, string targetPath, CollisionBehavior collisionBehavior = CollisionBehavior.Undefined)
        {
            var targetManager = Factory.Instance.GetSourceDataManager();
            var sourceManager = Factory.Instance.GetTargetDataManager();

            sourceManager.SerializationPath = sourcePath;
            targetManager.SerializationPath = targetPath;

            IDataIterator sourceDataIterator = sourceManager.ItemIterator;
            IDataIterator targetDataIterator = targetManager.ItemIterator;

            var engine = new DataEngine();

            var commands = new List <ICommand>();

            commands.AddRange(GenerateDiff(sourceDataIterator, targetDataIterator));
            //if an item is found to be deleted AND added, we can be sure it's a move
            var deleteCommands         = commands.OfType <DeleteItemCommand>();
            var shouldBeUpdateCommands =
                commands.OfType <AddItemCommand>()
                .Select(a => new
            {
                Added   = a,
                Deleted = deleteCommands.FirstOrDefault(d => d.ItemID == a.ItemID)
            }).Where(u => u.Deleted != null).ToList();

            foreach (var command in shouldBeUpdateCommands)
            {
                commands.AddRange(command.Deleted.GenerateUpdateCommand(command.Added));
                commands.Remove(command.Added);
                commands.Remove(command.Deleted);
                //now, this one is an assumption, but would go wrong without the assumption anyway: this assumption is in fact safer
                //if the itempath of a delete command starts with this delete command, it will be moved along to the new node, not deleted, just leave it alone
                commands.RemoveAll(c => c is DeleteItemCommand && ((DeleteItemCommand)c).ItemPath.StartsWith(command.Deleted.ItemPath));
            }

            commands.ForEach(_ => _.CollisionBehavior = collisionBehavior);

            engine.ProcessCommands(ref commands);
            return(commands);
        }
コード例 #16
0
        private static HashSet <string> GetItemIDs(string path)
        {
            var itemIDs = new HashSet <string>();

            if (string.IsNullOrEmpty(path))
            {
                return(itemIDs);
            }

            var dataManager = Factory.Instance.GetTargetDataManager();

            dataManager.SerializationPath = path;
            IDataIterator dataIterator = dataManager.ItemIterator;

            var item = dataIterator.Next();

            while (item != null && item is QuickContentDataItem)
            {
                itemIDs.Add((item as QuickContentDataItem).ItemID);
                item = dataIterator.Next();
            }

            return(itemIDs);
        }
コード例 #17
0
 public static void ReadWriteRandom <T>(ITitanicArray <T> arr, IDataIterator <T> iter)
 {
     WriteRandom(arr, iter);
     ReadAndTestRandom(arr, iter);
 }