Mercurial > repos > siwaa > gama
changeset 0:f895e266b37a draft
planemo upload for repository https://forgemia.inra.fr/nathalie.rousse/use/-/tree/gama/GAMA/galaxy-tools commit 67d85c013c62c16392b4796af86836b1334f2eef
author | siwaa |
---|---|
date | Tue, 04 Jun 2024 15:18:01 +0000 |
parents | |
children | 168edc2db729 |
files | Makefile README.md gama_tool.xml job_conf.xml src/MY_gama-headless.sh src/MY_predatorPrey.gaml src/MY_sequential_example.py src/cmd_gama_headless.sh src/cmd_python_client.sh |
diffstat | 9 files changed, 808 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,21 @@ +# assuming you have locally installed +# - planemo +# - singularity +# - galaxy, the one from siwaa for instance +# +# assuming you have a token to get container +# on the registry (see the job_conf.xml) +# the following target enable to test the tools + + +serveGAMA: ~/DEVS/galaxy + planemo serve --no_cleanup --galaxy_root ~/DEVS/galaxy \ + --job_config_file ./job_conf.xml \ + gama_tool.xml + +testGAMA: ~/DEVS/galaxy + planemo test \ + --galaxy_root ~/DEVS/galaxy \ + --job_config_file ./job_conf.xml \ + --no_cleanup \ + essai1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,188 @@ +# Galaxy tools for GAMA platform + +Desc +==== + +The **gama_tool.xml** tool runs a **GAMA Python client** +interacting with **gama-server (Headless server)** +concerning a **"Predator Prey" agent-based simulation**. +It relies on the **gama.simg** container. + +See also : +[containers](../containers) from where container gama.simg comes ; +[use-containers](../use-containers) ; +[../../README.md](../../README.md) + +The **gama_tool.xml** tool case has been written **from an existing example** +(*same example as in [use-containers](../use-containers)*) : + + - example code of https://github.com/gitrdm/gama-client-python + project + - URL : https://github.com/gitrdm/gama-client-python?tab=readme-ov-file#example-code + - more : see [../../README.md](../../README.md) + +The **gama_tool.xml** tool case is based on : + + - A **"Predator Prey" agent-based model** of the **GAMA platform**. + - A **Python program** (*MY_sequential_example.py*) interacting with + the GAMA platform in headless mode, as a GAMA Python client to : + - **drive the experiment** : initialization, parameters settings, + running, pausing, running some more steps, stop. + - **observe the experiment** : getting information values such as : + cycle, nb_preys/nb_preys_init... + +Sources +======= + +The reused existing files have been copied +at **[src/originals](./src/originals)** folder so : + + - **sequential_example.py** + from gama-client-python/examples/sequential_example.py : + + ``` + # examples + cd src/originals + mkdir TMP; cd TMP + git clone https://github.com/gitrdm/gama-client-python.git + cd .. + cp -fr TMP/gama-client-python/examples . + rm -fr TMP + ``` + + - **predatorPrey.gaml** and **gama-headless.sh** from gama-platform/headless + (gama-platform/headless/samples/predatorPrey/predatorPrey.gaml, + gama-platform/headless/gama-headless.sh) + by gama.simg : + + ``` + # headless + gama_SIMGPATH=../../../containers/gama.simg + cd src/originals + mkdir OPT + singularity exec --bind ./OPT:/OPT $gama_SIMGPATH bash -c "cp -fr /opt/gama-platform /OPT/." + cp -fr OPT/gama-platform/headless headless + rm -fr OPT + ``` + +Galaxy tool Inputs / Outputs +============================ + +**[gama_tool.xml](./gama_tool.xml) Inputs** : + + - **nb_preys_init** (integer) + - **nb_predators_init** (integer) + - **nb_more_steps** (integer) + +**[gama_tool.xml](./gama_tool.xml) Outputs** : + + - **results .txt file** produced while running the simulator + (cf 'reflex save_result' into MY_predatorPrey.gaml). + - **run_server .txt file** : gama-server screen display capture + - **run_client .txt file** : gama-client screen display capture + +Galaxy tool Code +================ + +The Galaxy tool **[src](./src) folder** contains : + + - **[MY_sequential_example.py](./src/MY_sequential_example.py)** : + **Python code** + + - created from [src/originals/examples/sequential_example.py](./src/originals/examples/sequential_example.py) + - modification : variables values for gama-server + (*MY_SERVER_URL, MY_SERVER_PORT, GAML_FILE_PATH_ON_SERVER*), + for experiment (*EXPERIMENT_NAME, MY_EXP_INIT_PARAMETERS*). + - modification : added some "print" + + - **[MY_predatorPrey.gaml](./src/MY_predatorPrey.gaml)** : + **"Predator Prey" agent-based simulator** file + + - created from [src/originals/headless/samples/predatorPrey/predatorPrey.gaml](./src/originals/headless/samples/predatorPrey/predatorPrey.gaml) + - modification : added **'reflex save_result'** to save some results data + into results.txt file. + + - **[cmd_gama_headless.sh](./src/cmd_gama_headless.sh)** : + **commands file** (Shell script) + launching GAMA Headless gama-server *(by calling MY_gama-headless.sh)* + + - **[cmd_python_client.sh](./src/cmd_python_client.sh)** : + **commands file** (Shell script) + launching Python program MY_sequential_example.py + + - **[MY_gama-headless.sh](./src/MY_gama-headless.sh)** : + + - created from [src/originals/headless/gama-headless.sh](./src/originals/headless/gama-headless.sh) + - modify : setting **java.io.tmpdir** property + (```-Djava.io.tmpdir=$MY_TEMP_DIR```), + because of gama_tool.xml running error : + ``` + javax.imageio.IIOException: Can't create cache file! + at java.desktop/javax.imageio.ImageIO.createImageInputStream(ImageIO.java:361) + .... + Caused by: java.nio.file.FileSystemException: /tmp/imageio10268746820164254686.tmp: Read-only file system + .... + SLF4J: No SLF4J providers were found. + SLF4J: Defaulting to no-operation (NOP) logger implementation + SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details. + ``` + + *Default temporary directory for Linux is /tmp. The JVM automatically + sets the temporary directory path as a system property. It can be + changed by setting the java.io.tmpdir property to the desired + path when starting the JVM.* + +Local run by 'planemo serve' +============================ + +**Installs** : + + - Install Singularity : singularity version 3.8.5 + + - Install Galaxy code : + ``` + cd ~/DEVS + git clone https://github.com/galaxyproject/galaxy.git + ``` + + Note : Galaxy requiring at least singularity 3.7 + (cf singularity exec : --no-mount option) + + - Install Planemo into a Python virtualenv : + ``` + pip3 install --upgrade pip wheel setuptools virtualenv + python3 -m venv _venv_planemo + source _venv_planemo/bin/activate + + python3 -m pip install planemo + ``` + +**Use** : + + ``` + source _fab/_venv_planemo/bin/activate + ``` + + - Survey : + ``` + htop + ``` + + - Check tool syntax : + ``` + planemo lint --report_level all --fail_level error gama_tool.xml + ``` + + - Run tool : + ``` + make serveGAMA + ``` + + => http://127.0.0.1:9090 + +Use those Galaxy tools +====================== + +See [use-tools](../use-tools). + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gama_tool.xml Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,88 @@ +<tool id="gama_tool" name="gama" version="1.0.0"> + + <description>tool for GAMA Platform</description> + + <requirements> + + <!-- singularity --> + <container type="singularity">oras://registry.forgemia.inra.fr/nathalie.rousse/use/gama:d01c3645810b3e5bf1b21170fd24d21fe1f831ec</container> + + <!-- image locale + <container type="singularity">/home/nrousse/workspace_git/SIWAA_regroup/USE_branch_gama/use/GAMA/containers/gama.simg</container --> + </requirements> + + <command detect_errors="aggressive"> + <![CDATA[ + cp -fr /opt/gama-platform .; + cp $__tool_directory__/src/MY_predatorPrey.gaml gama-platform/headless/samples/predatorPrey/.; + cp $__tool_directory__/src/MY_gama-headless.sh gama-platform/headless/.; + cp $__tool_directory__/src/MY_sequential_example.py .; + cp $__tool_directory__/src/cmd_gama_headless.sh .; + cp $__tool_directory__/src/cmd_python_client.sh .; + /bin/bash cmd_gama_headless.sh > run_server.txt & sleep 20 && /bin/bash cmd_python_client.sh $nb_preys_init $nb_predators_init $nb_more_steps > run_client.txt; + cp run_server.txt ${run_server_txt}; + cp run_client.txt ${run_client_txt}; + cp gama-platform/headless/samples/predatorPrey/results.txt ${results_txt}; + ]]> + </command> + + <inputs> + + <param name="nb_preys_init" optional="true" type="integer" + value="200" min="0" max="1000" + label="nb_preys_init" help="[0, 1000]" /> + + <param name="nb_predators_init" optional="true" type="integer" + value="20" min="0" max="200" + label="nb_predators_init" help="[0, 200]" /> + + <param name="nb_more_steps" optional="true" type="integer" + value="10" min="4" max="100" + label="nb_more_steps" help="[4,100]" /> + + </inputs> + + <outputs> + <data format="txt" name="run_server_txt" label="run_server_txt"/> + <data format="txt" name="run_client_txt" label="run_client_txt"/> + <data format="txt" name="results_txt" label="results_txt"/> + </outputs> + + <tests> + </tests> + + <help><![CDATA[ + +Desc: + +----- + +gama_tool.xml tool running a GAMA Python client interacting with gama-server +(Headless server) concerning a "Predator Prey" agent-based simulator. + +Code: MY_sequential_example.py + +Inputs: + + - nb_preys_init + - nb_predators_init + - nb_more_steps + +Outputs: + + - results_txt file (.txt) : produced while running the simulator + (cf 'reflex save_result' into MY_predatorPrey.gaml). + - run_server_txt file (.txt) : gama-server screen display capture + - run_client_txt file (.txt) : gama-client screen display capture + +Credits: + +-------- + +- Author: Nathalie Rousse nathalie.rousse@inrae.fr +- Copyright: INRAE + + ]]> + </help> + +</tool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/job_conf.xml Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<!-- A sample job config that explicitly configures job running the way it is configured by default (if there is no explicit config). --> +<job_conf> + <plugins> + <plugin id="local" type="runner" load="galaxy.jobs.runners.local:LocalJobRunner" workers="4"/> + </plugins> + + <destinations> + <destination id="singularity_local" runner="local"> + + <param id="singularity_enabled">true</param> + + <param id="singularity_cleanenv">true</param> + + </destination> + </destinations> + +</job_conf>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/MY_gama-headless.sh Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,69 @@ +#!/bin/bash + +javaVersion=$(java -version 2>&1 | head -n 1 | cut -d "\"" -f 2) +# Check if good Java version before everything +if [[ ${javaVersion:2} == 17 ]]; then + echo "You should use Java 17 to run GAMA" + echo "Found you using version : $javaVersion" + exit 1 +fi + +memory="0" + +for arg do + shift + case $arg in + -m) + memory="${1}" + shift + ;; + *) + set -- "$@" "$arg" + ;; + esac +done + +if [[ $memory == "0" ]]; then + memory=$(grep Xmx "$( dirname $( realpath "${BASH_SOURCE[0]}" ) )"/../Gama.ini || echo "-Xmx4096m") +else + memory=-Xmx$memory +fi + +workspaceCreate=0 +case "$@" in + *-help*|*-version*|*-validate*|*-test*|*-xml*|*-batch*|*-write-xmi*|*-socket*) + workspaceCreate=1 + ;; +esac + + +echo "******************************************************************" +echo "* GAMA version 1.9.1 *" +echo "* http://gama-platform.org *" +echo "* (c) 2007-2023 UMI 209 UMMISCO IRD/SU & Partners *" +echo "******************************************************************" +passWork=.workspace +# w/ output folder +if [ $workspaceCreate -eq 0 ]; then + # create output folder if not existing + if [ ! -d "${@: -1}" ]; then + mkdir ${@: -1} + fi + # create workspace in output folder + passWork=${@: -1}/.workspace$(find ${@: -1} -name ".workspace*" | wc -l) + mkdir -p $passWork + +# w/o output folder +else + # create workspace in current folder + passWork=.workspace$(find ./ -maxdepth 1 -name ".workspace*" | wc -l) +fi + +#if ! java -cp "$( dirname $( realpath "${BASH_SOURCE[0]}" ) )"/../plugins/org.eclipse.equinox.launcher*.jar -Xms512m $memory -Djava.awt.headless=true org.eclipse.core.launcher.Main -configuration "$( dirname $( realpath "${BASH_SOURCE[0]}" ) )"/configuration -application msi.gama.headless.product -data $passWork "$@"; then +MY_TEMP_DIR=. +if ! java -cp "$( dirname $( realpath "${BASH_SOURCE[0]}" ) )"/../plugins/org.eclipse.equinox.launcher*.jar -Xms512m $memory -Djava.io.tmpdir=$MY_TEMP_DIR -Djava.awt.headless=true org.eclipse.core.launcher.Main -configuration "$( dirname $( realpath "${BASH_SOURCE[0]}" ) )"/configuration -application msi.gama.headless.product -data $passWork "$@"; then + echo "Error in you command, here's the log :" + cat $passWork/.metadata/.log + exit 1 +fi +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/MY_predatorPrey.gaml Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,195 @@ +/** +* Name: Breeding of prey and predator agents +* Author: +* Description: 6th part of the tutorial : Predator Prey +* Tags: reproduce, myself, self +*/ +model prey_predator + +global { + int nb_preys_init <- 200; + int nb_predators_init <- 20; + float prey_max_energy <- 1.0; + float prey_max_transfer <- 0.1; + float prey_energy_consum <- 0.05; + float predator_max_energy <- 1.0; + float predator_energy_transfer <- 0.5; + float predator_energy_consum <- 0.02; + float prey_proba_reproduce <- 0.01; + int prey_nb_max_offsprings <- 5; + float prey_energy_reproduce <- 0.5; + float predator_proba_reproduce <- 0.01; + int predator_nb_max_offsprings <- 3; + float predator_energy_reproduce <- 0.5; + int nb_preys -> {length(prey)}; + int nb_predators -> {length(predator)}; + bool is_batch <- false; + + init { + create prey number: nb_preys_init; + create predator number: nb_predators_init; + write(self); + } + + reflex stop_simulation when: ((nb_preys = 0) or (nb_predators = 0)) and !is_batch { + do pause; + } +} + +species generic_species { + float size <- 1.0; + rgb color; + float max_energy; + float max_transfer; + float energy_consum; + float proba_reproduce; + int nb_max_offsprings; + float energy_reproduce; + vegetation_cell my_cell <- one_of(vegetation_cell); + float energy <- rnd(max_energy) update: energy - energy_consum max: max_energy; + + init { + location <- my_cell.location; + } + + reflex basic_move { + my_cell <- one_of(my_cell.neighbors2); + location <- my_cell.location; + } + + reflex eat { + energy <- energy + energy_from_eat(); + } + + reflex die when: energy <= 0 { + do die; + } + + reflex reproduce when: (energy >= energy_reproduce) and (flip(proba_reproduce)) { + int nb_offsprings <- rnd(1, nb_max_offsprings); + create species(self) number: nb_offsprings { + my_cell <- myself.my_cell; + location <- my_cell.location; + energy <- myself.energy / nb_offsprings; + } + + energy <- energy / nb_offsprings; + } + + float energy_from_eat { + return 0.0; + } + + aspect base { + draw circle(size) color: color; + } + + + + + reflex save_result when: (nb_preys > 0) and (nb_predators > 0){ + save ("cycle: "+ cycle + "; nbPreys: " + nb_preys + + "; minEnergyPreys: " + (prey min_of each.energy) + + "; maxSizePreys: " + (prey max_of each.energy) + + "; nbPredators: " + nb_predators + + "; minEnergyPredators: " + (predator min_of each.energy) + + "; maxSizePredators: " + (predator max_of each.energy)) + to: "results.txt" type: "text" rewrite: (cycle = 0) ? true : false; + } + + + + +} + +species prey parent: generic_species { + rgb color <- #blue; + float max_energy <- prey_max_energy; + float max_transfer <- prey_max_transfer; + float energy_consum <- prey_energy_consum; + float proba_reproduce <- prey_proba_reproduce; + int nb_max_offsprings <- prey_nb_max_offsprings; + float energy_reproduce <- prey_energy_reproduce; + + float energy_from_eat { + float energy_transfer <- 0.0; + if(my_cell.food > 0) { + energy_transfer <- min([max_transfer, my_cell.food]); + my_cell.food <- my_cell.food - energy_transfer; + } + return energy_transfer; + } +} + +species predator parent: generic_species { + rgb color <- #red; + float max_energy <- predator_max_energy; + float energy_transfer <- predator_energy_transfer; + float energy_consum <- predator_energy_consum; + float proba_reproduce <- predator_proba_reproduce; + int nb_max_offsprings <- predator_nb_max_offsprings; + float energy_reproduce <- predator_energy_reproduce; + + float energy_from_eat { + list<prey> reachable_preys <- prey inside (my_cell); + if(! empty(reachable_preys)) { + ask one_of (reachable_preys) { + do die; + } + return energy_transfer; + } + return 0.0; + } +} + +grid vegetation_cell width: 50 height: 50 neighbors: 4 { + float max_food <- 1.0; + float food_prod <- rnd(0.01); + float food <- rnd(1.0) max: max_food update: food + food_prod; + rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))); + list<vegetation_cell> neighbors2 <- (self neighbors_at 2); +} + +experiment prey_predator type: gui { + parameter "Initial number of preys: " var: nb_preys_init min: 0 max: 1000 category: "Prey"; + parameter "Prey max energy: " var: prey_max_energy category: "Prey"; + parameter "Prey max transfer: " var: prey_max_transfer category: "Prey"; + parameter "Prey energy consumption: " var: prey_energy_consum category: "Prey"; + parameter "Initial number of predators: " var: nb_predators_init min: 0 max: 200 category: "Predator"; + parameter "Predator max energy: " var: predator_max_energy category: "Predator"; + parameter "Predator energy transfer: " var: predator_energy_transfer category: "Predator"; + parameter "Predator energy consumption: " var: predator_energy_consum category: "Predator"; + parameter 'Prey probability reproduce: ' var: prey_proba_reproduce category: 'Prey'; + parameter 'Prey nb max offsprings: ' var: prey_nb_max_offsprings category: 'Prey'; + parameter 'Prey energy reproduce: ' var: prey_energy_reproduce category: 'Prey'; + parameter 'Predator probability reproduce: ' var: predator_proba_reproduce category: 'Predator'; + parameter 'Predator nb max offsprings: ' var: predator_nb_max_offsprings category: 'Predator'; + parameter 'Predator energy reproduce: ' var: predator_energy_reproduce category: 'Predator'; + + output { + display main_display { + grid vegetation_cell border: #black; + species prey aspect: base; + species predator aspect: base; + } + + monitor "Number of preys" value: nb_preys; + monitor "Number of predators" value: nb_predators; + } +} + +experiment Optimization type: batch repeat: 2 keep_seed: true until: ( time > 200 ) { + parameter "Predator energy reproduce:" var: predator_energy_reproduce min: 0.25 max: 1.0 step: 0.25; + parameter "Batch mode:" var: is_batch <- true; + + method tabu maximize: nb_preys + nb_predators iter_max: 10 tabu_list_size: 3; + + + reflex save_results_explo { + ask simulations { + save [int(self),prey_max_transfer,prey_energy_reproduce,predator_energy_transfer,predator_energy_reproduce,self.nb_predators,self.nb_preys] + to: "results.csv" format:csv rewrite: (int(self) = 0) ? true : false header: true; + } + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/MY_sequential_example.py Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,213 @@ +import asyncio +from asyncio import Future +from typing import Dict + +from gama_client.base_client import GamaBaseClient +from gama_client.command_types import CommandTypes +from gama_client.message_types import MessageTypes + +import pprint # _PRINT_ +import argparse + +nb_preys_init = 100 # default +nb_predators_init = 10 # default +nb_more_steps = 5 # default + +experiment_future: Future +play_future: Future +pause_future: Future +expression_future: Future +step_future: Future +stop_future: Future + + +async def message_handler(message: Dict): + print("received", message) + if "command" in message: + if message["command"]["type"] == CommandTypes.Load.value: + experiment_future.set_result(message) + elif message["command"]["type"] == CommandTypes.Play.value: + play_future.set_result(message) + elif message["command"]["type"] == CommandTypes.Pause.value: + pause_future.set_result(message) + elif message["command"]["type"] == CommandTypes.Expression.value: + expression_future.set_result(message) + elif message["command"]["type"] == CommandTypes.Step.value: + step_future.set_result(message) + elif message["command"]["type"] == CommandTypes.Stop.value: + stop_future.set_result(message) + + +async def main(): + + global experiment_future + global play_future + global pause_future + global expression_future + global step_future + global stop_future + + # Experiment and Gama-server constants + + MY_SERVER_URL = "localhost" + + MY_SERVER_PORT = 8000 + + GAML_FILE_PATH_ON_SERVER = "gama-platform/headless/samples/predatorPrey/MY_predatorPrey.gaml" + + EXPERIMENT_NAME = "prey_predator" + + MY_EXP_INIT_PARAMETERS = [{"type": "int", "name": "nb_preys_init", + "value": nb_preys_init}, + {"type": "int", "name": "nb_predators_init", + "value": nb_predators_init}] + + print("[MY_sequential_example.py Setting]", + " MY_SERVER_URL:", MY_SERVER_URL, + ", MY_SERVER_PORT:", MY_SERVER_PORT, + ", GAML_FILE_PATH_ON_SERVER: ", GAML_FILE_PATH_ON_SERVER, + ", EXPERIMENT_NAME: ", EXPERIMENT_NAME, + ", MY_EXP_INIT_PARAMETERS: ", MY_EXP_INIT_PARAMETERS) + + client = GamaBaseClient(MY_SERVER_URL, MY_SERVER_PORT, message_handler) + + print("connecting to Gama server") + await client.connect() + + print("initialize a gaml model") + experiment_future = asyncio.get_running_loop().create_future() + #await client.load(GAML_FILE_PATH_ON_SERVER, EXPERIMENT_NAME, True, True, True, MY_EXP_INIT_PARAMETERS) # error + await client.load(file_path=GAML_FILE_PATH_ON_SERVER, + experiment_name=EXPERIMENT_NAME, + console=True, status=True, dialog=True, runtime=True, + parameters=MY_EXP_INIT_PARAMETERS) + + gama_response = await experiment_future + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + try: + experiment_id = gama_response["content"] + except Exception as e: + print("error while initializing", gama_response, e) + return + + print("initialization successful, running the model") + play_future = asyncio.get_running_loop().create_future() + await client.play(experiment_id) + gama_response = await play_future + if gama_response["type"] != MessageTypes.CommandExecutedSuccessfully.value: + print("error while trying to run the experiment", gama_response) + return + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + print("model running, waiting a bit") + await asyncio.sleep(2) + + print("pausing the model") + pause_future = asyncio.get_running_loop().create_future() + await client.pause(experiment_id) + gama_response = await pause_future + if gama_response["type"] != MessageTypes.CommandExecutedSuccessfully.value: + print("Unable to pause the experiment", gama_response) + return + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + expression_future = asyncio.get_running_loop().create_future() + await client.expression(experiment_id, r"cycle") + gama_response = await expression_future + print("asking simulation the value of: cycle=", gama_response["content"]) + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + expression_future = asyncio.get_running_loop().create_future() + await client.expression(experiment_id, r"nb_preys/nb_preys_init") + gama_response = await expression_future + print("asking simulation the value of: nb_preys/nb_preys_init=", gama_response["content"]) + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + print("asking gama to run ",nb_more_steps," more steps of the experiment") + step_future = asyncio.get_running_loop().create_future() + await client.step(experiment_id, nb_more_steps, True) + #await client.step(experiment_id, 10, True) + gama_response = await step_future + if gama_response["type"] != MessageTypes.CommandExecutedSuccessfully.value: + print("Unable to execute 10 new steps in the experiment", gama_response) + return + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + expression_future = asyncio.get_running_loop().create_future() + await client.expression(experiment_id, r"cycle") + gama_response = await expression_future + print("asking simulation the value of: cycle=", gama_response["content"]) + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + print("killing the simulation") + stop_future = asyncio.get_running_loop().create_future() + await client.stop(experiment_id) + gama_response = await stop_future + if gama_response["type"] != MessageTypes.CommandExecutedSuccessfully.value: + print("Unable to stop the experiment", gama_response) + return + print("*********************") # _PRINT_ + print("gama_response.keys():", gama_response.keys()) + print("gama_response:") + pprint.pprint(gama_response) + print("*********************") + + # Added + print("killing gama-server") + exit_future = asyncio.get_running_loop().create_future() + await client.exit() + # no response + print("*********************") # _PRINT_ + print("Command exit() done") + print("*********************") + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument("-nb_preys_init", type=int, help="nb_preys_init") + parser.add_argument("-nb_predators_init", type=int, help="nb_predators_init") + parser.add_argument("-nb_more_steps", type=int, help="nb_more_steps") + args = parser.parse_args() + if (args.nb_preys_init is not None) and (args.nb_preys_init != 'None') : + nb_preys_init = args.nb_preys_init + if (args.nb_predators_init is not None) and (args.nb_predators_init != 'None') : + nb_predators_init = args.nb_predators_init + if (args.nb_more_steps is not None) and (args.nb_more_steps != 'None') : + nb_more_steps = args.nb_more_steps + + print("[MY_sequential_example.py Parameters]", + " nb_preys_init (for MY_predatorPrey.gaml) :", nb_preys_init, + " nb_predators_init (for MY_predatorPrey.gaml) :", nb_predators_init, + ", nb_more_steps (for MY_sequential_example.py) :", nb_more_steps) + + asyncio.run(main())
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cmd_gama_headless.sh Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,6 @@ +#!/bin/bash + +# Launch GAMA Headless gama-server + +gama-platform/headless/MY_gama-headless.sh -v -socket 8000 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cmd_python_client.sh Tue Jun 04 15:18:01 2024 +0000 @@ -0,0 +1,10 @@ +#!/bin/bash + +# Launch Python program MY_sequential_example.py + +VALUE_nb_preys_init=$1 +VALUE_nb_predators_init=$2 +VALUE_nb_more_steps=$3 + +python3 MY_sequential_example.py -nb_preys_init $VALUE_nb_preys_init -nb_predators_init $VALUE_nb_predators_init -nb_more_steps $VALUE_nb_more_steps +