/// <summary> /// Searches for the shortest path to the point by propagating given waves. /// </summary> /// <typeparam name="TWave">Type of waves to use (e.g. <see cref="Wave"/>).</typeparam> /// <param name="tracer">Tracer to search with.</param> /// <param name="initial">Initial set of waves to propagate (e.g. <see cref="Initialize4x2D{TWave}"/>).</param> /// <param name="to">Location to reach.</param> /// <param name="map">Map to navigate (e.g. <see cref="GridMap"/>); if left null, <see cref="Tracer{TWave}.DefaultMap"/> will be used.</param> /// <returns>List of waypoints.</returns> /// <exception cref="ArgumentNullException">Thrown if both <paramref name="map"/> parameter and <see cref="Tracer{TWave}.DefaultMap"/> field are null.</exception> public static IReadOnlyList <Vector3> FindShortestPath <TWave>( this Tracer <TWave> tracer, IInitializationStrategy <TWave> initial, Vector3 to, IMap <TWave> map = null) where TWave : IWave, IWaveBehaviour <TWave> { if (map == null && tracer.DefaultMap == null) { throw new ArgumentNullException(nameof(map), "ECHO: Either [map] parameter or [Tracer.DefaultMap] field must not be null."); } map = map ?? tracer.DefaultMap; var queue = new PriorityQueue <TWave>( new PriorityByEstimatedPathLength <TWave>(to, map), new PriorityByAlignment <TWave>(to)); var wave = tracer.Search(initial, map, queue).FirstOrDefault(); return(wave?.FullPath); }
public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy, Action<IPersistenceValidationContext> initializationAction) { var adoPersister = new global::NHibernateContext.ADOPersister.ADOPersister(NHibernateSessionManager); var actualInitializationStrategy = initializationStrategy ?? DefaultInitializationStrategy(adoPersister); var actualInitializationAction = initializationAction ?? DefaultInitializationAction(); var persistenceValidationContext = new PersistenceValidationContext(actualInitializationStrategy); actualInitializationAction.Invoke(persistenceValidationContext); persistenceValidationContext.EnsureNotEmpty(); adoPersister.Apply(persistenceValidationContext); return adoPersister; }
public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy, Action <IPersistenceValidationContext> initializationAction) { var adoPersister = new global::NHibernateContext.ADOPersister.ADOPersister(NHibernateSessionManager); var actualInitializationStrategy = initializationStrategy ?? DefaultInitializationStrategy(adoPersister); var actualInitializationAction = initializationAction ?? DefaultInitializationAction(); var persistenceValidationContext = new PersistenceValidationContext(actualInitializationStrategy); actualInitializationAction.Invoke(persistenceValidationContext); persistenceValidationContext.EnsureNotEmpty(); adoPersister.Apply(persistenceValidationContext); return(adoPersister); }
public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy) { return CreateADOPersister(initializationStrategy, null); }
public PersistenceValidationContext(IInitializationStrategy initializationStrategy) { PersistenceValidatorsMap = new Dictionary <Type, Type>(); InitializationStrategy = initializationStrategy; }
/// <summary> /// Initiates searching routine. /// </summary> /// <param name="initial">Initial set of waves to propagate (e.g. <see cref="Initialize4x2D{TWave}"/>).</param> /// <param name="map">Map to navigate (e.g. <see cref="GridMap"/>).</param> /// <param name="queue">Queue to store and order waves between iterations (e.g. <see cref="QueueAdapter{TWave}"/>).</param> /// <returns>Waves that satisfy their respective <see cref="IWaveBehaviour{TWave}.AcceptanceCondition"/>.</returns> /// <exception cref="ArgumentNullException">Thrown if both <paramref name="map"/> and <see cref="DefaultMap"/> are nulls, or <paramref name="initial"/> is null.</exception> public IEnumerable <TWave> Search(IInitializationStrategy <TWave> initial, IMap <TWave> map, IProcessingQueue <TWave> queue) { _iterations = 0; _waves = 0; map = map ?? DefaultMap; queue = queue ?? DefaultProcessingQueue; { var errors = new List <string>(2); if (map == null) { errors.Add(nameof(map)); } if (initial == null) { errors.Add(nameof(initial)); } if (errors.Count > 0) { throw new ArgumentNullException(string.Join(", ", errors)); } } if (queue == null) { queue = new QueueAdapter <TWave>(); Debug.WriteLine("ECHO: Processing queue is not set. QueueAdapter<" + nameof(TWave) + "> (breadth-first search) will be used."); } else { queue.Clear(); } { var waves = initial.Execute(); if (waves == null || waves.Length == 0) { yield break; } for (int i = 0; i < waves.Length; i++) { queue.Enqueue(waves[i]); } } while (queue.Count > 0) { var wave = queue.Dequeue(); _iterations++; _waves = queue.Count; Debug.WriteLine($"ECHO: iteration {_iterations}, waves {_waves}, processing {wave};"); Vector3 location; if (!map.Navigate(wave, out location)) { continue; } wave.Relocate(location); wave.Update?.Execute(wave); if (wave.FadeCondition?.Check(wave) == true) { continue; } if (wave.AcceptanceCondition?.Check(wave) == true) { yield return(wave); continue; } var waves = wave.Propagation?.Execute(wave); if (waves != null) { for (var i = 0; i < waves.Length; i++) { if (waves[i] == null) { continue; } queue.Enqueue(waves[i]); } } queue.Enqueue(wave); } }
public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy) { return(CreateADOPersister(initializationStrategy, null)); }