public void AddForeignKeyConstraint <TForeignTableKey, TForeignTable>(
            Table <TForeignTableKey, TForeignTable> foreignTable,
            Expression <Func <TRow, TForeignTableKey> > foreignKeySelector)
        {
            var ourKeySelector = foreignKeySelector.Compile();

            _constraintManager.RegisterInsertUpdateConstraint(ourRow =>
            {
                var key = ourKeySelector(ourRow);

                var foreignRecordsAtOurKey = foreignTable._clusteredIndex.Seek(SeekTarget.From(key), Retrieval.Default);

                if (!foreignRecordsAtOurKey.Any())
                {
                    throw new Exception($"Key '{key}' does not exist in foreign table");
                }
            });

            CreateIndex(foreignKeySelector);

            foreignTable._constraintManager.RegisterDeleteConstraint(theirPrimaryKey =>
            {
                var index = _indexManager.FindIndex <TForeignTableKey, IIndex <TForeignTableKey, TRow> >(foreignKeySelector).Value;
                var ourRecordsAtTheirKey = index.Seek(SeekTarget.From(theirPrimaryKey), Retrieval.Default);
                if (ourRecordsAtTheirKey.Any())
                {
                    throw new Exception($"Can't delete '{theirPrimaryKey}' as a foreign table refers to it");
                }
            });
        }
    public Action Process()
    {
        if (human.LastHitBy != null && human.Target != human.LastHitBy)
        {
            if (human.Think.CurrentAction().GetType() == typeof(Defending) || human.Think.CurrentAction().GetType() == typeof(SeekTarget))
            {
                human.Think.RemoveAction();
            }

            human.Target = human.LastHitBy.transform;
            return(human.Think.CurrentAction().GetType() != typeof(Defending) ? new Defending(human) : null);
        }

        if (FuzzyGetDesirabilityEat(human.Stats.Hunger, human.Stats.Money, human.Stats.Health) > 85 && human.Think.CurrentAction().GetType() != typeof(GoingToEat))
        {
            return(new GoingToEat(human));
        }

        if (FuzzyGetDesirabilitySeek(human.Stats.Hunger, human.Stats.Money) > 85)
        {
            if (human.Think.CurrentAction().GetType() != typeof(SeekTarget))
            {
                SeekTarget seekTarget = new SeekTarget(human);
                return(seekTarget);
            }
        }

        return(null);
    }
Beispiel #3
0
 public static IEnumerable <TRow> Pick <TKey, TRow>(SeekTarget <TKey> seekTarget, int indexSize, Func <IEnumerable <TRow> > seek, Func <IEnumerable <TRow> > scan)
 {
     //15% lifted from the literature on b+ trees, its almost certainly not right for us but this is illustrative
     return(seekTarget.Keys !.Length / (double)indexSize <= 0.15
         ? seek()
         : scan());
 }
Beispiel #4
0
 private void Start()
 {
     timer      = 0;
     seekTarget = GetComponent <SeekTarget>();
     //setting the emotional state for agents to be random on start
     //emotionalState = (EmotionalStates)UnityEngine.Random.Range(0, System.Enum.GetValues(typeof(EmotionalStates)).Length);
 }
 private IEnumerable <TRow> RangedScan(SeekTarget <TIndexKey> seekTarget, bool reverse)
 {
     return(_map.Range(seekTarget.Min, seekTarget.Max, reverse)
            .Where(d => seekTarget.Contains(d.Key))
            .SelectMany(group => group.Value.GetItems(false)
                        .Select(r => r.Row)));
 }
Beispiel #6
0
        public IEnumerable <TRow> Seek(SeekTarget <TIndexKey> seekTarget, Retrieval retrieval)
        {
            seekTarget.Prepare(_map.KeyComparer, retrieval);

            return(QueryAnalyser.Pick(seekTarget, _map.Count,
                                      () => _map.SeekMany(seekTarget.Keys !).Select(s => s.Value.Row),
                                      () => RangedScan(seekTarget, retrieval.Reverse)));
        }
Beispiel #7
0
 // Start is called before the first frame update
 void Start()
 {
     wander = GetComponent <SteeringWander>();
     seek   = GetComponent <SeekTarget>();
     shoot  = GetComponent <Shoot>();
     patrol = GetComponent <PatrolAgent>();
     flee   = GetComponent <Flee>();
 }
        public IEnumerable <TRow> Seek(SeekTarget <TIndexKey> seekTarget, Retrieval retrieval)
        {
            seekTarget.Prepare(_map.KeyComparer, retrieval);

            return(QueryAnalyser.Pick(seekTarget, _map.Count,
                                      () => TrueSeek(seekTarget),
                                      () => RangedScan(seekTarget, retrieval.Reverse)));
        }
Beispiel #9
0
        public IEnumerable <TOut> QueryWithIndexSeek <TPredicateKey, TOut>(
            Expression <Func <TRow, TPredicateKey> > indexSelector,
            Func <TRow, TOut> select,
            IEnumerable <TPredicateKey> fromKeys,
            int?skip     = null,
            int?take     = null,
            bool reverse = false)
        {
            var index = _indexManager.FindIndex(indexSelector);

            if (!index.HasValue)
            {
                throw new Exception($"No index registered for key: '{Expressions.GetMemberName(indexSelector)}'");
            }

            return(index.Value.Seek(SeekTarget.From(fromKeys), new Retrieval(skip, take, reverse))
                   .Select(select)
                   .ToArray()
                   .AsEnumerable());
        }
Beispiel #10
0
        private void InitFSMSystem()
        {
            fsm = new FsmSystem();

            SeekTarget seekTarget = new SeekTarget(this, fsm, anim);

            seekTarget.AddTransition(Transition.MoveToTarget, StateID.MoveToTarget);
            seekTarget.AddTransition(Transition.Attack, StateID.Attack);

            MoveToTarget moveToTarget = new MoveToTarget(this, fsm, anim);

            moveToTarget.AddTransition(Transition.SeekTarget, StateID.SeekTarget);
            moveToTarget.AddTransition(Transition.Attack, StateID.Attack);

            AttackTarget attackTarget = new AttackTarget(this, fsm, anim);

            attackTarget.AddTransition(Transition.SeekTarget, StateID.SeekTarget);
            attackTarget.AddTransition(Transition.MoveToTarget, StateID.MoveToTarget);

            fsm.AddState(seekTarget);
            fsm.AddState(moveToTarget);
            fsm.AddState(attackTarget);
        }
Beispiel #11
0
 private IEnumerable <TRow> RangedScan(SeekTarget <TIndexKey> seekTarget, bool reverse)
 {
     return(_map.Range(seekTarget.Min, seekTarget.Max, reverse)
            .Where(d => seekTarget.Contains(d.Key))
            .Select(d => d.Value.Row));
 }
 private IEnumerable <TRow> TrueSeek(SeekTarget <TIndexKey> seekTarget)
 => _map.SeekMany(seekTarget.Keys !)