Exemplo n.º 1
0
    public void DeployTrain(LineTask lt)
    {
        var action = new DeployTrainAction(factory);

        action.Act(lt);
        Actions.AddLast(action);
    }
Exemplo n.º 2
0
    /**
     * 前の駅から次の駅までの距離をタスク距離合計とする
     * 乗車プラットフォーム => 発車タスク => 到着プラットフォームとする
     */
    private void Scan()
    {
        var f = Finders[FinderIdx];
        var l = storage.List <RailLine>()[RailLineIdx];
        // 各発車タスクを始発とし、電車で到達可能なプラットフォームを登録する
        var deptList = l.Filter(lt => lt is DeptTask);
        var dept     = deptList[DeptTaskIdx] as DeptTask;

        // 乗車タスクとホームは相互移動可能
        f.Edge(dept, dept.Stay, 0);
        f.Edge(dept.Stay, dept, 0);

        LineTask current = dept;
        var      length  = current.Length;

        do
        {
            current = current.Next;
            length += current.Length;
            if (current is DeptTask)
            {
                // Dept -> P のみ登録する
                // P -> P 接続にしてしまうと乗り換えが必要かどうか分からなくなるため
                f.Edge(dept, (current as DeptTask).Stay, length * DistRatio + RideCost, Payment(length, l));
            }
        } while (dept != current);

        DeptTaskIdx++;
        if (DeptTaskIdx == deptList.Count)
        {
            DeptTaskIdx = 0;
            RailLineIdx++;
        }
    }
Exemplo n.º 3
0
 public DeptTask(ModelStorage db, ModelListener lis, RailLine l, Platform p, LineTask lt) : base(db, lis, l, lt)
 {
     Stay = p;
     Stay.Depts.AddLast(this);
     db.Add(this);
     Queue  = new LinkedList <Human>();
     router = new RouterImpl(this);
     listener.Fire(EventType.CREATED, this);
 }
Exemplo n.º 4
0
 protected TrainTask Generate(LineTask lt, TrainTask.OnComplete fn)
 {
     if (lt is DeptTask)
     {
         return(new StayTask(listener, train, lt as DeptTask, fn));
     }
     if (lt is EdgeTask)
     {
         return(new MoveTask(train, lt as EdgeTask, fn));
     }
     throw new ArgumentException("invalid type" + lt);
 }
Exemplo n.º 5
0
    public Train NewInstance(LineTask current)
    {
        var obj = Instantiate(template);

        obj.isTemplate = false;
        obj.Passengers = new List <Human>();
        obj.router     = new RouterImpl(obj);
        obj.GetComponent <SpriteRenderer>().enabled = true;
        obj.executor           = new TrainExecutor(listener, obj, current);
        obj.transform.position = obj.executor.Position;
        listener.Fire(EventType.CREATED, obj);
        return(obj);
    }
Exemplo n.º 6
0
        /// <summary>
        /// Processes a list in parallel after dividing it in taskCount even regions
        /// </summary>
        /// <typeparam name="TInput"></typeparam>
        /// <typeparam name="TOutput"></typeparam>
        /// <param name="input"></param>
        /// <param name="output"></param>
        /// <param name="processingAction"></param>
        /// <param name="taskCount"></param>
        public static void ProcessList <TInput, TOutput>(TInput[] input, TOutput output, Action <LineTask <TInput[], TOutput> > processingAction, int taskCount)
        {
            var elementCount = input.Length / taskCount;
            var overflow     = input.Length - elementCount * taskCount;

            var tasks = new LineTask <TInput[], TOutput> [taskCount];

            for (int i = 0; i < taskCount; i++)
            {
                tasks[i] = new LineTask <TInput[], TOutput>(input, output, i * elementCount, elementCount + (i == taskCount - 1 ? overflow : 0));
            }

            Parallel.ForEach(tasks, processingAction);
        }
Exemplo n.º 7
0
    /**
     * 現在のタスクの次を指定のタスクに設定します。
     * 今ある中間タスクはすべて削除されます
     */
    public void Shrink(LineTask to)
    {
        var obj = Next;

        while (obj != to)
        {
            obj.Trains.ForEach(t => t.Skip(to));
            obj.Remove();
            obj = obj.Next;
        }
        Next    = to;
        to.Prev = this;
        listener.Fire(EventType.MODIFIED, this);
        listener.Fire(EventType.MODIFIED, to);
    }
Exemplo n.º 8
0
    /**
     * 指定された条件を満たすタスクを絞り込みます
     */
    public List <LineTask> Filter(Cond cond)
    {
        if (Top == null)
        {
            return(new List <LineTask>());
        }
        var      result  = new List <LineTask>();
        LineTask current = Top;

        do
        {
            if (cond(current))
            {
                result.Add(current);
            }
            current = current.Next;
        } while (current != Top);
        return(result);
    }
Exemplo n.º 9
0
        private void ProcessInParallel(ICollection <Point> path, Action <LineTask> process, Int32 parallelTaskCount = 4)
        {
            // checks parameters
            Guard.CheckNull(process, "process");

            // updates the palette
            UpdatePalette();

            // prepares parallel processing
            Double pointsPerTask = (1.0 * path.Count) / parallelTaskCount;

            LineTask[] lineTasks   = new LineTask[parallelTaskCount];
            Double     pointOffset = 0.0;

            // creates task for each batch of rows
            for (Int32 index = 0; index < parallelTaskCount; index++)
            {
                lineTasks[index] = new LineTask((Int32)pointOffset, (Int32)(pointOffset + pointsPerTask));
                pointOffset     += pointsPerTask;
            }

            // process the image in a parallel manner
            Parallel.ForEach(lineTasks, process);
        }
Exemplo n.º 10
0
 public Train NewTrain(LineTask lt)
 {
     return(t.NewInstance(lt));
 }
Exemplo n.º 11
0
 public LineTask(ModelStorage db, ModelListener lis, RailLine line, LineTask lt) : this(db, lis)
 {
     Parent    = line;
     Prev      = lt;
     Prev.Next = this;
 }
Exemplo n.º 12
0
 public Train Act(LineTask lt)
 {
     train = factory.NewTrain(lt);
     return(train);
 }
Exemplo n.º 13
0
        // load_items / save / search_biblio
        internal void AddTask(RegisterLine line,
            string strTaskName,
            object tag = null)
        {
            LineTask task = new LineTask();
            task.TaskName = strTaskName;
            task.Line = line;
            task.Tag = tag;
            lock (this._loadEntityTasks)
            {
                this._loadEntityTasks.Add(task);
            }

            this.ActivateThread();
        }
Exemplo n.º 14
0
 public void Skip(LineTask to)
 {
     executor.Skip(to);
     listener.Fire(EventType.MODIFIED, this);
 }
Exemplo n.º 15
0
        private void ProcessInParallel(ICollection<Point> path, Action<LineTask> process, Int32 parallelTaskCount = 4)
        {
            // checks parameters
            Guard.CheckNull(process, "process");

            // updates the palette
            UpdatePalette();

            // prepares parallel processing
            Double pointsPerTask = (1.0*path.Count)/parallelTaskCount;
            LineTask[] lineTasks = new LineTask[parallelTaskCount];
            Double pointOffset = 0.0;

            // creates task for each batch of rows
            for (Int32 index = 0; index < parallelTaskCount; index++)
            {
                lineTasks[index] = new LineTask((Int32) pointOffset, (Int32) (pointOffset + pointsPerTask));
                pointOffset += pointsPerTask;
            }

            // process the image in a parallel manner
            Parallel.ForEach(lineTasks, process);
        }
Exemplo n.º 16
0
 public void Skip(LineTask to)
 {
     Current = Generate(to, () => Next());
 }
Exemplo n.º 17
0
 public EdgeTask(ModelStorage db, ModelListener lis, RailLine l, RailEdge re, LineTask lt) : base(db, lis, l, lt)
 {
     Edge = re;
     db.Add(this);
     listener.Fire(EventType.CREATED, this);
 }
Exemplo n.º 18
0
 public TrainExecutor(ModelListener lis, Train t, LineTask lt)
 {
     listener = lis;
     train    = t;
     Current  = Generate(lt, () => Next());
 }