public override NeuTreeCB Run(IBlackBoard _blackboard)
    {
        blackboard = new Blackboard ();

        NeuTreeCB answer = new NeuTreeCB();
        answer.blackboard = blackboard;
        blackboard.Project(_blackboard);
        NeuTreeCB lowerAnswer = new NeuTreeCB ();
        for (int i = 0; i < lowerNodes.Count; i++) {
            lowerAnswer = lowerNodes[i].Run(blackboard);
            float fv = lowerAnswer.fireVal;
            if(lowerAnswer.replyFire == ReplyFire.Fail){
                answer.replyFire = ReplyFire.Fail;
                return answer;
            }
            else{
        //				for (int p = 0; p < lowerAnswer.blackboard.baseElementsPriority.Length; p++) {
        //					Debug.Log("before Lower AND Pririty "+lowerAnswer.blackboard.baseElementsPriority[p]);
        //				}
        //				for (int p = 0; p < blackboard.baseElementsPriority.Length; p++) {
        //					Debug.Log("before AND Pririty "+blackboard.baseElementsPriority[p]);
        //				}
                blackboard.Blend(lowerAnswer.blackboard, 1.0f);
        //				for (int p = 0; p < blackboard.baseElementsPriority.Length; p++) {
        //					Debug.Log("AND Pririty "+blackboard.baseElementsPriority[p]);
        //				}
            }
        }
        answer.replyFire = ReplyFire.Success;
        //		Debug.Log ("AND operator answer "+answer.replyFire);
        return answer;
    }
    public IEnumerator AICoroutine()
    {
        while (true) {
            NeuTreeCB lowerAnswer = new NeuTreeCB();
            //clear blackboard
            blackboard.baseElementsPriority = new float[blackboard.baseElements.Count];
            blackboard.activityElementsPriority = new float[blackboard.activeElements.Count];
            for (int i = 0; i < blackboard.functions.Count; i++) {
                blackboard.functions[i].val = 0.0f;
            }

            for (int i = 0; i < lowerNodes.Count; i++) {
                lowerAnswer = lowerNodes[i].Run(blackboard);

            }
            // temporary call of movement function for the test
            if(blackboard.subject.functionsDict.ContainsKey(FunctionType.Movement)){
                List <BaseElement> bes = new List<BaseElement>();
                for (int i = 0; i < bestVal._outputList.Count; i++) {
                    BaseElement trg = ElementsManager.inst.GetElement(bestVal._outputList[i].id);
                    if(trg != null){
                        bes.Add(trg);
                    }
                }
                blackboard.subject.functionsDict[FunctionType.Movement].Process(bes);
            }

            yield return new WaitForSeconds (refreshRate);
        }
    }
    public override NeuTreeCB Run(IBlackBoard _blackboard)
    {
        blackboard = new Blackboard ();

        NeuTreeCB answer = new NeuTreeCB();
        answer.blackboard = blackboard;
        blackboard.Project(_blackboard);
        NeuTreeCB lowerAnswer = new NeuTreeCB ();
        blackboard.GetFunction(functionType).val += 1.0f * inputThreshold;
        answer.replyFire = ReplyFire.Success;
        return answer;
    }
    public override NeuTreeCB Run(IBlackBoard _blackboard)
    {
        blackboard = new Blackboard ();

        NeuTreeCB answer = new NeuTreeCB();
        answer.blackboard = blackboard;
        blackboard.Project(_blackboard);
        NeuTreeCB lowerAnswer = new NeuTreeCB ();

        float nomDist = Mathf.ClosestPowerOfTwo(blackboard.subject.elProperties[PropertyType.Range].val);
        bool success = false;
        float thresholld = 0.01f;
        if (upperNode != null)
            thresholld = upperNode.inputThreshold;

        Debug.Log ("Checking distance of " + blackboard.functionStimuls[FunctionType.Movement].Keys.Count);
        List <int> el = new List<int> (blackboard.functionStimuls[FunctionType.Movement].Keys);

        for (int i = 0; i < el.Count; i++) {
            float dist  = Vector3.Magnitude(ElementsManager.gameElements[el[i]].transform.position - blackboard.subject.transform.position) / nomDist;

            Debug.Log("element id "+el[i]+" didtance to element "+dist+" threshold value "+thresholld);

            if(dist <= thresholld){
                blackboard.functionStimuls[FunctionType.Movement][el[i]] = 1 - dist;
                success = true;
            }
        }

        //		for (int p = 0; p < blackboard.baseElementsPriority.Length; p++) {
        //			Debug.Log("Distance Pririty "+blackboard.baseElementsPriority[p]);
        //		}

        if(!success){
            answer.replyFire = ReplyFire.Fail;
        }
        else{
            answer.replyFire = ReplyFire.Success;
        }
        //		Debug.Log ("Diastance filter answer "+answer.replyFire);
        return answer;
    }
 public override NeuTreeCB Run(IBlackBoard _blackboard)
 {
     NeuTreeCB answer = new NeuTreeCB();
     answer.blackboard = blackboard;
     blackboard.Project(_blackboard);
     NeuTreeCB lowerAnswer = new NeuTreeCB ();
     for (int i = 0; i < lowerNodes.Count; i++) {
         lowerAnswer = lowerNodes[i].Run(blackboard);
         float fv = lowerAnswer.fireVal;
         if(fv < inputThreshold){
             answer.replyFire = ReplyFire.Fail;
             return answer;
         }
         else{
             blackboard.Blend(lowerAnswer.blackboard, 1.0f);
         }
     }
     answer.replyFire = ReplyFire.Success;
     return answer;
 }
    public override NeuTreeCB Run(IBlackBoard _blackboard)
    {
        blackboard = new Blackboard ();

        NeuTreeCB answer = new NeuTreeCB();
        answer.blackboard = blackboard;
        blackboard.Project(_blackboard);
        NeuTreeCB lowerAnswer = new NeuTreeCB ();

        float nomDist = Mathf.ClosestPowerOfTwo(blackboard.subject.elProperties[PropertyType.Range].val);
        bool success = false;
        float thresholld = 0.01f;
        if (upperNode != null)
            thresholld = upperNode.inputThreshold;
        for (int i = 0; i < blackboard.baseElements.Count; i++) {
            float dist  = Vector3.Magnitude(blackboard.baseElements[i].transform.position - blackboard.subject.transform.position) / nomDist;
            //			Debug.Log(blackboard.baseElements[i].gameObject.name+" "+dist+" "+thresholld);
            if(dist <= thresholld){
                blackboard.baseElementsPriority[i] = 1 - dist;
                success = true;
            }
        }

        //		for (int p = 0; p < blackboard.baseElementsPriority.Length; p++) {
        //			Debug.Log("Distance Pririty "+blackboard.baseElementsPriority[p]);
        //		}

        if(!success){
            answer.replyFire = ReplyFire.Fail;
        }
        else{
            answer.replyFire = ReplyFire.Success;
        }
        //		Debug.Log ("Diastance filter answer "+answer.replyFire);
        return answer;
    }