DARPA-ASKEM / terarium

https://app.terarium.ai
Apache License 2.0
13 stars 2 forks source link

[BUG]: `amr_to_mmt` doesn't work if a unit expression has a space #4174

Closed shawnyama closed 3 weeks ago

shawnyama commented 1 month ago

DC edit July 18

Looks like this is because sympy is trying to parse blah blah as an expression and doesn't like the space-character. We should take a look at how prevalent we need to guard against these cases. It may be worthwhile to add an option to tera-input component to reject specific characters, rather than doing the string wrangling after-the-fact.

Shawn Original

Describe the bug Rendering the model parts requires the mmt so we know the base variables in the case of stratified states/parameters/transitions. Once a unit expression is given a space the amr_to_mmt conversion doesn't work causing the editing UI to not render. In order to avoid this for now I prevent spaces from being entered in the unit fields.

To Reproduce

https://github.com/user-attachments/assets/7fe8cf95-fc92-40bd-96ad-c4b0579615c9

Error:

2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Creating input, output, and progress pipes: /tmp/input-1fdd89a1-bf73-4c99-8930-f12298e87b1a, /tmp/output-1fdd89a1-bf73-4c99-8930-f12298e87b1a, /tmp/progress-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:125]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Starting task 1fdd89a1-bf73-4c99-8930-f12298e87b1a executing mira_task:amr_to_mmt [software.uncharted.terarium.taskrunner.service.Task:340]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Begin waiting for process to exit for task 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:355]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Dispatching write thread for input pipe: /tmp/input-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task: 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:150]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Opening input pipe: /tmp/input-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task: 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:156]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Creating input, output, and progress pipes: /tmp/input-7a5c9322-f4ea-4c33-8865-d5cac730b807, /tmp/output-7a5c9322-f4ea-4c33-8865-d5cac730b807, /tmp/progress-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:125]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Starting task 7a5c9322-f4ea-4c33-8865-d5cac730b807 executing mira_task:amr_to_mmt [software.uncharted.terarium.taskrunner.service.Task:340]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Begin waiting for process to exit for task 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:355]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Dispatching write thread for input pipe: /tmp/input-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task: 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:150]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Opening input pipe: /tmp/input-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task: 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:156]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Writing to input pipe: /tmp/input-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task: 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:158]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] [1fdd89a1-bf73-4c99-8930-f12298e87b1a] stdout: Reading input from input pipe [software.uncharted.terarium.taskrunner.service.Task:387]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Dispatching read thread for progress pipe: /tmp/progress-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task: 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:243]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Opening progress pipe: /tmp/progress-1fdd89a1-bf73-4c99-8930-f12298e87b1a for task: 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:247]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] [1fdd89a1-bf73-4c99-8930-f12298e87b1a] stdout: Shutting down [software.uncharted.terarium.taskrunner.service.Task:387]
2024-07-17 15:49:36 2024-07-17 19:49:36 [WARN] [1fdd89a1-bf73-4c99-8930-f12298e87b1a] stderr: Error: invalid syntax (<string>, line 1) [software.uncharted.terarium.taskrunner.service.Task:400]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] [7a5c9322-f4ea-4c33-8865-d5cac730b807] stdout: Reading input from input pipe [software.uncharted.terarium.taskrunner.service.Task:387]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Writing to input pipe: /tmp/input-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task: 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:158]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Dispatching read thread for progress pipe: /tmp/progress-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task: 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:243]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Opening progress pipe: /tmp/progress-7a5c9322-f4ea-4c33-8865-d5cac730b807 for task: 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:247]
2024-07-17 15:49:36 2024-07-17 19:49:36 [WARN] [7a5c9322-f4ea-4c33-8865-d5cac730b807] stderr: Error: invalid syntax (<string>, line 1) [software.uncharted.terarium.taskrunner.service.Task:400]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] [7a5c9322-f4ea-4c33-8865-d5cac730b807] stdout: Shutting down [software.uncharted.terarium.taskrunner.service.Task:387]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Process exited with code 1 for task 1fdd89a1-bf73-4c99-8930-f12298e87b1a [software.uncharted.terarium.taskrunner.service.Task:357]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Finalized process status for task 1 [software.uncharted.terarium.taskrunner.service.Task:369]
2024-07-17 15:49:36 2024-07-17 19:49:36 [ERROR] Task 1fdd89a1-bf73-4c99-8930-f12298e87b1a failed [software.uncharted.terarium.taskrunner.service.TaskRunnerService:175]
2024-07-17 15:49:36 java.lang.InterruptedException: Process for task 1fdd89a1-bf73-4c99-8930-f12298e87b1a exited early with code 1
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.Task.readProgressWithTimeout(Task.java:294)
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.TaskRunnerService.dispatchSingleInputSingleOutputTask(TaskRunnerService.java:150)
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.TaskRunnerService.onTaskRequest(TaskRunnerService.java:92)
2024-07-17 15:49:36     at jdk.internal.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
2024-07-17 15:49:36     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2024-07-17 15:49:36     at java.base/java.lang.reflect.Method.invoke(Method.java:568)
2024-07-17 15:49:36     at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.KotlinAwareInvocableHandlerMethod.doInvoke(KotlinAwareInvocableHandlerMethod.java:45)
2024-07-17 15:49:36     at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:75)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:277)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:224)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:149)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1682)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1604)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1592)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1583)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListenerAndHandleException(AbstractMessageListenerContainer.java:1528)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.lambda$executeListener$8(AbstractMessageListenerContainer.java:1506)
2024-07-17 15:49:36     at io.micrometer.observation.Observation.observe(Observation.java:499)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1506)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1042)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:989)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1377)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1279)
2024-07-17 15:49:36     at java.base/java.lang.Thread.run(Thread.java:840)
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Waiting for workers to finish. [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer:657]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Process exited with code 1 for task 7a5c9322-f4ea-4c33-8865-d5cac730b807 [software.uncharted.terarium.taskrunner.service.Task:357]
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Finalized process status for task 1 [software.uncharted.terarium.taskrunner.service.Task:369]
2024-07-17 15:49:36 2024-07-17 19:49:36 [ERROR] Task 7a5c9322-f4ea-4c33-8865-d5cac730b807 failed [software.uncharted.terarium.taskrunner.service.TaskRunnerService:175]
2024-07-17 15:49:36 java.lang.InterruptedException: Process for task 7a5c9322-f4ea-4c33-8865-d5cac730b807 exited early with code 1
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.Task.readProgressWithTimeout(Task.java:294)
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.TaskRunnerService.dispatchSingleInputSingleOutputTask(TaskRunnerService.java:150)
2024-07-17 15:49:36     at software.uncharted.terarium.taskrunner.service.TaskRunnerService.onTaskRequest(TaskRunnerService.java:92)
2024-07-17 15:49:36     at jdk.internal.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
2024-07-17 15:49:36     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2024-07-17 15:49:36     at java.base/java.lang.reflect.Method.invoke(Method.java:568)
2024-07-17 15:49:36     at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.KotlinAwareInvocableHandlerMethod.doInvoke(KotlinAwareInvocableHandlerMethod.java:45)
2024-07-17 15:49:36     at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:75)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:277)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:224)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:149)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1682)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1604)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1592)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1583)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListenerAndHandleException(AbstractMessageListenerContainer.java:1528)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.lambda$executeListener$8(AbstractMessageListenerContainer.java:1506)
2024-07-17 15:49:36     at io.micrometer.observation.Observation.observe(Observation.java:499)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1506)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1042)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:989)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1377)
2024-07-17 15:49:36     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1279)
2024-07-17 15:49:36     at java.base/java.lang.Thread.run(Thread.java:840)
2024-07-17 15:49:36 2024-07-17 19:49:36 [INFO] Waiting for workers to finish. [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer:657]
2024-07-17 15:49:37 2024-07-17 19:49:37 [INFO] Successfully waited for workers to finish. [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer:661]
2024-07-17 15:49:37 2024-07-17 19:49:37 [INFO] Successfully waited for workers to finish. [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer:661]
mwdchang commented 1 month ago
     "time": {
       "id": "t",
       "units": {
         "expression": "day unit",
         "expression_mathml": "<ci>day unit</ci>"
       }

This looks like the actual python stack trace:

ValueError: Error from parse_expr with transformed code: "day Symbol ('unit' )"

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File [/opt/conda/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3577](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/IPython/core/interactiveshell.py#line=3576) in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  Cell In[72], line 7
    mmt = model_from_json(amr)

  File [/opt/conda/lib/python3.11/site-packages/mira/sources/amr/__init__.py:67](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/mira/sources/amr/__init__.py#line=66) in model_from_json
    return petrinet.template_model_from_amr_json(model_json)

  File [/opt/conda/lib/python3.11/site-packages/mira/sources/amr/petrinet.py:153](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/mira/sources/amr/petrinet.py#line=152) in template_model_from_amr_json
    time_units_expr = get_sympy(time_units, UNIT_SYMBOLS)

  File [/opt/conda/lib/python3.11/site-packages/mira/sources/util.py:218](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/mira/sources/util.py#line=217) in get_sympy
    expr = safe_parse_expr(expr_data["expression"], local_dict=local_dict)

  File [/opt/conda/lib/python3.11/site-packages/mira/metamodel/utils.py:34](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/mira/metamodel/utils.py#line=33) in safe_parse_expr
    return sympy.parse_expr(get_parseable_expression(s),

  File [/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py:1087](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py#line=1086) in parse_expr
    raise e from ValueError(f"Error from parse_expr with transformed code: {code!r}")

  File [/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py:1078](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py#line=1077) in parse_expr
    rv = eval_expr(code, local_dict, global_dict)

  File [/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py:906](http://10.64.18.171:8888/opt/conda/lib/python3.11/site-packages/sympy/parsing/sympy_parser.py#line=905) in eval_expr
    expr = eval(

  File <string>:1
    day Symbol ('unit' )
        ^
SyntaxError: invalid syntax