Resumen
Una Entidad (Entity) es un elemento que fluye a través de una simulación — una orden de trabajo, un producto terminado, una tarima, un lote, un paciente, un camión. Cada simulación gira en torno a entidades que se crean, enrutan, procesan y terminan.
Lo que hace poderosas a las entidades en ProDex no es el concepto de “cosas fluyendo por un grafo” — es que las entidades llevan atributos tipados consigo, y las expresiones a lo largo del modelo pueden leer y actuar sobre esos atributos. Una entidad no es solo un token anónimo; es un paquete de datos tipados que los componentes inspeccionan, sobre los que enrutan, procesan con tiempos diferentes y agregan. Este es el mecanismo que convierte un diagrama de flujo estático en un modelo que responde al trabajo específico que se está haciendo.
Tipos de atributo
Cada tipo de entidad define un conjunto de atributos nombrados. El esquema tiene cinco tipos canónicos; la interfaz divide Number en Integer y Real, por lo que el menú desplegable de tipo de atributo muestra seis opciones.
| Tipo de esquema | Etiqueta(s) en UI | Descripción | Ejemplo |
|---|
| Boolean | Boolean | Bandera verdadero/falso | is_rush, qc_passed, requires_rework |
| Number | Number (Integer), Number (Real) | Entero o decimal; restricciones opcionales lower_bound, upper_bound y exclude_zero | weight, priority, complexity_factor |
| Text | Text | Cadena de forma libre; length máxima opcional | Cualquier valor de texto |
| Text List | Text List | Elección restringida desde un conjunto fijo de cadenas (enum) | product_class donde las opciones son "A", "B", "C" |
| Number List | Number List | Elección restringida desde un conjunto fijo de números (enum) | size_tier donde las opciones son 1.0, 2.5, 5.0 |
Los tipos List son enums, no listas. Un atributo Text List no contiene múltiples cadenas — contiene una cadena, elegida de un conjunto fijo de valores permitidos declarados en el tipo de entidad. Lo mismo para Number List: el valor del atributo es un número elegido de un conjunto predefinido. Piénsalos como valores categóricos restringidos, no arreglos.
Usa Text List o Number List cuando quieras que un atributo sea categórico y que la plataforma haga cumplir los valores válidos. Usa Text o Number cuando el atributo sea de forma libre.
Los tipos de atributo son fijos en el tipo de entidad — no puedes almacenar un número en un atributo Text. El lenguaje de expresiones respeta estos tipos cuando referencias atributos por nombre.
Cómo fluyen los atributos
Los atributos establecidos en una entidad persisten con ella a través del flujo completo. Una vez asignados, los componentes aguas abajo pueden leerlos sin propagación explícita.
- Crear / asignar — los atributos se asignan cada vez que un componente produce una nueva entidad. Eso es en Sources (creando entidades iniciales), Combiners (entidad de salida de un lote), Separators (entidades de salida de una separación), Transformers (entidad de salida de un cambio de tipo) y liberaciones de material en una Source o Buffer en un calendario.
- Leer — cualquier expresión aguas abajo en un contexto de entidad única puede referenciar el atributo por nombre simple (
priority, weight).
- Cambiar identidad — un Transformer produce una nueva entidad de un tipo diferente con sus propias asignaciones de atributos. No muta los atributos de la entidad de entrada en sitio — emite una entidad diferente, tipada diferentemente, con sus propios valores de atributo.
- Agregar — cuando las entidades se combinan, los atributos de la entidad de salida se calculan a partir del conjunto de entradas usando funciones de agregación como
SUM(weight) o MAX(priority) en el contexto multi-entidad del Combiner.
El traspaso de atributos en Transformer no es automático. Cuando un Transformer emite una entidad de salida, ninguno de los atributos de la entidad de entrada se copia por defecto. Cada atributo que quieras en la salida debe ser asignado explícitamente, más comúnmente como dsl_expr referenciando el atributo de entrada por nombre simple. Si omites una asignación, el atributo de la entidad de salida recibe el valor por defecto del tipo (0, "" o FALSE) — pérdida silenciosa de datos. Las salidas de Separator se comportan igual.
El DSL no requiere un prefijo para leer atributos — simplemente usa el nombre simple. priority y product_class son identificadores válidos en cualquier expresión que tenga una entidad en alcance.
Estrategias de asignación
Siempre que un componente asigna un atributo en una nueva entidad — en una Source, Combiner, Separator, Transformer o liberación de material de calendario — usa una de seis estrategias. No todas las seis son válidas para cada tipo de atributo; el menú desplegable filtra a las estrategias que funcionan para el atributo que estás configurando.
| Estrategia | Propósito | Tipos de atributo válidos |
|---|
| Fixed | Asigna el mismo valor literal a cada entidad | Todos los tipos |
| DSL Expression | Evalúa una expresión DSL en el momento de asignación | Boolean, Number, Text (no tipos de lista) |
| Round Robin | Cicla determinísticamente a través de las opciones declaradas del tipo de entidad | Boolean, Text List, Number List |
| Random Choice | Elige uniformemente al azar de las opciones declaradas del tipo de entidad | Boolean, Text List, Number List |
| Random | Muestrea de una distribución de probabilidad | Solo Number |
| Weighted | Elige de las opciones del tipo de entidad con pesos por opción | Boolean, Text List, Number List |
Random Choice y Random son estrategias diferentes. Random Choice elige uniformemente de un arreglo de opciones categóricas (boolean / text list / number list). Random muestrea de una distribución de probabilidad (solo number). El menú desplegable las filtra según el tipo de atributo, así que solo verás las que aplican.
Detalles de las estrategias
Fixed — Mismo valor en cada entidad. Útil para atributos que no varían entre elementos, o como marcador de posición antes de cablear variabilidad real.
DSL Expression — El valor es el resultado de una expresión DSL evaluada cuando se crea la entidad. Úsalo cuando el valor dependa del estado de simulación, otros atributos o el tiempo actual: IF(SIM_TIME < SHIFT_1_END, "day", "night") o LOOKUP(priority_by_class, product_class). No válido para Text List o Number List — para selección categórica dinámica usa Weighted con pesos de expresión DSL, o reestructura a Random Choice.
Round Robin — La primera entidad obtiene el valor 1, la segunda obtiene el valor 2, la tercera obtiene el valor 3, la cuarta cicla de regreso al valor 1. Útil para distribuir entidades uniformemente entre categorías sin aleatoriedad.
Random Choice — Elección aleatoria uniforme del arreglo de opciones del tipo de entidad. Cada opción tiene igual probabilidad. Para atributos Boolean el conjunto de opciones es {true, false}.
Random — Muestrea de una distribución (normal, exponencial, triangular, etc.). Útil para variabilidad natural — pesos de entidad extraídos de una normal, requisitos de tiempo de servicio extraídos de triangular o intervalos de llegada extraídos de exponencial.
Weighted — Elige de las opciones del tipo de entidad con pesos por opción. Especifica un peso para cada opción; los pesos relativos determinan la probabilidad de selección. Los pesos pueden ser ellos mismos expresiones DSL para distribuciones dinámicas.
Definir un tipo de Entidad
Los tipos de entidad se gestionan a través del botón Entities en la parte inferior del panel Library del Modelador — abre un modal que lista cada tipo de entidad en la fábrica con columnas Name, Description, Unit y Attrs. Cada tipo tiene:
- Un name y description
- Un conjunto de atributos tipados (con arreglos
choices declarados en atributos Text List y Number List, lower_bound/upper_bound/exclude_zero opcionales en atributos Number y length opcional en Text)
Una vez definido, un tipo de entidad está disponible para cada modelo de la fábrica. Las Sources, Transformers, nodos BOM, Combiners y Separators que producen entidades de ese tipo comparten el mismo esquema de atributos — si agregas un atributo al tipo, cada lugar que crea o modifica la entidad puede ahora establecerlo.
Los tipos de entidad viven en entities/{slug}.json en el árbol de datos de la fábrica.
Patrones
Atributo de clasificación dirigiendo el enrutamiento. Un atributo product_class Text List establecido en la Source (uno de "rush" o "standard") dirige a un Router que envía elementos rush a la línea express.
Atributo numérico dirigiendo el tiempo de procesamiento. Un atributo complexity_factor Number (extraído de una distribución vía la estrategia Random) multiplica el tiempo base de procesamiento en cada Process.
Cambio de tipo en un Transformer. Un Transformer reasigna la entidad a un nuevo tipo painted_part (desde raw_part), con asignaciones explícitas de expresión DSL que llevan adelante cada atributo que el modelo aguas abajo necesita.
Agregación en un Combiner. Cuando tres componentes se combinan en un ensamblaje, el total_weight de la entidad de salida es SUM(weight), priority es MAX(priority) y qc_passed es ALL(qc_passed).
Consejos
- Modela los atributos que consultarás. Si te importa el “tiempo de ciclo por clase de producto” en tus resultados,
product_class tiene que ser un atributo en la entidad — de lo contrario el join no está disponible en los dataframes de simulación.
- Usa Text List o Number List para restricciones categóricas. Son enums — la plataforma hace cumplir que el valor sea una de las opciones declaradas. Prefiérelas sobre Text de forma libre cuando el atributo tenga un conjunto finito conocido de valores válidos.
- Prefiere atributos de entidad sobre variables de estado para datos por entidad. Las variables de estado son para hechos sobre el sistema. Los atributos son para hechos sobre una entidad específica.
- Para selección categórica dinámica, usa Weighted con pesos de expresión DSL. Es la única forma de dirigir atributos de tipo lista desde expresiones, ya que
DSL Expression no es válido para tipos de lista.
- Traspaso explícito de atributos — cada atributo de salida en un Transformer o Separator debe asignarse. No hay copia automática desde la entrada.