Esempio n. 1
0
    private void Awake()
    {
        _nComponents             = 5;
        _voxelSize               = 0.375f;
        _existingParts           = new List <Part>();
        _agents                  = new List <ConfigurablePartAgent>();
        _spaces                  = new List <PPSpace>();
        _boundaries              = new List <Voxel>();
        _tenants                 = new List <Tenant>();
        _spaceRequests           = new List <PPSpaceRequest>();
        _reconfigurationRequests = new List <ReconfigurationRequest>();

        _activeRequest = null;

        _hourStep = 0.05f;
        _hour     = 8;

        InitializedAgents  = 0;
        _showDebug         = true;
        _compiledMessage   = new string[2];
        _showRawBoundaries = false;
        _showSpaces        = true;
        _showSpaceData     = false;
        _showVoxels        = false;
        _activityLog       = "";
        _timePause         = true;

        //_regularBorder = Resources.Load<Sprite>("Textures/RectangularBorder");
        //_activeBorder = Resources.Load<Sprite>("Textures/RectangularBorder_Active");

        _cam = Camera.main;
    }
Esempio n. 2
0
    /// <summary>
    /// Sets one of the existing spaces to be reconfigured
    /// </summary>
    protected virtual void SetRandomSpaceToReconfigure(int areaDirection, int connectivityDirection)
    {
        PPSpace space        = new PPSpace();
        bool    validRequest = false;

        while (!validRequest)
        {
            UnityEngine.Random.InitState(System.DateTime.Now.Millisecond);
            int i = UnityEngine.Random.Range(0, _spaces.Count);
            space = _spaces[i];

            if (space.BoundaryParts.Count > 0 && !space.IsSpare)
            {
                validRequest = true;
            }
        }

        //Set area to be increased
        ReconfigurationRequest rr = new ReconfigurationRequest(space, areaDirection, connectivityDirection);

        _reconfigurationRequests = new List <ReconfigurationRequest>();
        _reconfigurationRequests.Add(rr);

        //Start requesting the first action
        //rr.RequestNextAction();
    }
        public bool EvaluateReconfiguration(ReconfigurationRequest request)
        {
            //Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Avaliando a reconfiguração");
            lock (thisLock) {
                if (!reconfiguring)
                {
                    this.reconfiguring = true;
                    this.evaluations   = SecurityAnalyzer.Evaluate(request, unit);

                    if (SecurityAnalyzer.isDeadlockFree(evaluations, unit))
                    {
                        this.request = request;
                        return(true);
                    }
                    else
                    {
                        this.evaluations   = null;
                        this.reconfiguring = false;
                        return(false);
                    }
                }
                else
                {
                    throw new Exception("Já existe uma reconfiguração em andamento. " +
                                        " Esta deverá ser confirmada ou cancelada antes de nova submissão.");
                }
            }
            //Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Avaliação Finalizada");
        }
 public void CancelReconfiguration()
 {
     lock (thisLock) {
         this.reconfiguring = false;
         this.evaluations   = null;
         this.request       = null;
     }
 }
Esempio n. 5
0
    /// <summary>
    /// Checks if the reconfiguration subject of a request is still valid or has been destroyed
    /// </summary>
    /// <param name="request">The request to be assessed</param>
    /// <returns>An integer representing the result of the action
    /// 0 = valid;
    /// 1 = successful;
    /// 2 = destroyed the space</returns>
    public int CheckResultFromRequest(ReconfigurationRequest request)
    {
        int  result     = 1;
        Guid spaceId    = request.SpaceId;
        int  checkCount = _spaces.Count(s => s.SpaceId == spaceId);

        if (checkCount == 1)
        {
            PPSpace space = MainGrid.GetSpaceById(spaceId);
            if (space != null)
            {
                //Space still exists, evaluate if reconfiguration was successful
                bool success = request.ReconfigurationSuccessful(space);
                request.CurrentIndices = space.Indices.ToArray();
                if (success)
                {
                    _reconfigurationRequests.Remove(request);
                }
                else
                {
                    result = 0;
                }
                space.Reconfigure_Area         = false;
                space.Reconfigure_Connectivity = false;
                _reconfigurationRequests.Remove(request);
            }
        }
        else if (checkCount > 1)
        {
            //Space was destroyed and split into 2 or more. Differentiate new spaces
            foreach (var space in _spaces.Where(s => s.SpaceId == spaceId))
            {
                space.SpaceId                  = Guid.NewGuid();
                space.Reconfigure_Area         = false;
                space.Reconfigure_Connectivity = false;
            }
            _reconfigurationRequests.Remove(request);
            result = 2;
        }
        else
        {
            //Space was destroyed, return false
            _reconfigurationRequests.Remove(request);
            result = 2;
        }

        return(result);
    }
        public bool EvaluateReconfiguration(string xmlRequest)
        {
            Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Iniciando avaliação da reconfiguração...");
            ReconfigurationRequest r = loader.loadRequest(xmlRequest, application);

            if (r.StructuralRequest != null)
            {
                Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Identificando os componentes impactos...");
                r.StructuralRequest.GenerateChanges(application);
            }

            //Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Requisição construída a partir do arquivo: " + xmlRequest);
            bool result = EvaluateReconfiguration(r);

            Console.WriteLine("[ConfigurationManager.EvaluateReconfiguration] Avaliação Concluída!");
            Console.WriteLine("");
            return(result);
        }
Esempio n. 7
0
    /// <summary>
    /// Sets one of the existing spaces to be reconfigured.
    /// This overriden method replaces the behaviour brain according to the type of request
    /// </summary>
    protected override void SetRandomSpaceToReconfigure(int areaDirection, int connectivityDirection)
    {
        PPSpace space        = new PPSpace();
        bool    validRequest = false;

        while (!validRequest)
        {
            UnityEngine.Random.InitState(System.DateTime.Now.Millisecond);
            int i = UnityEngine.Random.Range(0, _spaces.Count);
            space = _spaces[i];

            if (space.BoundaryParts.Count > 0 && !space.IsSpare)
            {
                validRequest = true;
            }
        }

        //Create the reconfiguration request
        ReconfigurationRequest rr = new ReconfigurationRequest(space, areaDirection, connectivityDirection);

        _reconfigurationRequests = new List <ReconfigurationRequest>();
        _reconfigurationRequests.Add(rr);
    }
Esempio n. 8
0
    /// <summary>
    /// Resets the grid after the an Episode is concluded
    /// </summary>
    public void ResetGrid(ReconfigurationRequest request, bool success)
    {
        _completedIndices = request.CurrentIndices;
        _showCompleted    = true;
        if (success)
        {
            _completedColor = Color.green;
        }
        else
        {
            _completedColor = Color.red;
        }

        //StartCoroutine(AnimateCompletionAndRestart());

        MainGrid.RestartGrid();
        _spaces     = MainGrid.Spaces;
        _boundaries = MainGrid.Boundaries;
        foreach (ConfigurablePartAgent partAgent in _existingParts.OfType <ConfigurablePart>().Select(p => p.CPAgent))
        {
            partAgent.EndEpisode();
        }
    }
Esempio n. 9
0
        public ReconfigurationRequest loadRequest(string xml, MetaHashComponent component)
        {
            ReconfigurationRequest request = null;

            Console.WriteLine("[XmlLoader.loadRequest] Iniciando carga de script de reconfiguração... ");

            if (true /*validator.IsValid (REQUEST_XSD, xml)*/)
            {
                clear();
                generator.setInitialCode(component.LastIdCode);

                request = new ReconfigurationRequest();
                XmlDocument document = new XmlDocument();
                XmlNode     nodeRequest, data;

                document.Load(xml);
                nodeRequest = document.SelectSingleNode("reconfigurationRequest");

                data = nodeRequest.SelectSingleNode("targetComponent");
                request.TargetComponent = data.InnerText;

                //Console.WriteLine("[XmlLoader.LoadRequest] Obtendo componente alvo {0}", request.TargetComponent);

                List <MetaParameter> parameterList                 = uLoader.getParameters(nodeRequest.SelectNodes("parameter"));

                if (parameterList != null)
                {
                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando as reconfigurações estruturais...");
                    request.StructuralRequest = new StructuralReconfigurationRequest(parameterList);
                }

                BehavioralReconfigurationRequest behavioralRequest = null;

                List <MetaInnerComponent> innerComponents          = generateInnerComponents(nodeRequest.SelectNodes("innerComponent"));
                //Console.WriteLine("[XmlLoader.LoadRequest] Tem innerComponent para adicionar? {0}", innerComponents != null);
                if (innerComponents != null)
                {
                    behavioralRequest = new BehavioralReconfigurationRequest();

                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando novos componentes aninhados...");
                    //Console.WriteLine("[XmlLoader.LoadRequest] {0} InnerComponent(s) adicionado(s)", innerComponents.Count);
                    behavioralRequest.NewInnerComponents = innerComponents;
                    uLoader.CandidateInnerComponents     = innerComponents;
                }

                uLoader.InnerComponents = innerComponents;
                XmlNodeList changeActionList                       = nodeRequest.SelectNodes("changeAction");

                if (changeActionList != null)
                {
                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando as reconfigurações comportamentais...");
                    IEnumerator      ienum = changeActionList.GetEnumerator();
                    BehavioralChange change;
                    XmlNode          changeNode;

                    if (behavioralRequest == null)
                    {
                        behavioralRequest = new BehavioralReconfigurationRequest();
                    }

                    XmlAttribute attr;
                    int          initialCode;
                    int          aditionalStates, aditionalTrans;
                    aditionalStates = aditionalTrans = 0;
                    while (ienum.MoveNext())
                    {
                        changeNode = (XmlNode)ienum.Current;

                        change = new BehavioralChange();
                        //Console.WriteLine("[XmlLoader.LoadRequest] Criando uma nova BehavioralChange");
                        initialCode = generator.getCurrentCode();

                        attr        = (XmlAttribute)changeNode.Attributes.GetNamedItem("unit");
                        change.Unit = attr.Value;
                        //Console.WriteLine("[XmlLoader.LoadRequest] Unit a sofrer alteração: {0}", change.Unit);

                        MetaUnit u = component.Units[change.Unit];

                        if (u != null)
                        {
                            //Console.WriteLine("[XmlLoader.LoadRequest] Unit {0} encontrada!", change.Unit);

                            attr          = (XmlAttribute)changeNode.Attributes.GetNamedItem("action");
                            change.Action = attr.Value;
                            //Console.WriteLine("[XmlLoader.LoadRequest] Ação a sofrer alteração: {0}", change.Action);
                            MetaAction a = u.Actions[change.Action];

                            if (a != null && !a.IsNative)
                            {
                                //Console.WriteLine("[XmlLoader.LoadRequest] Ação {0} encontrada!", change.Action);
                                attr = (XmlAttribute)changeNode.Attributes.GetNamedItem("type");
                                if (attr.Value.Equals("remove"))
                                {
                                    change.Type = BehavioralChange.BehavioralChangeType.REMOVE;
                                }
                                else
                                {
                                    change.Type = BehavioralChange.BehavioralChangeType.INCLUDE;
                                }

                                attr         = (XmlAttribute)changeNode.Attributes.GetNamedItem("point");
                                change.Point = attr.Value;

                                //Console.WriteLine("[XmlLoader.LoadRequest] Ponto a sofrer alteração: {0}", change.Point);
                                Transition t = a.Protocol.getTransition(change.Point);

                                if (t != null)
                                {
                                    //Console.WriteLine("[XmlLoader.LoadRequest] Ponto {0} encontrado.", change.Point);
                                    change.NewSlices        = uLoader.getSlices(changeNode.SelectNodes("slice"));
                                    uLoader.CandidateSlices = change.NewSlices;

                                    if (change.Type == BehavioralChange.BehavioralChangeType.INCLUDE)
                                    {
                                        //Console.WriteLine("[XmlLoader.LoadRequest] Obtendo novo protocolo");
                                        change.Transitions = uLoader.getTransitions(changeNode.SelectSingleNode("protocol").FirstChild, u, t.InitialState, t.FinalState, a.Protocol.NumStates + aditionalStates, a.Protocol.LastTransationId + aditionalTrans);

                                        aditionalStates = uLoader.NumStates - a.Protocol.NumStates;
                                        aditionalTrans  = uLoader.NumTransations - a.Protocol.LastTransationId;
                                        //TODO remover
                                        //Console.WriteLine("Transações de reconfiguração");
                                        //foreach(Transition tst in change.Transitions) {
                                        //	Console.WriteLine(tst);
                                        //}
                                    }
                                    else
                                    {
                                        change.Transitions = new List <Transition>();
                                        change.Transitions.Add(new Transition(t.InitialState, t.FinalState, Configuration.LAMBDA_TRANSITION, a.Protocol.LastTransationId++));
                                    }
                                }
                                else
                                {
                                    throw new Exception("[XmlLoader.loadRequest] Ponto de reconfiguração não existe: " + change.Point);
                                }
                            }
                            else
                            {
                                throw new Exception("[XmlLoader.loadRequest] Ação a ser alterada não existe ou nãoo é uma configuração: " + change.Action);
                            }
                        }
                        else
                        {
                            throw new Exception("[XmlLoader.loadRequest] Unidade da ação a ser alterada não existe: " + change.Unit);
                        }

                        change.AditionalStates = generator.getCurrentCode() - initialCode;
                        behavioralRequest.AddChange(change);
                    }
                }

                request.BehavioralRequest = behavioralRequest;
                component.LastIdCode      = generator.getCurrentCode();
            }

            uLoader.CandidateSlices          = null;
            uLoader.CandidateInnerComponents = null;

            Console.WriteLine("[XmlLoader.loadRequest] Carga de script realizada com sucesso!");
            return(request);
        }
Esempio n. 10
0
    /// <summary>
    /// Check if there are enough requests to initialize reconfiguration. If so, pauses simulation
    /// and tells the agents to store their current positions
    /// </summary>
    protected override void CheckForReconfiguration()
    {
        //If the space count (of non-spare spaces) is 0, restart the position of every other part
        if (_spaces.Where(s => !s.IsSpare).Count() == 1)
        {
            for (int i = 0; i < _agents.Count; i++)
            {
                if (i % 2 == 0)
                {
                    ConfigurablePart part = _agents[i].GetPart();
                    int  attempt          = 0;
                    bool success          = false;
                    foreach (var index in part.OccupiedIndexes)
                    {
                        var voxel = MainGrid.Voxels[index.x, index.y, index.z];
                        voxel.IsOccupied = false;
                        voxel.Part       = null;
                    }
                    while (!success)
                    {
                        part.JumpToNewPosition(PopSeed + attempt, out success);
                        attempt++;
                    }
                }
            }

            FinilizeReconfiguration();
            _activeRequest = null;
            foreach (var agent in _agents)
            {
                agent.FreezeAgent();
                agent.ClearRequest();
            }
            ResetSpacesEvaluation();
        }

        //If all ok, continue checking for reconfiguration
        else if (_spaces.Count(s => s.Reconfigure) > 0)
        {
            _timePause = true;
            //Get only the first one and only create one type of request.
            var toReconfigure = _spaces.Where(s => s.Reconfigure).ToList();
            var target        = toReconfigure[0];
            if (target.Reconfigure_Area)
            {
                //SetAreaModel();
                int targetArea = 1;
                if (target._areaDecrease > target._areaIncrease)
                {
                    targetArea = -1;
                }

                ReconfigurationRequest rr = new ReconfigurationRequest(target, targetArea, 0);
                _activeRequest = rr;
                //_reconfigurationRequests.Add(rr);
            }
            else if (target.Reconfigure_Connectivity)
            {
                //SetConnectivityModel();
                int targetConnec = 1;
                if (target._connectivityDecrease > target._connectivityIncrease)
                {
                    targetConnec = -1;
                }

                ReconfigurationRequest rr = new ReconfigurationRequest(target, 0, targetConnec);
                _activeRequest = rr;
                //_reconfigurationRequests.Add(rr);
            }

            var spaces = _spaces.Where(s => s.Reconfigure).ToList();
            for (int i = 1; i < _spaces.Count(s => s.Reconfigure); i++)
            {
                PPSpace space = spaces[i];
                space.ResetAreaEvaluation();
                space.ResetConnectivityEvaluation();
                space.TimesSurvived = 0;
                space.TimesUsed     = 0;
            }
        }
    }
Esempio n. 11
0
    private void Update()
    {
        if (_showVoxels)
        {
            DrawState();
        }

        if (_showRawBoundaries)
        {
            DrawBoundaries();
        }

        if (_showSpaces)
        {
            DrawSpaces();
        }

        #region Control inputs

        if (Input.GetKeyDown(KeyCode.V))
        {
            _showVoxels = !_showVoxels;
            SetGameObjectsVisibility(_showVoxels);
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            _showRawBoundaries = !_showRawBoundaries;
        }

        //Slow down simulation
        //if (Input.GetKeyDown(KeyCode.KeypadMinus))
        //{
        //    _hourStep += 0.05f;
        //    _hourStep = Mathf.Clamp(_hourStep, 0.05f, 1f);
        //    //UpdateSpeedDisplay();
        //    //print(_hourStep);
        //}
        //Speed up simulation
        //if (Input.GetKeyDown(KeyCode.KeypadPlus))
        //{
        //    _hourStep -= 0.05f;
        //    _hourStep = Mathf.Clamp(_hourStep, 0.05f, 1f);
        //    //UpdateSpeedDisplay();
        //    //print(_hourStep);
        //}

        //Manual pause trigger
        //if (Input.GetKeyDown(KeyCode.P))
        //{
        //    _timePause = !_timePause;
        //}

        //Reconfigure and continue
        //if (Input.GetKeyDown(KeyCode.Space))
        //{
        //    FinilizeReconfiguration();
        //    //StartCoroutine(FinilizeReconfigurationAnimated());
        //}

        //if (Input.GetKeyDown(KeyCode.M))
        //{
        //    _hourStep = 0.025f;
        //    //UpdateSpeedDisplay();
        //}

        //if (Input.GetKeyDown(KeyCode.W))
        //{
        //    var ss = _spaces.Where(s => !s.IsSpare);
        //    foreach (var s in ss)
        //    {
        //        print($"{s.Name}: {s.NumberOfConnections}");
        //    }
        //}

        #endregion

        //Oscilate the intensity of the colors used to represent the space
        if (!_timePause)
        {
            _colorOscilator = ((Mathf.Sin(Time.time * 3) + 1) / 2f);
        }

        //Check if the reconfiguration request is finished
        //if (_timePause && _reconfigurationRequests.Count > 0 && _reconfigurationRequests[0] != null)
        if (_timePause && _activeRequest != null)
        {
            //print("Entered here");
            //var request = _reconfigurationRequests[0];
            if (_activeRequest.AllAgentsFinished())
            {
                FinilizeReconfiguration();
                if (_spaces.Where(s => s.SpaceId == _activeRequest.SpaceId).Count() != 0)
                {
                    var recSpace = _spaces.First(s => s.SpaceId == _activeRequest.SpaceId);
                    recSpace.ResetAreaEvaluation();
                    recSpace.ResetConnectivityEvaluation();
                    recSpace.TimesSurvived = 0;
                    recSpace.TimesUsed     = 0;
                }
                _activeRequest = null;

                foreach (var agent in _agents)
                {
                    agent.FreezeAgent();
                    agent.ClearRequest();
                }
            }
            //Request the next action from the agents
            else
            {
                _activeRequest.RequestNextAction();
            }
        }
    }
Esempio n. 12
0
 /// <summary>
 /// Clears the active request assigned to this agent
 /// </summary>
 public void ClearRequest()
 {
     _activeRequest = new ReconfigurationRequest();
     _stepsTaken    = 0;
     StepsEnded     = false;
 }
Esempio n. 13
0
 /// <summary>
 /// Assign a request to this agent
 /// </summary>
 /// <param name="request">The <see cref="ReconfigurationRequest"/> to be assigned</param>
 public void SetRequest(ReconfigurationRequest request)
 {
     _activeRequest = request;
 }
Esempio n. 14
0
    /// <summary>
    /// Manually sets the selected space to be reconfigured
    /// </summary>
    protected virtual void SetSpaceToReconfigure()
    {
        ReconfigurationRequest rr = new ReconfigurationRequest(_selectedSpace, 1, 0);

        _reconfigurationRequests.Add(rr);
    }
        /*public bool CommitReconfiguration ()
         * {
         *      Thread commit = new Thread(new ThreadStart(Commit));
         *      commit.Priority = ThreadPriority.Highest;
         *      commit.Start();
         *
         *      return true;
         * }*/

        public bool CommitReconfiguration()
        {
            Configuration protocol;

            Console.WriteLine("[ConfigurationManager.Commit] Aplicando a reconfiguração...");
            lock (thisLock) {
                if (reconfiguring)
                {
                    foreach (ExecutionStateEvaluation es in evaluations)
                    {
                        protocol = unit.Actions [es.ActionName].Protocol;
                        protocol.stopStates(es.StatesToStop);
                        WaitForSafeState(protocol.ReconfigMonitor, es);
                        Console.WriteLine("[ConfigurationManager.Commit] Estado seguro para reconfiguração!");

                        if (request.StructuralRequest != null && request.StructuralRequest.Changes != null)
                        {
                            Console.WriteLine("[ConfigurationManager.Commit] Aplicando reconfigurações estruturais...");
                            foreach (StructuralChange sc in request.StructuralRequest.Changes)
                            {
                                if (SecurityAnalyzer.isChangeConcrete(sc))
                                {
                                    Console.WriteLine("[ConfigurationManager.Commit] Reconfigurando a unidade {0}", sc.Old.Name);
                                    createConcreteUnit(sc.New, ((IUnit)sc.Old.Entity).CID.getInstanceName() /*+ "(new)"*/);
                                    SubstituteUnit(sc.Old, sc.New);
                                }
                            }
                        }
                        BehavioralReconfigurationRequest behavioralRequest = request.BehavioralRequest;

                        if (behavioralRequest != null)
                        {
                            foreach (BehavioralChange bc in behavioralRequest.Changes)
                            {
                                if (bc.NewSlices != null)
                                {
                                    //Console.WriteLine("[ConfigurationManager.Commit] Adicionando novas fatias");
                                    foreach (MetaSlice slice in bc.NewSlices.Values)
                                    {
                                        if (!unit.Slices.ContainsKey(slice.Inner))
                                        {
                                            Console.WriteLine("[ConfigurationManager.Commit] Adicionando fatia '{0}'...", slice.Inner);
                                            createConcreteUnit(slice.Unit, slice.Inner /*+ "(new)"*/);
                                            unit.AddSlice(slice.Inner, slice);
                                        }
                                    }
                                }

                                unit.Actions [bc.Action].Protocol.generateAutomaton(bc.Transitions);
                            }
                        }
                    }

                    foreach (ExecutionStateEvaluation es in evaluations)
                    {
                        foreach (MetaAction action in unit.Actions.Values)
                        {
                            if (!action.IsNative && action.Name.Equals(es.ActionName))
                            {
                                action.Protocol.runStates(es.StatesToStop);
                            }
                        }
                    }

                    this.reconfiguring = false;
                    this.evaluations   = null;
                    this.request       = null;

                    Console.WriteLine("[ConfigurationManager.Commit] Reconfiguração aplicada!");

                    return(true);
                }
            }
            return(false);
        }