ASF: Agent Society Framework Viviane Torres da Silva Mariela Inês Cortés Carlos J. P. de Lucena.

Slides:



Advertisements
Apresentações semelhantes
|Introdução a Java para programadores Telis. Jogo de Dados simples O jogo é jogado por dois jogadores. Cada jogador faz sua jogada (lança um dado), e.
Advertisements

Agentes adaptativos às Normas externas
Classes Abstratas e Interfaces
Chain of Responsibility
Projeto de Sistemas de Software
Padrão de Projeto Interpreter
Projeto de Sistemas de Software Trabalho de Padrões de Projeto
Diagramas de Seqüência
Jade Java Agent Development Framework Versão atual: 3.5 (25 Junho 2007)
Metodologias Equipe do Curso de ES para SMA {lucena, furtado, choren,
Linguagens de Modelagem
Metodologias Equipe do Curso de ES para SMA
Linguagens de Modelagem (cont.) (IV)
Frameworks Conceituais para SMA
Padrão de Projeto Iterator
Um Processo Baseado em MDA para a Especialização de Mecanismos de Persistência Fabio Seixas Marques Seminário LES – 7 de abril de.
RETSINA Plataforma de Agentes CCM MAS Framework Equipe do Curso de ES para SMA {lucena, furtado, choren,
PRDS - Programa de Residência em Desenvolvimento de Software Laboratório de Engenharia de Software (LES) da PUC-Rio Carlos Lucena
Viviane Torres da Silva
Frameworks Conceituais
Linguagens de Modelagem para SMA
Definindo as entidades de um SMA Viviane Torres da Silva
Sistema para Gerenciamento de Redes Baseado em Agentes Móveis
Programação Básica em Java
Metodologias Orientadas a Agentes
Sistemas Distribuídos
Polimorfismo e Classes Abstratas Profa
Wagner Santos C. de Jesus
UMA ABORDAGEM SOBRE ORIENTAÇÃO A OBJETOS!
Concorrência em Java Threads em Java.
Threads: Introdução e Implementação
Concorrência em Java Threads em Java.
Desenvolvendo Sistemas Multiagentes com JADE
Introdução aos Agentes Autónomos (UD2) Teorias de Agentes e Agentes Deliberativos IST- 2003/2004.
Padrão de Projeto Visitor
Framework Conceitual para SMA Taming Agents and Objects (TAO) Andrew Diniz da Costa
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
Metodologias para construção de SMA
1 Mobilidade de Código com μcode Projeto Giga Alexandre Lages
Paulo Borba Centro de Informática Universidade Federal de Pernambuco Classes Abstratas e Interfaces.
Orientação a Objetos e Java Graduação em Ciência da Computação
Paulo Borba Centro de Informática Universidade Federal de Pernambuco
Pilhas Profa. Nádia Félix.
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Wagner Santos C. de Jesus
Metodologias (Parte II) Viviane Torres da Silva
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Elementos de um Sistema de Agentes Móveis Agentes e Places Comportamento de Agentes Comunicação Padronização OMG/MASIF.
Introdução às Java Threads
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota (com material da Qualiti Software Process)
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Classes Abstratas e Interface
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Capítulo 1. Classes internas  Classe interna  Instância da classe interna  Referências na classe interna  Modificadores de membros  Classe interna.
Removing Unnecessary Synchronization in Java Sérgio Soares Gente.
Gerador de Tabela-Verdade
Relação entre Requisitos e Arquitetura de Software num ambiente Multi-Agente SIRA Framework Análise dos temas de Lúcia Bastos e Turah Almeida Apresentação.
Padrões de Projeto Abstract Factory.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
JADE: Java Agent Development Environment Framework
Frameworks e Componentes Daniel Fernando Pavelec.
Modelagem de Estruturas Sociais em AML Menandro Ribeiro Santana Ricardo Roberto de Lima.
Leo Silva Leonardo Murta Luiz Viana Persistência em Java.
Fundamentos de Engenharia de SW Diagramas da UML Usados no Projeto de Software.
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
ProgramaçãoConcorrente Glêdson Elias
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Transcrição da apresentação:

ASF: Agent Society Framework Viviane Torres da Silva Mariela Inês Cortés Carlos J. P. de Lucena

Laboratório de Engenharia de Software (LES) – PUC-Rio Motivação Como implementar sistemas multi-agentes (SMA)? Como implementar os agentes, o ambiente, os papéis usando orientação a objetos? Como mapear agentes para classes, organizações para classes,...? Usar de plataformas, arquiteturas, frameworks orientados a objetos específicos para implementar SMA Exemplos: –Jade, Jadex, FIPAOS, ZEUS, KAoS e Desire

Laboratório de Engenharia de Software (LES) – PUC-Rio Frameworks e Arquiteturas OO Objetivo: prover classes orientadas a agentes reutilizáveis que possam ser estendidas e customizadas para implementar sistemas de domínio específico Definem classes orientadas a objetos, os relacionamentos entres as classes e a maneira como estas classes interagem

Laboratório de Engenharia de Software (LES) – PUC-Rio Framework É um conjunto de classes relacionadas capaz de gerar diferentes aplicações sobre um mesmo domínio Captura os conceitos gerais de um domínio de aplicação Grande potencial de especialização: –conjunto de classes abstratas e concretas

Laboratório de Engenharia de Software (LES) – PUC-Rio Framework Define partes que são fixas, i.e., não podem ser estendidas Define partes que são flexíveis, i.e., passíveis de extensão e customização As diferentes aplicações são geradas através da extensão das partes flexíveis Todas as aplicações possuem em comum o que estiver definido na parte fixa do framework

Laboratório de Engenharia de Software (LES) – PUC-Rio Framework Partes fixas: frozen-spots Partes flexíveis: hot-spots Hot-spots Frozen-spots

Laboratório de Engenharia de Software (LES) – PUC-Rio Aplicações do Framework Uma aplicação é gerada através da instanciação do framework A instanciação do framework é a implementação dos pontos flexíveis (hot-spots) Implementação dos hot-spots: extensão das classes abstratas e implementação dos métodos abstratos * * framework white-box

Laboratório de Engenharia de Software (LES) – PUC-Rio Aplicações do Framework

ASF Framework

Laboratório de Engenharia de Software (LES) – PUC-Rio Agenda Sociedade de agentes Aspectos estruturais do ASF Aspectos dinâmicos do ASF –Modelo de ciclo de vida das entidades –Modelo computacional das entidades Exemplo utilizando o ASF Trabalhos em andamento

Laboratório de Engenharia de Software (LES) – PUC-Rio Sociedade de Agentes Sociedade = grupo = organização Não são compostas apenas por agentes mas também por organizações, papéis, ambientes e objetos Agentes podem desempenhar vários papéis em diferentes organizações Agentes desempenham pelo menos um papel em uma organização

Laboratório de Engenharia de Software (LES) – PUC-Rio Entidades Objects –Attributes, methods Agents –Goals, beliefs, plans and actions Organizations –Goals, beliefs, plans, actions e axioms Agent Roles –Goals, beliefs, duties, rights e protocols Object Roles –Attributes and methods Environment –Passive or active environment

Laboratório de Engenharia de Software (LES) – PUC-Rio Aspectos Estruturais do ASF Objetivo: dar suporte à implementação de agentes, organizações, papéis e ambientes Como implementar... –as entidades, –suas propriedades, –seus relacionamentos, –a interação entre as entidades e –a execução interna das entidades?

Laboratório de Engenharia de Software (LES) – PUC-Rio Aspectos Estruturais do ASF Fornece um conjunto de módulos que devem ser estendidos para implementar a aplicação Cada módulo representa uma entidade do SMA Instanciação da aplicação: –para implementar uma classe de agente da aplicação estende-se o módulo Agent –para implementar uma classe de organização da aplicação estende-se o módulo Organization –...

Laboratório de Engenharia de Software (LES) – PUC-Rio Agente Agent –Thread (entidade autônoma) Messages –Enviadas e recebidas (entidade interativa) Goals –Nome, tipo, valor –Está associado a planos que podem atingir o goal Beliefs –Nome, tipo, valor

Laboratório de Engenharia de Software (LES) – PUC-Rio Agente Plans –Define uma ordem de execução de um conjunto de ações –Está relacionado a goals que pode atingir Actions –Define a execução interna do agentes (entidade adaptativa) –Possui pré e pós-condições

Laboratório de Engenharia de Software (LES) – PUC-Rio Módulo Agent

Laboratório de Engenharia de Software (LES) – PUC-Rio Organização –Thread (entidade autônoma) Main-organization –Não desempenha papéis –Pode definir sub-organizações (Sub-)Organization –Desempenha papéis em organizações –Pode definir sub-organizações Goals, beliefs, plans, actions and messages Axiom: –Nome, tipo, valor

Laboratório de Engenharia de Software (LES) – PUC-Rio Módulo Organization

Laboratório de Engenharia de Software (LES) – PUC-Rio Agent Role Goals, Beliefs Duties –Define ações que são obrigações Rights –Define ações que são direitos Protocols –Define ordem de envio e recebimento de mensagems

Laboratório de Engenharia de Software (LES) – PUC-Rio Módulo Agent Role

Laboratório de Engenharia de Software (LES) – PUC-Rio Módulo Object Role Atributos Métodos

Laboratório de Engenharia de Software (LES) – PUC-Rio Módulo Environment Passive environment Active environment

Laboratório de Engenharia de Software (LES) – PUC-Rio Relação entre as entidades

Laboratório de Engenharia de Software (LES) – PUC-Rio Estrutura do ASF

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida X Modelo computacional Modelo de ciclo de vida –Define o conjunto de estado possíveis e as suas transições Modelo computacional. –Descreve a execução da entidade nos estados definido no modelo de ciclo de vida

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Objeto Start: –Criação do objeto Registrar objeto no ambiente Running: –Execução do objeto Death: –Destruição do objeto Cancelar o registro do objeto no ambiente

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Papel de Objeto Start: –Criação do papel de objeto Registrar o objeto no papel (objeto não conhece o papel) Registrar a papel na organização Running: –Execução do papel do objeto Death: –Destruição do papel do objeto Cancelar o registro no papel na organização

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Papel de Agente Start –Criação do papel Registrar o papel na organização Active –Execução do papel Inactive –Execução interrompida Death –Destruição do papel Cancelar o registro do papel na organização

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Agente Agente executa no contexto dos papéis Para cada papel que o agente desempenha uma thread de agente é criada Start –Criação do agente Registrar o agente no ambiente –Criação de um papel de agente Associar papel ao agente e vice-versa Running –Execução do agente

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Agente Frozen –Todos os papéis do agente estão desativados Agente existe mas não está executando Migrating –Migração do agente de um ambiente para outro Cancelar/desativar todos os papéis no ambiente origem Criar/ativar pelo menos um papel no ambiente destino Death –Destruição do agente Cancelar o registro do agente no ambiente –Destruição do papel de agente Cancelar associação entre agente e papel

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Agente

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Sub-organização Start –Igual ao de agentes Frozen –Igual ao de agentes Migrating –Entidades devem papar de desempenhar papéis dentro da sub-organização (cancelar/desativar papéis) –Cancelar/desativar todos os papéis no ambiente origem –Criar/ativar pelo menos um papel no ambiente destino –Entidades podem se mover também para continuar a desmpenhar os papéis

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Sub-organização Death –Destruição da sub-organização Cancelar o registro da sub-organização no ambiente –Destruição do papel de agente Cancelar associação entre sub-organização e papel –Destruição dos papéis desempenhados dentro da sub- organização

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Sub-organização

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Main-organização Start –Criação da main-organização Registrar da main-organização no ambiente Running –Execução da main-organização Death –Destruição da main-organização Cancelar o registro da main-organização no ambiente

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo de ciclo de vida de Ambiente Start –Criação do ambiente Running –Execução do ambiente Death –Destruição do ambiente Destruição de todos os agentes, organizações e objetos

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional das Entidades Identifica o comportamento entre todas as entidades de um determinado tipo associado a um determinado estado Define o comportamento independente do domínio das entidades em um determinado estado

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Ambiente Start –Criação do ambiente Running –Execução do ambiente Environment env = new Virtual_Marketplace (); Comportamento dependente do domínio

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Ambiente public abstract class Environment {... public void destroy() { //Destroying the agents Vector vAgents = getAgents(); if (vAgents != null) { Enumeration enumvAgents = vAgents.elements(); while (enumvAgents.hasMoreElements()) { Agent agentAux = (Agent)enumvAgents.nextElement(); agentAux.destroy(); } Death –Destruição do ambiente Destruição de todos os agentes, organizações e objetos

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Ambiente //Destroying the organizations Vector vOrganizations = getOrganizations(); if (vOrganizations != null) { Enumeration enumvOrg = vOrganizations.elements(); while (enumvOrg.hasMoreElements()) { MainOrganization orgAux = (MainOrganization)enumvOrg.nextElement(); orgAux.destroy(); } //Destroying the objects Vector vObjects = getObjects(); if (vObjects != null) { Enumeration enumvObjects = vObjects.elements(); while (enumvObjects.hasMoreElements()) { Object objAux = enumvObjects.nextElement(); cancelObjectRegister(objAux); }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Objetos Start: –Criação do objeto Registrar objeto no ambiente Running: –Execução do objeto Death: –Destruição do objeto Cancelar o registro do objeto no ambiente Book book = new Book (); env.registerObjects(book); //Registering the object in the environment env.cancelObjectRegister(book); Comportamento dependente do domínio

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Objeto Start: –Criação do papel de objeto Registrar o objeto no papel (objeto não conhece o papel) Registrar a papel na organização Running: –Execução do papel do objeto Offer bookOffer = new Offer(mainOrg); bookOffer.setObject(book); Comportamento dependente do domínio

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Objeto Death: –Destruição do papel do objeto Cancelar o registro no papel na organização public abstract class ObjectRole {... public void destroy () { //object playing role setObject(null); //destroying role of the organization where it was being played MainOrganization organization = getOwner(); Vector vRoles = organization.getObjectRoles(); Enumeration enumvRoles = vRoles.elements(); while (enumvRoles.hasMoreElements()) { ObjectRole roleAux = (ObjectRole)enumvRoles.nextElement(); if (roleAux == this) vRoles.remove(roleAux); }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Agente Start –Criação do papel Registrar o papel na organização Active –Execução do papel AgentRole agRole = new Buyer (mainOrg); agRole.setRoleName ("Buyer01"); Comportamento dependente do domínio

Laboratório de Engenharia de Software (LES) – PUC-Rio Papel de Agente Inactive –Execução interrompida public abstract class AgentRole {... public synchronized void supendThread() { threadSuspended = true; } public synchronized void resumeThread() { threadSuspended = false; } protected boolean threadSuspended() { return threadSuspended; }... } public abstract class Agent extends Thread {... private void checkIfSuspended(AgentRole role) { if (role.threadSuspended()) { synchronized (this){ while (role.threadSuspended()) System.out.println("Suspended"); System.out.println("Resumed"); }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Agente Inactive public abstract class Agent extends Thread {... public void run() {... AgentRole currentRole = getCurrentRole(); if (currentRole != null) { //Cheking if thread was stopped while (continueExecution && !checkIfStopped(currentRole)) { //Checking if thread was suspended checkIfSuspended(currentRole); }... }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Agente Death –Destruir o papel significa parar de executar o papel Sinalizar que o agente deve parar de executar o papel public abstract class AgentRole {... protected boolean threadStopped() { return threadStopped; } public void stopThread() { threadStopped = true; }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Agente public abstract class Agent extends Thread {... public void run() {... //Cheking if thread was stopped while (continueExecution && !checkIfStopped(currentRole)) {... } //The thread was stoped... //The current role must be destroyed currentRole.destroy(); //Verify if the agent is playing other roles vRoles = getRolesBeingPlayed(); if (vRoles == null) //If the agent is not playing other roles, the agent must be //destroyed destroy();... }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Papel de Agente Death –Destruição do papel cancelar o registro do papel na organização public abstract class AgentRole {... protected void destroy () { //agent playing role setAgent(null); //organization playing role setOrganization(null); //The current role must be removed from the list of the roles being played //in an organization MainOrganization organization = getOwner(); Vector vRoles = organization.getAgentRoles(); Enumeration enumvRoles = vRoles.elements(); while (enumvRoles.hasMoreElements()) { AgentRole roleAux = (AgentRole)enumvRoles.nextElement(); if (roleAux == this) vRoles.remove(roleAux); } }... }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente Agente executa no contexto dos papéis Para cada papel que o agente desempenha uma thread de agente é criada Start –Criação do agente Registrar o agente no ambiente –Criação de um papel de agente Associar papel ao agente e vice-versa Agent agent = new User_Agent (env, mainOrg, agRole); agent.setAgentName ("UserAgent::Viviane"); Thread agentThread = new Thread(agent, agRole.getRoleName()); agentThread.start(); agRole.setAgent (agent);

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente Running –Execução do agente protected abstract Plan selectingPlan(Vector vPlansExecuted, Goal goal); protected abstract void executingPlan(Plan plan); protected abstract Goal selectingGoalToAchieve();

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente public void run() {... //Cheking if thread was stopped while (continueExecution && !checkIfStopped(currentRole)) { checkIfSuspended(currentRole); //Checking if thread was suspended //Selecting a goal to be achieved Goal goal = selectingGoalToAchieve(); while (goal != null) { //Selecting a plan to be executed Plan plan = selectingPlan(vPlansExecuted, goal); while (plan != null) { //Checking if thread was suspended checkIfSuspended(currentRole); //Executing a plan executingPlan(plan); checkIfSuspended(currentRole); if (checkIfStopped(currentRole)) break; vPlansExecuted.add(plan);

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente if (!goal.getAchieved()) //Secting another plan plan = selectingPlan(vPlansExecuted, goal); else { //Goal achieved... } plan = null; } //The goal was achieved or //all plans associated with the goal were executed or //there is not any plan associated with the goal //Selecting another goal if (checkIfStopped(currentRole)) break; //Selecting another goal goal = selectingGoalToAchieve(); vPlansExecuted.clear(); }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente Frozen –Todos os papéis do agente estão desativados Migrating Modelo computacional do estado inactive de papéis de agente já foi descrito Trabalho Futuro

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Agente Death –Destruição do agente Cancelar o registro do agente no ambiente –Destruição do papel de agente public abstract class Agent extends Thread {... public void destroy() { //Stoping all threads Vector vRoles = getRolesBeingPlayed(); Enumeration enumvRoles = vRoles.elements(); while (enumvRoles.hasMoreElements()) { AgentRole roleAux = (AgentRole)enumvRoles.nextElement(); roleAux.stopThread(); } //Canceling the register Environment env = getEnvironment(); env.cancelObjectRegister(this); }...}

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Sub-organizações Start Running Frozen Migrating //Sub-organization Organization subOrg = new Imported_Bookstore (env, mainOrg, orgRole); subOrg.setOrganizationName("ImportedBookStore::Amazon"); Thread subOrgThread = new Thread(subOrg,orgRole.getRoleName()); subOrgThread.start(); orgRole.setOrganization(subOrg); Igual ao de agentes Modelo computacional do estado inactive de papéis de agente já foi descrito Trabalho Futuro

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Sub-organizações Death –Destruição da sub-organização Cancelar o registro da sub-organização no ambiente –Destruição do papel de agente Cancelar associação entre sub-organização e papel –Destruição dos papéis desempenhados dentro da sub- organização public void destroy() { //Destroying the roles being played Vector vRoles = getRolesBeingPlayed(); Enumeration enumvRoles = vRoles.elements(); while (enumvRoles.hasMoreElements()) { AgentRole roleAux = (AgentRole)enumvRoles.nextElement(); vRoles.remove(roleAux); roleAux.destroy(); } //Destroying the agent roles played in the organization //The thread of the entity playing the role must be stoped vRoles = getAgentRoles(); enumvRoles = vRoles.elements(); Agent agent; while (enumvRoles.hasMoreElements()) { AgentRole roleAux = (AgentRole)enumvRoles.nextElement(); roleAux.stopBeingPlayed(); vRoles.remove(roleAux); } //Destroying the object roles played in the organization //It is not necessary to destroy the object playing the role vRoles = getObjectRoles(); enumvRoles = vRoles.elements(); while (enumvRoles.hasMoreElements()) { ObjectRole objRoleAux = (ObjectRole)enumvRoles.nextElement(); vRoles.remove(objRoleAux); } //Canceling the register Environment env = getEnvironment(); env.cancelOrganizationRegister(this); }

Laboratório de Engenharia de Software (LES) – PUC-Rio Modelo computacional de Main-Organizações Start Running –Não há a necessidade de checar se algum papel foi suspenso, pois não executa papéis. Death –Não destrói papéis que desempenha, pois não desempenha papéis //Main-organization MainOrganization mainOrg = new General_Store (env); mainOrg.setOrganizationName("General_Store"); Thread mainOrgThread = new Thread(mainOrg, "General_Store"); mainOrgThread.start();

Laboratório de Engenharia de Software (LES) – PUC-Rio Exemplo